server/src/player/player-store.service.ts

80 lines
2.5 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { Player } from 'src/game/player';
import { PlayerSocket } from 'src/types/data-socket';
import { PlayerAuthService } from './player-auth.service';
import { Packet } from 'src/net/packet';
import { getRandomName } from 'src/utils/random';
import { PacketType } from 'src/types/packet-type.enum';
@Injectable()
export class PlayerStoreService {
constructor(private readonly auth: PlayerAuthService) {}
private players = new Map<string, Player>();
getByClient(client: PlayerSocket) {
return this.players.get(client.id);
}
disconnect(client: PlayerSocket) {
return this.players.delete(client.id);
}
getPlayerList() {
const all = Array.from(this.players.values());
return all
.filter((object) => object.initialized)
.map((player) => `${player.id}:${player.name}`);
}
getUninitializedIds() {
const all = Array.from(this.players.values());
return all
.filter((object) => !object.initialized)
.map((player) => player.id);
}
async authenticate(client: PlayerSocket, packet: Packet) {
const playerId = packet.read(String);
const playerToken = packet.read(String);
const clientVersion = packet.read<number>('uint8');
if (clientVersion !== 0) throw new Error('Bad client');
// TODO: actually something
const player = new Player(client, playerId, getRandomName(), playerToken);
this.players.set(client.id, player);
return player;
}
broadcast(data: Buffer) {
this.players.forEach((value) => value.send(data));
}
broadcastExcept(data: Buffer, players: string[]) {
Array.from(this.players.values())
.filter((player) => !players.includes(player.id))
.forEach((player) => player.send(data));
}
getPlayerListPacket() {
const packet = new Packet(PacketType.PLAYER_LIST);
const players = this.getPlayerList();
packet.write(players.length, 'uint32');
players.forEach((player) => packet.write(player, String));
return packet.toBuffer();
}
getPlayerCharacterPackets(exclude: Player) {
const players = Array.from(this.players.values());
return players
.filter((player) => !!player.character && player.id !== exclude.id)
.map((player) => {
return new Packet(PacketType.PLAYER_CHARACTER)
.write(player.id, String)
.write(player.name, String)
.write(player.character.position, 'vec3')
.write(player.character.quaternion, 'quat')
.toBuffer();
});
}
}