Skip to content

Commit c15231d

Browse files
chore: fix game menu gui
1 parent b650e84 commit c15231d

4 files changed

Lines changed: 130 additions & 123 deletions

File tree

type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/gui/GUIGameMenu.java

Lines changed: 0 additions & 78 deletions
This file was deleted.

type.generic/src/main/java/net/swofty/type/generic/gui/inventory/ItemStackCreator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ public static ItemStack.Builder enchant(ItemStack.Builder builder) {
176176
public static ItemStack.Builder getFromStack(ItemStack stack) {
177177
return clearAttributes(ItemStack.builder(stack.material())
178178
.amount(stack.amount())
179+
.set(DataComponents.PROFILE, stack.get(DataComponents.PROFILE))
179180
.set(DataComponents.LORE, stack.get(DataComponents.LORE))
180181
.set(DataComponents.CUSTOM_NAME, stack.get(DataComponents.CUSTOM_NAME))
181182
.set(DataComponents.CUSTOM_DATA, stack.get(DataComponents.CUSTOM_DATA)));
Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,50 @@
11
package net.swofty.type.lobby.game;
22

33
import lombok.Getter;
4+
import net.minestom.server.item.ItemStack;
45
import net.minestom.server.item.Material;
56
import net.swofty.commons.ServerType;
7+
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
68
import net.swofty.type.lobby.ServerInfoCache;
79

8-
/**
9-
* Enum representing all game types available in the game menu.
10-
* Only games with a non-null lobbyType are implemented and playable.
11-
*/
1210
@Getter
1311
public enum GameType {
14-
SKYBLOCK("SkyBlock", Material.GRASS_BLOCK, ServerType.SKYBLOCK_ISLAND,
15-
"§7Collect resources and become the",
16-
"§7richest player on the server!",
17-
"",
18-
"§7Build your island, farm resources,",
19-
"§7fight dragons, and more!"),
12+
SKYBLOCK("SkyBlock §2§l0.24 §a§lTHE GREENHOUSE",
13+
ItemStackCreator.getStackHead("686718d85e25b006f2c8f160f619b23c8fd6ae75ddf1c06308ec0f539d931703"),
14+
Category.PERSISTENT_GAME,
15+
ServerType.SKYBLOCK_ISLAND,
16+
"§7SkyBlock has finally arrived on",
17+
"§7Hypixel! Play with friends (or solo!),",
18+
"§7build your private islands and",
19+
"§7collect all the items!"),
2020

21-
BED_WARS("Bed Wars", Material.RED_BED, ServerType.BEDWARS_LOBBY,
22-
"§7Protect your bed and destroy",
23-
"§7the enemy beds. Upgrade yourself",
24-
"§7and your team by collecting Iron,",
25-
"§7Gold, Emerald and Diamond from",
26-
"§7generators to access powerful",
27-
"§7upgrades."),
28-
29-
// Non-functional placeholders
30-
SKYWARS("SkyWars", Material.ENDER_EYE, null,
31-
"§cComing Soon!"),
32-
33-
MURDER_MYSTERY("Murder Mystery", Material.BOW, null,
34-
"§cComing Soon!"),
35-
36-
BUILD_BATTLE("Build Battle", Material.CRAFTING_TABLE, null,
37-
"§cComing Soon!"),
38-
39-
DUELS("Duels", Material.IRON_SWORD, null,
40-
"§cComing Soon!"),
41-
42-
ARCADE("Arcade Games", Material.SLIME_BALL, null,
43-
"§cComing Soon!");
21+
BED_WARS("Bed Wars §6§lv1.10 - DREAM MODE & QOL",
22+
Material.RED_BED,
23+
Category.TEAM_SURVIVAL,
24+
ServerType.BEDWARS_LOBBY,
25+
"§7Protect your bed along with your",
26+
"§7teammates and destroy enemy beds",
27+
"§7to win!"),
28+
;
4429

4530
private final String displayName;
46-
private final Material material;
31+
private final ItemStack.Builder item;
32+
private final Category category;
4733
private final ServerType lobbyType;
4834
private final String[] lore;
4935

50-
GameType(String displayName, Material material, ServerType lobbyType, String... lore) {
36+
GameType(String displayName, ItemStack.Builder item, Category category, ServerType lobbyType, String... lore) {
37+
this.displayName = displayName;
38+
this.item = item;
39+
this.category = category;
40+
this.lobbyType = lobbyType;
41+
this.lore = lore;
42+
}
43+
44+
GameType(String displayName, Material item, Category category, ServerType lobbyType, String... lore) {
5145
this.displayName = displayName;
52-
this.material = material;
46+
this.item = ItemStackCreator.getStack("", item, 1);
47+
this.category = category;
5348
this.lobbyType = lobbyType;
5449
this.lore = lore;
5550
}
@@ -75,4 +70,11 @@ public int getPlayerCount() {
7570

7671
return ServerInfoCache.getTotalPlayersForType(lobbyType);
7772
}
73+
74+
public enum Category {
75+
PROTOTYPE_GAME,
76+
PERSISTENT_GAME,
77+
TEAM_SURVIVAL,
78+
COMPETITIVE,
79+
}
7880
}

type.lobby/src/main/java/net/swofty/type/lobby/gui/GUIGameMenu.java

Lines changed: 91 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package net.swofty.type.lobby.gui;
22

3+
import net.kyori.adventure.text.Component;
34
import net.minestom.server.event.inventory.InventoryPreClickEvent;
45
import net.minestom.server.inventory.InventoryType;
56
import net.minestom.server.item.ItemStack;
7+
import net.minestom.server.item.Material;
8+
import net.minestom.server.component.DataComponents;
9+
import net.minestom.server.network.player.ResolvableProfile;
610
import net.swofty.commons.StringUtility;
711
import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI;
812
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
13+
import net.swofty.type.generic.gui.inventory.RefreshingGUI;
914
import net.swofty.type.generic.gui.inventory.item.GUIClickableItem;
1015
import net.swofty.type.generic.user.HypixelPlayer;
1116
import net.swofty.type.lobby.ServerInfoCache;
@@ -14,8 +19,9 @@
1419
import java.util.ArrayList;
1520
import java.util.Arrays;
1621
import java.util.List;
22+
import java.util.concurrent.ThreadLocalRandom;
1723

18-
public class GUIGameMenu extends HypixelInventoryGUI {
24+
public class GUIGameMenu extends HypixelInventoryGUI implements RefreshingGUI {
1925

2026
private static final int[] GAME_SLOTS = {
2127
10, 11, 12, 13, 14, 15, 16,
@@ -24,22 +30,39 @@ public class GUIGameMenu extends HypixelInventoryGUI {
2430
37, 38, 39, 40, 41, 42, 43
2531
};
2632

33+
private int cycleIndex = 0;
34+
2735
public GUIGameMenu() {
28-
super("Game Menu", InventoryType.CHEST_5_ROW);
36+
super("Game Menu", InventoryType.CHEST_6_ROW);
2937
}
3038

3139
@Override
3240
public void onOpen(InventoryGUIOpenEvent e) {
3341
HypixelPlayer player = e.player();
3442

43+
set(new GUIClickableItem(4) {
44+
@Override
45+
public void run(InventoryPreClickEvent e, HypixelPlayer player) {
46+
47+
}
48+
49+
@Override
50+
public ItemStack.Builder getItem(HypixelPlayer player) {
51+
return ItemStackCreator.getStack("§aMain Lobby",
52+
Material.BOOKSHELF, 1,
53+
"",
54+
"§7Return to the Main Lobby.");
55+
}
56+
});
57+
3558
// Refresh cache, then populate
3659
ServerInfoCache.getServers().thenAccept(servers -> {
3760
int i = 0;
3861
for (GameType game : GameType.values()) {
3962
if (i >= GAME_SLOTS.length) break;
4063
set(createGameItem(game, GAME_SLOTS[i++]));
4164
}
42-
set(GUIClickableItem.getCloseItem(40));
65+
set(createRandomGameItem(49));
4366
updateItemStacks(getInventory(), player);
4467
});
4568

@@ -51,19 +74,25 @@ private GUIClickableItem createGameItem(GameType game, int slot) {
5174
@Override
5275
public ItemStack.Builder getItem(HypixelPlayer player) {
5376
String playerCount = StringUtility.commaify(game.getPlayerCount());
54-
String titleColor = game.isImplemented() ? "§a" : "§c";
77+
ItemStack.Builder itemBuilder = ItemStackCreator.getFromStack(game.getItem().build());
5578

5679
List<String> lore = new ArrayList<>();
80+
lore.add("§8" + StringUtility.toNormalCase(game.getCategory().name()));
81+
lore.add("");
5782
lore.addAll(Arrays.asList(game.getLore()));
5883
lore.add("");
5984
if (game.isImplemented()) {
60-
lore.add("§e" + playerCount + " playing");
61-
lore.add("");
62-
lore.add("§eClick to play!");
85+
if (cycleIndex % 2 == 0) {
86+
lore.add("§a Click to Connect!");
87+
} else {
88+
lore.add("§a▶ Click to Connect!");
89+
}
90+
lore.add("§7" + playerCount + " currently playing!");
6391
}
6492

65-
return ItemStackCreator.getStack(titleColor + game.getDisplayName(),
66-
game.getMaterial(), 1, lore.toArray(new String[0]));
93+
return ItemStackCreator.appendLore(itemBuilder, lore).customName(
94+
Component.text("§a" + game.getDisplayName())
95+
);
6796
}
6897

6998
@Override
@@ -78,6 +107,59 @@ public void run(InventoryPreClickEvent e, HypixelPlayer player) {
78107
};
79108
}
80109

110+
private GUIClickableItem createRandomGameItem(int slot) {
111+
GameType displayGame = GameType.values()[cycleIndex % GameType.values().length];
112+
return new GUIClickableItem(slot) {
113+
@Override
114+
public ItemStack.Builder getItem(HypixelPlayer player) {
115+
ItemStack base = displayGame.getItem().build();
116+
ItemStack.Builder builder = ItemStack.builder(base.material())
117+
.amount(1)
118+
.customName(Component.text("§aRandom Game"))
119+
.lore(
120+
Component.text("§7Join a random game."),
121+
Component.empty(),
122+
Component.text("§eClick to Play")
123+
);
124+
125+
// Copy head texture if present
126+
ResolvableProfile profile = base.get(DataComponents.PROFILE);
127+
if (profile != null) {
128+
builder.set(DataComponents.PROFILE, profile);
129+
}
130+
131+
return builder;
132+
}
133+
134+
@Override
135+
public void run(InventoryPreClickEvent e, HypixelPlayer player) {
136+
List<GameType> implemented = Arrays.stream(GameType.values())
137+
.filter(GameType::isImplemented)
138+
.toList();
139+
if (implemented.isEmpty()) {
140+
player.sendMessage("§cNo games available!");
141+
return;
142+
}
143+
GameType random = implemented.get(
144+
ThreadLocalRandom.current().nextInt(implemented.size())
145+
);
146+
player.closeInventory();
147+
player.sendTo(random.getLobbyType());
148+
}
149+
};
150+
}
151+
152+
@Override
153+
public void refreshItems(HypixelPlayer player) {
154+
cycleIndex++;
155+
set(createRandomGameItem(49));
156+
}
157+
158+
@Override
159+
public int refreshRate() {
160+
return 10; // 0.5 seconds
161+
}
162+
81163
@Override
82164
public boolean allowHotkeying() {
83165
return false;

0 commit comments

Comments
 (0)