From fb1d3ed42f6e36d8a03e1689794536f56e80970a Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 12 May 2025 00:28:32 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=BB=E6=AD=A2=E4=BD=8E=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=B0=86=E8=87=AA=E5=AE=9A=E4=B9=89=E7=89=A9=E5=93=81=E6=94=BE?= =?UTF-8?q?=E5=88=B0=E9=A9=AC=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitItemManager.java | 7 ++ .../item/listener/ArmorEventListener.java | 102 ++++++++++++++++++ .../{ => listener}/DebugStickListener.java | 3 +- .../{ => listener}/ItemEventListener.java | 2 +- gradle.properties | 2 +- 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ArmorEventListener.java rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/{ => listener}/DebugStickListener.java (98%) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/{ => listener}/ItemEventListener.java (99%) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 6433d7fd0..89798dd29 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -6,6 +6,9 @@ import net.momirealms.craftengine.bukkit.item.behavior.BoneMealItemBehavior; import net.momirealms.craftengine.bukkit.item.behavior.BucketItemBehavior; import net.momirealms.craftengine.bukkit.item.behavior.WaterBucketItemBehavior; import net.momirealms.craftengine.bukkit.item.factory.BukkitItemFactory; +import net.momirealms.craftengine.bukkit.item.listener.ArmorEventListener; +import net.momirealms.craftengine.bukkit.item.listener.DebugStickListener; +import net.momirealms.craftengine.bukkit.item.listener.ItemEventListener; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.ItemUtils; @@ -63,6 +66,7 @@ public class BukkitItemManager extends AbstractItemManager { private final BukkitCraftEngine plugin; private final ItemEventListener itemEventListener; private final DebugStickListener debugStickListener; + private final ArmorEventListener armorEventListener; private final ItemParser itemParser; public BukkitItemManager(BukkitCraftEngine plugin) { @@ -72,6 +76,7 @@ public class BukkitItemManager extends AbstractItemManager { this.factory = BukkitItemFactory.create(plugin); this.itemEventListener = new ItemEventListener(plugin); this.debugStickListener = new DebugStickListener(plugin); + this.armorEventListener = new ArmorEventListener(); this.itemParser = new ItemParser(); this.registerAllVanillaItems(); if (plugin.hasMod()) { @@ -130,6 +135,7 @@ public class BukkitItemManager extends AbstractItemManager { public void delayedInit() { Bukkit.getPluginManager().registerEvents(this.itemEventListener, this.plugin.bootstrap()); Bukkit.getPluginManager().registerEvents(this.debugStickListener, this.plugin.bootstrap()); + Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.bootstrap()); } public static BukkitItemManager instance() { @@ -162,6 +168,7 @@ public class BukkitItemManager extends AbstractItemManager { this.unload(); HandlerList.unregisterAll(this.itemEventListener); HandlerList.unregisterAll(this.debugStickListener); + HandlerList.unregisterAll(this.armorEventListener); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ArmorEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ArmorEventListener.java new file mode 100644 index 000000000..0b748e981 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ArmorEventListener.java @@ -0,0 +1,102 @@ +package net.momirealms.craftengine.bukkit.item.listener; + +import net.momirealms.craftengine.bukkit.api.CraftEngineItems; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Material; +import org.bukkit.entity.Horse; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.HorseInventory; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; + +public class ArmorEventListener implements Listener { + + // 只有在没有equippable组件的版本才生效,阻止自定义物品放到马上 + // 低版本没有自定义盔甲,所以完全不需要考虑能放置上去的情况 + @EventHandler(ignoreCancelled = true) + public void onInteractHorse(PlayerInteractEntityEvent event) { + if (VersionHelper.isOrAbove1_21_2()) return; + if (event.getRightClicked() instanceof Horse horse) { + ItemStack itemInHand = event.getPlayer().getInventory().getItem(event.getHand()); + if (horse.getInventory().getArmor() == null) { + switch (itemInHand.getType()) { + case LEATHER_HORSE_ARMOR, IRON_HORSE_ARMOR, GOLDEN_HORSE_ARMOR, DIAMOND_HORSE_ARMOR -> { + if (CraftEngineItems.isCustomItem(itemInHand)) { + event.setCancelled(true); + } + } + } + } else if (horse.getInventory().getSaddle() == null) { + if (itemInHand.getType() == Material.SADDLE) { + if (CraftEngineItems.isCustomItem(itemInHand)) { + event.setCancelled(true); + } + } + } + } + } + + // 处理低版本的马物品栏 + @EventHandler(ignoreCancelled = true) + public void onMoveItemInHorseInventory(InventoryClickEvent event) { + if (VersionHelper.isOrAbove1_21_2()) return; + if (!(event.getInventory() instanceof HorseInventory horseInventory)) { + return; + } + if (event.getClickedInventory() == event.getWhoClicked().getInventory()) { + ItemStack currentItem = event.getCurrentItem(); + if (event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) { + if (currentItem != null && CraftEngineItems.isCustomItem(currentItem)) { + event.setCancelled(true); + } + } + } else if (event.getClickedInventory() == horseInventory) { + ItemStack itemInCursor = event.getCursor(); + if (event.getAction() == InventoryAction.SWAP_WITH_CURSOR || event.getAction() == InventoryAction.PLACE_ALL || event.getAction() == InventoryAction.PLACE_ONE) { + if (!ItemUtils.isEmpty(itemInCursor) && CraftEngineItems.isCustomItem(itemInCursor)) { + event.setCancelled(true); + return; + } + } + if (event.getAction() == InventoryAction.HOTBAR_SWAP) { + int slot = event.getHotbarButton(); + if (slot != -1) { + ItemStack itemInHotBar = event.getWhoClicked().getInventory().getItem(slot); + if (!ItemUtils.isEmpty(itemInHotBar) && CraftEngineItems.isCustomItem(itemInHotBar)) { + event.setCancelled(true); + return; + } + } else { + ItemStack offHand = event.getWhoClicked().getInventory().getItemInOffHand(); + if (!ItemUtils.isEmpty(offHand) && CraftEngineItems.isCustomItem(offHand)) { + event.setCancelled(true); + return; + } + } + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onMoveItemInHorseInventory(InventoryDragEvent event) { + if (VersionHelper.isOrAbove1_21_2()) return; + if (!(event.getInventory() instanceof HorseInventory horseInventory)) { + return; + } + for (Map.Entry item : event.getNewItems().entrySet()) { + if (item.getKey() == 0 || item.getKey() == 1) { + if (!ItemUtils.isEmpty(item.getValue()) && CraftEngineItems.isCustomItem(item.getValue())) { + event.setCancelled(true); + return; + } + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/DebugStickListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java similarity index 98% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/DebugStickListener.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java index af5bbd4fd..ff87989ed 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/DebugStickListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java @@ -1,8 +1,9 @@ -package net.momirealms.craftengine.bukkit.item; +package net.momirealms.craftengine.bukkit.item.listener; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java similarity index 99% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index bc5e9772f..18d04e54c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.item; +package net.momirealms.craftengine.bukkit.item.listener; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/gradle.properties b/gradle.properties index 313e0850e..7287d641c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53.5 +project_version=0.0.53.6 config_version=32 lang_version=12 project_group=net.momirealms