9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-23 00:49:20 +00:00

阻止低版本将自定义物品放到马上

This commit is contained in:
XiaoMoMi
2025-05-12 00:28:32 +08:00
parent 1b8dabb9e9
commit fb1d3ed42f
5 changed files with 113 additions and 3 deletions

View File

@@ -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<ItemStack> {
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<ItemStack> {
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<ItemStack> {
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<ItemStack> {
this.unload();
HandlerList.unregisterAll(this.itemEventListener);
HandlerList.unregisterAll(this.debugStickListener);
HandlerList.unregisterAll(this.armorEventListener);
}
@Override

View File

@@ -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<Integer, ItemStack> item : event.getNewItems().entrySet()) {
if (item.getKey() == 0 || item.getKey() == 1) {
if (!ItemUtils.isEmpty(item.getValue()) && CraftEngineItems.isCustomItem(item.getValue())) {
event.setCancelled(true);
return;
}
}
}
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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