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

Часть функционала GPSLony | EXP 3.1 (Не хейтите первая публикация)

Начинающий
Начинающий
Статус
Онлайн
Регистрация
1 Ноя 2025
Сообщения
5
Реакции
0
Выберите загрузчик игры
  1. Vanilla
  2. Forge
  3. NeoForge
  4. ForgeOptiFine
Знаю что только с експой не делали, но такого вроде не виделю. ^_^
Пожалуйста, авторизуйтесь для просмотра ссылки.

Немного перепишите, у меня изменённая база
GPSLony:
Expand Collapse Copy
package expensive.modules.impl.misc;

import com.google.common.eventbus.Subscribe;
import expensive.events.EventPacket;
import expensive.modules.api.Category;
import expensive.modules.api.Function;
import expensive.modules.api.FunctionRegister;
import net.minecraft.client.Minecraft;
import net.minecraft.network.play.server.SChatPacket;
import net.minecraft.util.text.StringTextComponent;

import java.lang.reflect.Field;
import java.util.List;

@FunctionRegister(name = "GPSLony", type = Category.Misc)
public class GPSLony extends Function {

    private Thread monitorThread;
    private volatile boolean running = true;
    private String lastProcessedMessage = "";
    private long lastCheckTime = 0;
    private static final long CHECK_INTERVAL = 500; // 0.5 секунды

    public GPSLony() {
        setState(true, true);
        System.out.println("[GPSLony] Модуль создан и включен");

        // Запускаем поток для проверки GUI чата
        startMonitorThread();
    }

    private void startMonitorThread() {
        monitorThread = new Thread(() -> {
            while (running && !Thread.currentThread().isInterrupted()) {
                try {
                    Thread.sleep(100);
                    if (isState() && System.currentTimeMillis() - lastCheckTime > CHECK_INTERVAL) {
                        checkChatHistory();
                        lastCheckTime = System.currentTimeMillis();
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                } catch (Exception e) {
                    // Игнорируем тихие ошибки
                }
            }
        }, "GPSLony-Monitor");
        monitorThread.setDaemon(true);
        monitorThread.start();
    }

    @Subscribe
    public void onPacket(EventPacket event) {
        if (!isState()) return;

        if (event.getPacket() instanceof SChatPacket) {
            SChatPacket packet = (SChatPacket) event.getPacket();
            try {
                String message = packet.getChatComponent().getString();
                if (message != null && !message.isEmpty()) {
                    processIfRTPMessage(message);
                }
            } catch (Exception e) {
                // Пробуем получить текст другим способом
                try {
                    String message = packet.getChatComponent().getUnformattedComponentText();
                    if (message != null) {
                        processIfRTPMessage(message);
                    }
                } catch (Exception ex) {
                    // Игнорируем
                }
            }
        }
    }

    private void checkChatHistory() {
        try {
            Minecraft mc = Minecraft.getInstance();
            if (mc.ingameGUI == null || mc.ingameGUI.getChatGUI() == null) return;

            Object lastMessage = getLastChatMessage(mc.ingameGUI.getChatGUI());
            if (lastMessage != null) {
                String message = extractMessageText(lastMessage);
                if (message != null && !message.isEmpty()) {
                    processIfRTPMessage(message);
                }
            }
        } catch (Exception e) {
            // Тихий режим - не логируем ошибки рефлексии
        }
    }

    private Object getLastChatMessage(Object chatGUI) throws Exception {
        // Пробуем разные варианты имен полей
        String[] possibleFields = {"messages", "field_240754_e_", "chatLines", "field_146253_i"};

        for (String fieldName : possibleFields) {
            try {
                Field field = chatGUI.getClass().getDeclaredField(fieldName);
                field.setAccessible(true);
                List<?> messages = (List<?>) field.get(chatGUI);
                if (messages != null && !messages.isEmpty()) {
                    return messages.get(messages.size() - 1);
                }
            } catch (NoSuchFieldException e) {
                continue; // Пробуем следующее поле
            }
        }
        return null;
    }

    private String extractMessageText(Object chatLine) throws Exception {
        // Пробуем разные варианты имен полей для текста
        String[] textFields = {"lineString", "field_240745_a_", "chatComponent", "field_74541_a"};

        for (String fieldName : textFields) {
            try {
                Field field = chatLine.getClass().getDeclaredField(fieldName);
                field.setAccessible(true);
                Object textComponent = field.get(chatLine);
                if (textComponent instanceof net.minecraft.util.text.ITextComponent) {
                    return ((net.minecraft.util.text.ITextComponent) textComponent).getString();
                }
            } catch (NoSuchFieldException e) {
                continue;
            }
        }
        return null;
    }

    private void processIfRTPMessage(String message) {
        // Быстрая проверка перед парсингом
        if (message == null || lastProcessedMessage.equals(message)) return;

        String cleanMessage = message.replaceAll("§[0-9a-fk-or]", "");
        if (cleanMessage == null) return;

        // Проверяем ключевые слова
        boolean hasRTPKeywords = cleanMessage.contains("телепортировались") &&
                cleanMessage.contains("игроком") &&
                cleanMessage.contains("координаты");

        if (hasRTPKeywords) {
            System.out.println("[GPSLony] Обнаружено RTP сообщение: " + cleanMessage);
            processMessage(cleanMessage);
            lastProcessedMessage = message;
        }
    }

    private void processMessage(String message) {
        try {
            // Убираем префиксы
            message = message.replace("ʟᴏɴʏɢʀɪᴇꜰ » ", "")
                    .replace("[CHAT] ", "")
                    .trim();

            // Парсим имя игрока
            int playerStart = message.indexOf("игроком ");
            if (playerStart == -1) return;

            playerStart += 8; // Длина "игроком "
            int playerEnd = message.indexOf("!", playerStart);
            if (playerEnd == -1) return;

            String playerName = message.substring(playerStart, playerEnd).trim();

            // Парсим координаты
            int coordsStart = message.indexOf("координаты:");
            if (coordsStart == -1) return;

            coordsStart += 11; // Длина "координаты:"
            String coordsText = message.substring(coordsStart).trim();

            // Убираем точку в конце
            if (coordsText.endsWith(".")) {
                coordsText = coordsText.substring(0, coordsText.length() - 1);
            }

            // Разделяем координаты
            String[] coordParts = coordsText.split("\\s*\\.\\s*");
            if (coordParts.length < 3) return;

            int x = Integer.parseInt(coordParts[0].trim());
            int y = Integer.parseInt(coordParts[1].trim());
            int z = Integer.parseInt(coordParts[2].trim());

            // Формируем и отправляем команду
            String command = ".gps add " + playerName + " " + x + " " + y + " " + z;

            if (Minecraft.getInstance().player != null) {
                Minecraft.getInstance().player.sendChatMessage(command);
                System.out.println("[GPSLony] Команда отправлена: " + command);
            }

        } catch (Exception e) {
            System.out.println("[GPSLony] Ошибка обработки: " + e.getMessage());
        }
    }

    @Override
    public void onDisable() {
        running = false;
        if (monitorThread != null) {
            monitorThread.interrupt();
        }
        super.onDisable();
    }
}
 
Назад
Сверху Снизу