let objects = require('../objects/objects'); module.exports = { players: [], onHandshake: function (socket) { let p = objects.build(); p.socket = socket; p.addComponent('auth'); p.addComponent('player'); this.players.push(p); }, onDisconnect: function (socket) { let player = this.players.find(p => p.socket.id === socket.id); if (!player) return; let sessionDuration = 0; if (player.id !== null) { if (player.social) player.social.dc(); sessionDuration = ~~(((+new Date()) - player.player.sessionStart) / 1000); atlas.updateObject(player, { components: [{ type: 'stats', sessionDuration: sessionDuration }] }); atlas.removeObject(player); } if (player.name) { io.sockets.emit('events', { onGetMessages: [{ messages: [{ class: 'color-blueB', message: player.name + ' has gone offline' }] }], onGetDisconnectedPlayer: [player.name] }); } this.players.spliceWhere(p => p.socket.id === socket.id); }, route: function (socket, msg) { let player = null; if (msg.id !== null) { player = this.players.find(p => p.id === msg.id); let source = this.players.find(p => p.socket.id === socket.id); if (!source) return; if (!msg.data) msg.data = {}; msg.data.sourceId = source.id; } else player = this.players.find(p => p.socket.id === socket.id); if ( (!player) || ( (player.permadead) && (['getCharacterList', 'getCharacter', 'deleteCharacter'].indexOf(msg.method) === -1) ) || ( (player.dead) && (msg.data.method !== 'respawn') ) ) return; let cpn = player[msg.cpn]; if (!cpn) return; if (cpn[msg.method]) cpn[msg.method](msg); }, unzone: function (msg) { let socket = msg.socket; let player = this.players.find(p => p.socket.id === socket.id); if (!player) return; if (player.social) player.social.dc(); atlas.removeObject(player, true); let keys = Object.keys(player); keys.forEach(function (k) { let val = player[k]; if ((val !== null) && (typeof (val) === 'object') && (val.type)) { let type = val.type; if ((type !== 'player') && (type !== 'auth') && (type !== 'syncer')) delete player[k]; } }); io.sockets.emit('events', { onGetMessages: [{ messages: [{ class: 'color-blueB', message: player.name + ' has gone offline' }] }], onGetDisconnectedPlayer: [player.name] }); //If we don't do this, the atlas will try to remove it from the thread player.zoneName = null; player.name = null; //A hack to allow us to actually call methods again (like retrieve the player list) player.dead = false; }, logOut: function (exclude) { let players = this.players; let pLen = players.length; for (let i = 0; i < pLen; i++) { let p = players[i]; if ((!p) || (p === exclude) || (!p.auth)) continue; if (p.auth.username === exclude.auth.username) p.socket.emit('dc', {}); } }, getCharacterList: function () { let result = []; let players = this.players; let pLen = players.length; for (let i = 0; i < pLen; i++) { let p = players[i]; if (!p.name) continue; result.push({ zone: p.zone, name: p.name, level: p.level, class: p.class, id: p.id }); } return result; } };