Skip to content

Commit dd08e58

Browse files
committed
feature: introduce RtpDimension argument type.
1 parent 6b18304 commit dd08e58

6 files changed

Lines changed: 83 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
## ✨ Features
1111
- [command_bundle] feature: add new command definitions (`/success` and `/failure`) into the `default config` model.
12+
- [rtp] feature: improve the command suggestion for `--dimension` optional argument. Now it only suggests the effective dimensions.
1213

1314
## 🐞 Fixes
1415
- [chat.style] When installed on the client-side, re-entering the single-player world would fail.

common/src/main/resources/graph/argument-type-adapter-graph.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ mod.fuji.module.initializer.leaderboard.command.argument.adapter.LeaderBoardTime
8484
mod.fuji.module.initializer.rank.command.argument.adapter.NextAvailableRankNodesArgumentTypeAdapter
8585
mod.fuji.module.initializer.rank.command.argument.adapter.PreviousAvailableRankNodesArgumentTypeAdapter
8686
mod.fuji.module.initializer.rank.command.argument.adapter.RankNodeArgumentTypeAdapter
87+
mod.fuji.module.initializer.rtp.command.argument.adapter.RtpDimensionArgumentTypeAdapter
8788
mod.fuji.module.initializer.skin.command.argument.adapter.DefaultSkinNameArgumentTypeAdapter
8889
mod.fuji.module.initializer.world.manager.command.argument.adapter.ChunkGeneratorTypeArgumentTypeAdapter
8990
mod.fuji.module.initializer.world.manager.command.argument.adapter.LoadedRuntimeDimensionDescriptorArgumentTypeAdapter

fabric/src/main/java/mod/fuji/core/command/argument/adapter/impl/DimensionArgumentTypeAdapter.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
55
import com.mojang.brigadier.context.CommandContext;
66
import com.mojang.brigadier.exceptions.CommandSyntaxException;
7+
import java.util.List;
8+
import lombok.SneakyThrows;
79
import mod.fuji.core.auxiliary.minecraft.RegistryHelper;
810
import mod.fuji.core.auxiliary.minecraft.WorldHelper;
911
import mod.fuji.core.command.argument.adapter.abst.BaseArgumentTypeAdapter;
1012
import mod.fuji.core.command.argument.structure.CommandArgument;
1113
import mod.fuji.core.command.argument.wrapper.impl.Dimension;
12-
import java.util.List;
13-
import lombok.SneakyThrows;
14-
import net.minecraft.commands.arguments.DimensionArgument;
1514
import net.minecraft.commands.CommandSourceStack;
15+
import net.minecraft.commands.arguments.DimensionArgument;
1616
import org.jetbrains.annotations.NotNull;
1717

1818
public class DimensionArgumentTypeAdapter extends BaseArgumentTypeAdapter {
@@ -23,21 +23,19 @@ protected ArgumentType<?> makeArgumentType() {
2323
}
2424

2525
/**
26-
* 1. The DimensionArgumentType.dimension() will not suggest the new registered dimensions, or un-registered dimensions.
27-
2. The dimension registry is synced when the client joins the server, and it's fixed.
28-
3. FIXME: When you call RequiredArgumentBuilder#suggests() method, the `/back {push|clear}` will also be suggested, even the command source has no permission to use it.
29-
30-
**/
26+
* 1. The DimensionArgumentType.dimension() will not suggest the new registered dimensions, or un-registered dimensions.
27+
* 2. The dimension registry is synced when the client joins the server, and it's fixed.
28+
**/
3129
@Override
3230
@NotNull
3331
protected RequiredArgumentBuilder<CommandSourceStack, ?> makeRequiredArgumentBuilder(@NotNull String argumentName) {
3432
return super.makeRequiredArgumentBuilder(argumentName)
3533
.suggests(
36-
(ctx, builder) -> {
37-
WorldHelper.getWorlds().forEach(it -> builder.suggest(RegistryHelper.getIdAsString(it)));
38-
return builder.buildFuture();
39-
}
40-
);
34+
(ctx, builder) -> {
35+
WorldHelper.getWorlds().forEach(it -> builder.suggest(RegistryHelper.getIdAsString(it)));
36+
return builder.buildFuture();
37+
}
38+
);
4139
}
4240

4341
@SneakyThrows(CommandSyntaxException.class)

fabric/src/main/java/mod/fuji/module/initializer/rtp/RtpInitializer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import mod.fuji.core.service.random_teleport.RandomTeleporter;
1717
import mod.fuji.core.service.random_teleport.structure.RandomTeleportSettings;
1818
import mod.fuji.module.initializer.ModuleInitializer;
19+
import mod.fuji.module.initializer.rtp.command.argument.wrapper.RtpDimension;
1920
import mod.fuji.module.initializer.rtp.config.model.RtpConfigModel;
2021
import net.minecraft.server.level.ServerPlayer;
2122
import net.minecraft.server.level.ServerLevel;
@@ -59,7 +60,7 @@ public class RtpInitializer extends ModuleInitializer {
5960

6061
private static final BaseConfigurationHandler<RtpConfigModel> config = ObjectConfigurationHandler.ofModule(BaseConfigurationHandler.CONFIG_JSON_LITERAL, RtpConfigModel.class);
6162

62-
private static Optional<RandomTeleportSettings> getRandomTeleportSettings(@NotNull ServerLevel world) {
63+
public static Optional<RandomTeleportSettings> getRandomTeleportSettings(@NotNull ServerLevel world) {
6364
List<RandomTeleportSettings> list = config.model().getDimensions().getSettings();
6465
String dimension = RegistryHelper.getIdAsString(world);
6566
return list.stream()
@@ -70,7 +71,7 @@ private static Optional<RandomTeleportSettings> getRandomTeleportSettings(@NotNu
7071

7172
@Document(id = 1751826340406L, value = "Random rtp in specified dimension.")
7273
@CommandNode("rtp")
73-
private static int $rtp(@CommandSource @CommandTarget ServerPlayer player, Optional<Dimension> dimension) {
74+
private static int $rtp(@CommandSource @CommandTarget ServerPlayer player, Optional<RtpDimension> dimension) {
7475
ServerLevel serverWorld = dimension
7576
.map(Dimension::getValue)
7677
.orElseGet(() -> EntityHelper.getServerWorld(player));
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package mod.fuji.module.initializer.rtp.command.argument.adapter;
2+
3+
import com.mojang.brigadier.arguments.ArgumentType;
4+
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import java.util.List;
7+
import mod.fuji.core.auxiliary.minecraft.RegistryHelper;
8+
import mod.fuji.core.auxiliary.minecraft.WorldHelper;
9+
import mod.fuji.core.command.argument.adapter.abst.BaseArgumentTypeAdapter;
10+
import mod.fuji.core.command.argument.representation.IdentifierArgumentTypeIR;
11+
import mod.fuji.core.command.argument.structure.CommandArgument;
12+
import mod.fuji.core.structure.IdentifierIR;
13+
import mod.fuji.module.initializer.rtp.RtpInitializer;
14+
import mod.fuji.module.initializer.rtp.command.argument.wrapper.RtpDimension;
15+
import net.minecraft.commands.CommandSourceStack;
16+
import net.minecraft.server.level.ServerLevel;
17+
import org.jetbrains.annotations.NotNull;
18+
19+
public class RtpDimensionArgumentTypeAdapter extends BaseArgumentTypeAdapter {
20+
@Override
21+
public List<Class<?>> getTypeClasses() {
22+
return List.of(RtpDimension.class);
23+
}
24+
25+
@Override
26+
public List<String> getTypeNames() {
27+
return List.of("rtp-dimension");
28+
}
29+
30+
@Override
31+
protected ArgumentType<?> makeArgumentType() {
32+
return IdentifierArgumentTypeIR.makeArgumentType();
33+
}
34+
35+
@Override
36+
protected Object makeArgumentValue(@NotNull CommandContext<CommandSourceStack> context, @NotNull CommandArgument commandArgument) {
37+
IdentifierIR identifierIR = IdentifierIR.of(IdentifierArgumentTypeIR.makeArgumentValue(context, commandArgument));
38+
String dimensionId = RegistryHelper.getIdAsString(identifierIR);
39+
ServerLevel world = WorldHelper.getWorldOrThrow(dimensionId);
40+
return new RtpDimension(world);
41+
}
42+
43+
@Override
44+
protected @NotNull RequiredArgumentBuilder<CommandSourceStack, ?> makeRequiredArgumentBuilder(@NotNull String argumentName) {
45+
return super.makeRequiredArgumentBuilder(argumentName)
46+
.suggests(
47+
(ctx, builder) -> {
48+
WorldHelper
49+
.getWorlds()
50+
.stream()
51+
.filter(it -> RtpInitializer.getRandomTeleportSettings(it).isPresent())
52+
.forEach(it -> builder.suggest(RegistryHelper.getIdAsString(it)));
53+
return builder.buildFuture();
54+
}
55+
);
56+
}
57+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package mod.fuji.module.initializer.rtp.command.argument.wrapper;
2+
3+
import mod.fuji.core.command.argument.wrapper.impl.Dimension;
4+
import net.minecraft.server.level.ServerLevel;
5+
6+
public class RtpDimension extends Dimension {
7+
public RtpDimension(ServerLevel value) {
8+
super(value);
9+
}
10+
}

0 commit comments

Comments
 (0)