diff --git a/type.lobby/src/main/java/net/swofty/type/lobby/ServerInfoCache.java b/type.lobby/src/main/java/net/swofty/type/lobby/ServerInfoCache.java index 6f330a71b..7f1df0d03 100644 --- a/type.lobby/src/main/java/net/swofty/type/lobby/ServerInfoCache.java +++ b/type.lobby/src/main/java/net/swofty/type/lobby/ServerInfoCache.java @@ -21,7 +21,7 @@ public class ServerInfoCache { * Get all servers, using cache if available. */ public static CompletableFuture> getServers() { - if (System.currentTimeMillis() - lastCacheTime < CACHE_TTL_MS && !cachedServers.isEmpty()) { + if (!isCacheStale()) { return CompletableFuture.completedFuture(new ArrayList<>(cachedServers)); } return refreshCache(); diff --git a/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUILobbySelector.java b/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUILobbySelector.java index 64bc3a052..30c0b07d3 100644 --- a/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUILobbySelector.java +++ b/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUILobbySelector.java @@ -78,11 +78,10 @@ private void loadLobbies(HypixelPlayer player) { } private void populateLobbies(HypixelPlayer player) { - // Clear all slots first + items.clear(); for (int i = 0; i < 18; i++) { getInventory().setItemStack(i, ItemStack.AIR); } - items.clear(); UUID currentServer = HypixelConst.getServerUUID(); @@ -106,7 +105,7 @@ public void run(InventoryPreClickEvent e, HypixelPlayer p) { for (int i = 0; i < lobbies.size() && i < 18; i++) { UnderstandableProxyServer lobby = lobbies.get(i); boolean isCurrentServer = lobby.uuid().equals(currentServer); - int lobbyNumber = extractLobbyNumber(lobby.shortName()); + int lobbyNumber = i + 1; set(new GUIClickableItem(i) { @Override @@ -121,7 +120,7 @@ public ItemStack.Builder getItem(HypixelPlayer p) { return ItemStackCreator.getStack( titleColor + lobbyName + " #" + lobbyNumber, material, - Math.max(1, lobbyNumber), + lobbyNumber, "§7Players: " + players + "/" + max, "", statusLine diff --git a/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUIQuestsChallenges.java b/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUIQuestsChallenges.java index 1e3ce86fa..baed8f677 100644 --- a/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUIQuestsChallenges.java +++ b/type.lobby/src/main/java/net/swofty/type/lobby/gui/GUIQuestsChallenges.java @@ -490,7 +490,7 @@ public ItemStack.Builder getItem(HypixelPlayer player) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer player) { - player.closeInventory(); + new GUIMyProfile().open(player); } }); diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/item/ActionItemRightUse.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/item/ActionItemRightUse.java index 34381383c..c0629ecf5 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/item/ActionItemRightUse.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/event/actions/item/ActionItemRightUse.java @@ -12,20 +12,6 @@ import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; public class ActionItemRightUse implements HypixelEventClass { - - @SneakyThrows - @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = true) - public void run(PlayerUseItemOnBlockEvent event) { - ItemStack itemStack = event.getPlayer().getItemInMainHand(); - SkyBlockItem item = new SkyBlockItem(itemStack); - SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); - - if (item.hasComponent(InteractableComponent.class)) { - InteractableComponent interactableComponent = item.getComponent(InteractableComponent.class); - interactableComponent.onRightClick(player, item); - } - } - @SneakyThrows @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = true) public void run(PlayerUseItemEvent event) { diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/sbmenu/GUICrafting.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/sbmenu/GUICrafting.java index 9de56addf..2d4126958 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/sbmenu/GUICrafting.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/sbmenu/GUICrafting.java @@ -32,11 +32,24 @@ public class GUICrafting extends HypixelInventoryGUI implements RefreshingGUI { private static final ItemStack.Builder RECIPE_REQUIRED = ItemStackCreator.getStack("§cRecipe Required", Material.BARRIER, 1, "§7Add the items for a valid", "§7recipe in the crafting grid", "§7to the left!"); private static final int[] CRAFT_SLOTS = new int[]{10, 11, 12, 19, 20, 21, 28, 29, 30}; private static final int RESULT_SLOT = 23; + private int lastGridHash = 0; + private SkyBlockRecipe lastParsedRecipe = null; public GUICrafting() { super("Craft Item", InventoryType.CHEST_6_ROW); } + private int computeGridHash(Inventory inv) { // TODO: Account for metadata + int h = 1; + for (int slot : CRAFT_SLOTS) { + ItemStack it = inv.getItemStack(slot); + h = 31 * h + it.material().id(); + h = 31 * h + it.amount(); + } + return h; + } + + @Override public void onOpen(InventoryGUIOpenEvent e) { fill(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE), 13, 34); @@ -76,7 +89,16 @@ public void onBottomClick(InventoryPreClickEvent e) { @Override public void refreshItems(HypixelPlayer player) { Inventory inventory = getInventory(); - SkyBlockRecipe recipe = SkyBlockRecipe.parseRecipe(getCurrentRecipe(inventory)); + int gridHash = computeGridHash(inventory); + SkyBlockRecipe recipe; + + if (gridHash == lastGridHash) { + recipe = lastParsedRecipe; + } else { + lastGridHash = gridHash; + recipe = SkyBlockRecipe.parseRecipe(getCurrentRecipe(inventory)); + lastParsedRecipe = recipe; + } fill(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE), 13, 34); border(ItemStackCreator.createNamedItemStack(Material.RED_STAINED_GLASS_PANE)); diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/handlers/ability/abilities/BuildersWandAbility.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/handlers/ability/abilities/BuildersWandAbility.java index 74bde751a..68779e65a 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/handlers/ability/abilities/BuildersWandAbility.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/handlers/ability/abilities/BuildersWandAbility.java @@ -15,7 +15,6 @@ public class BuildersWandAbility extends RegisteredAbility { - @SuppressWarnings("preview") public BuildersWandAbility() { super("GRAND_ARCHITECT", "Grand Architect", "Right-click the face of a block to extend all connected block faces.", diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java index c4d07fd1f..a0a5f11e2 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java @@ -125,19 +125,24 @@ FromProxyChannels.PING_SERVER, new JSONObject() } private static int getNextAvailableDisplayName() { - if (servers.isEmpty()) return 1; - if (servers.values().stream().allMatch(ArrayList::isEmpty)) return 1; - - List gameServers = new ArrayList<>(); - servers.values().forEach(gameServers::addAll); - - int highestDisplayName = (gameServers.stream().mapToInt(server -> { - String displayName = server.displayName().replaceAll("[^0-9]", ""); - return Integer.parseInt(displayName); - }).max().getAsInt()); - return highestDisplayName + 1; + Set used = new HashSet<>(); + for (ArrayList list : servers.values()) { + for (GameServer gs : list) { + String digits = gs.displayName().replaceAll("[^0-9]", ""); + if (!digits.isEmpty()) { + try { + int n = Integer.parseInt(digits); + if (n > 0) used.add(n); + } catch (NumberFormatException ignored) {} + } + } + } + int candidate = 1; + while (used.contains(candidate)) candidate++; + return candidate; } + private static int getNextAvailablePort() { if (servers.isEmpty()) return 20000; if (servers.values().stream().allMatch(ArrayList::isEmpty)) return 20000;