diff --git a/src/main/java/keystrokesmod/mixins/impl/entity/MixinEntityPlayerSP.java b/src/main/java/keystrokesmod/mixins/impl/entity/MixinEntityPlayerSP.java index 9a1341994..94090eb86 100644 --- a/src/main/java/keystrokesmod/mixins/impl/entity/MixinEntityPlayerSP.java +++ b/src/main/java/keystrokesmod/mixins/impl/entity/MixinEntityPlayerSP.java @@ -6,7 +6,7 @@ import keystrokesmod.event.PreMotionEvent; import keystrokesmod.event.PreUpdateEvent; import keystrokesmod.module.ModuleManager; -import keystrokesmod.module.impl.combat.WTap; +import keystrokesmod.module.impl.combat.SuperKnockback; import keystrokesmod.module.impl.movement.NoSlow; import keystrokesmod.utility.RotationUtils; import net.minecraft.client.Minecraft; @@ -298,9 +298,8 @@ public void onLivingUpdate() { this.setSprinting(true); } - if (this.isSprinting() && ((this.movementInput.moveForward < f || this.isCollidedHorizontally || !flag3) || (ModuleManager.scaffold != null && ModuleManager.scaffold.isEnabled() && !ModuleManager.scaffold.sprint() && !ModuleManager.tower.canSprint()) || (ModuleManager.wTap.isEnabled() && WTap.stopSprint))) { + if (this.isSprinting() && ((this.movementInput.moveForward < f || this.isCollidedHorizontally || !flag3) || (ModuleManager.scaffold != null && ModuleManager.scaffold.isEnabled() && !ModuleManager.scaffold.sprint() && !ModuleManager.tower.canSprint()))) { this.setSprinting(false); - WTap.stopSprint = false; } if (this.capabilities.allowFlying) { diff --git a/src/main/java/keystrokesmod/module/ModuleManager.java b/src/main/java/keystrokesmod/module/ModuleManager.java index bf304df25..e3a022a5e 100644 --- a/src/main/java/keystrokesmod/module/ModuleManager.java +++ b/src/main/java/keystrokesmod/module/ModuleManager.java @@ -41,7 +41,7 @@ public class ModuleManager { public static HUD hud; public static Timer timer; public static Module fly; - public static Module wTap; + public static Module superKnockback; public static Potions potions; public static NoFall noFall; public static PlayerESP playerESP; @@ -59,6 +59,8 @@ public class ModuleManager { public static Criticals criticals; public static TimerRange timerRange; public static TargetStrafe targetStrafe; + public static AutoHeal autoHeal; + public static HitSelect hitSelect; public void register() { this.addModule(autoClicker = new AutoClicker()); @@ -111,7 +113,7 @@ public void register() { this.addModule(hud = new HUD()); this.addModule(new Anticheat()); this.addModule(new BreakProgress()); - this.addModule(wTap = new WTap()); + this.addModule(superKnockback = new SuperKnockback()); this.addModule(new Xray()); this.addModule(new BridgeInfo()); this.addModule(new TargetHUD()); @@ -148,6 +150,8 @@ public void register() { this.addModule(criticals = new Criticals()); this.addModule(timerRange = new TimerRange()); this.addModule(targetStrafe = new TargetStrafe()); + this.addModule(autoHeal = new AutoHeal()); + this.addModule(hitSelect = new HitSelect()); antiBot.enable(); modules.sort(Comparator.comparing(Module::getName)); } diff --git a/src/main/java/keystrokesmod/module/impl/combat/AutoClicker.java b/src/main/java/keystrokesmod/module/impl/combat/AutoClicker.java index 349a64571..0c3ea074d 100644 --- a/src/main/java/keystrokesmod/module/impl/combat/AutoClicker.java +++ b/src/main/java/keystrokesmod/module/impl/combat/AutoClicker.java @@ -98,7 +98,7 @@ public void guiUpdate() { @SubscribeEvent public void onRenderTick(RenderTickEvent ev) { - if (ev.phase != Phase.END && Utils.nullCheck() && !mc.thePlayer.isEating()) { + if (ev.phase != Phase.END && Utils.nullCheck() && !mc.thePlayer.isEating() && HitSelect.canAttack()) { if (mc.currentScreen == null && mc.inGameHasFocus) { if (weaponOnly.isToggled() && !Utils.holdingWeapon()) { return; diff --git a/src/main/java/keystrokesmod/module/impl/combat/BurstClicker.java b/src/main/java/keystrokesmod/module/impl/combat/BurstClicker.java index 941e6ece1..e234ad97d 100644 --- a/src/main/java/keystrokesmod/module/impl/combat/BurstClicker.java +++ b/src/main/java/keystrokesmod/module/impl/combat/BurstClicker.java @@ -57,7 +57,7 @@ public void onEnable() { } this.disable(); - } catch (InterruptedException var5) { + } catch (InterruptedException ignored) { } }); diff --git a/src/main/java/keystrokesmod/module/impl/combat/Criticals.java b/src/main/java/keystrokesmod/module/impl/combat/Criticals.java index 6bf7d4377..6b9c46bc1 100644 --- a/src/main/java/keystrokesmod/module/impl/combat/Criticals.java +++ b/src/main/java/keystrokesmod/module/impl/combat/Criticals.java @@ -38,7 +38,7 @@ public void onPacketReceive(@NotNull ReceivePacketEvent event) { @SubscribeEvent public void onPreMotion(PreMotionEvent event) { if (!isEnabled()) return; - if (mc.thePlayer.ticksExisted <= 18 && mc.thePlayer.fallDistance < 1.3) { + if (ticksSinceVelocity <= 18 && mc.thePlayer.fallDistance < 1.3) { event.setOnGround(false); } } diff --git a/src/main/java/keystrokesmod/module/impl/combat/HitSelect.java b/src/main/java/keystrokesmod/module/impl/combat/HitSelect.java new file mode 100644 index 000000000..0c893903f --- /dev/null +++ b/src/main/java/keystrokesmod/module/impl/combat/HitSelect.java @@ -0,0 +1,51 @@ +package keystrokesmod.module.impl.combat; + +import keystrokesmod.event.PreUpdateEvent; +import keystrokesmod.module.Module; +import keystrokesmod.module.setting.impl.DescriptionSetting; +import keystrokesmod.module.setting.impl.SliderSetting; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.jetbrains.annotations.NotNull; + +import static keystrokesmod.module.ModuleManager.hitSelect; + +public class HitSelect extends Module { + private static long attackTime = -1; + private final SliderSetting delay; + private final SliderSetting chance; + private static boolean currentShouldAttack = false; + + public HitSelect() { + super("HitSelect", category.combat); + this.registerSetting(new DescriptionSetting("chooses the best time to hit.")); + this.registerSetting(delay = new SliderSetting("Delay", 500, 200, 750, 1)); + this.registerSetting(chance = new SliderSetting("Chance", 80, 0, 100, 1)); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onAttack(@NotNull AttackEntityEvent event) { + attackTime = System.currentTimeMillis(); + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onPreUpdate(PreUpdateEvent event) { + currentShouldAttack = Math.random() > hitSelect.chance.getInput() || System.currentTimeMillis() - HitSelect.attackTime >= hitSelect.delay.getInput(); + } + + public static boolean canAttack() { + if (!hitSelect.isEnabled()) return true; + if (currentShouldAttack) { + HitSelect.attackTime = System.currentTimeMillis(); + return true; + } + + return false; + } + + public static boolean canSwing() { + if (!hitSelect.isEnabled()) return true; + return currentShouldAttack; + } +} diff --git a/src/main/java/keystrokesmod/module/impl/combat/KillAura.java b/src/main/java/keystrokesmod/module/impl/combat/KillAura.java index ef41f9fa0..f3919e755 100644 --- a/src/main/java/keystrokesmod/module/impl/combat/KillAura.java +++ b/src/main/java/keystrokesmod/module/impl/combat/KillAura.java @@ -167,7 +167,7 @@ public void onPreUpdate(PreUpdateEvent e) { return; } boolean swingWhileBlocking = !silentSwing.isToggled() || !block.get(); - if (swing && attack) { + if (swing && attack && HitSelect.canSwing()) { if (swingWhileBlocking) { mc.thePlayer.swingItem(); } diff --git a/src/main/java/keystrokesmod/module/impl/combat/SuperKnockback.java b/src/main/java/keystrokesmod/module/impl/combat/SuperKnockback.java new file mode 100644 index 000000000..54367d15a --- /dev/null +++ b/src/main/java/keystrokesmod/module/impl/combat/SuperKnockback.java @@ -0,0 +1,61 @@ +package keystrokesmod.module.impl.combat; + +import keystrokesmod.Raven; +import keystrokesmod.module.Module; +import keystrokesmod.module.impl.world.AntiBot; +import keystrokesmod.module.setting.impl.ButtonSetting; +import keystrokesmod.module.setting.impl.SliderSetting; +import keystrokesmod.utility.Utils; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import java.util.concurrent.TimeUnit; + +public class SuperKnockback extends Module { + private final SliderSetting chance; + private final SliderSetting delay; + private final SliderSetting rePressDelay; + private long lastFinish = -1; + private final ButtonSetting playersOnly; + private final ButtonSetting sprintReset; + private final ButtonSetting sneak; + + public SuperKnockback() { + super("SuperKnockback", category.combat); + this.registerSetting(chance = new SliderSetting("Chance", 100, 0, 100, 1, "%")); + this.registerSetting(delay = new SliderSetting("Delay", 500, 200, 750, 1, "ms")); + this.registerSetting(rePressDelay = new SliderSetting("Re-press delay", 100, 1, 500, 1, "ms")); + this.registerSetting(playersOnly = new ButtonSetting("Players only", true)); + this.registerSetting(sprintReset = new ButtonSetting("Sprint reset", true)); + this.registerSetting(sneak = new ButtonSetting("Sneak", false)); + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public void onAttack(AttackEntityEvent event) { + final long currentTimeMillis = System.currentTimeMillis(); + if (!Utils.nullCheck() || event.entityPlayer != mc.thePlayer || currentTimeMillis - lastFinish < delay.getInput()) return; + if (playersOnly.isToggled() && !(event.target instanceof EntityPlayer)) return; + else if (!(event.target instanceof EntityLivingBase)) return; + if (((EntityLivingBase) event.target).deathTime != 0) return; + if (AntiBot.isBot(event.target)) return; + + if (Math.random() > chance.getInput()) return; + // code + if (sprintReset.isToggled() && mc.gameSettings.keyBindForward.isKeyDown()) { + KeyBinding.setKeyBindState(mc.gameSettings.keyBindForward.getKeyCode(), false); + Raven.getExecutor().schedule(() -> KeyBinding.setKeyBindState(mc.gameSettings.keyBindForward.getKeyCode(), true), + (long) rePressDelay.getInput(), TimeUnit.MILLISECONDS); + } + if (sneak.isToggled() && !mc.gameSettings.keyBindSneak.isKeyDown()) { + KeyBinding.setKeyBindState(mc.gameSettings.keyBindSneak.getKeyCode(), true); + Raven.getExecutor().schedule(() -> KeyBinding.setKeyBindState(mc.gameSettings.keyBindSneak.getKeyCode(), false), + (long) rePressDelay.getInput(), TimeUnit.MILLISECONDS); + } + + lastFinish = currentTimeMillis; + } +} diff --git a/src/main/java/keystrokesmod/module/impl/combat/WTap.java b/src/main/java/keystrokesmod/module/impl/combat/WTap.java deleted file mode 100644 index b95dc3798..000000000 --- a/src/main/java/keystrokesmod/module/impl/combat/WTap.java +++ /dev/null @@ -1,64 +0,0 @@ -package keystrokesmod.module.impl.combat; - -import keystrokesmod.module.Module; -import keystrokesmod.module.setting.impl.ButtonSetting; -import keystrokesmod.module.setting.impl.SliderSetting; -import keystrokesmod.utility.Utils; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import java.util.HashMap; - -public class WTap extends Module { - private SliderSetting chance; - private ButtonSetting playersOnly; - private final HashMap targets = new HashMap<>(); - public static boolean stopSprint = false; - public WTap() { - super("WTap", category.combat); - this.registerSetting(chance = new SliderSetting("Chance", 100, 0, 100, 1, "%")); - this.registerSetting(playersOnly = new ButtonSetting("Players only", true)); - } - - @SubscribeEvent - public void onAttack(AttackEntityEvent event) { - if (!Utils.nullCheck() || event.entityPlayer != mc.thePlayer || !mc.thePlayer.isSprinting()) { - return; - } - if (playersOnly.isToggled()) { - if (!(event.target instanceof EntityPlayer)) { - return; - } - final EntityPlayer entityPlayer = (EntityPlayer)event.target; - if (entityPlayer.maxHurtTime == 0 || entityPlayer.hurtTime > 3) { - return; - } - } - else if (!(event.target instanceof EntityLivingBase)) { - return; - } - if (((EntityLivingBase)event.target).deathTime != 0) { - return; - } - final long currentTimeMillis = System.currentTimeMillis(); - final Long n = this.targets.get(event.target.getEntityId()); - if (n != null && Utils.getDifference(n, currentTimeMillis) <= 200L) { - return; - } - if (chance.getInput() != 100.0D) { - double ch = Math.random(); - if (ch >= chance.getInput() / 100.0D) { - return; - } - } - this.targets.put(event.target.getEntityId(), currentTimeMillis); - stopSprint = true; - } - - public void onDisable() { - stopSprint = false; - this.targets.clear(); - } -} diff --git a/src/main/java/keystrokesmod/module/impl/movement/InvMove.java b/src/main/java/keystrokesmod/module/impl/movement/InvMove.java index 971ee625c..2b75cff16 100644 --- a/src/main/java/keystrokesmod/module/impl/movement/InvMove.java +++ b/src/main/java/keystrokesmod/module/impl/movement/InvMove.java @@ -1,11 +1,18 @@ package keystrokesmod.module.impl.movement; +import keystrokesmod.event.ReceivePacketEvent; import keystrokesmod.module.Module; +import keystrokesmod.module.setting.impl.ButtonSetting; import keystrokesmod.module.setting.impl.DescriptionSetting; import keystrokesmod.module.setting.impl.SliderSetting; import keystrokesmod.utility.Utils; +import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.settings.KeyBinding; +import net.minecraft.network.play.server.S2DPacketOpenWindow; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.jetbrains.annotations.NotNull; import org.lwjgl.input.Keyboard; import static keystrokesmod.module.ModuleManager.blink; @@ -13,27 +20,32 @@ public class InvMove extends Module { public static final String[] MODES = {"Normal", "Blink"}; private final SliderSetting mode; + private final ButtonSetting chestNameCheck; private boolean blinking = false; + private String currentTitle = ""; public InvMove() { super("InvMove", category.movement); this.registerSetting(new DescriptionSetting("Allow you move in inventory.")); this.registerSetting(mode = new SliderSetting("Mode", MODES, 0)); + this.registerSetting(chestNameCheck = new ButtonSetting("Chest name check", true)); } @Override public void onUpdate() { - if (mc.currentScreen instanceof GuiContainer) { - if (!blinking) { - blink.enable(); + if (mc.currentScreen instanceof GuiContainer && nameCheck()) { + if ((int) mode.getInput() == 1) { + if (!blinking) { + blink.enable(); + } + blinking = true; } - blinking = true; KeyBinding.setKeyBindState(mc.gameSettings.keyBindForward.getKeyCode(), Keyboard.isKeyDown(mc.gameSettings.keyBindForward.getKeyCode())); KeyBinding.setKeyBindState(mc.gameSettings.keyBindBack.getKeyCode(), Keyboard.isKeyDown(mc.gameSettings.keyBindBack.getKeyCode())); KeyBinding.setKeyBindState(mc.gameSettings.keyBindRight.getKeyCode(), Keyboard.isKeyDown(mc.gameSettings.keyBindRight.getKeyCode())); KeyBinding.setKeyBindState(mc.gameSettings.keyBindLeft.getKeyCode(), Keyboard.isKeyDown(mc.gameSettings.keyBindLeft.getKeyCode())); KeyBinding.setKeyBindState(mc.gameSettings.keyBindJump.getKeyCode(), Utils.jumpDown()); - } else { + } else if ((int) mode.getInput() == 1) { if (blinking && blink.isEnabled()) { blink.disable(); } @@ -41,6 +53,22 @@ public void onUpdate() { } } + private boolean nameCheck() { + if (!chestNameCheck.isToggled()) return true; + if (!(mc.currentScreen instanceof GuiChest)) return true; + + return currentTitle.equals("Chest"); + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public void onReceivePacket(@NotNull ReceivePacketEvent event) { + if (event.getPacket() instanceof S2DPacketOpenWindow) { + S2DPacketOpenWindow packet = (S2DPacketOpenWindow) event.getPacket(); + + this.currentTitle = packet.getWindowTitle().getUnformattedText(); + } + } + @Override public void onDisable() { if (blinking && blink.isEnabled()) { diff --git a/src/main/java/keystrokesmod/module/impl/movement/LongJump.java b/src/main/java/keystrokesmod/module/impl/movement/LongJump.java index 2edb9fb86..12d4ede7c 100644 --- a/src/main/java/keystrokesmod/module/impl/movement/LongJump.java +++ b/src/main/java/keystrokesmod/module/impl/movement/LongJump.java @@ -10,11 +10,13 @@ import keystrokesmod.utility.MoveUtil; import keystrokesmod.utility.Reflection; import keystrokesmod.utility.Utils; +import keystrokesmod.utility.render.RenderUtils; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.network.play.server.S12PacketEntityVelocity; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; import org.jetbrains.annotations.NotNull; public class LongJump extends Module { @@ -23,6 +25,7 @@ public class LongJump extends Module { private final SliderSetting horizonBoost; private final SliderSetting verticalMotion; private final ButtonSetting jumpAtEnd; + private final ButtonSetting showBPS; private int ticks = 0; private boolean start; private boolean done; @@ -35,6 +38,18 @@ public LongJump() { this.registerSetting(horizonBoost = new SliderSetting("Horizon boost", 1.0, 0.5, 3.0, 0.05)); this.registerSetting(verticalMotion = new SliderSetting("Vertical motion", 0.35, 0.01, 0.4, 0.01)); this.registerSetting(jumpAtEnd = new ButtonSetting("Jump at end.", false)); + this.registerSetting(showBPS = new ButtonSetting("Show BPS", false)); + } + + @SubscribeEvent + public void onRender(TickEvent.RenderTickEvent event) { + if (!showBPS.isToggled() || event.phase != TickEvent.Phase.END || !Utils.nullCheck()) { + return; + } + if (mc.currentScreen != null || mc.gameSettings.showDebugInfo) { + return; + } + RenderUtils.renderBPS(true, false); } @SubscribeEvent(priority = EventPriority.HIGH) diff --git a/src/main/java/keystrokesmod/module/impl/player/AutoHeal.java b/src/main/java/keystrokesmod/module/impl/player/AutoHeal.java new file mode 100644 index 000000000..f1ba31e2e --- /dev/null +++ b/src/main/java/keystrokesmod/module/impl/player/AutoHeal.java @@ -0,0 +1,64 @@ +package keystrokesmod.module.impl.player; + +import keystrokesmod.module.Module; +import keystrokesmod.module.setting.impl.DescriptionSetting; +import keystrokesmod.module.setting.impl.SliderSetting; +import keystrokesmod.utility.ContainerUtils; +import keystrokesmod.utility.Utils; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.item.ItemSkull; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +public class AutoHeal extends Module { + private final SliderSetting minHealth; + private final SliderSetting healDelay; + private final SliderSetting startDelay; + private final SliderSetting switchBackDelay; + private long lastHeal = -1; + private long lastSwitchTo = -1; + private long lastDoneUse = -1; + private int lastSlot = -1; + public AutoHeal() { + super("AutoHeal", category.player); + this.registerSetting(new DescriptionSetting("help you win Hypixel BUhc.")); + this.registerSetting(minHealth = new SliderSetting("Min health", 10, 0, 20, 1)); + this.registerSetting(healDelay = new SliderSetting("Heal delay", 500, 0, 1500, 1)); + this.registerSetting(startDelay = new SliderSetting("Start delay", 30, 0, 300, 1)); + this.registerSetting(switchBackDelay = new SliderSetting("Switch back delay", 40, 0, 300, 1)); + } + + @SubscribeEvent + public void onRender(TickEvent.RenderTickEvent event) { + if (!Utils.nullCheck() || mc.thePlayer.isDead) return; + if (System.currentTimeMillis() - lastHeal < healDelay.getInput()) return; + + if (mc.thePlayer.getHealth() <= minHealth.getInput()) { + if (lastSwitchTo == -1) { + int toSlot = ContainerUtils.getSlot(ItemSkull.class); + if (toSlot == -1) return; + + lastSlot = mc.thePlayer.inventory.currentItem; + mc.thePlayer.inventory.currentItem = toSlot; + lastSwitchTo = System.currentTimeMillis(); + } + } + + if (lastSwitchTo != -1) { + if (lastDoneUse == -1) { + if (System.currentTimeMillis() - lastSwitchTo < startDelay.getInput()) return; + KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), true); + lastDoneUse = System.currentTimeMillis(); + } else { + if (System.currentTimeMillis() - lastDoneUse < switchBackDelay.getInput()) return; + KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), false); + mc.thePlayer.inventory.currentItem = lastSlot; + + lastSwitchTo = -1; + lastDoneUse = -1; + lastSlot = -1; + lastHeal = System.currentTimeMillis(); + } + } + } +} diff --git a/src/main/java/keystrokesmod/module/impl/player/Blink.java b/src/main/java/keystrokesmod/module/impl/player/Blink.java index 56f346795..4d71f00ae 100644 --- a/src/main/java/keystrokesmod/module/impl/player/Blink.java +++ b/src/main/java/keystrokesmod/module/impl/player/Blink.java @@ -20,6 +20,7 @@ import net.minecraft.util.Vec3; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.jetbrains.annotations.NotNull; import org.lwjgl.opengl.GL11; import java.awt.*; @@ -27,10 +28,10 @@ import java.util.List; public class Blink extends Module { - private ButtonSetting initialPosition; - public List blinkedPackets = new ArrayList<>(); + private final ButtonSetting initialPosition; + public final List> blinkedPackets = new ArrayList<>(); private Vec3 pos; - private int color = new Color(0, 255, 0).getRGB(); + private static final int color = new Color(72, 125, 227).getRGB(); public Blink() { super("Blink", category.player); this.registerSetting(initialPosition = new ButtonSetting("Show initial position", true)); @@ -44,7 +45,7 @@ public void onEnable() { public void onDisable() { synchronized (blinkedPackets) { - for (Packet packet : blinkedPackets) { + for (Packet packet : blinkedPackets) { PacketUtils.sendPacketNoEvent(packet); } } @@ -58,7 +59,7 @@ public void onSendPacket(SendPacketEvent e) { this.disable(); return; } - Packet packet = e.getPacket(); + Packet packet = e.getPacket(); if (packet.getClass().getSimpleName().startsWith("S")) { return; } @@ -77,7 +78,7 @@ public void onRenderWorld(RenderWorldLastEvent e) { drawBox(pos); } - private void drawBox(Vec3 pos) { + private void drawBox(@NotNull Vec3 pos) { GlStateManager.pushMatrix(); double x = pos.xCoord - mc.getRenderManager().viewerPosX; double y = pos.yCoord - mc.getRenderManager().viewerPosY; diff --git a/src/main/java/keystrokesmod/module/impl/player/FakeLag.java b/src/main/java/keystrokesmod/module/impl/player/FakeLag.java index 959d49190..93f9a2dfa 100644 --- a/src/main/java/keystrokesmod/module/impl/player/FakeLag.java +++ b/src/main/java/keystrokesmod/module/impl/player/FakeLag.java @@ -2,32 +2,78 @@ import keystrokesmod.event.SendPacketEvent; import keystrokesmod.module.Module; +import keystrokesmod.module.setting.impl.ButtonSetting; import keystrokesmod.module.setting.impl.SliderSetting; +import keystrokesmod.script.classes.Vec3; import keystrokesmod.utility.PacketUtils; import keystrokesmod.utility.Utils; +import keystrokesmod.utility.render.RenderUtils; +import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.network.Packet; +import net.minecraft.network.handshake.client.C00Handshake; +import net.minecraft.network.login.client.C00PacketLoginStart; +import net.minecraft.network.login.client.C01PacketEncryptionResponse; +import net.minecraft.network.play.client.C00PacketKeepAlive; +import net.minecraft.network.play.client.C01PacketChatMessage; +import net.minecraft.network.play.client.C0FPacketConfirmTransaction; +import net.minecraft.network.status.client.C00PacketServerQuery; +import net.minecraft.network.status.client.C01PacketPing; +import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.awt.*; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class FakeLag extends Module { - private final SliderSetting packetDelay; + private static final int color = new Color(72, 125, 227).getRGB(); + private final SliderSetting mode; + private static final String[] MODES = new String[]{"Latency", "Dynamic"}; + private final SliderSetting delay; + private final ButtonSetting debug; + private Vec3 realPos; + private final ButtonSetting visual; + private final ButtonSetting dynamicStopOnHurt; + private final SliderSetting dynamicStopOnHurtTime; + private final SliderSetting dynamicStartRange; + private final SliderSetting dynamicStopRange; + private final SliderSetting dynamicMaxTargetRange; + private long lastDisableTime = -1; + private boolean shouldBlink = false; + private boolean lastHurt = false; + private long lastStartBlinkTime = -1; + @Nullable + private AbstractClientPlayer target = null; private final ConcurrentHashMap, Long> delayedPackets = new ConcurrentHashMap<>(); public FakeLag() { super("Fake Lag", category.player); - this.registerSetting(packetDelay = new SliderSetting("Packet delay", 200, 25, 1000, 5, "ms")); + this.registerSetting(mode = new SliderSetting("Mode", MODES, 0)); + this.registerSetting(delay = new SliderSetting("Delay", 200, 25, 1000, 5, "ms")); + this.registerSetting(debug = new ButtonSetting("Debug", false)); + visual = new ButtonSetting("Visual", false); + this.registerSetting(dynamicStopOnHurt = new ButtonSetting("Dynamic Stop on hurt", false)); + this.registerSetting(dynamicStopOnHurtTime = new SliderSetting("Dynamic Stop on hurt time", 500, 0, 1000, 5, "ms")); + this.registerSetting(dynamicStartRange = new SliderSetting("Dynamic Start range", 6.0, 3.0, 10.0, 0.1, "blocks")); + this.registerSetting(dynamicStopRange = new SliderSetting("Dynamic Stop range", 3.5, 1.0, 6.0, 0.1, "blocks")); + this.registerSetting(dynamicMaxTargetRange = new SliderSetting("Dynamic Max target range", 15.0, 6.0, 20.0, 0.5, "blocks")); } public String getInfo() { - return (int) packetDelay.getInput() + " ms"; + return MODES[(int) mode.getInput()]; } public void onEnable() { + realPos = new Vec3(mc.thePlayer); + lastDisableTime = -1; + shouldBlink = false; + lastHurt = false; + lastStartBlinkTime = -1; delayedPackets.clear(); } @@ -39,13 +85,82 @@ public void onDisable() { public void onRenderTick(TickEvent.RenderTickEvent ev) { if (!Utils.nullCheck()) { sendPacket(false); + lastDisableTime = System.currentTimeMillis(); + shouldBlink = false; + lastStartBlinkTime = -1; return; } - sendPacket(true); + + switch ((int) mode.getInput()) { + case 0: + sendPacket(true); + break; + case 1: + if (System.currentTimeMillis() - lastDisableTime <= dynamicStopOnHurtTime.getInput()) { + sendPacket(false); + break; + } + + if (shouldBlink) { + if (System.currentTimeMillis() - lastStartBlinkTime > delay.getInput()) { + if (debug.isToggled()) Utils.sendModuleMessage(this, "stop lag: time out."); + lastStartBlinkTime = System.currentTimeMillis(); + sendPacket(false); + shouldBlink = false; + } else if (!lastHurt && mc.thePlayer.hurtTime > 0 && dynamicStopOnHurt.isToggled()) { + if (debug.isToggled()) Utils.sendModuleMessage(this, "stop lag: hurt."); + shouldBlink = false; + lastDisableTime = System.currentTimeMillis(); + sendPacket(false); + } + } + + if (target != null) { + double distance = new Vec3(mc.thePlayer).distanceTo(target); + if (shouldBlink && distance < dynamicStopRange.getInput()) { + if (debug.isToggled()) Utils.sendModuleMessage(this, "stop lag: too low range."); + shouldBlink = false; + sendPacket(false); + } else if (!shouldBlink && distance > dynamicStopRange.getInput() + && new Vec3(mc.thePlayer).distanceTo(target) < dynamicStartRange.getInput()) { + if (debug.isToggled()) Utils.sendModuleMessage(this, "start lag: in range."); + lastStartBlinkTime = System.currentTimeMillis(); + shouldBlink = true; + } else if (shouldBlink && distance > dynamicStartRange.getInput()) { + if (debug.isToggled()) Utils.sendModuleMessage(this, "stop lag: out of range."); + shouldBlink = false; + sendPacket(false); + } else if (distance > dynamicMaxTargetRange.getInput()) { + if (debug.isToggled()) Utils.sendModuleMessage(this, String.format("release target: %s", target.getName())); + target = null; + shouldBlink = false; + sendPacket(false); + } + } else shouldBlink = false; + + lastHurt = mc.thePlayer.hurtTime > 0; + break; + } + + if (visual.isToggled()) { + RenderUtils.renderBox(realPos.x(), realPos.y(), realPos.z(), 1.1, 2.1, 1.1, color, false, true); + } + } + + @SubscribeEvent + public void onAttack(@NotNull AttackEntityEvent e) { + if (e.target instanceof AbstractClientPlayer) { + target = (AbstractClientPlayer) e.target; + } } @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onSendPacket(SendPacketEvent e) { + public void onSendPacket(@NotNull SendPacketEvent e) { + if ((int) mode.getInput() == 1 && !shouldBlink) return; + final Packet packet = e.getPacket(); + if (packet instanceof C00Handshake || packet instanceof C00PacketLoginStart || packet instanceof C00PacketServerQuery || packet instanceof C01PacketPing || packet instanceof C01PacketEncryptionResponse || packet instanceof C00PacketKeepAlive || packet instanceof C0FPacketConfirmTransaction || packet instanceof C01PacketChatMessage) { + return; + } long receiveTime = System.currentTimeMillis(); if (!Utils.nullCheck()) { sendPacket(false); @@ -54,7 +169,7 @@ public void onSendPacket(SendPacketEvent e) { if (e.isCanceled()) { return; } - delayedPackets.put(e.getPacket(), receiveTime); + delayedPackets.put(packet, receiveTime); e.setCanceled(true); } @@ -69,7 +184,8 @@ private void sendPacket(boolean delay) { } long receiveTime = entry.getValue(); long ms = System.currentTimeMillis(); - if (Utils.getDifference(ms, receiveTime) > packetDelay.getInput() || !delay) { + if (Utils.getDifference(ms, receiveTime) > this.delay.getInput() || !delay) { + PacketUtils.getPos(packet).ifPresent(p -> realPos = p); PacketUtils.sendPacketNoEvent(packet); packets.remove(); } diff --git a/src/main/java/keystrokesmod/module/impl/render/HUD.java b/src/main/java/keystrokesmod/module/impl/render/HUD.java index 6f1beeb0b..cf1e68233 100644 --- a/src/main/java/keystrokesmod/module/impl/render/HUD.java +++ b/src/main/java/keystrokesmod/module/impl/render/HUD.java @@ -21,7 +21,7 @@ import java.util.List; public class HUD extends Module { - public static final String VERSION = "1.1.1"; + public static final String VERSION = "1.2.0"; public static SliderSetting theme; public static ButtonSetting dropShadow; public static ButtonSetting alphabeticalSort; diff --git a/src/main/java/keystrokesmod/module/impl/world/Scaffold.java b/src/main/java/keystrokesmod/module/impl/world/Scaffold.java index 2f3520971..886fa3610 100644 --- a/src/main/java/keystrokesmod/module/impl/world/Scaffold.java +++ b/src/main/java/keystrokesmod/module/impl/world/Scaffold.java @@ -444,18 +444,7 @@ private void place(MovingObjectPosition block, boolean extra) { } private int getSlot() { - int slot = -1; - int highestStack = -1; - for (int i = 0; i < 9; ++i) { - final ItemStack itemStack = mc.thePlayer.inventory.mainInventory[i]; - if (itemStack != null && itemStack.getItem() instanceof ItemBlock && InvManager.canBePlaced((ItemBlock) itemStack.getItem()) && itemStack.stackSize > 0) { - if (mc.thePlayer.inventory.mainInventory[i].stackSize > highestStack) { - highestStack = mc.thePlayer.inventory.mainInventory[i].stackSize; - slot = i; - } - } - } - return slot; + return ContainerUtils.getSlot(ItemBlock.class, InvManager::canBePlaced); } public int totalBlocks() { diff --git a/src/main/java/keystrokesmod/module/impl/world/Tower.java b/src/main/java/keystrokesmod/module/impl/world/Tower.java index fa34968d1..155c37732 100644 --- a/src/main/java/keystrokesmod/module/impl/world/Tower.java +++ b/src/main/java/keystrokesmod/module/impl/world/Tower.java @@ -1,6 +1,7 @@ package keystrokesmod.module.impl.world; import keystrokesmod.event.PreMotionEvent; +import keystrokesmod.event.PreUpdateEvent; import keystrokesmod.module.Module; import keystrokesmod.module.ModuleManager; import keystrokesmod.module.setting.impl.ButtonSetting; @@ -10,6 +11,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.lwjgl.input.Keyboard; +import static keystrokesmod.module.ModuleManager.scaffold; + public class Tower extends Module { private final SliderSetting mode; private final SliderSetting speed; @@ -24,10 +27,11 @@ public class Tower extends Module { private final SliderSetting hypixelJumpMotion; private int slowTicks; private boolean wasTowering; + private int offGroundTicks = 0; public Tower() { super("Tower", category.world); this.registerSetting(new DescriptionSetting("Works with Safewalk & Scaffold")); - String[] modes = new String[]{"Vanilla", "Hypixel"}; + String[] modes = new String[]{"Vanilla", "Hypixel", "LowHop"}; this.registerSetting(mode = new SliderSetting("Mode", modes, 0)); this.registerSetting(speed = new SliderSetting("Speed", 0.95, 0.5, 1, 0.01)); this.registerSetting(diagonalSpeed = new SliderSetting("Diagonal speed", 5, 0, 10, 0.1)); @@ -92,10 +96,43 @@ public void onPreMotion(PreMotionEvent e) { } } + @SubscribeEvent + public void onPreUpdate(PreUpdateEvent event) { + if (mc.thePlayer.onGround) { + offGroundTicks = 0; + } else { + offGroundTicks++; + } + + if (canTower()) { + if (mode.getInput() == 2) { + switch (offGroundTicks) { + case 0: + mc.thePlayer.motionY = 0.4196; + break; + case 3: + case 4: + mc.thePlayer.motionY = 0; + break; + case 5: + mc.thePlayer.motionY = 0.4191; + break; + case 6: + mc.thePlayer.motionY = 0.3275; + break; + case 11: + mc.thePlayer.motionY = -0.5; + break; + } + } + } + } + private void reset() { } private boolean canTower() { + if (scaffold.totalBlocks() == 0) return false; if (!Utils.nullCheck() || !Utils.jumpDown()) { return false; } @@ -109,7 +146,7 @@ else if (disableWhileCollided.isToggled() && mc.thePlayer.isCollidedHorizontally } private boolean modulesEnabled() { - return ((ModuleManager.safeWalk.isEnabled() && ModuleManager.safeWalk.tower.isToggled() && SafeWalk.canSafeWalk()) || (ModuleManager.scaffold.isEnabled() && ModuleManager.scaffold.tower.isToggled())); + return ((ModuleManager.safeWalk.isEnabled() && ModuleManager.safeWalk.tower.isToggled() && SafeWalk.canSafeWalk()) || (scaffold.isEnabled() && scaffold.tower.isToggled())); } public boolean canSprint() { diff --git a/src/main/java/keystrokesmod/script/classes/Vec3.java b/src/main/java/keystrokesmod/script/classes/Vec3.java index 2608a7aa8..0955234dd 100644 --- a/src/main/java/keystrokesmod/script/classes/Vec3.java +++ b/src/main/java/keystrokesmod/script/classes/Vec3.java @@ -4,6 +4,7 @@ import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.MathHelper; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; public class Vec3 { @@ -82,4 +83,9 @@ public double relative(EnumFacing.@NotNull Axis axis) { } return 0; } + + @Contract("-> new") + public net.minecraft.util.Vec3 toVec3() { + return new net.minecraft.util.Vec3(x, y, z); + } } diff --git a/src/main/java/keystrokesmod/utility/ContainerUtils.java b/src/main/java/keystrokesmod/utility/ContainerUtils.java new file mode 100644 index 000000000..c0081a1ee --- /dev/null +++ b/src/main/java/keystrokesmod/utility/ContainerUtils.java @@ -0,0 +1,29 @@ +package keystrokesmod.utility; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.function.Predicate; + +import static keystrokesmod.Raven.mc; + +public class ContainerUtils { + public static int getSlot(Class item, Predicate predicate) { + int slot = -1; + int highestStack = -1; + for (int i = 0; i < 9; ++i) { + final ItemStack itemStack = mc.thePlayer.inventory.mainInventory[i]; + if (itemStack != null && item.isInstance(itemStack.getItem()) && predicate.test(item.cast(itemStack.getItem())) && itemStack.stackSize > 0) { + if (mc.thePlayer.inventory.mainInventory[i].stackSize > highestStack) { + highestStack = mc.thePlayer.inventory.mainInventory[i].stackSize; + slot = i; + } + } + } + return slot; + } + + public static int getSlot(Class item) { + return getSlot(item, t -> true); + } +} diff --git a/src/main/java/keystrokesmod/utility/PacketUtils.java b/src/main/java/keystrokesmod/utility/PacketUtils.java index 4ec2413ec..32f8e38a0 100644 --- a/src/main/java/keystrokesmod/utility/PacketUtils.java +++ b/src/main/java/keystrokesmod/utility/PacketUtils.java @@ -1,16 +1,22 @@ package keystrokesmod.utility; import keystrokesmod.Raven; +import keystrokesmod.script.classes.Vec3; +import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.network.Packet; +import net.minecraft.network.play.client.C03PacketPlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class PacketUtils { - public static List skipSendEvent = new ArrayList<>(); - public static List skipReceiveEvent = new ArrayList<>(); + public static List> skipSendEvent = new ArrayList<>(); + public static List> skipReceiveEvent = new ArrayList<>(); - public static void sendPacketNoEvent(Packet packet) { + public static void sendPacketNoEvent(Packet packet) { if (packet == null || packet.getClass().getSimpleName().startsWith("S")) { return; } @@ -18,7 +24,7 @@ public static void sendPacketNoEvent(Packet packet) { Raven.mc.thePlayer.sendQueue.addToSendQueue(packet); } - public static void receivePacketNoEvent(Packet packet) { + public static void receivePacketNoEvent(Packet packet) { try { skipReceiveEvent.add(packet); packet.processPacket(Raven.mc.getNetHandler()); @@ -27,4 +33,16 @@ public static void receivePacketNoEvent(Packet packet) { e.printStackTrace(); } } + + public static @NotNull Optional getPos(Packet packet) { + if (packet instanceof C03PacketPlayer.C06PacketPlayerPosLook) { + final C03PacketPlayer.C06PacketPlayerPosLook p = (C03PacketPlayer.C06PacketPlayerPosLook) packet; + return Optional.of(new Vec3(p.getPositionX(), p.getPositionY(), p.getPositionZ())); + } + if (packet instanceof C03PacketPlayer.C04PacketPlayerPosition) { + final C03PacketPlayer.C04PacketPlayerPosition p = (C03PacketPlayer.C04PacketPlayerPosition) packet; + return Optional.of(new Vec3(p.getPositionX(), p.getPositionY(), p.getPositionZ())); + } + return Optional.empty(); + } } diff --git a/src/main/java/keystrokesmod/utility/Utils.java b/src/main/java/keystrokesmod/utility/Utils.java index 82c42f89b..c06fb83e9 100644 --- a/src/main/java/keystrokesmod/utility/Utils.java +++ b/src/main/java/keystrokesmod/utility/Utils.java @@ -6,6 +6,7 @@ import keystrokesmod.module.ModuleManager; import keystrokesmod.module.impl.client.Settings; import keystrokesmod.module.impl.combat.AutoClicker; +import keystrokesmod.module.impl.combat.HitSelect; import keystrokesmod.module.impl.minigames.DuelsStats; import keystrokesmod.module.setting.impl.SliderSetting; import net.minecraft.block.Block; @@ -161,12 +162,12 @@ public static void sendDebugMessage(String message) { public static void attackEntity(Entity e, boolean clientSwing, boolean silentSwing) { if (clientSwing) { - mc.thePlayer.swingItem(); + if (HitSelect.canSwing()) mc.thePlayer.swingItem(); } else if (silentSwing || (!silentSwing && !clientSwing)) { - mc.thePlayer.sendQueue.addToSendQueue(new C0APacketAnimation()); + if (HitSelect.canSwing()) mc.thePlayer.sendQueue.addToSendQueue(new C0APacketAnimation()); } - mc.playerController.attackEntity(mc.thePlayer, e); + if (HitSelect.canAttack()) mc.playerController.attackEntity(mc.thePlayer, e); } public static void sendRawMessage(String txt) { @@ -592,7 +593,7 @@ public static long getDifference(long n, long n2) { } public static void sendModuleMessage(Module module, String s) { - sendRawMessage("&3" + module.getInfo() + "&7: &r" + s); + sendRawMessage("&3" + module.getName() + "&7: &r" + s); } public static EntityLivingBase raytrace(final int n) { diff --git a/src/main/java/keystrokesmod/utility/render/RenderUtils.java b/src/main/java/keystrokesmod/utility/render/RenderUtils.java index 968b8eca7..d3312777b 100644 --- a/src/main/java/keystrokesmod/utility/render/RenderUtils.java +++ b/src/main/java/keystrokesmod/utility/render/RenderUtils.java @@ -42,6 +42,10 @@ public static void scissor(double x, double y, double width, double height) { } public static void renderBox(int x, int y, int z, int color, boolean outline, boolean shade) { + renderBox(x, y, z, 1.0, 1.0, 1.0, color, outline, shade); + } + + public static void renderBox(double x, double y, double z, double xSize, double ySize, double zSize, int color, boolean outline, boolean shade) { double xPos = x - mc.getRenderManager().viewerPosX; double yPos = y - mc.getRenderManager().viewerPosY; double zPos = z - mc.getRenderManager().viewerPosZ; @@ -57,7 +61,7 @@ public static void renderBox(int x, int y, int z, int color, boolean outline, bo float n10 = (color >> 8 & 0xFF) / 255.0f; float n11 = (color & 0xFF) / 255.0f; GL11.glColor4f(n9, n10, n11, n8); - AxisAlignedBB axisAlignedBB = new AxisAlignedBB(xPos, yPos, zPos, xPos + 1.0, yPos + 1.0, zPos + 1.0); + AxisAlignedBB axisAlignedBB = new AxisAlignedBB(xPos, yPos, zPos, xPos + xSize, yPos + ySize, zPos + zSize); if (outline) { RenderGlobal.drawSelectionBoundingBox(axisAlignedBB); }