Skip to content

Commit b962d37

Browse files
committed
Merge remote-tracking branch 'upstream'
2 parents 2be7bf7 + a159aa0 commit b962d37

File tree

7 files changed

+155
-6
lines changed

7 files changed

+155
-6
lines changed

src/main/java/dev/xpple/seedmapper/SeedMapper.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.mojang.blaze3d.platform.InputConstants;
44
import com.mojang.brigadier.CommandDispatcher;
55
import dev.xpple.betterconfig.api.ModConfigBuilder;
6+
import dev.xpple.seedmapper.command.arguments.DurationArgument;
67
import dev.xpple.seedmapper.command.arguments.MapFeatureArgument;
78
import dev.xpple.seedmapper.command.arguments.SeedIdentifierArgument;
89
import dev.xpple.seedmapper.command.arguments.SeedResolutionArgument;
@@ -19,6 +20,7 @@
1920
import dev.xpple.seedmapper.command.commands.SourceCommand;
2021
import dev.xpple.seedmapper.command.commands.StopTaskCommand;
2122
import dev.xpple.seedmapper.config.Configs;
23+
import dev.xpple.seedmapper.config.DurationAdapter;
2224
import dev.xpple.seedmapper.config.MapFeatureAdapter;
2325
import dev.xpple.seedmapper.config.SeedIdentifierAdapter;
2426
import dev.xpple.seedmapper.config.SeedResolutionAdapter;
@@ -41,11 +43,13 @@
4143
import net.fabricmc.loader.api.ModContainer;
4244
import net.minecraft.client.KeyMapping;
4345
import net.minecraft.commands.CommandBuildContext;
46+
import net.minecraft.resources.Identifier;
4447

4548
import java.io.IOException;
4649
import java.nio.file.Files;
4750
import java.nio.file.Path;
4851
import java.nio.file.StandardCopyOption;
52+
import java.time.Duration;
4953

5054
public class SeedMapper implements ClientModInitializer {
5155

@@ -73,6 +77,7 @@ public void onInitializeClient() {
7377
.registerType(SeedIdentifier.class, new SeedIdentifierAdapter(), SeedIdentifierArgument::seedIdentifier)
7478
.registerType(SeedResolutionArgument.SeedResolution.class, new SeedResolutionAdapter(), SeedResolutionArgument::seedResolution)
7579
.registerTypeHierarchy(MapFeature.class, new MapFeatureAdapter(), MapFeatureArgument::mapFeature)
80+
.registerType(Duration.class, new DurationAdapter(), DurationArgument::duration)
7681
.registerGlobalChangeHook(event -> {
7782
if (event.config().equals("DevMode")) {
7883
try {
@@ -91,8 +96,9 @@ public void onInitializeClient() {
9196

9297
SeedDatabaseHelper.fetchSeeds();
9398

94-
KeyMapping seedMapKeyMapping = KeyBindingHelper.registerKeyBinding(new KeyMapping("key.seedMap", InputConstants.KEY_M, KeyMapping.Category.GAMEPLAY));
95-
KeyMapping minimapKeyMapping = KeyBindingHelper.registerKeyBinding(new KeyMapping("key.seedMapMinimap", InputConstants.KEY_COMMA, KeyMapping.Category.GAMEPLAY));
99+
KeyMapping.Category category = KeyMapping.Category.register(Identifier.fromNamespaceAndPath(MOD_ID, MOD_ID));
100+
KeyMapping seedMapKeyMapping = KeyBindingHelper.registerKeyBinding(new KeyMapping("key.seedMap", InputConstants.KEY_M, category));
101+
KeyMapping minimapKeyMapping = KeyBindingHelper.registerKeyBinding(new KeyMapping("key.minimap", InputConstants.KEY_COMMA, category));
96102
ClientTickEvents.END_CLIENT_TICK.register(minecraft -> {
97103
while (seedMapKeyMapping.consumeClick()) {
98104
minecraft.player.connection.sendCommand("sm:seedmap");
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package dev.xpple.seedmapper.command.arguments;
2+
3+
import com.mojang.brigadier.StringReader;
4+
import com.mojang.brigadier.arguments.ArgumentType;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
7+
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
8+
import com.mojang.brigadier.suggestion.Suggestions;
9+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
10+
import dev.xpple.seedmapper.command.CustomClientCommandSource;
11+
import it.unimi.dsi.fastutil.objects.Object2IntMap;
12+
import it.unimi.dsi.fastutil.objects.Object2IntMaps;
13+
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
14+
import net.minecraft.commands.SharedSuggestionProvider;
15+
import net.minecraft.network.chat.Component;
16+
import net.minecraft.util.TimeUtil;
17+
import net.minecraft.util.Util;
18+
19+
import java.time.Duration;
20+
import java.util.Collection;
21+
import java.util.List;
22+
import java.util.concurrent.CompletableFuture;
23+
import java.util.function.Consumer;
24+
25+
public class DurationArgument implements ArgumentType<Duration> {
26+
27+
private static final Collection<String> EXAMPLES = List.of("5s", "10m", "3h");
28+
29+
private static final SimpleCommandExceptionType INVALID_UNIT_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("argument.time.invalid_unit"));
30+
31+
public static DurationArgument duration() {
32+
return new DurationArgument();
33+
}
34+
35+
public static DurationArgument getDuration(CommandContext<CustomClientCommandSource> context, String name) {
36+
return context.getArgument(name, DurationArgument.class);
37+
}
38+
39+
@Override
40+
public Duration parse(StringReader reader) throws CommandSyntaxException {
41+
return new Parser(reader).parse();
42+
}
43+
44+
@Override
45+
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
46+
StringReader reader = new StringReader(builder.getInput());
47+
reader.setCursor(builder.getStart());
48+
49+
Parser parser = new Parser(reader);
50+
51+
try {
52+
parser.parse();
53+
} catch (CommandSyntaxException ignored) {
54+
}
55+
56+
if (parser.suggester != null) {
57+
parser.suggester.accept(builder);
58+
}
59+
60+
return builder.buildFuture();
61+
}
62+
63+
@Override
64+
public Collection<String> getExamples() {
65+
return EXAMPLES;
66+
}
67+
68+
private static final class Parser {
69+
70+
private static final Object2IntMap<String> UNITS = Util.make(() -> {
71+
Object2IntMap<String> temp = new Object2IntOpenHashMap<>();
72+
73+
temp.put("s", 1);
74+
temp.put("m", TimeUtil.SECONDS_PER_MINUTE);
75+
temp.put("h", (int) TimeUtil.SECONDS_PER_HOUR);
76+
77+
return Object2IntMaps.unmodifiable(temp);
78+
});
79+
80+
private final StringReader reader;
81+
private Consumer<SuggestionsBuilder> suggester;
82+
83+
private Parser(StringReader reader) {
84+
this.reader = reader;
85+
}
86+
87+
private Duration parse() throws CommandSyntaxException {
88+
float durationRaw = reader.readFloat();
89+
int cursor = reader.getCursor();
90+
suggester = builder -> {
91+
SuggestionsBuilder newBuilder = builder.createOffset(cursor);
92+
SharedSuggestionProvider.suggest(UNITS.keySet(), newBuilder);
93+
builder.add(newBuilder);
94+
};
95+
String string = reader.readUnquotedString();
96+
int unit = UNITS.getOrDefault(string, -1);
97+
if (unit == -1) {
98+
throw INVALID_UNIT_EXCEPTION.create();
99+
}
100+
int durationSeconds = Math.round(durationRaw * unit);
101+
return Duration.ofSeconds(durationSeconds);
102+
}
103+
}
104+
}

src/main/java/dev/xpple/seedmapper/config/Configs.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import dev.xpple.betterconfig.api.ModConfig;
77
import dev.xpple.seedmapper.SeedMapper;
88
import dev.xpple.seedmapper.command.arguments.SeedResolutionArgument;
9+
import dev.xpple.seedmapper.render.RenderManager;
910
import dev.xpple.seedmapper.seedmap.MapFeature;
1011
import dev.xpple.seedmapper.seedmap.SeedMapMinimapManager;
1112
import dev.xpple.seedmapper.seedmap.SeedMapScreen;
@@ -19,6 +20,7 @@
1920
import dev.xpple.seedmapper.render.esp.EspStyle;
2021

2122
import java.net.SocketAddress;
23+
import java.time.Duration;
2224
import java.util.EnumSet;
2325
import java.util.HashMap;
2426
import java.util.Map;
@@ -265,7 +267,7 @@ public static void applyWaypointCompassOverlaySetting() {
265267
return toggledFeatures;
266268
});
267269

268-
public static Component listToggledFeatures() {
270+
private static Component listToggledFeatures() {
269271
return join(Component.literal(", "), ToggledFeatures.stream()
270272
.map(MapFeature::getName)
271273
.map(Component::literal));
@@ -274,7 +276,7 @@ public static Component listToggledFeatures() {
274276
@Config(comment = "getDevModeComment")
275277
public static boolean DevMode = false;
276278

277-
public static Component getDevModeComment() {
279+
private static Component getDevModeComment() {
278280
return Component.translatable("config.devMode.comment");
279281
}
280282

@@ -376,4 +378,9 @@ private static boolean applyWorldPresetInternal(String presetId) {
376378
notifySeedConsumers(generatorFlags);
377379
return true;
378380
}
381+
@Config(onChange = "updateHighlightDuration")
382+
public static Duration HighlightDuration = Duration.ofMinutes(5);
383+
private static void updateHighlightDuration(Duration oldValue, Duration newValue) {
384+
RenderManager.rebuildLineSet();
385+
}
379386
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package dev.xpple.seedmapper.config;
2+
3+
import com.google.gson.TypeAdapter;
4+
import com.google.gson.stream.JsonReader;
5+
import com.google.gson.stream.JsonWriter;
6+
7+
import java.io.IOException;
8+
import java.time.Duration;
9+
10+
public class DurationAdapter extends TypeAdapter<Duration> {
11+
@Override
12+
public void write(JsonWriter writer, Duration duration) throws IOException {
13+
writer.value(duration.toString());
14+
}
15+
16+
@Override
17+
public Duration read(JsonReader reader) throws IOException {
18+
return Duration.parse(reader.nextString());
19+
}
20+
}

src/main/java/dev/xpple/seedmapper/render/RenderManager.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,17 @@ private RenderManager() {
4646
private static final byte AXIS_X = 0;
4747
private static final byte AXIS_Y = 1;
4848
private static final byte AXIS_Z = 2;
49+
private static Set<Line> lines = Collections.emptySet();
50+
static {
51+
rebuildLineSet();
52+
}
53+
54+
public static void rebuildLineSet() {
55+
Set<Line> temp = lines;
56+
lines = Collections.newSetFromMap(CacheBuilder.newBuilder().expireAfterWrite(Configs.HighlightDuration).<Line, Boolean>build().asMap());
57+
lines.addAll(temp);
58+
temp.clear();
59+
}
4960

5061
public static void drawBoxes(Collection<BlockPos> posBatch, EspStyle style, int fallbackColor) {
5162
if (posBatch.isEmpty()) {

src/main/resources/assets/seedmapper/lang/en_us.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"commands.exceptions.noSeedAvailable": "No seed available, set it using the /cconfig command.",
2+
"commands.exceptions.noSeedAvailable": "No seed available, set it using the /sm:config command.",
33
"commands.exceptions.alreadyBusyLocating": "Already busy locating something [%s].",
44
"commands.exceptions.alreadyBusyLocating.stopTask": "stop task",
55
"commands.exceptions.alreadyBusyLocating.clickToStop": "Click to stop the task",
@@ -100,6 +100,7 @@
100100
"config.manualWaypointCompassOverlay.comment": "Set the waypoint compass overlay to be manually toggled instead of automatic.",
101101
"config.worldBorder.comment": "Limits the seed map to a square world border radius in blocks. Use 0 to disable.",
102102

103+
"key.category.seedmapper.seedmapper": "SeedMapper",
103104
"key.seedMap": "Seed map",
104105
"key.minimap": "Seed minimap",
105106

src/main/resources/assets/seedmapper/lang/zh_cn.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"commands.exceptions.noSeedAvailable": "无可用种子,请使用 /cconfig 命令设置。",
2+
"commands.exceptions.noSeedAvailable": "无可用种子,请使用 /sm:config 命令设置。",
33
"commands.exceptions.alreadyBusyLocating": "已在定位其他目标 [%s]。",
44
"commands.exceptions.alreadyBusyLocating.stopTask": "停止任务",
55
"commands.exceptions.alreadyBusyLocating.clickToStop": "点击停止任务",

0 commit comments

Comments
 (0)