Fix join gamemode enforcement in Lobby Systems v1.5.2

This commit is contained in:
Darto KLoning
2026-09-06 23:31:07 +07:00
parent b24e031b05
commit abc1942ecd
6 changed files with 173 additions and 102 deletions
+7 -7
View File
@@ -1,8 +1,8 @@
# Lobby Systems v1.5.1 — Fabric 26.2
# Lobby Systems v1.5.2 — Fabric 26.2
Server-side lobby routing untuk Minecraft 26.2/Fabric. v1.5.1 memperbaiki compatibility compile Minecraft 26.2 pada Portal Visual System yang diperkenalkan di v1.5.0. server-only berbasis visual vanilla `minecraft:nether_portal`, lengkap dengan orientasi X/Z otomatis dari WorldEdit selection. Native per-dimension gamerules, dimension gamemode management, dan WorldEdit 7.4.x bridge tetap dipertahankan.
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.
**v1.5.1 bugfix:** memperbaiki penggunaan API `ServerPlayer` saat membuat/membersihkan visual portal. Fitur Portal Visual System tetap sama seperti v1.5.0.
**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.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.1
Version: 1.5.2
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.1.jar
build/libs/lobby-systems-1.5.2.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.1
Version: 1.5.2
Minecraft: 26.2
Config directory: config/lobby
WorldEdit: available
============================================
```
## Struktur konfigurasi v1.5.0
## Struktur konfigurasi v1.5.2
```text
config/
+27 -9
View File
@@ -16,6 +16,7 @@ set "LOCAL_GRADLE_DIR=%CD%\.gradle-local"
set "GRADLE_VERSION=9.5.1"
set "GRADLE_HOME=%LOCAL_GRADLE_DIR%\gradle-%GRADLE_VERSION%"
set "GRADLE_BIN=%GRADLE_HOME%\bin\gradle.bat"
set "GIT_ONLY=0"
set "MOD_VERSION="
set "MINECRAFT_VERSION="
@@ -36,6 +37,8 @@ if not defined MOD_VERSION set "MOD_VERSION=unknown"
if not defined MINECRAFT_VERSION set "MINECRAFT_VERSION=26.2"
if not defined MAVEN_GROUP set "MAVEN_GROUP=id.dartokloning"
set "JAR_PATH=%CD%\build\libs\lobby-systems-%MOD_VERSION%.jar"
echo ============================================
echo Lobby Systems - Fabric %MINECRAFT_VERSION% Build
echo Version: %MOD_VERSION%
@@ -43,6 +46,19 @@ echo Namespace: id.dartokloning.lobbysystems
echo Mod ID: dartokloning
echo ============================================
REM release.bat selalu melakukan build ulang melalui --build-only.
if "%BUILD_ONLY%"=="0" if exist "%JAR_PATH%" (
echo.
echo [INFO] JAR untuk v%MOD_VERSION% sudah pernah dibuild:
echo %JAR_PATH%
echo.
choice /C CG /N /M "[C] Compile ulang / [G] Git saja: "
if errorlevel 2 (
set "GIT_ONLY=1"
goto :git_integration
)
)
where java.exe >nul 2>&1
if errorlevel 1 (
echo [ERROR] Java tidak ditemukan di PATH.
@@ -127,7 +143,6 @@ echo ============================================
echo BUILD SUCCESS
echo ============================================
set "JAR_PATH=%CD%\build\libs\lobby-systems-%MOD_VERSION%.jar"
if exist "%JAR_PATH%" (
echo JAR:
echo %JAR_PATH%
@@ -136,7 +151,6 @@ if exist "%JAR_PATH%" (
echo %JAR_PATH%
)
REM release.bat memakai mode ini supaya prompt Git tidak muncul dua kali.
if "%BUILD_ONLY%"=="1" exit /b 0
echo.
@@ -149,12 +163,12 @@ echo.
echo ============================================
echo Git Integration
echo ============================================
if "%GIT_ONLY%"=="1" echo [INFO] Mode Git-only: build dilewati karena JAR v%MOD_VERSION% sudah tersedia.
where git.exe >nul 2>&1
if errorlevel 1 (
echo [ERROR] Git tidak ditemukan di PATH.
echo Build tetap berhasil, tetapi Git tidak dapat dijalankan.
goto :success
goto :git_failed
)
git rev-parse --is-inside-work-tree >nul 2>&1
@@ -166,7 +180,7 @@ if errorlevel 1 (
echo git branch -M main
echo git remote add origin ^<URL-GITEA^>
echo.
goto :success
goto :git_failed
)
echo [INFO] Memeriksa perubahan...
@@ -202,7 +216,7 @@ if defined HAS_CHANGES (
)
) else (
echo [INFO] Tidak ada perubahan source yang perlu di-commit.
echo [INFO] Akan mencoba push commit yang sudah ada.
echo [INFO] Akan mencoba push commit lokal yang belum terkirim, jika ada.
)
set "CURRENT_BRANCH="
@@ -238,7 +252,7 @@ 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=Update Lobby Systems v%MOD_VERSION%"
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
@@ -304,9 +318,13 @@ echo ============================================
echo GIT FAILED
echo ============================================
echo.
echo [INFO] Build Lobby Systems tetap berhasil.
if "%GIT_ONLY%"=="1" (
echo [INFO] Build tidak dijalankan; JAR v%MOD_VERSION% yang sudah ada tetap aman.
) else (
echo [INFO] Build Lobby Systems tetap berhasil.
)
echo [INFO] Commit lokal tetap tersimpan.
echo [INFO] Anda bisa menjalankan compile.bat lagi dan memilih Y; jika tidak ada perubahan, script langsung mencoba push commit yang tertunda.
echo [INFO] Jalankan compile.bat lagi; jika JAR versi sama terdeteksi, pilih G untuk Git-only.
echo.
pause
exit /b 2
+116 -82
View File
@@ -18,6 +18,7 @@ LOCAL_GRADLE_DIR="$SCRIPT_DIR/.gradle-local"
GRADLE_VERSION="9.5.1"
GRADLE_HOME="$LOCAL_GRADLE_DIR/gradle-$GRADLE_VERSION"
GRADLE_BIN="$GRADLE_HOME/bin/gradle"
GIT_ONLY=0
info() { echo "[INFO] $1"; }
ok() { echo "[OK] $1"; }
@@ -36,7 +37,7 @@ suggest_commit_message() {
SUGGESTED_COMMIT="Update Lobby Systems v$MOD_VERSION"
if grep -qiE '(^|[[:space:]])src/' <<<"$status"; then
SUGGESTED_COMMIT="Update Lobby Systems v$MOD_VERSION"
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
@@ -78,6 +79,88 @@ push_branch_with_retry() {
done
}
run_git_integration() {
echo
separator
echo " Git Integration"
separator
if [[ $GIT_ONLY -eq 1 ]]; then
info "Mode Git-only: build dilewati karena JAR v$MOD_VERSION sudah tersedia."
fi
if ! command -v git >/dev/null 2>&1; then
error "Git tidak ditemukan di PATH."
return 2
fi
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
error "Folder ini belum menjadi Git repository."
echo
echo "Jalankan terlebih dahulu:"
echo " git init"
echo " git branch -M main"
echo " git remote add origin <URL-GITEA>"
return 2
fi
info "Memeriksa perubahan Git..."
CHANGES="$(git status --porcelain)"
if [[ -n "$CHANGES" ]]; then
echo
echo "Perubahan ditemukan:"
echo
git status --short
echo
suggest_commit_message
echo "[SUGGEST] Commit message: $SUGGESTED_COMMIT"
info "Tekan Enter untuk memakai saran tersebut, atau ketik pesan sendiri."
read -r -p "Commit message [$SUGGESTED_COMMIT]: " COMMIT_MESSAGE
[[ -z "$COMMIT_MESSAGE" ]] && COMMIT_MESSAGE="$SUGGESTED_COMMIT"
info "Menambahkan perubahan ke staging..."
if ! git add -A; then
error "git add gagal."
return 2
fi
info "Membuat commit..."
if ! git commit -m "$COMMIT_MESSAGE"; then
error "git commit gagal."
return 2
fi
else
info "Tidak ada perubahan source yang perlu di-commit."
info "Akan mencoba push commit lokal yang belum terkirim, jika ada."
fi
CURRENT_BRANCH="$(git branch --show-current)"
if [[ -z "$CURRENT_BRANCH" ]]; then
error "Tidak dapat menentukan branch Git aktif."
return 2
fi
info "Branch aktif: $CURRENT_BRANCH"
if ! git remote get-url origin >/dev/null 2>&1; then
error "Remote Git 'origin' belum dikonfigurasi."
info "Commit lokal tetap tersimpan."
return 2
fi
REMOTE_URL="$(git remote get-url origin)"
info "Remote origin: $REMOTE_URL"
if ! push_branch_with_retry; then
return 2
fi
echo
ok "Push ke Git/Gitea berhasil."
return 0
}
if [[ ! -f "$GRADLE_PROPERTIES" ]]; then
error "gradle.properties tidak ditemukan."
exit 1
@@ -91,6 +174,8 @@ MAVEN_GROUP="$(read_property "maven_group")"
[[ -z "$MINECRAFT_VERSION" ]] && MINECRAFT_VERSION="26.2"
[[ -z "$MAVEN_GROUP" ]] && MAVEN_GROUP="id.dartokloning"
JAR_PATH="$SCRIPT_DIR/build/libs/lobby-systems-$MOD_VERSION.jar"
separator
echo " Lobby Systems - Fabric $MINECRAFT_VERSION Build"
echo " Version: $MOD_VERSION"
@@ -98,6 +183,34 @@ echo " Namespace: id.dartokloning.lobbysystems"
echo " Mod ID: dartokloning"
separator
if [[ $BUILD_ONLY -eq 0 && -f "$JAR_PATH" ]]; then
echo
info "JAR untuk v$MOD_VERSION sudah pernah dibuild:"
echo " $JAR_PATH"
echo
read -r -p "[C] Compile ulang / [G] Git saja: " EXISTING_ACTION
case "$EXISTING_ACTION" in
g|G|git|GIT|Git)
GIT_ONLY=1
if run_git_integration; then
echo
separator
echo " Lobby Systems v$MOD_VERSION selesai."
separator
exit 0
fi
echo
separator
echo " GIT FAILED"
separator
info "Build tidak dijalankan; JAR v$MOD_VERSION yang sudah ada tetap aman."
info "Commit lokal tetap tersimpan."
exit 2
;;
*) ;;
esac
fi
if ! command -v java >/dev/null 2>&1; then
error "Java tidak ditemukan di PATH."
echo "Install JDK 25 lalu jalankan script lagi."
@@ -192,8 +305,6 @@ separator
echo " BUILD SUCCESS"
separator
JAR_PATH="$SCRIPT_DIR/build/libs/lobby-systems-$MOD_VERSION.jar"
if [[ -f "$JAR_PATH" ]]; then
echo "JAR:"
echo "$JAR_PATH"
@@ -221,94 +332,17 @@ case "$GIT_CONFIRM" in
;;
esac
echo
separator
echo " Git Integration"
separator
if ! command -v git >/dev/null 2>&1; then
error "Git tidak ditemukan di PATH."
info "Build tetap berhasil."
exit 0
fi
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
error "Folder ini belum menjadi Git repository."
echo
echo "Jalankan terlebih dahulu:"
echo " git init"
echo " git branch -M main"
echo " git remote add origin <URL-GITEA>"
echo
exit 0
fi
info "Memeriksa perubahan Git..."
CHANGES="$(git status --porcelain)"
if [[ -n "$CHANGES" ]]; then
echo
echo "Perubahan ditemukan:"
echo
git status --short
echo
suggest_commit_message
echo "[SUGGEST] Commit message: $SUGGESTED_COMMIT"
info "Tekan Enter untuk memakai saran tersebut, atau ketik pesan sendiri."
read -r -p "Commit message [$SUGGESTED_COMMIT]: " COMMIT_MESSAGE
[[ -z "$COMMIT_MESSAGE" ]] && COMMIT_MESSAGE="$SUGGESTED_COMMIT"
info "Menambahkan perubahan ke staging..."
if ! git add -A; then
error "git add gagal."
exit 2
fi
info "Membuat commit..."
if ! git commit -m "$COMMIT_MESSAGE"; then
error "git commit gagal."
exit 2
fi
else
info "Tidak ada perubahan source yang perlu di-commit."
info "Akan mencoba push commit yang sudah ada."
fi
CURRENT_BRANCH="$(git branch --show-current)"
if [[ -z "$CURRENT_BRANCH" ]]; then
error "Tidak dapat menentukan branch Git aktif."
exit 2
fi
info "Branch aktif: $CURRENT_BRANCH"
if ! git remote get-url origin >/dev/null 2>&1; then
error "Remote Git 'origin' belum dikonfigurasi."
echo
echo "Tambahkan remote Gitea dengan:"
echo " git remote add origin <URL-GITEA>"
echo
info "Commit lokal tetap tersimpan."
exit 2
fi
REMOTE_URL="$(git remote get-url origin)"
info "Remote origin: $REMOTE_URL"
if ! push_branch_with_retry; then
if ! run_git_integration; then
echo
separator
echo " GIT FAILED"
separator
info "Build Lobby Systems tetap berhasil."
info "Commit lokal tetap tersimpan."
info "Jalankan compile.sh lagi dan pilih Y; bila tidak ada perubahan, script langsung mencoba push commit yang tertunda."
info "Jalankan compile.sh lagi; jika JAR versi sama terdeteksi, pilih G untuk Git-only."
exit 2
fi
echo
ok "Push ke Git/Gitea berhasil."
echo
separator
echo " Lobby Systems v$MOD_VERSION selesai."
+1 -1
View File
@@ -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.1
mod_version=1.5.2
maven_group=id.dartokloning
archives_base_name=lobby-systems
@@ -80,11 +80,23 @@ public final class DimensionGameModeManager {
String dimension = player.level().dimension().identifier().toString();
String previous = lastDimension.put(player.getUUID(), dimension);
if (!dimension.equals(previous)) {
applyForPlayer(player, dimension, true);
applyConfiguredMode(player, dimension, true);
}
}
}
/**
* Memaksa gamemode yang dikonfigurasi untuk dimension player saat ini.
* Dipakai setelah teleport agar join/reconnect tidak bergantung hanya pada
* deteksi perubahan dimension di tick berikutnya.
*/
public boolean applyForPlayer(ServerPlayer player, boolean log) {
String dimension = player.level().dimension().identifier().toString();
boolean changed = applyConfiguredMode(player, dimension, log);
lastDimension.put(player.getUUID(), dimension);
return changed;
}
public void onDisconnect(UUID uuid) {
lastDimension.remove(uuid);
}
@@ -117,14 +129,14 @@ public final class DimensionGameModeManager {
String normalized = normalizeDimension(dimension);
for (ServerPlayer player : server.getPlayerList().getPlayers()) {
if (player.level().dimension().identifier().toString().equals(normalized)) {
if (applyForPlayer(player, normalized, false)) changed++;
if (applyConfiguredMode(player, normalized, false)) changed++;
lastDimension.put(player.getUUID(), normalized);
}
}
return changed;
}
private boolean applyForPlayer(ServerPlayer player, String dimension, boolean log) {
private boolean applyConfiguredMode(ServerPlayer player, String dimension, boolean log) {
String configuredMode = configured.get(normalizeDimension(dimension));
if (configuredMode == null) return false;
@@ -921,6 +921,10 @@ 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);
}
if (sendMessage) {
player.sendSystemMessage(Component.literal(returning
? "§aTeleport ke §f" + dimensionId + "§a pada posisi terakhirmu."
@@ -967,6 +971,9 @@ 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) {
DIMENSION_GAMEMODES.applyForPlayer(player, true);
}
if (ok && sendMessage) player.sendSystemMessage(Component.literal(c.returnedMessage));
return ok;
}