1
0
forked from noxious/server

Fixes for teleporting between zones

This commit is contained in:
2024-09-07 22:28:36 +02:00
parent 22bf43b14d
commit 358aa795e4
5 changed files with 81 additions and 28 deletions

View File

@ -7,29 +7,44 @@ import { Server } from 'socket.io'
export class ZoneEventTileService {
public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {
if (teleport.toZoneId === character.zoneId) return
if (teleport.toZoneId === character.zoneId) return;
const zone = await ZoneRepository.getById(teleport.toZoneId)
if (!zone) return
const zone = await ZoneRepository.getById(teleport.toZoneId);
if (!zone) return;
const oldZoneId = character.zoneId
const newZoneId = teleport.toZoneId
const oldZoneId = character.zoneId;
const newZoneId = teleport.toZoneId;
character.zoneId = teleport.toZoneId
character.positionX = teleport.toPositionX
character.positionY = teleport.toPositionY
// Update character in database
await prisma.character.update({
where: { id: character.id },
data: {
zoneId: newZoneId,
positionX: teleport.toPositionX,
positionY: teleport.toPositionY
}
});
socket.leave(character.zoneId.toString())
socket.join(teleport.toZoneId.toString())
// Update local character object
character.zoneId = newZoneId;
character.positionX = teleport.toPositionX;
character.positionY = teleport.toPositionY;
io.to(oldZoneId.toString()).emit('zone:character:leave', character);
// Atomic operation in ZoneManager
await ZoneManager.moveCharacterBetweenZones(oldZoneId, newZoneId, character as Character);
// Emit events
io.to(oldZoneId.toString()).emit('zone:character:leave', character.id);
io.to(newZoneId.toString()).emit('zone:character:join', character);
ZoneManager.removeCharacterFromZone(oldZoneId, character as Character);
ZoneManager.addCharacterToZone(newZoneId, character as Character);
// Update socket rooms
socket.leave(oldZoneId.toString());
socket.join(newZoneId.toString());
// Send teleport information to the client
socket.emit('zone:teleport', {
zone,
characters: ZoneManager.getCharactersInZone(zone.id)
})
});
}
}