2026-09-06 19:31:59 +07:00
2026-09-06 13:43:16 +07:00
2026-09-06 13:43:16 +07:00
2026-09-07 05:53:59 +07:00
2026-09-07 05:53:59 +07:00
2026-09-06 17:21:18 +07:00
2026-09-09 07:17:49 +07:00
2026-09-06 14:28:45 +07:00
2026-09-06 14:28:45 +07:00
2026-09-06 13:43:16 +07:00

Lobby Systems v1.6.1 — Fabric 26.2

Server-side lobby routing dan dimension policy untuk Minecraft 26.2/Fabric. v1.6.0 menambahkan Starter Kit per-dimension dengan active assignment dan recipient history, sambil mempertahankan initial Lobby placement pre-login, gamemode authoritative, gamerule per-dimension, portal, dan position persistence.

v1.5.6 login placement fix (dipertahankan): player data tetap dibaca untuk menyimpan posisi gameplay terakhir, tetapi sebelum PlayerList mengirim initial world state, Lobby Systems mengganti initial level, posisi, dan yaw/pitch ke konfigurasi Lobby. Gamemode disinkronkan segera setelah JOIN dan dikoreksi singkat pada +1, +5, dan +20 tick.

v1.5.7 behavior update: Lobby Systems sekarang selalu menjadi source of truth untuk gamemode per-dimension. Opsi manageDimensionGamemode dihapus; config lama akan dimigrasikan otomatis dengan membuang field tersebut. Command list, set, dan remove selalu tersedia. Compatibility warning Dimensional Inventories tetap aktif.

v1.6.0 Starter Kit: operator dapat menyimpan snapshot inventory/equipment sebagai kit, mengaktifkan satu kit per dimension, memuat kit untuk diedit, memberi kit secara manual, dan mengelola recipient history. Automatic starter kit diberikan satu kali per player per dimension setelah transisi inventory destination stabil. Mengganti active kit tidak memberi ulang kepada player yang sudah pernah menerima starter kit di dimension tersebut.

Reload feedback

/ls reload menulis banner RELOAD START dan RELOAD COMPLETE hanya ke console server. Ringkasan reload satu baris dikirim langsung hanya ke player admin/operator yang menjalankan command; ringkasan tersebut tidak dibroadcast ke player lain dan tidak dikirim melalui command feedback ke console.

Target build

  • Minecraft: 26.2
  • Fabric Loader: 0.19.3
  • Fabric API: 0.156.0+26.2
  • Fabric Loom: 1.17
  • Java: 25+
  • Mod ID: dartokloning
  • Java namespace: id.dartokloning.lobbysystems
  • WorldEdit: opsional untuk runtime portal, diperlukan saat membuat portal memakai //wand
  • Portal Visual System v1.5.0: memakai block state vanilla minecraft:nether_portal, sehingga tidak membutuhkan mod/resource pack di client

Compile di Windows

Double-click compile.bat atau jalankan:

.\compile.bat

Linux/macOS:

chmod +x compile.sh release.sh
./compile.sh

compile.bat dan compile.sh membaca mod_version dan minecraft_version langsung dari gradle.properties. Setelah BUILD SUCCESS, script akan menanyakan apakah source ingin di-commit dan di-push ke Git/Gitea. Header build akan menampilkan versi yang sedang di-compile, misalnya:

============================================
 Lobby Systems - Fabric 26.2 Build
 Version: 1.5.5
 Namespace: id.dartokloning.lobbysystems
 Mod ID: dartokloning
============================================

Output utama:

build/libs/lobby-systems-1.5.5.jar

*-sources.jar hanya source archive dan tidak perlu dipasang ke server.

Membuat Gitea Release

Gunakan release.bat di Windows atau ./release.sh di Linux/macOS. Release script akan:

  1. menjalankan build melalui mode --build-only;
  2. memastikan source sudah di-commit/push;
  3. membuat/push tag v<mod_version>;
  4. membuat Gitea Release melalui API;
  5. mengupload build/libs/lobby-systems-<version>.jar sebagai release asset.

Default repository release:

https://git.darto.id/dartokloning/lobby-systems

API release membutuhkan Gitea Personal Access Token. Jangan simpan token di repository. Anda dapat memasukkan token ketika script meminta, atau menyediakan environment variable GITEA_TOKEN.

Console state logging

State penting Lobby Systems memakai separator agar mudah terlihat di server console, antara lain startup, config load, player-position store ready, portal load, reload, player join/disconnect, portal create/delete, dan teleport. Contoh:

============================================
 Lobby Systems - READY
 Version: 1.5.5
 Minecraft: 26.2
 Config directory: config/lobby
 WorldEdit: available
============================================

Struktur konfigurasi v1.5.7

config/
└── lobby/
    ├── config.json
    ├── player-positions.json
    ├── portals.json
    ├── dimension-gamemodes.json
    ├── dimension-gamerules.json
    ├── starterkits.json
    └── starterkit-recipients.json

config/lobby/config.json

Contoh:

{
  "lobbyDimension": "minecraft:lobby",
  "lobbyX": -12.5,
  "lobbyY": 65.0,
  "lobbyZ": -3.5,
  "lobbyYaw": 0.0,
  "lobbyPitch": 0.0,
  "minimumPlaySeconds": 300,
  "portalCheckIntervalTicks": 5,
  "portalCooldownTicks": 60,
  "inLobbyMessage": "§eKamu sudah berada di lobby.",
  "returnedMessage": "§aKamu telah kembali ke lobby.",
  "waitMessage": "§cKamu belum bisa kembali ke lobby. Tunggu §e{time}§c lagi."
}

Lobby selalu memakai koordinat statis dari file ini. Lobby tidak disimpan sebagai last-position player.

config/lobby/player-positions.json

Berisi posisi terakhir masing-masing player pada dimension non-lobby. Data ini dipakai ketika player kembali melalui portal atau /ls tp.

Dimension yang sedang dikonfigurasi sebagai lobby disaring pada saat capture, read, dan save sehingga tidak disimpan di file ini.

config/lobby/portals.json

Portal dibuat lewat command dan tersimpan otomatis. Contoh:

{
  "portals": {
    "survival": {
      "sourceDimension": "minecraft:lobby",
      "min": {
        "x": 10,
        "y": 64,
        "z": -5
      },
      "max": {
        "x": 12,
        "y": 67,
        "z": -5
      },
      "targetDimension": "minecraft:overworld",
      "visualMode": "nether_portal",
      "visualAxis": "x"
    }
  }
}

Trigger portal tetap berupa region Lobby Systems. Mulai v1.5.0, portal baru yang dibuat lewat command menyimpan visualMode=nether_portal dan visualAxis=x|z. Frame/dekorasinya bebas, tetapi selection portal visual harus berupa bidang vertikal 1 block tebal dan hanya mencakup area dalam portal.

config/lobby/dimension-gamemodes.json

Minecraft menyimpan gamemode pada player, bukan pada dimension. Lobby Systems menyimpan mapping dimension → gamemode di file ini dan selalu menerapkannya pada join serta perpindahan dimension. Sejak v1.5.7, Lobby Systems adalah source of truth gamemode per-dimension dan tidak memiliki mode viewer-only.

Contoh:

{
  "minecraft:lobby": "adventure",
  "minecraft:worldcreative": "creative",
  "minecraft:overworld": "survival"
}

Gamemode yang didukung: survival, creative, adventure, dan spectator.

Jika mod Dimensional Inventories (dimensional-inventories) terpasang, Lobby Systems menampilkan warning di console karena kedua mod dapat memiliki aturan gamemode pada transisi dimension/pool. Lobby Systems tetap authoritative dan akan menerapkan dimension-gamemodes.json; untuk hasil paling konsisten, samakan konfigurasi gamemode pool Dimensional Inventories atau nonaktifkan pengelolaan gamemode pada mod tersebut bila tersedia.

Migrasi dari v1.1.x

Pada startup pertama v1.4.0:

config/lobby-systems.json

akan dimigrasikan ke:

config/lobby/config.json

Dan:

config/lobby-systems-positions.json

akan dimigrasikan ke:

config/lobby/player-positions.json

Nama file lama hanya digunakan oleh LegacyConfigMigrator untuk proses migrasi. Runtime v1.4.0 membaca dan menulis file baru di config/lobby/.

Jika file tujuan baru sudah ada, migrator tidak menimpanya.

Command player

/lobby
  • Jika sudah di lobby: memberi informasi bahwa player sudah berada di lobby.
  • Jika berada di gameplay dimension: hanya dapat digunakan setelah minimumPlaySeconds tercapai.
  • Jika terlalu cepat: menampilkan countdown.
  • Jika berhasil: selalu kembali ke fixed lobby spawn dari config.json.

Command admin / OP

/ls reload
/ls tp <dimension>

/ls gamerule <dimension>
/ls gamerule <dimension> --page <page>
/ls gamerule set <dimension> <rule> <value>
/ls gamerule reset <dimension> <rule>

/ls gamemode list
/ls gamemode set <dimension> <survival|creative|adventure|spectator>
/ls gamemode remove <dimension>

/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>

/ls portal create <name> <target_dimension>
/ls portal delete <name>
/ls portal list
/ls portal info <name>
/ls portal tp <name>

/ls tp tetap command maintenance/admin. Player biasa tidak memerlukannya karena flow normal menggunakan portal.

Gamerule per dimension

/ls gamerule <dimension> menampilkan gamerule aktual dari dimension yang sedang ter-load. Hasil ditampilkan 10 rule per halaman dan dipisahkan separator agar lebih mudah dibaca di chat.

Untuk perubahan yang harus persist setelah restart, gunakan /ls gamerule set .... Perintah vanilla /gamerule dapat mengubah nilai runtime yang terlihat pada dimension aktif, tetapi perubahan tersebut tidak ditulis ke dimension-gamerules.json, sehingga bukan source of truth Lobby Systems.

Catatan Minecraft 26.2: mayoritas gamerule gameplay server-side dapat diisolasi melalui ServerLevel#getGameRules(). Rule yang berhubungan dengan clock/weather seperti minecraft:advance_time dan minecraft:advance_weather memiliki mekanisme sinkronisasi tambahan di 26.x; uji keduanya secara khusus sebelum mengandalkannya untuk world yang membutuhkan waktu/cuaca benar-benar independen.

Gunakan command berikut untuk membuat override persistent:

/ls gamerule set minecraft:lobby minecraft:spawn_mobs false
/ls gamerule set minecraft:lobby minecraft:mob_griefing false
/ls gamerule set minecraft:lobby minecraft:keep_inventory true

Untuk menghapus override dan mengembalikan rule ke default Minecraft:

/ls gamerule reset minecraft:lobby minecraft:spawn_mobs

Contoh:

/ls gamerule minecraft:lobby
/ls gamerule minecraft:lobby --page 2

Header chat menampilkan halaman/total halaman, nama dimension, dan jumlah gamerule. Jika masih ada halaman berikutnya, command untuk membuka halaman selanjutnya ikut ditampilkan.

Gamemode per dimension

Gunakan mapping gamemode agar player otomatis mendapat gamemode yang sesuai saat memasuki dimension. Contoh:

/ls gamemode set minecraft:lobby adventure
/ls gamemode set minecraft:worldcreative creative
/ls gamemode set minecraft:overworld survival

Command gamemode selalu tersedia: /ls gamemode list, /ls gamemode set <dimension> <mode>, dan /ls gamemode remove <dimension>. Mapping disimpan di config/lobby/dimension-gamemodes.json, diterapkan langsung ke player pada dimension terkait, dan ikut direload oleh /ls reload.

Starter Kit per-dimension

Starter kit dibuat dari snapshot inventory operator dengan /ls starterkit set <name> <dimension>. Kit baru selalu INACTIVE sampai /ls starterkit activate <name> dijalankan. Satu dimension hanya dapat memiliki satu active starter kit; mengaktifkan kit lain otomatis mengganti pointer active tanpa menghapus definisi kit lama.

Automatic delivery hanya terjadi satu kali per player + dimension. Recipient history disimpan di config/lobby/starterkit-recipients.json, sedangkan definisi kit dan activeByDimension disimpan di config/lobby/starterkits.json. Mengganti active kit tidak membuat player lama menerima kit baru. /ls starterkit give adalah forced administrative delivery dan tidak mengubah recipient history. /ls starterkit reset <dimension> <player> membuat player eligible lagi pada entry berikutnya.

Snapshot menyimpan slot inventory player termasuk hotbar, main inventory, armor/equipment, dan offhand menggunakan codec ItemStack vanilla agar components/data item modded ikut tersimpan. Automatic delivery ditunda singkat setelah dimension entry untuk memberi kesempatan mod inventory per-dimension seperti Dimensional Inventories menyelesaikan pergantian inventory destination. Jika slot snapshot sudah terisi, Lobby Systems mencoba inventory kosong lain dan menjatuhkan sisa stack dengan aman bila inventory penuh; item existing player tidak dihapus.

/ls reload

Reload live:

  • config/lobby/config.json
  • config/lobby/portals.json
  • config/lobby/dimension-gamemodes.json
  • config/lobby/starterkits.json
  • config/lobby/starterkit-recipients.json
  • config/lobby/dimension-gamerules.json
  • lobby exclusion pada player-position store

Tidak perlu restart untuk perubahan JSON tersebut.

Membuat portal dengan WorldEdit + visual portal

Mulai v1.5.0, /ls portal create dapat membuat visual swirl vanilla Nether Portal secara otomatis tanpa Flint and Steel dan tanpa mewajibkan mod Lobby Systems pada client. Lobby Systems memakai resource/block vanilla minecraft:nether_portal; tidak ada asset Custom Portals yang disalin.

Frame portal boleh dibuat dari block apa saja. Yang penting, WorldEdit selection harus memilih area dalam/permukaan aktif portal saja, bukan frame. Selection harus berupa bidang vertikal setebal tepat 1 block pada salah satu axis horizontal. Contoh valid:

1 x 5 x 3   (portal membentang pada axis Z)
3 x 5 x 1   (portal membentang pada axis X)

Contoh tidak valid untuk visual vanilla:

3 x 5 x 3   (volume terlalu tebal)
5 x 1 x 5   (portal horizontal tidak didukung oleh nether_portal vanilla)

Workflow:

  1. Bangun frame/dekorasi portal dari block apa saja.
  2. Masuk ke dimension tempat portal berada, biasanya Lobby.
  3. Jalankan //wand.
  4. Select dua sudut bagian dalam portal. Jangan sertakan frame.
  5. Buat portal:
/ls portal create survival minecraft:overworld

Lobby Systems otomatis mendeteksi orientasi selection:

  • selection dengan X tetap dan Z melebar -> nether_portal[axis=z]
  • selection dengan Z tetap dan X melebar -> nether_portal[axis=x]

Ini memperbaiki kasus ketika /fill ... minecraft:nether_portal memakai default axis yang salah sehingga tekstur portal terlihat menyamping. Portal visual juga dipulihkan secara berkala jika block portal vanilla menghilang akibat shape update pada frame non-obsidian. Teleport tetap ditentukan oleh portals.json/Lobby Systems, bukan oleh destination Nether Portal vanilla. Saat player berada di managed visual region, Lobby Systems menjaga vanilla portal cooldown tetap aktif agar mekanisme Nether Portal vanilla tidak mengambil alih destination, termasuk untuk player Creative.

Untuk keamanan, saat membuat portal baru Lobby Systems hanya akan mengganti air, fire, soul fire, atau nether portal di dalam selection. Jika selection mengenai block frame/dekorasi, pembuatan dibatalkan agar build tidak tertimpa.

Portal lama dari sebelum v1.5.0 tetap berfungsi sebagai trigger tetapi tidak otomatis diberi visual, karena selection lama mungkin mencakup frame. Hapus dan buat ulang portal tersebut dengan selection interior jika ingin visual baru.

Contoh lain:

/ls portal create nether minecraft:the_nether
/ls portal create dungeon mypack:dungeon

Nama portal hanya menerima huruf kecil a-z, angka 0-9, _, dan -.

WorldEdit hanya dibutuhkan saat membaca selection untuk membuat portal. Setelah portals.json tersimpan, portal runtime dan visual recovery dikelola Lobby Systems sendiri. Jika WorldEdit dilepas kemudian, portal yang sudah ada tetap dapat bekerja.

Menghapus dan mengecek portal

/ls portal list
/ls portal info survival
/ls portal delete survival

Nama portal memiliki autocomplete.

Teleport admin ke region portal

/ls portal tp survival

Command ini digunakan untuk maintenance. Lobby Systems memberi suppression sementara agar admin tidak langsung mengaktifkan portal tepat setelah teleport ke region tersebut.

Perilaku destination

Jika target adalah gameplay dimension:

  • player pernah mengunjungi dimension tersebut → teleport ke last position;
  • belum pernah → fallback ke spawn dimension.

Jika target adalah Lobby:

  • selalu teleport ke lobbyX/Y/Z/Yaw/Pitch;
  • tidak pernah menggunakan last-position;
  • jika portal berasal dari gameplay dimension, minimum playtime tetap diberlakukan.

Portal detection dan performa

portals.json tidak dibaca setiap tick. Portal dimuat ke RAM saat startup atau /ls reload dan di-index berdasarkan source dimension.

Default pemeriksaan region:

"portalCheckIntervalTicks": 5

Artinya sekitar empat kali per detik. Region check hanya berupa perbandingan koordinat player dengan portal pada dimension yang sama.

Setelah portal aktif, portalCooldownTicks mencegah portal terpicu berulang saat client menyelesaikan dimension transition. Teleport lintas dimension tetap memakai TeleportTransition dan teleport lock dari v1.1.3.

Flow server

PLAYER DATA LOADED
  ↓
Lobby Systems pre-login placement
  ↓
Initial world sent to client = Lobby
  ↓
Lobby fixed spawn + configured gamemode
  ↓
Player berjalan ke portal
  ↓
Portal region terdeteksi
  ↓
Gameplay dimension
  ↓
Last position jika tersedia / spawn jika pertama kali
  ↓
Minimum gameplay time
  ↓
/lobby
  ↓
Lobby fixed spawn

Catatan pengujian

Karena project ini menargetkan Java 25, compile final sebaiknya dilakukan menggunakan compile.bat atau compile.sh pada mesin dengan JDK 25. Saat menguji portal, perhatikan console untuk log teleport dan error WorldEdit selection jika selection belum lengkap.

License

Lobby Systems is proprietary software — All Rights Reserved. Public access to this repository is for viewing, auditing, and reference only. Using, running, compiling, modifying, redistributing, or re-uploading the mod requires prior written permission from DartoKloning. See LICENSE for the complete terms.

v1.6.1

  • Fixed a newly-created Lobby Systems visual portal being able to use vanilla Nether routing on its first entry.
  • Managed minecraft:nether_portal surfaces are now explicitly intercepted so Lobby Systems exclusively owns their destination.
  • Reduced the creator-side post-create trigger suppression from the old 100-tick window to the configured portal check interval.
  • Added the Lobby Systems mod icon to Fabric metadata.
S
Description
No description provided
Readme
442 KiB
2026-10-04 00:05:09 +07:00
Languages
Java 85.5%
Batchfile 7.5%
Shell 7%