99import net .kyori .adventure .text .minimessage .MiniMessage ;
1010import org .bukkit .Bukkit ;
1111import org .bukkit .Material ;
12- import org .bukkit .NamespacedKey ;
13- import org .bukkit .block .Skull ;
1412import org .bukkit .entity .Player ;
1513import org .bukkit .inventory .*;
16- import org .bukkit .inventory .meta .ItemMeta ;
1714import org .bukkit .inventory .meta .SkullMeta ;
1815import org .bukkit .persistence .PersistentDataType ;
1916import org .bukkit .scheduler .BukkitTask ;
2017import org .jetbrains .annotations .NotNull ;
2118
19+ import java .util .ArrayList ;
2220import java .util .List ;
2321import 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+ }
0 commit comments