- Выберите загрузчик игры
- Vanilla
- Forge
- NeoForge
- ForgeOptiFine
Знаю что только с експой не делали, но такого вроде не виделю. ^_^
Немного перепишите, у меня изменённая база
Пожалуйста, авторизуйтесь для просмотра ссылки.
Немного перепишите, у меня изменённая база
GPSLony: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(); } }