import { ApiMsgEnum } from '..' import Singleton from '../base/Singleton' import type { IPlayer } from './Player' import Player from './Player' import RoomManager from './RoomManager' export default class PlayerManager extends Singleton { static get Instance() { return super.GetInstance() } playerId = 1 players: Set = new Set() idMapPlayer: Map = new Map() createPlayer({ connection, nickname }: Omit) { const player = new Player({ id: this.playerId++, connection, nickname }) this.players.add(player) this.idMapPlayer.set(player.id, player) return player } removePlayer(uid: number) { const player = this.idMapPlayer.get(uid) if (player) { const rid = player.rid if (rid !== undefined) { RoomManager.Instance.leaveRoom(rid, uid); RoomManager.Instance.syncRooms(); RoomManager.Instance.syncRoom(rid); } this.players.delete(player) this.idMapPlayer.delete(uid) this.syncPlayers() } } getPlayerById(uid: number) { return this.idMapPlayer.get(uid) } syncPlayers() { for (const player of this.players) { player.connection.sendMsg(ApiMsgEnum.MsgPlayerList, { list: this.getPlayersView() }) } } getPlayersView(players: Set = this.players) { return [...players].map((player) => this.getPlayerView(player)) } getPlayerView({ id, nickname, rid }: Player) { return { id, nickname, rid } } }