From eb4cbb5e9e50b7f80ad83b5fccc30673ea5cbc75 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sat, 3 Aug 2024 18:31:41 +0200 Subject: [PATCH] Stop current pathfinding task if a new one is initialized to prevent glitches --- src/events/character/Move.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/events/character/Move.ts b/src/events/character/Move.ts index b9568db..46c2122 100644 --- a/src/events/character/Move.ts +++ b/src/events/character/Move.ts @@ -11,6 +11,9 @@ interface SocketResponse { position_y: number } +// Add a cancellation token +let currentMoveToken: Symbol | null = null + export default function setupCharacterMove(socket: TSocket, io: Server) { socket.on('character:move', async (data: SocketResponse) => { try { @@ -21,6 +24,10 @@ export default function setupCharacterMove(socket: TSocket, io: Server) { return } + // Cancel any ongoing movement + currentMoveToken = Symbol('moveToken') + const moveToken = currentMoveToken + const grid = await ZoneManager.getGrid(socket.character.zoneId) if (grid.length === 0) { @@ -37,10 +44,12 @@ export default function setupCharacterMove(socket: TSocket, io: Server) { socket.character.isMoving = true io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) try { - await moveAlongPath(socket, io, path, grid) + await moveAlongPath(socket, io, path, grid, moveToken) } finally { - socket.character.isMoving = false - io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) + if (currentMoveToken === moveToken) { + socket.character.isMoving = false + io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) + } } } else { console.log('character:move error', 'No valid path found') @@ -55,10 +64,16 @@ export default function setupCharacterMove(socket: TSocket, io: Server) { }) } -async function moveAlongPath(socket: TSocket, io: Server, path: Node[], grid: number[][]) { +async function moveAlongPath(socket: TSocket, io: Server, path: Node[], grid: number[][], moveToken: Symbol) { if (!socket.character) return 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') + return + } + const position = path[i] if (isObstacle(position, grid)) { console.log('Obstacle encountered at', position)