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