From 0035255bdec0e6197f95e65f6164840d756a0990 Mon Sep 17 00:00:00 2001 From: Greg Ogun Date: Thu, 16 Jul 2026 01:37:40 +0100 Subject: [PATCH] fix: serialize character before storing on player meta Characters.select() stored the raw Character instance on player meta. In RESOURCE mode, Player.setMeta proxies through a cross-resource export call that msgpack-serializes arguments, stripping the getter-backed fields (appearanceId, name, metadata) since they live on the prototype, not as own properties. getActive() then rehydrated a plain object missing those fields. Storing character.serialize() keeps only own properties, which round-trip correctly through Character.from(). Also points the @open-core/framework devDependency at the latest published version instead of a local file: link. Co-Authored-By: Claude Sonnet 5 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/server/services/characters.ts | 8 ++------ 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 3dd4425..68732a6 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "tsyringe": "^4.10.0" }, "devDependencies": { - "@open-core/framework": "file:../opencore-framework", + "@open-core/framework": "^1.1.0", "@citizenfx/client": "2.0.22443-1", "@citizenfx/server": "2.0.22443-1", "@types/node": "^24.5.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88d0188..9425b2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,8 +22,8 @@ importers: specifier: 2.0.22443-1 version: 2.0.22443-1 '@open-core/framework': - specifier: file:../opencore-framework - version: file:../opencore-framework(reflect-metadata@0.2.2)(tsyringe@4.10.0)(zod@4.3.6) + specifier: ^1.1.0 + version: 1.1.0(reflect-metadata@0.2.2)(tsyringe@4.10.0)(zod@4.3.6) '@types/node': specifier: ^24.5.2 version: 24.10.13 @@ -201,8 +201,8 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@open-core/framework@file:../opencore-framework': - resolution: {directory: ../opencore-framework, type: directory} + '@open-core/framework@1.1.0': + resolution: {integrity: sha512-Z6DRVyNedVvnt5vabxZVE7Xyo1uoiahA59DOvNmiQ2KIcWjmN4UaQjEuVD09riYatrQykD/1x55zI/AgRD1Emg==} peerDependencies: reflect-metadata: ^0.2.2 tsyringe: ^4.10.0 @@ -662,7 +662,7 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} - '@open-core/framework@file:../opencore-framework(reflect-metadata@0.2.2)(tsyringe@4.10.0)(zod@4.3.6)': + '@open-core/framework@1.1.0(reflect-metadata@0.2.2)(tsyringe@4.10.0)(zod@4.3.6)': dependencies: reflect-metadata: 0.2.2 tsyringe: 4.10.0 diff --git a/src/server/services/characters.ts b/src/server/services/characters.ts index 3cb28fb..7c83727 100644 --- a/src/server/services/characters.ts +++ b/src/server/services/characters.ts @@ -128,7 +128,7 @@ export class Characters { character.touchLastPlayed(new Date()) await this.store.update(character) - player.setMeta(ACTIVE_CHARACTER_META_KEY, character) + player.setMeta(ACTIVE_CHARACTER_META_KEY, character.serialize()) emitCharactersSelected({ player, @@ -149,11 +149,7 @@ export class Characters { return value } - if (typeof value === 'object' && value !== null && 'id' in value && 'accountId' in value) { - return Character.from(value as SerializedCharacter) - } - - return null + return Character.from(value as SerializedCharacter) } /**