Skip to content

Commit 02697db

Browse files
committed
Merge remote-tracking branch 'upstream'
2 parents 252817c + 704c174 commit 02697db

23 files changed

+644
-93
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.mojang.brigadier.CommandDispatcher;
55
import dev.xpple.betterconfig.api.ModConfigBuilder;
66
import dev.xpple.seedmapper.command.arguments.MapFeatureArgument;
7+
import dev.xpple.seedmapper.command.arguments.SeedIdentifierArgument;
78
import dev.xpple.seedmapper.command.arguments.SeedResolutionArgument;
89
import dev.xpple.seedmapper.command.commands.BuildInfoCommand;
910
import dev.xpple.seedmapper.command.commands.CheckSeedCommand;
@@ -19,13 +20,15 @@
1920
import dev.xpple.seedmapper.command.commands.StopTaskCommand;
2021
import dev.xpple.seedmapper.config.Configs;
2122
import dev.xpple.seedmapper.config.MapFeatureAdapter;
23+
import dev.xpple.seedmapper.config.SeedIdentifierAdapter;
2224
import dev.xpple.seedmapper.config.SeedResolutionAdapter;
2325
import dev.xpple.seedmapper.command.commands.WorldPresetCommand;
2426
import dev.xpple.seedmapper.world.WorldPresetManager;
2527
import dev.xpple.seedmapper.render.RenderManager;
2628
import dev.xpple.seedmapper.seedmap.MapFeature;
2729
import dev.xpple.seedmapper.seedmap.SeedMapMinimapManager;
2830
import dev.xpple.seedmapper.util.SeedDatabaseHelper;
31+
import dev.xpple.seedmapper.util.SeedIdentifier;
2932
import dev.xpple.simplewaypoints.api.SimpleWaypointsAPI;
3033
import net.fabricmc.api.ClientModInitializer;
3134
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
@@ -68,6 +71,7 @@ public class SeedMapper implements ClientModInitializer {
6871
public void onInitializeClient() {
6972

7073
new ModConfigBuilder<>(MOD_ID, Configs.class)
74+
.registerType(SeedIdentifier.class, new SeedIdentifierAdapter(), SeedIdentifierArgument::seedIdentifier)
7175
.registerType(SeedResolutionArgument.SeedResolution.class, new SeedResolutionAdapter(), SeedResolutionArgument::seedResolution)
7276
.registerTypeHierarchy(MapFeature.class, new MapFeatureAdapter(), MapFeatureArgument::mapFeature)
7377
.registerGlobalChangeHook(event -> {

src/main/java/dev/xpple/seedmapper/command/CommandExceptions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ private CommandExceptions() {
1212

1313
public static final SimpleCommandExceptionType ALREADY_BUSY_LOCATING_EXCEPTION = new SimpleCommandExceptionType(Component.translatable("commands.exceptions.alreadyBusyLocating", LocatorThreadHelper.STOP_TASK_COMPONENT));
1414
public static final DynamicCommandExceptionType UNKNOWN_DIMENSION_EXCEPTION = new DynamicCommandExceptionType(arg -> Component.translatable("commands.exceptions.unknownDimension", arg));
15+
public static final DynamicCommandExceptionType UNKNOWN_GENERATOR_FLAG_EXCEPTION = new DynamicCommandExceptionType(arg -> Component.translatable("commands.exceptions.unknownGeneratorFlag", arg));
1516
public static final DynamicCommandExceptionType UNKNOWN_VERSION_EXCEPTION = new DynamicCommandExceptionType(arg -> Component.translatable("commands.exceptions.unknownVersion", arg));
1617
public static final DynamicCommandExceptionType UNKNOWN_BIOME_EXCEPTION = new DynamicCommandExceptionType(arg -> Component.translatable("commands.exceptions.unknownBiome", arg));
1718
public static final DynamicCommandExceptionType UNKNOWN_STRUCTURE_EXCEPTION = new DynamicCommandExceptionType(arg -> Component.translatable("commands.exceptions.unknownStructure", arg));

src/main/java/dev/xpple/seedmapper/command/CustomClientCommandSource.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.xpple.seedmapper.command;
22

3+
import com.github.cubiomes.Cubiomes;
34
import com.mojang.brigadier.StringReader;
45
import com.mojang.brigadier.exceptions.CommandSyntaxException;
56
import com.mojang.datafixers.util.Pair;
@@ -8,7 +9,9 @@
89
import dev.xpple.seedmapper.command.arguments.VersionArgument;
910
import dev.xpple.seedmapper.config.Configs;
1011
import dev.xpple.seedmapper.util.SeedDatabaseHelper;
12+
import dev.xpple.seedmapper.util.SeedIdentifier;
1113
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
14+
import net.minecraft.Optionull;
1215
import net.minecraft.SharedConstants;
1316
import net.minecraft.client.Minecraft;
1417
import net.minecraft.client.multiplayer.ClientLevel;
@@ -121,11 +124,11 @@ public CustomClientCommandSource withMeta(String key, Object value) {
121124
return this;
122125
}
123126

124-
public Pair<SeedResolutionArgument.SeedResolution.Method, Long> getSeed() throws CommandSyntaxException {
125-
Long seed;
127+
public Pair<SeedResolutionArgument.SeedResolution.Method, SeedIdentifier> getSeed() throws CommandSyntaxException {
128+
SeedIdentifier seed;
126129
for (SeedResolutionArgument.SeedResolution.Method method : Configs.SeedResolutionOrder) {
127130
seed = switch (method) {
128-
case COMMAND_SOURCE -> (Long) this.getMeta("seed");
131+
case COMMAND_SOURCE -> Optionull.map(this.getMeta("seed"), s -> new SeedIdentifier((long) s));
129132
case SEED_CONFIG -> Configs.Seed;
130133
case SAVED_SEEDS_CONFIG -> {
131134
String key = this.client.getConnection().getConnection().getRemoteAddress().toString();
@@ -148,14 +151,33 @@ public int getDimension() throws CommandSyntaxException {
148151
if (dimensionMeta != null) {
149152
return (int) dimensionMeta;
150153
}
151-
return DimensionArgument.dimension().parse(new StringReader(this.getWorld().dimension().identifier().getPath()));
154+
try {
155+
return DimensionArgument.dimension().parse(new StringReader(this.getWorld().dimension().identifier().getPath()));
156+
} catch (CommandSyntaxException _) {
157+
}
158+
return switch (this.getWorld().dimensionType().skybox()) {
159+
case NONE -> Cubiomes.DIM_NETHER();
160+
case OVERWORLD -> Cubiomes.DIM_OVERWORLD();
161+
case END -> Cubiomes.DIM_END();
162+
};
152163
}
153164

154165
public int getVersion() throws CommandSyntaxException {
155166
Object versionMeta = this.getMeta("version");
156167
if (versionMeta != null) {
157168
return (int) versionMeta;
158169
}
170+
if (this.getSeed().getSecond().hasVersion()) {
171+
return this.getSeed().getSecond().version();
172+
}
159173
return VersionArgument.version().parse(new StringReader(SharedConstants.getCurrentVersion().name()));
160174
}
175+
176+
public int getGeneratorFlags() throws CommandSyntaxException {
177+
Object generatorFlagsMeta = this.getMeta("generatorFlags");
178+
if (generatorFlagsMeta != null) {
179+
return (int) generatorFlagsMeta;
180+
}
181+
return this.getSeed().getSecond().generatorFlags();
182+
}
161183
}

src/main/java/dev/xpple/seedmapper/command/arguments/DimensionArgument.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package dev.xpple.seedmapper.command.arguments;
22

33
import com.github.cubiomes.Cubiomes;
4-
import com.google.common.collect.ImmutableMap;
4+
import com.google.common.collect.BiMap;
5+
import com.google.common.collect.ImmutableBiMap;
56
import com.mojang.brigadier.StringReader;
67
import com.mojang.brigadier.arguments.ArgumentType;
78
import com.mojang.brigadier.context.CommandContext;
@@ -14,14 +15,13 @@
1415

1516
import java.util.Arrays;
1617
import java.util.Collection;
17-
import java.util.Map;
1818
import java.util.concurrent.CompletableFuture;
1919

2020
public class DimensionArgument implements ArgumentType<Integer> {
2121

2222
private static final Collection<String> EXAMPLES = Arrays.asList("overworld", "the_nether", "the_end");
2323

24-
private static final Map<String, Integer> DIMENSIONS = ImmutableMap.<String, Integer>builder()
24+
public static final BiMap<String, Integer> DIMENSIONS = ImmutableBiMap.<String, Integer>builder()
2525
.put("overworld", Cubiomes.DIM_OVERWORLD())
2626
.put("the_nether", Cubiomes.DIM_NETHER())
2727
.put("the_end", Cubiomes.DIM_END())
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package dev.xpple.seedmapper.command.arguments;
2+
3+
import com.github.cubiomes.Cubiomes;
4+
import com.google.common.collect.ImmutableMap;
5+
import com.mojang.brigadier.StringReader;
6+
import com.mojang.brigadier.arguments.ArgumentType;
7+
import com.mojang.brigadier.context.CommandContext;
8+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
9+
import com.mojang.brigadier.suggestion.Suggestions;
10+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
11+
import dev.xpple.seedmapper.command.CommandExceptions;
12+
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
13+
import net.minecraft.commands.SharedSuggestionProvider;
14+
15+
import java.util.Arrays;
16+
import java.util.Collection;
17+
import java.util.Map;
18+
import java.util.concurrent.CompletableFuture;
19+
20+
public class GeneratorFlagArgument implements ArgumentType<Integer> {
21+
22+
private static final Collection<String> EXAMPLES = Arrays.asList("overworld", "the_nether", "the_end");
23+
24+
public static final Map<String, Integer> GENERATOR_FLAGS = ImmutableMap.<String, Integer>builder()
25+
.put("large_biomes", Cubiomes.LARGE_BIOMES())
26+
.put("no_beta_ocean", Cubiomes.NO_BETA_OCEAN())
27+
.put("force_ocean_variants", Cubiomes.FORCE_OCEAN_VARIANTS())
28+
.build();
29+
30+
public static GeneratorFlagArgument generatorFlag() {
31+
return new GeneratorFlagArgument();
32+
}
33+
34+
public static int getGeneratorFlag(CommandContext<FabricClientCommandSource> context, String name) {
35+
return context.getArgument(name, Integer.class);
36+
}
37+
38+
@Override
39+
public Integer parse(StringReader reader) throws CommandSyntaxException {
40+
int cursor = reader.getCursor();
41+
String generatorFlagString = reader.readUnquotedString();
42+
Integer generatorFlag = GENERATOR_FLAGS.get(generatorFlagString);
43+
if (generatorFlag == null) {
44+
reader.setCursor(cursor);
45+
throw CommandExceptions.UNKNOWN_GENERATOR_FLAG_EXCEPTION.create(generatorFlagString);
46+
}
47+
return generatorFlag;
48+
}
49+
50+
@Override
51+
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
52+
return SharedSuggestionProvider.suggest(GENERATOR_FLAGS.keySet(), builder);
53+
}
54+
55+
@Override
56+
public Collection<String> getExamples() {
57+
return EXAMPLES;
58+
}
59+
}
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package dev.xpple.seedmapper.command.arguments;
2+
3+
import com.google.common.collect.ImmutableMap;
4+
import com.mojang.brigadier.StringReader;
5+
import com.mojang.brigadier.arguments.ArgumentType;
6+
import com.mojang.brigadier.arguments.LongArgumentType;
7+
import com.mojang.brigadier.context.CommandContext;
8+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
9+
import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
10+
import com.mojang.brigadier.suggestion.Suggestions;
11+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
12+
import dev.xpple.betterconfig.util.CheckedFunction;
13+
import dev.xpple.seedmapper.util.SeedIdentifier;
14+
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
15+
import net.minecraft.commands.SharedSuggestionProvider;
16+
import net.minecraft.network.chat.Component;
17+
18+
import java.util.Collection;
19+
import java.util.HashSet;
20+
import java.util.List;
21+
import java.util.Map;
22+
import java.util.Set;
23+
import java.util.concurrent.CompletableFuture;
24+
import java.util.function.Consumer;
25+
26+
public class SeedIdentifierArgument implements ArgumentType<SeedIdentifier> {
27+
28+
private static final Collection<String> EXAMPLES = List.of("8052710360952744907", "-123 --version 1.17.1", "-123 --generatorFlags large_biomes --version 1.21.11");
29+
30+
private static final DynamicCommandExceptionType UNKNOWN_SEED_ARGUMENT_EXCEPTION = new DynamicCommandExceptionType(arg -> Component.translatable("commands.exceptions.unknownSeedArgument", arg));
31+
32+
public static SeedIdentifierArgument seedIdentifier() {
33+
return new SeedIdentifierArgument();
34+
}
35+
36+
public SeedIdentifier getSeedIdentifier(CommandContext<FabricClientCommandSource> context, String name) {
37+
return context.getArgument(name, SeedIdentifier.class);
38+
}
39+
40+
@Override
41+
public SeedIdentifier parse(StringReader reader) throws CommandSyntaxException {
42+
return new Parser(reader).parse();
43+
}
44+
45+
@Override
46+
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
47+
StringReader reader = new StringReader(builder.getInput());
48+
reader.setCursor(builder.getStart());
49+
50+
Parser parser = new Parser(reader);
51+
52+
try {
53+
parser.parse();
54+
} catch (CommandSyntaxException ignored) {
55+
}
56+
57+
if (parser.suggester != null) {
58+
parser.suggester.accept(builder);
59+
}
60+
61+
return builder.buildFuture();
62+
}
63+
64+
private static class Parser {
65+
private final StringReader reader;
66+
private Consumer<SuggestionsBuilder> suggester;
67+
68+
private final Map<String, CheckedFunction<SeedIdentifier, SeedIdentifier, CommandSyntaxException>> ARGUMENTS = ImmutableMap.<String, CheckedFunction<SeedIdentifier, SeedIdentifier, CommandSyntaxException>>builder()
69+
.put("--version", this::parseVersion)
70+
.put("--generatorFlag", this::parseGeneratorFlag)
71+
.build();
72+
73+
private Parser(StringReader reader) {
74+
this.reader = reader;
75+
}
76+
77+
private SeedIdentifier parse() throws CommandSyntaxException {
78+
long seed = LongArgumentType.longArg().parse(this.reader);
79+
SeedIdentifier identifier = new SeedIdentifier(seed);
80+
81+
if (!this.reader.canRead()) {
82+
return identifier;
83+
}
84+
85+
this.reader.expect(' ');
86+
this.reader.skipWhitespace();
87+
88+
Set<String> remainingArguments = new HashSet<>(ARGUMENTS.keySet());
89+
while (!remainingArguments.isEmpty()) {
90+
int cursor = this.reader.getCursor();
91+
this.suggester = suggestions -> {
92+
SuggestionsBuilder builder = suggestions.createOffset(cursor);
93+
SharedSuggestionProvider.suggest(remainingArguments, builder);
94+
suggestions.add(builder);
95+
};
96+
if (!this.reader.canRead()) {
97+
break;
98+
}
99+
String argumentString = this.reader.readUnquotedString();
100+
CheckedFunction<SeedIdentifier, SeedIdentifier, CommandSyntaxException> parser = ARGUMENTS.get(argumentString);
101+
if (parser == null) {
102+
this.reader.setCursor(cursor);
103+
throw UNKNOWN_SEED_ARGUMENT_EXCEPTION.create(argumentString);
104+
}
105+
this.reader.expect(' ');
106+
this.reader.skipWhitespace();
107+
identifier = parser.apply(identifier);
108+
if (!argumentString.equals("--generatorFlag")) { // allow multiple flags
109+
remainingArguments.remove(argumentString);
110+
}
111+
if (this.reader.canRead()) {
112+
this.reader.expect(' ');
113+
this.reader.skipWhitespace();
114+
} else {
115+
break;
116+
}
117+
}
118+
return identifier;
119+
}
120+
121+
private SeedIdentifier parseVersion(SeedIdentifier seed) throws CommandSyntaxException {
122+
int cursor = this.reader.getCursor();
123+
this.suggester = builder -> {
124+
SuggestionsBuilder newBuilder = builder.createOffset(cursor);
125+
SharedSuggestionProvider.suggest(VersionArgument.VERSIONS.keySet(), newBuilder);
126+
builder.add(newBuilder);
127+
};
128+
int version = VersionArgument.version().parse(this.reader);
129+
return seed.withVersion(version);
130+
}
131+
132+
private SeedIdentifier parseGeneratorFlag(SeedIdentifier identifier) throws CommandSyntaxException {
133+
int cursor = this.reader.getCursor();
134+
this.suggester = builder -> {
135+
SuggestionsBuilder newBuilder = builder.createOffset(cursor);
136+
SharedSuggestionProvider.suggest(GeneratorFlagArgument.GENERATOR_FLAGS.keySet(), newBuilder);
137+
builder.add(newBuilder);
138+
};
139+
int generatorFlag = GeneratorFlagArgument.generatorFlag().parse(this.reader);
140+
return identifier.withGeneratorFlag(generatorFlag);
141+
}
142+
}
143+
144+
@Override
145+
public Collection<String> getExamples() {
146+
return EXAMPLES;
147+
}
148+
}

src/main/java/dev/xpple/seedmapper/command/arguments/VersionArgument.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public class VersionArgument implements ArgumentType<Integer> {
2121

2222
private static final Collection<String> EXAMPLES = Arrays.asList("1.21.1", "1.17.1", "1.15");
2323

24-
//<editor-fold defaultstate="collapsed" desc="private static final Map<String, Integer> VERSIONS;">
25-
private static final Map<String, Integer> VERSIONS = ImmutableMap.<String, Integer>builder()
24+
//<editor-fold defaultstate="collapsed" desc="static final Map<String, Integer> VERSIONS;">
25+
static final Map<String, Integer> VERSIONS = ImmutableMap.<String, Integer>builder()
2626
.put("b1.7", Cubiomes.MC_B1_7())
2727
.put("b1.7.2", Cubiomes.MC_B1_7())
2828
.put("b1.7.3", Cubiomes.MC_B1_7())

0 commit comments

Comments
 (0)