Cara Membangun Minigames Kustom dalam Hytale: Panduan Pengembang Server

Dengan: nama Kategori:: nama : minutes min read

Ingin membangun Bed Wars atau Hunger Games berikutnya di Hytale? Panduan ini mencakup aliran kerja penuh - dari mesin game negara dan manajemen arena untuk ECS berbasis pemain pelacakan, perjodohan, dan penyebaran. Termasuk contoh nyata dari mode CurseForge minigame yang ada.

< p > Hytale 's server-side arsitektur membuatnya unik cocok untuk minigames custom. Tidak seperti Minecraft di mana plugin mode game melawan kotak pasir vanili, plugin Hytale API dan ECS memberikan kontrol langsung atas perilaku entitas, negara dunia, dan aliran permainan. Jika Anda telah membangun minigames Bukkit, konsep diterjemahkan - tetapi implementasi lebih bersih. < / p > < p > Panduan ini mencakup sistem inti setiap kebutuhan minigame: manajemen negara permainan, pelanggaran arena, pelacakan pemain, skor, pertandingan, dan penyebaran. < / p > < h2 > Arsitektur: Bagaimana Plugin Minigame bekerja dalam Hytale < / h2 > < p > Sebelum menyelam ke kode, memahami arsitektur tingkat tinggi dari minigame Hytale: < / p > < tabel > < head > < tr > < th > Lapis < / th > < th > Tujuan < / th > < th > Implementasi < / th > < / tr > < / tr > < / thead > < tbody > < tr > < td > < strong > Manajer Permainan < / strong > < / td > < td > Orchestrats semuanya - membuat arena, mengelola lobbies, pemain route < / td > < td > layanan singleton di plugin < / td > < / tr > < tr > < td > < strong > Arena Instance < / strong > < / td > < td > Satu sesi permainan dengan keadaan sendiri, pemain, dan wilayah dunia < / td > < td > Kelas mengelola sebuah dunia atau daerah < / td > < / tr > < tr > < td > < strong > Game State Machine < / strong > < / td > < / td > Mengendalikan aliran fase - menunggu, hitung mundur, berakhir < / td > < td > < td > + timer logika per arena < / td > < / tr > < tr > < td > < strong > Pemutar Data < / strong > < / td > < td > Jejak keadaan per- pemain - tim, hidup / mati, statistik < / td > < td > ECS Komponen yang melekat pada entitas pemain < / td > < / tr > < tr > < td > < strong > Penangan Acara < / strong > < / td > < td > Balas ke aksi pemain - membunuh, blok istirahat, entri daerah < / td > < td > EventBus + ECS event system < / td > < / tr > < / tbody > < / tabel > < h2 > Langkah 1: Game State Machine < / h2 > < p > Setiap minigame membutuhkan sebuah mesin negara. Ini adalah tulang punggung yang mengontrol apa yang terjadi dan kapan. < / p > < pre > < kode > publik enum GameState { Menunggu, / / Lobby, menunggu pemain STARTING, / / Countdown sebelum game dimulai BERMAIN, / / Gameplay aktif DEATHMATCH, / / Opsional: tahap akhir showdown ENDING... Permainan berakhir, menunjukkan hasil } < / code > < / pre > < p > Setiap instansi arena memegang sendiri < kode > GameState < / code >. Transisi terjadi berdasarkan kondisi: < / p > < ul > < li > < kuat > MENANGKAT MENGGERAM: < / strong > Jumlah pemain minimum dicapai < / li > < li > < strong > STARTING DIMAINKAN: < / strong > Penundaan hitung mundur berakhir < / li > < li > < strong > BERMAIN DEATMATCH: < / strong > Batas waktu atau batas pemain < / li > < li > < strong > BERMAIN / DEATMATCH MENGENDING: < / strong > Kondisi menang bertemu (pemain terakhir hidup, skor tercapai, dll) < / li > < li > < strong > ENDING AGUNG: < / strong > Hasil ditampilkan, arena direset < / li > < / ul > < pre > < kode > ranah kelas publik { negara GameState swasta = GameState. Menunggu; daftar akhir pribadi & lt; PlayerRef & gt; player = new ArrayList & lt; & gt; (); private int countdown = 10; publik void tick () { switch (state) { case Waiting - > { if (players.size () > = MIN _ BERMAIN) { state = GameState. MULAI; hitung mundur = 10; ] ] case STARTING - > { countdown -; broadcastCountdown (countdown); if (countdown < = 0) { state = GameState. Bermain; startGame (); ] ] case PLAYING - > { CheckWindition (); ] case ENDING - > {{ displalayResult (); resetArena (); state = GameState. Menunggu; ] ] ] } < / code > < / pre > < h2 > Langkah 2: Pemutar Data dengan Komponen ECS < / h2 > < p > Gunakan Entitas Hitale Componen System untuk melampirkan game- spesifik data ke entities pemain. Ini lebih bersih daripada mempertahankan eksternal < code > HashMap & lt; UUID, PlayerData & gt; < / code > memetakan - data hidup pada entitas itu sendiri. < / p > < pre > < kode > Minigame kelas publik Aplikasi pemutar Komponen & lt; EntityStore & gt; { arena String publik Id = ""; tim public String = "; int publik membunuh = 0; kematian int publik = 0; skor int publik = 0; boolean publik hidup = benar; public long last Kematian = 0; @ Override clone MinigamePlayer () { Minigame Salinan pemutar = MinigamePlayer baru (); copy.arena Id = ini.arenaId; Ganti. tim = this.team; copy.kills = this.kills; copy.death = this.death; copy.score = this.score; copy.alive = this.alive; copy.lastDeath = this.last Kematian; salinan kembali; ] } < / code > < / pre > < p > Lampirkan komponen ini ketika seorang pemain bergabung dengan arena, membacanya selama gameplay untuk mencetak dan tim logika, dan menghapusnya ketika mereka pergi. < / p > < h2 > Langkah 3: Event Handling untuk Game Logic < / h2 > < p > Minigames perlu bereaksi terhadap aksi pemutar. Gunakan sistem event yang sesuai untuk setiap tipe: < / p > < h3 > Event Peristiwa Bus (Global) < / h3 > < pre > < kode > / / Pemain bergabung dengan server - menunjukkan kepada mereka lobi getEventRegistry () .registerGlobal ( Player Ready Event.class, event - > teleportToLobby (event.getPlayer () ); / / Pemutar terputus - lepas dari arena getEventRegistry () .registerGlobal ( PlayerDisconnectEvent.class, event - > handlePlayerLeft (event.getPlayer () ); / / Perintah percakapan - / bergabung, / pergi, / spektakuler getEventRegistry () .registerAsyncGlobal ( PlayerChatevent.class, masa depan - > future.twitch (event - > { String msg = event.getMessage (); jika (msg.startsWith ("/ join") { event.setCancelled (true); handle JoinCommand (event.getSender ()); ] ) ); < / code > < / pre > < h3 > ECS Peristiwa (Entity-Specific) < / h3 > < p > Untuk istirahat blok, kerusakan, dan aksi level hak lainnya, membuat < kode > EntityEventSystem < / code > subclasss: < / p > < pre > < kode > / / Trek membunuh untuk mencetak KillTracker kelas publik meluas RefChangeSystem & lt; EntityStore, DeathComponen & gt; { @ Override publik void oncomponen Ditambahkan (Toko EntityStore, Ref entitas, Kematian DeathComponen) { / / Entitas meninggal - menemukan pembunuh, skor update Ref killer = death.getKiller (); jika (pembunuh! = kosong) { Minigame Pemutar killerData = getComponen ( Pembunuh, MinigamePlayer.class); if (killerData! = null) { pembunuh Dat.kills + +; pembunuh Data.score + = KILL _ POINTS; ] ] ] } < / code > < / pre > < p > < strong > Ingat: < / strong > ECS acara harus dibatalkan dalam filter < strong > < / strong > fase, bukan fase pemeriksaan. Jika Anda ingin mencegah pemblokiran selama fase lobi, saringan harus memeriksa keadaan permainan dan membatalkan sebelum eksekusi aksi. < / p > < h2 > Langkah 4: Manajemen Arena < / h2 > < p > Untuk game yang memerlukan ruang bermain terisolasi (Hunger Games, Bed Wars), anda memerlukan arena instance: < / p > < h3 > Multi- Pola Arena < / h3 > < pre > < kode > ranen Manager kelas publik { peta akhir pribadi & lt; String, Arena & gt; arena = HashMap baru & lt; & gt; (); public Arena createArena (String id, Location center) { Arena Arena = Arena baru (id, center); arenas.put (id, arena); kembali arena; ] publik Arena findavalearena () { return arenas.values () .stream () .filter (a - > a.getState () = = GameState. Tunggu) .filter (a - > a.getPlayerCount () < a.getMaxPlayers () .findFirst () .orelse (kosong); ] {\ cHffffff} Semua orang tidak tahu. arenas.values () .forEach (Arena::: tick); ] } < / code > < / pre > < h3 > Arena Reset < / h3 > < p > Setelah setiap pertandingan, arena perlu kembali ke keadaan semula. Dua pendekatan: < / p > < ul > < li > < strong > Snapshot restore: < / strong > Simpan data blok wilayah arena sebelum permainan dimulai, kembalikan setelahnya. Menggunakan lebih banyak memori tetapi dapat diandalkan. < / li > < li > < strong > Prefab reload: < / strong > Gunakan bangunan Hytale dalam Sistem Prefab untuk menyimpan arena sebagai struktur prefab dan kembalikan setelah setiap pertandingan. Lebih bersih dan terintegrasi dengan peralatan asli Hytale. < / li > < / ul > < h2 > Langkah 5: Tim dan Skor < / h2 > < h3 > Penugasan Tim < / h3 > < pre > < kode > penempatan void publik Tim (Arena arena) { Daftar & lt; PlayerRef & gt; player = arena.getPlayers (); Koleksi. Shuffle (pemain); String [] tim = {"Red", "Blue", "Green", "Kuning"}; untuk (int i = 0; i < players.size (); i + +) { Minigame Data pemutar = getComponen ( players.get (i), MinigamePlayer.class); tim = tim [i% teams.length]; ] } < / code > < / pre > < h3 > Scoreboard Tampilan < / h3 > < p > Gunakan Hytale 's < kode > Pesan < / code > kelas untuk format tampilan skor. Sistem Pesan mendukung format warna, gaya tebal / miring, dan pergantian parameter: < / p > < pre > < kode > siaran void publik Skor (Arena arena) { StringBuilder sb = new StringBuilder ("406 = = = Papan skor = = =\ n"); arena.getPlayers () .stream () .diurutkan (a, b) - > getscore (b) - getscore (a) .forEach (p - > { Minigame Data pemutar = getComponen ( p, MinigamePlayer.class); sb.append (String.format (".f% s: 'e% d membunuh' lest 124; 'a% d quots', ppgetUsername (), data.kills, data.score)); }; arena.broadcast (sb.toString ()); } < / code > < / pre > < h2 > Langkah 6: Win Kondisi < / h2 > < p > Common minigame menang kondisi dan bagaimana mengimplementasikan mereka: < / p > < tabel > < head > < tr > < th > Permainan Tipe < / th > < th > Win Kondisi < / th > < th > Periksa Dalam < / th > < / tr > < / thead > < tbody > < tr > < td > Last Man Berdiri < / td > < td > 1 pemain / tim hidup < / td > < td > Penangan Kematian - hitung pemain hidup < / td > < / tr > < tr > < td > Skor Target < / td > < td > Pertama ke X poin < / td > < td > < td > Nilai pemutakhiran - periksa threshold < / td > < / tr > < tr > < td > Batas Waktu < / td > < td > Skor tertinggi ketika waktu berakhir < / td > < td > Game tick - periksa timer < / td > < / tr > < tr > < td > Objective < / td > < td > Tugas spesifik komplit (bendera tangkap, hancurkan tempat tidur) < / td > < td > ECS acara khusus untuk interaksi objektif < / td > < / tr > < / tr > < tr > < td > Rounds < / td > < td > Terbaik dari N putaran < / td > < td > Akhir putaran penangan - cek skor seri < / td > < / tr > < / tbody > < / tabel > < h2 > Langkah 7: Matchmaking dan Antrian < / h2 > < p > Untuk server yang menjalankan beberapa game concurt, mengimplementasikan sebuah sistem antrian: < / p > < pre > < kode > Matchmaking kelas publik Antrian private final Antrian & lt; PlayerRef & gt; queue = new LinkedList & lt; & gt; (); tugas akhir privat dibutuhkan Pemain; public void addPlayer (PlayerRef player) { queeu.add (player); checkQuee (); ] private void checkQuee () { jika (queecesize () > = requredPlayers) { Arena Arena = arenan Manager.findaleArena (); jika (arena!) { untuk (int i = 0; i < dibutuhkan Pemutar; i + +) { PlayerRef player = queeu.poll (); arena.addPlayer (player); ] ] ] ] } < / code > < / pre > < p > Hytale 's built -in < strong > Party System < / strong > memungkinkan pemain berkumpul dan tetap bersama-sama di transfer server. Perjodohan Anda harus menghormati kelompok partai - anggota partai antrian bersama-sama dan menempatkan mereka di tim yang sama ketika mungkin. < / p > < h2 > Mode Minigame yang Exsting untuk Studi < / h2 > < p > Jangan bangun dari awal - pelajari apa yang telah ada di CurseForge: < / p > < tabel > < head > < tr > < th > Mod < / th > < th > Tipe < / th > < th > Fitur Kunci untuk Pelajari < / th > < / tr > < / thead > < tbody > < tr > < td > < strong > Hunger Games < / strong > < / td > < td > Last Man > < td > < td > Multi-arena manajemen, sistem lobi, fase PvP, auto- reset < / td > < / tr > < tr > < td > < strong > BossArena < / strong > < / td > < td > PvE Arena < / td > < td > NPC toko-toko kontrak, pemain menjarah dada, bos yang dapat diatur < / td > < / tr > < tr > < td > < kuat > Wave Combat Arena < / strong > < / td > < / td > < / td > < td > Wave > spawning, susah berkembang, sistem hadiah < / td > < / tr > < / tr > < tr > < td > < strong > Skyblock < / strong > < / td > < td > Island Survival < / td > < td > Per-player instance dunia, progresi pelacakan, boss pertemuan < / td > < / tr > < / tr > < / tbody > < / tabel > < p > Mode Hunger Games sangat layak dipelajari - hal ini menunjukkan garis hidup penuh dari sebuah minigame kompetitif: lobi hitung mundur dan PvP menghasilkan deadmatch. < / p > < h2 > Built-in Platform Features untuk Minigame Server < / h2 > < p > Hytale menyediakan beberapa fitur dari kotak yang diperlukan server Minecraft untuk: < / p > < ul > < li > < strong > Discovery Katalog: < / strong > Dibangun ke dalam menu utama - pemain dapat menemukan server minigame Anda tanpa situs daftar eksternal < / li > < li > < kuat > Sistem Partai: < / strong > Teman asli pengelompokan yang berlanjut melewati transfer server < / li > < li > < kuat > Gateway Pembayaran: < / strong > Dibangun ke klien untuk server yang ingin menghasilkan kosmetik atau fasilitas < / li > < li > < kuat > Framework: < / strong > Tingkat pengguna, berbasis grup, dan ijin wildcard yang cocok < / li > < / ul > < h2 > Menyebarkan Checklist < / h2 > < ol > < li > < strong > Bangun JAR Anda: < / strong > < kode >. / gradlew build < / code > < / li > < li > < strong > Uji lokal: < / strong > Jatuhkan ke < kode >% AppData% / Roaming / Hytale / UserData / Mods / < / code > < / li > < li > < strong > Uji dengan beberapa klien: < / strong > Update 4 memungkinkan multiple Instances Hytale pada satu PC - tes multiplayer skenario lokal < / li > < li > < kuat > Menyebarkan ke server: < / strong > Upload JAR ke < kode > / opt / hytale / Server / mods / < / code > < / li > < li > < strong > Publish pada CurseForge: < / strong > Paket sebagai Plugin dengan < kode > manifest json < / code > < / li > < li > < kuat > Daftar server Anda: < / strong > Tambahkan ke tag < a href = "/" > HytaleCharts < / a > dengan tag "Minigames" sehingga pemain dapat menemukan Anda < / li > < / ol > < p > Untuk konsep plugin pendiri API yang dibuat panduan ini, baca < a href = "/ news / hytale-modding -api- server -plugin- development -guide" > Modding API Guide < / a >. And for no-code content creation that complements your plugines, check out our < a href = "/ news / hytale -photting -guide -no- modding" > Panduan Skrip Visual < / a >. < / p > < p > < em > Membangun server minigame? Berbagi pada Discord kami - kami fitur kreasi komunitas secara teratur. < / em > < / p >