Skip to content

Commit 3d1a7d2

Browse files
authored
Merge pull request #130 from DFOnline/feat/rewamped-search
revamp search
2 parents 64e2780 + a1f3114 commit 3d1a7d2

File tree

10 files changed

+193
-43
lines changed

10 files changed

+193
-43
lines changed

src/main/java/dev/dfonline/codeclient/command/CommandManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ public class CommandManager {
3737
new CommandUuid(),
3838
new CommandWidthDump(),
3939
new CommandWorldPlot(),
40-
new CommandClearQueue()
40+
new CommandClearQueue(),
41+
new CommandHighlight()
4142
);
4243

4344
public static void init(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dev.dfonline.codeclient.command.impl;
2+
3+
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
4+
import dev.dfonline.codeclient.command.Command;
5+
import dev.dfonline.codeclient.dev.SignOutlineRenderer;
6+
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
7+
import net.minecraft.command.CommandRegistryAccess;
8+
import net.minecraft.util.math.BlockPos;
9+
10+
import static com.mojang.brigadier.arguments.IntegerArgumentType.integer;
11+
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
12+
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
13+
14+
public class CommandHighlight extends Command {
15+
16+
@Override
17+
public String name() {
18+
return "highlight";
19+
}
20+
21+
@Override
22+
public LiteralArgumentBuilder<FabricClientCommandSource> create(LiteralArgumentBuilder<FabricClientCommandSource> cmd, CommandRegistryAccess registryAccess) {
23+
return cmd.then(argument("x", integer()).then(argument("y", integer()).then(argument("z", integer()).executes(context -> {
24+
var x = context.getArgument("x", Integer.class);
25+
var y = context.getArgument("y", Integer.class);
26+
var z = context.getArgument("z", Integer.class);
27+
28+
SignOutlineRenderer.highlightedSign = new BlockPos(x, y, z);
29+
return 0;
30+
}))))
31+
.then(literal("clear").executes(context -> {
32+
SignOutlineRenderer.highlightedSign = null;
33+
return 0;
34+
}));
35+
}
36+
37+
}

src/main/java/dev/dfonline/codeclient/command/impl/CommandJump.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ private static void jump(JumpType type, String name) {
5252
}
5353
}
5454

55-
public static CompletableFuture<Suggestions> suggestJump(JumpType type, CommandContext<FabricClientCommandSource> ignored, SuggestionsBuilder builder) {
55+
public static CompletableFuture<Suggestions> suggestJump(JumpType type, CommandContext<FabricClientCommandSource> ignored, SuggestionsBuilder builder, boolean lineStarters) {
5656
if (CodeClient.location instanceof Dev dev) {
5757
var possibilities = new ArrayList<String>();
5858

59-
for (var lineStarter : dev.getLineStartCache().values()) {
60-
if (type.pattern.matcher(lineStarter.getMessage(0, false).getString()).matches())
61-
possibilities.add(lineStarter.getMessage(1, false).getString());
59+
60+
61+
for (var signText : lineStarters ? dev.getLineStartCache().values() : dev.getActionCache().values()) {
62+
if (type.pattern.matcher(signText.getMessage(0, false).getString()).matches())
63+
possibilities.add(signText.getMessage(1, false).getString());
6264
}
6365

6466
for (String possibility : possibilities) {
@@ -81,22 +83,22 @@ public String[] aliases() {
8183

8284
@Override
8385
public LiteralArgumentBuilder<FabricClientCommandSource> create(LiteralArgumentBuilder<FabricClientCommandSource> cmd, CommandRegistryAccess registryAccess) {
84-
return cmd.then(literal("player").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.PLAYER_EVENT, context, builder)).executes(context -> {
86+
return cmd.then(literal("player").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.PLAYER_EVENT, context, builder, true)).executes(context -> {
8587
var name = context.getArgument("name", String.class);
8688
jump(JumpType.PLAYER_EVENT, name);
8789
return 0;
8890
})))
89-
.then(literal("entity").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.ENTITY_EVENT, context, builder)).executes(context -> {
91+
.then(literal("entity").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.ENTITY_EVENT, context, builder, true)).executes(context -> {
9092
var name = context.getArgument("name", String.class);
9193
jump(JumpType.ENTITY_EVENT, name);
9294
return 0;
9395
})))
94-
.then(literal("func").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.FUNCTION, context, builder)).executes(context -> {
96+
.then(literal("func").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.FUNCTION, context, builder, true)).executes(context -> {
9597
var name = context.getArgument("name", String.class);
9698
jump(JumpType.FUNCTION, name);
9799
return 0;
98100
})))
99-
.then(literal("proc").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.PROCESS, context, builder)).executes(context -> {
101+
.then(literal("proc").then(argument("name", greedyString()).suggests((context, builder) -> suggestJump(JumpType.PROCESS, context, builder, true)).executes(context -> {
100102
var name = context.getArgument("name", String.class);
101103
jump(JumpType.PROCESS, name);
102104
return 0;
@@ -108,7 +110,8 @@ public enum JumpType {
108110
ENTITY_EVENT("ENTITY EVENT"),
109111
FUNCTION("FUNCTION"),
110112
PROCESS("PROCESS"),
111-
ANY("(((PLAYER)|(ENTITY)) EVENT)|(FUNCTION)|(PROCESS)");
113+
ANY("(((PLAYER)|(ENTITY)) EVENT)|(FUNCTION)|(PROCESS)"),
114+
ACTIONS("(PLAYER|ENTITY|GAME) ACTION|CALL FUNCTION|START PROCESS|CONTROL|REPEAT|SET VARIABLE|SELECT OBJECT|IF (GAME|ENTITY|PLAYER|VARIABLE)");
112115

113116
public final Pattern pattern;
114117

src/main/java/dev/dfonline/codeclient/command/impl/CommandSearch.java

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import dev.dfonline.codeclient.command.Command;
99
import dev.dfonline.codeclient.location.Dev;
1010
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
11-
import net.fabricmc.loader.api.FabricLoader;
1211
import net.minecraft.command.CommandRegistryAccess;
1312
import net.minecraft.text.ClickEvent;
1413
import net.minecraft.text.HoverEvent;
@@ -32,18 +31,16 @@ public String name() {
3231
public void register(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
3332
super.register(dispatcher, registryAccess);
3433

35-
// Add 'search' alias if recode is not loaded.
36-
if (!FabricLoader.getInstance().isModLoaded("recode")) {
37-
dispatcher.register(create(literal("search"), registryAccess));
38-
}
34+
dispatcher.register(create(literal("search"), registryAccess));
35+
3936
}
4037

4138
@Override
4239
public LiteralArgumentBuilder<FabricClientCommandSource> create(LiteralArgumentBuilder<FabricClientCommandSource> cmd, CommandRegistryAccess registryAccess) {
43-
return cmd.then(argument("query", greedyString()).suggests((context, builder) -> CommandJump.suggestJump(CommandJump.JumpType.ANY, context, builder)).executes(context -> {
40+
return cmd.then(argument("query", greedyString()).suggests((context, builder) -> CommandJump.suggestJump(CommandJump.JumpType.ACTIONS, context, builder, false)).executes(context -> {
4441
if (CodeClient.location instanceof Dev dev) {
4542
var query = context.getArgument("query", String.class);
46-
var results = dev.scanForSigns(CommandJump.JumpType.ANY.pattern, Pattern.compile("^.*" + Pattern.quote(query) + ".*$", Pattern.CASE_INSENSITIVE));
43+
var results = dev.scanForSigns(CommandJump.JumpType.ACTIONS.pattern, Pattern.compile("^.*" + Pattern.quote(query) + ".*$", Pattern.CASE_INSENSITIVE));
4744

4845
if (results == null || results.isEmpty()) {
4946
Utility.sendMessage(Text.translatable("codeclient.search.no_results"), ChatType.INFO);
@@ -53,23 +50,26 @@ public LiteralArgumentBuilder<FabricClientCommandSource> create(LiteralArgumentB
5350
var message = Text.translatable("codeclient.search.results");
5451
results.forEach((pos, text) -> {
5552
var type = text.getMessage(0, false).getString();
56-
var name = text.getMessage(1, false).getString();
57-
58-
String sub;
59-
if (CommandJump.JumpType.PLAYER_EVENT.pattern.matcher(type).matches()) sub = "player";
60-
else if (CommandJump.JumpType.ENTITY_EVENT.pattern.matcher(type).matches()) sub = "entity";
61-
else if (CommandJump.JumpType.FUNCTION.pattern.matcher(type).matches()) sub = "func";
62-
else if (CommandJump.JumpType.PROCESS.pattern.matcher(type).matches()) sub = "proc";
63-
else return;
53+
var name = text.getMessage(1, false).getString().trim();
6454

65-
var action = Text.empty().append(" [⏼]").setStyle(Style.EMPTY
66-
.withColor(Formatting.GREEN)
67-
.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/jump %s %s", sub, name)))
68-
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.translatable("codeclient.search.hover.teleport", pos.getX(), pos.getY(), pos.getZ())))
55+
var highlightAction = Text.empty().append(" [⏼]").setStyle(Style.EMPTY
56+
.withColor(0xFF7FAA)
57+
.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/highlight %s %s %s", pos.getX(), pos.getY(), pos.getZ())))
58+
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.translatable("codeclient.search.hover.highlight", pos.getX(), pos.getY(), pos.getZ())))
6959
);
70-
var entry = Text.empty().append("\n • ").formatted(Formatting.GREEN)
71-
.append(Text.empty().append(name).formatted(Formatting.WHITE))
72-
.append(action);
60+
61+
Style actionStyle = getActionColor(type);
62+
63+
var entry = Text.empty().append("\n ⏹ ").setStyle(actionStyle
64+
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
65+
Text.empty().append(type).setStyle(actionStyle))
66+
)
67+
)
68+
.append(Text.empty().append(name).setStyle(Style.EMPTY
69+
.withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/ptp %s %s %s", pos.getX(), pos.getY(), pos.getZ())))
70+
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.translatable("codeclient.search.hover.teleport", pos.getX(), pos.getY(), pos.getZ())))
71+
))
72+
.append(highlightAction);
7373
message.append(entry);
7474
});
7575

@@ -80,4 +80,22 @@ public LiteralArgumentBuilder<FabricClientCommandSource> create(LiteralArgumentB
8080
return 0;
8181
}));
8282
}
83+
84+
private static Style getActionColor(String type) {
85+
return switch (type) {
86+
case "CONTROL" -> Style.EMPTY.withColor(Formatting.BLACK);
87+
case "SELECT OBJECT" -> Style.EMPTY.withColor(Formatting.LIGHT_PURPLE);
88+
case "REPEAT" -> Style.EMPTY.withColor(Formatting.DARK_AQUA);
89+
case "SET VARIABLE" -> Style.EMPTY.withColor(Formatting.WHITE);
90+
case "GAME ACTION" -> Style.EMPTY.withColor(Formatting.RED);
91+
case "IF GAME" -> Style.EMPTY.withColor(Formatting.DARK_RED);
92+
case "ENTITY ACTION" -> Style.EMPTY.withColor(Formatting.DARK_GREEN);
93+
case "PLAYER ACTION" -> Style.EMPTY.withColor(Formatting.GRAY);
94+
case "IF PLAYER" -> Style.EMPTY.withColor(Formatting.GOLD);
95+
case "CALL FUNCTION" -> Style.EMPTY.withColor(Formatting.BLUE);
96+
case "START PROCESS" -> Style.EMPTY.withColor(Formatting.GREEN);
97+
case "IF ENTITY" -> Style.EMPTY.withColor(0xFFA85B);
98+
default -> Style.EMPTY.withColor(Formatting.DARK_GRAY);
99+
};
100+
}
83101
}

src/main/java/dev/dfonline/codeclient/config/Config.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,17 @@
55
import dev.dfonline.codeclient.FileManager;
66
import dev.dfonline.codeclient.dev.menu.customchest.CustomChestNumbers;
77
import dev.dfonline.codeclient.hypercube.actiondump.ActionDump;
8-
import dev.isxander.yacl3.api.*;
9-
import dev.isxander.yacl3.api.controller.*;
8+
import dev.isxander.yacl3.api.ConfigCategory;
9+
import dev.isxander.yacl3.api.Option;
10+
import dev.isxander.yacl3.api.OptionDescription;
11+
import dev.isxander.yacl3.api.OptionFlag;
12+
import dev.isxander.yacl3.api.OptionGroup;
13+
import dev.isxander.yacl3.api.YetAnotherConfigLib;
14+
import dev.isxander.yacl3.api.controller.ColorControllerBuilder;
15+
import dev.isxander.yacl3.api.controller.FloatSliderControllerBuilder;
16+
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
17+
import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
18+
import dev.isxander.yacl3.api.controller.TickBoxControllerBuilder;
1019
import dev.isxander.yacl3.gui.controllers.cycling.EnumController;
1120
import dev.isxander.yacl3.impl.controller.IntegerFieldControllerBuilderImpl;
1221
import net.minecraft.text.ClickEvent;
@@ -15,7 +24,7 @@
1524
import net.minecraft.text.Text;
1625
import net.minecraft.util.Formatting;
1726

18-
import java.awt.*;
27+
import java.awt.Color;
1928
import java.nio.charset.Charset;
2029
import java.nio.charset.StandardCharsets;
2130

@@ -59,6 +68,7 @@ public class Config {
5968
public boolean UseSelectionColor = true;
6069
public int Line4Color = 0xFF8800;
6170
public boolean SignPeeker = true;
71+
public int SignHighlightColor = 0xFF7FAA;
6272
public CustomChestMenuType CustomCodeChest = CustomChestMenuType.OFF;
6373
public boolean PickAction = true;
6474
public boolean AdvancedMiddleClick = false;
@@ -153,12 +163,12 @@ public void save() {
153163
object.addProperty("PickAction", PickAction);
154164
object.addProperty("AdvancedMiddleClick", AdvancedMiddleClick);
155165
object.addProperty("DevForBuild", DevForBuild);
156-
object.addProperty("ChatEditsVars",ChatEditsVars);
157-
object.addProperty("InsertOverlay",InsertOverlay);
158-
object.addProperty("ParameterGhosts",ParameterGhosts);
159-
object.addProperty("ActionViewer",ActionViewer);
160-
object.addProperty("InvertActionViewerScroll",InvertActionViewerScroll);
161-
object.addProperty("ActionViewerLocation",ActionViewerLocation.name());
166+
object.addProperty("ChatEditsVars", ChatEditsVars);
167+
object.addProperty("InsertOverlay", InsertOverlay);
168+
object.addProperty("ParameterGhosts", ParameterGhosts);
169+
object.addProperty("ActionViewer", ActionViewer);
170+
object.addProperty("InvertActionViewerScroll", InvertActionViewerScroll);
171+
object.addProperty("ActionViewerLocation", ActionViewerLocation.name());
162172
object.addProperty("RecentValues", RecentValues);
163173
object.addProperty("PhaseToggle", PhaseToggle);
164174
object.addProperty("DestroyItemResetMode", DestroyItemResetMode.name());
@@ -168,8 +178,8 @@ public void save() {
168178
object.addProperty("CPUDisplay", CPUDisplay);
169179
object.addProperty("CPUDisplayCorner", CPUDisplayCorner.name());
170180
object.addProperty("HideScopeChangeMessages", HideScopeChangeMessages);
171-
object.addProperty("StateSwitcher",StateSwitcher);
172-
object.addProperty("SpeedSwitcher",SpeedSwitcher);
181+
object.addProperty("StateSwitcher", StateSwitcher);
182+
object.addProperty("SpeedSwitcher", SpeedSwitcher);
173183
object.addProperty("AutoUpdateOption", AutoUpdateOption.name());
174184
object.addProperty("HighlighterEnabled", HighlighterEnabled);
175185
object.addProperty("HighlightExpressions", HighlightExpressions);
@@ -1047,6 +1057,7 @@ public enum DestroyItemReset {
10471057
COMPACT("rc");
10481058

10491059
public String command;
1060+
10501061
DestroyItemReset(String command) {
10511062
this.command = command;
10521063
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package dev.dfonline.codeclient.dev;
2+
3+
import dev.dfonline.codeclient.CodeClient;
4+
import dev.dfonline.codeclient.Feature;
5+
import dev.dfonline.codeclient.config.Config;
6+
import dev.dfonline.codeclient.location.Dev;
7+
import net.minecraft.block.entity.SignBlockEntity;
8+
import net.minecraft.client.render.RenderLayer;
9+
import net.minecraft.client.render.VertexConsumerProvider;
10+
import net.minecraft.client.render.VertexRendering;
11+
import net.minecraft.client.util.math.MatrixStack;
12+
import net.minecraft.util.math.BlockPos;
13+
import net.minecraft.util.shape.VoxelShape;
14+
15+
public class SignOutlineRenderer extends Feature {
16+
17+
public static BlockPos highlightedSign = null;
18+
19+
public static void render(SignBlockEntity sign, MatrixStack matrices, VertexConsumerProvider vertexConsumers) {
20+
if(CodeClient.location instanceof Dev) {
21+
if (highlightedSign == null || !highlightedSign.equals(sign.getPos())) return;
22+
matrices.push();
23+
24+
VoxelShape signShape = CodeClient.MC.world.getBlockState(sign.getPos()).getOutlineShape(CodeClient.MC.world, sign.getPos());
25+
VertexRendering.drawOutline(matrices, vertexConsumers.getBuffer(RenderLayer.getLines()), signShape, 0, 0, 0, Config.getConfig().SignHighlightColor);
26+
27+
matrices.pop();
28+
}
29+
}
30+
}

src/main/java/dev/dfonline/codeclient/location/Plot.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.dfonline.codeclient.location;
22

33
import dev.dfonline.codeclient.CodeClient;
4+
import dev.dfonline.codeclient.command.impl.CommandJump;
45
import net.minecraft.block.entity.BlockEntity;
56
import net.minecraft.block.entity.SignBlockEntity;
67
import net.minecraft.block.entity.SignText;
@@ -29,6 +30,7 @@ public abstract class Plot extends Location {
2930
protected Boolean hasDev;
3031
protected Size size;
3132
protected HashMap<BlockPos, SignText> lineStarterCache = new HashMap<>();
33+
protected HashMap<BlockPos, SignText> actionCache = new HashMap<>();
3234

3335
public void setOrigin(int x, int z) {
3436
this.originX = x;
@@ -169,6 +171,14 @@ public HashMap<BlockPos, SignText> scanForSigns(Pattern scan) {
169171
return scanForSigns(Pattern.compile("(PLAYER|ENTITY) EVENT|FUNCTION|PROCESS"), scan);
170172
}
171173

174+
/**
175+
* Searches for all actions which match the name argument.
176+
* Returns null if the plot origin is unknown.
177+
*/
178+
public HashMap<BlockPos, SignText> scanForActionSigns(Pattern scan) {
179+
return scanForSigns(CommandJump.JumpType.ACTIONS.pattern, scan);
180+
}
181+
172182
public void clearLineStarterCache() {
173183
lineStarterCache.clear();
174184
}
@@ -183,6 +193,20 @@ public Map<BlockPos, SignText> getLineStartCache() {
183193
return lineStarterCache;
184194
}
185195

196+
public void clearActionCache() {
197+
actionCache.clear();
198+
}
199+
200+
private void fillActionCache() {
201+
clearActionCache();
202+
actionCache = scanForActionSigns(Pattern.compile(".*"));
203+
}
204+
205+
public Map<BlockPos, SignText> getActionCache() {
206+
if (actionCache.isEmpty()) fillActionCache();
207+
return actionCache;
208+
}
209+
186210
/**
187211
* Will return <b>null</b> when there is no room.
188212
*/

0 commit comments

Comments
 (0)