Skip to content

Commit 137c565

Browse files
authored
Merge pull request #5 from XiLaiTL/master
界面高亮补全测试:添加进入测试页面的命令、能够读取数据包的指定命令进行编辑
2 parents 0174a6d + 0b48be7 commit 137c565

File tree

10 files changed

+432
-174
lines changed

10 files changed

+432
-174
lines changed

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
3+
distributionUrl=https\://maven.fastmirror.net/repositories/gradle-dist/gradle-8.8-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package top.mcfpp.mod.debugger;
22

33
import net.fabricmc.api.ClientModInitializer;
4+
import top.mcfpp.mod.debugger.command.EditCommand;
5+
import top.mcfpp.mod.debugger.gui.EditScreenKeyBinding;
46

57
public class DatapackBreakpointClient implements ClientModInitializer {
68
@Override
79
public void onInitializeClient() {
810
// This entrypoint is suitable for setting up client-specific logic, such as rendering.
911
EditScreenKeyBinding.onInitialize();
12+
EditCommand.onInitialize();
1013
}
1114
}

src/client/java/top/mcfpp/mod/debugger/EditScreen.java

Lines changed: 0 additions & 166 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package top.mcfpp.mod.debugger.command;
2+
3+
import com.mojang.brigadier.suggestion.SuggestionProvider;
4+
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
5+
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
6+
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
7+
import net.minecraft.command.CommandSource;
8+
import net.minecraft.command.argument.IdentifierArgumentType;
9+
import net.minecraft.util.Identifier;
10+
import top.mcfpp.mod.debugger.gui.EditScreen;
11+
12+
13+
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
14+
import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
15+
16+
public class EditCommand {
17+
public static final SuggestionProvider<FabricClientCommandSource> SUGGESTION_PROVIDER = (context, builder) -> {
18+
//CommandSource.suggestIdentifiers(commandFunctionManager.getFunctionTags(), builder, "#");
19+
return CommandSource.suggestIdentifiers(FunctionTextLoader.functionIds(), builder);
20+
};
21+
public static void onInitialize(){
22+
23+
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> {
24+
dispatcher.register(literal("edit")
25+
.requires(source->source.hasPermissionLevel(2))
26+
.executes(context -> {
27+
EditScreen.setOpen(true);
28+
return 1;
29+
})
30+
.then(argument("name", IdentifierArgumentType.identifier())
31+
.suggests(SUGGESTION_PROVIDER)
32+
.executes(context -> {
33+
context.getSource().getClient().executeSync(()->{
34+
Identifier identifier = context.getArgument("name",Identifier.class);
35+
EditScreen.setFunction(identifier);
36+
EditScreen.setOpen(true);
37+
});
38+
return 1;
39+
}))
40+
);
41+
42+
});
43+
44+
ClientTickEvents.END_CLIENT_TICK.register(client -> {
45+
while(EditScreen.isOpen()){
46+
client.setScreen(new EditScreen());
47+
EditScreen.setOpen(false);
48+
}
49+
});
50+
}
51+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package top.mcfpp.mod.debugger.gui;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.Lists;
5+
import com.mojang.brigadier.CommandDispatcher;
6+
import com.mojang.brigadier.ParseResults;
7+
import com.mojang.brigadier.StringReader;
8+
import com.mojang.brigadier.context.CommandContextBuilder;
9+
import com.mojang.brigadier.context.ParsedArgument;
10+
import net.minecraft.command.CommandSource;
11+
import net.minecraft.text.OrderedText;
12+
import net.minecraft.text.Style;
13+
import net.minecraft.util.Formatting;
14+
15+
import java.util.List;
16+
import java.util.Objects;
17+
import java.util.stream.Stream;
18+
19+
public class CommandHighLineUtils {
20+
21+
public static OrderedText highlightOneLine(CommandDispatcher<CommandSource> commandDispatcher, CommandSource commandSource, String original){
22+
StringReader stringReader = new StringReader(original);
23+
boolean bl = stringReader.canRead() && stringReader.peek() == '/';
24+
if (bl) {
25+
stringReader.skip();
26+
}
27+
ParseResults<CommandSource> parse = commandDispatcher.parse(stringReader, commandSource);
28+
return highlight(parse,original,bl?1:0);
29+
}
30+
31+
private static final Style ERROR_STYLE;
32+
private static final Style INFO_STYLE;
33+
private static final List<Style> HIGHLIGHT_STYLES;
34+
static {
35+
ERROR_STYLE = Style.EMPTY.withColor(Formatting.RED);
36+
INFO_STYLE = Style.EMPTY.withColor(Formatting.GRAY);
37+
Stream<Formatting> formattings = Stream.of(Formatting.AQUA, Formatting.YELLOW, Formatting.GREEN, Formatting.LIGHT_PURPLE, Formatting.GOLD);
38+
Style emptyStyle = Style.EMPTY;
39+
Objects.requireNonNull(emptyStyle);
40+
HIGHLIGHT_STYLES = formattings.map(emptyStyle::withColor).collect(ImmutableList.toImmutableList());
41+
}
42+
private static OrderedText highlight(ParseResults<CommandSource> parse, String original, int firstCharacterIndex) {
43+
List<OrderedText> list = Lists.newArrayList();
44+
int i = 0;
45+
int j = -1;
46+
CommandContextBuilder<CommandSource> commandContextBuilder = parse.getContext().getLastChild();
47+
48+
for (ParsedArgument<CommandSource, ?> parsedArgument : commandContextBuilder.getArguments().values()) {
49+
++j;
50+
if (j >= HIGHLIGHT_STYLES.size()) {
51+
j = 0;
52+
}
53+
54+
int k = Math.max(parsedArgument.getRange().getStart() - firstCharacterIndex, 0);
55+
if (k >= original.length()) {
56+
break;
57+
}
58+
59+
int l = Math.min(parsedArgument.getRange().getEnd() - firstCharacterIndex, original.length());
60+
if (l > 0) {
61+
list.add(OrderedText.styledForwardsVisitedString(original.substring(i, k), INFO_STYLE));
62+
list.add(OrderedText.styledForwardsVisitedString(original.substring(k, l), (Style) HIGHLIGHT_STYLES.get(j)));
63+
i = l;
64+
}
65+
}
66+
67+
if (parse.getReader().canRead()) {
68+
int m = Math.max(parse.getReader().getCursor() - firstCharacterIndex, 0);
69+
if (m < original.length()) {
70+
int n = Math.min(m + parse.getReader().getRemainingLength(), original.length());
71+
list.add(OrderedText.styledForwardsVisitedString(original.substring(i, m), INFO_STYLE));
72+
list.add(OrderedText.styledForwardsVisitedString(original.substring(m, n), ERROR_STYLE));
73+
i = n;
74+
}
75+
}
76+
77+
list.add(OrderedText.styledForwardsVisitedString(original.substring(i), INFO_STYLE));
78+
return OrderedText.concat(list);
79+
}
80+
}

0 commit comments

Comments
 (0)