257 lines
10 KiB
Markdown
257 lines
10 KiB
Markdown
# Lobby Systems v1.8.4 — Fabric 26.2
|
|
|
|
Server-side lobby framework untuk Minecraft Fabric 26.2. Lobby Systems menangani lobby placement, portal antar-dimensi, gamemode/gamerule per dimensi, Starter Kit, penyimpanan posisi player, dan hybrid authentication untuk premium + 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`
|
|
- Namespace: `id.dartokloning.lobbysystems`
|
|
- License: All Rights Reserved
|
|
|
|
Lobby Systems adalah mod server-side. WorldEdit Fabric diperlukan untuk workflow pembuatan portal dari selection.
|
|
|
|
## Build
|
|
|
|
Windows:
|
|
|
|
```powershell
|
|
.\compile.bat
|
|
```
|
|
|
|
Linux:
|
|
|
|
```bash
|
|
./compile.sh
|
|
```
|
|
|
|
Script membaca versi dari `gradle.properties`, menggunakan Java 25, dan menyediakan integrasi Git setelah build. `release.bat` / `release.sh` digunakan untuk build release, push branch/tag, membuat Gitea release, dan mengunggah JAR.
|
|
|
|
## Struktur konfigurasi
|
|
|
|
```text
|
|
config/lobby/
|
|
├── config.json
|
|
├── player-positions.json
|
|
├── portals.json
|
|
├── dimension-gamemodes.json
|
|
├── dimension-gamerules.json
|
|
├── starterkits.json
|
|
├── starterkit-recipients.json
|
|
└── auth/
|
|
├── config.json
|
|
├── rules.json
|
|
└── accounts.json
|
|
```
|
|
|
|
`/ls reload` me-reload **seluruh konfigurasi Lobby Systems**, termasuk config utama, Auth, portal, dimension gamemode, dimension gamerule, dan Starter Kit. Perubahan Auth juga diterapkan ke session player yang sedang online. Perubahan Auth, termasuk `rules.json`, `requireLoginEveryJoin`, dan `enabled`, tidak memerlukan restart server.
|
|
|
|
## Lobby dan login placement
|
|
|
|
Player ditempatkan ke Lobby pada fase awal login agar world gameplay sebelumnya tidak sempat menjadi world awal yang dikirim ke client. Lobby sebaiknya merupakan dimensi yang safe dan secure karena player yang belum selesai authentication ditahan di posisi login sampai proses selesai.
|
|
|
|
`/lobby` hanya tersedia dari luar Lobby dan mengikuti minimum gameplay time yang dikonfigurasi. Posisi terakhir per gameplay dimension disimpan terpisah; Lobby dikecualikan dari penyimpanan posisi gameplay.
|
|
|
|
## Authentication System
|
|
|
|
Server tetap menggunakan:
|
|
|
|
```properties
|
|
online-mode=true
|
|
```
|
|
|
|
Lobby Systems kemudian menyediakan hybrid authentication:
|
|
|
|
- **Premium**: tetap melalui official Mojang/vanilla authentication.
|
|
- **Local/cracked**: menggunakan deterministic offline UUID dan password Lobby Systems.
|
|
- Username premium tidak boleh diregistrasikan sebagai local account.
|
|
- Password disimpan sebagai PBKDF2-HMAC-SHA256 dengan random salt; plaintext password tidak disimpan.
|
|
|
|
### Dialog flow
|
|
|
|
Authentication v1.8 menggunakan vanilla Minecraft Dialog UI sehingga normal player tidak perlu mengetik `/register` atau `/login`.
|
|
|
|
First join dapat mengikuti:
|
|
|
|
```text
|
|
Connect
|
|
-> Server Rules (jika aktif/belum accepted)
|
|
-> Create Account (jika local password diperlukan)
|
|
-> Authenticated
|
|
```
|
|
|
|
Returning local player:
|
|
|
|
```text
|
|
Connect -> Rules jika versi berubah -> Sign In -> Authenticated
|
|
```
|
|
|
|
`/register` dan `/login` tetap tersedia sebagai fallback compatibility.
|
|
|
|
### `requireLoginEveryJoin`
|
|
|
|
Default:
|
|
|
|
```json
|
|
"requireLoginEveryJoin": false
|
|
```
|
|
|
|
Semantik:
|
|
|
|
- `false`: premium player cukup dengan Mojang authentication dan auto-login; local/cracked player tetap wajib password Lobby Systems pada setiap connection.
|
|
- `true`: premium player tetap diverifikasi Mojang, tetapi juga wajib mempunyai dan memasukkan password Lobby Systems setiap connection. Local/cracked player tetap wajib password seperti biasa.
|
|
|
|
Jadi `true` merupakan lapisan password tambahan untuk premium account, bukan pengganti Mojang authentication.
|
|
|
|
### Server Rules
|
|
|
|
Rules dipisahkan dari Auth config dan dibuat otomatis sebagai `config/lobby/auth/rules.json`. File ini adalah sumber isi window Rules:
|
|
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"version": 1,
|
|
"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"
|
|
}
|
|
```
|
|
|
|
Acceptance disimpan per account. `version` hanya perlu dinaikkan ketika perubahan rules memang harus diminta untuk diterima ulang oleh seluruh player. Mengedit teks tanpa menaikkan `version` tidak menghapus acceptance lama. `/ls reload` membaca ulang file ini dan menerapkan perubahan runtime.
|
|
|
|
### Auth account data
|
|
|
|
`config/lobby/auth/accounts.json` menyimpan metadata account, rules acceptance, salt, password hash, dan PBKDF2 iteration count. File ini bukan tempat plaintext password.
|
|
|
|
## Portal System
|
|
|
|
Portal dibuat dari WorldEdit selection dan disimpan di `portals.json`. Visual portal menggunakan vanilla `minecraft:nether_portal` blocks, tetapi registered Lobby Systems portal mencegah vanilla Nether portal routing mengambil alih.
|
|
|
|
Destination dapat mengarah ke dimensi lain dan teleport menggunakan `TeleportTransition`, chunk preload, serta teleport lock. Portal visual dapat diperbaiki kembali saat reload/startup.
|
|
|
|
Gunakan command `/ls portal ...` yang tersedia melalui command completion untuk create/delete/info dan maintenance portal.
|
|
|
|
## Dimension Gamemode
|
|
|
|
Gamemode per dimension bersifat authoritative dan selalu aktif.
|
|
|
|
```text
|
|
/ls gamemode list
|
|
/ls gamemode set <dimension> <gamemode>
|
|
/ls gamemode remove <dimension>
|
|
```
|
|
|
|
Mapping disimpan di `dimension-gamemodes.json` dan diterapkan pada join serta perpindahan dimension.
|
|
|
|
Contoh:
|
|
|
|
```text
|
|
/ls gamemode set minecraft:lobby adventure
|
|
/ls gamemode set minecraft:creative creative
|
|
/ls gamemode set minecraft:flat_survival survival
|
|
/ls gamemode set minecraft:flat_creative creative
|
|
```
|
|
|
|
## Dimension Gamerules
|
|
|
|
Gamerule dapat diatur per dimension dan disimpan di `dimension-gamerules.json`. Nilainya diterapkan ke native gamerules masing-masing `ServerLevel`, sehingga tidak bergantung pada global gamerule saja.
|
|
|
|
Gunakan `/ls gamerule ...` beserta command completion untuk melihat dan mengubah mapping.
|
|
|
|
## Starter Kit
|
|
|
|
Starter Kit adalah snapshot inventory/equipment per dimension. Hanya satu kit yang dapat aktif untuk satu dimension, dan eligibility automatic delivery dicatat per **player + dimension**.
|
|
|
|
```text
|
|
/ls starterkit set <name> <dimension>
|
|
/ls starterkit load <name>
|
|
/ls starterkit activate <name>
|
|
/ls starterkit deactivate <name>
|
|
/ls starterkit give <name> <player>
|
|
/ls starterkit list
|
|
/ls starterkit info <name>
|
|
/ls starterkit status <dimension> <player>
|
|
/ls starterkit reset <dimension> <player>
|
|
/ls starterkit delete <name>
|
|
```
|
|
|
|
Automatic delivery dijalankan setelah dimension change dengan delay agar kompatibel dengan mod inventory-per-dimension seperti Dimensional Inventories. `/ls starterkit give` adalah forced admin give dan tidak mengubah recipient history.
|
|
|
|
## Command utama
|
|
|
|
```text
|
|
/lobby
|
|
/ls reload
|
|
/ls tp <dimension>
|
|
/ls gamemode ...
|
|
/ls gamerule ...
|
|
/ls portal ...
|
|
/ls starterkit ...
|
|
```
|
|
|
|
Command `/ls` administratif memerlukan operator permission sesuai implementasi command.
|
|
|
|
## `/ls reload`
|
|
|
|
Reload adalah satu pintu untuk seluruh runtime configuration. Urutannya mencakup:
|
|
|
|
1. `config.json`
|
|
2. Auth `config.json` + `rules.json` + `accounts.json`
|
|
3. `portals.json` + portal visual repair
|
|
4. `dimension-gamemodes.json` + apply ke dimension/player
|
|
5. `dimension-gamerules.json` + apply ke loaded dimensions
|
|
6. Starter Kit data
|
|
7. Refresh runtime state yang terkait
|
|
|
|
Console menampilkan `RELOAD START` dan `RELOAD COMPLETE`. Player admin yang menjalankan command menerima ringkasan hasil reload tanpa broadcast ke player lain.
|
|
|
|
## Catatan v1.8.2
|
|
|
|
- Memperbaiki crash `ConcurrentModificationException` ketika authentication timeout men-disconnect player dari dalam server tick. Auth sekarang mengiterasi snapshot player list, bukan live `ArrayList`.
|
|
- Initial dialog ditunda singkat sampai player benar-benar tersedia sebagai target command; ini menghilangkan kegagalan awal `No player was found`.
|
|
- Dialog tidak lagi dibuka ulang setiap `reminderIntervalSeconds`, karena itu dapat menghapus password yang sedang diketik.
|
|
- Countdown sekarang memakai dua fase independen melalui action bar: Rules memakai `rules.json -> timeoutSeconds`, sedangkan Register/Login memakai `auth/config.json -> authenticationTimeoutSeconds`. Timer Register/Login dimulai ulang dari penuh setelah Rules diterima.
|
|
- Rules dipindahkan ke `config/lobby/auth/rules.json` dan Rules dialog dibangun dari file tersebut.
|
|
- `rulesEnabled` dan `rulesVersion` lama dipindahkan menjadi `enabled` dan `version` di `rules.json`.
|
|
- `/ls reload` juga me-reload `rules.json` dan mengevaluasi ulang acceptance/session player online.
|
|
|
|
## Known compatibility note
|
|
|
|
Local/cracked identity tidak memiliki Mojang profile public key. Jika server mempertahankan `enforce-secure-profile=true`, vanilla secure-chat dapat menolak normal chat local player dengan pesan missing profile public key. Masalah secure-chat ini terpisah dari keberhasilan login/authentication dan perlu compatibility handling khusus.
|
|
|
|
## License
|
|
|
|
All Rights Reserved. Source dan asset Lobby Systems tidak boleh didistribusikan atau digunakan ulang di luar izin pemilik project.
|
|
|
|
|
|
## Catatan v1.8.3
|
|
|
|
- Memperbaiki compile error Minecraft 26.2 karena `ServerPlayer.displayClientMessage(Component, boolean)` sudah tidak tersedia pada mapping/API target ini.
|
|
- Countdown authentication sekarang dikirim langsung dengan vanilla `ClientboundSetActionBarTextPacket`, sehingga tetap tampil sebagai action bar tanpa bergantung pada method player yang telah dihapus.
|
|
- Warna countdown menggunakan `ChatFormatting`/component styling, bukan legacy section-code di payload action bar.
|
|
- Seluruh perubahan v1.8.2 (safe timeout iteration, delayed initial dialog, `rules.json`, dan global `/ls reload`) tetap dipertahankan.
|
|
|
|
|
|
## v1.8.4 — Two-stage auth timer
|
|
|
|
- Informasi `Rules version: N` dihapus dari UI Rules; version tetap disimpan sebagai metadata internal untuk mekanisme re-accept.
|
|
- `rules.json` memiliki `timeoutSeconds` (default `60`) untuk batas waktu menerima Rules.
|
|
- Register/Login tetap memakai `authenticationTimeoutSeconds` (default `120`).
|
|
- Setelah Rules diterima, timer Rules dihentikan dan timer Register/Login dimulai dari awal.
|
|
- Countdown action bar memakai label sesuai fase: `Accept the rules within`, `Register within`, atau `Login within`.
|
|
- Timeout Rules dan timeout authentication memiliki pesan disconnect yang berbeda.
|
|
- `/ls reload` tetap memuat ulang seluruh konfigurasi Lobby Systems, termasuk `auth/rules.json` dan `auth/config.json`.
|