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 8fbc4581f..5f338df74 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 @@ -99,10 +99,11 @@ public enum ToggleType { HAS_SPOKEN_TO_JAX(false), HAS_REALLY_SPOKEN_TO_JAX(false), HAS_SPOKEN_TO_ALCHEMIST(false), - HAS_FOUND_LAZY_MINER_PICKAXE(false), PAPER_ICONS(false), LOBBY_SHOW_PLAYERS(true), - AUTO_ACCEPT_QUESTS(false) + AUTO_ACCEPT_QUESTS(false), + RUSTY_PURCHASE_CONFIRMATION(false), + RUSTY_SORT_BY_RARITY(false), ; private final boolean defaultValue; diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/entity/EntityLostPickaxe.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/entity/EntityLostPickaxe.java index 65c8625a1..1e87e83be 100644 --- a/type.goldmine/src/main/java/net/swofty/type/goldmine/entity/EntityLostPickaxe.java +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/entity/EntityLostPickaxe.java @@ -45,23 +45,27 @@ public void spawn() { super.spawn(); InteractionEntity interactionEntity = new InteractionEntity(width, height, (p, event) -> { SkyBlockPlayer player = (SkyBlockPlayer) p; - boolean hasFound = player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_FOUND_LAZY_MINER_PICKAXE); + MissionData data = player.getMissionData(); + + if (!data.isCurrentlyActive(MissionFindLazyMinerPickaxe.class)) return; + + boolean hasFound = player.getMissionData().hasCompleted(MissionFindLazyMinerPickaxe.class); if (hasFound) { player.sendMessage("§cYou have already picked that up!"); return; } - // Set the toggle for backwards compatibility and special case handling - player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_FOUND_LAZY_MINER_PICKAXE, true); player.sendMessage("§aYou have found the Lazy Miner's Pickaxe!"); - // End mission if active (this will start MissionTalkToLazyMiner) - MissionData data = player.getMissionData(); - if (data.isCurrentlyActive(MissionFindLazyMinerPickaxe.class)) { - data.endMission(MissionFindLazyMinerPickaxe.class); - } + data.endMission(MissionFindLazyMinerPickaxe.class); SkyBlockItem pickaxe = new SkyBlockItem(ItemType.IRON_PICKAXE); + pickaxe.getAttributeHandler().addEnchantment( + new SkyBlockEnchantment( + EnchantmentType.EFFICIENCY, + 1 + ) + ); pickaxe.getAttributeHandler().addEnchantment( new SkyBlockEnchantment( EnchantmentType.SMELTING_TOUCH, diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/GUIRusty.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRusty.java similarity index 87% rename from type.goldmine/src/main/java/net/swofty/type/goldmine/gui/GUIRusty.java rename to type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRusty.java index 56a976c15..2a6a7f2a9 100644 --- a/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/GUIRusty.java +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRusty.java @@ -1,4 +1,4 @@ -package net.swofty.type.goldmine.gui; +package net.swofty.type.goldmine.gui.rusty; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.inventory.InventoryType; @@ -23,7 +23,7 @@ public void onOpen(InventoryGUIOpenEvent event) { set(new GUIClickableItem(10) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer player) { - + new GUIRustyWeaponsAndGear().open(player); } @Override @@ -42,13 +42,13 @@ public ItemStack.Builder getItem(HypixelPlayer player) { set(new GUIClickableItem(12) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer player) { - + new GUIRustyPetsAndPetItems().open(player); } @Override public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aPets", Material.PLAYER_HEAD, 1, + return ItemStackCreator.getStackHead( + "§aPets", "4e794274c1bb197ad306540286a7aa952974f5661bccf2b725424f6ed79c7884", 1, "§7Contains pets, and some reobtainable", "§7pet items from all around SkyBlock", "§7", @@ -60,13 +60,13 @@ public ItemStack.Builder getItem(HypixelPlayer player) { set(new GUIClickableItem(14) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer player) { - + new GUIRustyAccessories().open(player); } @Override public ItemStack.Builder getItem(HypixelPlayer player) { - return ItemStackCreator.getStack( - "§aAccessories", Material.PLAYER_HEAD, 1, + return ItemStackCreator.getStackHead( + "§aAccessories", "3ada666715bfd2aa9fbd81daef59b9fe1c96c4fa0d08dbc72eae5633177dbf88", 1, "§7Contains accessories and talismans", "§7from all around SkyBlock.", "§7", @@ -78,7 +78,7 @@ public ItemStack.Builder getItem(HypixelPlayer player) { set(new GUIClickableItem(16) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer player) { - + new GUIRustyMiscellaneous().open(player); } @Override diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyAccessories.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyAccessories.java new file mode 100644 index 000000000..8304b46ac --- /dev/null +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyAccessories.java @@ -0,0 +1,231 @@ +package net.swofty.type.goldmine.gui.rusty; + +import net.minestom.server.component.DataComponents; +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.StringUtility; +import net.swofty.type.generic.data.datapoints.DatapointToggles; +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.gui.inventories.shop.GUIConfirmBuy; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.updater.NonPlayerItemUpdater; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +public class GUIRustyAccessories extends HypixelPaginatedGUI { + public GUIRustyAccessories() { + super(InventoryType.CHEST_6_ROW); + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + e.setCancelled(true); + } + + @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 + public PaginationList fillPaged(HypixelPlayer player, PaginationList paged) { + List items = new ArrayList<>(); + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + + for (MiscellaneousItems miscItem : MiscellaneousItems.values()) { + boolean unlocked = miscItem.hasUnlocked.apply(skyblockPlayer); + items.add(new DisplayItem(miscItem, unlocked)); + } + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY)) { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + + int rarity1 = item1.miscItem.item.getAttributeHandler().getRarity().ordinal(); + int rarity2 = item2.miscItem.item.getAttributeHandler().getRarity().ordinal(); + return Integer.compare(rarity1, rarity2); + }); + } else { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + return Integer.compare(item1.miscItem.ordinal(), item2.miscItem.ordinal()); + }); + } + + paged.addAll(items); + return paged; + } + + @Override + public boolean shouldFilterFromSearch(String query, DisplayItem item) { + return false; + } + + @Override + public void performSearch(HypixelPlayer player, String query, int page, int maxPage) { + border(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE, "")); + set(GUIClickableItem.getGoBackItem(49, new GUIRusty())); + + set(new GUIClickableItem(48) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean purchaseConfirmation = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION, !purchaseConfirmation); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aShop Confirmations", + player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? Material.LIME_DYE : Material.LIGHT_GRAY_DYE, + 1, "§7Confirm when purchasing item worth", "§7at least a million coins.", "", + "§eClick to " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? "disable" : "enable") + "!"); + } + }); + + set(new GUIItem(50) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aThe Janitor", Material.REDSTONE_TORCH, 1, + "§7Rusty watches over the neatness of the §6Gold", + "§6Mines§7, but really he watches over the whole of", + "§aSkyBlock§7.", + "", + "§7If you misplace a §6one-time reward §7from a", + "§7quest, it may be offered here!"); + } + }); + + set(new GUIClickableItem(51) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean sortByRarity = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY, !sortByRarity); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aSort by Rarity", + Material.ENDER_EYE, 1, + "§7Enabled: " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY) ? "§aYES" : "§cNO"), + "", + "§eClick to toggle!"); + } + }); + + if (page > 1) { + set(createNavigationButton(this, 45, query, page, false)); + } + if (page < maxPage) { + set(createNavigationButton(this, 53, query, page, true)); + } + } + + @Override + protected String getTitle(HypixelPlayer player, String query, int page, PaginationList paged) { + return "Rusty ➜ Accessories"; + } + + @Override + public GUIClickableItem createItemFor(DisplayItem displayItem, int slot, HypixelPlayer player) { + MiscellaneousItems miscItem = displayItem.miscItem; + boolean unlocked = displayItem.unlocked; + + if (!unlocked) { + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStackHead("§c???", + "5359d91277242fc01c309accb87b533f1929be176ecba2cde63bf635e05e699b", + 1); + } + }; + } + + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + SkyBlockItem item = miscItem.item; + int price = miscItem.price; + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) && price >= 1_000_000) { + new GUIConfirmBuy(item, price).open(player); + return; + } + + if (skyblockPlayer.getCoins() >= price) { + skyblockPlayer.addAndUpdateItem(item); + skyblockPlayer.removeCoins(price); + + skyblockPlayer.sendMessage("§aYou bought " + item.getDisplayName() + " §afor §6" + price + " Coins§a!"); + } else { + skyblockPlayer.sendMessage("§4You don't have enough coins!"); + } + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + ItemStack.Builder itemStack = new NonPlayerItemUpdater(miscItem.item).getUpdatedItem(); + List lore = new ArrayList<>(itemStack.build().get(DataComponents.LORE).stream().map(StringUtility::getTextFromComponent).toList()); + + lore.add(""); + lore.add("§7Cost"); + lore.add("§6" + StringUtility.commaify(miscItem.price) + " Coins"); + lore.add(""); + lore.add("§eClick to trade!"); + + return ItemStackCreator.updateLore(itemStack, lore); + } + }; + } + + public record DisplayItem(MiscellaneousItems miscItem, boolean unlocked) { + } + + private enum MiscellaneousItems { + + ; + + private final SkyBlockItem item; + private final int price; + private final Function hasUnlocked; + + MiscellaneousItems(SkyBlockItem item, int price, Function hasUnlocked) { + this.item = item; + this.price = price; + this.hasUnlocked = hasUnlocked; + } + } +} diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyMiscellaneous.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyMiscellaneous.java new file mode 100644 index 000000000..a486bf13c --- /dev/null +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyMiscellaneous.java @@ -0,0 +1,252 @@ +package net.swofty.type.goldmine.gui.rusty; + +import net.minestom.server.component.DataComponents; +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.StringUtility; +import net.swofty.commons.skyblock.item.ItemType; +import net.swofty.type.generic.data.datapoints.DatapointToggles; +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.enchantment.EnchantmentType; +import net.swofty.type.skyblockgeneric.enchantment.SkyBlockEnchantment; +import net.swofty.type.skyblockgeneric.gui.inventories.shop.GUIConfirmBuy; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.updater.NonPlayerItemUpdater; +import net.swofty.type.skyblockgeneric.mission.missions.lazyminer.MissionFindLazyMinerPickaxe; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +public class GUIRustyMiscellaneous extends HypixelPaginatedGUI { + public GUIRustyMiscellaneous() { + super(InventoryType.CHEST_6_ROW); + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + e.setCancelled(true); + } + + @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 + public PaginationList fillPaged(HypixelPlayer player, PaginationList paged) { + List items = new ArrayList<>(); + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + + for (MiscellaneousItems miscItem : MiscellaneousItems.values()) { + boolean unlocked = miscItem.hasUnlocked.apply(skyblockPlayer); + items.add(new DisplayItem(miscItem, unlocked)); + } + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY)) { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + + int rarity1 = item1.miscItem.item.getAttributeHandler().getRarity().ordinal(); + int rarity2 = item2.miscItem.item.getAttributeHandler().getRarity().ordinal(); + return Integer.compare(rarity1, rarity2); + }); + } else { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + return Integer.compare(item1.miscItem.ordinal(), item2.miscItem.ordinal()); + }); + } + + paged.addAll(items); + return paged; + } + + @Override + public boolean shouldFilterFromSearch(String query, DisplayItem item) { + return false; + } + + @Override + public void performSearch(HypixelPlayer player, String query, int page, int maxPage) { + border(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE, "")); + set(GUIClickableItem.getGoBackItem(49, new GUIRusty())); + + set(new GUIClickableItem(48) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean purchaseConfirmation = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION, !purchaseConfirmation); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aShop Confirmations", + player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? Material.LIME_DYE : Material.LIGHT_GRAY_DYE, + 1, "§7Confirm when purchasing item worth", "§7at least a million coins.", "", + "§eClick to " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? "disable" : "enable") + "!"); + } + }); + + set(new GUIItem(50) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aThe Janitor", Material.REDSTONE_TORCH, 1, + "§7Rusty watches over the neatness of the §6Gold", + "§6Mines§7, but really he watches over the whole of", + "§aSkyBlock§7.", + "", + "§7If you misplace a §6one-time reward §7from a", + "§7quest, it may be offered here!"); + } + }); + + set(new GUIClickableItem(51) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean sortByRarity = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY, !sortByRarity); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aSort by Rarity", + Material.ENDER_EYE, 1, + "§7Enabled: " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY) ? "§aYES" : "§cNO"), + "", + "§eClick to toggle!"); + } + }); + + if (page > 1) { + set(createNavigationButton(this, 45, query, page, false)); + } + if (page < maxPage) { + set(createNavigationButton(this, 53, query, page, true)); + } + } + + @Override + public String getTitle(HypixelPlayer player, String query, int page, PaginationList paged) { + return "Rusty ➜ Miscellaneous"; + } + + @Override + public GUIClickableItem createItemFor(DisplayItem displayItem, int slot, HypixelPlayer player) { + MiscellaneousItems miscItem = displayItem.miscItem; + boolean unlocked = displayItem.unlocked; + + if (!unlocked) { + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStackHead("§c???", + "5359d91277242fc01c309accb87b533f1929be176ecba2cde63bf635e05e699b", + 1); + } + }; + } + + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + SkyBlockItem item = miscItem.item; + int price = miscItem.price; + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) && price >= 1_000_000) { + new GUIConfirmBuy(item, price).open(player); + return; + } + + if (skyblockPlayer.getCoins() >= price) { + skyblockPlayer.addAndUpdateItem(item); + skyblockPlayer.removeCoins(price); + + skyblockPlayer.sendMessage("§aYou bought " + item.getDisplayName() + " §afor §6" + price + " Coins§a!"); + } else { + skyblockPlayer.sendMessage("§4You don't have enough coins!"); + } + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + ItemStack.Builder itemStack = new NonPlayerItemUpdater(miscItem.item).getUpdatedItem(); + List lore = new ArrayList<>(itemStack.build().get(DataComponents.LORE).stream().map(StringUtility::getTextFromComponent).toList()); + + lore.add(""); + lore.add("§7Cost"); + lore.add("§6" + StringUtility.commaify(miscItem.price) + " Coins"); + lore.add(""); + lore.add("§eClick to trade!"); + + return ItemStackCreator.updateLore(itemStack, lore); + } + }; + } + + public record DisplayItem(MiscellaneousItems miscItem, boolean unlocked) { + } + + private enum MiscellaneousItems { + IRON_PICKAXE(getRustyPickaxe(), 200, (player) -> player.getMissionData().hasCompleted(MissionFindLazyMinerPickaxe.class)), + ; + + private final SkyBlockItem item; + private final int price; + private final Function hasUnlocked; + + MiscellaneousItems(SkyBlockItem item, int price, Function hasUnlocked) { + this.item = item; + this.price = price; + this.hasUnlocked = hasUnlocked; + } + } + + private static SkyBlockItem getRustyPickaxe() { + SkyBlockItem pickaxe = new SkyBlockItem(ItemType.IRON_PICKAXE); + pickaxe.getAttributeHandler().addEnchantment( + new SkyBlockEnchantment( + EnchantmentType.EFFICIENCY, + 1 + ) + ); + pickaxe.getAttributeHandler().addEnchantment( + new SkyBlockEnchantment( + EnchantmentType.SMELTING_TOUCH, + 1 + ) + ); + return pickaxe; + } +} \ No newline at end of file diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyPetsAndPetItems.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyPetsAndPetItems.java new file mode 100644 index 000000000..66e3e7196 --- /dev/null +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyPetsAndPetItems.java @@ -0,0 +1,231 @@ +package net.swofty.type.goldmine.gui.rusty; + +import net.minestom.server.component.DataComponents; +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.StringUtility; +import net.swofty.type.generic.data.datapoints.DatapointToggles; +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.gui.inventories.shop.GUIConfirmBuy; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.updater.NonPlayerItemUpdater; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +public class GUIRustyPetsAndPetItems extends HypixelPaginatedGUI { + public GUIRustyPetsAndPetItems() { + super(InventoryType.CHEST_6_ROW); + } + + @Override + protected String getTitle(HypixelPlayer player, String query, int page, PaginationList paged) { + return "Rusty ➜ Pets & Pet Items"; + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + e.setCancelled(true); + } + + @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 + public PaginationList fillPaged(HypixelPlayer player, PaginationList paged) { + List items = new ArrayList<>(); + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + + for (MiscellaneousItems miscItem : MiscellaneousItems.values()) { + boolean unlocked = miscItem.hasUnlocked.apply(skyblockPlayer); + items.add(new DisplayItem(miscItem, unlocked)); + } + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY)) { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + + int rarity1 = item1.miscItem.item.getAttributeHandler().getRarity().ordinal(); + int rarity2 = item2.miscItem.item.getAttributeHandler().getRarity().ordinal(); + return Integer.compare(rarity1, rarity2); + }); + } else { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + return Integer.compare(item1.miscItem.ordinal(), item2.miscItem.ordinal()); + }); + } + + paged.addAll(items); + return paged; + } + + @Override + public boolean shouldFilterFromSearch(String query, DisplayItem item) { + return false; + } + + @Override + public void performSearch(HypixelPlayer player, String query, int page, int maxPage) { + border(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE, "")); + set(GUIClickableItem.getGoBackItem(49, new GUIRusty())); + + set(new GUIClickableItem(48) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean purchaseConfirmation = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION, !purchaseConfirmation); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aShop Confirmations", + player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? Material.LIME_DYE : Material.LIGHT_GRAY_DYE, + 1, "§7Confirm when purchasing item worth", "§7at least a million coins.", "", + "§eClick to " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? "disable" : "enable") + "!"); + } + }); + + set(new GUIItem(50) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aThe Janitor", Material.REDSTONE_TORCH, 1, + "§7Rusty watches over the neatness of the §6Gold", + "§6Mines§7, but really he watches over the whole of", + "§aSkyBlock§7.", + "", + "§7If you misplace a §6one-time reward §7from a", + "§7quest, it may be offered here!"); + } + }); + + set(new GUIClickableItem(51) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean sortByRarity = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY, !sortByRarity); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aSort by Rarity", + Material.ENDER_EYE, 1, + "§7Enabled: " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY) ? "§aYES" : "§cNO"), + "", + "§eClick to toggle!"); + } + }); + + if (page > 1) { + set(createNavigationButton(this, 45, query, page, false)); + } + if (page < maxPage) { + set(createNavigationButton(this, 53, query, page, true)); + } + } + + @Override + public GUIClickableItem createItemFor(DisplayItem displayItem, int slot, HypixelPlayer player) { + MiscellaneousItems miscItem = displayItem.miscItem; + boolean unlocked = displayItem.unlocked; + + if (!unlocked) { + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStackHead("§c???", + "5359d91277242fc01c309accb87b533f1929be176ecba2cde63bf635e05e699b", + 1); + } + }; + } + + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + SkyBlockItem item = miscItem.item; + int price = miscItem.price; + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) && price >= 1_000_000) { + new GUIConfirmBuy(item, price).open(player); + return; + } + + if (skyblockPlayer.getCoins() >= price) { + skyblockPlayer.addAndUpdateItem(item); + skyblockPlayer.removeCoins(price); + + skyblockPlayer.sendMessage("§aYou bought " + item.getDisplayName() + " §afor §6" + price + " Coins§a!"); + } else { + skyblockPlayer.sendMessage("§4You don't have enough coins!"); + } + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + ItemStack.Builder itemStack = new NonPlayerItemUpdater(miscItem.item).getUpdatedItem(); + List lore = new ArrayList<>(itemStack.build().get(DataComponents.LORE).stream().map(StringUtility::getTextFromComponent).toList()); + + lore.add(""); + lore.add("§7Cost"); + lore.add("§6" + StringUtility.commaify(miscItem.price) + " Coins"); + lore.add(""); + lore.add("§eClick to trade!"); + + return ItemStackCreator.updateLore(itemStack, lore); + } + }; + } + + public record DisplayItem(MiscellaneousItems miscItem, boolean unlocked) { + } + + private enum MiscellaneousItems { + + ; + + private final SkyBlockItem item; + private final int price; + private final Function hasUnlocked; + + MiscellaneousItems(SkyBlockItem item, int price, Function hasUnlocked) { + this.item = item; + this.price = price; + this.hasUnlocked = hasUnlocked; + } + } +} diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyWeaponsAndGear.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyWeaponsAndGear.java new file mode 100644 index 000000000..4d7303928 --- /dev/null +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/gui/rusty/GUIRustyWeaponsAndGear.java @@ -0,0 +1,231 @@ +package net.swofty.type.goldmine.gui.rusty; + +import net.minestom.server.component.DataComponents; +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.StringUtility; +import net.swofty.type.generic.data.datapoints.DatapointToggles; +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.gui.inventories.shop.GUIConfirmBuy; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.updater.NonPlayerItemUpdater; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; + +public class GUIRustyWeaponsAndGear extends HypixelPaginatedGUI { + public GUIRustyWeaponsAndGear() { + super(InventoryType.CHEST_6_ROW); + } + + @Override + protected String getTitle(HypixelPlayer player, String query, int page, PaginationList paged) { + return "Rusty ➜ Weapons & Gear"; + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + e.setCancelled(true); + } + + @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 + public PaginationList fillPaged(HypixelPlayer player, PaginationList paged) { + List items = new ArrayList<>(); + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + + for (MiscellaneousItems miscItem : MiscellaneousItems.values()) { + boolean unlocked = miscItem.hasUnlocked.apply(skyblockPlayer); + items.add(new DisplayItem(miscItem, unlocked)); + } + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY)) { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + + int rarity1 = item1.miscItem.item.getAttributeHandler().getRarity().ordinal(); + int rarity2 = item2.miscItem.item.getAttributeHandler().getRarity().ordinal(); + return Integer.compare(rarity1, rarity2); + }); + } else { + items.sort((item1, item2) -> { + if (item1.unlocked && !item2.unlocked) return -1; + if (!item1.unlocked && item2.unlocked) return 1; + return Integer.compare(item1.miscItem.ordinal(), item2.miscItem.ordinal()); + }); + } + + paged.addAll(items); + return paged; + } + + @Override + public boolean shouldFilterFromSearch(String query, DisplayItem item) { + return false; + } + + @Override + public void performSearch(HypixelPlayer player, String query, int page, int maxPage) { + border(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE, "")); + set(GUIClickableItem.getGoBackItem(49, new GUIRusty())); + + set(new GUIClickableItem(48) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean purchaseConfirmation = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION, !purchaseConfirmation); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aShop Confirmations", + player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? Material.LIME_DYE : Material.LIGHT_GRAY_DYE, + 1, "§7Confirm when purchasing item worth", "§7at least a million coins.", "", + "§eClick to " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) ? "disable" : "enable") + "!"); + } + }); + + set(new GUIItem(50) { + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aThe Janitor", Material.REDSTONE_TORCH, 1, + "§7Rusty watches over the neatness of the §6Gold", + "§6Mines§7, but really he watches over the whole of", + "§aSkyBlock§7.", + "", + "§7If you misplace a §6one-time reward §7from a", + "§7quest, it may be offered here!"); + } + }); + + set(new GUIClickableItem(51) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + boolean sortByRarity = player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY); + player.getToggles().set(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY, !sortByRarity); + + GUIRustyMiscellaneous newGui = new GUIRustyMiscellaneous(); + newGui.open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§aSort by Rarity", + Material.ENDER_EYE, 1, + "§7Enabled: " + (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_SORT_BY_RARITY) ? "§aYES" : "§cNO"), + "", + "§eClick to toggle!"); + } + }); + + if (page > 1) { + set(createNavigationButton(this, 45, query, page, false)); + } + if (page < maxPage) { + set(createNavigationButton(this, 53, query, page, true)); + } + } + + @Override + public GUIClickableItem createItemFor(DisplayItem displayItem, int slot, HypixelPlayer player) { + MiscellaneousItems miscItem = displayItem.miscItem; + boolean unlocked = displayItem.unlocked; + + if (!unlocked) { + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStackHead("§c???", + "5359d91277242fc01c309accb87b533f1929be176ecba2cde63bf635e05e699b", + 1); + } + }; + } + + return new GUIClickableItem(slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + SkyBlockPlayer skyblockPlayer = (SkyBlockPlayer) player; + SkyBlockItem item = miscItem.item; + int price = miscItem.price; + + if (player.getToggles().get(DatapointToggles.Toggles.ToggleType.RUSTY_PURCHASE_CONFIRMATION) && price >= 1_000_000) { + new GUIConfirmBuy(item, price).open(player); + return; + } + + if (skyblockPlayer.getCoins() >= price) { + skyblockPlayer.addAndUpdateItem(item); + skyblockPlayer.removeCoins(price); + + skyblockPlayer.sendMessage("§aYou bought " + item.getDisplayName() + " §afor §6" + price + " Coins§a!"); + } else { + skyblockPlayer.sendMessage("§4You don't have enough coins!"); + } + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + ItemStack.Builder itemStack = new NonPlayerItemUpdater(miscItem.item).getUpdatedItem(); + List lore = new ArrayList<>(itemStack.build().get(DataComponents.LORE).stream().map(StringUtility::getTextFromComponent).toList()); + + lore.add(""); + lore.add("§7Cost"); + lore.add("§6" + StringUtility.commaify(miscItem.price) + " Coins"); + lore.add(""); + lore.add("§eClick to trade!"); + + return ItemStackCreator.updateLore(itemStack, lore); + } + }; + } + + public record DisplayItem(MiscellaneousItems miscItem, boolean unlocked) { + } + + private enum MiscellaneousItems { + + ; + + private final SkyBlockItem item; + private final int price; + private final Function hasUnlocked; + + MiscellaneousItems(SkyBlockItem item, int price, Function hasUnlocked) { + this.item = item; + this.price = price; + this.hasUnlocked = hasUnlocked; + } + } +} diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/NPCLazyMiner.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/NPCLazyMiner.java index e9fc94b5c..0eb8742e6 100644 --- a/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/NPCLazyMiner.java +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/NPCLazyMiner.java @@ -76,7 +76,7 @@ public void onClick(NPCInteractEvent event) { } // First interaction - check special case where player already found pickaxe - boolean hasFoundPickaxe = player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_FOUND_LAZY_MINER_PICKAXE); + boolean hasFoundPickaxe = player.getMissionData().hasCompleted(MissionFindLazyMinerPickaxe.class); if (hasFoundPickaxe) { // Player found the pickaxe before talking to Lazy Miner - skip to talk mission setDialogue(player, "found-pick-intro").thenRun(() -> { diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/villagers/VillagerBlacksmith.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/villagers/VillagerBlacksmith.java similarity index 95% rename from type.goldmine/src/main/java/net/swofty/type/goldmine/villagers/VillagerBlacksmith.java rename to type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/villagers/VillagerBlacksmith.java index 59a978c87..d645bef49 100644 --- a/type.goldmine/src/main/java/net/swofty/type/goldmine/villagers/VillagerBlacksmith.java +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/villagers/VillagerBlacksmith.java @@ -1,4 +1,4 @@ -package net.swofty.type.goldmine.villagers; +package net.swofty.type.goldmine.npcs.villagers; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.VillagerProfession; diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/villagers/VillagerRusty.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/villagers/VillagerRusty.java similarity index 93% rename from type.goldmine/src/main/java/net/swofty/type/goldmine/villagers/VillagerRusty.java rename to type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/villagers/VillagerRusty.java index e912a5005..228de63fa 100644 --- a/type.goldmine/src/main/java/net/swofty/type/goldmine/villagers/VillagerRusty.java +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/npcs/villagers/VillagerRusty.java @@ -1,4 +1,4 @@ -package net.swofty.type.goldmine.villagers; +package net.swofty.type.goldmine.npcs.villagers; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.VillagerProfession; @@ -7,9 +7,10 @@ import net.swofty.type.generic.entity.npc.HypixelNPC; import net.swofty.type.generic.entity.npc.configuration.VillagerConfiguration; import net.swofty.type.generic.user.HypixelPlayer; -import net.swofty.type.goldmine.gui.GUIRusty; +import net.swofty.type.goldmine.gui.rusty.GUIRusty; import net.swofty.type.skyblockgeneric.item.SkyBlockItem; import net.swofty.type.skyblockgeneric.item.components.AbiphoneComponent; +import net.swofty.type.skyblockgeneric.mission.missions.lazyminer.MissionFindLazyMinerPickaxe; import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; import java.util.stream.Stream; @@ -61,7 +62,7 @@ public void onClick(NPCInteractEvent event) { } boolean hasSpokenAboutPickaxe = player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_RUSTY_ABOUT_PICKAXE); - boolean hasFoundPickaxe = player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_FOUND_LAZY_MINER_PICKAXE); + boolean hasFoundPickaxe = player.getMissionData().hasCompleted(MissionFindLazyMinerPickaxe.class); if (!hasSpokenAboutPickaxe && hasFoundPickaxe) { setDialogue(player, "found-pickaxe").thenRun(() -> { player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_RUSTY_ABOUT_PICKAXE, true); diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/shop/GUIConfirmBuy.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/shop/GUIConfirmBuy.java new file mode 100644 index 000000000..4b7c342c7 --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/shop/GUIConfirmBuy.java @@ -0,0 +1,81 @@ +package net.swofty.type.skyblockgeneric.gui.inventories.shop; + +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.StringUtility; +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.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; + +public class GUIConfirmBuy extends HypixelInventoryGUI { + private final SkyBlockItem item; + private final int price; + + public GUIConfirmBuy(SkyBlockItem item, int price) { + super("Confirm", InventoryType.CHEST_3_ROW); + this.item = item; + this.price = price; + } + + @Override + public void onOpen(InventoryGUIOpenEvent e) { + fill(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE, " ")); + + set(new GUIClickableItem(12) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + SkyBlockPlayer skyBlockPlayer = (SkyBlockPlayer) player; + + if (skyBlockPlayer.getCoins() >= price) { + skyBlockPlayer.addAndUpdateItem(item); + skyBlockPlayer.removeCoins(price); + + skyBlockPlayer.sendMessage("§aYou bought " + item.getDisplayName() + " §afor §6" + price + " Coins§a!"); + } else { + skyBlockPlayer.sendMessage("§4You don't have enough coins!"); + } + skyBlockPlayer.closeInventory(); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + ArrayList lore = new ArrayList<>(); + lore.add("§7Buying: " + item.getDisplayItem()); + lore.add("§7Cost: §6" + StringUtility.commaify(price) + " Coins"); + + return ItemStackCreator.getStack("§aConfirm", Material.LIME_TERRACOTTA, 1, lore); + } + }); + + set(new GUIClickableItem(16) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer player) { + player.closeInventory(); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer player) { + return ItemStackCreator.getStack("§4Cancel", Material.RED_TERRACOTTA, 1); + } + }); + + updateItemStacks(e.inventory(), getPlayer()); + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + + } +}