Fix login gamemode
This commit is contained in:
@@ -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/
|
||||
|
||||
@@ -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
|
||||
|
||||
-10
@@ -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() {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -30,6 +30,10 @@ public final class DimensionGameModeManager {
|
||||
|
||||
private final Map<String, String> configured = new LinkedHashMap<>();
|
||||
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() {
|
||||
if (!Files.exists(PATH)) {
|
||||
@@ -77,12 +81,35 @@ 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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -99,6 +126,7 @@ public final class DimensionGameModeManager {
|
||||
|
||||
public void onDisconnect(UUID uuid) {
|
||||
lastDimension.remove(uuid);
|
||||
joinEnforcementTicks.remove(uuid);
|
||||
}
|
||||
|
||||
public String get(String dimension) {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user