diff --git a/src/main/java/net/minestom/server/entity/LivingEntity.java b/src/main/java/net/minestom/server/entity/LivingEntity.java index 89efb51ee..231ffdb4c 100644 --- a/src/main/java/net/minestom/server/entity/LivingEntity.java +++ b/src/main/java/net/minestom/server/entity/LivingEntity.java @@ -203,7 +203,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { // Items picking if (canPickupItem() && itemPickupCooldown.isReady(time)) { itemPickupCooldown.refreshLastUpdate(time); - final Point loweredPosition = position.sub(0, -.5, 0); + final Point loweredPosition = position.sub(0, .5, 0); this.instance.getEntityTracker().nearbyEntities(position, expandedBoundingBox.width(), EntityTracker.Target.ITEMS, itemEntity -> { if (this instanceof Player player && !itemEntity.isViewer(player)) return; diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 510b9e2d9..bee7edc69 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -333,7 +333,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // Experience orb pickup if (experiencePickupCooldown.isReady(time)) { experiencePickupCooldown.refreshLastUpdate(time); - final Point loweredPosition = position.sub(0, -.5, 0); + final Point loweredPosition = position.sub(0, .5, 0); this.instance.getEntityTracker().nearbyEntities(position, expandedBoundingBox.width(), EntityTracker.Target.EXPERIENCE_ORBS, experienceOrb -> { if (expandedBoundingBox.intersectEntity(loweredPosition, experienceOrb)) { diff --git a/src/test/java/net/minestom/server/entity/EntityBoundingBoxIntegrationTest.java b/src/test/java/net/minestom/server/entity/EntityBoundingBoxIntegrationTest.java index 4ea6551a5..0906a6f88 100644 --- a/src/test/java/net/minestom/server/entity/EntityBoundingBoxIntegrationTest.java +++ b/src/test/java/net/minestom/server/entity/EntityBoundingBoxIntegrationTest.java @@ -4,6 +4,10 @@ import net.minestom.server.api.Env; import net.minestom.server.api.EnvTest; import net.minestom.server.collision.BoundingBox; import net.minestom.server.coordinate.Pos; +import net.minestom.server.event.item.PickupItemEvent; +import net.minestom.server.instance.Instance; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -48,4 +52,31 @@ public class EntityBoundingBoxIntegrationTest { player.setPose(Entity.Pose.FALL_FLYING); assertEquals(0.4, player.getEyeHeight()); } + + @Test + public void pickupItem(Env env) { + final var instance = env.createFlatInstance(); + final var listener = env.listen(PickupItemEvent.class); + final var spawnPos = new Pos(0, 42, 0); + final var entity = new LivingEntity(EntityType.ZOMBIE); + entity.setCanPickupItem(true); + entity.setInstance(instance, spawnPos).join(); + + var time = System.currentTimeMillis(); + + dropItem(instance, spawnPos); + listener.followup(); + entity.update(time += 1_000L); + + dropItem(instance, spawnPos.sub(.5)); + listener.followup(); + entity.update(time += 1_000L); + } + + private void dropItem(final Instance instance, final Pos position) { + final var entity = new ItemEntity(ItemStack.of(Material.STONE)); + entity.hasPhysics = false; + entity.setNoGravity(true); + entity.setInstance(instance, position).join(); + } }