-
Notifications
You must be signed in to change notification settings - Fork 0
Clone feature/nuker auto select #6
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
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -23,6 +23,8 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.block.Block; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.util.Hand; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.util.hit.BlockHitResult; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.util.hit.HitResult; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.util.math.BlockPos; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.util.math.Box; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import net.minecraft.util.math.Vec3d; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -182,6 +184,8 @@ public class Nuker extends Module { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.build() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private Block autoSelectBlock = null; // Internal field to store the selected block for AutoSelect mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Rendering | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private final Setting<Boolean> enableRenderBounding = sgRender.add(new BoolSetting.Builder() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -201,14 +205,14 @@ public class Nuker extends Module { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private final Setting<SettingColor> sideColorBox = sgRender.add(new ColorSetting.Builder() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.name("side-color") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.description("The side color of the bounding box.") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.defaultValue(new SettingColor(16,106,144, 100)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.defaultValue(new SettingColor(16, 106, 144, 100)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.build() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private final Setting<SettingColor> lineColorBox = sgRender.add(new ColorSetting.Builder() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.name("line-color") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.description("The line color of the bounding box.") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.defaultValue(new SettingColor(16,106,144, 255)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.defaultValue(new SettingColor(16, 106, 144, 255)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.build() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -265,6 +269,24 @@ public void onActivate() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
firstBlock = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
timer = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
noBlockTimer = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (listMode.get() == ListMode.AutoSelect) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HitResult hitResult = mc.crosshairTarget; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (hitResult != null && hitResult.getType() == HitResult.Type.BLOCK) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
autoSelectBlock = mc.world.getBlockState(pos).getBlock(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
autoSelectBlock = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
warning("No block is being targeted for auto-select mode."); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+279
to
+280
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. When A better approach would be to provide clearer feedback by showing an error message and automatically deactivating the module. This makes it explicit that the activation failed and why.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+274
to
+281
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing Error HandlingWarning is displayed when no block is targeted, but module remains active in a potentially non-functional state. AutoSelect mode requires a valid block selection to function properly, yet the module continues execution without validating this critical requirement.
Suggested change
Standards
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+273
to
+282
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing Null CheckMissing null check for mc.world before accessing it. If world is null, this will cause NullPointerException when trying to get block state. Standards
Comment on lines
+273
to
+282
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing Activation CheckThe AutoSelect block targeting logic executes unconditionally on module activation without checking if the world and player are initialized. This could cause NullPointerException if module activates during world loading or menu screens. Standards
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+273
to
+283
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Guard onActivate with Utils.canUpdate to prevent NPEs. onActivate can be triggered when world/player is null (e.g., main menu, early join). Add a guard. Apply: public void onActivate() {
firstBlock = true;
timer = 0;
noBlockTimer = 0;
- if (listMode.get() == ListMode.AutoSelect) {
+ if (!Utils.canUpdate()) {
+ autoSelectBlock = null;
+ return;
+ }
+ if (listMode.get() == ListMode.AutoSelect) {
HitResult hitResult = mc.crosshairTarget;
if (hitResult != null && hitResult.getType() == HitResult.Type.BLOCK) {
BlockPos pos = ((BlockHitResult) hitResult).getBlockPos();
autoSelectBlock = mc.world.getBlockState(pos).getBlock();
} else {
autoSelectBlock = null;
warning("No block is being targeted for auto-select mode.");
}
}
} Optional: capture selection when switching listMode to AutoSelect while enabled (via an onChanged callback), so users don’t have to toggle the module. 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public void onDeactivate() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (listMode.get() == ListMode.AutoSelect) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
autoSelectBlock = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+285
to
+289
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing State ResetThe onDeactivate method only resets autoSelectBlock but doesn't call the parent class implementation. This could lead to incomplete state reset when module is deactivated. Standards
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+285
to
290
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing Reset LogiconDeactivate() only resets autoSelectBlock for AutoSelect mode but ignores other state variables. This creates inconsistent state management where some fields are reset conditionally while others aren't reset at all. Standards
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@EventHandler | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -351,35 +373,57 @@ private void onTickPre(TickEvent.Pre event) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Box box = new Box(pos1.toCenterPos(), pos2.toCenterPos()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Find blocks to break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BlockIterator.register(Math.max((int) Math.ceil(range.get() + 1), maxh), Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check for air, unbreakable blocks and distance | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
switch (shape.get()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case Sphere -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (Utils.squaredDistance(pX, pY, pZ, blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5) > rangeSq) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case UniformCube -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (chebyshevDist(mc.player.getBlockPos().getX(), mc.player.getBlockPos().getY(), mc.player.getBlockPos().getZ(), blockPos.getX(), blockPos.getY(), blockPos.getZ()) >= range.get()) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case Cube -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!box.contains(Vec3d.ofCenter(blockPos))) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!BlockUtils.canBreak(blockPos, blockState)) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Flatten | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (mode.get() == Mode.Flatten && blockPos.getY() < Math.floor(mc.player.getY())) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Smash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (mode.get() == Mode.Smash && blockState.getHardness(mc.world, blockPos) != 0) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check whitelist or blacklist | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (listMode.get() == ListMode.Whitelist && !whitelist.get().contains(blockState.getBlock())) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (listMode.get() == ListMode.Blacklist && blacklist.get().contains(blockState.getBlock())) return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Add block | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
blocks.add(blockPos.toImmutable()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BlockIterator.register(Math.max((int) Math.ceil(range.get() + 1), maxh), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Math.max((int) Math.ceil(range.get()), maxv), (blockPos, blockState) -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check for air, unbreakable blocks and distance | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
switch (shape.get()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case Sphere -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (Utils.squaredDistance(pX, pY, pZ, blockPos.getX() + 0.5, blockPos.getY() + 0.5, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
blockPos.getZ() + 0.5) > rangeSq) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case UniformCube -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (chebyshevDist(mc.player.getBlockPos().getX(), mc.player.getBlockPos().getY(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mc.player.getBlockPos().getZ(), blockPos.getX(), blockPos.getY(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
blockPos.getZ()) >= range.get()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case Cube -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!box.contains(Vec3d.ofCenter(blockPos))) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!BlockUtils.canBreak(blockPos, blockState)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Flatten | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (mode.get() == Mode.Flatten && blockPos.getY() < Math.floor(mc.player.getY())) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Smash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (mode.get() == Mode.Smash && blockState.getHardness(mc.world, blockPos) != 0) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Check list mode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
switch (listMode.get()) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case AutoSelect -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (autoSelectBlock == null || !blockState.getBlock().equals(autoSelectBlock)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+410
to
+412
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unrestricted Block BreakingAutoSelect mode allows breaking specific blocks without rate limiting. Malicious users could target valuable blocks for rapid destruction, potentially causing server-side performance issues or griefing.
Suggested change
Standards
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case Whitelist -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!whitelist.get().contains(blockState.getBlock())) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case Blacklist -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (blacklist.get().contains(blockState.getBlock())) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Add block | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
blocks.add(blockPos.toImmutable()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Break block if found | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BlockIterator.after(() -> { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -449,9 +493,15 @@ private void onBlockBreakingCooldown(BlockBreakingCooldownEvent event) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
event.cooldown = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Getter for GUI display | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public Block getAutoSelectBlock() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return autoSelectBlock; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public enum ListMode { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Whitelist, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Blacklist | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Blacklist, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AutoSelect | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public enum Mode { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Missing Null Check
Missing null check for mc.world before accessing it. If world is null, NullPointerException will crash the client.
Standards