From ba0010ef318acce4d51c6fb90c5bf2b35005a0d6 Mon Sep 17 00:00:00 2001 From: Zirada <185837150+zirada@users.noreply.github.com> Date: Fri, 7 Feb 2025 21:27:12 +0100 Subject: [PATCH] Global target tracking via CombatManager; Remove TargetTracker --- .../module/modules/client/ModuleTargets.kt | 4 + .../module/modules/combat/ModuleAimbot.kt | 49 ++----- .../module/modules/combat/ModuleAutoShoot.kt | 52 +------ .../module/modules/combat/ModuleFakeLag.kt | 19 +-- .../module/modules/combat/ModuleTimerRange.kt | 3 +- .../modules/combat/aimbot/ModuleAutoBow.kt | 8 +- .../aimbot/autobow/AutoBowAimbotFeature.kt | 28 +--- .../aimbot/autobow/AutoBowAutoShootFeature.kt | 3 +- .../crystalaura/CrystalAuraDamageOptions.kt | 4 +- .../combat/crystalaura/ModuleCrystalAura.kt | 20 +-- .../place/CrystalAuraPlaceTargetFactory.kt | 4 +- .../trigger/triggers/EntityMoveTrigger.kt | 2 +- .../modules/combat/killaura/ModuleKillAura.kt | 132 +++++++----------- .../killaura/features/KillAuraAutoBlock.kt | 14 +- .../killaura/features/KillAuraFightBot.kt | 6 +- .../modules/combat/tpaura/ModuleTpAura.kt | 4 +- .../modules/combat/tpaura/modes/AStarMode.kt | 8 +- .../combat/tpaura/modes/ImmediateMode.kt | 12 +- .../module/modules/misc/ModuleAutoPearl.kt | 2 +- .../modules/movement/ModuleTargetStrafe.kt | 2 +- .../modules/world/traps/ModuleAutoTrap.kt | 9 +- .../world/traps/traps/IgnitionTrapPlanner.kt | 21 ++- .../world/traps/traps/WebTrapPlanner.kt | 23 ++- .../utils/combat/CombatManager.kt | 123 ++++++++++++---- .../utils/combat/TargetTracker.kt | 48 +------ 25 files changed, 235 insertions(+), 365 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/client/ModuleTargets.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/client/ModuleTargets.kt index a73688f97d5..a4c16135770 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/client/ModuleTargets.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/client/ModuleTargets.kt @@ -25,9 +25,13 @@ import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.utils.combat.combatTargetsConfigurable import net.ccbluex.liquidbounce.utils.combat.visualTargetsConfigurable +import net.ccbluex.liquidbounce.utils.render.WorldTargetRenderer object ModuleTargets : ClientModule("Targets", Category.CLIENT, notActivatable = true, hide = true, aliases = arrayOf("Enemies")) { + + val targetRenderer = tree(WorldTargetRenderer(this)) + init { tree(combatTargetsConfigurable) tree(visualTargetsConfigurable) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAimbot.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAimbot.kt index 247ffe4bc54..0a0485d1202 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAimbot.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAimbot.kt @@ -19,23 +19,18 @@ package net.ccbluex.liquidbounce.features.module.modules.combat import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable -import net.ccbluex.liquidbounce.event.events.MouseRotationEvent -import net.ccbluex.liquidbounce.event.events.RotationUpdateEvent -import net.ccbluex.liquidbounce.event.events.WorldRenderEvent +import net.ccbluex.liquidbounce.event.events.* import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule -import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld import net.ccbluex.liquidbounce.utils.aiming.* import net.ccbluex.liquidbounce.utils.aiming.anglesmooth.LinearAngleSmoothMode import net.ccbluex.liquidbounce.utils.aiming.anglesmooth.SigmoidAngleSmoothMode import net.ccbluex.liquidbounce.utils.client.Chronometer import net.ccbluex.liquidbounce.utils.client.Timer -import net.ccbluex.liquidbounce.utils.combat.PriorityEnum -import net.ccbluex.liquidbounce.utils.combat.TargetTracker +import net.ccbluex.liquidbounce.utils.combat.* import net.ccbluex.liquidbounce.utils.entity.rotation import net.ccbluex.liquidbounce.utils.inventory.InventoryManager -import net.ccbluex.liquidbounce.utils.render.WorldTargetRenderer import net.minecraft.client.gui.screen.ingame.HandledScreen import net.minecraft.entity.Entity import net.minecraft.util.math.MathHelper @@ -55,11 +50,10 @@ object ModuleAimbot : ClientModule("Aimbot", Category.COMBAT, aliases = arrayOf( tree(OnClick) } - private val targetTracker = tree(TargetTracker( + private val targetSelector = tree(TargetSelector( PriorityEnum.DIRECTION, float("Range", 4.2f, 1f..8f) )) - private val targetRenderer = tree(WorldTargetRenderer(this)) private val pointTracker = tree(PointTracker()) private val clickTimer = Chronometer() @@ -79,7 +73,6 @@ object ModuleAimbot : ClientModule("Aimbot", Category.COMBAT, aliases = arrayOf( private var playerRotation: Rotation? = null private val tickHandler = handler { _ -> - targetTracker.validate() playerRotation = player.rotation if (mc.options.attackKey.isPressed) { @@ -103,22 +96,12 @@ object ModuleAimbot : ClientModule("Aimbot", Category.COMBAT, aliases = arrayOf( } // Update Auto Weapon - ModuleAutoWeapon.prepare(targetTracker.target) - } - - override fun disable() { - targetTracker.reset() - super.disable() + ModuleAutoWeapon.prepare(CombatManager.target) } val renderHandler = handler { event -> - val matrixStack = event.matrixStack val partialTicks = event.partialTicks - val target = targetTracker.target ?: return@handler - - renderEnvironmentForWorld(matrixStack) { - targetRenderer.render(this, target, partialTicks) - } + CombatManager.target ?: return@handler if (!ignoreOpenScreen && mc.currentScreen != null) { return@handler @@ -158,33 +141,27 @@ object ModuleAimbot : ClientModule("Aimbot", Category.COMBAT, aliases = arrayOf( } } - private fun findNextTargetRotation(): Pair? { - for (target in targetTracker.enemies()) { - val pointOnHitbox = pointTracker.gatherPoint(target, - PointTracker.AimSituation.FOR_NOW) - + private fun findNextTargetRotation(): Pair? = + CombatManager.updateTarget(targetSelector) { target -> + val pointOnHitbox = pointTracker.gatherPoint(target, PointTracker.AimSituation.FOR_NOW) val rotationPreference = LeastDifferencePreference(player.rotation, pointOnHitbox.toPoint) val spot = raytraceBox( pointOnHitbox.fromPoint, pointOnHitbox.cutOffBox, - range = targetTracker.maxRange.toDouble(), + range = targetSelector.maxRange.toDouble(), wallsRange = 0.0, rotationPreference = rotationPreference ) ?: raytraceBox( - pointOnHitbox.fromPoint, pointOnHitbox.box, range = targetTracker.maxRange.toDouble(), + pointOnHitbox.fromPoint, pointOnHitbox.box, range = targetSelector.maxRange.toDouble(), wallsRange = 0.0, rotationPreference = rotationPreference - ) ?: continue + ) ?: return@updateTarget null - if (targetTracker.target != target) { + if (target != CombatManager.target) { slowStart.onTrigger() } - targetTracker.select(target, false) - return target to spot + target to spot } - return null - } - } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAutoShoot.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAutoShoot.kt index 0cd41a5ce12..d0413737b63 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAutoShoot.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleAutoShoot.kt @@ -23,30 +23,21 @@ package net.ccbluex.liquidbounce.features.module.modules.combat import net.ccbluex.liquidbounce.config.types.NamedChoice import net.ccbluex.liquidbounce.event.events.RotationUpdateEvent -import net.ccbluex.liquidbounce.event.events.WorldRenderEvent import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.event.tickHandler import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura -import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld -import net.ccbluex.liquidbounce.utils.aiming.PointTracker -import net.ccbluex.liquidbounce.utils.aiming.Rotation -import net.ccbluex.liquidbounce.utils.aiming.RotationManager -import net.ccbluex.liquidbounce.utils.aiming.RotationsConfigurable +import net.ccbluex.liquidbounce.utils.aiming.* import net.ccbluex.liquidbounce.utils.aiming.projectiles.SituationalProjectileAngleCalculator import net.ccbluex.liquidbounce.utils.clicking.ClickScheduler import net.ccbluex.liquidbounce.utils.client.SilentHotbar import net.ccbluex.liquidbounce.utils.client.interactItem -import net.ccbluex.liquidbounce.utils.combat.CombatManager -import net.ccbluex.liquidbounce.utils.combat.PriorityEnum -import net.ccbluex.liquidbounce.utils.combat.TargetTracker -import net.ccbluex.liquidbounce.utils.entity.boxedDistanceTo +import net.ccbluex.liquidbounce.utils.combat.* import net.ccbluex.liquidbounce.utils.inventory.InventoryManager import net.ccbluex.liquidbounce.utils.inventory.Slots import net.ccbluex.liquidbounce.utils.item.isNothing import net.ccbluex.liquidbounce.utils.kotlin.Priority -import net.ccbluex.liquidbounce.utils.render.WorldTargetRenderer import net.ccbluex.liquidbounce.utils.render.trajectory.TrajectoryInfo import net.minecraft.entity.LivingEntity import net.minecraft.item.Item @@ -65,7 +56,6 @@ import net.minecraft.util.Hand */ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { - private val range by floatRange("Range", 3.0f..6f, 1f..50f) private val throwableType by enumChoice("ThrowableType", ThrowableType.EGG_AND_SNOWBALL) private val gravityType by enumChoice("GravityType", GravityType.AUTO).apply { tagBy(this) } @@ -74,7 +64,7 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { /** * The target tracker to find the best enemy to attack. */ - internal val targetTracker = tree(TargetTracker(PriorityEnum.DISTANCE)) + private val targetSelector = tree(TargetSelector(PriorityEnum.DISTANCE, floatRange("Range", 3.0f..6f, 1f..50f))) private val pointTracker = tree( PointTracker( lowestPointDefault = PointTracker.PreferredBoxPart.HEAD, @@ -92,11 +82,6 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { private val rotationConfigurable = tree(RotationsConfigurable(this)) private val aimOffThreshold by float("AimOffThreshold", 2f, 0.5f..10f) - /** - * The target renderer to render the target, which we are currently aiming at. - */ - private val targetRenderer = tree(WorldTargetRenderer(this)) - private val selectSlotAutomatically by boolean("SelectSlotAutomatically", true) private val tickUntilSlotReset by int("TicksUntillSlotReset", 1, 0..20) private val considerInventory by boolean("ConsiderInventory", true) @@ -111,10 +96,8 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { */ @Suppress("unused") val simulatedTickHandler = handler { - targetTracker.reset() - // Find the recommended target - val target = targetTracker.enemies().firstOrNull { + val target = CombatManager.target ?: targetSelector.enemies().firstOrNull { // Check if we can see the enemy player.canSee(it) } ?: return@handler @@ -127,10 +110,6 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { return@handler } - if (target.boxedDistanceTo(player) !in range) { - return@handler - } - // Check if we have a throwable, if not we can't shoot. val (hand, slot) = getThrowable() ?: return@handler @@ -144,12 +123,12 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { val rotation = generateRotation(target, GravityType.fromHand(hand)) + CombatManager.selectTarget(target) // Set the rotation with the usage priority of 2. RotationManager.aimAt( rotationConfigurable.toAimPlan(rotation ?: return@handler, considerInventory = considerInventory), Priority.IMPORTANT_FOR_USAGE_2, this ) - targetTracker.select(target) } /** @@ -157,17 +136,7 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { */ @Suppress("unused") val handleAutoShoot = tickHandler { - val target = targetTracker.target ?: return@tickHandler - - // Cannot happen but we want to smart-cast - @Suppress("USELESS_IS_CHECK") - if (target !is LivingEntity) { - return@tickHandler - } - - if (target.boxedDistanceTo(player) !in range) { - return@tickHandler - } + val target = CombatManager.target ?: return@tickHandler if (notDuringCombat && CombatManager.isInCombat) { return@tickHandler @@ -216,15 +185,6 @@ object ModuleAutoShoot : ClientModule("AutoShoot", Category.COMBAT) { } } - val renderHandler = handler { event -> - val matrixStack = event.matrixStack - val target = targetTracker.target ?: return@handler - - renderEnvironmentForWorld(matrixStack) { - targetRenderer.render(this, target, event.partialTicks) - } - } - private fun generateRotation(target: LivingEntity, gravityType: GravityType): Rotation? { val pointOnHitbox = pointTracker.gatherPoint(target, PointTracker.AimSituation.FOR_NEXT_TICK) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleFakeLag.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleFakeLag.kt index f35dee9d897..06f74f6e72f 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleFakeLag.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleFakeLag.kt @@ -19,29 +19,20 @@ package net.ccbluex.liquidbounce.features.module.modules.combat import net.ccbluex.liquidbounce.config.types.NamedChoice -import net.ccbluex.liquidbounce.event.events.NotificationEvent -import net.ccbluex.liquidbounce.event.events.QueuePacketEvent -import net.ccbluex.liquidbounce.event.events.TransferOrigin +import net.ccbluex.liquidbounce.event.events.* import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.event.tickHandler import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.features.module.modules.movement.autododge.ModuleAutoDodge -import net.ccbluex.liquidbounce.utils.client.Chronometer -import net.ccbluex.liquidbounce.utils.client.PacketQueueManager +import net.ccbluex.liquidbounce.utils.client.* import net.ccbluex.liquidbounce.utils.client.PacketQueueManager.positions -import net.ccbluex.liquidbounce.utils.client.notification -import net.ccbluex.liquidbounce.utils.combat.findEnemy -import net.ccbluex.liquidbounce.utils.combat.getEntitiesBoxInRange -import net.ccbluex.liquidbounce.utils.combat.shouldBeAttacked +import net.ccbluex.liquidbounce.utils.combat.* import net.ccbluex.liquidbounce.utils.entity.box import net.ccbluex.liquidbounce.utils.item.isConsumable import net.minecraft.network.packet.c2s.common.ResourcePackStatusC2SPacket import net.minecraft.network.packet.c2s.play.* -import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket -import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket -import net.minecraft.network.packet.s2c.play.HealthUpdateS2CPacket -import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket +import net.minecraft.network.packet.s2c.play.* import kotlin.jvm.optionals.getOrNull /** @@ -181,7 +172,7 @@ object ModuleFakeLag : ClientModule("FakeLag", Category.COMBAT) { } // Support auto shoot with fake lag - if (running && ModuleAutoShoot.constantLag && ModuleAutoShoot.targetTracker.target == null) { + if (running && ModuleAutoShoot.constantLag && CombatManager.target == null) { event.action = PacketQueueManager.Action.QUEUE return@handler } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleTimerRange.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleTimerRange.kt index b8cdb9b24f7..bfb83c9057e 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleTimerRange.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/ModuleTimerRange.kt @@ -26,6 +26,7 @@ import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura import net.ccbluex.liquidbounce.utils.client.Timer import net.ccbluex.liquidbounce.utils.client.Timer.timerSpeed +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.ccbluex.liquidbounce.utils.combat.findEnemy import net.ccbluex.liquidbounce.utils.kotlin.Priority import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket @@ -64,7 +65,7 @@ object ModuleTimerRange : ClientModule("TimerRange", Category.COMBAT) { val repeatable = tickHandler { if (onlyOnGround && !player.isOnGround) return@tickHandler - if (requiresKillAura && (!ModuleKillAura.running || ModuleKillAura.targetTracker.target == null)) { + if (requiresKillAura && (!ModuleKillAura.running || CombatManager.target == null)) { return@tickHandler } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/ModuleAutoBow.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/ModuleAutoBow.kt index 3960ef77b84..c4b567107ae 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/ModuleAutoBow.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/ModuleAutoBow.kt @@ -20,9 +20,7 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.aimbot import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule -import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.autobow.AutoBowAimbotFeature -import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.autobow.AutoBowAutoShootFeature -import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.autobow.AutoBowFastChargeFeature +import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.autobow.* import net.ccbluex.liquidbounce.utils.client.Chronometer import net.minecraft.item.BowItem import java.util.* @@ -48,10 +46,6 @@ object ModuleAutoBow : ClientModule("AutoBow", Category.COMBAT, aliases = arrayO } } - override fun disable() { - AutoBowAimbotFeature.targetTracker.reset() - } - init { tree(AutoBowAutoShootFeature) tree(AutoBowAimbotFeature) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAimbotFeature.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAimbotFeature.kt index 8b48047690c..c68b5d5fb09 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAimbotFeature.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAimbotFeature.kt @@ -1,18 +1,13 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.autobow import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable -import net.ccbluex.liquidbounce.event.events.OverlayRenderEvent -import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.event.tickHandler import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.ModuleAutoBow -import net.ccbluex.liquidbounce.render.renderEnvironmentForGUI import net.ccbluex.liquidbounce.utils.aiming.RotationManager import net.ccbluex.liquidbounce.utils.aiming.RotationsConfigurable import net.ccbluex.liquidbounce.utils.aiming.projectiles.SituationalProjectileAngleCalculator -import net.ccbluex.liquidbounce.utils.combat.PriorityEnum -import net.ccbluex.liquidbounce.utils.combat.TargetTracker +import net.ccbluex.liquidbounce.utils.combat.* import net.ccbluex.liquidbounce.utils.kotlin.Priority -import net.ccbluex.liquidbounce.utils.render.OverlayTargetRenderer import net.ccbluex.liquidbounce.utils.render.trajectory.TrajectoryData import net.minecraft.item.BowItem import net.minecraft.item.TridentItem @@ -23,7 +18,7 @@ import net.minecraft.item.TridentItem object AutoBowAimbotFeature : ToggleableConfigurable(ModuleAutoBow, "BowAimbot", true) { // Target - val targetTracker = TargetTracker(PriorityEnum.DISTANCE) + val targetSelector = TargetSelector(PriorityEnum.DISTANCE) // Rotation val rotationConfigurable = RotationsConfigurable(this) @@ -31,16 +26,12 @@ object AutoBowAimbotFeature : ToggleableConfigurable(ModuleAutoBow, "BowAimbot", val minExpectedPull by int("MinExpectedPull", 5, 0..20, suffix = "ticks") init { - tree(targetTracker) + tree(targetSelector) tree(rotationConfigurable) } - private val targetRenderer = tree(OverlayTargetRenderer(ModuleAutoBow)) - @Suppress("unused") val tickRepeatable = tickHandler { - targetTracker.reset() - // Should check if player is using bow val activeItem = player.activeItem?.item if (activeItem !is BowItem && activeItem !is TridentItem) { @@ -53,12 +44,12 @@ object AutoBowAimbotFeature : ToggleableConfigurable(ModuleAutoBow, "BowAimbot", true ) ?: return@tickHandler - val target = targetTracker.enemies().firstOrNull() ?: return@tickHandler + val target = CombatManager.target ?: targetSelector.enemies().firstOrNull() ?: return@tickHandler val rotation = SituationalProjectileAngleCalculator.calculateAngleForEntity( projectileInfo, target ) ?: return@tickHandler - targetTracker.select(target) + CombatManager.selectTarget(target) RotationManager.aimAt( rotation, priority = Priority.IMPORTANT_FOR_USAGE_1, @@ -67,13 +58,4 @@ object AutoBowAimbotFeature : ToggleableConfigurable(ModuleAutoBow, "BowAimbot", ) } - @Suppress("unused") - val renderHandler = handler { event -> - val target = targetTracker.target ?: return@handler - - renderEnvironmentForGUI { - targetRenderer.render(this, target, event.tickDelta) - } - } - } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAutoShootFeature.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAutoShootFeature.kt index 2128bc11562..5658fb112f5 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAutoShootFeature.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/aimbot/autobow/AutoBowAutoShootFeature.kt @@ -7,6 +7,7 @@ import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.module.modules.combat.aimbot.ModuleAutoBow import net.ccbluex.liquidbounce.utils.aiming.RotationManager import net.ccbluex.liquidbounce.utils.client.toRadians +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.ccbluex.liquidbounce.utils.combat.shouldBeAttacked import net.ccbluex.liquidbounce.utils.entity.PlayerSimulationCache import net.ccbluex.liquidbounce.utils.entity.SimulatedArrow @@ -81,7 +82,7 @@ object AutoBowAutoShootFeature : ToggleableConfigurable(ModuleAutoBow, "AutoShoo return@handler } } else if (AutoBowAimbotFeature.enabled) { - if (AutoBowAimbotFeature.targetTracker.target == null) { + if (CombatManager.target == null) { return@handler } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/CrystalAuraDamageOptions.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/CrystalAuraDamageOptions.kt index 56a563e5aff..807962b1bbd 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/CrystalAuraDamageOptions.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/CrystalAuraDamageOptions.kt @@ -21,9 +21,9 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura import net.ccbluex.liquidbounce.config.types.Configurable import net.ccbluex.liquidbounce.features.misc.FriendManager import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.ModuleCrystalAura.player -import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.ModuleCrystalAura.targetTracker import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.ModuleCrystalAura.world import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.trigger.CrystalAuraTriggerer +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.ccbluex.liquidbounce.utils.combat.getEntitiesBoxInRange import net.ccbluex.liquidbounce.utils.entity.getDamageFromExplosion import net.ccbluex.liquidbounce.utils.kotlin.LruCache @@ -59,7 +59,7 @@ object CrystalAuraDamageOptions : Configurable("Damage") { * Approximates how favorable an explosion of a crystal at [pos] in a given [world] would be */ // TODO by equal positions take self min damage internal fun approximateExplosionDamage(pos: Vec3d, requestingSubmodule: RequestingSubmodule): Float? { - val target = targetTracker.target ?: return null + val target = CombatManager.target ?: return null val damageToTarget = target.getDamage(pos, requestingSubmodule, CheckedEntity.TARGET) val notEnoughDamage = damageToTarget.isSmallerThan(minEnemyDamage) if (notEnoughDamage) { diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/ModuleCrystalAura.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/ModuleCrystalAura.kt index a3a7d24766a..162dcb88988 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/ModuleCrystalAura.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/ModuleCrystalAura.kt @@ -20,7 +20,6 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura import net.ccbluex.liquidbounce.config.types.Configurable import net.ccbluex.liquidbounce.event.events.RotationUpdateEvent -import net.ccbluex.liquidbounce.event.events.WorldRenderEvent import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule @@ -29,13 +28,11 @@ import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.place import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.post.CrystalPostAttackTracker import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.post.SubmoduleSetDead import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.trigger.CrystalAuraTriggerer -import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld import net.ccbluex.liquidbounce.utils.aiming.NoRotationMode import net.ccbluex.liquidbounce.utils.aiming.NormalRotationMode import net.ccbluex.liquidbounce.utils.combat.CombatManager -import net.ccbluex.liquidbounce.utils.combat.TargetTracker +import net.ccbluex.liquidbounce.utils.combat.TargetSelector import net.ccbluex.liquidbounce.utils.kotlin.Priority -import net.ccbluex.liquidbounce.utils.render.WorldTargetRenderer /** * Module CrystalAura @@ -51,7 +48,7 @@ object ModuleCrystalAura : ClientModule( disableOnQuit = true ) { - val targetTracker = tree(TargetTracker(range = float("Range", 4.5f, 1f..12f))) + val targetSelector = tree(TargetSelector(range = float("Range", 4.5f, 1f..12f))) object PredictFeature : Configurable("Predict") { init { @@ -72,8 +69,6 @@ object ModuleCrystalAura : ClientModule( ) } - private val targetRenderer = tree(WorldTargetRenderer(this)) - val rotationMode = choices(this, "RotationMode") { arrayOf( NormalRotationMode(it, this, Priority.IMPORTANT_FOR_USAGE_2, true), @@ -100,16 +95,7 @@ object ModuleCrystalAura : ClientModule( return@handler } - targetTracker.selectFirst() - } - - @Suppress("unused") - private val renderHandler = handler { - val target = targetTracker.target ?: return@handler - - renderEnvironmentForWorld(it.matrixStack) { - targetRenderer.render(this, target, it.partialTicks) - } + targetSelector.enemies().firstOrNull()?.let { CombatManager.selectTarget(it) } } } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/place/CrystalAuraPlaceTargetFactory.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/place/CrystalAuraPlaceTargetFactory.kt index 232218a4a3f..5378cdad047 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/place/CrystalAuraPlaceTargetFactory.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/place/CrystalAuraPlaceTargetFactory.kt @@ -20,7 +20,6 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.plac import it.unimi.dsi.fastutil.ints.IntOpenHashSet import net.ccbluex.liquidbounce.features.module.MinecraftShortcuts -import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.ModuleCrystalAura import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.SubmoduleBasePlace import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.place.SubmoduleCrystalPlacer.getMaxRange import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.place.SubmoduleCrystalPlacer.oldVersion @@ -28,6 +27,7 @@ import net.ccbluex.liquidbounce.features.module.modules.combat.crystalaura.place import net.ccbluex.liquidbounce.render.FULL_BOX import net.ccbluex.liquidbounce.utils.block.getSortedSphere import net.ccbluex.liquidbounce.utils.block.isBlockedByEntitiesReturnCrystal +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.minecraft.util.math.BlockPos object CrystalAuraPlaceTargetFactory : MinecraftShortcuts { @@ -95,7 +95,7 @@ object CrystalAuraPlaceTargetFactory : MinecraftShortcuts { excludeIds: IntArray?, positions: MutableList ): Boolean { - val target = ModuleCrystalAura.targetTracker.target ?: return true + val target = CombatManager.target ?: return true val expectedCrystal = if (oldVersion) FULL_BOX.withMaxX(2.0) else FULL_BOX val basePlaceLayers = if (basePlace) SubmoduleBasePlace.getBasePlaceLayers(target.y) else IntOpenHashSet() diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/trigger/triggers/EntityMoveTrigger.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/trigger/triggers/EntityMoveTrigger.kt index 11ea22af94b..ce0041fd327 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/trigger/triggers/EntityMoveTrigger.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/crystalaura/trigger/triggers/EntityMoveTrigger.kt @@ -36,7 +36,7 @@ object EntityMoveTrigger : PostPacketTrigger("EntityMov override fun postPacketHandler(packet: EntityPositionS2CPacket) { val entity = world.getEntityById(packet.entityId) ?: return - if (player.eyePos.squaredDistanceTo(entity.pos) > ModuleCrystalAura.targetTracker.maxRange.toFloat().sq()) { + if (player.eyePos.squaredDistanceTo(entity.pos) > ModuleCrystalAura.targetSelector.maxRange.toFloat().sq()) { return } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/ModuleKillAura.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/ModuleKillAura.kt index aa0ced67ab6..2b533d120c9 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/ModuleKillAura.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/ModuleKillAura.kt @@ -20,24 +20,18 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.killaura import com.google.gson.JsonObject import net.ccbluex.liquidbounce.config.types.NamedChoice -import net.ccbluex.liquidbounce.event.Sequence -import net.ccbluex.liquidbounce.event.events.InputHandleEvent -import net.ccbluex.liquidbounce.event.events.RotationUpdateEvent -import net.ccbluex.liquidbounce.event.events.SprintEvent -import net.ccbluex.liquidbounce.event.events.WorldRenderEvent -import net.ccbluex.liquidbounce.event.handler -import net.ccbluex.liquidbounce.event.tickHandler +import net.ccbluex.liquidbounce.event.* +import net.ccbluex.liquidbounce.event.events.* import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.ClientModule import net.ccbluex.liquidbounce.features.module.modules.combat.ModuleAutoWeapon import net.ccbluex.liquidbounce.features.module.modules.combat.criticals.ModuleCriticals import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.KillAuraClickScheduler.considerMissCooldown import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.RaycastMode.* -import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraAutoBlock -import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraFailSwing +import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.RotationTimingMode.ON_TICK +import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.RotationTimingMode.SNAP +import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.* import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraFailSwing.dealWithFakeSwing -import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraFightBot -import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraNotifyWhenFail import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraNotifyWhenFail.failedHits import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraNotifyWhenFail.hasFailedHit import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.features.KillAuraNotifyWhenFail.renderFailedHits @@ -45,22 +39,14 @@ import net.ccbluex.liquidbounce.features.module.modules.exploit.ModuleMultiActio import net.ccbluex.liquidbounce.features.module.modules.misc.debugrecorder.modes.GenericDebugRecorder import net.ccbluex.liquidbounce.features.module.modules.render.ModuleDebug import net.ccbluex.liquidbounce.render.engine.Color4b -import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld import net.ccbluex.liquidbounce.utils.aiming.* import net.ccbluex.liquidbounce.utils.clicking.ClickScheduler -import net.ccbluex.liquidbounce.utils.combat.CombatManager -import net.ccbluex.liquidbounce.utils.combat.attack -import net.ccbluex.liquidbounce.utils.combat.shouldBeAttacked -import net.ccbluex.liquidbounce.utils.entity.boxedDistanceTo -import net.ccbluex.liquidbounce.utils.entity.isBlockAction -import net.ccbluex.liquidbounce.utils.entity.rotation -import net.ccbluex.liquidbounce.utils.entity.wouldBlockHit +import net.ccbluex.liquidbounce.utils.combat.* +import net.ccbluex.liquidbounce.utils.entity.* import net.ccbluex.liquidbounce.utils.inventory.InventoryManager import net.ccbluex.liquidbounce.utils.inventory.openInventorySilently import net.ccbluex.liquidbounce.utils.kotlin.Priority -import net.ccbluex.liquidbounce.utils.render.WorldTargetRenderer import net.minecraft.client.gui.screen.ingame.GenericContainerScreen -import net.minecraft.client.util.math.MatrixStack import net.minecraft.entity.Entity import net.minecraft.entity.LivingEntity import net.minecraft.entity.player.PlayerEntity @@ -104,7 +90,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { } // Target - val targetTracker = tree(CombatManager.targetTracker) + val targetSelector = tree(TargetSelector()) // Rotation private val rotations = tree(object : RotationsConfigurable(this, combatSpecific = true) { @@ -126,16 +112,12 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { tree(KillAuraAutoBlock) } - // Target rendering - private val targetRenderer = tree(WorldTargetRenderer(this)) - init { tree(KillAuraFailSwing) tree(KillAuraFightBot) } override fun disable() { - targetTracker.reset() failedHits.clear() KillAuraAutoBlock.stopBlocking() KillAuraNotifyWhenFail.failedHitsIncrement = 0 @@ -145,19 +127,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { get() = !requiresClick || mc.options.attackKey.isPressed val renderHandler = handler { event -> - val matrixStack = event.matrixStack - - renderTarget(matrixStack, event.partialTicks) - renderFailedHits(matrixStack) - } - - private fun renderTarget(matrixStack: MatrixStack, partialTicks: Float) { - if (!targetRenderer.enabled) return - val target = targetTracker.target ?: return - - renderEnvironmentForWorld(matrixStack) { - targetRenderer.render(this, target, partialTicks) - } + renderFailedHits(event.matrixStack) } @Suppress("unused") @@ -166,11 +136,11 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { val isInInventoryScreen = InventoryManager.isInventoryOpen || mc.currentScreen is GenericContainerScreen - val shouldCleanUpTracker = player.isSpectator || player.isDead || !canTargetEnemies + val shouldResetTarget = player.isSpectator || player.isDead || !canTargetEnemies - if (isInInventoryScreen && !ignoreOpenInventory || shouldCleanUpTracker) { - // Cleanup current target tracker - targetTracker.reset() + if (isInInventoryScreen && !ignoreOpenInventory || shouldResetTarget) { + // Reset current target + CombatManager.resetTarget() return@handler } @@ -178,7 +148,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { updateEnemySelection() // Update Auto Weapon - ModuleAutoWeapon.prepare(targetTracker.target) + ModuleAutoWeapon.prepare(CombatManager.target) } @Suppress("unused") @@ -188,7 +158,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { } // Check if there is target to attack - val target = targetTracker.target + val target = CombatManager.target if (CombatManager.shouldPauseCombat) { KillAuraAutoBlock.stopBlocking() @@ -219,7 +189,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { } // Determine if we should attack the target or someone else - val rotation = if (rotations.rotationTimingMode == RotationTimingMode.ON_TICK) { + val rotation = if (rotations.rotationTimingMode == ON_TICK) { getSpot(target, range.toDouble(), PointTracker.AimSituation.FOR_NOW)?.rotation ?: RotationManager.currentRotation ?: player.rotation } else { @@ -239,7 +209,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { // Swap enemy if there is a better enemy (closer to the player crosshair) if (chosenEntity is LivingEntity && chosenEntity.shouldBeAttacked() && chosenEntity != target) { - targetTracker.select(chosenEntity) + CombatManager.selectTarget(chosenEntity, true) } } else { chosenEntity = target @@ -332,61 +302,53 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { * Update enemy on target tracker */ private fun updateEnemySelection() { - targetTracker.validate { it.boxedDistanceTo(player) <= range } - - // Update target tracker, since we want to access - // the maximumDistance in the next step - val enemies = targetTracker.enemies() - // Maximum range can be higher than the normal range, since we want to scan for enemies // which are in our [scanExtraRange] as well - val maximumRange = if (targetTracker.maximumSquaredDistance > range * range) { + val maximumRange = if (targetSelector.closestSquaredEnemyDistance > range * range) { range + scanExtraRange } else { range } // Find the newest target in range - updateTargetWithRange(enemies, maximumRange) + updateTargetWithRange(maximumRange) } - private fun updateTargetWithRange(enemies: Iterable, range: Float) { - for (target in enemies) { - if (target.boxedDistanceTo(player) > range) { - continue - } + private fun updateTargetWithRange(range: Float) { + val situation = when { + clickScheduler.isGoingToClick || + clickScheduler.isClickOnNextTick(1) -> PointTracker.AimSituation.FOR_NEXT_TICK - val situation = when { - clickScheduler.isGoingToClick || - clickScheduler.isClickOnNextTick(1) -> PointTracker.AimSituation.FOR_NEXT_TICK + else -> PointTracker.AimSituation.FOR_THE_FUTURE + } + ModuleDebug.debugParameter(ModuleKillAura, "AimSituation", situation) - else -> PointTracker.AimSituation.FOR_THE_FUTURE + CombatManager.updateTarget(targetSelector) { target -> + if (target.squaredBoxedDistanceTo(player) > range * range) { + return@updateTarget null } - ModuleDebug.debugParameter(ModuleKillAura, "AimSituation", situation) - val spot = getSpot(target, range.toDouble(), situation) ?: continue - // lock on target tracker - targetTracker.select(target) + val spot = getSpot(target, range.toDouble(), situation) ?: return@updateTarget null - // aim at target val ticks = rotations.howLongToReach(spot.rotation) - if (rotations.rotationTimingMode == RotationTimingMode.SNAP - && !clickScheduler.isClickOnNextTick(ticks.coerceAtLeast(1))) { - break + if (rotations.rotationTimingMode == SNAP + && !clickScheduler.isClickOnNextTick(ticks.coerceAtLeast(1)) + ) { + return@updateTarget null } // On Tick can only be used if the distance is not too far compared to the turn speed - if (rotations.rotationTimingMode == RotationTimingMode.ON_TICK && ticks <= 1) { - break + if (rotations.rotationTimingMode == ON_TICK && ticks <= 1) { + return@updateTarget null } - val (rotation, vec) = spot - + spot + }?.let { spot -> RotationManager.aimAt( rotations.toAimPlan( - rotation, - vec, - target, + spot.rotation, + spot.vec, + CombatManager.target, considerInventory = !ignoreOpenInventory ), priority = Priority.IMPORTANT_FOR_USAGE_2, @@ -397,14 +359,14 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { // Choose enemy for fight bot if (KillAuraFightBot.enabled) { - val target = targetTracker.enemies().firstOrNull() + val target = CombatManager.target ?: targetSelector.enemies().firstOrNull() if (target != null) { - targetTracker.select(target) + CombatManager.selectTarget(target) } RotationManager.aimAt( rotations.toAimPlan( - KillAuraFightBot.getMovementRotation() ?: return, + KillAuraFightBot.getMovementRotation(), considerInventory = !ignoreOpenInventory ), priority = Priority.IMPORTANT_FOR_USAGE_2, @@ -522,14 +484,14 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { return // return if it's not allowed to attack while the player is using another item that's not a shield } - if (rotations.rotationTimingMode == RotationTimingMode.ON_TICK && rotation != null) { + if (rotations.rotationTimingMode == ON_TICK && rotation != null) { network.sendPacket(Full(player.x, player.y, player.z, rotation.yaw, rotation.pitch, player.isOnGround, player.horizontalCollision)) } attack() - if (rotations.rotationTimingMode == RotationTimingMode.ON_TICK && rotation != null) { + if (rotations.rotationTimingMode == ON_TICK && rotation != null) { network.sendPacket( Full(player.x, player.y, player.z, player.withFixedYaw(rotation), player.pitch, player.isOnGround, player.horizontalCollision) @@ -549,7 +511,7 @@ object ModuleKillAura : ClientModule("KillAura", Category.COMBAT) { val shouldBlockSprinting get() = !player.isOnGround && criticalsMode != CriticalsMode.IGNORE && - targetTracker.target != null && + CombatManager.target != null && clickScheduler.isClickOnNextTick(1) @Suppress("unused") diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraAutoBlock.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraAutoBlock.kt index fbb917c1971..f9dac9f7467 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraAutoBlock.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraAutoBlock.kt @@ -20,22 +20,16 @@ package net.ccbluex.liquidbounce.features.module.modules.combat.killaura.feature import net.ccbluex.liquidbounce.config.types.NamedChoice import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable -import net.ccbluex.liquidbounce.event.events.GameTickEvent -import net.ccbluex.liquidbounce.event.events.PacketEvent -import net.ccbluex.liquidbounce.event.events.QueuePacketEvent -import net.ccbluex.liquidbounce.event.events.TransferOrigin +import net.ccbluex.liquidbounce.event.events.* import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.RaycastMode.* import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.range import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.raycast -import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.targetTracker +import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.targetSelector import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.wallRange import net.ccbluex.liquidbounce.features.module.modules.render.ModuleDebug -import net.ccbluex.liquidbounce.utils.aiming.RotationManager -import net.ccbluex.liquidbounce.utils.aiming.facingEnemy -import net.ccbluex.liquidbounce.utils.aiming.raycast -import net.ccbluex.liquidbounce.utils.aiming.raytraceEntity +import net.ccbluex.liquidbounce.utils.aiming.* import net.ccbluex.liquidbounce.utils.client.PacketQueueManager import net.ccbluex.liquidbounce.utils.client.isOlderThanOrEquals1_7_10 import net.ccbluex.liquidbounce.utils.combat.shouldBeAttacked @@ -296,7 +290,7 @@ object KillAuraAutoBlock : ToggleableConfigurable(ModuleKillAura, "AutoBlocking" /** * Check if the player is in danger. */ - private fun isInDanger() = targetTracker.enemies().any { target -> + private fun isInDanger() = targetSelector.enemies().any { target -> facingEnemy( fromEntity = target, toEntity = player, diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraFightBot.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraFightBot.kt index be84633d88e..db0536f3bad 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraFightBot.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/killaura/features/KillAuraFightBot.kt @@ -22,10 +22,10 @@ import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable import net.ccbluex.liquidbounce.event.events.MovementInputEvent import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.clickScheduler -import net.ccbluex.liquidbounce.features.module.modules.combat.killaura.ModuleKillAura.targetTracker import net.ccbluex.liquidbounce.features.module.modules.render.ModuleDebug import net.ccbluex.liquidbounce.render.engine.Color4b import net.ccbluex.liquidbounce.utils.aiming.Rotation +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.ccbluex.liquidbounce.utils.entity.box import net.ccbluex.liquidbounce.utils.entity.rotation import net.ccbluex.liquidbounce.utils.math.times @@ -80,7 +80,7 @@ object KillAuraFightBot : NavigationBaseConfigurable(ModuleKillAu override fun createNavigationContext(): CombatContext { val playerPosition = player.pos - val combatTarget = targetTracker.target?.let { entity -> + val combatTarget = CombatManager.target?.let { entity -> val distance = playerPosition.distanceTo(entity.pos) val range = min(ModuleKillAura.range, distance.toFloat()) val outOfDistance = distance > opponentRange @@ -146,7 +146,7 @@ object KillAuraFightBot : NavigationBaseConfigurable(ModuleKillAu */ override fun getMovementRotation(): Rotation { val movementRotation = super.getMovementRotation() - val movementPitch = targetTracker.target?.let { entity -> + val movementPitch = CombatManager.target?.let { entity -> Rotation.lookingAt(point = entity.box.center, from = player.eyePos).pitch } ?: return movementRotation diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/ModuleTpAura.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/ModuleTpAura.kt index 28a55c493c7..c2c9fb60245 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/ModuleTpAura.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/ModuleTpAura.kt @@ -43,7 +43,7 @@ object ModuleTpAura : ClientModule("TpAura", Category.COMBAT, disableOnQuit = tr val clickScheduler = tree(ClickScheduler(this, true)) val mode = choices("Mode", AStarMode, arrayOf(AStarMode, ImmediateMode)) - val targetTracker = tree(TargetSelector(PriorityEnum.HURT_TIME)) + val targetSelector = tree(TargetSelector(PriorityEnum.HURT_TIME)) val stuckChronometer = Chronometer() var desyncPlayerPosition: Vec3d? = null @@ -53,7 +53,7 @@ object ModuleTpAura : ClientModule("TpAura", Category.COMBAT, disableOnQuit = tr val position = desyncPlayerPosition ?: player.pos clickScheduler.clicks { - val enemy = targetTracker.enemies().firstOrNull { + val enemy = targetSelector.enemies().firstOrNull { it.squaredBoxedDistanceTo(position) <= attackRange * attackRange } ?: return@clicks false diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/AStarMode.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/AStarMode.kt index 25fdfaa396a..b97653e1e47 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/AStarMode.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/AStarMode.kt @@ -8,12 +8,10 @@ import net.ccbluex.liquidbounce.event.tickHandler import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.clickScheduler import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.desyncPlayerPosition import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.stuckChronometer -import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.targetTracker +import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.targetSelector import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.TpAuraChoice -import net.ccbluex.liquidbounce.render.drawLineStrip +import net.ccbluex.liquidbounce.render.* import net.ccbluex.liquidbounce.render.engine.Color4b -import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld -import net.ccbluex.liquidbounce.render.withColor import net.ccbluex.liquidbounce.utils.client.chat import net.ccbluex.liquidbounce.utils.client.markAsError import net.ccbluex.liquidbounce.utils.entity.blockVecPosition @@ -73,7 +71,7 @@ object AStarMode : TpAuraChoice("AStar") { val maximumDistanceSq = maximumDistance.sq() - targetTracker.enemies().filter { + targetSelector.enemies().filter { it.squaredDistanceTo(playerPosition) <= maximumDistanceSq }.sortedBy { it.squaredBoxedDistanceTo(playerPosition) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/ImmediateMode.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/ImmediateMode.kt index 8fc54a02e7e..256456394a9 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/ImmediateMode.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/combat/tpaura/modes/ImmediateMode.kt @@ -7,15 +7,11 @@ import net.ccbluex.liquidbounce.event.tickHandler import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.clickScheduler import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.desyncPlayerPosition import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.stuckChronometer -import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.targetTracker +import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.ModuleTpAura.targetSelector import net.ccbluex.liquidbounce.features.module.modules.combat.tpaura.TpAuraChoice -import net.ccbluex.liquidbounce.render.drawLineStrip +import net.ccbluex.liquidbounce.render.* import net.ccbluex.liquidbounce.render.engine.Color4b -import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld -import net.ccbluex.liquidbounce.render.withColor -import net.ccbluex.liquidbounce.utils.client.MovePacketType -import net.ccbluex.liquidbounce.utils.client.chat -import net.ccbluex.liquidbounce.utils.client.markAsError +import net.ccbluex.liquidbounce.utils.client.* import net.ccbluex.liquidbounce.utils.entity.squaredBoxedDistanceTo import net.ccbluex.liquidbounce.utils.math.toVec3 import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket @@ -32,7 +28,7 @@ object ImmediateMode : TpAuraChoice("Immediate") { } val playerPosition = player.pos - val enemyPosition = targetTracker.enemies().minByOrNull { it.squaredBoxedDistanceTo(playerPosition) }?.pos + val enemyPosition = targetSelector.enemies().minByOrNull { it.squaredBoxedDistanceTo(playerPosition) }?.pos ?: return@tickHandler travel(enemyPosition) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleAutoPearl.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleAutoPearl.kt index bcb7b14a65e..c4fd11af32b 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleAutoPearl.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/misc/ModuleAutoPearl.kt @@ -192,7 +192,7 @@ object ModuleAutoPearl : ClientModule("AutoPearl", Category.MISC, aliases = arra return when(mode) { Modes.TRIGGER -> pearl.owner!!.shouldBeAttacked() - Modes.TARGET -> CombatManager.targetTracker.target?.uuid == pearl.ownerUuid + Modes.TARGET -> CombatManager.target?.uuid == pearl.ownerUuid } } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleTargetStrafe.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleTargetStrafe.kt index 1c790b10196..6f805921d2e 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleTargetStrafe.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/movement/ModuleTargetStrafe.kt @@ -132,7 +132,7 @@ object ModuleTargetStrafe : ClientModule("TargetStrafe", Category.MOVEMENT) { } // Get the target entity, requires a locked target - val target = CombatManager.targetTracker.target ?: return@handler + val target = CombatManager.target ?: return@handler val distance = sqrt((player.pos.x - target.pos.x).pow(2.0) + (player.pos.z - target.pos.z).pow(2.0)) // return if we're too far diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/ModuleAutoTrap.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/ModuleAutoTrap.kt index 6ef43dca2e4..9dd28a7d0ed 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/ModuleAutoTrap.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/ModuleAutoTrap.kt @@ -27,8 +27,7 @@ import net.ccbluex.liquidbounce.features.module.modules.world.traps.traps.* import net.ccbluex.liquidbounce.utils.aiming.* import net.ccbluex.liquidbounce.utils.block.doPlacement import net.ccbluex.liquidbounce.utils.client.SilentHotbar -import net.ccbluex.liquidbounce.utils.combat.CombatManager -import net.ccbluex.liquidbounce.utils.combat.TargetTracker +import net.ccbluex.liquidbounce.utils.combat.* import net.ccbluex.liquidbounce.utils.kotlin.Priority import net.minecraft.util.Hand @@ -45,7 +44,7 @@ object ModuleAutoTrap : ClientModule("AutoTrap", Category.WORLD, aliases = array private val ignitionTrapPlanner = tree(IgnitionTrapPlanner(this)) private val webTrapPlanner = tree(WebTrapPlanner(this)) - val targetTracker = tree(TargetTracker(range = floatRange("Range", 3.0f..4.5f, 2f..6f))) + val targetSelector = tree(TargetSelector(range = floatRange("Range", 3.0f..4.5f, 2f..6f))) private val rotationsConfigurable = tree(RotationsConfigurable(this)) private var currentPlan: BlockChangeIntent<*>? = null @@ -66,9 +65,7 @@ object ModuleAutoTrap : ClientModule("AutoTrap", Category.WORLD, aliases = array return@handler } - targetTracker.validate() - - val enemies = targetTracker.enemies() + val enemies = targetSelector.enemies() TrapPlayerSimulation.runSimulations(enemies) currentPlan = webTrapPlanner.plan(enemies) ?: ignitionTrapPlanner.plan(enemies) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/IgnitionTrapPlanner.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/IgnitionTrapPlanner.kt index 32040bd33f3..d6107e68324 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/IgnitionTrapPlanner.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/IgnitionTrapPlanner.kt @@ -22,10 +22,10 @@ import it.unimi.dsi.fastutil.doubles.DoubleObjectImmutablePair import it.unimi.dsi.fastutil.doubles.DoubleObjectPair import net.ccbluex.liquidbounce.event.EventListener import net.ccbluex.liquidbounce.features.module.modules.world.traps.* -import net.ccbluex.liquidbounce.features.module.modules.world.traps.ModuleAutoTrap.targetTracker import net.ccbluex.liquidbounce.utils.block.collidingRegion import net.ccbluex.liquidbounce.utils.block.getState import net.ccbluex.liquidbounce.utils.block.targetfinding.* +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.ccbluex.liquidbounce.utils.entity.prevPos import net.ccbluex.liquidbounce.utils.inventory.HotbarItemSlot import net.ccbluex.liquidbounce.utils.inventory.Slots @@ -50,20 +50,17 @@ class IgnitionTrapPlanner(parent: EventListener) : TrapPlanner): BlockChangeIntent? { val slot = findItemToIgnite() ?: return null - for (target in enemies) { + return CombatManager.updateTarget(enemies) { target -> if (target.isOnFire) { - continue + return@updateTarget null } val targetPos = TrapPlayerSimulation.findPosForTrap( - target, - isTargetLocked = targetTracker.target == target - ) ?: continue + target, isTargetLocked = CombatManager.target == target + ) ?: return@updateTarget null - val placementTarget = generatePlacementInfo(targetPos, target, slot) ?: continue + val placementTarget = generatePlacementInfo(targetPos, target, slot) ?: return@updateTarget null - targetTracker.select(target) - - return BlockChangeIntent( + BlockChangeIntent( BlockChangeInfo.PlaceBlock(placementTarget ), slot, IntentTiming.NEXT_PROPITIOUS_MOMENT, @@ -71,8 +68,6 @@ class IgnitionTrapPlanner(parent: EventListener) : TrapPlanner) { - targetTracker.select(intent.planningInfo.target, reportToUI = false) + CombatManager.resetTarget() } private fun findItemToIgnite(): HotbarItemSlot? { diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/WebTrapPlanner.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/WebTrapPlanner.kt index 069fb88d3a8..02fbdc28c6d 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/WebTrapPlanner.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/world/traps/traps/WebTrapPlanner.kt @@ -22,10 +22,10 @@ import it.unimi.dsi.fastutil.doubles.DoubleObjectImmutablePair import it.unimi.dsi.fastutil.doubles.DoubleObjectPair import net.ccbluex.liquidbounce.event.EventListener import net.ccbluex.liquidbounce.features.module.modules.world.traps.* -import net.ccbluex.liquidbounce.features.module.modules.world.traps.ModuleAutoTrap.targetTracker import net.ccbluex.liquidbounce.utils.block.collidingRegion import net.ccbluex.liquidbounce.utils.block.getState import net.ccbluex.liquidbounce.utils.block.targetfinding.* +import net.ccbluex.liquidbounce.utils.combat.CombatManager import net.ccbluex.liquidbounce.utils.entity.prevPos import net.ccbluex.liquidbounce.utils.inventory.HotbarItemSlot import net.ccbluex.liquidbounce.utils.inventory.Slots @@ -50,26 +50,23 @@ class WebTrapPlanner(parent: EventListener) : TrapPlanner): BlockChangeIntent? { val slot = findItemToWeb() ?: return null - for (target in enemies) { + return CombatManager.updateTarget(enemies) { target -> val targetPos = TrapPlayerSimulation.findPosForTrap( - target, - isTargetLocked = targetTracker.target == target - ) ?: continue + target, isTargetLocked = CombatManager.target == target + ) ?: return@updateTarget null - val placementTarget = generatePlacementInfo(targetPos, target, slot) ?: continue + val placementTarget = generatePlacementInfo( + targetPos, target, slot + ) ?: return@updateTarget null - targetTracker.select(target) - - return BlockChangeIntent( - BlockChangeInfo.PlaceBlock(placementTarget ), + BlockChangeIntent( + BlockChangeInfo.PlaceBlock(placementTarget), slot, IntentTiming.NEXT_PROPITIOUS_MOMENT, WebIntentData(target, target.getDimensions(EntityPose.STANDING).getBoxAt(targetPos)), this ) } - - return null } private fun generatePlacementInfo( @@ -182,7 +179,7 @@ class WebTrapPlanner(parent: EventListener) : TrapPlanner) { - targetTracker.select(intent.planningInfo.target, reportToUI = false) + CombatManager.resetTarget() } private fun findItemToWeb(): HotbarItemSlot? { diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/CombatManager.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/CombatManager.kt index c297915c741..d6965e5419f 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/CombatManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/CombatManager.kt @@ -18,18 +18,100 @@ */ package net.ccbluex.liquidbounce.utils.combat -import net.ccbluex.liquidbounce.event.EventListener -import net.ccbluex.liquidbounce.event.events.AttackEntityEvent -import net.ccbluex.liquidbounce.event.events.GameTickEvent -import net.ccbluex.liquidbounce.event.handler +import net.ccbluex.liquidbounce.event.* +import net.ccbluex.liquidbounce.event.events.* +import net.ccbluex.liquidbounce.features.module.modules.client.ModuleTargets +import net.ccbluex.liquidbounce.integration.interop.protocol.rest.v1.game.PlayerData +import net.ccbluex.liquidbounce.render.renderEnvironmentForWorld +import net.ccbluex.liquidbounce.utils.client.player import net.minecraft.entity.LivingEntity +import net.minecraft.entity.player.PlayerEntity /** - * A rotation manager + * Manages current target and combat flags */ object CombatManager : EventListener { - val targetTracker = TargetTracker() + var target: LivingEntity? = null + private set + + fun selectTarget(entity: LivingEntity, override: Boolean = false) { + val oldTarget = target + + if (oldTarget == null || override) { + target = entity + + if (entity != oldTarget && entity is PlayerEntity) { + EventManager.callEvent(TargetChangeEvent(PlayerData.fromPlayer(entity))) + } + } + } + + fun updateTarget(targetSelector: TargetSelector, evaluator: (LivingEntity) -> R): R? = + updateTarget(targetSelector.enemies(), evaluator) + + /** + * Updates [target] with [evaluator]. Tries the current target first, then loops through the provided + * list of [enemies] and checks if any of them is valid. Returning *null* in [evaluator] means it isn't. + * @return The value provided by [evaluator] of the found target (e.g. A rotation towards it) + */ + fun updateTarget(enemies: List, evaluator: (LivingEntity) -> R): R? { + val oldTarget = target + + if (oldTarget != null) { + val value = evaluator(oldTarget) + if (value != null) { + return value + } + } + + for (enemy in enemies) { + val value = evaluator(enemy) + if (value != null) { + selectTarget(enemy, true) + return value + } + } + + return null + } + + fun resetTarget() { + target = null + } + + private fun validateTarget() { + val target = target ?: return + + if (target == player || player.isDead || target.isRemoved || !target.shouldBeAttacked()) { + resetTarget() + } + } + + @Suppress("unused") + val attackHandler = handler { + if (it.entity is LivingEntity && it.entity.shouldBeAttacked()) { + // 40 ticks = 2 seconds + duringCombat = 40 + selectTarget(it.entity, true) + } + } + + @Suppress("unused") + val renderHandler = handler { event -> + val matrixStack = event.matrixStack + val target = target ?: return@handler + + renderEnvironmentForWorld(matrixStack) { + ModuleTargets.targetRenderer.render(this, target, event.partialTicks) + } + } + + @Suppress("unused") + val deathHandler = handler { resetTarget() } + + @Suppress("unused") + val handleWorldChange = handler { resetTarget() } // useful for something like autoSoup private var pauseCombat: Int = 0 @@ -64,14 +146,12 @@ object CombatManager : EventListener { if (duringCombat <= 0) return if (--duringCombat == 0) { - targetTracker.reset() + resetTarget() } } - /** - * Update current rotation to new rotation step - */ fun update() { + validateTarget() updatePauseRotation() updatePauseCombat() // TODO: implement this for killaura autoblock and other @@ -83,34 +163,25 @@ object CombatManager : EventListener { update() } - @Suppress("unused") - val attackHandler = handler { - if (it.entity is LivingEntity && it.entity.shouldBeAttacked()) { - // 40 ticks = 2 seconds - duringCombat = 40 - targetTracker.select(it.entity) - } - } - val shouldPauseCombat: Boolean - get() = this.pauseCombat > 0 + get() = pauseCombat > 0 val shouldPauseRotation: Boolean - get() = this.pauseRotation > 0 + get() = pauseRotation > 0 val shouldPauseBlocking: Boolean - get() = this.pauseBlocking > 0 + get() = pauseBlocking > 0 val isInCombat: Boolean - get() = this.duringCombat > 0 || targetTracker.target != null + get() = duringCombat > 0 || target != null fun pauseCombatForAtLeast(pauseTime: Int) { - this.pauseCombat = this.pauseCombat.coerceAtLeast(pauseTime) + pauseCombat = pauseCombat.coerceAtLeast(pauseTime) } fun pauseRotationForAtLeast(pauseTime: Int) { - this.pauseRotation = this.pauseRotation.coerceAtLeast(pauseTime) + pauseRotation = pauseRotation.coerceAtLeast(pauseTime) } fun pauseBlockingForAtLeast(pauseTime: Int) { - this.pauseBlocking = this.pauseBlocking.coerceAtLeast(pauseTime) + pauseBlocking = pauseBlocking.coerceAtLeast(pauseTime) } } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/TargetTracker.kt b/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/TargetTracker.kt index 0fb4c1fbbe6..ea55d022a9d 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/TargetTracker.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/utils/combat/TargetTracker.kt @@ -20,58 +20,22 @@ package net.ccbluex.liquidbounce.utils.combat import net.ccbluex.liquidbounce.config.types.* import net.ccbluex.liquidbounce.config.types.ValueType.* -import net.ccbluex.liquidbounce.event.EventManager -import net.ccbluex.liquidbounce.event.events.TargetChangeEvent -import net.ccbluex.liquidbounce.integration.interop.protocol.rest.v1.game.PlayerData import net.ccbluex.liquidbounce.utils.aiming.RotationUtil import net.ccbluex.liquidbounce.utils.client.player import net.ccbluex.liquidbounce.utils.client.world -import net.ccbluex.liquidbounce.utils.entity.* +import net.ccbluex.liquidbounce.utils.entity.getActualHealth +import net.ccbluex.liquidbounce.utils.entity.squaredBoxedDistanceTo import net.ccbluex.liquidbounce.utils.math.sq import net.minecraft.entity.LivingEntity import net.minecraft.entity.mob.HostileEntity import net.minecraft.entity.player.PlayerEntity -/** - * A target tracker to choose the best enemy to attack - */ -class TargetTracker( - defaultPriority: PriorityEnum = PriorityEnum.HEALTH, - range: RangedValue<*>? = null -) : TargetSelector(defaultPriority, range) { - - var target: LivingEntity? = null - private set - - fun select(entity: LivingEntity, reportToUI: Boolean = true) { - target = entity - - if (entity is PlayerEntity && reportToUI) { - EventManager.callEvent(TargetChangeEvent(PlayerData.fromPlayer(entity))) - } - } - - fun selectFirst() = enemies().firstOrNull()?.let { select(it) } ?: reset() - - fun reset() { - target = null - } - - fun validate(validator: ((LivingEntity) -> Boolean)? = null) { - val target = target ?: return - - if (!validate(target) || validator != null && !validator(target)) { - reset() - } - } -} - open class TargetSelector( defaultPriority: PriorityEnum = PriorityEnum.HEALTH, val range: RangedValue<*>? = null ) : Configurable("Target") { - var maximumSquaredDistance: Double = 0.0 + var closestSquaredEnemyDistance: Double = 0.0 private val fov by float("FOV", 180f, 0f..180f) private val hurtTime by int("HurtTime", 10, 0..10) @@ -80,13 +44,13 @@ open class TargetSelector( /** * Update should be called to always pick the best target out of the current world context */ - fun enemies(): List { + fun enemies(): MutableList { val entities = world.entities .asSequence() .filterIsInstance() .filter(::validate) // Sort by distance (closest first) - in case of tie at priority level - .sortedBy { it.boxedDistanceTo(player) } + .sortedBy { it.squaredBoxedDistanceTo(player) } .toMutableList() if (entities.isEmpty()) { @@ -116,7 +80,7 @@ open class TargetSelector( } // Update max distance squared - maximumSquaredDistance = entities.minOf { it.squaredBoxedDistanceTo(player) } + closestSquaredEnemyDistance = entities.minOf { it.squaredBoxedDistanceTo(player) } return entities }