Skip to content

Commit

Permalink
feats(legacy): Improved SimulateShortStop option, fixed InventoryMove…
Browse files Browse the repository at this point in the history
… breaking rotations. (CCBlueX#4056)

* Also recoded RotationRecorder in a way that will produce an image of rotation graphs instead.

* Fixed inventory-based modules making rotations not rotate.
  • Loading branch information
mems01 authored Oct 4, 2024
1 parent f8c1f0b commit 8403166
Show file tree
Hide file tree
Showing 16 changed files with 199 additions and 112 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ dependencies {
include "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"

include fileTree(include: ["*.jar"], dir: "libs")
implementation("org.knowm.xchart:xchart:3.8.0")

}

shadowJar {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import net.ccbluex.liquidbounce.features.module.modules.player.Reach
import net.ccbluex.liquidbounce.utils.EntityUtils.isSelected
import net.ccbluex.liquidbounce.utils.RotationUtils
import net.ccbluex.liquidbounce.utils.RotationUtils.coerceBodyPoint
import net.ccbluex.liquidbounce.utils.RotationUtils.getRotationDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.isFaced
import net.ccbluex.liquidbounce.utils.RotationUtils.limitAngleChange
import net.ccbluex.liquidbounce.utils.RotationUtils.rotationDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.searchCenter
import net.ccbluex.liquidbounce.utils.RotationUtils.toRotation
import net.ccbluex.liquidbounce.utils.SimulatedPlayer
Expand Down Expand Up @@ -122,7 +122,7 @@ object Aimbot : Module("Aimbot", Category.COMBAT, hideModule = false) {
result = isSelected(it, true)
&& thePlayer.canEntityBeSeen(it)
&& thePlayer.getDistanceToEntityBox(it) <= range
&& getRotationDifference(it) <= fov
&& rotationDifference(it) <= fov
}

result
Expand Down Expand Up @@ -210,7 +210,7 @@ object Aimbot : Module("Aimbot", Category.COMBAT, hideModule = false) {
}

// Figure out the best turn speed suitable for the distance and configured turn speed
val rotationDiff = getRotationDifference(playerRotation, destinationRotation)
val rotationDiff = rotationDifference(playerRotation, destinationRotation)

// is enemy visible to player on screen. Fov is about to be right with that you can actually see on the screen. Still not 100% accurate, but it is fast check.
val supposedTurnSpeed = if (rotationDiff < mc.gameSettings.fovSetting) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.utils.EntityUtils.isSelected
import net.ccbluex.liquidbounce.utils.Rotation
import net.ccbluex.liquidbounce.utils.RotationUtils.faceTrajectory
import net.ccbluex.liquidbounce.utils.RotationUtils.getRotationDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.rotationDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.setTargetRotation
import net.ccbluex.liquidbounce.utils.extensions.getDistanceToEntityBox
import net.ccbluex.liquidbounce.utils.render.RenderUtils.drawPlatform
Expand Down Expand Up @@ -147,7 +147,7 @@ object BowAimbot : Module("BowAimbot", Category.COMBAT, hideModule = false) {

return when (priorityMode.uppercase()) {
"DISTANCE" -> targets.minByOrNull { mc.thePlayer.getDistanceToEntityBox(it) }
"DIRECTION" -> targets.minByOrNull { getRotationDifference(it) }
"DIRECTION" -> targets.minByOrNull { rotationDifference(it) }
"HEALTH" -> targets.minByOrNull { (it as EntityLivingBase).health }
else -> null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@
package net.ccbluex.liquidbounce.features.module.modules.combat

import net.ccbluex.liquidbounce.event.*
import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.features.module.Category
import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.features.module.modules.player.Blink
import net.ccbluex.liquidbounce.features.module.modules.world.scaffolds.*
import net.ccbluex.liquidbounce.features.module.modules.world.scaffolds.Scaffold
import net.ccbluex.liquidbounce.features.module.modules.world.scaffolds.Tower
import net.ccbluex.liquidbounce.injection.implementations.IMixinEntity
import net.ccbluex.liquidbounce.utils.PacketUtils.sendPacket
import net.ccbluex.liquidbounce.utils.Rotation
import net.ccbluex.liquidbounce.utils.RotationUtils
import net.ccbluex.liquidbounce.utils.extensions.*
import net.ccbluex.liquidbounce.utils.render.ColorUtils.rainbow
import net.ccbluex.liquidbounce.utils.render.RenderUtils.glColor
Expand Down Expand Up @@ -155,9 +154,6 @@ object FakeLag : Module("FakeLag", Category.COMBAT, gameDetecting = false, hideM
synchronized(positions) {
positions[packetPos] = System.currentTimeMillis()
}
if (packet.rotating) {
RotationUtils.serverRotation = Rotation(packet.yaw, packet.pitch)
}
}
synchronized(packetQueue) {
packetQueue[packet] = System.currentTimeMillis()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ import net.ccbluex.liquidbounce.utils.PacketUtils.sendPackets
import net.ccbluex.liquidbounce.utils.RaycastUtils.raycastEntity
import net.ccbluex.liquidbounce.utils.RaycastUtils.runWithModifiedRaycastResult
import net.ccbluex.liquidbounce.utils.RotationUtils.currentRotation
import net.ccbluex.liquidbounce.utils.RotationUtils.getRotationDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.getVectorForRotation
import net.ccbluex.liquidbounce.utils.RotationUtils.isRotationFaced
import net.ccbluex.liquidbounce.utils.RotationUtils.isVisible
import net.ccbluex.liquidbounce.utils.RotationUtils.rotationDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.searchCenter
import net.ccbluex.liquidbounce.utils.RotationUtils.setTargetRotation
import net.ccbluex.liquidbounce.utils.RotationUtils.toRotation
Expand Down Expand Up @@ -585,7 +585,7 @@ object KillAura : Module("KillAura", Category.COMBAT, Keyboard.KEY_R, hideModule
// Can humans keep click consistency when performing massive rotation changes?
// (10-30 rotation difference/doing large mouse movements for example)
// Maybe apply to attacks too?
if (getRotationDifference(rotation) > maxRotationDifferenceToSwing) {
if (rotationDifference(rotation) > maxRotationDifferenceToSwing) {
// At the same time there is also a chance of the user clicking at least once in a while
// when the consistency has dropped a lot.
val shouldIgnore = swingWhenTicksLate.isActive() && ticksSinceClick() >= ticksLateToSwing
Expand Down Expand Up @@ -710,7 +710,7 @@ object KillAura : Module("KillAura", Category.COMBAT, Keyboard.KEY_R, hideModule
}
}

val entityFov = getRotationDifference(entity)
val entityFov = rotationDifference(entity)

if (distance <= maxRange && (fov == 180F || entityFov <= fov)) {
if (switchMode && isLookingOnEntities(entity, maxSwitchFOV.toDouble()) || !switchMode) {
Expand All @@ -737,7 +737,7 @@ object KillAura : Module("KillAura", Category.COMBAT, Keyboard.KEY_R, hideModule
var result = 0f

Backtrack.runWithNearestTrackedDistance(it) {
result = getRotationDifference(it) // Sort by FOV
result = rotationDifference(it) // Sort by FOV
}

result
Expand Down Expand Up @@ -1256,7 +1256,7 @@ object KillAura : Module("KillAura", Category.COMBAT, Keyboard.KEY_R, hideModule

val rotationToPlayer = toRotation(mc.thePlayer.hitBox.center, true, target!!)

if (getRotationDifference(rotationToPlayer, target!!.rotation) > maxDirectionDiff)
if (rotationDifference(rotationToPlayer, target!!.rotation) > maxDirectionDiff)
return false

if (target!!.swingProgressInt > maxSwingProgress) return false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.utils.MovementUtils.isMoving
import net.ccbluex.liquidbounce.utils.PacketUtils.sendPacket
import net.ccbluex.liquidbounce.utils.PacketUtils.sendPackets
import net.ccbluex.liquidbounce.utils.RotationUtils.getAngleDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.angleDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.toRotation
import net.ccbluex.liquidbounce.utils.extensions.*
import net.ccbluex.liquidbounce.utils.misc.RandomUtils
Expand Down Expand Up @@ -109,7 +109,7 @@ object SuperKnockback : Module("SuperKnockback", Category.COMBAT, hideModule = f
val distance = player.getDistanceToEntityBox(target)

val rotationToPlayer = toRotation(player.hitBox.center, false, target).fixedSensitivity().yaw
val angleDifferenceToPlayer = abs(getAngleDifference(rotationToPlayer, target.rotationYaw))
val angleDifferenceToPlayer = abs(angleDifference(rotationToPlayer, target.rotationYaw))

if (event.targetEntity.hurtTime > hurtTime || !timer.hasTimePassed(delay) || onlyGround && !player.onGround || RandomUtils.nextInt(
endExclusive = 100
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import net.ccbluex.liquidbounce.value.ListValue
import net.minecraft.entity.player.EntityPlayer

object NoRotateSet : Module("NoRotateSet", Category.MISC, gameDetecting = false, hideModule = false) {
var savedRotation = Rotation(0f, 0f)
var savedRotation = Rotation.ZERO

private val ignoreOnSpawn by BoolValue("IgnoreOnSpawn", false)
val affectRotation by BoolValue("AffectRotation", true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,73 +5,124 @@
*/
package net.ccbluex.liquidbounce.features.module.modules.misc

import net.ccbluex.liquidbounce.LiquidBounce.CLIENT_NAME
import net.ccbluex.liquidbounce.LiquidBounce.MINECRAFT_VERSION
import net.ccbluex.liquidbounce.event.EventState
import net.ccbluex.liquidbounce.event.EventTarget
import net.ccbluex.liquidbounce.event.MotionEvent
import net.ccbluex.liquidbounce.features.module.Category
import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.script.api.global.Chat
import net.ccbluex.liquidbounce.utils.ClientUtils
import net.ccbluex.liquidbounce.utils.Rotation
import net.ccbluex.liquidbounce.utils.RotationUtils.getAngleDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.lastServerRotation
import net.ccbluex.liquidbounce.utils.ClientUtils.runTimeTicks
import net.ccbluex.liquidbounce.utils.RotationUtils.angleDifference
import net.ccbluex.liquidbounce.utils.RotationUtils.lastRotations
import net.ccbluex.liquidbounce.utils.RotationUtils.serverRotation
import java.io.BufferedWriter
import net.ccbluex.liquidbounce.value.BoolValue
import org.knowm.xchart.BitmapEncoder
import org.knowm.xchart.XYChart
import org.knowm.xchart.XYSeries
import org.lwjgl.opengl.Display
import java.io.File
import java.io.FileWriter
import java.io.IOException
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import kotlin.math.absoluteValue

object RotationRecorder : Module("RotationRecorder", Category.MISC) {

private val rotationList: MutableList<Pair<Rotation, Int>> = mutableListOf()
private val captureNegativeNumbers by BoolValue("CaptureNegativeNumbers", false)

private val ticks = mutableListOf<Double>()
private val yawDiffs = mutableListOf<Double>()
private val pitchDiffs = mutableListOf<Double>()

private var chart: XYChart? = null
private var failed = false

override fun onEnable() {
rotationList.clear()
updateRecordInfo(true)

try {
chart = XYChart(Display.getWidth(), Display.getHeight()).apply {
title = "Yaw and Pitch Differences Over Time"
xAxisTitle = "Time (ticks)"
yAxisTitle = "Differences (degrees)"

// Add series to the chart
addSeries("Yaw Differences", ticks.toDoubleArray(), yawDiffs.toDoubleArray()).apply {
xySeriesRenderStyle = XYSeries.XYSeriesRenderStyle.Line
lineColor = java.awt.Color.BLUE // Set yaw line color to blue
}

addSeries("Pitch Differences", ticks.toDoubleArray(), pitchDiffs.toDoubleArray()).apply {
xySeriesRenderStyle = XYSeries.XYSeriesRenderStyle.Line
lineColor = java.awt.Color.RED // Set pitch line color to red
}
}
} catch (e: Exception) {
e.printStackTrace()
Chat.print("Failed to start recording rotations, disabling module")
TickScheduler += {
failed = true
state = false
}

return
}

Chat.print("Started recording rotations.")
}

@EventTarget
fun onMotion(event: MotionEvent) {
if (event.eventState != EventState.POST)
if (event.eventState != EventState.POST || failed)
return

rotationList.add(Rotation(getAngleDifference(serverRotation.yaw, lastServerRotation.yaw),
getAngleDifference(serverRotation.pitch, lastServerRotation.pitch)
) to ClientUtils.runTimeTicks
)
updateRecordInfo()

// Update the series with new data
chart?.updateXYSeries("Yaw Differences", ticks.toDoubleArray(), yawDiffs.toDoubleArray(), null)
chart?.updateXYSeries("Pitch Differences", ticks.toDoubleArray(), pitchDiffs.toDoubleArray(), null)
}

override fun onDisable() {
val currentDateTime = LocalDateTime.now()
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")
val formattedDateTime = currentDateTime.format(formatter)
if (!failed) {
val currentDateTime = LocalDateTime.now()
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")
val formattedDateTime = currentDateTime.format(formatter)

saveChart("rotations_$formattedDateTime.png", mc.mcDataDir)
}

writeToFile("rotations_$formattedDateTime.txt", rotationList)
failed = false
ticks.clear()
yawDiffs.clear()
pitchDiffs.clear()
}

private fun writeToFile(fileName: String, content: List<Pair<Rotation, Int>>) {
// Get the Minecraft directory
val mcDir = File(mc.mcDataDir, "$CLIENT_NAME-$MINECRAFT_VERSION")
// Create the file object in the Minecraft directory
private fun saveChart(fileName: String, mcDir: File) {
val file = File(mcDir, fileName)

// Save the chart as an image
try {
BufferedWriter(FileWriter(file)).use { writer ->
content.forEach {
writer.write("YAW: ${it.first.yaw}, PITCH: ${it.first.pitch} in tick ${it.second}")
writer.newLine()
}
writer.flush()
}
BitmapEncoder.saveBitmap(chart, file.absolutePath, BitmapEncoder.BitmapFormat.PNG)
} catch (e: IOException) {
e.printStackTrace()
} finally {
Chat.print("Saved as $fileName in $mcDir")
}
}

private fun updateRecordInfo(wasPreviousTick: Boolean = false) {
var yawDiff = angleDifference(serverRotation.yaw, lastRotations[1].yaw)
var pitchDiff = angleDifference(serverRotation.pitch, lastRotations[1].pitch)

if (!captureNegativeNumbers) {
yawDiff = yawDiff.absoluteValue
pitchDiff = pitchDiff.absoluteValue
}

ticks.add(runTimeTicks.toDouble() - if (wasPreviousTick) 1 else 0)
yawDiffs.add(yawDiff.toDouble())
pitchDiffs.add(pitchDiff.toDouble())
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,14 @@
*/
package net.ccbluex.liquidbounce.features.module.modules.movement

import net.ccbluex.liquidbounce.event.ClickWindowEvent
import net.ccbluex.liquidbounce.event.EventTarget
import net.ccbluex.liquidbounce.event.JumpEvent
import net.ccbluex.liquidbounce.event.StrafeEvent
import net.ccbluex.liquidbounce.event.UpdateEvent
import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.event.*
import net.ccbluex.liquidbounce.features.module.Category
import net.ccbluex.liquidbounce.features.module.Module
import net.ccbluex.liquidbounce.ui.client.clickgui.ClickGui
import net.ccbluex.liquidbounce.ui.client.hud.designer.GuiHudDesigner
import net.ccbluex.liquidbounce.utils.inventory.InventoryManager
import net.ccbluex.liquidbounce.utils.inventory.InventoryManager.canClickInventory
import net.ccbluex.liquidbounce.utils.inventory.InventoryManager.hasScheduledInLastLoop
import net.ccbluex.liquidbounce.utils.inventory.InventoryUtils.serverOpenInventory
import net.ccbluex.liquidbounce.value.BoolValue
import net.minecraft.client.gui.GuiChat
Expand All @@ -39,12 +36,13 @@ object InventoryMove : Module("InventoryMove", Category.MOVEMENT, gameDetecting
private val noMoveGround by InventoryManager.noMoveGroundValue
private val undetectable by InventoryManager.undetectableValue

// If player violates nomove check and inventory is open, close inventory and reopen it when still
private val silentlyCloseAndReopen by BoolValue("SilentlyCloseAndReopen", false)
{ noMove && (noMoveAir || noMoveGround) }
// Reopen closed inventory just before a click (could flag for clicking too fast after opening inventory)
private val reopenOnClick by BoolValue("ReopenOnClick", false)
{ silentlyCloseAndReopen && noMove && (noMoveAir || noMoveGround) }
// If player violates nomove check and inventory is open, close inventory and reopen it when still
private val silentlyCloseAndReopen by BoolValue("SilentlyCloseAndReopen", false)
{ noMove && (noMoveAir || noMoveGround) }

// Reopen closed inventory just before a click (could flag for clicking too fast after opening inventory)
private val reopenOnClick by BoolValue("ReopenOnClick", false)
{ silentlyCloseAndReopen && noMove && (noMoveAir || noMoveGround) }

private val affectedBindings = arrayOf(
mc.gameSettings.keyBindForward,
Expand Down Expand Up @@ -90,11 +88,14 @@ object InventoryMove : Module("InventoryMove", Category.MOVEMENT, gameDetecting
fun onJump(event: JumpEvent) {
if (isIntave) event.cancelEvent()
}

@EventTarget
fun onClick(event: ClickWindowEvent) {
if (!canClickInventory()) event.cancelEvent()
else if (reopenOnClick) serverOpenInventory = true
else if (reopenOnClick) {
hasScheduledInLastLoop = false
serverOpenInventory = true
}
}

override fun onDisable() {
Expand Down
Loading

0 comments on commit 8403166

Please sign in to comment.