From 55e12a1dbecb070619e6b19c0f406f54546989a2 Mon Sep 17 00:00:00 2001 From: CreeperFace Date: Sun, 13 Oct 2019 09:57:30 +0200 Subject: [PATCH] Implement entity collision --- .../java/cn/nukkit/block/BlockMoving.java | 5 ++ .../blockentity/BlockEntityMovingBlock.java | 15 +++++- .../blockentity/BlockEntityPistonArm.java | 47 ++++++++++++++----- src/main/java/cn/nukkit/entity/Entity.java | 4 ++ .../java/cn/nukkit/math/AxisAlignedBB.java | 4 ++ 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/main/java/cn/nukkit/block/BlockMoving.java b/src/main/java/cn/nukkit/block/BlockMoving.java index c693449632b..8b385b6a91c 100644 --- a/src/main/java/cn/nukkit/block/BlockMoving.java +++ b/src/main/java/cn/nukkit/block/BlockMoving.java @@ -31,4 +31,9 @@ public boolean canBePushed() { public boolean isBreakable(Item item) { return false; } + + @Override + public boolean canPassThrough() { + return true; + } } diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java b/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java index eec12f3412f..998688784a3 100644 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java +++ b/src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java @@ -2,7 +2,10 @@ import cn.nukkit.block.Block; import cn.nukkit.block.BlockID; +import cn.nukkit.entity.Entity; import cn.nukkit.level.format.FullChunk; +import cn.nukkit.math.AxisAlignedBB; +import cn.nukkit.math.BlockFace; import cn.nukkit.math.BlockVector3; import cn.nukkit.nbt.tag.CompoundTag; @@ -56,8 +59,18 @@ public String getMovingBlockString() { return this.blockString; } - public void moveCollidedEntities(BlockEntityPistonArm piston) { + public void moveCollidedEntities(BlockEntityPistonArm piston, BlockFace moveDirection) { + AxisAlignedBB bb = block.getBoundingBox().getOffsetBoundingBox( + this.x + (piston.progress * moveDirection.getXOffset()) - moveDirection.getXOffset(), + this.y + (piston.progress * moveDirection.getYOffset()) - moveDirection.getYOffset(), + this.z + (piston.progress * moveDirection.getZOffset()) - moveDirection.getZOffset() + ); + Entity[] entities = this.level.getCollidingEntities(bb); + + for (Entity entity : entities) { + piston.moveEntity(entity, moveDirection); + } } @Override diff --git a/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java b/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java index 02f52659d6b..ffc0bcb3663 100644 --- a/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java +++ b/src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java @@ -1,12 +1,16 @@ package cn.nukkit.blockentity; +import cn.nukkit.Player; import cn.nukkit.block.Block; import cn.nukkit.block.BlockAir; import cn.nukkit.block.BlockID; +import cn.nukkit.entity.Entity; import cn.nukkit.level.Level; import cn.nukkit.level.format.FullChunk; +import cn.nukkit.math.AxisAlignedBB; import cn.nukkit.math.BlockFace; import cn.nukkit.math.BlockVector3; +import cn.nukkit.math.SimpleAxisAlignedBB; import cn.nukkit.nbt.tag.CompoundTag; import cn.nukkit.nbt.tag.IntTag; import cn.nukkit.nbt.tag.ListTag; @@ -82,24 +86,45 @@ protected void initBlockEntity() { } private void moveCollidedEntities() { -// float lastProgress = this.getExtendedProgress(this.lastProgress); -// double x = (double) (lastProgress * (float) this.facing.getXOffset()); -// double y = (double) (lastProgress * (float) this.facing.getYOffset()); -// double z = (double) (lastProgress * (float) this.facing.getZOffset()); -// AxisAlignedBB bb = new SimpleAxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D); -// Entity[] entities = this.level.getCollidingEntities(bb); -// if (entities.length != 0) { -// -// } - BlockFace pushDir = this.extending ? facing : facing.getOpposite(); for (BlockVector3 pos : this.attachedBlocks) { BlockEntity blockEntity = this.level.getBlockEntity(pos.getSide(pushDir)); if (blockEntity instanceof BlockEntityMovingBlock) { - ((BlockEntityMovingBlock) blockEntity).moveCollidedEntities(this); + ((BlockEntityMovingBlock) blockEntity).moveCollidedEntities(this, pushDir); } } + + AxisAlignedBB bb = new SimpleAxisAlignedBB(0, 0, 0, 1, 1, 1).getOffsetBoundingBox( + this.x + (pushDir.getXOffset() * progress), + this.y + (pushDir.getYOffset() * progress), + this.z + (pushDir.getZOffset() * progress) + ); + + Entity[] entities = this.level.getCollidingEntities(bb); + + for (Entity entity : entities) { + moveEntity(entity, pushDir); + } + } + + void moveEntity(Entity entity, BlockFace moveDirection) { + if (!entity.canBePushed()) { + return; + } + + //TODO: event + + if (entity instanceof Player) { + return; + } + + float diff = this.progress - this.lastProgress; + entity.move( + diff * moveDirection.getXOffset(), + diff * moveDirection.getYOffset(), + diff * moveDirection.getZOffset() + ); } public void move(boolean extending, List attachedBlocks) { diff --git a/src/main/java/cn/nukkit/entity/Entity.java b/src/main/java/cn/nukkit/entity/Entity.java index cd5f5d595c3..4b98082adc2 100644 --- a/src/main/java/cn/nukkit/entity/Entity.java +++ b/src/main/java/cn/nukkit/entity/Entity.java @@ -1494,6 +1494,10 @@ public void setAbsorption(float absorption) { } } + public boolean canBePushed() { + return true; + } + public BlockFace getDirection() { double rotation = this.yaw % 360; if (rotation < 0) { diff --git a/src/main/java/cn/nukkit/math/AxisAlignedBB.java b/src/main/java/cn/nukkit/math/AxisAlignedBB.java index 640c07a3991..792afbbd7ff 100644 --- a/src/main/java/cn/nukkit/math/AxisAlignedBB.java +++ b/src/main/java/cn/nukkit/math/AxisAlignedBB.java @@ -87,6 +87,10 @@ default AxisAlignedBB setBB(AxisAlignedBB bb) { return this; } + default AxisAlignedBB getOffsetBoundingBox(BlockFace face, double x, double y, double z) { + return getOffsetBoundingBox(face.getXOffset() * x, face.getYOffset() * y, face.getZOffset() * z); + } + default AxisAlignedBB getOffsetBoundingBox(double x, double y, double z) { return new SimpleAxisAlignedBB(this.getMinX() + x, this.getMinY() + y, this.getMinZ() + z, this.getMaxX() + x, this.getMaxY() + y, this.getMaxZ() + z); }