From 53dca0cad2d6bfd94c0601b648db3ad1d12f3477 Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:38:21 +0100 Subject: [PATCH 1/2] feat: Gemstone Grinder --- .../commons/skyblock/item/ItemType.java | 2 + .../attributes/ItemAttributeGemData.java | 45 ++- .../skyblock/items/mining/flawless.yml | 2 +- .../skyblock/items/mining/mining.yml | 20 + .../dwarvenmines/TypeDwarvenMinesLoader.java | 21 +- .../dwarvenmines/gui/GUIGemstoneGrinder.java | 366 ++++++++++++++++++ .../dwarvenmines/gui/GUIGemstoneGuide.java | 137 +++++++ .../type/dwarvenmines/gui/GUIShopLumina.java | 19 + .../dwarvenmines/gui/fragilis/GUIBlocks.java | 213 ++++------ .../gui/fragilis/GUIDwarvenMetals.java | 137 +++---- .../gui/fragilis/GUIGemstones.java | 230 +++-------- .../dwarvenmines/gui/fragilis/GUIOres.java | 305 ++++----------- .../swofty/type/dwarvenmines/npcs/NPCGeo.java | 99 +++++ .../type/dwarvenmines/npcs/NPCLumina.java | 51 +++ .../data/datapoints/DatapointToggles.java | 1 + .../type/skyblockgeneric/gems/Gemstone.java | 54 ++- .../type/skyblockgeneric/item/ItemLore.java | 11 +- .../item/components/GemstoneComponent.java | 3 +- .../item/updater/NonPlayerItemUpdater.java | 16 +- .../item/updater/PlayerItemUpdater.java | 16 +- .../skyblockgeneric/user/SkyBlockPlayer.java | 16 + 21 files changed, 1105 insertions(+), 659 deletions(-) create mode 100644 type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGrinder.java create mode 100644 type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGuide.java create mode 100644 type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIShopLumina.java create mode 100644 type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCGeo.java create mode 100644 type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLumina.java diff --git a/commons/src/main/java/net/swofty/commons/skyblock/item/ItemType.java b/commons/src/main/java/net/swofty/commons/skyblock/item/ItemType.java index f22e3889b..40c94d9fe 100644 --- a/commons/src/main/java/net/swofty/commons/skyblock/item/ItemType.java +++ b/commons/src/main/java/net/swofty/commons/skyblock/item/ItemType.java @@ -773,6 +773,8 @@ public enum ItemType { PLASMA(Material.PLAYER_HEAD, Rarity.RARE), VOLTA(Material.PLAYER_HEAD, Rarity.RARE), CORLEONITE(Material.PLAYER_HEAD, Rarity.EPIC), + LANTERN(Material.PLAYER_HEAD, Rarity.RARE), + INFINI_TORCH(Material.TORCH, Rarity.EPIC), /** * Travel Scrolls diff --git a/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java b/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java index 29a187160..e89a1b0a3 100644 --- a/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java +++ b/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java @@ -36,12 +36,18 @@ public GemData loadFromString(String string) { String[] gemSplit = gem.split(":"); int index = Integer.parseInt(gemSplit[0]); ItemType filledWith = null; + boolean unlocked = false; if (!gemSplit[1].equals("null")) { filledWith = ItemType.valueOf(gemSplit[1]); } - gemData.putGem(new GemData.GemSlots(index, filledWith)); + // Load unlocked state if it exists in the string (for backward compatibility) + if (gemSplit.length > 2) { + unlocked = Boolean.parseBoolean(gemSplit[2]); + } + + gemData.putGem(new GemData.GemSlots(index, filledWith, unlocked)); } return gemData; @@ -52,11 +58,8 @@ public String saveIntoString() { List serializedGems = new ArrayList<>(); this.value.slots.forEach(gem -> { - if (gem.filledWith == null) { - serializedGems.add(gem.index + ":null"); - } else { - serializedGems.add(gem.index + ":" + gem.filledWith.name()); - } + String filledWith = gem.filledWith == null ? "null" : gem.filledWith.name(); + serializedGems.add(gem.index + ":" + filledWith + ":" + gem.unlocked); }); return String.join(",", serializedGems); @@ -74,14 +77,12 @@ public void putGem(GemSlots slot) { } public boolean hasGem(int index) { - boolean hasGem = false; for (GemSlots slot : slots) { if (slot.index == index) { - hasGem = true; - break; + return true; } } - return hasGem; + return false; } public GemSlots getGem(int index) { @@ -93,12 +94,34 @@ public GemSlots getGem(int index) { return null; } + public boolean isSlotUnlocked(int index) { + GemSlots slot = getGem(index); + return slot != null && slot.unlocked; + } + + public void unlockSlot(int index) { + GemSlots existing = getGem(index); + if (existing != null) { + existing.unlocked = true; + } else { + putGem(new GemSlots(index, null, true)); + } + } + + public void removeGem(int index) { + GemSlots existing = getGem(index); + if (existing != null) { + existing.filledWith = null; + } + } + @AllArgsConstructor @Getter @Setter public static class GemSlots { public int index; public @Nullable ItemType filledWith; + public boolean unlocked; } } -} +} \ No newline at end of file diff --git a/configuration/skyblock/items/mining/flawless.yml b/configuration/skyblock/items/mining/flawless.yml index 186f04921..966b79b57 100644 --- a/configuration/skyblock/items/mining/flawless.yml +++ b/configuration/skyblock/items/mining/flawless.yml @@ -27,7 +27,7 @@ items: - id: GEMSTONE_IMPL rarity: FLAWLESS gemstone: JADE - skull_texture: d3623521c8111ad29e9dcf7acc56085a9ab07da732d1518976aee61d0b3e3bd6 + skull_texture: f89f75e0b00378a583dbba728dcdc6e9346f31dd601d448f3d60615c7465cc3e - id: TRACKED_UNIQUE - id: CUSTOM_DISPLAY_NAME display_name: Flawless Jade Gemstone diff --git a/configuration/skyblock/items/mining/mining.yml b/configuration/skyblock/items/mining/mining.yml index c715c4a70..13e657701 100644 --- a/configuration/skyblock/items/mining/mining.yml +++ b/configuration/skyblock/items/mining/mining.yml @@ -6,6 +6,7 @@ items: breaking_power: 1.0 components: - id: PICKAXE + - id: ROOKIE_PICKAXE rarity: COMMON default_statistics: @@ -14,3 +15,22 @@ items: damage: 15.0 components: - id: PICKAXE + + - id: LANTERN + material: PLAYER_HEAD + rarity: RARE + components: + - id: CUSTOM_DISPLAY_NAME + display_name: Lantern + - id: SKULL_HEAD + texture: 16e5682b4a0e5af5237fb9960983c623eab04ec01b90147c4df4c90a7be664d5 + - id: NOT_FINISHED_YET + + - id: INFINI_TORCH + material: TORCH + rarity: EPIC + components: + - id: CUSTOM_DISPLAY_NAME + display_name: InfiniTorch™ + - id: NOT_FINISHED_YET + - id: ENCHANTED diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java index 7cd0c94d5..1cec2e002 100644 --- a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java @@ -1,7 +1,11 @@ package net.swofty.type.dwarvenmines; import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; import net.minestom.server.registry.RegistryKey; import net.minestom.server.world.DimensionType; @@ -10,15 +14,20 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; +import net.swofty.commons.bedwars.map.BedWarsMapsConfig; import net.swofty.proxyapi.redis.ProxyToClient; import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.dwarvenmines.gui.GUIGemstoneGrinder; import net.swofty.type.dwarvenmines.tab.DwarvenMinesServerModule; +import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.InteractionEntity; import net.swofty.type.generic.entity.npc.HypixelNPC; import net.swofty.type.generic.event.HypixelEventClass; import net.swofty.type.generic.tab.TablistManager; import net.swofty.type.generic.tab.TablistModule; import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.entity.TextDisplayEntity; import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; import org.jetbrains.annotations.Nullable; @@ -41,13 +50,23 @@ public void onInitialize(MinecraftServer server) { @Override public void afterInitialize(MinecraftServer server) { + Point gemstoneGrinderPos = new Pos(85.5, 199, -116.5); + InteractionEntity gemstoneGrinder = new InteractionEntity(1.1f, 1.1f, (p, event) -> { + new GUIGemstoneGrinder().open(p); + }); + TextDisplayEntity gemstoneGrinderText = new TextDisplayEntity(Component.text("Gemstone Grinder", NamedTextColor.LIGHT_PURPLE), meta -> {}); + TextDisplayEntity gemstoneGrinderClick = new TextDisplayEntity(Component.text("CLICK").color(NamedTextColor.YELLOW).decorate(TextDecoration.BOLD), meta -> {}); + + gemstoneGrinder.setInstance(HypixelConst.getInstanceContainer(), gemstoneGrinderPos); + gemstoneGrinderText.setInstance(HypixelConst.getInstanceContainer(), gemstoneGrinderPos.add(0, 1.3, 0)); + gemstoneGrinderClick.setInstance(HypixelConst.getInstanceContainer(), gemstoneGrinderPos.add(0, 0.9, 0)); } @Override public LoaderValues getLoaderValues() { return new LoaderValues( - (_) -> new Pos(-85, 200, -123, -90, 0), + (_) -> new Pos(-48.5, 200, -121.5, -90, 0), true ); } diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGrinder.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGrinder.java new file mode 100644 index 000000000..c728830e8 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGrinder.java @@ -0,0 +1,366 @@ +package net.swofty.type.dwarvenmines.gui; + +import net.minestom.server.component.DataComponents; +import net.minestom.server.event.inventory.InventoryCloseEvent; +import net.minestom.server.event.inventory.InventoryPreClickEvent; +import net.minestom.server.inventory.Inventory; +import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.swofty.commons.ChatColor; +import net.swofty.commons.StringUtility; +import net.swofty.commons.skyblock.item.ItemType; +import net.swofty.commons.skyblock.item.attribute.attributes.ItemAttributeGemData; +import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI; +import net.swofty.type.generic.gui.inventory.ItemStackCreator; +import net.swofty.type.generic.gui.inventory.item.GUIClickableItem; +import net.swofty.type.generic.gui.inventory.item.GUIItem; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.gems.Gemstone; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.components.GemstoneComponent; +import net.swofty.type.skyblockgeneric.item.components.GemstoneImplComponent; +import net.swofty.type.skyblockgeneric.item.updater.PlayerItemUpdater; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GUIGemstoneGrinder extends HypixelInventoryGUI { + private final static int[] PRE_SLOTS = {28, 29, 30, 31, 32, 33, 34}; + private static final Map SLOTS = new HashMap<>(Map.of( + 0, new int[]{}, + 1, new int[]{31}, + 2, new int[]{30, 32}, + 3, new int[]{30, 31, 32}, + 4, new int[]{29, 30, 32, 33}, + 5, new int[]{29, 30, 31, 32, 33} + )); + private SkyBlockItem item = null; + + public GUIGemstoneGrinder() { + super("Gemstone Grinder", InventoryType.CHEST_6_ROW); + } + + @Override + public void onOpen(InventoryGUIOpenEvent e) { + fill(FILLER_ITEM); + set(GUIClickableItem.getCloseItem(49)); + + set(new GUIClickableItem(50) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + new GUIGemstoneGuide().open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack( + "§aGemstone Guide", + Material.REDSTONE_TORCH, + 1, + "§7Many items can have §dGemstones", + "§7applied to them. Gemstones increase", + "§7the stats of an item based on the", + "§7type of Gemstone used.", + "", + "§7There are several §aqualities §7of", + "§7Gemstones, ranging from §fRough §7to", + "§6Perfect§7. The higher the quality, the", + "§7better the stat!", + "", + "§7This guide shows the items that can", + "§7have Gemstones applied to them.", + "", + "§eClick to view!" + ); + } + }); + + updateFromItem(null); + } + + public void updateFromItem(SkyBlockItem item) { + this.item = item; + + if (item == null) { + set(new GUIClickableItem(13) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + ItemStack stack = player.getInventory().getCursorItem(); + SkyBlockItem item = new SkyBlockItem(stack); + + if (stack.get(DataComponents.CUSTOM_NAME) == null) return; + if (!item.hasComponent(GemstoneComponent.class)) { + player.sendMessage("§cOnly items that can have Gemstones applied to them can be put in the Grinder!"); + return; + } + + e.setCancelled(true); + player.getInventory().setCursorItem(ItemStack.AIR); + updateFromItem(item); + } + + @Override + public boolean canPickup() { + return true; + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + return ItemStack.builder(Material.AIR); + } + }); + + for (int slot : PRE_SLOTS) { + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + return ItemStackCreator.getStack( + "§dGemstone Slot", Material.GRAY_STAINED_GLASS_PANE, 1, + "§7Place an item above to apply", + "§7Gemstones to it!" + ); + } + }); + } + + updateItemStacks(getInventory(), getPlayer()); + return; + } + + for (int slot : PRE_SLOTS) { + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + return FILLER_ITEM; + } + }); + } + + set(new GUIClickableItem(13) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + ItemStack stack = player.getInventory().getCursorItem(); + + if (stack == ItemStack.AIR) { + e.setCancelled(true); + player.getInventory().setCursorItem(PlayerItemUpdater.playerUpdate(player, item.getItemStack()).build()); + updateFromItem(null); + } + } + + @Override + public boolean canPickup() { + return true; + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + return PlayerItemUpdater.playerUpdate(player, item.getItemStack()); + } + }); + + List gemstoneSlots = item.getComponent(GemstoneComponent.class).getSlots(); + int[] slotsToPlaceGems = SLOTS.get(gemstoneSlots.size()); + int index = 0; + for (GemstoneComponent.GemstoneSlot gemstoneSlot : gemstoneSlots) { + int slot = slotsToPlaceGems[index]; + ItemAttributeGemData.GemData gemData = item.getAttributeHandler().getGemData(); + Gemstone.Slots gemSlot = gemstoneSlot.slot(); + + if (gemData.isSlotUnlocked(index)) { + if (gemData.getGem(index).filledWith != null) { + SkyBlockItem appliedGem = new SkyBlockItem(gemData.getGem(index).filledWith); + + int finalIndex = index; + set(new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + int costToRemove = appliedGem.getComponent(GemstoneImplComponent.class).getGemRarity().costToRemove; + if (player.getCoins() >= costToRemove) { + player.removeCoins(costToRemove); + player.addAndUpdateItem(appliedGem); + gemData.removeGem(finalIndex); + + updateFromItem(item); + } else { + player.sendMessage("§cYou don't have enough coins to remove this!"); + } + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + + ItemStack.Builder itemStack = PlayerItemUpdater.playerUpdate( + player, appliedGem.getItemStack() + ); + ArrayList lore = new ArrayList<>(appliedGem.getLore()); + + lore.add(""); + lore.add("§7Cost to Remove"); + lore.add("§6" + StringUtility.commaify(appliedGem.getComponent(GemstoneImplComponent.class).getGemRarity().costToRemove) + " Coins"); + lore.add(""); + lore.add("§eClick to remove!"); + + return ItemStackCreator.updateLore(itemStack, lore); + } + }); + } else { + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + String title = gemSlot.getColor() + gemSlot.getSymbol() + " " + gemSlot.getName() + " Gemstone Slot"; + List lore = new ArrayList<>(); + + if (gemSlot.getValidGemstones().size() > 1) { // Universal Slot + lore.add("§7Click §aany Gemstone §7of any quality in"); + lore.add("§7your inventory to apply it to this item!"); + lore.add(""); + lore.add("§7Applicable Gemstones"); + for (Gemstone gemstone : gemSlot.getValidGemstones()) { + lore.add(gemstone.getColor() + StringUtility.toNormalCase(gemstone.name()) + " Gemstone"); + } + } else { // Specific Gem Slot + Gemstone gemstone = gemSlot.getValidGemstones().getFirst(); + lore.add("§7Click a " + gemstone.getColor() + StringUtility.toNormalCase(gemstone.name()) + " Gemstone §7of any"); + lore.add("§7quality in your inventory to apply it"); + lore.add("§7to this item!"); + } + + return ItemStackCreator.getStack(title, gemSlot.paneColor, 1, lore); + } + }); + } + } else { + int finalI = index; + set(new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + + int coins = Math.max(gemstoneSlot.unlockPrice(), 0); + + List requirements = gemstoneSlot.itemRequirements(); + Map itemRequirements = new HashMap<>(); + + for (GemstoneComponent.ItemRequirement requirement : requirements) { + itemRequirements.put(requirement.itemId(), requirement.amount()); + } + + if (player.getCoins() < coins) { + player.sendMessage("§cYou don't have the required items!"); + return; + } + + if (!player.removeItemsFromPlayer(itemRequirements)) { + player.sendMessage("§cYou don't have the required items!"); + return; + } + + player.removeCoins(coins); + gemData.unlockSlot(finalI); + + updateFromItem(item); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + String title = gemSlot.getColor() + gemSlot.getSymbol() + " " + gemSlot.getName() + " Gemstone Slot"; + + List lore = new ArrayList<>(); + lore.add("§7This slot is locked! Purchasing this"); + lore.add("§7slot allows you to apply a"); + lore.add(gemSlot.getColor() + gemSlot.getSymbol() + " " + gemSlot.getName() + " Gemstone §7to it!"); + lore.add(""); + + if (gemSlot.getValidGemstones().size() > 1) { + for (Gemstone gemstone : gemSlot.getValidGemstones()) { + lore.add(gemstone.getColor() + StringUtility.toNormalCase(gemstone.name()) + " Gemstone"); + } + lore.add(""); + } + + if (!gemstoneSlot.itemRequirements().isEmpty() || gemstoneSlot.unlockPrice() > 0) { + lore.add("§7Cost"); + if (gemstoneSlot.unlockPrice() > 0) { + lore.add(ChatColor.GOLD + StringUtility.commaify(gemstoneSlot.unlockPrice()) + " Coins"); + } + if (!gemstoneSlot.itemRequirements().isEmpty()) { + for (GemstoneComponent.ItemRequirement requirement : gemstoneSlot.itemRequirements()) { + Gemstone.Slots slots = Gemstone.Slots.getFromGemstone(Gemstone.getFromItemType(requirement.itemId())); + SkyBlockItem skyBlockItem = new SkyBlockItem(requirement.itemId()); + lore.add(skyBlockItem.getComponent(GemstoneImplComponent.class).getGemRarity().getRarity().getColor() + + slots.getSymbol() + " " + skyBlockItem.getDisplayName() + " §8x" + requirement.amount()); + } + } + } + + lore.add(""); + lore.add("§eClick to unlock!"); + + return ItemStackCreator.getStack(title, Material.GRAY_STAINED_GLASS_PANE, 1, lore); + } + }); + } + + index++; + } + + updateItemStacks(getInventory(), getPlayer()); + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + SkyBlockPlayer player = (SkyBlockPlayer) e.getPlayer(); + SkyBlockItem clickedItem = new SkyBlockItem(e.getClickedItem()); + if (item == null) return; + + if (!clickedItem.hasComponent(GemstoneImplComponent.class)) { + player.sendMessage("§cYou cannot apply that to this item!"); + e.setCancelled(true); + return; + } + ItemAttributeGemData.GemData gemData = item.getAttributeHandler().getGemData(); + + List itemSlots = item.getComponent(GemstoneComponent.class).getSlots(); + int index = 0; + for (GemstoneComponent.GemstoneSlot slot : itemSlots) { + ItemAttributeGemData.GemData.GemSlots gemSlot = gemData.getGem(index); + index++; + if (gemSlot.filledWith != null) continue; + + List allowedGems = new ArrayList<>(); + for (Gemstone gemstone : slot.slot().getValidGemstones()) { + allowedGems.addAll(gemstone.item); + } + + if (gemSlot.isUnlocked() && allowedGems.contains(clickedItem.getAttributeHandler().getPotentialType())) { + gemSlot.setFilledWith(clickedItem.getAttributeHandler().getPotentialType()); + player.getInventory().setItemStack(e.getSlot(), ItemStack.AIR); + updateFromItem(item); + break; + } + } + e.setCancelled(true); + } + + @Override + public void onClose(InventoryCloseEvent e, CloseReason reason) { + SkyBlockPlayer player = (SkyBlockPlayer) e.getPlayer(); + if (item != null) player.addAndUpdateItem(item); + } +} diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGuide.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGuide.java new file mode 100644 index 000000000..c1d54c8b7 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIGemstoneGuide.java @@ -0,0 +1,137 @@ +package net.swofty.type.dwarvenmines.gui; + +import net.minestom.server.event.inventory.InventoryPreClickEvent; +import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.swofty.commons.skyblock.item.ItemType; +import net.swofty.type.generic.gui.inventory.HypixelPaginatedGUI; +import net.swofty.type.generic.gui.inventory.ItemStackCreator; +import net.swofty.type.generic.gui.inventory.item.GUIClickableItem; +import net.swofty.type.generic.gui.inventory.item.GUIItem; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.generic.utility.PaginationList; +import net.swofty.type.skyblockgeneric.gems.Gemstone; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.components.GemstoneComponent; +import net.swofty.type.skyblockgeneric.item.components.TrackedUniqueComponent; +import net.swofty.type.skyblockgeneric.item.updater.PlayerItemUpdater; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.*; + +public class GUIGemstoneGuide extends HypixelPaginatedGUI { + protected GUIGemstoneGuide() { + super(InventoryType.CHEST_6_ROW); + } + + @Override + public int[] getPaginatedSlots() { + return new int[]{ + 10, 11, 12, 13, 14, 15, 16, + 19, 20, 21, 22, 23, 24, 25, + 28, 29, 30, 31, 32, 33, 34, + 37, 38, 39, 40, 41, 42, 43 + }; + } + + @Override + protected boolean shouldFilterFromSearch(String query, SkyBlockItem item) { + return false; + } + + @Override + protected PaginationList fillPaged(HypixelPlayer player, PaginationList paged) { + paged.addAll(Arrays.stream(ItemType.values()).map(SkyBlockItem::new).toList()); + paged.removeIf((element) -> !element.hasComponent(GemstoneComponent.class) || + element.getComponent(GemstoneComponent.class).getSlots() == null); + + return paged; + } + + @Override + protected void performSearch(HypixelPlayer player, String query, int page, int maxPage) { + border(FILLER_ITEM); + set(GUIClickableItem.getGoBackItem(48, new GUIGemstoneGrinder())); + set(GUIClickableItem.getCloseItem(49)); + + set(new GUIItem(4) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack( + "§aGemstone Guide", + Material.REDSTONE_TORCH, + 1, + "§7Many items can have §dGemstones", + "§7applied to them. Gemstones increase", + "§7the stats of an item based on the", + "§7type of Gemstone used.", + "", + "§7There are several §aqualities §7of", + "§7Gemstones, ranging from §fRough §7to", + "§6Perfect§7. The higher the quality, the", + "§7better the stat!", + "", + "§7This guide shows the items that can", + "§7have Gemstones applied to them." + ); + } + }); + + if (page > 1) { + set(createNavigationButton(this, 45, query, page, false)); + } + if (page < maxPage) { + set(createNavigationButton(this, 53, query, page, true)); + } + } + + @Override + protected GUIClickableItem createItemFor(SkyBlockItem item, int slot, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + ItemStack.Builder itemStack = PlayerItemUpdater.playerUpdate( + player, item.getItemStack() + ); + + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + ArrayList lore = new ArrayList<>(item.getLore()); + Map slots = new HashMap<>(); + + for (GemstoneComponent.GemstoneSlot slot : item.getComponent(GemstoneComponent.class).getSlots()) { + slots.put(slot.slot(), slots.getOrDefault(slot.slot(), 0) + 1); + } + + lore.add(""); + lore.add("§7Available Gemstone Slots"); + for (Map.Entry slot : slots.entrySet()) { + Gemstone.Slots key = slot.getKey(); + lore.add(" " + key.getColor() + key.getSymbol() + " " + key.getName() + " §8x" + slot.getValue()); + } + + return ItemStackCreator.updateLore(itemStack, lore); + } + }; + } + + @Override + protected String getTitle(HypixelPlayer player, String query, int page, PaginationList paged) { + return "(" + page + "/" + paged.getPageCount() + ") Gemstone Guide"; + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + + } +} diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIShopLumina.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIShopLumina.java new file mode 100644 index 000000000..9678258d8 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/GUIShopLumina.java @@ -0,0 +1,19 @@ +package net.swofty.type.dwarvenmines.gui; + +import net.swofty.commons.skyblock.item.ItemType; +import net.swofty.type.skyblockgeneric.gui.SkyBlockShopGUI; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.shop.type.CoinShopPrice; + +public class GUIShopLumina extends SkyBlockShopGUI { + public GUIShopLumina() { + super("Lumina", 1, DEFAULT); + } + + @Override + public void initializeShopItems() { + attachItem(ShopItem.Stackable(new SkyBlockItem(ItemType.TORCH), 64, new CoinShopPrice(32))); + attachItem(ShopItem.Single(new SkyBlockItem(ItemType.LANTERN), 1, new CoinShopPrice(10_000))); + attachItem(ShopItem.Single(new SkyBlockItem(ItemType.INFINI_TORCH), 1, new CoinShopPrice(100_000))); + } +} diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIBlocks.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIBlocks.java index 629506164..ed2517add 100644 --- a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIBlocks.java +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIBlocks.java @@ -1,5 +1,6 @@ package net.swofty.type.dwarvenmines.gui.fragilis; +import lombok.Getter; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.inventory.InventoryType; import net.minestom.server.item.ItemStack; @@ -10,8 +11,12 @@ import net.swofty.type.generic.gui.inventory.item.GUIItem; import net.swofty.type.generic.user.HypixelPlayer; -// TODO: hardcoded +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class GUIBlocks extends HypixelInventoryGUI { + private final int[] SLOTS = {10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23}; public GUIBlocks() { super("Blocks", InventoryType.CHEST_6_ROW); @@ -20,6 +25,9 @@ public GUIBlocks() { @Override public void onOpen(InventoryGUIOpenEvent e) { border(FILLER_ITEM); + set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); + set(GUIClickableItem.getCloseItem(49)); + set(new GUIItem(4) { @Override public ItemStack.Builder getItem(HypixelPlayer player) { @@ -36,144 +44,41 @@ public ItemStack.Builder getItem(HypixelPlayer player) { ); } }); - set(new GUIItem(10) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Cobblestone", - Material.COBBLESTONE, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(11) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Stone", - Material.STONE, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(12) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Sand", - Material.SAND, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(13) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Gravel", - Material.GRAVEL, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(14) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Ice", - Material.ICE, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(15) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9End Stone", - Material.END_STONE, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(16) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Obsidian", - Material.OBSIDIAN, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(19) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Netherrack", - Material.NETHERRACK, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(20) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Glowstone", - Material.GLOWSTONE, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(21) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Red Sand", - Material.RED_SAND, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(22) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Mycelium", - Material.MYCELIUM, - 1, - "§8Block" - ); - } - }); - set(new GUIItem(23) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§9Hard Stone", - Material.STONE, - 1, - "§8Block", - "", - "§7Properties", - "§7 Breaking Power: §24", - "§7 Block Strength: §e50" - ); - } - }); - set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); - set(GUIClickableItem.getCloseItem(49)); + + List blocks = Arrays.asList(BlockData.values()); + + for (int i = 0; i < blocks.size() && i < SLOTS.length; i++) { + final BlockData block = blocks.get(i); + final int slot = SLOTS[i]; + + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + List lore = new ArrayList<>(); + + lore.add("§8Block"); + + if (block.getBreakingPower() > 0 || block.getBlockStrength() > 0) { + lore.add(""); + lore.add("§7Properties"); + if (block.getBreakingPower() > 0) { + lore.add("§7 Breaking Power: §2" + block.getBreakingPower()); + } + if (block.getBlockStrength() > 0) { + lore.add("§7 Block Strength: §e" + block.getBlockStrength()); + } + } + + return ItemStackCreator.getStack( + "§9" + block.getDisplayName(), + block.getMaterial(), + 1, + lore.toArray(new String[0]) + ); + } + }); + } + updateItemStacks(getInventory(), getPlayer()); } @@ -186,4 +91,32 @@ public boolean allowHotkeying() { public void onBottomClick(InventoryPreClickEvent e) { e.setCancelled(true); } -} + + @Getter + public enum BlockData { + COBBLESTONE("Cobblestone", Material.COBBLESTONE, 0, 0), + STONE("Stone", Material.STONE, 0, 0), + SAND("Sand", Material.SAND, 0, 0), + GRAVEL("Gravel", Material.GRAVEL, 0, 0), + ICE("Ice", Material.ICE, 0, 0), + END_STONE("End Stone", Material.END_STONE, 0, 0), + OBSIDIAN("Obsidian", Material.OBSIDIAN, 0, 0), + NETHERRACK("Netherrack", Material.NETHERRACK, 0, 0), + GLOWSTONE("Glowstone", Material.GLOWSTONE, 0, 0), + RED_SAND("Red Sand", Material.RED_SAND, 0, 0), + MYCELIUM("Mycelium", Material.MYCELIUM, 0, 0), + HARD_STONE("Hard Stone", Material.STONE, 4, 50); + + private final String displayName; + private final Material material; + private final int breakingPower; + private final int blockStrength; + + BlockData(String displayName, Material material, int breakingPower, int blockStrength) { + this.displayName = displayName; + this.material = material; + this.breakingPower = breakingPower; + this.blockStrength = blockStrength; + } + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIDwarvenMetals.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIDwarvenMetals.java index d4315e98a..b0f1dfce0 100644 --- a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIDwarvenMetals.java +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIDwarvenMetals.java @@ -1,5 +1,6 @@ package net.swofty.type.dwarvenmines.gui.fragilis; +import lombok.Getter; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.inventory.InventoryType; import net.minestom.server.item.ItemStack; @@ -10,8 +11,11 @@ import net.swofty.type.generic.gui.inventory.item.GUIItem; import net.swofty.type.generic.user.HypixelPlayer; -// TODO: hardcoded +import java.util.Arrays; +import java.util.List; + public class GUIDwarvenMetals extends HypixelInventoryGUI { + private final int[] SLOTS = {10, 11, 12, 13, 14}; public GUIDwarvenMetals() { super("Dwarven Metals", InventoryType.CHEST_6_ROW); @@ -20,6 +24,9 @@ public GUIDwarvenMetals() { @Override public void onOpen(InventoryGUIOpenEvent e) { border(FILLER_ITEM); + set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); + set(GUIClickableItem.getCloseItem(49)); + set(new GUIItem(4) { @Override public ItemStack.Builder getItem(HypixelPlayer player) { @@ -36,83 +43,34 @@ public ItemStack.Builder getItem(HypixelPlayer player) { ); } }); - set(new GUIItem(10) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aMithril Ore", - Material.PRISMARINE_BRICKS, - 1, - "§8Dwarven Metal", - "", - "§7Properties", - "§7 Breaking Power: §24", - "§7 Block Strength: §e800" - ); - } - }); - set(new GUIItem(11) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aTitanium Ore", - Material.POLISHED_DIORITE, - 1, - "§8Dwarven Metal", - "", - "§7Properties", - "§7 Breaking Power: §25", - "§7 Block Strength: §e2,000" - ); - } - }); - set(new GUIItem(12) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aUmber", - Material.RED_SANDSTONE, - 1, - "§8Dwarven Metal", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e5,600" - ); - } - }); - set(new GUIItem(13) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aTungsten", - Material.CLAY, - 1, - "§8Dwarven Metal", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e5,600" - ); - } - }); - set(new GUIItem(14) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aGlacite", - Material.PACKED_ICE, - 1, - "§8Dwarven Metal", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e6,000" - ); - } - }); - set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); - set(GUIClickableItem.getCloseItem(49)); + + List metals = Arrays.asList(DwarvenMetalData.values()); + + for (int i = 0; i < metals.size() && i < SLOTS.length; i++) { + final DwarvenMetalData metal = metals.get(i); + final int slot = SLOTS[i]; + + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + List lore = Arrays.asList( + "§8Dwarven Metal", + "", + "§7Properties", + "§7 Breaking Power: §2" + metal.getBreakingPower(), + "§7 Block Strength: §e" + String.format("%,d", metal.getBlockStrength()) + ); + + return ItemStackCreator.getStack( + "§a" + metal.getDisplayName(), + metal.getMaterial(), + 1, + lore.toArray(new String[0]) + ); + } + }); + } + updateItemStacks(getInventory(), getPlayer()); } @@ -125,4 +83,25 @@ public boolean allowHotkeying() { public void onBottomClick(InventoryPreClickEvent e) { e.setCancelled(true); } -} + + @Getter + public enum DwarvenMetalData { + MITHRIL_ORE("Mithril Ore", Material.PRISMARINE_BRICKS, 4, 800), + TITANIUM_ORE("Titanium Ore", Material.POLISHED_DIORITE, 5, 2000), + UMBER("Umber", Material.RED_SANDSTONE, 9, 5600), + TUNGSTEN("Tungsten", Material.CLAY, 9, 5600), + GLACITE("Glacite", Material.PACKED_ICE, 9, 6000); + + private final String displayName; + private final Material material; + private final int breakingPower; + private final int blockStrength; + + DwarvenMetalData(String displayName, Material material, int breakingPower, int blockStrength) { + this.displayName = displayName; + this.material = material; + this.breakingPower = breakingPower; + this.blockStrength = blockStrength; + } + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIGemstones.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIGemstones.java index 7d8d77ab0..e7fdd86e0 100644 --- a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIGemstones.java +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIGemstones.java @@ -1,5 +1,6 @@ package net.swofty.type.dwarvenmines.gui.fragilis; +import lombok.Getter; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.inventory.InventoryType; import net.minestom.server.item.ItemStack; @@ -10,8 +11,11 @@ import net.swofty.type.generic.gui.inventory.item.GUIItem; import net.swofty.type.generic.user.HypixelPlayer; -// TODO: hardcoded +import java.util.Arrays; +import java.util.List; + public class GUIGemstones extends HypixelInventoryGUI { + private final int[] SLOTS = {10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23}; public GUIGemstones() { super("Gemstones", InventoryType.CHEST_6_ROW); @@ -20,6 +24,9 @@ public GUIGemstones() { @Override public void onOpen(InventoryGUIOpenEvent e) { border(FILLER_ITEM); + set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); + set(GUIClickableItem.getCloseItem(49)); + set(new GUIItem(4) { @Override public ItemStack.Builder getItem(HypixelPlayer player) { @@ -37,173 +44,30 @@ public ItemStack.Builder getItem(HypixelPlayer player) { ); } }); - set(new GUIItem(10) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dRuby Gemstone", - Material.RED_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §26", - "§7 Block Strength: §e2,300" - ); - } - }); - set(new GUIItem(11) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dAmber Gemstone", - Material.ORANGE_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §27", - "§7 Block Strength: §e3,000" - ); - } - }); - set(new GUIItem(12) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dSapphire Gemstone", - Material.LIGHT_BLUE_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §27", - "§7 Block Strength: §e3,000" - ); - } - }); - set(new GUIItem(13) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dJade Gemstone", - Material.LIME_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §27", - "§7 Block Strength: §e3,000" - ); - } - }); - set(new GUIItem(14) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dAmethyst Gemstone", - Material.PURPLE_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §27", - "§7 Block Strength: §e3,000" - ); - } - }); - set(new GUIItem(15) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dOpal Gemstone", - Material.WHITE_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §27", - "§7 Block Strength: §e3,000" - ); - } - }); - set(new GUIItem(16) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dTopaz Gemstone", - Material.YELLOW_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §28", - "§7 Block Strength: §e3,800" - ); - } - }); - set(new GUIItem(19) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dJasper Gemstone", - Material.MAGENTA_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e4,800" - ); - } - }); - set(new GUIItem(21) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dAquamarine Gemstone", - Material.BLUE_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e5,200" - ); - } - }); - set(new GUIItem(22) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dCitrine Gemstone", - Material.BROWN_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e5,200" - ); - } - }); - set(new GUIItem(23) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§dPeridot Gemstone", - Material.GREEN_STAINED_GLASS, - 1, - "§8Gemstone", - "", - "§7Properties", - "§7 Breaking Power: §29", - "§7 Block Strength: §e5,200" - ); - } - }); - set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); - set(GUIClickableItem.getCloseItem(49)); + + List gemstones = Arrays.asList(GemstoneData.values()); + + for (int i = 0; i < gemstones.size() && i < SLOTS.length; i++) { + final GemstoneData gemstone = gemstones.get(i); + final int slot = SLOTS[i]; + + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack( + "§d" + gemstone.getDisplayName() + " Gemstone", + gemstone.getMaterial(), + 1, + "§8Gemstone", + "", + "§7Properties", + "§7 Breaking Power: §2" + gemstone.getBreakingPower(), + "§7 Block Strength: §e" + String.format("%,d", gemstone.getBlockStrength()) + ); + } + }); + } + updateItemStacks(getInventory(), getPlayer()); } @@ -216,4 +80,32 @@ public boolean allowHotkeying() { public void onBottomClick(InventoryPreClickEvent e) { e.setCancelled(true); } -} + + @Getter + public enum GemstoneData { + RUBY("Ruby", Material.RED_STAINED_GLASS, 6, 2300), + AMBER("Amber", Material.ORANGE_STAINED_GLASS, 7, 3000), + SAPPHIRE("Sapphire", Material.LIGHT_BLUE_STAINED_GLASS, 7, 3000), + JADE("Jade", Material.LIME_STAINED_GLASS, 7, 3000), + AMETHYST("Amethyst", Material.PURPLE_STAINED_GLASS, 7, 3000), + OPAL("Opal", Material.WHITE_STAINED_GLASS, 7, 3000), + TOPAZ("Topaz", Material.YELLOW_STAINED_GLASS, 8, 3800), + JASPER("Jasper", Material.MAGENTA_STAINED_GLASS, 9, 4800), + ONYX("Onyx", Material.BLACK_STAINED_GLASS, 9, 5200), + AQUAMARINE("Aquamarine", Material.BLUE_STAINED_GLASS, 9, 5200), + CITRINE("Citrine", Material.BROWN_STAINED_GLASS, 9, 5200), + PERIDOT("Peridot", Material.GREEN_STAINED_GLASS, 9, 5200); + + private final String displayName; + private final Material material; + private final int breakingPower; + private final int blockStrength; + + GemstoneData(String displayName, Material material, int breakingPower, int blockStrength) { + this.displayName = displayName; + this.material = material; + this.breakingPower = breakingPower; + this.blockStrength = blockStrength; + } + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIOres.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIOres.java index 3f8ede432..57698fe1f 100644 --- a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIOres.java +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/gui/fragilis/GUIOres.java @@ -1,5 +1,6 @@ package net.swofty.type.dwarvenmines.gui.fragilis; +import lombok.Getter; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.inventory.InventoryType; import net.minestom.server.item.ItemStack; @@ -10,8 +11,12 @@ import net.swofty.type.generic.gui.inventory.item.GUIItem; import net.swofty.type.generic.user.HypixelPlayer; -// TODO: hardcoded +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class GUIOres extends HypixelInventoryGUI { + private final int[] SLOTS = {10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30}; public GUIOres() { super("Ores", InventoryType.CHEST_6_ROW); @@ -20,6 +25,9 @@ public GUIOres() { @Override public void onOpen(InventoryGUIOpenEvent e) { border(FILLER_ITEM); + set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); + set(GUIClickableItem.getCloseItem(49)); + set(new GUIItem(4) { @Override public ItemStack.Builder getItem(HypixelPlayer player) { @@ -36,231 +44,37 @@ public ItemStack.Builder getItem(HypixelPlayer player) { ); } }); - set(new GUIItem(10) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Coal Ore", - Material.COAL_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(11) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Iron Ore", - Material.IRON_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(12) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Gold Ore", - Material.GOLD_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(13) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Lapis Lazuli Ore", - Material.LAPIS_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(14) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Redstone Ore", - Material.REDSTONE_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(15) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Emerald Ore", - Material.EMERALD_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(16) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Diamond Ore", - Material.DIAMOND_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(19) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Coal", - Material.COAL_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(20) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Iron", - Material.IRON_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(21) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Gold", - Material.GOLD_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(22) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Lapis", - Material.LAPIS_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(23) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Redstone", - Material.REDSTONE_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(24) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Emerald", - Material.EMERALD_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(25) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Diamond", - Material.DIAMOND_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(28) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Nether Quartz Ore", - Material.NETHER_QUARTZ_ORE, - 1, - "§8Ore" - ); - } - }); - set(new GUIItem(29) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Pure Quartz", - Material.QUARTZ_BLOCK, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §23", - "§7 Block Strength: §e600" - ); - } - }); - set(new GUIItem(30) { - @Override - public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§6Sulphur Ore", - Material.SPONGE, - 1, - "§8Ore", - "", - "§7Properties", - "§7 Breaking Power: §28", - "§7 Block Strength: §e500" - ); - } - }); - set(GUIClickableItem.getGoBackItem(48, new GUIHandyBlockGuide())); - set(GUIClickableItem.getCloseItem(49)); + + List ores = Arrays.asList(OreData.values()); + + for (int i = 0; i < ores.size() && i < SLOTS.length; i++) { + final OreData ore = ores.get(i); + final int slot = SLOTS[i]; + + set(new GUIItem(slot) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + List lore = new ArrayList<>(); + + lore.add("§8Ore"); + + if (ore.hasProperties) { + lore.add(""); + lore.add("§7Properties"); + lore.add("§7 Breaking Power: §2" + ore.getBreakingPower()); + lore.add("§7 Block Strength: §e" + ore.getBlockStrength()); + } + + return ItemStackCreator.getStack( + "§6" + ore.getDisplayName(), + ore.getMaterial(), + 1, + lore.toArray(new String[0]) + ); + } + }); + } + updateItemStacks(getInventory(), getPlayer()); } @@ -273,4 +87,41 @@ public boolean allowHotkeying() { public void onBottomClick(InventoryPreClickEvent e) { e.setCancelled(true); } -} + + @Getter + public enum OreData { + COAL_ORE("Coal Ore", Material.COAL_ORE, false, 0, 0), + IRON_ORE("Iron Ore", Material.IRON_ORE, false, 0, 0), + GOLD_ORE("Gold Ore", Material.GOLD_ORE, false, 0, 0), + LAPIS_LAZULI_ORE("Lapis Lazuli Ore", Material.LAPIS_ORE, false, 0, 0), + REDSTONE_ORE("Redstone Ore", Material.REDSTONE_ORE, false, 0, 0), + EMERALD_ORE("Emerald Ore", Material.EMERALD_ORE, false, 0, 0), + DIAMOND_ORE("Diamond Ore", Material.DIAMOND_ORE, false, 0, 0), + + PURE_COAL("Pure Coal", Material.COAL_BLOCK, true, 3, 600), + PURE_IRON("Pure Iron", Material.IRON_BLOCK, true, 3, 600), + PURE_GOLD("Pure Gold", Material.GOLD_BLOCK, true, 3, 600), + PURE_LAPIS("Pure Lapis", Material.LAPIS_BLOCK, true, 3, 600), + PURE_REDSTONE("Pure Redstone", Material.REDSTONE_BLOCK, true, 3, 600), + PURE_EMERALD("Pure Emerald", Material.EMERALD_BLOCK, true, 3, 600), + PURE_DIAMOND("Pure Diamond", Material.DIAMOND_BLOCK, true, 3, 600), + + NETHER_QUARTZ_ORE("Nether Quartz Ore", Material.NETHER_QUARTZ_ORE, false, 0, 0), + PURE_QUARTZ("Pure Quartz", Material.QUARTZ_BLOCK, true, 3, 600), + SULPHUR_ORE("Sulphur Ore", Material.SPONGE, true, 8, 500); + + private final String displayName; + private final Material material; + private final boolean hasProperties; + private final int breakingPower; + private final int blockStrength; + + OreData(String displayName, Material material, boolean hasProperties, int breakingPower, int blockStrength) { + this.displayName = displayName; + this.material = material; + this.hasProperties = hasProperties; + this.breakingPower = breakingPower; + this.blockStrength = blockStrength; + } + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCGeo.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCGeo.java new file mode 100644 index 000000000..44802d644 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCGeo.java @@ -0,0 +1,99 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.ChatColor; +import net.swofty.type.generic.data.datapoints.DatapointToggles; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.configuration.HumanConfiguration; +import net.swofty.type.generic.event.custom.NPCInteractEvent; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.stream.Stream; + +public class NPCGeo extends HypixelNPC { + public NPCGeo() { + super(new HumanConfiguration() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{ + ChatColor.GREEN + "Geo", + ChatColor.YELLOW + "" + ChatColor.BOLD + "CLICK" + }; + } + + @Override + public String signature(HypixelPlayer player) { + return "wZW+jncgoCCDcyFMat52uadTINXURF5E0HrBrFPwpn09gd3R5hmp7fFO+P2lxre4/JKzdW0iu9psP4D01Ri79K4/VIO21OV4I2VBL/bpicM7M3xQepI/dOa9XbtLju+0gPEF9nRWbOmDGY71++YOnLRMGXGfInB/3BhoFoTexj+XRhQv7lWofLlJeEb7uvRqOc4Zie/JdDgWSubdHwnC04WodnJ7jUbLj/u7GbJ/1ytJ9Gp85MDs0jAsAhHeSdjKrDMA2pEl/vXaoDnP6GkYyVqpszZC18Y7Wz8HCyzcU8JsKrmjkcOpiXj+nKBD5MdHJO/j+NQkopRAlton/uoNTYZECZDHtH67sWHFp7vivJmBy0CKP3fpShE9s3K3q1Se8+8DkFkVOsbiHWRl8/vkFIE6IfkOnppX+tbEHLJnnQ7xKz0IA/+1J+0CwZAdjQQHg7fN4IfDJq4Zaqbg/HHue4G/+NDbLp4J3CzWz24YlzMZatbRFEKjKMAvE9DAo/Asj5ZwyenoBTZgkJa0MIFZLRb0oZzh1uj0xhQyQyRuNnOP4DeDjmeZslEuKxrhFBHBldzCWZKT8ddUWOoLP5BL/6uTFjs/RMMqBtYYz+4mxJ76+qxblxuimDU8g92GgSKuF1TQPD2Z4qcnAahTaCA8FEBZx5/8mtTEktVgEhEqn1c="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYyNTY3OTY1NzAwMCwKICAicHJvZmlsZUlkIiA6ICIzYTNmNzhkZmExZjQ0OTllYjE5NjlmYzlkOTEwZGYwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJOb19jcmVyYXIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGZjOTNlZWIyNThiNDdjYjdjYjQ5OWI2ODFlM2Q2NjAzNWE0NDNjMDc2Mjg0ZmYzZmY1MGIxOTZhNDY2YTU4YyIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(87.5, 199, -115.5, -225, 0); + } + + @Override + public boolean looking(HypixelPlayer player) { + return true; + } + }); + } + + @Override + public void onClick(NPCInteractEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + if (isInDialogue(player)) return; + + if (!player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_GEO)) { + setDialogue(player, "initial-hello").thenRun(() -> { + player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_GEO, true); + }); + return; + } + + setDialogue(player, "idle-" + (1 + (int)(Math.random() * 3))); + } + + @Override + protected DialogueSet[] dialogues(HypixelPlayer player) { + return Stream.of( + DialogueSet.builder() + .key("initial-hello") + .lines(new String[]{ + "§aGemstones §rhave magical properties and can be applied to some special items.", + "There are §a12 §rdifferent Gemstones, all of them having their own unique properties!", + "For example, adding §cRuby §rto armor will increase its §c❤ Health§r, while §dJasper §rincreases §c❁ Strength§r.", + "The more pure the Gemstone - the stronger the effect!", + "Only some items can have Gemstones applied, and you can remove them any time.", + "Use the §dGemstone Grinder §rnext to me to apply Gemstones to items!" + }) + .build(), + DialogueSet.builder() + .key("idle-1") + .lines(new String[]{ + "The more pure the Gemstone - the stronger the effect!", + "There are several qualities of Gemstone, including §fRough§r, §aFlawed§r, and §9Fine§r.", + "The highest quality of Gemstone - §6Perfect §r- will increase your stats the most!" + }) + .build(), + DialogueSet.builder() + .key("idle-2") + .lines(new String[]{ + "Not all items can have Gemstones applied to them.", + "Check out the §dGemstone Grinder §rmenu to check which items work with it!" + }) + .build(), + DialogueSet.builder() + .key("idle-3") + .lines(new String[]{ + "Use the §dGemstone Grinder §rnext to me to apply Gemstones to items!" + }) + .build() + ).toArray(DialogueSet[]::new); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLumina.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLumina.java new file mode 100644 index 000000000..a07d4206f --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLumina.java @@ -0,0 +1,51 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.ChatColor; +import net.swofty.type.dwarvenmines.gui.GUIShopLumina; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.configuration.HumanConfiguration; +import net.swofty.type.generic.event.custom.NPCInteractEvent; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCLumina extends HypixelNPC { + public NPCLumina() { + super(new HumanConfiguration() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{ + ChatColor.YELLOW + "Lumina", + ChatColor.YELLOW + "" + ChatColor.BOLD + "CLICK" + }; + } + + @Override + public String signature(HypixelPlayer player) { + return "EtTogfRrMFuYvMm04HNNbCgpXKBqI7yBJXPds3DD30SrSzG8BV/J67DPYL00a7cVpunqKzDItUaTMjbwZqriKufDYEwES6PZB7h9iqEpEjO4aTPd6hGr49v49ssB7fJES6rNsMfqbrfzOcRY8HMysTiRY2QDsRIzFq/HpZyt2B0WxrygdXokpYvN3zc5dIqR5ULvPO6BGGaQ3yn+92xPO8ymyJLpIllRUwxmFdb0yDlPFAp/VZBIZeF9zpZSX2TfP7A/09U580wb7dWqJZ+7LX4VZ1EeyDZKpQoG4I2I/cZNlLR4sEp1XTCD/dgitRu0a+KYr8LheX3smQYFNHKl7ucivFRAv8gNLXKz0jD5tfXJmyc968ercV9YiJyoBnSY3a6coSh6UfAXkYiC1iorwLDBV20MY8NOxsESBZNtLxR+u2D/8kbdZnsnDlsBeppOmZjSfjb4iXCicDvp7On2eas8edcD5bCUhTMp3S3RZNtr2Yro6fShfWaq5Kjp7buXB2TpIFYcnE9xH542kFuBwETM/njhR2BrjcBk00WnAqaB7ui1mFJ2S52TeEzdgqjMbbQ++6iLaMUw1wqgHIs+gkiikxLaO12/xyToBBREabvZrsKGQiByCqA0wWFueVTobK9rFxM8mBRmFtRcdxeoy5zkixyb6zDMtqRauP61fzE="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYxNTI0MjQ5OTc0NywKICAicHJvZmlsZUlkIiA6ICI3ZGEyYWIzYTkzY2E0OGVlODMwNDhhZmMzYjgwZTY4ZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJHb2xkYXBmZWwiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2RhMzA4Y2FlMTc3MGY2YjcwOWIxZjA4MDA0Y2EyZTljMjBhZjZmZjhlYzUzODFkMTE0YzQ0MDZkZjZiODBiYyIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(77.5, 199, -110.5, 0, 0); + } + + @Override + public boolean looking(HypixelPlayer player) { + return true; + } + }); + } + + @Override + public void onClick(NPCInteractEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + new GUIShopLumina().open(player); + } +} diff --git a/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java b/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java index 2b59609f5..98c02479f 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java +++ b/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java @@ -110,6 +110,7 @@ public enum ToggleType { HAS_SPOKEN_TO_MICHAEL(false), HAS_SPOKEN_TO_IKE(false), HAS_SPOKEN_TO_EMISSARY_BRAUM(false), + HAS_SPOKEN_TO_GEO(false), PAPER_ICONS(false), LOBBY_SHOW_PLAYERS(true), AUTO_ACCEPT_QUESTS(false), diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gems/Gemstone.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gems/Gemstone.java index 02f8e0b16..1b631bc60 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gems/Gemstone.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gems/Gemstone.java @@ -2,6 +2,7 @@ import lombok.Getter; import lombok.SneakyThrows; +import net.minestom.server.item.Material; import net.swofty.commons.ChatColor; import net.swofty.commons.skyblock.item.ItemType; import net.swofty.commons.skyblock.item.attribute.attributes.ItemAttributeGemData; @@ -23,9 +24,9 @@ public enum Gemstone { JASPER(List.of(ItemType.ROUGH_JASPER_GEM, ItemType.FLAWED_JASPER_GEM, ItemType.FINE_JASPER_GEM, ItemType.FLAWLESS_JASPER_GEM, ItemType.PERFECT_JASPER_GEM), ChatColor.LIGHT_PURPLE, ItemStatistic.STRENGTH), OPAL(List.of(ItemType.ROUGH_OPAL_GEM, ItemType.FLAWED_OPAL_GEM, ItemType.FINE_OPAL_GEM, ItemType.FLAWLESS_OPAL_GEM, ItemType.PERFECT_OPAL_GEM), ChatColor.WHITE, ItemStatistic.TRUE_DEFENSE), AQUAMARINE(List.of(ItemType.ROUGH_AQUAMARINE_GEM, ItemType.FLAWED_AQUAMARINE_GEM, ItemType.FINE_AQUAMARINE_GEM, ItemType.FLAWLESS_AQUAMARINE_GEM, ItemType.PERFECT_AQUAMARINE_GEM), ChatColor.AQUA, ItemStatistic.FISHING_SPEED), - CITRINE(List.of(ItemType.ROUGH_CITRINE_GEM, ItemType.FLAWED_CITRINE_GEM, ItemType.FINE_CITRINE_GEM, ItemType.FLAWLESS_CITRINE_GEM, ItemType.PERFECT_CITRINE_GEM), ChatColor.GOLD, ItemStatistic.FORAGING_FORTUNE), + CITRINE(List.of(ItemType.ROUGH_CITRINE_GEM, ItemType.FLAWED_CITRINE_GEM, ItemType.FINE_CITRINE_GEM, ItemType.FLAWLESS_CITRINE_GEM, ItemType.PERFECT_CITRINE_GEM), ChatColor.DARK_RED, ItemStatistic.FORAGING_FORTUNE), PERIDOT(List.of(ItemType.ROUGH_PERIDOT_GEM, ItemType.FLAWED_PERIDOT_GEM, ItemType.FINE_PERIDOT_GEM, ItemType.FLAWLESS_PERIDOT_GEM, ItemType.PERFECT_PERIDOT_GEM), ChatColor.GREEN, ItemStatistic.FARMING_FORTUNE), - ONYX(List.of(ItemType.ROUGH_ONYX_GEM, ItemType.FLAWED_ONYX_GEM, ItemType.FINE_ONYX_GEM, ItemType.FLAWLESS_ONYX_GEM, ItemType.PERFECT_ONYX_GEM), ChatColor.BLACK, ItemStatistic.CRIT_DAMAGE), + ONYX(List.of(ItemType.ROUGH_ONYX_GEM, ItemType.FLAWED_ONYX_GEM, ItemType.FINE_ONYX_GEM, ItemType.FLAWLESS_ONYX_GEM, ItemType.PERFECT_ONYX_GEM), ChatColor.DARK_GRAY, ItemStatistic.CRIT_DAMAGE), ; public final List item; @@ -63,40 +64,55 @@ public static Integer getExtraStatisticFromGemstone(ItemStatistic statistic, Sky return toReturn; } + public static Gemstone getFromItemType(ItemType item) { + for (Gemstone gemstone : Gemstone.values()) { + if (gemstone.getItem().contains(item)) { + return gemstone; + } + }; + return null; + } + public enum Slots { //NORMAL - RUBY("Ruby", ChatColor.RED, "❤", (short) 14, List.of(Gemstone.RUBY)), - AMETHYST("Amethyst", ChatColor.DARK_PURPLE, "❈", (short) 10, List.of(Gemstone.AMETHYST)), - JADE("Jade", ChatColor.GREEN, "☘", (short) 13, List.of(Gemstone.JADE)), - SAPPHIRE("Sapphire", ChatColor.GREEN, "✎", (short) 5, List.of(Gemstone.SAPPHIRE)), - AMBER("Amber", ChatColor.GOLD, "⸕", (short) 1, List.of(Gemstone.AMBER)), - TOPAZ("Topaz", ChatColor.YELLOW, "✧", (short) 4, List.of(Gemstone.TOPAZ)), - JASPER("Jasper", ChatColor.LIGHT_PURPLE, "❁", (short) 2, List.of(Gemstone.JASPER)), + RUBY("Ruby", "❤", ChatColor.RED, Material.RED_STAINED_GLASS_PANE, List.of(Gemstone.RUBY)), + AMETHYST("Amethyst", "❈", ChatColor.DARK_PURPLE, Material.PURPLE_STAINED_GLASS_PANE, List.of(Gemstone.AMETHYST)), + JADE("Jade", "☘", ChatColor.GREEN, Material.LIME_STAINED_GLASS_PANE, List.of(Gemstone.JADE)), + SAPPHIRE("Sapphire", "✎", ChatColor.BLUE, Material.LIGHT_BLUE_STAINED_GLASS_PANE, List.of(Gemstone.SAPPHIRE)), + AMBER("Amber", "⸕", ChatColor.GOLD, Material.ORANGE_STAINED_GLASS_PANE, List.of(Gemstone.AMBER)), + TOPAZ("Topaz", "✧", ChatColor.YELLOW, Material.YELLOW_STAINED_GLASS_PANE, List.of(Gemstone.TOPAZ)), + JASPER("Jasper", "❁", ChatColor.LIGHT_PURPLE, Material.PINK_STAINED_GLASS_PANE, List.of(Gemstone.JASPER)), + OPAL("Opal", "❂", ChatColor.WHITE, Material.WHITE_STAINED_GLASS_PANE, List.of(Gemstone.OPAL)), + AQUAMARINE("Aquamarine", "☂", ChatColor.AQUA, Material.LIGHT_BLUE_STAINED_GLASS_PANE, List.of(Gemstone.AQUAMARINE)), + CITRINE("Citrine", "☘", ChatColor.DARK_RED, Material.RED_STAINED_GLASS_PANE, List.of(Gemstone.CITRINE)), + PERIDOT("Peridot", "☘", ChatColor.DARK_GREEN, Material.GREEN_STAINED_GLASS_PANE, List.of(Gemstone.PERIDOT)), + ONYX("Onyx", "☠", ChatColor.DARK_GRAY, Material.BLACK_STAINED_GLASS_PANE, List.of(Gemstone.ONYX)), //SPECIAL - COMBAT("Combat", ChatColor.RED, "⚔", (short) 14, List.of(Gemstone.RUBY, Gemstone.AMETHYST, Gemstone.SAPPHIRE, Gemstone.JASPER)), - OFFENSIVE("Offensive", ChatColor.BLUE, "☠", (short) 11, List.of(Gemstone.SAPPHIRE, Gemstone.JASPER)), - DEFENSIVE("Defensive", ChatColor.GREEN, "☤", (short) 13, List.of(Gemstone.RUBY, Gemstone.AMETHYST)), - MINING("Mining", ChatColor.GREEN, "✦", (short) 5, List.of(Gemstone.JADE, Gemstone.AMBER, Gemstone.TOPAZ)), - UNIVERSAL("Universal", ChatColor.WHITE, "❂", (short) 0, List.of(Gemstone.values())), + COMBAT("Combat", "⚔", ChatColor.DARK_RED, Material.RED_STAINED_GLASS_PANE, List.of(Gemstone.RUBY, Gemstone.AMETHYST, Gemstone.SAPPHIRE, Gemstone.JASPER, Gemstone.ONYX, Gemstone.OPAL)), + DEFENSIVE("Defensive", "☤", ChatColor.GREEN, Material.LIME_STAINED_GLASS_PANE, List.of(Gemstone.RUBY, Gemstone.AMETHYST, Gemstone.OPAL)), + OFFENSIVE("Offensive", "☠", ChatColor.DARK_BLUE, Material.BLUE_STAINED_GLASS_PANE, List.of(Gemstone.SAPPHIRE, Gemstone.JASPER)), + MINING("Mining", "✦", ChatColor.DARK_PURPLE, Material.PURPLE_STAINED_GLASS_PANE, List.of(Gemstone.JADE, Gemstone.AMBER, Gemstone.TOPAZ)), + CHISEL("Chisel", "❥", ChatColor.GOLD, Material.ORANGE_STAINED_GLASS_PANE, List.of(Gemstone.CITRINE, Gemstone.AQUAMARINE, Gemstone.ONYX, Gemstone.PERIDOT)), + UNIVERSAL("Universal", "❂", ChatColor.WHITE, Material.WHITE_STAINED_GLASS_PANE, List.of(Gemstone.values())), ; @Getter public final String name; @Getter - public final ChatColor color; - @Getter public final String symbol; @Getter - public final short paneColour; + public final ChatColor color; + @Getter + public final Material paneColor; @Getter public final List validGemstones; - Slots(String name, ChatColor color, String symbol, short paneColour, List validGemstones) { + Slots(String name, String symbol, ChatColor color, Material paneColor, List validGemstones) { this.name = name; this.symbol = symbol; this.color = color; - this.paneColour = paneColour; + this.paneColor = paneColor; this.validGemstones = validGemstones; } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/ItemLore.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/ItemLore.java index 50f3bc6a1..240eff867 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/ItemLore.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/ItemLore.java @@ -7,6 +7,7 @@ import net.minestom.server.component.DataComponents; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; +import net.swofty.commons.ChatColor; import net.swofty.commons.StringUtility; import net.swofty.commons.skyblock.item.ItemType; import net.swofty.commons.skyblock.item.Rarity; @@ -171,8 +172,8 @@ public void updateLore(@Nullable SkyBlockPlayer player) { index++; Gemstone.Slots gemstone = entry.slot(); - if (!gemData.hasGem(index)) { - gemstoneLore.append("§8[").append(gemstone.symbol).append("] "); + if (gemData.getGem(index) == null || !gemData.getGem(index).isUnlocked()) { + gemstoneLore.append(ChatColor.DARK_GRAY).append("[").append(gemstone.symbol).append("] "); continue; } @@ -180,7 +181,7 @@ public void updateLore(@Nullable SkyBlockPlayer player) { ItemType filledWith = gemSlot.filledWith; if (filledWith == null) { - gemstoneLore.append("§7[").append(gemstone.symbol).append("] "); + gemstoneLore.append(ChatColor.DARK_GRAY).append("[").append(ChatColor.GRAY).append(gemstone.symbol).append(ChatColor.DARK_GRAY).append("]"); continue; } @@ -190,7 +191,7 @@ public void updateLore(@Nullable SkyBlockPlayer player) { Gemstone gemstoneEnum = gemstoneImplComponent.getGemstone(); Gemstone.Slots gemstoneSlot = Gemstone.Slots.getFromGemstone(gemstoneEnum); - gemstoneLore.append(gemRarity.bracketColor).append("[").append(gemstoneSlot.symbol).append(gemRarity.bracketColor).append("] "); + gemstoneLore.append(gemRarity.bracketColor).append("[").append(gemstoneEnum.color).append(gemstoneSlot.symbol).append(gemRarity.bracketColor).append("] "); } if (!gemstoneLore.toString().trim().isEmpty()) { @@ -222,7 +223,7 @@ public void updateLore(@Nullable SkyBlockPlayer player) { // Display level-specific description: "Increases Strength by 20." String description = effectType.getDescription(potionData.getLevel()); - if (description != null && !description.isEmpty()) { + if (!description.isEmpty()) { addLoreLine("§7" + description); } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/components/GemstoneComponent.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/components/GemstoneComponent.java index bbe3b15c3..71572e474 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/components/GemstoneComponent.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/components/GemstoneComponent.java @@ -1,6 +1,7 @@ package net.swofty.type.skyblockgeneric.item.components; import lombok.Getter; +import net.swofty.commons.skyblock.item.ItemType; import net.swofty.type.skyblockgeneric.gems.Gemstone; import net.swofty.type.skyblockgeneric.item.SkyBlockItemComponent; @@ -21,7 +22,7 @@ public record GemstoneSlot( ) {} public record ItemRequirement( - net.swofty.commons.skyblock.item.ItemType itemId, + ItemType itemId, int amount ) {} } \ No newline at end of file diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/NonPlayerItemUpdater.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/NonPlayerItemUpdater.java index 6f68f3901..9a5ca734d 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/NonPlayerItemUpdater.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/NonPlayerItemUpdater.java @@ -100,13 +100,23 @@ public ItemStack.Builder getUpdatedItem() { int index = 0; ItemAttributeGemData.GemData gemData = item.getAttributeHandler().getGemData(); for (GemstoneComponent.GemstoneSlot slot : gemstoneComponent.getSlots()) { - if (slot.unlockPrice() == 0) { + if (slot.unlockPrice() == 0 && slot.itemRequirements().isEmpty()) { // Slot should be unlocked by default if (gemData.hasGem(index)) continue; - item.getAttributeHandler().getGemData().putGem( + gemData.putGem( new ItemAttributeGemData.GemData.GemSlots( index, - null + null, + true + ) + ); + } else { + if (gemData.hasGem(index)) continue; + gemData.putGem( + new ItemAttributeGemData.GemData.GemSlots( + index, + null, + false ) ); } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/PlayerItemUpdater.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/PlayerItemUpdater.java index acfa75902..55c2b5b08 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/PlayerItemUpdater.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/item/updater/PlayerItemUpdater.java @@ -137,19 +137,29 @@ public static Map.Entry playerUpdateFull(SkyBlo int index = 0; ItemAttributeGemData.GemData gemData = item.getAttributeHandler().getGemData(); for (GemstoneComponent.GemstoneSlot slot : gemstoneComponent.getSlots()) { - if (slot.unlockPrice() == 0) { + if (slot.unlockPrice() == 0 && slot.itemRequirements().isEmpty()) { // Slot should be unlocked by default if (gemData.hasGem(index)) continue; gemData.putGem( new ItemAttributeGemData.GemData.GemSlots( index, - null + null, + true + ) + ); + } else { + if (gemData.hasGem(index)) continue; + gemData.putGem( + new ItemAttributeGemData.GemData.GemSlots( + index, + null, + false ) ); } index++; } - handler.setGemData(gemData); + item.getAttributeHandler().setGemData(gemData); } for (ItemAttribute attribute : ItemAttribute.getPossibleAttributes()) { diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/SkyBlockPlayer.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/SkyBlockPlayer.java index 143649622..17aca8a03 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/SkyBlockPlayer.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/user/SkyBlockPlayer.java @@ -345,6 +345,22 @@ public boolean removeItemFromPlayer(ItemType type, int amount) { return true; } + public boolean removeItemsFromPlayer(Map items) { + for (Map.Entry item : items.entrySet()) { + int amount = item.getValue(); + ItemType type = item.getKey(); + + int inventoryAmount = getAmountInInventory(type); + int sacksAmount = getSackItems().getAmount(type); + + if ((inventoryAmount + sacksAmount) < amount) return false; + } + for (Map.Entry item : items.entrySet()) { + removeItemFromPlayer(item.getKey(), item.getValue()); + } + return true; + } + public boolean isCoop() { return getSkyblockDataHandler().get(SkyBlockDataHandler.Data.IS_COOP, DatapointBoolean.class).getValue(); } From 7bc201ca8d019cbe36154e3dc7b3865a4206ca47 Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Sat, 3 Jan 2026 13:41:40 +0100 Subject: [PATCH 2/2] removed slob --- .../item/attribute/attributes/ItemAttributeGemData.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java b/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java index e89a1b0a3..e59df3b9c 100644 --- a/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java +++ b/commons/src/main/java/net/swofty/commons/skyblock/item/attribute/attributes/ItemAttributeGemData.java @@ -42,11 +42,6 @@ public GemData loadFromString(String string) { filledWith = ItemType.valueOf(gemSplit[1]); } - // Load unlocked state if it exists in the string (for backward compatibility) - if (gemSplit.length > 2) { - unlocked = Boolean.parseBoolean(gemSplit[2]); - } - gemData.putGem(new GemData.GemSlots(index, filledWith, unlocked)); }