Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Часть функционала Farm Mobs exp3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
14 Окт 2023
Сообщения
146
Реакции
2
Выберите загрузчик игры
  1. Vanilla
Говно которое работает еле как , :catjam: на рв иногда не бьет потому что домер гандон











код:
Expand Collapse Copy
package Kotuk.kit.functions.impl.Util;



import Kotuk.kit.events.EventUpdate;
import Kotuk.kit.functions.api.Category;
import Kotuk.kit.functions.api.Function;
import Kotuk.kit.functions.api.FunctionRegister;
import Kotuk.kit.functions.settings.impl.BooleanSetting;
import Kotuk.kit.functions.settings.impl.ModeSetting;
import Kotuk.kit.functions.settings.impl.SliderSetting;
import com.google.common.eventbus.Subscribe;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.eventbus.api.Event;

import java.util.HashMap;
import java.util.Map;

@FunctionRegister(name = "МобФарм", type = Category.Utils)
public class UniversalMobFarm extends Function {

    private final ModeSetting mobTypeSetting = new ModeSetting("Тип моба", "Все",
            "Все", "Враждебные", "Мирные", "Криперы", "Зомби", "Скелеты", "Пауки", "Эндермены", "Свинозомби", "Коровы", "Свиньи", "Овцы", "Куры");

    private final ModeSetting modeSetting = new ModeSetting("Режим", "Обычный", "Обычный", "Фермерский", "Агрессивный");
    private final SliderSetting distanceSetting = new SliderSetting("Дистанция", 15.0f, 5.0f, 200.0f, 0.5f);
    private final BooleanSetting collectDropsSetting = new BooleanSetting("Собирать дроп", true);

    private final BooleanSetting runModeSetting = new BooleanSetting("Режим бега", true);
    private final ModeSetting movementMode = new ModeSetting("Тип Движения", "Авто", "Авто", "Движение")
            .setVisible(() -> runModeSetting.get());

    private final BooleanSetting retreatSetting = new BooleanSetting("Убегать от опасности", true);
    private final ModeSetting retreatCondition = new ModeSetting("Условие отступления", "При низком HP",
            "При низком HP", "От крипера", "От всех взрывающихся", "От всех атакующих")
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting retreatDistanceSetting = new SliderSetting("Дистанция бега", 7.0f, 3.0f, 15.0f, 0.5f)
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting rotationSpeed = new SliderSetting("Скорость поворотов", 0.8f, 0.1f, 2.0f, 0.1f);
    private final BooleanSetting predictMovement = new BooleanSetting("Предсказание движения", true);
    private final SliderSetting predictionFactor = new SliderSetting("Фактор предсказания", 0.3f, 0.1f, 0.8f, 0.05f)
            .setVisible(() -> predictMovement.get());

    private final BooleanSetting autoSwitchWeapon = new BooleanSetting("Авто-смена оружия", true);
    private final SliderSetting attackCooldown = new SliderSetting("Задержка атаки (мс)", 500.0f, 100.0f, 2000.0f, 50.0f);
    private final SliderSetting minHealthToFight = new SliderSetting("Мин. HP для боя", 10.0f, 1.0f, 20.0f, 1.0f);

    private final BooleanSetting targetPrioritization = new BooleanSetting("Приоритет целей", true);
    private final ModeSetting priorityMode = new ModeSetting("Приоритет", "Ближайший",
            "Ближайший", "Слабейший", "Сильнейший", "Опаснейший")
            .setVisible(() -> targetPrioritization.get());

    private final BooleanSetting avoidWaterSetting = new BooleanSetting("Избегать воду", true);
    private final BooleanSetting avoidLavaSetting = new BooleanSetting("Избегать лаву", true);

    private final BooleanSetting autoReconnectSetting = new BooleanSetting("Авто переподлючение", false);
    private final SliderSetting reconnectIntervalSetting = new SliderSetting("Интервал переподкл. (мин)", 5.0f, 1.0f, 60.0f, 1.0f)
            .setVisible(() -> autoReconnectSetting.get());

    private static final Minecraft mc = Minecraft.getInstance();
    private LivingEntity targetMob;
    private ItemEntity targetDrop;
    private long lastReconnectTime = 0;
    private long lastAttackTime = 0;
    private boolean isRetreating = false;
    private int retreatTicks = 0;
    private Map<Class<?>, Long> lastAttackTimeByType = new HashMap<>();

 
    private static final Map<Class<?>, Integer> MOB_PRIORITY = new HashMap<>();
    static {
        MOB_PRIORITY.put(CreeperEntity.class, 100);
        MOB_PRIORITY.put(GhastEntity.class, 90);
        MOB_PRIORITY.put(EndermanEntity.class, 80);
        MOB_PRIORITY.put(WitchEntity.class, 70);
        MOB_PRIORITY.put(BlazeEntity.class, 60);
        MOB_PRIORITY.put(SkeletonEntity.class, 50);
        MOB_PRIORITY.put(ZombieEntity.class, 40);
        MOB_PRIORITY.put(SpiderEntity.class, 30);
        MOB_PRIORITY.put(SlimeEntity.class, 20);
        MOB_PRIORITY.put(SilverfishEntity.class, 10);
    }

    public UniversalMobFarm() {
        addSettings(
                mobTypeSetting, modeSetting, distanceSetting, collectDropsSetting,
                runModeSetting, movementMode, retreatSetting, retreatCondition,
                retreatDistanceSetting, autoSwitchWeapon, attackCooldown, minHealthToFight,
                targetPrioritization, priorityMode, rotationSpeed, predictMovement,
                predictionFactor, avoidWaterSetting, avoidLavaSetting,
                autoReconnectSetting, reconnectIntervalSetting
        );
    }

    @Override
    public String getSuffix() {
        return mobTypeSetting.get();
    }

    @Override
    public boolean onEvent(Event event) {
        return false;
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {
        if (mc.world == null || mc.player == null) return;

      
        if (mc.player.getHealth() < minHealthToFight.get() && retreatSetting.get()) {
            retreatFromAll();
            return;
        }

      
        if (collectDropsSetting.get()) {
            targetDrop = findClosestDrop();
            if (targetDrop != null) {
                runToTarget(targetDrop);
                isRetreating = false;
                retreatTicks = 0;
                return;
            }
        }

        targetMob = YaGaYGptLOL();
        if (targetMob == null) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        double distanceSq = mc.player.getDistanceSq(targetMob);
        if (distanceSq > distanceSetting.get() * distanceSetting.get()) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        if (!hasLine(targetMob)) {
            resetMovement();
            return;
        }

        if (retreatSetting.get() && shouldRetreat(targetMob)) {
            retreatFromMob(targetMob);
            isRetreating = true;
            retreatTicks++;
            if (retreatTicks >= 60) {
                isRetreating = false;
                retreatTicks = 0;
            }
        } else {
            if (runModeSetting.get()) {
                runToTarget(targetMob);
            } else {
                aimAtTarget(targetMob);
            }

            if (canAttack(targetMob)) {
                attackMob(targetMob);
            }
            isRetreating = false;
        }

        if (autoReconnectSetting.get()) {
            autoReconnect();
        }
    }

    private LivingEntity YaGaYGptLOL() {
        LivingEntity closestMob = null;
        double closestDistanceSq = Double.MAX_VALUE;
        double bestPriorityScore = -Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof LivingEntity living &&
                    !(entity instanceof PlayerEntity) &&
                    living.isAlive() &&
                    isValidMobType(living)) {

                double distanceSq = mc.player.getDistanceSq(living);
                if (distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(living)) {

                    if (targetPrioritization.get()) {
                        double priorityScore = calculatePriorityScore(living, distanceSq);
                        if (priorityScore > bestPriorityScore) {
                            bestPriorityScore = priorityScore;
                            closestMob = living;
                        }
                    } else if (distanceSq < closestDistanceSq) {
                        closestDistanceSq = distanceSq;
                        closestMob = living;
                    }
                }
            }
        }
        return closestMob;
    }

    private double calculatePriorityScore(LivingEntity mob, double distanceSq) {
        double score = 0;

        switch (priorityMode.get()) {
            case "Ближайший":
                score = -distanceSq;
                break;
            case "Слабейший":
                score = -mob.getHealth();
                break;
            case "Сильнейший":
                score = mob.getHealth();
                break;
            case "Опаснейший":
                int priority = MOB_PRIORITY.getOrDefault(mob.getClass(), 0);
                score = priority - (distanceSq / 100); // Учитываем и дистанцию
                break;
        }

        return score;
    }

    private boolean isValidMobType(LivingEntity mob) {
        String selectedType = mobTypeSetting.get();

        if (selectedType.equals("Все")) return true;

        switch (selectedType) {
            case "Враждебные":
                return mob instanceof MonsterEntity ||
                        mob instanceof GhastEntity ||
                        mob instanceof SlimeEntity;
            case "Мирные":
                return mob instanceof AnimalEntity;
            case "Криперы":
                return mob instanceof CreeperEntity;
            case "Зомби":
                return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity;
            case "Скелеты":
                return mob instanceof SkeletonEntity;
            case "Пауки":
                return mob instanceof SpiderEntity;
            case "Эндермены":
                return mob instanceof EndermanEntity;
            case "Свинозомби":
                return mob instanceof ZombifiedPiglinEntity;
            case "Коровы":
                return mob.getClass().getSimpleName().contains("Cow");
            case "Свиньи":
                return mob.getClass().getSimpleName().contains("Pig");
            case "Овцы":
                return mob.getClass().getSimpleName().contains("Sheep");
            case "Куры":
                return mob.getClass().getSimpleName().contains("Chicken");
            default:
                return false;
        }
    }

    private ItemEntity findClosestDrop() {
        ItemEntity closestDrop = null;
        double closestDistanceSq = Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof ItemEntity item && item.isAlive()) {
                double distanceSq = mc.player.getDistanceSq(item);
                if (distanceSq < closestDistanceSq && distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(item)) {
                    closestDrop = item;
                    closestDistanceSq = distanceSq;
                }
            }
        }
        return closestDrop;
    }

    private boolean hasLine(Entity entity) {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d end = entity.getBoundingBox().getCenter();
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.MISS;
    }

    private boolean hasObstacle() {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d forward = mc.player.getForward().scale(1.5);
        Vector3d end = start.add(forward);
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.BLOCK;
    }

    private boolean shouldRetreat(LivingEntity mob) {
        String condition = retreatCondition.get();

        if (condition.equals("При низком HP")) {
            return mc.player.getHealth() < minHealthToFight.get();
        } else if (condition.equals("От крипера")) {
            return mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f;
        } else if (condition.equals("От всех взрывающихся")) {
            return (mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f) ||
                    (mob instanceof GhastEntity && mob.getAttackingEntity() == mc.player);
        } else if (condition.equals("От всех атакующих")) {
            return mob.getAttackingEntity() == mc.player && mob.getDistance(mc.player) < 3.0;
        }

        return false;
    }

    private void runToTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get();
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            runToTargetKeybinds(target);
        } else {
            runToTargetMove(target);
        }
    }

    private float[] calculateOptimalRotations(Entity entity) {
        Vector3d targetPos = entity.getBoundingBox().getCenter();

        if (predictMovement.get() && entity.getMotion().lengthSquared() > 0.001) {
            double distance = mc.player.getDistance(entity);
            double timeToTarget = distance / 20.0;
            Vector3d predictedMotion = entity.getMotion().scale(timeToTarget * predictionFactor.get());
            targetPos = targetPos.add(predictedMotion);
        }

        Vector3d eyesPos = mc.player.getEyePosition(1.0F);
        double diffX = targetPos.x - eyesPos.x;
        double diffY = targetPos.y - eyesPos.y;
        double diffZ = targetPos.z - eyesPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private float smoothRotation(float current, float target, float factor) {
        float delta = MathHelper.wrapDegrees(target - current);
        return current + delta * MathHelper.clamp(factor, 0.1f, 1.0f);
    }

    private void runToTargetKeybinds(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            mc.gameSettings.keyBindForward.setPressed(true);
            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.gameSettings.keyBindSprint.setPressed(true);
            }

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void runToTargetMove(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = (float) (0.5 * Math.min(distance, 3.0));
            mc.player.moveStrafing = (float) moveX;

            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.player.setSprinting(true);
            } else {
                mc.player.setSprinting(false);
            }

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void aimAtTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get() * 0.3f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    private void retreatFromMob(LivingEntity mob) {
        Vector3d playerPos = mc.player.getPositionVec();
        Vector3d mobPos = mob.getPositionVec();
        Vector3d direction = playerPos.subtract(mobPos).normalize();

        float[] rotations = calculateAwayRotations(mob);
        float rotationFactor = rotationSpeed.get() * 1.2f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            retreatKeybinds(direction);
        } else {
            retreatMove(direction);
        }
    }

    private void retreatFromAll() {
        
        mc.player.rotationYaw += 180;
        mc.player.rotationYaw = MathHelper.wrapDegrees(mc.player.rotationYaw);

        if (movementMode.get().equals("Авто")) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);
        } else {
            mc.player.moveForward = 1.0f;
            mc.player.setSprinting(true);
        }
    }

    private float[] calculateAwayRotations(Entity entity) {
        Vector3d entityPos = entity.getBoundingBox().getCenter();
        Vector3d eyesPos = mc.player.getEyePosition(1.0F);

        double diffX = eyesPos.x - entityPos.x;
        double diffY = eyesPos.y - entityPos.y;
        double diffZ = eyesPos.z - entityPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private void retreatKeybinds(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void retreatMove(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = 1.0f;
            mc.player.moveStrafing = (float) moveX;
            mc.player.setSprinting(true);

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void adjustedStrafeKeybinds(double dx, double dz) {
        float yaw = mc.player.rotationYaw;
        double strafe = 0;

        double angleToTarget = Math.toDegrees(Math.atan2(dz, dx)) - 90 - yaw;
        angleToTarget = MathHelper.wrapDegrees((float) angleToTarget);

        if (Math.abs(angleToTarget) > 45 && Math.abs(angleToTarget) < 135) {
            strafe = angleToTarget > 0 ? 1.0 : -1.0;
        }

        mc.gameSettings.keyBindLeft.setPressed(strafe < -0.1);
        mc.gameSettings.keyBindRight.setPressed(strafe > 0.1);
    }

    private void resetMovementKeybinds() {
        mc.gameSettings.keyBindForward.setPressed(false);
        mc.gameSettings.keyBindBack.setPressed(false);
        mc.gameSettings.keyBindLeft.setPressed(false);
        mc.gameSettings.keyBindRight.setPressed(false);
        mc.gameSettings.keyBindSprint.setPressed(false);
        mc.gameSettings.keyBindJump.setPressed(false);
    }

    private void resetMovementMove() {
        mc.player.moveForward = 0.0f;
        mc.player.moveStrafing = 0.0f;
        mc.player.setSprinting(false);
    }

    private boolean canAttack(LivingEntity mob) {
        if (mob instanceof CreeperEntity) {
            return ((CreeperEntity) mob).getSwelling(1.0f) <= 0.5f;
        }
        return true;
    }

    private void attackMob(LivingEntity mob) {
        long currentTime = System.currentTimeMillis();
        Class<?> mobClass = mob.getClass();
        Long lastAttack = lastAttackTimeByType.get(mobClass);

        if (lastAttack == null || currentTime - lastAttack >= attackCooldown.get()) {
            double distance = mc.player.getDistance(mob);
            if (distance <= 3.5) {
                if (autoSwitchWeapon.get()) {
                    // Здесь можно добавить логику авто-смены оружия
                }

                mc.playerController.attackEntity(mc.player, mob);
                mc.player.swingArm(Hand.MAIN_HAND);
                lastAttackTimeByType.put(mobClass, currentTime);
                lastAttackTime = currentTime;
            }
        }
    }

    private void autoReconnect() {
        long currentTime = System.currentTimeMillis();
        float intervalMinutes = reconnectIntervalSetting.get();
        long intervalMillis = (long) (intervalMinutes * 60 * 1000);

        if (currentTime - lastReconnectTime >= intervalMillis) {
            if (mc.player != null) {
                mc.player.sendChatMessage(".rct");
                lastReconnectTime = currentTime;
            }
        }
    }

    private void resetMovement() {
        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    @Override
    public boolean onEnable() {
        super.onEnable();
        lastReconnectTime = System.currentTimeMillis();
        lastAttackTime = 0;
        isRetreating = false;
        retreatTicks = 0;
        lastAttackTimeByType.clear();
        return false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        resetMovement();
        isRetreating = false;
        retreatTicks = 0;
        targetMob = null;
        targetDrop = null;
        lastAttackTimeByType.clear();
    }

    @Override
    protected float[] rotations(PlayerEntity var1) {
        return new float[0];
    }

    @Override
    public void onTick() {
        
    }
}
 
Говно которое работает еле как , :catjam: на рв иногда не бьет потому что домер гандон











код:
Expand Collapse Copy
package Kotuk.kit.functions.impl.Util;



import Kotuk.kit.events.EventUpdate;
import Kotuk.kit.functions.api.Category;
import Kotuk.kit.functions.api.Function;
import Kotuk.kit.functions.api.FunctionRegister;
import Kotuk.kit.functions.settings.impl.BooleanSetting;
import Kotuk.kit.functions.settings.impl.ModeSetting;
import Kotuk.kit.functions.settings.impl.SliderSetting;
import com.google.common.eventbus.Subscribe;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.eventbus.api.Event;

import java.util.HashMap;
import java.util.Map;

@FunctionRegister(name = "МобФарм", type = Category.Utils)
public class UniversalMobFarm extends Function {

    private final ModeSetting mobTypeSetting = new ModeSetting("Тип моба", "Все",
            "Все", "Враждебные", "Мирные", "Криперы", "Зомби", "Скелеты", "Пауки", "Эндермены", "Свинозомби", "Коровы", "Свиньи", "Овцы", "Куры");

    private final ModeSetting modeSetting = new ModeSetting("Режим", "Обычный", "Обычный", "Фермерский", "Агрессивный");
    private final SliderSetting distanceSetting = new SliderSetting("Дистанция", 15.0f, 5.0f, 200.0f, 0.5f);
    private final BooleanSetting collectDropsSetting = new BooleanSetting("Собирать дроп", true);

    private final BooleanSetting runModeSetting = new BooleanSetting("Режим бега", true);
    private final ModeSetting movementMode = new ModeSetting("Тип Движения", "Авто", "Авто", "Движение")
            .setVisible(() -> runModeSetting.get());

    private final BooleanSetting retreatSetting = new BooleanSetting("Убегать от опасности", true);
    private final ModeSetting retreatCondition = new ModeSetting("Условие отступления", "При низком HP",
            "При низком HP", "От крипера", "От всех взрывающихся", "От всех атакующих")
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting retreatDistanceSetting = new SliderSetting("Дистанция бега", 7.0f, 3.0f, 15.0f, 0.5f)
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting rotationSpeed = new SliderSetting("Скорость поворотов", 0.8f, 0.1f, 2.0f, 0.1f);
    private final BooleanSetting predictMovement = new BooleanSetting("Предсказание движения", true);
    private final SliderSetting predictionFactor = new SliderSetting("Фактор предсказания", 0.3f, 0.1f, 0.8f, 0.05f)
            .setVisible(() -> predictMovement.get());

    private final BooleanSetting autoSwitchWeapon = new BooleanSetting("Авто-смена оружия", true);
    private final SliderSetting attackCooldown = new SliderSetting("Задержка атаки (мс)", 500.0f, 100.0f, 2000.0f, 50.0f);
    private final SliderSetting minHealthToFight = new SliderSetting("Мин. HP для боя", 10.0f, 1.0f, 20.0f, 1.0f);

    private final BooleanSetting targetPrioritization = new BooleanSetting("Приоритет целей", true);
    private final ModeSetting priorityMode = new ModeSetting("Приоритет", "Ближайший",
            "Ближайший", "Слабейший", "Сильнейший", "Опаснейший")
            .setVisible(() -> targetPrioritization.get());

    private final BooleanSetting avoidWaterSetting = new BooleanSetting("Избегать воду", true);
    private final BooleanSetting avoidLavaSetting = new BooleanSetting("Избегать лаву", true);

    private final BooleanSetting autoReconnectSetting = new BooleanSetting("Авто переподлючение", false);
    private final SliderSetting reconnectIntervalSetting = new SliderSetting("Интервал переподкл. (мин)", 5.0f, 1.0f, 60.0f, 1.0f)
            .setVisible(() -> autoReconnectSetting.get());

    private static final Minecraft mc = Minecraft.getInstance();
    private LivingEntity targetMob;
    private ItemEntity targetDrop;
    private long lastReconnectTime = 0;
    private long lastAttackTime = 0;
    private boolean isRetreating = false;
    private int retreatTicks = 0;
    private Map<Class<?>, Long> lastAttackTimeByType = new HashMap<>();

 
    private static final Map<Class<?>, Integer> MOB_PRIORITY = new HashMap<>();
    static {
        MOB_PRIORITY.put(CreeperEntity.class, 100);
        MOB_PRIORITY.put(GhastEntity.class, 90);
        MOB_PRIORITY.put(EndermanEntity.class, 80);
        MOB_PRIORITY.put(WitchEntity.class, 70);
        MOB_PRIORITY.put(BlazeEntity.class, 60);
        MOB_PRIORITY.put(SkeletonEntity.class, 50);
        MOB_PRIORITY.put(ZombieEntity.class, 40);
        MOB_PRIORITY.put(SpiderEntity.class, 30);
        MOB_PRIORITY.put(SlimeEntity.class, 20);
        MOB_PRIORITY.put(SilverfishEntity.class, 10);
    }

    public UniversalMobFarm() {
        addSettings(
                mobTypeSetting, modeSetting, distanceSetting, collectDropsSetting,
                runModeSetting, movementMode, retreatSetting, retreatCondition,
                retreatDistanceSetting, autoSwitchWeapon, attackCooldown, minHealthToFight,
                targetPrioritization, priorityMode, rotationSpeed, predictMovement,
                predictionFactor, avoidWaterSetting, avoidLavaSetting,
                autoReconnectSetting, reconnectIntervalSetting
        );
    }

    @Override
    public String getSuffix() {
        return mobTypeSetting.get();
    }

    @Override
    public boolean onEvent(Event event) {
        return false;
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {
        if (mc.world == null || mc.player == null) return;

    
        if (mc.player.getHealth() < minHealthToFight.get() && retreatSetting.get()) {
            retreatFromAll();
            return;
        }

    
        if (collectDropsSetting.get()) {
            targetDrop = findClosestDrop();
            if (targetDrop != null) {
                runToTarget(targetDrop);
                isRetreating = false;
                retreatTicks = 0;
                return;
            }
        }

        targetMob = YaGaYGptLOL();
        if (targetMob == null) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        double distanceSq = mc.player.getDistanceSq(targetMob);
        if (distanceSq > distanceSetting.get() * distanceSetting.get()) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        if (!hasLine(targetMob)) {
            resetMovement();
            return;
        }

        if (retreatSetting.get() && shouldRetreat(targetMob)) {
            retreatFromMob(targetMob);
            isRetreating = true;
            retreatTicks++;
            if (retreatTicks >= 60) {
                isRetreating = false;
                retreatTicks = 0;
            }
        } else {
            if (runModeSetting.get()) {
                runToTarget(targetMob);
            } else {
                aimAtTarget(targetMob);
            }

            if (canAttack(targetMob)) {
                attackMob(targetMob);
            }
            isRetreating = false;
        }

        if (autoReconnectSetting.get()) {
            autoReconnect();
        }
    }

    private LivingEntity YaGaYGptLOL() {
        LivingEntity closestMob = null;
        double closestDistanceSq = Double.MAX_VALUE;
        double bestPriorityScore = -Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof LivingEntity living &&
                    !(entity instanceof PlayerEntity) &&
                    living.isAlive() &&
                    isValidMobType(living)) {

                double distanceSq = mc.player.getDistanceSq(living);
                if (distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(living)) {

                    if (targetPrioritization.get()) {
                        double priorityScore = calculatePriorityScore(living, distanceSq);
                        if (priorityScore > bestPriorityScore) {
                            bestPriorityScore = priorityScore;
                            closestMob = living;
                        }
                    } else if (distanceSq < closestDistanceSq) {
                        closestDistanceSq = distanceSq;
                        closestMob = living;
                    }
                }
            }
        }
        return closestMob;
    }

    private double calculatePriorityScore(LivingEntity mob, double distanceSq) {
        double score = 0;

        switch (priorityMode.get()) {
            case "Ближайший":
                score = -distanceSq;
                break;
            case "Слабейший":
                score = -mob.getHealth();
                break;
            case "Сильнейший":
                score = mob.getHealth();
                break;
            case "Опаснейший":
                int priority = MOB_PRIORITY.getOrDefault(mob.getClass(), 0);
                score = priority - (distanceSq / 100); // Учитываем и дистанцию
                break;
        }

        return score;
    }

    private boolean isValidMobType(LivingEntity mob) {
        String selectedType = mobTypeSetting.get();

        if (selectedType.equals("Все")) return true;

        switch (selectedType) {
            case "Враждебные":
                return mob instanceof MonsterEntity ||
                        mob instanceof GhastEntity ||
                        mob instanceof SlimeEntity;
            case "Мирные":
                return mob instanceof AnimalEntity;
            case "Криперы":
                return mob instanceof CreeperEntity;
            case "Зомби":
                return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity;
            case "Скелеты":
                return mob instanceof SkeletonEntity;
            case "Пауки":
                return mob instanceof SpiderEntity;
            case "Эндермены":
                return mob instanceof EndermanEntity;
            case "Свинозомби":
                return mob instanceof ZombifiedPiglinEntity;
            case "Коровы":
                return mob.getClass().getSimpleName().contains("Cow");
            case "Свиньи":
                return mob.getClass().getSimpleName().contains("Pig");
            case "Овцы":
                return mob.getClass().getSimpleName().contains("Sheep");
            case "Куры":
                return mob.getClass().getSimpleName().contains("Chicken");
            default:
                return false;
        }
    }

    private ItemEntity findClosestDrop() {
        ItemEntity closestDrop = null;
        double closestDistanceSq = Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof ItemEntity item && item.isAlive()) {
                double distanceSq = mc.player.getDistanceSq(item);
                if (distanceSq < closestDistanceSq && distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(item)) {
                    closestDrop = item;
                    closestDistanceSq = distanceSq;
                }
            }
        }
        return closestDrop;
    }

    private boolean hasLine(Entity entity) {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d end = entity.getBoundingBox().getCenter();
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.MISS;
    }

    private boolean hasObstacle() {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d forward = mc.player.getForward().scale(1.5);
        Vector3d end = start.add(forward);
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.BLOCK;
    }

    private boolean shouldRetreat(LivingEntity mob) {
        String condition = retreatCondition.get();

        if (condition.equals("При низком HP")) {
            return mc.player.getHealth() < minHealthToFight.get();
        } else if (condition.equals("От крипера")) {
            return mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f;
        } else if (condition.equals("От всех взрывающихся")) {
            return (mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f) ||
                    (mob instanceof GhastEntity && mob.getAttackingEntity() == mc.player);
        } else if (condition.equals("От всех атакующих")) {
            return mob.getAttackingEntity() == mc.player && mob.getDistance(mc.player) < 3.0;
        }

        return false;
    }

    private void runToTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get();
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            runToTargetKeybinds(target);
        } else {
            runToTargetMove(target);
        }
    }

    private float[] calculateOptimalRotations(Entity entity) {
        Vector3d targetPos = entity.getBoundingBox().getCenter();

        if (predictMovement.get() && entity.getMotion().lengthSquared() > 0.001) {
            double distance = mc.player.getDistance(entity);
            double timeToTarget = distance / 20.0;
            Vector3d predictedMotion = entity.getMotion().scale(timeToTarget * predictionFactor.get());
            targetPos = targetPos.add(predictedMotion);
        }

        Vector3d eyesPos = mc.player.getEyePosition(1.0F);
        double diffX = targetPos.x - eyesPos.x;
        double diffY = targetPos.y - eyesPos.y;
        double diffZ = targetPos.z - eyesPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private float smoothRotation(float current, float target, float factor) {
        float delta = MathHelper.wrapDegrees(target - current);
        return current + delta * MathHelper.clamp(factor, 0.1f, 1.0f);
    }

    private void runToTargetKeybinds(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            mc.gameSettings.keyBindForward.setPressed(true);
            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.gameSettings.keyBindSprint.setPressed(true);
            }

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void runToTargetMove(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = (float) (0.5 * Math.min(distance, 3.0));
            mc.player.moveStrafing = (float) moveX;

            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.player.setSprinting(true);
            } else {
                mc.player.setSprinting(false);
            }

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void aimAtTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get() * 0.3f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    private void retreatFromMob(LivingEntity mob) {
        Vector3d playerPos = mc.player.getPositionVec();
        Vector3d mobPos = mob.getPositionVec();
        Vector3d direction = playerPos.subtract(mobPos).normalize();

        float[] rotations = calculateAwayRotations(mob);
        float rotationFactor = rotationSpeed.get() * 1.2f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            retreatKeybinds(direction);
        } else {
            retreatMove(direction);
        }
    }

    private void retreatFromAll() {
      
        mc.player.rotationYaw += 180;
        mc.player.rotationYaw = MathHelper.wrapDegrees(mc.player.rotationYaw);

        if (movementMode.get().equals("Авто")) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);
        } else {
            mc.player.moveForward = 1.0f;
            mc.player.setSprinting(true);
        }
    }

    private float[] calculateAwayRotations(Entity entity) {
        Vector3d entityPos = entity.getBoundingBox().getCenter();
        Vector3d eyesPos = mc.player.getEyePosition(1.0F);

        double diffX = eyesPos.x - entityPos.x;
        double diffY = eyesPos.y - entityPos.y;
        double diffZ = eyesPos.z - entityPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private void retreatKeybinds(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void retreatMove(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = 1.0f;
            mc.player.moveStrafing = (float) moveX;
            mc.player.setSprinting(true);

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void adjustedStrafeKeybinds(double dx, double dz) {
        float yaw = mc.player.rotationYaw;
        double strafe = 0;

        double angleToTarget = Math.toDegrees(Math.atan2(dz, dx)) - 90 - yaw;
        angleToTarget = MathHelper.wrapDegrees((float) angleToTarget);

        if (Math.abs(angleToTarget) > 45 && Math.abs(angleToTarget) < 135) {
            strafe = angleToTarget > 0 ? 1.0 : -1.0;
        }

        mc.gameSettings.keyBindLeft.setPressed(strafe < -0.1);
        mc.gameSettings.keyBindRight.setPressed(strafe > 0.1);
    }

    private void resetMovementKeybinds() {
        mc.gameSettings.keyBindForward.setPressed(false);
        mc.gameSettings.keyBindBack.setPressed(false);
        mc.gameSettings.keyBindLeft.setPressed(false);
        mc.gameSettings.keyBindRight.setPressed(false);
        mc.gameSettings.keyBindSprint.setPressed(false);
        mc.gameSettings.keyBindJump.setPressed(false);
    }

    private void resetMovementMove() {
        mc.player.moveForward = 0.0f;
        mc.player.moveStrafing = 0.0f;
        mc.player.setSprinting(false);
    }

    private boolean canAttack(LivingEntity mob) {
        if (mob instanceof CreeperEntity) {
            return ((CreeperEntity) mob).getSwelling(1.0f) <= 0.5f;
        }
        return true;
    }

    private void attackMob(LivingEntity mob) {
        long currentTime = System.currentTimeMillis();
        Class<?> mobClass = mob.getClass();
        Long lastAttack = lastAttackTimeByType.get(mobClass);

        if (lastAttack == null || currentTime - lastAttack >= attackCooldown.get()) {
            double distance = mc.player.getDistance(mob);
            if (distance <= 3.5) {
                if (autoSwitchWeapon.get()) {
                    // Здесь можно добавить логику авто-смены оружия
                }

                mc.playerController.attackEntity(mc.player, mob);
                mc.player.swingArm(Hand.MAIN_HAND);
                lastAttackTimeByType.put(mobClass, currentTime);
                lastAttackTime = currentTime;
            }
        }
    }

    private void autoReconnect() {
        long currentTime = System.currentTimeMillis();
        float intervalMinutes = reconnectIntervalSetting.get();
        long intervalMillis = (long) (intervalMinutes * 60 * 1000);

        if (currentTime - lastReconnectTime >= intervalMillis) {
            if (mc.player != null) {
                mc.player.sendChatMessage(".rct");
                lastReconnectTime = currentTime;
            }
        }
    }

    private void resetMovement() {
        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    @Override
    public boolean onEnable() {
        super.onEnable();
        lastReconnectTime = System.currentTimeMillis();
        lastAttackTime = 0;
        isRetreating = false;
        retreatTicks = 0;
        lastAttackTimeByType.clear();
        return false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        resetMovement();
        isRetreating = false;
        retreatTicks = 0;
        targetMob = null;
        targetDrop = null;
        lastAttackTimeByType.clear();
    }

    @Override
    protected float[] rotations(PlayerEntity var1) {
        return new float[0];
    }

    @Override
    public void onTick() {
      
    }
}
ГПТ?
 
Говно которое работает еле как , :catjam: на рв иногда не бьет потому что домер гандон











код:
Expand Collapse Copy
package Kotuk.kit.functions.impl.Util;



import Kotuk.kit.events.EventUpdate;
import Kotuk.kit.functions.api.Category;
import Kotuk.kit.functions.api.Function;
import Kotuk.kit.functions.api.FunctionRegister;
import Kotuk.kit.functions.settings.impl.BooleanSetting;
import Kotuk.kit.functions.settings.impl.ModeSetting;
import Kotuk.kit.functions.settings.impl.SliderSetting;
import com.google.common.eventbus.Subscribe;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.eventbus.api.Event;

import java.util.HashMap;
import java.util.Map;

@FunctionRegister(name = "МобФарм", type = Category.Utils)
public class UniversalMobFarm extends Function {

    private final ModeSetting mobTypeSetting = new ModeSetting("Тип моба", "Все",
            "Все", "Враждебные", "Мирные", "Криперы", "Зомби", "Скелеты", "Пауки", "Эндермены", "Свинозомби", "Коровы", "Свиньи", "Овцы", "Куры");

    private final ModeSetting modeSetting = new ModeSetting("Режим", "Обычный", "Обычный", "Фермерский", "Агрессивный");
    private final SliderSetting distanceSetting = new SliderSetting("Дистанция", 15.0f, 5.0f, 200.0f, 0.5f);
    private final BooleanSetting collectDropsSetting = new BooleanSetting("Собирать дроп", true);

    private final BooleanSetting runModeSetting = new BooleanSetting("Режим бега", true);
    private final ModeSetting movementMode = new ModeSetting("Тип Движения", "Авто", "Авто", "Движение")
            .setVisible(() -> runModeSetting.get());

    private final BooleanSetting retreatSetting = new BooleanSetting("Убегать от опасности", true);
    private final ModeSetting retreatCondition = new ModeSetting("Условие отступления", "При низком HP",
            "При низком HP", "От крипера", "От всех взрывающихся", "От всех атакующих")
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting retreatDistanceSetting = new SliderSetting("Дистанция бега", 7.0f, 3.0f, 15.0f, 0.5f)
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting rotationSpeed = new SliderSetting("Скорость поворотов", 0.8f, 0.1f, 2.0f, 0.1f);
    private final BooleanSetting predictMovement = new BooleanSetting("Предсказание движения", true);
    private final SliderSetting predictionFactor = new SliderSetting("Фактор предсказания", 0.3f, 0.1f, 0.8f, 0.05f)
            .setVisible(() -> predictMovement.get());

    private final BooleanSetting autoSwitchWeapon = new BooleanSetting("Авто-смена оружия", true);
    private final SliderSetting attackCooldown = new SliderSetting("Задержка атаки (мс)", 500.0f, 100.0f, 2000.0f, 50.0f);
    private final SliderSetting minHealthToFight = new SliderSetting("Мин. HP для боя", 10.0f, 1.0f, 20.0f, 1.0f);

    private final BooleanSetting targetPrioritization = new BooleanSetting("Приоритет целей", true);
    private final ModeSetting priorityMode = new ModeSetting("Приоритет", "Ближайший",
            "Ближайший", "Слабейший", "Сильнейший", "Опаснейший")
            .setVisible(() -> targetPrioritization.get());

    private final BooleanSetting avoidWaterSetting = new BooleanSetting("Избегать воду", true);
    private final BooleanSetting avoidLavaSetting = new BooleanSetting("Избегать лаву", true);

    private final BooleanSetting autoReconnectSetting = new BooleanSetting("Авто переподлючение", false);
    private final SliderSetting reconnectIntervalSetting = new SliderSetting("Интервал переподкл. (мин)", 5.0f, 1.0f, 60.0f, 1.0f)
            .setVisible(() -> autoReconnectSetting.get());

    private static final Minecraft mc = Minecraft.getInstance();
    private LivingEntity targetMob;
    private ItemEntity targetDrop;
    private long lastReconnectTime = 0;
    private long lastAttackTime = 0;
    private boolean isRetreating = false;
    private int retreatTicks = 0;
    private Map<Class<?>, Long> lastAttackTimeByType = new HashMap<>();

 
    private static final Map<Class<?>, Integer> MOB_PRIORITY = new HashMap<>();
    static {
        MOB_PRIORITY.put(CreeperEntity.class, 100);
        MOB_PRIORITY.put(GhastEntity.class, 90);
        MOB_PRIORITY.put(EndermanEntity.class, 80);
        MOB_PRIORITY.put(WitchEntity.class, 70);
        MOB_PRIORITY.put(BlazeEntity.class, 60);
        MOB_PRIORITY.put(SkeletonEntity.class, 50);
        MOB_PRIORITY.put(ZombieEntity.class, 40);
        MOB_PRIORITY.put(SpiderEntity.class, 30);
        MOB_PRIORITY.put(SlimeEntity.class, 20);
        MOB_PRIORITY.put(SilverfishEntity.class, 10);
    }

    public UniversalMobFarm() {
        addSettings(
                mobTypeSetting, modeSetting, distanceSetting, collectDropsSetting,
                runModeSetting, movementMode, retreatSetting, retreatCondition,
                retreatDistanceSetting, autoSwitchWeapon, attackCooldown, minHealthToFight,
                targetPrioritization, priorityMode, rotationSpeed, predictMovement,
                predictionFactor, avoidWaterSetting, avoidLavaSetting,
                autoReconnectSetting, reconnectIntervalSetting
        );
    }

    @Override
    public String getSuffix() {
        return mobTypeSetting.get();
    }

    @Override
    public boolean onEvent(Event event) {
        return false;
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {
        if (mc.world == null || mc.player == null) return;

     
        if (mc.player.getHealth() < minHealthToFight.get() && retreatSetting.get()) {
            retreatFromAll();
            return;
        }

     
        if (collectDropsSetting.get()) {
            targetDrop = findClosestDrop();
            if (targetDrop != null) {
                runToTarget(targetDrop);
                isRetreating = false;
                retreatTicks = 0;
                return;
            }
        }

        targetMob = YaGaYGptLOL();
        if (targetMob == null) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        double distanceSq = mc.player.getDistanceSq(targetMob);
        if (distanceSq > distanceSetting.get() * distanceSetting.get()) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        if (!hasLine(targetMob)) {
            resetMovement();
            return;
        }

        if (retreatSetting.get() && shouldRetreat(targetMob)) {
            retreatFromMob(targetMob);
            isRetreating = true;
            retreatTicks++;
            if (retreatTicks >= 60) {
                isRetreating = false;
                retreatTicks = 0;
            }
        } else {
            if (runModeSetting.get()) {
                runToTarget(targetMob);
            } else {
                aimAtTarget(targetMob);
            }

            if (canAttack(targetMob)) {
                attackMob(targetMob);
            }
            isRetreating = false;
        }

        if (autoReconnectSetting.get()) {
            autoReconnect();
        }
    }

    private LivingEntity YaGaYGptLOL() {
        LivingEntity closestMob = null;
        double closestDistanceSq = Double.MAX_VALUE;
        double bestPriorityScore = -Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof LivingEntity living &&
                    !(entity instanceof PlayerEntity) &&
                    living.isAlive() &&
                    isValidMobType(living)) {

                double distanceSq = mc.player.getDistanceSq(living);
                if (distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(living)) {

                    if (targetPrioritization.get()) {
                        double priorityScore = calculatePriorityScore(living, distanceSq);
                        if (priorityScore > bestPriorityScore) {
                            bestPriorityScore = priorityScore;
                            closestMob = living;
                        }
                    } else if (distanceSq < closestDistanceSq) {
                        closestDistanceSq = distanceSq;
                        closestMob = living;
                    }
                }
            }
        }
        return closestMob;
    }

    private double calculatePriorityScore(LivingEntity mob, double distanceSq) {
        double score = 0;

        switch (priorityMode.get()) {
            case "Ближайший":
                score = -distanceSq;
                break;
            case "Слабейший":
                score = -mob.getHealth();
                break;
            case "Сильнейший":
                score = mob.getHealth();
                break;
            case "Опаснейший":
                int priority = MOB_PRIORITY.getOrDefault(mob.getClass(), 0);
                score = priority - (distanceSq / 100); // Учитываем и дистанцию
                break;
        }

        return score;
    }

    private boolean isValidMobType(LivingEntity mob) {
        String selectedType = mobTypeSetting.get();

        if (selectedType.equals("Все")) return true;

        switch (selectedType) {
            case "Враждебные":
                return mob instanceof MonsterEntity ||
                        mob instanceof GhastEntity ||
                        mob instanceof SlimeEntity;
            case "Мирные":
                return mob instanceof AnimalEntity;
            case "Криперы":
                return mob instanceof CreeperEntity;
            case "Зомби":
                return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity;
            case "Скелеты":
                return mob instanceof SkeletonEntity;
            case "Пауки":
                return mob instanceof SpiderEntity;
            case "Эндермены":
                return mob instanceof EndermanEntity;
            case "Свинозомби":
                return mob instanceof ZombifiedPiglinEntity;
            case "Коровы":
                return mob.getClass().getSimpleName().contains("Cow");
            case "Свиньи":
                return mob.getClass().getSimpleName().contains("Pig");
            case "Овцы":
                return mob.getClass().getSimpleName().contains("Sheep");
            case "Куры":
                return mob.getClass().getSimpleName().contains("Chicken");
            default:
                return false;
        }
    }

    private ItemEntity findClosestDrop() {
        ItemEntity closestDrop = null;
        double closestDistanceSq = Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof ItemEntity item && item.isAlive()) {
                double distanceSq = mc.player.getDistanceSq(item);
                if (distanceSq < closestDistanceSq && distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(item)) {
                    closestDrop = item;
                    closestDistanceSq = distanceSq;
                }
            }
        }
        return closestDrop;
    }

    private boolean hasLine(Entity entity) {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d end = entity.getBoundingBox().getCenter();
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.MISS;
    }

    private boolean hasObstacle() {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d forward = mc.player.getForward().scale(1.5);
        Vector3d end = start.add(forward);
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.BLOCK;
    }

    private boolean shouldRetreat(LivingEntity mob) {
        String condition = retreatCondition.get();

        if (condition.equals("При низком HP")) {
            return mc.player.getHealth() < minHealthToFight.get();
        } else if (condition.equals("От крипера")) {
            return mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f;
        } else if (condition.equals("От всех взрывающихся")) {
            return (mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f) ||
                    (mob instanceof GhastEntity && mob.getAttackingEntity() == mc.player);
        } else if (condition.equals("От всех атакующих")) {
            return mob.getAttackingEntity() == mc.player && mob.getDistance(mc.player) < 3.0;
        }

        return false;
    }

    private void runToTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get();
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            runToTargetKeybinds(target);
        } else {
            runToTargetMove(target);
        }
    }

    private float[] calculateOptimalRotations(Entity entity) {
        Vector3d targetPos = entity.getBoundingBox().getCenter();

        if (predictMovement.get() && entity.getMotion().lengthSquared() > 0.001) {
            double distance = mc.player.getDistance(entity);
            double timeToTarget = distance / 20.0;
            Vector3d predictedMotion = entity.getMotion().scale(timeToTarget * predictionFactor.get());
            targetPos = targetPos.add(predictedMotion);
        }

        Vector3d eyesPos = mc.player.getEyePosition(1.0F);
        double diffX = targetPos.x - eyesPos.x;
        double diffY = targetPos.y - eyesPos.y;
        double diffZ = targetPos.z - eyesPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private float smoothRotation(float current, float target, float factor) {
        float delta = MathHelper.wrapDegrees(target - current);
        return current + delta * MathHelper.clamp(factor, 0.1f, 1.0f);
    }

    private void runToTargetKeybinds(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            mc.gameSettings.keyBindForward.setPressed(true);
            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.gameSettings.keyBindSprint.setPressed(true);
            }

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void runToTargetMove(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = (float) (0.5 * Math.min(distance, 3.0));
            mc.player.moveStrafing = (float) moveX;

            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.player.setSprinting(true);
            } else {
                mc.player.setSprinting(false);
            }

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void aimAtTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get() * 0.3f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    private void retreatFromMob(LivingEntity mob) {
        Vector3d playerPos = mc.player.getPositionVec();
        Vector3d mobPos = mob.getPositionVec();
        Vector3d direction = playerPos.subtract(mobPos).normalize();

        float[] rotations = calculateAwayRotations(mob);
        float rotationFactor = rotationSpeed.get() * 1.2f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            retreatKeybinds(direction);
        } else {
            retreatMove(direction);
        }
    }

    private void retreatFromAll() {
       
        mc.player.rotationYaw += 180;
        mc.player.rotationYaw = MathHelper.wrapDegrees(mc.player.rotationYaw);

        if (movementMode.get().equals("Авто")) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);
        } else {
            mc.player.moveForward = 1.0f;
            mc.player.setSprinting(true);
        }
    }

    private float[] calculateAwayRotations(Entity entity) {
        Vector3d entityPos = entity.getBoundingBox().getCenter();
        Vector3d eyesPos = mc.player.getEyePosition(1.0F);

        double diffX = eyesPos.x - entityPos.x;
        double diffY = eyesPos.y - entityPos.y;
        double diffZ = eyesPos.z - entityPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private void retreatKeybinds(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void retreatMove(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = 1.0f;
            mc.player.moveStrafing = (float) moveX;
            mc.player.setSprinting(true);

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void adjustedStrafeKeybinds(double dx, double dz) {
        float yaw = mc.player.rotationYaw;
        double strafe = 0;

        double angleToTarget = Math.toDegrees(Math.atan2(dz, dx)) - 90 - yaw;
        angleToTarget = MathHelper.wrapDegrees((float) angleToTarget);

        if (Math.abs(angleToTarget) > 45 && Math.abs(angleToTarget) < 135) {
            strafe = angleToTarget > 0 ? 1.0 : -1.0;
        }

        mc.gameSettings.keyBindLeft.setPressed(strafe < -0.1);
        mc.gameSettings.keyBindRight.setPressed(strafe > 0.1);
    }

    private void resetMovementKeybinds() {
        mc.gameSettings.keyBindForward.setPressed(false);
        mc.gameSettings.keyBindBack.setPressed(false);
        mc.gameSettings.keyBindLeft.setPressed(false);
        mc.gameSettings.keyBindRight.setPressed(false);
        mc.gameSettings.keyBindSprint.setPressed(false);
        mc.gameSettings.keyBindJump.setPressed(false);
    }

    private void resetMovementMove() {
        mc.player.moveForward = 0.0f;
        mc.player.moveStrafing = 0.0f;
        mc.player.setSprinting(false);
    }

    private boolean canAttack(LivingEntity mob) {
        if (mob instanceof CreeperEntity) {
            return ((CreeperEntity) mob).getSwelling(1.0f) <= 0.5f;
        }
        return true;
    }

    private void attackMob(LivingEntity mob) {
        long currentTime = System.currentTimeMillis();
        Class<?> mobClass = mob.getClass();
        Long lastAttack = lastAttackTimeByType.get(mobClass);

        if (lastAttack == null || currentTime - lastAttack >= attackCooldown.get()) {
            double distance = mc.player.getDistance(mob);
            if (distance <= 3.5) {
                if (autoSwitchWeapon.get()) {
                    // Здесь можно добавить логику авто-смены оружия
                }

                mc.playerController.attackEntity(mc.player, mob);
                mc.player.swingArm(Hand.MAIN_HAND);
                lastAttackTimeByType.put(mobClass, currentTime);
                lastAttackTime = currentTime;
            }
        }
    }

    private void autoReconnect() {
        long currentTime = System.currentTimeMillis();
        float intervalMinutes = reconnectIntervalSetting.get();
        long intervalMillis = (long) (intervalMinutes * 60 * 1000);

        if (currentTime - lastReconnectTime >= intervalMillis) {
            if (mc.player != null) {
                mc.player.sendChatMessage(".rct");
                lastReconnectTime = currentTime;
            }
        }
    }

    private void resetMovement() {
        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    @Override
    public boolean onEnable() {
        super.onEnable();
        lastReconnectTime = System.currentTimeMillis();
        lastAttackTime = 0;
        isRetreating = false;
        retreatTicks = 0;
        lastAttackTimeByType.clear();
        return false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        resetMovement();
        isRetreating = false;
        retreatTicks = 0;
        targetMob = null;
        targetDrop = null;
        lastAttackTimeByType.clear();
    }

    @Override
    protected float[] rotations(PlayerEntity var1) {
        return new float[0];
    }

    @Override
    public void onTick() {
       
    }
}
/del ss? + Калловый гпт код
 
case "Зомби": return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity
хм, вроде бы тут указано свинозомби
case "Свинозомби": return mob instanceof ZombifiedPiglinEntity;
и тут, огокак. Каков смысл так делать? Зачем тогда добавлять лишнюю свинозомби если, указано в зомби о том что нужно трогать и свинозомби. Попахивает гпт кодом

А так же
case "Коровы": return mob.getClass().getSimpleName().contains("Cow"); case "Свиньи": return mob.getClass().getSimpleName().contains("Pig"); case "Овцы": return mob.getClass().getSimpleName().contains("Sheep"); case "Куры": return mob.getClass().getSimpleName().contains("Chicken");

хотя в начале мы видим это
case "Мирные": return mob instanceof AnimalEntity;
и еще мы видим это в начале
case "Враждебные": return mob instanceof MonsterEntity || mob instanceof GhastEntity || mob instanceof SlimeEntity;
хотя мы отдельно указывали что нужно бить зомби и т.д

если ты бы делал сам, такой бы хуйни не было. А только один вывод. Это гпт
 
Говно которое работает еле как , :catjam: на рв иногда не бьет потому что домер гандон











код:
Expand Collapse Copy
package Kotuk.kit.functions.impl.Util;



import Kotuk.kit.events.EventUpdate;
import Kotuk.kit.functions.api.Category;
import Kotuk.kit.functions.api.Function;
import Kotuk.kit.functions.api.FunctionRegister;
import Kotuk.kit.functions.settings.impl.BooleanSetting;
import Kotuk.kit.functions.settings.impl.ModeSetting;
import Kotuk.kit.functions.settings.impl.SliderSetting;
import com.google.common.eventbus.Subscribe;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.eventbus.api.Event;

import java.util.HashMap;
import java.util.Map;

@FunctionRegister(name = "МобФарм", type = Category.Utils)
public class UniversalMobFarm extends Function {

    private final ModeSetting mobTypeSetting = new ModeSetting("Тип моба", "Все",
            "Все", "Враждебные", "Мирные", "Криперы", "Зомби", "Скелеты", "Пауки", "Эндермены", "Свинозомби", "Коровы", "Свиньи", "Овцы", "Куры");

    private final ModeSetting modeSetting = new ModeSetting("Режим", "Обычный", "Обычный", "Фермерский", "Агрессивный");
    private final SliderSetting distanceSetting = new SliderSetting("Дистанция", 15.0f, 5.0f, 200.0f, 0.5f);
    private final BooleanSetting collectDropsSetting = new BooleanSetting("Собирать дроп", true);

    private final BooleanSetting runModeSetting = new BooleanSetting("Режим бега", true);
    private final ModeSetting movementMode = new ModeSetting("Тип Движения", "Авто", "Авто", "Движение")
            .setVisible(() -> runModeSetting.get());

    private final BooleanSetting retreatSetting = new BooleanSetting("Убегать от опасности", true);
    private final ModeSetting retreatCondition = new ModeSetting("Условие отступления", "При низком HP",
            "При низком HP", "От крипера", "От всех взрывающихся", "От всех атакующих")
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting retreatDistanceSetting = new SliderSetting("Дистанция бега", 7.0f, 3.0f, 15.0f, 0.5f)
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting rotationSpeed = new SliderSetting("Скорость поворотов", 0.8f, 0.1f, 2.0f, 0.1f);
    private final BooleanSetting predictMovement = new BooleanSetting("Предсказание движения", true);
    private final SliderSetting predictionFactor = new SliderSetting("Фактор предсказания", 0.3f, 0.1f, 0.8f, 0.05f)
            .setVisible(() -> predictMovement.get());

    private final BooleanSetting autoSwitchWeapon = new BooleanSetting("Авто-смена оружия", true);
    private final SliderSetting attackCooldown = new SliderSetting("Задержка атаки (мс)", 500.0f, 100.0f, 2000.0f, 50.0f);
    private final SliderSetting minHealthToFight = new SliderSetting("Мин. HP для боя", 10.0f, 1.0f, 20.0f, 1.0f);

    private final BooleanSetting targetPrioritization = new BooleanSetting("Приоритет целей", true);
    private final ModeSetting priorityMode = new ModeSetting("Приоритет", "Ближайший",
            "Ближайший", "Слабейший", "Сильнейший", "Опаснейший")
            .setVisible(() -> targetPrioritization.get());

    private final BooleanSetting avoidWaterSetting = new BooleanSetting("Избегать воду", true);
    private final BooleanSetting avoidLavaSetting = new BooleanSetting("Избегать лаву", true);

    private final BooleanSetting autoReconnectSetting = new BooleanSetting("Авто переподлючение", false);
    private final SliderSetting reconnectIntervalSetting = new SliderSetting("Интервал переподкл. (мин)", 5.0f, 1.0f, 60.0f, 1.0f)
            .setVisible(() -> autoReconnectSetting.get());

    private static final Minecraft mc = Minecraft.getInstance();
    private LivingEntity targetMob;
    private ItemEntity targetDrop;
    private long lastReconnectTime = 0;
    private long lastAttackTime = 0;
    private boolean isRetreating = false;
    private int retreatTicks = 0;
    private Map<Class<?>, Long> lastAttackTimeByType = new HashMap<>();

 
    private static final Map<Class<?>, Integer> MOB_PRIORITY = new HashMap<>();
    static {
        MOB_PRIORITY.put(CreeperEntity.class, 100);
        MOB_PRIORITY.put(GhastEntity.class, 90);
        MOB_PRIORITY.put(EndermanEntity.class, 80);
        MOB_PRIORITY.put(WitchEntity.class, 70);
        MOB_PRIORITY.put(BlazeEntity.class, 60);
        MOB_PRIORITY.put(SkeletonEntity.class, 50);
        MOB_PRIORITY.put(ZombieEntity.class, 40);
        MOB_PRIORITY.put(SpiderEntity.class, 30);
        MOB_PRIORITY.put(SlimeEntity.class, 20);
        MOB_PRIORITY.put(SilverfishEntity.class, 10);
    }

    public UniversalMobFarm() {
        addSettings(
                mobTypeSetting, modeSetting, distanceSetting, collectDropsSetting,
                runModeSetting, movementMode, retreatSetting, retreatCondition,
                retreatDistanceSetting, autoSwitchWeapon, attackCooldown, minHealthToFight,
                targetPrioritization, priorityMode, rotationSpeed, predictMovement,
                predictionFactor, avoidWaterSetting, avoidLavaSetting,
                autoReconnectSetting, reconnectIntervalSetting
        );
    }

    @Override
    public String getSuffix() {
        return mobTypeSetting.get();
    }

    @Override
    public boolean onEvent(Event event) {
        return false;
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {
        if (mc.world == null || mc.player == null) return;

     
        if (mc.player.getHealth() < minHealthToFight.get() && retreatSetting.get()) {
            retreatFromAll();
            return;
        }

     
        if (collectDropsSetting.get()) {
            targetDrop = findClosestDrop();
            if (targetDrop != null) {
                runToTarget(targetDrop);
                isRetreating = false;
                retreatTicks = 0;
                return;
            }
        }

        targetMob = YaGaYGptLOL();
        if (targetMob == null) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        double distanceSq = mc.player.getDistanceSq(targetMob);
        if (distanceSq > distanceSetting.get() * distanceSetting.get()) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        if (!hasLine(targetMob)) {
            resetMovement();
            return;
        }

        if (retreatSetting.get() && shouldRetreat(targetMob)) {
            retreatFromMob(targetMob);
            isRetreating = true;
            retreatTicks++;
            if (retreatTicks >= 60) {
                isRetreating = false;
                retreatTicks = 0;
            }
        } else {
            if (runModeSetting.get()) {
                runToTarget(targetMob);
            } else {
                aimAtTarget(targetMob);
            }

            if (canAttack(targetMob)) {
                attackMob(targetMob);
            }
            isRetreating = false;
        }

        if (autoReconnectSetting.get()) {
            autoReconnect();
        }
    }

    private LivingEntity YaGaYGptLOL() {
        LivingEntity closestMob = null;
        double closestDistanceSq = Double.MAX_VALUE;
        double bestPriorityScore = -Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof LivingEntity living &&
                    !(entity instanceof PlayerEntity) &&
                    living.isAlive() &&
                    isValidMobType(living)) {

                double distanceSq = mc.player.getDistanceSq(living);
                if (distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(living)) {

                    if (targetPrioritization.get()) {
                        double priorityScore = calculatePriorityScore(living, distanceSq);
                        if (priorityScore > bestPriorityScore) {
                            bestPriorityScore = priorityScore;
                            closestMob = living;
                        }
                    } else if (distanceSq < closestDistanceSq) {
                        closestDistanceSq = distanceSq;
                        closestMob = living;
                    }
                }
            }
        }
        return closestMob;
    }

    private double calculatePriorityScore(LivingEntity mob, double distanceSq) {
        double score = 0;

        switch (priorityMode.get()) {
            case "Ближайший":
                score = -distanceSq;
                break;
            case "Слабейший":
                score = -mob.getHealth();
                break;
            case "Сильнейший":
                score = mob.getHealth();
                break;
            case "Опаснейший":
                int priority = MOB_PRIORITY.getOrDefault(mob.getClass(), 0);
                score = priority - (distanceSq / 100); // Учитываем и дистанцию
                break;
        }

        return score;
    }

    private boolean isValidMobType(LivingEntity mob) {
        String selectedType = mobTypeSetting.get();

        if (selectedType.equals("Все")) return true;

        switch (selectedType) {
            case "Враждебные":
                return mob instanceof MonsterEntity ||
                        mob instanceof GhastEntity ||
                        mob instanceof SlimeEntity;
            case "Мирные":
                return mob instanceof AnimalEntity;
            case "Криперы":
                return mob instanceof CreeperEntity;
            case "Зомби":
                return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity;
            case "Скелеты":
                return mob instanceof SkeletonEntity;
            case "Пауки":
                return mob instanceof SpiderEntity;
            case "Эндермены":
                return mob instanceof EndermanEntity;
            case "Свинозомби":
                return mob instanceof ZombifiedPiglinEntity;
            case "Коровы":
                return mob.getClass().getSimpleName().contains("Cow");
            case "Свиньи":
                return mob.getClass().getSimpleName().contains("Pig");
            case "Овцы":
                return mob.getClass().getSimpleName().contains("Sheep");
            case "Куры":
                return mob.getClass().getSimpleName().contains("Chicken");
            default:
                return false;
        }
    }

    private ItemEntity findClosestDrop() {
        ItemEntity closestDrop = null;
        double closestDistanceSq = Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof ItemEntity item && item.isAlive()) {
                double distanceSq = mc.player.getDistanceSq(item);
                if (distanceSq < closestDistanceSq && distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(item)) {
                    closestDrop = item;
                    closestDistanceSq = distanceSq;
                }
            }
        }
        return closestDrop;
    }

    private boolean hasLine(Entity entity) {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d end = entity.getBoundingBox().getCenter();
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.MISS;
    }

    private boolean hasObstacle() {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d forward = mc.player.getForward().scale(1.5);
        Vector3d end = start.add(forward);
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.BLOCK;
    }

    private boolean shouldRetreat(LivingEntity mob) {
        String condition = retreatCondition.get();

        if (condition.equals("При низком HP")) {
            return mc.player.getHealth() < minHealthToFight.get();
        } else if (condition.equals("От крипера")) {
            return mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f;
        } else if (condition.equals("От всех взрывающихся")) {
            return (mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f) ||
                    (mob instanceof GhastEntity && mob.getAttackingEntity() == mc.player);
        } else if (condition.equals("От всех атакующих")) {
            return mob.getAttackingEntity() == mc.player && mob.getDistance(mc.player) < 3.0;
        }

        return false;
    }

    private void runToTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get();
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            runToTargetKeybinds(target);
        } else {
            runToTargetMove(target);
        }
    }

    private float[] calculateOptimalRotations(Entity entity) {
        Vector3d targetPos = entity.getBoundingBox().getCenter();

        if (predictMovement.get() && entity.getMotion().lengthSquared() > 0.001) {
            double distance = mc.player.getDistance(entity);
            double timeToTarget = distance / 20.0;
            Vector3d predictedMotion = entity.getMotion().scale(timeToTarget * predictionFactor.get());
            targetPos = targetPos.add(predictedMotion);
        }

        Vector3d eyesPos = mc.player.getEyePosition(1.0F);
        double diffX = targetPos.x - eyesPos.x;
        double diffY = targetPos.y - eyesPos.y;
        double diffZ = targetPos.z - eyesPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private float smoothRotation(float current, float target, float factor) {
        float delta = MathHelper.wrapDegrees(target - current);
        return current + delta * MathHelper.clamp(factor, 0.1f, 1.0f);
    }

    private void runToTargetKeybinds(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            mc.gameSettings.keyBindForward.setPressed(true);
            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.gameSettings.keyBindSprint.setPressed(true);
            }

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void runToTargetMove(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = (float) (0.5 * Math.min(distance, 3.0));
            mc.player.moveStrafing = (float) moveX;

            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.player.setSprinting(true);
            } else {
                mc.player.setSprinting(false);
            }

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void aimAtTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get() * 0.3f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    private void retreatFromMob(LivingEntity mob) {
        Vector3d playerPos = mc.player.getPositionVec();
        Vector3d mobPos = mob.getPositionVec();
        Vector3d direction = playerPos.subtract(mobPos).normalize();

        float[] rotations = calculateAwayRotations(mob);
        float rotationFactor = rotationSpeed.get() * 1.2f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            retreatKeybinds(direction);
        } else {
            retreatMove(direction);
        }
    }

    private void retreatFromAll() {
       
        mc.player.rotationYaw += 180;
        mc.player.rotationYaw = MathHelper.wrapDegrees(mc.player.rotationYaw);

        if (movementMode.get().equals("Авто")) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);
        } else {
            mc.player.moveForward = 1.0f;
            mc.player.setSprinting(true);
        }
    }

    private float[] calculateAwayRotations(Entity entity) {
        Vector3d entityPos = entity.getBoundingBox().getCenter();
        Vector3d eyesPos = mc.player.getEyePosition(1.0F);

        double diffX = eyesPos.x - entityPos.x;
        double diffY = eyesPos.y - entityPos.y;
        double diffZ = eyesPos.z - entityPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private void retreatKeybinds(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void retreatMove(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = 1.0f;
            mc.player.moveStrafing = (float) moveX;
            mc.player.setSprinting(true);

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void adjustedStrafeKeybinds(double dx, double dz) {
        float yaw = mc.player.rotationYaw;
        double strafe = 0;

        double angleToTarget = Math.toDegrees(Math.atan2(dz, dx)) - 90 - yaw;
        angleToTarget = MathHelper.wrapDegrees((float) angleToTarget);

        if (Math.abs(angleToTarget) > 45 && Math.abs(angleToTarget) < 135) {
            strafe = angleToTarget > 0 ? 1.0 : -1.0;
        }

        mc.gameSettings.keyBindLeft.setPressed(strafe < -0.1);
        mc.gameSettings.keyBindRight.setPressed(strafe > 0.1);
    }

    private void resetMovementKeybinds() {
        mc.gameSettings.keyBindForward.setPressed(false);
        mc.gameSettings.keyBindBack.setPressed(false);
        mc.gameSettings.keyBindLeft.setPressed(false);
        mc.gameSettings.keyBindRight.setPressed(false);
        mc.gameSettings.keyBindSprint.setPressed(false);
        mc.gameSettings.keyBindJump.setPressed(false);
    }

    private void resetMovementMove() {
        mc.player.moveForward = 0.0f;
        mc.player.moveStrafing = 0.0f;
        mc.player.setSprinting(false);
    }

    private boolean canAttack(LivingEntity mob) {
        if (mob instanceof CreeperEntity) {
            return ((CreeperEntity) mob).getSwelling(1.0f) <= 0.5f;
        }
        return true;
    }

    private void attackMob(LivingEntity mob) {
        long currentTime = System.currentTimeMillis();
        Class<?> mobClass = mob.getClass();
        Long lastAttack = lastAttackTimeByType.get(mobClass);

        if (lastAttack == null || currentTime - lastAttack >= attackCooldown.get()) {
            double distance = mc.player.getDistance(mob);
            if (distance <= 3.5) {
                if (autoSwitchWeapon.get()) {
                    // Здесь можно добавить логику авто-смены оружия
                }

                mc.playerController.attackEntity(mc.player, mob);
                mc.player.swingArm(Hand.MAIN_HAND);
                lastAttackTimeByType.put(mobClass, currentTime);
                lastAttackTime = currentTime;
            }
        }
    }

    private void autoReconnect() {
        long currentTime = System.currentTimeMillis();
        float intervalMinutes = reconnectIntervalSetting.get();
        long intervalMillis = (long) (intervalMinutes * 60 * 1000);

        if (currentTime - lastReconnectTime >= intervalMillis) {
            if (mc.player != null) {
                mc.player.sendChatMessage(".rct");
                lastReconnectTime = currentTime;
            }
        }
    }

    private void resetMovement() {
        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    @Override
    public boolean onEnable() {
        super.onEnable();
        lastReconnectTime = System.currentTimeMillis();
        lastAttackTime = 0;
        isRetreating = false;
        retreatTicks = 0;
        lastAttackTimeByType.clear();
        return false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        resetMovement();
        isRetreating = false;
        retreatTicks = 0;
        targetMob = null;
        targetDrop = null;
        lastAttackTimeByType.clear();
    }

    @Override
    protected float[] rotations(PlayerEntity var1) {
        return new float[0];
    }

    @Override
    public void onTick() {
       
    }
}
/del
 
Говно которое работает еле как , :catjam: на рв иногда не бьет потому что домер гандон











код:
Expand Collapse Copy
package Kotuk.kit.functions.impl.Util;



import Kotuk.kit.events.EventUpdate;
import Kotuk.kit.functions.api.Category;
import Kotuk.kit.functions.api.Function;
import Kotuk.kit.functions.api.FunctionRegister;
import Kotuk.kit.functions.settings.impl.BooleanSetting;
import Kotuk.kit.functions.settings.impl.ModeSetting;
import Kotuk.kit.functions.settings.impl.SliderSetting;
import com.google.common.eventbus.Subscribe;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.*;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Items;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraftforge.eventbus.api.Event;

import java.util.HashMap;
import java.util.Map;

@FunctionRegister(name = "МобФарм", type = Category.Utils)
public class UniversalMobFarm extends Function {

    private final ModeSetting mobTypeSetting = new ModeSetting("Тип моба", "Все",
            "Все", "Враждебные", "Мирные", "Криперы", "Зомби", "Скелеты", "Пауки", "Эндермены", "Свинозомби", "Коровы", "Свиньи", "Овцы", "Куры");

    private final ModeSetting modeSetting = new ModeSetting("Режим", "Обычный", "Обычный", "Фермерский", "Агрессивный");
    private final SliderSetting distanceSetting = new SliderSetting("Дистанция", 15.0f, 5.0f, 200.0f, 0.5f);
    private final BooleanSetting collectDropsSetting = new BooleanSetting("Собирать дроп", true);

    private final BooleanSetting runModeSetting = new BooleanSetting("Режим бега", true);
    private final ModeSetting movementMode = new ModeSetting("Тип Движения", "Авто", "Авто", "Движение")
            .setVisible(() -> runModeSetting.get());

    private final BooleanSetting retreatSetting = new BooleanSetting("Убегать от опасности", true);
    private final ModeSetting retreatCondition = new ModeSetting("Условие отступления", "При низком HP",
            "При низком HP", "От крипера", "От всех взрывающихся", "От всех атакующих")
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting retreatDistanceSetting = new SliderSetting("Дистанция бега", 7.0f, 3.0f, 15.0f, 0.5f)
            .setVisible(() -> retreatSetting.get());

    private final SliderSetting rotationSpeed = new SliderSetting("Скорость поворотов", 0.8f, 0.1f, 2.0f, 0.1f);
    private final BooleanSetting predictMovement = new BooleanSetting("Предсказание движения", true);
    private final SliderSetting predictionFactor = new SliderSetting("Фактор предсказания", 0.3f, 0.1f, 0.8f, 0.05f)
            .setVisible(() -> predictMovement.get());

    private final BooleanSetting autoSwitchWeapon = new BooleanSetting("Авто-смена оружия", true);
    private final SliderSetting attackCooldown = new SliderSetting("Задержка атаки (мс)", 500.0f, 100.0f, 2000.0f, 50.0f);
    private final SliderSetting minHealthToFight = new SliderSetting("Мин. HP для боя", 10.0f, 1.0f, 20.0f, 1.0f);

    private final BooleanSetting targetPrioritization = new BooleanSetting("Приоритет целей", true);
    private final ModeSetting priorityMode = new ModeSetting("Приоритет", "Ближайший",
            "Ближайший", "Слабейший", "Сильнейший", "Опаснейший")
            .setVisible(() -> targetPrioritization.get());

    private final BooleanSetting avoidWaterSetting = new BooleanSetting("Избегать воду", true);
    private final BooleanSetting avoidLavaSetting = new BooleanSetting("Избегать лаву", true);

    private final BooleanSetting autoReconnectSetting = new BooleanSetting("Авто переподлючение", false);
    private final SliderSetting reconnectIntervalSetting = new SliderSetting("Интервал переподкл. (мин)", 5.0f, 1.0f, 60.0f, 1.0f)
            .setVisible(() -> autoReconnectSetting.get());

    private static final Minecraft mc = Minecraft.getInstance();
    private LivingEntity targetMob;
    private ItemEntity targetDrop;
    private long lastReconnectTime = 0;
    private long lastAttackTime = 0;
    private boolean isRetreating = false;
    private int retreatTicks = 0;
    private Map<Class<?>, Long> lastAttackTimeByType = new HashMap<>();

 
    private static final Map<Class<?>, Integer> MOB_PRIORITY = new HashMap<>();
    static {
        MOB_PRIORITY.put(CreeperEntity.class, 100);
        MOB_PRIORITY.put(GhastEntity.class, 90);
        MOB_PRIORITY.put(EndermanEntity.class, 80);
        MOB_PRIORITY.put(WitchEntity.class, 70);
        MOB_PRIORITY.put(BlazeEntity.class, 60);
        MOB_PRIORITY.put(SkeletonEntity.class, 50);
        MOB_PRIORITY.put(ZombieEntity.class, 40);
        MOB_PRIORITY.put(SpiderEntity.class, 30);
        MOB_PRIORITY.put(SlimeEntity.class, 20);
        MOB_PRIORITY.put(SilverfishEntity.class, 10);
    }

    public UniversalMobFarm() {
        addSettings(
                mobTypeSetting, modeSetting, distanceSetting, collectDropsSetting,
                runModeSetting, movementMode, retreatSetting, retreatCondition,
                retreatDistanceSetting, autoSwitchWeapon, attackCooldown, minHealthToFight,
                targetPrioritization, priorityMode, rotationSpeed, predictMovement,
                predictionFactor, avoidWaterSetting, avoidLavaSetting,
                autoReconnectSetting, reconnectIntervalSetting
        );
    }

    @Override
    public String getSuffix() {
        return mobTypeSetting.get();
    }

    @Override
    public boolean onEvent(Event event) {
        return false;
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {
        if (mc.world == null || mc.player == null) return;

     
        if (mc.player.getHealth() < minHealthToFight.get() && retreatSetting.get()) {
            retreatFromAll();
            return;
        }

     
        if (collectDropsSetting.get()) {
            targetDrop = findClosestDrop();
            if (targetDrop != null) {
                runToTarget(targetDrop);
                isRetreating = false;
                retreatTicks = 0;
                return;
            }
        }

        targetMob = YaGaYGptLOL();
        if (targetMob == null) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        double distanceSq = mc.player.getDistanceSq(targetMob);
        if (distanceSq > distanceSetting.get() * distanceSetting.get()) {
            resetMovement();
            isRetreating = false;
            retreatTicks = 0;
            return;
        }

        if (!hasLine(targetMob)) {
            resetMovement();
            return;
        }

        if (retreatSetting.get() && shouldRetreat(targetMob)) {
            retreatFromMob(targetMob);
            isRetreating = true;
            retreatTicks++;
            if (retreatTicks >= 60) {
                isRetreating = false;
                retreatTicks = 0;
            }
        } else {
            if (runModeSetting.get()) {
                runToTarget(targetMob);
            } else {
                aimAtTarget(targetMob);
            }

            if (canAttack(targetMob)) {
                attackMob(targetMob);
            }
            isRetreating = false;
        }

        if (autoReconnectSetting.get()) {
            autoReconnect();
        }
    }

    private LivingEntity YaGaYGptLOL() {
        LivingEntity closestMob = null;
        double closestDistanceSq = Double.MAX_VALUE;
        double bestPriorityScore = -Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof LivingEntity living &&
                    !(entity instanceof PlayerEntity) &&
                    living.isAlive() &&
                    isValidMobType(living)) {

                double distanceSq = mc.player.getDistanceSq(living);
                if (distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(living)) {

                    if (targetPrioritization.get()) {
                        double priorityScore = calculatePriorityScore(living, distanceSq);
                        if (priorityScore > bestPriorityScore) {
                            bestPriorityScore = priorityScore;
                            closestMob = living;
                        }
                    } else if (distanceSq < closestDistanceSq) {
                        closestDistanceSq = distanceSq;
                        closestMob = living;
                    }
                }
            }
        }
        return closestMob;
    }

    private double calculatePriorityScore(LivingEntity mob, double distanceSq) {
        double score = 0;

        switch (priorityMode.get()) {
            case "Ближайший":
                score = -distanceSq;
                break;
            case "Слабейший":
                score = -mob.getHealth();
                break;
            case "Сильнейший":
                score = mob.getHealth();
                break;
            case "Опаснейший":
                int priority = MOB_PRIORITY.getOrDefault(mob.getClass(), 0);
                score = priority - (distanceSq / 100); // Учитываем и дистанцию
                break;
        }

        return score;
    }

    private boolean isValidMobType(LivingEntity mob) {
        String selectedType = mobTypeSetting.get();

        if (selectedType.equals("Все")) return true;

        switch (selectedType) {
            case "Враждебные":
                return mob instanceof MonsterEntity ||
                        mob instanceof GhastEntity ||
                        mob instanceof SlimeEntity;
            case "Мирные":
                return mob instanceof AnimalEntity;
            case "Криперы":
                return mob instanceof CreeperEntity;
            case "Зомби":
                return mob instanceof ZombieEntity || mob instanceof ZombifiedPiglinEntity;
            case "Скелеты":
                return mob instanceof SkeletonEntity;
            case "Пауки":
                return mob instanceof SpiderEntity;
            case "Эндермены":
                return mob instanceof EndermanEntity;
            case "Свинозомби":
                return mob instanceof ZombifiedPiglinEntity;
            case "Коровы":
                return mob.getClass().getSimpleName().contains("Cow");
            case "Свиньи":
                return mob.getClass().getSimpleName().contains("Pig");
            case "Овцы":
                return mob.getClass().getSimpleName().contains("Sheep");
            case "Куры":
                return mob.getClass().getSimpleName().contains("Chicken");
            default:
                return false;
        }
    }

    private ItemEntity findClosestDrop() {
        ItemEntity closestDrop = null;
        double closestDistanceSq = Double.MAX_VALUE;

        for (Entity entity : mc.world.getAllEntities()) {
            if (entity instanceof ItemEntity item && item.isAlive()) {
                double distanceSq = mc.player.getDistanceSq(item);
                if (distanceSq < closestDistanceSq && distanceSq <= distanceSetting.get() * distanceSetting.get() && hasLine(item)) {
                    closestDrop = item;
                    closestDistanceSq = distanceSq;
                }
            }
        }
        return closestDrop;
    }

    private boolean hasLine(Entity entity) {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d end = entity.getBoundingBox().getCenter();
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.MISS;
    }

    private boolean hasObstacle() {
        Vector3d start = mc.player.getEyePosition(1.0F);
        Vector3d forward = mc.player.getForward().scale(1.5);
        Vector3d end = start.add(forward);
        RayTraceContext context = new RayTraceContext(start, end, RayTraceContext.BlockMode.COLLIDER, RayTraceContext.FluidMode.NONE, mc.player);
        RayTraceResult result = mc.world.rayTraceBlocks(context);
        return result.getType() == RayTraceResult.Type.BLOCK;
    }

    private boolean shouldRetreat(LivingEntity mob) {
        String condition = retreatCondition.get();

        if (condition.equals("При низком HP")) {
            return mc.player.getHealth() < minHealthToFight.get();
        } else if (condition.equals("От крипера")) {
            return mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f;
        } else if (condition.equals("От всех взрывающихся")) {
            return (mob instanceof CreeperEntity && ((CreeperEntity) mob).getSwelling(1.0f) > 0.3f) ||
                    (mob instanceof GhastEntity && mob.getAttackingEntity() == mc.player);
        } else if (condition.equals("От всех атакующих")) {
            return mob.getAttackingEntity() == mc.player && mob.getDistance(mc.player) < 3.0;
        }

        return false;
    }

    private void runToTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get();
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            runToTargetKeybinds(target);
        } else {
            runToTargetMove(target);
        }
    }

    private float[] calculateOptimalRotations(Entity entity) {
        Vector3d targetPos = entity.getBoundingBox().getCenter();

        if (predictMovement.get() && entity.getMotion().lengthSquared() > 0.001) {
            double distance = mc.player.getDistance(entity);
            double timeToTarget = distance / 20.0;
            Vector3d predictedMotion = entity.getMotion().scale(timeToTarget * predictionFactor.get());
            targetPos = targetPos.add(predictedMotion);
        }

        Vector3d eyesPos = mc.player.getEyePosition(1.0F);
        double diffX = targetPos.x - eyesPos.x;
        double diffY = targetPos.y - eyesPos.y;
        double diffZ = targetPos.z - eyesPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private float smoothRotation(float current, float target, float factor) {
        float delta = MathHelper.wrapDegrees(target - current);
        return current + delta * MathHelper.clamp(factor, 0.1f, 1.0f);
    }

    private void runToTargetKeybinds(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            mc.gameSettings.keyBindForward.setPressed(true);
            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.gameSettings.keyBindSprint.setPressed(true);
            }

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void runToTargetMove(Entity target) {
        double dx = target.getPosX() - mc.player.getPosX();
        double dz = target.getPosZ() - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 1.5) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = (float) (0.5 * Math.min(distance, 3.0));
            mc.player.moveStrafing = (float) moveX;

            if (mc.player.getFoodStats().getFoodLevel() > 6 && modeSetting.get().equals("Агрессивный")) {
                mc.player.setSprinting(true);
            } else {
                mc.player.setSprinting(false);
            }

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void aimAtTarget(Entity target) {
        float[] rotations = calculateOptimalRotations(target);
        float rotationFactor = rotationSpeed.get() * 0.3f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    private void retreatFromMob(LivingEntity mob) {
        Vector3d playerPos = mc.player.getPositionVec();
        Vector3d mobPos = mob.getPositionVec();
        Vector3d direction = playerPos.subtract(mobPos).normalize();

        float[] rotations = calculateAwayRotations(mob);
        float rotationFactor = rotationSpeed.get() * 1.2f;
        mc.player.rotationYaw = smoothRotation(mc.player.rotationYaw, rotations[0], rotationFactor);
        mc.player.rotationPitch = smoothRotation(mc.player.rotationPitch, rotations[1], rotationFactor);

        if (movementMode.get().equals("Авто")) {
            retreatKeybinds(direction);
        } else {
            retreatMove(direction);
        }
    }

    private void retreatFromAll() {
       
        mc.player.rotationYaw += 180;
        mc.player.rotationYaw = MathHelper.wrapDegrees(mc.player.rotationYaw);

        if (movementMode.get().equals("Авто")) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);
        } else {
            mc.player.moveForward = 1.0f;
            mc.player.setSprinting(true);
        }
    }

    private float[] calculateAwayRotations(Entity entity) {
        Vector3d entityPos = entity.getBoundingBox().getCenter();
        Vector3d eyesPos = mc.player.getEyePosition(1.0F);

        double diffX = eyesPos.x - entityPos.x;
        double diffY = eyesPos.y - entityPos.y;
        double diffZ = eyesPos.z - entityPos.z;

        double diffXZ = Math.sqrt(diffX * diffX + diffZ * diffZ);

        float yaw = (float) Math.toDegrees(Math.atan2(diffZ, diffX)) - 90.0F;
        float pitch = (float) -Math.toDegrees(Math.atan2(diffY, diffXZ));

        yaw = MathHelper.wrapDegrees(yaw);
        pitch = MathHelper.clamp(pitch, -90.0F, 90.0F);

        return new float[]{yaw, pitch};
    }

    private void retreatKeybinds(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            mc.gameSettings.keyBindForward.setPressed(true);
            mc.gameSettings.keyBindSprint.setPressed(true);

            if (modeSetting.get().equals("Фермерский") || hasObstacle()) {
                mc.gameSettings.keyBindJump.setPressed(true);
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
                adjustedStrafeKeybinds(dx, dz);
            } else {
                adjustedStrafeKeybinds(dx, dz);
            }
        } else {
            resetMovementKeybinds();
        }
    }

    private void retreatMove(Vector3d direction) {
        double retreatX = mc.player.getPosX() + direction.x * retreatDistanceSetting.get();
        double retreatZ = mc.player.getPosZ() + direction.z * retreatDistanceSetting.get();
        double dx = retreatX - mc.player.getPosX();
        double dz = retreatZ - mc.player.getPosZ();
        double distance = Math.sqrt(dx * dx + dz * dz);

        if (distance > 0.1) {
            double angle = Math.atan2(dz, dx) - Math.toRadians(mc.player.rotationYaw + 90);
            double moveX = Math.sin(angle);
            double moveZ = Math.cos(angle);

            mc.player.moveForward = 1.0f;
            mc.player.moveStrafing = (float) moveX;
            mc.player.setSprinting(true);

            if ((modeSetting.get().equals("Фермерский") || hasObstacle()) && mc.player.isOnGround()) {
                mc.player.jump();
                if (modeSetting.get().equals("Фермерский")) {
                    mc.player.jumpTicks = 0;
                }
            }
        } else {
            resetMovementMove();
        }
    }

    private void adjustedStrafeKeybinds(double dx, double dz) {
        float yaw = mc.player.rotationYaw;
        double strafe = 0;

        double angleToTarget = Math.toDegrees(Math.atan2(dz, dx)) - 90 - yaw;
        angleToTarget = MathHelper.wrapDegrees((float) angleToTarget);

        if (Math.abs(angleToTarget) > 45 && Math.abs(angleToTarget) < 135) {
            strafe = angleToTarget > 0 ? 1.0 : -1.0;
        }

        mc.gameSettings.keyBindLeft.setPressed(strafe < -0.1);
        mc.gameSettings.keyBindRight.setPressed(strafe > 0.1);
    }

    private void resetMovementKeybinds() {
        mc.gameSettings.keyBindForward.setPressed(false);
        mc.gameSettings.keyBindBack.setPressed(false);
        mc.gameSettings.keyBindLeft.setPressed(false);
        mc.gameSettings.keyBindRight.setPressed(false);
        mc.gameSettings.keyBindSprint.setPressed(false);
        mc.gameSettings.keyBindJump.setPressed(false);
    }

    private void resetMovementMove() {
        mc.player.moveForward = 0.0f;
        mc.player.moveStrafing = 0.0f;
        mc.player.setSprinting(false);
    }

    private boolean canAttack(LivingEntity mob) {
        if (mob instanceof CreeperEntity) {
            return ((CreeperEntity) mob).getSwelling(1.0f) <= 0.5f;
        }
        return true;
    }

    private void attackMob(LivingEntity mob) {
        long currentTime = System.currentTimeMillis();
        Class<?> mobClass = mob.getClass();
        Long lastAttack = lastAttackTimeByType.get(mobClass);

        if (lastAttack == null || currentTime - lastAttack >= attackCooldown.get()) {
            double distance = mc.player.getDistance(mob);
            if (distance <= 3.5) {
                if (autoSwitchWeapon.get()) {
                    // Здесь можно добавить логику авто-смены оружия
                }

                mc.playerController.attackEntity(mc.player, mob);
                mc.player.swingArm(Hand.MAIN_HAND);
                lastAttackTimeByType.put(mobClass, currentTime);
                lastAttackTime = currentTime;
            }
        }
    }

    private void autoReconnect() {
        long currentTime = System.currentTimeMillis();
        float intervalMinutes = reconnectIntervalSetting.get();
        long intervalMillis = (long) (intervalMinutes * 60 * 1000);

        if (currentTime - lastReconnectTime >= intervalMillis) {
            if (mc.player != null) {
                mc.player.sendChatMessage(".rct");
                lastReconnectTime = currentTime;
            }
        }
    }

    private void resetMovement() {
        if (movementMode.get().equals("Авто")) {
            resetMovementKeybinds();
        } else {
            resetMovementMove();
        }
    }

    @Override
    public boolean onEnable() {
        super.onEnable();
        lastReconnectTime = System.currentTimeMillis();
        lastAttackTime = 0;
        isRetreating = false;
        retreatTicks = 0;
        lastAttackTimeByType.clear();
        return false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        resetMovement();
        isRetreating = false;
        retreatTicks = 0;
        targetMob = null;
        targetDrop = null;
        lastAttackTimeByType.clear();
    }

    @Override
    protected float[] rotations(PlayerEntity var1) {
        return new float[0];
    }

    @Override
    public void onTick() {
       
    }
}
Под чем модеры?
 
хм, вроде бы тут указано свинозомби

и тут, огокак. Каков смысл так делать? Зачем тогда добавлять лишнюю свинозомби если, указано в зомби о том что нужно трогать и свинозомби. Попахивает гпт кодом

А так же


хотя в начале мы видим это

и еще мы видим это в начале

хотя мы отдельно указывали что нужно бить зомби и т.д

если ты бы делал сам, такой бы хуйни не было. А только один вывод. Это гпт
сделанно чтобы монж было выбрать какие мобы будут аттакованны
/del no ss + kall + ne rabotaet + ne na 3.1 + ne obhod + gpt
обходит гпт не отрицаю все работает и на 3.1
 
Назад
Сверху Снизу