Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 27 Июл 2025
- Сообщения
- 26
- Реакции
- 0
- Выберите загрузчик игры
- Forge
корявый гуи мув который стопит ядро, но в целом бупасит и анку, и дуэли
ss -
ss -
code:
package im.bloodnight.functions.impl.player;
import com.google.common.eventbus.Subscribe;
import im.bloodnight.Expensive;
import im.bloodnight.events.EventPacket;
import im.bloodnight.events.EventUpdate;
import im.bloodnight.functions.api.Category;
import im.bloodnight.functions.api.Function;
import im.bloodnight.functions.api.FunctionRegister;
import im.bloodnight.functions.settings.impl.BooleanSetting;
import im.bloodnight.utils.player.MoveUtils;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.screen.EditSignScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.inventory.ChestScreen;
import net.minecraft.client.gui.screen.inventory.InventoryScreen;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.client.util.InputMappings;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.client.CClickWindowPacket;
import net.minecraft.network.play.client.CCloseWindowPacket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@FunctionRegister(name = "GuiMove", type = Category.Player)
public class GuiMove extends Function {
public final BooleanSetting noMoveInChest = new BooleanSetting("Не двигаться в сундуках", false);
private int pauseTicks = 0;
private Screen lastScreen = null;
private final List<CClickWindowPacket> pendingPackets = new CopyOnWriteArrayList<>();
private boolean sendingPackets = false;
public GuiMove() {
addSettings(noMoveInChest);
}
@Subscribe
public void onUpdate(EventUpdate event) {
if (mc.player == null || mc.world == null) return;
if (lastScreen instanceof InventoryScreen && !(mc.currentScreen instanceof InventoryScreen)) {
onInventoryClosed();
}
lastScreen = mc.currentScreen;
final KeyBinding[] moveKeys = {
mc.gameSettings.keyBindForward,
mc.gameSettings.keyBindBack,
mc.gameSettings.keyBindLeft,
mc.gameSettings.keyBindRight,
mc.gameSettings.keyBindJump,
mc.gameSettings.keyBindSprint
};
if (pauseTicks > 0) {
for (KeyBinding keyBinding : moveKeys) {
keyBinding.setPressed(false);
}
pauseTicks--;
return;
}
for (KeyBinding keyBinding : moveKeys) {
boolean isKeyPressed = InputMappings.isKeyDown(
mc.getMainWindow().getHandle(),
keyBinding.getDefault().getKeyCode()
);
keyBinding.setPressed(isKeyPressed);
}
if (mc.currentScreen == null) {
return;
}
if (mc.currentScreen instanceof ChatScreen) {
return;
}
if (mc.currentScreen instanceof EditSignScreen) {
return;
}
if (noMoveInChest.get() && mc.currentScreen instanceof ChestScreen) {
return;
}
}
@Subscribe
public void onPacket(EventPacket event) {
if (mc.player == null) return;
if (!event.isSend()) return;
if (sendingPackets) return;
IPacket<?> packet = event.getPacket();
if (packet instanceof CClickWindowPacket clickPacket) {
if (MoveUtils.isMoving() && mc.currentScreen instanceof InventoryScreen) {
pendingPackets.add(clickPacket);
event.cancel();
}
}
if (packet instanceof CCloseWindowPacket) {
if (!pendingPackets.isEmpty() && MoveUtils.isMoving()) {
event.cancel();
sendPendingPackets();
}
}
}
private void sendPendingPackets() {
if (pendingPackets.isEmpty()) return;
List<CClickWindowPacket> packetsToSend = new ArrayList<>(pendingPackets);
pendingPackets.clear();
new Thread(() -> {
pauseTicks = 5;
try {
Thread.sleep(90);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
sendingPackets = true;
for (CClickWindowPacket pkt : packetsToSend) {
if (mc.player == null || mc.player.connection == null) break;
mc.player.connection.sendPacket(pkt);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
sendingPackets = false;
if (mc.player != null && mc.player.connection != null) {
mc.player.connection.sendPacket(new CCloseWindowPacket(mc.player.container.windowId));
}
}, "GuiMove-PacketSender").start();
}
private void onInventoryClosed() {
if (!pendingPackets.isEmpty()) {
sendPendingPackets();
}
}
public void stopMovementTemporarily(float timeInSeconds) {
if (!isState()) return;
int ticks = Math.max(1, (int) Math.ceil(timeInSeconds * 20.0f));
pauseTicks = Math.max(pauseTicks, ticks);
}
public static void stopMovement(float timeInSeconds) {
Function guiMove = Expensive.getInstance().getFunctionRegistry().getByClass(GuiMove.class);
if (guiMove instanceof GuiMove gm) {
gm.stopMovementTemporarily(timeInSeconds);
}
}
@Override
public void onEnable() {
super.onEnable();
pauseTicks = 3;
lastScreen = mc.currentScreen;
pendingPackets.clear();
sendingPackets = false;
}
@Override
public void onDisable() {
super.onDisable();
pauseTicks = 0;
lastScreen = null;
pendingPackets.clear();
sendingPackets = false;
}
}