diff --git a/README.md b/README.md index 22e544e..b17b249 100644 --- a/README.md +++ b/README.md @@ -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/ diff --git a/compile.bat b/compile.bat index dc20f49..abbd28e 100644 --- a/compile.bat +++ b/compile.bat @@ -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 ^ 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 diff --git a/compile.sh b/compile.sh index fa5a676..c6d3151 100644 --- a/compile.sh +++ b/compile.sh @@ -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 " + 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 " - 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 " - 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." diff --git a/gradle.properties b/gradle.properties index f9c96e4..7add6e7 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.1 +mod_version=1.5.2 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 066a6d4..ba3cc5d 100644 --- a/src/main/java/id/dartokloning/lobbysystems/DimensionGameModeManager.java +++ b/src/main/java/id/dartokloning/lobbysystems/DimensionGameModeManager.java @@ -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; diff --git a/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java b/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java index 5e18551..7a4e9d0 100644 --- a/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java +++ b/src/main/java/id/dartokloning/lobbysystems/LobbySystemsMod.java @@ -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; }