Skip to content
This repository was archived by the owner on May 16, 2025. It is now read-only.

Commit 48807fc

Browse files
xVyePazaz
andauthored
feat(engine): Added visibility feature and changed death behavior for player staff (#1122)
* feat(engine): Added ::invis command * feat(engine): Made ::setvis more authentic * feat(engine): Disabled idle logout for staff * fix: Removed unused command ::possess * feat(engine): Prevent staff from dropping items on death * fix(engine): Reverted staff idle logout change * fix: setvis shouldn't cancel interactions --------- Co-authored-by: Pazaz <ItsPazaz@gmail.com>
1 parent fbd283e commit 48807fc

File tree

7 files changed

+50
-3
lines changed

7 files changed

+50
-3
lines changed

data/src/scripts/player/scripts/death.rs2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ healenergy(10000);
4545
// todo: end poison timer ~player_end_poison
4646

4747
[proc,player_death_lose_items]
48+
if (staffmodlevel > 1) { return; }
49+
4850
def_boolean $skulled = false;
4951
if (%pk_skull > 0) { $skulled = true; }
5052
def_boolean $protecting_item = false;
@@ -90,6 +92,7 @@ inv_clear(death);
9092

9193
[proc,pvp_death_lose_items]
9294
~pvp_death_message(.uid);
95+
if (staffmodlevel > 1) { return; }
9396

9497
def_boolean $skulled = false;
9598
if (%pk_skull > 0) { $skulled = true; }

src/engine/entity/Npc.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import LinkList from '#/util/LinkList.js';
4040
import {CollisionFlag} from '@2004scape/rsmod-pathfinder';
4141

4242
import InfoProt from '#/network/rs225/server/prot/InfoProt.js';
43+
import Visibility from '#/engine/entity/Visibility.js';
4344

4445
export default class Npc extends PathingEntity {
4546
// constructor properties
@@ -644,7 +645,7 @@ export default class Npc extends PathingEntity {
644645
return;
645646
}
646647

647-
if (this.target instanceof Player && World.getPlayerByUid(this.target.uid) === null) {
648+
if (this.target instanceof Player && (World.getPlayerByUid(this.target.uid) === null || this.target.visibility !== Visibility.DEFAULT)) {
648649
this.defaultMode();
649650
return;
650651
}

src/engine/entity/PathingEntity.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
reachedObj
3737
} from '#/engine/GameMap.js';
3838
import NonPathingEntity from '#/engine/entity/NonPathingEntity.js';
39+
import Visibility from '#/engine/entity/Visibility.js';
3940

4041
type TargetSubject = {
4142
type: number,
@@ -571,6 +572,10 @@ export default abstract class PathingEntity extends Entity {
571572
}
572573

573574
setInteraction(interaction: Interaction, target: Entity, op: TargetOp, subject?: TargetSubject): void {
575+
if (target instanceof Player && target.visibility === Visibility.HARD) {
576+
return;
577+
}
578+
574579
this.target = target;
575580
this.targetOp = op;
576581
this.targetSubject = subject ?? {type: -1, com: -1};

src/engine/entity/Player.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import WalkTriggerSetting from '#/util/WalkTriggerSetting.js';
7474
import Environment from '#/util/Environment.js';
7575
import { ChatModePrivate, ChatModePublic, ChatModeTradeDuel } from '#/util/ChatModes.js';
7676
import LoggerEventType from '#/server/logger/LoggerEventType.js';
77+
import Visibility from './Visibility.js';
7778

7879
const levelExperience = new Int32Array(99);
7980

@@ -296,6 +297,7 @@ export default class Player extends PathingEntity {
296297
lastCom: number = -1; // if_button
297298

298299
staffModLevel: number = 0;
300+
visibility: Visibility = Visibility.DEFAULT;
299301

300302
heroPoints: HeroPoints = new HeroPoints(16); // be sure to reset when stats are recovered/reset
301303

@@ -837,7 +839,7 @@ export default class Player extends PathingEntity {
837839
return;
838840
}
839841

840-
if (this.target.level !== this.level) {
842+
if (this.target.level !== this.level || (this.target instanceof Player && this.target.visibility !== Visibility.DEFAULT)) {
841843
this.clearInteraction();
842844
this.unsetMapFlag(); // assuming its right
843845
return;
@@ -1595,6 +1597,16 @@ export default class Player extends PathingEntity {
15951597
this.masks |= InfoProt.PLAYER_DAMAGE.id;
15961598
}
15971599

1600+
setVisibility(visibility: Visibility) {
1601+
if (visibility === Visibility.SOFT) {
1602+
this.messageGame(`vis: ${visibility} (not implemented - you are still on vis: ${this.visibility})`);
1603+
return;
1604+
}
1605+
// This doesn't actually cancel interactions, source: https://youtu.be/ARS7eO3_Z8U?si=OkYfjW0sVhkQmQ8y&t=293
1606+
this.visibility = visibility;
1607+
this.messageGame(`vis: ${visibility}`);
1608+
}
1609+
15981610
say(message: string) {
15991611
this.chat = message;
16001612
this.masks |= InfoProt.PLAYER_SAY.id;

src/engine/entity/Visibility.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
enum Visibility {
2+
DEFAULT,
3+
SOFT,
4+
HARD,
5+
}
6+
7+
export default Visibility;

src/network/rs225/client/handler/ClientCheatHandler.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import MoveStrategy from '#/engine/entity/MoveStrategy.js';
2222
import LoggerEventType from '#/server/logger/LoggerEventType.js';
2323
import Obj from '#/engine/entity/Obj.js';
2424
import EntityLifeCycle from '#/engine/entity/EntityLifeCycle.js';
25+
import Visibility from '#/engine/entity/Visibility.js';
2526

2627
export default class ClientCheatHandler extends MessageHandler<ClientCheat> {
2728
handle(message: ClientCheat, player: Player): boolean {
@@ -530,6 +531,19 @@ export default class ClientCheatHandler extends MessageHandler<ClientCheat> {
530531
}
531532

532533
World.rebootTimer(Math.ceil(tryParseInt(args[0], 30) * 1000 / 600));
534+
} else if (cmd === 'setvis') {
535+
// authentic
536+
if (args.length < 1) {
537+
// ::setvis <level>
538+
return false;
539+
}
540+
541+
switch (args[0]) {
542+
case '0': player.setVisibility(Visibility.DEFAULT); break;
543+
case '1': player.setVisibility(Visibility.SOFT); break;
544+
case '2': player.setVisibility(Visibility.HARD); break;
545+
default: return false;
546+
}
533547
}
534548
}
535549

src/network/rs225/server/codec/PlayerInfoEncoder.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import InfoProt from '#/network/rs225/server/prot/InfoProt.js';
99
import PlayerInfoFaceEntity from '#/network/server/model/PlayerInfoFaceEntity.js';
1010
import PlayerInfoFaceCoord from '#/network/server/model/PlayerInfoFaceCoord.js';
1111
import PlayerRenderer from '#/engine/renderer/PlayerRenderer.js';
12+
import Visibility from '#/engine/entity/Visibility.js';
1213

1314
export default class PlayerInfoEncoder extends MessageEncoder<PlayerInfo> {
1415
private static readonly BITS_NEW: number = 11 + 5 + 5 + 1 + 1;
@@ -77,7 +78,7 @@ export default class PlayerInfoEncoder extends MessageEncoder<PlayerInfo> {
7778
buf.pBit(8, buildArea.players.size);
7879
for (const other of buildArea.players) {
7980
const pid: number = other.pid;
80-
if (pid === -1 || other.tele || other.level !== player.level || !CoordGrid.isWithinDistanceSW(player, other, buildArea.viewDistance) || !other.checkLifeCycle(currentTick)) {
81+
if (pid === -1 || other.tele || other.level !== player.level || !CoordGrid.isWithinDistanceSW(player, other, buildArea.viewDistance) || !other.checkLifeCycle(currentTick) || other.visibility === Visibility.HARD) {
8182
// if the player was teleported, they need to be removed and re-added
8283
this.remove(buf, player, other);
8384
continue;
@@ -103,6 +104,10 @@ export default class PlayerInfoEncoder extends MessageEncoder<PlayerInfo> {
103104
const { renderer, player } = message;
104105
const { buildArea, pid, level, x, z, originX, originZ } = player;
105106
for (const other of buildArea.getNearbyPlayers(pid, level, x, z, originX, originZ)) {
107+
if (other.visibility === Visibility.HARD) {
108+
continue;
109+
}
110+
106111
const pid: number = other.pid;
107112
const length: number = renderer.lowdefinitions(pid) + renderer.highdefinitions(pid);
108113
// bits to add player + extended info size + bits to break loop (11)

0 commit comments

Comments
 (0)