Skip to content

Commit fd9cd89

Browse files
committed
implement show hidden players in sidebar option, closes #88
adds `settings.hide.show-hidden-players-in-sidebar` option to PlayersLayer config This includes some changes to the webmap files. If you made any changes to them, please back them up and set `settings.web-directory.read-only` to `false` in the config to allow for the new changes to take effect.
1 parent f44685a commit fd9cd89

5 files changed

Lines changed: 54 additions & 4 deletions

File tree

core/src/main/java/net/pl3x/map/core/configuration/PlayersLayerConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public final class PlayersLayerConfig extends AbstractConfig {
3434
Show online players on the map and sidebar.""")
3535
public static boolean ENABLED = true;
3636

37+
@Key("settings.hide.show-hidden-players-in-sidebar")
38+
@Comment("""
39+
Should hidden players be shown in the sidebar.""")
40+
public static boolean SHOW_HIDDEN_PLAYERS_IN_SIDEBAR = false;
41+
3742
@Key("settings.hide.invisible")
3843
@Comment("""
3944
Should invisible players be hidden from the map.""")

core/src/main/java/net/pl3x/map/core/player/PlayerRegistry.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,18 @@ public List<Object> parsePlayers() {
105105
List<Object> players = new ArrayList<>();
106106
forEach(player -> {
107107
// do not expose hidden players in the json
108+
boolean isHidden = false;
108109
if (player.isHidden() || player.isNPC()) {
109-
return;
110+
isHidden = true;
110111
}
111112
if (PlayersLayerConfig.HIDE_SPECTATORS && player.isSpectator()) {
112-
return;
113+
isHidden = true;
113114
}
114115
if (PlayersLayerConfig.HIDE_INVISIBLE && player.isInvisible()) {
116+
isHidden = true;
117+
}
118+
119+
if (isHidden && !PlayersLayerConfig.SHOW_HIDDEN_PLAYERS_IN_SIDEBAR) {
115120
return;
116121
}
117122

@@ -120,8 +125,11 @@ public List<Object> parsePlayers() {
120125
playerEntry.put("name", player.getDecoratedName());
121126
playerEntry.put("uuid", player.getUUID().toString());
122127
playerEntry.put("displayName", player.getDecoratedName());
123-
playerEntry.put("world", player.getWorld().getName());
124-
playerEntry.put("position", player.getPosition());
128+
129+
if (!isHidden) {
130+
playerEntry.put("world", player.getWorld().getName());
131+
playerEntry.put("position", player.getPosition());
132+
}
125133

126134
players.add(playerEntry);
127135
});

webmap/src/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ declare global {
1717
overlayremoved: CustomEvent<MarkerLayer>;
1818
playeradded: CustomEvent<Player>;
1919
playerremoved: CustomEvent<Player>;
20+
playerupdate: CustomEvent<Player>;
2021
rendererselected: CustomEvent<World>;
2122
worldadded: CustomEvent<World>;
2223
worldremoved: CustomEvent<World>;

webmap/src/player/PlayerManager.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,15 @@ export class PlayerManager {
1818

1919
public update(players: Player[]): void {
2020
const toRemove: Set<string> = new Set(this._players.keys());
21+
const toUpdate: Set<string> = new Set();
2122

2223
players.forEach((data: Player): void => {
2324
const existing: Player | undefined = this._players.get(data.uuid);
2425
if (existing) {
26+
if (existing.position === undefined && data.position !== undefined) {
27+
toUpdate.add(data.uuid);
28+
}
29+
2530
// update existing
2631
existing.displayName = data.displayName;
2732
existing.world = data.world;
@@ -46,6 +51,13 @@ export class PlayerManager {
4651
fireCustomEvent('playerremoved', player);
4752
});
4853

54+
toUpdate.forEach((uuid: string): void => {
55+
// remove players not in updated settings file
56+
const player: Player | undefined = this._players.get(uuid);
57+
fireCustomEvent('playerupdate', player);
58+
});
59+
60+
4961
// follow
5062
this.updateFollow();
5163
}

webmap/src/sidebar/PlayersTab.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,27 @@ export default class PlayersTab extends BaseTab {
5959
item.input.checked = player === e.detail;
6060
});
6161
});
62+
addEventListener('playerupdate', (e: CustomEvent<Player>): void => {
63+
const listItem: PlayerListItem | undefined = this._players.get(e.detail);
64+
if (listItem === undefined) {
65+
return;
66+
}
67+
let wasDisabled: boolean = listItem.input.disabled;
68+
let isDisabled: boolean = e.detail.position === undefined;
69+
listItem.input.disabled = isDisabled;
70+
if (isDisabled) {
71+
listItem.label.setAttribute('disabled', "");
72+
} else {
73+
listItem.label.removeAttribute('disabled');
74+
}
75+
if (wasDisabled && !isDisabled) {
76+
const manager: PlayerManager = this._pl3xmap.playerManager;
77+
if (e.detail === manager.follow) {
78+
manager.follow = undefined;
79+
manager.updateFollow();
80+
}
81+
}
82+
});
6283

6384
this._list.addEventListener('keydown', (e: KeyboardEvent) =>
6485
handleKeyboardEvent(e, Array.from(this._list.elements) as HTMLElement[]))
@@ -92,6 +113,9 @@ export default class PlayersTab extends BaseTab {
92113
input.addEventListener('click', async (): Promise<void> => {
93114
const manager: PlayerManager = this._pl3xmap.playerManager;
94115
const player: Player | undefined = manager.players.get(input.id);
116+
if (player !== undefined && player.position === undefined) {
117+
return;
118+
}
95119
if (player === manager.follow) {
96120
manager.follow = undefined;
97121
} else {

0 commit comments

Comments
 (0)