From a9994f6d95c8ebedf20ead32c3af031269b3c0b1 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sat, 3 Aug 2024 19:18:07 +0200 Subject: [PATCH] Move bug fix --- src/events/character/Move.ts | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/events/character/Move.ts b/src/events/character/Move.ts index 20cf5bd..f8b7d19 100644 --- a/src/events/character/Move.ts +++ b/src/events/character/Move.ts @@ -11,8 +11,8 @@ interface SocketResponse { position_y: number } -// Add a cancellation token -let currentMoveToken: Symbol | null = null +// Map to store movement tokens for each character +const characterMoveTokens = new Map() export default function setupCharacterMove(socket: TSocket, io: Server) { socket.on('character:move', async (data: SocketResponse) => { @@ -24,9 +24,9 @@ export default function setupCharacterMove(socket: TSocket, io: Server) { return } - // Cancel any ongoing movement - currentMoveToken = Symbol('moveToken') - const moveToken = currentMoveToken + // Cancel any ongoing movement for this character + const moveToken = Symbol('moveToken') + characterMoveTokens.set(socket.character.id, moveToken) const grid = await ZoneManager.getGrid(socket.character.zoneId) @@ -43,14 +43,9 @@ export default function setupCharacterMove(socket: TSocket, io: Server) { if (path.length > 0) { socket.character.isMoving = true io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) - try { - await moveAlongPath(socket, io, path, grid, moveToken) - } finally { - if (currentMoveToken === moveToken) { - socket.character.isMoving = false - io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) - } - } + + // Start movement in a non-blocking manner + moveAlongPath(socket, io, path, grid, moveToken).catch(console.error) } else { console.log('character:move error', 'No valid path found') } @@ -69,8 +64,8 @@ async function moveAlongPath(socket: TSocket, io: Server, path: Node[], grid: nu for (let i = 0; i < path.length; i++) { // Check if this movement has been cancelled - if (currentMoveToken !== moveToken) { - console.log('Movement cancelled, stopping current path') + if (characterMoveTokens.get(socket.character.id) !== moveToken) { + console.log('Movement cancelled for character', socket.character.id) return } @@ -93,7 +88,13 @@ async function moveAlongPath(socket: TSocket, io: Server, path: Node[], grid: nu io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) // Add a small delay between moves to avoid overwhelming the server - await new Promise((resolve) => setTimeout(resolve, 150)) + await new Promise((resolve) => setTimeout(resolve, 250)) + } + + // Movement complete + if (socket.character) { + socket.character.isMoving = false + io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) } }