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) {
|
public void playerTouch(final Player entity) {
|
||||||
if (!this.level.isClientSide) {
|
if (!this.level.isClientSide) {
|
||||||
if (this.pickupDelay > 0) return;
|
if (this.pickupDelay > 0) return;
|
||||||
final ItemStack itemstack = this.getItem();
|
ItemStack itemstack = this.getItem();
|
||||||
final net.minecraft.world.item.Item item = itemstack.getItem();
|
int i = itemstack.getCount();
|
||||||
final int i = itemstack.getCount();
|
|
||||||
|
|
||||||
int hook = net.minecraftforge.event.ForgeEventFactory.onItemPickup((ItemEntity) (Object) this, entity);
|
int hook = net.minecraftforge.event.ForgeEventFactory.onItemPickup((ItemEntity) (Object) this, entity);
|
||||||
if (hook < 0) return;
|
if (hook < 0) return;
|
||||||
ItemStack copy = itemstack.copy();
|
|
||||||
|
|
||||||
final int canHold = ((PlayerInventoryBridge) entity.getInventory()).bridge$canHold(itemstack);
|
final int canHold = ((PlayerInventoryBridge) entity.getInventory()).bridge$canHold(itemstack);
|
||||||
final int remaining = i - canHold;
|
final int remaining = itemstack.getCount() - canHold;
|
||||||
if (this.pickupDelay <= 0 && (hook == 1 || canHold > 0)) {
|
if (this.pickupDelay <= 0 && canHold > 0) {
|
||||||
|
|
||||||
copy.setCount(canHold);
|
|
||||||
ForgeEventFactory.firePlayerItemPickupEvent(entity, (ItemEntity) (Object) this, copy);
|
|
||||||
|
|
||||||
itemstack.setCount(canHold);
|
itemstack.setCount(canHold);
|
||||||
final PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent(((ServerPlayerEntityBridge) entity).bridge$getBukkitEntity(), (Item) this.getBukkitEntity(), remaining);
|
final PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent(((ServerPlayerEntityBridge) entity).bridge$getBukkitEntity(), (Item) this.getBukkitEntity(), remaining);
|
||||||
playerEvent.setCancelled(!((PlayerEntityBridge) entity).bridge$canPickUpLoot());
|
playerEvent.setCancelled(!((PlayerEntityBridge) entity).bridge$canPickUpLoot());
|
||||||
Bukkit.getPluginManager().callEvent(playerEvent);
|
Bukkit.getPluginManager().callEvent(playerEvent);
|
||||||
if (playerEvent.isCancelled()) {
|
if (playerEvent.isCancelled()) {
|
||||||
itemstack.setCount(i);
|
itemstack.setCount(canHold + remaining);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final EntityPickupItemEvent entityEvent = new EntityPickupItemEvent(((LivingEntityBridge) entity).bridge$getBukkitEntity(), (Item) this.getBukkitEntity(), remaining);
|
final EntityPickupItemEvent entityEvent = new EntityPickupItemEvent(((LivingEntityBridge) entity).bridge$getBukkitEntity(), (Item) this.getBukkitEntity(), remaining);
|
||||||
entityEvent.setCancelled(!((PlayerEntityBridge) entity).bridge$canPickUpLoot());
|
entityEvent.setCancelled(!((PlayerEntityBridge) entity).bridge$canPickUpLoot());
|
||||||
Bukkit.getPluginManager().callEvent(entityEvent);
|
Bukkit.getPluginManager().callEvent(entityEvent);
|
||||||
if (entityEvent.isCancelled()) {
|
if (entityEvent.isCancelled()) {
|
||||||
itemstack.setCount(i);
|
itemstack.setCount(canHold + remaining);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
ItemStack current = this.getItem();
|
||||||
|
if (!itemstack.equals(current)) {
|
||||||
|
itemstack = current;
|
||||||
|
} else {
|
||||||
itemstack.setCount(canHold + remaining);
|
itemstack.setCount(canHold + remaining);
|
||||||
|
}
|
||||||
this.pickupDelay = 0;
|
this.pickupDelay = 0;
|
||||||
} else if (this.pickupDelay == 0) {
|
} else if (this.pickupDelay == 0 && hook != 1) {
|
||||||
this.pickupDelay = -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);
|
entity.take((ItemEntity) (Object) this, i);
|
||||||
if (itemstack.isEmpty()) {
|
if (itemstack.isEmpty()) {
|
||||||
this.discard();
|
this.discard();
|
||||||
itemstack.setCount(i);
|
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);
|
entity.onItemPickup((ItemEntity) (Object) this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user