From c7a17ba31ed0f18821f04b090653276b99c55cfd Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 16 Apr 2022 18:36:11 +0800 Subject: [PATCH] Fix EntityItemPickupEvent causing item dupe (#265) --- .../world/entity/item/ItemEntityMixin.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/ItemEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/ItemEntityMixin.java index 253f6b47..f5d1af7f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/ItemEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/item/ItemEntityMixin.java @@ -69,48 +69,50 @@ public abstract class ItemEntityMixin extends EntityMixin { public void playerTouch(final Player entity) { if (!this.level.isClientSide) { if (this.pickupDelay > 0) return; - final ItemStack itemstack = this.getItem(); - final net.minecraft.world.item.Item item = itemstack.getItem(); - final int i = itemstack.getCount(); + ItemStack itemstack = this.getItem(); + int i = itemstack.getCount(); int hook = net.minecraftforge.event.ForgeEventFactory.onItemPickup((ItemEntity) (Object) this, entity); if (hook < 0) return; - ItemStack copy = itemstack.copy(); final int canHold = ((PlayerInventoryBridge) entity.getInventory()).bridge$canHold(itemstack); - final int remaining = i - canHold; - if (this.pickupDelay <= 0 && (hook == 1 || canHold > 0)) { - - copy.setCount(canHold); - ForgeEventFactory.firePlayerItemPickupEvent(entity, (ItemEntity) (Object) this, copy); - + final int remaining = itemstack.getCount() - canHold; + if (this.pickupDelay <= 0 && canHold > 0) { itemstack.setCount(canHold); final PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent(((ServerPlayerEntityBridge) entity).bridge$getBukkitEntity(), (Item) this.getBukkitEntity(), remaining); playerEvent.setCancelled(!((PlayerEntityBridge) entity).bridge$canPickUpLoot()); Bukkit.getPluginManager().callEvent(playerEvent); if (playerEvent.isCancelled()) { - itemstack.setCount(i); + itemstack.setCount(canHold + remaining); return; } final EntityPickupItemEvent entityEvent = new EntityPickupItemEvent(((LivingEntityBridge) entity).bridge$getBukkitEntity(), (Item) this.getBukkitEntity(), remaining); entityEvent.setCancelled(!((PlayerEntityBridge) entity).bridge$canPickUpLoot()); Bukkit.getPluginManager().callEvent(entityEvent); if (entityEvent.isCancelled()) { - itemstack.setCount(i); + itemstack.setCount(canHold + remaining); return; } - itemstack.setCount(canHold + remaining); + ItemStack current = this.getItem(); + if (!itemstack.equals(current)) { + itemstack = current; + } else { + itemstack.setCount(canHold + remaining); + } this.pickupDelay = 0; - } else if (this.pickupDelay == 0) { + } else if (this.pickupDelay == 0 && hook != 1) { this.pickupDelay = -1; } - if (this.pickupDelay == 0 && (this.owner == null /*|| 6000 - this.age <= 200*/ || this.owner.equals(entity.getUUID())) && entity.getInventory().add(itemstack)) { + ItemStack copy = itemstack.copy(); + if (this.pickupDelay == 0 && (this.owner == null /*|| 6000 - this.age <= 200*/ || this.owner.equals(entity.getUUID())) && (hook == 1 || entity.getInventory().add(itemstack))) { + copy.setCount(copy.getCount() - itemstack.getCount()); + ForgeEventFactory.firePlayerItemPickupEvent(entity, (ItemEntity) (Object) this, copy); entity.take((ItemEntity) (Object) this, i); if (itemstack.isEmpty()) { this.discard(); itemstack.setCount(i); } - entity.awardStat(Stats.ITEM_PICKED_UP.get(item), i); + entity.awardStat(Stats.ITEM_PICKED_UP.get(itemstack.getItem()), i); entity.onItemPickup((ItemEntity) (Object) this); } }