Map event tile improvements
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
import { UUID } from '#application/types'
|
||||
import { BaseEvent } from '#application/base/baseEvent'
|
||||
import CharacterTypeRepository from '#repositories/characterTypeRepository'
|
||||
import { CharacterGender, CharacterRace } from '#application/enums'
|
||||
import { UUID } from '#application/types'
|
||||
import CharacterTypeRepository from '#repositories/characterTypeRepository'
|
||||
import SpriteRepository from '#repositories/spriteRepository'
|
||||
|
||||
type Payload = {
|
||||
@ -19,7 +19,6 @@ export default class CharacterTypeUpdateEvent extends BaseEvent {
|
||||
}
|
||||
|
||||
private async handleEvent(data: Payload, callback: (success: boolean) => void): Promise<void> {
|
||||
|
||||
try {
|
||||
if (!(await this.isCharacterGM())) return
|
||||
|
||||
@ -31,13 +30,7 @@ export default class CharacterTypeUpdateEvent extends BaseEvent {
|
||||
const sprite = await spriteRepository.getById(data.spriteId)
|
||||
if (!sprite) return callback(false)
|
||||
|
||||
await characterType
|
||||
.setName(data.name)
|
||||
.setGender(data.gender)
|
||||
.setRace(data.race)
|
||||
.setIsSelectable(data.isSelectable)
|
||||
.setSprite(sprite)
|
||||
.save()
|
||||
await characterType.setName(data.name).setGender(data.gender).setRace(data.race).setIsSelectable(data.isSelectable).setSprite(sprite).save()
|
||||
|
||||
return callback(true)
|
||||
} catch (error) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { BaseEvent } from '#application/base/baseEvent'
|
||||
import ItemRepository from '#repositories/itemRepository'
|
||||
import { ItemType, ItemRarity } from '#application/enums'
|
||||
import { UUID } from '#application/types'
|
||||
import ItemRepository from '#repositories/itemRepository'
|
||||
import SpriteRepository from '#repositories/spriteRepository'
|
||||
|
||||
type Payload = {
|
||||
@ -20,7 +20,6 @@ export default class ItemUpdateEvent extends BaseEvent {
|
||||
}
|
||||
|
||||
private async handleEvent(data: Payload, callback: (success: boolean) => void): Promise<void> {
|
||||
|
||||
try {
|
||||
if (!(await this.isCharacterGM())) return
|
||||
|
||||
@ -32,14 +31,7 @@ export default class ItemUpdateEvent extends BaseEvent {
|
||||
const sprite = await spriteRepository.getById(data.spriteId)
|
||||
if (!sprite) return callback(false)
|
||||
|
||||
await item
|
||||
.setName(data.name)
|
||||
.setDescription(data.description)
|
||||
.setItemType(data.itemType)
|
||||
.setStackable(data.stackable)
|
||||
.setRarity(data.rarity)
|
||||
.setSprite(sprite)
|
||||
.save()
|
||||
await item.setName(data.name).setDescription(data.description).setItemType(data.itemType).setStackable(data.stackable).setRarity(data.rarity).setSprite(sprite).save()
|
||||
|
||||
return callback(true)
|
||||
} catch (error) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { Sprite } from '@prisma/client'
|
||||
|
||||
import { BaseEvent } from '#application/base/baseEvent'
|
||||
import { Sprite } from '#entities/sprite'
|
||||
import SpriteRepository from '#repositories/spriteRepository'
|
||||
|
||||
interface IPayload {}
|
||||
|
@ -21,7 +21,7 @@ interface IPayload {
|
||||
positionX: number
|
||||
positionY: number
|
||||
teleport?: {
|
||||
toMapId: UUID
|
||||
toMap: Map
|
||||
toPositionX: number
|
||||
toPositionY: number
|
||||
toRotation: number
|
||||
@ -32,6 +32,7 @@ interface IPayload {
|
||||
}
|
||||
|
||||
export default class MapUpdateEvent extends BaseEvent {
|
||||
private readonly populateOptions = ['mapEventTiles', 'placedMapObjects', 'mapEffects'];
|
||||
public listen(): void {
|
||||
this.socket.on('gm:map:update', this.handleEvent.bind(this))
|
||||
}
|
||||
@ -48,7 +49,7 @@ export default class MapUpdateEvent extends BaseEvent {
|
||||
return callback(null)
|
||||
}
|
||||
|
||||
let mapRepository = new MapRepository()
|
||||
const mapRepository = new MapRepository()
|
||||
let map = await mapRepository.getById(data.mapId)
|
||||
|
||||
if (!map) {
|
||||
@ -57,7 +58,7 @@ export default class MapUpdateEvent extends BaseEvent {
|
||||
}
|
||||
|
||||
// @ts-ignore
|
||||
await mapRepository.getEntityManager().populate(map, ['*'])
|
||||
await mapRepository.getEntityManager().populate(map, this.populateOptions)
|
||||
|
||||
// Validation logic remains the same
|
||||
if (data.tiles.length > data.height) {
|
||||
@ -83,7 +84,7 @@ export default class MapUpdateEvent extends BaseEvent {
|
||||
|
||||
if (tile.teleport) {
|
||||
const teleport = new MapEventTileTeleport()
|
||||
.setToMap((await mapRepository.getById(tile.teleport.toMapId))!)
|
||||
.setToMap((await mapRepository.getById(tile.teleport.toMap.id))!)
|
||||
.setToPositionX(tile.teleport.toPositionX)
|
||||
.setToPositionY(tile.teleport.toPositionY)
|
||||
.setToRotation(tile.teleport.toRotation)
|
||||
@ -91,7 +92,7 @@ export default class MapUpdateEvent extends BaseEvent {
|
||||
mapEventTile.setTeleport(teleport)
|
||||
}
|
||||
|
||||
// map.mapEventTiles.add(mapEventTile)
|
||||
map.mapEventTiles.add(mapEventTile)
|
||||
}
|
||||
|
||||
// Create and add new map objects
|
||||
@ -103,26 +104,27 @@ export default class MapUpdateEvent extends BaseEvent {
|
||||
.setPositionX(object.positionX)
|
||||
.setPositionY(object.positionY)
|
||||
.setMap(map)
|
||||
|
||||
map.placedMapObjects.add(mapObject)
|
||||
}
|
||||
|
||||
// Create and add new map effects
|
||||
for (const effect of data.mapEffects) {
|
||||
const mapEffect = new MapEffect().setEffect(effect.effect).setStrength(effect.strength).setMap(map)
|
||||
// map.mapEffects.add(mapEffect)
|
||||
|
||||
map.mapEffects.add(mapEffect)
|
||||
}
|
||||
|
||||
console.log(map.getPlacedMapObjects().count())
|
||||
|
||||
// Update map properties
|
||||
// map.setEntityManager(mapRepository.getEntityManager())
|
||||
await map.setName(data.name).setWidth(data.width).setHeight(data.height).setTiles(data.tiles).setPvp(data.pvp).setUpdatedAt(new Date()).save()
|
||||
|
||||
// Reload map from database to get fresh data
|
||||
mapRepository = new MapRepository()
|
||||
map = await mapRepository.getById(data.mapId)
|
||||
|
||||
// @ts-ignore
|
||||
await mapRepository.getEntityManager().populate(map!, ['*'])
|
||||
await mapRepository.getEntityManager().populate(map!, this.populateOptions)
|
||||
|
||||
if (!map) {
|
||||
this.logger.info(`User ${character!.getId()} tried to update map ${data.mapId} but it does not exist after update.`)
|
||||
@ -135,7 +137,7 @@ export default class MapUpdateEvent extends BaseEvent {
|
||||
|
||||
return callback(map)
|
||||
} catch (error: any) {
|
||||
this.logger.error(`gm:mapObject:update error: ${error instanceof Error ? error.message : String(error)}`)
|
||||
this.emitError(`gm:map:update error: ${error instanceof Error ? error.message + error.stack : String(error)}`)
|
||||
return callback(null)
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ export default class CharacterMove extends BaseEvent {
|
||||
|
||||
private async handleEvent({ positionX, positionY }: { positionX: number; positionY: number }): Promise<void> {
|
||||
const mapCharacter = MapManager.getCharacterById(this.socket.characterId!)
|
||||
if (!mapCharacter?.character) {
|
||||
if (!mapCharacter?.getCharacter()) {
|
||||
this.logger.error('map:character:move error: Character not found or not initialized')
|
||||
return
|
||||
}
|
||||
@ -39,7 +39,7 @@ export default class CharacterMove extends BaseEvent {
|
||||
}
|
||||
|
||||
private async moveAlongPath(mapCharacter: MapCharacter, path: Array<{ x: number; y: number }>): Promise<void> {
|
||||
const { character } = mapCharacter
|
||||
const character = mapCharacter.getCharacter()
|
||||
|
||||
for (let i = 0; i < path.length - 1; i++) {
|
||||
if (!mapCharacter.isMoving || mapCharacter.currentPath !== path) {
|
||||
@ -47,10 +47,10 @@ export default class CharacterMove extends BaseEvent {
|
||||
}
|
||||
|
||||
const [start, end] = [path[i], path[i + 1]]
|
||||
character.rotation = CharacterService.calculateRotation(start.x, start.y, end.x, end.y)
|
||||
character.setRotation(CharacterService.calculateRotation(start.x, start.y, end.x, end.y))
|
||||
|
||||
const mapEventTileRepository = new MapEventTileRepository()
|
||||
const mapEventTile = await mapEventTileRepository.getEventTileByMapIdAndPosition(character.map.id, Math.floor(end.x), Math.floor(end.y))
|
||||
const mapEventTile = await mapEventTileRepository.getEventTileByMapIdAndPosition(character.getMap().getId(), Math.floor(end.x), Math.floor(end.y))
|
||||
|
||||
if (mapEventTile?.type === 'BLOCK') break
|
||||
if (mapEventTile?.type === 'TELEPORT' && mapEventTile.teleport) {
|
||||
@ -59,15 +59,14 @@ export default class CharacterMove extends BaseEvent {
|
||||
}
|
||||
|
||||
// Update position first
|
||||
character.positionX = end.x
|
||||
character.positionY = end.y
|
||||
character.setPositionX(end.x).setPositionY(end.y)
|
||||
|
||||
// Then emit with the same properties
|
||||
this.io.in(character.map.id).emit('map:character:move', {
|
||||
characterId: character.id,
|
||||
positionX: character.positionX,
|
||||
positionY: character.positionY,
|
||||
rotation: character.rotation,
|
||||
positionX: character.getPositionX(),
|
||||
positionY: character.getPositionY(),
|
||||
rotation: character.getRotation(),
|
||||
isMoving: true
|
||||
})
|
||||
|
||||
@ -80,18 +79,12 @@ export default class CharacterMove extends BaseEvent {
|
||||
}
|
||||
|
||||
private async handleMapEventTile(mapEventTile: MapEventTileWithTeleport): Promise<void> {
|
||||
const mapCharacter = MapManager.getCharacterById(this.socket.characterId!)
|
||||
if (!mapCharacter) {
|
||||
this.logger.error('map:character:move error: Character not found')
|
||||
return
|
||||
}
|
||||
|
||||
if (mapEventTile.teleport) {
|
||||
await TeleportService.teleportCharacter(mapCharacter.character.id, {
|
||||
targetMapId: mapEventTile.teleport.toMap.id,
|
||||
targetX: mapEventTile.teleport.toPositionX,
|
||||
targetY: mapEventTile.teleport.toPositionY,
|
||||
rotation: mapCharacter.character.rotation
|
||||
if (mapEventTile.getTeleport()) {
|
||||
await TeleportService.teleportCharacter(this.socket.characterId!, {
|
||||
targetMapId: mapEventTile.getTeleport()!.getToMap().getId(),
|
||||
targetX: mapEventTile.getTeleport()!.getToPositionX(),
|
||||
targetY: mapEventTile.getTeleport()!.getToPositionY(),
|
||||
rotation: mapEventTile.getTeleport()!.getToRotation()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user