From 155b5b459940a22dcf2418f77b55fa244c8a519c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 16 Mar 2025 05:01:06 +0800 Subject: [PATCH] fix renaming --- .../bukkit/util/LegacyInventoryUtils.java | 9 ++++- .../item/recipe/RecipeEventListener.java | 31 ++++++++++++---- .../craftengine/bukkit/util/Reflections.java | 35 +++++++++++++++++++ .../craftengine/mod/CraftEngineBlock.java | 5 +-- 4 files changed, 69 insertions(+), 11 deletions(-) diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java index 980d68725..c2249eced 100644 --- a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java @@ -13,8 +13,11 @@ public class LegacyInventoryUtils { return player.getOpenInventory().getTopInventory(); } - public static void setRepairCost(AnvilInventory anvilInventory, int repairCost, int amount) { + public static void setRepairCost(AnvilInventory anvilInventory, int repairCost) { anvilInventory.setRepairCost(repairCost); + } + + public static void setRepairCostAmount(AnvilInventory anvilInventory, int amount) { anvilInventory.setRepairCostAmount(amount); } @@ -27,6 +30,10 @@ public class LegacyInventoryUtils { return anvilInventory.getMaximumRepairCost(); } + public static int getRepairCost(AnvilInventory anvilInventory) { + return anvilInventory.getRepairCost(); + } + public static InventoryView getView(PrepareAnvilEvent event) { return event.getView(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index 2cdc5b1dc..f84ec2cd6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -21,10 +21,7 @@ import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; import net.momirealms.craftengine.core.plugin.config.ConfigManager; import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; -import net.momirealms.craftengine.core.util.AdventureHelper; -import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.Pair; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.util.context.ContextHolder; import org.bukkit.Material; import org.bukkit.block.Block; @@ -561,13 +558,16 @@ public class RecipeEventListener implements Listener { String renameText; int maxRepairCost; + int previousCost; if (VersionHelper.isVersionNewerThan1_21_2()) { AnvilView anvilView = event.getView(); renameText = anvilView.getRenameText(); maxRepairCost = anvilView.getMaximumRepairCost(); + previousCost = anvilView.getRepairCost(); } else { renameText = LegacyInventoryUtils.getRenameText(inventory); maxRepairCost = LegacyInventoryUtils.getMaxRepairCost(inventory); + previousCost = LegacyInventoryUtils.getRepairCost(inventory); } int repairCost = actualConsumedAmount; @@ -580,7 +580,6 @@ public class RecipeEventListener implements Listener { repairCost += 1; } else if (repairCost == 0) { hasResult = false; - System.out.println("1"); } } catch (ReflectiveOperationException e) { plugin.logger().warn("Failed to get hover name", e); @@ -595,12 +594,32 @@ public class RecipeEventListener implements Listener { int finalCost = repairCost + repairPenalty; + if (VersionHelper.isVersionNewerThan1_21()) { + AnvilView anvilView = event.getView(); + anvilView.setRepairCost(finalCost <= 1 ? 2 : finalCost - 1); + } else { + LegacyInventoryUtils.setRepairCost(inventory, finalCost <= 1 ? 2 : finalCost - 1); + } + + try { + if (VersionHelper.isVersionNewerThan1_21()) { + Object anvilMenu = Reflections.field$CraftInventoryView$container.get(event.getView()); + Reflections.method$AbstractContainerMenu$broadcastChanges.invoke(anvilMenu); + } else { + Object anvilMenu = Reflections.field$CraftInventoryAnvil$menu.get(inventory); + Reflections.method$AbstractContainerMenu$broadcastChanges.invoke(anvilMenu); + } + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to broadcast changes", e); + } + if (VersionHelper.isVersionNewerThan1_21()) { AnvilView anvilView = event.getView(); anvilView.setRepairCost(finalCost); anvilView.setRepairItemCountCost(actualConsumedAmount); } else { - LegacyInventoryUtils.setRepairCost(inventory, finalCost, actualRepairAmount); + LegacyInventoryUtils.setRepairCost(inventory, finalCost); + LegacyInventoryUtils.setRepairCostAmount(inventory, actualConsumedAmount); } Player player; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index afc934521..e3e61867c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -4728,6 +4728,12 @@ public class Reflections { ) ); + public static final Method method$AbstractContainerMenu$broadcastChanges = requireNonNull( + ReflectionUtils.getMethod( + clazz$AbstractContainerMenu, void.class, new String[]{ "broadcastChanges", "d" } + ) + ); + public static final Class clazz$CraftContainer = requireNonNull( ReflectionUtils.getClazz( BukkitReflectionUtils.assembleCBClass("inventory.CraftContainer") @@ -4892,4 +4898,33 @@ public class Reflections { clazz$CraftComplexRecipe, clazz$CustomRecipe, 0 ) ); + + public static final Class clazz$CraftInventoryAnvil = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftInventoryAnvil") + ) + ); + + public static final Class clazz$AnvilMenu = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.inventory.AnvilMenu"), + BukkitReflectionUtils.assembleMCClass("world.inventory.ContainerAnvil") + ) + ); + + // 1.21+ + public static final Class clazz$CraftInventoryView = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftInventoryView") + ); + + // 1.21+ + public static final Field field$CraftInventoryView$container = Optional.ofNullable(clazz$CraftInventoryView) + .map(it -> ReflectionUtils.getDeclaredField(it, 0)).orElse(null); + + // 1.20-1.20.6 + public static final Field field$CraftInventoryAnvil$menu = + ReflectionUtils.getDeclaredField( + clazz$CraftInventoryAnvil, clazz$AnvilMenu, 0 + ); } diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java index 64afc437f..7e3b108b6 100644 --- a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java @@ -10,10 +10,7 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.ScheduledTickAccess; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.BonemealableBlock; -import net.minecraft.world.level.block.Fallable; +import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.shapes.CollisionContext;