reldens
Version:
Reldens - MMORPG Platform
71 lines (65 loc) • 2.6 kB
JavaScript
/**
*
* Reldens - ClanDisconnect
*
*/
const { ClanUpdatesHandler } = require('../clan-updates-handler');
const { TeamsConst } = require('../../constants');
const { Logger } = require('@reldens/utils');
class ClanDisconnect
{
static async execute(playerSchema, teamsPlugin)
{
// @TODO - BETA - Consider extend TeamLeave.
if(!playerSchema){
//Logger.debug('Player already left, wont disconnect from clan.');
return false;
}
if(playerSchema?.physicalBody?.isChangingScene){
//Logger.debug('Player is changing scene, avoid disconnect clan update.');
return false;
}
let clanId = playerSchema?.privateData?.clan;
if(!clanId){
Logger.debug('Clan ID not found in current player ID "'+playerSchema.player_id+'" for disconnection.');
return false;
}
let clan = teamsPlugin.clans[clanId];
if(!clan){
Logger.error('Player "'+playerSchema.player_id+'" current clan "'+clanId+'" not found for disconnection.');
return false;
}
// @NOTE: the way this works is by making the clients leave the clan and then updating the remaining players.
let playerId = playerSchema.player_id;
let client = clan.clients[playerId];
if(1 === client?.ref?.readyState){
let sendUpdate = {
act: TeamsConst.ACTIONS.CLAN_LEFT,
id: clan.owner.player_id,
listener: TeamsConst.KEY
};
await teamsPlugin.events.emit('reldens.clanDisconnectBeforeSendUpdate', {
playerId,
sendUpdate,
playerSchema,
teamsPlugin
});
client.send('*', sendUpdate);
}
clan.disconnect(clan.players[playerId]);
let afterDisconnectKeys = Object.keys(clan.players);
if(0 === afterDisconnectKeys.length){
Logger.info('Last player on clan disconnected.');
delete teamsPlugin.clans[clanId];
return true;
}
let event = {playerSchema, teamsPlugin, continueLeave: true};
await teamsPlugin.events.emit('reldens.clanDisconnectAfterSendUpdate', event);
if(!event.continueLeave){
Logger.info('Stopped event "clanDisconnectAfterSendUpdate".');
return false;
}
return ClanUpdatesHandler.updateClanPlayers(clan);
}
}
module.exports.ClanDisconnect = ClanDisconnect;