Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
*/
package net.ccbluex.liquidbounce.features.module.modules.movement

import net.ccbluex.liquidbounce.config.types.NamedChoice
import net.ccbluex.liquidbounce.config.types.nesting.Choice
import net.ccbluex.liquidbounce.config.types.nesting.ChoiceConfigurable
import net.ccbluex.liquidbounce.config.types.NamedChoice
import net.ccbluex.liquidbounce.config.types.nesting.NoneChoice
import net.ccbluex.liquidbounce.event.events.MovementInputEvent
import net.ccbluex.liquidbounce.event.events.PlayerSafeWalkEvent
Expand All @@ -30,11 +30,9 @@ import net.ccbluex.liquidbounce.features.module.ClientModule
import net.ccbluex.liquidbounce.features.module.modules.render.ModuleDebug
import net.ccbluex.liquidbounce.features.module.modules.render.ModuleDebug.debugGeometry
import net.ccbluex.liquidbounce.features.module.modules.render.ModuleDebug.debugParameter
import net.ccbluex.liquidbounce.features.module.modules.world.scaffold.ModuleScaffold
import net.ccbluex.liquidbounce.render.engine.type.Color4b
import net.ccbluex.liquidbounce.utils.entity.PlayerSimulationCache
import net.ccbluex.liquidbounce.utils.entity.isCloseToEdge
import net.ccbluex.liquidbounce.utils.entity.sqrtSpeed
import net.ccbluex.liquidbounce.utils.entity.wouldBeCloseToFallOff
import net.ccbluex.liquidbounce.utils.entity.*
import net.ccbluex.liquidbounce.utils.kotlin.EventPriorityConvention
import net.ccbluex.liquidbounce.utils.movement.DirectionalInput
import net.ccbluex.liquidbounce.utils.movement.getDegreesRelativeToView
Expand All @@ -49,14 +47,21 @@ import kotlin.math.min
*/
object ModuleSafeWalk : ClientModule("SafeWalk", Category.MOVEMENT) {

@Suppress("UnusedPrivateProperty")
override val running: Boolean
get() =
super.running
&&!ModuleScaffold.running

private val ticksToPredict by int("TicksToPredict", 10, 10..100,"tick")

@Suppress("UnusedPrivateProperty","Unused")
private val modes = choices("Mode", 1, ::safeWalkChoices) // Default safe mode

fun safeWalkChoices(choice: ChoiceConfigurable<Choice>): Array<Choice> {
return arrayOf(
NoneChoice(choice),
OnEdge(choice),
Safe(choice),
OnEdge(choice)
)
}

Expand Down Expand Up @@ -91,14 +96,17 @@ object ModuleSafeWalk : ClientModule("SafeWalk", Category.MOVEMENT) {
private var sneakTicks = 0
private var jump by boolean("Jump", false)


/**
* The input handler tracks the movement of the player and calculates the predicted future position.
*/
@Suppress("unused")
val inputHandler = handler<MovementInputEvent>(
priority = EventPriorityConvention.OBJECTION_AGAINST_EVERYTHING
) { event ->
val shouldBeActive = player.isOnGround && !event.sneak
//Usually 2 ticks are enough,but we have to make sure players are 100% safe.
val nextTick = PlayerSimulationCache.getSimulationForLocalPlayer().getSnapshotAt(ticksToPredict)
val shouldBeActive = player.isOnGround && !event.sneak && isInVoid(nextTick.pos, false)
if (shouldBeActive) {
val isOnEdge = player.isCloseToEdge(
event.directionalInput,
Expand All @@ -109,7 +117,7 @@ object ModuleSafeWalk : ClientModule("SafeWalk", Category.MOVEMENT) {

val center = center
if (center != null) {
val nextTick = PlayerSimulationCache.getSimulationForLocalPlayer().getSnapshotAt(1)

debugGeometry("Center") {
ModuleDebug.DebuggedPoint(center, Color4b.BLUE, 0.05)
}
Expand Down Expand Up @@ -144,6 +152,7 @@ object ModuleSafeWalk : ClientModule("SafeWalk", Category.MOVEMENT) {
event.directionalInput = event.directionalInput.invert()
event.jump = false
}

(mode == Mode.CENTER || player.sqrtSpeed > 0.05) -> {
val center = center ?: player.blockPos.toBottomCenterPos()
val degrees = getDegreesRelativeToView(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import net.ccbluex.liquidbounce.interfaces.ClientPlayerEntityAddition
import net.ccbluex.liquidbounce.interfaces.InputAddition
import net.ccbluex.liquidbounce.utils.aiming.data.Rotation
import net.ccbluex.liquidbounce.utils.block.DIRECTIONS_EXCLUDING_UP
import net.ccbluex.liquidbounce.utils.block.getState
import net.ccbluex.liquidbounce.utils.block.isBlastResistant
import net.ccbluex.liquidbounce.utils.block.raycast
import net.ccbluex.liquidbounce.utils.client.*
Expand Down Expand Up @@ -649,6 +650,40 @@ fun ClientPlayerEntity.getFeetBlockPos(): BlockPos {
)
}

@Suppress("NestedBlockDepth","CognitiveComplexMethod")
fun isInVoid(pos: Vec3d, considerGround: Boolean = true): Boolean {
if (considerGround && player.isOnGround) return false

val xRange = mutableListOf(0)
val zRange = mutableListOf(0)

if (pos.x - floor(pos.x) <= 0.3) {
xRange.add(-1)
} else if (ceil(pos.x) - pos.x <= 0.3) {
xRange.add(1)
}

if (pos.z - floor(pos.z) <= 0.3) {
zRange.add(-1)
} else if (ceil(pos.z) - pos.z <= 0.3) {
zRange.add(1)
}

val topY = floor(pos.y).toInt() - 1

for (xOffset in xRange) {
for (zOffset in zRange) {
for (y in topY downTo -64) {
val blockPos = BlockPos(pos.x.toInt() + xOffset, y, pos.z.toInt() + zOffset)
val state = blockPos.getState()
if (state != null && !state.isAir) return false
}
}
}

return true
}

val LivingEntity.wouldBlockHit
get() = !isOlderThanOrEqual1_8 &&
this.blockedByShield(world.damageSources.playerAttack(player))
Expand Down