我在服务器上有一个事件,当海绵被放置时,它会替换它通往空气的路径中的任何周围的水块。
public static void spongePlace(EntityPlaceEvent event) {
Entity entity = event.getEntity();
Level level = entity.level;
if(level.isClientSide())
return;
BlockState sponge = event.getState();
if(sponge != Blocks.SPONGE.defaultBlockState())
return;
BlockPos spongePos = event.getPos();
int spongePosY = spongePos.getY();
List<BlockPos> pos = new ArrayList<BlockPos>();
pos.add(spongePos);
List<BlockPos> pos2 = new ArrayList<BlockPos>();
while(pos.size()!=0) {
for(int i=0;i<pos.size();i++) {
BlockPos curPos = pos.get(i);
int xBP = curPos.getX();
int zBP = curPos.getZ();
level.setBlock(curPos, Blocks.AIR.defaultBlockState(), 2);
BlockPos BP1 = new BlockPos(xBP+1, spongePosY, zBP);
BlockPos BP2 = new BlockPos(xBP-1, spongePosY, zBP);
BlockPos BP3 = new BlockPos(xBP, spongePosY, zBP+1);
BlockPos BP4 = new BlockPos(xBP, spongePosY, zBP-1);
BlockState BS1 = level.getBlockState(new BlockPos(xBP+1, spongePosY, zBP));
BlockState BS2 = level.getBlockState(new BlockPos(xBP-1, spongePosY, zBP));
BlockState BS3 = level.getBlockState(new BlockPos(xBP, spongePosY, zBP+1));
BlockState BS4 = level.getBlockState(new BlockPos(xBP, spongePosY, zBP-1));
if(BS1==waterBS) {
pos2.add(BP1);
}
if(BS2==waterBS) {
pos2.add(BP2);
}
if(BS3==waterBS) {
pos2.add(BP3);
}
if(BS4==waterBS) {
pos2.add(BP4);
}
}
pos = pos2;
pos2 = new ArrayList<BlockPos>();
}
} // spongePlaced
虽然有效,但会出现两个问题:
我试过冷却和执行者,但都没有用。 我希望这些结果在块更新之间有一个冷却时间,但似乎没有帮助。 相反,它导致了相同的 2 个问题,即冻结我的屏幕并在设定的冷却时间后更新块。
如何在每次水块更新时添加特定的滴答延迟?