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

添加捡起物品触发器

This commit is contained in:
XiaoMoMi
2025-10-18 19:08:27 +08:00
parent db8fbe9907
commit 6ff1035331
10 changed files with 75 additions and 5 deletions

View File

@@ -103,4 +103,9 @@ public class BukkitEntity extends AbstractEntity {
public <T> void setEntityData(EntityData<T> data, T value, boolean force) {
FastNMS.INSTANCE.method$SynchedEntityData$set(entityData(), data.entityDataAccessor(), value, force);
}
@Override
public void remove() {
this.platformEntity().remove();
}
}

View File

@@ -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<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());
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
if (optionalCustomItem.isEmpty()) return;
BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
CustomItem<ItemStack> 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;
}
}