Свой блок + утечка памяти, зависание

Версия Minecraft
1.12.2
API
Forge
192
2
9
Всем здрасти) Решил порыться в своем очень старом(самом первом моде), но сорцев на момент создания я не оставил нигде, а потому пришлось мод собирать почти с нуля. Вроде всё сделал, с ошибками явными не столкнулся, но при попытке наступить на блок у меня зависает клиент и в диспетчере процесс сжирает память до тех пор, пока она не кончится или не убить процесс. Полагаю, виноват цикл внутри блока. Говорю сразу, код еще не читал, просто перенес из деоб. мода.

Вопрос: как мне в будущем ловить такие моменты, если даже в лог ничего не пишет?
PS. Оригинальный мод работает исправно и на клиенте, и на сервере.
BlockPlateWhite.class:
public class BlockPlateWhite extends BlockPlate {

    public BlockPlateWhite() {
        super();
        setRegistryName("jump_plate_white");
        setUnlocalizedName("jump_plate_white");
    }
    
    public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn) {
        if (Math.abs(entityIn.motionY) < 0.1D && !entityIn.isSneaking())
            entityIn.motionY = 0.6666666666666666D;
        super.onEntityWalk(worldIn, pos, entityIn);
        worldIn.playSound((EntityPlayer)null, pos, RegisterSound.JUMPPLATEUSE, SoundCategory.BLOCKS, 1.0F, 1.0F);
        double i;
        for (i = 0.0D; i < 6.283185307179586D; )
            worldIn.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.9D, 0.9D, 0.9D, new int[0]); i += 0.01D;
    }

}
BlockPlate.class:
public class BlockPlate extends Block {
   
    public BlockPlate() {
        super(Material.ROCK);
        setCreativeTab(Main.JUMPPLATES);
    }
   
    public boolean isOpaqueCube(IBlockState state) {
        return false;
    }
   
    public boolean isFullCube(IBlockState state) {
        return false;
    }
   
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
        AxisAlignedBB axisAlignedBB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.21D, 1.0D);
        return axisAlignedBB;
    }

    public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) {
        AxisAlignedBB axisAlignedBB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.09D, 1.0D);
        return axisAlignedBB;
    }
   
    public void onFallenUpon(World worldIn, BlockPos pos, Entity entityIn, float fallDistance) {
        if (entityIn.isSneaking())
            super.onFallenUpon(worldIn, pos, entityIn, fallDistance);
        else
            entityIn.fall(fallDistance, 0.0F);
    }
   
    public void onLanded(World worldIn, Entity entityIn) {
        if (entityIn.isSneaking())
            super.onLanded(worldIn, entityIn);
        else if (entityIn.motionY < 0.0D) {
            entityIn.motionY = 0.0D;
            if (!(entityIn instanceof net.minecraft.entity.EntityLivingBase))
                entityIn.motionY = 0.0D;
        }
    }
   
}
Лог при зависании:
[04:50:08] [Server thread/INFO] [minecraft/MinecraftServer]: Player116 joined the game
[04:50:08] [Client thread/DEBUG] [FML]: Overriding dimension: using 0
[04:50:10] [Server thread/INFO] [minecraft/IntegratedServer]: Saving and pausing game...
[04:50:10] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'New World'/overworld
[04:50:10] [Server thread/DEBUG] [FML]: Gathering id map for writing to world save New World
[04:50:11] [Server thread/WARN] [minecraft/MinecraftServer]: Can't keep up! Did the system time change, or is the server overloaded? Running 2488ms behind, skipping 49 tick(s)
 
Последнее редактирование:
192
2
9
Ошибку я нашел все-таки, но вопрос открыт. Возможно ли это отлавливать и как, если да?

onEntityWalk() до:
    public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn) {
        if (Math.abs(entityIn.motionY) < 0.1D && !entityIn.isSneaking())
            entityIn.motionY = 0.6666666666666666D;
        super.onEntityWalk(worldIn, pos, entityIn);
        worldIn.playSound((EntityPlayer)null, pos, RegisterSound.JUMPPLATEUSE, SoundCategory.BLOCKS, 1.0F, 1.0F);
        double i;
        for (i = 0.0D; i < 6.283185307179586D; )
            worldIn.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.9D, 0.9D, 0.9D, new int[0]); i += 0.01D;
    }

onEntityWalk() после:
    public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn) {
        if (Math.abs(entityIn.motionY) < 0.1D && !entityIn.isSneaking())
            entityIn.motionY = 0.6666666666666666D;
        super.onEntityWalk(worldIn, pos, entityIn);
        worldIn.playSound((EntityPlayer)null, pos, RegisterSound.JUMPPLATEUSE, SoundCategory.BLOCKS, 1.0F, 1.0F);
        double i;
        for (i = 0.0D; i < 6.283185307179586D; ) {
            worldIn.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.9D, 0.9D, 0.9D, new int[0]);
            i += 0.01D;
        }
    }
 
1,560
86
204
код еще не читал
Не читать свой же код и задавать вопрос - гениально.
зависает клиент
Логично, что надо сначала попробывать убрать, например, спавн частиц или вообще весь код и тестить пока не исправиться эта проблема.
 
1,074
72
372
Это код для нагрузочного тестирования видеокарт?
onEntityWalk() после:
    public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn) {
        if (Math.abs(entityIn.motionY) < 0.1D && !entityIn.isSneaking())
            entityIn.motionY = 0.6666666666666666D;
        super.onEntityWalk(worldIn, pos, entityIn);
        worldIn.playSound((EntityPlayer)null, pos, RegisterSound.JUMPPLATEUSE, SoundCategory.BLOCKS, 1.0F, 1.0F);
        double i;
        for (i = 0.0D; i < 6.283185307179586D; ) {
            worldIn.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.9D, 0.9D, 0.9D, new int[0]);
            i += 0.01D;
        }
    }
 
192
2
9
Смотрю на это, плакать хочется.
Разве onEntityWalk не вызывается всегда когда Entity трогает стену?
Это код для нагрузочного тестирования видеокарт?
Прозвучит смешно и абсурдно, но этот код мне помогал написать несколько лет назад гуру данного форума) Пальцем тыкать не буду.
Правда всё работает и проблем с тем же ФПС я никогда не наблюдал, а у мода 76к загрузок. К слову, я и взялся его переписать, так как хотел поправить возможные нюансы.

Отлавливать утечки памяти?
Возможно, но это очень сложно
Может быть какие-нибудь советы или ресурсы по данному вопросу? Уж раз если это возможно. Или это индивидуальная импровизация энтузиастов и я пока не дорос?)

Логично, что надо сначала попробывать убрать, например, спавн частиц или вообще весь код и тестить пока не исправиться эта проблема.
Однако проблема оказалась всего лишь в новом действии, идущем после символа ; на той же строке, который означает в синтаксисе конец строки. Потому цикл и зависал.
 
586
32
136
Java:
for (double i = 0.0D; i < Math.PI * 2; i += Math.PI / 36.0) {
     worldIn.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.9D, 0.9D, 0.9D, new int[0]);
}
Если я правильно понял идею, то код должен был выглядить как-то так(только я думаю, там i должно как-то влиять на коорды)
 
192
2
9
Java:
for (double i = 0.0D; i < Math.PI * 2; i += Math.PI / 36.0) {
     worldIn.spawnParticle(EnumParticleTypes.REDSTONE, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, 0.9D, 0.9D, 0.9D, new int[0]);
}
Если я правильно понял идею, то код должен был выглядить как-то так(только я думаю, там i должно как-то влиять на коорды)
Хотел за i взять entityIn.posY, чтобы строить шлейф партиклов во время полета. Да и к теме не относится вроде, вопрос в другом ведь... Подсказок не дали по поводу отлова косяков вышеупомянутых.
 
Сверху