diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/fishing/FishingGears.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/fishing/FishingGears.java index 0d37c7bb..5c23fd0d 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/fishing/FishingGears.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/fishing/FishingGears.java @@ -17,6 +17,10 @@ package net.momirealms.customfishing.api.mechanic.fishing; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.sound.Sound; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ScoreComponent; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.MechanicType; import net.momirealms.customfishing.api.mechanic.action.ActionTrigger; @@ -24,8 +28,11 @@ import net.momirealms.customfishing.api.mechanic.config.ConfigManager; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.context.ContextKeys; import net.momirealms.customfishing.api.mechanic.effect.EffectModifier; +import net.momirealms.customfishing.api.mechanic.hook.HookConfig; import net.momirealms.customfishing.api.mechanic.requirement.RequirementManager; import net.momirealms.customfishing.api.storage.user.UserData; +import net.momirealms.customfishing.common.helper.AdventureHelper; +import net.momirealms.customfishing.common.item.Item; import net.momirealms.customfishing.common.util.Pair; import net.momirealms.customfishing.common.util.TriConsumer; import net.momirealms.sparrow.heart.feature.inventory.HandSlot; @@ -105,19 +112,27 @@ public class FishingGears { ItemStack offHandItem = playerInventory.getItemInOffHand(); // set rod boolean rodOnMainHand = mainHandItem.getType() == Material.FISHING_ROD; - String rodID = BukkitCustomFishingPlugin.getInstance().getItemManager().getItemID(rodOnMainHand ? mainHandItem : offHandItem); - fishingGears.gears.put(GearType.ROD, List.of(Pair.of(rodID, rodOnMainHand ? mainHandItem : offHandItem))); + ItemStack rodItem = rodOnMainHand ? mainHandItem : offHandItem; + String rodID = BukkitCustomFishingPlugin.getInstance().getItemManager().getItemID(rodItem); + fishingGears.gears.put(GearType.ROD, List.of(Pair.of(rodID, rodItem))); context.arg(ContextKeys.ROD, rodID); fishingGears.rodSlot = rodOnMainHand ? HandSlot.MAIN : HandSlot.OFF; BukkitCustomFishingPlugin.getInstance().getEffectManager().getEffectModifier(rodID, MechanicType.ROD).ifPresent(fishingGears.modifiers::add); // set enchantments - List> enchants = BukkitCustomFishingPlugin.getInstance().getIntegrationManager().getEnchantments(rodOnMainHand ? mainHandItem : offHandItem); + List> enchants = BukkitCustomFishingPlugin.getInstance().getIntegrationManager().getEnchantments(rodItem); for (Pair enchantment : enchants) { String effectID = enchantment.left() + ":" + enchantment.right(); BukkitCustomFishingPlugin.getInstance().getEffectManager().getEffectModifier(effectID, MechanicType.ENCHANT).ifPresent(fishingGears.modifiers::add); } + // set hook + BukkitCustomFishingPlugin.getInstance().getHookManager().getHookID(rodItem).ifPresent(hookID -> { + fishingGears.gears.put(GearType.HOOK, List.of(Pair.of(hookID, rodItem))); + context.arg(ContextKeys.HOOK, hookID); + BukkitCustomFishingPlugin.getInstance().getEffectManager().getEffectModifier(hookID, MechanicType.HOOK).ifPresent(fishingGears.modifiers::add); + }); + // set bait if it is boolean hasBait = false; String anotherItemID = BukkitCustomFishingPlugin.getInstance().getItemManager().getItemID(rodOnMainHand ? offHandItem : mainHandItem); @@ -224,8 +239,92 @@ public class FishingGears { ((context, itemStack) -> {}), ((context, itemStack) -> {}), ((context, itemStack) -> {}), - ((context, itemStack) -> {}), - ((context, itemStack) -> {}), + ((context, itemStack) -> { + if (context.getHolder().getGameMode() != GameMode.CREATIVE) { + Item wrapped = BukkitCustomFishingPlugin.getInstance().getItemManager().wrap(itemStack.clone()); + String hookID = (String) wrapped.getTag("CustomFishing", "hook_id").orElseThrow(() -> new RuntimeException("This error should never occur")); + wrapped.getTag("CustomFishing", "hook_max_damage").ifPresent(max -> { + int maxDamage = (int) max; + int hookDamage = (int) wrapped.getTag("CustomFishing", "hook_damage").orElse(0) + 1; + if (hookDamage >= maxDamage) { + wrapped.removeTag("CustomFishing", "hook_damage"); + wrapped.removeTag("CustomFishing", "hook_id"); + wrapped.removeTag("CustomFishing", "hook_stack"); + wrapped.removeTag("CustomFishing", "hook_max_damage"); + BukkitCustomFishingPlugin.getInstance().getSenderFactory().getAudience(context.getHolder()).playSound(Sound.sound(Key.key("minecraft:entity.item.break"), Sound.Source.PLAYER, 1, 1)); + } else { + wrapped.setTag(hookDamage, "CustomFishing", "hook_damage"); + HookConfig hookConfig = BukkitCustomFishingPlugin.getInstance().getHookManager().getHook(hookID).orElseThrow(); + List previousLore = wrapped.lore().orElse(new ArrayList<>()); + List newLore = new ArrayList<>(); + List durabilityLore = new ArrayList<>(); + for (String previous : previousLore) { + Component component = AdventureHelper.jsonToComponent(previous); + if (component instanceof ScoreComponent scoreComponent && scoreComponent.name().equals("cf")) { + if (scoreComponent.objective().equals("hook")) { + continue; + } else if (scoreComponent.objective().equals("durability")) { + durabilityLore.add(previous); + continue; + } + } + newLore.add(previous); + } + for (String lore : hookConfig.lore()) { + ScoreComponent.Builder builder = Component.score().name("cf").objective("hook"); + builder.append(AdventureHelper.miniMessage(lore.replace("{dur}", String.valueOf(maxDamage - hookDamage)).replace("{max}", String.valueOf(maxDamage)))); + newLore.add(AdventureHelper.componentToJson(builder.build())); + } + newLore.addAll(durabilityLore); + wrapped.lore(newLore); + } + itemStack.setItemMeta(wrapped.load().getItemMeta()); + }); + } + }), + ((context, itemStack) -> { + if (context.getHolder().getGameMode() != GameMode.CREATIVE) { + Item wrapped = BukkitCustomFishingPlugin.getInstance().getItemManager().wrap(itemStack.clone()); + String hookID = (String) wrapped.getTag("CustomFishing", "hook_id").orElseThrow(() -> new RuntimeException("This error should never occur")); + wrapped.getTag("CustomFishing", "hook_max_damage").ifPresent(max -> { + int maxDamage = (int) max; + int hookDamage = (int) wrapped.getTag("CustomFishing", "hook_damage").orElse(0) + 1; + if (hookDamage >= maxDamage) { + wrapped.removeTag("CustomFishing", "hook_damage"); + wrapped.removeTag("CustomFishing", "hook_id"); + wrapped.removeTag("CustomFishing", "hook_stack"); + wrapped.removeTag("CustomFishing", "hook_max_damage"); + BukkitCustomFishingPlugin.getInstance().getSenderFactory().getAudience(context.getHolder()).playSound(Sound.sound(Key.key("minecraft:entity.item.break"), Sound.Source.PLAYER, 1, 1)); + } else { + wrapped.setTag(hookDamage, "CustomFishing", "hook_damage"); + HookConfig hookConfig = BukkitCustomFishingPlugin.getInstance().getHookManager().getHook(hookID).orElseThrow(); + List previousLore = wrapped.lore().orElse(new ArrayList<>()); + List newLore = new ArrayList<>(); + List durabilityLore = new ArrayList<>(); + for (String previous : previousLore) { + Component component = AdventureHelper.jsonToComponent(previous); + if (component instanceof ScoreComponent scoreComponent && scoreComponent.name().equals("cf")) { + if (scoreComponent.objective().equals("hook")) { + continue; + } else if (scoreComponent.objective().equals("durability")) { + durabilityLore.add(previous); + continue; + } + } + newLore.add(previous); + } + for (String lore : hookConfig.lore()) { + ScoreComponent.Builder builder = Component.score().name("cf").objective("hook"); + builder.append(AdventureHelper.miniMessage(lore.replace("{dur}", String.valueOf(maxDamage - hookDamage)).replace("{max}", String.valueOf(maxDamage)))); + newLore.add(AdventureHelper.componentToJson(builder.build())); + } + newLore.addAll(durabilityLore); + wrapped.lore(newLore); + } + itemStack.setItemMeta(wrapped.load().getItemMeta()); + }); + } + }), ((context, itemStack) -> {}), ((context, itemStack) -> {}), ((context, itemStack) -> {}) diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/hook/HookManager.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/hook/HookManager.java index 07330045..a58ca2f6 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/hook/HookManager.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/hook/HookManager.java @@ -18,6 +18,7 @@ package net.momirealms.customfishing.api.mechanic.hook; import net.momirealms.customfishing.common.plugin.feature.Reloadable; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.Optional; @@ -28,4 +29,6 @@ public interface HookManager extends Reloadable { @NotNull Optional getHook(String id); + + Optional getHookID(ItemStack rod); } diff --git a/common/src/main/java/net/momirealms/customfishing/common/helper/AdventureHelper.java b/common/src/main/java/net/momirealms/customfishing/common/helper/AdventureHelper.java index 99c9ff95..319d6e70 100644 --- a/common/src/main/java/net/momirealms/customfishing/common/helper/AdventureHelper.java +++ b/common/src/main/java/net/momirealms/customfishing/common/helper/AdventureHelper.java @@ -101,6 +101,10 @@ public class AdventureHelper { return getInstance().miniMessageStrict.serialize(getInstance().gsonComponentSerializer.deserialize(json)); } + public static Component jsonToComponent(String json) { + return getInstance().gsonComponentSerializer.deserialize(json); + } + public static String legacyToMiniMessage(String legacy) { StringBuilder stringBuilder = new StringBuilder(); char[] chars = legacy.toCharArray(); diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ImportItemCommand.java b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ImportItemCommand.java index e1fa0c37..e79610f0 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ImportItemCommand.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/command/feature/ImportItemCommand.java @@ -17,8 +17,6 @@ package net.momirealms.customfishing.bukkit.command.feature; -import com.saicone.rtag.RtagItem; -import com.saicone.rtag.item.ItemObject; import dev.dejvokep.boostedyaml.YamlDocument; import net.kyori.adventure.text.Component; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; @@ -29,14 +27,11 @@ import net.momirealms.customfishing.common.locale.MessageConstants; import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; import org.incendo.cloud.Command; import org.incendo.cloud.CommandManager; import org.incendo.cloud.parser.standard.StringParser; -import javax.swing.plaf.synth.SynthOptionPaneUI; import java.io.File; import java.io.IOException; import java.util.Map; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java index cc14fc0b..b11d0c4a 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java @@ -169,7 +169,7 @@ public class BukkitConfigManager extends ConfigManager { logDataSaving = config.getBoolean("other-settings.log-data-saving", true); lockData = config.getBoolean("other-settings.lock-data", true); - durabilityLore = new ArrayList<>(config.getStringList("other-settings.custom-durability-format")); + durabilityLore = new ArrayList<>(config.getStringList("other-settings.custom-durability-format").stream().map(it -> "" + it).toList()); itemDetectOrder = config.getStringList("other-settings.item-detection-order").toArray(new String[0]); blockDetectOrder = config.getStringList("other-settings.block-detection-order").toArray(new String[0]); @@ -232,7 +232,6 @@ public class BukkitConfigManager extends ConfigManager { } } } - } private void loadConfigs() { @@ -699,7 +698,7 @@ public class BukkitConfigManager extends ConfigManager { private void registerBuiltInHookParser() { this.registerHookParser(object -> { List lore = ListUtils.toList(object); - return builder -> builder.lore(lore); + return builder -> builder.lore(lore.stream().map(it -> "" + it).toList()); }, "lore-on-rod"); } diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/fishing/BukkitFishingManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/fishing/BukkitFishingManager.java index 9b1f91d1..e1728658 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/fishing/BukkitFishingManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/fishing/BukkitFishingManager.java @@ -30,7 +30,6 @@ import net.momirealms.customfishing.api.mechanic.game.AbstractGamingPlayer; import net.momirealms.customfishing.api.mechanic.game.GamingPlayer; import net.momirealms.customfishing.api.mechanic.requirement.RequirementManager; import net.momirealms.customfishing.api.util.EventUtils; -import net.momirealms.customfishing.common.helper.VersionHelper; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/hook/BukkitHookManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/hook/BukkitHookManager.java index 6498525d..db58b459 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/hook/BukkitHookManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/hook/BukkitHookManager.java @@ -18,10 +18,20 @@ package net.momirealms.customfishing.bukkit.hook; import com.saicone.rtag.item.ItemTagStream; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ScoreComponent; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.api.mechanic.MechanicType; import net.momirealms.customfishing.api.mechanic.context.Context; +import net.momirealms.customfishing.api.mechanic.effect.EffectModifier; import net.momirealms.customfishing.api.mechanic.hook.HookConfig; import net.momirealms.customfishing.api.mechanic.hook.HookManager; +import net.momirealms.customfishing.api.mechanic.requirement.RequirementManager; +import net.momirealms.customfishing.bukkit.item.damage.CustomDurabilityItem; +import net.momirealms.customfishing.bukkit.item.damage.DurabilityItem; +import net.momirealms.customfishing.bukkit.item.damage.VanillaDurabilityItem; +import net.momirealms.customfishing.bukkit.util.PlayerUtils; +import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.item.Item; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -35,7 +45,9 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Optional; public class BukkitHookManager implements HookManager, Listener { @@ -71,6 +83,15 @@ public class BukkitHookManager implements HookManager, Listener { return Optional.ofNullable(hooks.get(id)); } + @Override + public Optional getHookID(ItemStack rod) { + if (rod == null || rod.getType() != Material.FISHING_ROD || rod.getAmount() == 0) + return Optional.empty(); + + Item wrapped = plugin.getItemManager().wrap(rod); + return wrapped.getTag("CustomFishing", "hook_id").map(o -> (String) o); + } + @EventHandler (ignoreCancelled = true) public void onDragDrop(InventoryClickEvent event) { final Player player = (Player) event.getWhoClicked(); @@ -94,8 +115,8 @@ public class BukkitHookManager implements HookManager, Listener { } event.setCancelled(true); String id = (String) wrapped.getTag("CustomFishing", "hook_id").orElseThrow(); - byte[] hookItemBase64 = (byte[]) wrapped.getTag("CustomFishing", "hook_id").orElse(null); - int damage = (int) wrapped.getTag("CustomFishing", "hook_dur").orElse(0); + byte[] hookItemBase64 = (byte[]) wrapped.getTag("CustomFishing", "hook_stack").orElse(null); + int damage = (int) wrapped.getTag("CustomFishing", "hook_damage").orElse(0); ItemStack itemStack; if (hookItemBase64 != null) { itemStack = ItemTagStream.INSTANCE.fromBytes(hookItemBase64); @@ -104,12 +125,24 @@ public class BukkitHookManager implements HookManager, Listener { } plugin.getItemManager().setDurability(player, itemStack, damage); - wrapped.removeTag("hook_id"); - wrapped.removeTag("hook_item"); - wrapped.removeTag("hook_dur"); + wrapped.removeTag("CustomFishing", "hook_id"); + wrapped.removeTag("CustomFishing", "hook_stack"); + wrapped.removeTag("CustomFishing", "hook_damage"); + wrapped.removeTag("CustomFishing", "hook_max_damage"); event.setCursor(itemStack); + List previousLore = wrapped.lore().orElse(new ArrayList<>()); + List newLore = new ArrayList<>(); + for (String previous : previousLore) { + Component component = AdventureHelper.jsonToComponent(previous); + if (component instanceof ScoreComponent scoreComponent && scoreComponent.name().equals("cf") && scoreComponent.objective().equals("hook")) { + continue; + } + newLore.add(previous); + } + wrapped.lore(newLore); + wrapped.load(); return; } @@ -120,6 +153,76 @@ public class BukkitHookManager implements HookManager, Listener { return; } + Context context = Context.player(player); + HookConfig hookConfig = setting.get(); + Optional modifier = plugin.getEffectManager().getEffectModifier(hookID, MechanicType.HOOK); + if (modifier.isPresent()) { + if (!RequirementManager.isSatisfied(context, modifier.get().requirements())) { + return; + } + } + event.setCancelled(true); + ItemStack clonedHook = cursor.clone(); + clonedHook.setAmount(1); + cursor.setAmount(cursor.getAmount() - 1); + + Item wrapped = plugin.getItemManager().wrap(clicked); + String previousHookID = (String) wrapped.getTag("CustomFishing", "hook_id").orElse(null); + if (previousHookID != null) { + int previousHookDamage = (int) wrapped.getTag("CustomFishing", "hook_damage").orElse(0); + ItemStack previousItemStack; + byte[] stackBytes = (byte[]) wrapped.getTag("CustomFishing", "hook_stack").orElse(null); + if (stackBytes != null) { + previousItemStack = ItemTagStream.INSTANCE.fromBytes(stackBytes); + } else { + previousItemStack = plugin.getItemManager().buildInternal(Context.player(player), previousHookID); + } + if (previousItemStack != null) { + plugin.getItemManager().setDurability(player, previousItemStack, previousHookDamage); + if (cursor.getAmount() == 0) { + event.setCursor(previousItemStack); + } else { + PlayerUtils.giveItem(player, previousItemStack, 1); + } + } + } + + Item wrappedHook = plugin.getItemManager().wrap(clonedHook); + DurabilityItem durabilityItem; + if (wrappedHook.hasTag("CustomFishing", "max_dur")) { + durabilityItem = new CustomDurabilityItem(wrappedHook); + } else { + durabilityItem = new VanillaDurabilityItem(wrappedHook); + } + + wrapped.setTag(hookID, "CustomFishing", "hook_id"); + wrapped.setTag(ItemTagStream.INSTANCE.toBytes(clonedHook), "CustomFishing", "hook_stack"); + wrapped.setTag(durabilityItem.damage(), "CustomFishing", "hook_damage"); + wrapped.setTag(durabilityItem.maxDamage(), "CustomFishing", "hook_max_damage"); + + List previousLore = wrapped.lore().orElse(new ArrayList<>()); + List newLore = new ArrayList<>(); + List durabilityLore = new ArrayList<>(); + for (String previous : previousLore) { + Component component = AdventureHelper.jsonToComponent(previous); + if (component instanceof ScoreComponent scoreComponent && scoreComponent.name().equals("cf")) { + if (scoreComponent.objective().equals("hook")) { + continue; + } else if (scoreComponent.objective().equals("durability")) { + durabilityLore.add(previous); + continue; + } + } + newLore.add(previous); + } + for (String lore : hookConfig.lore()) { + ScoreComponent.Builder builder = Component.score().name("cf").objective("hook"); + builder.append(AdventureHelper.miniMessage(lore.replace("{dur}", String.valueOf(durabilityItem.maxDamage() - durabilityItem.damage())).replace("{max}", String.valueOf(durabilityItem.maxDamage())))); + newLore.add(AdventureHelper.componentToJson(builder.build())); + } + newLore.addAll(durabilityLore); + wrapped.lore(newLore); + wrapped.load(); } } diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java index 486955f1..ecc5b3d8 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/item/BukkitItemManager.java @@ -17,7 +17,6 @@ package net.momirealms.customfishing.bukkit.item; -import com.saicone.rtag.RtagItem; import net.kyori.adventure.key.Key; import net.kyori.adventure.sound.Sound; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; @@ -36,7 +35,6 @@ import net.momirealms.customfishing.bukkit.item.damage.VanillaDurabilityItem; import net.momirealms.customfishing.bukkit.util.ItemStackUtils; import net.momirealms.customfishing.bukkit.util.LocationUtils; import net.momirealms.customfishing.common.item.Item; -import net.momirealms.customfishing.common.util.RandomUtils; import net.momirealms.sparrow.heart.SparrowHeart; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -54,10 +52,12 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.inventory.InventoryPickupItemEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.player.PlayerAttemptPickupItemEvent; import org.bukkit.event.player.PlayerItemDamageEvent; +import org.bukkit.event.player.PlayerItemMendEvent; +import org.bukkit.inventory.AnvilInventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; @@ -265,7 +265,7 @@ public class BukkitItemManager implements ItemManager, Listener { return; } } - Item wrapped = factory.wrap(itemStack.clone()); + Item wrapped = factory.wrap(itemStack); if (wrapped.unbreakable()) return; @@ -288,7 +288,7 @@ public class BukkitItemManager implements ItemManager, Listener { } durabilityItem.damage(damage + amount); - itemStack.setItemMeta(wrapped.load().getItemMeta()); + wrapped.load(); } @Override @@ -317,6 +317,41 @@ public class BukkitItemManager implements ItemManager, Listener { } } + @EventHandler (ignoreCancelled = true) + public void onMending(PlayerItemMendEvent event) { + ItemStack itemStack = event.getItem(); + if (!hasCustomDurability(itemStack)) { + return; + } + event.setCancelled(true); + Item wrapped = factory.wrap(itemStack); + if (wrapped.unbreakable()) + return; + DurabilityItem wrappedDurability = wrapDurabilityItem(wrapped); + setDurability(event.getPlayer(), itemStack, Math.max(wrappedDurability.damage() - event.getRepairAmount(), 0)); + } + + @EventHandler (ignoreCancelled = true) + public void onAnvil(PrepareAnvilEvent event) { + AnvilInventory anvil = event.getInventory(); + ItemStack first = anvil.getFirstItem(); + ItemStack second = anvil.getSecondItem(); + if (first != null && second != null + && first.getType() == Material.FISHING_ROD && second.getType() == Material.FISHING_ROD && event.getResult() != null + && hasCustomDurability(first)) { + Item wrapped1 = factory.wrap(anvil.getResult()); + DurabilityItem wrappedDurability1 = wrapDurabilityItem(wrapped1); + + Item wrapped2 = factory.wrap(second); + DurabilityItem wrappedDurability2 = wrapDurabilityItem(wrapped2); + + int durability2 = wrappedDurability2.maxDamage() - wrappedDurability2.damage(); + int damage1 = Math.max(wrappedDurability1.damage() - durability2, 0); + wrappedDurability1.damage(damage1); + event.setResult(wrapped1.load()); + } + } + @EventHandler(ignoreCancelled = true) public void onInvPickItem(InventoryPickupItemEvent event) { ItemStack itemStack = event.getItem().getItemStack(); diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/item/damage/CustomDurabilityItem.java b/core/src/main/java/net/momirealms/customfishing/bukkit/item/damage/CustomDurabilityItem.java index 2154b3ff..5028cbf4 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/item/damage/CustomDurabilityItem.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/item/damage/CustomDurabilityItem.java @@ -17,9 +17,16 @@ package net.momirealms.customfishing.bukkit.item.damage; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ScoreComponent; +import net.momirealms.customfishing.api.mechanic.config.ConfigManager; +import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.item.Item; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; +import java.util.List; + public class CustomDurabilityItem implements DurabilityItem { private final Item item; @@ -36,6 +43,24 @@ public class CustomDurabilityItem implements DurabilityItem { int fakeDamage = (int) (value * ratio); item.damage(fakeDamage); item.setTag(customMaxDamage - value, "CustomFishing", "cur_dur"); + List durabilityLore = ConfigManager.durabilityLore(); + List previousLore = item.lore().orElse(new ArrayList<>()); + List newLore = new ArrayList<>(); + for (String previous : previousLore) { + Component component = AdventureHelper.jsonToComponent(previous); + if (component instanceof ScoreComponent scoreComponent && scoreComponent.name().equals("cf")) { + if (scoreComponent.objective().equals("durability")) { + continue; + } + } + newLore.add(previous); + } + for (String lore : durabilityLore) { + ScoreComponent.Builder builder = Component.score().name("cf").objective("durability"); + builder.append(AdventureHelper.miniMessage(lore.replace("{dur}", String.valueOf(customMaxDamage - value)).replace("{max}", String.valueOf(customMaxDamage)))); + newLore.add(AdventureHelper.componentToJson(builder.build())); + } + item.lore(newLore); } @Override diff --git a/core/src/main/resources/contents/minigame/default.yml b/core/src/main/resources/contents/minigame/default.yml index 9ccb9d75..5d507b45 100644 --- a/core/src/main/resources/contents/minigame/default.yml +++ b/core/src/main/resources/contents/minigame/default.yml @@ -1417,7 +1417,7 @@ tension_game_easy: game-type: tension difficulty: 20~35 time: 30 - title: '{tension}' + title: '{progress}' # Tip would show on the title to guide the player how to play tip: 'Press to start' subtitle: @@ -1454,7 +1454,7 @@ tension_game_normal: game-type: tension difficulty: 35~50 time: 30 - title: '{tension}' + title: '{progress}' # Tip would show on the title to guide the player how to play tip: 'Press to start' subtitle: @@ -1491,7 +1491,7 @@ tension_game_hard: game-type: tension difficulty: 50~65 time: 30 - title: '{tension}' + title: '{progress}' # Tip would show on the title to guide the player how to play tip: 'Press to start' subtitle: diff --git a/gradle.properties b/gradle.properties index f41b553e..e54a6849 100644 --- a/gradle.properties +++ b/gradle.properties @@ -35,7 +35,7 @@ commons_pool_version=2.12.0 bstats_version=3.0.2 geantyref_version=1.3.15 caffeine_version=3.1.8 -rtag_version=1.5.5 +rtag_version=6290733498 jedis_version=5.1.2 exp4j_version=0.4.8 placeholder_api_version=2.11.6