Minecraft вылетает при включении RageMode при нажатии на клавишу U

скажу сразу, в логах ошибка не появляется, я использую forge версии 2859 для майнкрафта 1.12.2, я написал пару классов один из которых отвечает за RageMode, суть в том что игрок при включении RageMode должен лететь к ближайшей сущности и наносить ей 200 урона, и так ещё раз в течении 10 секунд, если игроку встречаются препятствия то он их должен уничтожать хитбоксом. следующий класс KeyInputHandler, он отвечает за проверку нажатия на клавишу U и затем активирует RageMode. в чём проблема - при заходе в игру всё нормально, но при нажатии на U игра полностью зависает и единственный способ её выключить - это принудительно закрыть, смотря в логи там нет вообще никаких записей об ошибках, просто надпись выход из игры с кодом 0.

вот коды: главный файл

package daun.aut.utils;

import daun.aut.utils.Handlers.KeyInputHandler;
import daun.aut.recipes.SmeltingRecipes;
import daun.aut.tabs.autTab;
import daun.aut.utils.Handlers.RegistryHandler;
import daun.aut.utils.proxy.CommonProxy;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;



    @Mod(modid = Reference.MODID, name = Reference.NAME, version = Reference.VERSION)
    public class Main
    {
        public static final CreativeTabs autTab = new autTab("autismotab");

        @Instance
        public static Main instance;

        @SidedProxy(modId = Reference.MODID, clientSide= Reference.CLIENT, serverSide = Reference.COMMON)
        public static CommonProxy proxy;

        @EventHandler
        public static void preInit(FMLPreInitializationEvent event)
        {
            RegistryHandler.otherRegistries();
            KeyInputHandler.registerKeyBindings();

        }

        @EventHandler
        public static void Init(FMLInitializationEvent event) {
            SmeltingRecipes.init();
            MinecraftForge.EVENT_BUS.register(new CustomFog());
            MinecraftForge.EVENT_BUS.register(new KeyInputHandler());
        }

        @EventHandler
        public static void postInit(FMLPostInitializationEvent event) {
        }

    }

RageMode

package daun.aut.utils;

import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;

public class RageMode {

    private EntityPlayer player;
    private World world;
    private long startTime;
    private final long duration = 10 * 20; // 10 seconds (20 ticks per second)
    private final double speed = 1.5; // Speed of movement

    public RageMode(EntityPlayer player) {
        this.player = player;
        this.world = player.world;
        this.startTime = world.getTotalWorldTime();
        activateRage();
    }

    private void activateRage() {
        while (world.getTotalWorldTime() < startTime + duration) {
            EntityLivingBase target = findNearestTarget();
            if (target != null) {
                moveTowards(target);
                attack(target);
                breakObstacles();
            }
        }
    }

    private EntityLivingBase findNearestTarget() {
        // Logic to find the nearest living entity
        return player.world.getNearestAttackablePlayer(player, 50.0, 50.0);
    }

    private void moveTowards(EntityLivingBase target) {
        // Logic to move towards the target entity linearly
        Vec3d playerPos = player.getPositionVector();
        Vec3d targetPos = target.getPositionVector();
        Vec3d direction = targetPos.subtract(playerPos).normalize();
        Vec3d newPos = playerPos.add(direction.scale(speed / 20.0)); // Move by speed per tick

        player.setPositionAndUpdate(newPos.x, newPos.y, newPos.z);
    }

    private void attack(EntityLivingBase target) {
        // Logic to attack the target entity
        target.attackEntityFrom(DamageSource.causePlayerDamage(player), 200.0f);
    }

    private void breakObstacles() {
        // Logic to break obstacles (blocks)
        BlockPos playerPos = player.getPosition();
        Vec3d lookVec = player.getLookVec();
        BlockPos blockPos = playerPos.add(lookVec.x, lookVec.y, lookVec.z); // Convert Vec3d to BlockPos

        if (!world.isAirBlock(blockPos)) {
            world.destroyBlock(blockPos, true);
        }
    }
}

Обработчик

package daun.aut.utils.Handlers;

import daun.aut.utils.RageMode;
import net.minecraft.client.Minecraft;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.InputEvent;
import org.lwjgl.input.Keyboard;

public class KeyInputHandler {

    private static final KeyBinding rageKey = new KeyBinding("key.ragemode", Keyboard.KEY_U, "key.categories.gameplay");

    public static void registerKeyBindings() {
        ClientRegistry.registerKeyBinding(rageKey);
    }

    @SubscribeEvent
    public void onKeyInput(InputEvent.KeyInputEvent event) {
        if (rageKey.isPressed()) {
            EntityPlayer player = Minecraft.getMinecraft().player;
            if (player != null) {
                new RageMode(player);
            }
        }
    }
}

мне надо чтоб всё работало нормально, и не вылетало.


Ответы (0 шт):