Remove manageDimensionGamemode option

This commit is contained in:
Darto KLoning
2026-09-07 09:12:11 +07:00
parent 964af6c856
commit c1747e2c27
5 changed files with 37 additions and 65 deletions
@@ -2,6 +2,8 @@ package id.dartokloning.lobbysystems;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.Reader;
import java.io.Writer;
@@ -24,10 +26,16 @@ public final class ConfigManager {
}
try (Reader reader = Files.newBufferedReader(PATH)) {
LobbyConfig loaded = GSON.fromJson(reader, LobbyConfig.class);
JsonObject root = JsonParser.parseReader(reader).getAsJsonObject();
boolean hadDeprecatedGamemodeFlag = root.has("manageDimensionGamemode");
LobbyConfig loaded = GSON.fromJson(root, LobbyConfig.class);
if (loaded == null) throw new IllegalArgumentException("Config JSON kosong atau tidak valid.");
validate(loaded);
config = loaded;
if (hadDeprecatedGamemodeFlag) {
LobbySystemsMod.LOGGER.info("Removing deprecated config option manageDimensionGamemode; Lobby Systems now always manages dimension gamemodes.");
save();
}
return true;
} catch (Exception e) {
LobbySystemsMod.LOGGER.error("Failed to load {}. Keeping previous config.", PATH, e);
@@ -9,8 +9,6 @@ public final class LobbyConfig {
public float lobbyPitch = 0.0f;
public int minimumPlaySeconds = 300;
/** Jika true, Lobby Systems menjadi source of truth gamemode per dimension. */
public boolean manageDimensionGamemode = true;
/** Seberapa sering region portal diperiksa. 5 tick = 4 kali/detik. */
public int portalCheckIntervalTicks = 5;
@@ -137,10 +137,8 @@ public final class LobbySystemsMod implements ModInitializer {
// sebelum paket login/world awal dikirim. Di titik JOIN ini kita hanya
// sinkronkan state runtime dan memberi enforcement singkat sebagai proteksi
// terhadap mod lain yang mengubah gamemode tepat setelah login.
if (CONFIG.get().manageDimensionGamemode) {
DIMENSION_GAMEMODES.applyForPlayer(player, true);
DIMENSION_GAMEMODES.beginJoinEnforcement(player.getUUID());
}
DIMENSION_GAMEMODES.applyForPlayer(player, true);
DIMENSION_GAMEMODES.beginJoinEnforcement(player.getUUID());
SESSIONS.onJoin(player.getUUID(), lobbyKey());
LobbyLog.state(
@@ -170,9 +168,7 @@ public final class LobbySystemsMod implements ModInitializer {
ServerTickEvents.END_SERVER_TICK.register(server -> {
TELEPORTS.tick();
if (CONFIG.get().manageDimensionGamemode) {
DIMENSION_GAMEMODES.tick(server);
}
DIMENSION_GAMEMODES.tick(server);
ResourceKey<Level> lobby = lobbyKey();
for (ServerPlayer player : server.getPlayerList().getPlayers()) {
@@ -257,7 +253,6 @@ public final class LobbySystemsMod implements ModInitializer {
.then(Commands.literal("list")
.executes(ctx -> listDimensionGameModes(ctx.getSource())))
.then(Commands.literal("set")
.requires(source -> CONFIG.get().manageDimensionGamemode)
.then(Commands.argument("dimension", IdentifierArgument.id())
.suggests((ctx, builder) -> SharedSuggestionProvider.suggestResource(
ctx.getSource().getServer().levelKeys().stream().map(ResourceKey::identifier), builder))
@@ -270,7 +265,6 @@ public final class LobbySystemsMod implements ModInitializer {
IdentifierArgument.getId(ctx, "dimension").toString(),
StringArgumentType.getString(ctx, "mode"))))))
.then(Commands.literal("remove")
.requires(source -> CONFIG.get().manageDimensionGamemode)
.then(Commands.argument("dimension", IdentifierArgument.id())
.suggests((ctx, builder) -> SharedSuggestionProvider.suggestResource(
ctx.getSource().getServer().levelKeys().stream().map(ResourceKey::identifier), builder))
@@ -382,10 +376,8 @@ public final class LobbySystemsMod implements ModInitializer {
LobbyLog.state("RELOAD FAILED", "Reason: dimension-gamemodes.json gagal dibaca");
return 0;
}
if (CONFIG.get().manageDimensionGamemode) {
for (String dimension : DIMENSION_GAMEMODES.all().keySet()) {
DIMENSION_GAMEMODES.applyToDimension(server, dimension);
}
for (String dimension : DIMENSION_GAMEMODES.all().keySet()) {
DIMENSION_GAMEMODES.applyToDimension(server, dimension);
}
logDimensionInventoryCompatibility();
refreshCommandTrees(server);
@@ -410,8 +402,7 @@ public final class LobbySystemsMod implements ModInitializer {
"Minimum play: " + CONFIG.get().minimumPlaySeconds + "s",
"Portals: " + PORTALS.size(),
"Portal visual blocks restored: " + repairedPortalVisuals,
"Dimension gamemodes: " + DIMENSION_GAMEMODES.all().size()
+ " (management " + (CONFIG.get().manageDimensionGamemode ? "enabled" : "disabled") + ")",
"Dimension gamemodes: " + DIMENSION_GAMEMODES.all().size() + " (authoritative)",
"Dimension gamerules: " + DIMENSION_GAMERULES.all().size() + " dimensions / " + gameRuleSummary.applied() + " rules applied",
"Player positions lobby exclusion: active"
);
@@ -604,26 +595,19 @@ public final class LobbySystemsMod implements ModInitializer {
private static int listDimensionGameModes(CommandSourceStack source) {
Map<String, String> all = DIMENSION_GAMEMODES.all();
if (all.isEmpty()) {
String hint = CONFIG.get().manageDimensionGamemode
? "\n§7Gunakan §f/ls gamemode set <dimension> <mode>"
: "\n§7Management gamemode sedang §cdisabled§7; mode viewer-only aktif.";
sendCommandMessage(source, Component.literal(
"§eBelum ada gamemode dimension yang dikonfigurasi." + hint));
"§eBelum ada gamemode dimension yang dikonfigurasi."
+ "\n§7Gunakan §f/ls gamemode set <dimension> <mode>"));
return 1;
}
sendCommandMessage(source, Component.literal(
"§6§lLobby Systems Dimension Gamemodes §r§7(" + all.size() + ")"
+ (CONFIG.get().manageDimensionGamemode ? " §8[managed]" : " §8[viewer-only]")));
"§6§lLobby Systems Dimension Gamemodes §r§7(" + all.size() + ") §8[authoritative]"));
all.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry ->
sendCommandMessage(source, Component.literal("§8• §f" + entry.getKey() + " §7= §a" + entry.getValue())));
return all.size();
}
private static int setDimensionGameMode(CommandSourceStack source, MinecraftServer server, String dimensionId, String rawMode) {
if (!CONFIG.get().manageDimensionGamemode) {
source.sendFailure(Component.literal("§cDimension gamemode management sedang disabled di config.json."));
return 0;
}
ServerLevel level = findLevel(server, dimensionId);
if (level == null) {
source.sendFailure(Component.literal("§cDimension '" + dimensionId + "' tidak ditemukan atau tidak ter-load."));
@@ -653,10 +637,6 @@ public final class LobbySystemsMod implements ModInitializer {
}
private static int removeDimensionGameMode(CommandSourceStack source, String dimensionId) {
if (!CONFIG.get().manageDimensionGamemode) {
source.sendFailure(Component.literal("§cDimension gamemode management sedang disabled di config.json."));
return 0;
}
if (!DIMENSION_GAMEMODES.remove(dimensionId)) {
source.sendFailure(Component.literal("§cTidak ada mapping gamemode untuk dimension '" + dimensionId + "'."));
return 0;
@@ -673,22 +653,13 @@ public final class LobbySystemsMod implements ModInitializer {
return;
}
if (CONFIG.get().manageDimensionGamemode) {
LobbyLog.state(
"COMPATIBILITY WARNING",
"Dimensional Inventories: detected",
"manageDimensionGamemode: true",
"Both mods can apply player gamemode on dimension/pool changes.",
"Keep matching gamemodes in Lobby Systems and Dimensional Inventories to avoid conflicting transitions."
);
} else {
LobbyLog.state(
"DIMENSION GAMEMODE COMPATIBILITY",
"Dimensional Inventories: detected",
"manageDimensionGamemode: false",
"Lobby Systems gamemode commands are viewer-only; Dimensional Inventories may manage player gamemode."
);
}
LobbyLog.state(
"COMPATIBILITY WARNING",
"Dimensional Inventories: detected",
"Lobby Systems dimension gamemode management: authoritative / always enabled",
"Lobby Systems will enforce dimension-gamemodes.json on join and dimension changes.",
"Keep Dimensional Inventories pool gamemodes aligned (or disable its gamemode handling) to avoid conflicting transitions."
);
}
private static void refreshCommandTrees(MinecraftServer server) {
@@ -926,9 +897,7 @@ public final class LobbySystemsMod implements ModInitializer {
boolean ok = TELEPORTS.teleport(player, target, x, y, z, yaw, pitch);
if (!ok) return 0;
if (CONFIG.get().manageDimensionGamemode) {
DIMENSION_GAMEMODES.applyForPlayer(player, true);
}
DIMENSION_GAMEMODES.applyForPlayer(player, true);
if (sendMessage) {
player.sendSystemMessage(Component.literal(returning
@@ -988,9 +957,7 @@ public final class LobbySystemsMod implements ModInitializer {
"Position: [" + String.format("%.2f", c.lobbyX) + ", "
+ String.format("%.2f", c.lobbyY) + ", "
+ String.format("%.2f", c.lobbyZ) + "]",
"Gamemode: " + (c.manageDimensionGamemode
? String.valueOf(DIMENSION_GAMEMODES.get(c.lobbyDimension))
: "unmanaged")
"Gamemode: " + String.valueOf(DIMENSION_GAMEMODES.get(c.lobbyDimension))
);
}
@@ -1032,7 +999,7 @@ public final class LobbySystemsMod implements ModInitializer {
LobbyConfig c = CONFIG.get();
boolean ok = TELEPORTS.teleport(player, target, c.lobbyX, c.lobbyY, c.lobbyZ, c.lobbyYaw, c.lobbyPitch);
if (ok && CONFIG.get().manageDimensionGamemode) {
if (ok) {
DIMENSION_GAMEMODES.applyForPlayer(player, true);
}
if (ok && sendMessage) player.sendSystemMessage(Component.literal(c.returnedMessage));