Skip to content

Commit 16ef70a

Browse files
authored
fix: improve Npc and Player facing to match RS2 behavior (#82)
Co-authored-by: markb5 <mask>
1 parent eedfcf1 commit 16ef70a

File tree

7 files changed

+47
-46
lines changed

7 files changed

+47
-46
lines changed

src/engine/World.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -619,11 +619,6 @@ class World {
619619
continue;
620620
}
621621

622-
if ((!player.target || player.target instanceof Loc || player.target instanceof Obj) && player.faceEntity !== -1) {
623-
player.faceEntity = -1;
624-
player.masks |= player.entitymask;
625-
}
626-
627622
if (!player.busy() && player.opcalled) {
628623
player.moveClickRequest = false;
629624
} else {
@@ -723,6 +718,8 @@ class World {
723718
}
724719
// - engine queue
725720
player.processEngineQueue();
721+
// Update target facing
722+
player.setFaceEntity();
726723
// - interactions
727724
// - movement
728725
player.processInteraction();
@@ -908,11 +905,13 @@ class World {
908905

909906
player.client.state = 1;
910907

911-
player.client.send(Uint8Array.from([
912-
2,
913-
Math.min(player.staffModLevel, 2),
914-
1 // mouse tracking can only be enabled on login
915-
]));
908+
player.client.send(
909+
Uint8Array.from([
910+
2,
911+
Math.min(player.staffModLevel, 2),
912+
1 // mouse tracking can only be enabled on login
913+
])
914+
);
916915

917916
const remote = player.client.remoteAddress;
918917
if (remote.indexOf('.') !== -1) {
@@ -1877,10 +1876,7 @@ class World {
18771876
} else if (reply === 10) {
18781877
// hop timer
18791878
const { remaining } = msg;
1880-
client.send(Uint8Array.from([
1881-
21,
1882-
Math.min(255, remaining! / 1000)
1883-
]));
1879+
client.send(Uint8Array.from([21, Math.min(255, remaining! / 1000)]));
18841880
client.close();
18851881
return;
18861882
}

src/engine/entity/Npc.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ export default class Npc extends PathingEntity {
180180
this.processQueue();
181181
// Movement-Interactions
182182
this.processMovementInteraction();
183+
// Update target facing
184+
this.setFaceEntity();
183185
// Dev note: Is this necessary?
184186
this.validateDistanceWalked();
185187
}
@@ -404,16 +406,12 @@ export default class Npc extends PathingEntity {
404406
clearInteraction(): void {
405407
super.clearInteraction();
406408
this.targetOp = NpcMode.NONE;
407-
this.faceEntity = -1;
408-
this.masks |= NpcInfoProt.FACE_ENTITY;
409409
}
410410

411411
resetDefaults(): void {
412412
this.clearInteraction();
413413
const type: NpcType = NpcType.get(this.type);
414414
this.targetOp = type.defaultmode;
415-
this.faceEntity = -1;
416-
this.masks |= this.entitymask;
417415

418416
const npcType: NpcType = NpcType.get(this.type);
419417
this.huntMode = npcType.huntmode;

src/engine/entity/PathingEntity.ts

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,26 @@ export default abstract class PathingEntity extends Entity {
510510
}
511511
}
512512

513+
setFaceEntity(): void {
514+
const oldEntity = this.faceEntity;
515+
if (this.target instanceof Player) {
516+
const playerSlot: number = this.target.slot + 32768;
517+
if (this.faceEntity !== playerSlot) {
518+
this.faceEntity = playerSlot;
519+
}
520+
} else if (this.target instanceof Npc) {
521+
const nid: number = this.target.nid;
522+
if (this.faceEntity !== nid) {
523+
this.faceEntity = nid;
524+
}
525+
} else {
526+
this.faceEntity = -1;
527+
}
528+
if (this.faceEntity !== oldEntity) {
529+
this.masks |= this.entitymask;
530+
}
531+
}
532+
513533
setInteraction(interaction: Interaction, target: Entity, op: TargetOp, com?: number): boolean {
514534
if (!target.isValid(this instanceof Player ? this.hash64 : undefined)) {
515535
return false;
@@ -530,19 +550,7 @@ export default abstract class PathingEntity extends Entity {
530550

531551
this.focus(CoordGrid.fine(target.x, target.width), CoordGrid.fine(target.z, target.length), target instanceof NonPathingEntity && interaction === Interaction.ENGINE);
532552

533-
if (target instanceof Player) {
534-
const playerSlot: number = target.slot + 32768;
535-
if (this.faceEntity !== playerSlot) {
536-
this.faceEntity = playerSlot;
537-
this.masks |= this.entitymask;
538-
}
539-
} else if (target instanceof Npc) {
540-
const nid: number = target.nid;
541-
if (this.faceEntity !== nid) {
542-
this.faceEntity = nid;
543-
this.masks |= this.entitymask;
544-
}
545-
} else {
553+
if (target instanceof NonPathingEntity) {
546554
this.targetX = CoordGrid.fine(target.x, target.width);
547555
this.targetZ = CoordGrid.fine(target.z, target.length);
548556
}
@@ -614,10 +622,7 @@ export default abstract class PathingEntity extends Entity {
614622
this.faceSquareX = -1;
615623
this.faceSquareZ = -1;
616624

617-
if (!this.target && this.faceEntity !== -1) {
618-
this.masks |= this.entitymask;
619-
this.faceEntity = -1;
620-
}
625+
this.setFaceEntity();
621626
}
622627

623628
private takeStep(): number | null {

src/engine/entity/Player.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,17 @@ export default class Player extends PathingEntity {
414414

415415
constructor(username: string, username37: bigint, hash64: bigint) {
416416
super(
417-
0, 3094, 3106, // tutorial island
418-
1, 1,
419-
EntityLifeCycle.FOREVER, MoveRestrict.NORMAL, BlockWalk.NPC, MoveStrategy.SMART, PlayerInfoProt.FACE_COORD, PlayerInfoProt.FACE_ENTITY
417+
0,
418+
3094,
419+
3106, // tutorial island
420+
1,
421+
1,
422+
EntityLifeCycle.FOREVER,
423+
MoveRestrict.NORMAL,
424+
BlockWalk.NPC,
425+
MoveStrategy.SMART,
426+
PlayerInfoProt.FACE_COORD,
427+
PlayerInfoProt.FACE_ENTITY
420428
);
421429

422430
this.username = username;
@@ -1755,7 +1763,7 @@ export default class Player extends PathingEntity {
17551763
const { basevar, startbit, endbit } = varbit;
17561764
const mask = Packet.bitmask[endbit - startbit + 1];
17571765

1758-
return this.vars[basevar] >> startbit & mask;
1766+
return (this.vars[basevar] >> startbit) & mask;
17591767
}
17601768

17611769
setVarBit(id: number, value: number) {
@@ -1772,7 +1780,7 @@ export default class Player extends PathingEntity {
17721780
}
17731781

17741782
mask <<= startbit;
1775-
this.setVar(basevar, mask & value << startbit | this.vars[basevar] & ~mask);
1783+
this.setVar(basevar, (mask & (value << startbit)) | (this.vars[basevar] & ~mask));
17761784
}
17771785

17781786
private writeVarp(id: number, value: number): void {

src/network/game/client/handler/OpHeldHandler.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ export default class OpHeldHandler extends ClientGameMessageHandler<OpHeld> {
5656
}
5757

5858
player.moveClickRequest = false; // uses the dueling ring op to move whilst busy & queue pending: https://youtu.be/GPfN3Isl2rM
59-
player.faceEntity = -1;
60-
player.masks |= player.entitymask;
6159

6260
// opheld5 gets wealth logged in content
6361
if (message.op !== 5) {

src/network/game/client/handler/OpHeldTHandler.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ export default class OpHeldTHandler extends ClientGameMessageHandler<OpHeldT> {
5555
player.lastSlot = slot;
5656

5757
player.clearPendingAction();
58-
player.faceEntity = -1;
59-
player.masks |= player.entitymask;
6058

6159
player.addSessionLog(LoggerEventType.MODERATOR, `Cast ${spellCom.comName} on ${ObjType.get(obj).debugname}`);
6260

src/network/game/client/handler/OpHeldUHandler.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ export default class OpHeldUHandler extends ClientGameMessageHandler<OpHeldU> {
8484
const useObjType = ObjType.get(player.lastUseItem);
8585

8686
player.clearPendingAction();
87-
player.faceEntity = -1;
88-
player.masks |= player.entitymask;
8987

9088
if ((objType.members || useObjType.members) && !Environment.NODE_MEMBERS) {
9189
player.messageGame("To use this item please login to a members' server.");

0 commit comments

Comments
 (0)