@@ -16,13 +16,16 @@ import net.ccbluex.liquidbounce.utils.inventory.InventoryUtils
1616import net.ccbluex.liquidbounce.utils.inventory.SilentHotbar
1717import net.ccbluex.liquidbounce.utils.movement.MovementUtils
1818import net.ccbluex.liquidbounce.utils.movement.MovementUtils.hasMotion
19+ import net.ccbluex.liquidbounce.utils.timing.MSTimer
1920import net.ccbluex.liquidbounce.utils.timing.TickTimer
2021import net.minecraft.item.*
22+ import net.minecraft.network.Packet
2123import net.minecraft.network.handshake.client.C00Handshake
2224import net.minecraft.network.play.client.*
2325import net.minecraft.network.play.client.C07PacketPlayerDigging.Action.DROP_ITEM
2426import net.minecraft.network.play.client.C07PacketPlayerDigging.Action.RELEASE_USE_ITEM
2527import net.minecraft.network.play.server.S08PacketPlayerPosLook
28+ import net.minecraft.network.play.server.S09PacketHeldItemChange
2629import net.minecraft.network.play.server.S12PacketEntityVelocity
2730import net.minecraft.network.play.server.S27PacketExplosion
2831import net.minecraft.network.play.server.S2FPacketSetSlot
@@ -37,18 +40,37 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
3740
3841 private val swordMode by choices(
3942 " SwordMode" ,
40- arrayOf(" None" , " NCP" , " UpdatedNCP" , " AAC5" , " SwitchItem" , " InvalidC08" , " Blink" , " Grim2371" ),
43+ arrayOf(
44+ " None" , " NCP" , " UpdatedNCP" , " AAC4" , " AAC5" , " SwitchItem" , " InvalidC08" ,
45+ " Blink" , " Grim2371" , " OldIntave" , " Medusa" , " HypixelNew" , " SpamItemChange" ,
46+ " SpamPlace" , " SpamEmptyPlace" , " Matrix" , " GrimAC"
47+ ),
4148 " None"
4249 )
4350
4451 private val reblinkTicks by int(" ReblinkTicks" , 10 , 1 .. 20 ) { swordMode == " Blink" }
52+ private val antiSwitchItem by boolean(" AntiSwitchItem" , false )
53+ private val onlyGround by boolean(" OnlyGround" , false )
54+ private val onlyMove by boolean(" OnlyMove" , false )
55+ private val aac4C07 by boolean(" AAC4-C07" , true ) {
56+ swordMode == " AAC4" || consumeMode == " AAC4" || bowPacket == " AAC4"
57+ }
58+ private val aac4C08 by boolean(" AAC4-C08" , true ) {
59+ swordMode == " AAC4" || consumeMode == " AAC4" || bowPacket == " AAC4"
60+ }
61+ private val aac4OnGround by boolean(" AAC4-OnGround" , true ) {
62+ swordMode == " AAC4" || consumeMode == " AAC4" || bowPacket == " AAC4"
63+ }
4564
4665 private val blockForwardMultiplier by float(" BlockForwardMultiplier" , 1f , 0.2F .. 1f )
4766 private val blockStrafeMultiplier by float(" BlockStrafeMultiplier" , 1f , 0.2F .. 1f )
4867
4968 private val consumeMode by choices(
5069 " ConsumeMode" ,
51- arrayOf(" None" , " UpdatedNCP" , " AAC5" , " SwitchItem" , " InvalidC08" , " Intave" , " Drop" , " Grim2371" ),
70+ arrayOf(
71+ " None" , " UpdatedNCP" , " AAC4" , " AAC5" , " SwitchItem" , " InvalidC08" , " Intave" ,
72+ " Drop" , " Grim2371" , " HypixelNew" , " SpamItemChange" , " SpamPlace" , " SpamEmptyPlace" , " Medusa"
73+ ),
5274 " None"
5375 )
5476
@@ -65,7 +87,10 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
6587
6688 private val bowPacket by choices(
6789 " BowMode" ,
68- arrayOf(" None" , " UpdatedNCP" , " AAC5" , " SwitchItem" , " InvalidC08" , " Grim2371" ),
90+ arrayOf(
91+ " None" , " UpdatedNCP" , " AAC4" , " AAC5" , " SwitchItem" , " InvalidC08" ,
92+ " Grim2371" , " HypixelNew" , " SpamItemChange" , " SpamPlace" , " SpamEmptyPlace" , " Medusa"
93+ ),
6994 " None"
7095 )
7196
@@ -101,9 +126,15 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
101126 private var hasDropped = false
102127
103128 private val BlinkTimer = TickTimer ()
129+ private val aac4Timer = MSTimer ()
130+ private val matrixBufferTimer = MSTimer ()
104131
105132 private var grim2371DoNotSlow = false
106133 private val grim2371Timer = TickTimer ()
134+ private val matrixPacketBuffer = mutableListOf<Packet <* >>()
135+ private var matrixBuffering = false
136+ private var lastBlockingState = false
137+ private var medusaCanStopSprint = true
107138
108139 override fun onDisable () {
109140 shouldSwap = false
@@ -113,14 +144,18 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
113144 grim2371DoNotSlow = false
114145 grim2371Timer.reset()
115146 pendingFlagApplyPacket = false
147+ matrixPacketBuffer.clear()
148+ matrixBuffering = false
149+ lastBlockingState = false
150+ medusaCanStopSprint = true
116151 }
117152
118153 val onMotion = handler<MotionEvent > { event ->
119154 val player = mc.thePlayer ? : return @handler
120155 val heldItem = player.heldItem ? : return @handler
121156 val isUsingItem = usingItemFunc()
122157
123- if (! hasMotion && ! shouldSwap)
158+ if (( ! hasMotion && ! shouldSwap) || ! shouldHandleNoSlow(player) )
124159 return @handler
125160
126161 if (event.eventState == EventState .PRE && isUsingItem) {
@@ -210,6 +245,9 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
210245 consumeDrinkOnly && (heldItem.item is ItemPotion || heldItem.item is ItemBucketMilk ))
211246 ) {
212247 when (consumeMode.lowercase()) {
248+ " aac4" ->
249+ handleAAC4Packet(event, heldItem)
250+
213251 " aac5" ->
214252 sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , heldItem, 0f , 0f , 0f ))
215253
@@ -239,12 +277,36 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
239277 sendPacket(C07PacketPlayerDigging (RELEASE_USE_ITEM , BlockPos .ORIGIN , EnumFacing .UP ))
240278 }
241279 }
280+
281+ " hypixelnew" -> {
282+ if (InventoryUtils .hasSpaceInInventory() && event.eventState == EventState .PRE && player.ticksExisted % 3 != 0 ) {
283+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , null , 0f , 0f , 0f ))
284+ }
285+ }
286+
287+ " spamitemchange" ->
288+ if (event.eventState == EventState .PRE ) {
289+ sendPacket(C09PacketHeldItemChange (player.inventory.currentItem))
290+ }
291+
292+ " spamplace" ->
293+ if (event.eventState == EventState .PRE ) {
294+ sendPacket(C08PacketPlayerBlockPlacement (heldItem))
295+ }
296+
297+ " spamemptyplace" ->
298+ if (event.eventState == EventState .PRE ) {
299+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , null , 0f , 0f , 0f ))
300+ }
242301 }
243302 }
244303 }
245304
246305 if (heldItem.item is ItemBow && (isUsingItem || shouldSwap)) {
247306 when (bowPacket.lowercase()) {
307+ " aac4" ->
308+ handleAAC4Packet(event, heldItem)
309+
248310 " aac5" ->
249311 sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , heldItem, 0f , 0f , 0f ))
250312
@@ -268,6 +330,27 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
268330 }
269331 }
270332 }
333+
334+ " hypixelnew" -> {
335+ if (InventoryUtils .hasSpaceInInventory() && event.eventState == EventState .PRE && player.ticksExisted % 3 != 0 ) {
336+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , null , 0f , 0f , 0f ))
337+ }
338+ }
339+
340+ " spamitemchange" ->
341+ if (event.eventState == EventState .PRE ) {
342+ sendPacket(C09PacketHeldItemChange (player.inventory.currentItem))
343+ }
344+
345+ " spamplace" ->
346+ if (event.eventState == EventState .PRE ) {
347+ sendPacket(C08PacketPlayerBlockPlacement (heldItem))
348+ }
349+
350+ " spamemptyplace" ->
351+ if (event.eventState == EventState .PRE ) {
352+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , null , 0f , 0f , 0f ))
353+ }
271354 }
272355 }
273356
@@ -288,6 +371,9 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
288371 else -> return @handler
289372 }
290373
374+ " aac4" ->
375+ handleAAC4Packet(event, heldItem)
376+
291377 " updatedncp" ->
292378 if (event.eventState == EventState .POST ) {
293379 sendPacket(C08PacketPlayerBlockPlacement (BlockPos .ORIGIN , 255 , heldItem, 0f , 0f , 0f ))
@@ -313,10 +399,89 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
313399 }
314400 }
315401 }
402+
403+ " oldintave" -> {
404+ if (event.eventState == EventState .PRE ) {
405+ sendPacket(C09PacketHeldItemChange ((player.inventory.currentItem + 1 ) % 9 ))
406+ sendPacket(C09PacketHeldItemChange (player.inventory.currentItem))
407+ }
408+
409+ if (event.eventState == EventState .POST ) {
410+ sendPacket(C08PacketPlayerBlockPlacement (player.inventoryContainer.getSlot(player.inventory.currentItem + 36 ).stack))
411+ }
412+ }
413+
414+ " hypixelnew" -> {
415+ if (InventoryUtils .hasSpaceInInventory() && event.eventState == EventState .PRE && player.ticksExisted % 3 != 0 ) {
416+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , null , 0f , 0f , 0f ))
417+ }
418+ }
419+
420+ " spamitemchange" ->
421+ if (event.eventState == EventState .PRE ) {
422+ sendPacket(C09PacketHeldItemChange (player.inventory.currentItem))
423+ }
424+
425+ " spamplace" ->
426+ if (event.eventState == EventState .PRE ) {
427+ sendPacket(C08PacketPlayerBlockPlacement (heldItem))
428+ }
429+
430+ " spamemptyplace" ->
431+ if (event.eventState == EventState .PRE ) {
432+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , null , 0f , 0f , 0f ))
433+ }
316434 }
317435 }
318436 }
319437
438+ val onUpdate = handler<UpdateEvent > {
439+ val player = mc.thePlayer ? : return @handler
440+ val blockingSword = isBlockingSword()
441+
442+ if ((swordMode == " Matrix" || swordMode == " GrimAC" ) && (lastBlockingState || blockingSword)) {
443+ if (matrixBufferTimer.hasTimePassed(230L ) && matrixBuffering) {
444+ matrixBuffering = false
445+
446+ if (swordMode == " GrimAC" ) {
447+ sendPacket(C09PacketHeldItemChange ((player.inventory.currentItem + 1 ) % 9 ), false )
448+ sendPacket(C09PacketHeldItemChange (player.inventory.currentItem), false )
449+ } else {
450+ sendPacket(C07PacketPlayerDigging (RELEASE_USE_ITEM , BlockPos (- 1 , - 1 , - 1 ), EnumFacing .DOWN ), false )
451+ }
452+
453+ if (matrixPacketBuffer.isNotEmpty()) {
454+ var canAttack = false
455+
456+ for (queuedPacket in matrixPacketBuffer) {
457+ if (queuedPacket is C03PacketPlayer ) {
458+ canAttack = true
459+ }
460+
461+ if (! ((queuedPacket is C02PacketUseEntity || queuedPacket is C0APacketAnimation ) && ! canAttack)) {
462+ sendPacket(queuedPacket, false )
463+ }
464+ }
465+
466+ matrixPacketBuffer.clear()
467+ }
468+ }
469+
470+ if (! matrixBuffering) {
471+ lastBlockingState = blockingSword
472+ if (! blockingSword) {
473+ return @handler
474+ }
475+
476+ sendPacket(C08PacketPlayerBlockPlacement (BlockPos (- 1 , - 1 , - 1 ), 255 , player.inventory.getCurrentItem(), 0f , 0f , 0f ), false )
477+ matrixBuffering = true
478+ matrixBufferTimer.reset()
479+ }
480+ } else {
481+ lastBlockingState = false
482+ }
483+ }
484+
320485 val onPacket = handler<PacketEvent > { event ->
321486 val packet = event.packet
322487 val player = mc.thePlayer ? : return @handler
@@ -391,6 +556,41 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
391556 }
392557 }
393558
559+ if (antiSwitchItem && packet is S09PacketHeldItemChange && event.eventType == EventState .RECEIVE && usingItemFunc()) {
560+ event.cancelEvent()
561+ sendPacket(C09PacketHeldItemChange (packet.heldItemHotbarIndex), false )
562+ sendPacket(C09PacketHeldItemChange (player.inventory.currentItem), false )
563+ return @handler
564+ }
565+
566+ if (! shouldHandleNoSlow(player)) {
567+ return @handler
568+ }
569+
570+ if (isMedusaActive()) {
571+ if (medusaCanStopSprint) {
572+ sendPacket(C0BPacketEntityAction (player, C0BPacketEntityAction .Action .STOP_SPRINTING ), false )
573+ medusaCanStopSprint = false
574+ }
575+ } else {
576+ medusaCanStopSprint = true
577+ }
578+
579+ if ((swordMode == " Matrix" || swordMode == " GrimAC" ) && matrixBuffering && event.eventType == EventState .SEND ) {
580+ if ((packet is C07PacketPlayerDigging || packet is C08PacketPlayerBlockPlacement ) && isBlockingSword()) {
581+ event.cancelEvent()
582+ return @handler
583+ }
584+
585+ if (packet is C03PacketPlayer || packet is C0APacketAnimation || packet is C0BPacketEntityAction ||
586+ packet is C02PacketUseEntity || packet is C07PacketPlayerDigging || packet is C08PacketPlayerBlockPlacement
587+ ) {
588+ matrixPacketBuffer + = packet
589+ event.cancelEvent()
590+ return @handler
591+ }
592+ }
593+
394594 if (event.isCancelled || shouldSwap)
395595 return @handler
396596
@@ -490,8 +690,13 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
490690 }
491691
492692 val onSlowDown = handler<SlowDownEvent > { event ->
693+ val player = mc.thePlayer ? : return @handler
493694 val heldItem = mc.thePlayer.heldItem?.item
494695
696+ if (! shouldHandleNoSlow(player)) {
697+ return @handler
698+ }
699+
495700 if ((swordMode == " Grim2371" && heldItem is ItemSword ) ||
496701 (consumeMode == " Grim2371" && (heldItem is ItemFood || heldItem is ItemPotion || heldItem is ItemBucketMilk )) ||
497702 (bowPacket == " Grim2371" && heldItem is ItemBow )) {
@@ -534,6 +739,52 @@ object NoSlow : Module("NoSlow", Category.MOVEMENT, Category.SubCategory.MOVEMEN
534739 fun usingItemFunc () =
535740 mc.thePlayer?.heldItem != null && (mc.thePlayer.isUsingItem || (mc.thePlayer.heldItem?.item is ItemSword && KillAura .blockStatus) || isUNCPBlocking())
536741
742+ private fun shouldHandleNoSlow (player : net.minecraft.client.entity.EntityPlayerSP ): Boolean {
743+ if (onlyMove && ! player.isMoving) {
744+ return false
745+ }
746+
747+ if (onlyGround && ! player.onGround) {
748+ return false
749+ }
750+
751+ return true
752+ }
753+
754+ private fun handleAAC4Packet (event : MotionEvent , heldItem : ItemStack ) {
755+ val player = mc.thePlayer ? : return
756+
757+ if (aac4OnGround && ! player.onGround) {
758+ return
759+ }
760+
761+ if (aac4C07 && event.eventState == EventState .PRE && aac4Timer.hasTimePassed(80L )) {
762+ sendPacket(C07PacketPlayerDigging (RELEASE_USE_ITEM , BlockPos (- 1 , - 1 , - 1 ), EnumFacing .DOWN ))
763+ }
764+
765+ if (aac4C08 && event.eventState == EventState .POST && aac4Timer.hasTimePassed(80L )) {
766+ sendPacket(C08PacketPlayerBlockPlacement (heldItem))
767+ aac4Timer.reset()
768+ }
769+ }
770+
771+ private fun isBlockingSword (): Boolean {
772+ val player = mc.thePlayer ? : return false
773+ return (player.isUsingItem || KillAura .blockStatus) && player.heldItem?.item is ItemSword
774+ }
775+
776+ private fun isMedusaActive (): Boolean {
777+ val player = mc.thePlayer ? : return false
778+ val item = player.heldItem?.item ? : return false
779+
780+ return when (item) {
781+ is ItemSword -> swordMode == " Medusa" && usingItemFunc()
782+ is ItemBow -> bowPacket == " Medusa" && usingItemFunc()
783+ is ItemFood , is ItemPotion , is ItemBucketMilk -> consumeMode == " Medusa" && usingItemFunc()
784+ else -> false
785+ }
786+ }
787+
537788 private fun updateSlot () {
538789 SilentHotbar .selectSlotSilently(this , (SilentHotbar .currentSlot + 1 ) % 9 , immediate = true )
539790 SilentHotbar .resetSlot(this , true )
0 commit comments