@rpgjs/client 5.0.0-alpha.10 → 5.0.0-alpha.11

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.
Files changed (72) hide show
  1. package/dist/Game/Map.d.ts +4 -0
  2. package/dist/Gui/Gui.d.ts +82 -5
  3. package/dist/RpgClient.d.ts +35 -5
  4. package/dist/RpgClientEngine.d.ts +3 -0
  5. package/dist/components/gui/index.d.ts +3 -3
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +6 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/index10.js +105 -4
  10. package/dist/index10.js.map +1 -1
  11. package/dist/index11.js +20 -7
  12. package/dist/index11.js.map +1 -1
  13. package/dist/index12.js +6 -8
  14. package/dist/index12.js.map +1 -1
  15. package/dist/index13.js +9 -14
  16. package/dist/index13.js.map +1 -1
  17. package/dist/index14.js +8 -100
  18. package/dist/index14.js.map +1 -1
  19. package/dist/index15.js +141 -35
  20. package/dist/index15.js.map +1 -1
  21. package/dist/index16.js +45 -186
  22. package/dist/index16.js.map +1 -1
  23. package/dist/index17.js +229 -5
  24. package/dist/index17.js.map +1 -1
  25. package/dist/index18.js +5 -383
  26. package/dist/index18.js.map +1 -1
  27. package/dist/index19.js +384 -28
  28. package/dist/index19.js.map +1 -1
  29. package/dist/index2.js +15 -8
  30. package/dist/index2.js.map +1 -1
  31. package/dist/index20.js +31 -17
  32. package/dist/index20.js.map +1 -1
  33. package/dist/index21.js +17 -2413
  34. package/dist/index21.js.map +1 -1
  35. package/dist/index22.js +2587 -88
  36. package/dist/index22.js.map +1 -1
  37. package/dist/index23.js +108 -103
  38. package/dist/index23.js.map +1 -1
  39. package/dist/index29.js.map +1 -1
  40. package/dist/index3.js +2 -2
  41. package/dist/index30.js +14 -1
  42. package/dist/index30.js.map +1 -1
  43. package/dist/index37.js +56 -169
  44. package/dist/index37.js.map +1 -1
  45. package/dist/index38.js +162 -489
  46. package/dist/index38.js.map +1 -1
  47. package/dist/index39.js +496 -56
  48. package/dist/index39.js.map +1 -1
  49. package/dist/index4.js +2 -2
  50. package/dist/index41.js +21 -7
  51. package/dist/index41.js.map +1 -1
  52. package/dist/index5.js +1 -1
  53. package/dist/index6.js +1 -1
  54. package/dist/index7.js +1 -1
  55. package/dist/index8.js +1 -1
  56. package/dist/index9.js +105 -14
  57. package/dist/index9.js.map +1 -1
  58. package/dist/services/mmorpg.d.ts +1 -1
  59. package/dist/services/standalone.d.ts +1 -1
  60. package/package.json +7 -5
  61. package/src/Game/AnimationManager.ts +1 -0
  62. package/src/Game/Map.ts +9 -1
  63. package/src/Game/Object.ts +28 -6
  64. package/src/Gui/Gui.ts +141 -16
  65. package/src/RpgClient.ts +36 -5
  66. package/src/RpgClientEngine.ts +11 -1
  67. package/src/components/character.ce +11 -9
  68. package/src/components/gui/box.ce +17 -0
  69. package/src/components/gui/dialogbox/index.ce +1 -0
  70. package/src/components/gui/index.ts +3 -4
  71. package/src/components/scenes/event-layer.ce +6 -0
  72. package/src/index.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index39.js","sources":["../src/components/gui/dialogbox/selection.ce"],"sourcesContent":["<Container controls flexDirection=\"column\" margin={[0, 0, 0, 50]}>\n @for ((item,index) of items) { \n <ItemMenu text={@item.@text} isSelected={@selected(@index)} /> \n }\n</Container>\n\n<script>\n import { signal, computed, mount } from \"canvasengine\";\n import ItemMenu from \"./itemMenu.ce\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { inject } from \"../../../core/inject\";\n\n const {\n items,\n wrapAround,\n onSelect,\n selectedIndex,\n } = defineProps();\n\n const client = inject(RpgClientEngine);\n const keyboardControls = client.globalConfig.keyboardControls;\n\n const selected = (index) => {\n return computed(() => {\n return index === selectedIndex();\n })\n }\n\n mount((element) => {\n return () => {\n element.directives.controls.onDestroy()\n }\n })\n\n const controls = signal({\n down: {\n bind: keyboardControls.down,\n keyDown() {\n selectedIndex.update((currentIndex) => {\n if (wrapAround) {\n return (currentIndex + 1) % items().length;\n } else {\n return Math.min(currentIndex + 1, items().length - 1);\n }\n });\n },\n },\n up: {\n bind: keyboardControls.up,\n keyDown() {\n selectedIndex.update((currentIndex) => {\n if (wrapAround) {\n return (currentIndex - 1 + items().length) % items().length;\n } else {\n return Math.max(currentIndex - 1, 0);\n }\n });\n },\n },\n enter: {\n bind: keyboardControls.action,\n keyDown() {\n onSelect?.(selectedIndex());\n },\n },\n });\n</script>\n"],"names":["ItemMenu"],"mappings":";;;;;AASqB,SAAS,SAAS,CAAC,OAAO,EAAE;AACjD,QAAuB,QAAQ,CAAC,OAAO;AACvC,QAAQ,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO;AAClD,QAAQ,IAAI,EAAE,GAAG,WAAW,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,UAAU,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,EAAE,CAAC,aAAa;AACtI,IAAI,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;AACpC,IAAI,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,gBAAgB;AAC3D,IAAI,QAAQ,GAAG,UAAU,KAAK,EAAE;AAChC,IAAI,OAAO,QAAQ,CAAC,YAAY;AAChC,QAAQ,OAAO,KAAK,KAAK,aAAa,EAAE;AACxC,KAAK,CAAC;AACN,CAAC;AACD,KAAK,CAAC,UAAU,OAAO,EAAE;AACzB,IAAI,OAAO,YAAY;AACvB,QAAQ,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE;AAC/C,KAAK;AACL,CAAC,CAAC;AACF,IAAI,QAAQ,GAAG,MAAM,CAAC;AACtB,IAAI,IAAI,EAAE;AACV,QAAQ,IAAI,EAAE,gBAAgB,CAAC,IAAI;AACnC,QAAQ,OAAO,EAAE,YAAY;AAC7B,YAAY,aAAa,CAAC,MAAM,CAAC,UAAU,YAAY,EAAE;AACzD,gBAAgB,IAAI,UAAU,EAAE;AAChC,oBAAoB,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,MAAM;AAC9D;AACA,qBAAqB;AACrB,oBAAoB,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AACzE;AACA,aAAa,CAAC;AACd,SAAS;AACT,KAAK;AACL,IAAI,EAAE,EAAE;AACR,QAAQ,IAAI,EAAE,gBAAgB,CAAC,EAAE;AACjC,QAAQ,OAAO,EAAE,YAAY;AAC7B,YAAY,aAAa,CAAC,MAAM,CAAC,UAAU,YAAY,EAAE;AACzD,gBAAgB,IAAI,UAAU,EAAE;AAChC,oBAAoB,OAAO,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,MAAM;AAC/E;AACA,qBAAqB;AACrB,oBAAoB,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC;AACxD;AACA,aAAa,CAAC;AACd,SAAS;AACT,KAAK;AACL,IAAI,KAAK,EAAE;AACX,QAAQ,IAAI,EAAE,gBAAgB,CAAC,MAAM;AACrC,QAAQ,OAAO,EAAE,YAAY;AAC7B,YAAY,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;AACzF,SAAS;AACT,KAAK;AACL,CAAC,CAAC;AACF,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,CAACA,WAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC1L,QAAQ,OAAO;AACf;;;;"}
1
+ {"version":3,"file":"index39.js","sources":["../../../node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.mjs"],"sourcesContent":["// src/ws.ts\nif (!globalThis.EventTarget || !globalThis.Event) {\n console.error(`\n PartySocket requires a global 'EventTarget' class to be available!\n You can polyfill this global by adding this to your code before any partysocket imports: \n \n \\`\\`\\`\n import 'partysocket/event-target-polyfill';\n \\`\\`\\`\n Please file an issue at https://github.com/partykit/partykit if you're still having trouble.\n`);\n}\nvar ErrorEvent = class extends Event {\n message;\n error;\n // biome-ignore lint/suspicious/noExplicitAny: vibes\n constructor(error, target) {\n super(\"error\", target);\n this.message = error.message;\n this.error = error;\n }\n};\nvar CloseEvent = class extends Event {\n code;\n reason;\n wasClean = true;\n // biome-ignore lint/style/useDefaultParameterLast: legacy\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n constructor(code = 1e3, reason = \"\", target) {\n super(\"close\", target);\n this.code = code;\n this.reason = reason;\n }\n};\nvar Events = {\n Event,\n ErrorEvent,\n CloseEvent\n};\nfunction assert(condition, msg) {\n if (!condition) {\n throw new Error(msg);\n }\n}\nfunction cloneEventBrowser(e) {\n return new e.constructor(e.type, e);\n}\nfunction cloneEventNode(e) {\n if (\"data\" in e) {\n const evt2 = new MessageEvent(e.type, e);\n return evt2;\n }\n if (\"code\" in e || \"reason\" in e) {\n const evt2 = new CloseEvent(\n // @ts-expect-error we need to fix event/listener types\n e.code || 1999,\n // @ts-expect-error we need to fix event/listener types\n e.reason || \"unknown reason\",\n e\n );\n return evt2;\n }\n if (\"error\" in e) {\n const evt2 = new ErrorEvent(e.error, e);\n return evt2;\n }\n const evt = new Event(e.type, e);\n return evt;\n}\nvar _a;\nvar isNode =\n typeof process !== \"undefined\" &&\n typeof ((_a = process.versions) == null ? void 0 : _a.node) !== \"undefined\" &&\n typeof document === \"undefined\";\nvar cloneEvent = isNode ? cloneEventNode : cloneEventBrowser;\nvar DEFAULT = {\n maxReconnectionDelay: 1e4,\n minReconnectionDelay: 1e3 + Math.random() * 4e3,\n minUptime: 5e3,\n reconnectionDelayGrowFactor: 1.3,\n connectionTimeout: 4e3,\n maxRetries: Number.POSITIVE_INFINITY,\n maxEnqueuedMessages: Number.POSITIVE_INFINITY,\n startClosed: false,\n debug: false\n};\nvar didWarnAboutMissingWebSocket = false;\nvar ReconnectingWebSocket = class _ReconnectingWebSocket extends EventTarget {\n _ws;\n _retryCount = -1;\n _uptimeTimeout;\n _connectTimeout;\n _shouldReconnect = true;\n _connectLock = false;\n _binaryType = \"blob\";\n _closeCalled = false;\n _messageQueue = [];\n _debugLogger = console.log.bind(console);\n _url;\n _protocols;\n _options;\n constructor(url, protocols, options = {}) {\n super();\n this._url = url;\n this._protocols = protocols;\n this._options = options;\n if (this._options.startClosed) {\n this._shouldReconnect = false;\n }\n if (this._options.debugLogger) {\n this._debugLogger = this._options.debugLogger;\n }\n this._connect();\n }\n static get CONNECTING() {\n return 0;\n }\n static get OPEN() {\n return 1;\n }\n static get CLOSING() {\n return 2;\n }\n static get CLOSED() {\n return 3;\n }\n get CONNECTING() {\n return _ReconnectingWebSocket.CONNECTING;\n }\n get OPEN() {\n return _ReconnectingWebSocket.OPEN;\n }\n get CLOSING() {\n return _ReconnectingWebSocket.CLOSING;\n }\n get CLOSED() {\n return _ReconnectingWebSocket.CLOSED;\n }\n get binaryType() {\n return this._ws ? this._ws.binaryType : this._binaryType;\n }\n set binaryType(value) {\n this._binaryType = value;\n if (this._ws) {\n this._ws.binaryType = value;\n }\n }\n /**\n * Returns the number or connection retries\n */\n get retryCount() {\n return Math.max(this._retryCount, 0);\n }\n /**\n * The number of bytes of data that have been queued using calls to send() but not yet\n * transmitted to the network. This value resets to zero once all queued data has been sent.\n * This value does not reset to zero when the connection is closed; if you keep calling send(),\n * this will continue to climb. Read only\n */\n get bufferedAmount() {\n const bytes = this._messageQueue.reduce((acc, message) => {\n if (typeof message === \"string\") {\n acc += message.length;\n } else if (message instanceof Blob) {\n acc += message.size;\n } else {\n acc += message.byteLength;\n }\n return acc;\n }, 0);\n return bytes + (this._ws ? this._ws.bufferedAmount : 0);\n }\n /**\n * The extensions selected by the server. This is currently only the empty string or a list of\n * extensions as negotiated by the connection\n */\n get extensions() {\n return this._ws ? this._ws.extensions : \"\";\n }\n /**\n * A string indicating the name of the sub-protocol the server selected;\n * this will be one of the strings specified in the protocols parameter when creating the\n * WebSocket object\n */\n get protocol() {\n return this._ws ? this._ws.protocol : \"\";\n }\n /**\n * The current state of the connection; this is one of the Ready state constants\n */\n get readyState() {\n if (this._ws) {\n return this._ws.readyState;\n }\n return this._options.startClosed\n ? _ReconnectingWebSocket.CLOSED\n : _ReconnectingWebSocket.CONNECTING;\n }\n /**\n * The URL as resolved by the constructor\n */\n get url() {\n return this._ws ? this._ws.url : \"\";\n }\n /**\n * Whether the websocket object is now in reconnectable state\n */\n get shouldReconnect() {\n return this._shouldReconnect;\n }\n /**\n * An event listener to be called when the WebSocket connection's readyState changes to CLOSED\n */\n onclose = null;\n /**\n * An event listener to be called when an error occurs\n */\n onerror = null;\n /**\n * An event listener to be called when a message is received from the server\n */\n onmessage = null;\n /**\n * An event listener to be called when the WebSocket connection's readyState changes to OPEN;\n * this indicates that the connection is ready to send and receive data\n */\n onopen = null;\n /**\n * Closes the WebSocket connection or connection attempt, if any. If the connection is already\n * CLOSED, this method does nothing\n */\n close(code = 1e3, reason) {\n this._closeCalled = true;\n this._shouldReconnect = false;\n this._clearTimeouts();\n if (!this._ws) {\n this._debug(\"close enqueued: no ws instance\");\n return;\n }\n if (this._ws.readyState === this.CLOSED) {\n this._debug(\"close: already closed\");\n return;\n }\n this._ws.close(code, reason);\n }\n /**\n * Closes the WebSocket connection or connection attempt and connects again.\n * Resets retry counter;\n */\n reconnect(code, reason) {\n this._shouldReconnect = true;\n this._closeCalled = false;\n this._retryCount = -1;\n if (!this._ws || this._ws.readyState === this.CLOSED) {\n this._connect();\n } else {\n this._disconnect(code, reason);\n this._connect();\n }\n }\n /**\n * Enqueue specified data to be transmitted to the server over the WebSocket connection\n */\n send(data) {\n if (this._ws && this._ws.readyState === this.OPEN) {\n this._debug(\"send\", data);\n this._ws.send(data);\n } else {\n const { maxEnqueuedMessages = DEFAULT.maxEnqueuedMessages } =\n this._options;\n if (this._messageQueue.length < maxEnqueuedMessages) {\n this._debug(\"enqueue\", data);\n this._messageQueue.push(data);\n }\n }\n }\n _debug(...args) {\n if (this._options.debug) {\n this._debugLogger(\"RWS>\", ...args);\n }\n }\n _getNextDelay() {\n const {\n reconnectionDelayGrowFactor = DEFAULT.reconnectionDelayGrowFactor,\n minReconnectionDelay = DEFAULT.minReconnectionDelay,\n maxReconnectionDelay = DEFAULT.maxReconnectionDelay\n } = this._options;\n let delay = 0;\n if (this._retryCount > 0) {\n delay =\n minReconnectionDelay *\n reconnectionDelayGrowFactor ** (this._retryCount - 1);\n if (delay > maxReconnectionDelay) {\n delay = maxReconnectionDelay;\n }\n }\n this._debug(\"next delay\", delay);\n return delay;\n }\n _wait() {\n return new Promise((resolve) => {\n setTimeout(resolve, this._getNextDelay());\n });\n }\n _getNextProtocols(protocolsProvider) {\n if (!protocolsProvider) return Promise.resolve(null);\n if (\n typeof protocolsProvider === \"string\" ||\n Array.isArray(protocolsProvider)\n ) {\n return Promise.resolve(protocolsProvider);\n }\n if (typeof protocolsProvider === \"function\") {\n const protocols = protocolsProvider();\n if (!protocols) return Promise.resolve(null);\n if (typeof protocols === \"string\" || Array.isArray(protocols)) {\n return Promise.resolve(protocols);\n }\n if (protocols.then) {\n return protocols;\n }\n }\n throw Error(\"Invalid protocols\");\n }\n _getNextUrl(urlProvider) {\n if (typeof urlProvider === \"string\") {\n return Promise.resolve(urlProvider);\n }\n if (typeof urlProvider === \"function\") {\n const url = urlProvider();\n if (typeof url === \"string\") {\n return Promise.resolve(url);\n }\n if (url.then) {\n return url;\n }\n }\n throw Error(\"Invalid URL\");\n }\n _connect() {\n if (this._connectLock || !this._shouldReconnect) {\n return;\n }\n this._connectLock = true;\n const {\n maxRetries = DEFAULT.maxRetries,\n connectionTimeout = DEFAULT.connectionTimeout\n } = this._options;\n if (this._retryCount >= maxRetries) {\n this._debug(\"max retries reached\", this._retryCount, \">=\", maxRetries);\n return;\n }\n this._retryCount++;\n this._debug(\"connect\", this._retryCount);\n this._removeListeners();\n this._wait()\n .then(() =>\n Promise.all([\n this._getNextUrl(this._url),\n this._getNextProtocols(this._protocols || null)\n ])\n )\n .then(([url, protocols]) => {\n if (this._closeCalled) {\n this._connectLock = false;\n return;\n }\n if (\n !this._options.WebSocket &&\n typeof WebSocket === \"undefined\" &&\n !didWarnAboutMissingWebSocket\n ) {\n console.error(`\\u203C\\uFE0F No WebSocket implementation available. You should define options.WebSocket. \n\nFor example, if you're using node.js, run \\`npm install ws\\`, and then in your code:\n\nimport PartySocket from 'partysocket';\nimport WS from 'ws';\n\nconst partysocket = new PartySocket({\n host: \"127.0.0.1:1999\",\n room: \"test-room\",\n WebSocket: WS\n});\n\n`);\n didWarnAboutMissingWebSocket = true;\n }\n const WS = this._options.WebSocket || WebSocket;\n this._debug(\"connect\", { url, protocols });\n this._ws = protocols ? new WS(url, protocols) : new WS(url);\n this._ws.binaryType = this._binaryType;\n this._connectLock = false;\n this._addListeners();\n this._connectTimeout = setTimeout(\n () => this._handleTimeout(),\n connectionTimeout\n );\n })\n .catch((err) => {\n this._connectLock = false;\n this._handleError(new Events.ErrorEvent(Error(err.message), this));\n });\n }\n _handleTimeout() {\n this._debug(\"timeout event\");\n this._handleError(new Events.ErrorEvent(Error(\"TIMEOUT\"), this));\n }\n _disconnect(code = 1e3, reason) {\n this._clearTimeouts();\n if (!this._ws) {\n return;\n }\n this._removeListeners();\n try {\n if (this._ws.readyState === this.OPEN) {\n this._ws.close(code, reason);\n }\n this._handleClose(new Events.CloseEvent(code, reason, this));\n } catch (error) {}\n }\n _acceptOpen() {\n this._debug(\"accept open\");\n this._retryCount = 0;\n }\n _handleOpen = (event) => {\n this._debug(\"open event\");\n const { minUptime = DEFAULT.minUptime } = this._options;\n clearTimeout(this._connectTimeout);\n this._uptimeTimeout = setTimeout(() => this._acceptOpen(), minUptime);\n assert(this._ws, \"WebSocket is not defined\");\n this._ws.binaryType = this._binaryType;\n this._messageQueue.forEach((message) => {\n var _a2;\n return (_a2 = this._ws) == null ? void 0 : _a2.send(message);\n });\n this._messageQueue = [];\n if (this.onopen) {\n this.onopen(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _handleMessage = (event) => {\n this._debug(\"message event\");\n if (this.onmessage) {\n this.onmessage(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _handleError = (event) => {\n this._debug(\"error event\", event.message);\n this._disconnect(void 0, event.message === \"TIMEOUT\" ? \"timeout\" : void 0);\n if (this.onerror) {\n this.onerror(event);\n }\n this._debug(\"exec error listeners\");\n this.dispatchEvent(cloneEvent(event));\n this._connect();\n };\n _handleClose = (event) => {\n this._debug(\"close event\");\n this._clearTimeouts();\n if (this._shouldReconnect) {\n this._connect();\n }\n if (this.onclose) {\n this.onclose(event);\n }\n this.dispatchEvent(cloneEvent(event));\n };\n _removeListeners() {\n if (!this._ws) {\n return;\n }\n this._debug(\"removeListeners\");\n this._ws.removeEventListener(\"open\", this._handleOpen);\n this._ws.removeEventListener(\"close\", this._handleClose);\n this._ws.removeEventListener(\"message\", this._handleMessage);\n this._ws.removeEventListener(\"error\", this._handleError);\n }\n _addListeners() {\n if (!this._ws) {\n return;\n }\n this._debug(\"addListeners\");\n this._ws.addEventListener(\"open\", this._handleOpen);\n this._ws.addEventListener(\"close\", this._handleClose);\n this._ws.addEventListener(\"message\", this._handleMessage);\n this._ws.addEventListener(\"error\", this._handleError);\n }\n _clearTimeouts() {\n clearTimeout(this._connectTimeout);\n clearTimeout(this._uptimeTimeout);\n }\n};\n\nexport { ErrorEvent, CloseEvent, ReconnectingWebSocket };\n/*!\n * Reconnecting WebSocket\n * by Pedro Ladaria <pedro.ladaria@gmail.com>\n * https://github.com/pladaria/reconnecting-websocket\n * License MIT\n */\n//# sourceMappingURL=chunk-S74YV6PU.mjs.map\n"],"names":[],"mappings":"AAAA;AACA,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AAClD,EAAE,OAAO,CAAC,KAAK,CAAC;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;AACF;AACG,IAAC,UAAU,GAAG,cAAc,KAAK,CAAC;AACrC,EAAE,OAAO;AACT,EAAE,KAAK;AACP;AACA,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE;AAC7B,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;AAC1B,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAChC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK;AACtB;AACA;AACG,IAAC,UAAU,GAAG,cAAc,KAAK,CAAC;AACrC,EAAE,IAAI;AACN,EAAE,MAAM;AACR,EAAE,QAAQ,GAAG,IAAI;AACjB;AACA;AACA,EAAE,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,EAAE;AAC/C,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;AAC1B,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI;AACpB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB;AACA;AACA,IAAI,MAAM,GAAG;AACb,EAAE,KAAK;AACP,EAAE,UAAU;AACZ,EAAE;AACF,CAAC;AACD,SAAS,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE;AAChC,EAAE,IAAI,CAAC,SAAS,EAAE;AAClB,IAAI,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC;AACxB;AACA;AACA,SAAS,iBAAiB,CAAC,CAAC,EAAE;AAC9B,EAAE,OAAO,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC;AACA,SAAS,cAAc,CAAC,CAAC,EAAE;AAC3B,EAAE,IAAI,MAAM,IAAI,CAAC,EAAE;AACnB,IAAI,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5C,IAAI,OAAO,IAAI;AACf;AACA,EAAE,IAAI,MAAM,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE;AACpC,IAAI,MAAM,IAAI,GAAG,IAAI,UAAU;AAC/B;AACA,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI;AACpB;AACA,MAAM,CAAC,CAAC,MAAM,IAAI,gBAAgB;AAClC,MAAM;AACN,KAAK;AACL,IAAI,OAAO,IAAI;AACf;AACA,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE;AACpB,IAAI,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3C,IAAI,OAAO,IAAI;AACf;AACA,EAAE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAClC,EAAE,OAAO,GAAG;AACZ;AACA,IAAI,EAAE;AACN,IAAI,MAAM;AACV,EAAE,OAAO,OAAO,KAAK,WAAW;AAChC,EAAE,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,WAAW;AAC7E,EAAE,OAAO,QAAQ,KAAK,WAAW;AACjC,IAAI,UAAU,GAAG,MAAM,GAAG,cAAc,GAAG,iBAAiB;AAC5D,IAAI,OAAO,GAAG;AACd,EAAE,oBAAoB,EAAE,GAAG;AAC3B,EAAE,oBAAoB,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG;AACjD,EAAE,SAAS,EAAE,GAAG;AAChB,EAAE,2BAA2B,EAAE,GAAG;AAClC,EAAE,iBAAiB,EAAE,GAAG;AACxB,EAAE,UAAU,EAAE,MAAM,CAAC,iBAAiB;AACtC,EAAE,mBAAmB,EAAE,MAAM,CAAC,iBAG9B,CAAC;AACD,IAAI,4BAA4B,GAAG,KAAK;AACrC,IAAC,qBAAqB,GAAG,MAAM,sBAAsB,SAAS,WAAW,CAAC;AAC7E,EAAE,GAAG;AACL,EAAE,WAAW,GAAG,EAAE;AAClB,EAAE,cAAc;AAChB,EAAE,eAAe;AACjB,EAAE,gBAAgB,GAAG,IAAI;AACzB,EAAE,YAAY,GAAG,KAAK;AACtB,EAAE,WAAW,GAAG,MAAM;AACtB,EAAE,YAAY,GAAG,KAAK;AACtB,EAAE,aAAa,GAAG,EAAE;AACpB,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1C,EAAE,IAAI;AACN,EAAE,UAAU;AACZ,EAAE,QAAQ;AACV,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,GAAG,EAAE,EAAE;AAC5C,IAAI,KAAK,EAAE;AACX,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG;AACnB,IAAI,IAAI,CAAC,UAAU,GAAG,SAAS;AAC/B,IAAI,IAAI,CAAC,QAAQ,GAAG,OAAO;AAC3B,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AACnC,MAAM,IAAI,CAAC,gBAAgB,GAAG,KAAK;AACnC;AACA,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AACnC,MAAM,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AACnD;AACA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB;AACA,EAAE,WAAW,UAAU,GAAG;AAC1B,IAAI,OAAO,CAAC;AACZ;AACA,EAAE,WAAW,IAAI,GAAG;AACpB,IAAI,OAAO,CAAC;AACZ;AACA,EAAE,WAAW,OAAO,GAAG;AACvB,IAAI,OAAO,CAAC;AACZ;AACA,EAAE,WAAW,MAAM,GAAG;AACtB,IAAI,OAAO,CAAC;AACZ;AACA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,OAAO,sBAAsB,CAAC,UAAU;AAC5C;AACA,EAAE,IAAI,IAAI,GAAG;AACb,IAAI,OAAO,sBAAsB,CAAC,IAAI;AACtC;AACA,EAAE,IAAI,OAAO,GAAG;AAChB,IAAI,OAAO,sBAAsB,CAAC,OAAO;AACzC;AACA,EAAE,IAAI,MAAM,GAAG;AACf,IAAI,OAAO,sBAAsB,CAAC,MAAM;AACxC;AACA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AAC5D;AACA,EAAE,IAAI,UAAU,CAAC,KAAK,EAAE;AACxB,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK;AAC5B,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;AAClB,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK;AACjC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,cAAc,GAAG;AACvB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK;AAC9D,MAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACvC,QAAQ,GAAG,IAAI,OAAO,CAAC,MAAM;AAC7B,OAAO,MAAM,IAAI,OAAO,YAAY,IAAI,EAAE;AAC1C,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI;AAC3B,OAAO,MAAM;AACb,QAAQ,GAAG,IAAI,OAAO,CAAC,UAAU;AACjC;AACA,MAAM,OAAO,GAAG;AAChB,KAAK,EAAE,CAAC,CAAC;AACT,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;AAC3D;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,QAAQ,GAAG;AACjB,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE;AAC5C;AACA;AACA;AACA;AACA,EAAE,IAAI,UAAU,GAAG;AACnB,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE;AAClB,MAAM,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU;AAChC;AACA,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC;AACzB,QAAQ,sBAAsB,CAAC;AAC/B,QAAQ,sBAAsB,CAAC,UAAU;AACzC;AACA;AACA;AACA;AACA,EAAE,IAAI,GAAG,GAAG;AACZ,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;AACvC;AACA;AACA;AACA;AACA,EAAE,IAAI,eAAe,GAAG;AACxB,IAAI,OAAO,IAAI,CAAC,gBAAgB;AAChC;AACA;AACA;AACA;AACA,EAAE,OAAO,GAAG,IAAI;AAChB;AACA;AACA;AACA,EAAE,OAAO,GAAG,IAAI;AAChB;AACA;AACA;AACA,EAAE,SAAS,GAAG,IAAI;AAClB;AACA;AACA;AACA;AACA,EAAE,MAAM,GAAG,IAAI;AACf;AACA;AACA;AACA;AACA,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,EAAE;AAC5B,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI;AAC5B,IAAI,IAAI,CAAC,gBAAgB,GAAG,KAAK;AACjC,IAAI,IAAI,CAAC,cAAc,EAAE;AACzB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACnB,MAAM,IAAI,CAAC,MAAM,CAAC,gCAAgC,CAAC;AACnD,MAAM;AACN;AACA,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE;AAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC;AAC1C,MAAM;AACN;AACA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;AAChC;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE;AAC1B,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAChC,IAAI,IAAI,CAAC,YAAY,GAAG,KAAK;AAC7B,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE;AACzB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE;AAC1D,MAAM,IAAI,CAAC,QAAQ,EAAE;AACrB,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;AACpC,MAAM,IAAI,CAAC,QAAQ,EAAE;AACrB;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,IAAI,EAAE;AACb,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE;AACvD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;AAC/B,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,KAAK,MAAM;AACX,MAAM,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,EAAE;AACjE,QAAQ,IAAI,CAAC,QAAQ;AACrB,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,mBAAmB,EAAE;AAC3D,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;AACpC,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC;AACA;AACA;AACA,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;AAClB,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AACxC;AACA;AACA,EAAE,aAAa,GAAG;AAClB,IAAI,MAAM;AACV,MAAM,2BAA2B,GAAG,OAAO,CAAC,2BAA2B;AACvE,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB;AACzD,MAAM,oBAAoB,GAAG,OAAO,CAAC;AACrC,KAAK,GAAG,IAAI,CAAC,QAAQ;AACrB,IAAI,IAAI,KAAK,GAAG,CAAC;AACjB,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;AAC9B,MAAM,KAAK;AACX,QAAQ,oBAAoB;AAC5B,QAAQ,2BAA2B,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;AAC7D,MAAM,IAAI,KAAK,GAAG,oBAAoB,EAAE;AACxC,QAAQ,KAAK,GAAG,oBAAoB;AACpC;AACA;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC;AACpC,IAAI,OAAO,KAAK;AAChB;AACA,EAAE,KAAK,GAAG;AACV,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK;AACpC,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC/C,KAAK,CAAC;AACN;AACA,EAAE,iBAAiB,CAAC,iBAAiB,EAAE;AACvC,IAAI,IAAI,CAAC,iBAAiB,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;AACxD,IAAI;AACJ,MAAM,OAAO,iBAAiB,KAAK,QAAQ;AAC3C,MAAM,KAAK,CAAC,OAAO,CAAC,iBAAiB;AACrC,MAAM;AACN,MAAM,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;AAC/C;AACA,IAAI,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;AACjD,MAAM,MAAM,SAAS,GAAG,iBAAiB,EAAE;AAC3C,MAAM,IAAI,CAAC,SAAS,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;AAClD,MAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AACrE,QAAQ,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;AACzC;AACA,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE;AAC1B,QAAQ,OAAO,SAAS;AACxB;AACA;AACA,IAAI,MAAM,KAAK,CAAC,mBAAmB,CAAC;AACpC;AACA,EAAE,WAAW,CAAC,WAAW,EAAE;AAC3B,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACzC,MAAM,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;AACzC;AACA,IAAI,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE;AAC3C,MAAM,MAAM,GAAG,GAAG,WAAW,EAAE;AAC/B,MAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACnC,QAAQ,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;AACnC;AACA,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE;AACpB,QAAQ,OAAO,GAAG;AAClB;AACA;AACA,IAAI,MAAM,KAAK,CAAC,aAAa,CAAC;AAC9B;AACA,EAAE,QAAQ,GAAG;AACb,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACrD,MAAM;AACN;AACA,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI;AAC5B,IAAI,MAAM;AACV,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;AACrC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,KAAK,GAAG,IAAI,CAAC,QAAQ;AACrB,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,UAAU,EAAE;AACxC,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC;AAC5E,MAAM;AACN;AACA,IAAI,IAAI,CAAC,WAAW,EAAE;AACtB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;AAC5C,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC3B,IAAI,IAAI,CAAC,KAAK;AACd,OAAO,IAAI,CAAC;AACZ,QAAQ,OAAO,CAAC,GAAG,CAAC;AACpB,UAAU,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,UAAU,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI;AACxD,SAAS;AACT;AACA,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK;AAClC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;AAC/B,UAAU,IAAI,CAAC,YAAY,GAAG,KAAK;AACnC,UAAU;AACV;AACA,QAAQ;AACR,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;AAClC,UAAU,OAAO,SAAS,KAAK,WAAW;AAC1C,UAAU,CAAC;AACX,UAAU;AACV,UAAU,OAAO,CAAC,KAAK,CAAC,CAAC;;AAEzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,CAAC,CAAC;AACF,UAAU,4BAA4B,GAAG,IAAI;AAC7C;AACA,QAAQ,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS;AACvD,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAClD,QAAQ,IAAI,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC;AACnE,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AAC9C,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK;AACjC,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC5B,QAAQ,IAAI,CAAC,eAAe,GAAG,UAAU;AACzC,UAAU,MAAM,IAAI,CAAC,cAAc,EAAE;AACrC,UAAU;AACV,SAAS;AACT,OAAO;AACP,OAAO,KAAK,CAAC,CAAC,GAAG,KAAK;AACtB,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK;AACjC,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AAC1E,OAAO,CAAC;AACR;AACA,EAAE,cAAc,GAAG;AACnB,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AAChC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE;AACA,EAAE,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE,MAAM,EAAE;AAClC,IAAI,IAAI,CAAC,cAAc,EAAE;AACzB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACnB,MAAM;AACN;AACA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC3B,IAAI,IAAI;AACR,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE;AAC7C,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;AACpC;AACA,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAClE,KAAK,CAAC,OAAO,KAAK,EAAE;AACpB;AACA,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;AAC9B,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC;AACxB;AACA,EAAE,WAAW,GAAG,CAAC,KAAK,KAAK;AAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;AAC7B,IAAI,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ;AAC3D,IAAI,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AACtC,IAAI,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC;AACzE,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,0BAA0B,CAAC;AAChD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK;AAC5C,MAAM,IAAI,GAAG;AACb,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;AAClE,KAAK,CAAC;AACN,IAAI,IAAI,CAAC,aAAa,GAAG,EAAE;AAC3B,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AACrB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB;AACA,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,GAAG;AACH,EAAE,cAAc,GAAG,CAAC,KAAK,KAAK;AAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AAChC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC3B;AACA,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,GAAG;AACH,EAAE,YAAY,GAAG,CAAC,KAAK,KAAK;AAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC;AAC7C,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAC9E,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;AACtB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACzB;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;AACvC,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,GAAG;AACH,EAAE,YAAY,GAAG,CAAC,KAAK,KAAK;AAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;AAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;AACzB,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC/B,MAAM,IAAI,CAAC,QAAQ,EAAE;AACrB;AACA,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;AACtB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACzB;AACA,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,GAAG;AACH,EAAE,gBAAgB,GAAG;AACrB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACnB,MAAM;AACN;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAClC,IAAI,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;AAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;AAChE,IAAI,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AAC5D;AACA,EAAE,aAAa,GAAG;AAClB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACnB,MAAM;AACN;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;AACvD,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AACzD,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC;AAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AACzD;AACA,EAAE,cAAc,GAAG;AACnB,IAAI,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AACtC,IAAI,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACrC;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;;;;","x_google_ignoreList":[0]}
package/dist/index4.js CHANGED
@@ -1,7 +1,7 @@
1
- import { connectionRoom } from './index22.js';
1
+ import { connectionRoom } from './index23.js';
2
2
  import { RpgGui } from './index9.js';
3
3
  import { RpgClientEngine } from './index2.js';
4
- import { WebSocketToken, AbstractWebsocket } from './index17.js';
4
+ import { WebSocketToken, AbstractWebsocket } from './index18.js';
5
5
  import { UpdateMapToken, UpdateMapService } from '@rpgjs/common';
6
6
 
7
7
  class BridgeWebsocket extends AbstractWebsocket {
package/dist/index41.js CHANGED
@@ -1,20 +1,30 @@
1
- import { RpgCommonPlayer } from '@rpgjs/common';
1
+ import { RpgCommonPlayer, ModulesToken } from '@rpgjs/common';
2
2
  import { trigger, signal } from 'canvasengine';
3
+ import { inject } from './index6.js';
4
+ import { RpgClientEngine } from './index2.js';
3
5
 
4
6
  class RpgClientObject extends RpgCommonPlayer {
5
7
  constructor() {
6
- super(...arguments);
8
+ super();
7
9
  this.emitParticleTrigger = trigger();
8
10
  this.particleName = signal("");
9
11
  this.animationCurrentIndex = signal(0);
10
12
  this.animationIsPlaying = signal(false);
13
+ this._param = signal({});
14
+ this.hooks.callHooks("client-sprite-onInit", this).subscribe();
15
+ }
16
+ get hooks() {
17
+ return inject(ModulesToken);
11
18
  }
12
19
  flash(color, duration = 100) {
13
- const lastTint = this.tint();
14
- this.tint.set(color);
15
- setTimeout(() => {
16
- this.tint.set(lastTint);
17
- }, duration);
20
+ return new Promise((resolve) => {
21
+ const lastTint = this.tint();
22
+ this.tint.set(color);
23
+ setTimeout(() => {
24
+ this.tint.set(lastTint);
25
+ resolve(true);
26
+ }, duration);
27
+ });
18
28
  }
19
29
  /**
20
30
  * Reset animation state when animation changes externally
@@ -76,6 +86,10 @@ class RpgClientObject extends RpgCommonPlayer {
76
86
  });
77
87
  this.animationName.set(animationName);
78
88
  }
89
+ showComponentAnimation(id, params) {
90
+ const engine = inject(RpgClientEngine);
91
+ engine.getComponentAnimation(id).displayEffect(params, this);
92
+ }
79
93
  }
80
94
 
81
95
  export { RpgClientObject };
@@ -1 +1 @@
1
- {"version":3,"file":"index41.js","sources":["../src/Game/Object.ts"],"sourcesContent":["import { RpgCommonPlayer } from \"@rpgjs/common\";\nimport { trigger, signal } from \"canvasengine\";\nimport { Subscription } from \"rxjs\";\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 private animationSubscription?: Subscription\n\n flash(color: string, duration: number = 100) {\n const lastTint = this.tint()\n this.tint.set(color);\n setTimeout(() => {\n this.tint.set(lastTint)\n }, duration)\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 = 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} "],"names":[],"mappings":";;;AAIO,MAAe,wBAAwB,eAAgB,CAAA;AAAA,EAAvD,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEL,IAAA,IAAA,CAAA,mBAAA,GAAsB,OAAQ,EAAA;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;AAAA;AAAA,EAGjC,KAAA,CAAM,KAAe,EAAA,QAAA,GAAmB,GAAK,EAAA;AAC3C,IAAM,MAAA,QAAA,GAAW,KAAK,IAAK,EAAA;AAC3B,IAAK,IAAA,CAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACnB,IAAA,UAAA,CAAW,MAAM;AACf,MAAK,IAAA,CAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,OACrB,QAAQ,CAAA;AAAA;AACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,mBAAsB,GAAA;AACpB,IAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACjC,IAAK,IAAA,CAAA,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAChC,IAAA,IAAI,KAAK,qBAAuB,EAAA;AAC9B,MAAA,IAAA,CAAK,sBAAsB,WAAY,EAAA;AACvC,MAAA,IAAA,CAAK,qBAAwB,GAAA,MAAA;AAAA;AAC/B;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,YAAA,CAAa,aAAuB,EAAA,OAAA,GAAkB,QAAU,EAAA;AAC9D,IAAI,IAAA,IAAA,CAAK,oBAAsB,EAAA;AAC/B,IAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,IAAI,CAAA;AAChC,IAAM,MAAA,qBAAA,GAAwB,KAAK,aAAc,EAAA;AACjD,IAAK,IAAA,CAAA,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAGhC,IAAA,IAAI,KAAK,qBAAuB,EAAA;AAC9B,MAAA,IAAA,CAAK,sBAAsB,WAAY,EAAA;AAAA;AAGzC,IAAA,IAAA,CAAK,qBAAwB,GAAA,IAAA,CAAK,qBAAsB,CAAA,UAAA,CAAW,UAAU,CAAS,KAAA,KAAA;AACpF,MAAA,IAAI,SAAS,OAAS,EAAA;AACpB,QAAK,IAAA,CAAA,qBAAA,CAAsB,IAAI,CAAC,CAAA;AAChC,QAAK,IAAA,CAAA,aAAA,CAAc,IAAI,qBAAqB,CAAA;AAC5C,QAAK,IAAA,CAAA,kBAAA,CAAmB,IAAI,KAAK,CAAA;AACjC,QAAA,IAAI,KAAK,qBAAuB,EAAA;AAC9B,UAAA,IAAA,CAAK,sBAAsB,WAAY,EAAA;AACvC,UAAA,IAAA,CAAK,qBAAwB,GAAA,MAAA;AAAA;AAC/B;AACF,KACD,CAAA;AACD,IAAK,IAAA,CAAA,aAAA,CAAc,IAAI,aAAa,CAAA;AAAA;AAExC;;;;"}
1
+ {"version":3,"file":"index41.js","sources":["../src/Game/Object.ts"],"sourcesContent":["import { Hooks, ModulesToken, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { sync } from \"@signe/sync\";\nimport { trigger, signal } from \"canvasengine\";\nimport { Subscription } from \"rxjs\";\nimport { inject } from \"../core/inject\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\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\n constructor() {\n super()\n this.hooks.callHooks(\"client-sprite-onInit\", this).subscribe();\n }\n\n get hooks() {\n return inject<Hooks>(ModulesToken);\n }\n \n private animationSubscription?: Subscription\n\n flash(color: string, duration: number = 100) {\n return new Promise((resolve) => {\n const lastTint = this.tint()\n this.tint.set(color);\n setTimeout(() => {\n this.tint.set(lastTint)\n resolve(true)\n }, duration)\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 = 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} "],"names":[],"mappings":"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"}
package/dist/index5.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Context, injector, inject } from './index16.js';
1
+ import { Context, injector, inject } from './index17.js';
2
2
  import { RpgClientEngine } from './index2.js';
3
3
  import { setInject } from './index6.js';
4
4
 
package/dist/index6.js CHANGED
@@ -1,4 +1,4 @@
1
- import { inject as inject$1 } from './index16.js';
1
+ import { inject as inject$1 } from './index17.js';
2
2
 
3
3
  let context = null;
4
4
  function inject(service, _context) {
package/dist/index7.js CHANGED
@@ -1,4 +1,4 @@
1
- import { inject } from './index16.js';
1
+ import { inject } from './index17.js';
2
2
  import { UpdateMapToken } from '@rpgjs/common';
3
3
 
4
4
  const LoadMapToken = "LoadMapToken";
package/dist/index8.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { provideModules, findModules } from '@rpgjs/common';
2
- import { inject } from './index16.js';
2
+ import { inject } from './index17.js';
3
3
  import { RpgGui } from './index9.js';
4
4
 
5
5
  function provideClientModules(modules) {
package/dist/index9.js CHANGED
@@ -1,7 +1,15 @@
1
- import { inject } from './index16.js';
1
+ import { inject } from './index17.js';
2
2
  import { signal } from 'canvasengine';
3
- import { WebSocketToken } from './index17.js';
4
- import { PrebuiltGui } from './index10.js';
3
+ import { WebSocketToken } from './index18.js';
4
+ import component from './index10.js';
5
+ import { combineLatest } from 'rxjs';
6
+ import '@rpgjs/common';
7
+ import './index19.js';
8
+ import './index20.js';
9
+ import 'pixi.js';
10
+ import './index22.js';
11
+ import './index23.js';
12
+ import '@canvasengine/presets';
5
13
 
6
14
  const throwError = (id) => {
7
15
  throw `The GUI named ${id} is non-existent. Please add the component in the gui property of the decorator @RpgClient`;
@@ -13,7 +21,7 @@ class RpgGui {
13
21
  this.webSocket = inject(context, WebSocketToken);
14
22
  this.add({
15
23
  name: "rpg-dialog",
16
- component: PrebuiltGui.Dialogbox
24
+ component: component
17
25
  });
18
26
  }
19
27
  async _initialize() {
@@ -37,18 +45,47 @@ class RpgGui {
37
45
  data
38
46
  });
39
47
  }
48
+ /**
49
+ * Add a GUI component to the system
50
+ *
51
+ * @param gui - GUI configuration options
52
+ * @param gui.name - Name or ID of the GUI component
53
+ * @param gui.id - Alternative ID if name is not provided
54
+ * @param gui.component - The component to render
55
+ * @param gui.display - Initial display state (default: false)
56
+ * @param gui.data - Initial data for the component
57
+ * @param gui.autoDisplay - Auto display when added (default: false)
58
+ * @param gui.dependencies - Function returning Signal dependencies
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * gui.add({
63
+ * name: 'inventory',
64
+ * component: InventoryComponent,
65
+ * autoDisplay: true,
66
+ * dependencies: () => [playerSignal, inventorySignal]
67
+ * });
68
+ * ```
69
+ */
40
70
  add(gui) {
41
- this.gui()[gui.name] = {
42
- name: gui.name,
71
+ const guiId = gui.name || gui.id;
72
+ if (!guiId) {
73
+ throw new Error("GUI must have a name or id");
74
+ }
75
+ const guiInstance = {
76
+ name: guiId,
43
77
  component: gui.component,
44
78
  display: signal(gui.display || false),
45
- data: signal(gui.data || {})
79
+ data: signal(gui.data || {}),
80
+ autoDisplay: gui.autoDisplay || false,
81
+ dependencies: gui.dependencies
46
82
  };
83
+ this.gui()[guiId] = guiInstance;
84
+ if (guiInstance.autoDisplay) {
85
+ this.display(guiId);
86
+ }
47
87
  }
48
88
  get(id) {
49
- if (typeof id != "string") {
50
- id = id.name;
51
- }
52
89
  return this.gui()[id];
53
90
  }
54
91
  exists(id) {
@@ -57,18 +94,72 @@ class RpgGui {
57
94
  getAll() {
58
95
  return this.gui();
59
96
  }
60
- display(id, data = {}) {
97
+ /**
98
+ * Display a GUI component
99
+ *
100
+ * Displays the GUI immediately if no dependencies are configured,
101
+ * or waits for all dependencies to be resolved if dependencies are present.
102
+ * Automatically manages subscriptions to prevent memory leaks.
103
+ *
104
+ * @param id - The GUI component ID
105
+ * @param data - Data to pass to the component
106
+ * @param dependencies - Optional runtime dependencies (overrides config dependencies)
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * // Display immediately
111
+ * gui.display('inventory', { items: [] });
112
+ *
113
+ * // Display with runtime dependencies
114
+ * gui.display('shop', { shopId: 1 }, [playerSignal, shopSignal]);
115
+ * ```
116
+ */
117
+ display(id, data = {}, dependencies = []) {
61
118
  if (!this.exists(id)) {
62
119
  throw throwError(id);
63
120
  }
64
- this.get(id).data.set(data);
65
- this.get(id).display.set(true);
121
+ const guiInstance = this.get(id);
122
+ if (guiInstance.subscription) {
123
+ guiInstance.subscription.unsubscribe();
124
+ guiInstance.subscription = void 0;
125
+ }
126
+ const deps = dependencies.length > 0 ? dependencies : guiInstance.dependencies ? guiInstance.dependencies() : [];
127
+ if (deps.length > 0) {
128
+ guiInstance.subscription = combineLatest(
129
+ deps.map((dependency) => dependency.observable)
130
+ ).subscribe((values) => {
131
+ if (values.every((value) => value !== void 0)) {
132
+ guiInstance.data.set(data);
133
+ guiInstance.display.set(true);
134
+ }
135
+ });
136
+ return;
137
+ }
138
+ guiInstance.data.set(data);
139
+ guiInstance.display.set(true);
66
140
  }
141
+ /**
142
+ * Hide a GUI component
143
+ *
144
+ * Hides the GUI and cleans up any active subscriptions.
145
+ *
146
+ * @param id - The GUI component ID
147
+ *
148
+ * @example
149
+ * ```ts
150
+ * gui.hide('inventory');
151
+ * ```
152
+ */
67
153
  hide(id) {
68
154
  if (!this.exists(id)) {
69
155
  throw throwError(id);
70
156
  }
71
- this.get(id).display.set(false);
157
+ const guiInstance = this.get(id);
158
+ if (guiInstance.subscription) {
159
+ guiInstance.subscription.unsubscribe();
160
+ guiInstance.subscription = void 0;
161
+ }
162
+ guiInstance.display.set(false);
72
163
  }
73
164
  }
74
165
 
@@ -1 +1 @@
1
- {"version":3,"file":"index9.js","sources":["../src/Gui/Gui.ts"],"sourcesContent":["import { Context, inject } from \"@signe/di\";\nimport { signal } from \"canvasengine\";\nimport { AbstractWebsocket, WebSocketToken } from \"../services/AbstractSocket\";\nimport { PrebuiltGui } from \"../components/gui\";\n\ninterface GuiOptions {\n name: string;\n component: any;\n display?: boolean;\n data?: any;\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<any>({});\n\n constructor(private context: Context) {\n this.webSocket = inject(context, WebSocketToken);\n this.add({\n name: \"rpg-dialog\",\n component: PrebuiltGui.Dialogbox,\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 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 add(gui: GuiOptions) {\n this.gui()[gui.name] = {\n name: gui.name,\n component: gui.component,\n display: signal(gui.display || false),\n data: signal(gui.data || {}),\n };\n }\n\n get(id: string | GuiOptions) {\n if (typeof id != \"string\") {\n id = id.name;\n }\n return this.gui()[id];\n }\n\n exists(id: string): boolean {\n return !!this.get(id);\n }\n\n getAll() {\n return this.gui();\n }\n\n display(id: string, data = {}) {\n if (!this.exists(id)) {\n throw throwError(id);\n }\n this.get(id).data.set(data);\n this.get(id).display.set(true);\n }\n\n hide(id: string) {\n if (!this.exists(id)) {\n throw throwError(id);\n }\n this.get(id).display.set(false);\n }\n}\n"],"names":[],"mappings":"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"}
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\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}\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\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 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 * @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\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 * \n * @example\n * ```ts\n * gui.add({\n * name: 'inventory',\n * component: InventoryComponent,\n * autoDisplay: true,\n * dependencies: () => [playerSignal, inventorySignal]\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\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,\n };\n\n this.gui()[guiId] = guiInstance;\n\n // Auto display if enabled\n if (guiInstance.autoDisplay) {\n this.display(guiId);\n }\n }\n\n get(id: string): GuiInstance | undefined {\n return this.gui()[id];\n }\n\n exists(id: string): boolean {\n return !!this.get(id);\n }\n\n getAll(): Record<string, GuiInstance> {\n return this.gui();\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 * \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 // 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 }\n });\n return;\n }\n\n // No dependencies, display immediately\n guiInstance.data.set(data);\n guiInstance.display.set(true);\n }\n\n /**\n * Hide a GUI component\n * \n * Hides the GUI and cleans up any active subscriptions.\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}\n"],"names":["DialogboxComponent"],"mappings":"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"}
@@ -26,7 +26,7 @@ declare class UpdateMapStandaloneService extends UpdateMapService {
26
26
  constructor(context: Context, options: MmorpgOptions);
27
27
  update(map: any): Promise<void>;
28
28
  }
29
- export declare function provideMmorpg(options: MmorpgOptions): (typeof RpgGui | typeof RpgClientEngine | {
29
+ export declare function provideMmorpg(options: MmorpgOptions): (typeof RpgClientEngine | typeof RpgGui | {
30
30
  provide: string;
31
31
  useFactory: (context: Context) => BridgeWebsocket;
32
32
  } | {
@@ -22,7 +22,7 @@ declare class UpdateMapStandaloneService extends UpdateMapService {
22
22
  private server;
23
23
  update(mapId: string, map: any): Promise<void>;
24
24
  }
25
- export declare function provideRpg(server: any): (typeof RpgGui | typeof RpgClientEngine | {
25
+ export declare function provideRpg(server: any): (typeof RpgClientEngine | typeof RpgGui | {
26
26
  provide: string;
27
27
  useFactory: (context: Context) => BridgeWebsocket;
28
28
  useClass?: undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpgjs/client",
3
- "version": "5.0.0-alpha.10",
3
+ "version": "5.0.0-alpha.11",
4
4
  "description": "RPGJS is a framework for creating RPG/MMORPG games",
5
5
  "main": "dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -22,10 +22,12 @@
22
22
  "pixi.js": "^8.9.2"
23
23
  },
24
24
  "dependencies": {
25
- "@rpgjs/common": "5.0.0-alpha.10",
26
- "@signe/di": "^2.3.3",
27
- "@signe/room": "^2.3.3",
28
- "@signe/sync": "^2.3.3",
25
+ "@rpgjs/client": "*",
26
+ "@rpgjs/common": "*",
27
+ "@rpgjs/server": "*",
28
+ "@signe/di": "^2.4.0",
29
+ "@signe/room": "^2.4.0",
30
+ "@signe/sync": "^2.4.0",
29
31
  "rxjs": "^7.8.2"
30
32
  },
31
33
  "devDependencies": {
@@ -11,6 +11,7 @@ export class AnimationManager {
11
11
  id,
12
12
  x: player.x,
13
13
  y: player.y,
14
+ object: player,
14
15
  onFinish: () => {
15
16
  const index = this.current().findIndex((value) => value.id === id);
16
17
  this.current().splice(index, 1);
package/src/Game/Map.ts CHANGED
@@ -1,10 +1,18 @@
1
1
  import { RpgCommonMap } from "@rpgjs/common";
2
2
  import { sync, users } from "@signe/sync";
3
3
  import { RpgClientPlayer } from "./Player";
4
- import { Signal, signal } from "canvasengine";
4
+ import { Signal, signal, computed } from "canvasengine";
5
5
  import { RpgClientEvent } from "./Event";
6
+ import { RpgClientEngine } from "../RpgClientEngine";
7
+ import { inject } from "../core/inject";
6
8
 
7
9
  export class RpgClientMap extends RpgCommonMap<RpgClientPlayer> {
10
+ engine: RpgClientEngine = inject(RpgClientEngine)
8
11
  @users(RpgClientPlayer) players = signal<Record<string, RpgClientPlayer>>({});
9
12
  @sync(RpgClientEvent) events = signal<Record<string, RpgClientEvent>>({});
13
+ currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()!])
14
+
15
+ getCurrentPlayer() {
16
+ return this.currentPlayer()
17
+ }
10
18
  }
@@ -1,6 +1,9 @@
1
- import { RpgCommonPlayer } from "@rpgjs/common";
1
+ import { Hooks, ModulesToken, RpgCommonPlayer } from "@rpgjs/common";
2
+ import { sync } from "@signe/sync";
2
3
  import { trigger, signal } from "canvasengine";
3
4
  import { Subscription } from "rxjs";
5
+ import { inject } from "../core/inject";
6
+ import { RpgClientEngine } from "../RpgClientEngine";
4
7
 
5
8
  export abstract class RpgClientObject extends RpgCommonPlayer {
6
9
  abstract type: string;
@@ -8,14 +11,28 @@ export abstract class RpgClientObject extends RpgCommonPlayer {
8
11
  particleName = signal('')
9
12
  animationCurrentIndex = signal(0)
10
13
  animationIsPlaying = signal(false)
14
+ _param = signal({})
15
+
16
+ constructor() {
17
+ super()
18
+ this.hooks.callHooks("client-sprite-onInit", this).subscribe();
19
+ }
20
+
21
+ get hooks() {
22
+ return inject<Hooks>(ModulesToken);
23
+ }
24
+
11
25
  private animationSubscription?: Subscription
12
26
 
13
27
  flash(color: string, duration: number = 100) {
14
- const lastTint = this.tint()
15
- this.tint.set(color);
16
- setTimeout(() => {
17
- this.tint.set(lastTint)
18
- }, duration)
28
+ return new Promise((resolve) => {
29
+ const lastTint = this.tint()
30
+ this.tint.set(color);
31
+ setTimeout(() => {
32
+ this.tint.set(lastTint)
33
+ resolve(true)
34
+ }, duration)
35
+ })
19
36
  }
20
37
 
21
38
  /**
@@ -82,4 +99,9 @@ export abstract class RpgClientObject extends RpgCommonPlayer {
82
99
  })
83
100
  this.animationName.set(animationName);
84
101
  }
102
+
103
+ showComponentAnimation(id: string, params: any) {
104
+ const engine = inject(RpgClientEngine)
105
+ engine.getComponentAnimation(id).displayEffect(params, this)
106
+ }
85
107
  }