56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
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<PlayerManager>()
|
|
}
|
|
|
|
playerId = 1
|
|
players: Set<Player> = new Set()
|
|
idMapPlayer: Map<number, Player> = new Map()
|
|
|
|
createPlayer({ connection, nickname }: Omit<IPlayer, 'id'>) {
|
|
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<Player> = this.players) {
|
|
return [...players].map((player) => this.getPlayerView(player))
|
|
}
|
|
|
|
getPlayerView({ id, nickname, rid }: Player) {
|
|
return { id, nickname, rid }
|
|
}
|
|
}
|