forked from noxious/server
More TP work
This commit is contained in:
parent
e8d100e063
commit
1aa3d1a208
@ -1,13 +1,19 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket, ExtendedCharacter } from '../../utilities/types'
|
import { TSocket, ExtendedCharacter } from '../../utilities/types'
|
||||||
import { CharacterMoveService } from '../../services/character/characterMoveService'
|
import { CharacterMoveService } from '../../services/character/characterMoveService'
|
||||||
import { TeleportService } from '../../services/character/teleportService'
|
import { ZoneEventTileService } from '../../services/zoneEventTileService'
|
||||||
import { MovementValidator } from '../../services/character/movementValidator'
|
import { MovementValidator } from '../../utilities/movementValidator'
|
||||||
import { SocketEmitter } from '../../utilities/socketEmitter'
|
import { SocketEmitter } from '../../utilities/socketEmitter'
|
||||||
|
import prisma from '../../utilities/prisma'
|
||||||
|
import { ZoneEventTile, ZoneEventTileTeleport } from '@prisma/client'
|
||||||
|
|
||||||
|
type ZoneEventTileWithTeleport = ZoneEventTile & {
|
||||||
|
teleport: ZoneEventTileTeleport | null
|
||||||
|
}
|
||||||
|
|
||||||
export default class CharacterMoveEvent {
|
export default class CharacterMoveEvent {
|
||||||
private characterMoveService: CharacterMoveService
|
private characterMoveService: CharacterMoveService
|
||||||
private teleportService: TeleportService
|
private zoneEventTileService: ZoneEventTileService
|
||||||
private movementValidator: MovementValidator
|
private movementValidator: MovementValidator
|
||||||
private socketEmitter: SocketEmitter
|
private socketEmitter: SocketEmitter
|
||||||
|
|
||||||
@ -16,7 +22,7 @@ export default class CharacterMoveEvent {
|
|||||||
private readonly socket: TSocket
|
private readonly socket: TSocket
|
||||||
) {
|
) {
|
||||||
this.characterMoveService = new CharacterMoveService()
|
this.characterMoveService = new CharacterMoveService()
|
||||||
this.teleportService = new TeleportService()
|
this.zoneEventTileService = new ZoneEventTileService()
|
||||||
this.movementValidator = new MovementValidator()
|
this.movementValidator = new MovementValidator()
|
||||||
this.socketEmitter = new SocketEmitter(io, socket)
|
this.socketEmitter = new SocketEmitter(io, socket)
|
||||||
}
|
}
|
||||||
@ -47,11 +53,18 @@ export default class CharacterMoveEvent {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
const teleport = await this.teleportService.checkForTeleport(character, position)
|
const zoneEventTile = await prisma.zoneEventTile.findFirst({
|
||||||
if (teleport) {
|
where: {
|
||||||
await this.characterMoveService.updatePosition(character, position, teleport.toZoneId)
|
zoneId: character.zoneId,
|
||||||
await this.teleportService.handleTeleport(this.socket, character, teleport)
|
type: 'TELEPORT',
|
||||||
break
|
positionX: Math.floor(position.x),
|
||||||
|
positionY: Math.floor(position.y)
|
||||||
|
},
|
||||||
|
include: { teleport: true }
|
||||||
|
}) as ZoneEventTileWithTeleport | null
|
||||||
|
|
||||||
|
if (zoneEventTile) {
|
||||||
|
await this.handleZoneEventTile(zoneEventTile)
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.characterMoveService.updatePosition(character, position)
|
await this.characterMoveService.updatePosition(character, position)
|
||||||
@ -63,6 +76,21 @@ export default class CharacterMoveEvent {
|
|||||||
this.finalizeMovement(character)
|
this.finalizeMovement(character)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async handleZoneEventTile(zoneEventTile: ZoneEventTileWithTeleport): Promise<void> {
|
||||||
|
const { character } = this.socket
|
||||||
|
if (!character) {
|
||||||
|
console.error('character:move error', 'Character not found')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const teleport = zoneEventTile.teleport
|
||||||
|
if (teleport) {
|
||||||
|
await this.characterMoveService.updatePosition(character, { x: teleport.toPositionX, y: teleport.toPositionY }, teleport.toZoneId)
|
||||||
|
await this.zoneEventTileService.handleTeleport(this.socket, character, teleport)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private finalizeMovement(character: ExtendedCharacter): void {
|
private finalizeMovement(character: ExtendedCharacter): void {
|
||||||
character.isMoving = false
|
character.isMoving = false
|
||||||
this.socketEmitter.emitCharacterMove(character)
|
this.socketEmitter.emitCharacterMove(character)
|
||||||
|
@ -10,6 +10,8 @@ export class CharacterMoveService {
|
|||||||
public async updatePosition(character: ExtendedCharacter, position: { x: number; y: number }, newZoneId?: number): Promise<void> {
|
public async updatePosition(character: ExtendedCharacter, position: { x: number; y: number }, newZoneId?: number): Promise<void> {
|
||||||
const oldZoneId = character.zoneId
|
const oldZoneId = character.zoneId
|
||||||
|
|
||||||
|
console.log('newZoneId', newZoneId)
|
||||||
|
|
||||||
Object.assign(character, {
|
Object.assign(character, {
|
||||||
positionX: position.x,
|
positionX: position.x,
|
||||||
positionY: position.y,
|
positionY: position.y,
|
||||||
@ -30,7 +32,7 @@ export class CharacterMoveService {
|
|||||||
positionX: position.x,
|
positionX: position.x,
|
||||||
positionY: position.y,
|
positionY: position.y,
|
||||||
rotation: character.rotation,
|
rotation: character.rotation,
|
||||||
zoneId: character.zoneId
|
zoneId: newZoneId
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
import { ExtendedCharacter, TSocket } from '../../utilities/types'
|
|
||||||
import prisma from '../../utilities/prisma'
|
|
||||||
import ZoneRepository from '../../repositories/zoneRepository'
|
|
||||||
import ZoneManager from '../../managers/zoneManager'
|
|
||||||
|
|
||||||
export class TeleportService {
|
|
||||||
public async checkForTeleport(character: ExtendedCharacter, position: { x: number; y: number }): Promise<any | null> {
|
|
||||||
return prisma.zoneEventTile.findFirst({
|
|
||||||
where: {
|
|
||||||
zoneId: character.zoneId,
|
|
||||||
type: 'TELEPORT',
|
|
||||||
positionX: Math.floor(position.x),
|
|
||||||
positionY: Math.floor(position.y)
|
|
||||||
},
|
|
||||||
include: { teleport: true }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
public async handleTeleport(socket: TSocket, character: ExtendedCharacter, teleport: any): Promise<void> {
|
|
||||||
if (teleport.toZoneId === character.zoneId) return
|
|
||||||
|
|
||||||
const zone = await ZoneRepository.getById(teleport.toZoneId)
|
|
||||||
if (!zone) return
|
|
||||||
|
|
||||||
character.zoneId = teleport.toZoneId
|
|
||||||
character.positionX = teleport.toPositionX
|
|
||||||
character.positionY = teleport.toPositionY
|
|
||||||
|
|
||||||
socket.leave(character.zoneId.toString())
|
|
||||||
socket.join(teleport.toZoneId.toString())
|
|
||||||
|
|
||||||
socket.emit('zone:teleport', {
|
|
||||||
zone,
|
|
||||||
characters: ZoneManager.getCharactersInZone(zone.id)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
26
src/services/zoneEventTileService.ts
Normal file
26
src/services/zoneEventTileService.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { ExtendedCharacter, TSocket } from '../utilities/types'
|
||||||
|
import prisma from '../utilities/prisma'
|
||||||
|
import ZoneRepository from '../repositories/zoneRepository'
|
||||||
|
import ZoneManager from '../managers/zoneManager'
|
||||||
|
import { ZoneEventTile, ZoneEventTileTeleport } from '@prisma/client'
|
||||||
|
|
||||||
|
export class ZoneEventTileService {
|
||||||
|
public async handleTeleport(socket: TSocket, character: ExtendedCharacter, teleport: ZoneEventTileTeleport): Promise<void> {
|
||||||
|
if (teleport.toZoneId === character.zoneId) return
|
||||||
|
|
||||||
|
const zone = await ZoneRepository.getById(teleport.toZoneId)
|
||||||
|
if (!zone) return
|
||||||
|
|
||||||
|
character.zoneId = teleport.toZoneId
|
||||||
|
character.positionX = teleport.toPositionX
|
||||||
|
character.positionY = teleport.toPositionY
|
||||||
|
|
||||||
|
socket.leave(character.zoneId.toString())
|
||||||
|
socket.join(teleport.toZoneId.toString())
|
||||||
|
|
||||||
|
socket.emit('zone:teleport', {
|
||||||
|
zone,
|
||||||
|
characters: ZoneManager.getCharactersInZone(zone.id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
import { ExtendedCharacter } from '../../utilities/types'
|
import { ExtendedCharacter } from './types'
|
||||||
import ZoneManager from '../../managers/zoneManager'
|
import ZoneManager from '../managers/zoneManager'
|
||||||
|
|
||||||
export class MovementValidator {
|
export class MovementValidator {
|
||||||
public async isValidMove(character: ExtendedCharacter, position: { x: number; y: number }): Promise<boolean> {
|
public async isValidMove(character: ExtendedCharacter, position: { x: number; y: number }): Promise<boolean> {
|
Loading…
x
Reference in New Issue
Block a user