9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 12:29:15 +00:00

添加物品更新器

This commit is contained in:
XiaoMoMi
2025-08-17 22:44:12 +08:00
parent 69b9b164c9
commit b7586310f9
26 changed files with 492 additions and 12 deletions

View File

@@ -5,6 +5,7 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.core.item.*;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.item.updater.ItemUpdateConfig;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
import net.momirealms.craftengine.core.plugin.context.function.Function;
@@ -25,8 +26,9 @@ public class BukkitCustomItem extends AbstractCustomItem<ItemStack> {
List<ItemBehavior> behaviors,
List<ItemDataModifier<ItemStack>> modifiers, List<ItemDataModifier<ItemStack>> clientBoundModifiers,
ItemSettings settings,
Map<EventTrigger, List<Function<PlayerOptionalContext>>> events) {
super(isVanillaItem, id, materialKey, clientBoundMaterialKey, behaviors, modifiers, clientBoundModifiers, settings, events);
Map<EventTrigger, List<Function<PlayerOptionalContext>>> events,
ItemUpdateConfig updater) {
super(isVanillaItem, id, materialKey, clientBoundMaterialKey, behaviors, modifiers, clientBoundModifiers, settings, events, updater);
this.item = item;
this.clientItem = clientItem;
}
@@ -75,6 +77,7 @@ public class BukkitCustomItem extends AbstractCustomItem<ItemStack> {
private final List<ItemDataModifier<ItemStack>> modifiers = new ArrayList<>(4);
private final List<ItemDataModifier<ItemStack>> clientBoundModifiers = new ArrayList<>(4);
private ItemSettings settings;
private ItemUpdateConfig updater;
public BuilderImpl(Object item, Object clientBoundItem) {
this.item = item;
@@ -153,12 +156,18 @@ public class BukkitCustomItem extends AbstractCustomItem<ItemStack> {
return this;
}
@Override
public Builder<ItemStack> updater(ItemUpdateConfig updater) {
this.updater = updater;
return this;
}
@Override
public CustomItem<ItemStack> build() {
this.modifiers.addAll(this.settings.modifiers());
this.clientBoundModifiers.addAll(this.settings.clientBoundModifiers());
return new BukkitCustomItem(this.isVanillaItem, this.id, this.item, this.clientBoundItem, this.itemKey, this.clientBoundItemKey, List.copyOf(this.behaviors),
List.copyOf(this.modifiers), List.copyOf(this.clientBoundModifiers), this.settings, this.events);
List.copyOf(this.modifiers), List.copyOf(this.clientBoundModifiers), this.settings, this.events, updater);
}
}
}

View File

@@ -62,7 +62,7 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
instance = this;
this.plugin = plugin;
this.factory = BukkitItemFactory.create(plugin);
this.itemEventListener = new ItemEventListener(plugin);
this.itemEventListener = new ItemEventListener(plugin, this);
this.debugStickListener = new DebugStickListener(plugin);
this.armorEventListener = new ArmorEventListener();
this.networkItemHandler = VersionHelper.isOrAbove1_20_5() ? new ModernNetworkItemHandler() : new LegacyNetworkItemHandler();

View File

@@ -4,6 +4,7 @@ import io.papermc.paper.event.block.CompostItemEvent;
import net.momirealms.craftengine.bukkit.api.BukkitAdaptors;
import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent;
import net.momirealms.craftengine.bukkit.item.BukkitCustomItem;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
@@ -17,9 +18,11 @@ import net.momirealms.craftengine.core.entity.player.InteractionHand;
import net.momirealms.craftengine.core.entity.player.InteractionResult;
import net.momirealms.craftengine.core.item.CustomItem;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.context.UseOnContext;
import net.momirealms.craftengine.core.item.setting.FoodData;
import net.momirealms.craftengine.core.item.updater.ItemUpdateResult;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
@@ -45,13 +48,16 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.inventory.EnchantingInventory;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
@@ -61,9 +67,11 @@ import java.util.Optional;
public class ItemEventListener implements Listener {
private final BukkitCraftEngine plugin;
private final BukkitItemManager itemManager;
public ItemEventListener(BukkitCraftEngine plugin) {
public ItemEventListener(BukkitCraftEngine plugin, BukkitItemManager itemManager) {
this.plugin = plugin;
this.itemManager = itemManager;
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
@@ -534,4 +542,50 @@ public class ItemEventListener implements Listener {
serverPlayer.sendPackets(packets, false);
});
}
/*
关于物品更新器
*/
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH)
public void onDropItem(PlayerDropItemEvent event) {
if (!Config.triggerUpdateDrop()) return;
org.bukkit.entity.Item itemDrop = event.getItemDrop();
ItemStack itemStack = itemDrop.getItemStack();
Item<ItemStack> wrapped = this.itemManager.wrap(itemStack);
ItemUpdateResult result = this.itemManager.updateItem(wrapped, () -> ItemBuildContext.of(BukkitAdaptors.adapt(event.getPlayer())));
if (result.updated()) {
itemDrop.setItemStack((ItemStack) result.finalItem().getItem());
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH)
public void onPickUpItem(EntityPickupItemEvent event) {
if (!Config.triggerUpdatePickUp()) return;
if (!(event.getEntity() instanceof Player player)) return;
org.bukkit.entity.Item itemDrop = event.getItem();
ItemStack itemStack = itemDrop.getItemStack();
Item<ItemStack> wrapped = this.itemManager.wrap(itemStack);
ItemUpdateResult result = this.itemManager.updateItem(wrapped, () -> ItemBuildContext.of(BukkitAdaptors.adapt(player)));
if (result.updated()) {
itemDrop.setItemStack((ItemStack) result.finalItem().getItem());
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOW)
public void onInventoryClickItem(InventoryClickEvent event) {
if (!Config.triggerUpdateClick()) return;
if (!(event.getWhoClicked() instanceof Player player)) return;
Inventory clickedInventory = event.getClickedInventory();
// 点击自己物品栏里的物品
if (clickedInventory == null || clickedInventory != player.getInventory()) return;
ItemStack currentItem = event.getCurrentItem();
Item<ItemStack> wrapped = this.itemManager.wrap(currentItem);
ItemUpdateResult result = this.itemManager.updateItem(wrapped, () -> ItemBuildContext.of(BukkitAdaptors.adapt(player)));
if (!result.updated() || !result.replaced()) {
return;
}
event.setCurrentItem((ItemStack) result.finalItem().getItem());
}
}