Skip to content

Commit 72f88ad

Browse files
committed
Grim TickShift, Blink
1 parent e802a53 commit 72f88ad

File tree

10 files changed

+277
-20
lines changed

10 files changed

+277
-20
lines changed

common/src/main/java/com/lambda/mixin/entity/ClientPlayerEntityMixin.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.lambda.Lambda;
44
import com.lambda.event.EventFlow;
55
import com.lambda.event.events.MovementEvent;
6+
import com.lambda.event.events.TickEvent;
67
import com.lambda.interaction.PlayerPacketManager;
78
import com.lambda.interaction.RotationManager;
89
import net.minecraft.client.input.Input;
@@ -71,6 +72,16 @@ void sendBegin(CallbackInfo ci) {
7172
autoJumpEnabled = Lambda.getMc().options.getAutoJump().getValue();
7273
}
7374

75+
@Inject(method = "tick", at = @At(value = "HEAD"))
76+
void onTickPre(CallbackInfo ci) {
77+
EventFlow.post(new TickEvent.Player.Pre());
78+
}
79+
80+
@Inject(method = "tick", at = @At(value = "RETURN"))
81+
void onTickPost(CallbackInfo ci) {
82+
EventFlow.post(new TickEvent.Player.Post());
83+
}
84+
7485
@Redirect(method = "tickNewAi", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getYaw()F"))
7586
float fixHeldItemYaw(ClientPlayerEntity instance) {
7687
return Objects.requireNonNullElse(RotationManager.getHandYaw(), instance.getYaw());

common/src/main/java/com/lambda/mixin/render/RenderTickCounterMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class RenderTickCounterMixin {
2020

2121
@Inject(method = "beginRenderTick", at = @At("HEAD"), cancellable = true)
2222
private void beginRenderTick(long timeMillis, CallbackInfoReturnable<Integer> ci) {
23-
lastFrameDuration = (timeMillis - prevTimeMillis) / TimerManager.getTickLength();
23+
lastFrameDuration = (timeMillis - prevTimeMillis) / TimerManager.INSTANCE.getLength();
2424
prevTimeMillis = timeMillis;
2525
tickDelta += lastFrameDuration;
2626
int i = (int) tickDelta;

common/src/main/kotlin/com/lambda/core/TimerManager.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ package com.lambda.core
22

33
import com.lambda.event.EventFlow.post
44
import com.lambda.event.events.ClientEvent
5-
import com.lambda.event.events.TickEvent
6-
import com.lambda.event.listener.UnsafeListener.Companion.unsafeListener
75

86
object TimerManager : Loadable {
9-
@JvmStatic
10-
var tickLength = 50f; private set
7+
var lastTickLength: Float = 50f
118

12-
init {
13-
unsafeListener<TickEvent.Post> {
14-
ClientEvent.Timer(1.0).post {
15-
tickLength = 50f / speed.toFloat()
16-
}
9+
fun getLength(): Float {
10+
var length = 50f
11+
12+
ClientEvent.Timer(1.0).post {
13+
length /= speed.toFloat()
1714
}
15+
16+
lastTickLength = length
17+
return length
1818
}
1919
}

common/src/main/kotlin/com/lambda/event/events/TickEvent.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,19 @@ abstract class TickEvent : Event {
2626
* A class representing a [TickEvent] that is triggered after each tick of the game loop.
2727
*/
2828
class Post : TickEvent()
29-
}
29+
30+
/**
31+
* A class representing a [TickEvent] that is triggered when the player gets ticked.
32+
*/
33+
abstract class Player : TickEvent() {
34+
/**
35+
* A class representing a [TickEvent.Player] that is triggered before each player tick.
36+
*/
37+
class Pre : Player()
38+
39+
/**
40+
* A class representing a [TickEvent.Player] that is triggered after each player tick.
41+
*/
42+
class Post : Player()
43+
}
44+
}

common/src/main/kotlin/com/lambda/graphics/renderer/esp/DynamicAABB.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ class DynamicAABB {
1212
private var prev: Box? = null
1313
private var curr: Box? = null
1414

15-
fun update(box: Box) {
15+
fun update(box: Box): DynamicAABB {
1616
prev = curr
1717
curr = box
1818

1919
if (prev == null) {
2020
prev = box
2121
}
22+
23+
return this
2224
}
2325

2426
fun reset() {

common/src/main/kotlin/com/lambda/module/modules/combat/KillAura.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,14 @@ object KillAura : Module(
6161
private val targeting = Targeting.Combat(this) { page == Page.Targeting }
6262

6363
// Aiming
64-
private val rotation = RotationSettings(this) { page == Page.Aiming }
65-
private val stabilize by setting("Stabilize", true) { page == Page.Aiming && !rotation.instant }
66-
private val centerFactor by setting("Center Factor", 0.4, 0.0..1.0, 0.01) { page == Page.Aiming }
67-
private val shakeFactor by setting("Shake Factor", 0.4, 0.0..1.0, 0.01) { page == Page.Aiming }
68-
private val shakeChance by setting("Shake Chance", 0.2, 0.05..1.0, 0.01) { page == Page.Aiming && shakeFactor > 0.0 }
69-
private val selfPredict by setting("Self Predict", 1.0, 0.0..2.0, 0.1) { page == Page.Aiming }
70-
private val targetPredict by setting("Target Predict", 0.0, 0.0..2.0, 0.1) { page == Page.Aiming }
64+
private val rotate by setting("Rotate", true) { page == Page.Aiming }
65+
private val rotation = RotationSettings(this) { page == Page.Aiming && rotate }
66+
private val stabilize by setting("Stabilize", true) { page == Page.Aiming && !rotation.instant && rotate }
67+
private val centerFactor by setting("Center Factor", 0.4, 0.0..1.0, 0.01) { page == Page.Aiming && rotate }
68+
private val shakeFactor by setting("Shake Factor", 0.4, 0.0..1.0, 0.01) { page == Page.Aiming && rotate }
69+
private val shakeChance by setting("Shake Chance", 0.2, 0.05..1.0, 0.01) { page == Page.Aiming && shakeFactor > 0.0 && rotate }
70+
private val selfPredict by setting("Self Predict", 1.0, 0.0..2.0, 0.1) { page == Page.Aiming && rotate }
71+
private val targetPredict by setting("Target Predict", 0.0, 0.0..2.0, 0.1) { page == Page.Aiming && rotate }
7172

7273
var target: LivingEntity? = null; private set
7374

@@ -96,6 +97,8 @@ object KillAura : Module(
9697
init {
9798
requestRotation(
9899
onUpdate = {
100+
if (!rotate) return@requestRotation null
101+
99102
target?.let { target ->
100103
buildRotation(target)
101104
}
@@ -116,6 +119,12 @@ object KillAura : Module(
116119
listener<TickEvent.Pre> {
117120
target = targeting.getTarget()
118121
if (!timerSync) attackTicks++
122+
123+
if (!rotate) {
124+
target?.let { entity ->
125+
runAttack(entity)
126+
}
127+
}
119128
}
120129

121130
runConcurrent {
@@ -252,6 +261,7 @@ object KillAura : Module(
252261

253262
// Rotation check
254263
run {
264+
if (!rotate) return@run
255265
val angle = RotationManager.currentRotation
256266

257267
if (interactionSettings.useRayCast) {
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.lambda.module.modules.movement
2+
3+
import com.lambda.context.SafeContext
4+
import com.lambda.event.events.PacketEvent
5+
import com.lambda.event.events.RenderEvent
6+
import com.lambda.event.listener.SafeListener.Companion.listener
7+
import com.lambda.graphics.renderer.esp.DynamicAABB
8+
import com.lambda.graphics.renderer.esp.builders.build
9+
import com.lambda.module.Module
10+
import com.lambda.module.modules.client.GuiSettings
11+
import com.lambda.module.modules.combat.KillAura
12+
import com.lambda.module.tag.ModuleTag
13+
import com.lambda.util.PacketUtils.sendPacketSilently
14+
import com.lambda.util.math.ColorUtils.setAlpha
15+
import net.minecraft.network.ClientConnection
16+
import net.minecraft.network.packet.Packet
17+
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket
18+
import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket
19+
import net.minecraft.util.math.BlockPos
20+
import net.minecraft.util.math.Box
21+
import java.util.concurrent.ConcurrentLinkedDeque
22+
23+
object Blink : Module(
24+
name = "Blink",
25+
description = "Holds packets",
26+
defaultTags = setOf(ModuleTag.MOVEMENT)
27+
) {
28+
private var delay by setting("Delay", 500, 50..10000, 10)
29+
private val shiftVelocity by setting("Shift velocity", true)
30+
private val requiresAura by setting("Requires Aura", false)
31+
32+
private val isActive get() = (KillAura.isEnabled && KillAura.target != null) || !requiresAura
33+
34+
private var packetPool = ConcurrentLinkedDeque<Packet<*>>()
35+
private var lastVelocity: EntityVelocityUpdateS2CPacket? = null
36+
private var lastUpdate = 0L
37+
38+
private var box = DynamicAABB()
39+
private var lastBox = Box(BlockPos.ORIGIN)
40+
41+
init {
42+
listener<RenderEvent.World> {
43+
val time = System.currentTimeMillis()
44+
45+
if (isActive && time - lastUpdate < delay) return@listener
46+
lastUpdate = time
47+
48+
poolPackets()
49+
}
50+
51+
listener<RenderEvent.DynamicESP> { event ->
52+
val color = GuiSettings.primaryColor
53+
event.renderer.build(box.update(lastBox), color.setAlpha(0.3), color)
54+
}
55+
56+
listener<PacketEvent.Send.Pre> { event ->
57+
if (!isActive) return@listener
58+
59+
packetPool.add(event.packet)
60+
event.cancel()
61+
return@listener
62+
}
63+
64+
listener<PacketEvent.Receive.Pre> { event ->
65+
if (!isActive || !shiftVelocity) return@listener
66+
67+
if (event.packet !is EntityVelocityUpdateS2CPacket) return@listener
68+
if (event.packet.id != player.id) return@listener
69+
70+
lastVelocity = event.packet
71+
event.cancel()
72+
return@listener
73+
}
74+
75+
onDisable {
76+
poolPackets()
77+
}
78+
}
79+
80+
private fun SafeContext.poolPackets() {
81+
while (packetPool.isNotEmpty()) {
82+
packetPool.poll().let { packet ->
83+
connection.sendPacketSilently(packet)
84+
85+
if (packet is PlayerMoveC2SPacket && packet.changesPosition()) {
86+
lastBox = player.boundingBox
87+
.offset(player.pos.negate())
88+
.offset(packet.getX(0.0), packet.getY(0.0), packet.getZ(0.0))
89+
}
90+
}
91+
}
92+
93+
lastVelocity?.let { velocity ->
94+
ClientConnection.handlePacket(velocity, connection.connection.packetListener)
95+
lastVelocity = null
96+
}
97+
}
98+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.lambda.module.modules.movement
2+
3+
import com.lambda.context.SafeContext
4+
import com.lambda.event.events.ClientEvent
5+
import com.lambda.event.events.PacketEvent
6+
import com.lambda.event.events.TickEvent
7+
import com.lambda.event.listener.SafeListener.Companion.listener
8+
import com.lambda.module.Module
9+
import com.lambda.module.modules.combat.KillAura
10+
import com.lambda.module.tag.ModuleTag
11+
import com.lambda.threading.runConcurrent
12+
import com.lambda.util.Communication.info
13+
import com.lambda.util.PacketUtils.sendPacketSilently
14+
import kotlinx.coroutines.delay
15+
import net.minecraft.network.ClientConnection
16+
import net.minecraft.network.packet.c2s.common.CommonPongC2SPacket
17+
import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket
18+
19+
object TickShift : Module(
20+
name = "TickShift",
21+
description = "Smort tickshift for smort anticheats",
22+
defaultTags = setOf(ModuleTag.MOVEMENT)
23+
) {
24+
private val maxBalance by setting("Max Balance", 20, 3..400, 1)
25+
private val boostAmount by setting("Boost", 3.0, 1.1..20.0, 0.01)
26+
private val slowdown by setting("Slowdown", 0.35, 0.01..0.9, 0.01)
27+
private val shiftVelocity by setting("Shift velocity", true)
28+
private val requiresAura by setting("Requires Aura", false)
29+
30+
private val isActive get() = (KillAura.isEnabled && KillAura.target != null) || !requiresAura
31+
32+
private var pingPool = ArrayDeque<CommonPongC2SPacket>()
33+
private var lastVelocity: EntityVelocityUpdateS2CPacket? = null
34+
35+
private var balance = 0
36+
private var boost = false
37+
38+
init {
39+
listener<TickEvent.Post> {
40+
if (Blink.isEnabled) {
41+
this@TickShift.info("TickShift is incompatible with blink")
42+
disable()
43+
}
44+
45+
if (--balance <= 0) {
46+
balance = 0
47+
boost = false
48+
poolPackets()
49+
}
50+
}
51+
52+
runConcurrent {
53+
while (true) {
54+
delay(50)
55+
56+
if (++balance >= maxBalance) {
57+
balance = maxBalance
58+
boost = isActive
59+
}
60+
}
61+
}
62+
63+
listener<ClientEvent.Timer> {
64+
if (!isActive) return@listener
65+
it.speed = if (boost) boostAmount else slowdown
66+
}
67+
68+
listener<PacketEvent.Send.Pre> { event ->
69+
if (!isActive) return@listener
70+
if (event.packet !is CommonPongC2SPacket) return@listener
71+
72+
pingPool.add(event.packet)
73+
event.cancel()
74+
return@listener
75+
}
76+
77+
listener<PacketEvent.Receive.Pre> { event ->
78+
if (!isActive || !shiftVelocity) return@listener
79+
80+
if (event.packet !is EntityVelocityUpdateS2CPacket) return@listener
81+
if (event.packet.id != player.id) return@listener
82+
83+
lastVelocity = event.packet
84+
event.cancel()
85+
return@listener
86+
}
87+
88+
onEnable {
89+
balance = 0
90+
boost = false
91+
92+
pingPool.clear()
93+
lastVelocity = null
94+
}
95+
96+
onDisable {
97+
poolPackets()
98+
}
99+
}
100+
101+
private fun SafeContext.poolPackets() {
102+
while (pingPool.isNotEmpty()) {
103+
connection.sendPacketSilently(pingPool.removeFirst())
104+
}
105+
106+
lastVelocity?.let { velocity ->
107+
ClientConnection.handlePacket(velocity, connection.connection.packetListener)
108+
lastVelocity = null
109+
}
110+
}
111+
}

common/src/main/kotlin/com/lambda/module/modules/player/Replay.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ object Replay : Module(
548548
val size: Int
549549
get() = minOf(input.size, rotation.size, sprint.size, position.size)
550550
val duration: Duration
551-
get() = (size * TimerManager.tickLength * 1.0).toDuration(DurationUnit.MILLISECONDS)
551+
get() = (size * TimerManager.lastTickLength * 1.0).toDuration(DurationUnit.MILLISECONDS)
552552
val startPos: Vec3d
553553
get() = position.firstOrNull() ?: Vec3d.ZERO
554554
val endPos: Vec3d
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.lambda.util
2+
3+
import net.minecraft.client.network.ClientPlayNetworkHandler
4+
import net.minecraft.network.packet.Packet
5+
6+
object PacketUtils {
7+
fun ClientPlayNetworkHandler.sendPacketSilently(packet: Packet<*>) {
8+
connection.send(packet, null, true)
9+
}
10+
}

0 commit comments

Comments
 (0)