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);
}
}
}
}
мне надо чтоб всё работало нормально, и не вылетало.