Skip to content

Commit 55e12a1

Browse files
committed
Implement entity collision
1 parent 6318c0e commit 55e12a1

File tree

5 files changed

+63
-12
lines changed

5 files changed

+63
-12
lines changed

src/main/java/cn/nukkit/block/BlockMoving.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,9 @@ public boolean canBePushed() {
3131
public boolean isBreakable(Item item) {
3232
return false;
3333
}
34+
35+
@Override
36+
public boolean canPassThrough() {
37+
return true;
38+
}
3439
}

src/main/java/cn/nukkit/blockentity/BlockEntityMovingBlock.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import cn.nukkit.block.Block;
44
import cn.nukkit.block.BlockID;
5+
import cn.nukkit.entity.Entity;
56
import cn.nukkit.level.format.FullChunk;
7+
import cn.nukkit.math.AxisAlignedBB;
8+
import cn.nukkit.math.BlockFace;
69
import cn.nukkit.math.BlockVector3;
710
import cn.nukkit.nbt.tag.CompoundTag;
811

@@ -56,8 +59,18 @@ public String getMovingBlockString() {
5659
return this.blockString;
5760
}
5861

59-
public void moveCollidedEntities(BlockEntityPistonArm piston) {
62+
public void moveCollidedEntities(BlockEntityPistonArm piston, BlockFace moveDirection) {
63+
AxisAlignedBB bb = block.getBoundingBox().getOffsetBoundingBox(
64+
this.x + (piston.progress * moveDirection.getXOffset()) - moveDirection.getXOffset(),
65+
this.y + (piston.progress * moveDirection.getYOffset()) - moveDirection.getYOffset(),
66+
this.z + (piston.progress * moveDirection.getZOffset()) - moveDirection.getZOffset()
67+
);
6068

69+
Entity[] entities = this.level.getCollidingEntities(bb);
70+
71+
for (Entity entity : entities) {
72+
piston.moveEntity(entity, moveDirection);
73+
}
6174
}
6275

6376
@Override

src/main/java/cn/nukkit/blockentity/BlockEntityPistonArm.java

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package cn.nukkit.blockentity;
22

3+
import cn.nukkit.Player;
34
import cn.nukkit.block.Block;
45
import cn.nukkit.block.BlockAir;
56
import cn.nukkit.block.BlockID;
7+
import cn.nukkit.entity.Entity;
68
import cn.nukkit.level.Level;
79
import cn.nukkit.level.format.FullChunk;
10+
import cn.nukkit.math.AxisAlignedBB;
811
import cn.nukkit.math.BlockFace;
912
import cn.nukkit.math.BlockVector3;
13+
import cn.nukkit.math.SimpleAxisAlignedBB;
1014
import cn.nukkit.nbt.tag.CompoundTag;
1115
import cn.nukkit.nbt.tag.IntTag;
1216
import cn.nukkit.nbt.tag.ListTag;
@@ -82,24 +86,45 @@ protected void initBlockEntity() {
8286
}
8387

8488
private void moveCollidedEntities() {
85-
// float lastProgress = this.getExtendedProgress(this.lastProgress);
86-
// double x = (double) (lastProgress * (float) this.facing.getXOffset());
87-
// double y = (double) (lastProgress * (float) this.facing.getYOffset());
88-
// double z = (double) (lastProgress * (float) this.facing.getZOffset());
89-
// AxisAlignedBB bb = new SimpleAxisAlignedBB(x, y, z, x + 1.0D, y + 1.0D, z + 1.0D);
90-
// Entity[] entities = this.level.getCollidingEntities(bb);
91-
// if (entities.length != 0) {
92-
//
93-
// }
94-
9589
BlockFace pushDir = this.extending ? facing : facing.getOpposite();
9690
for (BlockVector3 pos : this.attachedBlocks) {
9791
BlockEntity blockEntity = this.level.getBlockEntity(pos.getSide(pushDir));
9892

9993
if (blockEntity instanceof BlockEntityMovingBlock) {
100-
((BlockEntityMovingBlock) blockEntity).moveCollidedEntities(this);
94+
((BlockEntityMovingBlock) blockEntity).moveCollidedEntities(this, pushDir);
10195
}
10296
}
97+
98+
AxisAlignedBB bb = new SimpleAxisAlignedBB(0, 0, 0, 1, 1, 1).getOffsetBoundingBox(
99+
this.x + (pushDir.getXOffset() * progress),
100+
this.y + (pushDir.getYOffset() * progress),
101+
this.z + (pushDir.getZOffset() * progress)
102+
);
103+
104+
Entity[] entities = this.level.getCollidingEntities(bb);
105+
106+
for (Entity entity : entities) {
107+
moveEntity(entity, pushDir);
108+
}
109+
}
110+
111+
void moveEntity(Entity entity, BlockFace moveDirection) {
112+
if (!entity.canBePushed()) {
113+
return;
114+
}
115+
116+
//TODO: event
117+
118+
if (entity instanceof Player) {
119+
return;
120+
}
121+
122+
float diff = this.progress - this.lastProgress;
123+
entity.move(
124+
diff * moveDirection.getXOffset(),
125+
diff * moveDirection.getYOffset(),
126+
diff * moveDirection.getZOffset()
127+
);
103128
}
104129

105130
public void move(boolean extending, List<BlockVector3> attachedBlocks) {

src/main/java/cn/nukkit/entity/Entity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,10 @@ public void setAbsorption(float absorption) {
14941494
}
14951495
}
14961496

1497+
public boolean canBePushed() {
1498+
return true;
1499+
}
1500+
14971501
public BlockFace getDirection() {
14981502
double rotation = this.yaw % 360;
14991503
if (rotation < 0) {

src/main/java/cn/nukkit/math/AxisAlignedBB.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ default AxisAlignedBB setBB(AxisAlignedBB bb) {
8787
return this;
8888
}
8989

90+
default AxisAlignedBB getOffsetBoundingBox(BlockFace face, double x, double y, double z) {
91+
return getOffsetBoundingBox(face.getXOffset() * x, face.getYOffset() * y, face.getZOffset() * z);
92+
}
93+
9094
default AxisAlignedBB getOffsetBoundingBox(double x, double y, double z) {
9195
return new SimpleAxisAlignedBB(this.getMinX() + x, this.getMinY() + y, this.getMinZ() + z, this.getMaxX() + x, this.getMaxY() + y, this.getMaxZ() + z);
9296
}

0 commit comments

Comments
 (0)