# Lobby Systems v1.9.0 — Fabric 26.2 Server-side lobby framework untuk Minecraft Fabric 26.2. Lobby Systems menangani pre-login lobby placement, portal antar-dimensi, gamemode/gamerule per dimension, Starter Kit, persistent player data, serta hybrid authentication untuk premium dan local/cracked player. ## Target - Minecraft **26.2** - Java **25** - Fabric Loader **0.19.3** - Fabric API **0.156.0+26.2** - Fabric Loom **1.17** - Mod ID `dartokloning` - Java namespace `id.dartokloning.lobbysystems` - License **All Rights Reserved** Lobby Systems adalah mod server-side. WorldEdit Fabric digunakan untuk workflow pembuatan portal dari selection. ## Build dan release Windows: ```powershell .\compile.bat ``` Linux: ```bash ./compile.sh ``` Script membaca versi dari `gradle.properties` dan menggunakan Java 25. `release.bat` / `release.sh` menangani build release, Git push/tag, Gitea release, dan upload JAR. ## Struktur data dan konfigurasi ```text config/lobby/ ├── config.json ├── player.json ├── portals.json ├── auth/ │ ├── config.json │ └── rules.json ├── dimension/ │ ├── gamemodes.json │ └── gamerules.json └── starterkit/ ├── list.json └── recipients.json ``` `config.json` adalah konfigurasi utama Lobby. `player.json` adalah database persistent player bersama yang dipakai Auth dan last-position. File konfigurasi subsystem dikelompokkan ke folder `auth`, `dimension`, dan `starterkit`. v1.9.0 ditujukan untuk development layout baru dan **tidak melakukan automatic migration**. Pada development server, hapus data `config/lobby` lama sebelum first run v1.9.0 jika ingin generated defaults yang bersih. ## `/ls reload` `/ls reload` adalah satu pintu untuk me-reload seluruh runtime configuration/data Lobby Systems. Reload mencakup: 1. `config/lobby/config.json` 2. `config/lobby/player.json` melalui Auth/player-data subsystem 3. `config/lobby/auth/config.json` 4. `config/lobby/auth/rules.json` 5. `config/lobby/portals.json` dan portal visual repair 6. `config/lobby/dimension/gamemodes.json` lalu apply ke dimension/player 7. `config/lobby/dimension/gamerules.json` lalu apply ke loaded dimensions 8. `config/lobby/starterkit/list.json` 9. `config/lobby/starterkit/recipients.json` 10. refresh runtime state yang terkait Perubahan Auth diterapkan ke session player yang sedang online. Console menampilkan status reload dan admin yang menjalankan command menerima ringkasan hasilnya. ## Lobby dan player position Player ditempatkan ke Lobby pada fase awal login agar gameplay dimension sebelumnya tidak sempat menjadi initial world yang dikirim ke client. Lobby sebaiknya merupakan dimension yang safe dan secure karena Rules/Register/Login berjalan setelah player masuk server. `/lobby` hanya tersedia dari luar Lobby dan mengikuti minimum gameplay time pada `config.json`. Last-position per gameplay dimension disimpan pada section `positions` di `player.json`. Lobby dikecualikan sehingga posisi Lobby tidak menggantikan posisi gameplay yang harus dipulihkan. ## Authentication System Server tetap menggunakan: ```properties online-mode=true ``` Hybrid authentication Lobby Systems: - Premium player tetap melewati official Mojang/vanilla authentication. - Local/cracked player memakai deterministic offline UUID dan password Lobby Systems. - Premium username dilindungi agar tidak dapat diregistrasikan sebagai local identity. - Password disimpan menggunakan PBKDF2-HMAC-SHA256 + random salt; plaintext password tidak disimpan. - Metadata account, password hash/salt, Rules acceptance, dan last-position sama-sama disimpan di `config/lobby/player.json` pada section masing-masing. ### Dialog flow Rules/Register/Login menggunakan vanilla Minecraft Dialog UI sehingga normal player tidak perlu mengetik command. ```text Connect -> Server Rules (jika enabled dan belum accepted) -> Premium auto-login ATAU Create Account / Sign In -> Authenticated ``` `/register` dan `/login` tetap tersedia sebagai fallback compatibility. ### Premium policy `auth/config.json` menyediakan `premiumAutoLogin` dan `requireLoginEveryJoin`. - `premiumAutoLogin=true` + `requireLoginEveryJoin=false`: premium cukup dengan Mojang authentication dan auto-login. - `premiumAutoLogin=false`: premium tetap diverifikasi Mojang tetapi juga harus mempunyai password Lobby Systems dan melewati Register/Login Dialog. - `requireLoginEveryJoin=true`: premium wajib melewati password Lobby Systems setiap connection. - Local/cracked selalu memakai password Lobby Systems setiap connection. Password Lobby Systems pada premium account adalah authentication layer tambahan dan tidak menggantikan Mojang authentication. ### Authentication timeout Register/Login menggunakan `authenticationTimeoutSeconds` dari `config/lobby/auth/config.json`. Timeout tidak ditampilkan sebagai visual countdown karena Minecraft Dialog berada pada modal UI layer. Jika batas waktu habis, player di-disconnect dengan message yang dapat dikustomisasi dari Auth config. ### Server Rules Rules berasal dari `config/lobby/auth/rules.json`. Contoh default: ```json { "enabled": true, "version": 1, "timeoutSeconds": 60, "timeoutMessage": "You did not accept the server rules within {seconds} seconds. Please reconnect and try again.", "title": "Server Rules", "introduction": "Please read and accept our rules:", "rules": [ "No cheating, hacking, or exploits.", "Be respectful to all players.", "No advertising or spam.", "Follow staff instructions.", "Have fun and play fair!" ], "footer": "You must accept these rules to continue.", "agreementLabel": "I have read and agree to the server rules", "acceptButton": "I Accept" } ``` `enabled=false` melewati Rules Dialog. `version` adalah metadata internal: naikkan hanya jika semua player harus menerima ulang rules yang baru. Nomor version tidak ditampilkan pada Dialog. `timeoutSeconds` membatasi berapa lama Rules Dialog boleh dibiarkan tanpa acceptance. Tidak ada visual countdown; ketika timeout habis player menerima disconnect reason dari `timeoutMessage`. Placeholder `{seconds}` diisi dari nilai `timeoutSeconds`. ## `player.json` `player.json` adalah satu persistent database untuk data player. Saat ini mempunyai dua logical section: ```json { "auth": { "player-name": { "salt": "...", "hash": "...", "iterations": 210000, "accountType": "PREMIUM", "officialUuid": "...", "rulesVersionAccepted": 1, "rulesAcceptedAt": "..." } }, "positions": { "player-uuid": { "minecraft:overworld": { "x": 0.5, "y": 64.0, "z": 0.5, "yaw": 0.0, "pitch": 0.0 } } } } ``` Kedua subsystem menggunakan file yang sama dan writer mempertahankan section milik subsystem lain agar update Auth tidak menghapus positions dan sebaliknya. ## Portal System Portal dibuat dari WorldEdit selection dan disimpan di `config/lobby/portals.json`. Visual menggunakan vanilla `minecraft:nether_portal`, tetapi registered Lobby Systems portal mencegah vanilla Nether routing mengambil alih. Teleport menggunakan `TeleportTransition`, chunk preload, dan teleport lock. Portal visual diperbaiki saat startup/reload bila diperlukan. ## Dimension Gamemode Gamemode per dimension bersifat authoritative dan selalu aktif. ```text /ls gamemode list /ls gamemode set /ls gamemode remove ``` Mapping disimpan di `config/lobby/dimension/gamemodes.json` dan diterapkan pada join serta dimension change. ## Dimension Gamerules Gamerule per dimension disimpan di `config/lobby/dimension/gamerules.json` dan diterapkan ke native gamerules masing-masing `ServerLevel`. Gunakan `/ls gamerule ...` beserta command completion untuk melihat dan mengubah mapping. ## Starter Kit Starter Kit adalah snapshot inventory/equipment per dimension. Definitions berada di `config/lobby/starterkit/list.json`, sedangkan automatic-delivery history berada di `config/lobby/starterkit/recipients.json`. ```text /ls starterkit set /ls starterkit load /ls starterkit activate /ls starterkit deactivate /ls starterkit give /ls starterkit list /ls starterkit info /ls starterkit status /ls starterkit reset /ls starterkit delete ``` Satu dimension hanya mempunyai satu active kit. Eligibility automatic delivery dicatat per player + dimension. Forced admin give tidak mengubah recipient history. ## Command utama ```text /lobby /ls reload /ls tp /ls gamemode ... /ls gamerule ... /ls portal ... /ls starterkit ... ``` Command `/ls` administratif memerlukan operator permission sesuai implementasi command. ## v1.9.0 — Config restructure - Config/data dikelompokkan menjadi folder `auth`, `dimension`, dan `starterkit`. - Persistent Auth data dan last-position memakai satu `config/lobby/player.json`. - Starter Kit definitions memakai `starterkit/list.json`; recipient history memakai `starterkit/recipients.json`. - Dimension gamemode/gamerule memakai `dimension/gamemodes.json` dan `dimension/gamerules.json`. - `/ls reload`, startup loader, save path, error message, dan logging menggunakan layout v1.9.0. - Tidak ada automatic migration karena v1.9.0 masih berada dalam development workflow. ## Known compatibility note Local/cracked identity tidak mempunyai Mojang profile public key. Dengan `enforce-secure-profile=true`, vanilla secure-chat dapat menolak normal chat local player karena missing profile public key. Ini terpisah dari Auth login dan memerlukan compatibility handling khusus. ## License All Rights Reserved. Source dan asset Lobby Systems tidak boleh didistribusikan atau digunakan ulang di luar izin pemilik project.