Skip to content

Commit 47f8ca5

Browse files
committed
update: added all servers to navigator menu and simple connect to these servers
1 parent e9e94d2 commit 47f8ca5

10 files changed

Lines changed: 222 additions & 111 deletions

File tree

JozelotLobby/src/main/java/de/jozelot/jozelotLobby/JozelotLobby.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public void onEnable() {
7070
Bukkit.getConsoleSender().sendMessage("§a[§JoLobby§a] §7Sprach-Synchronisierung mit Proxy abgeschlossen!");
7171
}
7272

73-
7473
getServer().getConsoleSender().sendMessage("§a[§JoLobby§a]§a Minecraft läuft in der " + Bukkit.getBukkitVersion());
7574
getServer().getConsoleSender().sendMessage("§a[§JoLobby§a]§a ----------------------------------------------");
7675
getServer().getConsoleSender().sendMessage("§a[§JoLobby§a]§a +==================+");

JozelotLobby/src/main/java/de/jozelot/jozelotLobby/database/RedisListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class RedisListener {
1414
public RedisListener(JozelotLobby plugin) {
1515
this.plugin = plugin;
1616
startListening();
17+
startStatusUpdater();
1718
}
1819

1920
private void startListening() {
@@ -57,6 +58,6 @@ public void startStatusUpdater() {
5758
} catch (Exception e) {
5859
plugin.getLogger().warning("Redis: Fehler beim Update der Server-Status-Daten: " + e.getMessage());
5960
}
60-
}, 0L, 100L);
61+
}, 0L, 60L);
6162
}
6263
}

JozelotLobby/src/main/java/de/jozelot/jozelotLobby/database/RedisPublish.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void sendPlayerToServer(UUID uuid, String serverName) {
2121
if (jedis != null) {
2222
String message = uuid + ";" + serverName;
2323

24-
jedis.publish("move_player", message);
24+
jedis.publish("network:move", message);
2525
}
2626
}
2727
}

JozelotLobby/src/main/java/de/jozelot/jozelotLobby/ui/inventories/navigation/NavigatorMenu.java

Lines changed: 92 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,14 @@
99
import net.kyori.adventure.text.minimessage.MiniMessage;
1010
import org.bukkit.Bukkit;
1111
import org.bukkit.Material;
12-
import org.bukkit.NamespacedKey;
13-
import org.bukkit.block.Skull;
1412
import org.bukkit.entity.Player;
1513
import org.bukkit.inventory.*;
16-
import org.bukkit.inventory.meta.ItemMeta;
1714
import org.bukkit.inventory.meta.SkullMeta;
1815
import org.bukkit.persistence.PersistentDataType;
1916
import org.bukkit.scheduler.BukkitTask;
2017
import org.jetbrains.annotations.NotNull;
2118

19+
import java.util.ArrayList;
2220
import java.util.List;
2321
import java.util.UUID;
2422

@@ -27,18 +25,16 @@ public class NavigatorMenu implements InventoryHolder {
2725
private final Inventory inventory;
2826
private final JozelotLobby plugin;
2927
private final LobbyPlayer lobbyPlayer;
30-
private final Player player;
3128
private BukkitTask bukkitTask;
32-
3329
private final MiniMessage mm = MiniMessage.miniMessage();
3430

3531
public NavigatorMenu(JozelotLobby plugin, Player player) {
3632
this.plugin = plugin;
37-
this.player = player;
38-
this.inventory = Bukkit.createInventory(this, 9 * 5, mm.deserialize(plugin.getConfig().getString("inventories.navigator.title")));
39-
4033
this.lobbyPlayer = plugin.getLobbyPlayerManager().getPlayer(player);
4134

35+
String title = plugin.getConfig().getString("inventories.navigator.title", "Navigator");
36+
this.inventory = Bukkit.createInventory(this, 9 * 5, mm.deserialize(title));
37+
4238
fillBackGround();
4339
update();
4440
startUpdateTask();
@@ -47,106 +43,130 @@ public NavigatorMenu(JozelotLobby plugin, Player player) {
4743
public void fillBackGround() {
4844
ItemStack filler = new ItemStack(lobbyPlayer.getColor().getFillerMaterial());
4945
filler.editMeta(meta -> {
50-
meta.displayName(mm.deserialize(" "));
46+
meta.displayName(Component.empty());
5147
meta.getPersistentDataContainer().set(HotbarItems.IS_PROTECTED, PersistentDataType.BOOLEAN, true);
5248
});
5349

54-
ItemStack backArrow = new ItemStack(Material.PLAYER_HEAD);
50+
for (int i : new int[]{0,1,2,3,4,5,6,7,8,37,38,39,41,42,43,44}) {
51+
inventory.setItem(i, filler);
52+
}
5553

56-
backArrow.editMeta(SkullMeta.class, skullMeta -> {
54+
// Back Arrow
55+
ItemStack backArrow = new ItemStack(Material.PLAYER_HEAD);
56+
backArrow.editMeta(SkullMeta.class, meta -> {
5757
PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID());
5858
profile.setProperty(new ProfileProperty("textures", lobbyPlayer.getColor().getBackArrow()));
59-
skullMeta.setPlayerProfile(profile);
60-
61-
String name = plugin.getConfig().getString("items.back_arrow.name");
62-
skullMeta.displayName(mm.deserialize(name != null ? name : "<red>Zurück"));
63-
64-
skullMeta.getPersistentDataContainer().set(HotbarItems.IS_PROTECTED, PersistentDataType.BOOLEAN, true);
65-
skullMeta.getPersistentDataContainer().set(HotbarItems.ITEM_ID, PersistentDataType.STRING, "back_button");
59+
meta.setPlayerProfile(profile);
60+
meta.displayName(mm.deserialize(plugin.getConfig().getString("items.back_arrow.name", "<red>Zurück")));
61+
meta.getPersistentDataContainer().set(HotbarItems.ITEM_ID, PersistentDataType.STRING, "back_button");
6662
});
63+
inventory.setItem(36, backArrow);
6764

68-
Material spawnMaterial = Material.getMaterial(plugin.getConfig().getString("items.spawn_button.item"));
69-
70-
if (spawnMaterial == null) {
71-
spawnMaterial = Material.BARRIER;
72-
}
73-
74-
ItemStack spawnButton = new ItemStack(spawnMaterial);
75-
65+
// Spawn Button
66+
Material spawnMat = Material.matchMaterial(plugin.getConfig().getString("items.spawn_button.item", "MAGMA_CREAM"));
67+
ItemStack spawnButton = new ItemStack(spawnMat != null ? spawnMat : Material.MAGMA_CREAM);
7668
spawnButton.editMeta(meta -> {
77-
meta.displayName(mm.deserialize(plugin.getConfig().getString("items.spawn_button.name")));
78-
meta.getPersistentDataContainer().set(HotbarItems.IS_PROTECTED, PersistentDataType.BOOLEAN, true);
69+
meta.displayName(mm.deserialize(plugin.getConfig().getString("items.spawn_button.name", "<gold>Spawn")));
7970
meta.getPersistentDataContainer().set(HotbarItems.ITEM_ID, PersistentDataType.STRING, "spawn_button");
8071
});
81-
82-
for (int i : new int[]{0,1,2,3,4,5,6,7,8,37,38,39,41,42,43,44}) {
83-
inventory.setItem(i, filler);
84-
}
85-
86-
inventory.setItem(36, backArrow);
8772
inventory.setItem(40, spawnButton);
8873
}
8974

9075
public void update() {
91-
Material challengeServerMaterial = Material.getMaterial(plugin.getConfig().getString("items.challenge_server.item"));
92-
93-
if (challengeServerMaterial == null) {
94-
challengeServerMaterial = Material.BARRIER;
95-
}
76+
// Challenges
77+
setupServerItem(13, "challenge_server", new String[]{"challenge-1", "challenge-2", "challenge-3"}, true);
9678

97-
ItemStack challengeServer = new ItemStack(challengeServerMaterial);
79+
// Archiv
80+
setupServerItem(21, "archiv_server", new String[]{"archiv-1", "archiv-2"}, true);
9881

99-
int challengeServerPlayerCount = 0;
82+
// Among Us
83+
setupServerItem(19, "among_server", new String[]{"among-us"}, false);
10084

101-
challengeServerPlayerCount += plugin.getNetworkStateManager().getServer("challenge-1").players();
102-
challengeServerPlayerCount += plugin.getNetworkStateManager().getServer("challenge-2").players();
103-
challengeServerPlayerCount += plugin.getNetworkStateManager().getServer("challenge-3").players();
85+
// Duels
86+
setupServerItem(23, "duels_server", new String[]{"duels"}, false);
10487

105-
String finalChallengeServerPlayerCount = challengeServerPlayerCount < 0 ? "<#00FC00>" + challengeServerPlayerCount : "<#f90036>" + challengeServerPlayerCount;
88+
// Event
89+
String eventSrv = plugin.getConfig().getString("items.event_server.server", "");
90+
setupServerItem(25, "event_server", eventSrv.isEmpty() ? new String[0] : new String[]{eventSrv}, false);
91+
}
10692

107-
int challengeServerCount = 0;
108-
int maxChallengeServerCount = 3;
93+
private void setupServerItem(int slot, String configKey, String[] serverIds, boolean isMulti) {
94+
String path = "items." + configKey;
95+
96+
// Material holen
97+
String matName = plugin.getConfig().getString(path + ".item", "BARRIER");
98+
Material mat = Material.matchMaterial(matName != null ? matName : "BARRIER");
99+
ItemStack item = new ItemStack(mat != null ? mat : Material.BARRIER);
100+
101+
// Netzwerk Daten
102+
int totalPlayers = 0;
103+
int onlineCount = 0;
104+
for (String id : serverIds) {
105+
var state = plugin.getNetworkStateManager().getServer(id);
106+
if (state != null) {
107+
totalPlayers += state.players();
108+
if (state.online()) onlineCount++;
109+
}
110+
}
109111

110-
challengeServerCount += plugin.getNetworkStateManager().getServer("challenge-1").online() ? 1 : 0;
111-
challengeServerCount += plugin.getNetworkStateManager().getServer("challenge-2").online() ? 1 : 0;
112-
challengeServerCount += plugin.getNetworkStateManager().getServer("challenge-3").online() ? 1 : 0;
112+
// Platzhalter vorbereiten
113+
final String finalPlayers = (totalPlayers > 0 ? "<#00FC00>" : "<#f90036>") + totalPlayers;
114+
final String finalStatus;
115+
if (serverIds.length == 0) {
116+
finalStatus = "<#f90036>Kein Event";
117+
} else if (isMulti) {
118+
finalStatus = (onlineCount < serverIds.length ? "<#f90036>" : "<#00FC00>") + onlineCount;
119+
} else {
120+
finalStatus = onlineCount > 0 ? "<#00FC00>Online" : "<#f90036>Offline";
121+
}
113122

114-
String finalChallegeServerCount = challengeServerCount < maxChallengeServerCount ? "<#00FC00>" + challengeServerCount : "<#f90036>" + challengeServerCount;
123+
// Meta anwenden
124+
item.editMeta(meta -> {
125+
// Name
126+
String name = plugin.getConfig().getString(path + ".name");
127+
meta.displayName(mm.deserialize(name != null ? name : "<red>FEHLER: Name fehlt"));
128+
129+
// Lore
130+
List<String> configLore = plugin.getConfig().getStringList(path + ".lore");
131+
List<Component> loreComponents = new ArrayList<>();
132+
for (String line : configLore) {
133+
if (line == null) continue;
134+
String replaced = line.replace("{online_players}", finalPlayers)
135+
.replace("{online_servers}", finalStatus)
136+
.replace("{status}", finalStatus)
137+
.replace("{max_servers}", String.valueOf(serverIds.length));
138+
loreComponents.add(mm.deserialize(replaced));
139+
}
140+
meta.lore(loreComponents);
141+
142+
// Kopf Textur
143+
if (meta instanceof SkullMeta skullMeta) {
144+
String b64 = plugin.getConfig().getString(path + ".base64");
145+
if (b64 != null && !b64.isEmpty()) {
146+
PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID());
147+
profile.setProperty(new ProfileProperty("textures", b64));
148+
skullMeta.setPlayerProfile(profile);
149+
}
150+
}
115151

116-
challengeServer.editMeta(meta -> {
117-
meta.displayName(mm.deserialize(plugin.getConfig().getString("items.challenge_server.name")));
118152
meta.getPersistentDataContainer().set(HotbarItems.IS_PROTECTED, PersistentDataType.BOOLEAN, true);
119-
meta.getPersistentDataContainer().set(HotbarItems.ITEM_ID, PersistentDataType.STRING, "challenge_server");
120-
121-
List<String> itemDescription = plugin.getConfig().getStringList("items.challenge_server.lore");
122-
123-
List<Component> lore = itemDescription.stream()
124-
.map(line -> line.replace("{online_players}", finalChallengeServerPlayerCount))
125-
.map(line -> line.replace("{online_servers}", finalChallegeServerCount))
126-
.map(line -> line.replace("{max_servers}", String.valueOf(maxChallengeServerCount)))
127-
.map(mm::deserialize)
128-
.toList();
129-
130-
meta.lore(lore);
131-
meta.addItemFlags(ItemFlag.values());
153+
meta.getPersistentDataContainer().set(HotbarItems.ITEM_ID, PersistentDataType.STRING, configKey);
154+
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
132155
});
133156

134-
inventory.setItem(13, challengeServer);
135-
157+
inventory.setItem(slot, item);
136158
}
137159

138160
public void startUpdateTask() {
139161
this.bukkitTask = Bukkit.getScheduler().runTaskTimer(plugin, this::update, 0L, 60L);
140162
}
141163

142164
public void stopUpdateTask() {
143-
if (this.bukkitTask != null) {
144-
this.bukkitTask.cancel();
145-
}
165+
if (this.bukkitTask != null) this.bukkitTask.cancel();
146166
}
147167

148168
@Override
149169
public @NotNull Inventory getInventory() {
150170
return inventory;
151171
}
152-
}
172+
}

JozelotLobby/src/main/java/de/jozelot/jozelotLobby/ui/items/ClickHandler.java

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@
44
import de.jozelot.jozelotLobby.player.LobbyPlayer;
55
import de.jozelot.jozelotLobby.ui.inventories.InventoryType;
66
import de.jozelot.jozelotLobby.ui.inventories.navigation.NavigatorMenu;
7+
import net.kyori.adventure.text.minimessage.MiniMessage;
78
import org.bukkit.entity.Player;
89
import org.bukkit.event.EventHandler;
910
import org.bukkit.event.Listener;
1011
import org.bukkit.event.inventory.InventoryClickEvent;
1112
import org.bukkit.event.inventory.InventoryCloseEvent;
1213
import org.bukkit.event.player.PlayerInteractEvent;
1314
import org.bukkit.inventory.Inventory;
15+
import org.bukkit.inventory.InventoryHolder;
1416
import org.bukkit.inventory.ItemStack;
1517
import org.bukkit.inventory.meta.ItemMeta;
1618
import org.bukkit.persistence.PersistentDataType;
1719

20+
import java.util.Map;
21+
1822
public class ClickHandler implements Listener {
1923

2024
private final JozelotLobby plugin;
@@ -65,41 +69,64 @@ public void onClick(PlayerInteractEvent event) {
6569
@EventHandler
6670
public void onInventoryClick(InventoryClickEvent event) {
6771
ItemStack itemStack = event.getCurrentItem();
68-
Inventory inventory = event.getClickedInventory();
69-
if (!(event.getWhoClicked() instanceof Player player)) {
70-
return;
71-
}
72-
73-
if (itemStack == null) {
74-
return;
75-
}
72+
if (itemStack == null || !itemStack.hasItemMeta()) return;
7673

74+
Player player = (Player) event.getWhoClicked();
7775
ItemMeta itemMeta = itemStack.getItemMeta();
78-
boolean isProtected = itemMeta.getPersistentDataContainer().get(HotbarItems.IS_PROTECTED, PersistentDataType.BOOLEAN);
7976

80-
if (isProtected) {
77+
Boolean isProtected = itemMeta.getPersistentDataContainer().get(HotbarItems.IS_PROTECTED, PersistentDataType.BOOLEAN);
78+
if (Boolean.TRUE.equals(isProtected)) {
8179
event.setCancelled(true);
8280
}
8381

8482
String itemId = itemMeta.getPersistentDataContainer().get(HotbarItems.ITEM_ID, PersistentDataType.STRING);
85-
8683
if (itemId == null) return;
8784

8885
LobbyPlayer lobbyPlayer = plugin.getLobbyPlayerManager().getPlayer(player);
86+
if (lobbyPlayer == null) return;
8987

9088
switch (itemId) {
9189
case "spawn_button":
92-
player.performCommand("spawn");
93-
player.closeInventory();
94-
return;
90+
spawnButton(player);
91+
break;
92+
9593
case "back_button":
96-
if (inventory.getHolder() instanceof NavigatorMenu) player.closeInventory();
94+
backButton(player, event.getInventory().getHolder());
95+
break;
96+
case "among_server":
97+
connectButton(lobbyPlayer,"among-us");
9798
break;
99+
case "duels_server":
100+
connectButton(lobbyPlayer,"duels");
101+
break;
102+
case "event_server":
103+
//connectButton(player,"event_server");
104+
player.sendMessage(MiniMessage.miniMessage().deserialize(plugin.getLang().format("event-server-no-event", null)));
105+
lobbyPlayer.playSound("error");
106+
break;
107+
default:
108+
return;
98109
}
99110

100111
lobbyPlayer.playSound("pling");
101112
}
102113

114+
private void spawnButton(Player player) {
115+
player.performCommand("spawn");
116+
player.closeInventory();
117+
}
118+
119+
private void backButton(Player player, InventoryHolder holder) {
120+
if (holder instanceof NavigatorMenu) {
121+
player.closeInventory();
122+
}
123+
}
124+
125+
private void connectButton(LobbyPlayer player, String serverName) {
126+
player.playSound("pling");
127+
player.sendToServer(serverName);
128+
}
129+
103130
@EventHandler
104131
public void onInventoryClose(InventoryCloseEvent event) {
105132
Inventory inventory = event.getInventory();

0 commit comments

Comments
 (0)