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.
|
**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/
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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,12 +81,35 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user