1
0
forked from noxious/server

#293: Changed IDs to UUIDs for all entities

This commit is contained in:
2025-01-01 20:53:05 +01:00
parent 465219276d
commit 586bb0ca83
17 changed files with 79 additions and 52 deletions

View File

@ -149,7 +149,7 @@ export default class InitCommand extends BaseCommand {
.save()
const characterType = new CharacterType()
await characterType.setId(1).setName('New character type').setGender(CharacterGender.MALE).setRace(CharacterRace.HUMAN).setIsSelectable(true).setSprite(characterSprite).save()
await characterType.setId('75b70c78-17f0-44c0-a4fa-15043cb95be0').setName('New character type').setGender(CharacterGender.MALE).setRace(CharacterRace.HUMAN).setIsSelectable(true).setSprite(characterSprite).save()
}
private async createCharacterHair(): Promise<void> {
@ -190,7 +190,7 @@ export default class InitCommand extends BaseCommand {
.save()
const characterHair = new CharacterHair()
await characterHair.setId(1).setName('Hair 1').setGender(CharacterGender.MALE).setIsSelectable(true).setSprite(hairSprite).save()
await characterHair.setId('a2471230-d238-4ffb-9eca-9eab869f1b67').setName('Hair 1').setGender(CharacterGender.MALE).setIsSelectable(true).setSprite(hairSprite).save()
}
private async createCharacterEquipment(): Promise<void> {
@ -240,15 +240,15 @@ export default class InitCommand extends BaseCommand {
private async createUser(): Promise<void> {
const user = new User()
await user.setId(1).setUsername('root').setEmail('local@host').setPassword('password').setOnline(false).save()
await user.setId('6f9a58b4-172d-425e-b9ea-71e1d13d81ee').setUsername('root').setEmail('local@host').setPassword('password').setOnline(false).save()
const character = new Character()
await character
.setId(1)
.setId('26850183-1757-4135-938f-aa1448c49654')
.setUser(user)
.setName('root')
.setRole('gm')
.setZone((await ZoneRepository.getFirst()) ?? undefined)
.setZone((await ZoneRepository.getFirst())!)
.setCharacterType((await CharacterTypeRepository.getFirst()) ?? undefined)
.setCharacterHair((await CharacterHairRepository.getFirst()) ?? undefined)
.save()

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { CharacterEquipment } from './characterEquipment'
@ -9,11 +11,12 @@ import { User } from './user'
import { Zone } from './zone'
import { BaseEntity } from '#application/base/baseEntity'
import { UUID } from '#application/types'
@Entity()
export class Character extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@ManyToOne(() => User)
user!: User
@ -85,7 +88,7 @@ export class Character extends BaseEntity {
@Property()
wisdom = 10
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Entity, Enum, ManyToOne, PrimaryKey } from '@mikro-orm/core'
import { Character } from './character'
@ -5,11 +7,12 @@ import { CharacterItem } from './characterItem'
import { BaseEntity } from '#application/base/baseEntity'
import { CharacterEquipmentSlotType } from '#application/enums'
import { UUID } from '#application/types'
@Entity()
export class CharacterEquipment extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@Enum(() => CharacterEquipmentSlotType)
slot!: CharacterEquipmentSlotType
@ -20,7 +23,7 @@ export class CharacterEquipment extends BaseEntity {
@ManyToOne({ deleteRule: 'cascade' })
characterItem!: CharacterItem
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { Character } from './character'
@ -5,11 +7,12 @@ import { Sprite } from './sprite'
import { BaseEntity } from '#application/base/baseEntity'
import { CharacterGender } from '#application/enums'
import { UUID } from '#application/types'
@Entity()
export class CharacterHair extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@Property()
name!: string
@ -23,7 +26,7 @@ export class CharacterHair extends BaseEntity {
@ManyToOne({ nullable: true })
sprite?: Sprite
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Collection, Entity, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { Character } from './character'
@ -5,11 +7,12 @@ import { CharacterEquipment } from './characterEquipment'
import { Item } from './item'
import { BaseEntity } from '#application/base/baseEntity'
import { UUID } from '#application/types'
@Entity()
export class CharacterItem extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@ManyToOne({ deleteRule: 'cascade' })
character!: Character
@ -20,7 +23,7 @@ export class CharacterItem extends BaseEntity {
@Property()
quantity!: number
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Collection, Entity, Enum, ManyToOne, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { Character } from './character'
@ -5,11 +7,12 @@ import { Sprite } from './sprite'
import { BaseEntity } from '#application/base/baseEntity'
import { CharacterGender, CharacterRace } from '#application/enums'
import { UUID } from '#application/types'
@Entity()
export class CharacterType extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@Property()
name!: string
@ -35,7 +38,7 @@ export class CharacterType extends BaseEntity {
@Property()
updatedAt = new Date()
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,14 +1,17 @@
import { randomUUID } from 'node:crypto'
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { Character } from './character'
import { Zone } from './zone'
import { BaseEntity } from '#application/base/baseEntity'
import { UUID } from '#application/types'
@Entity()
export class Chat extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@ManyToOne({ deleteRule: 'cascade' })
character!: Character
@ -22,7 +25,7 @@ export class Chat extends BaseEntity {
@Property()
createdAt = new Date()
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,13 +1,16 @@
import { randomUUID } from 'node:crypto'
import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'
import { User } from './user'
import { BaseEntity } from '#application/base/baseEntity'
import { UUID } from '#application/types'
@Entity()
export class PasswordResetToken extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@ManyToOne({ deleteRule: 'cascade' })
user!: User
@ -18,7 +21,7 @@ export class PasswordResetToken extends BaseEntity {
@Property()
createdAt = new Date()
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import bcrypt from 'bcryptjs'
@ -5,11 +7,12 @@ import { Character } from './character'
import { PasswordResetToken } from './passwordResetToken'
import { BaseEntity } from '#application/base/baseEntity'
import { UUID } from '#application/types'
@Entity()
export class User extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@Property({ unique: true })
username!: string
@ -29,7 +32,7 @@ export class User extends BaseEntity {
@OneToMany(() => PasswordResetToken, (token) => token.user)
passwordResetTokens = new Collection<PasswordResetToken>(this)
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -1,3 +1,5 @@
import { randomUUID } from 'node:crypto'
import { Collection, Entity, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'
import { Character } from './character'
@ -8,11 +10,12 @@ import { ZoneEventTileTeleport } from './zoneEventTileTeleport'
import { ZoneObject } from './zoneObject'
import { BaseEntity } from '#application/base/baseEntity'
import { UUID } from '#application/types'
@Entity()
export class Zone extends BaseEntity {
@PrimaryKey()
id!: number
id = randomUUID()
@Property()
name!: string
@ -53,7 +56,7 @@ export class Zone extends BaseEntity {
@OneToMany(() => Chat, (chat) => chat.zone)
chats = new Collection<Chat>(this)
setId(id: number) {
setId(id: UUID) {
this.id = id
return this
}

View File

@ -29,7 +29,7 @@ export default class CharacterMove extends BaseEvent {
const path = await this.characterService.calculatePath(zoneCharacter.character, positionX, positionY)
if (!path) {
this.io.in(zoneCharacter.character.zone.id.toString()).emit('zone:character:moveError', 'No valid path found')
this.io.in(zoneCharacter.character.zone.id).emit('zone:character:moveError', 'No valid path found')
return
}
@ -63,7 +63,7 @@ export default class CharacterMove extends BaseEvent {
character.positionY = end.y
// Then emit with the same properties
this.io.in(character.zone.id.toString()).emit('zone:character:move', {
this.io.in(character.zone.id).emit('zone:character:move', {
characterId: character.id,
positionX: character.positionX,
positionY: character.positionY,
@ -93,7 +93,7 @@ export default class CharacterMove extends BaseEvent {
private finalizeMovement(zoneCharacter: ZoneCharacter): void {
zoneCharacter.isMoving = false
this.io.in(zoneCharacter.character.zone.id.toString()).emit('zone:character:move', {
this.io.in(zoneCharacter.character.zone.id).emit('zone:character:move', {
characterId: zoneCharacter.character.id,
positionX: zoneCharacter.character.positionX,
positionY: zoneCharacter.character.positionY,

View File

@ -3,12 +3,12 @@ import fs from 'fs'
import { Request, Response } from 'express'
import { BaseController } from '#application/base/baseController'
import Database from '#application/database'
import { getPublicPath } from '#application/storage'
import { AssetData, UUID } from '#application/types'
import SpriteRepository from '#repositories/spriteRepository'
import TileRepository from '#repositories/tileRepository'
import ZoneRepository from '#repositories/zoneRepository'
import Database from '#application/database'
export class AssetsController extends BaseController {
/**

View File

@ -36,11 +36,11 @@ class ZoneCharacter {
// Leave zone and remove from manager
if (this.character.zone) {
socket.leave(this.character.zone.id.toString())
socket.leave(this.character.zone.id)
ZoneManager.removeCharacter(this.character.id)
// Notify zone players
io.in(this.character.zone.id.toString()).emit('zone:character:leave', this.character.id)
io.in(this.character.zone.id).emit('zone:character:leave', this.character.id)
}
// Notify all players

View File

@ -25,7 +25,7 @@ class ChatService extends BaseService {
const chat = await ChatRepository.getById(newChat.id)
if (!chat) return false
io.to(zoneId.toString()).emit('chat:message', chat)
io.to(zoneId).emit('chat:message', chat)
return true
} catch (error: any) {
this.logger.error(`Failed to save chat message: ${error instanceof Error ? error.message : String(error)}`)

View File

@ -49,20 +49,20 @@ class TeleportService {
// Handle current zone cleanup
if (currentZoneId) {
socket.leave(currentZoneId.toString())
socket.leave(currentZoneId)
ZoneManager.removeCharacter(characterId)
io.in(currentZoneId.toString()).emit('zone:character:leave', characterId)
io.in(currentZoneId).emit('zone:character:leave', characterId)
}
// Update character position and zone
await zoneCharacter.character.setPositionX(targetX).setPositionY(targetY).setRotation(rotation).setZone(targetZone.getZone()).update()
// Join new zone
socket.join(targetZoneId.toString())
socket.join(targetZoneId)
targetZone.addCharacter(zoneCharacter.character)
// Notify clients
io.in(targetZoneId.toString()).emit('zone:character:join', zoneCharacter)
io.in(targetZoneId).emit('zone:character:join', zoneCharacter)
socket.emit('zone:character:teleport', {
zone: targetZone.getZone(),
characters: targetZone.getCharactersInZone()

View File

@ -31,12 +31,12 @@ class ZoneEventTileService extends BaseService {
loadedZone.addCharacter(character)
// Emit events
io.to(oldZoneId.toString()).emit('zone:character:leave', character.id)
io.to(newZoneId.toString()).emit('zone:character:join', character)
io.to(oldZoneId).emit('zone:character:leave', character.id)
io.to(newZoneId).emit('zone:character:join', character)
// Update socket rooms
socket.leave(oldZoneId.toString())
socket.join(newZoneId.toString())
socket.leave(oldZoneId)
socket.join(newZoneId)
// Send teleport information to the client
socket.emit('zone:character:teleport', {