Fix login gamemode

This commit is contained in:
Darto KLoning
2026-09-07 05:53:59 +07:00
parent abc1942ecd
commit 244a8865f0
6 changed files with 44 additions and 22 deletions
+7 -7
View File
@@ -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. **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 ```text
============================================ ============================================
Lobby Systems - Fabric 26.2 Build Lobby Systems - Fabric 26.2 Build
Version: 1.5.2 Version: 1.5.3
Namespace: id.dartokloning.lobbysystems Namespace: id.dartokloning.lobbysystems
Mod ID: dartokloning Mod ID: dartokloning
============================================ ============================================
@@ -52,7 +52,7 @@ chmod +x compile.sh release.sh
Output utama: Output utama:
```text ```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. `*-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 ```text
============================================ ============================================
Lobby Systems - READY Lobby Systems - READY
Version: 1.5.2 Version: 1.5.3
Minecraft: 26.2 Minecraft: 26.2
Config directory: config/lobby Config directory: config/lobby
WorldEdit: available WorldEdit: available
============================================ ============================================
``` ```
## Struktur konfigurasi v1.5.2 ## Struktur konfigurasi v1.5.3
```text ```text
config/ config/
-3
View File
@@ -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:"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" 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 exit /b 0
:push_branch_with_retry :push_branch_with_retry
-10
View File
@@ -32,17 +32,7 @@ read_property() {
} }
suggest_commit_message() { suggest_commit_message() {
local status
status="$(git status --porcelain)"
SUGGESTED_COMMIT="Update Lobby Systems v$MOD_VERSION" 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() { push_branch_with_retry() {
+1 -1
View File
@@ -5,6 +5,6 @@ minecraft_version=26.2
loader_version=0.19.3 loader_version=0.19.3
loom_version=1.17-SNAPSHOT loom_version=1.17-SNAPSHOT
fabric_api_version=0.156.0+26.2 fabric_api_version=0.156.0+26.2
mod_version=1.5.2 mod_version=1.5.3
maven_group=id.dartokloning maven_group=id.dartokloning
archives_base_name=lobby-systems archives_base_name=lobby-systems
@@ -30,6 +30,10 @@ public final class DimensionGameModeManager {
private final Map<String, String> configured = new LinkedHashMap<>(); private final Map<String, String> configured = new LinkedHashMap<>();
private final Map<UUID, String> lastDimension = new ConcurrentHashMap<>(); private final Map<UUID, String> lastDimension = new ConcurrentHashMap<>();
private final Map<UUID, Integer> 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() { public boolean load() {
if (!Files.exists(PATH)) { if (!Files.exists(PATH)) {
@@ -77,14 +81,37 @@ public final class DimensionGameModeManager {
public void tick(MinecraftServer server) { public void tick(MinecraftServer server) {
for (ServerPlayer player : server.getPlayerList().getPlayers()) { for (ServerPlayer player : server.getPlayerList().getPlayers()) {
UUID uuid = player.getUUID();
String dimension = player.level().dimension().identifier().toString(); String dimension = player.level().dimension().identifier().toString();
String previous = lastDimension.put(player.getUUID(), dimension); String previous = lastDimension.put(uuid, dimension);
if (!dimension.equals(previous)) { if (!dimension.equals(previous)) {
applyConfiguredMode(player, dimension, true); 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. * Memaksa gamemode yang dikonfigurasi untuk dimension player saat ini.
* Dipakai setelah teleport agar join/reconnect tidak bergantung hanya pada * Dipakai setelah teleport agar join/reconnect tidak bergantung hanya pada
@@ -99,6 +126,7 @@ public final class DimensionGameModeManager {
public void onDisconnect(UUID uuid) { public void onDisconnect(UUID uuid) {
lastDimension.remove(uuid); lastDimension.remove(uuid);
joinEnforcementTicks.remove(uuid);
} }
public String get(String dimension) { public String get(String dimension) {
@@ -134,6 +134,13 @@ public final class LobbySystemsMod implements ModInitializer {
server.execute(() -> { server.execute(() -> {
POSITIONS.captureCurrent(player); POSITIONS.captureCurrent(player);
TELEPORTS.scheduleJoinToLobby(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( LobbyLog.state(
"PLAYER JOIN", "PLAYER JOIN",
"Player: " + player.getName().getString(), "Player: " + player.getName().getString(),