diff --git a/src/engine/World.ts b/src/engine/World.ts index 1a90cfb99..11cb622fc 100644 --- a/src/engine/World.ts +++ b/src/engine/World.ts @@ -619,11 +619,6 @@ class World { continue; } - if ((!player.target || player.target instanceof Loc || player.target instanceof Obj) && player.faceEntity !== -1) { - player.faceEntity = -1; - player.masks |= player.entitymask; - } - if (!player.busy() && player.opcalled) { player.moveClickRequest = false; } else { @@ -723,6 +718,8 @@ class World { } // - engine queue player.processEngineQueue(); + // Update target facing + player.setFaceEntity(); // - interactions // - movement player.processInteraction(); @@ -908,11 +905,13 @@ class World { player.client.state = 1; - player.client.send(Uint8Array.from([ - 2, - Math.min(player.staffModLevel, 2), - 1 // mouse tracking can only be enabled on login - ])); + player.client.send( + Uint8Array.from([ + 2, + Math.min(player.staffModLevel, 2), + 1 // mouse tracking can only be enabled on login + ]) + ); const remote = player.client.remoteAddress; if (remote.indexOf('.') !== -1) { @@ -1877,10 +1876,7 @@ class World { } else if (reply === 10) { // hop timer const { remaining } = msg; - client.send(Uint8Array.from([ - 21, - Math.min(255, remaining! / 1000) - ])); + client.send(Uint8Array.from([21, Math.min(255, remaining! / 1000)])); client.close(); return; } diff --git a/src/engine/entity/Npc.ts b/src/engine/entity/Npc.ts index 9b6b69270..b30ea8161 100644 --- a/src/engine/entity/Npc.ts +++ b/src/engine/entity/Npc.ts @@ -180,6 +180,8 @@ export default class Npc extends PathingEntity { this.processQueue(); // Movement-Interactions this.processMovementInteraction(); + // Update target facing + this.setFaceEntity(); // Dev note: Is this necessary? this.validateDistanceWalked(); } @@ -404,16 +406,12 @@ export default class Npc extends PathingEntity { clearInteraction(): void { super.clearInteraction(); this.targetOp = NpcMode.NONE; - this.faceEntity = -1; - this.masks |= NpcInfoProt.FACE_ENTITY; } resetDefaults(): void { this.clearInteraction(); const type: NpcType = NpcType.get(this.type); this.targetOp = type.defaultmode; - this.faceEntity = -1; - this.masks |= this.entitymask; const npcType: NpcType = NpcType.get(this.type); this.huntMode = npcType.huntmode; diff --git a/src/engine/entity/PathingEntity.ts b/src/engine/entity/PathingEntity.ts index 391ac4524..a6eb31737 100644 --- a/src/engine/entity/PathingEntity.ts +++ b/src/engine/entity/PathingEntity.ts @@ -510,6 +510,26 @@ export default abstract class PathingEntity extends Entity { } } + setFaceEntity(): void { + const oldEntity = this.faceEntity; + if (this.target instanceof Player) { + const playerSlot: number = this.target.slot + 32768; + if (this.faceEntity !== playerSlot) { + this.faceEntity = playerSlot; + } + } else if (this.target instanceof Npc) { + const nid: number = this.target.nid; + if (this.faceEntity !== nid) { + this.faceEntity = nid; + } + } else { + this.faceEntity = -1; + } + if (this.faceEntity !== oldEntity) { + this.masks |= this.entitymask; + } + } + setInteraction(interaction: Interaction, target: Entity, op: TargetOp, com?: number): boolean { if (!target.isValid(this instanceof Player ? this.hash64 : undefined)) { return false; @@ -530,19 +550,7 @@ export default abstract class PathingEntity extends Entity { this.focus(CoordGrid.fine(target.x, target.width), CoordGrid.fine(target.z, target.length), target instanceof NonPathingEntity && interaction === Interaction.ENGINE); - if (target instanceof Player) { - const playerSlot: number = target.slot + 32768; - if (this.faceEntity !== playerSlot) { - this.faceEntity = playerSlot; - this.masks |= this.entitymask; - } - } else if (target instanceof Npc) { - const nid: number = target.nid; - if (this.faceEntity !== nid) { - this.faceEntity = nid; - this.masks |= this.entitymask; - } - } else { + if (target instanceof NonPathingEntity) { this.targetX = CoordGrid.fine(target.x, target.width); this.targetZ = CoordGrid.fine(target.z, target.length); } @@ -614,10 +622,7 @@ export default abstract class PathingEntity extends Entity { this.faceSquareX = -1; this.faceSquareZ = -1; - if (!this.target && this.faceEntity !== -1) { - this.masks |= this.entitymask; - this.faceEntity = -1; - } + this.setFaceEntity(); } private takeStep(): number | null { diff --git a/src/engine/entity/Player.ts b/src/engine/entity/Player.ts index 3bee40378..ae5b07ea8 100644 --- a/src/engine/entity/Player.ts +++ b/src/engine/entity/Player.ts @@ -414,9 +414,17 @@ export default class Player extends PathingEntity { constructor(username: string, username37: bigint, hash64: bigint) { super( - 0, 3094, 3106, // tutorial island - 1, 1, - EntityLifeCycle.FOREVER, MoveRestrict.NORMAL, BlockWalk.NPC, MoveStrategy.SMART, PlayerInfoProt.FACE_COORD, PlayerInfoProt.FACE_ENTITY + 0, + 3094, + 3106, // tutorial island + 1, + 1, + EntityLifeCycle.FOREVER, + MoveRestrict.NORMAL, + BlockWalk.NPC, + MoveStrategy.SMART, + PlayerInfoProt.FACE_COORD, + PlayerInfoProt.FACE_ENTITY ); this.username = username; @@ -1755,7 +1763,7 @@ export default class Player extends PathingEntity { const { basevar, startbit, endbit } = varbit; const mask = Packet.bitmask[endbit - startbit + 1]; - return this.vars[basevar] >> startbit & mask; + return (this.vars[basevar] >> startbit) & mask; } setVarBit(id: number, value: number) { @@ -1772,7 +1780,7 @@ export default class Player extends PathingEntity { } mask <<= startbit; - this.setVar(basevar, mask & value << startbit | this.vars[basevar] & ~mask); + this.setVar(basevar, (mask & (value << startbit)) | (this.vars[basevar] & ~mask)); } private writeVarp(id: number, value: number): void { diff --git a/src/network/game/client/handler/OpHeldHandler.ts b/src/network/game/client/handler/OpHeldHandler.ts index 7779224d6..e3386d56c 100644 --- a/src/network/game/client/handler/OpHeldHandler.ts +++ b/src/network/game/client/handler/OpHeldHandler.ts @@ -56,8 +56,6 @@ export default class OpHeldHandler extends ClientGameMessageHandler { } player.moveClickRequest = false; // uses the dueling ring op to move whilst busy & queue pending: https://youtu.be/GPfN3Isl2rM - player.faceEntity = -1; - player.masks |= player.entitymask; // opheld5 gets wealth logged in content if (message.op !== 5) { diff --git a/src/network/game/client/handler/OpHeldTHandler.ts b/src/network/game/client/handler/OpHeldTHandler.ts index 2cf2ff3dc..f747a54e4 100644 --- a/src/network/game/client/handler/OpHeldTHandler.ts +++ b/src/network/game/client/handler/OpHeldTHandler.ts @@ -55,8 +55,6 @@ export default class OpHeldTHandler extends ClientGameMessageHandler { player.lastSlot = slot; player.clearPendingAction(); - player.faceEntity = -1; - player.masks |= player.entitymask; player.addSessionLog(LoggerEventType.MODERATOR, `Cast ${spellCom.comName} on ${ObjType.get(obj).debugname}`); diff --git a/src/network/game/client/handler/OpHeldUHandler.ts b/src/network/game/client/handler/OpHeldUHandler.ts index 1a5db0544..ca5d0aa3e 100644 --- a/src/network/game/client/handler/OpHeldUHandler.ts +++ b/src/network/game/client/handler/OpHeldUHandler.ts @@ -84,8 +84,6 @@ export default class OpHeldUHandler extends ClientGameMessageHandler { const useObjType = ObjType.get(player.lastUseItem); player.clearPendingAction(); - player.faceEntity = -1; - player.masks |= player.entitymask; if ((objType.members || useObjType.members) && !Environment.NODE_MEMBERS) { player.messageGame("To use this item please login to a members' server.");