Move bug fix
This commit is contained in:
parent
4d65379c3e
commit
a9994f6d95
@ -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<string, Symbol>()
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user