package lun.hydra.game.modules.impl.movement;
import lun.hydra.api.events.EventMotion;
import lun.hydra.api.events.EventPacket;
import lun.hydra.api.events.InventoryCloseEvent;
import lun.hydra.game.modules.api.Category;
import lun.hydra.game.modules.api.Module;
import lun.hydra.game.modules.api.ModuleRegister;
import lun.hydra.game.modules.settings.impl.CheckBoxSetting;
import lun.hydra.api.utils.math.StopWatch;
import lun.hydra.api.utils.player.MoveUtils;
import com.google.common.eventbus.Subscribe;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.screen.EditSignScreen;
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
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 java.util.ArrayList;
import java.util.List;
@ModuleRegister(name = "InventoryMove", desc = "Передвигаться в инвентаре", category = Category.Movement)
public class invwalk extends Module {
private final List<IPacket<?>> packet = new ArrayList<>();
public final CheckBoxSetting ft = new CheckBoxSetting("Обход", false);
public final CheckBoxSetting disableInContainer = new CheckBoxSetting("Отключать в контейнере", false);
public invwalk() {addSettings(ft, disableInContainer);}
@Subscribe
public void onUpdate(EventMotion e) {
if (mc.player != null) {
if (disableInContainer.get()
&& mc.currentScreen instanceof ContainerScreen<?>
&& !(mc.currentScreen instanceof InventoryScreen)) {
return;
}
final KeyBinding[] pressedKeys = {mc.gameSettings.keyBindForward, mc.gameSettings.keyBindBack,
mc.gameSettings.keyBindLeft, mc.gameSettings.keyBindRight, mc.gameSettings.keyBindJump,
mc.gameSettings.keyBindSprint};
if (!wait.isReached(200) && ft.get()) {
for (KeyBinding keyBinding : pressedKeys) {
keyBinding.setPressed(false);
}
return;
}
if (mc.currentScreen instanceof ChatScreen || mc.currentScreen instanceof EditSignScreen) {
return;
}
updateKeyBindingState(pressedKeys);
}
}
@Subscribe
public void onPacket(EventPacket e) {
if (ft.get()) {
if (e.getPacket() instanceof CClickWindowPacket p && MoveUtils.isMoving()) {
if (mc.currentScreen instanceof InventoryScreen) {
packet.add(p);
e.cancel();
}
}
}
}
public StopWatch wait = new StopWatch();
@Subscribe
public void onClose(InventoryCloseEvent e) {
if (ft.get()) {
if (mc.currentScreen instanceof InventoryScreen && !packet.isEmpty() && MoveUtils.isMoving()) {
new Thread(() -> {
wait.reset();
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
for (IPacket p : packet) {
mc.player.connection.sendPacketWithoutEvent(p);
}
packet.clear();
}).start();
e.cancel();
}
}
}
private void updateKeyBindingState(KeyBinding[] keyBindings) {
for (KeyBinding keyBinding : keyBindings) {
boolean isKeyPressed = InputMappings.isKeyDown(mc.getMainWindow().getHandle(), keyBinding.getDefault().getKeyCode());
keyBinding.setPressed(isKeyPressed);
}
}
}