From 7e5f43020470ed71307456ef29ede223a2f7e2db Mon Sep 17 00:00:00 2001 From: root Date: Sat, 7 Mar 2026 13:37:36 +0000 Subject: [PATCH] feat: handle spawn-npc socket event with cap and position logic Co-Authored-By: Claude Opus 4.6 --- server/src/network/SocketServer.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server/src/network/SocketServer.ts b/server/src/network/SocketServer.ts index 318b020..c39006d 100644 --- a/server/src/network/SocketServer.ts +++ b/server/src/network/SocketServer.ts @@ -1,9 +1,10 @@ import { Server } from 'socket.io'; import type http from 'http'; import type { ClientEvents, ServerEvents, PlayerInput, Position, Movement, PlayerControlled, Appearance } from '@dflike/shared'; -import { Direction } from '@dflike/shared'; +import { Direction, MAX_NPC_COUNT } from '@dflike/shared'; import { generateRandomAppearance } from '../spawner/appearanceGenerator.js'; import type { GameLoop } from '../game/GameLoop.js'; +import { spawnNPC } from '../game/spawner.js'; import { serializeWorldState, serializeStateUpdate } from './stateSerializer.js'; export class SocketServer { @@ -58,6 +59,16 @@ export class SocketServer { this.handleInput(playerId, entity, input); }); + // Handle NPC spawn requests + socket.on('spawn-npc', (data: { x: number; y: number }) => { + const npcCount = world.query('npcBrain').length; + if (npcCount >= MAX_NPC_COUNT) return; + + const target = map.findNearestWalkable(data.x, data.y, 3) + ?? map.getRandomWalkable(); + spawnNPC(world, map, target); + }); + // Handle disconnect socket.on('disconnect', () => { console.log(`Player disconnected: ${playerId}`);