Skip to content

Commit 35b02d0

Browse files
committed
feat: allow ActorWalkToTask to accept a LandscapeObject as a target
1 parent f103d4a commit 35b02d0

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

src/engine/task/impl/actor-landscape-object-interaction-task.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { LandscapeObject } from '@runejs/filestore';
12
import { activeWorld, Position } from '@engine/world';
23
import { Actor } from '@engine/world/actor';
3-
import { LandscapeObject } from '@runejs/filestore';
44
import { ActorWalkToTask } from './actor-walk-to-task';
55

66
/**
@@ -11,8 +11,9 @@ import { ActorWalkToTask } from './actor-walk-to-task';
1111
*
1212
* @author jameskmonger
1313
*/
14-
export abstract class ActorLandscapeObjectInteractionTask<TActor extends Actor = Actor> extends ActorWalkToTask<TActor> {
14+
export abstract class ActorLandscapeObjectInteractionTask<TActor extends Actor = Actor> extends ActorWalkToTask<TActor, LandscapeObject> {
1515
private _landscapeObject: LandscapeObject;
16+
private _objectPosition: Position;
1617

1718
/**
1819
* Gets the {@link LandscapeObject} that this task is interacting with.
@@ -37,6 +38,19 @@ export abstract class ActorLandscapeObjectInteractionTask<TActor extends Actor =
3738
return this._landscapeObject;
3839
}
3940

41+
/**
42+
* Get the position of this task's landscape object
43+
*
44+
* @returns The position of this task's landscape object, or null if the landscape object is not present
45+
*/
46+
protected get landscapeObjectPosition(): Position {
47+
if (!this._landscapeObject) {
48+
return null;
49+
}
50+
51+
return this._objectPosition;
52+
}
53+
4054
/**
4155
* @param actor The actor executing this task.
4256
* @param landscapeObject The landscape object to interact with.
@@ -51,7 +65,7 @@ export abstract class ActorLandscapeObjectInteractionTask<TActor extends Actor =
5165
) {
5266
super(
5367
actor,
54-
new Position(landscapeObject.x, landscapeObject.y, landscapeObject.level),
68+
landscapeObject,
5569
Math.max(sizeX, sizeY)
5670
);
5771

@@ -60,6 +74,8 @@ export abstract class ActorLandscapeObjectInteractionTask<TActor extends Actor =
6074
return;
6175
}
6276

77+
// create the Position here to prevent instantiating a new Position every tick
78+
this._objectPosition = new Position(landscapeObject.x, landscapeObject.y, landscapeObject.level);
6379
this._landscapeObject = landscapeObject;
6480
}
6581

@@ -80,7 +96,7 @@ export abstract class ActorLandscapeObjectInteractionTask<TActor extends Actor =
8096
return;
8197
}
8298

83-
const { object: worldObject } = activeWorld.findObjectAtLocation(this.actor, this._landscapeObject.objectId, this.destination);
99+
const { object: worldObject } = activeWorld.findObjectAtLocation(this.actor, this._landscapeObject.objectId, this._objectPosition);
84100

85101
if (!worldObject) {
86102
this.stop();

src/engine/task/impl/actor-walk-to-task.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { LandscapeObject } from '@runejs/filestore';
12
import { Position } from '@engine/world/position';
23
import { Actor } from '@engine/world/actor';
34
import { TaskStackType, TaskBreakType, TaskStackGroup } from '../types';
@@ -11,7 +12,7 @@ import { ActorTask } from './actor-task';
1112
*
1213
* @author jameskmonger
1314
*/
14-
export interface ActorWalkToTask<TActor extends Actor = Actor> extends ActorTask<TActor> {
15+
export interface ActorWalkToTask<TActor extends Actor = Actor, TTarget extends LandscapeObject | Position = Position> extends ActorTask<TActor> {
1516
/**
1617
* An optional function that is called when the actor arrives at the destination.
1718
*/
@@ -26,7 +27,7 @@ export interface ActorWalkToTask<TActor extends Actor = Actor> extends ActorTask
2627
*
2728
* @author jameskmonger
2829
*/
29-
export abstract class ActorWalkToTask<TActor extends Actor = Actor> extends ActorTask<TActor> {
30+
export abstract class ActorWalkToTask<TActor extends Actor = Actor, TTarget extends LandscapeObject | Position = Position> extends ActorTask<TActor> {
3031
private _atDestination: boolean = false;
3132

3233
/**
@@ -43,7 +44,7 @@ export abstract class ActorWalkToTask<TActor extends Actor = Actor> extends Acto
4344
*/
4445
constructor (
4546
actor: TActor,
46-
protected readonly destination: Position,
47+
protected readonly destination: TTarget,
4748
protected readonly distance = 1,
4849
) {
4950
super(
@@ -58,7 +59,11 @@ export abstract class ActorWalkToTask<TActor extends Actor = Actor> extends Acto
5859
}
5960
);
6061

61-
this.actor.pathfinding.walkTo(destination, { })
62+
if(destination instanceof Position) {
63+
this.actor.pathfinding.walkTo(destination, { })
64+
} else {
65+
this.actor.pathfinding.walkTo(new Position(destination.x, destination.y), { })
66+
}
6267
}
6368

6469
/**

0 commit comments

Comments
 (0)