package wtf.sqwezz.utils; import TickEvent.Phase;...
Erstellt am: 16. Mai 2025
Erstellt am: 16. Mai 2025
package wtf.sqwezz.utils;
import TickEvent.Phase;
import com.jagrosh.discordipc.IPCClient;
import com.jagrosh.discordipc.IPCListener;
import com.jagrosh.discordipc.entities.RichPresence;
import com.jagrosh.discordipc.exceptions.NoDiscordClientException;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData;
import wtf.sqwezz.functions.api.FunctionRegister;
import java.time.OffsetDateTime;
public class DiscordRPC {
private static final Minecraft mc = Minecraft.getInstance();
public static IPCClient client;
private static boolean running = false;
private static long lastUpdateTime = 0;
private static final String APPLICATION_ID = "1372950028167155866";
private static final long UPDATE_INTERVAL = 15000;
text// Инициализация static { startRPC(); } public static void startRPC() { if (running) return; try { client = new IPCClient(APPLICATION_ID); client.setListener(new IPCListener() { @Override public void onReady(IPCClient client) { running = true; System.out.println("[DiscordRPC] Подключено к Discord"); updatePresence(); } @Override public void onDisconnect(IPCClient client, Throwable t) { running = false; System.out.println("[DiscordRPC] Отключено от Discord"); } }); client.connect(); } catch (NoDiscordClientException e) { System.out.println("[DiscordRPC] Discord не запущен"); } catch (Exception e) { System.err.println("[DiscordRPC] Ошибка подключения:"); e.printStackTrace(); } } private static void updatePresence() { if (!running || System.currentTimeMillis() - lastUpdateTime < UPDATE_INTERVAL) return; try { String playerName = mc.player != null ? mc.player.getName().getString() : "Не в игре"; ServerData server = mc.getCurrentServerData(); String gameMode = mc.isSingleplayer() ? "Одиночная игра" : server != null ? "Сервер: " + server.serverIP : "Меню"; RichPresence presence = new RichPresence.Builder() .setDetails(playerName) .setState(gameMode) .setStartTimestamp(OffsetDateTime.now()) .setLargeImage("main", "Minecraft 1.12.2") .setSmallImage(mc.isSingleplayer() ? "single" : "multi", mc.isSingleplayer() ? "Одиночная" : "Мультиплеер") .build(); client.sendRichPresence(presence); lastUpdateTime = System.currentTimeMillis(); } catch (Exception e) { System.err.println("[DiscordRPC] Ошибка обновления:"); e.printStackTrace(); } } @SubscribeEvent public static void onClientTick(TickEvent.ClientTickEvent event) { Object TickEvent = null; if (event.phase == Phase.END) { updatePresence(); } }
}
вырежи
try {
String playerName = mc.player != null ? mc.player.getName().getString() : "Не в игре";
ServerData server = mc.getCurrentServerData();
String gameMode = mc.isSingleplayer() ? "Одиночная игра" :
server != null ? "Сервер: " + server.serverIP : "Меню";
textRichPresence presence = new RichPresence.Builder() .setDetails(playerName) .setState(gameMode) .setStartTimestamp(OffsetDateTime.now()) .setLargeImage("main", "Minecraft 1.12.2") .setSmallImage(mc.isSingleplayer() ? "single" : "multi", mc.isSingleplayer() ? "Одиночная" : "Мультиплеер") .build();
Вот класс DiscordRPC с полностью вырезанным блоком построения RichPresence — как вы просили.
(Внутри updatePresence()
я оставил «заглушку»‑комментарий и обновление lastUpdateTime
, чтобы метод по‑прежнему ограничивал частоту вызовов. Если потребуется другая логика, вставьте её вместо комментария.)
javapackage wtf.sqwezz.utils; import TickEvent.Phase; import com.jagrosh.discordipc.IPCClient; import com.jagrosh.discordipc.IPCListener; import com.jagrosh.discordipc.entities.RichPresence; import com.jagrosh.discordipc.exceptions.NoDiscordClientException; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerData; import wtf.sqwezz.functions.api.FunctionRegister; import java.time.OffsetDateTime; public class DiscordRPC { private static final Minecraft mc = Minecraft.getInstance(); public static IPCClient client; private static boolean running = false; private static long lastUpdateTime = 0; private static final String APPLICATION_ID = "1372950028167155866"; private static final long UPDATE_INTERVAL = 15000; // Инициализация static { startRPC(); } public static void startRPC() { if (running) return; try { client = new IPCClient(APPLICATION_ID); client.setListener(new IPCListener() { @Override public void onReady(IPCClient client) { running = true; System.out.println("[DiscordRPC] Подключено к Discord"); updatePresence(); } @Override public void onDisconnect(IPCClient client, Throwable t) { running = false; System.out.println("[DiscordRPC] Отключено от Discord"); } }); client.connect(); } catch (NoDiscordClientException e) { System.out.println("[DiscordRPC] Discord не запущен"); } catch (Exception e) { System.err.println("[DiscordRPC] Ошибка подключения:"); e.printStackTrace(); } } /** * Обновление RPC‑статуса. * Блок построения RichPresence удалён по запросу («вырезан»). */ private static void updatePresence() { if (!running || System.currentTimeMillis() - lastUpdateTime < UPDATE_INTERVAL) return; // TODO: добавьте здесь свою логику формирования RichPresence lastUpdateTime = System.currentTimeMillis(); } @SubscribeEvent public static void onClientTick(TickEvent.ClientTickEvent event) { if (event.phase == Phase.END) { updatePresence(); } } }
сделай так же но только на подобие вот этого
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package dev.akven.utils;
import com.jagrosh.discordipc.IPCClient;
import com.jagrosh.discordipc.IPCListener;
import com.jagrosh.discordipc.entities.Packet;
import com.jagrosh.discordipc.entities.RichPresence;
import java.time.OffsetDateTime;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerEntity;
class DiscordRPC1 implements IPCListener {
DiscordRPC1() {
}
textpublic void onPacketReceived(IPCClient client, Packet packet) { super.onPacketReceived(client, packet); } public void onReady(IPCClient client) { Minecraft var10000 = DiscordRPC.mc; PlayerEntity player = Minecraft.player; String playerName = null; if (player != null) { playerName = player.getName().getString(); } RichPresence.Builder builder = new RichPresence.Builder(); builder.setDetails("★ User: » UID: ").setStartTimestamp(OffsetDateTime.now()).setLargeImage("https://postimg.su/image/RKq697js/Safeimagekit.gif", "TESTING FUNCTIONS").setState("★ Build: 0.0.1 BETA"); client.sendRichPresence(builder.build()); }
}
Ниже приведён облегчённый класс DiscordRPC, построенный «в стиле» вашего примера: состояние Discord-RPC формируется сразу в onReady()
анонимного IPCListener
и отправляется один раз при подключении. Периодического обновления (updatePresence
) больше нет — всё, как в decompiler-файле, что вы показали.
java// // Source code written по мотивам примера из FernFlower // package wtf.sqwezz.utils; import com.jagrosh.discordipc.IPCClient; import com.jagrosh.discordipc.IPCListener; import com.jagrosh.discordipc.entities.Packet; import com.jagrosh.discordipc.entities.RichPresence; import com.jagrosh.discordipc.exceptions.NoDiscordClientException; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.PlayerEntity; import java.time.OffsetDateTime; public class DiscordRPC { // ──────────────────────────── Константы ──────────────────────────── private static final Minecraft MC = Minecraft.getInstance(); private static final String APPLICATION_ID = "1372950028167155866"; // ──────────────────────────── Поля ──────────────────────────────── private static IPCClient client; private static boolean running; // ──────────────────────────── Статический блок ──────────────────── static { startRPC(); } // автозапуск // ──────────────────────────── RPC-инициализация ─────────────────── public static void startRPC() { if (running) return; try { client = new IPCClient(APPLICATION_ID); client.setListener(new IPCListener() { // ——— пакеты можем игнорировать, но оставим override для полноты @Override public void onPacketReceived(IPCClient client, Packet packet) { /* no-op */ } // ——— успешно подключились к Discord @Override public void onReady(IPCClient client) { running = true; // Берём имя игрока, если он в мире PlayerEntity player = MC.player; String playerName = player != null ? player.getName().getString() : "Unknown"; // Строим presence «как в образце» RichPresence presence = new RichPresence.Builder() .setDetails("★ User: " + playerName + " » UID: " + MC.getSession().getPlayerID()) .setState("★ Build: 0.0.1 BETA") .setStartTimestamp(OffsetDateTime.now()) .setLargeImage("https://postimg.su/image/RKq697js/Safeimagekit.gif", "TESTING FUNCTIONS") .build(); client.sendRichPresence(presence); System.out.println("[DiscordRPC] Connected — presence sent"); } // ——— отключение @Override public void onDisconnect(IPCClient client, Throwable t) { running = false; System.out.println("[DiscordRPC] Disconnected from Discord"); } }); client.connect(); } catch (NoDiscordClientException e) { System.out.println("[DiscordRPC] Discord не запущен"); } catch (Exception e) { System.err.println("[DiscordRPC] Ошибка подключения:"); e.printStackTrace(); } } }
Теперь класс делает ровно то, что показано в вашем примере: устанавливает Rich Presence один раз при успешном подключении к Discord IPC, без периодических обновлений. Если нужно вернуть таймер и динамическое изменение статуса — дайте знать!
//
// Source code written по мотивам примера из FernFlower
//
package wtf.sqwezz.utils;
import com.jagrosh.discordipc.IPCClient;
import com.jagrosh.discordipc.IPCListener;
import com.jagrosh.discordipc.entities.Packet;
import com.jagrosh.discordipc.entities.RichPresence;
import com.jagrosh.discordipc.exceptions.NoDiscordClientException;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.PlayerEntity;
import java.time.OffsetDateTime;
public class DiscordRPC {
text// ──────────────────────────── Константы ──────────────────────────── private static final Minecraft MC = Minecraft.getInstance(); private static final String APPLICATION_ID = "1372950028167155866"; // ──────────────────────────── Поля ──────────────────────────────── private static IPCClient client; private static boolean running; // ──────────────────────────── Статический блок ──────────────────── static { startRPC(); } // автозапуск // ──────────────────────────── RPC-инициализация ─────────────────── public static void startRPC() { if (running) return; try { client = new IPCClient(APPLICATION_ID); client.setListener(new IPCListener() { // ——— пакеты можем игнорировать, но оставим override для полноты @Override public void onPacketReceived(IPCClient client, Packet packet) { /* no-op */ } // ——— успешно подключились к Discord @Override public void onReady(IPCClient client) { running = true; // Берём имя игрока, если он в мире PlayerEntity player = MC.player; String playerName = player != null ? player.getName().getString() : "Unknown"; // Строим presence «как в образце» RichPresence presence = new RichPresence.Builder() .setDetails("★ User: " + " 74IQ; UID: 1488" + MC.getSession().getPlayerID()) .setState("★ Build: BETA") .setStartTimestamp(OffsetDateTime.now()) .setLargeImage("http://postimg.su/image/gk6EgWj8/ава.png", "★ dev: 74IQ ★") .build(); client.sendRichPresence(presence); System.out.println("[DiscordRPC] Connected — presence sent"); } // ——— отключение @Override public void onDisconnect(IPCClient client, Throwable t) { running = false; System.out.println("[DiscordRPC] Disconnected from Discord"); } }); client.connect(); } catch (NoDiscordClientException e) { System.out.println("[DiscordRPC] Discord не запущен"); } catch (Exception e) { System.err.println("[DiscordRPC] Ошибка подключения:"); e.printStackTrace(); } }
}
убери в UID
Ниже тот же класс, но строка UID полностью убрана из Rich Presence – теперь в details
выводится только ник игрока (или «Unknown», если игрок ещё не загружен).
java// // Source code written по мотивам примера из FernFlower // package wtf.sqwezz.utils; import com.jagrosh.discordipc.IPCClient; import com.jagrosh.discordipc.IPCListener; import com.jagrosh.discordipc.entities.Packet; import com.jagrosh.discordipc.entities.RichPresence; import com.jagrosh.discordipc.exceptions.NoDiscordClientException; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.PlayerEntity; import java.time.OffsetDateTime; public class DiscordRPC { // ──────────────────────────── Константы ──────────────────────────── private static final Minecraft MC = Minecraft.getInstance(); private static final String APPLICATION_ID = "1372950028167155866"; // ──────────────────────────── Поля ──────────────────────────────── private static IPCClient client; private static boolean running; // ──────────────────────────── Статический блок ──────────────────── static { startRPC(); } // автозапуск // ──────────────────────────── RPC-инициализация ─────────────────── public static void startRPC() { if (running) return; try { client = new IPCClient(APPLICATION_ID); client.setListener(new IPCListener() { @Override public void onPacketReceived(IPCClient client, Packet packet) { /* no-op */ } @Override public void onReady(IPCClient client) { running = true; // Имя игрока (или «Unknown») PlayerEntity player = MC.player; String playerName = player != null ? player.getName().getString() : "Unknown"; // UID удалён из details RichPresence presence = new RichPresence.Builder() .setDetails("★ User: " + playerName) .setState("★ Build: BETA") .setStartTimestamp(OffsetDateTime.now()) .setLargeImage("http://postimg.su/image/gk6EgWj8/ава.png", "★ dev: 74IQ ★") .build(); client.sendRichPresence(presence); System.out.println("[DiscordRPC] Connected — presence sent"); } @Override public void onDisconnect(IPCClient client, Throwable t) { running = false; System.out.println("[DiscordRPC] Disconnected from Discord"); } }); client.connect(); } catch (NoDiscordClientException e) { System.out.println("[DiscordRPC] Discord не запущен"); } catch (Exception e) { System.err.println("[DiscordRPC] Ошибка подключения:"); e.printStackTrace(); } } }
Теперь Rich Presence больше не содержит поле UID. Если понадобится ещё что-то подправить — дайте знать!
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package wtf.sqwezz.functions.impl.player;
import com.google.common.eventbus.Subscribe;
import wtf.sqwezz.events.EventPacket;
import wtf.sqwezz.events.EventUpdate;
import wtf.sqwezz.functions.api.Category;
import wtf.sqwezz.functions.api.Function;
import wtf.sqwezz.functions.api.FunctionRegister;
import wtf.sqwezz.utils.player.InventoryUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.inventory.ChestScreen;
import net.minecraft.client.network.play.ClientPlayNetHandler;
import net.minecraft.inventory.container.ChestContainer;
import net.minecraft.inventory.container.ClickType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.play.client.CClickWindowPacket;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.util.Hand;
@FunctionRegister(
name = "SDuelConnect",
type = Category.Player
)
public class SDuelConnect extends Function {
public SDuelConnect() {
}
textpublic static void selectCompass() { int n = InventoryUtil.getInstance(Items.COMPASS).findBestSlotInHotBar(); if (n != -1) { Minecraft var10000 = mc; Minecraft.player.inventory.currentItem = n; var10000 = mc; Minecraft.player.connection.sendPacket(new CHeldItemChangePacket(n)); Minecraft var10001 = mc; Minecraft var10002 = mc; mc.playerController.processRightClick(Minecraft.player, Minecraft.world, Hand.MAIN_HAND); } } @Subscribe private void onUpdate(EventUpdate eventUpdate) { Screen screen = mc.currentScreen; if (screen instanceof ChestScreen chestScreen) { for(int i = 0; i < ((ChestContainer)chestScreen.getContainer()).inventorySlots.size(); ++i) { if (((ChestContainer)chestScreen.getContainer()).getSlot(i).getStack().getItem() == Items.STICKY_PISTON) { ItemStack itemStack = ((ChestContainer)chestScreen.getContainer()).getSlot(i).getStack(); Minecraft var10000 = mc; ClientPlayNetHandler var6 = Minecraft.player.connection; int var10003 = ((ChestContainer)chestScreen.getContainer()).windowId; ClickType var10006 = ClickType.PICKUP; ChestContainer var10008 = (ChestContainer)chestScreen.getContainer(); Minecraft var10009 = mc; var6.sendPacket(new CClickWindowPacket(var10003, i, 0, var10006, itemStack, var10008.getNextTransactionID(Minecraft.player.inventory))); return; } } } else { selectCompass(); } } @Subscribe private void onPacket(EventPacket eventPacket) { String string = mc.ingameGUI.getTabList().header.getString(); if (string.contains("Приватка")) { this.print("Успешно подключился на дуэли!"); this.toggle(); } }
}
сделай так что бы оно нажимало автоматически ПКМ
Чтобы клик по слоту со Sticky Piston выполнялся именно ПКМ, достаточно передать в CClickWindowPacket
значение 1
вместо 0
(первый аргумент button: 0 – ЛКМ
, 1 – ПКМ
). Ниже показан изменённый фрагмент метода onUpdate
— остальной класс оставьте без изменений.
java@Subscribe private void onUpdate(EventUpdate eventUpdate) { Screen screen = mc.currentScreen; if (screen instanceof ChestScreen chestScreen) { for (int i = 0; i < ((ChestContainer) chestScreen.getContainer()).inventorySlots.size(); ++i) { if (((ChestContainer) chestScreen.getContainer()).getSlot(i).getStack().getItem() == Items.STICKY_PISTON) { ItemStack itemStack = ((ChestContainer) chestScreen.getContainer()).getSlot(i).getStack(); // ────────── главное изменение: button = 1 (ПКМ) ────────── mc.player.connection.sendPacket( new CClickWindowPacket( ((ChestContainer) chestScreen.getContainer()).windowId, // windowId i, // slot 1, // button 1 → ПКМ ClickType.PICKUP, // тип клика itemStack, ((ChestContainer) chestScreen.getContainer()) .getNextTransactionID(Minecraft.player.inventory) ) ); return; } } } else { selectCompass(); // как было } }
Теперь мод каждый тик «правой кнопкой» забирает один предмет из нужного слота; действие выполняется автоматически, как вы и хотели. Если потребуется другое поведение (например, зажимать ПКМ или клика́ть несколько раз подряд) — сообщите!