diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java index 667fbf44c..469c9f155 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/BukkitEntity.java @@ -103,4 +103,9 @@ public class BukkitEntity extends AbstractEntity { public void setEntityData(EntityData data, T value, boolean force) { FastNMS.INSTANCE.method$SynchedEntityData$set(entityData(), data.entityDataAccessor(), value, force); } + + @Override + public void remove() { + this.platformEntity().remove(); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index e1905ab2c..5052d3700 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -576,16 +576,31 @@ public class ItemEventListener implements Listener { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) 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 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()); + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isEmpty()) return; + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + CustomItem customItem = optionalCustomItem.get(); + if (Config.triggerUpdatePickUp() && customItem.updater().isPresent()) { + ItemUpdateResult result = this.itemManager.updateItem(wrapped, () -> ItemBuildContext.of(serverPlayer)); + if (result.updated()) { + itemDrop.setItemStack((ItemStack) result.finalItem().getItem()); + } + } + Cancellable dummy = Cancellable.dummy(); + customItem.execute(PlayerOptionalContext.of(serverPlayer, ContextHolder.builder() + .withParameter(DirectContextParameters.ENTITY, new BukkitEntity(itemDrop)) + .withParameter(DirectContextParameters.POSITION, LocationUtils.toWorldPosition(itemDrop.getLocation())) + .withParameter(DirectContextParameters.EVENT, dummy) + ), EventTrigger.PICK_UP); + if (dummy.isCancelled()) { + event.setCancelled(true); + return; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java index ba2a81d73..5c52db4e2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -48,4 +48,6 @@ public interface Entity { } void setEntityData(EntityData data, T value, boolean force); + + void remove(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 8b8d804d0..35bcb6305 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -180,4 +180,8 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract Locale selectedLocale(); public abstract void setSelectedLocale(@Nullable Locale locale); + + @Override + public void remove() { + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java index bd3e5230c..4646eeb92 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java @@ -47,6 +47,7 @@ public class EventFunctions { register(CommonFunctions.TOAST, new ToastFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.DAMAGE, new DamageFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.MERCHANT_TRADE, new MerchantTradeFunction.FactoryImpl<>(EventConditions::fromMap)); + register(CommonFunctions.REMOVE_ENTITY, new RemoveEntityFunction.FactoryImpl<>(EventConditions::fromMap)); } public static void register(Key key, FunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventTrigger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventTrigger.java index 7e5f3c882..2a29e7fd9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventTrigger.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventTrigger.java @@ -10,6 +10,7 @@ public enum EventTrigger { CONSUME("eat", "consume", "drink"), BREAK("break", "dig"), PLACE("place", "build"), + PICK_UP("pick_up", "pick"), STEP("step"),; public static final Map BY_NAME = new HashMap<>(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java index e54ece3ea..ce9dff89a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -36,4 +36,5 @@ public final class CommonFunctions { public static final Key SET_VARIABLE = Key.of("craftengine:set_variable"); public static final Key DAMAGE = Key.of("craftengine:damage"); public static final Key MERCHANT_TRADE = Key.of("craftengine:merchant_trade"); + public static final Key REMOVE_ENTITY = Key.of("craftengine:remove_entity"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveEntityFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveEntityFunction.java new file mode 100644 index 000000000..7bc203203 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveEntityFunction.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class RemoveEntityFunction extends AbstractConditionalFunction { + + public RemoveEntityFunction(List> predicates) { + super(predicates); + } + + @Override + public void runInternal(CTX ctx) { + ctx.getOptionalParameter(DirectContextParameters.ENTITY).ifPresent(Entity::remove); + } + + @Override + public Key type() { + return CommonFunctions.REMOVE_ENTITY; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + return new RemoveEntityFunction<>(getPredicates(arguments)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java index a3d0b5335..d2389c8df 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/DirectContextParameters.java @@ -65,4 +65,5 @@ public final class DirectContextParameters { public static final ContextKey IS_CUSTOM = ContextKey.direct("is_custom"); public static final ContextKey IS_BLOCK_ITEM = ContextKey.direct("is_block_item"); public static final ContextKey GAMEMODE = ContextKey.direct("gamemode"); + public static final ContextKey COUNT = ContextKey.direct("count"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java index f9d4617f6..dd1d0126f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/parameter/ItemParameterProvider.java @@ -15,6 +15,7 @@ public class ItemParameterProvider implements ChainParameterProvider> { CONTEXT_FUNCTIONS.put(DirectContextParameters.ID, Item::id); CONTEXT_FUNCTIONS.put(DirectContextParameters.CUSTOM_MODEL_DATA, i -> i.customModelData().orElse(null)); CONTEXT_FUNCTIONS.put(DirectContextParameters.IS_CUSTOM, Item::isCustomItem); + CONTEXT_FUNCTIONS.put(DirectContextParameters.COUNT, Item::count); CONTEXT_FUNCTIONS.put(DirectContextParameters.IS_BLOCK_ITEM, Item::isBlockItem); }