jsplanet
Version:
A controller for Trackmania 2020 dedicated server.
71 lines (70 loc) • 2.58 kB
JavaScript
import { Player, PlayerStatus } from "../structures/index.js";
class PlayersManager {
jsPlanet;
players = new Map();
remote;
constructor(jsPlanet, remote) {
this.jsPlanet = jsPlanet;
this.remote = remote;
this.setupListeners();
}
get(login) {
const cached = this.players.get(login) ?? null;
return cached;
}
create(data) {
const cached = this.players.get(data.login) ?? null;
if (cached !== null) {
cached["patch"](data);
return cached;
}
const player = new Player(this.remote, data);
this.players.set(data.login, player);
return player;
}
setupListeners() {
this.remote.on("ManiaPlanet.PlayerConnect", (login, isSpectator) => {
const player = this.create({
isConnected: true,
login: login,
nickname: null,
status: isSpectator ? PlayerStatus.Spectator : PlayerStatus.Player,
team: null,
});
this.jsPlanet.emit("playerConnect", player);
});
this.remote.on("ManiaPlanet.PlayerDisconnect", (login) => {
const player = this.create({
isConnected: false,
login: login,
nickname: null,
status: null,
team: null,
});
this.jsPlanet.emit("playerDisconnect", player);
});
this.remote.on("ManiaPlanet.PlayerInfoChanged", (newPlayerInfos) => {
const oldPlayer = this.get(newPlayerInfos.Login);
const oldStatus = oldPlayer?.status ?? null;
const oldTeam = oldPlayer?.team ?? null;
const newPlayer = this.create({
isConnected: null,
login: newPlayerInfos.Login,
nickname: newPlayerInfos.NickName,
status: newPlayerInfos.SpectatorStatus === 0
? PlayerStatus.Player
: PlayerStatus.Spectator,
team: newPlayerInfos.TeamId,
});
const newStatus = newPlayer.status;
const newTeam = newPlayer.team;
if (oldStatus !== null && oldStatus !== newStatus) {
this.jsPlanet.emit("playerStatusChange", newPlayer, oldStatus, newStatus);
}
if (oldTeam !== null && oldTeam !== newTeam) {
this.jsPlanet.emit("playerTeamChange", newPlayer, oldTeam, newTeam);
}
});
}
}
export default PlayersManager;