1
0
forked from noxious/server

Move bug fix

This commit is contained in:
Dennis Postma 2024-08-03 19:18:07 +02:00
parent 4d65379c3e
commit a9994f6d95

View File

@ -11,8 +11,8 @@ interface SocketResponse {
position_y: number position_y: number
} }
// Add a cancellation token // Map to store movement tokens for each character
let currentMoveToken: Symbol | null = null const characterMoveTokens = new Map<string, Symbol>()
export default function setupCharacterMove(socket: TSocket, io: Server) { export default function setupCharacterMove(socket: TSocket, io: Server) {
socket.on('character:move', async (data: SocketResponse) => { socket.on('character:move', async (data: SocketResponse) => {
@ -24,9 +24,9 @@ export default function setupCharacterMove(socket: TSocket, io: Server) {
return return
} }
// Cancel any ongoing movement // Cancel any ongoing movement for this character
currentMoveToken = Symbol('moveToken') const moveToken = Symbol('moveToken')
const moveToken = currentMoveToken characterMoveTokens.set(socket.character.id, moveToken)
const grid = await ZoneManager.getGrid(socket.character.zoneId) const grid = await ZoneManager.getGrid(socket.character.zoneId)
@ -43,14 +43,9 @@ export default function setupCharacterMove(socket: TSocket, io: Server) {
if (path.length > 0) { if (path.length > 0) {
socket.character.isMoving = true socket.character.isMoving = true
io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character) io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character)
try {
await moveAlongPath(socket, io, path, grid, moveToken) // Start movement in a non-blocking manner
} finally { moveAlongPath(socket, io, path, grid, moveToken).catch(console.error)
if (currentMoveToken === moveToken) {
socket.character.isMoving = false
io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character)
}
}
} else { } else {
console.log('character:move error', 'No valid path found') 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++) { for (let i = 0; i < path.length; i++) {
// Check if this movement has been cancelled // Check if this movement has been cancelled
if (currentMoveToken !== moveToken) { if (characterMoveTokens.get(socket.character.id) !== moveToken) {
console.log('Movement cancelled, stopping current path') console.log('Movement cancelled for character', socket.character.id)
return 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) io.in(socket.character.zoneId.toString()).emit('character:moved', socket.character)
// Add a small delay between moves to avoid overwhelming the server // 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)
} }
} }