@rpgjs/client 5.0.0-alpha.24 → 5.0.0-alpha.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index30.js → Game/AnimationManager.js} +1 -1
- package/dist/Game/AnimationManager.js.map +1 -0
- package/dist/{index24.js → Game/Event.js} +2 -2
- package/dist/Game/Event.js.map +1 -0
- package/dist/{index29.js → Game/Map.js} +6 -6
- package/dist/Game/Map.js.map +1 -0
- package/dist/{index22.js → Game/Object.js} +4 -4
- package/dist/Game/Object.js.map +1 -0
- package/dist/{index23.js → Game/Player.js} +2 -2
- package/dist/Game/Player.js.map +1 -0
- package/dist/{index9.js → Gui/Gui.js} +10 -10
- package/dist/{index9.js.map → Gui/Gui.js.map} +1 -1
- package/dist/{index19.js → Resource.js} +1 -1
- package/dist/Resource.js.map +1 -0
- package/dist/RpgClientEngine.d.ts +31 -0
- package/dist/{index2.js → RpgClientEngine.js} +150 -18
- package/dist/RpgClientEngine.js.map +1 -0
- package/dist/{index18.js → Sound.js} +1 -1
- package/dist/Sound.js.map +1 -0
- package/dist/{index34.js → components/animations/animation.ce.js} +3 -3
- package/dist/components/animations/animation.ce.js.map +1 -0
- package/dist/{index33.js → components/animations/hit.ce.js} +1 -1
- package/dist/components/animations/hit.ce.js.map +1 -0
- package/dist/{index12.js → components/animations/index.js} +3 -3
- package/dist/components/animations/index.js.map +1 -0
- package/dist/{index17.js → components/character.ce.js} +4 -4
- package/dist/components/character.ce.js.map +1 -0
- package/dist/{index51.js → components/dynamics/parse-value.js} +1 -1
- package/dist/components/dynamics/parse-value.js.map +1 -0
- package/dist/{index39.js → components/dynamics/text.ce.js} +2 -2
- package/dist/components/dynamics/text.ce.js.map +1 -0
- package/dist/{index11.js → components/gui/box.ce.js} +8 -8
- package/dist/components/gui/box.ce.js.map +1 -0
- package/dist/{index10.js → components/gui/dialogbox/index.ce.js} +4 -4
- package/dist/components/gui/dialogbox/index.ce.js.map +1 -0
- package/dist/{index52.js → components/gui/dialogbox/itemMenu.ce.js} +1 -1
- package/dist/components/gui/dialogbox/itemMenu.ce.js.map +1 -0
- package/dist/{index48.js → components/gui/dialogbox/selection.ce.js} +4 -4
- package/dist/components/gui/dialogbox/selection.ce.js.map +1 -0
- package/dist/{index25.js → components/gui/mobile/index.js} +4 -4
- package/dist/components/gui/mobile/index.js.map +1 -0
- package/dist/{index40.js → components/gui/mobile/mobile.ce.js} +2 -2
- package/dist/components/gui/mobile/mobile.ce.js.map +1 -0
- package/dist/{index13.js → components/prebuilt/hp-bar.ce.js} +1 -1
- package/dist/components/prebuilt/hp-bar.ce.js.map +1 -0
- package/dist/{index14.js → components/prebuilt/light-halo.ce.js} +1 -1
- package/dist/components/prebuilt/light-halo.ce.js.map +1 -0
- package/dist/{index26.js → components/scenes/canvas.ce.js} +5 -5
- package/dist/components/scenes/canvas.ce.js.map +1 -0
- package/dist/{index43.js → components/scenes/draw-map.ce.js} +8 -8
- package/dist/components/scenes/draw-map.ce.js.map +1 -0
- package/dist/{index16.js → components/scenes/event-layer.ce.js} +4 -4
- package/dist/components/scenes/event-layer.ce.js.map +1 -0
- package/dist/{index6.js → core/inject.js} +2 -2
- package/dist/core/inject.js.map +1 -0
- package/dist/{index5.js → core/setup.js} +4 -4
- package/dist/core/setup.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +25 -24
- package/dist/index.js.map +1 -1
- package/dist/{index8.js → module.js} +4 -4
- package/dist/{index8.js.map → module.js.map} +1 -1
- package/dist/{index20.js → node_modules/.pnpm/@signe_di@2.7.2/node_modules/@signe/di/dist/index.js} +1 -1
- package/dist/node_modules/.pnpm/@signe_di@2.7.2/node_modules/@signe/di/dist/index.js.map +1 -0
- package/dist/{index42.js → node_modules/.pnpm/@signe_reactive@2.7.2/node_modules/@signe/reactive/dist/index.js} +1 -1
- package/dist/node_modules/.pnpm/@signe_reactive@2.7.2/node_modules/@signe/reactive/dist/index.js.map +1 -0
- package/dist/{index31.js → node_modules/.pnpm/@signe_room@2.7.2/node_modules/@signe/room/dist/index.js} +66 -39
- package/dist/node_modules/.pnpm/@signe_room@2.7.2/node_modules/@signe/room/dist/index.js.map +1 -0
- package/dist/{index41.js → node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/chunk-7QVYU63E.js} +1 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/chunk-7QVYU63E.js.map +1 -0
- package/dist/{index32.js → node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/client/index.js} +5 -5
- package/dist/node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/client/index.js.map +1 -0
- package/dist/{index28.js → node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/index.js} +3 -3
- package/dist/node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/index.js.map +1 -0
- package/dist/{index44.js → node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js} +1 -1
- package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js.map +1 -0
- package/dist/{index49.js → node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js} +2 -15
- package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +1 -0
- package/dist/{index50.js → node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js} +2 -5
- package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -0
- package/dist/{index47.js → node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js} +813 -100
- package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -0
- package/dist/{index35.js → presets/animation.js} +1 -1
- package/dist/presets/animation.js.map +1 -0
- package/dist/{index38.js → presets/faceset.js} +1 -1
- package/dist/presets/faceset.js.map +1 -0
- package/dist/presets/index.js +14 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/{index36.js → presets/lpc.js} +1 -1
- package/dist/presets/lpc.js.map +1 -0
- package/dist/{index37.js → presets/rmspritesheet.js} +1 -1
- package/dist/presets/rmspritesheet.js.map +1 -0
- package/dist/{index27.js → services/AbstractSocket.js} +1 -1
- package/dist/services/AbstractSocket.js.map +1 -0
- package/dist/{index21.js → services/keyboardControls.js} +1 -1
- package/dist/services/keyboardControls.js.map +1 -0
- package/dist/{index7.js → services/loadMap.js} +2 -2
- package/dist/services/loadMap.js.map +1 -0
- package/dist/{index4.js → services/mmorpg.js} +6 -6
- package/dist/services/mmorpg.js.map +1 -0
- package/dist/services/standalone.d.ts +8 -2
- package/dist/{index3.js → services/standalone.js} +24 -16
- package/dist/services/standalone.js.map +1 -0
- package/package.json +8 -8
- package/src/RpgClientEngine.ts +193 -7
- package/src/components/scenes/draw-map.ce +3 -3
- package/src/index.ts +2 -1
- package/src/services/standalone.ts +26 -11
- package/vite.config.ts +4 -2
- package/dist/index10.js.map +0 -1
- package/dist/index11.js.map +0 -1
- package/dist/index12.js.map +0 -1
- package/dist/index13.js.map +0 -1
- package/dist/index14.js.map +0 -1
- package/dist/index15.js +0 -14
- package/dist/index15.js.map +0 -1
- package/dist/index16.js.map +0 -1
- package/dist/index17.js.map +0 -1
- package/dist/index18.js.map +0 -1
- package/dist/index19.js.map +0 -1
- package/dist/index2.js.map +0 -1
- package/dist/index20.js.map +0 -1
- package/dist/index21.js.map +0 -1
- package/dist/index22.js.map +0 -1
- package/dist/index23.js.map +0 -1
- package/dist/index24.js.map +0 -1
- package/dist/index25.js.map +0 -1
- package/dist/index26.js.map +0 -1
- package/dist/index27.js.map +0 -1
- package/dist/index28.js.map +0 -1
- package/dist/index29.js.map +0 -1
- package/dist/index3.js.map +0 -1
- package/dist/index30.js.map +0 -1
- package/dist/index31.js.map +0 -1
- package/dist/index32.js.map +0 -1
- package/dist/index33.js.map +0 -1
- package/dist/index34.js.map +0 -1
- package/dist/index35.js.map +0 -1
- package/dist/index36.js.map +0 -1
- package/dist/index37.js.map +0 -1
- package/dist/index38.js.map +0 -1
- package/dist/index39.js.map +0 -1
- package/dist/index4.js.map +0 -1
- package/dist/index40.js.map +0 -1
- package/dist/index41.js.map +0 -1
- package/dist/index42.js.map +0 -1
- package/dist/index43.js.map +0 -1
- package/dist/index44.js.map +0 -1
- package/dist/index45.js +0 -7
- package/dist/index45.js.map +0 -1
- package/dist/index46.js +0 -329
- package/dist/index46.js.map +0 -1
- package/dist/index47.js.map +0 -1
- package/dist/index48.js.map +0 -1
- package/dist/index49.js.map +0 -1
- package/dist/index5.js.map +0 -1
- package/dist/index50.js.map +0 -1
- package/dist/index51.js.map +0 -1
- package/dist/index52.js.map +0 -1
- package/dist/index53.js +0 -6
- package/dist/index53.js.map +0 -1
- package/dist/index54.js +0 -12
- package/dist/index54.js.map +0 -1
- package/dist/index55.js +0 -113
- package/dist/index55.js.map +0 -1
- package/dist/index56.js +0 -136
- package/dist/index56.js.map +0 -1
- package/dist/index57.js +0 -137
- package/dist/index57.js.map +0 -1
- package/dist/index58.js +0 -112
- package/dist/index58.js.map +0 -1
- package/dist/index59.js +0 -9
- package/dist/index59.js.map +0 -1
- package/dist/index6.js.map +0 -1
- package/dist/index7.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationManager.js","sources":["../../src/Game/AnimationManager.ts"],"sourcesContent":["import { generateUID, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { signal } from \"canvasengine\";\n\nexport class AnimationManager {\n current = signal<any[]>([]);\n\n displayEffect(params: any, player: RpgCommonPlayer | { x: number, y: number }) {\n const id = generateUID();\n this.current().push({\n ...params,\n id,\n x: player.x,\n y: player.y,\n object: player,\n onFinish: () => {\n const index = this.current().findIndex((value) => value.id === id);\n this.current().splice(index, 1);\n },\n });\n }\n}\n"],"names":[],"mappings":";;;AAGO,MAAM,gBAAA,CAAiB;AAAA,EAAvB,WAAA,GAAA;AACL,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA,CAAc,EAAE,CAAA;AAAA,EAAA;AAAA,EAE1B,aAAA,CAAc,QAAa,MAAA,EAAoD;AAC7E,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK;AAAA,MAClB,GAAG,MAAA;AAAA,MACH,EAAA;AAAA,MACA,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,GAAG,MAAA,CAAO,CAAA;AAAA,MACV,MAAA,EAAQ,MAAA;AAAA,MACR,UAAU,MAAM;AACd,QAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,EAAQ,CAAE,UAAU,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAA;AACjE,QAAA,IAAA,CAAK,OAAA,EAAQ,CAAE,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MAChC;AAAA,KACD,CAAA;AAAA,EACH;AACF;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RpgClientObject } from './
|
|
1
|
+
import { RpgClientObject } from './Object.js';
|
|
2
2
|
|
|
3
3
|
class RpgClientEvent extends RpgClientObject {
|
|
4
4
|
constructor() {
|
|
@@ -8,4 +8,4 @@ class RpgClientEvent extends RpgClientObject {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export { RpgClientEvent };
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=Event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Event.js","sources":["../../src/Game/Event.ts"],"sourcesContent":["import { RpgClientObject } from \"./Object\"; \n\nexport class RpgClientEvent extends RpgClientObject {\n type = 'event'\n} "],"names":[],"mappings":";;AAEO,MAAM,uBAAuB,eAAA,CAAgB;AAAA,EAA7C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACH,IAAA,IAAA,CAAA,IAAA,GAAO,OAAA;AAAA,EAAA;AACX;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { RpgCommonMap } from '@rpgjs/common';
|
|
2
|
-
import { sync, users } from '
|
|
3
|
-
import { RpgClientPlayer } from './
|
|
2
|
+
import { sync, users } from '../node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/index.js';
|
|
3
|
+
import { RpgClientPlayer } from './Player.js';
|
|
4
4
|
import { signal, computed } from 'canvasengine';
|
|
5
|
-
import { RpgClientEvent } from './
|
|
6
|
-
import { RpgClientEngine } from '
|
|
7
|
-
import { inject } from '
|
|
5
|
+
import { RpgClientEvent } from './Event.js';
|
|
6
|
+
import { RpgClientEngine } from '../RpgClientEngine.js';
|
|
7
|
+
import { inject } from '../core/inject.js';
|
|
8
8
|
|
|
9
9
|
var __defProp = Object.defineProperty;
|
|
10
10
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -43,4 +43,4 @@ __decorateClass([
|
|
|
43
43
|
], RpgClientMap.prototype, "events");
|
|
44
44
|
|
|
45
45
|
export { RpgClientMap };
|
|
46
|
-
//# sourceMappingURL=
|
|
46
|
+
//# sourceMappingURL=Map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Map.js","sources":["../../src/Game/Map.ts"],"sourcesContent":["import { RpgCommonMap } from \"@rpgjs/common\";\nimport { sync, users } from \"@signe/sync\";\nimport { RpgClientPlayer } from \"./Player\";\nimport { Signal, signal, computed } from \"canvasengine\";\nimport { RpgClientEvent } from \"./Event\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { inject } from \"../core/inject\";\n\nexport class RpgClientMap extends RpgCommonMap<any> {\n engine: RpgClientEngine = inject(RpgClientEngine)\n @users(RpgClientPlayer) players = signal<Record<string, RpgClientPlayer>>({});\n @sync(RpgClientEvent) events = signal<Record<string, RpgClientEvent>>({});\n currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()!])\n\n getCurrentPlayer() {\n return this.currentPlayer()\n }\n\n reset() {\n this.players.set({})\n this.events.set({})\n this.clearPhysic()\n }\n\n stepPredictionTick(): void {\n this.forceSingleTick();\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAQO,MAAM,qBAAqB,YAAA,CAAkB;AAAA,EAA7C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,IAAA,CAAA,MAAA,GAA0B,OAAO,eAAe,CAAA;AACxB,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA,CAAwC,EAAE,CAAA;AACtD,IAAA,IAAA,CAAA,MAAA,GAAS,MAAA,CAAuC,EAAE,CAAA;AACxE,IAAA,IAAA,CAAA,aAAA,GAAgB,QAAA,CAAS,MAAM,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,cAAA,EAAiB,CAAC,CAAA;AAAA,EAAA;AAAA,EAE5E,gBAAA,GAAmB;AACjB,IAAA,OAAO,KAAK,aAAA,EAAc;AAAA,EAC5B;AAAA,EAEA,KAAA,GAAQ;AACN,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AACF;AAjB0B,eAAA,CAAA;AAAA,EAAvB,MAAM,eAAe;AAAA,CAAA,EAFX,YAAA,CAEa,SAAA,EAAA,SAAA,CAAA;AACF,eAAA,CAAA;AAAA,EAArB,KAAK,cAAc;AAAA,CAAA,EAHT,YAAA,CAGW,SAAA,EAAA,QAAA,CAAA;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { RpgCommonPlayer, ModulesToken } from '@rpgjs/common';
|
|
2
2
|
import { trigger, signal } from 'canvasengine';
|
|
3
3
|
import { map, filter, switchMap, from } from 'rxjs';
|
|
4
|
-
import { inject } from '
|
|
5
|
-
import { RpgClientEngine } from '
|
|
6
|
-
import component from '
|
|
4
|
+
import { inject } from '../core/inject.js';
|
|
5
|
+
import { RpgClientEngine } from '../RpgClientEngine.js';
|
|
6
|
+
import component from '../components/dynamics/text.ce.js';
|
|
7
7
|
|
|
8
8
|
const DYNAMIC_COMPONENTS = {
|
|
9
9
|
text: component
|
|
@@ -213,4 +213,4 @@ class RpgClientObject extends RpgCommonPlayer {
|
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
export { RpgClientObject };
|
|
216
|
-
//# sourceMappingURL=
|
|
216
|
+
//# sourceMappingURL=Object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Object.js","sources":["../../src/Game/Object.ts"],"sourcesContent":["import { Hooks, ModulesToken, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { trigger, signal } from \"canvasengine\";\nimport { filter, from, map, Subscription, switchMap } from \"rxjs\";\nimport { inject } from \"../core/inject\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport TextComponent from \"../components/dynamics/text.ce\";\n\nconst DYNAMIC_COMPONENTS = {\n text: TextComponent,\n}\n\nexport abstract class RpgClientObject extends RpgCommonPlayer {\n abstract type: string;\n emitParticleTrigger = trigger();\n particleName = signal(\"\");\n animationCurrentIndex = signal(0);\n animationIsPlaying = signal(false);\n _param = signal({});\n frames: { x: number; y: number; ts: number }[] = [];\n graphicsSignals = signal<any[]>([]);\n _component = {} // temporary component memory\n flashTrigger = trigger();\n\n constructor() {\n super();\n this.hooks.callHooks(\"client-sprite-onInit\", this).subscribe();\n\n this._frames.observable.subscribe(({ items }) => {\n if (!this.id) return;\n //if (this.id == this.engine.playerIdSignal()!) return;\n this.frames = [...this.frames, ...items];\n });\n\n this.graphics.observable\n .pipe(\n map(({ items }) => items),\n filter(graphics => graphics.length > 0),\n switchMap(graphics => from(Promise.all(graphics.map(graphic => this.engine.getSpriteSheet(graphic)))))\n )\n .subscribe((sheets) => { \n this.graphicsSignals.set(sheets);\n });\n\n this.componentsTop.observable\n .pipe(\n filter(value => value !== null && value !== undefined),\n map((value) => typeof value === 'string' ? JSON.parse(value) : value),\n )\n .subscribe(({components}) => {\n for (const component of components) {\n for (const [key, value] of Object.entries(component)) {\n this._component = value as any; // temporary component memory\n console.log(value)\n const type = (value as any).type as keyof typeof DYNAMIC_COMPONENTS;\n if (DYNAMIC_COMPONENTS[type]) {\n this.engine.addSpriteComponentInFront(DYNAMIC_COMPONENTS[type]);\n }\n }\n }\n });\n\n this.engine.tick\n .pipe\n //throttleTime(10)\n ()\n .subscribe(() => {\n const frame = this.frames.shift();\n if (frame) {\n if (!frame.x || !frame.y) return;\n this.engine.scene.setBodyPosition(\n this.id,\n frame.x,\n frame.y,\n \"top-left\"\n );\n }\n });\n }\n\n get hooks() {\n return inject<Hooks>(ModulesToken);\n }\n\n get engine() {\n return inject(RpgClientEngine);\n }\n\n private animationSubscription?: Subscription;\n\n /**\n * Trigger a flash animation on this sprite\n * \n * This method triggers a flash effect using CanvasEngine's flash directive.\n * The flash can be configured with various options including type (alpha, tint, or both),\n * duration, cycles, and color.\n * \n * ## Design\n * \n * The flash uses a trigger system that is connected to the flash directive in the\n * character component. This allows for flexible configuration and can be triggered\n * from both server events and client-side code.\n * \n * @param options - Flash configuration options\n * @param options.type - Type of flash effect: 'alpha' (opacity), 'tint' (color), or 'both' (default: 'alpha')\n * @param options.duration - Duration of the flash animation in milliseconds (default: 300)\n * @param options.cycles - Number of flash cycles (flash on/off) (default: 1)\n * @param options.alpha - Alpha value when flashing, from 0 to 1 (default: 0.3)\n * @param options.tint - Tint color when flashing as hex value or color name (default: 0xffffff - white)\n * \n * @example\n * ```ts\n * // Simple flash with default settings (alpha flash)\n * player.flash();\n * \n * // Flash with red tint\n * player.flash({ type: 'tint', tint: 0xff0000 });\n * \n * // Flash with both alpha and tint\n * player.flash({ \n * type: 'both', \n * alpha: 0.5, \n * tint: 0xff0000,\n * duration: 200,\n * cycles: 2\n * });\n * \n * // Quick damage flash\n * player.flash({ \n * type: 'tint', \n * tint: 0xff0000, \n * duration: 150,\n * cycles: 1\n * });\n * ```\n */\n flash(options?: {\n type?: 'alpha' | 'tint' | 'both';\n duration?: number;\n cycles?: number;\n alpha?: number;\n tint?: number | string;\n }): void {\n const flashOptions = {\n type: options?.type || 'alpha',\n duration: options?.duration ?? 300,\n cycles: options?.cycles ?? 1,\n alpha: options?.alpha ?? 0.3,\n tint: options?.tint ?? 0xffffff,\n };\n \n // Convert color name to hex if needed\n let tintValue = flashOptions.tint;\n if (typeof tintValue === 'string') {\n // Common color name to hex mapping\n const colorMap: Record<string, number> = {\n 'white': 0xffffff,\n 'red': 0xff0000,\n 'green': 0x00ff00,\n 'blue': 0x0000ff,\n 'yellow': 0xffff00,\n 'cyan': 0x00ffff,\n 'magenta': 0xff00ff,\n 'black': 0x000000,\n };\n tintValue = colorMap[tintValue.toLowerCase()] ?? 0xffffff;\n }\n \n this.flashTrigger.start({\n ...flashOptions,\n tint: tintValue,\n });\n }\n\n /**\n * Reset animation state when animation changes externally\n *\n * This method should be called when the animation changes due to movement\n * or other external factors to ensure the animation system doesn't get stuck\n *\n * @example\n * ```ts\n * // Reset when player starts moving\n * player.resetAnimationState();\n * ```\n */\n resetAnimationState() {\n this.animationIsPlaying.set(false);\n this.animationCurrentIndex.set(0);\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n this.animationSubscription = undefined;\n }\n }\n\n /**\n * Set a custom animation for a specific number of times\n *\n * Plays a custom animation for the specified number of repetitions.\n * The animation system prevents overlapping animations and automatically\n * returns to the previous animation when complete.\n *\n * @param animationName - Name of the animation to play\n * @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)\n *\n * @example\n * ```ts\n * // Play attack animation 3 times\n * player.setAnimation('attack', 3);\n *\n * // Play continuous spell animation\n * player.setAnimation('spell');\n * ```\n */\n setAnimation(animationName: string, nbTimes: number = Infinity) {\n if (this.animationIsPlaying()) return;\n this.animationIsPlaying.set(true);\n const previousAnimationName = this.animationName();\n this.animationCurrentIndex.set(0);\n\n // Clean up any existing subscription\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n }\n\n this.animationSubscription =\n this.animationCurrentIndex.observable.subscribe((index) => {\n if (index >= nbTimes) {\n this.animationCurrentIndex.set(0);\n this.animationName.set(previousAnimationName);\n this.animationIsPlaying.set(false);\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n this.animationSubscription = undefined;\n }\n }\n });\n this.animationName.set(animationName);\n }\n\n showComponentAnimation(id: string, params: any) {\n const engine = inject(RpgClientEngine);\n engine.getComponentAnimation(id).displayEffect(params, this);\n }\n \n isEvent(): boolean {\n return this.type === 'event';\n }\n\n isPlayer(): boolean {\n return this.type === 'player';\n }\n}\n"],"names":["TextComponent"],"mappings":";;;;;;;AAOA,MAAM,kBAAA,GAAqB;AAAA,EACzB,IAAA,EAAMA;AACR,CAAA;AAEO,MAAe,wBAAwB,eAAA,CAAgB;AAAA,EAY5D,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AAXR,IAAA,IAAA,CAAA,mBAAA,GAAsB,OAAA,EAAQ;AAC9B,IAAA,IAAA,CAAA,YAAA,GAAe,OAAO,EAAE,CAAA;AACxB,IAAA,IAAA,CAAA,qBAAA,GAAwB,OAAO,CAAC,CAAA;AAChC,IAAA,IAAA,CAAA,kBAAA,GAAqB,OAAO,KAAK,CAAA;AACjC,IAAA,IAAA,CAAA,MAAA,GAAS,MAAA,CAAO,EAAE,CAAA;AAClB,IAAA,IAAA,CAAA,MAAA,GAAiD,EAAC;AAClD,IAAA,IAAA,CAAA,eAAA,GAAkB,MAAA,CAAc,EAAE,CAAA;AAClC,IAAA,IAAA,CAAA,UAAA,GAAa,EAAC;AACd;AAAA,IAAA,IAAA,CAAA,YAAA,GAAe,OAAA,EAAQ;AAIrB,IAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,sBAAA,EAAwB,IAAI,EAAE,SAAA,EAAU;AAE7D,IAAA,IAAA,CAAK,QAAQ,UAAA,CAAW,SAAA,CAAU,CAAC,EAAE,OAAM,KAAM;AAC/C,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AAEd,MAAA,IAAA,CAAK,SAAS,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,KAAK,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,SAAS,UAAA,CACb,IAAA;AAAA,MACC,GAAA,CAAI,CAAC,EAAE,KAAA,OAAY,KAAK,CAAA;AAAA,MACxB,MAAA,CAAO,CAAA,QAAA,KAAY,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAAA,MACtC,SAAA,CAAU,CAAA,QAAA,KAAY,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,KAAW,IAAA,CAAK,OAAO,cAAA,CAAe,OAAO,CAAC,CAAC,CAAC,CAAC;AAAA,KACvG,CACC,SAAA,CAAU,CAAC,MAAA,KAAW;AACrB,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,MAAM,CAAA;AAAA,IACjC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,cAAc,UAAA,CAClB,IAAA;AAAA,MACC,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,KAAU,IAAA,IAAQ,UAAU,MAAS,CAAA;AAAA,MACrD,GAAA,CAAI,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,GAAI,KAAK;AAAA,KACtE,CACC,SAAA,CAAU,CAAC,EAAC,YAAU,KAAM;AAC3B,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,UAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,UAAA,MAAM,OAAQ,KAAA,CAAc,IAAA;AAC5B,UAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG;AAC5B,YAAA,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA0B,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CACT,IAAA,EAEA,CACA,UAAU,MAAM;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAM;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,CAAC,KAAA,CAAM,CAAA,IAAK,CAAC,MAAM,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,eAAA;AAAA,UAChB,IAAA,CAAK,EAAA;AAAA,UACL,KAAA,CAAM,CAAA;AAAA,UACN,KAAA,CAAM,CAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,IAAI,KAAA,GAAQ;AACV,IAAA,OAAO,OAAc,YAAY,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,OAAO,eAAe,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkDA,MAAM,OAAA,EAMG;AACP,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,IAAA,EAAM,SAAS,IAAA,IAAQ,OAAA;AAAA,MACvB,QAAA,EAAU,SAAS,QAAA,IAAY,GAAA;AAAA,MAC/B,MAAA,EAAQ,SAAS,MAAA,IAAU,CAAA;AAAA,MAC3B,KAAA,EAAO,SAAS,KAAA,IAAS,GAAA;AAAA,MACzB,IAAA,EAAM,SAAS,IAAA,IAAQ;AAAA,KACzB;AAGA,IAAA,IAAI,YAAY,YAAA,CAAa,IAAA;AAC7B,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AAEjC,MAAA,MAAM,QAAA,GAAmC;AAAA,QACvC,OAAA,EAAS,QAAA;AAAA,QACT,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAW,QAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AACA,MAAA,SAAA,GAAY,QAAA,CAAS,SAAA,CAAU,WAAA,EAAa,CAAA,IAAK,QAAA;AAAA,IACnD;AAEA,IAAA,IAAA,CAAK,aAAa,KAAA,CAAM;AAAA,MACtB,GAAG,YAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,mBAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAChC,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,IAAA,CAAK,sBAAsB,WAAA,EAAY;AACvC,MAAA,IAAA,CAAK,qBAAA,GAAwB,MAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,YAAA,CAAa,aAAA,EAAuB,OAAA,GAAkB,QAAA,EAAU;AAC9D,IAAA,IAAI,IAAA,CAAK,oBAAmB,EAAG;AAC/B,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,IAAI,CAAA;AAChC,IAAA,MAAM,qBAAA,GAAwB,KAAK,aAAA,EAAc;AACjD,IAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAGhC,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,IAAA,CAAK,sBAAsB,WAAA,EAAY;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,wBACH,IAAA,CAAK,qBAAA,CAAsB,UAAA,CAAW,SAAA,CAAU,CAAC,KAAA,KAAU;AACzD,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAChC,QAAA,IAAA,CAAK,aAAA,CAAc,IAAI,qBAAqB,CAAA;AAC5C,QAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACjC,QAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,UAAA,IAAA,CAAK,sBAAsB,WAAA,EAAY;AACvC,UAAA,IAAA,CAAK,qBAAA,GAAwB,MAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACH,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,aAAa,CAAA;AAAA,EACtC;AAAA,EAEA,sBAAA,CAAuB,IAAY,MAAA,EAAa;AAC9C,IAAA,MAAM,MAAA,GAAS,OAAO,eAAe,CAAA;AACrC,IAAA,MAAA,CAAO,qBAAA,CAAsB,EAAE,CAAA,CAAE,aAAA,CAAc,QAAQ,IAAI,CAAA;AAAA,EAC7D;AAAA,EAEA,OAAA,GAAmB;AACjB,IAAA,OAAO,KAAK,IAAA,KAAS,OAAA;AAAA,EACvB;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,IAAA,KAAS,QAAA;AAAA,EACvB;AACF;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RpgClientObject } from './
|
|
1
|
+
import { RpgClientObject } from './Object.js';
|
|
2
2
|
|
|
3
3
|
class RpgClientPlayer extends RpgClientObject {
|
|
4
4
|
constructor() {
|
|
@@ -8,4 +8,4 @@ class RpgClientPlayer extends RpgClientObject {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export { RpgClientPlayer };
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=Player.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Player.js","sources":["../../src/Game/Player.ts"],"sourcesContent":["import { RpgClientObject } from \"./Object\";\n\nexport class RpgClientPlayer extends RpgClientObject {\n type = 'player'\n} "],"names":[],"mappings":";;AAEO,MAAM,wBAAwB,eAAA,CAAgB;AAAA,EAA9C,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACH,IAAA,IAAA,CAAA,IAAA,GAAO,QAAA;AAAA,EAAA;AACX;;;;"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { inject } from '
|
|
1
|
+
import { inject } from '../node_modules/.pnpm/@signe_di@2.7.2/node_modules/@signe/di/dist/index.js';
|
|
2
2
|
import { signal } from 'canvasengine';
|
|
3
|
-
import { WebSocketToken } from '
|
|
4
|
-
import component from '
|
|
3
|
+
import { WebSocketToken } from '../services/AbstractSocket.js';
|
|
4
|
+
import component from '../components/gui/dialogbox/index.ce.js';
|
|
5
5
|
import { combineLatest } from 'rxjs';
|
|
6
6
|
import '@rpgjs/common';
|
|
7
|
-
import '
|
|
8
|
-
import '
|
|
9
|
-
import '
|
|
10
|
-
import '
|
|
7
|
+
import '../Sound.js';
|
|
8
|
+
import '../Resource.js';
|
|
9
|
+
import '../node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/index.js';
|
|
10
|
+
import '../Game/Map.js';
|
|
11
11
|
import 'pixi.js';
|
|
12
|
-
import '
|
|
13
|
-
import '
|
|
12
|
+
import '../node_modules/.pnpm/@signe_room@2.7.2/node_modules/@signe/room/dist/index.js';
|
|
13
|
+
import '../node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/client/index.js';
|
|
14
14
|
import '@canvasengine/presets';
|
|
15
15
|
|
|
16
16
|
const throwError = (id) => {
|
|
@@ -319,4 +319,4 @@ class RpgGui {
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
export { RpgGui };
|
|
322
|
-
//# sourceMappingURL=
|
|
322
|
+
//# sourceMappingURL=Gui.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index9.js","sources":["../src/Gui/Gui.ts"],"sourcesContent":["import { Context, inject } from \"@signe/di\";\nimport { signal, Signal, WritableSignal } from \"canvasengine\";\nimport { AbstractWebsocket, WebSocketToken } from \"../services/AbstractSocket\";\nimport { DialogboxComponent } from \"../components/gui\";\nimport { combineLatest, Subscription } from \"rxjs\";\n\ninterface GuiOptions {\n name?: string;\n id?: string;\n component: any;\n display?: boolean;\n data?: any;\n /**\n * Auto display the GUI when added to the system\n * @default false\n */\n autoDisplay?: boolean;\n /**\n * Function that returns an array of Signal dependencies\n * The GUI will only display when all dependencies are resolved (!= undefined)\n * @returns Array of Signal dependencies\n */\n dependencies?: () => Signal[];\n /**\n * Attach the GUI to sprites instead of displaying globally\n * When true, the GUI will be rendered in character.ce for each sprite\n * @default false\n */\n attachToSprite?: boolean;\n}\n\ninterface GuiInstance {\n name: string;\n component: any;\n display: WritableSignal<boolean>;\n data: WritableSignal<any>;\n autoDisplay: boolean;\n dependencies?: () => Signal[];\n subscription?: Subscription;\n attachToSprite?: boolean;\n}\n\nconst throwError = (id: string) => {\n throw `The GUI named ${id} is non-existent. Please add the component in the gui property of the decorator @RpgClient`;\n};\n\nexport class RpgGui {\n private webSocket: AbstractWebsocket;\n gui = signal<Record<string, GuiInstance>>({});\n extraGuis: GuiInstance[] = [];\n private vueGuiInstance: any = null; // Reference to VueGui instance\n /**\n * Signal tracking which player IDs should display attached GUIs\n * Key: player ID, Value: boolean (true = show, false = hide)\n */\n attachedGuiDisplayState = signal<Record<string, boolean>>({});\n\n constructor(private context: Context) {\n this.webSocket = inject(context, WebSocketToken);\n this.add({\n name: \"rpg-dialog\",\n component: DialogboxComponent,\n });\n }\n\n async _initialize() {\n this.webSocket.on(\"gui.open\", (data: { guiId: string; data: any }) => {\n this.display(data.guiId, data.data);\n });\n\n this.webSocket.on(\"gui.exit\", (guiId: string) => {\n this.hide(guiId);\n });\n\n /**\n * Listen for tooltip display state changes from server\n * This is triggered by showAttachedGui/hideAttachedGui on the server\n */\n this.webSocket.on(\"gui.tooltip\", (data: { players: string[]; display: boolean }) => {\n const currentState = { ...this.attachedGuiDisplayState() };\n data.players.forEach((playerId) => {\n currentState[playerId] = data.display;\n });\n this.attachedGuiDisplayState.set(currentState);\n });\n }\n\n /**\n * Set the VueGui instance reference for Vue component management\n * This is called by VueGui when it's initialized\n * \n * @param vueGuiInstance - The VueGui instance\n */\n _setVueGuiInstance(vueGuiInstance: any) {\n this.vueGuiInstance = vueGuiInstance;\n }\n\n /**\n * Notify VueGui about GUI state changes\n * This synchronizes the Vue component display state\n * \n * @param guiId - The GUI component ID\n * @param display - Display state\n * @param data - Component data\n */\n private _notifyVueGui(guiId: string, display: boolean, data: any = {}) {\n if (this.vueGuiInstance && this.vueGuiInstance.vm) {\n // Find the GUI in extraGuis\n const extraGui = this.extraGuis.find(gui => gui.name === guiId);\n if (extraGui) {\n // Update the Vue component's display state and data\n this.vueGuiInstance.vm.gui[guiId] = {\n name: guiId,\n display,\n data,\n attachToSprite: extraGui.attachToSprite || false\n };\n // Trigger Vue reactivity\n this.vueGuiInstance.vm.gui = Object.assign({}, this.vueGuiInstance.vm.gui);\n }\n }\n }\n\n /**\n * Initialize Vue components in the VueGui instance\n * This should be called after VueGui is mounted\n */\n _initializeVueComponents() {\n if (this.vueGuiInstance && this.vueGuiInstance.vm) {\n // Initialize all extraGuis in the Vue instance\n this.extraGuis.forEach(gui => {\n this.vueGuiInstance.vm.gui[gui.name] = {\n name: gui.name,\n display: gui.display(),\n data: gui.data(),\n attachToSprite: gui.attachToSprite || false\n };\n });\n \n // Trigger Vue reactivity\n this.vueGuiInstance.vm.gui = Object.assign({}, this.vueGuiInstance.vm.gui);\n }\n }\n\n guiInteraction(guiId: string, name: string, data: any) {\n this.webSocket.emit(\"gui.interaction\", {\n guiId,\n name,\n data,\n });\n }\n\n guiClose(guiId: string, data?: any) {\n this.webSocket.emit(\"gui.exit\", {\n guiId,\n data,\n });\n }\n\n /**\n * Add a GUI component to the system\n * \n * By default, only CanvasEngine components (.ce files) are accepted.\n * Vue components should be handled by the @rpgjs/vue package.\n * \n * @param gui - GUI configuration options\n * @param gui.name - Name or ID of the GUI component\n * @param gui.id - Alternative ID if name is not provided\n * @param gui.component - The component to render (must be a CanvasEngine component)\n * @param gui.display - Initial display state (default: false)\n * @param gui.data - Initial data for the component\n * @param gui.autoDisplay - Auto display when added (default: false)\n * @param gui.dependencies - Function returning Signal dependencies\n * @param gui.attachToSprite - Attach GUI to sprites instead of global display (default: false)\n * \n * @example\n * ```ts\n * gui.add({\n * name: 'inventory',\n * component: InventoryComponent, // Must be a .ce component\n * autoDisplay: true,\n * dependencies: () => [playerSignal, inventorySignal]\n * });\n * \n * // Attach to sprites\n * gui.add({\n * name: 'tooltip',\n * component: TooltipComponent,\n * attachToSprite: true\n * });\n * ```\n */\n add(gui: GuiOptions) {\n const guiId = gui.name || gui.id;\n if (!guiId) {\n throw new Error(\"GUI must have a name or id\");\n }\n const guiInstance: GuiInstance = {\n name: guiId,\n component: gui.component,\n display: signal(gui.display || false),\n data: signal(gui.data || {}),\n autoDisplay: gui.autoDisplay || false,\n dependencies: gui.dependencies ? gui.dependencies() : [],\n attachToSprite: gui.attachToSprite || false,\n };\n\n // Accept both CanvasEngine components (.ce) and Vue components\n // Vue components will be handled by VueGui if available\n if (typeof gui.component !== 'function') {\n guiInstance.component = gui;\n this.extraGuis.push(guiInstance);\n \n // Auto display Vue components if enabled\n if (guiInstance.autoDisplay) {\n this._notifyVueGui(guiId, true, gui.data || {});\n }\n return;\n }\n\n this.gui()[guiId] = guiInstance;\n\n // Auto display if enabled and it's a CanvasEngine component\n if (guiInstance.autoDisplay && typeof gui.component === 'function') {\n this.display(guiId);\n }\n }\n\n /**\n * Get all attached GUI components (attachToSprite: true)\n * \n * Returns all GUI instances that are configured to be attached to sprites.\n * These GUIs should be rendered in character.ce instead of canvas.ce.\n * \n * @returns Array of GUI instances with attachToSprite: true\n * \n * @example\n * ```ts\n * const attachedGuis = gui.getAttachedGuis();\n * // Use in character.ce to render tooltips\n * ```\n */\n getAttachedGuis(): GuiInstance[] {\n const allGuis = this.getAll();\n return Object.values(allGuis).filter(gui => gui.attachToSprite === true);\n }\n\n /**\n * Check if a player should display attached GUIs\n * \n * @param playerId - The player ID to check\n * @returns true if attached GUIs should be displayed for this player\n */\n shouldDisplayAttachedGui(playerId: string): boolean {\n return this.attachedGuiDisplayState()[playerId] === true;\n }\n\n get(id: string): GuiInstance | undefined {\n // Check CanvasEngine GUIs first\n const canvasGui = this.gui()[id];\n if (canvasGui) {\n return canvasGui;\n }\n \n // Check Vue GUIs in extraGuis\n return this.extraGuis.find(gui => gui.name === id);\n }\n\n exists(id: string): boolean {\n return !!this.get(id);\n }\n\n getAll(): Record<string, GuiInstance> {\n const allGuis = { ...this.gui() };\n \n // Add extraGuis to the result\n this.extraGuis.forEach(gui => {\n allGuis[gui.name] = gui;\n });\n \n return allGuis;\n }\n\n /**\n * Display a GUI component\n * \n * Displays the GUI immediately if no dependencies are configured,\n * or waits for all dependencies to be resolved if dependencies are present.\n * Automatically manages subscriptions to prevent memory leaks.\n * Works with both CanvasEngine components and Vue components.\n * \n * @param id - The GUI component ID\n * @param data - Data to pass to the component\n * @param dependencies - Optional runtime dependencies (overrides config dependencies)\n * \n * @example\n * ```ts\n * // Display immediately\n * gui.display('inventory', { items: [] });\n * \n * // Display with runtime dependencies\n * gui.display('shop', { shopId: 1 }, [playerSignal, shopSignal]);\n * ```\n */\n display(id: string, data = {}, dependencies: Signal[] = []) {\n if (!this.exists(id)) {\n throw throwError(id);\n }\n\n const guiInstance = this.get(id)!;\n \n // Check if it's a Vue component (in extraGuis)\n const isVueComponent = this.extraGuis.some(gui => gui.name === id);\n \n if (isVueComponent) {\n // Handle Vue component display\n this._handleVueComponentDisplay(id, data, dependencies, guiInstance);\n } else {\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n }\n }\n\n /**\n * Handle Vue component display logic\n * \n * @param id - GUI component ID\n * @param data - Component data\n * @param dependencies - Runtime dependencies\n * @param guiInstance - GUI instance\n */\n private _handleVueComponentDisplay(id: string, data: any, dependencies: Signal[], guiInstance: GuiInstance) {\n // Unsubscribe from previous subscription if exists\n if (guiInstance.subscription) {\n guiInstance.subscription.unsubscribe();\n guiInstance.subscription = undefined;\n }\n\n // Use runtime dependencies or config dependencies\n const deps = dependencies.length > 0 \n ? dependencies \n : (guiInstance.dependencies ? guiInstance.dependencies() : []);\n\n if (deps.length > 0) {\n // Subscribe to dependencies\n guiInstance.subscription = combineLatest(\n deps.map(dependency => dependency.observable)\n ).subscribe((values) => {\n if (values.every(value => value !== undefined)) {\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n this._notifyVueGui(id, true, data);\n }\n });\n return;\n }\n\n // No dependencies, display immediately\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n this._notifyVueGui(id, true, data);\n }\n\n /**\n * Handle CanvasEngine component display logic\n * \n * @param id - GUI component ID\n * @param data - Component data\n * @param dependencies - Runtime dependencies\n * @param guiInstance - GUI instance\n */\n private _handleCanvasComponentDisplay(id: string, data: any, dependencies: Signal[], guiInstance: GuiInstance) {\n \n }\n\n /**\n * Hide a GUI component\n * \n * Hides the GUI and cleans up any active subscriptions.\n * Works with both CanvasEngine components and Vue components.\n * \n * @param id - The GUI component ID\n * \n * @example\n * ```ts\n * gui.hide('inventory');\n * ```\n */\n hide(id: string) {\n if (!this.exists(id)) {\n throw throwError(id);\n }\n\n const guiInstance = this.get(id)!;\n \n // Unsubscribe if there's an active subscription\n if (guiInstance.subscription) {\n guiInstance.subscription.unsubscribe();\n guiInstance.subscription = undefined;\n }\n\n guiInstance.display.set(false);\n \n // Check if it's a Vue component and notify VueGui\n const isVueComponent = this.extraGuis.some(gui => gui.name === id);\n if (isVueComponent) {\n this._notifyVueGui(id, false);\n }\n }\n}\n"],"names":["DialogboxComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Gui.js","sources":["../../src/Gui/Gui.ts"],"sourcesContent":["import { Context, inject } from \"@signe/di\";\nimport { signal, Signal, WritableSignal } from \"canvasengine\";\nimport { AbstractWebsocket, WebSocketToken } from \"../services/AbstractSocket\";\nimport { DialogboxComponent } from \"../components/gui\";\nimport { combineLatest, Subscription } from \"rxjs\";\n\ninterface GuiOptions {\n name?: string;\n id?: string;\n component: any;\n display?: boolean;\n data?: any;\n /**\n * Auto display the GUI when added to the system\n * @default false\n */\n autoDisplay?: boolean;\n /**\n * Function that returns an array of Signal dependencies\n * The GUI will only display when all dependencies are resolved (!= undefined)\n * @returns Array of Signal dependencies\n */\n dependencies?: () => Signal[];\n /**\n * Attach the GUI to sprites instead of displaying globally\n * When true, the GUI will be rendered in character.ce for each sprite\n * @default false\n */\n attachToSprite?: boolean;\n}\n\ninterface GuiInstance {\n name: string;\n component: any;\n display: WritableSignal<boolean>;\n data: WritableSignal<any>;\n autoDisplay: boolean;\n dependencies?: () => Signal[];\n subscription?: Subscription;\n attachToSprite?: boolean;\n}\n\nconst throwError = (id: string) => {\n throw `The GUI named ${id} is non-existent. Please add the component in the gui property of the decorator @RpgClient`;\n};\n\nexport class RpgGui {\n private webSocket: AbstractWebsocket;\n gui = signal<Record<string, GuiInstance>>({});\n extraGuis: GuiInstance[] = [];\n private vueGuiInstance: any = null; // Reference to VueGui instance\n /**\n * Signal tracking which player IDs should display attached GUIs\n * Key: player ID, Value: boolean (true = show, false = hide)\n */\n attachedGuiDisplayState = signal<Record<string, boolean>>({});\n\n constructor(private context: Context) {\n this.webSocket = inject(context, WebSocketToken);\n this.add({\n name: \"rpg-dialog\",\n component: DialogboxComponent,\n });\n }\n\n async _initialize() {\n this.webSocket.on(\"gui.open\", (data: { guiId: string; data: any }) => {\n this.display(data.guiId, data.data);\n });\n\n this.webSocket.on(\"gui.exit\", (guiId: string) => {\n this.hide(guiId);\n });\n\n /**\n * Listen for tooltip display state changes from server\n * This is triggered by showAttachedGui/hideAttachedGui on the server\n */\n this.webSocket.on(\"gui.tooltip\", (data: { players: string[]; display: boolean }) => {\n const currentState = { ...this.attachedGuiDisplayState() };\n data.players.forEach((playerId) => {\n currentState[playerId] = data.display;\n });\n this.attachedGuiDisplayState.set(currentState);\n });\n }\n\n /**\n * Set the VueGui instance reference for Vue component management\n * This is called by VueGui when it's initialized\n * \n * @param vueGuiInstance - The VueGui instance\n */\n _setVueGuiInstance(vueGuiInstance: any) {\n this.vueGuiInstance = vueGuiInstance;\n }\n\n /**\n * Notify VueGui about GUI state changes\n * This synchronizes the Vue component display state\n * \n * @param guiId - The GUI component ID\n * @param display - Display state\n * @param data - Component data\n */\n private _notifyVueGui(guiId: string, display: boolean, data: any = {}) {\n if (this.vueGuiInstance && this.vueGuiInstance.vm) {\n // Find the GUI in extraGuis\n const extraGui = this.extraGuis.find(gui => gui.name === guiId);\n if (extraGui) {\n // Update the Vue component's display state and data\n this.vueGuiInstance.vm.gui[guiId] = {\n name: guiId,\n display,\n data,\n attachToSprite: extraGui.attachToSprite || false\n };\n // Trigger Vue reactivity\n this.vueGuiInstance.vm.gui = Object.assign({}, this.vueGuiInstance.vm.gui);\n }\n }\n }\n\n /**\n * Initialize Vue components in the VueGui instance\n * This should be called after VueGui is mounted\n */\n _initializeVueComponents() {\n if (this.vueGuiInstance && this.vueGuiInstance.vm) {\n // Initialize all extraGuis in the Vue instance\n this.extraGuis.forEach(gui => {\n this.vueGuiInstance.vm.gui[gui.name] = {\n name: gui.name,\n display: gui.display(),\n data: gui.data(),\n attachToSprite: gui.attachToSprite || false\n };\n });\n \n // Trigger Vue reactivity\n this.vueGuiInstance.vm.gui = Object.assign({}, this.vueGuiInstance.vm.gui);\n }\n }\n\n guiInteraction(guiId: string, name: string, data: any) {\n this.webSocket.emit(\"gui.interaction\", {\n guiId,\n name,\n data,\n });\n }\n\n guiClose(guiId: string, data?: any) {\n this.webSocket.emit(\"gui.exit\", {\n guiId,\n data,\n });\n }\n\n /**\n * Add a GUI component to the system\n * \n * By default, only CanvasEngine components (.ce files) are accepted.\n * Vue components should be handled by the @rpgjs/vue package.\n * \n * @param gui - GUI configuration options\n * @param gui.name - Name or ID of the GUI component\n * @param gui.id - Alternative ID if name is not provided\n * @param gui.component - The component to render (must be a CanvasEngine component)\n * @param gui.display - Initial display state (default: false)\n * @param gui.data - Initial data for the component\n * @param gui.autoDisplay - Auto display when added (default: false)\n * @param gui.dependencies - Function returning Signal dependencies\n * @param gui.attachToSprite - Attach GUI to sprites instead of global display (default: false)\n * \n * @example\n * ```ts\n * gui.add({\n * name: 'inventory',\n * component: InventoryComponent, // Must be a .ce component\n * autoDisplay: true,\n * dependencies: () => [playerSignal, inventorySignal]\n * });\n * \n * // Attach to sprites\n * gui.add({\n * name: 'tooltip',\n * component: TooltipComponent,\n * attachToSprite: true\n * });\n * ```\n */\n add(gui: GuiOptions) {\n const guiId = gui.name || gui.id;\n if (!guiId) {\n throw new Error(\"GUI must have a name or id\");\n }\n const guiInstance: GuiInstance = {\n name: guiId,\n component: gui.component,\n display: signal(gui.display || false),\n data: signal(gui.data || {}),\n autoDisplay: gui.autoDisplay || false,\n dependencies: gui.dependencies ? gui.dependencies() : [],\n attachToSprite: gui.attachToSprite || false,\n };\n\n // Accept both CanvasEngine components (.ce) and Vue components\n // Vue components will be handled by VueGui if available\n if (typeof gui.component !== 'function') {\n guiInstance.component = gui;\n this.extraGuis.push(guiInstance);\n \n // Auto display Vue components if enabled\n if (guiInstance.autoDisplay) {\n this._notifyVueGui(guiId, true, gui.data || {});\n }\n return;\n }\n\n this.gui()[guiId] = guiInstance;\n\n // Auto display if enabled and it's a CanvasEngine component\n if (guiInstance.autoDisplay && typeof gui.component === 'function') {\n this.display(guiId);\n }\n }\n\n /**\n * Get all attached GUI components (attachToSprite: true)\n * \n * Returns all GUI instances that are configured to be attached to sprites.\n * These GUIs should be rendered in character.ce instead of canvas.ce.\n * \n * @returns Array of GUI instances with attachToSprite: true\n * \n * @example\n * ```ts\n * const attachedGuis = gui.getAttachedGuis();\n * // Use in character.ce to render tooltips\n * ```\n */\n getAttachedGuis(): GuiInstance[] {\n const allGuis = this.getAll();\n return Object.values(allGuis).filter(gui => gui.attachToSprite === true);\n }\n\n /**\n * Check if a player should display attached GUIs\n * \n * @param playerId - The player ID to check\n * @returns true if attached GUIs should be displayed for this player\n */\n shouldDisplayAttachedGui(playerId: string): boolean {\n return this.attachedGuiDisplayState()[playerId] === true;\n }\n\n get(id: string): GuiInstance | undefined {\n // Check CanvasEngine GUIs first\n const canvasGui = this.gui()[id];\n if (canvasGui) {\n return canvasGui;\n }\n \n // Check Vue GUIs in extraGuis\n return this.extraGuis.find(gui => gui.name === id);\n }\n\n exists(id: string): boolean {\n return !!this.get(id);\n }\n\n getAll(): Record<string, GuiInstance> {\n const allGuis = { ...this.gui() };\n \n // Add extraGuis to the result\n this.extraGuis.forEach(gui => {\n allGuis[gui.name] = gui;\n });\n \n return allGuis;\n }\n\n /**\n * Display a GUI component\n * \n * Displays the GUI immediately if no dependencies are configured,\n * or waits for all dependencies to be resolved if dependencies are present.\n * Automatically manages subscriptions to prevent memory leaks.\n * Works with both CanvasEngine components and Vue components.\n * \n * @param id - The GUI component ID\n * @param data - Data to pass to the component\n * @param dependencies - Optional runtime dependencies (overrides config dependencies)\n * \n * @example\n * ```ts\n * // Display immediately\n * gui.display('inventory', { items: [] });\n * \n * // Display with runtime dependencies\n * gui.display('shop', { shopId: 1 }, [playerSignal, shopSignal]);\n * ```\n */\n display(id: string, data = {}, dependencies: Signal[] = []) {\n if (!this.exists(id)) {\n throw throwError(id);\n }\n\n const guiInstance = this.get(id)!;\n \n // Check if it's a Vue component (in extraGuis)\n const isVueComponent = this.extraGuis.some(gui => gui.name === id);\n \n if (isVueComponent) {\n // Handle Vue component display\n this._handleVueComponentDisplay(id, data, dependencies, guiInstance);\n } else {\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n }\n }\n\n /**\n * Handle Vue component display logic\n * \n * @param id - GUI component ID\n * @param data - Component data\n * @param dependencies - Runtime dependencies\n * @param guiInstance - GUI instance\n */\n private _handleVueComponentDisplay(id: string, data: any, dependencies: Signal[], guiInstance: GuiInstance) {\n // Unsubscribe from previous subscription if exists\n if (guiInstance.subscription) {\n guiInstance.subscription.unsubscribe();\n guiInstance.subscription = undefined;\n }\n\n // Use runtime dependencies or config dependencies\n const deps = dependencies.length > 0 \n ? dependencies \n : (guiInstance.dependencies ? guiInstance.dependencies() : []);\n\n if (deps.length > 0) {\n // Subscribe to dependencies\n guiInstance.subscription = combineLatest(\n deps.map(dependency => dependency.observable)\n ).subscribe((values) => {\n if (values.every(value => value !== undefined)) {\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n this._notifyVueGui(id, true, data);\n }\n });\n return;\n }\n\n // No dependencies, display immediately\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n this._notifyVueGui(id, true, data);\n }\n\n /**\n * Handle CanvasEngine component display logic\n * \n * @param id - GUI component ID\n * @param data - Component data\n * @param dependencies - Runtime dependencies\n * @param guiInstance - GUI instance\n */\n private _handleCanvasComponentDisplay(id: string, data: any, dependencies: Signal[], guiInstance: GuiInstance) {\n \n }\n\n /**\n * Hide a GUI component\n * \n * Hides the GUI and cleans up any active subscriptions.\n * Works with both CanvasEngine components and Vue components.\n * \n * @param id - The GUI component ID\n * \n * @example\n * ```ts\n * gui.hide('inventory');\n * ```\n */\n hide(id: string) {\n if (!this.exists(id)) {\n throw throwError(id);\n }\n\n const guiInstance = this.get(id)!;\n \n // Unsubscribe if there's an active subscription\n if (guiInstance.subscription) {\n guiInstance.subscription.unsubscribe();\n guiInstance.subscription = undefined;\n }\n\n guiInstance.display.set(false);\n \n // Check if it's a Vue component and notify VueGui\n const isVueComponent = this.extraGuis.some(gui => gui.name === id);\n if (isVueComponent) {\n this._notifyVueGui(id, false);\n }\n }\n}\n"],"names":["DialogboxComponent"],"mappings":";;;;;;;;;;;;;;;AA0CA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAe;AACjC,EAAA,MAAM,iBAAiB,EAAE,CAAA,0FAAA,CAAA;AAC3B,CAAA;AAEO,MAAM,MAAA,CAAO;AAAA,EAWlB,YAAoB,OAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AATpB,IAAA,IAAA,CAAA,GAAA,GAAM,MAAA,CAAoC,EAAE,CAAA;AAC5C,IAAA,IAAA,CAAA,SAAA,GAA2B,EAAC;AAC5B,IAAA,IAAA,CAAQ,cAAA,GAAsB,IAAA;AAK9B;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,uBAAA,GAA0B,MAAA,CAAgC,EAAE,CAAA;AAG1D,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,OAAA,EAAS,cAAc,CAAA;AAC/C,IAAA,IAAA,CAAK,GAAA,CAAI;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAWA;AAAA,KACZ,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,GAAc;AAClB,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,UAAA,EAAY,CAAC,IAAA,KAAuC;AACpE,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,UAAA,EAAY,CAAC,KAAA,KAAkB;AAC/C,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACjB,CAAC,CAAA;AAMD,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,aAAA,EAAe,CAAC,IAAA,KAAkD;AAClF,MAAA,MAAM,YAAA,GAAe,EAAE,GAAG,IAAA,CAAK,yBAAwB,EAAE;AACzD,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,CAAC,QAAA,KAAa;AACjC,QAAA,YAAA,CAAa,QAAQ,IAAI,IAAA,CAAK,OAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,YAAY,CAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,cAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,aAAA,CAAc,KAAA,EAAe,OAAA,EAAkB,IAAA,GAAY,EAAC,EAAG;AACrE,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI;AAEjD,MAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAA,KAAO,GAAA,CAAI,SAAS,KAAK,CAAA;AAC9D,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,GAAA,CAAI,KAAK,CAAA,GAAI;AAAA,UAClC,IAAA,EAAM,KAAA;AAAA,UACN,OAAA;AAAA,UACA,IAAA;AAAA,UACA,cAAA,EAAgB,SAAS,cAAA,IAAkB;AAAA,SAC7C;AAEA,QAAA,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,GAAG,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAA,GAA2B;AACzB,IAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI;AAEjD,MAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAAA,KAAO;AAC5B,QAAA,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,UACrC,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,UACrB,IAAA,EAAM,IAAI,IAAA,EAAK;AAAA,UACf,cAAA,EAAgB,IAAI,cAAA,IAAkB;AAAA,SACxC;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,GAAG,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,KAAA,EAAe,IAAA,EAAc,IAAA,EAAW;AACrD,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,iBAAA,EAAmB;AAAA,MACrC,KAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,QAAA,CAAS,OAAe,IAAA,EAAY;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,UAAA,EAAY;AAAA,MAC9B,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,IAAI,GAAA,EAAiB;AACnB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,EAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AACA,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,KAAA;AAAA,MACN,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,KAAK,CAAA;AAAA,MACpC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,MAC3B,WAAA,EAAa,IAAI,WAAA,IAAe,KAAA;AAAA,MAChC,cAAc,GAAA,CAAI,YAAA,GAAe,GAAA,CAAI,YAAA,KAAiB,EAAC;AAAA,MACvD,cAAA,EAAgB,IAAI,cAAA,IAAkB;AAAA,KACxC;AAIA,IAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,UAAA,EAAY;AACvC,MAAA,WAAA,CAAY,SAAA,GAAY,GAAA;AACxB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,WAAW,CAAA;AAG/B,MAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,QAAA,IAAA,CAAK,cAAc,KAAA,EAAO,IAAA,EAAM,GAAA,CAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,MAChD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,EAAI,CAAE,KAAK,CAAA,GAAI,WAAA;AAGpB,IAAA,IAAI,WAAA,CAAY,WAAA,IAAe,OAAO,GAAA,CAAI,cAAc,UAAA,EAAY;AAClE,MAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,eAAA,GAAiC;AAC/B,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,EAAO;AAC5B,IAAA,OAAO,MAAA,CAAO,OAAO,OAAO,CAAA,CAAE,OAAO,CAAA,GAAA,KAAO,GAAA,CAAI,mBAAmB,IAAI,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBAAyB,QAAA,EAA2B;AAClD,IAAA,OAAO,IAAA,CAAK,uBAAA,EAAwB,CAAE,QAAQ,CAAA,KAAM,IAAA;AAAA,EACtD;AAAA,EAEA,IAAI,EAAA,EAAqC;AAEvC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,EAAE,CAAA;AAC/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,SAAA;AAAA,IACT;AAGA,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,SAAS,EAAE,CAAA;AAAA,EACnD;AAAA,EAEA,OAAO,EAAA,EAAqB;AAC1B,IAAA,OAAO,CAAC,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,EACtB;AAAA,EAEA,MAAA,GAAsC;AACpC,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,KAAI,EAAE;AAGhC,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAAA,KAAO;AAC5B,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,QAAQ,EAAA,EAAY,IAAA,GAAO,EAAC,EAAG,YAAA,GAAyB,EAAC,EAAG;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,WAAW,EAAE,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAG/B,IAAA,MAAM,iBAAiB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAA,KAAO,GAAA,CAAI,SAAS,EAAE,CAAA;AAEjE,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAA,IAAA,CAAK,0BAAA,CAA2B,EAAA,EAAI,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,IAAI,IAAI,CAAA;AACzB,MAAA,WAAA,CAAY,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,0BAAA,CAA2B,EAAA,EAAY,IAAA,EAAW,YAAA,EAAwB,WAAA,EAA0B;AAE1G,IAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,MAAA,WAAA,CAAY,aAAa,WAAA,EAAY;AACrC,MAAA,WAAA,CAAY,YAAA,GAAe,MAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,GAAS,CAAA,GAC/B,YAAA,GACC,YAAY,YAAA,GAAe,WAAA,CAAY,YAAA,EAAa,GAAI,EAAC;AAE9D,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAEnB,MAAA,WAAA,CAAY,YAAA,GAAe,aAAA;AAAA,QACzB,IAAA,CAAK,GAAA,CAAI,CAAA,UAAA,KAAc,UAAA,CAAW,UAAU;AAAA,OAC9C,CAAE,SAAA,CAAU,CAAC,MAAA,KAAW;AACtB,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,KAAS,KAAA,KAAU,MAAS,CAAA,EAAG;AAC9C,UAAA,WAAA,CAAY,IAAA,CAAK,IAAI,IAAI,CAAA;AACzB,UAAA,WAAA,CAAY,OAAA,CAAQ,IAAI,IAAI,CAAA;AAC5B,UAAA,IAAA,CAAK,aAAA,CAAc,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AAAA,QACnC;AAAA,MACF,CAAC,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,WAAA,CAAY,IAAA,CAAK,IAAI,IAAI,CAAA;AACzB,IAAA,WAAA,CAAY,OAAA,CAAQ,IAAI,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,CAAc,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,6BAAA,CAA8B,EAAA,EAAY,IAAA,EAAW,YAAA,EAAwB,WAAA,EAA0B;AAAA,EAE/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,KAAK,EAAA,EAAY;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,WAAW,EAAE,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAG/B,IAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,MAAA,WAAA,CAAY,aAAa,WAAA,EAAY;AACrC,MAAA,WAAA,CAAY,YAAA,GAAe,MAAA;AAAA,IAC7B;AAEA,IAAA,WAAA,CAAY,OAAA,CAAQ,IAAI,KAAK,CAAA;AAG7B,IAAA,MAAM,iBAAiB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAA,KAAO,GAAA,CAAI,SAAS,EAAE,CAAA;AACjE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resource.js","sources":["../src/Resource.ts"],"sourcesContent":["import { RpgClientEngine } from './RpgClientEngine';\n\n/**\n * RpgResource class\n * \n * Provides a unified API to access resource file links (images and sounds) in the game.\n * Resources are stored as Maps of resource IDs to file paths/URLs.\n * \n * ## Design\n * \n * RpgResource acts as a facade over the engine's resource storage, providing\n * easy access to resource file links. It maintains Maps that are synchronized\n * with the engine's internal storage, but only stores the file paths/URLs,\n * not the full resource objects.\n * \n * @example\n * ```ts\n * import { RpgResource } from '@rpgjs/client'\n * \n * // Get spritesheet image link\n * const imageLink = RpgResource.spritesheets.get('hero')\n * \n * // Get sound file link\n * const soundLink = RpgResource.sounds.get('town-music')\n * \n * // Set a new resource link\n * RpgResource.spritesheets.set('new-sprite', './assets/new-sprite.png')\n * ```\n */\nexport class RpgResource {\n private static engine: RpgClientEngine | null = null;\n private static _spritesheets: Map<string, string> = new Map();\n private static _sounds: Map<string, string> = new Map();\n\n /**\n * Initialize RpgResource with the engine instance\n * \n * This is called automatically by the engine during initialization.\n * It synchronizes the resource Maps with the engine's internal storage.\n * \n * @param engine - The RpgClientEngine instance\n */\n static init(engine: RpgClientEngine): void {\n RpgResource.engine = engine;\n RpgResource.syncResources();\n }\n\n /**\n * Synchronize resource Maps with the engine's internal storage\n * \n * Extracts file links from spritesheets and sounds stored in the engine\n * and updates the Maps accordingly.\n * \n * @private\n */\n private static syncResources(): void {\n if (!RpgResource.engine) {\n return;\n }\n\n // Sync spritesheets\n RpgResource._spritesheets.clear();\n RpgResource.engine.spritesheets.forEach((spritesheet, id) => {\n // Extract image path from spritesheet\n const imageLink = spritesheet?.image || spritesheet?.imageSource || undefined;\n if (imageLink) {\n RpgResource._spritesheets.set(id, imageLink);\n }\n });\n\n // Sync sounds\n RpgResource._sounds.clear();\n RpgResource.engine.sounds.forEach((sound, id) => {\n // Extract src path from sound\n let soundLink: string | undefined;\n \n // If it's a Howler instance, try to get src from _src or src property\n if (sound && typeof sound === 'object') {\n if (sound._src && Array.isArray(sound._src) && sound._src.length > 0) {\n soundLink = sound._src[0];\n } else if (sound.src && typeof sound.src === 'string') {\n soundLink = sound.src;\n } else if (sound.src && Array.isArray(sound.src) && sound.src.length > 0) {\n soundLink = sound.src[0];\n }\n }\n \n if (soundLink) {\n RpgResource._sounds.set(id, soundLink);\n }\n });\n }\n\n /**\n * Get/Set image links for spritesheets\n * \n * Map of spritesheet IDs to their image file paths/URLs.\n * This Map is synchronized with the engine's spritesheet storage.\n * \n * @type {Map<string, string>}\n * \n * @example\n * ```ts\n * // Get an image link\n * const imageLink = RpgResource.spritesheets.get('hero')\n * \n * // Set a new image link\n * RpgResource.spritesheets.set('new-sprite', './assets/new-sprite.png')\n * \n * // Check if a spritesheet exists\n * if (RpgResource.spritesheets.has('monster')) {\n * const link = RpgResource.spritesheets.get('monster')\n * }\n * ```\n */\n static get spritesheets(): Map<string, string> {\n // Sync before returning to ensure we have the latest data\n RpgResource.syncResources();\n return RpgResource._spritesheets;\n }\n\n /**\n * Get/Set sound file links\n * \n * Map of sound IDs to their audio file paths/URLs.\n * This Map is synchronized with the engine's sound storage.\n * \n * @type {Map<string, string>}\n * \n * @example\n * ```ts\n * // Get a sound link\n * const soundLink = RpgResource.sounds.get('town-music')\n * \n * // Set a new sound link\n * RpgResource.sounds.set('new-sound', './assets/new-sound.ogg')\n * \n * // Iterate over all sounds\n * RpgResource.sounds.forEach((link, id) => {\n * console.log(`Sound ${id}: ${link}`)\n * })\n * ```\n */\n static get sounds(): Map<string, string> {\n // Sync before returning to ensure we have the latest data\n RpgResource.syncResources();\n return RpgResource._sounds;\n }\n}\n\n"],"names":[],"mappings":"AA6BO,MAAM,WAAA,CAAY;AAAA,EACvB;AAAA,IAAA,IAAA,CAAe,MAAA,GAAiC,IAAA;AAAA;AAAA,EAChD;AAAA,IAAA,IAAA,CAAe,aAAA,uBAAyC,GAAA,EAAI;AAAA;AAAA,EAC5D;AAAA,IAAA,IAAA,CAAe,OAAA,uBAAmC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUtD,OAAO,KAAK,MAAA,EAA+B;AACzC,IAAA,WAAA,CAAY,MAAA,GAAS,MAAA;AACrB,IAAA,WAAA,CAAY,aAAA,EAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAe,aAAA,GAAsB;AACnC,IAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,WAAA,CAAY,cAAc,KAAA,EAAM;AAChC,IAAA,WAAA,CAAY,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC,aAAa,EAAA,KAAO;AAE3D,MAAA,MAAM,SAAA,GAAY,WAAA,EAAa,KAAA,IAAS,WAAA,EAAa,WAAA,IAAe,MAAA;AACpE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,WAAA,CAAY,aAAA,CAAc,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AAAA,MAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,WAAA,CAAY,QAAQ,KAAA,EAAM;AAC1B,IAAA,WAAA,CAAY,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,OAAO,EAAA,KAAO;AAE/C,MAAA,IAAI,SAAA;AAGJ,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,QAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACpE,UAAA,SAAA,GAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QAC1B,WAAW,KAAA,CAAM,GAAA,IAAO,OAAO,KAAA,CAAM,QAAQ,QAAA,EAAU;AACrD,UAAA,SAAA,GAAY,KAAA,CAAM,GAAA;AAAA,QACpB,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,IAAK,KAAA,CAAM,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AACxE,UAAA,SAAA,GAAY,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,QACzB;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,SAAS,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,WAAW,YAAA,GAAoC;AAE7C,IAAA,WAAA,CAAY,aAAA,EAAc;AAC1B,IAAA,OAAO,WAAA,CAAY,aAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,WAAW,MAAA,GAA8B;AAEvC,IAAA,WAAA,CAAY,aAAA,EAAc;AAC1B,IAAA,OAAO,WAAA,CAAY,OAAA;AAAA,EACrB;AACF;;;;"}
|
|
@@ -27,6 +27,8 @@ export declare class RpgClientEngine<T = any> {
|
|
|
27
27
|
};
|
|
28
28
|
renderer: PIXI.Renderer;
|
|
29
29
|
tick: Observable<number>;
|
|
30
|
+
private canvasApp?;
|
|
31
|
+
private canvasElement?;
|
|
30
32
|
playerIdSignal: import('canvasengine').WritableSignal<string | null>;
|
|
31
33
|
spriteComponentsBehind: import('canvasengine').WritableArraySignal<any[]>;
|
|
32
34
|
spriteComponentsInFront: import('canvasengine').WritableArraySignal<any[]>;
|
|
@@ -49,6 +51,8 @@ export declare class RpgClientEngine<T = any> {
|
|
|
49
51
|
private playersReceived$;
|
|
50
52
|
private eventsReceived$;
|
|
51
53
|
private onAfterLoadingSubscription?;
|
|
54
|
+
private tickSubscriptions;
|
|
55
|
+
private resizeHandler?;
|
|
52
56
|
constructor(context: any);
|
|
53
57
|
/**
|
|
54
58
|
* Assigns a CanvasEngine KeyboardControls instance to the dependency injection context
|
|
@@ -630,4 +634,31 @@ export declare class RpgClientEngine<T = any> {
|
|
|
630
634
|
* ```
|
|
631
635
|
*/
|
|
632
636
|
private replayUnackedInputsFromFrame;
|
|
637
|
+
/**
|
|
638
|
+
* Clear all client resources and reset state
|
|
639
|
+
*
|
|
640
|
+
* This method should be called to clean up all client-side resources when
|
|
641
|
+
* shutting down or resetting the client engine. It:
|
|
642
|
+
* - Destroys the PIXI renderer
|
|
643
|
+
* - Stops all sounds
|
|
644
|
+
* - Cleans up subscriptions and event listeners
|
|
645
|
+
* - Resets scene map
|
|
646
|
+
* - Stops ping/pong interval
|
|
647
|
+
* - Clears prediction states
|
|
648
|
+
*
|
|
649
|
+
* ## Design
|
|
650
|
+
*
|
|
651
|
+
* This method is used primarily in testing environments to ensure clean
|
|
652
|
+
* state between tests. In production, the client engine typically persists
|
|
653
|
+
* for the lifetime of the application.
|
|
654
|
+
*
|
|
655
|
+
* @example
|
|
656
|
+
* ```ts
|
|
657
|
+
* // In test cleanup
|
|
658
|
+
* afterEach(() => {
|
|
659
|
+
* clientEngine.clear();
|
|
660
|
+
* });
|
|
661
|
+
* ```
|
|
662
|
+
*/
|
|
663
|
+
clear(): void;
|
|
633
664
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import component from './
|
|
2
|
-
import { inject } from './
|
|
1
|
+
import component from './components/scenes/canvas.ce.js';
|
|
2
|
+
import { inject } from './core/inject.js';
|
|
3
3
|
import { signal, trigger, bootstrapCanvas, Howl } from 'canvasengine';
|
|
4
|
-
import { WebSocketToken } from './
|
|
5
|
-
import { LoadMapToken } from './
|
|
6
|
-
import { RpgSound } from './
|
|
7
|
-
import { RpgResource } from './
|
|
4
|
+
import { WebSocketToken } from './services/AbstractSocket.js';
|
|
5
|
+
import { LoadMapToken } from './services/loadMap.js';
|
|
6
|
+
import { RpgSound } from './Sound.js';
|
|
7
|
+
import { RpgResource } from './Resource.js';
|
|
8
8
|
import { Direction, PredictionController, ModulesToken } from '@rpgjs/common';
|
|
9
|
-
import { load } from './
|
|
10
|
-
import { RpgClientMap } from './
|
|
11
|
-
import { RpgGui } from './
|
|
12
|
-
import { AnimationManager } from './
|
|
9
|
+
import { load } from './node_modules/.pnpm/@signe_sync@2.7.2/node_modules/@signe/sync/dist/index.js';
|
|
10
|
+
import { RpgClientMap } from './Game/Map.js';
|
|
11
|
+
import { RpgGui } from './Gui/Gui.js';
|
|
12
|
+
import { AnimationManager } from './Game/AnimationManager.js';
|
|
13
13
|
import { BehaviorSubject, lastValueFrom, combineLatest, filter, take, switchMap } from 'rxjs';
|
|
14
|
-
import { GlobalConfigToken } from './
|
|
14
|
+
import { GlobalConfigToken } from './module.js';
|
|
15
15
|
import * as PIXI from 'pixi.js';
|
|
16
|
-
import { PrebuiltComponentAnimations } from './
|
|
16
|
+
import { PrebuiltComponentAnimations } from './components/animations/index.js';
|
|
17
17
|
|
|
18
18
|
class RpgClientEngine {
|
|
19
19
|
constructor(context) {
|
|
@@ -51,6 +51,8 @@ class RpgClientEngine {
|
|
|
51
51
|
this.playerIdReceived$ = new BehaviorSubject(false);
|
|
52
52
|
this.playersReceived$ = new BehaviorSubject(false);
|
|
53
53
|
this.eventsReceived$ = new BehaviorSubject(false);
|
|
54
|
+
// Store subscriptions and event listeners for cleanup
|
|
55
|
+
this.tickSubscriptions = [];
|
|
54
56
|
this.webSocket = inject(WebSocketToken);
|
|
55
57
|
this.guiService = inject(RpgGui);
|
|
56
58
|
this.loadMapService = inject(LoadMapToken);
|
|
@@ -114,21 +116,24 @@ class RpgClientEngine {
|
|
|
114
116
|
...currentValues,
|
|
115
117
|
values: /* @__PURE__ */ new Map([["__default__", controlInstance]])
|
|
116
118
|
};
|
|
117
|
-
this.controlsReady.set(
|
|
119
|
+
this.controlsReady.set(void 0);
|
|
118
120
|
}
|
|
119
121
|
async start() {
|
|
120
122
|
this.sceneMap = new RpgClientMap();
|
|
121
123
|
this.selector = document.body.querySelector("#rpg");
|
|
122
124
|
const { app, canvasElement } = await bootstrapCanvas(this.selector, component);
|
|
125
|
+
this.canvasApp = app;
|
|
126
|
+
this.canvasElement = canvasElement;
|
|
123
127
|
this.renderer = app.renderer;
|
|
124
128
|
this.tick = canvasElement?.propObservables?.context["tick"].observable;
|
|
125
|
-
this.tick.subscribe(() => {
|
|
129
|
+
const inputCheckSubscription = this.tick.subscribe(() => {
|
|
126
130
|
if (Date.now() - this.lastInputTime > 100) {
|
|
127
131
|
const player = this.getCurrentPlayer();
|
|
128
132
|
if (!player) return;
|
|
129
133
|
this.sceneMap.stopMovement(player);
|
|
130
134
|
}
|
|
131
135
|
});
|
|
136
|
+
this.tickSubscriptions.push(inputCheckSubscription);
|
|
132
137
|
this.hooks.callHooks("client-spritesheets-load", this).subscribe();
|
|
133
138
|
this.hooks.callHooks("client-spritesheetResolver-load", this).subscribe();
|
|
134
139
|
this.hooks.callHooks("client-sounds-load", this).subscribe();
|
|
@@ -140,10 +145,11 @@ class RpgClientEngine {
|
|
|
140
145
|
this.hooks.callHooks("client-componentAnimations-load", this).subscribe();
|
|
141
146
|
this.hooks.callHooks("client-sprite-load", this).subscribe();
|
|
142
147
|
await lastValueFrom(this.hooks.callHooks("client-engine-onStart", this));
|
|
143
|
-
|
|
148
|
+
this.resizeHandler = () => {
|
|
144
149
|
this.hooks.callHooks("client-engine-onWindowResize", this).subscribe();
|
|
145
|
-
}
|
|
146
|
-
this.
|
|
150
|
+
};
|
|
151
|
+
window.addEventListener("resize", this.resizeHandler);
|
|
152
|
+
const tickSubscription = this.tick.subscribe((tick) => {
|
|
147
153
|
this.hooks.callHooks("client-engine-onStep", this, tick).subscribe();
|
|
148
154
|
if (tick % 60 === 0) {
|
|
149
155
|
const now = Date.now();
|
|
@@ -151,6 +157,7 @@ class RpgClientEngine {
|
|
|
151
157
|
this.prediction?.tryApplyPendingSnapshot();
|
|
152
158
|
}
|
|
153
159
|
});
|
|
160
|
+
this.tickSubscriptions.push(tickSubscription);
|
|
154
161
|
await this.webSocket.connection(() => {
|
|
155
162
|
this.initListeners();
|
|
156
163
|
this.guiService._initialize();
|
|
@@ -1092,7 +1099,132 @@ class RpgClientEngine {
|
|
|
1092
1099
|
*/
|
|
1093
1100
|
async replayUnackedInputsFromFrame(_startFrame) {
|
|
1094
1101
|
}
|
|
1102
|
+
/**
|
|
1103
|
+
* Clear all client resources and reset state
|
|
1104
|
+
*
|
|
1105
|
+
* This method should be called to clean up all client-side resources when
|
|
1106
|
+
* shutting down or resetting the client engine. It:
|
|
1107
|
+
* - Destroys the PIXI renderer
|
|
1108
|
+
* - Stops all sounds
|
|
1109
|
+
* - Cleans up subscriptions and event listeners
|
|
1110
|
+
* - Resets scene map
|
|
1111
|
+
* - Stops ping/pong interval
|
|
1112
|
+
* - Clears prediction states
|
|
1113
|
+
*
|
|
1114
|
+
* ## Design
|
|
1115
|
+
*
|
|
1116
|
+
* This method is used primarily in testing environments to ensure clean
|
|
1117
|
+
* state between tests. In production, the client engine typically persists
|
|
1118
|
+
* for the lifetime of the application.
|
|
1119
|
+
*
|
|
1120
|
+
* @example
|
|
1121
|
+
* ```ts
|
|
1122
|
+
* // In test cleanup
|
|
1123
|
+
* afterEach(() => {
|
|
1124
|
+
* clientEngine.clear();
|
|
1125
|
+
* });
|
|
1126
|
+
* ```
|
|
1127
|
+
*/
|
|
1128
|
+
clear() {
|
|
1129
|
+
try {
|
|
1130
|
+
for (const subscription of this.tickSubscriptions) {
|
|
1131
|
+
if (subscription && typeof subscription.unsubscribe === "function") {
|
|
1132
|
+
subscription.unsubscribe();
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
this.tickSubscriptions = [];
|
|
1136
|
+
if (this.pingInterval) {
|
|
1137
|
+
clearInterval(this.pingInterval);
|
|
1138
|
+
this.pingInterval = null;
|
|
1139
|
+
}
|
|
1140
|
+
if (this.onAfterLoadingSubscription && typeof this.onAfterLoadingSubscription.unsubscribe === "function") {
|
|
1141
|
+
this.onAfterLoadingSubscription.unsubscribe();
|
|
1142
|
+
this.onAfterLoadingSubscription = void 0;
|
|
1143
|
+
}
|
|
1144
|
+
if (this.canvasElement) {
|
|
1145
|
+
try {
|
|
1146
|
+
if (typeof this.canvasElement.destroy === "function") {
|
|
1147
|
+
this.canvasElement.destroy();
|
|
1148
|
+
}
|
|
1149
|
+
this.canvasElement = void 0;
|
|
1150
|
+
} catch (error) {
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
if (this.sceneMap && typeof this.sceneMap.reset === "function") {
|
|
1154
|
+
this.sceneMap.reset();
|
|
1155
|
+
}
|
|
1156
|
+
this.stopAllSounds();
|
|
1157
|
+
if (this.resizeHandler && typeof window !== "undefined") {
|
|
1158
|
+
window.removeEventListener("resize", this.resizeHandler);
|
|
1159
|
+
this.resizeHandler = void 0;
|
|
1160
|
+
}
|
|
1161
|
+
const rendererStillExists = this.renderer && typeof this.renderer.destroy === "function";
|
|
1162
|
+
if (this.canvasApp && typeof this.canvasApp.destroy === "function") {
|
|
1163
|
+
try {
|
|
1164
|
+
if (this.canvasApp.ticker) {
|
|
1165
|
+
if (typeof this.canvasApp.ticker.stop === "function") {
|
|
1166
|
+
this.canvasApp.ticker.stop();
|
|
1167
|
+
}
|
|
1168
|
+
if (typeof this.canvasApp.ticker.removeAll === "function") {
|
|
1169
|
+
this.canvasApp.ticker.removeAll();
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
if (this.renderer && this.renderer.ticker) {
|
|
1173
|
+
if (typeof this.renderer.ticker.stop === "function") {
|
|
1174
|
+
this.renderer.ticker.stop();
|
|
1175
|
+
}
|
|
1176
|
+
if (typeof this.renderer.ticker.removeAll === "function") {
|
|
1177
|
+
this.renderer.ticker.removeAll();
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
if (this.canvasApp.canvas && this.canvasApp.canvas.parentNode) {
|
|
1181
|
+
this.canvasApp.canvas.parentNode.removeChild(this.canvasApp.canvas);
|
|
1182
|
+
}
|
|
1183
|
+
this.canvasApp.destroy(true);
|
|
1184
|
+
} catch (error) {
|
|
1185
|
+
}
|
|
1186
|
+
this.canvasApp = void 0;
|
|
1187
|
+
this.renderer = null;
|
|
1188
|
+
} else if (rendererStillExists) {
|
|
1189
|
+
try {
|
|
1190
|
+
if (this.renderer.ticker) {
|
|
1191
|
+
if (typeof this.renderer.ticker.stop === "function") {
|
|
1192
|
+
this.renderer.ticker.stop();
|
|
1193
|
+
}
|
|
1194
|
+
if (typeof this.renderer.ticker.removeAll === "function") {
|
|
1195
|
+
this.renderer.ticker.removeAll();
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
this.renderer.destroy(true);
|
|
1199
|
+
} catch (error) {
|
|
1200
|
+
}
|
|
1201
|
+
this.renderer = null;
|
|
1202
|
+
}
|
|
1203
|
+
if (this.prediction) {
|
|
1204
|
+
this.prediction = void 0;
|
|
1205
|
+
}
|
|
1206
|
+
this.playerIdSignal.set(null);
|
|
1207
|
+
this.cameraFollowTargetId.set(null);
|
|
1208
|
+
this.spriteComponentsBehind.set([]);
|
|
1209
|
+
this.spriteComponentsInFront.set([]);
|
|
1210
|
+
this.spritesheets.clear();
|
|
1211
|
+
this.sounds.clear();
|
|
1212
|
+
this.componentAnimations = [];
|
|
1213
|
+
this.particleSettings.emitters = [];
|
|
1214
|
+
this.stopProcessingInput = false;
|
|
1215
|
+
this.lastInputTime = 0;
|
|
1216
|
+
this.inputFrameCounter = 0;
|
|
1217
|
+
this.frameOffset = 0;
|
|
1218
|
+
this.rtt = 0;
|
|
1219
|
+
this.mapLoadCompleted$.next(false);
|
|
1220
|
+
this.playerIdReceived$.next(false);
|
|
1221
|
+
this.playersReceived$.next(false);
|
|
1222
|
+
this.eventsReceived$.next(false);
|
|
1223
|
+
} catch (error) {
|
|
1224
|
+
console.warn("Error during client engine cleanup:", error);
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1095
1227
|
}
|
|
1096
1228
|
|
|
1097
1229
|
export { RpgClientEngine };
|
|
1098
|
-
//# sourceMappingURL=
|
|
1230
|
+
//# sourceMappingURL=RpgClientEngine.js.map
|