|
1 | 1 | package com.palmergames.bukkit.towny.huds; |
2 | 2 |
|
3 | 3 | import com.palmergames.bukkit.towny.Towny; |
4 | | -import com.palmergames.bukkit.towny.TownyMessaging; |
| 4 | +import com.palmergames.bukkit.towny.TownyAPI; |
5 | 5 | import com.palmergames.bukkit.towny.event.PlayerChangePlotEvent; |
6 | 6 | 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; |
8 | 10 | import com.palmergames.bukkit.towny.object.WorldCoord; |
9 | | -import org.bukkit.Bukkit; |
10 | 11 | import org.bukkit.entity.Player; |
11 | 12 | import org.bukkit.event.EventHandler; |
12 | 13 | import org.bukkit.event.Listener; |
13 | 14 | import org.bukkit.event.player.PlayerQuitEvent; |
14 | 15 |
|
15 | 16 | import java.util.ArrayList; |
| 17 | +import java.util.HashMap; |
16 | 18 | import java.util.List; |
17 | | -import java.util.Optional; |
| 19 | +import java.util.Map; |
18 | 20 |
|
19 | | -public class HUDManager implements Listener{ |
| 21 | +import org.jetbrains.annotations.Nullable; |
20 | 22 |
|
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<>(); |
23 | 28 | /** Scoreboards cannot show more than 15 lines. **/ |
24 | 29 | static final int MAX_SCOREBOARD_HEIGHT = 15; |
25 | 30 |
|
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)); |
29 | 39 | } |
30 | 40 |
|
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."); |
35 | 57 | return; |
36 | 58 | } |
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); |
49 | 63 | return; |
50 | 64 | } |
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"); |
58 | 85 | } |
59 | 86 |
|
60 | 87 | 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 | + } |
72 | 95 | } |
73 | 96 |
|
74 | 97 | //**EVENTS**// |
75 | 98 | @EventHandler |
76 | 99 | 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 | + } |
79 | 106 | } |
80 | 107 |
|
81 | 108 | @EventHandler |
82 | 109 | public void onPlayerMovePlotsEvent(PlayerChangePlotEvent event) { |
83 | 110 | 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); |
96 | 120 | 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()); |
101 | 130 | } |
102 | 131 | } |
103 | 132 |
|
104 | 133 | //Perm Specific |
105 | 134 | @EventHandler |
106 | 135 | public void onTownBlockSettingsChanged (TownBlockSettingsChangedEvent e) { |
107 | 136 |
|
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 | + |
110 | 143 | 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 | + |
113 | 148 | 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)); |
116 | 152 | } |
117 | 153 |
|
118 | 154 | public static String check(String string) { |
119 | 155 | return string.length() > 64 ? string.substring(0, 64) : string; |
120 | 156 | } |
121 | 157 |
|
122 | 158 | 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)); |
124 | 160 | } |
125 | 161 |
|
| 162 | + /** |
| 163 | + * @deprecated since 0.102.0.8 |
| 164 | + * @return the list of perm hud users |
| 165 | + */ |
| 166 | + @Deprecated |
126 | 167 | public static List<Player> getPermHUDUsers() { |
127 | | - return permUsers; |
| 168 | + return new ArrayList<>(huds.get("permHUD").getPlayers()); |
128 | 169 | } |
129 | | - |
| 170 | + |
| 171 | + /** |
| 172 | + * @deprecated since 0.102.0.8 |
| 173 | + * @return the list of map hud users |
| 174 | + */ |
| 175 | + @Deprecated |
130 | 176 | public static List<Player> getMapHUDUsers() { |
131 | | - return mapUsers; |
| 177 | + return new ArrayList<>(huds.get("mapHUD").getPlayers()); |
132 | 178 | } |
133 | 179 |
|
| 180 | + /** |
| 181 | + * @deprecated since 0.102.0.8 |
| 182 | + */ |
| 183 | + @Deprecated |
134 | 184 | public static void removePermHUDUser(Player player) { |
135 | | - if (permUsers.remove(player)) { |
136 | | - toggleOff(player); |
137 | | - } |
| 185 | + huds.get("permHUD").toggleOff(player); |
138 | 186 | } |
139 | | - |
| 187 | + |
| 188 | + /** |
| 189 | + * @deprecated since 0.102.0.8 |
| 190 | + */ |
| 191 | + @Deprecated |
140 | 192 | public static void removeMapHUDUser(Player player) { |
141 | | - if (mapUsers.remove(player)) { |
142 | | - toggleOff(player); |
143 | | - } |
| 193 | + huds.get("mapHUD").toggleOff(player); |
144 | 194 | } |
145 | 195 |
|
| 196 | + /** |
| 197 | + * @deprecated since 0.102.0.8 |
| 198 | + */ |
146 | 199 | public static boolean isPermHUDActive(Player player) { |
147 | | - return player.getScoreboard().getTeam(PermHUD.permHudTestKey()) != null; |
| 200 | + return huds.get("permHUD").isActive(player); |
148 | 201 | } |
149 | 202 |
|
| 203 | + /** |
| 204 | + * @deprecated since 0.102.0.8 |
| 205 | + */ |
150 | 206 | public static boolean isMapHudActive(Player player) { |
151 | | - return player.getScoreboard().getTeam(MapHUD.mapHudTestKey()) != null; |
| 207 | + return huds.get("mapHUD").isActive(player); |
152 | 208 | } |
153 | 209 | } |
0 commit comments