Files
cocos-nodejs-io-game/apps/server/src/biz/PlayerManager.ts
2022-12-01 22:26:41 +08:00

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 }
}
}