From 244a8865f08441bbf4119711f464e680c39b25c8 Mon Sep 17 00:00:00 2001 From: Darto KLoning Date: Mon, 7 Sep 2026 05:53:59 +0700 Subject: [PATCH] Fix login gamemode --- README.md | 14 ++++----- compile.bat | 3 -- compile.sh | 10 ------- gradle.properties | 2 +- .../DimensionGameModeManager.java | 30 ++++++++++++++++++- .../lobbysystems/LobbySystemsMod.java | 7 +++++ 6 files changed, 44 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index b17b249..6a13e1a 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Lobby Systems v1.5.2 — Fabric 26.2 +# Lobby Systems v1.5.3 — Fabric 26.2 -Server-side lobby routing untuk Minecraft 26.2/Fabric. v1.5.2 memastikan dimension gamemode dipaksa segera setelah teleport, termasuk join/reconnect ke Lobby, dan menambahkan mode Git-only pada script compile bila JAR versi yang sama sudah pernah dibuild. +Server-side lobby routing untuk Minecraft 26.2/Fabric. v1.5.3 memastikan dimension gamemode dipaksa segera setelah teleport, termasuk join/reconnect ke Lobby, dan menambahkan mode Git-only pada script compile bila JAR versi yang sama sudah pernah dibuild. -**v1.5.2 bugfix/workflow:** gamemode Lobby kini langsung diterapkan setelah join teleport sehingga gamemode lama dari player data tidak tertinggal. `compile.bat` / `compile.sh` juga mendeteksi JAR versi yang sama dan menawarkan Compile ulang atau Git-only tanpa build ulang. +**v1.5.3 bugfix/workflow:** gamemode Lobby kini langsung diterapkan setelah join teleport sehingga gamemode lama dari player data tidak tertinggal. `compile.bat` / `compile.sh` juga mendeteksi JAR versi yang sama dan menawarkan Compile ulang atau Git-only tanpa build ulang. **v1.5.0 feature release:** Portal Visual System menambahkan permukaan swirl ungu memakai block state vanilla `minecraft:nether_portal`, dengan axis X/Z yang ditentukan otomatis dari WorldEdit selection. Frame boleh memakai block apa saja. `manageDimensionGamemode` tetap default `true`, compatibility warning Dimensional Inventories tetap aktif, dan bridge WorldEdit 7.4.x tetap dipakai. @@ -43,7 +43,7 @@ chmod +x compile.sh release.sh ```text ============================================ Lobby Systems - Fabric 26.2 Build - Version: 1.5.2 + Version: 1.5.3 Namespace: id.dartokloning.lobbysystems Mod ID: dartokloning ============================================ @@ -52,7 +52,7 @@ chmod +x compile.sh release.sh Output utama: ```text -build/libs/lobby-systems-1.5.2.jar +build/libs/lobby-systems-1.5.3.jar ``` `*-sources.jar` hanya source archive dan tidak perlu dipasang ke server. @@ -83,14 +83,14 @@ State penting Lobby Systems memakai separator agar mudah terlihat di server cons ```text ============================================ Lobby Systems - READY - Version: 1.5.2 + Version: 1.5.3 Minecraft: 26.2 Config directory: config/lobby WorldEdit: available ============================================ ``` -## Struktur konfigurasi v1.5.2 +## Struktur konfigurasi v1.5.3 ```text config/ diff --git a/compile.bat b/compile.bat index abbd28e..699a37e 100644 --- a/compile.bat +++ b/compile.bat @@ -252,9 +252,6 @@ for /f "delims=" %%F in ('git status --porcelain') do ( echo !LINE! | findstr /I /C:"compile.bat" /C:"compile.sh" /C:"release.bat" /C:"release.sh" >nul && set "HAS_SCRIPT_CHANGE=1" echo !LINE! | findstr /I /C:"README.md" /C:"LICENSE" >nul && set "HAS_DOC_CHANGE=1" ) -if defined HAS_SRC_CHANGE set "SUGGESTED_COMMIT=Fix join gamemode enforcement in Lobby Systems v%MOD_VERSION%" -if not defined HAS_SRC_CHANGE if defined HAS_SCRIPT_CHANGE set "SUGGESTED_COMMIT=Improve build and Git workflow" -if not defined HAS_SRC_CHANGE if not defined HAS_SCRIPT_CHANGE if defined HAS_DOC_CHANGE set "SUGGESTED_COMMIT=Update Lobby Systems documentation" exit /b 0 :push_branch_with_retry diff --git a/compile.sh b/compile.sh index c6d3151..189e38b 100644 --- a/compile.sh +++ b/compile.sh @@ -32,17 +32,7 @@ read_property() { } suggest_commit_message() { - local status - status="$(git status --porcelain)" SUGGESTED_COMMIT="Update Lobby Systems v$MOD_VERSION" - - if grep -qiE '(^|[[:space:]])src/' <<<"$status"; then - SUGGESTED_COMMIT="Fix join gamemode enforcement in Lobby Systems v$MOD_VERSION" - elif grep -qiE 'compile\.(bat|sh)|release\.(bat|sh)' <<<"$status"; then - SUGGESTED_COMMIT="Improve build and Git workflow" - elif grep -qiE 'README\.md|LICENSE' <<<"$status"; then - SUGGESTED_COMMIT="Update Lobby Systems documentation" - fi } push_branch_with_retry() { diff --git a/gradle.properties b/gradle.properties index 7add6e7..3751e8f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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.5.2 +mod_version=1.5.3 maven_group=id.dartokloning archives_base_name=lobby-systems diff --git a/src/main/java/id/dartokloning/lobbysystems/DimensionGameModeManager.java b/src/main/java/id/dartokloning/lobbysystems/DimensionGameModeManager.java index ba3cc5d..481b541 100644 --- a/src/main/java/id/dartokloning/lobbysystems/DimensionGameModeManager.java +++ b/src/main/java/id/dartokloning/lobbysystems/DimensionGameModeManager.java @@ -30,6 +30,10 @@ public final class DimensionGameModeManager { private final Map configured = new LinkedHashMap<>(); private final Map lastDimension = new ConcurrentHashMap<>(); + private final Map joinEnforcementTicks = new ConcurrentHashMap<>(); + + private static final int JOIN_ENFORCEMENT_DURATION_TICKS = 100; // 5 detik + private static final int JOIN_ENFORCEMENT_INTERVAL_TICKS = 5; // 0.25 detik public boolean load() { if (!Files.exists(PATH)) { @@ -77,14 +81,37 @@ public final class DimensionGameModeManager { public void tick(MinecraftServer server) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { + UUID uuid = player.getUUID(); String dimension = player.level().dimension().identifier().toString(); - String previous = lastDimension.put(player.getUUID(), dimension); + String previous = lastDimension.put(uuid, dimension); if (!dimension.equals(previous)) { applyConfiguredMode(player, dimension, true); } + + Integer remaining = joinEnforcementTicks.get(uuid); + if (remaining != null) { + if (remaining <= 0) { + joinEnforcementTicks.remove(uuid); + } else { + if (remaining % JOIN_ENFORCEMENT_INTERVAL_TICKS == 0) { + applyConfiguredMode(player, dimension, true); + } + joinEnforcementTicks.put(uuid, remaining - 1); + } + } } } + /** + * Selama beberapa detik pertama setelah login, gamemode dikoreksi berulang. + * Ini sengaja dibuat sebagai stabilization window karena vanilla player-data + * maupun mod lain dapat menerapkan state player sedikit lebih lambat dari event JOIN. + * Setelah window selesai, player tidak terus-menerus dipaksa kecuali berpindah dimension. + */ + public void beginJoinEnforcement(UUID uuid) { + joinEnforcementTicks.put(uuid, JOIN_ENFORCEMENT_DURATION_TICKS); + } + /** * Memaksa gamemode yang dikonfigurasi untuk dimension player saat ini. * Dipakai setelah teleport agar join/reconnect tidak bergantung hanya pada @@ -99,6 +126,7 @@ public final class DimensionGameModeManager { public void onDisconnect(UUID uuid) { lastDimension.remove(uuid); + joinEnforcementTicks.remove(uuid); } public String get(String dimension) { diff --git a/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java b/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java index 7a4e9d0..abf824b 100644 --- a/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java +++ b/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java @@ -134,6 +134,13 @@ public final class LobbySystemsMod implements ModInitializer { server.execute(() -> { POSITIONS.captureCurrent(player); TELEPORTS.scheduleJoinToLobby(player); + if (CONFIG.get().manageDimensionGamemode) { + // Terapkan segera pada state player yang sudah dimuat, lalu pertahankan + // stabilization window agar state login yang diterapkan terlambat oleh + // vanilla/mod lain tidak mengalahkan konfigurasi Lobby Systems. + DIMENSION_GAMEMODES.applyForPlayer(player, true); + DIMENSION_GAMEMODES.beginJoinEnforcement(player.getUUID()); + } LobbyLog.state( "PLAYER JOIN", "Player: " + player.getName().getString(),