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

Часть функционала AutoJoiner RW, WM, ST | base 1.21.4 exosware

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
8 Авг 2025
Сообщения
44
Реакции
0
Выберите загрузчик игры
  1. Fabric
Салем югейм, давно тем не выкладывал. Сливаю для вас из моего чита(SpookyClient noad) AutoJoiner он помогает с заходом на таких серверах как ReallyWorld, WellMine, SpookyTime. Потому что меня бесят чит-клиенты в которох нету нормального AutoJoiner а поиграть с них хочется. СС думаю не требуется) В тех поддержку димасика(noad) я закинул данный код тоже, надеюсь реально поменяют ибо бесит что в норм чите нету адекватного AutoJoiner. Ну ладно, поменьше воды. Код снизу, скрин в тп димаса(noad) тоже снизу. Всем удачи в начинаниях!
топ AutoJoiner:
Expand Collapse Copy
package Spooky.fun.modules.misc;

import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import net.minecraft.util.Hand;
import Spooky.fun.events.Event;
import Spooky.fun.events.impl.EventPacket;
import Spooky.fun.events.impl.EventUpdate;
import Spooky.fun.modules.Function;
import Spooky.fun.modules.FunctionAnnotation;
import Spooky.fun.modules.Type;
import Spooky.fun.modules.setting.ModeSetting;
import Spooky.fun.modules.setting.SliderSetting;
import Spooky.fun.util.player.TimerUtil;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@FunctionAnnotation(name = "AutoJoiner", desc = "Автоподключение к серверам (WellMine / SpookyTime / ReallyWorld)", type = Type.Misc)
public class AutoJoiner extends Function {

    private final ModeSetting mode = new ModeSetting("Режим",
            "SpookyTime",
            "SpookyTime",
            "ReallyWorld",
            "WellMine"
    );
    // Номер грифа для ReallyWorld
    private final SliderSetting rwGriefNumber = new SliderSetting("Номер грифа (RW)", 1.0f, 1.0f, 60.0f, 1.0f, () -> mode.is("ReallyWorld"));
    // Номер грифа для WellMine
    private final SliderSetting wmGriefNumber = new SliderSetting("Номер грифа (WellMine)", 1.0f, 1.0f, 3.0f, 1.0f, () -> mode.is("WellMine"));
    private final SliderSetting delay = new SliderSetting("Задержка клика (мс)", 200.0f, 50.0f, 1000.0f, 10.0f);

    private final TimerUtil timer = new TimerUtil();

    // Переменные для SpookyTime / ReallyWorld
    private boolean isConnecting = false;
    private long lastClickTime = 0L;
    private int currentPage = 0;
    private String griefOnline = "";
    private boolean needNextPage = false;
    private int lastMenuSyncId = -1;

    public AutoJoiner() {
        addSettings(mode, rwGriefNumber, wmGriefNumber, delay);
    }

    @Override
    protected void onEnable() {
        timer.reset();
        isConnecting = false;
        currentPage = 0;
        needNextPage = false;
        griefOnline = "";
        lastMenuSyncId = -1;
        super.onEnable();
    }

    @Override
    public void onEvent(Event event) {
        if (event instanceof EventUpdate) {
            if (mc.player == null || mc.world == null) return;

            // Режимы SpookyTime / ReallyWorld работают по своей логике
            if (mode.is("SpookyTime")) {
                handleSpookyTime();
            } else if (mode.is("ReallyWorld")) {
                handleReallyWorld();
            } else if (mode.is("WellMine")) {
                handleTickWellMine();
            }
        }

        if (event instanceof EventPacket packetEvent && packetEvent.isReceivePacket()) {
            var packet = packetEvent.getPacket();

            if (packet instanceof GameMessageS2CPacket messagePacket) {
                String text = messagePacket.content().getString();
                if (text.contains("Кикнут")) {
                    // можно добавить повторное включение модуля при необходимости
                }
            }

            if (packet instanceof GameJoinS2CPacket) {
                // Подключение прошло успешно, выключаем модуль
                setState(false);
                if (mc.player != null) {
                    mc.player.sendMessage(Text.of("§a[AutoJoiner] Подключено! Модуль выключен."), false);
                }
            }
        }
    }

    // ---- Логика WellMine (старый AutoJoiner) ----
    private void handleTickWellMine() {
        if (!timer.hasTimeElapsed((long) delay.get().doubleValue())) return;

        if (mc.player.currentScreenHandler instanceof GenericContainerScreenHandler container) {
            handleMenuWellMine(container);
        } else {
            openCompassWellMine();
        }
    }

    private void openCompassWellMine() {
        int compassSlot = findCompassSlot();
        if (compassSlot == -1) return;

        mc.player.getInventory().selectedSlot = compassSlot;

        if (mc.interactionManager != null) {
            mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND);
            timer.reset();
        }
    }

    private int findCompassSlot() {
        for (int i = 0; i < 9; i++) {
            ItemStack stack = mc.player.getInventory().getStack(i);
            if (stack.getItem() == Items.COMPASS || stack.getItem() == Items.RECOVERY_COMPASS) {
                return i;
            }
        }
        return -1;
    }

    // ---- Логика SpookyTime  ----
    private void handleSpookyTime() {
        if (System.currentTimeMillis() - lastClickTime < 30L) return;

        if (mc.player.getInventory().selectedSlot != 4) {
            mc.player.getInventory().selectedSlot = 4;
            lastClickTime = System.currentTimeMillis();
            return;
        }

        ItemStack compass = mc.player.getInventory().getStack(4);
        if (compass.getItem() == Items.COMPASS && mc.currentScreen == null) {
            if (mc.interactionManager != null) {
                mc.interactionManager.interactItem(mc.player, mc.player.getActiveHand());
                lastClickTime = System.currentTimeMillis();
            }
            return;
        }

        if (mc.currentScreen instanceof GenericContainerScreen screen) {
            for (Slot slot : screen.getScreenHandler().slots) {
                ItemStack stack = slot.getStack();
                if (!stack.isEmpty() && stack.getName() != null) {
                    String name = stack.getName().getString();
                    if (name.contains("Дуэли")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            isConnecting = true;
                            lastClickTime = System.currentTimeMillis();
                            mc.currentScreen.close();
                        }
                        return;
                    }
                }
            }
        }
    }

    // ---- Логика ReallyWorld (порт с ExosWare) ----
    private void handleReallyWorld() {
        if (System.currentTimeMillis() - lastClickTime < 50L) return;

        if (mc.player.getInventory().selectedSlot != 0) {
            mc.player.getInventory().selectedSlot = 0;
            lastClickTime = System.currentTimeMillis();
            return;
        }

        ItemStack compass = mc.player.getInventory().getStack(0);
        if (compass.getItem() == Items.COMPASS && mc.currentScreen == null) {
            if (mc.interactionManager != null) {
                mc.interactionManager.interactItem(mc.player, mc.player.getActiveHand());
                lastClickTime = System.currentTimeMillis();
            }
            return;
        }

        if (mc.currentScreen instanceof GenericContainerScreen screen) {
            if (screen.getScreenHandler().syncId != lastMenuSyncId) {
                lastMenuSyncId = screen.getScreenHandler().syncId;
                currentPage = 0;
                needNextPage = false;
            }

            String targetGrief = "ГРИФ #" + rwGriefNumber.get().intValue();
            boolean foundGrief = false;
            boolean foundGriefSurvival = false;

            if (needNextPage) {
                Slot lastSlot = screen.getScreenHandler().slots.get(screen.getScreenHandler().slots.size() - 1);
                ItemStack lastStack = lastSlot.getStack();
                if (!lastStack.isEmpty()) {
                    String lastName = lastStack.getName() != null ? lastStack.getName().getString() : "";
                    if (lastStack.getItem() == Items.ARROW || lastName.contains("Следующая страница")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, lastSlot.id, 0, SlotActionType.PICKUP, mc.player);
                            currentPage++;
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }
                }
            }

            for (Slot slot : screen.getScreenHandler().slots) {
                ItemStack stack = slot.getStack();
                if (!stack.isEmpty() && stack.getName() != null) {
                    String name = stack.getName().getString();

                    if (stack.getItem() == Items.ENCHANTING_TABLE) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }

                    if (name.contains("ГРИФЕРСКОЕ ВЫЖИВАНИЕ (1.16.5-1.20.4)")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            lastClickTime = System.currentTimeMillis();
                            foundGriefSurvival = true;
                        }
                        return;
                    }

                    if (name.contains("Следующая страница") && needNextPage) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            currentPage++;
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }

                    if (name.contains(targetGrief)) {
                        extractOnlineInfo(stack);

                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            isConnecting = true;
                            foundGrief = true;
                            lastClickTime = System.currentTimeMillis();
                            mc.currentScreen.close();
                        }
                        return;
                    }
                }
            }

            if (!foundGrief && !foundGriefSurvival && currentPage < 5) {
                needNextPage = true;
            }
        }
    }

    private void extractOnlineInfo(ItemStack stack) {
        griefOnline = "";

        if (!stack.isEmpty() && stack.getName() != null) {
            String name = stack.getName().getString();
            Pattern pattern = Pattern.compile("(\\d+)/(\\d+)");
            Matcher matcher = pattern.matcher(name);
            if (matcher.find()) {
                griefOnline = matcher.group(1) + "/" + matcher.group(2);
            }
        }
    }

    private void handleMenuWellMine(GenericContainerScreenHandler container) {
        int targetGrief = wmGriefNumber.get().intValue();

        for (int i = 0; i < container.getInventory().size(); i++) {
            String name = container.getInventory().getStack(i).getName().getString();

            if (mode.is("WellMine") && name.contains(String.valueOf(targetGrief))) {
                clickSlot(container.syncId, i);
                timer.reset();
                return;
            }
        }
    }

    private void clickSlot(int syncId, int slotId) {
        if (mc.interactionManager != null) {
            mc.interactionManager.clickSlot(syncId, slotId, 0, SlotActionType.PICKUP, mc.player);
        }
    }

    @Override
    protected void onDisable() {
        super.onDisable();
        isConnecting = false;
        lastMenuSyncId = -1;
    }
}
1773064241761.png
 
Салем югейм, давно тем не выкладывал. Сливаю для вас из моего чита(SpookyClient noad) AutoJoiner он помогает с заходом на таких серверах как ReallyWorld, WellMine, SpookyTime. Потому что меня бесят чит-клиенты в которох нету нормального AutoJoiner а поиграть с них хочется. СС думаю не требуется) В тех поддержку димасика(noad) я закинул данный код тоже, надеюсь реально поменяют ибо бесит что в норм чите нету адекватного AutoJoiner. Ну ладно, поменьше воды. Код снизу, скрин в тп димаса(noad) тоже снизу. Всем удачи в начинаниях!
топ AutoJoiner:
Expand Collapse Copy
package Spooky.fun.modules.misc;

import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import net.minecraft.util.Hand;
import Spooky.fun.events.Event;
import Spooky.fun.events.impl.EventPacket;
import Spooky.fun.events.impl.EventUpdate;
import Spooky.fun.modules.Function;
import Spooky.fun.modules.FunctionAnnotation;
import Spooky.fun.modules.Type;
import Spooky.fun.modules.setting.ModeSetting;
import Spooky.fun.modules.setting.SliderSetting;
import Spooky.fun.util.player.TimerUtil;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@FunctionAnnotation(name = "AutoJoiner", desc = "Автоподключение к серверам (WellMine / SpookyTime / ReallyWorld)", type = Type.Misc)
public class AutoJoiner extends Function {

    private final ModeSetting mode = new ModeSetting("Режим",
            "SpookyTime",
            "SpookyTime",
            "ReallyWorld",
            "WellMine"
    );
    // Номер грифа для ReallyWorld
    private final SliderSetting rwGriefNumber = new SliderSetting("Номер грифа (RW)", 1.0f, 1.0f, 60.0f, 1.0f, () -> mode.is("ReallyWorld"));
    // Номер грифа для WellMine
    private final SliderSetting wmGriefNumber = new SliderSetting("Номер грифа (WellMine)", 1.0f, 1.0f, 3.0f, 1.0f, () -> mode.is("WellMine"));
    private final SliderSetting delay = new SliderSetting("Задержка клика (мс)", 200.0f, 50.0f, 1000.0f, 10.0f);

    private final TimerUtil timer = new TimerUtil();

    // Переменные для SpookyTime / ReallyWorld
    private boolean isConnecting = false;
    private long lastClickTime = 0L;
    private int currentPage = 0;
    private String griefOnline = "";
    private boolean needNextPage = false;
    private int lastMenuSyncId = -1;

    public AutoJoiner() {
        addSettings(mode, rwGriefNumber, wmGriefNumber, delay);
    }

    @Override
    protected void onEnable() {
        timer.reset();
        isConnecting = false;
        currentPage = 0;
        needNextPage = false;
        griefOnline = "";
        lastMenuSyncId = -1;
        super.onEnable();
    }

    @Override
    public void onEvent(Event event) {
        if (event instanceof EventUpdate) {
            if (mc.player == null || mc.world == null) return;

            // Режимы SpookyTime / ReallyWorld работают по своей логике
            if (mode.is("SpookyTime")) {
                handleSpookyTime();
            } else if (mode.is("ReallyWorld")) {
                handleReallyWorld();
            } else if (mode.is("WellMine")) {
                handleTickWellMine();
            }
        }

        if (event instanceof EventPacket packetEvent && packetEvent.isReceivePacket()) {
            var packet = packetEvent.getPacket();

            if (packet instanceof GameMessageS2CPacket messagePacket) {
                String text = messagePacket.content().getString();
                if (text.contains("Кикнут")) {
                    // можно добавить повторное включение модуля при необходимости
                }
            }

            if (packet instanceof GameJoinS2CPacket) {
                // Подключение прошло успешно, выключаем модуль
                setState(false);
                if (mc.player != null) {
                    mc.player.sendMessage(Text.of("§a[AutoJoiner] Подключено! Модуль выключен."), false);
                }
            }
        }
    }

    // ---- Логика WellMine (старый AutoJoiner) ----
    private void handleTickWellMine() {
        if (!timer.hasTimeElapsed((long) delay.get().doubleValue())) return;

        if (mc.player.currentScreenHandler instanceof GenericContainerScreenHandler container) {
            handleMenuWellMine(container);
        } else {
            openCompassWellMine();
        }
    }

    private void openCompassWellMine() {
        int compassSlot = findCompassSlot();
        if (compassSlot == -1) return;

        mc.player.getInventory().selectedSlot = compassSlot;

        if (mc.interactionManager != null) {
            mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND);
            timer.reset();
        }
    }

    private int findCompassSlot() {
        for (int i = 0; i < 9; i++) {
            ItemStack stack = mc.player.getInventory().getStack(i);
            if (stack.getItem() == Items.COMPASS || stack.getItem() == Items.RECOVERY_COMPASS) {
                return i;
            }
        }
        return -1;
    }

    // ---- Логика SpookyTime  ----
    private void handleSpookyTime() {
        if (System.currentTimeMillis() - lastClickTime < 30L) return;

        if (mc.player.getInventory().selectedSlot != 4) {
            mc.player.getInventory().selectedSlot = 4;
            lastClickTime = System.currentTimeMillis();
            return;
        }

        ItemStack compass = mc.player.getInventory().getStack(4);
        if (compass.getItem() == Items.COMPASS && mc.currentScreen == null) {
            if (mc.interactionManager != null) {
                mc.interactionManager.interactItem(mc.player, mc.player.getActiveHand());
                lastClickTime = System.currentTimeMillis();
            }
            return;
        }

        if (mc.currentScreen instanceof GenericContainerScreen screen) {
            for (Slot slot : screen.getScreenHandler().slots) {
                ItemStack stack = slot.getStack();
                if (!stack.isEmpty() && stack.getName() != null) {
                    String name = stack.getName().getString();
                    if (name.contains("Дуэли")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            isConnecting = true;
                            lastClickTime = System.currentTimeMillis();
                            mc.currentScreen.close();
                        }
                        return;
                    }
                }
            }
        }
    }

    // ---- Логика ReallyWorld (порт с ExosWare) ----
    private void handleReallyWorld() {
        if (System.currentTimeMillis() - lastClickTime < 50L) return;

        if (mc.player.getInventory().selectedSlot != 0) {
            mc.player.getInventory().selectedSlot = 0;
            lastClickTime = System.currentTimeMillis();
            return;
        }

        ItemStack compass = mc.player.getInventory().getStack(0);
        if (compass.getItem() == Items.COMPASS && mc.currentScreen == null) {
            if (mc.interactionManager != null) {
                mc.interactionManager.interactItem(mc.player, mc.player.getActiveHand());
                lastClickTime = System.currentTimeMillis();
            }
            return;
        }

        if (mc.currentScreen instanceof GenericContainerScreen screen) {
            if (screen.getScreenHandler().syncId != lastMenuSyncId) {
                lastMenuSyncId = screen.getScreenHandler().syncId;
                currentPage = 0;
                needNextPage = false;
            }

            String targetGrief = "ГРИФ #" + rwGriefNumber.get().intValue();
            boolean foundGrief = false;
            boolean foundGriefSurvival = false;

            if (needNextPage) {
                Slot lastSlot = screen.getScreenHandler().slots.get(screen.getScreenHandler().slots.size() - 1);
                ItemStack lastStack = lastSlot.getStack();
                if (!lastStack.isEmpty()) {
                    String lastName = lastStack.getName() != null ? lastStack.getName().getString() : "";
                    if (lastStack.getItem() == Items.ARROW || lastName.contains("Следующая страница")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, lastSlot.id, 0, SlotActionType.PICKUP, mc.player);
                            currentPage++;
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }
                }
            }

            for (Slot slot : screen.getScreenHandler().slots) {
                ItemStack stack = slot.getStack();
                if (!stack.isEmpty() && stack.getName() != null) {
                    String name = stack.getName().getString();

                    if (stack.getItem() == Items.ENCHANTING_TABLE) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }

                    if (name.contains("ГРИФЕРСКОЕ ВЫЖИВАНИЕ (1.16.5-1.20.4)")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            lastClickTime = System.currentTimeMillis();
                            foundGriefSurvival = true;
                        }
                        return;
                    }

                    if (name.contains("Следующая страница") && needNextPage) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            currentPage++;
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }

                    if (name.contains(targetGrief)) {
                        extractOnlineInfo(stack);

                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            isConnecting = true;
                            foundGrief = true;
                            lastClickTime = System.currentTimeMillis();
                            mc.currentScreen.close();
                        }
                        return;
                    }
                }
            }

            if (!foundGrief && !foundGriefSurvival && currentPage < 5) {
                needNextPage = true;
            }
        }
    }

    private void extractOnlineInfo(ItemStack stack) {
        griefOnline = "";

        if (!stack.isEmpty() && stack.getName() != null) {
            String name = stack.getName().getString();
            Pattern pattern = Pattern.compile("(\\d+)/(\\d+)");
            Matcher matcher = pattern.matcher(name);
            if (matcher.find()) {
                griefOnline = matcher.group(1) + "/" + matcher.group(2);
            }
        }
    }

    private void handleMenuWellMine(GenericContainerScreenHandler container) {
        int targetGrief = wmGriefNumber.get().intValue();

        for (int i = 0; i < container.getInventory().size(); i++) {
            String name = container.getInventory().getStack(i).getName().getString();

            if (mode.is("WellMine") && name.contains(String.valueOf(targetGrief))) {
                clickSlot(container.syncId, i);
                timer.reset();
                return;
            }
        }
    }

    private void clickSlot(int syncId, int slotId) {
        if (mc.interactionManager != null) {
            mc.interactionManager.clickSlot(syncId, slotId, 0, SlotActionType.PICKUP, mc.player);
        }
    }

    @Override
    protected void onDisable() {
        super.onDisable();
        isConnecting = false;
        lastMenuSyncId = -1;
    }
}
Посмотреть вложение 329861
гпт хуетень, ты блять банальнейший модуль написать не можешь который будет по слотам кликать или что?
 
Салем югейм, давно тем не выкладывал. Сливаю для вас из моего чита(SpookyClient noad) AutoJoiner он помогает с заходом на таких серверах как ReallyWorld, WellMine, SpookyTime. Потому что меня бесят чит-клиенты в которох нету нормального AutoJoiner а поиграть с них хочется. СС думаю не требуется) В тех поддержку димасика(noad) я закинул данный код тоже, надеюсь реально поменяют ибо бесит что в норм чите нету адекватного AutoJoiner. Ну ладно, поменьше воды. Код снизу, скрин в тп димаса(noad) тоже снизу. Всем удачи в начинаниях!
топ AutoJoiner:
Expand Collapse Copy
package Spooky.fun.modules.misc;

import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
import net.minecraft.screen.GenericContainerScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import net.minecraft.util.Hand;
import Spooky.fun.events.Event;
import Spooky.fun.events.impl.EventPacket;
import Spooky.fun.events.impl.EventUpdate;
import Spooky.fun.modules.Function;
import Spooky.fun.modules.FunctionAnnotation;
import Spooky.fun.modules.Type;
import Spooky.fun.modules.setting.ModeSetting;
import Spooky.fun.modules.setting.SliderSetting;
import Spooky.fun.util.player.TimerUtil;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@FunctionAnnotation(name = "AutoJoiner", desc = "Автоподключение к серверам (WellMine / SpookyTime / ReallyWorld)", type = Type.Misc)
public class AutoJoiner extends Function {

    private final ModeSetting mode = new ModeSetting("Режим",
            "SpookyTime",
            "SpookyTime",
            "ReallyWorld",
            "WellMine"
    );
    // Номер грифа для ReallyWorld
    private final SliderSetting rwGriefNumber = new SliderSetting("Номер грифа (RW)", 1.0f, 1.0f, 60.0f, 1.0f, () -> mode.is("ReallyWorld"));
    // Номер грифа для WellMine
    private final SliderSetting wmGriefNumber = new SliderSetting("Номер грифа (WellMine)", 1.0f, 1.0f, 3.0f, 1.0f, () -> mode.is("WellMine"));
    private final SliderSetting delay = new SliderSetting("Задержка клика (мс)", 200.0f, 50.0f, 1000.0f, 10.0f);

    private final TimerUtil timer = new TimerUtil();

    // Переменные для SpookyTime / ReallyWorld
    private boolean isConnecting = false;
    private long lastClickTime = 0L;
    private int currentPage = 0;
    private String griefOnline = "";
    private boolean needNextPage = false;
    private int lastMenuSyncId = -1;

    public AutoJoiner() {
        addSettings(mode, rwGriefNumber, wmGriefNumber, delay);
    }

    @Override
    protected void onEnable() {
        timer.reset();
        isConnecting = false;
        currentPage = 0;
        needNextPage = false;
        griefOnline = "";
        lastMenuSyncId = -1;
        super.onEnable();
    }

    @Override
    public void onEvent(Event event) {
        if (event instanceof EventUpdate) {
            if (mc.player == null || mc.world == null) return;

            // Режимы SpookyTime / ReallyWorld работают по своей логике
            if (mode.is("SpookyTime")) {
                handleSpookyTime();
            } else if (mode.is("ReallyWorld")) {
                handleReallyWorld();
            } else if (mode.is("WellMine")) {
                handleTickWellMine();
            }
        }

        if (event instanceof EventPacket packetEvent && packetEvent.isReceivePacket()) {
            var packet = packetEvent.getPacket();

            if (packet instanceof GameMessageS2CPacket messagePacket) {
                String text = messagePacket.content().getString();
                if (text.contains("Кикнут")) {
                    // можно добавить повторное включение модуля при необходимости
                }
            }

            if (packet instanceof GameJoinS2CPacket) {
                // Подключение прошло успешно, выключаем модуль
                setState(false);
                if (mc.player != null) {
                    mc.player.sendMessage(Text.of("§a[AutoJoiner] Подключено! Модуль выключен."), false);
                }
            }
        }
    }

    // ---- Логика WellMine (старый AutoJoiner) ----
    private void handleTickWellMine() {
        if (!timer.hasTimeElapsed((long) delay.get().doubleValue())) return;

        if (mc.player.currentScreenHandler instanceof GenericContainerScreenHandler container) {
            handleMenuWellMine(container);
        } else {
            openCompassWellMine();
        }
    }

    private void openCompassWellMine() {
        int compassSlot = findCompassSlot();
        if (compassSlot == -1) return;

        mc.player.getInventory().selectedSlot = compassSlot;

        if (mc.interactionManager != null) {
            mc.interactionManager.interactItem(mc.player, Hand.MAIN_HAND);
            timer.reset();
        }
    }

    private int findCompassSlot() {
        for (int i = 0; i < 9; i++) {
            ItemStack stack = mc.player.getInventory().getStack(i);
            if (stack.getItem() == Items.COMPASS || stack.getItem() == Items.RECOVERY_COMPASS) {
                return i;
            }
        }
        return -1;
    }

    // ---- Логика SpookyTime  ----
    private void handleSpookyTime() {
        if (System.currentTimeMillis() - lastClickTime < 30L) return;

        if (mc.player.getInventory().selectedSlot != 4) {
            mc.player.getInventory().selectedSlot = 4;
            lastClickTime = System.currentTimeMillis();
            return;
        }

        ItemStack compass = mc.player.getInventory().getStack(4);
        if (compass.getItem() == Items.COMPASS && mc.currentScreen == null) {
            if (mc.interactionManager != null) {
                mc.interactionManager.interactItem(mc.player, mc.player.getActiveHand());
                lastClickTime = System.currentTimeMillis();
            }
            return;
        }

        if (mc.currentScreen instanceof GenericContainerScreen screen) {
            for (Slot slot : screen.getScreenHandler().slots) {
                ItemStack stack = slot.getStack();
                if (!stack.isEmpty() && stack.getName() != null) {
                    String name = stack.getName().getString();
                    if (name.contains("Дуэли")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            isConnecting = true;
                            lastClickTime = System.currentTimeMillis();
                            mc.currentScreen.close();
                        }
                        return;
                    }
                }
            }
        }
    }

    // ---- Логика ReallyWorld (порт с ExosWare) ----
    private void handleReallyWorld() {
        if (System.currentTimeMillis() - lastClickTime < 50L) return;

        if (mc.player.getInventory().selectedSlot != 0) {
            mc.player.getInventory().selectedSlot = 0;
            lastClickTime = System.currentTimeMillis();
            return;
        }

        ItemStack compass = mc.player.getInventory().getStack(0);
        if (compass.getItem() == Items.COMPASS && mc.currentScreen == null) {
            if (mc.interactionManager != null) {
                mc.interactionManager.interactItem(mc.player, mc.player.getActiveHand());
                lastClickTime = System.currentTimeMillis();
            }
            return;
        }

        if (mc.currentScreen instanceof GenericContainerScreen screen) {
            if (screen.getScreenHandler().syncId != lastMenuSyncId) {
                lastMenuSyncId = screen.getScreenHandler().syncId;
                currentPage = 0;
                needNextPage = false;
            }

            String targetGrief = "ГРИФ #" + rwGriefNumber.get().intValue();
            boolean foundGrief = false;
            boolean foundGriefSurvival = false;

            if (needNextPage) {
                Slot lastSlot = screen.getScreenHandler().slots.get(screen.getScreenHandler().slots.size() - 1);
                ItemStack lastStack = lastSlot.getStack();
                if (!lastStack.isEmpty()) {
                    String lastName = lastStack.getName() != null ? lastStack.getName().getString() : "";
                    if (lastStack.getItem() == Items.ARROW || lastName.contains("Следующая страница")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, lastSlot.id, 0, SlotActionType.PICKUP, mc.player);
                            currentPage++;
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }
                }
            }

            for (Slot slot : screen.getScreenHandler().slots) {
                ItemStack stack = slot.getStack();
                if (!stack.isEmpty() && stack.getName() != null) {
                    String name = stack.getName().getString();

                    if (stack.getItem() == Items.ENCHANTING_TABLE) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }

                    if (name.contains("ГРИФЕРСКОЕ ВЫЖИВАНИЕ (1.16.5-1.20.4)")) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            lastClickTime = System.currentTimeMillis();
                            foundGriefSurvival = true;
                        }
                        return;
                    }

                    if (name.contains("Следующая страница") && needNextPage) {
                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            currentPage++;
                            lastClickTime = System.currentTimeMillis();
                        }
                        return;
                    }

                    if (name.contains(targetGrief)) {
                        extractOnlineInfo(stack);

                        if (mc.interactionManager != null) {
                            mc.interactionManager.clickSlot(screen.getScreenHandler().syncId, slot.id, 0, SlotActionType.PICKUP, mc.player);
                            isConnecting = true;
                            foundGrief = true;
                            lastClickTime = System.currentTimeMillis();
                            mc.currentScreen.close();
                        }
                        return;
                    }
                }
            }

            if (!foundGrief && !foundGriefSurvival && currentPage < 5) {
                needNextPage = true;
            }
        }
    }

    private void extractOnlineInfo(ItemStack stack) {
        griefOnline = "";

        if (!stack.isEmpty() && stack.getName() != null) {
            String name = stack.getName().getString();
            Pattern pattern = Pattern.compile("(\\d+)/(\\d+)");
            Matcher matcher = pattern.matcher(name);
            if (matcher.find()) {
                griefOnline = matcher.group(1) + "/" + matcher.group(2);
            }
        }
    }

    private void handleMenuWellMine(GenericContainerScreenHandler container) {
        int targetGrief = wmGriefNumber.get().intValue();

        for (int i = 0; i < container.getInventory().size(); i++) {
            String name = container.getInventory().getStack(i).getName().getString();

            if (mode.is("WellMine") && name.contains(String.valueOf(targetGrief))) {
                clickSlot(container.syncId, i);
                timer.reset();
                return;
            }
        }
    }

    private void clickSlot(int syncId, int slotId) {
        if (mc.interactionManager != null) {
            mc.interactionManager.clickSlot(syncId, slotId, 0, SlotActionType.PICKUP, mc.player);
        }
    }

    @Override
    protected void onDisable() {
        super.onDisable();
        isConnecting = false;
        lastMenuSyncId = -1;
    }
}
Посмотреть вложение 329861
лучше дальше бы не выкладывал
 
Назад
Сверху Снизу