config restructure
This commit is contained in:
@@ -1,21 +1,21 @@
|
||||
# Lobby Systems v1.8.5 — Fabric 26.2
|
||||
# Lobby Systems v1.9.0 — 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.
|
||||
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`
|
||||
- Namespace: `id.dartokloning.lobbysystems`
|
||||
- License: All Rights Reserved
|
||||
- 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 diperlukan untuk workflow pembuatan portal dari selection.
|
||||
Lobby Systems adalah mod server-side. WorldEdit Fabric digunakan untuk workflow pembuatan portal dari selection.
|
||||
|
||||
## Build
|
||||
## Build dan release
|
||||
|
||||
Windows:
|
||||
|
||||
@@ -29,32 +29,54 @@ Linux:
|
||||
./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.
|
||||
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 konfigurasi
|
||||
## Struktur data dan konfigurasi
|
||||
|
||||
```text
|
||||
config/lobby/
|
||||
├── config.json
|
||||
├── player-positions.json
|
||||
├── player.json
|
||||
├── portals.json
|
||||
├── dimension-gamemodes.json
|
||||
├── dimension-gamerules.json
|
||||
├── starterkits.json
|
||||
├── starterkit-recipients.json
|
||||
└── auth/
|
||||
├── config.json
|
||||
├── rules.json
|
||||
└── accounts.json
|
||||
├── auth/
|
||||
│ ├── config.json
|
||||
│ └── rules.json
|
||||
├── dimension/
|
||||
│ ├── gamemodes.json
|
||||
│ └── gamerules.json
|
||||
└── starterkit/
|
||||
├── list.json
|
||||
└── recipients.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.
|
||||
`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`.
|
||||
|
||||
## Lobby dan login placement
|
||||
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.
|
||||
|
||||
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.
|
||||
## `/ls reload`
|
||||
|
||||
`/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.
|
||||
`/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
|
||||
|
||||
@@ -64,54 +86,45 @@ Server tetap menggunakan:
|
||||
online-mode=true
|
||||
```
|
||||
|
||||
Lobby Systems kemudian menyediakan hybrid authentication:
|
||||
Hybrid authentication Lobby Systems:
|
||||
|
||||
- **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.
|
||||
- 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
|
||||
|
||||
Authentication v1.8 menggunakan vanilla Minecraft Dialog UI sehingga normal player tidak perlu mengetik `/register` atau `/login`.
|
||||
|
||||
First join dapat mengikuti:
|
||||
Rules/Register/Login menggunakan vanilla Minecraft Dialog UI sehingga normal player tidak perlu mengetik command.
|
||||
|
||||
```text
|
||||
Connect
|
||||
-> Server Rules (jika aktif/belum accepted)
|
||||
-> Create Account (jika local password diperlukan)
|
||||
-> Server Rules (jika enabled dan belum accepted)
|
||||
-> Premium auto-login ATAU Create Account / Sign In
|
||||
-> Authenticated
|
||||
```
|
||||
|
||||
Returning local player:
|
||||
|
||||
```text
|
||||
Connect -> Rules jika versi berubah -> Sign In -> Authenticated
|
||||
```
|
||||
|
||||
`/register` dan `/login` tetap tersedia sebagai fallback compatibility.
|
||||
|
||||
### `requireLoginEveryJoin`
|
||||
### Premium policy
|
||||
|
||||
Default:
|
||||
`auth/config.json` menyediakan `premiumAutoLogin` dan `requireLoginEveryJoin`.
|
||||
|
||||
```json
|
||||
"requireLoginEveryJoin": false
|
||||
```
|
||||
- `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.
|
||||
|
||||
Semantik `premiumAutoLogin` dan `requireLoginEveryJoin`:
|
||||
Password Lobby Systems pada premium account adalah authentication layer tambahan dan tidak menggantikan Mojang authentication.
|
||||
|
||||
- `premiumAutoLogin=true` + `requireLoginEveryJoin=false`: premium player cukup dengan Mojang authentication dan auto-login.
|
||||
- `premiumAutoLogin=false`: premium player tetap diverifikasi Mojang, tetapi wajib membuat/memasukkan password Lobby Systems.
|
||||
- `requireLoginEveryJoin=true`: premium player juga wajib password Lobby Systems setiap connection, terlepas dari auto-login policy.
|
||||
- Local/cracked player selalu memakai password Lobby Systems setiap connection.
|
||||
### Authentication timeout
|
||||
|
||||
Password Lobby Systems untuk premium adalah lapisan tambahan; Mojang authentication tetap dipertahankan.
|
||||
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 dipisahkan dari Auth config dan dibuat otomatis sebagai `config/lobby/auth/rules.json`. File ini adalah sumber isi window Rules:
|
||||
Rules berasal dari `config/lobby/auth/rules.json`. Contoh default:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -134,19 +147,48 @@ Rules dipisahkan dari Auth config dan dibuat otomatis sebagai `config/lobby/auth
|
||||
}
|
||||
```
|
||||
|
||||
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.
|
||||
`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.
|
||||
|
||||
### Auth account data
|
||||
`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`.
|
||||
|
||||
`config/lobby/auth/accounts.json` menyimpan metadata account, rules acceptance, salt, password hash, dan PBKDF2 iteration count. File ini bukan tempat plaintext password.
|
||||
## `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 `portals.json`. Visual portal menggunakan vanilla `minecraft:nether_portal` blocks, tetapi registered Lobby Systems portal mencegah vanilla Nether portal routing mengambil alih.
|
||||
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.
|
||||
|
||||
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.
|
||||
Teleport menggunakan `TeleportTransition`, chunk preload, dan teleport lock. Portal visual diperbaiki saat startup/reload bila diperlukan.
|
||||
|
||||
## Dimension Gamemode
|
||||
|
||||
@@ -158,26 +200,17 @@ Gamemode per dimension bersifat authoritative dan selalu aktif.
|
||||
/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
|
||||
```
|
||||
Mapping disimpan di `config/lobby/dimension/gamemodes.json` dan diterapkan pada join serta dimension change.
|
||||
|
||||
## 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.
|
||||
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. Hanya satu kit yang dapat aktif untuk satu dimension, dan eligibility automatic delivery dicatat per **player + dimension**.
|
||||
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 <name> <dimension>
|
||||
@@ -192,7 +225,7 @@ Starter Kit adalah snapshot inventory/equipment per dimension. Hanya satu kit ya
|
||||
/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.
|
||||
Satu dimension hanya mempunyai satu active kit. Eligibility automatic delivery dicatat per player + dimension. Forced admin give tidak mengubah recipient history.
|
||||
|
||||
## Command utama
|
||||
|
||||
@@ -208,63 +241,19 @@ Automatic delivery dijalankan setelah dimension change dengan delay agar kompati
|
||||
|
||||
Command `/ls` administratif memerlukan operator permission sesuai implementasi command.
|
||||
|
||||
## `/ls reload`
|
||||
## v1.9.0 — Config restructure
|
||||
|
||||
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.
|
||||
- Rules dan Register/Login memakai timeout independen: 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.
|
||||
- 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 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.
|
||||
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.
|
||||
|
||||
|
||||
## Catatan v1.8.3
|
||||
|
||||
- Memperbaiki compile error Minecraft 26.2 karena `ServerPlayer.displayClientMessage(Component, boolean)` sudah tidak tersedia pada mapping/API target ini.
|
||||
- Implementasi action-bar countdown yang diperkenalkan sementara pada v1.8.3 kemudian dihentikan pada v1.8.5 karena Dialog bersifat modal dan countdown HUD tidak memberi UX yang konsisten.
|
||||
- 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.
|
||||
- Tidak ada countdown visual pada HUD/action bar; timeout berjalan di server dan hanya muncul sebagai alasan disconnect jika waktunya habis.
|
||||
- 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`.
|
||||
|
||||
|
||||
## v1.8.5 — Auth timeout messages & premium login policy
|
||||
|
||||
- Menghapus countdown visual dari action bar. Dialog Rules/Register/Login tetap bersih tanpa HUD timer yang tertutup layer Dialog.
|
||||
- Two-stage timeout tetap dipertahankan secara server-side: Rules memakai `rules.json -> timeoutSeconds`, sedangkan Register/Login memakai `auth/config.json -> authenticationTimeoutSeconds`.
|
||||
- `rules.json` sekarang memiliki `timeoutMessage`. Placeholder `{seconds}` otomatis diganti dengan nilai `timeoutSeconds`.
|
||||
- `auth/config.json` sekarang memiliki `registrationTimeoutMessage`, `loginTimeoutMessage`, dan fallback `authenticationTimeoutMessage`; placeholder `{seconds}` memakai `authenticationTimeoutSeconds`.
|
||||
- `premiumAutoLogin=false` sekarang benar-benar mematikan auto-login Lobby Systems untuk premium player. Mojang authentication tetap berjalan, kemudian premium player diarahkan ke Register/Login Dialog dan membutuhkan password Lobby Systems.
|
||||
- `premiumAutoLogin=true` + `requireLoginEveryJoin=false` tetap merupakan mode premium auto-login. `requireLoginEveryJoin=true` tetap memaksa password Lobby Systems untuk premium player setiap join.
|
||||
- `/ls reload` memuat ulang policy dan pesan timeout Auth/Rules tanpa restart server.
|
||||
|
||||
Reference in New Issue
Block a user