Сделал обход гуимува на фт на базе новой экспы 4.0. Все работает, но при нажатии ПКМ ломается. Делал на подобие экспы 3.1 на 1.16.5, там же все работает идеально:
Java:
package ru.expensive.implement.features.modules.player;
import com.google.common.eventbus.Subscribe;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntSet;
import it.unimi.dsi.fastutil.objects.ObjectCollection;
import it.unimi.dsi.fastutil.objects.ObjectSet;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.gui.screen.ChatScreen;
import net.minecraft.client.gui.screen.ingame.*;
import net.minecraft.client.option.GameOptions;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket;
import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket;
import net.minecraft.network.packet.s2c.play.CloseScreenS2CPacket;
import net.minecraft.network.packet.s2c.play.InventoryS2CPacket;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.util.ClickType;
import org.jetbrains.annotations.NotNull;
import ru.expensive.api.event.EventHandler;
import ru.expensive.api.feature.module.setting.implement.ValueSetting;
import ru.expensive.common.util.player.MovingUtil;
import ru.expensive.implement.events.packet.PacketEvent;
import ru.expensive.implement.events.player.TickEvent;
import ru.expensive.api.feature.module.Module;
import ru.expensive.api.feature.module.ModuleCategory;
import ru.expensive.implement.screens.menu.MenuScreen;
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ScreenWalkModule extends Module {
ValueSetting delay = new ValueSetting("Time of stop", "Time for which you will stop after closing inventory")
.setValue(250).range(100, 1000);
public ScreenWalkModule() {
super("ScreenWalk", "Screen Walk", ModuleCategory.PLAYER);
setup(delay);
}
private List<ClickSlotC2SPacket> packets = new ArrayList<>();
private long timeClose;
@EventHandler
public void onTick(TickEvent tickEvent) {
GameOptions gameOptions = mc.options;
if (System.currentTimeMillis() - this.timeClose < delay.getValue()) {
for (KeyBinding keyBinding : MovingUtil.getMovementKeys(false)) {
keyBinding.setPressed(false);
}
return;
}
if (shouldSkipExecution()) {
return;
}
for (KeyBinding keyBinding : MovingUtil.getMovementKeys(false)) {
long handle = mc.getWindow().getHandle();
int keyCode = keyBinding.getDefaultKey().getCode();
keyBinding.setPressed(InputUtil.isKeyPressed(handle, keyCode));
}
}
@EventHandler
public void onPacket(PacketEvent e) {
if (e.getPacket() instanceof CloseHandledScreenC2SPacket p) {
if (!this.packets.isEmpty()) {
this.timeClose = System.currentTimeMillis();
long delayForSend = (long) (delay.getValue() * 0.75);
new Thread(() -> {
try {
Thread.sleep(delayForSend);
packets.forEach(packet -> mc.player.networkHandler.sendPacket(packet));
this.packets = new ArrayList<>();
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}).start();
}
}
if (e.getPacket() instanceof ClickSlotC2SPacket p) {
if (mc.currentScreen instanceof InventoryScreen) {
if (MovingUtil.hasPlayerMovement()) {
if (System.currentTimeMillis() - this.timeClose < delay.getValue()) {
return;
}
this.packets.add(p);
e.cancel();
}
}
}
}
public boolean shouldSkipExecution() {
return mc.currentScreen instanceof ChatScreen
|| mc.currentScreen instanceof SignEditScreen
|| mc.currentScreen instanceof AnvilScreen
|| mc.currentScreen instanceof AbstractCommandBlockScreen
|| mc.currentScreen instanceof StructureBlockScreen
|| mc.currentScreen instanceof MenuScreen;
}
}