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") {