UNPKG

jsplanet

Version:

A controller for Trackmania 2020 dedicated server.

71 lines (70 loc) 2.58 kB
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;