Remove Custom Brigadier argument

This commit is contained in:
Darto KLoning
2026-09-06 16:41:38 +07:00
parent c8c8d1891b
commit a4cbeb2db3
4 changed files with 20 additions and 54 deletions
+9 -9
View File
@@ -1,8 +1,8 @@
# Lobby Systems v1.3.1 — Fabric 26.2
# Lobby Systems v1.3.2 — Fabric 26.2
Server-side lobby routing untuk Minecraft 26.2/Fabric. Versi 1.3.0 menambahkan viewer gamerule per-dimension dengan pagination dan pengelolaan gamemode player berdasarkan dimension, sambil mempertahankan portal antar-dimensi, last-position, minimum playtime, dan konfigurasi terpusat di `config/lobby/`.
**v1.3.1 bugfix:** parser dimension command sekarang menerima resource identifier seperti `minecraft:lobby` tanpa memakan argumen sesudahnya. Ini memperbaiki `/ls gamerule <dimension>`, `/ls gamemode <dimension>`, dan `/ls gamemode set/remove ...`.
**v1.3.2 bugfix:** parser dimension command sekarang menerima resource identifier seperti `minecraft:lobby` tanpa memakan argumen sesudahnya. Ini memperbaiki `/ls gamerule <dimension>`, `/ls gamemode <dimension>`, dan `/ls gamemode set/remove ...`.
### Reload feedback
@@ -40,7 +40,7 @@ chmod +x compile.sh release.sh
```text
============================================
Lobby Systems - Fabric 26.2 Build
Version: 1.3.1
Version: 1.3.2
Namespace: id.dartokloning.lobbysystems
Mod ID: dartokloning
============================================
@@ -49,7 +49,7 @@ chmod +x compile.sh release.sh
Output utama:
```text
build/libs/lobby-systems-1.3.1.jar
build/libs/lobby-systems-1.3.2.jar
```
`*-sources.jar` hanya source archive dan tidak perlu dipasang ke server.
@@ -80,14 +80,14 @@ State penting Lobby Systems memakai separator agar mudah terlihat di server cons
```text
============================================
Lobby Systems - READY
Version: 1.3.1
Version: 1.3.2
Minecraft: 26.2
Config directory: config/lobby
WorldEdit: available
============================================
```
## Struktur konfigurasi v1.3.1
## Struktur konfigurasi v1.3.2
```text
config/
@@ -157,7 +157,7 @@ Portal adalah region/cuboid, bukan harus Nether Portal asli. Anda bebas membuat
### `config/lobby/dimension-gamemodes.json`
Minecraft menyimpan gamemode pada player, bukan pada dimension. Lobby Systems v1.3.1 menambahkan mapping dimension → gamemode dan menerapkannya ketika player masuk ke dimension tersebut. File ini dibuat otomatis dan dapat dikelola lewat command admin.
Minecraft menyimpan gamemode pada player, bukan pada dimension. Lobby Systems v1.3.2 menambahkan mapping dimension → gamemode dan menerapkannya ketika player masuk ke dimension tersebut. File ini dibuat otomatis dan dapat dikelola lewat command admin.
Contoh:
@@ -173,7 +173,7 @@ Gamemode yang didukung: `survival`, `creative`, `adventure`, dan `spectator`.
## Migrasi dari v1.1.x
Pada startup pertama v1.3.1:
Pada startup pertama v1.3.2:
```text
config/lobby-systems.json
@@ -197,7 +197,7 @@ akan dimigrasikan ke:
config/lobby/player-positions.json
```
Nama file lama hanya digunakan oleh `LegacyConfigMigrator` untuk proses migrasi. Runtime v1.3.1 membaca dan menulis file baru di `config/lobby/`.
Nama file lama hanya digunakan oleh `LegacyConfigMigrator` untuk proses migrasi. Runtime v1.3.2 membaca dan menulis file baru di `config/lobby/`.
Jika file tujuan baru sudah ada, migrator tidak menimpanya.
+1 -1
View File
@@ -5,6 +5,6 @@ minecraft_version=26.2
loader_version=0.19.3
loom_version=1.17-SNAPSHOT
fabric_api_version=0.156.0+26.2
mod_version=1.3.1
mod_version=1.3.2
maven_group=id.dartokloning
archives_base_name=lobby-systems
@@ -1,35 +0,0 @@
package id.dartokloning.lobbysystems;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
/**
* Brigadier argument type for Minecraft resource/dimension identifiers such as
* {@code minecraft:lobby}. Vanilla Brigadier's word() does not accept ':',
* while greedyString() consumes following arguments. This parser reads exactly
* one whitespace-delimited token and therefore works correctly in the middle
* of commands such as /ls gamemode set <dimension> <mode>.
*/
public final class DimensionIdArgumentType implements ArgumentType<String> {
private DimensionIdArgumentType() {
}
public static DimensionIdArgumentType dimensionId() {
return new DimensionIdArgumentType();
}
public static String getDimensionId(CommandContext<?> context, String name) {
return context.getArgument(name, String.class);
}
@Override
public String parse(StringReader reader) throws CommandSyntaxException {
int start = reader.getCursor();
while (reader.canRead() && !Character.isWhitespace(reader.peek())) {
reader.skip();
}
return reader.getString().substring(start, reader.getCursor());
}
}
@@ -9,6 +9,7 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.commands.arguments.IdentifierArgument;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
@@ -148,26 +149,26 @@ public final class LobbySystemsMod implements ModInitializer {
true,
true))))
.then(Commands.literal("gamerule")
.then(Commands.argument("dimension", DimensionIdArgumentType.dimensionId())
.then(Commands.argument("dimension", IdentifierArgument.id())
.suggests((ctx, builder) -> SharedSuggestionProvider.suggestResource(
ctx.getSource().getServer().levelKeys().stream().map(ResourceKey::identifier), builder))
.executes(ctx -> listGameRules(
ctx.getSource(),
ctx.getSource().getServer(),
DimensionIdArgumentType.getDimensionId(ctx, "dimension"),
IdentifierArgument.getId(ctx, "dimension").toString(),
1))
.then(Commands.literal("--page")
.then(Commands.argument("page", IntegerArgumentType.integer(1))
.executes(ctx -> listGameRules(
ctx.getSource(),
ctx.getSource().getServer(),
DimensionIdArgumentType.getDimensionId(ctx, "dimension"),
IdentifierArgument.getId(ctx, "dimension").toString(),
IntegerArgumentType.getInteger(ctx, "page")))))))
.then(Commands.literal("gamemode")
.then(Commands.literal("list")
.executes(ctx -> listDimensionGameModes(ctx.getSource())))
.then(Commands.literal("set")
.then(Commands.argument("dimension", DimensionIdArgumentType.dimensionId())
.then(Commands.argument("dimension", IdentifierArgument.id())
.suggests((ctx, builder) -> SharedSuggestionProvider.suggestResource(
ctx.getSource().getServer().levelKeys().stream().map(ResourceKey::identifier), builder))
.then(Commands.argument("mode", StringArgumentType.word())
@@ -176,21 +177,21 @@ public final class LobbySystemsMod implements ModInitializer {
.executes(ctx -> setDimensionGameMode(
ctx.getSource(),
ctx.getSource().getServer(),
DimensionIdArgumentType.getDimensionId(ctx, "dimension"),
IdentifierArgument.getId(ctx, "dimension").toString(),
StringArgumentType.getString(ctx, "mode"))))))
.then(Commands.literal("remove")
.then(Commands.argument("dimension", DimensionIdArgumentType.dimensionId())
.then(Commands.argument("dimension", IdentifierArgument.id())
.suggests((ctx, builder) -> SharedSuggestionProvider.suggestResource(
ctx.getSource().getServer().levelKeys().stream().map(ResourceKey::identifier), builder))
.executes(ctx -> removeDimensionGameMode(
ctx.getSource(),
DimensionIdArgumentType.getDimensionId(ctx, "dimension")))))
.then(Commands.argument("dimension", DimensionIdArgumentType.dimensionId())
IdentifierArgument.getId(ctx, "dimension").toString()))))
.then(Commands.argument("dimension", IdentifierArgument.id())
.suggests((ctx, builder) -> SharedSuggestionProvider.suggestResource(
ctx.getSource().getServer().levelKeys().stream().map(ResourceKey::identifier), builder))
.executes(ctx -> showDimensionGameMode(
ctx.getSource(),
DimensionIdArgumentType.getDimensionId(ctx, "dimension")))))
IdentifierArgument.getId(ctx, "dimension").toString()))))
.then(Commands.literal("portal")
.then(Commands.literal("create")
.then(Commands.argument("name", StringArgumentType.word())