From 6df522482bc78938378bef056c8f61072a847f92 Mon Sep 17 00:00:00 2001 From: GeorgeRNG <81434111+GeorgeRNG@users.noreply.github.com> Date: Sat, 21 Sep 2024 20:50:06 +0100 Subject: [PATCH 1/4] make breaker, needs testing. maybe should require choosing a type --- .../action/impl/PlaceTemplates.java | 35 +++++++++++++++--- .../codeclient/websocket/SocketHandler.java | 37 ++++++++++++++++++- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java b/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java index 9cc2e7b0..dd563681 100644 --- a/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java +++ b/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java @@ -40,6 +40,11 @@ public class PlaceTemplates extends Action { private GoTo goTo = null; private boolean shouldBeSwapping = false; + public PlaceTemplates(ArrayList operations, Callback callback) { + super(callback); + this.operations = operations; + } + public PlaceTemplates(List templates, Callback callback) { super(callback); if (CodeClient.location instanceof Dev plot) { @@ -93,11 +98,11 @@ public PlaceTemplates(HashMap templates, Callback callback) TemplateBlock.Block blockName = TemplateBlock.Block.valueOf(block.block.toUpperCase()); String name = ObjectUtils.firstNonNull(block.action, block.data); for (Map.Entry sign : scan.entrySet()) { // Loop through scanned signs - SignText text = sign.getValue(); // ↓ If the blockName and name match + SignText text = sign.getValue(); // ↓ If the blockName and name match if (text.getMessage(0, false).getString().equals(blockName.name) && text.getMessage(1, false).getString().equals(name)) { - map.put(sign.getKey().east(), item); // Put it into map - leftOvers.remove(item); // Remove the template, so we can see if there's anything left over - break; // break out :D + map.put(sign.getKey().east(), item); // Put it into map + leftOvers.remove(item); // Remove the template, so we can see if there's anything left over + break; // break out :D } } } catch (Exception e) { @@ -165,6 +170,20 @@ public static PlaceTemplates createPlacer(List templates, Callback ca return null; } + public static PlaceTemplates breakTemplates(List names, Callback callback) { + if(CodeClient.location instanceof Dev dev) { // TODO: make this passed in as a parameter + var targets = new ArrayList(); + HashMap scan = dev.scanForSigns(Pattern.compile(".*")); + for (var entry: scan.entrySet()) { + if(names.contains(entry.getValue().getMessage(1,false).getString())) { + targets.add(new DestroyOperation(entry.getKey())); + } + } + return new PlaceTemplates(targets,callback); + } + return null; + } + /** * If there is a template in the way, replace it. */ @@ -260,7 +279,7 @@ public void tick() { } } - private static abstract class Operation { + public static abstract class Operation { protected final BlockPos pos; /** * If this operation can be acted on, and needs to be completed. @@ -317,4 +336,10 @@ public TemplateToPlace(BlockPos pos, ItemStack template) { this.template = template; } } + + private static class DestroyOperation extends Operation { + public DestroyOperation(BlockPos pos) { + super(pos); + } + } } diff --git a/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java b/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java index d41e90f3..6b692fb4 100644 --- a/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java +++ b/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java @@ -25,8 +25,6 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.function.Consumer; -import java.util.function.Function; public class SocketHandler { public static final int PORT = 31375; @@ -96,6 +94,7 @@ public void onMessage(String message) { case "size" -> assertScopeLevel(new Size()); case "scan" -> assertScopeLevel(new Scan()); case "place" -> assertScopeLevel(new Place()); + case "break" -> assertScopeLevel(new Break()); case "inv" -> assertScopeLevel(new SendInventory()); case "setinv" -> assertScopeLevel(new SetInventory(content)); case "give" -> assertScopeLevel(new Give(content)); @@ -426,6 +425,40 @@ private interface CreatePlacer { } } + private class Break extends SocketHandler.Action { + private final ArrayList targets = new ArrayList<>(); + public boolean ready = false; + + Break(){ + super("break", AuthScope.WRITE_CODE); + } + + @Override + public void set(WebSocket responder) { + } + + @Override + public void start(WebSocket responder) { + if (!ready) return; + PlaceTemplates breaker = PlaceTemplates.breakTemplates(targets, SocketHandler.this::next); + if(breaker == null) return; + CodeClient.currentAction = breaker; + breaker.init(); + } + + @Override + public void message(WebSocket responder, String message) { + if(message.equals("go")) { + ready = true; + if (Objects.equals(actionQueue.get(0), this)) { + this.start(responder); + } + } else { + targets.add(message); + } + } + } + private class SendInventory extends SocketHandler.Action { SendInventory() { super("inv", AuthScope.INVENTORY); From 62164f1d86e3d6b7335a30a7640d45457e2180b6 Mon Sep 17 00:00:00 2001 From: GeorgeRNG <81434111+GeorgeRNG@users.noreply.github.com> Date: Sun, 15 Dec 2024 18:52:43 +0000 Subject: [PATCH 2/4] break command (pain) --- .../action/impl/PlaceTemplates.java | 23 ++++++++++++++++--- .../codeclient/websocket/SocketHandler.java | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java b/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java index 2b3ff2e5..3818ff41 100644 --- a/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java +++ b/src/main/java/dev/dfonline/codeclient/action/impl/PlaceTemplates.java @@ -171,8 +171,15 @@ public static PlaceTemplates breakTemplates(List names, Callback callbac var targets = new ArrayList(); HashMap scan = dev.scanForSigns(Pattern.compile(".*")); for (var entry: scan.entrySet()) { - if(names.contains(entry.getValue().getMessage(1,false).getString())) { - targets.add(new DestroyOperation(entry.getKey())); + var sign = entry.getValue(); + for (var name : names) { + var type = name.split(" ")[0]; + var action = name.substring(type.length() + 1); + if (type.equals("any") || sign.getMessage(0, false).getString().toLowerCase().contains(type.toLowerCase())) { + if (action.equals(sign.getMessage(1, false).getString())) { + targets.add(new DestroyOperation(entry.getKey())); + } + } } } return new PlaceTemplates(targets,callback); @@ -212,7 +219,7 @@ public boolean onReceivePacket(Packet packet) { block.state = blockState; } }); - if (operation instanceof TemplateToPlace) { + if (operation instanceof TemplateToPlace || operation instanceof DestroyOperation) { if (!block.isTemplate) continue; operation.setComplete(); } @@ -256,6 +263,16 @@ public void tick() { ((ClientPlayerInteractionManagerAccessor) (CodeClient.MC.interactionManager)).invokeSequencedPacket(CodeClient.MC.world, sequence -> new PlayerInteractBlockC2SPacket(Hand.MAIN_HAND, blockHitResult, sequence)); template.setOpen(false); } + if (operation instanceof DestroyOperation destroy) { + var player = CodeClient.MC.player; + boolean sneaky = !player.isSneaking(); + if (sneaky) + net.sendPacket(new ClientCommandC2SPacket(player, ClientCommandC2SPacket.Mode.PRESS_SHIFT_KEY)); + net.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.START_DESTROY_BLOCK, destroy.pos, Direction.UP)); + net.sendPacket(new PlayerActionC2SPacket(PlayerActionC2SPacket.Action.ABORT_DESTROY_BLOCK, destroy.pos, Direction.UP)); + if (sneaky) + net.sendPacket(new ClientCommandC2SPacket(player, ClientCommandC2SPacket.Mode.RELEASE_SHIFT_KEY)); + } } return; } diff --git a/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java b/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java index 44328f43..95d40535 100644 --- a/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java +++ b/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java @@ -487,9 +487,9 @@ public void start(WebSocket responder) { @Override public void message(WebSocket responder, String message) { - if(message.equals("go")) { + if(message.isEmpty() && !targets.isEmpty()) { ready = true; - if (Objects.equals(actionQueue.get(0), this)) { + if (Objects.equals(actionQueue.getFirst(), this)) { this.start(responder); } } else { From f07b04f55ae2364efa24d393e0b29e469b83b133 Mon Sep 17 00:00:00 2001 From: GeorgeRNG <81434111+GeorgeRNG@users.noreply.github.com> Date: Fri, 12 Sep 2025 21:49:01 +0100 Subject: [PATCH 3/4] actions don't actually know when the message is empty I think --- .../java/dev/dfonline/codeclient/websocket/SocketHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java b/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java index 95d40535..3330a631 100644 --- a/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java +++ b/src/main/java/dev/dfonline/codeclient/websocket/SocketHandler.java @@ -487,7 +487,7 @@ public void start(WebSocket responder) { @Override public void message(WebSocket responder, String message) { - if(message.isEmpty() && !targets.isEmpty()) { + if(message.equals("go") && !targets.isEmpty()) { ready = true; if (Objects.equals(actionQueue.getFirst(), this)) { this.start(responder); From b4e7ec0a5368775e8665abcc7423ce593ee017be Mon Sep 17 00:00:00 2001 From: GeorgeRNG <81434111+GeorgeRNG@users.noreply.github.com> Date: Fri, 12 Sep 2025 21:49:22 +0100 Subject: [PATCH 4/4] i couldn't run and debug I guess I needed this --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index df9cfbd9..9738cd9e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.jvmargs=-Xmx1G ## Check these on https://fabricmc.net/develop/ minecraft_version=1.21.3 yarn_mappings=1.21.3+build.2 -loader_version=0.16.9 +loader_version=0.17.2 # Mod Properties mod_version=2.0.0-beta.4 @@ -13,7 +13,7 @@ maven_group=dev.dfonline archives_base_name=CodeClient # Dependencies -fabric_version=0.108.0+1.21.3 +fabric_version=0.114.1+1.21.3 modmenu_version=12.0.0-beta.1 yacl_version=3.6.1+1.21.2-fabric adventure_api_version=4.17.0