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

Программисты JAVA общаются здесь
Anonymous
Minecraft вылетает при включении RageMode нажатием клавиши U

Сообщение Anonymous »

Скажу сразу, в логах ошибка не появляется, использую 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) {
}

}
Режим ярости

Код: Выделить всё

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);
}
}
}
}

Мне нужно, чтобы все работало правильно и не зависало.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -the-u-key

Вернуться в «JAVA»