Skip to content

Commit 1c8b21b

Browse files
authored
Feature: Nuker selective mode (#336)
1 parent 0dd9bb4 commit 1c8b21b

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

  • src/main/kotlin/com/lambda/module/modules/world

‎src/main/kotlin/com/lambda/module/modules/world/Nuker.kt‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@
1818
package com.lambda.module.modules.world
1919

2020
import com.lambda.config.automation.AutomationConfig.Companion.setDefaultAutomationConfig
21+
import com.lambda.config.blocks.BreakConfig
2122
import com.lambda.config.editTypedSettings
2223
import com.lambda.config.entries.Setting.Companion.onValueChange
24+
import com.lambda.config.settings.complex.Bind
2325
import com.lambda.config.withEdits
2426
import com.lambda.context.SafeContext
27+
import com.lambda.event.events.PlayerEvent
28+
import com.lambda.event.listener.SafeListener.Companion.listen
2529
import com.lambda.interaction.construction.blueprint.TickingBlueprint.Companion.tickingBlueprint
2630
import com.lambda.interaction.construction.verify.TargetState
2731
import com.lambda.module.Module
@@ -30,11 +34,16 @@ import com.lambda.task.RootTask.run
3034
import com.lambda.task.Task
3135
import com.lambda.task.tasks.BuildTask.Companion.build
3236
import com.lambda.util.BlockUtils.blockPos
37+
import com.lambda.util.BlockUtils.blockState
38+
import com.lambda.util.CommunicationUtils.info
39+
import com.lambda.util.InputUtils.isSatisfied
3340
import com.lambda.util.PlayerBuildLayerUtils.FlattenMode
3441
import com.lambda.util.PlayerBuildLayerUtils.isInBaritoneSelection
3542
import com.lambda.util.PlayerBuildLayerUtils.isInFlatten
43+
import net.minecraft.block.Block
3644
import net.minecraft.block.Blocks
3745
import net.minecraft.util.math.BlockPos
46+
import org.lwjgl.glfw.GLFW
3847

3948
@Suppress("unused")
4049
object Nuker : Module(
@@ -47,6 +56,8 @@ object Nuker : Module(
4756
private val width by setting("Width", 6, 1..8, 1)
4857
private val flattenMode by setting("Flatten Mode", FlattenMode.Standard)
4958
private val directionalDig by setting("Directional Dig", DigDirection.None)
59+
private val selective by setting("Selective", false, description = "Click on a block to nuke that type of block")
60+
private val selectAddKey by setting("Select Additional Keybind", Bind(GLFW.GLFW_KEY_LEFT_CONTROL, 0), description = "Hold down this key to add more blocks to the selective block list", visibility = { selective })
5061
private val onGround by setting("On Ground", false, "Only break blocks when the player is standing on ground")
5162
private val fillFloor by setting("Fill Floor", false)
5263
private val baritoneSelection by setting("Baritone Selection", false, "Restricts nuker to your baritone selection")
@@ -56,6 +67,7 @@ object Nuker : Module(
5667
.onValueChange { _, _ -> if (buildTask != null) startBuildTask() }
5768

5869
private var buildTask: Task<*>? = null
70+
private val selectedBlocks = mutableSetOf<Block>()
5971

6072
init {
6173
setDefaultAutomationConfig()
@@ -72,6 +84,35 @@ object Nuker : Module(
7284
onDisable {
7385
buildTask?.cancel()
7486
buildTask = null
87+
selectedBlocks.clear()
88+
}
89+
90+
listen<PlayerEvent.Attack.Block>(priority = { 69420 }) {
91+
if (!selective) return@listen
92+
93+
val selected = blockState(it.pos).block
94+
if (breakConfig.whitelistMode == BreakConfig.WhitelistMode.Blacklist && breakConfig.blacklist.contains(selected)) {
95+
it.cancel()
96+
this@Nuker.info("${selected.name.string} is blacklisted in the break config!")
97+
return@listen
98+
} else if (breakConfig.whitelistMode == BreakConfig.WhitelistMode.Whitelist && !breakConfig.whitelist.contains(selected)) {
99+
it.cancel()
100+
this@Nuker.info("${selected.name.string} is not whitelisted in the break config!")
101+
return@listen
102+
}
103+
104+
if (selectAddKey.isSatisfied()) {
105+
if (selectedBlocks.add(selected)) {
106+
val text = (if (selectedBlocks.size > 1) "Selected blocks:" else "Selected block:") +
107+
selectedBlocks.joinToString(",") { block -> " ${block.name.string}" } + "."
108+
109+
this@Nuker.info(text)
110+
}
111+
} else if (!selectedBlocks.contains(selected) || selectedBlocks.size > 1) {
112+
selectedBlocks.clear()
113+
selectedBlocks.add(selected)
114+
this@Nuker.info("Selected block: ${selected.name.string}.")
115+
}
75116
}
76117
}
77118

@@ -87,6 +128,7 @@ object Nuker : Module(
87128
.filter { !baritoneSelection || isInBaritoneSelection(it) != inverseSelection }
88129
.filter { isInFlatten(it, flattenMode, sneakLowersFlatten, baritoneSelection, inverseSelection) }
89130
.filter { isWithinDigDirection(it) }
131+
.filter { isValidTarget(it) }
90132
.associateWith { if (breakConfig.fillFluids) TargetState.Air else TargetState.Empty }
91133

92134
if (fillFloor) {
@@ -112,6 +154,9 @@ object Nuker : Module(
112154
}
113155
}
114156

157+
private fun SafeContext.isValidTarget(pos: BlockPos): Boolean =
158+
!selective || blockState(pos).block in selectedBlocks
159+
115160
private enum class DigDirection {
116161
None,
117162
East,

0 commit comments

Comments
 (0)