@rpgjs/client 5.0.0-alpha.13 → 5.0.0-alpha.15
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/Game/Map.d.ts +2 -1
- package/dist/RpgClient.d.ts +39 -0
- package/dist/RpgClientEngine.d.ts +138 -2
- package/dist/index10.js +2 -3
- package/dist/index10.js.map +1 -1
- package/dist/index15.js +59 -17
- package/dist/index15.js.map +1 -1
- package/dist/index16.js.map +1 -1
- package/dist/index19.js.map +1 -1
- package/dist/index2.js +303 -3
- package/dist/index2.js.map +1 -1
- package/dist/index20.js +3 -0
- package/dist/index20.js.map +1 -1
- package/dist/index22.js +31 -31
- package/dist/index22.js.map +1 -1
- package/dist/index23.js +2 -2
- package/dist/index23.js.map +1 -1
- package/dist/index25.js +1 -2
- package/dist/index25.js.map +1 -1
- package/dist/index30.js.map +1 -1
- package/dist/index31.js.map +1 -1
- package/dist/index33.js +1 -1
- package/dist/index34.js +1 -1
- package/dist/index36.js +6 -4402
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +3686 -170
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +172 -486
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +498 -71
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +6 -1
- package/dist/index4.js.map +1 -1
- package/dist/index40.js +67 -10
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +3 -93
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +123 -0
- package/dist/index42.js.map +1 -0
- package/dist/index43.js +20 -0
- package/dist/index43.js.map +1 -0
- package/dist/index44.js +12 -0
- package/dist/index44.js.map +1 -0
- package/dist/index45.js +113 -0
- package/dist/index45.js.map +1 -0
- package/dist/index46.js +136 -0
- package/dist/index46.js.map +1 -0
- package/dist/index47.js +137 -0
- package/dist/index47.js.map +1 -0
- package/dist/index48.js +112 -0
- package/dist/index48.js.map +1 -0
- package/dist/index49.js +9 -0
- package/dist/index49.js.map +1 -0
- package/dist/index8.js +8 -0
- package/dist/index8.js.map +1 -1
- package/dist/services/mmorpg.d.ts +1 -0
- package/package.json +8 -8
- package/src/Game/Map.ts +5 -1
- package/src/Game/Object.ts +37 -4
- package/src/RpgClient.ts +40 -0
- package/src/RpgClientEngine.ts +374 -11
- package/src/components/animations/animation.ce +1 -2
- package/src/components/character.ce +81 -20
- package/src/components/gui/dialogbox/index.ce +1 -2
- package/src/module.ts +8 -0
- package/src/services/mmorpg.ts +7 -1
package/dist/index19.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index19.js","sources":["../../../node_modules/.pnpm/@signe+sync@2.4.5/node_modules/@signe/sync/dist/index.js"],"sourcesContent":["import {\n __name\n} from \"./chunk-7QVYU63E.js\";\n\n// src/core.ts\nimport { isArraySubject, isObjectSubject, isSignal, isComputed } from \"@signe/reactive\";\n\n// src/utils.ts\nfunction isFunction(val) {\n return {}.toString.call(val) === \"[object Function]\";\n}\n__name(isFunction, \"isFunction\");\nfunction isClass(obj) {\n return typeof obj === \"function\" && obj.prototype && obj.prototype.constructor === obj;\n}\n__name(isClass, \"isClass\");\nvar isObject = /* @__PURE__ */ __name((item) => item && typeof item === \"object\" && !Array.isArray(item) && item !== null, \"isObject\");\nfunction isInstanceOfClass(value) {\n if (value === null || typeof value !== \"object\" || value === void 0 || Array.isArray(value)) {\n return false;\n }\n return Object.getPrototypeOf(value) !== Object.prototype;\n}\n__name(isInstanceOfClass, \"isInstanceOfClass\");\nfunction generateShortUUID() {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let uuid = \"\";\n for (let i = 0; i < 8; i++) {\n const randomIndex = Math.floor(Math.random() * chars.length);\n uuid += chars[randomIndex];\n }\n return uuid;\n}\n__name(generateShortUUID, \"generateShortUUID\");\n\n// src/core.ts\nvar DELETE_TOKEN = \"$delete\";\nvar syncClass = /* @__PURE__ */ __name((instance, options = {}) => {\n const cacheSync = /* @__PURE__ */ new Map();\n const cachePersist = /* @__PURE__ */ new Map();\n instance.$valuesChanges = {\n set: /* @__PURE__ */ __name((path, value) => {\n cacheSync.set(path, value);\n options.onSync?.(cacheSync);\n }, \"set\"),\n setPersist: /* @__PURE__ */ __name((path, value) => {\n if (path == \"\") path = \".\";\n cachePersist.set(path, value);\n options.onPersist?.(cachePersist);\n }, \"setPersist\"),\n has: /* @__PURE__ */ __name((path) => {\n return cacheSync.has(path);\n }, \"has\"),\n get: /* @__PURE__ */ __name((path) => {\n return cacheSync.get(path);\n }, \"get\")\n };\n createSyncClass(instance);\n}, \"syncClass\");\nfunction createStatesSnapshot(instance) {\n let persistObject = {};\n if (instance?.$snapshot) {\n for (const key of instance.$snapshot.keys()) {\n const signal = instance.$snapshot.get(key);\n const persist2 = signal.options.persist ?? true;\n let value = signal();\n if (isObject(value) || Array.isArray(value)) {\n continue;\n }\n if (persist2) {\n persistObject[key] = value;\n }\n }\n }\n return persistObject;\n}\n__name(createStatesSnapshot, \"createStatesSnapshot\");\nfunction setMetadata(target, key, value) {\n const meta = target.constructor._propertyMetadata;\n const propId = meta?.get(key);\n if (propId) {\n if (isSignal(target[propId])) {\n target[propId].set(value);\n } else {\n target[propId] = value;\n }\n }\n}\n__name(setMetadata, \"setMetadata\");\nvar createSyncClass = /* @__PURE__ */ __name((currentClass, parentKey = null, parentClass = null, path = \"\") => {\n currentClass.$path = path;\n if (parentClass) {\n currentClass.$valuesChanges = parentClass.$valuesChanges;\n }\n if (parentKey) {\n setMetadata(currentClass, \"id\", parentKey);\n }\n if (currentClass.$snapshot) {\n for (const key of currentClass.$snapshot.keys()) {\n const signal = currentClass.$snapshot.get(key);\n const syncToClient = signal.options?.syncToClient ?? true;\n const persist2 = signal.options?.persist ?? true;\n let signalValue = signal();\n if (isObject(signalValue) || Array.isArray(signalValue)) {\n signalValue = {\n ...signalValue\n };\n }\n const newPath = (path ? path + \".\" : \"\") + key;\n if (syncToClient) {\n currentClass.$valuesChanges.set(newPath, signalValue);\n }\n if (persist2) {\n if (parentClass) currentClass.$valuesChanges.setPersist(path, signalValue);\n }\n if (isComputed(signal)) {\n signal.observable.subscribe((newValue) => {\n if (syncToClient) {\n currentClass.$valuesChanges.set(newPath, newValue);\n }\n });\n }\n }\n }\n}, \"createSyncClass\");\nvar type = /* @__PURE__ */ __name((_signal, path, options = {}, currentInstance) => {\n const { syncToClient = true, persist: persist2 = true } = options;\n let init = true;\n const handleObjectSubject = /* @__PURE__ */ __name((value, propPath) => {\n const newPath = `${propPath}${value.key ? `.${value.key}` : \"\"}`;\n if ([\n \"add\",\n \"reset\",\n \"update\"\n ].includes(value.type)) {\n if (isInstanceOfClass(value.value)) {\n createSyncClass(value.value, value.key, currentInstance, newPath);\n } else if (value.type === \"update\" && (isObject(value.value) || Array.isArray(value.value))) {\n createSyncClass(value.value, value.key, currentInstance, newPath);\n } else {\n savePath(newPath, value.value);\n }\n } else if (value.type === \"remove\") {\n savePath(newPath, DELETE_TOKEN);\n }\n }, \"handleObjectSubject\");\n const handleArraySubject = /* @__PURE__ */ __name((value, propPath) => {\n if (value.type === \"reset\" && Array.isArray(value.items)) {\n value.items.forEach((item, index) => {\n const newPath2 = `${propPath}.${index}`;\n if (isInstanceOfClass(item)) {\n createSyncClass(item, value.key, currentInstance, newPath2);\n } else {\n savePath(newPath2, item);\n }\n });\n return;\n }\n const newPath = `${propPath}.${value.index}`;\n const firstItem = value.items?.[0];\n if ([\n \"add\",\n \"update\"\n ].includes(value.type) && firstItem !== void 0) {\n if (isInstanceOfClass(firstItem)) {\n createSyncClass(firstItem, value.key, currentInstance, newPath);\n } else if (value.type === \"update\" && (isObject(firstItem) || Array.isArray(firstItem))) {\n createSyncClass(firstItem, value.key, currentInstance, newPath);\n } else {\n savePath(newPath, firstItem);\n }\n } else if (value.type === \"remove\") {\n savePath(newPath, DELETE_TOKEN);\n }\n }, \"handleArraySubject\");\n const savePath = /* @__PURE__ */ __name((propPath, value) => {\n if (syncToClient) {\n currentInstance.$valuesChanges.set(propPath, value);\n }\n if (persist2 && currentInstance.$path !== void 0) {\n currentInstance.$valuesChanges.setPersist(value == DELETE_TOKEN ? propPath : currentInstance.$path, value);\n }\n }, \"savePath\");\n const setupSubscription = /* @__PURE__ */ __name((signal, signalPath) => {\n if (!isSignal(signal)) return;\n if (syncToClient && currentInstance.$valuesChanges) {\n const initialValue = signal();\n currentInstance.$valuesChanges.set(signalPath, initialValue);\n }\n signal.options = options;\n signal.observable.subscribe((value) => {\n if (init) return;\n if (currentInstance.$path !== void 0) {\n const fullPath = `${currentInstance.$path ? currentInstance.$path + \".\" : \"\"}${signalPath}`;\n if (isComputed(signal)) {\n savePath(fullPath, value);\n } else if (isObjectSubject(signal._subject)) {\n handleObjectSubject(value, fullPath);\n } else if (isArraySubject(signal._subject)) {\n handleArraySubject(value, fullPath);\n } else {\n savePath(fullPath, value);\n }\n }\n });\n if (!currentInstance.$snapshot) {\n currentInstance.$snapshot = /* @__PURE__ */ new Map();\n }\n currentInstance.$snapshot.set(path, signal);\n }, \"setupSubscription\");\n if (!isSignal(_signal)) {\n if (_signal && typeof _signal === \"object\" && !Array.isArray(_signal)) {\n for (const key in _signal) {\n if (Object.prototype.hasOwnProperty.call(_signal, key)) {\n const value = _signal[key];\n const propertyPath = `${path}.${key}`;\n if (isSignal(value)) {\n setupSubscription(value, propertyPath);\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n type(value, propertyPath, options, currentInstance);\n }\n }\n }\n init = false;\n }\n return _signal;\n }\n setupSubscription(_signal, path);\n init = false;\n return _signal;\n}, \"type\");\n\n// src/decorators.ts\nfunction sync(options) {\n let classType;\n let persist2 = true;\n let syncToClient = true;\n if (typeof options === \"function\") {\n classType = options;\n } else if (typeof options === \"object\") {\n classType = options.classType;\n if (options.hasOwnProperty(\"persist\")) {\n persist2 = options.persist;\n }\n if (options.hasOwnProperty(\"syncToClient\")) {\n syncToClient = options.syncToClient;\n }\n }\n return function(target, propertyKey) {\n const privatePropertyKey = `__${propertyKey}`;\n const getter = /* @__PURE__ */ __name(function() {\n return this[privatePropertyKey];\n }, \"getter\");\n const setter = /* @__PURE__ */ __name(function(newVal) {\n this[privatePropertyKey] = type(newVal, propertyKey, {\n classType,\n persist: persist2,\n syncToClient\n }, this);\n }, \"setter\");\n Object.defineProperty(target, propertyKey, {\n get: getter,\n set: setter,\n enumerable: true,\n configurable: true\n });\n };\n}\n__name(sync, \"sync\");\nfunction id() {\n return function(target, propertyKey) {\n if (!target.constructor._propertyMetadata) {\n target.constructor._propertyMetadata = /* @__PURE__ */ new Map();\n }\n target.constructor._propertyMetadata.set(\"id\", propertyKey);\n };\n}\n__name(id, \"id\");\nfunction users(options) {\n return function(target, propertyKey) {\n if (!target.constructor._propertyMetadata) {\n target.constructor._propertyMetadata = /* @__PURE__ */ new Map();\n }\n target.constructor._propertyMetadata.set(\"users\", propertyKey);\n sync(options)(target, propertyKey);\n };\n}\n__name(users, \"users\");\nfunction persist() {\n return sync({\n persist: true,\n syncToClient: false\n });\n}\n__name(persist, \"persist\");\nfunction connected() {\n return function(target, propertyKey) {\n if (!target.constructor._propertyMetadata) {\n target.constructor._propertyMetadata = /* @__PURE__ */ new Map();\n }\n target.constructor._propertyMetadata.set(\"connected\", propertyKey);\n sync({\n persist: false\n })(target, propertyKey);\n };\n}\n__name(connected, \"connected\");\n\n// src/load.ts\nimport { isSignal as isSignal2 } from \"@signe/reactive\";\nfunction load(rootInstance, values, valueIsObject) {\n if (valueIsObject) {\n loadFromObject(rootInstance, values);\n } else {\n loadFromPaths(rootInstance, values);\n }\n}\n__name(load, \"load\");\nfunction loadFromPaths(rootInstance, values) {\n for (const [path, value] of Object.entries(values)) {\n const parts = path.split(\".\");\n loadValue(rootInstance, parts, value);\n }\n}\n__name(loadFromPaths, \"loadFromPaths\");\nfunction loadFromObject(rootInstance, values, currentPath = \"\") {\n for (let key in values) {\n const value = values[key];\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n loadFromObject(rootInstance, value, newPath);\n } else {\n const parts = newPath.split(\".\");\n loadValue(rootInstance, parts, value);\n }\n }\n}\n__name(loadFromObject, \"loadFromObject\");\nfunction loadValue(rootInstance, parts, value) {\n let current = rootInstance;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n if (value == DELETE_TOKEN) {\n if (isSignal2(current)) {\n current = current();\n }\n Reflect.deleteProperty(current, part);\n } else if (current[part]?._subject) {\n current[part].set(value);\n } else if (isSignal2(current) && Array.isArray(current()) && !isNaN(Number(part))) {\n current()[Number(part)] = value;\n } else {\n current[part] = value;\n }\n } else {\n if (isSignal2(current)) {\n current = current();\n }\n const currentValue = current[part];\n if (currentValue === void 0) {\n const parentInstance = getByPath(rootInstance, parts.slice(0, i).join(\".\"));\n const classType = parentInstance?.options?.classType;\n if (classType) {\n current[part] = !isClass(classType) ? classType(part) : new classType();\n setMetadata(current[part], \"id\", part);\n } else {\n current[part] = {};\n }\n }\n current = current[part];\n }\n }\n}\n__name(loadValue, \"loadValue\");\nfunction getByPath(root, path) {\n const parts = path.split(\".\");\n let current = root;\n for (const part of parts) {\n if (isSignal2(current)) {\n current = current();\n }\n if (current[part]) {\n current = current[part];\n } else {\n return void 0;\n }\n }\n return current;\n}\n__name(getByPath, \"getByPath\");\nexport {\n DELETE_TOKEN,\n connected,\n createStatesSnapshot,\n createSyncClass,\n generateShortUUID,\n getByPath,\n id,\n isClass,\n isFunction,\n isInstanceOfClass,\n isObject,\n load,\n persist,\n setMetadata,\n sync,\n syncClass,\n type,\n users\n};\n//# sourceMappingURL=index.js.map"],"names":["isSignal2"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index19.js","sources":["../../../node_modules/.pnpm/@signe+sync@2.4.6/node_modules/@signe/sync/dist/index.js"],"sourcesContent":["import {\n __name\n} from \"./chunk-7QVYU63E.js\";\n\n// src/core.ts\nimport { isArraySubject, isObjectSubject, isSignal, isComputed } from \"@signe/reactive\";\n\n// src/utils.ts\nfunction isFunction(val) {\n return {}.toString.call(val) === \"[object Function]\";\n}\n__name(isFunction, \"isFunction\");\nfunction isClass(obj) {\n return typeof obj === \"function\" && obj.prototype && obj.prototype.constructor === obj;\n}\n__name(isClass, \"isClass\");\nvar isObject = /* @__PURE__ */ __name((item) => item && typeof item === \"object\" && !Array.isArray(item) && item !== null, \"isObject\");\nfunction isInstanceOfClass(value) {\n if (value === null || typeof value !== \"object\" || value === void 0 || Array.isArray(value)) {\n return false;\n }\n return Object.getPrototypeOf(value) !== Object.prototype;\n}\n__name(isInstanceOfClass, \"isInstanceOfClass\");\nfunction generateShortUUID() {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let uuid = \"\";\n for (let i = 0; i < 8; i++) {\n const randomIndex = Math.floor(Math.random() * chars.length);\n uuid += chars[randomIndex];\n }\n return uuid;\n}\n__name(generateShortUUID, \"generateShortUUID\");\n\n// src/core.ts\nvar DELETE_TOKEN = \"$delete\";\nvar syncClass = /* @__PURE__ */ __name((instance, options = {}) => {\n const cacheSync = /* @__PURE__ */ new Map();\n const cachePersist = /* @__PURE__ */ new Map();\n instance.$valuesChanges = {\n set: /* @__PURE__ */ __name((path, value) => {\n cacheSync.set(path, value);\n options.onSync?.(cacheSync);\n }, \"set\"),\n setPersist: /* @__PURE__ */ __name((path, value) => {\n if (path == \"\") path = \".\";\n cachePersist.set(path, value);\n options.onPersist?.(cachePersist);\n }, \"setPersist\"),\n has: /* @__PURE__ */ __name((path) => {\n return cacheSync.has(path);\n }, \"has\"),\n get: /* @__PURE__ */ __name((path) => {\n return cacheSync.get(path);\n }, \"get\")\n };\n createSyncClass(instance);\n}, \"syncClass\");\nfunction createStatesSnapshot(instance) {\n let persistObject = {};\n if (instance?.$snapshot) {\n for (const key of instance.$snapshot.keys()) {\n const signal = instance.$snapshot.get(key);\n const persist2 = signal.options.persist ?? true;\n let value = signal();\n if (isObject(value) || Array.isArray(value)) {\n continue;\n }\n if (persist2) {\n persistObject[key] = value;\n }\n }\n }\n return persistObject;\n}\n__name(createStatesSnapshot, \"createStatesSnapshot\");\nfunction setMetadata(target, key, value) {\n const meta = target.constructor._propertyMetadata;\n const propId = meta?.get(key);\n if (propId) {\n if (isSignal(target[propId])) {\n target[propId].set(value);\n } else {\n target[propId] = value;\n }\n }\n}\n__name(setMetadata, \"setMetadata\");\nvar createSyncClass = /* @__PURE__ */ __name((currentClass, parentKey = null, parentClass = null, path = \"\") => {\n currentClass.$path = path;\n if (parentClass) {\n currentClass.$valuesChanges = parentClass.$valuesChanges;\n }\n if (parentKey) {\n setMetadata(currentClass, \"id\", parentKey);\n }\n if (currentClass.$snapshot) {\n for (const key of currentClass.$snapshot.keys()) {\n const signal = currentClass.$snapshot.get(key);\n const syncToClient = signal.options?.syncToClient ?? true;\n const persist2 = signal.options?.persist ?? true;\n let signalValue = signal();\n if (isObject(signalValue) || Array.isArray(signalValue)) {\n signalValue = {\n ...signalValue\n };\n }\n const newPath = (path ? path + \".\" : \"\") + key;\n if (syncToClient) {\n currentClass.$valuesChanges.set(newPath, signalValue);\n }\n if (persist2) {\n if (parentClass) currentClass.$valuesChanges.setPersist(path, signalValue);\n }\n if (isComputed(signal)) {\n signal.observable.subscribe((newValue) => {\n if (syncToClient) {\n currentClass.$valuesChanges.set(newPath, newValue);\n }\n });\n }\n }\n }\n}, \"createSyncClass\");\nvar type = /* @__PURE__ */ __name((_signal, path, options = {}, currentInstance) => {\n const { syncToClient = true, persist: persist2 = true } = options;\n let init = true;\n const handleObjectSubject = /* @__PURE__ */ __name((value, propPath) => {\n const newPath = `${propPath}${value.key ? `.${value.key}` : \"\"}`;\n if ([\n \"add\",\n \"reset\",\n \"update\"\n ].includes(value.type)) {\n if (isInstanceOfClass(value.value)) {\n createSyncClass(value.value, value.key, currentInstance, newPath);\n } else if (value.type === \"update\" && (isObject(value.value) || Array.isArray(value.value))) {\n createSyncClass(value.value, value.key, currentInstance, newPath);\n } else {\n savePath(newPath, value.value);\n }\n } else if (value.type === \"remove\") {\n savePath(newPath, DELETE_TOKEN);\n }\n }, \"handleObjectSubject\");\n const handleArraySubject = /* @__PURE__ */ __name((value, propPath) => {\n if (value.type === \"reset\" && Array.isArray(value.items)) {\n value.items.forEach((item, index) => {\n const newPath2 = `${propPath}.${index}`;\n if (isInstanceOfClass(item)) {\n createSyncClass(item, value.key, currentInstance, newPath2);\n } else {\n savePath(newPath2, item);\n }\n });\n return;\n }\n const newPath = `${propPath}.${value.index}`;\n const firstItem = value.items?.[0];\n if ([\n \"add\",\n \"update\"\n ].includes(value.type) && firstItem !== void 0) {\n if (isInstanceOfClass(firstItem)) {\n createSyncClass(firstItem, value.key, currentInstance, newPath);\n } else if (value.type === \"update\" && (isObject(firstItem) || Array.isArray(firstItem))) {\n createSyncClass(firstItem, value.key, currentInstance, newPath);\n } else {\n savePath(newPath, firstItem);\n }\n } else if (value.type === \"remove\") {\n savePath(newPath, DELETE_TOKEN);\n }\n }, \"handleArraySubject\");\n const savePath = /* @__PURE__ */ __name((propPath, value) => {\n if (syncToClient) {\n currentInstance.$valuesChanges.set(propPath, value);\n }\n if (persist2 && currentInstance.$path !== void 0) {\n currentInstance.$valuesChanges.setPersist(value == DELETE_TOKEN ? propPath : currentInstance.$path, value);\n }\n }, \"savePath\");\n const setupSubscription = /* @__PURE__ */ __name((signal, signalPath) => {\n if (!isSignal(signal)) return;\n if (syncToClient && currentInstance.$valuesChanges) {\n const initialValue = signal();\n currentInstance.$valuesChanges.set(signalPath, initialValue);\n }\n signal.options = options;\n signal.observable.subscribe((value) => {\n if (init) return;\n if (currentInstance.$path !== void 0) {\n const fullPath = `${currentInstance.$path ? currentInstance.$path + \".\" : \"\"}${signalPath}`;\n if (isComputed(signal)) {\n savePath(fullPath, value);\n } else if (isObjectSubject(signal._subject)) {\n handleObjectSubject(value, fullPath);\n } else if (isArraySubject(signal._subject)) {\n handleArraySubject(value, fullPath);\n } else {\n savePath(fullPath, value);\n }\n }\n });\n if (!currentInstance.$snapshot) {\n currentInstance.$snapshot = /* @__PURE__ */ new Map();\n }\n currentInstance.$snapshot.set(path, signal);\n }, \"setupSubscription\");\n if (!isSignal(_signal)) {\n if (_signal && typeof _signal === \"object\" && !Array.isArray(_signal)) {\n for (const key in _signal) {\n if (Object.prototype.hasOwnProperty.call(_signal, key)) {\n const value = _signal[key];\n const propertyPath = `${path}.${key}`;\n if (isSignal(value)) {\n setupSubscription(value, propertyPath);\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n type(value, propertyPath, options, currentInstance);\n }\n }\n }\n init = false;\n }\n return _signal;\n }\n setupSubscription(_signal, path);\n init = false;\n return _signal;\n}, \"type\");\n\n// src/decorators.ts\nfunction sync(options) {\n let classType;\n let persist2 = true;\n let syncToClient = true;\n if (typeof options === \"function\") {\n classType = options;\n } else if (typeof options === \"object\") {\n classType = options.classType;\n if (options.hasOwnProperty(\"persist\")) {\n persist2 = options.persist;\n }\n if (options.hasOwnProperty(\"syncToClient\")) {\n syncToClient = options.syncToClient;\n }\n }\n return function(target, propertyKey) {\n const privatePropertyKey = `__${propertyKey}`;\n const getter = /* @__PURE__ */ __name(function() {\n return this[privatePropertyKey];\n }, \"getter\");\n const setter = /* @__PURE__ */ __name(function(newVal) {\n this[privatePropertyKey] = type(newVal, propertyKey, {\n classType,\n persist: persist2,\n syncToClient\n }, this);\n }, \"setter\");\n Object.defineProperty(target, propertyKey, {\n get: getter,\n set: setter,\n enumerable: true,\n configurable: true\n });\n };\n}\n__name(sync, \"sync\");\nfunction id() {\n return function(target, propertyKey) {\n if (!target.constructor._propertyMetadata) {\n target.constructor._propertyMetadata = /* @__PURE__ */ new Map();\n }\n target.constructor._propertyMetadata.set(\"id\", propertyKey);\n };\n}\n__name(id, \"id\");\nfunction users(options) {\n return function(target, propertyKey) {\n if (!target.constructor._propertyMetadata) {\n target.constructor._propertyMetadata = /* @__PURE__ */ new Map();\n }\n target.constructor._propertyMetadata.set(\"users\", propertyKey);\n sync(options)(target, propertyKey);\n };\n}\n__name(users, \"users\");\nfunction persist() {\n return sync({\n persist: true,\n syncToClient: false\n });\n}\n__name(persist, \"persist\");\nfunction connected() {\n return function(target, propertyKey) {\n if (!target.constructor._propertyMetadata) {\n target.constructor._propertyMetadata = /* @__PURE__ */ new Map();\n }\n target.constructor._propertyMetadata.set(\"connected\", propertyKey);\n sync({\n persist: false\n })(target, propertyKey);\n };\n}\n__name(connected, \"connected\");\n\n// src/load.ts\nimport { isSignal as isSignal2 } from \"@signe/reactive\";\nfunction load(rootInstance, values, valueIsObject) {\n if (valueIsObject) {\n loadFromObject(rootInstance, values);\n } else {\n loadFromPaths(rootInstance, values);\n }\n}\n__name(load, \"load\");\nfunction loadFromPaths(rootInstance, values) {\n for (const [path, value] of Object.entries(values)) {\n const parts = path.split(\".\");\n loadValue(rootInstance, parts, value);\n }\n}\n__name(loadFromPaths, \"loadFromPaths\");\nfunction loadFromObject(rootInstance, values, currentPath = \"\") {\n for (let key in values) {\n const value = values[key];\n const newPath = currentPath ? `${currentPath}.${key}` : key;\n if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n loadFromObject(rootInstance, value, newPath);\n } else {\n const parts = newPath.split(\".\");\n loadValue(rootInstance, parts, value);\n }\n }\n}\n__name(loadFromObject, \"loadFromObject\");\nfunction loadValue(rootInstance, parts, value) {\n let current = rootInstance;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (i === parts.length - 1) {\n if (value == DELETE_TOKEN) {\n if (isSignal2(current)) {\n current = current();\n }\n Reflect.deleteProperty(current, part);\n } else if (current[part]?._subject) {\n current[part].set(value);\n } else if (isSignal2(current) && Array.isArray(current()) && !isNaN(Number(part))) {\n current()[Number(part)] = value;\n } else {\n current[part] = value;\n }\n } else {\n if (isSignal2(current)) {\n current = current();\n }\n const currentValue = current[part];\n if (currentValue === void 0) {\n const parentInstance = getByPath(rootInstance, parts.slice(0, i).join(\".\"));\n const classType = parentInstance?.options?.classType;\n if (classType) {\n current[part] = !isClass(classType) ? classType(part) : new classType();\n setMetadata(current[part], \"id\", part);\n } else {\n current[part] = {};\n }\n }\n current = current[part];\n }\n }\n}\n__name(loadValue, \"loadValue\");\nfunction getByPath(root, path) {\n const parts = path.split(\".\");\n let current = root;\n for (const part of parts) {\n if (isSignal2(current)) {\n current = current();\n }\n if (current[part]) {\n current = current[part];\n } else {\n return void 0;\n }\n }\n return current;\n}\n__name(getByPath, \"getByPath\");\nexport {\n DELETE_TOKEN,\n connected,\n createStatesSnapshot,\n createSyncClass,\n generateShortUUID,\n getByPath,\n id,\n isClass,\n isFunction,\n isInstanceOfClass,\n isObject,\n load,\n persist,\n setMetadata,\n sync,\n syncClass,\n type,\n users\n};\n//# sourceMappingURL=index.js.map"],"names":["isSignal2"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/index2.js
CHANGED
|
@@ -3,7 +3,7 @@ import { inject } from './index16.js';
|
|
|
3
3
|
import { signal, bootstrapCanvas } from 'canvasengine';
|
|
4
4
|
import { WebSocketToken } from './index18.js';
|
|
5
5
|
import { LoadMapToken } from './index7.js';
|
|
6
|
-
import { ModulesToken } from '@rpgjs/common';
|
|
6
|
+
import { Direction, PredictionController, ModulesToken } from '@rpgjs/common';
|
|
7
7
|
import { load } from './index19.js';
|
|
8
8
|
import { RpgClientMap } from './index20.js';
|
|
9
9
|
import { RpgGui } from './index9.js';
|
|
@@ -28,6 +28,17 @@ class RpgClientEngine {
|
|
|
28
28
|
this.playerIdSignal = signal(null);
|
|
29
29
|
this.spriteComponentsBehind = signal([]);
|
|
30
30
|
this.spriteComponentsInFront = signal([]);
|
|
31
|
+
this.predictionEnabled = false;
|
|
32
|
+
this.SERVER_CORRECTION_THRESHOLD = 30;
|
|
33
|
+
this.inputFrameCounter = 0;
|
|
34
|
+
this.frameOffset = 0;
|
|
35
|
+
// Ping/Pong for RTT measurement
|
|
36
|
+
this.rtt = 0;
|
|
37
|
+
// Round-trip time in ms
|
|
38
|
+
this.pingInterval = null;
|
|
39
|
+
this.PING_INTERVAL_MS = 5e3;
|
|
40
|
+
// Send ping every 5 seconds
|
|
41
|
+
this.lastInputTime = 0;
|
|
31
42
|
this.webSocket = inject(context, WebSocketToken);
|
|
32
43
|
this.guiService = inject(context, RpgGui);
|
|
33
44
|
this.loadMapService = inject(context, LoadMapToken);
|
|
@@ -49,6 +60,8 @@ class RpgClientEngine {
|
|
|
49
60
|
id: "animation",
|
|
50
61
|
component: PrebuiltComponentAnimations.Animation
|
|
51
62
|
});
|
|
63
|
+
this.predictionEnabled = this.globalConfig?.prediction?.enabled !== false;
|
|
64
|
+
this.initializePredictionController();
|
|
52
65
|
}
|
|
53
66
|
async start() {
|
|
54
67
|
this.sceneMap = new RpgClientMap();
|
|
@@ -56,7 +69,15 @@ class RpgClientEngine {
|
|
|
56
69
|
const { app, canvasElement } = await bootstrapCanvas(this.selector, component);
|
|
57
70
|
this.renderer = app.renderer;
|
|
58
71
|
this.tick = canvasElement?.propObservables?.context["tick"].observable;
|
|
72
|
+
this.tick.subscribe(() => {
|
|
73
|
+
if (Date.now() - this.lastInputTime > 100) {
|
|
74
|
+
const player = this.getCurrentPlayer();
|
|
75
|
+
if (!player) return;
|
|
76
|
+
this.sceneMap.stopMovement(player);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
59
79
|
this.hooks.callHooks("client-spritesheets-load", this).subscribe();
|
|
80
|
+
this.hooks.callHooks("client-spritesheetResolver-load", this).subscribe();
|
|
60
81
|
this.hooks.callHooks("client-sounds-load", this).subscribe();
|
|
61
82
|
this.hooks.callHooks("client-gui-load", this).subscribe();
|
|
62
83
|
this.hooks.callHooks("client-particles-load", this).subscribe();
|
|
@@ -68,6 +89,11 @@ class RpgClientEngine {
|
|
|
68
89
|
});
|
|
69
90
|
this.tick.subscribe((tick) => {
|
|
70
91
|
this.hooks.callHooks("client-engine-onStep", this, tick).subscribe();
|
|
92
|
+
if (tick % 60 === 0) {
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
this.prediction?.cleanup(now);
|
|
95
|
+
this.prediction?.tryApplyPendingSnapshot();
|
|
96
|
+
}
|
|
71
97
|
});
|
|
72
98
|
await this.webSocket.connection(() => {
|
|
73
99
|
this.initListeners();
|
|
@@ -80,6 +106,16 @@ class RpgClientEngine {
|
|
|
80
106
|
this.hooks.callHooks("client-sceneMap-onChanges", this.sceneMap, { partial: data }).subscribe();
|
|
81
107
|
load(this.sceneMap, data, true);
|
|
82
108
|
});
|
|
109
|
+
this.webSocket.on("pong", (data) => {
|
|
110
|
+
const now = Date.now();
|
|
111
|
+
this.rtt = now - data.clientTime;
|
|
112
|
+
const estimatedTicksInFlight = Math.floor(this.rtt / 2 / (1e3 / 60));
|
|
113
|
+
const estimatedServerTickNow = data.serverTick + estimatedTicksInFlight;
|
|
114
|
+
if (this.inputFrameCounter > 0) {
|
|
115
|
+
this.frameOffset = estimatedServerTickNow - data.clientFrame;
|
|
116
|
+
}
|
|
117
|
+
console.debug(`[Ping/Pong] RTT: ${this.rtt}ms, ServerTick: ${data.serverTick}, FrameOffset: ${this.frameOffset}`);
|
|
118
|
+
});
|
|
83
119
|
this.webSocket.on("changeMap", (data) => {
|
|
84
120
|
this.sceneMap.reset();
|
|
85
121
|
this.loadScene(data.mapId);
|
|
@@ -102,13 +138,78 @@ class RpgClientEngine {
|
|
|
102
138
|
});
|
|
103
139
|
this.webSocket.on("close", () => {
|
|
104
140
|
this.hooks.callHooks("client-engine-onDisconnected", this, this.socket).subscribe();
|
|
141
|
+
this.stopPingPong();
|
|
105
142
|
});
|
|
106
143
|
this.webSocket.on("error", (error) => {
|
|
107
144
|
this.hooks.callHooks("client-engine-onConnectError", this, error, this.socket).subscribe();
|
|
108
145
|
});
|
|
109
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Start periodic ping/pong for client-server synchronization
|
|
149
|
+
*
|
|
150
|
+
* Sends ping requests to the server to measure round-trip time (RTT) and
|
|
151
|
+
* calculate the frame offset between client and server ticks.
|
|
152
|
+
*
|
|
153
|
+
* ## Design
|
|
154
|
+
*
|
|
155
|
+
* - Sends ping every 5 seconds
|
|
156
|
+
* - Measures RTT for latency compensation
|
|
157
|
+
* - Calculates frame offset to map client frames to server ticks
|
|
158
|
+
* - Used for accurate server reconciliation
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```ts
|
|
162
|
+
* // Called automatically when connection opens
|
|
163
|
+
* this.startPingPong();
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
startPingPong() {
|
|
167
|
+
this.stopPingPong();
|
|
168
|
+
this.sendPing();
|
|
169
|
+
this.pingInterval = setInterval(() => {
|
|
170
|
+
this.sendPing();
|
|
171
|
+
}, this.PING_INTERVAL_MS);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Stop periodic ping/pong
|
|
175
|
+
*
|
|
176
|
+
* Stops the ping interval when disconnecting or changing maps.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* ```ts
|
|
180
|
+
* // Called automatically when connection closes
|
|
181
|
+
* this.stopPingPong();
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
stopPingPong() {
|
|
185
|
+
if (this.pingInterval) {
|
|
186
|
+
clearInterval(this.pingInterval);
|
|
187
|
+
this.pingInterval = null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Send a ping request to the server
|
|
192
|
+
*
|
|
193
|
+
* Sends current client time and frame counter to the server,
|
|
194
|
+
* which will respond with its server tick for synchronization.
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```ts
|
|
198
|
+
* // Send a ping to measure RTT
|
|
199
|
+
* this.sendPing();
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
sendPing() {
|
|
203
|
+
const clientTime = Date.now();
|
|
204
|
+
const clientFrame = this.getPhysicsTick();
|
|
205
|
+
this.webSocket.emit("ping", {
|
|
206
|
+
clientTime,
|
|
207
|
+
clientFrame
|
|
208
|
+
});
|
|
209
|
+
}
|
|
110
210
|
async loadScene(mapId) {
|
|
111
211
|
this.hooks.callHooks("client-sceneMap-onBeforeLoading", this.sceneMap).subscribe();
|
|
212
|
+
this.clearClientPredictionStates();
|
|
112
213
|
this.webSocket.updateProperties({ room: mapId });
|
|
113
214
|
await this.webSocket.reconnect(() => {
|
|
114
215
|
this.initListeners();
|
|
@@ -117,11 +218,84 @@ class RpgClientEngine {
|
|
|
117
218
|
const res = await this.loadMapService.load(mapId);
|
|
118
219
|
this.sceneMap.data.set(res);
|
|
119
220
|
this.hooks.callHooks("client-sceneMap-onAfterLoading", this.sceneMap).subscribe();
|
|
221
|
+
this.sceneMap.loadPhysic();
|
|
120
222
|
}
|
|
121
223
|
addSpriteSheet(spritesheetClass, id) {
|
|
122
224
|
this.spritesheets.set(id || spritesheetClass.id, spritesheetClass);
|
|
123
225
|
return spritesheetClass;
|
|
124
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Set a resolver function for spritesheets
|
|
229
|
+
*
|
|
230
|
+
* The resolver is called when a spritesheet is requested but not found in the cache.
|
|
231
|
+
* It can be synchronous (returns directly) or asynchronous (returns a Promise).
|
|
232
|
+
* The resolved spritesheet is automatically cached for future use.
|
|
233
|
+
*
|
|
234
|
+
* @param resolver - Function that takes a spritesheet ID and returns a spritesheet or Promise of spritesheet
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```ts
|
|
238
|
+
* // Synchronous resolver
|
|
239
|
+
* engine.setSpritesheetResolver((id) => {
|
|
240
|
+
* if (id === 'dynamic-sprite') {
|
|
241
|
+
* return { id: 'dynamic-sprite', image: 'path/to/image.png', framesWidth: 32, framesHeight: 32 };
|
|
242
|
+
* }
|
|
243
|
+
* return undefined;
|
|
244
|
+
* });
|
|
245
|
+
*
|
|
246
|
+
* // Asynchronous resolver (loading from API)
|
|
247
|
+
* engine.setSpritesheetResolver(async (id) => {
|
|
248
|
+
* const response = await fetch(`/api/spritesheets/${id}`);
|
|
249
|
+
* const data = await response.json();
|
|
250
|
+
* return data;
|
|
251
|
+
* });
|
|
252
|
+
* ```
|
|
253
|
+
*/
|
|
254
|
+
setSpritesheetResolver(resolver) {
|
|
255
|
+
this.spritesheetResolver = resolver;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get a spritesheet by ID, using resolver if not found in cache
|
|
259
|
+
*
|
|
260
|
+
* This method first checks if the spritesheet exists in the cache.
|
|
261
|
+
* If not found and a resolver is set, it calls the resolver to create the spritesheet.
|
|
262
|
+
* The resolved spritesheet is automatically cached for future use.
|
|
263
|
+
*
|
|
264
|
+
* @param id - The spritesheet ID to retrieve
|
|
265
|
+
* @returns The spritesheet if found or created, or undefined if not found and no resolver
|
|
266
|
+
* @returns Promise<any> if the resolver is asynchronous
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```ts
|
|
270
|
+
* // Synchronous usage
|
|
271
|
+
* const spritesheet = engine.getSpriteSheet('my-sprite');
|
|
272
|
+
*
|
|
273
|
+
* // Asynchronous usage (when resolver returns Promise)
|
|
274
|
+
* const spritesheet = await engine.getSpriteSheet('dynamic-sprite');
|
|
275
|
+
* ```
|
|
276
|
+
*/
|
|
277
|
+
getSpriteSheet(id) {
|
|
278
|
+
if (this.spritesheets.has(id)) {
|
|
279
|
+
return this.spritesheets.get(id);
|
|
280
|
+
}
|
|
281
|
+
if (this.spritesheetResolver) {
|
|
282
|
+
const result = this.spritesheetResolver(id);
|
|
283
|
+
if (result instanceof Promise) {
|
|
284
|
+
return result.then((spritesheet) => {
|
|
285
|
+
if (spritesheet) {
|
|
286
|
+
this.spritesheets.set(id, spritesheet);
|
|
287
|
+
}
|
|
288
|
+
return spritesheet;
|
|
289
|
+
});
|
|
290
|
+
} else {
|
|
291
|
+
if (result) {
|
|
292
|
+
this.spritesheets.set(id, result);
|
|
293
|
+
}
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return void 0;
|
|
298
|
+
}
|
|
125
299
|
addSound(sound, id) {
|
|
126
300
|
this.sounds.set(id || sound.id, sound);
|
|
127
301
|
return sound;
|
|
@@ -224,9 +398,31 @@ class RpgClientEngine {
|
|
|
224
398
|
}
|
|
225
399
|
return componentAnimation.instance;
|
|
226
400
|
}
|
|
227
|
-
processInput({ input }) {
|
|
401
|
+
async processInput({ input }) {
|
|
402
|
+
const timestamp = Date.now();
|
|
403
|
+
let frame;
|
|
404
|
+
let tick;
|
|
405
|
+
if (this.predictionEnabled && this.prediction) {
|
|
406
|
+
const meta = this.prediction.recordInput(input, timestamp);
|
|
407
|
+
frame = meta.frame;
|
|
408
|
+
tick = meta.tick;
|
|
409
|
+
} else {
|
|
410
|
+
frame = ++this.inputFrameCounter;
|
|
411
|
+
tick = this.getPhysicsTick();
|
|
412
|
+
}
|
|
228
413
|
this.hooks.callHooks("client-engine-onInput", this, { input, playerId: this.playerId }).subscribe();
|
|
229
|
-
this.webSocket.emit("move", {
|
|
414
|
+
this.webSocket.emit("move", {
|
|
415
|
+
input,
|
|
416
|
+
timestamp,
|
|
417
|
+
frame,
|
|
418
|
+
tick
|
|
419
|
+
});
|
|
420
|
+
const currentPlayer = this.sceneMap.getCurrentPlayer();
|
|
421
|
+
if (currentPlayer) {
|
|
422
|
+
this.sceneMap.moveBody(currentPlayer, input);
|
|
423
|
+
}
|
|
424
|
+
this.lastInputTime = Date.now();
|
|
425
|
+
this.playerIdSignal();
|
|
230
426
|
}
|
|
231
427
|
processAction({ action }) {
|
|
232
428
|
if (this.stopProcessingInput) return;
|
|
@@ -245,9 +441,113 @@ class RpgClientEngine {
|
|
|
245
441
|
get scene() {
|
|
246
442
|
return this.sceneMap;
|
|
247
443
|
}
|
|
444
|
+
getPhysicsTick() {
|
|
445
|
+
return this.sceneMap?.getTick?.() ?? 0;
|
|
446
|
+
}
|
|
447
|
+
getLocalPlayerState() {
|
|
448
|
+
const currentPlayer = this.sceneMap?.getCurrentPlayer();
|
|
449
|
+
if (!currentPlayer) {
|
|
450
|
+
return { x: 0, y: 0, direction: Direction.Down };
|
|
451
|
+
}
|
|
452
|
+
const topLeft = this.sceneMap.getBodyPosition(currentPlayer.id, "top-left");
|
|
453
|
+
const x = topLeft?.x ?? currentPlayer.x();
|
|
454
|
+
const y = topLeft?.y ?? currentPlayer.y();
|
|
455
|
+
const direction = currentPlayer.direction();
|
|
456
|
+
return { x, y, direction };
|
|
457
|
+
}
|
|
458
|
+
applyAuthoritativeState(state) {
|
|
459
|
+
const player = this.sceneMap?.getCurrentPlayer();
|
|
460
|
+
if (!player) return;
|
|
461
|
+
const hitbox = typeof player.hitbox === "function" ? player.hitbox() : player.hitbox;
|
|
462
|
+
const width = hitbox?.w ?? 0;
|
|
463
|
+
const height = hitbox?.h ?? 0;
|
|
464
|
+
const updated = this.sceneMap.updateHitbox(player.id, state.x, state.y, width, height);
|
|
465
|
+
if (!updated) {
|
|
466
|
+
this.sceneMap.setBodyPosition(player.id, state.x, state.y, "top-left");
|
|
467
|
+
}
|
|
468
|
+
player.x.set(Math.round(state.x));
|
|
469
|
+
player.y.set(Math.round(state.y));
|
|
470
|
+
if (state.direction) {
|
|
471
|
+
player.changeDirection(state.direction);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
initializePredictionController() {
|
|
475
|
+
if (!this.predictionEnabled) {
|
|
476
|
+
this.prediction = void 0;
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
this.prediction = new PredictionController({
|
|
480
|
+
correctionThreshold: this.globalConfig?.prediction?.correctionThreshold ?? this.SERVER_CORRECTION_THRESHOLD,
|
|
481
|
+
historyTtlMs: this.globalConfig?.prediction?.historyTtlMs ?? 2e3,
|
|
482
|
+
getPhysicsTick: () => this.getPhysicsTick(),
|
|
483
|
+
getCurrentState: () => this.getLocalPlayerState(),
|
|
484
|
+
setAuthoritativeState: (state) => this.applyAuthoritativeState(state)
|
|
485
|
+
});
|
|
486
|
+
}
|
|
248
487
|
getCurrentPlayer() {
|
|
249
488
|
return this.sceneMap.getCurrentPlayer();
|
|
250
489
|
}
|
|
490
|
+
/**
|
|
491
|
+
* Clear client prediction states for cleanup
|
|
492
|
+
*
|
|
493
|
+
* Removes old prediction states and input history to prevent memory leaks.
|
|
494
|
+
* Should be called when changing maps or disconnecting.
|
|
495
|
+
*
|
|
496
|
+
* @example
|
|
497
|
+
* ```ts
|
|
498
|
+
* // Clear prediction states when changing maps
|
|
499
|
+
* engine.clearClientPredictionStates();
|
|
500
|
+
* ```
|
|
501
|
+
*/
|
|
502
|
+
clearClientPredictionStates() {
|
|
503
|
+
this.initializePredictionController();
|
|
504
|
+
this.frameOffset = 0;
|
|
505
|
+
this.inputFrameCounter = 0;
|
|
506
|
+
}
|
|
507
|
+
applyServerAck(ack) {
|
|
508
|
+
if (this.predictionEnabled && this.prediction) {
|
|
509
|
+
this.prediction.applyServerAck({
|
|
510
|
+
frame: ack.frame,
|
|
511
|
+
serverTick: ack.serverTick,
|
|
512
|
+
state: typeof ack.x === "number" && typeof ack.y === "number" ? { x: ack.x, y: ack.y, direction: ack.direction } : void 0
|
|
513
|
+
});
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if (typeof ack.x !== "number" || typeof ack.y !== "number") {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
const player = this.getCurrentPlayer();
|
|
520
|
+
const myId = this.playerIdSignal();
|
|
521
|
+
if (!player || !myId) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
const hitbox = typeof player.hitbox === "function" ? player.hitbox() : player.hitbox;
|
|
525
|
+
const width = hitbox?.w ?? 0;
|
|
526
|
+
const height = hitbox?.h ?? 0;
|
|
527
|
+
const updated = this.sceneMap.updateHitbox(myId, ack.x, ack.y, width, height);
|
|
528
|
+
if (!updated) {
|
|
529
|
+
this.sceneMap.setBodyPosition(myId, ack.x, ack.y, "top-left");
|
|
530
|
+
}
|
|
531
|
+
player.x.set(Math.round(ack.x));
|
|
532
|
+
player.y.set(Math.round(ack.y));
|
|
533
|
+
if (ack.direction) {
|
|
534
|
+
player.changeDirection(ack.direction);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Replay unacknowledged inputs from a given frame to resimulate client prediction
|
|
539
|
+
* after applying server authority at a certain frame.
|
|
540
|
+
*
|
|
541
|
+
* @param startFrame - The last server-acknowledged frame
|
|
542
|
+
*
|
|
543
|
+
* @example
|
|
544
|
+
* ```ts
|
|
545
|
+
* // After applying a server correction at frame N
|
|
546
|
+
* this.replayUnackedInputsFromFrame(N);
|
|
547
|
+
* ```
|
|
548
|
+
*/
|
|
549
|
+
async replayUnackedInputsFromFrame(_startFrame) {
|
|
550
|
+
}
|
|
251
551
|
}
|
|
252
552
|
|
|
253
553
|
export { RpgClientEngine };
|