forked from noxious/server
Renamed zone > map
This commit is contained in:
@ -1,11 +1,11 @@
|
||||
import { BaseService } from '#application/base/baseService'
|
||||
import config from '#application/config'
|
||||
import { Character } from '#entities/character'
|
||||
import { Zone } from '#entities/zone'
|
||||
import { Map } from '#entities/map'
|
||||
import SocketManager from '#managers/socketManager'
|
||||
import ZoneManager from '#managers/zoneManager'
|
||||
import MapManager from '#managers/mapManager'
|
||||
import CharacterRepository from '#repositories/characterRepository'
|
||||
import ZoneRepository from '#repositories/zoneRepository'
|
||||
import MapRepository from '#repositories/mapRepository'
|
||||
|
||||
type Position = { x: number; y: number }
|
||||
export type Node = Position & { parent?: Node; g: number; h: number; f: number }
|
||||
@ -24,11 +24,11 @@ class CharacterService extends BaseService {
|
||||
]
|
||||
|
||||
public async calculatePath(character: Character, targetX: number, targetY: number): Promise<Position[] | null> {
|
||||
const zone = ZoneManager.getZoneById(character.zone.id)
|
||||
const grid = await zone?.getGrid()
|
||||
const map = MapManager.getMapById(character.map.id)
|
||||
const grid = await map?.getGrid()
|
||||
|
||||
if (!grid?.length) {
|
||||
this.logger.error('zone:character:move error: Grid not found or empty')
|
||||
this.logger.error('map:character:move error: Grid not found or empty')
|
||||
return null
|
||||
}
|
||||
|
||||
|
@ -6,22 +6,22 @@ import { Chat } from '#entities/chat'
|
||||
import SocketManager from '#managers/socketManager'
|
||||
import CharacterRepository from '#repositories/characterRepository'
|
||||
import ChatRepository from '#repositories/chatRepository'
|
||||
import ZoneRepository from '#repositories/zoneRepository'
|
||||
import MapRepository from '#repositories/mapRepository'
|
||||
|
||||
class ChatService extends BaseService {
|
||||
async sendZoneMessage(characterId: UUID, zoneId: UUID, message: string): Promise<boolean> {
|
||||
async sendMapMessage(characterId: UUID, mapId: UUID, message: string): Promise<boolean> {
|
||||
try {
|
||||
const character = await CharacterRepository.getById(characterId)
|
||||
if (!character) return false
|
||||
|
||||
const zone = await ZoneRepository.getById(zoneId)
|
||||
if (!zone) return false
|
||||
const map = await MapRepository.getById(mapId)
|
||||
if (!map) return false
|
||||
|
||||
const chat = new Chat()
|
||||
await chat.setCharacter(character).setZone(zone).setMessage(message).save()
|
||||
await chat.setCharacter(character).setMap(map).setMessage(message).save()
|
||||
|
||||
const io = SocketManager.getIO()
|
||||
io.to(zoneId).emit('chat:message', chat)
|
||||
io.to(mapId).emit('chat:message', chat)
|
||||
return true
|
||||
} catch (error: any) {
|
||||
this.logger.error(`Failed to save chat message: ${error instanceof Error ? error.message : String(error)}`)
|
||||
|
49
src/services/mapEventTileService.ts
Normal file
49
src/services/mapEventTileService.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import { Server } from 'socket.io'
|
||||
|
||||
import { BaseService } from '#application/base/baseService'
|
||||
import { ExtendedCharacter, TSocket } from '#application/types'
|
||||
import { MapEventTileTeleport } from '#entities/mapEventTileTeleport'
|
||||
import MapManager from '#managers/mapManager'
|
||||
|
||||
class MapEventTileService extends BaseService {
|
||||
public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: MapEventTileTeleport): Promise<void> {
|
||||
if (teleport.toMap.id === character.map.id) return
|
||||
|
||||
const loadedMap = MapManager.getMapById(teleport.toMap.id)
|
||||
if (!loadedMap) {
|
||||
this.logger.error('map:character:join error: Loaded map not found')
|
||||
return
|
||||
}
|
||||
|
||||
const map = loadedMap.getMap()
|
||||
|
||||
const oldMapId = character.map.id
|
||||
const newMapId = teleport.toMap.id
|
||||
|
||||
character.isMoving = false
|
||||
// Update local character object
|
||||
character.setMap(teleport.toMap).setRotation(teleport.toRotation).setPositionX(teleport.toPositionX).setPositionY(teleport.toPositionY)
|
||||
|
||||
await character.save()
|
||||
|
||||
// Remove and add character to new map
|
||||
await loadedMap.removeCharacter(character.id)
|
||||
loadedMap.addCharacter(character)
|
||||
|
||||
// Emit events
|
||||
io.to(oldMapId).emit('map:character:leave', character.id)
|
||||
io.to(newMapId).emit('map:character:join', character)
|
||||
|
||||
// Update socket rooms
|
||||
socket.leave(oldMapId)
|
||||
socket.join(newMapId)
|
||||
|
||||
// Send teleport information to the client
|
||||
socket.emit('map:character:teleport', {
|
||||
map,
|
||||
characters: loadedMap.getCharactersInMap()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export default new MapEventTileService()
|
@ -1,7 +1,7 @@
|
||||
import { BaseService } from '#application/base/baseService'
|
||||
|
||||
class ZoneService extends BaseService {
|
||||
public flattenZoneArray(tiles: string[][]) {
|
||||
class MapService extends BaseService {
|
||||
public flattenMapArray(tiles: string[][]) {
|
||||
const normalArray = []
|
||||
|
||||
for (const row of tiles) {
|
||||
@ -12,4 +12,4 @@ class ZoneService extends BaseService {
|
||||
}
|
||||
}
|
||||
|
||||
export default new ZoneService()
|
||||
export default new MapService()
|
@ -2,11 +2,11 @@ import Logger, { LoggerType } from '#application/logger'
|
||||
import { UUID } from '#application/types'
|
||||
import { Character } from '#entities/character'
|
||||
import SocketManager from '#managers/socketManager'
|
||||
import ZoneManager from '#managers/zoneManager'
|
||||
import ZoneCharacter from '#models/zoneCharacter'
|
||||
import MapManager from '#managers/mapManager'
|
||||
import MapCharacter from '#models/mapCharacter'
|
||||
|
||||
interface TeleportOptions {
|
||||
targetZoneId: UUID
|
||||
targetMapId: UUID
|
||||
targetX: number
|
||||
targetY: number
|
||||
rotation?: number
|
||||
@ -18,13 +18,13 @@ class TeleportService {
|
||||
private readonly logger = Logger.type(LoggerType.GAME)
|
||||
|
||||
public async teleportCharacter(characterId: UUID, options: TeleportOptions): Promise<boolean> {
|
||||
const { targetZoneId, targetX, targetY, rotation = 0, isInitialJoin = false, character } = options
|
||||
const { targetMapId, targetX, targetY, rotation = 0, isInitialJoin = false, character } = options
|
||||
|
||||
const socket = SocketManager.getSocketByCharacterId(characterId)
|
||||
const targetZone = ZoneManager.getZoneById(targetZoneId)
|
||||
const targetMap = MapManager.getMapById(targetMapId)
|
||||
|
||||
if (!socket || !targetZone) {
|
||||
this.logger.error(`Teleport failed - Missing socket or target zone for character ${characterId}`)
|
||||
if (!socket || !targetMap) {
|
||||
this.logger.error(`Teleport failed - Missing socket or target map for character ${characterId}`)
|
||||
return false
|
||||
}
|
||||
|
||||
@ -33,40 +33,40 @@ class TeleportService {
|
||||
return false
|
||||
}
|
||||
|
||||
const existingCharacter = !isInitialJoin && ZoneManager.getCharacterById(characterId)
|
||||
const zoneCharacter = isInitialJoin
|
||||
? new ZoneCharacter(character!)
|
||||
const existingCharacter = !isInitialJoin && MapManager.getCharacterById(characterId)
|
||||
const mapCharacter = isInitialJoin
|
||||
? new MapCharacter(character!)
|
||||
: existingCharacter ||
|
||||
(() => {
|
||||
this.logger.error(`Teleport failed - Character ${characterId} not found in ZoneManager`)
|
||||
this.logger.error(`Teleport failed - Character ${characterId} not found in MapManager`)
|
||||
return null
|
||||
})()
|
||||
|
||||
if (!zoneCharacter) return false
|
||||
if (!mapCharacter) return false
|
||||
|
||||
try {
|
||||
const currentZoneId = zoneCharacter.character.zone?.id
|
||||
const currentMapId = mapCharacter.character.map?.id
|
||||
const io = SocketManager.getIO()
|
||||
|
||||
// Handle current zone cleanup
|
||||
if (currentZoneId) {
|
||||
socket.leave(currentZoneId)
|
||||
ZoneManager.removeCharacter(characterId)
|
||||
io.in(currentZoneId).emit('zone:character:leave', characterId)
|
||||
// Handle current map cleanup
|
||||
if (currentMapId) {
|
||||
socket.leave(currentMapId)
|
||||
MapManager.removeCharacter(characterId)
|
||||
io.in(currentMapId).emit('map:character:leave', characterId)
|
||||
}
|
||||
|
||||
// Update character position and zone
|
||||
await zoneCharacter.character.setPositionX(targetX).setPositionY(targetY).setRotation(rotation).setZone(targetZone.getZone()).update()
|
||||
// Update character position and map
|
||||
await mapCharacter.character.setPositionX(targetX).setPositionY(targetY).setRotation(rotation).setMap(targetMap.getMap()).update()
|
||||
|
||||
// Join new zone
|
||||
socket.join(targetZoneId)
|
||||
targetZone.addCharacter(zoneCharacter.character)
|
||||
// Join new map
|
||||
socket.join(targetMapId)
|
||||
targetMap.addCharacter(mapCharacter.character)
|
||||
|
||||
// Notify clients
|
||||
io.in(targetZoneId).emit('zone:character:join', zoneCharacter)
|
||||
socket.emit('zone:character:teleport', {
|
||||
zone: targetZone.getZone(),
|
||||
characters: targetZone.getCharactersInZone()
|
||||
io.in(targetMapId).emit('map:character:join', mapCharacter)
|
||||
socket.emit('map:character:teleport', {
|
||||
map: targetMap.getMap(),
|
||||
characters: targetMap.getCharactersInMap()
|
||||
})
|
||||
|
||||
return true
|
||||
|
@ -1,49 +0,0 @@
|
||||
import { Server } from 'socket.io'
|
||||
|
||||
import { BaseService } from '#application/base/baseService'
|
||||
import { ExtendedCharacter, TSocket } from '#application/types'
|
||||
import { ZoneEventTileTeleport } from '#entities/zoneEventTileTeleport'
|
||||
import ZoneManager from '#managers/zoneManager'
|
||||
|
||||
class ZoneEventTileService extends BaseService {
|
||||
public async handleTeleport(io: Server, socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {
|
||||
if (teleport.toZone.id === character.zone.id) return
|
||||
|
||||
const loadedZone = ZoneManager.getZoneById(teleport.toZone.id)
|
||||
if (!loadedZone) {
|
||||
this.logger.error('zone:character:join error: Loaded zone not found')
|
||||
return
|
||||
}
|
||||
|
||||
const zone = loadedZone.getZone()
|
||||
|
||||
const oldZoneId = character.zone.id
|
||||
const newZoneId = teleport.toZone.id
|
||||
|
||||
character.isMoving = false
|
||||
// Update local character object
|
||||
character.setZone(teleport.toZone).setRotation(teleport.toRotation).setPositionX(teleport.toPositionX).setPositionY(teleport.toPositionY)
|
||||
|
||||
await character.save()
|
||||
|
||||
// Remove and add character to new zone
|
||||
await loadedZone.removeCharacter(character.id)
|
||||
loadedZone.addCharacter(character)
|
||||
|
||||
// Emit events
|
||||
io.to(oldZoneId).emit('zone:character:leave', character.id)
|
||||
io.to(newZoneId).emit('zone:character:join', character)
|
||||
|
||||
// Update socket rooms
|
||||
socket.leave(oldZoneId)
|
||||
socket.join(newZoneId)
|
||||
|
||||
// Send teleport information to the client
|
||||
socket.emit('zone:character:teleport', {
|
||||
zone,
|
||||
characters: loadedZone.getCharactersInZone()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export default new ZoneEventTileService()
|
Reference in New Issue
Block a user