diff --git a/migrations/Migration20250101194316.ts b/migrations/Migration20250101195157.ts similarity index 73% rename from migrations/Migration20250101194316.ts rename to migrations/Migration20250101195157.ts index 0bdbc54..185a012 100644 --- a/migrations/Migration20250101194316.ts +++ b/migrations/Migration20250101195157.ts @@ -1,6 +1,6 @@ import { Migration } from '@mikro-orm/migrations'; -export class Migration20250101194316 extends Migration { +export class Migration20250101195157 extends Migration { override async up(): Promise { this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json null, \`origin_x\` int not null default 0, \`origin_y\` int not null default 0, \`is_animated\` tinyint(1) not null default false, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); @@ -10,10 +10,10 @@ export class Migration20250101194316 extends Migration { this.addSql(`create table \`item\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`description\` varchar(255) null, \`item_type\` enum('WEAPON', 'HELMET', 'CHEST', 'LEGS', 'BOOTS', 'GLOVES', 'RING', 'NECKLACE') not null, \`stackable\` tinyint(1) not null default false, \`rarity\` enum('COMMON', 'UNCOMMON', 'RARE', 'EPIC', 'LEGENDARY') not null default 'COMMON', \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`item\` add index \`item_sprite_id_index\`(\`sprite_id\`);`); - this.addSql(`create table \`character_type\` (\`id\` int unsigned not null auto_increment primary key, \`name\` varchar(255) not null, \`gender\` enum('MALE', 'FEMALE') not null, \`race\` enum('HUMAN', 'ELF', 'DWARF', 'ORC', 'GOBLIN') not null, \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`character_type\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`gender\` enum('MALE', 'FEMALE') not null, \`race\` enum('HUMAN', 'ELF', 'DWARF', 'ORC', 'GOBLIN') not null, \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`character_type\` add index \`character_type_sprite_id_index\`(\`sprite_id\`);`); - this.addSql(`create table \`character_hair\` (\`id\` int unsigned not null auto_increment primary key, \`name\` varchar(255) not null, \`gender\` varchar(255) not null default 'MALE', \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`character_hair\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`gender\` varchar(255) not null default 'MALE', \`is_selectable\` tinyint(1) not null default false, \`sprite_id\` varchar(255) null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`character_hair\` add index \`character_hair_sprite_id_index\`(\`sprite_id\`);`); this.addSql(`create table \`sprite_action\` (\`id\` varchar(255) not null, \`sprite_id\` varchar(255) not null, \`action\` varchar(255) not null, \`sprites\` json null, \`origin_x\` int not null default 0, \`origin_y\` int not null default 0, \`is_animated\` tinyint(1) not null default false, \`is_looping\` tinyint(1) not null default false, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`frame_rate\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); @@ -21,48 +21,48 @@ export class Migration20250101194316 extends Migration { this.addSql(`create table \`tile\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json null, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); - this.addSql(`create table \`user\` (\`id\` int unsigned not null auto_increment primary key, \`username\` varchar(255) not null, \`email\` varchar(255) not null, \`password\` varchar(255) not null, \`online\` tinyint(1) not null default false) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`user\` (\`id\` varchar(255) not null, \`username\` varchar(255) not null, \`email\` varchar(255) not null, \`password\` varchar(255) not null, \`online\` tinyint(1) not null default false, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`user\` add unique \`user_username_unique\`(\`username\`);`); this.addSql(`alter table \`user\` add unique \`user_email_unique\`(\`email\`);`); - this.addSql(`create table \`password_reset_token\` (\`id\` int unsigned not null auto_increment primary key, \`user_id\` int unsigned not null, \`token\` varchar(255) not null, \`created_at\` datetime not null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`password_reset_token\` (\`id\` varchar(255) not null, \`user_id\` varchar(255) not null, \`token\` varchar(255) not null, \`created_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`password_reset_token\` add index \`password_reset_token_user_id_index\`(\`user_id\`);`); this.addSql(`alter table \`password_reset_token\` add unique \`password_reset_token_token_unique\`(\`token\`);`); this.addSql(`create table \`world\` (\`date\` datetime not null, \`is_rain_enabled\` tinyint(1) not null default false, \`rain_percentage\` int not null default 0, \`is_fog_enabled\` tinyint(1) not null default false, \`fog_density\` int not null default 0, primary key (\`date\`)) default character set utf8mb4 engine = InnoDB;`); - this.addSql(`create table \`zone\` (\`id\` int unsigned not null auto_increment primary key, \`name\` varchar(255) not null, \`width\` int not null default 10, \`height\` int not null default 10, \`tiles\` json null, \`pvp\` tinyint(1) not null default false, \`created_at\` datetime not null, \`updated_at\` datetime not null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`zone\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`width\` int not null default 10, \`height\` int not null default 10, \`tiles\` json null, \`pvp\` tinyint(1) not null default false, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); - this.addSql(`create table \`character\` (\`id\` int unsigned not null auto_increment primary key, \`user_id\` int unsigned not null, \`name\` varchar(255) not null, \`online\` tinyint(1) not null default false, \`role\` varchar(255) not null default 'player', \`zone_id\` int unsigned not null, \`position_x\` int not null default 0, \`position_y\` int not null default 0, \`rotation\` int not null default 0, \`character_type_id\` int unsigned null, \`character_hair_id\` int unsigned null, \`alignment\` int not null default 50, \`hitpoints\` int not null default 100, \`mana\` int not null default 100, \`level\` int not null default 1, \`experience\` int not null default 0, \`strength\` int not null default 10, \`dexterity\` int not null default 10, \`intelligence\` int not null default 10, \`wisdom\` int not null default 10) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`character\` (\`id\` varchar(255) not null, \`user_id\` varchar(255) not null, \`name\` varchar(255) not null, \`online\` tinyint(1) not null default false, \`role\` varchar(255) not null default 'player', \`zone_id\` varchar(255) not null, \`position_x\` int not null default 0, \`position_y\` int not null default 0, \`rotation\` int not null default 0, \`character_type_id\` varchar(255) null, \`character_hair_id\` varchar(255) null, \`alignment\` int not null default 50, \`hitpoints\` int not null default 100, \`mana\` int not null default 100, \`level\` int not null default 1, \`experience\` int not null default 0, \`strength\` int not null default 10, \`dexterity\` int not null default 10, \`intelligence\` int not null default 10, \`wisdom\` int not null default 10, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`character\` add index \`character_user_id_index\`(\`user_id\`);`); this.addSql(`alter table \`character\` add unique \`character_name_unique\`(\`name\`);`); this.addSql(`alter table \`character\` add index \`character_zone_id_index\`(\`zone_id\`);`); this.addSql(`alter table \`character\` add index \`character_character_type_id_index\`(\`character_type_id\`);`); this.addSql(`alter table \`character\` add index \`character_character_hair_id_index\`(\`character_hair_id\`);`); - this.addSql(`create table \`chat\` (\`id\` int unsigned not null auto_increment primary key, \`character_id\` int unsigned not null, \`zone_id\` int unsigned not null, \`message\` varchar(255) not null, \`created_at\` datetime not null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`chat\` (\`id\` varchar(255) not null, \`character_id\` varchar(255) not null, \`zone_id\` varchar(255) not null, \`message\` varchar(255) not null, \`created_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`chat\` add index \`chat_character_id_index\`(\`character_id\`);`); this.addSql(`alter table \`chat\` add index \`chat_zone_id_index\`(\`zone_id\`);`); - this.addSql(`create table \`character_item\` (\`id\` int unsigned not null auto_increment primary key, \`character_id\` int unsigned not null, \`item_id\` varchar(255) not null, \`quantity\` int not null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`character_item\` (\`id\` varchar(255) not null, \`character_id\` varchar(255) not null, \`item_id\` varchar(255) not null, \`quantity\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`character_item\` add index \`character_item_character_id_index\`(\`character_id\`);`); this.addSql(`alter table \`character_item\` add index \`character_item_item_id_index\`(\`item_id\`);`); - this.addSql(`create table \`character_equipment\` (\`id\` int unsigned not null auto_increment primary key, \`slot\` enum('HEAD', 'BODY', 'ARMS', 'LEGS', 'NECK', 'RING') not null, \`character_id\` int unsigned not null, \`character_item_id\` int unsigned not null) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`character_equipment\` (\`id\` varchar(255) not null, \`slot\` enum('HEAD', 'BODY', 'ARMS', 'LEGS', 'NECK', 'RING') not null, \`character_id\` varchar(255) not null, \`character_item_id\` varchar(255) not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`character_equipment\` add index \`character_equipment_character_id_index\`(\`character_id\`);`); this.addSql(`alter table \`character_equipment\` add index \`character_equipment_character_item_id_index\`(\`character_item_id\`);`); - this.addSql(`create table \`zone_effect\` (\`id\` varchar(255) not null, \`zone_id\` int unsigned not null, \`effect\` varchar(255) not null, \`strength\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`zone_effect\` (\`id\` varchar(255) not null, \`zone_id\` varchar(255) not null, \`effect\` varchar(255) not null, \`strength\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`zone_effect\` add index \`zone_effect_zone_id_index\`(\`zone_id\`);`); - this.addSql(`create table \`zone_event_tile\` (\`id\` varchar(255) not null, \`zone_id\` int unsigned not null, \`type\` enum('BLOCK', 'TELEPORT', 'NPC', 'ITEM') not null, \`position_x\` int not null, \`position_y\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`zone_event_tile\` (\`id\` varchar(255) not null, \`zone_id\` varchar(255) not null, \`type\` enum('BLOCK', 'TELEPORT', 'NPC', 'ITEM') not null, \`position_x\` int not null, \`position_y\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`zone_event_tile\` add index \`zone_event_tile_zone_id_index\`(\`zone_id\`);`); - this.addSql(`create table \`zone_event_tile_teleport\` (\`id\` varchar(255) not null, \`zone_event_tile_id\` varchar(255) not null, \`to_zone_id\` int unsigned not null, \`to_rotation\` int not null, \`to_position_x\` int not null, \`to_position_y\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`zone_event_tile_teleport\` (\`id\` varchar(255) not null, \`zone_event_tile_id\` varchar(255) not null, \`to_zone_id\` varchar(255) not null, \`to_rotation\` int not null, \`to_position_x\` int not null, \`to_position_y\` int not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`zone_event_tile_teleport\` add unique \`zone_event_tile_teleport_zone_event_tile_id_unique\`(\`zone_event_tile_id\`);`); this.addSql(`alter table \`zone_event_tile_teleport\` add index \`zone_event_tile_teleport_to_zone_id_index\`(\`to_zone_id\`);`); - this.addSql(`create table \`zone_object\` (\`id\` varchar(255) not null, \`zone_id\` int unsigned not null, \`map_object_id\` varchar(255) not null, \`depth\` int not null default 0, \`is_rotated\` tinyint(1) not null default false, \`position_x\` int not null default 0, \`position_y\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); + this.addSql(`create table \`zone_object\` (\`id\` varchar(255) not null, \`zone_id\` varchar(255) not null, \`map_object_id\` varchar(255) not null, \`depth\` int not null default 0, \`is_rotated\` tinyint(1) not null default false, \`position_x\` int not null default 0, \`position_y\` int not null default 0, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); this.addSql(`alter table \`zone_object\` add index \`zone_object_zone_id_index\`(\`zone_id\`);`); this.addSql(`alter table \`zone_object\` add index \`zone_object_map_object_id_index\`(\`map_object_id\`);`); diff --git a/src/commands/init.ts b/src/commands/init.ts index d0b5e6e..4a08418 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -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 { @@ -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 { @@ -240,15 +240,15 @@ export default class InitCommand extends BaseCommand { private async createUser(): Promise { 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() diff --git a/src/entities/character.ts b/src/entities/character.ts index cc09ce5..c5f46f4 100644 --- a/src/entities/character.ts +++ b/src/entities/character.ts @@ -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 } diff --git a/src/entities/characterEquipment.ts b/src/entities/characterEquipment.ts index 8a8c50b..5bb18ad 100644 --- a/src/entities/characterEquipment.ts +++ b/src/entities/characterEquipment.ts @@ -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 } diff --git a/src/entities/characterHair.ts b/src/entities/characterHair.ts index 2ae0000..a6a1e9b 100644 --- a/src/entities/characterHair.ts +++ b/src/entities/characterHair.ts @@ -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 } diff --git a/src/entities/characterItem.ts b/src/entities/characterItem.ts index 3cc059c..437a943 100644 --- a/src/entities/characterItem.ts +++ b/src/entities/characterItem.ts @@ -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 } diff --git a/src/entities/characterType.ts b/src/entities/characterType.ts index f1bfec3..160d02a 100644 --- a/src/entities/characterType.ts +++ b/src/entities/characterType.ts @@ -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 } diff --git a/src/entities/chat.ts b/src/entities/chat.ts index cf795fc..680d541 100644 --- a/src/entities/chat.ts +++ b/src/entities/chat.ts @@ -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 } diff --git a/src/entities/passwordResetToken.ts b/src/entities/passwordResetToken.ts index a92784f..774faca 100644 --- a/src/entities/passwordResetToken.ts +++ b/src/entities/passwordResetToken.ts @@ -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 } diff --git a/src/entities/user.ts b/src/entities/user.ts index dac39fe..0da3691 100644 --- a/src/entities/user.ts +++ b/src/entities/user.ts @@ -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(this) - setId(id: number) { + setId(id: UUID) { this.id = id return this } diff --git a/src/entities/zone.ts b/src/entities/zone.ts index 5f7d372..91c9f26 100644 --- a/src/entities/zone.ts +++ b/src/entities/zone.ts @@ -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(this) - setId(id: number) { + setId(id: UUID) { this.id = id return this } diff --git a/src/events/zone/characterMove.ts b/src/events/zone/characterMove.ts index 3c9966d..406514d 100644 --- a/src/events/zone/characterMove.ts +++ b/src/events/zone/characterMove.ts @@ -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, diff --git a/src/http/controllers/assets.ts b/src/http/controllers/assets.ts index 9b9197b..e4bdccc 100644 --- a/src/http/controllers/assets.ts +++ b/src/http/controllers/assets.ts @@ -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 { /** diff --git a/src/models/zoneCharacter.ts b/src/models/zoneCharacter.ts index 417822a..008d835 100644 --- a/src/models/zoneCharacter.ts +++ b/src/models/zoneCharacter.ts @@ -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 diff --git a/src/services/chatService.ts b/src/services/chatService.ts index 0a3e94f..36b33da 100644 --- a/src/services/chatService.ts +++ b/src/services/chatService.ts @@ -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)}`) diff --git a/src/services/teleportService.ts b/src/services/teleportService.ts index c4e3f1d..63bbfa2 100644 --- a/src/services/teleportService.ts +++ b/src/services/teleportService.ts @@ -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() diff --git a/src/services/zoneEventTileService.ts b/src/services/zoneEventTileService.ts index 7edf399..66fe3a2 100644 --- a/src/services/zoneEventTileService.ts +++ b/src/services/zoneEventTileService.ts @@ -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', {