server/src/events/character/ZoneLeave.ts

49 lines
1.3 KiB
TypeScript

import { Server } from 'socket.io'
import { TSocket } from '../../utilities/Types'
import ZoneRepository from '../../repositories/ZoneRepository'
import ZoneManager from '../../managers/ZoneManager'
import { Character, Zone } from '@prisma/client'
/**
* Handle character zone leave event
* @param socket
* @param io
*/
export default function (socket: TSocket, io: Server) {
socket.on('character:zone:leave', async () => {
console.log(`---Socket ${socket.character?.id} has leaved zone.`)
if (!socket.character) {
console.log('Socket leaved zone but had no character set')
return
}
if (!socket.character.zoneId) {
console.log(`---Zone id not provided.`)
return
}
const zone = await ZoneRepository.getById(socket.character.zoneId)
if (!zone) {
console.log(`---Zone not found.`)
return
}
socket.leave(zone.id.toString())
socket.emit('character:zone:unload')
// let other clients know of new character
io.to(zone.id.toString()).emit('zone:character:leave', socket.character)
// add character to zone manager
ZoneManager.removeCharacterFromZone(zone.id, socket.character as Character)
})
}
/**
* Resources:
* https://stackoverflow.com/questions/6873607/socket-io-rooms-difference-between-broadcast-to-and-sockets-in
*/