From af59b5e87d188ca49febc9ac2b496abec4a83fc8 Mon Sep 17 00:00:00 2001 From: mems01 <70612656+mems01@users.noreply.github.com> Date: Mon, 18 Dec 2023 01:20:34 +0200 Subject: [PATCH] Fixed Legacy mode of Backtrack not working above limits, KillAura and Aimbot not respecting Backtrack positions. (#1692) --- .../features/module/modules/combat/Aimbot.kt | 54 ++++++++---- .../module/modules/combat/Backtrack.kt | 84 ++++++++++++++++--- .../module/modules/combat/KillAura.kt | 48 +++++++---- .../mixins/render/MixinEntityRenderer.java | 16 ++-- .../liquidbounce/utils/RaycastUtils.kt | 11 +-- 5 files changed, 151 insertions(+), 62 deletions(-) diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Aimbot.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Aimbot.kt index bcf22c87527..d75ced4c233 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Aimbot.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Aimbot.kt @@ -22,6 +22,7 @@ import net.ccbluex.liquidbounce.utils.extensions.* import net.ccbluex.liquidbounce.utils.timing.MSTimer import net.ccbluex.liquidbounce.value.BoolValue import net.ccbluex.liquidbounce.value.FloatValue +import net.minecraft.entity.Entity import net.minecraft.util.Vec3 import java.util.* @@ -51,17 +52,46 @@ object Aimbot : Module("Aimbot", ModuleCategory.COMBAT) { if (onClick && (clickTimer.hasTimePassed(150) || (!mc.gameSettings.keyBindAttack.isKeyDown && AutoClicker.handleEvents()))) return // Search for the best enemy to target - val entity = mc.theWorld.loadedEntityList.filter { - isSelected(it, true) + val distanceCheck = Backtrack.getNearestTrackedDistance(it) + + return@filter isSelected(it, true) && thePlayer.canEntityBeSeen(it) - && thePlayer.getDistanceToEntityBox(it) <= range + && thePlayer.getDistanceToEntityBox(it) <= range || distanceCheck != 0.0 && distanceCheck <= range && getRotationDifference(it) <= fov - }.minByOrNull { getRotationDifference(it) } ?: return + }.minByOrNull { mc.thePlayer.getDistanceToEntityBox(it) } ?: return // Should it always keep trying to lock on the enemy or just try to assist you? if (!lock && isFaced(entity, range.toDouble())) return + val random = Random() + + var shouldReturn = false + + Backtrack.runWithNearestTrackedDistance(entity) { + shouldReturn = !findRotation(entity, random) + } + + if (shouldReturn) { + return + } + + // Jitter + // Some players do jitter on their mouses causing them to shake around. This is trying to simulate this behavior. + if (jitter) { + if (random.nextBoolean()) { + thePlayer.fixedSensitivityYaw += (random.nextGaussian() - 0.5f).toFloat() + } + + if (random.nextBoolean()) { + thePlayer.fixedSensitivityPitch += (random.nextGaussian() - 0.5f).toFloat() + } + } + } + + private fun findRotation(entity: Entity, random: Random): Boolean { + val thePlayer = mc.thePlayer ?: return false + val entityPrediction = Vec3(entity.posX - entity.prevPosX, entity.posY - entity.prevPosY, entity.posZ - entity.prevPosZ @@ -83,10 +113,9 @@ object Aimbot : Module("Aimbot", ModuleCategory.COMBAT) { predict = true, lookRange = range, attackRange = if (Reach.handleEvents()) Reach.combatReach else 3f - ) ?: return + ) ?: return false // Figure out the best turn speed suitable for the distance and configured turn speed - val rotationDiff = getRotationDifference(playerRotation, destinationRotation) // is enemy visible to player on screen. Fov is about to be right with that you can actually see on the screen. Still not 100% accurate, but it is fast check. @@ -96,7 +125,6 @@ object Aimbot : Module("Aimbot", ModuleCategory.COMBAT) { turnSpeed } - val random = Random() val gaussian = random.nextGaussian() val realisticTurnSpeed = rotationDiff * ((supposedTurnSpeed + (gaussian - 0.5)) / 180) @@ -104,16 +132,6 @@ object Aimbot : Module("Aimbot", ModuleCategory.COMBAT) { rotation.toPlayer(thePlayer) - // Jitter - // Some players do jitter on their mouses causing them to shake around. This is trying to simulate this behavior. - if (jitter) { - if (random.nextBoolean()) { - thePlayer.fixedSensitivityYaw += (random.nextGaussian() - 0.5f).toFloat() - } - - if (random.nextBoolean()) { - thePlayer.fixedSensitivityPitch += (random.nextGaussian() - 0.5f).toFloat() - } - } + return true } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Backtrack.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Backtrack.kt index 2b674684fc0..454ce21dbb5 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Backtrack.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Backtrack.kt @@ -12,9 +12,12 @@ import net.ccbluex.liquidbounce.features.module.modules.misc.AntiBot.isBot import net.ccbluex.liquidbounce.features.module.modules.misc.Teams import net.ccbluex.liquidbounce.features.module.modules.player.Blink import net.ccbluex.liquidbounce.injection.implementations.IMixinEntity -import net.ccbluex.liquidbounce.utils.* +import net.ccbluex.liquidbounce.utils.PacketUtils import net.ccbluex.liquidbounce.utils.extensions.* import net.ccbluex.liquidbounce.utils.misc.StringUtils.contains +import net.ccbluex.liquidbounce.utils.realX +import net.ccbluex.liquidbounce.utils.realY +import net.ccbluex.liquidbounce.utils.realZ import net.ccbluex.liquidbounce.utils.render.ColorUtils.rainbow import net.ccbluex.liquidbounce.utils.render.RenderUtils.drawBacktrackBox import net.ccbluex.liquidbounce.utils.render.RenderUtils.glColor @@ -49,13 +52,16 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { val mode by object : ListValue("Mode", arrayOf("Legacy", "Modern"), "Modern") { override fun onChanged(oldValue: String, newValue: String) { - clearPackets(); - backtrackedPlayer.clear(); + clearPackets() + backtrackedPlayer.clear() } } // Legacy - private val legacyPos by ListValue("Caching mode", arrayOf("ClientPos", "ServerPos"), "ClientPos") { mode == "Legacy" } + private val legacyPos by ListValue("Caching mode", + arrayOf("ClientPos", "ServerPos"), + "ClientPos" + ) { mode == "Legacy" } // Modern private val style by ListValue("Style", arrayOf("Pulse", "Smooth"), "Smooth") { mode == "Modern" } @@ -73,10 +79,10 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { // ESP private val esp by BoolValue("ESP", true, subjective = true) { mode == "Modern" } - private val rainbow by BoolValue("Rainbow", true, subjective = true) { mode == "Modern" && esp } - private val red by IntegerValue("R", 0, 0..255, subjective = true) { !rainbow && mode == "Modern" && esp } - private val green by IntegerValue("G", 255, 0..255, subjective = true) { !rainbow && mode == "Modern" && esp } - private val blue by IntegerValue("B", 0, 0..255, subjective = true) { !rainbow && mode == "Modern" && esp } + private val rainbow by BoolValue("Rainbow", true, subjective = true) { mode == "Modern" && esp } + private val red by IntegerValue("R", 0, 0..255, subjective = true) { !rainbow && mode == "Modern" && esp } + private val green by IntegerValue("G", 255, 0..255, subjective = true) { !rainbow && mode == "Modern" && esp } + private val blue by IntegerValue("B", 0, 0..255, subjective = true) { !rainbow && mode == "Modern" && esp } private val packetQueue = LinkedHashMap, Long>() private val positions = mutableListOf>() @@ -120,6 +126,7 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { System.currentTimeMillis() ) } + is S14PacketEntity -> { if (legacyPos == "ServerPos") { val entity = mc.theWorld?.getEntityByID(packet.entityId) @@ -288,6 +295,7 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { target = event.targetEntity } + @EventTarget fun onRender3D(event: Render3DEvent) { when (mode.lowercase()) { @@ -329,7 +337,7 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { } "modern" -> { - if (!shouldBacktrack() || packetQueue.isEmpty() || !shouldDraw || !esp ) + if (!shouldBacktrack() || packetQueue.isEmpty() || !shouldDraw || !esp) return val renderManager = mc.renderManager @@ -384,11 +392,12 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { clearPackets(false) } - override fun onEnable() = reset() + override fun onEnable() = + reset() override fun onDisable() { - clearPackets(); - backtrackedPlayer.clear(); + clearPackets() + backtrackedPlayer.clear() } private fun handlePackets() { @@ -544,6 +553,57 @@ object Backtrack : Module("Backtrack", ModuleCategory.COMBAT) { entity.setPosition(entityPosition.xCoord, entityPosition.yCoord, entityPosition.zCoord) } + fun runWithNearestTrackedDistance(entity: Entity, f: () -> Unit) { + if (entity !is EntityPlayer) + return + + if (!handleEvents()|| mode == "Modern") { + f() + + return + } + + var backtrackDataArray = getBacktrackData(entity.uniqueID)?.toMutableList() ?: return + + // Filter out negatives, sort by distance + backtrackDataArray = backtrackDataArray.sortedBy { (x, y, z, _) -> + runWithSimulatedPastPosition(entity, Vec3(x, y, z)) { + mc.thePlayer.getDistanceToBox(entity.hitBox) + } + }.toMutableList() + + val (x, y, z, _) = backtrackDataArray.first() + + runWithSimulatedPastPosition(entity, Vec3(x, y, z)) { + f() + + null + } + } + + private fun runWithSimulatedPastPosition(entity: Entity, vec3: Vec3, f: () -> Double?): Double? { + val entityPosition = entity.positionVector + val (prevX, prevY, prevZ) = Triple(entity.prevPosX, entity.prevPosY, entity.prevPosZ) + + val (x, y, z) = Triple(vec3.xCoord, vec3.yCoord, vec3.zCoord) + + entity.setPosition(x, y, z) + entity.prevPosX = x + entity.prevPosY = y + entity.prevPosZ = z + + val result = f() + + // Reset position + entity.prevPosX = prevX + entity.prevPosY = prevY + entity.prevPosZ = prevZ + + entity.setPosition(entityPosition.xCoord, entityPosition.yCoord, entityPosition.zCoord) + + return result + } + val color get() = if (rainbow) rainbow() else Color(red, green, blue) diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/KillAura.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/KillAura.kt index d3a93ca1318..2443757a824 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/KillAura.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/KillAura.kt @@ -226,7 +226,6 @@ object KillAura : Module("KillAura", ModuleCategory.COMBAT, Keyboard.KEY_R) { override fun onChange(oldValue: Int, newValue: Int) = newValue.coerceAtLeast(minimum) } - private val angleThresholdUntilReset by FloatValue("AngleThresholdUntilReset", 5f, 0.1f..180f) private val micronizedValue = BoolValue("Micronized", true) { !maxTurnSpeedValue.isMinimal() } @@ -553,6 +552,7 @@ object KillAura : Module("KillAura", ModuleCategory.COMBAT, Keyboard.KEY_R) { if (entity !is EntityLivingBase || !isEnemy(entity) || (switchMode && entity.entityId in prevTargetEntities)) continue var distance = thePlayer.getDistanceToEntityBox(entity) + if (Backtrack.handleEvents()) { val trackedDistance = Backtrack.getNearestTrackedDistance(entity) @@ -560,6 +560,7 @@ object KillAura : Module("KillAura", ModuleCategory.COMBAT, Keyboard.KEY_R) { distance = trackedDistance } } + val entityFov = getRotationDifference(entity) if (distance <= maxRange && (fov == 180F || entityFov <= fov)) { @@ -569,9 +570,29 @@ object KillAura : Module("KillAura", ModuleCategory.COMBAT, Keyboard.KEY_R) { // Sort targets by priority when (priority.lowercase()) { - "distance" -> targets.sortBy { thePlayer.getDistanceToEntityBox(it) } // Sort by distance + "distance" -> { + targets.sortBy { + var result = 0.0 + + Backtrack.runWithNearestTrackedDistance(it) { + result = thePlayer.getDistanceToEntityBox(it) // Sort by distance + } + + result + } + } + + "direction" -> targets.sortBy { + var result = 0f + + Backtrack.runWithNearestTrackedDistance(it) { + result = getRotationDifference(it) // Sort by FOV + } + + result + } + "health" -> targets.sortBy { it.health } // Sort by health - "direction" -> targets.sortBy { getRotationDifference(it) } // Sort by FOV "livingtime" -> targets.sortBy { -it.ticksExisted } // Sort by existence "armor" -> targets.sortBy { it.totalArmorValue } // Sort by armor "hurtresistance" -> targets.sortBy { it.hurtResistantTime } // Sort by armor hurt time @@ -582,27 +603,20 @@ object KillAura : Module("KillAura", ModuleCategory.COMBAT, Keyboard.KEY_R) { Potion.regeneration ).amplifier else -1 } - } // Find best target for (entity in targets) { // Update rotations to current target - if (!updateRotations(entity)) { - var success = false - Backtrack.loopThroughBacktrackData(entity) { - if (updateRotations(entity)) { - success = true - return@loopThroughBacktrackData true - } + var success = false - return@loopThroughBacktrackData false - } + Backtrack.runWithNearestTrackedDistance(entity) { + success = updateRotations(entity) + } - if (!success) { - // when failed then try another target - continue - } + if (!success) { + // when failed then try another target + continue } // Set target to current entity diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinEntityRenderer.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinEntityRenderer.java index ec2320c28a3..e236cef07eb 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinEntityRenderer.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinEntityRenderer.java @@ -25,6 +25,9 @@ import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.util.*; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.spongepowered.asm.mixin.Mixin; @@ -88,7 +91,7 @@ private void cameraClip(float partialTicks, CallbackInfo callbackInfo) { if (!mc.gameSettings.debugCamEnable) { BlockPos blockPos = new BlockPos(entity); IBlockState blockState = mc.theWorld.getBlockState(blockPos); - net.minecraftforge.client.ForgeHooksClient.orientBedCamera(mc.theWorld, blockPos, blockState, entity); + ForgeHooksClient.orientBedCamera(mc.theWorld, blockPos, blockState, entity); rotate(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * partialTicks + 180f, 0f, -1f, 0f); rotate(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * partialTicks, -1f, 0f, 0f); @@ -124,8 +127,8 @@ private void cameraClip(float partialTicks, CallbackInfo callbackInfo) { } Block block = ActiveRenderInfo.getBlockAtEntityViewpoint(mc.theWorld, entity, partialTicks); - net.minecraftforge.client.event.EntityViewRenderEvent.CameraSetup event = new net.minecraftforge.client.event.EntityViewRenderEvent.CameraSetup((EntityRenderer) (Object) this, entity, block, partialTicks, yaw, pitch, roll); - net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event); + EntityViewRenderEvent.CameraSetup event = new EntityViewRenderEvent.CameraSetup((EntityRenderer) (Object) this, entity, block, partialTicks, yaw, pitch, roll); + MinecraftForge.EVENT_BUS.post(event); rotate(event.roll, 0f, 0f, 1f); rotate(event.pitch, 1f, 0f, 0f); rotate(event.yaw, 0f, 1f, 0f); @@ -175,7 +178,7 @@ private void getMouseOver(float p_getMouseOver_1_, CallbackInfo ci) { double d1 = d0; boolean flag = false; if (mc.playerController.extendedReach()) { - d0 = 6; + // d0 = 6; d1 = 6; } else if (d0 > 3) { flag = true; @@ -195,8 +198,7 @@ private void getMouseOver(float p_getMouseOver_1_, CallbackInfo ci) { pointedEntity = null; Vec3 vec33 = null; - float f = 1f; - List list = mc.theWorld.getEntitiesInAABBexcluding(entity, entity.getEntityBoundingBox().addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f, f, f), Predicates.and(EntitySelectors.NOT_SPECTATING, p_apply_1_ -> p_apply_1_ != null && p_apply_1_.canBeCollidedWith())); + List list = mc.theWorld.getEntities(EntityLivingBase.class, Predicates.and(EntitySelectors.NOT_SPECTATING, p_apply_1_ -> p_apply_1_ != null && p_apply_1_.canBeCollidedWith() && p_apply_1_ != entity)); double d2 = d1; for (Entity entity1 : list) { @@ -208,7 +210,7 @@ private void getMouseOver(float p_getMouseOver_1_, CallbackInfo ci) { Backtrack.INSTANCE.loopThroughBacktrackData(entity1, () -> { boxes.add(entity1.getEntityBoundingBox().expand(f1, f1, f1)); return false; - }); + }); for (final AxisAlignedBB axisalignedbb : boxes) { MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32); diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt index 36b580bff1b..37d7fae69a5 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt @@ -13,6 +13,7 @@ import net.ccbluex.liquidbounce.utils.extensions.hitBox import net.ccbluex.liquidbounce.utils.extensions.plus import net.ccbluex.liquidbounce.utils.extensions.times import net.minecraft.entity.Entity +import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer @@ -34,14 +35,8 @@ object RaycastUtils : MinecraftInstance() { val entityLook = getVectorForRotation(yaw, pitch) val vec = eyePosition + (entityLook * blockReachDistance) - val entityList = mc.theWorld.getEntitiesInAABBexcluding( - renderViewEntity, renderViewEntity.entityBoundingBox.addCoord( - entityLook.xCoord * blockReachDistance, - entityLook.yCoord * blockReachDistance, - entityLook.zCoord * blockReachDistance - ).expand(1.0, 1.0, 1.0) - ) { - it != null && (it !is EntityPlayer || !it.isSpectator) && it.canBeCollidedWith() + val entityList = mc.theWorld.getEntities(EntityLivingBase::class.java) { + it != null && (it !is EntityPlayer || !it.isSpectator) && it.canBeCollidedWith() && it != renderViewEntity } var pointedEntity: Entity? = null