feat: add event broadcasting and entity update handlers to shard client
Made-with: Cursor
This commit is contained in:
@@ -84,6 +84,7 @@ class EcastShardClient {
|
||||
this.gameFinished = false;
|
||||
this.manuallyStopped = false;
|
||||
this.seq = 0;
|
||||
this.appTag = null;
|
||||
}
|
||||
|
||||
handleMessage(message) {
|
||||
@@ -95,6 +96,7 @@ class EcastShardClient {
|
||||
this.handleEntityUpdate(message.result);
|
||||
break;
|
||||
case 'client/connected':
|
||||
this.handleClientConnected(message.result);
|
||||
break;
|
||||
case 'client/disconnected':
|
||||
break;
|
||||
@@ -129,6 +131,18 @@ class EcastShardClient {
|
||||
console.log(
|
||||
`[Shard Monitor] Welcome: id=${this.shardId}, players=${this.playerCount} [${this.playerNames.join(', ')}], state=${this.gameState}, lobby=${this.lobbyState}`
|
||||
);
|
||||
|
||||
this.onEvent('room.connected', {
|
||||
sessionId: this.sessionId,
|
||||
gameId: this.gameId,
|
||||
roomCode: this.roomCode,
|
||||
appTag: this.appTag,
|
||||
maxPlayers: this.maxPlayers,
|
||||
playerCount: this.playerCount,
|
||||
players: [...this.playerNames],
|
||||
lobbyState: this.lobbyState,
|
||||
gameState: this.gameState,
|
||||
});
|
||||
}
|
||||
|
||||
handleEntityUpdate(result) {
|
||||
@@ -136,11 +150,91 @@ class EcastShardClient {
|
||||
|
||||
if (result.key === 'room' || result.key === 'bc:room') {
|
||||
if (result.val) {
|
||||
const prevLobbyState = this.lobbyState;
|
||||
const prevGameStarted = this.gameStarted;
|
||||
const prevGameFinished = this.gameFinished;
|
||||
|
||||
const roomState = EcastShardClient.parseRoomEntity(result.val);
|
||||
this.lobbyState = roomState.lobbyState;
|
||||
this.gameState = roomState.gameState;
|
||||
this.gameStarted = roomState.gameStarted;
|
||||
this.gameFinished = roomState.gameFinished;
|
||||
|
||||
if (this.lobbyState !== prevLobbyState && !this.gameStarted) {
|
||||
this.onEvent('lobby.updated', {
|
||||
sessionId: this.sessionId,
|
||||
gameId: this.gameId,
|
||||
roomCode: this.roomCode,
|
||||
lobbyState: this.lobbyState,
|
||||
gameCanStart: roomState.gameCanStart,
|
||||
gameIsStarting: roomState.gameIsStarting,
|
||||
playerCount: this.playerCount,
|
||||
});
|
||||
}
|
||||
|
||||
if (this.gameStarted && !prevGameStarted) {
|
||||
this.onEvent('game.started', {
|
||||
sessionId: this.sessionId,
|
||||
gameId: this.gameId,
|
||||
roomCode: this.roomCode,
|
||||
playerCount: this.playerCount,
|
||||
players: [...this.playerNames],
|
||||
maxPlayers: this.maxPlayers,
|
||||
});
|
||||
}
|
||||
|
||||
if (this.gameFinished && !prevGameFinished) {
|
||||
this.onEvent('game.ended', {
|
||||
sessionId: this.sessionId,
|
||||
gameId: this.gameId,
|
||||
roomCode: this.roomCode,
|
||||
playerCount: this.playerCount,
|
||||
players: [...this.playerNames],
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (result.key === 'textDescriptions') {
|
||||
if (result.val) {
|
||||
const joins = EcastShardClient.parsePlayerJoinFromTextDescriptions(result.val);
|
||||
for (const join of joins) {
|
||||
if (!this.playerNames.includes(join.name)) {
|
||||
this.playerNames.push(join.name);
|
||||
this.playerCount = this.playerNames.length;
|
||||
|
||||
this.onEvent('lobby.player-joined', {
|
||||
sessionId: this.sessionId,
|
||||
gameId: this.gameId,
|
||||
roomCode: this.roomCode,
|
||||
playerName: join.name,
|
||||
playerCount: this.playerCount,
|
||||
players: [...this.playerNames],
|
||||
maxPlayers: this.maxPlayers,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handleClientConnected(result) {
|
||||
if (!result) return;
|
||||
if (result.roles?.player) {
|
||||
const name = result.roles.player.name ?? '';
|
||||
if (!this.playerNames.includes(name)) {
|
||||
this.playerNames.push(name);
|
||||
this.playerCount = this.playerNames.length;
|
||||
|
||||
this.onEvent('lobby.player-joined', {
|
||||
sessionId: this.sessionId,
|
||||
gameId: this.gameId,
|
||||
roomCode: this.roomCode,
|
||||
playerName: name,
|
||||
playerCount: this.playerCount,
|
||||
players: [...this.playerNames],
|
||||
maxPlayers: this.maxPlayers,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -150,8 +244,10 @@ class EcastShardClient {
|
||||
}
|
||||
|
||||
async connect(roomInfo) {
|
||||
this.disconnect();
|
||||
this.host = roomInfo.host;
|
||||
this.maxPlayers = roomInfo.maxPlayers || this.maxPlayers;
|
||||
this.appTag = roomInfo.appTag;
|
||||
|
||||
const url = `wss://${this.host}/api/v2/rooms/${this.roomCode}/play?role=shard&name=GamePicker&userId=gamepicker-${this.sessionId}&format=json`;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user