From 148c6837fdde6dacb819ee3e4ab2d2851be7a618 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 20 Apr 2026 19:27:35 +0500 Subject: [PATCH] fix: move data and hook --- .../iteractions-datas.interfaces.ts | 2 +- .../hooks/use-link.hook.interface.ts | 5 +++ src/utils/hooks/use-link.hook.ts | 44 +++++++++++++------ src/world/map.ts | 2 +- test/collision.test.ts | 6 +-- test/gametest.ts | 4 +- 6 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/interfaces/event-datas/iteractions-datas/iteractions-datas.interfaces.ts b/src/interfaces/event-datas/iteractions-datas/iteractions-datas.interfaces.ts index e64de46..021e680 100644 --- a/src/interfaces/event-datas/iteractions-datas/iteractions-datas.interfaces.ts +++ b/src/interfaces/event-datas/iteractions-datas/iteractions-datas.interfaces.ts @@ -41,7 +41,7 @@ export interface IMovedData { /** * Entity position after move */ - readonly newPosition: AnyPosition; + readonly position: AnyPosition; } export interface IPlaySoundData { diff --git a/src/interfaces/hooks/use-link.hook.interface.ts b/src/interfaces/hooks/use-link.hook.interface.ts index 0389c9e..015ab88 100644 --- a/src/interfaces/hooks/use-link.hook.interface.ts +++ b/src/interfaces/hooks/use-link.hook.interface.ts @@ -55,4 +55,9 @@ export interface ILinkOptions { * Auto delete link when */ readonly autoUnlinkOn?: UnlinkWhen[]; + + /** + * If true, register useLink as middleware + */ + readonly enableMiddleware?: boolean; } \ No newline at end of file diff --git a/src/utils/hooks/use-link.hook.ts b/src/utils/hooks/use-link.hook.ts index 2fd911f..89a5beb 100644 --- a/src/utils/hooks/use-link.hook.ts +++ b/src/utils/hooks/use-link.hook.ts @@ -1,5 +1,5 @@ import { anyWorldObjectIsGameObject, convertAnyPositionToPosition } from "@utils"; -import type { Linkable } from "@types"; +import type { Linkable, MiddlewareFn, Position } from "@types"; import type { IDeadData, ILink, ILinkOptions, IMovedData, IUseValidationContext } from "@interfaces"; import { USE_VALIDATION_EVENT_PREFIX } from "@const"; import { CommandType } from "@enums"; @@ -35,32 +35,48 @@ export function useLink(from: Linkable, to: Linkable, options?: ILinkOptions): I link: (options?: ILinkOptions) => link.isActive ? false : useLink(from, to, options) } as ILink - if (childIsEntity && options?.maxDistance) move = game.registerCustomEvent(`${USE_VALIDATION_EVENT_PREFIX}:${CommandType.MOVE}`, (opt, event, data) => { + function checkMaximum(before: Position, after: Position): boolean { + const [x1, y1] = before + const [x2, y2] = after + + return (x2-x1 > options?.maxDistance! || y2-y1 > options?.maxDistance!) + } + + if (options?.enableMiddleware) game.use((cmd, next) => { + if (cmd.type !== CommandType.MOVE || typeof options.maxDistance === 'undefined') return next() + else return checkMaximum(from.position, cmd.data.position || cmd.data.newPosition) ? null : next() + }) + else { + if (childIsEntity && options?.maxDistance) move = game.registerCustomEvent(`${USE_VALIDATION_EVENT_PREFIX}:${CommandType.MOVE}`, (opt, event, data) => { if ( data.entity && !anyWorldObjectIsGameObject(data.entity) && data.entity.id === to.id ) { - - const [x1, y1] = from.position - const [x2, y2] = convertAnyPositionToPosition(data.eventData.newPosition || (data.eventData as any).position) - - if (x2-x1 > options!.maxDistance! || y2-y1 > options!.maxDistance!) { + if (checkMaximum(from.position, convertAnyPositionToPosition(data.eventData.position))) { data.eventData.isAllowed = false data.eventData.errors.push(`[useLink]: Max distance occured (${options!.maxDistance})`) + + if (options.autoUnlinkOn?.includes("childOutOfRange")) link.unLink() } - if (options.autoUnlinkOn?.includes("childOutOfRange")) link.unLink() } - }) - if (parentIsEntity && childIsEntity) { + }) + if (parentIsEntity && childIsEntity) { if (options?.killChild) kill = game.on("entityDead", (opt, event, data) => { - if (data.eventData.entity.id === from.id) game.options.manager.kill(to.id) - if (options.autoUnlinkOn?.includes("parentKilled")) link.unLink() + if (data.eventData.entity.id === from.id) { + game.options.manager.kill(to.id) + + if (options.autoUnlinkOn?.includes("parentKilled")) link.unLink() + } }) if (options?.deleteChild) deleting = game.on<{}>("entityDeleted", (opt, event, data) => { - if (data.entity!.id === from.id) game.options.manager.delete(to.id) - if (options.autoUnlinkOn?.includes("parentDeleted")) link.unLink() + if (data.entity!.id === from.id) { + game.options.manager.delete(to.id) + + if (options.autoUnlinkOn?.includes("parentDeleted")) link.unLink() + } }) + } } return link diff --git a/src/world/map.ts b/src/world/map.ts index 42103ad..055ccf5 100644 --- a/src/world/map.ts +++ b/src/world/map.ts @@ -213,7 +213,7 @@ export class GameMap implements Map { eventData: { entity, startPosition: entity.position, - newPosition: to + position: to } }) diff --git a/test/collision.test.ts b/test/collision.test.ts index 8e1ce5e..8719356 100644 --- a/test/collision.test.ts +++ b/test/collision.test.ts @@ -70,10 +70,10 @@ describe('Collisions Tests', () => { else if (name === 'sword3') collisionByChestWeightTest = true }) game.on('entityMoved', (o, e, d) => { - const { newPosition } = d.eventData + const { position } = d.eventData - if (positionIsPosition(newPosition)) { - if (checkTwoPositions(newPosition, [2, 0])) moveToDoesntCollisionObjectTest = true + if (positionIsPosition(position)) { + if (checkTwoPositions(position, [2, 0])) moveToDoesntCollisionObjectTest = true } }) diff --git a/test/gametest.ts b/test/gametest.ts index d9672f2..308070e 100644 --- a/test/gametest.ts +++ b/test/gametest.ts @@ -79,7 +79,7 @@ const SUPER_ZOMBIE = blueprintsFactory.register({ const killQuest = questsFactory.create({ name: "Move to 5,6", injectEvents: ['entityMoved'], - onEvent: (options, event, data, self) => checkTwoPositions([5, 6], (data.eventData as IMovedData).newPosition as Position), + onEvent: (options, event, data, self) => checkTwoPositions([5, 6], (data.eventData as IMovedData).position as Position), onComplete: (e) => { console.log('QUEST COMPLETED FOR', e.name) } @@ -314,7 +314,7 @@ game.dispatch({ } }) -useLink(player, player_second, { maxDistance: 1, autoUnlinkOn: ["childOutOfRange", "parentDeleted", "parentKilled"], killChild: false, deleteChild: false }) +useLink(player, player_second, { maxDistance: 1, autoUnlinkOn: ["childOutOfRange", "parentDeleted", "parentKilled"], killChild: false, deleteChild: false, enableMiddleware: true }) console.log(useValidation(player_second, CommandType.MOVE, { newPosition: [7, 7]