Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
636cac9
Feature: Fast break
emyfops Apr 19, 2024
7b9c7d0
Feature: Fast place
emyfops Apr 19, 2024
1c9ed2e
Refactor: Range math
emyfops Apr 19, 2024
50fb02d
More range type
emyfops Apr 19, 2024
7ef0637
Added pages, render settings and cooldown mine
emyfops Apr 19, 2024
22913e9
Removed fast place, already implemented
emyfops Apr 19, 2024
48f0e6e
Merge branch 'master' into feature/fastbreak
emyfops Apr 27, 2024
e8d2c07
Fast break is implemented in a separate module
emyfops Apr 27, 2024
13d1665
Merge branch 'feature/renderer' into feature/fastbreak
emyfops May 5, 2024
2a85049
Merge remote-tracking branch 'origin/master' into feature/fastbreak
Avanatiker Jun 2, 2024
9b63423
- added packet mine
beanbag44 Jun 11, 2024
92813b3
- added option for rebreak and fast re-break
beanbag44 Jun 11, 2024
e2dafbf
- swapped out the two block breaking var's for a state enum
beanbag44 Jun 12, 2024
f15ec04
Merge branch 'master' into feature/packetmine
beanbag44 Jun 12, 2024
dd27c98
- fixed reset rotations method
beanbag44 Jun 12, 2024
4966c41
- added queue and cleaned up code a ton
beanbag44 Jun 14, 2024
423e800
- added pages
beanbag44 Jun 15, 2024
d4a7e95
- removed rebreak triggering if block times out instead of being broken
beanbag44 Jun 15, 2024
a7180cf
- added pause while using items setting
beanbag44 Jun 17, 2024
0dbd788
- forgot to add check for if the queue blocks setting is enabled
beanbag44 Jun 17, 2024
2e3f960
- replaced packet send listener with mixin
beanbag44 Jun 17, 2024
e0e6ecd
- small cleanup for readability
beanbag44 Jun 17, 2024
2ef55ba
- fixed waterlogged checks breaking blocks that could be waterlogged …
beanbag44 Jun 21, 2024
955453f
Merge branch 'master' into feature/packetmine
beanbag44 Jun 21, 2024
d9a0f6b
- swapped some duplicate code for methods
beanbag44 Jun 23, 2024
8cd46d1
Merge branch 'master' into feature/packetmine
beanbag44 Jun 23, 2024
d0ae697
Merge remote-tracking branch 'origin/feature/fastbreak' into feature/…
beanbag44 Jun 27, 2024
58dba36
Merge branch 'master' into feature/packetmine
beanbag44 Jun 27, 2024
1e26cb1
Merge remote-tracking branch 'origin/feature/packetmine' into feature…
beanbag44 Jun 27, 2024
91f6754
Merge branch 'feature/fastbreak' into feature/packetmine
beanbag44 Jun 27, 2024
87f216c
Merge branch 'master' into feature/packetmine
beanbag44 Jun 27, 2024
279b58e
Merge remote-tracking branch 'origin/feature/packetmine' into feature…
beanbag44 Jun 27, 2024
9ab3174
- update the breaking texture based on the fast break speed
beanbag44 Jun 27, 2024
192637f
- implemented validate break setting in fast break
beanbag44 Jun 28, 2024
bfad334
- fixed mine speed setting and changed it to break delay
beanbag44 Jun 28, 2024
23ae28a
- swapped cooldown check for coerce at most
beanbag44 Jun 28, 2024
4b7da4c
- added breaking animation setting to show block breaking progress
beanbag44 Jun 28, 2024
07012da
- added basic renders but need altering to update on every frame render
beanbag44 Jun 28, 2024
04da475
Refactor: Events
emyfops Jun 28, 2024
430752c
- fixed crash
beanbag44 Jun 28, 2024
5dff103
Merge branch 'master' into feature/packetmine
beanbag44 Jul 1, 2024
93a9a9b
Merge branch 'feature/renderer' into feature/packetmine
beanbag44 Jul 1, 2024
33fac37
- fixed / refactored fast break
beanbag44 Jul 2, 2024
fa23119
- added renders to fast break
beanbag44 Jul 3, 2024
264a9b6
- added colour lerp to packet mine renders and fixed tiny bug
beanbag44 Jul 4, 2024
b57d4ca
- added in-out and out-in modes for packet mine renders
beanbag44 Jul 4, 2024
50acfda
- removed unnecessary ignore packet send variable
beanbag44 Jul 4, 2024
0aa1f9d
- renamed FillColourMode to ColourMode
beanbag44 Jul 4, 2024
ebe9e13
- added the new renders to fast break
beanbag44 Jul 4, 2024
7aac691
- fixed instamine blocks not breaking properly without alternative pa…
beanbag44 Jul 4, 2024
d5a47b3
Merge branch 'master' into feature/packetmine
beanbag44 Jul 4, 2024
692cd02
- fixed for dynamic esp
beanbag44 Jul 5, 2024
35d9a7b
- added extra setting checks
beanbag44 Jul 6, 2024
fa99b5a
- added range setting
beanbag44 Jul 6, 2024
5c40f55
- removed range check for the current breaking block if not rebreaking
beanbag44 Jul 6, 2024
5df0124
- fixed colour settings showing while render setting's disabled
beanbag44 Jul 6, 2024
ae7a31e
- added auto swap setting
beanbag44 Jul 7, 2024
af8ede4
- fixed auto swap not swapping back to the best tool to finish breaki…
beanbag44 Jul 7, 2024
e2b064f
- getBestTool returns the players current slot if no other tool was f…
beanbag44 Jul 7, 2024
686d1dd
- moved some things around
beanbag44 Jul 8, 2024
ac5dfa1
- very basic rotations
beanbag44 Jul 8, 2024
e790b67
- added different rotation modes
beanbag44 Jul 9, 2024
fbf6a26
- lots of refactoring. There are now handlers for rotations and auto …
beanbag44 Jul 11, 2024
13d460e
- fixed NCPSilent
beanbag44 Jul 12, 2024
fd4238e
- added re-break delay options
beanbag44 Jul 12, 2024
4eb5e96
- refactored re-break mode settings and added standard for manual re-…
beanbag44 Jul 12, 2024
4407574
- break threshold increments in 0.01
beanbag44 Jul 12, 2024
91ad46b
- added queue block break delay
beanbag44 Jul 12, 2024
da1174c
- added hand swing and reset breaking progress options for re-break
beanbag44 Jul 13, 2024
08de262
- fixed re-break on instamine blocks
beanbag44 Jul 13, 2024
9d8eb25
- cleanup
beanbag44 Jul 15, 2024
0a98cbb
- added todo so i dont forget
beanbag44 Jul 15, 2024
0312785
- fixed queue
beanbag44 Jul 15, 2024
da7116f
- fixed the None swing mode not working properly
beanbag44 Jul 15, 2024
6300579
- added reset on manual swap setting
beanbag44 Jul 15, 2024
d9946e1
- added range check to client side break and increased tick event lis…
beanbag44 Jul 15, 2024
5d735a4
- forgor to remove unused import
beanbag44 Jul 15, 2024
1ce8f2a
- added onDisable
beanbag44 Jul 15, 2024
a8ddd74
- fixed the progress stage during never getting handled
beanbag44 Jul 16, 2024
d01d824
- mostly fixed rotation logic, afaik only thing left on that front is…
beanbag44 Jul 17, 2024
61c7a58
- small cleanup
beanbag44 Jul 17, 2024
8ff3d43
- added queue block renders
beanbag44 Jul 19, 2024
62f4129
- fixed renders not showing on rebreak after the block is broken
beanbag44 Jul 19, 2024
f3be787
- updated onDisable
beanbag44 Jul 19, 2024
cb24c4f
- fixed queued instant mineable blocks all being broken at once witho…
beanbag44 Jul 20, 2024
e2a9e24
- added break mode setting for the different methods of adding up tot…
beanbag44 Jul 22, 2024
517f719
- removed completed todo
beanbag44 Jul 22, 2024
6153a36
- should prevent non completely silent uses of ncpsilent autoswap fro…
beanbag44 Jul 24, 2024
ff81a9d
- uses return slot rather than selected stop to prevent messing up in…
beanbag44 Jul 24, 2024
c714515
- updated onDisable
beanbag44 Jul 24, 2024
e71518b
- fixed rotations and added more options. Also added raycast setting
beanbag44 Jul 30, 2024
0db1f35
Merge remote-tracking branch 'origin/master' into feature/packetmine
beanbag44 Jul 30, 2024
dc7b085
- caches last lerp'd colours to use if paused
beanbag44 Jul 30, 2024
d7f7718
- tiny consistency change
beanbag44 Jul 30, 2024
534da31
- suppress warnings
beanbag44 Jul 30, 2024
594016b
- added setting to only draw re-break renders if state isnt empty
beanbag44 Jul 30, 2024
1257ffb
- fixed hit result cast crash issue
beanbag44 Jul 30, 2024
b1a8d0c
- small fix to allow swapping current mining block while paused for r…
beanbag44 Jul 31, 2024
d1e613c
- lowered minimum keep rotation ticks to 0
beanbag44 Jul 31, 2024
871eb69
- swapped current mining block to an array in prep for double break
beanbag44 Jul 31, 2024
feff4a1
- fixed skill issue reBreak thing on instamine blocks
beanbag44 Aug 9, 2024
87bf1ba
- added double break
beanbag44 Aug 11, 2024
cb4308d
- fixed some render issues
beanbag44 Aug 12, 2024
38a247c
- fixed issue with double break swapping
beanbag44 Aug 12, 2024
873db39
- improved checkClientSideBreak stuff
beanbag44 Aug 12, 2024
de5bcc5
- fixed swapTo() not accounting for if its already swapped for double…
beanbag44 Aug 12, 2024
ecef97c
- small setting fixes / improvements
beanbag44 Aug 12, 2024
42dfdaa
merged master
beanbag44 Aug 17, 2024
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 @@ -11,6 +11,8 @@
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
Expand All @@ -26,6 +28,9 @@ public class ClientPlayInteractionManagerMixin {
@Shadow
private MinecraftClient client;

@Shadow
public float currentBreakingProgress;

@Inject(method = "interactBlock", at = @At("HEAD"))
public void interactBlockHead(final ClientPlayerEntity player, final Hand hand, final BlockHitResult hitResult, final CallbackInfoReturnable<ActionResult> cir) {
if (client.world == null) return;
Expand All @@ -41,4 +46,27 @@ void onAttackPre(PlayerEntity player, Entity target, CallbackInfo ci) {
void onAttackPost(PlayerEntity player, Entity target, CallbackInfo ci) {
EventFlow.post(new AttackEvent.Post(target));
}

@Inject(method = "attackBlock", at = @At("HEAD"), cancellable = true)
public void onAttackBlock(BlockPos pos, Direction side, CallbackInfoReturnable<Boolean> cir) {
if (EventFlow.post(new InteractionEvent.BlockAttack.Pre(pos, side)).isCanceled()) cir.cancel();
}

@Inject(method = "attackBlock", at = @At("TAIL"))
public void onAttackBlockPost(BlockPos pos, Direction side, CallbackInfoReturnable<Boolean> cir) {
EventFlow.post(new InteractionEvent.BlockAttack.Post(pos, side));
}

@Inject(method = "updateBlockBreakingProgress", at = @At("HEAD"), cancellable = true)
private void updateBlockBreakingProgressPre(BlockPos pos, Direction side, CallbackInfoReturnable<Boolean> cir) {
var event = EventFlow.post(new InteractionEvent.BreakingProgress.Pre(pos, side, currentBreakingProgress));
if (event.isCanceled()) cir.cancel();

currentBreakingProgress = event.getProgress();
}

@Inject(method = "updateBlockBreakingProgress", at = @At("TAIL"))
private void updateBlockBreakingProgressPost(BlockPos pos, Direction side, CallbackInfoReturnable<Boolean> cir) {
EventFlow.post(new InteractionEvent.BreakingProgress.Post(pos, side, currentBreakingProgress));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import com.lambda.Lambda;
import com.lambda.event.EventFlow;
import com.lambda.event.events.EntityEvent;
import com.lambda.event.events.MovementEvent;
import com.lambda.event.events.TickEvent;
import com.lambda.interaction.PlayerPacketManager;
import com.lambda.interaction.RotationManager;
import net.minecraft.client.input.Input;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.entity.MovementType;
import net.minecraft.util.Hand;
import net.minecraft.util.math.Vec3d;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
Expand Down Expand Up @@ -91,4 +93,9 @@ float fixHeldItemYaw(ClientPlayerEntity instance) {
float fixHeldItemPitch(ClientPlayerEntity instance) {
return Objects.requireNonNullElse(RotationManager.getHandPitch(), instance.getPitch());
}

@Inject(method = "swingHand", at = @At("HEAD"), cancellable = true)
void onSwingHandPre(Hand hand, CallbackInfo ci) {
if (EventFlow.post(new EntityEvent.SwingHand(hand)).isCanceled()) ci.cancel();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class RotationSettings(
vis
)

override val keepTicks by c.setting("Keep Rotation", 3, 1..10, 1, "Ticks to keep rotation", " ticks", vis)
override val keepTicks by c.setting("Keep Rotation", 3, 0..10, 1, "Ticks to keep rotation", " ticks", vis)
override val resetTicks by c.setting("Reset Rotation", 3, 1..10, 1, "Ticks before rotation is reset", " ticks", vis)

/**
Expand Down
5 changes: 5 additions & 0 deletions common/src/main/kotlin/com/lambda/event/events/EntityEvent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,15 @@ package com.lambda.event.events
import com.lambda.event.Event
import com.lambda.event.callback.Cancellable
import com.lambda.event.callback.ICancellable
import net.minecraft.util.Hand

abstract class EntityEvent : Event {
class ChangeLookDirection(
val deltaYaw: Double,
val deltaPitch: Double,
) : EntityEvent(), ICancellable by Cancellable()

class SwingHand(
val hand: Hand
) : EntityEvent(), ICancellable by Cancellable()
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,42 @@
package com.lambda.event.events

import com.lambda.event.Event
import com.lambda.event.callback.Cancellable
import com.lambda.event.callback.ICancellable
import net.minecraft.client.world.ClientWorld
import net.minecraft.util.hit.BlockHitResult
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Direction

sealed class InteractionEvent : Event {
class Block(
val world: ClientWorld,
val blockHitResult: BlockHitResult
) : InteractionEvent()
}

sealed class BlockAttack : InteractionEvent() {
class Pre(
val pos: BlockPos,
val side: Direction
) : BlockAttack(), ICancellable by Cancellable()

class Post(
val pos: BlockPos,
val side: Direction
) : BlockAttack()
}

sealed class BreakingProgress : InteractionEvent() {
class Pre(
val pos: BlockPos,
val side: Direction,
var progress: Float,
) : BreakingProgress(), ICancellable by Cancellable()

class Post(
val pos: BlockPos,
val side: Direction,
val progress: Float,
) : BreakingProgress()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ object RotationManager : Loadable {
var currentRotation = Rotation.ZERO
var prevRotation = Rotation.ZERO

private var currentContext: RotationContext? = null
var currentContext: RotationContext? = null

private var keepTicks = 0
private var pauseTicks = 0
Expand Down
182 changes: 182 additions & 0 deletions common/src/main/kotlin/com/lambda/module/modules/player/FastBreak.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
package com.lambda.module.modules.player

import com.lambda.context.SafeContext
import com.lambda.event.events.*
import com.lambda.event.listener.SafeListener.Companion.listener
import com.lambda.graphics.renderer.esp.DynamicAABB
import com.lambda.graphics.renderer.esp.builders.buildFilled
import com.lambda.graphics.renderer.esp.builders.buildOutline
import com.lambda.graphics.renderer.esp.global.DynamicESP
import com.lambda.module.Module
import com.lambda.module.tag.ModuleTag
import com.lambda.util.math.transform
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.Action
import com.lambda.util.math.MathUtils.lerp
import net.minecraft.util.math.Box
import java.awt.Color

object FastBreak : Module(
name = "FastBreak",
description = "Break blocks faster.",
defaultTags = setOf(
ModuleTag.PLAYER, ModuleTag.WORLD
)
) {
private val page by setting("Page", Page.Mining)

private val breakDelay by setting("Break Delay", 5, 0..5, 1, unit = "ticks", description = "The tick delay between breaking blocks", visibility = { page == Page.Mining })
private val breakThreshold by setting("Break Threshold", 0.7f, 0.2f..1.0f, 0.1f, description = "The progress at which the block will break.", visibility = { page == Page.Mining })

private val renderMode by setting("Render Mode", RenderMode.Out, "The animation style of the renders", visibility = { page == Page.Render })
private val renderSetting by setting("Render Setting", RenderSetting.Both, "The different ways to draw the renders", visibility = { page == Page.Render && renderMode.isEnabled() })

private val fillColourMode by setting("Fill Mode", ColourMode.Dynamic, visibility = { page == Page.Render && renderSetting != RenderSetting.Outline })
private val staticFillColour by setting("Static Fill Colour", Color(1f, 0f, 0f, 0.3f), "The colour used to render the static fill of the box", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Outline && fillColourMode == ColourMode.Static })
private val startFillColour by setting("Start Fill Colour", Color(1f, 0f, 0f, 0.3f), "The colour used to render the start fill of the box", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Outline && fillColourMode == ColourMode.Dynamic })
private val endFillColour by setting("End Fill Colour", Color(0f, 1f, 0f, 0.3f), "The colour used to render the end fill of the box", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Outline && fillColourMode == ColourMode.Dynamic })

private val outlineColourMode by setting("Outline Mode", ColourMode.Dynamic, visibility = { page == Page.Render && renderSetting != RenderSetting.Fill })
private val staticOutlineColour by setting("Static Outline Colour", Color(1f, 0f, 0f, 0.3f), "The colour used to render the static outline of the box", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Fill && outlineColourMode == ColourMode.Static })
private val startOutlineColour by setting("Start Outline Colour", Color(1f, 0f, 0f, 0.3f), "The colour used to render the start outline of the box", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Fill && outlineColourMode == ColourMode.Dynamic })
private val endOutlineColour by setting("End Outline Colour", Color(0f, 1f, 0f, 0.3f), "The colour used to render the end outline of the box", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Fill && outlineColourMode == ColourMode.Dynamic })
private val outlineWidth by setting("Outline Width", 1f, 0f..3f, 0.1f, "the thickness of the outline", visibility = { page == Page.Render && renderMode.isEnabled() && renderSetting != RenderSetting.Fill })


private val renderer = DynamicESP
private var boxSet = emptySet<Box>()

private enum class Page {
Mining, Render
}

private enum class RenderMode {
Out, In, InOut, OutIn, Static, None;

fun isEnabled(): Boolean =
this != None
}

private enum class ColourMode {
Static, Dynamic
}

private enum class RenderSetting {
Both, Fill, Outline
}

init {
listener<PacketEvent.Send.Pre> {
if (it.packet !is PlayerActionC2SPacket
|| it.packet.action != Action.STOP_DESTROY_BLOCK
) return@listener

connection.sendPacket(
PlayerActionC2SPacket(
Action.ABORT_DESTROY_BLOCK,
// For the exploit to work, the position must be outside the player range, so any
// position farther than 6 blocks will work.
// This is only required for grim 2 and potentially grim 3 in the future if they update it
it.packet.pos.up(2024 - 4 - 18),
it.packet.direction
)
)
}

listener<TickEvent.Pre> {
interaction.blockBreakingCooldown = interaction.blockBreakingCooldown.coerceAtMost(breakDelay)
}

listener<InteractionEvent.BreakingProgress.Pre> {
it.progress += world.getBlockState(it.pos)
.calcBlockBreakingDelta(player, world, it.pos) * (1 - breakThreshold)
}

listener<TickEvent.Post> {
if (!renderMode.isEnabled()) return@listener

val pos = interaction.currentBreakingPos
boxSet = world.getBlockState(pos).getOutlineShape(world, pos).boundingBoxes.toSet()
}

listener<RenderEvent.World> {
if (!interaction.isBreakingBlock || !renderMode.isEnabled()) return@listener

val pos = interaction.currentBreakingPos
val breakDelta = world.getBlockState(pos).calcBlockBreakingDelta(player, world, pos)

renderer.clear()
boxSet.forEach { box ->
val previousFactor = interaction.currentBreakingProgress - breakDelta
val nextFactor = interaction.currentBreakingProgress
val currentFactor = lerp(previousFactor, nextFactor, mc.tickDelta)

val fillColour = if (fillColourMode == ColourMode.Dynamic) {
lerp(startFillColour, endFillColour, currentFactor.toDouble())
} else {
staticFillColour
}

val outlineColour = if (outlineColourMode == ColourMode.Dynamic) {
lerp(startOutlineColour, endOutlineColour, currentFactor.toDouble())
} else {
staticOutlineColour
}

val renderBox = if (renderMode != RenderMode.Static) {
getLerpBox(box, currentFactor).offset(pos)
} else {
box.offset(pos)
}

val dynamicAABB = DynamicAABB()
dynamicAABB.update(renderBox)

if (renderSetting != RenderSetting.Outline) {
renderer.buildFilled(dynamicAABB, fillColour)
}

if (renderSetting != RenderSetting.Fill) {
renderer.buildOutline(dynamicAABB, outlineColour)
}
}
renderer.upload()
}
}

private fun getLerpBox(box: Box, factor: Float): Box {
val boxCenter = Box(box.center, box.center)
when (renderMode) {
RenderMode.Out -> {
return lerp(boxCenter, box, factor.toDouble())
}

RenderMode.In -> {
return lerp(box, boxCenter, factor.toDouble())
}

RenderMode.InOut -> {
return if (factor >= 0.5f) {
lerp(boxCenter, box, (factor.toDouble() - 0.5) * 2)
} else {
lerp(box, boxCenter, factor.toDouble() * 2)
}
}

RenderMode.OutIn -> {
return if (factor >= 0.5f) {
lerp(box, boxCenter, (factor.toDouble() - 0.5) * 2)
} else {
lerp(boxCenter, box, factor.toDouble() * 2)
}
}

else -> {
return box
}
}
}

fun SafeContext.interpolateProgress(min: Double = 0.0, max: Double = 1.0) =
transform(interaction.currentBreakingProgress.toDouble(), 0.0, 1.0, min, max)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ object Interact : Module(
description = "Modify players interaction with the world",
defaultTags = setOf(ModuleTag.PLAYER)
) {
// ToDo: Is this fast place / fast use? Should it be relocated with more options?
@JvmStatic val placeDelay by setting("Item Use / Place Delay", 4, 0..20, 1, "Sets the delay between placing blocks or using items")
// @JvmStatic val breakDelay by setting("Attack / Break Delay", 10, 0..20, 1)
@JvmStatic val multiAction by setting("Multi Action", false, "Allows to use many items while breaking blocks")
}
Loading