Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Packet/SpoofGround/PacketJump NoFall): Blink #5626

Open
wants to merge 5 commits into
base: nextgen
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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 @@ -20,14 +20,23 @@

import net.ccbluex.liquidbounce.config.types.Choice
import net.ccbluex.liquidbounce.config.types.ChoiceConfigurable
import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable
import net.ccbluex.liquidbounce.event.events.QueuePacketEvent
import net.ccbluex.liquidbounce.event.events.TransferOrigin
import net.ccbluex.liquidbounce.event.handler
import net.ccbluex.liquidbounce.event.tickHandler
import net.ccbluex.liquidbounce.features.module.modules.player.ModuleBlink
import net.ccbluex.liquidbounce.features.module.modules.player.nofall.ModuleNoFall
import net.ccbluex.liquidbounce.utils.client.MovePacketType
import net.ccbluex.liquidbounce.utils.client.PacketQueueManager
import net.ccbluex.liquidbounce.utils.client.PacketQueueManager.Action
import net.ccbluex.liquidbounce.utils.entity.SimulatedPlayer
import net.ccbluex.liquidbounce.utils.movement.DirectionalInput
import net.minecraft.entity.attribute.EntityAttributes

internal object NoFallPacket : Choice("Packet") {
private val packetType by enumChoice("PacketType", MovePacketType.FULL)
private val filter = choices("Filter", FallDistance, arrayOf(FallDistance, Always))
private val filter = choices("Filter", Filter.FallDistance, arrayOf(Filter.FallDistance, Filter.Always))

override val parent: ChoiceConfigurable<*>
get() = ModuleNoFall.modes
Expand All @@ -38,9 +47,7 @@
onGround = true
})

if (filter.activeChoice is FallDistance && FallDistance.resetFallDistance) {
player.onLanding()
}
filter.activeChoice.onPacket()
}
}

Expand All @@ -49,34 +56,92 @@
get() = filter

abstract val isActive: Boolean
}
open fun onPacket() {}

private object FallDistance : Filter("FallDistance") {
override val isActive: Boolean
get() = player.fallDistance - player.velocity.y > distance.activeChoice.value && player.age > 20
object FallDistance : Filter("FallDistance") {
override val isActive
get() = player.fallDistance - (if (resetFallDistance) packetFallDistance else 0f) - player.velocity.y >= distance.activeChoice.value && player.age > 20

private val distance = choices("Distance", Smart, arrayOf(Smart, Constant))
val resetFallDistance by boolean("ResetFallDistance", true)
private val distance = choices("Distance", DistanceMode.Smart, arrayOf(DistanceMode.Smart, DistanceMode.Constant))
val resetFallDistance by boolean("ResetFallDistance", true)
object Blink : ToggleableConfigurable(this, "Blink", false) {
val disableOnSpoof by boolean("DisableOnSpoof", false)
private val predictionTicks by int("PredictionTicks", 10, 1..30)

private abstract class DistanceMode(name: String) : Choice(name) {
override val parent: ChoiceConfigurable<*>
get() = distance
@Suppress("unused")
private val blinkHandler = handler<QueuePacketEvent> { event ->
if (event.origin != TransferOrigin.SEND || player.isOnGround || player.age <= 20) {
return@handler
}

abstract val value: Float
}
if (player.fallDistance >= distance.activeChoice.value && player.age > 20) {
event.action = Action.QUEUE
return@handler
}

private object Smart : DistanceMode("Smart") {
override val value: Float
get() = player.getAttributeValue(EntityAttributes.SAFE_FALL_DISTANCE).toFloat()
}
val simulatedPlayer = SimulatedPlayer.fromClientPlayer(
SimulatedPlayer.SimulatedPlayerInput(
DirectionalInput(player.input),
player.input.playerInput.jump,
player.isSprinting,
true
)
)

for (i in 0..predictionTicks) {
simulatedPlayer.tick()
if (simulatedPlayer.fallDistance >= distance.activeChoice.value) {
event.action = Action.QUEUE
return@handler
}
}
}
}

init { tree(Blink) }

private var lastFallDistance = 0f
private var packetFallDistance = 0f

override fun onPacket() {
packetFallDistance = player.fallDistance

if (Blink.running && Blink.disableOnSpoof && !ModuleBlink.running) {
PacketQueueManager.flush { snapshot -> snapshot.origin == TransferOrigin.SEND }
}
}

val repeatable = tickHandler {
if (lastFallDistance > 0 && player.isOnGround) {
packetFallDistance = 0f
if (Blink.running && !ModuleBlink.running) {
PacketQueueManager.flush { snapshot -> snapshot.origin == TransferOrigin.SEND }
}
}

lastFallDistance = player.fallDistance
}

private abstract class DistanceMode(name: String) : Choice(name) {
override val parent: ChoiceConfigurable<*>
get() = distance

private object Constant : DistanceMode("Constant") {
override val value by float("Value", 2f, 0f..5f)
abstract val value: Float

object Smart : DistanceMode("Smart") {
override val value: Float
get() = player.getAttributeValue(EntityAttributes.SAFE_FALL_DISTANCE).toFloat()
}

object Constant : DistanceMode("Constant") {
override val value by float("Value", 2f, 0f..5f)
}
}
}
}

private object Always : Filter("Always") {
override val isActive: Boolean
get() = true
object Always : Filter("Always") {
override val isActive
get() = true
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,47 @@

import net.ccbluex.liquidbounce.config.types.Choice
import net.ccbluex.liquidbounce.config.types.ChoiceConfigurable
import net.ccbluex.liquidbounce.config.types.ToggleableConfigurable
import net.ccbluex.liquidbounce.event.events.PacketEvent
import net.ccbluex.liquidbounce.event.events.PlayerTickEvent
import net.ccbluex.liquidbounce.event.events.QueuePacketEvent
import net.ccbluex.liquidbounce.event.events.TransferOrigin
import net.ccbluex.liquidbounce.event.handler
import net.ccbluex.liquidbounce.event.tickHandler
import net.ccbluex.liquidbounce.features.module.modules.player.ModuleBlink
import net.ccbluex.liquidbounce.features.module.modules.player.nofall.ModuleNoFall
import net.ccbluex.liquidbounce.utils.client.MovePacketType
import net.ccbluex.liquidbounce.utils.client.PacketQueueManager
import net.ccbluex.liquidbounce.utils.client.PacketQueueManager.Action
import net.ccbluex.liquidbounce.utils.entity.SimulatedPlayer
import net.ccbluex.liquidbounce.utils.movement.DirectionalInput
import net.minecraft.entity.attribute.EntityAttributes
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket

internal object NoFallPacketJump : Choice("PacketJump") {
private val packetType by enumChoice("PacketType", MovePacketType.FULL,
arrayOf(MovePacketType.FULL, MovePacketType.POSITION_AND_ON_GROUND))
private val fallDistance = choices("FallDistance", Smart, arrayOf(Smart, Constant))
private val timing = choices("Timing", Landing, arrayOf(Landing, Falling))
private val fallDistance = choices("FallDistance", DistanceMode.Smart, arrayOf(DistanceMode.Smart, DistanceMode.Constant))
private val timing = choices("Timing", Timing.Landing, arrayOf(Timing.Landing, Timing.Falling))

private var falling = false

override val parent: ChoiceConfigurable<*>
get() = ModuleNoFall.modes

val tickHandler = handler<PlayerTickEvent> {
falling = player.fallDistance > fallDistance.activeChoice.value
if (timing.activeChoice is Falling && !player.isOnGround && falling) {
falling = player.fallDistance - (if (timing.activeChoice is Timing.Falling && Timing.Falling.resetFallDistance) Timing.Falling.packetFallDistance else 0f) >= fallDistance.activeChoice.value
if (timing.activeChoice is Timing.Falling && !player.isOnGround && falling) {
network.sendPacket(packetType.generatePacket().apply {
y += 1.0E-9
})
if (Falling.resetFallDistance) {
player.onLanding()
}

Timing.Falling.onPacket()
}
}

val packetHandler = handler<PacketEvent> { event ->
if (timing.activeChoice is Landing && event.packet is PlayerMoveC2SPacket && event.packet.onGround && falling) {
if (timing.activeChoice is Timing.Landing && event.packet is PlayerMoveC2SPacket && event.packet.onGround && falling) {
falling = false
network.sendPacket(packetType.generatePacket().apply {
x = player.lastX
Expand All @@ -45,31 +53,87 @@
}
}

private object Landing : Choice("Landing") {
private abstract class Timing(name: String) : Choice(name) {
override val parent: ChoiceConfigurable<*>
get() = timing
}

private object Falling : Choice("Falling") {
override val parent: ChoiceConfigurable<*>
get() = timing
object Landing : Timing("Landing")

object Falling : Timing("Falling") {
val resetFallDistance by boolean("ResetFallDistance", true)
object Blink : ToggleableConfigurable(this, "Blink", false) {
val disableOnSpoof by boolean("DisableOnSpoof", false)
private val predictionTicks by int("PredictionTicks", 10, 1..30)

@Suppress("unused")
private val blinkHandler = handler<QueuePacketEvent> { event ->
if (event.origin != TransferOrigin.SEND || player.isOnGround || player.age <= 20) {
return@handler
}

if (player.fallDistance >= fallDistance.activeChoice.value && player.age > 20) {
event.action = Action.QUEUE
return@handler
}

val simulatedPlayer = SimulatedPlayer.fromClientPlayer(
SimulatedPlayer.SimulatedPlayerInput(
DirectionalInput(player.input),
player.input.playerInput.jump,
player.isSprinting,
true
)
)

for (i in 0..predictionTicks) {
simulatedPlayer.tick()
if (simulatedPlayer.fallDistance >= fallDistance.activeChoice.value) {
event.action = Action.QUEUE
return@handler
}
}
}
}

init { tree(Blink) }

val resetFallDistance by boolean("ResetFallDistance", true)
private var lastFallDistance = 0f
var packetFallDistance = 0f

fun onPacket() {
packetFallDistance = player.fallDistance

if (Blink.running && Blink.disableOnSpoof && !ModuleBlink.running) {
PacketQueueManager.flush { snapshot -> snapshot.origin == TransferOrigin.SEND }
}
}

val repeatable = tickHandler {
if (lastFallDistance > 0 && player.isOnGround) {
packetFallDistance = 0f
if (Blink.running && !ModuleBlink.running) {
PacketQueueManager.flush { snapshot -> snapshot.origin == TransferOrigin.SEND }
}
}

lastFallDistance = player.fallDistance
}
}
}

private abstract class DistanceMode(name: String) : Choice(name) {
override val parent: ChoiceConfigurable<*>
get() = fallDistance

abstract val value: Float
}

private object Smart : DistanceMode("Smart") {
override val value: Float
get() = player.getAttributeValue(EntityAttributes.SAFE_FALL_DISTANCE).toFloat()
}
object Smart : DistanceMode("Smart") {
override val value
get() = player.getAttributeValue(EntityAttributes.SAFE_FALL_DISTANCE).toFloat()
}

private object Constant : DistanceMode("Constant") {
override val value by float("Value", 3f, 0f..5f)
object Constant : DistanceMode("Constant") {
override val value by float("Value", 3f, 0f..5f)
}
}
}
Loading
Loading