reldens
Version:
Reldens - MMORPG Platform
77 lines (70 loc) • 2.69 kB
JavaScript
/**
*
* Reldens - TeamMessageActions
*
* Handles team-related message actions from clients.
* Routes team invitations, joins, leaves, and removals to appropriate handlers.
*
*/
const { TryTeamStart } = require('./message-actions/try-team-start');
const { TeamJoin } = require('./message-actions/team-join');
const { TeamLeave } = require('./message-actions/team-leave');
const { TeamsConst } = require('../constants');
const { sc } = require('@reldens/utils');
/**
* @typedef {import('./plugin').TeamsPlugin} TeamsPlugin
* @typedef {import('../../rooms/server/state').PlayerState} PlayerState
* @typedef {import('../../rooms/server/scene').RoomScene} RoomScene
*/
class TeamMessageActions
{
/**
* @param {Object} props
*/
constructor(props)
{
/** @type {TeamsPlugin} */
this.teamsPlugin = props.teamsPlugin;
}
/**
* @param {Object} client
* @param {Object} data
* @param {RoomScene} room
* @param {PlayerState} playerSchema
* @returns {Promise<boolean>}
*/
async executeMessageActions(client, data, room, playerSchema)
{
if(!sc.hasOwn(data, 'act')){
return false;
}
if(0 !== data.act.indexOf(TeamsConst.TEAM_PREF)){
return false;
}
if(TeamsConst.ACTIONS.TEAM_INVITE === data.act){
return await TryTeamStart.execute(client, data, room, playerSchema, this.teamsPlugin);
}
if(TeamsConst.ACTIONS.TEAM_ACCEPTED === data.act && '1' === data.value){
return await TeamJoin.execute(client, data, room, playerSchema, this.teamsPlugin);
}
if(TeamsConst.ACTIONS.TEAM_ACCEPTED === data.act && '2' === data.value){
let playerSendingInvite = room.activePlayerByPlayerId(data.id, room.roomId);
if(!playerSendingInvite){
// expected when the player disconnects in between the invitation is sent:
return false;
}
let playerRejectingName = playerSchema.playerName;
await this.teamsPlugin.events.emit('reldens.teamJoinInviteRejected', {
playerSendingInvite,
playerRejectingName
});
}
if(TeamsConst.ACTIONS.TEAM_LEAVE === data.act){
return await TeamLeave.fromMessage(data, room, playerSchema, this.teamsPlugin);
}
if(TeamsConst.ACTIONS.TEAM_REMOVE === data.act){
return await TeamLeave.fromMessage(data, room, playerSchema, this.teamsPlugin);
}
}
}
module.exports.TeamMessageActions = TeamMessageActions;