Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Часть функционала SoulFarm / AutoSteal CakeWorld | Expensive 3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
15 Мар 2025
Сообщения
333
Реакции
2
Выберите загрузчик игры
  1. Vanilla
  2. OptiFine
Сделал еще в конце октября для кента. Код хуетень и обновлять я его не пытался. skipGrief2 avoidPvP не доделал
ss:

Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

upd: оно теперь не прыгает перед ломанием тыквы и ломает быстрее

Код:
Expand Collapse Copy
package client.chss.main.clientmodules.main.combat;

import client.chss.cmd.Logger;
import client.chss.events.EventUpdate;
import client.chss.main.clientmodules.api.Category;
import client.chss.main.clientmodules.api.Function;
import client.chss.main.clientmodules.api.FunctionRegister;
import client.chss.main.clientmodules.settings.impl.BooleanSetting;
import client.chss.main.clientmodules.settings.impl.ModeSetting;
import client.chss.main.clientmodules.settings.impl.SliderSetting;
import client.chss.main.utils.client.ClientUtil;
import com.google.common.eventbus.Subscribe;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.inventory.container.ClickType;
import net.minecraft.item.Items;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.network.play.client.CPlayerTryUseItemPacket;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;

import java.util.ArrayList;
import java.util.List;

@FunctionRegister(name = "SoulFarm", type = Category.Miscellaneous, description = "Ломает тыквы на варпах")
public class HeadBreaker extends Function {
    public ModeSetting serv = new ModeSetting("Сервер", "CakeWorld","CakeWorld");
    public ModeSetting griefMode = new ModeSetting("Собрать на", "3 Грифах", "3 Грифах", "На данном грифе");
    public SliderSetting headsCount = new SliderSetting("Кол-во тыкв", 1f, 2f, 27f, 1f);
    public SliderSetting maxRetries = new SliderSetting("Макс. попыток", 3f, 1f, 10f, 1f);
    public BooleanSetting skipGrief2 = new BooleanSetting("Пропускать 2 гриф", false);
    public BooleanSetting avoidPvP = new BooleanSetting("Избегать PvP", true);

    private String currentWarp = "zaharovfunction1";
    private int currentGrif = 1;
    private int stage = 0;
    private int delay = 0;
    private BlockPos targetHead = null;
    private int breakTicks = 0;
    private boolean isBreaking = false;
    private Logger logger;
    private boolean isOnGrief = false;
    private int breakAttempts = 0;
    private int breakTimeout = 0;
    private int retryCount = 0;
    private List<String> failedHeads = new ArrayList<>();
    private boolean pvpDetected = false;

    public HeadBreaker() {
        super();
        addSettings(serv, griefMode, headsCount, maxRetries);
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {

        if (delay > 0) {
            delay--;
            return;
        }
        if (avoidPvP.getValue() && ClientUtil.isPvP()) {
            if (!pvpDetected) {
                print("pvp");
                pvpDetected = true;
            }
            mc.player.sendChatMessage("/hub");
            stage = 9;
            delay = 60;
            return;
        } else if (pvpDetected) {
            pvpDetected = false;
        }

        switch (stage) {
            case 0:
                if (griefMode.is("На данном грифе")) {
                    isOnGrief = true;
                    stage = 3;
                } else {
                    if (!isOnGrief) {
                        useCompass();
                        stage = 1;
                        delay = 20;
                    } else {
                        stage = 3;
                    }
                }
                break;

            case 1:
                if (clickCraftingTable()) {
                    stage = 2;
                    delay = 20;
                } else {
                    stage = 0;
                    delay = 10;
                }
                break;

            case 2:
                if (clickCurrentGrief()) {
                    isOnGrief = true;
                    stage = 3;
                    delay = 30;
                } else {
                    stage = 2;
                    delay = 10;
                }
                break;

            case 3:
                if (!isOnGrief) {
                    stage = 0;
                    delay = 10;
                    break;
                }
                String warpCommand = currentWarp;
                if (currentWarp.equals("zaharovfunction8")) {
                    warpCommand = "zaharovfunction8_";
                }
                mc.player.sendChatMessage("/warp " + warpCommand);
                stage = 5;
                delay = 10;
                break;

            case 4:
                stage = 5;
                delay = 10;
                break;

            case 5:
                targetHead = findNearestHead();
                if (targetHead != null) {
                    stage = 6;
                    delay = 2;
                    breakAttempts = 0;
                    retryCount = 0;
                } else {
                    String failedHeadInfo = "Гриф " + currentGrif + ", Варп " + currentWarp;
                    if (!failedHeads.contains(failedHeadInfo)) {
                        failedHeads.add(failedHeadInfo);
                    }
                    stage = 8;
                    delay = 5;
                }
                break;

            case 6:
                lookAtHead(targetHead);
                stage = 7;
                delay = 1;
                break;

            case 7:
                if (!isBreaking) {
                    startBreakingHead(targetHead);
                    isBreaking = true;
                    breakTicks = 0;
                }

                breakTicks++;

                if (targetHead != null && mc.world.getBlockState(targetHead).isAir()) {
                    stopBreaking();
                    stage = 8;
                    delay = 5;
                    retryCount = 0;
                }
                else if (breakTicks >= 40) {
                    stopBreaking();
                    retryCount++;

                    if (retryCount < maxRetries.get()) {
                        print("Попытка " + retryCount + " сломать тыкву на варпе " + currentWarp);
                        stage = 6;
                        delay = 5;
                    } else {
                        String failedHeadInfo = "Гриф " + currentGrif + ", Варп " + currentWarp;
                        if (!failedHeads.contains(failedHeadInfo)) {
                            failedHeads.add(failedHeadInfo);
                        }
                        print("Не удалось сломать тыкву после " + retryCount + " попыток, переходим к следующей");
                        stage = 8;
                        delay = 5;
                        retryCount = 0;
                    }
                }
                break;

            case 8:
                stopBreaking();
                switchToNextWarp();
                break;

            case 9:
                stage = 0;
                delay = 10;
                break;
        }
    }

    private void switchToNextWarp() {
        int currentNumber = Integer.parseInt(currentWarp.replace("zaharovfunction", ""));
        int nextNumber = currentNumber + 1;
        float maxHeads = headsCount.get();

        float actualMaxHeads = maxHeads;

        if (nextNumber <= actualMaxHeads) {
            currentWarp = "zaharovfunction" + nextNumber;
            stage = 3;
            delay = 10;
        } else {
            if (griefMode.is("3 Грифах")) {
                if (skipGrief2.getValue() && currentGrif == 1) {

                    currentGrif = 3;
                } else {
                    currentGrif++;
                }

                if (currentGrif <= 3) {
                    printFailedHeads();
                    mc.player.sendChatMessage("/hub");
                    currentWarp = "zaharovfunction1";
                    isOnGrief = false;
                    stage = 9;
                    delay = 60;
                } else {
                    printFailedHeads();
                    this.toggle();
                }
            } else {
                printFailedHeads();
                this.toggle();
            }
        }
    }

    private void printFailedHeads() {
        if (!failedHeads.isEmpty()) {
            print("Не удалось собрать тыквы на:");
            for (String failedHead : failedHeads) {
                print("- " + failedHead);
            }
            failedHeads.clear();
        }
    }

    private void useCompass() {
        for (int i = 0; i < 9; i++) {
            if (mc.player.inventory.getStackInSlot(i).getItem() == Items.COMPASS) {
                mc.player.connection.sendPacket(new CHeldItemChangePacket(i));
                mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.MAIN_HAND));
                mc.player.connection.sendPacket(new CHeldItemChangePacket(mc.player.inventory.currentItem));
                break;
            }
        }
    }

    private boolean clickCraftingTable() {
        if (mc.player.openContainer != null) {
            for (int i = 0; i < mc.player.openContainer.inventorySlots.size(); i++) {
                String displayName = mc.player.openContainer.getSlot(i).getStack().getDisplayName().getString();
                if (displayName.contains("ГРИФЕРСКОЕ ВЫЖИВАНИЕ")) {
                    mc.playerController.windowClick(mc.player.openContainer.windowId, i, 0, ClickType.PICKUP, mc.player);
                    return true;
                }
            }
        }
        return false;
    }

    private boolean clickCurrentGrief() {
        if (mc.player.openContainer != null) {
            String griefName = "ГРИФ #" + currentGrif;
            for (int i = 0; i < mc.player.openContainer.inventorySlots.size(); i++) {
                try {
                    String displayName = mc.player.openContainer.getSlot(i).getStack().getDisplayName().getString();
                    if (displayName.contains(griefName)) {
                        mc.playerController.windowClick(mc.player.openContainer.windowId, i, 0, ClickType.PICKUP, mc.player);
                        return true;
                    }
                } catch (Exception e) {}
            }
        }
        return false;
    }

    private BlockPos findNearestHead() {
        BlockPos playerPos = new BlockPos(mc.player.getPosX(), mc.player.getPosY(), mc.player.getPosZ());
        int radius = 3;
        for (int x = -radius; x <= radius; x++) {
            for (int y = -radius; y <= radius; y++) {
                for (int z = -radius; z <= radius; z++) {
                    BlockPos checkPos = playerPos.add(x, y, z);
                    BlockState state = mc.world.getBlockState(checkPos);
                    Block block = state.getBlock();
                    if ((block == Blocks.PLAYER_HEAD || block == Blocks.PLAYER_WALL_HEAD) && !state.isAir()) {
                        return checkPos;
                    }
                }
            }
        }
        return null;
    }

    private void lookAtHead(BlockPos pos) {
        double x = pos.getX() + 0.5;
        double y = pos.getY() + 0.5;
        double z = pos.getZ() + 0.5;
        Vector3d eyePos = mc.player.getEyePosition(1.0F);
        double deltaX = x - eyePos.x;
        double deltaY = y - eyePos.y;
        double deltaZ = z - eyePos.z;
        double horizontalDistance = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
        float yaw = (float)(Math.atan2(deltaZ, deltaX) * 180.0D / Math.PI) - 90.0F;
        float pitch = (float)(-(Math.atan2(deltaY, horizontalDistance) * 180.0D / Math.PI));
        mc.player.rotationYaw = yaw;
        mc.player.rotationPitch = pitch;
    }

    private void startBreakingHead(BlockPos pos) {
        if (mc.currentScreen != null) {
            mc.displayGuiScreen(null);
        }
        mc.gameSettings.keyBindAttack.setPressed(true);
    }
    private void stopBreaking() {
        mc.gameSettings.keyBindAttack.setPressed(false);
        isBreaking = false;
    }

    @Override
    public void onEnable() {
        super.onEnable();
        currentWarp = "zaharovfunction1";
        currentGrif = 1;
        stage = 0;
        delay = 0;
        targetHead = null;
        breakTicks = 0;
        isBreaking = false;
        isOnGrief = false;
        breakAttempts = 0;
        breakTimeout = 0;
        retryCount = 0;
        failedHeads.clear();
        pvpDetected = false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        stopBreaking();
        currentWarp = "zaharovfunction1";
        currentGrif = 1;
        stage = 0;
        delay = 0;
        targetHead = null;
        breakTicks = 0;
        isBreaking = false;
        isOnGrief = false;
        breakAttempts = 0;
        breakTimeout = 0;
        retryCount = 0;
        failedHeads.clear();
        pvpDetected = false;
    }
}
 
Сделал еще в конце октября для кента. Код хуетень и обновлять я его не пытался. skipGrief2 avoidPvP не доделал
ss:

Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

upd: оно теперь не прыгает перед ломанием тыквы и ломает быстрее

Код:
Expand Collapse Copy
package client.chss.main.clientmodules.main.combat;

import client.chss.cmd.Logger;
import client.chss.events.EventUpdate;
import client.chss.main.clientmodules.api.Category;
import client.chss.main.clientmodules.api.Function;
import client.chss.main.clientmodules.api.FunctionRegister;
import client.chss.main.clientmodules.settings.impl.BooleanSetting;
import client.chss.main.clientmodules.settings.impl.ModeSetting;
import client.chss.main.clientmodules.settings.impl.SliderSetting;
import client.chss.main.utils.client.ClientUtil;
import com.google.common.eventbus.Subscribe;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.inventory.container.ClickType;
import net.minecraft.item.Items;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.network.play.client.CPlayerTryUseItemPacket;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;

import java.util.ArrayList;
import java.util.List;

@FunctionRegister(name = "SoulFarm", type = Category.Miscellaneous, description = "Ломает тыквы на варпах")
public class HeadBreaker extends Function {
    public ModeSetting serv = new ModeSetting("Сервер", "CakeWorld","CakeWorld");
    public ModeSetting griefMode = new ModeSetting("Собрать на", "3 Грифах", "3 Грифах", "На данном грифе");
    public SliderSetting headsCount = new SliderSetting("Кол-во тыкв", 1f, 2f, 27f, 1f);
    public SliderSetting maxRetries = new SliderSetting("Макс. попыток", 3f, 1f, 10f, 1f);
    public BooleanSetting skipGrief2 = new BooleanSetting("Пропускать 2 гриф", false);
    public BooleanSetting avoidPvP = new BooleanSetting("Избегать PvP", true);

    private String currentWarp = "zaharovfunction1";
    private int currentGrif = 1;
    private int stage = 0;
    private int delay = 0;
    private BlockPos targetHead = null;
    private int breakTicks = 0;
    private boolean isBreaking = false;
    private Logger logger;
    private boolean isOnGrief = false;
    private int breakAttempts = 0;
    private int breakTimeout = 0;
    private int retryCount = 0;
    private List<String> failedHeads = new ArrayList<>();
    private boolean pvpDetected = false;

    public HeadBreaker() {
        super();
        addSettings(serv, griefMode, headsCount, maxRetries);
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {

        if (delay > 0) {
            delay--;
            return;
        }
        if (avoidPvP.getValue() && ClientUtil.isPvP()) {
            if (!pvpDetected) {
                print("pvp");
                pvpDetected = true;
            }
            mc.player.sendChatMessage("/hub");
            stage = 9;
            delay = 60;
            return;
        } else if (pvpDetected) {
            pvpDetected = false;
        }

        switch (stage) {
            case 0:
                if (griefMode.is("На данном грифе")) {
                    isOnGrief = true;
                    stage = 3;
                } else {
                    if (!isOnGrief) {
                        useCompass();
                        stage = 1;
                        delay = 20;
                    } else {
                        stage = 3;
                    }
                }
                break;

            case 1:
                if (clickCraftingTable()) {
                    stage = 2;
                    delay = 20;
                } else {
                    stage = 0;
                    delay = 10;
                }
                break;

            case 2:
                if (clickCurrentGrief()) {
                    isOnGrief = true;
                    stage = 3;
                    delay = 30;
                } else {
                    stage = 2;
                    delay = 10;
                }
                break;

            case 3:
                if (!isOnGrief) {
                    stage = 0;
                    delay = 10;
                    break;
                }
                String warpCommand = currentWarp;
                if (currentWarp.equals("zaharovfunction8")) {
                    warpCommand = "zaharovfunction8_";
                }
                mc.player.sendChatMessage("/warp " + warpCommand);
                stage = 5;
                delay = 10;
                break;

            case 4:
                stage = 5;
                delay = 10;
                break;

            case 5:
                targetHead = findNearestHead();
                if (targetHead != null) {
                    stage = 6;
                    delay = 2;
                    breakAttempts = 0;
                    retryCount = 0;
                } else {
                    String failedHeadInfo = "Гриф " + currentGrif + ", Варп " + currentWarp;
                    if (!failedHeads.contains(failedHeadInfo)) {
                        failedHeads.add(failedHeadInfo);
                    }
                    stage = 8;
                    delay = 5;
                }
                break;

            case 6:
                lookAtHead(targetHead);
                stage = 7;
                delay = 1;
                break;

            case 7:
                if (!isBreaking) {
                    startBreakingHead(targetHead);
                    isBreaking = true;
                    breakTicks = 0;
                }

                breakTicks++;

                if (targetHead != null && mc.world.getBlockState(targetHead).isAir()) {
                    stopBreaking();
                    stage = 8;
                    delay = 5;
                    retryCount = 0;
                }
                else if (breakTicks >= 40) {
                    stopBreaking();
                    retryCount++;

                    if (retryCount < maxRetries.get()) {
                        print("Попытка " + retryCount + " сломать тыкву на варпе " + currentWarp);
                        stage = 6;
                        delay = 5;
                    } else {
                        String failedHeadInfo = "Гриф " + currentGrif + ", Варп " + currentWarp;
                        if (!failedHeads.contains(failedHeadInfo)) {
                            failedHeads.add(failedHeadInfo);
                        }
                        print("Не удалось сломать тыкву после " + retryCount + " попыток, переходим к следующей");
                        stage = 8;
                        delay = 5;
                        retryCount = 0;
                    }
                }
                break;

            case 8:
                stopBreaking();
                switchToNextWarp();
                break;

            case 9:
                stage = 0;
                delay = 10;
                break;
        }
    }

    private void switchToNextWarp() {
        int currentNumber = Integer.parseInt(currentWarp.replace("zaharovfunction", ""));
        int nextNumber = currentNumber + 1;
        float maxHeads = headsCount.get();

        float actualMaxHeads = maxHeads;

        if (nextNumber <= actualMaxHeads) {
            currentWarp = "zaharovfunction" + nextNumber;
            stage = 3;
            delay = 10;
        } else {
            if (griefMode.is("3 Грифах")) {
                if (skipGrief2.getValue() && currentGrif == 1) {

                    currentGrif = 3;
                } else {
                    currentGrif++;
                }

                if (currentGrif <= 3) {
                    printFailedHeads();
                    mc.player.sendChatMessage("/hub");
                    currentWarp = "zaharovfunction1";
                    isOnGrief = false;
                    stage = 9;
                    delay = 60;
                } else {
                    printFailedHeads();
                    this.toggle();
                }
            } else {
                printFailedHeads();
                this.toggle();
            }
        }
    }

    private void printFailedHeads() {
        if (!failedHeads.isEmpty()) {
            print("Не удалось собрать тыквы на:");
            for (String failedHead : failedHeads) {
                print("- " + failedHead);
            }
            failedHeads.clear();
        }
    }

    private void useCompass() {
        for (int i = 0; i < 9; i++) {
            if (mc.player.inventory.getStackInSlot(i).getItem() == Items.COMPASS) {
                mc.player.connection.sendPacket(new CHeldItemChangePacket(i));
                mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.MAIN_HAND));
                mc.player.connection.sendPacket(new CHeldItemChangePacket(mc.player.inventory.currentItem));
                break;
            }
        }
    }

    private boolean clickCraftingTable() {
        if (mc.player.openContainer != null) {
            for (int i = 0; i < mc.player.openContainer.inventorySlots.size(); i++) {
                String displayName = mc.player.openContainer.getSlot(i).getStack().getDisplayName().getString();
                if (displayName.contains("ГРИФЕРСКОЕ ВЫЖИВАНИЕ")) {
                    mc.playerController.windowClick(mc.player.openContainer.windowId, i, 0, ClickType.PICKUP, mc.player);
                    return true;
                }
            }
        }
        return false;
    }

    private boolean clickCurrentGrief() {
        if (mc.player.openContainer != null) {
            String griefName = "ГРИФ #" + currentGrif;
            for (int i = 0; i < mc.player.openContainer.inventorySlots.size(); i++) {
                try {
                    String displayName = mc.player.openContainer.getSlot(i).getStack().getDisplayName().getString();
                    if (displayName.contains(griefName)) {
                        mc.playerController.windowClick(mc.player.openContainer.windowId, i, 0, ClickType.PICKUP, mc.player);
                        return true;
                    }
                } catch (Exception e) {}
            }
        }
        return false;
    }

    private BlockPos findNearestHead() {
        BlockPos playerPos = new BlockPos(mc.player.getPosX(), mc.player.getPosY(), mc.player.getPosZ());
        int radius = 3;
        for (int x = -radius; x <= radius; x++) {
            for (int y = -radius; y <= radius; y++) {
                for (int z = -radius; z <= radius; z++) {
                    BlockPos checkPos = playerPos.add(x, y, z);
                    BlockState state = mc.world.getBlockState(checkPos);
                    Block block = state.getBlock();
                    if ((block == Blocks.PLAYER_HEAD || block == Blocks.PLAYER_WALL_HEAD) && !state.isAir()) {
                        return checkPos;
                    }
                }
            }
        }
        return null;
    }

    private void lookAtHead(BlockPos pos) {
        double x = pos.getX() + 0.5;
        double y = pos.getY() + 0.5;
        double z = pos.getZ() + 0.5;
        Vector3d eyePos = mc.player.getEyePosition(1.0F);
        double deltaX = x - eyePos.x;
        double deltaY = y - eyePos.y;
        double deltaZ = z - eyePos.z;
        double horizontalDistance = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
        float yaw = (float)(Math.atan2(deltaZ, deltaX) * 180.0D / Math.PI) - 90.0F;
        float pitch = (float)(-(Math.atan2(deltaY, horizontalDistance) * 180.0D / Math.PI));
        mc.player.rotationYaw = yaw;
        mc.player.rotationPitch = pitch;
    }

    private void startBreakingHead(BlockPos pos) {
        if (mc.currentScreen != null) {
            mc.displayGuiScreen(null);
        }
        mc.gameSettings.keyBindAttack.setPressed(true);
    }
    private void stopBreaking() {
        mc.gameSettings.keyBindAttack.setPressed(false);
        isBreaking = false;
    }

    @Override
    public void onEnable() {
        super.onEnable();
        currentWarp = "zaharovfunction1";
        currentGrif = 1;
        stage = 0;
        delay = 0;
        targetHead = null;
        breakTicks = 0;
        isBreaking = false;
        isOnGrief = false;
        breakAttempts = 0;
        breakTimeout = 0;
        retryCount = 0;
        failedHeads.clear();
        pvpDetected = false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        stopBreaking();
        currentWarp = "zaharovfunction1";
        currentGrif = 1;
        stage = 0;
        delay = 0;
        targetHead = null;
        breakTicks = 0;
        isBreaking = false;
        isOnGrief = false;
        breakAttempts = 0;
        breakTimeout = 0;
        retryCount = 0;
        failedHeads.clear();
        pvpDetected = false;
    }
}
радуешь бро
 
Сделал еще в конце октября для кента. Код хуетень и обновлять я его не пытался. skipGrief2 avoidPvP не доделал
ss:

Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.

upd: оно теперь не прыгает перед ломанием тыквы и ломает быстрее

Код:
Expand Collapse Copy
package client.chss.main.clientmodules.main.combat;

import client.chss.cmd.Logger;
import client.chss.events.EventUpdate;
import client.chss.main.clientmodules.api.Category;
import client.chss.main.clientmodules.api.Function;
import client.chss.main.clientmodules.api.FunctionRegister;
import client.chss.main.clientmodules.settings.impl.BooleanSetting;
import client.chss.main.clientmodules.settings.impl.ModeSetting;
import client.chss.main.clientmodules.settings.impl.SliderSetting;
import client.chss.main.utils.client.ClientUtil;
import com.google.common.eventbus.Subscribe;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.inventory.container.ClickType;
import net.minecraft.item.Items;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.network.play.client.CPlayerTryUseItemPacket;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3d;

import java.util.ArrayList;
import java.util.List;

@FunctionRegister(name = "SoulFarm", type = Category.Miscellaneous, description = "Ломает тыквы на варпах")
public class HeadBreaker extends Function {
    public ModeSetting serv = new ModeSetting("Сервер", "CakeWorld","CakeWorld");
    public ModeSetting griefMode = new ModeSetting("Собрать на", "3 Грифах", "3 Грифах", "На данном грифе");
    public SliderSetting headsCount = new SliderSetting("Кол-во тыкв", 1f, 2f, 27f, 1f);
    public SliderSetting maxRetries = new SliderSetting("Макс. попыток", 3f, 1f, 10f, 1f);
    public BooleanSetting skipGrief2 = new BooleanSetting("Пропускать 2 гриф", false);
    public BooleanSetting avoidPvP = new BooleanSetting("Избегать PvP", true);

    private String currentWarp = "zaharovfunction1";
    private int currentGrif = 1;
    private int stage = 0;
    private int delay = 0;
    private BlockPos targetHead = null;
    private int breakTicks = 0;
    private boolean isBreaking = false;
    private Logger logger;
    private boolean isOnGrief = false;
    private int breakAttempts = 0;
    private int breakTimeout = 0;
    private int retryCount = 0;
    private List<String> failedHeads = new ArrayList<>();
    private boolean pvpDetected = false;

    public HeadBreaker() {
        super();
        addSettings(serv, griefMode, headsCount, maxRetries);
    }

    @Subscribe
    public void onUpdate(EventUpdate event) {

        if (delay > 0) {
            delay--;
            return;
        }
        if (avoidPvP.getValue() && ClientUtil.isPvP()) {
            if (!pvpDetected) {
                print("pvp");
                pvpDetected = true;
            }
            mc.player.sendChatMessage("/hub");
            stage = 9;
            delay = 60;
            return;
        } else if (pvpDetected) {
            pvpDetected = false;
        }

        switch (stage) {
            case 0:
                if (griefMode.is("На данном грифе")) {
                    isOnGrief = true;
                    stage = 3;
                } else {
                    if (!isOnGrief) {
                        useCompass();
                        stage = 1;
                        delay = 20;
                    } else {
                        stage = 3;
                    }
                }
                break;

            case 1:
                if (clickCraftingTable()) {
                    stage = 2;
                    delay = 20;
                } else {
                    stage = 0;
                    delay = 10;
                }
                break;

            case 2:
                if (clickCurrentGrief()) {
                    isOnGrief = true;
                    stage = 3;
                    delay = 30;
                } else {
                    stage = 2;
                    delay = 10;
                }
                break;

            case 3:
                if (!isOnGrief) {
                    stage = 0;
                    delay = 10;
                    break;
                }
                String warpCommand = currentWarp;
                if (currentWarp.equals("zaharovfunction8")) {
                    warpCommand = "zaharovfunction8_";
                }
                mc.player.sendChatMessage("/warp " + warpCommand);
                stage = 5;
                delay = 10;
                break;

            case 4:
                stage = 5;
                delay = 10;
                break;

            case 5:
                targetHead = findNearestHead();
                if (targetHead != null) {
                    stage = 6;
                    delay = 2;
                    breakAttempts = 0;
                    retryCount = 0;
                } else {
                    String failedHeadInfo = "Гриф " + currentGrif + ", Варп " + currentWarp;
                    if (!failedHeads.contains(failedHeadInfo)) {
                        failedHeads.add(failedHeadInfo);
                    }
                    stage = 8;
                    delay = 5;
                }
                break;

            case 6:
                lookAtHead(targetHead);
                stage = 7;
                delay = 1;
                break;

            case 7:
                if (!isBreaking) {
                    startBreakingHead(targetHead);
                    isBreaking = true;
                    breakTicks = 0;
                }

                breakTicks++;

                if (targetHead != null && mc.world.getBlockState(targetHead).isAir()) {
                    stopBreaking();
                    stage = 8;
                    delay = 5;
                    retryCount = 0;
                }
                else if (breakTicks >= 40) {
                    stopBreaking();
                    retryCount++;

                    if (retryCount < maxRetries.get()) {
                        print("Попытка " + retryCount + " сломать тыкву на варпе " + currentWarp);
                        stage = 6;
                        delay = 5;
                    } else {
                        String failedHeadInfo = "Гриф " + currentGrif + ", Варп " + currentWarp;
                        if (!failedHeads.contains(failedHeadInfo)) {
                            failedHeads.add(failedHeadInfo);
                        }
                        print("Не удалось сломать тыкву после " + retryCount + " попыток, переходим к следующей");
                        stage = 8;
                        delay = 5;
                        retryCount = 0;
                    }
                }
                break;

            case 8:
                stopBreaking();
                switchToNextWarp();
                break;

            case 9:
                stage = 0;
                delay = 10;
                break;
        }
    }

    private void switchToNextWarp() {
        int currentNumber = Integer.parseInt(currentWarp.replace("zaharovfunction", ""));
        int nextNumber = currentNumber + 1;
        float maxHeads = headsCount.get();

        float actualMaxHeads = maxHeads;

        if (nextNumber <= actualMaxHeads) {
            currentWarp = "zaharovfunction" + nextNumber;
            stage = 3;
            delay = 10;
        } else {
            if (griefMode.is("3 Грифах")) {
                if (skipGrief2.getValue() && currentGrif == 1) {

                    currentGrif = 3;
                } else {
                    currentGrif++;
                }

                if (currentGrif <= 3) {
                    printFailedHeads();
                    mc.player.sendChatMessage("/hub");
                    currentWarp = "zaharovfunction1";
                    isOnGrief = false;
                    stage = 9;
                    delay = 60;
                } else {
                    printFailedHeads();
                    this.toggle();
                }
            } else {
                printFailedHeads();
                this.toggle();
            }
        }
    }

    private void printFailedHeads() {
        if (!failedHeads.isEmpty()) {
            print("Не удалось собрать тыквы на:");
            for (String failedHead : failedHeads) {
                print("- " + failedHead);
            }
            failedHeads.clear();
        }
    }

    private void useCompass() {
        for (int i = 0; i < 9; i++) {
            if (mc.player.inventory.getStackInSlot(i).getItem() == Items.COMPASS) {
                mc.player.connection.sendPacket(new CHeldItemChangePacket(i));
                mc.player.connection.sendPacket(new CPlayerTryUseItemPacket(Hand.MAIN_HAND));
                mc.player.connection.sendPacket(new CHeldItemChangePacket(mc.player.inventory.currentItem));
                break;
            }
        }
    }

    private boolean clickCraftingTable() {
        if (mc.player.openContainer != null) {
            for (int i = 0; i < mc.player.openContainer.inventorySlots.size(); i++) {
                String displayName = mc.player.openContainer.getSlot(i).getStack().getDisplayName().getString();
                if (displayName.contains("ГРИФЕРСКОЕ ВЫЖИВАНИЕ")) {
                    mc.playerController.windowClick(mc.player.openContainer.windowId, i, 0, ClickType.PICKUP, mc.player);
                    return true;
                }
            }
        }
        return false;
    }

    private boolean clickCurrentGrief() {
        if (mc.player.openContainer != null) {
            String griefName = "ГРИФ #" + currentGrif;
            for (int i = 0; i < mc.player.openContainer.inventorySlots.size(); i++) {
                try {
                    String displayName = mc.player.openContainer.getSlot(i).getStack().getDisplayName().getString();
                    if (displayName.contains(griefName)) {
                        mc.playerController.windowClick(mc.player.openContainer.windowId, i, 0, ClickType.PICKUP, mc.player);
                        return true;
                    }
                } catch (Exception e) {}
            }
        }
        return false;
    }

    private BlockPos findNearestHead() {
        BlockPos playerPos = new BlockPos(mc.player.getPosX(), mc.player.getPosY(), mc.player.getPosZ());
        int radius = 3;
        for (int x = -radius; x <= radius; x++) {
            for (int y = -radius; y <= radius; y++) {
                for (int z = -radius; z <= radius; z++) {
                    BlockPos checkPos = playerPos.add(x, y, z);
                    BlockState state = mc.world.getBlockState(checkPos);
                    Block block = state.getBlock();
                    if ((block == Blocks.PLAYER_HEAD || block == Blocks.PLAYER_WALL_HEAD) && !state.isAir()) {
                        return checkPos;
                    }
                }
            }
        }
        return null;
    }

    private void lookAtHead(BlockPos pos) {
        double x = pos.getX() + 0.5;
        double y = pos.getY() + 0.5;
        double z = pos.getZ() + 0.5;
        Vector3d eyePos = mc.player.getEyePosition(1.0F);
        double deltaX = x - eyePos.x;
        double deltaY = y - eyePos.y;
        double deltaZ = z - eyePos.z;
        double horizontalDistance = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
        float yaw = (float)(Math.atan2(deltaZ, deltaX) * 180.0D / Math.PI) - 90.0F;
        float pitch = (float)(-(Math.atan2(deltaY, horizontalDistance) * 180.0D / Math.PI));
        mc.player.rotationYaw = yaw;
        mc.player.rotationPitch = pitch;
    }

    private void startBreakingHead(BlockPos pos) {
        if (mc.currentScreen != null) {
            mc.displayGuiScreen(null);
        }
        mc.gameSettings.keyBindAttack.setPressed(true);
    }
    private void stopBreaking() {
        mc.gameSettings.keyBindAttack.setPressed(false);
        isBreaking = false;
    }

    @Override
    public void onEnable() {
        super.onEnable();
        currentWarp = "zaharovfunction1";
        currentGrif = 1;
        stage = 0;
        delay = 0;
        targetHead = null;
        breakTicks = 0;
        isBreaking = false;
        isOnGrief = false;
        breakAttempts = 0;
        breakTimeout = 0;
        retryCount = 0;
        failedHeads.clear();
        pvpDetected = false;
    }

    @Override
    public void onDisable() {
        super.onDisable();
        stopBreaking();
        currentWarp = "zaharovfunction1";
        currentGrif = 1;
        stage = 0;
        delay = 0;
        targetHead = null;
        breakTicks = 0;
        isBreaking = false;
        isOnGrief = false;
        breakAttempts = 0;
        breakTimeout = 0;
        retryCount = 0;
        failedHeads.clear();
        pvpDetected = false;
    }
}
пизда зачем сливать такое да и еще на експу 3.1>
 

Похожие темы

Ответы
12
Просмотры
744
Ответы
21
Просмотры
1K
Ответы
11
Просмотры
1K
Ответы
4
Просмотры
986
Назад
Сверху Снизу