diff --git a/type.hub/src/main/java/net/swofty/type/hub/gui/GUISeymour.java b/type.hub/src/main/java/net/swofty/type/hub/gui/GUISeymour.java index 7f773f85a..c5200d17a 100644 --- a/type.hub/src/main/java/net/swofty/type/hub/gui/GUISeymour.java +++ b/type.hub/src/main/java/net/swofty/type/hub/gui/GUISeymour.java @@ -8,13 +8,59 @@ import net.minestom.server.item.Material; import net.swofty.commons.StringUtility; import net.swofty.commons.skyblock.item.ItemType; +import net.swofty.commons.skyblock.statistics.ItemStatistic; import net.swofty.type.generic.gui.inventory.ItemStackCreator; import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI; import net.swofty.type.generic.gui.inventory.item.GUIClickableItem; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; import net.swofty.type.generic.user.HypixelPlayer; +import java.util.List; + public class GUISeymour extends HypixelInventoryGUI { + private final List cheapTuxedoSet = List.of( + new SkyBlockItem(ItemType.CHEAP_TUXEDO_CHESTPLATE), + new SkyBlockItem(ItemType.CHEAP_TUXEDO_LEGGINGS), + new SkyBlockItem(ItemType.CHEAP_TUXEDO_BOOTS) + ); + + private final List fancyTuxedoSet = List.of( + new SkyBlockItem(ItemType.FANCY_TUXEDO_CHESTPLATE), + new SkyBlockItem(ItemType.FANCY_TUXEDO_LEGGINGS), + new SkyBlockItem(ItemType.FANCY_TUXEDO_BOOTS) + ); + + private final List elegantTuxedoSet = List.of( + new SkyBlockItem(ItemType.ELEGANT_TUXEDO_CHESTPLATE), + new SkyBlockItem(ItemType.ELEGANT_TUXEDO_LEGGINGS), + new SkyBlockItem(ItemType.ELEGANT_TUXEDO_BOOTS) + ); + + private final double cheapTuxedoPrice = 3_000_000; + private final double fancyTuxedoPrice = 20_000_000; + private final double elegantTuxedoPrice = 74_999_999; + + private final double cheapTuxedoCritDamage = cheapTuxedoSet.stream() + .mapToDouble(item -> item.getAttributeHandler().getStatistics().getOverall(ItemStatistic.CRIT_DAMAGE)) + .sum(); + private final double fancyTuxedoCritDamage = cheapTuxedoSet.stream() + .mapToDouble(item -> item.getAttributeHandler().getStatistics().getOverall(ItemStatistic.CRIT_DAMAGE)) + .sum(); + private final double elegantTuxedoCritDamage = cheapTuxedoSet.stream() + .mapToDouble(item -> item.getAttributeHandler().getStatistics().getOverall(ItemStatistic.CRIT_DAMAGE)) + .sum(); + + private final double cheapTuxedoIntelligence = cheapTuxedoSet.stream() + .mapToDouble(item -> item.getAttributeHandler().getStatistics().getOverall(ItemStatistic.INTELLIGENCE)) + .sum(); + private final double fancyTuxedoIntelligence = cheapTuxedoSet.stream() + .mapToDouble(item -> item.getAttributeHandler().getStatistics().getOverall(ItemStatistic.INTELLIGENCE)) + .sum(); + private final double elegantTuxedoIntelligence = cheapTuxedoSet.stream() + .mapToDouble(item -> item.getAttributeHandler().getStatistics().getOverall(ItemStatistic.INTELLIGENCE)) + .sum(); + public GUISeymour() { super("Seymour's Fancy Suits", InventoryType.CHEST_4_ROW); } @@ -23,21 +69,16 @@ public void onOpen(InventoryGUIOpenEvent e) { fill(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE)); set(GUIClickableItem.getCloseItem(31)); - double cheapTuxedoPrice = 3000000; - double fancyTuxedoPrice = 20000000; - double elegantTuxedoPrice = 74999999; - set(new GUIClickableItem(11) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer p) { SkyBlockPlayer player = (SkyBlockPlayer) p; double coins = player.getCoins(); if (coins < cheapTuxedoPrice) { + player.sendMessage("§cYou don't have enough coins!"); return; } - player.addAndUpdateItem(ItemType.CHEAP_TUXEDO_CHESTPLATE); - player.addAndUpdateItem(ItemType.CHEAP_TUXEDO_BOOTS); - player.addAndUpdateItem(ItemType.CHEAP_TUXEDO_LEGGINGS); + cheapTuxedoSet.forEach(player::addAndUpdateItem); player.playSuccessSound(); player.removeCoins(cheapTuxedoPrice); } @@ -48,8 +89,8 @@ public ItemStack.Builder getItem(HypixelPlayer p) { ItemStack.Builder builder = ItemStackCreator.getStack("§5Cheap Tuxedo", Material.LEATHER_CHESTPLATE, 1, "", "§8Complete suit", - "§7Crit Damage: §c+100%", - "§7Intelligence: §a+100", + "§7Crit Damage: §c+" + (int) cheapTuxedoCritDamage + "%", + "§7Intelligence: §a+" + (int) cheapTuxedoIntelligence, "", "§6Full Set Bonus: Dashing §7(0/3)", "§7Max Health set to §c75♥§7.", @@ -72,11 +113,10 @@ public void run(InventoryPreClickEvent e, HypixelPlayer p) { SkyBlockPlayer player = (SkyBlockPlayer) p; double coins = player.getCoins(); if (coins < fancyTuxedoPrice) { + player.sendMessage("§cYou don't have enough coins!"); return; } - player.addAndUpdateItem(ItemType.FANCY_TUXEDO_CHESTPLATE); - player.addAndUpdateItem(ItemType.FANCY_TUXEDO_BOOTS); - player.addAndUpdateItem(ItemType.FANCY_TUXEDO_LEGGINGS); + fancyTuxedoSet.forEach(player::addAndUpdateItem); player.playSuccessSound(); player.removeCoins(fancyTuxedoPrice); } @@ -87,8 +127,8 @@ public ItemStack.Builder getItem(HypixelPlayer p) { ItemStack.Builder builder = ItemStackCreator.getStack("§6Fancy Tuxedo", Material.LEATHER_CHESTPLATE, 1, "", "§8Complete suit", - "§7Crit Damage: §c+150%", - "§7Intelligence: §a+300", + "§7Crit Damage: §c+" + (int) fancyTuxedoCritDamage + "%", + "§7Intelligence: §a+" + (int) fancyTuxedoIntelligence, "", "§6Full Set Bonus: Dashing §7(0/3)", "§7Max Health set to §c150♥§7.", @@ -112,11 +152,10 @@ public void run(InventoryPreClickEvent e, HypixelPlayer p) { SkyBlockPlayer player = (SkyBlockPlayer) p; double coins = player.getCoins(); if (coins < elegantTuxedoPrice) { + player.sendMessage("§cYou don't have enough coins!"); return; } - player.addAndUpdateItem(ItemType.ELEGANT_TUXEDO_CHESTPLATE); - player.addAndUpdateItem(ItemType.ELEGANT_TUXEDO_BOOTS); - player.addAndUpdateItem(ItemType.ELEGANT_TUXEDO_LEGGINGS); + elegantTuxedoSet.forEach(player::addAndUpdateItem); player.playSuccessSound(); player.removeCoins(elegantTuxedoPrice); } @@ -127,8 +166,8 @@ public ItemStack.Builder getItem(HypixelPlayer p) { ItemStack.Builder builder = ItemStackCreator.getStack("§6Elegant Tuxedo", Material.LEATHER_CHESTPLATE, 1, "", "§8Complete suit", - "§7Crit Damage: §c+200%", - "§7Intelligence: §a+500", + "§7Crit Damage: §c+" + (int) elegantTuxedoCritDamage + "%", + "§7Intelligence: §a+" + (int) elegantTuxedoIntelligence, "", "§6Full Set Bonus: Dashing §7(0/3)", "§7Max Health set to §c1250♥§7.", diff --git a/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverCool.java b/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverCool.java index 9f71bcfa2..5233029ef 100644 --- a/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverCool.java +++ b/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverCool.java @@ -22,13 +22,13 @@ public void onOpen(InventoryGUIOpenEvent e) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer p) { SkyBlockPlayer player = (SkyBlockPlayer) p; - new GUIShopWoolWeaverCool().open(player); + new GUIShopWoolWeaverVibrant().open(player); } @Override public ItemStack.Builder getItem(HypixelPlayer p) { SkyBlockPlayer player = (SkyBlockPlayer) p; - return ItemStackCreator.createNamedItemStack(Material.ARROW, "§a->"); + return ItemStackCreator.getStack("§aPrevious Page", Material.ARROW, 1, "§ePage 1"); } }); } diff --git a/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverVibrant.java b/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverVibrant.java index ac138434d..2d9bf8d66 100644 --- a/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverVibrant.java +++ b/type.hub/src/main/java/net/swofty/type/hub/gui/GUIShopWoolWeaverVibrant.java @@ -21,14 +21,14 @@ public void onOpen(InventoryGUIOpenEvent e) { set(new GUIClickableItem(53) { @Override public void run(InventoryPreClickEvent e, HypixelPlayer p) { - SkyBlockPlayer player = (SkyBlockPlayer) p; + SkyBlockPlayer player = (SkyBlockPlayer) p; new GUIShopWoolWeaverCool().open(player); } @Override public ItemStack.Builder getItem(HypixelPlayer p) { - SkyBlockPlayer player = (SkyBlockPlayer) p; - return ItemStackCreator.createNamedItemStack(Material.ARROW, "§a->"); + SkyBlockPlayer player = (SkyBlockPlayer) p; + return ItemStackCreator.getStack("§aNext Page", Material.ARROW, 1, "§ePage 2"); } }); } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/SkyBlockDataHandler.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/SkyBlockDataHandler.java index 193be5e09..f969f681a 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/SkyBlockDataHandler.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/SkyBlockDataHandler.java @@ -438,7 +438,11 @@ DatapointPresentYear.class, new DatapointPresentYear("latest_year_pickup_present DatapointKat.class, new DatapointKat("kat")), STASH("stash", false, false, false, - DatapointStash.class, new DatapointStash("stash")); + DatapointStash.class, new DatapointStash("stash")), + + COLLECTED_MOB_TYPE_REWARDS("collected_mob_type_rewards", false, false, false, + DatapointCollectedMobTypeRewards.class, new DatapointCollectedMobTypeRewards("collected_mob_type_rewards")), + ; @Getter private final String key; @Getter private final Boolean isProfilePersistent; diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/datapoints/DatapointCollectedMobTypeRewards.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/datapoints/DatapointCollectedMobTypeRewards.java new file mode 100644 index 000000000..4fef21930 --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/datapoints/DatapointCollectedMobTypeRewards.java @@ -0,0 +1,64 @@ +package net.swofty.type.skyblockgeneric.data.datapoints; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import net.swofty.commons.protocol.Serializer; +import net.swofty.type.skyblockgeneric.data.SkyBlockDatapoint; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class DatapointCollectedMobTypeRewards extends SkyBlockDatapoint { + + public DatapointCollectedMobTypeRewards(String key, PlayerCollectedMobTypeRewards value) { + super(key, value, new Serializer<>() { + @Override + public String serialize(PlayerCollectedMobTypeRewards value) { + JSONObject jsonObject = new JSONObject(value.collectedMobTypes); + return jsonObject.toString(); + } + + @Override + public PlayerCollectedMobTypeRewards deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + List collectedMobTypes = new ArrayList<>(); + + jsonObject.getJSONArray("values").forEach((value) -> { + if (value instanceof String) + collectedMobTypes.add(value.toString()); + }); + + return new PlayerCollectedMobTypeRewards(collectedMobTypes); + } + + @Override + public PlayerCollectedMobTypeRewards clone(PlayerCollectedMobTypeRewards value) { + return new PlayerCollectedMobTypeRewards(value.collectedMobTypes == null ? new ArrayList<>() : new ArrayList<>(value.collectedMobTypes)); + } + }); + } + + public DatapointCollectedMobTypeRewards(String key) { + this(key, new PlayerCollectedMobTypeRewards()); + } + + @NoArgsConstructor + @Getter + public static class PlayerCollectedMobTypeRewards { + private List collectedMobTypes = new ArrayList<>(); + + public PlayerCollectedMobTypeRewards(List collectedMobTypes) { + this.collectedMobTypes = collectedMobTypes; + } + + public boolean hasClaimed(String mobType) { + return collectedMobTypes.contains(mobType); + } + + public void claim(String mobType) { + if (collectedMobTypes.contains(mobType)) return; + collectedMobTypes.add(mobType); + } + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/SkyBlockLevelCause.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/SkyBlockLevelCause.java index 5c3705d52..31134144a 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/SkyBlockLevelCause.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/SkyBlockLevelCause.java @@ -4,6 +4,7 @@ import net.swofty.commons.skyblock.item.ItemType; import net.swofty.type.skyblockgeneric.collection.CollectionCategories; import net.swofty.type.skyblockgeneric.collection.CollectionCategory; +import net.swofty.type.skyblockgeneric.entity.mob.MobType; import net.swofty.type.skyblockgeneric.item.SkyBlockItem; import net.swofty.type.skyblockgeneric.item.components.AccessoryComponent; import net.swofty.type.skyblockgeneric.levels.abstr.SkyBlockLevelCauseAbstr; @@ -60,6 +61,11 @@ public static void initializeCauses() { CAUSES.put("fairy-soul-exchange-" + i, new FairySoulExchangeLevelCause(i)); } + // Register all collected mob type rewards + for (MobType mobType : MobType.values()) { + CAUSES.put("mob-type-" + mobType.name(), new CollectedMobTypesCause(mobType.name())); + } + // Register all Mission rewards for (String missionID : MissionData.getAllMissionIDs()) { CAUSES.put("mission-" + missionID, new MissionLevelCause(missionID)); diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/causes/CollectedMobTypesCause.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/causes/CollectedMobTypesCause.java new file mode 100644 index 000000000..a31887530 --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/levels/causes/CollectedMobTypesCause.java @@ -0,0 +1,22 @@ +package net.swofty.type.skyblockgeneric.levels.causes; + +import net.swofty.type.skyblockgeneric.levels.abstr.SkyBlockLevelCauseAbstr; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class CollectedMobTypesCause extends SkyBlockLevelCauseAbstr { + private String mobType; + + public CollectedMobTypesCause(String mobType) { + this.mobType = mobType; + } + + @Override + public double xpReward() { + return 1; + } + + @Override + public boolean shouldDisplayMessage(SkyBlockPlayer player) { + return false; + } +} 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 44adfa910..5652376fc 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 @@ -916,6 +916,10 @@ public DatapointDeaths.PlayerDeaths getDeathData() { return getSkyblockDataHandler().get(SkyBlockDataHandler.Data.DEATHS, DatapointDeaths.class).getValue(); } + public DatapointCollectedMobTypeRewards.PlayerCollectedMobTypeRewards getCollectedMobTypesData() { + return getSkyblockDataHandler().get(SkyBlockDataHandler.Data.COLLECTED_MOB_TYPE_REWARDS, DatapointCollectedMobTypeRewards.class).getValue(); + } + @Override public void kill() { setHealth(getMaxHealth()); diff --git a/type.spidersden/src/main/java/net/swofty/type/spidersden/gui/GUICollectedMobTypes.java b/type.spidersden/src/main/java/net/swofty/type/spidersden/gui/GUICollectedMobTypes.java new file mode 100644 index 000000000..d296a8481 --- /dev/null +++ b/type.spidersden/src/main/java/net/swofty/type/spidersden/gui/GUICollectedMobTypes.java @@ -0,0 +1,250 @@ +package net.swofty.type.spidersden.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.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.gui.inventory.item.GUIMaterial; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.entity.mob.BestiaryMob; +import net.swofty.type.skyblockgeneric.entity.mob.MobRegistry; +import net.swofty.type.skyblockgeneric.entity.mob.MobType; +import net.swofty.type.skyblockgeneric.skill.SkillCategories; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public class GUICollectedMobTypes extends HypixelInventoryGUI { + + private static final int[] SLOTS = { + 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 + }; + + private final int combatXPReward = 1000; + private final int coinReward = 1000; + private final int sbXPReward = 1; + + public GUICollectedMobTypes() { + super("Collected Mob Types", InventoryType.CHEST_6_ROW); + } + + @Override + public void onOpen(InventoryGUIOpenEvent e) { + fill(Material.BLACK_STAINED_GLASS_PANE, ""); + set(GUIClickableItem.getCloseItem(49)); + + + int index = 0; + for (MobTypes mobType : MobTypes.values()) { + set(new GUIClickableItem(SLOTS[index]) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + if (player.getCollectedMobTypesData().hasClaimed(mobType.mobType.name())) return; + boolean hasUnlocked = false; + for (String id : player.getBestiaryData().getMobs().keySet()) { + BestiaryMob mob = MobRegistry.getMobById(id); + if (mob != null && mob.getMobTypes().contains(mobType.mobType)) hasUnlocked = true; + } + if (!hasUnlocked) return; + + player.getSkills().increase(player, SkillCategories.COMBAT, 1000D); + player.addCoins(1000); + player.getCollectedMobTypesData().claim(mobType.mobType.name()); + + new GUICollectedMobTypes().open(player); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + boolean hasClaimed = player.getCollectedMobTypesData().hasClaimed(mobType.name()); + boolean hasUnlocked = false; + for (String id : player.getBestiaryData().getMobs().keySet()) { + BestiaryMob mob = MobRegistry.getMobById(id); + if (mob != null && mob.getMobTypes().contains(mobType.mobType)) hasUnlocked = true; + } + + ArrayList lore = new ArrayList<>(List.of(mobType.lore)); + + lore.add(""); + + if (!hasClaimed) { + lore.add("§7Rewards:"); + lore.add(" §8+§3" + StringUtility.commaify(combatXPReward) + " §7Combat Experience"); + lore.add(" §8+§6" + StringUtility.commaify(coinReward) + " Coins"); + lore.add(" §8+§b" + sbXPReward + " SkyBlock XP"); + lore.add(""); + } else { + lore.add("§e§lREWARDS CLAIMED"); + } + if (hasUnlocked && !hasClaimed) { + lore.add("§a§lCLICK TO CLAIM!"); + } + if (!hasUnlocked && !hasClaimed) { + lore.add("§cKill an enemy of this type to unlock"); + lore.add("§cthese rewards!"); + } + + if (hasUnlocked) { + return ItemStackCreator.getUsingGUIMaterial(mobType.mobType.getFullDisplayName(), mobType.guiMaterial, 1, lore); + } else { + return ItemStackCreator.getStack("§7" + mobType.mobType.getSymbol() + " " + mobType.mobType.getDisplayName(), Material.GRAY_DYE, 1, lore); + } + } + }); + index++; + } + + updateItemStacks(getInventory(), getPlayer()); + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + + } + + private enum MobTypes { + AIRBORNE(MobType.AIRBORNE, new GUIMaterial("6681a72da7263ca9aef066542ecca7a180c40e328c0463fcb114cb3b83057552"), + "§7Most commonly found flying around.", + "§7Enemies of this type take increased", + "§7damage from the §9Gravity §7enchantment." + ), + ANIMAL(MobType.ANIMAL, new GUIMaterial("9b1760e3778f8087046b86bec6a0a83a567625f30f0d6bce866d4bed95dba6c1"), + "§7Enemies of this type are typically", + "§7found in §bThe Barn§7." + ), + AQUATIC(MobType.AQUATIC, new GUIMaterial("32581d564f01d712255125e1f101e534217f76e3599dab7f4ae0ffe328f729eb"), + "§7Most commonly found when §9fishing§7.", + "§7Enemies of this type take increased", + "§7damage from the §9Impaling", + "§7enchantment." + ), + ARCANE(MobType.ARCANE, new GUIMaterial("fce6604157fc4ab5591e4bcf507a749918ee9c41e357d47376e0ee7342074c90"), + "§7Enemies of this type are typically", + "§7found in the §cCrimson Isle§7." + ), + ARTHROPOD(MobType.ARTHROPOD, new GUIMaterial("35e248da2e108f09813a6b848a0fcef111300978180eda41d3d1a7a8e4dba3c3"), + "§7Enemies of this type are typically", + "§7found in the §cSpider's Den§7. Enemies of", + "§7this type take increased damage", + "§7from the §9Bane of Arthropods", + "§7enchantment." + ), + CONSTRUCT(MobType.CONSTRUCT, new GUIMaterial("4271913a3fc8f56bdf6b90a4b4ed6a05c562ce0076b5344d444fb2b040ae57d"), + "§7Enemies of this type are typically", + "§7summoned by other enemies - or by", + "§7players." + ), + CUBIC(MobType.CUBIC, new GUIMaterial("6061f98aaff1e406e06f6f13ffe06005873f3d1eaddb1b59e19dda0ed9ffb270"), + "§7Enemies of this type are typically", + "§7found in the §bDeep Caverns§7. Enemies", + "§7of this type take increased damage", + "§7from the §9Cubism §7enchantment." + ), + ELUSIVE(MobType.ELUSIVE, new GUIMaterial("81d2116827a41a713660bb52c9ba3bc6dd038175afb74a473b85f0cf60ff70e2"), + "§7Enemies of this type are found", + "§7throughout SkyBlock - but they are", + "§drare §7and not seen very often." + ), + ENDER(MobType.ENDER, new GUIMaterial("8a108a0a7a387859f2c44fb9702cf73dbafee3ecfdc4f5def46c0d651b7a49f7"), + "§7Enemies of this type are typically", + "§7found in §dThe End§7. Enemies of this", + "§7type take increased damage from the", + "§9Ender Slayer §7enchantment." + ), + FROZEN(MobType.FROZEN, new GUIMaterial("54690f5aa6d0e800f9b8d1890fc158b921819a81dfd7342a2170e7efc46b9ed7"), + "§7Enemies of this type are typically", + "§7found in §cJerry's Workshop§7." + ), + GLACIAL(MobType.GLACIAL, new GUIMaterial("ef3178fb4bd2c629c218ec03fd4a96bfdc846b1f5625743c49eb205b873ae0d5"), + "§7Enemies of this type are typically", + "§7found in the §bGlacite Mineshafts§7." + ), + HUMANOID(MobType.HUMANOID, new GUIMaterial("56a64f3e6c3613f0c4dae8ab8abebcf43cef2c16232d887d37aeb9713bbad399"), + "§7Enemies of this type are typically", + "§7found in the §5Crystal Hollows§7." + ), + INFERNAL(MobType.INFERNAL, new GUIMaterial("737623f79f7eb4f3f80da65b652cc44b2148eea41f9ffe2e86a23bdf49ab77b1"), + "§7Enemies of this type are typically", + "§7found in the §cCrimson Isle§7. Enemies of", + "§7this type take increased damage", + "§7from the §9Smoldering §7enchantment." + ), + MAGMATIC(MobType.MAGMATIC, new GUIMaterial("a1c97a06efde04d00287bf20416404ab2103e10f08623087e1b0c1264a1c0f0c"), + "§7Enemies of this type are typically", + "§7found in the §cCrimson Isle§7." + ), + MYTHOLOGICAL(MobType.MYTHOLOGICAL, new GUIMaterial("eefcd13d5877ee4edd83a342088520a9cf2265484bfb93aa135cacd651b4fe85"), + "§7Most commonly found during the", + "§2Mythological Ritual§7." + ), + PEST(MobType.PEST, new GUIMaterial("a8abb471db0ab78703011979dc8b40798a941f3a4dec3ec61cbeec2af8cffe8"), + "§7Enemies of this type are typically", + "§7found in §aThe Garden§7." + ), + SHIELDED(MobType.SHIELDED, new GUIMaterial("172850906b7f0d952c0e508073cc439fd3374ccf5b889c06f7e8d90cc0cc255c"), + "§7Enemies of this type do not have", + "§7conventional health. Instead, they", + "§7must be hit a certain amount of times", + "§7in order to kill them." + ), + SKELETAL(MobType.SKELETAL, new GUIMaterial(Material.SKELETON_SKULL), + "§7Enemies of this type are typically", + "§7found in §cThe Catacombs§7 and take", + "§7increased damage from the §9Smite", + "§7enchantment." + ), + SPOOKY(MobType.SPOOKY, new GUIMaterial("121ebb2b36c1f5dde4fa665cd39a4895ef02d00fcb3eb3588b86a13f9ae7e9a8"), + "§7Most commonly found during the", + "§6Spooky Festival§7." + ), + SUBTERRANEAN(MobType.SUBTERRANEAN, new GUIMaterial("b2b12a814ced8af02cddf29a37e7f3011e430e8a18b38b706f27c6bd31650b65"), + "§7Enemies of this type are typically", + "§7found in the §2Dwarven Mines§7." + ), + UNDEAD(MobType.UNDEAD, new GUIMaterial(Material.ZOMBIE_HEAD), + "§7Enemies of this type are typically", + "§7found in the §bSkyBlock Hub§7. Enemies", + "§7of this type take increased damage", + "§7from the §9Smite §7enchantment." + ), + WITHER(MobType.WITHER, new GUIMaterial(Material.WITHER_SKELETON_SKULL), + "§7Enemies of this type are typically", + "§7found in §cThe Catacombs§7 and take", + "§7increased damage from the §9Smite", + "§7enchantment." + ), + WOODLAND(MobType.WOODLAND, new GUIMaterial("30519f79e5829136c3df10b6bd727db255717c87e5c102892ef67e7f46929515"), + "§7Enemies of this type are typically", + "§7found in §2Galatea§7 and take increased", + "§7damage from the §9Woodsplitter", + "§7enchantment." + ); + + private final MobType mobType; + private final GUIMaterial guiMaterial; + private final String[] lore; + + MobTypes(MobType mobType, GUIMaterial guiMaterial, String... lore) { + this.mobType = mobType; + this.guiMaterial = guiMaterial; + this.lore = lore; + } + } +} \ No newline at end of file diff --git a/type.spidersden/src/main/java/net/swofty/type/spidersden/npcs/NPCIke.java b/type.spidersden/src/main/java/net/swofty/type/spidersden/npcs/NPCIke.java index 58f0731bb..342046c59 100644 --- a/type.spidersden/src/main/java/net/swofty/type/spidersden/npcs/NPCIke.java +++ b/type.spidersden/src/main/java/net/swofty/type/spidersden/npcs/NPCIke.java @@ -1,11 +1,18 @@ package net.swofty.type.spidersden.npcs; +import net.kyori.adventure.text.format.NamedTextColor; 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.NPCOption; 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 net.swofty.type.spidersden.gui.GUICollectedMobTypes; + +import java.util.List; public class NPCIke extends HypixelNPC { public NPCIke() { @@ -42,6 +49,87 @@ public boolean looking(HypixelPlayer player) { @Override public void onClick(NPCInteractEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + if (dialogue().isInDialogue(player)) return; + + if (!player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_IKE)) { + setDialogue(player, "initial-hello").thenRun(() -> { + NPCOption.sendOption(player, "ike-intro", true, List.of( + new NPCOption.Option( + "yes", + NamedTextColor.GREEN, + false, + "Yes", + (_) -> { + setDialogue(player, "continuation-1").thenRun(() -> { + NPCOption.sendOption(player, "ike-what-kind-of-game", true, List.of( + new NPCOption.Option( + "what-kind-of-game", + NamedTextColor.GREEN, + false, + "What kind of game?", + (_) -> { + setDialogue(player, "continuation-2").thenRun(() -> { + player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_IKE, true); + }); + } + ) + )); + }); + } + ), + new NPCOption.Option( + "no", + NamedTextColor.RED, + false, + "No", + (p) -> setDialogue(player, "answering-no") + ) + )); + }); + return; + } + + setDialogue(player, "idle-" + (1 + (int)(Math.random() * 2))); + new GUICollectedMobTypes().open(player); + } + + //TODO handle haveing to talk to michael first before anything is done here + @Override + public DialogueSet[] dialogues(HypixelPlayer player) { + return new DialogueSet[] { + DialogueSet.builder() + .key("initial-hello").lines(new String[] { + "You heard what Michael said about Mob Types?" + }).build(), + DialogueSet.builder() + .key("answering-no").lines(new String[] { + "Then go talk to him, bro." + }).build(), + DialogueSet.builder() + .key("continuation-1").lines(new String[] { + "Not to flex, but I've seen enough films to know about every mob type in existence.", + "I'm bored, so let's play a game, just us two." + }).build(), + DialogueSet.builder() + .key("continuation-2").lines(new String[] { + "You go out and slay some mobs and, every time you kill a mob with a new mob type, I'll add it to my book!", + "I'll give you a reward each time you kill a new mob type, so get busy!", + "Talk to me again if you want to check your progress!" + }).build(), + DialogueSet.builder() + .key("idle-1").lines(new String[] { + "'Sup champ! How's that Mob Type collection coming along? Let's take a look!" + }).build(), + DialogueSet.builder() + .key("idle-2").lines(new String[] { + "Dude, I'm so bored out here. Mind showing me what you've been up to?" + }).build(), + DialogueSet.builder() + .key("close").lines(new String[] { + "Get back out there, there's always more to explore!" + }).build(), + }; } }