From 54556d3ea5982fd26d76d1db5276740d760c8c93 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Thu, 28 Sep 2023 01:19:17 +0200 Subject: [PATCH] Added the ability for upgrade npc to repair as well --- .../com/alttd/fishingevent/config/Config.java | 29 ++++++++++- .../com/alttd/fishingevent/config/Fishes.java | 2 - .../gui/windows/UpgradeWindow.java | 49 ++++++++++++++++++- .../fishingevent/npc/types/UpgradeNPC.java | 7 ++- .../fishingevent/objects/RepairData.java | 6 +++ 5 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/alttd/fishingevent/objects/RepairData.java diff --git a/src/main/java/com/alttd/fishingevent/config/Config.java b/src/main/java/com/alttd/fishingevent/config/Config.java index 769f292..4c22f9f 100644 --- a/src/main/java/com/alttd/fishingevent/config/Config.java +++ b/src/main/java/com/alttd/fishingevent/config/Config.java @@ -146,11 +146,17 @@ public class Config extends AbstractConfig { config.logger.warning("Unable to create valid upgrades for Upgrade npc: [%]", key); return; } + Optional> repairDataList = getRepairData(npcPrefix); + if (repairDataList.isEmpty()) { + config.logger.warning("Unable to create valid repair data for Upgrade npc: [%]", key); + return; + } npc = new UpgradeNPC( config.fishingEvent, config.logger, npcCreateData, - upgrades.get() + upgrades.get(), + repairDataList.get() ); } case TUTORIAL -> { @@ -189,6 +195,27 @@ public class Config extends AbstractConfig { NPC_MAP.put(key, npc); } + private static Optional> getRepairData(String npcPrefix) { + ArrayList repairDataList = new ArrayList<>(); + ConfigurationSection primSection = config.getConfigurationSection(npcPrefix + "repair-data"); + if (primSection == null) + return Optional.empty(); + for (String repairDataKey : primSection.getKeys(false)) { + String repairPrefix = npcPrefix + "repair-data." + repairDataKey + "."; + String materialString = config.getString(repairPrefix, "material", Material.ANVIL.toString()); + Material material = Material.getMaterial(materialString); + if (material == null) { + config.logger.warning("Received invalid material [%] for repair data [%]", materialString, repairDataKey); + continue; + } + int percentage = config.getInt(repairPrefix, "percentage", 1); + int cost = config.getInt(repairPrefix, "cost", 1); + + repairDataList.add(new RepairData(material, percentage, cost)); + } + return Optional.of(repairDataList); + } + private static Optional> getUpgrades(String npcPrefix) { ArrayList enchantmentTracks = new ArrayList<>(); ConfigurationSection primSection = config.getConfigurationSection(npcPrefix + "enchants"); diff --git a/src/main/java/com/alttd/fishingevent/config/Fishes.java b/src/main/java/com/alttd/fishingevent/config/Fishes.java index 832336e..f2a467a 100644 --- a/src/main/java/com/alttd/fishingevent/config/Fishes.java +++ b/src/main/java/com/alttd/fishingevent/config/Fishes.java @@ -69,12 +69,10 @@ public class Fishes extends AbstractConfig { loadFish(fishSection); } for (Fish fish : WATER_FISH) { - config.logger.debug("Adding water fish [%] with rarity [%]", fish.normalFishName(), fish.getRarity().toString()); RARITY_WATER_FISH_MAP.computeIfAbsent(fish.getRarity(), list -> new ArrayList<>()).add(fish); } for (Fish fish : LAVA_FISH) { - config.logger.debug("Adding lava fish [%] with rarity [%]", fish.normalFishName(), fish.getRarity().toString()); RARITY_LAVA_FISH_MAP.computeIfAbsent(fish.getRarity(), list -> new ArrayList<>()).add(fish); } } diff --git a/src/main/java/com/alttd/fishingevent/gui/windows/UpgradeWindow.java b/src/main/java/com/alttd/fishingevent/gui/windows/UpgradeWindow.java index 1cfd137..6026fde 100644 --- a/src/main/java/com/alttd/fishingevent/gui/windows/UpgradeWindow.java +++ b/src/main/java/com/alttd/fishingevent/gui/windows/UpgradeWindow.java @@ -5,6 +5,7 @@ import com.alttd.fishingevent.config.Messages; import com.alttd.fishingevent.gui.GUI; import com.alttd.fishingevent.objects.EnchantmentData; import com.alttd.fishingevent.objects.EnchantmentTrack; +import com.alttd.fishingevent.objects.RepairData; import com.alttd.fishingevent.points.PointsManagement; import com.alttd.fishingevent.util.Logger; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -17,6 +18,7 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -35,13 +37,15 @@ public class UpgradeWindow extends GUI { private final ItemStack maxUpgraded = new ItemStack(Material.BARRIER, 1); //TODO itemlore/name private final Player player; private final List enchantmentTracks; + private final List repairDataList; - public UpgradeWindow(FishingEvent fishingEvent, Player player, Logger logger, List enchantmentTracks) { + public UpgradeWindow(FishingEvent fishingEvent, Player player, Logger logger, List enchantmentTracks, List repairDataList) { super(InventoryType.CHEST, MiniMessage.miniMessage().deserialize(Messages.GUI.UPGRADE_GUI_NAME)); this.fishingEvent = fishingEvent; this.logger = logger; this.player = player; this.enchantmentTracks = enchantmentTracks; + this.repairDataList = repairDataList; updateGUI(); canOpen = true; } @@ -66,6 +70,49 @@ public class UpgradeWindow extends GUI { setItem(i, optionalEnchantmentItem.get(), clickingPlayer -> upgrade(clickingPlayer, enchantmentTrack, trackLevel)); i++; } + for (RepairData repairData : repairDataList) { + ItemStack itemStack = new ItemStack(repairData.material(), 1); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.displayName(MiniMessage.miniMessage().deserialize("Repair % for points", TagResolver.resolver( + Placeholder.parsed("percent", String.valueOf(repairData.percentage())), + Placeholder.parsed("points", String.valueOf(repairData.cost())) + ))); + itemStack.setItemMeta(itemMeta); + setItem(i, itemStack, clickingPlayer -> repair(clickingPlayer, repairData)); + i++; + } + } + + private void repair(Player clickingPlayer, RepairData repairData) { + PlayerInventory inventory = clickingPlayer.getInventory(); + + int playerPoints = PointsManagement.getInstance().getPoints(player.getUniqueId()); + if (playerPoints < repairData.cost()) { + player.sendMiniMessage(Messages.GUI.NOT_ENOUGH_POINTS, TagResolver.resolver( + Placeholder.parsed("price", String.valueOf(repairData.cost())), + Placeholder.parsed("points", String.valueOf(playerPoints)) + )); + return; + } + + int fishingRodSlot = findFishingRodSlot(inventory); + ItemStack fishingRod = inventory.getItem(fishingRodSlot); + if (fishingRod == null) { + logger.warning("Fishing rod became null"); + return; + } + if (!(fishingRod.getItemMeta() instanceof Damageable damageable)) { + logger.warning("Fishing rod is not repairable"); + return; + } + int maxDurability = Material.FISHING_ROD.getMaxDurability(); + int newDurability = Math.min((int) (maxDurability * (repairData.percentage() / 100.0)), maxDurability); + if (damageable.getDamage() < newDurability) { + clickingPlayer.sendMiniMessage("Your fishing rod is already more than % repaired", //TODO move to config + Placeholder.parsed("percentage", String.valueOf(repairData.percentage()))); + return; + } + damageable.setDamage(newDurability); } private int getTrackLevel(EnchantmentTrack enchantmentTrack, ItemStack fishingRod) { diff --git a/src/main/java/com/alttd/fishingevent/npc/types/UpgradeNPC.java b/src/main/java/com/alttd/fishingevent/npc/types/UpgradeNPC.java index 4c486b6..f67c0ec 100644 --- a/src/main/java/com/alttd/fishingevent/npc/types/UpgradeNPC.java +++ b/src/main/java/com/alttd/fishingevent/npc/types/UpgradeNPC.java @@ -6,6 +6,7 @@ import com.alttd.fishingevent.gui.windows.UpgradeWindow; import com.alttd.fishingevent.npc.LibNPC; import com.alttd.fishingevent.npc.NPC; import com.alttd.fishingevent.objects.EnchantmentTrack; +import com.alttd.fishingevent.objects.RepairData; import com.alttd.fishingevent.util.Logger; import com.alttd.fishingevent.util.NPCCreateData; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; @@ -20,13 +21,15 @@ public class UpgradeNPC extends LibNPC implements NPC { private final Logger logger; private boolean isSpawned = false; private final List enchantmentTracks; + private final List repairDataList; private final FishingEvent fishingEvent; - public UpgradeNPC(FishingEvent fishingEvent, Logger logger, NPCCreateData npcCreateData, List enchantmentTracks) { + public UpgradeNPC(FishingEvent fishingEvent, Logger logger, NPCCreateData npcCreateData, List enchantmentTracks, List repairDataList) { this.fishingEvent = fishingEvent; this.npcCreateData = npcCreateData; this.logger = logger; this.enchantmentTracks = enchantmentTracks; + this.repairDataList = repairDataList; } @Override @@ -47,7 +50,7 @@ public class UpgradeNPC extends LibNPC implements NPC { @Override public void rightClick(Player player) { - UpgradeWindow upgradeWindow = new UpgradeWindow(fishingEvent, player, logger, enchantmentTracks); + UpgradeWindow upgradeWindow = new UpgradeWindow(fishingEvent, player, logger, enchantmentTracks, repairDataList); if (!upgradeWindow.canOpen()) { player.sendMiniMessage(Messages.GUI.NO_FISHING_ROD, null); return; diff --git a/src/main/java/com/alttd/fishingevent/objects/RepairData.java b/src/main/java/com/alttd/fishingevent/objects/RepairData.java new file mode 100644 index 0000000..482a7e9 --- /dev/null +++ b/src/main/java/com/alttd/fishingevent/objects/RepairData.java @@ -0,0 +1,6 @@ +package com.alttd.fishingevent.objects; + +import org.bukkit.Material; + +public record RepairData(Material material, int percentage, int cost) { +}