diff --git a/src/engine/action/pipe/item-on-player.action.ts b/src/engine/action/pipe/item-on-player.action.ts index 28e517ac5..b85f75e54 100644 --- a/src/engine/action/pipe/item-on-player.action.ts +++ b/src/engine/action/pipe/item-on-player.action.ts @@ -1,9 +1,7 @@ -import { logger } from '@runejs/common'; - import { Player } from '@engine/world/actor'; import { Position, Item } from '@engine/world'; import { ActionHook, getActionHooks, advancedNumberHookFilter, questHookFilter, ActionPipe } from '@engine/action'; -import { playerWalkTo } from '@engine/plugins'; +import { WalkToActorPluginTask } from './task/walk-to-actor-plugin-task'; /** @@ -77,23 +75,14 @@ const itemOnPlayerActionPipe = (player: Player, otherPlayer: Player, position: P const walkToPlugins = interactionActions.filter(plugin => plugin.walkTo); const immediateHooks = interactionActions.filter(plugin => !plugin.walkTo); - // Make sure we walk to the player before running any of the walk-to plugins - if(walkToPlugins.length !== 0) { - playerWalkTo(player, position) - .then(() => { - player.face(position); - - walkToPlugins.forEach(plugin => - plugin.handler({ - player, - otherPlayer, - position, - item, - itemWidgetId, - itemContainerId - })); - }) - .catch(() => logger.warn(`Unable to complete walk-to action.`)); + if (walkToPlugins.length > 0) { + player.enqueueBaseTask(new WalkToActorPluginTask(walkToPlugins, player, 'otherPlayer', otherPlayer, { + item, + itemWidgetId, + itemContainerId + })); + + return; } // Immediately run any non-walk-to plugins diff --git a/src/engine/action/pipe/player-interaction.action.ts b/src/engine/action/pipe/player-interaction.action.ts index e2df4d99a..5e7a9bc99 100644 --- a/src/engine/action/pipe/player-interaction.action.ts +++ b/src/engine/action/pipe/player-interaction.action.ts @@ -1,7 +1,7 @@ import { Player } from '@engine/world/actor'; import { Position } from '@engine/world'; import { ActionHook, getActionHooks, stringHookFilter, questHookFilter, RunnableHooks } from '@engine/action'; -import { playerWalkTo } from '@engine/plugins'; +import { WalkToActorPluginTask } from './task/walk-to-actor-plugin-task'; /** @@ -57,6 +57,14 @@ const playerInteractionActionPipe = (player: Player, otherPlayer: Player, positi return null; } + const walkToPlugins = matchingHooks.filter(plugin => plugin.walkTo); + + if (walkToPlugins.length > 0) { + player.enqueueBaseTask(new WalkToActorPluginTask(walkToPlugins, player, 'otherPlayer', otherPlayer, {})); + + return null; + } + return { hooks: matchingHooks, actionPosition: position, diff --git a/src/engine/action/pipe/task/walk-to-actor-plugin-task.ts b/src/engine/action/pipe/task/walk-to-actor-plugin-task.ts index 922902d32..838c69684 100644 --- a/src/engine/action/pipe/task/walk-to-actor-plugin-task.ts +++ b/src/engine/action/pipe/task/walk-to-actor-plugin-task.ts @@ -3,18 +3,20 @@ import { ActionHook } from '@engine/action/hook'; import { NpcInteractionAction } from '../npc-interaction.action'; import { ActorActorInteractionTask } from '@engine/task/impl/actor-actor-interaction-task'; import { ItemOnNpcAction } from '../item-on-npc.action'; +import { PlayerInteractionAction } from '../player-interaction.action'; +import { ItemOnPlayerAction } from '../item-on-player.action'; /** * All actions supported by this plugin task. */ -type ActorAction = NpcInteractionAction | ItemOnNpcAction; +type ActorAction = PlayerInteractionAction | ItemOnPlayerAction | NpcInteractionAction | ItemOnNpcAction; /** * An ActionHook for a supported ObjectAction. */ type ActorActionHook = ActionHook void>; -type ActorKey = 'npc'; +type ActorKey = 'otherPlayer' | 'npc'; /** * The data unique to the action being executed (i.e. excluding shared data)