update
This commit is contained in:
55
apps/server/src/biz/PlayerManager.ts
Normal file
55
apps/server/src/biz/PlayerManager.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
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 }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user