Fix EntityItemPickupEvent causing item dupe (#265)
This commit is contained in:
parent
e877d3a391
commit
c7a17ba31e
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user