Skip to content

Commit 63e182c

Browse files
committed
Add Scoreboard/HUD support for Folia, convert Scoreboards to Adventure.
Adds a ServerHUD which is either a FoliaHUD or PaperHUD. HUDImplementers like MapHUD and PermHUD be used to make instances of either PaperHUDs or FoliaHUD. MapHUD and PermHUD both require a HUD which is then used by FoliaHUD and PaperHUD. The HUDManager class is used to track Towny's MapHUD and PermHUD.
1 parent 506f3d2 commit 63e182c

File tree

9 files changed

+638
-433
lines changed

9 files changed

+638
-433
lines changed

Towny/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@
222222
<version>4.98.0</version>
223223
<scope>test</scope>
224224
</dependency>
225+
<dependency>
226+
<groupId>fr.mrmicky</groupId>
227+
<artifactId>fastboard</artifactId>
228+
<version>2.1.5</version>
229+
</dependency>
225230
</dependencies>
226231

227232
<pluginRepositories>
@@ -350,6 +355,10 @@
350355
<pattern>solar.squares.pixelwidth</pattern>
351356
<shadedPattern>com.palmergames.bukkit.towny.libs.pixelwidth</shadedPattern>
352357
</relocation>
358+
<relocation>
359+
<pattern>fr.mrmicky.fastboard</pattern>
360+
<shadedPattern>com.palmergames.fastboard</shadedPattern>
361+
</relocation>
353362
</relocations>
354363
<filters>
355364
<filter>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.palmergames.bukkit.towny.huds;
2+
3+
import com.palmergames.bukkit.towny.huds.providers.HUD;
4+
5+
public interface HUDImplementer {
6+
public HUD getHUD();
7+
}
Lines changed: 137 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,153 +1,209 @@
11
package com.palmergames.bukkit.towny.huds;
22

33
import com.palmergames.bukkit.towny.Towny;
4-
import com.palmergames.bukkit.towny.TownyMessaging;
4+
import com.palmergames.bukkit.towny.TownyAPI;
55
import com.palmergames.bukkit.towny.event.PlayerChangePlotEvent;
66
import com.palmergames.bukkit.towny.event.TownBlockSettingsChangedEvent;
7-
import com.palmergames.bukkit.towny.object.Translatable;
7+
import com.palmergames.bukkit.towny.huds.providers.FoliaHUD;
8+
import com.palmergames.bukkit.towny.huds.providers.PaperHUD;
9+
import com.palmergames.bukkit.towny.huds.providers.ServerHUD;
810
import com.palmergames.bukkit.towny.object.WorldCoord;
9-
import org.bukkit.Bukkit;
1011
import org.bukkit.entity.Player;
1112
import org.bukkit.event.EventHandler;
1213
import org.bukkit.event.Listener;
1314
import org.bukkit.event.player.PlayerQuitEvent;
1415

1516
import java.util.ArrayList;
17+
import java.util.HashMap;
1618
import java.util.List;
17-
import java.util.Optional;
19+
import java.util.Map;
1820

19-
public class HUDManager implements Listener{
21+
import org.jetbrains.annotations.Nullable;
2022

21-
static List<Player> permUsers;
22-
static List<Player> mapUsers;
23+
public class HUDManager implements Listener {
24+
25+
private static final String MAP_HUD_OBJECTIVE_NAME = "MAP_HUD_OBJ";
26+
private static final String PERM_HUD_OBJECTIVE_NAME = "PLOT_PERM_OBJ";
27+
static Map<String, ServerHUD> huds = new HashMap<>();
2328
/** Scoreboards cannot show more than 15 lines. **/
2429
static final int MAX_SCOREBOARD_HEIGHT = 15;
2530

26-
public HUDManager (Towny plugin) {
27-
permUsers = new ArrayList<>();
28-
mapUsers = new ArrayList<>();
31+
public HUDManager(Towny plugin) {
32+
boolean isFolia = Towny.getPlugin().isFolia();
33+
34+
PermHUD permHud = new PermHUD("permHUD", PERM_HUD_OBJECTIVE_NAME, (p) -> PermHUD.updatePerms(p), (p, wc) -> PermHUD.updatePerms(p, (WorldCoord) wc));
35+
huds.put("permHUD", isFolia ? new FoliaHUD(permHud) : new PaperHUD(permHud));
36+
37+
MapHUD mapHud = new MapHUD("mapHUD", MAP_HUD_OBJECTIVE_NAME, (p) -> MapHUD.updateMap(p), (p, wc) -> MapHUD.updateMap(p, (WorldCoord) wc));
38+
huds.put("mapHUD", isFolia ? new FoliaHUD(mapHud) : new PaperHUD(mapHud));
2939
}
3040

31-
//**TOGGLES**//
32-
public static void togglePermHUD (Player p) {
33-
if (Towny.getPlugin().isFolia()) {
34-
TownyMessaging.sendErrorMsg(p, Translatable.of("msg_folia_scoreboard"));
41+
@Nullable
42+
public static ServerHUD getHUD(String name) {
43+
return huds.get(name);
44+
}
45+
46+
public static void addHUD(String name, ServerHUD hud) {
47+
huds.put(name, null);
48+
}
49+
50+
public static void removeHUD(String name) {
51+
huds.remove(name);
52+
}
53+
54+
public static void toggleHUD(Player player, String hudName) {
55+
if (!huds.containsKey(hudName)) {
56+
Towny.getPlugin().getLogger().warning("Unabled to toggle " + hudName + " hud for player " + player.getName() + ", it does not exist.");
3557
return;
3658
}
37-
38-
if (!permUsers.contains(p)) {
39-
toggleAllOff(p);
40-
permUsers.add(p);
41-
PermHUD.toggleOn(p);
42-
} else
43-
toggleAllOff(p);
44-
}
45-
46-
public static void toggleMapHud(Player player) {
47-
if (Towny.getPlugin().isFolia()) {
48-
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_folia_scoreboard"));
59+
60+
ServerHUD hud = huds.get(hudName);
61+
if (hud.hasPlayer(player)) {
62+
hud.toggleOff(player);
4963
return;
5064
}
51-
52-
if (!mapUsers.contains(player)) {
53-
toggleAllOff(player);
54-
mapUsers.add(player);
55-
MapHUD.toggleOn(player);
56-
} else
57-
toggleAllOff(player);
65+
66+
toggleAllOff(player);
67+
hud.addPlayer(player);
68+
hud.toggleOn(player);
69+
}
70+
71+
/**
72+
* Called from the /plot perm hud command.
73+
* @param p Player who is toggling their perm hud.
74+
*/
75+
public static void togglePermHUD (Player p) {
76+
toggleHUD(p, "permHUD");
77+
}
78+
79+
/**
80+
* Called from the /towny map hud command.
81+
* @param p Player who is toggling their map hud.
82+
*/
83+
public static void toggleMapHud(Player player) {
84+
toggleHUD(player, "mapHUD");
5885
}
5986

6087
public static void toggleAllOff (Player p) {
61-
permUsers.remove(p);
62-
mapUsers.remove(p);
63-
if (p.isOnline())
64-
toggleOff(p);
65-
}
66-
67-
public static void toggleOff(final Player player) {
68-
if (Towny.getPlugin().isFolia())
69-
return;
70-
71-
Optional.ofNullable(Bukkit.getScoreboardManager()).ifPresent(manager -> player.setScoreboard(manager.getMainScoreboard()));
88+
for (ServerHUD hud : new ArrayList<>(huds.values())) {
89+
if (hud.hasPlayer(p)) {
90+
hud.removePlayer(p);
91+
if (hud.isActive(p))
92+
hud.toggleOff(p);
93+
}
94+
}
7295
}
7396

7497
//**EVENTS**//
7598
@EventHandler
7699
public void onPlayerQuit(PlayerQuitEvent event) {
77-
permUsers.remove(event.getPlayer());
78-
mapUsers.remove(event.getPlayer());
100+
Player p = event.getPlayer();
101+
for (ServerHUD huds : new ArrayList<>(huds.values())) {
102+
if (huds.hasPlayer(p)) {
103+
huds.removePlayer(p);
104+
}
105+
}
79106
}
80107

81108
@EventHandler
82109
public void onPlayerMovePlotsEvent(PlayerChangePlotEvent event) {
83110
Player p = event.getPlayer();
84-
if (permUsers.contains(p)) {
85-
if (!isPermHUDActive(p))
86-
permUsers.remove(p);
87-
else {
88-
if (event.getTownyWorldTo().isUsingTowny())
89-
PermHUD.updatePerms(p, event.getTo());
90-
else
91-
toggleAllOff(p);
92-
}
93-
} else if (mapUsers.contains(p)) {
94-
if (!isMapHudActive(p))
95-
mapUsers.remove(p);
111+
if (!event.getTownyWorldTo().isUsingTowny()) {
112+
toggleAllOff(p);
113+
return;
114+
}
115+
116+
ServerHUD serverHUD = huds.get("permHUD");
117+
if (serverHUD != null && serverHUD.hasPlayer(p)) {
118+
if (!serverHUD.isActive(p)) // Player is seeing another HUD.
119+
serverHUD.removePlayer(p);
96120
else
97-
if (event.getTownyWorldTo().isUsingTowny())
98-
MapHUD.updateMap(p, event.getTo());
99-
else
100-
toggleAllOff(p);
121+
serverHUD.updateHUD(p, event.getTo());
122+
}
123+
124+
serverHUD = huds.get("mapHUD");
125+
if (serverHUD != null && serverHUD.hasPlayer(p)) {
126+
if (!serverHUD.isActive(p)) // Player is seeing another HUD.
127+
serverHUD.removePlayer(p);
128+
else
129+
serverHUD.updateHUD(p, event.getTo());
101130
}
102131
}
103132

104133
//Perm Specific
105134
@EventHandler
106135
public void onTownBlockSettingsChanged (TownBlockSettingsChangedEvent e) {
107136

108-
if (e.getTownyWorld() != null)
109-
permUsers.forEach(p -> PermHUD.updatePerms(p));
137+
ServerHUD hud = huds.get("permHUD");
138+
if (e.getTownyWorld() != null)
139+
hud.getPlayers().stream()
140+
.filter(p -> TownyAPI.getInstance().isWilderness(p.getLocation()))
141+
.forEach(p -> hud.updateHUD(p));
142+
110143
else if (e.getTown() != null)
111-
permUsers.stream().filter(p -> WorldCoord.parseWorldCoord(p).hasTown(e.getTown()))
112-
.forEach(p -> PermHUD.updatePerms(p));
144+
hud.getPlayers().stream()
145+
.filter(p -> WorldCoord.parseWorldCoord(p).hasTown(e.getTown()))
146+
.forEach(p -> hud.updateHUD(p));
147+
113148
else if (e.getTownBlock() != null)
114-
permUsers.stream().filter(p -> e.getTownBlock().getWorldCoord().equals(WorldCoord.parseWorldCoord(p)))
115-
.forEach(p -> PermHUD.updatePerms(p));
149+
hud.getPlayers().stream()
150+
.filter(p -> e.getTownBlock().getWorldCoord().equals(WorldCoord.parseWorldCoord(p)))
151+
.forEach(p -> hud.updateHUD(p));
116152
}
117153

118154
public static String check(String string) {
119155
return string.length() > 64 ? string.substring(0, 64) : string;
120156
}
121157

122158
public static boolean isUsingTownyHUD(Player player) {
123-
return permUsers.contains(player) || mapUsers.contains(player);
159+
return huds.values().stream().anyMatch(hud -> hud.hasPlayer(player) && hud.isActive(player));
124160
}
125161

162+
/**
163+
* @deprecated since 0.102.0.8
164+
* @return the list of perm hud users
165+
*/
166+
@Deprecated
126167
public static List<Player> getPermHUDUsers() {
127-
return permUsers;
168+
return new ArrayList<>(huds.get("permHUD").getPlayers());
128169
}
129-
170+
171+
/**
172+
* @deprecated since 0.102.0.8
173+
* @return the list of map hud users
174+
*/
175+
@Deprecated
130176
public static List<Player> getMapHUDUsers() {
131-
return mapUsers;
177+
return new ArrayList<>(huds.get("mapHUD").getPlayers());
132178
}
133179

180+
/**
181+
* @deprecated since 0.102.0.8
182+
*/
183+
@Deprecated
134184
public static void removePermHUDUser(Player player) {
135-
if (permUsers.remove(player)) {
136-
toggleOff(player);
137-
}
185+
huds.get("permHUD").toggleOff(player);
138186
}
139-
187+
188+
/**
189+
* @deprecated since 0.102.0.8
190+
*/
191+
@Deprecated
140192
public static void removeMapHUDUser(Player player) {
141-
if (mapUsers.remove(player)) {
142-
toggleOff(player);
143-
}
193+
huds.get("mapHUD").toggleOff(player);
144194
}
145195

196+
/**
197+
* @deprecated since 0.102.0.8
198+
*/
146199
public static boolean isPermHUDActive(Player player) {
147-
return player.getScoreboard().getTeam(PermHUD.permHudTestKey()) != null;
200+
return huds.get("permHUD").isActive(player);
148201
}
149202

203+
/**
204+
* @deprecated since 0.102.0.8
205+
*/
150206
public static boolean isMapHudActive(Player player) {
151-
return player.getScoreboard().getTeam(MapHUD.mapHudTestKey()) != null;
207+
return huds.get("mapHUD").isActive(player);
152208
}
153209
}

0 commit comments

Comments
 (0)