Fix EntityItemPickupEvent causing item dupe (#265)

This commit is contained in:
IzzelAliz 2022-04-16 18:36:11 +08:00
parent e877d3a391
commit c7a17ba31e
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338

View File

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