在放置块之前添加延迟(Minecraft Forge API 1.19.2)

问题描述 投票:0回答:0

我在服务器上有一个事件,当海绵被放置时,它会替换它通往空气的路径中的任何周围的水块。


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

虽然有效,但会出现两个问题:

  1. while 循环使服务器不堪重负,导致它冻结屏幕
  2. setblock 函数似乎没有滴答延迟跟上服务器

我试过冷却和执行者,但都没有用。 我希望这些结果在块更新之间有一个冷却时间,但似乎没有帮助。 相反,它导致了相同的 2 个问题,即冻结我的屏幕并在设定的冷却时间后更新块。

如何在每次水块更新时添加特定的滴答延迟?

minecraft forge
© www.soinside.com 2019 - 2024. All rights reserved.