From e60b7c6a21097df5541abacd03b6f257ec758481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Sun, 17 Nov 2024 00:33:21 +0800 Subject: [PATCH 1/3] feat: PointerESP (HUD) --- src-theme/public/metadata.json | 30 ++++++ src-theme/src/integration/events.ts | 6 +- src-theme/src/integration/types.ts | 7 ++ src-theme/src/routes/hud/Hud.svelte | 3 + .../hud/elements/pointeresp/PointerESP.svelte | 27 ++++++ .../elements/pointeresp/PointerView.svelte | 22 +++++ .../liquidbounce/event/EventManager.kt | 1 + .../liquidbounce/event/events/ClientEvents.kt | 13 +++ .../features/module/ModuleManager.kt | 1 + .../module/modules/render/ModulePointerESP.kt | 92 +++++++++++++++++++ .../theme/component/ComponentType.kt | 1 + .../render/RenderConfigurables.kt | 12 +++ 12 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 src-theme/src/routes/hud/elements/pointeresp/PointerESP.svelte create mode 100644 src-theme/src/routes/hud/elements/pointeresp/PointerView.svelte create mode 100644 src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt diff --git a/src-theme/public/metadata.json b/src-theme/public/metadata.json index a6db49331e2..3cc8200913e 100644 --- a/src-theme/public/metadata.json +++ b/src-theme/public/metadata.json @@ -294,6 +294,36 @@ } ] }, + { + "name": "PointerESP", + "value": [ + { + "name": "Enabled", + "value": true + }, + { + "name": "Alignment", + "value": [ + { + "name": "Horizontal", + "value": "CenterTranslated" + }, + { + "name": "HorizontalOffset", + "value": 0 + }, + { + "name": "Vertical", + "value": "CenterTranslated" + }, + { + "name": "VerticalOffset", + "value": 0 + } + ] + } + ] + }, { "name": "Effects", "value": [ diff --git a/src-theme/src/integration/events.ts b/src-theme/src/integration/events.ts index 89061c6373b..bfe87791f95 100644 --- a/src-theme/src/integration/events.ts +++ b/src-theme/src/integration/events.ts @@ -1,4 +1,4 @@ -import type {Component, PlayerData, Proxy, Server, TextComponent} from "./types"; +import type {Component, PlayerData, Pointer, Proxy, Server, TextComponent} from "./types"; export interface ToggleModuleEvent { moduleName: string; @@ -51,6 +51,10 @@ export interface BlockCountChangeEvent { count?: number; } +export interface PointerInfoEvent { + pointers?: Pointer[]; +} + export interface AccountManagerAdditionEvent { username: string | null; error: string | null; diff --git a/src-theme/src/integration/types.ts b/src-theme/src/integration/types.ts index 972e32bd832..edaa539fad4 100644 --- a/src-theme/src/integration/types.ts +++ b/src-theme/src/integration/types.ts @@ -404,3 +404,10 @@ export interface EntityHitResult extends HitResult { entityType: string; entityPos: Vec3; } + +export interface Pointer { + radius: number; + color: string; + rotateX: number; + rotateZ: number; +} diff --git a/src-theme/src/routes/hud/Hud.svelte b/src-theme/src/routes/hud/Hud.svelte index 7262bbfe737..981756b1570 100644 --- a/src-theme/src/routes/hud/Hud.svelte +++ b/src-theme/src/routes/hud/Hud.svelte @@ -15,6 +15,7 @@ import Keystrokes from "./elements/keystrokes/Keystrokes.svelte"; import Effects from "./elements/Effects.svelte"; import BlockCounter from "./elements/BlockCounter.svelte"; + import PointerESP from "./elements/pointeresp/PointerESP.svelte"; import Text from "./elements/Text.svelte"; let zoom = 100; @@ -54,6 +55,8 @@ {:else if c.name === "BlockCounter"} + {:else if c.name === "PointerESP"} + {:else if c.name === "Hotbar"} {:else if c.name === "Scoreboard"} diff --git a/src-theme/src/routes/hud/elements/pointeresp/PointerESP.svelte b/src-theme/src/routes/hud/elements/pointeresp/PointerESP.svelte new file mode 100644 index 00000000000..c9850ade9a5 --- /dev/null +++ b/src-theme/src/routes/hud/elements/pointeresp/PointerESP.svelte @@ -0,0 +1,27 @@ + + +
+ {#if pointers} + {#each pointers as pointer} + + {/each} + {/if} +
+ + diff --git a/src-theme/src/routes/hud/elements/pointeresp/PointerView.svelte b/src-theme/src/routes/hud/elements/pointeresp/PointerView.svelte new file mode 100644 index 00000000000..dd84abd38ce --- /dev/null +++ b/src-theme/src/routes/hud/elements/pointeresp/PointerView.svelte @@ -0,0 +1,22 @@ + + +
+ + diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt b/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt index 6fb7e347112..0c83948df64 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/event/EventManager.kt @@ -108,6 +108,7 @@ val ALL_EVENT_CLASSES: Array> = arrayOf( ServerPingedEvent::class, TargetChangeEvent::class, BlockCountChangeEvent::class, + PointerInfoEvent::class, GameModeChangeEvent::class, ComponentsUpdate::class, ResourceReloadEvent::class, diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt b/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt index ce8fb1d145d..a779002b013 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/event/events/ClientEvents.kt @@ -83,6 +83,19 @@ class TargetChangeEvent(val target: PlayerData?) : Event() @WebSocketEvent class BlockCountChangeEvent(val count: Int?) : Event() +@Nameable("pointerInfo") +@WebSocketEvent +class PointerInfoEvent( + val pointers: Array? +) : Event() { + class Pointer( + val radius: Int, + val color: String, + val rotateX: Float, + val rotateZ: Float + ) +} + @Nameable("clientChatStateChange") @WebSocketEvent class ClientChatStateChange(val state: State) : Event() { diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt index 4cffcf2b754..ba6dc3f7c80 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/ModuleManager.kt @@ -304,6 +304,7 @@ object ModuleManager : Listenable, Iterable by modules { ModuleNoSwing, ModuleCustomAmbience, ModuleProphuntESP, + ModulePointerESP, ModuleQuickPerspectiveSwap, ModuleRotations, ModuleSilentHotbar, diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt new file mode 100644 index 00000000000..0eee9a62386 --- /dev/null +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt @@ -0,0 +1,92 @@ +package net.ccbluex.liquidbounce.features.module.modules.render + +import net.ccbluex.liquidbounce.config.ChoiceConfigurable +import net.ccbluex.liquidbounce.event.EventManager +import net.ccbluex.liquidbounce.event.events.OverlayRenderEvent +import net.ccbluex.liquidbounce.event.events.PointerInfoEvent +import net.ccbluex.liquidbounce.event.handler +import net.ccbluex.liquidbounce.features.module.Category +import net.ccbluex.liquidbounce.features.module.Module +import net.ccbluex.liquidbounce.render.* +import net.ccbluex.liquidbounce.render.engine.Color4b +import net.ccbluex.liquidbounce.utils.client.toDegrees +import net.ccbluex.liquidbounce.utils.kotlin.mapArray +import net.ccbluex.liquidbounce.utils.math.minus +import net.minecraft.entity.LivingEntity +import java.awt.Color +import kotlin.math.atan2 + +object ModulePointerESP : Module("PointerESP", Category.RENDER) { + + override val translationBaseKey: String + get() = "liquidbounce.module.pointerEsp" + + private val modes = choices("ColorMode", 0) { + arrayOf( + DistanceColor, + GenericEntityHealthColorMode(it), + GenericEntityTeamColorMode(it, Color4b.WHITE), + GenericStaticColorMode(it, Color4b.WHITE), + ) + } + + private object DistanceColor : GenericColorMode("Distance") { + override val parent: ChoiceConfigurable<*> + get() = modes + + private val gradientRange by floatRange("GradientRange", 8f..48f, 0f..256f) + private val saturation by float("Saturation", 1f, 0f..1f) + private val brightness by float("Brightness", 1f, 0f..1f) + + override fun getColor(param: LivingEntity): Color4b { + val hue = (param.distanceTo(player).coerceIn(gradientRange) - gradientRange.start) / (gradientRange.endInclusive - gradientRange.start) / 3f + return Color4b(Color.getHSBColor(hue, saturation, brightness)) // Red to Green + } + } + + private val renderRadius by int("RenderRadius", 150, 0..1000) + + private val pitchLimit by floatRange("PitchLimit", 30f..90f, 0f..90f).onChanged { + negativePitchLimit = -it.endInclusive..-it.start + } + + private var negativePitchLimit: ClosedFloatingPointRange = -pitchLimit.endInclusive..-pitchLimit.start + + private var prevRotateX = 0f + + val renderHandler = handler { event -> + val rotateX = player.pitch.let { p -> + when { + p in -pitchLimit.start..pitchLimit.start -> prevRotateX // keep prev + p < 0 -> 90f + p.coerceIn(negativePitchLimit) + else -> 90f + p.coerceIn(pitchLimit) + } + } + + val pointers = ModuleESP.findRenderedEntities().mapArray { + val diff = it.pos - player.pos + + val angle = (player.yaw - 90f - atan2(diff.z, diff.x).toFloat().toDegrees()).let { theta -> + if (mc.options.perspective.isFrontView) -theta + else theta + } + + PointerInfoEvent.Pointer( + renderRadius, + modes.activeChoice.getColor(it).toHex(alpha = true), + rotateX, + angle + ) + } + + EventManager.callEvent(PointerInfoEvent(pointers)) + + prevRotateX = rotateX + } + + override fun disable() { + EventManager.callEvent(PointerInfoEvent(null)) + prevRotateX = 0f + } + +} diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/integration/theme/component/ComponentType.kt b/src/main/kotlin/net/ccbluex/liquidbounce/integration/theme/component/ComponentType.kt index b022e3aa1b8..b071b34573d 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/integration/theme/component/ComponentType.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/integration/theme/component/ComponentType.kt @@ -51,6 +51,7 @@ enum class ComponentType( MINIMAP("Minimap", createComponent = { MinimapComponent }), TARGET_HUD("TargetHud"), BLOCK_COUNTER("BlockCounter"), + POINTER_ESP("PointerESP"), KEYSTROKES("Keystrokes"), TACO("Taco"); diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt b/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt index 6d424f6cf48..db26025c203 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt @@ -2,6 +2,7 @@ package net.ccbluex.liquidbounce.render import net.ccbluex.liquidbounce.config.Choice import net.ccbluex.liquidbounce.config.ChoiceConfigurable +import net.ccbluex.liquidbounce.features.module.modules.misc.ModuleTeams import net.ccbluex.liquidbounce.render.engine.Color4b import net.ccbluex.liquidbounce.render.utils.rainbow import net.ccbluex.liquidbounce.utils.entity.getActualHealth @@ -44,6 +45,17 @@ class MapColorMode( } +class GenericEntityTeamColorMode( + override val parent: ChoiceConfigurable<*>, + fallbackColor: Color4b +) : GenericColorMode("Team") { + + private val fallback by color("FallbackColor", fallbackColor) + + override fun getColor(param: LivingEntity): Color4b { + return ModuleTeams.getTeamColor(param) ?: fallback + } +} class GenericEntityHealthColorMode( override val parent: ChoiceConfigurable<*> From 530ee90191d85294f70eb3b9d978f7bb86f3bd58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Sun, 17 Nov 2024 00:38:16 +0800 Subject: [PATCH 2/3] detekt --- .../module/modules/render/ModulePointerESP.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt index 0eee9a62386..aea5c4bd413 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt @@ -7,7 +7,10 @@ import net.ccbluex.liquidbounce.event.events.PointerInfoEvent import net.ccbluex.liquidbounce.event.handler import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.Module -import net.ccbluex.liquidbounce.render.* +import net.ccbluex.liquidbounce.render.GenericColorMode +import net.ccbluex.liquidbounce.render.GenericEntityHealthColorMode +import net.ccbluex.liquidbounce.render.GenericEntityTeamColorMode +import net.ccbluex.liquidbounce.render.GenericStaticColorMode import net.ccbluex.liquidbounce.render.engine.Color4b import net.ccbluex.liquidbounce.utils.client.toDegrees import net.ccbluex.liquidbounce.utils.kotlin.mapArray @@ -39,7 +42,8 @@ object ModulePointerESP : Module("PointerESP", Category.RENDER) { private val brightness by float("Brightness", 1f, 0f..1f) override fun getColor(param: LivingEntity): Color4b { - val hue = (param.distanceTo(player).coerceIn(gradientRange) - gradientRange.start) / (gradientRange.endInclusive - gradientRange.start) / 3f + val length = gradientRange.endInclusive - gradientRange.start + val hue = (param.distanceTo(player).coerceIn(gradientRange) - gradientRange.start) / length / 3f return Color4b(Color.getHSBColor(hue, saturation, brightness)) // Red to Green } } @@ -67,8 +71,11 @@ object ModulePointerESP : Module("PointerESP", Category.RENDER) { val diff = it.pos - player.pos val angle = (player.yaw - 90f - atan2(diff.z, diff.x).toFloat().toDegrees()).let { theta -> - if (mc.options.perspective.isFrontView) -theta - else theta + if (mc.options.perspective.isFrontView) { + -theta + } else { + theta + } } PointerInfoEvent.Pointer( From 364c56f8deae40ac13433b66c7cf08d877db05f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Sun, 17 Nov 2024 10:56:26 +0800 Subject: [PATCH 3/3] remove TeamColor mode --- .../module/modules/render/ModulePointerESP.kt | 2 -- .../liquidbounce/render/RenderConfigurables.kt | 12 ------------ 2 files changed, 14 deletions(-) diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt index aea5c4bd413..a72d90452de 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/features/module/modules/render/ModulePointerESP.kt @@ -9,7 +9,6 @@ import net.ccbluex.liquidbounce.features.module.Category import net.ccbluex.liquidbounce.features.module.Module import net.ccbluex.liquidbounce.render.GenericColorMode import net.ccbluex.liquidbounce.render.GenericEntityHealthColorMode -import net.ccbluex.liquidbounce.render.GenericEntityTeamColorMode import net.ccbluex.liquidbounce.render.GenericStaticColorMode import net.ccbluex.liquidbounce.render.engine.Color4b import net.ccbluex.liquidbounce.utils.client.toDegrees @@ -28,7 +27,6 @@ object ModulePointerESP : Module("PointerESP", Category.RENDER) { arrayOf( DistanceColor, GenericEntityHealthColorMode(it), - GenericEntityTeamColorMode(it, Color4b.WHITE), GenericStaticColorMode(it, Color4b.WHITE), ) } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt b/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt index db26025c203..192df3dbb44 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/render/RenderConfigurables.kt @@ -45,18 +45,6 @@ class MapColorMode( } -class GenericEntityTeamColorMode( - override val parent: ChoiceConfigurable<*>, - fallbackColor: Color4b -) : GenericColorMode("Team") { - - private val fallback by color("FallbackColor", fallbackColor) - - override fun getColor(param: LivingEntity): Color4b { - return ModuleTeams.getTeamColor(param) ?: fallback - } -} - class GenericEntityHealthColorMode( override val parent: ChoiceConfigurable<*> ) : GenericColorMode("Health") {