From 46e3a7c6b515eca8120c5469438d4b6952476c9f Mon Sep 17 00:00:00 2001 From: Eclipses <99494277+EclipsesDev@users.noreply.github.com> Date: Wed, 22 May 2024 14:31:43 +0700 Subject: [PATCH] feat(legacy): Added Backtrack Player Render (#3077) - Added Backtrack "Player" Render option. (Closes: #1463) - Fixed Sprint not resetting correctly after toggled off. (#2580) - Fixed FlagCheck GhostBlock less false flags. - Simplified KillAura isEnemy function. --- .../module/modules/combat/Backtrack.kt | 108 +++++++++++++----- .../module/modules/combat/KillAura.kt | 24 +--- .../features/module/modules/misc/FlagCheck.kt | 2 +- .../module/modules/movement/Sprint.kt | 4 + .../ccbluex/liquidbounce/utils/BlinkUtils.kt | 1 + .../ccbluex/liquidbounce/utils/EntityUtils.kt | 2 + 6 files changed, 92 insertions(+), 49 deletions(-) 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 2ddcb1f690a..07a819bf207 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 @@ -26,6 +26,7 @@ import net.ccbluex.liquidbounce.value.BoolValue import net.ccbluex.liquidbounce.value.FloatValue import net.ccbluex.liquidbounce.value.IntegerValue import net.ccbluex.liquidbounce.value.ListValue +import net.minecraft.client.entity.EntityOtherPlayerMP import net.minecraft.entity.Entity import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer @@ -81,11 +82,11 @@ object Backtrack : Module("Backtrack", Category.COMBAT, hideModule = false) { private val smart by BoolValue("Smart", true) { mode == "Modern" } // 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 espMode by ListValue("ESP-Mode", arrayOf("None", "Box", "Player"), "Box", subjective = true) { mode == "Modern" } + private val rainbow by BoolValue("Rainbow", true, subjective = true) { mode == "Modern" && espMode == "Box" } + private val red by IntegerValue("R", 0, 0..255, subjective = true) { !rainbow && mode == "Modern" && espMode == "Box" } + private val green by IntegerValue("G", 255, 0..255, subjective = true) { !rainbow && mode == "Modern" && espMode == "Box" } + private val blue by IntegerValue("B", 0, 0..255, subjective = true) { !rainbow && mode == "Modern" && espMode == "Box" } private val packetQueue = LinkedHashMap, Long>() private val positions = mutableListOf>() @@ -105,6 +106,8 @@ object Backtrack : Module("Backtrack", Category.COMBAT, hideModule = false) { private val nonDelayedSoundSubstrings = arrayOf("game.player.hurt", "game.player.die") + private var backtrackFakePlayer: EntityOtherPlayerMP? = null + @EventTarget fun onPacket(event: PacketEvent) { val packet = event.packet @@ -282,6 +285,11 @@ object Backtrack : Module("Backtrack", Category.COMBAT, hideModule = false) { } else { clearPackets() globalTimer.reset() + + backtrackFakePlayer?.let { + mc.theWorld?.removeEntityFromWorld(it.entityId) + backtrackFakePlayer = null + } } } @@ -343,8 +351,13 @@ object Backtrack : Module("Backtrack", Category.COMBAT, hideModule = false) { } "modern" -> { - if (!shouldBacktrack() || packetQueue.isEmpty() || !shouldDraw || !esp) + if (!shouldBacktrack() || packetQueue.isEmpty() || !shouldDraw) { + backtrackFakePlayer?.apply { + mc.theWorld.removeEntityFromWorld(entityId) + backtrackFakePlayer = null + } return + } val renderManager = mc.renderManager @@ -352,26 +365,64 @@ object Backtrack : Module("Backtrack", Category.COMBAT, hideModule = false) { val targetEntity = target as IMixinEntity if (targetEntity.truePos) { - - val x = - targetEntity.trueX - renderManager.renderPosX - val y = - targetEntity.trueY - renderManager.renderPosY - val z = - targetEntity.trueZ - renderManager.renderPosZ - - val axisAlignedBB = entityBoundingBox.offset(-posX, -posY, -posZ).offset(x, y, z) - - drawBacktrackBox( - AxisAlignedBB.fromBounds( - axisAlignedBB.minX, - axisAlignedBB.minY, - axisAlignedBB.minZ, - axisAlignedBB.maxX, - axisAlignedBB.maxY, - axisAlignedBB.maxZ - ), color - ) + when (espMode) { + "Box" -> { + val x = targetEntity.trueX - renderManager.renderPosX + val y = targetEntity.trueY - renderManager.renderPosY + val z = targetEntity.trueZ - renderManager.renderPosZ + + val axisAlignedBB = entityBoundingBox.offset(-posX, -posY, -posZ).offset(x, y, z) + + drawBacktrackBox( + AxisAlignedBB.fromBounds( + axisAlignedBB.minX, + axisAlignedBB.minY, + axisAlignedBB.minZ, + axisAlignedBB.maxX, + axisAlignedBB.maxY, + axisAlignedBB.maxZ + ), color + ) + } + "Player" -> { + val targetRender = target as EntityPlayer + val faker = EntityOtherPlayerMP(mc.theWorld, targetRender.gameProfile) + + if (backtrackFakePlayer == null) { + faker.rotationYawHead = targetRender.rotationYawHead + faker.renderYawOffset = targetRender.renderYawOffset + faker.copyLocationAndAnglesFrom(targetRender) + faker.rotationYawHead = targetRender.rotationYawHead + + faker.inventory.copyInventory(targetRender.inventory) + + faker.swingProgressInt = targetRender.swingProgressInt + faker.limbSwing = targetRender.limbSwing + faker.limbSwingAmount = targetRender.limbSwingAmount + + faker.setPositionAndUpdate( + targetEntity.trueX, + targetEntity.trueY, + targetEntity.trueZ + ) + + // Mark the faker as a fake player (To prevent KillAura attacking it) + faker.customNameTag = "FAKE_PLAYER" + faker.alwaysRenderNameTag = false + + mc.theWorld.addEntityToWorld(-1337, faker) + backtrackFakePlayer = faker + } else { + backtrackFakePlayer?.apply { + mc.theWorld.removeEntityFromWorld(entityId) + backtrackFakePlayer = null + } + } + } + else -> { + return@run + } + } } } } @@ -404,6 +455,11 @@ object Backtrack : Module("Backtrack", Category.COMBAT, hideModule = false) { override fun onDisable() { clearPackets() backtrackedPlayer.clear() + + backtrackFakePlayer?.let { + mc.theWorld?.removeEntityFromWorld(it.entityId) + backtrackFakePlayer = null + } } private fun handlePackets() { 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 d76316d131e..3b9413b91d3 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 @@ -9,8 +9,6 @@ import net.ccbluex.liquidbounce.event.* import net.ccbluex.liquidbounce.event.EventManager.callEvent import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.Module -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.render.FreeCam import net.ccbluex.liquidbounce.features.module.modules.world.Fucker import net.ccbluex.liquidbounce.features.module.modules.world.Nuker @@ -20,11 +18,7 @@ import net.ccbluex.liquidbounce.utils.ClientUtils.runTimeTicks import net.ccbluex.liquidbounce.utils.CooldownHelper.getAttackCooldownProgress import net.ccbluex.liquidbounce.utils.CooldownHelper.resetLastAttackedTicks import net.ccbluex.liquidbounce.utils.EntityUtils.isLookingOnEntities -import net.ccbluex.liquidbounce.utils.EntityUtils.targetAnimals -import net.ccbluex.liquidbounce.utils.EntityUtils.targetDead -import net.ccbluex.liquidbounce.utils.EntityUtils.targetInvisible -import net.ccbluex.liquidbounce.utils.EntityUtils.targetMobs -import net.ccbluex.liquidbounce.utils.EntityUtils.targetPlayer +import net.ccbluex.liquidbounce.utils.EntityUtils.isSelected import net.ccbluex.liquidbounce.utils.MovementUtils.isMoving import net.ccbluex.liquidbounce.utils.PacketUtils.sendPacket import net.ccbluex.liquidbounce.utils.PacketUtils.sendPackets @@ -698,21 +692,7 @@ object KillAura : Module("KillAura", Category.COMBAT, Keyboard.KEY_R, hideModule * Check if [entity] is selected as enemy with current target options and other modules */ private fun isEnemy(entity: Entity?): Boolean { - if (entity is EntityLivingBase && (targetDead || isAlive(entity)) && entity != mc.thePlayer) { - if (!targetInvisible && entity.isInvisible) return false - - if (targetPlayer && entity is EntityPlayer) { - if (entity.isSpectator || isBot(entity)) return false - - if (entity.isClientFriend() && !NoFriends.handleEvents()) return false - - return !Teams.handleEvents() || !Teams.isInYourTeam(entity) - } - - return targetMobs && entity.isMob() || targetAnimals && entity.isAnimal() - } - - return false + return isSelected(entity, true) } /** diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/misc/FlagCheck.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/misc/FlagCheck.kt index 362b89fdc4e..d1e8ac52d50 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/misc/FlagCheck.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/misc/FlagCheck.kt @@ -134,7 +134,7 @@ object FlagCheck : Module("FlagCheck", Category.MISC, gameDetecting = true, hide if (currentTime - timestamp > 500) { val block = world.getBlockState(blockPos).block - if (block == Blocks.air && player.isSwingInProgress + if (block == Blocks.air && player.swingProgressInt > 3 && successfulPlacements != blockPos && !player.isBlocking && !KillAura.renderBlocking && !KillAura.blockStatus) { diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/Sprint.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/Sprint.kt index 30efb70059c..9c6192cb97b 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/Sprint.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/Sprint.kt @@ -92,6 +92,10 @@ object Sprint : Module("Sprint", Category.MOVEMENT, gameDetecting = false, hideM val isLegitModeActive = mode == "Legit" + if (!handleEvents()) { + return true + } + val modifiedForward = if (currentRotation != null && rotationData?.strict == true) { player.movementInput.moveForward } else { diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/BlinkUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/BlinkUtils.kt index ed56eeb91e1..c702b767d7d 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/BlinkUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/BlinkUtils.kt @@ -153,6 +153,7 @@ object BlinkUtils { faker.copyLocationAndAnglesFrom(thePlayer) faker.rotationYawHead = thePlayer.rotationYawHead faker.inventory = thePlayer.inventory + faker.customNameTag = "FAKE_PLAYER" mc.theWorld.addEntityToWorld(-1337, faker) fakePlayer = faker diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/EntityUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/EntityUtils.kt index 84d6746b181..f6814725135 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/EntityUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/EntityUtils.kt @@ -47,6 +47,8 @@ object EntityUtils : MinecraftInstance() { if (entity.isSpectator) return false + if (entity.customNameTag == "FAKE_PLAYER") return false + return !Teams.handleEvents() || !Teams.isInYourTeam(entity) } return true