129 lines
3.2 KiB
JavaScript
129 lines
3.2 KiB
JavaScript
const mongoose = require('mongoose');
|
|
|
|
const playerDataSchema = new mongoose.Schema({
|
|
userId: {
|
|
type: String,
|
|
required: true,
|
|
unique: true
|
|
},
|
|
username: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
// Player stats
|
|
stats: {
|
|
level: { type: Number, default: 1 },
|
|
experience: { type: Number, default: 0 },
|
|
totalExperience: { type: Number, default: 0 },
|
|
credits: { type: Number, default: 1000 },
|
|
gems: { type: Number, default: 0 },
|
|
skillPoints: { type: Number, default: 0 },
|
|
totalKills: { type: Number, default: 0 },
|
|
dungeonsCleared: { type: Number, default: 0 },
|
|
questsCompleted: { type: Number, default: 0 },
|
|
playTime: { type: Number, default: 0 },
|
|
lastLogin: { type: Date, default: Date.now }
|
|
},
|
|
// Game systems data
|
|
inventory: {
|
|
items: [{ type: mongoose.Schema.Types.Mixed }],
|
|
maxSize: { type: Number, default: 50 }
|
|
},
|
|
ship: {
|
|
type: mongoose.Schema.Types.Mixed,
|
|
default: null
|
|
},
|
|
base: {
|
|
type: mongoose.Schema.Types.Mixed,
|
|
default: null
|
|
},
|
|
quests: {
|
|
active: [{ type: mongoose.Schema.Types.Mixed }],
|
|
completed: [{ type: String }]
|
|
},
|
|
skills: {
|
|
type: mongoose.Schema.Types.Mixed,
|
|
default: {}
|
|
},
|
|
idleSystem: {
|
|
type: mongoose.Schema.Types.Mixed,
|
|
default: {}
|
|
},
|
|
dungeonSystem: {
|
|
type: mongoose.Schema.Types.Mixed,
|
|
default: {}
|
|
},
|
|
crafting: {
|
|
type: mongoose.Schema.Types.Mixed,
|
|
default: {}
|
|
},
|
|
// Server-specific data
|
|
currentServerId: {
|
|
type: String,
|
|
default: null
|
|
},
|
|
lastServerJoin: {
|
|
type: Date,
|
|
default: null
|
|
},
|
|
totalPlayTime: {
|
|
type: Number,
|
|
default: 0
|
|
}
|
|
}, {
|
|
timestamps: true
|
|
});
|
|
|
|
// Indexes for performance
|
|
playerDataSchema.index({ username: 1 });
|
|
playerDataSchema.index({ 'stats.level': 1 });
|
|
|
|
// Note: userId field already has unique: true which creates an index automatically
|
|
|
|
// Methods
|
|
playerDataSchema.methods.addExperience = function(amount) {
|
|
this.stats.experience += amount;
|
|
this.stats.playTime += Date.now() - (this.lastLogin || Date.now());
|
|
this.lastLogin = new Date();
|
|
return this.stats.experience;
|
|
};
|
|
|
|
playerDataSchema.methods.addCredits = function(amount) {
|
|
this.stats.credits += amount;
|
|
return this.stats.credits;
|
|
};
|
|
|
|
playerDataSchema.methods.updatePlayTime = function() {
|
|
const sessionTime = Date.now() - (this.lastLogin || Date.now());
|
|
this.stats.playTime += sessionTime;
|
|
this.totalPlayTime += sessionTime;
|
|
this.lastLogin = new Date();
|
|
return sessionTime;
|
|
};
|
|
|
|
playerDataSchema.methods.joinServer = function(serverId) {
|
|
this.currentServerId = serverId;
|
|
this.lastServerJoin = new Date();
|
|
this.lastLogin = new Date();
|
|
};
|
|
|
|
playerDataSchema.methods.leaveServer = function() {
|
|
console.log('[PLAYER DATA] leaveServer called for:', this.username);
|
|
|
|
// Update play time before leaving
|
|
const sessionTime = Date.now() - (this.lastLogin || Date.now());
|
|
this.stats.playTime += sessionTime;
|
|
this.totalPlayTime += sessionTime;
|
|
this.lastLogin = new Date();
|
|
|
|
// Clear server association
|
|
this.currentServerId = null;
|
|
this.lastServerJoin = null;
|
|
|
|
console.log('[PLAYER DATA] Updated play time:', sessionTime, 'Total play time:', this.totalPlayTime);
|
|
|
|
return sessionTime;
|
|
};
|
|
|
|
module.exports = mongoose.model('PlayerData', playerDataSchema);
|