Hogyan építsünk egyéni Minigames Hytale: Szerver fejlesztő útmutató

Név Kategória: név : perc min read

Szeretné építeni a következő Bed Wars vagy éhező játékok Hytale? Ez az útmutató lefedi a teljes munkafolyamatot - a játék állam gépek és aréna menedzsment ECS-alapú játékos nyomkövetés, párkeresés, és telepítés. Magában foglalja a meglévő CurseForge minigame modok valódi példáit.

< p > A Hytale server- side architektúrája egyedivé teszi az egyedi minigamek számára. Ellentétben a Minecraft, ahol a játék mód plugins harcol a vanília homokozóval, Hytale plugin API és ECS közvetlen irányítást biztosít az entitás viselkedés, világállapot, és a játék áramlását. Ha már épített Bukkit minigames, a fogalmak lefordítani - de a végrehajtás tisztább. < / p > < p > Ez az útmutató lefedi a magrendszereket minden minigame igényt: játék állam menedzsment, aréna esetek, játékos nyomon követése, pontozás, matchmaking, és telepítés. < / p > < h2 > Építészet: Hogyan működik a Minigame Plugins Hytale < / h2 > < p > A kódba merülés előtt ismerje meg a Hytale minigame magas szintű architektúráját: < / p > < táblázat > < fej > < tr > < th > layer < / th > < th > Cél < / th > < th > végrehajtás < / th > < / fej > < tbody > < tr > < td > < strong > Game Manager < / strong > < / td > < td > constrates Minden - létrehoz arenas, kezeli lobbik, útvonalak játékosok < / td > < td > Singleton szolgáltatás a plugin < / td > < / tr > < tr > < td > < strong > Arena Project < / strong > < / td > < td > Egy futó játék ülés saját állammal, játékosokkal és világrégióval < / td > < td > Osztálykezelés < / td > < / tr > < tr > < td > < strong > Game State Machine < / strong > < / td > < td > Ellenőrzi a fázisáramlást - várakozás, visszaszámlálás, játék, vége < / td > < td > Enum + timer logic per arena < / td > < / tr > < tr > < td > < strong > Player Data < / strong > < / td > < td > Tracks perplayer state - score, team, alive / dead, stats < / td > < td > ECS < / td > < / tr > < tr > < td > < strong > Eseménykezelők < / erős > < / td > < td > React to player actions - kilts, block breaks, zone entry < / td > < td > Econabus + ECS event systems < / td > < / tr > < / test > < / táblázat > < h2 > 1. lépés: Game State Machine < p > Minden minigame kell egy állami gép. Ez a gerinc, amely szabályozza, hogy mi történik és mikor. < / p > < pre > < kód > nyilvános enum GameState { Várakozás, / / Lobby, játékosokra vár STARTING, / / Visszaszámlálás a játék kezdete előtt Játszani, / / Aktív játék HALÁSZAT, / / Választható: végső leszámolás VÉGZÉS / / Vége a játéknak, eredmények mutatása } < / kód > < / pre> < p > Minden aréna példány rendelkezik saját < kód > GameState < / kód >. Átmeneti állapotok: < / p > < ul > < li > < erős > Várakozás → ÁLLÁS: < / erős > A játékos minimális létszáma < / li > < li > < erős > STARTING → A visszaszámlálás időpontja < / li > < li > < erős > PLAYING → HALÁSZAT: < / erős > Határidő vagy küszöbérték < / li > < li > < erős > PLAYING / DEATHMATCH → VÉGZÉS: < / erős > Nyerés feltétel teljesítve (utolsó játékos élő, pontszám elérte, stb.) < / li > < li > < erős > VÉGZÉS → Várakozás: < / erős > Megjelenített eredmények, aréna reset < / li > < / ul > < pre > < kód > nyilvános osztály Arena { magán GameState állam = GameState. Várakozás; privát végleges lista & lt; PlayerHif & gt; játékosok = új ArrayList & lt; & gt; (); magán int visszaszámlálás = 10; nyilvános üres kullancs () { kapcsoló (állapot) { ÜZEMELTETÉS - > { ha (lejátszó.méret () > = MIN _ PLAYERS) { state = GameState. Kezdődik. visszaszámlálás = 10; } } Eset indítása - > { Visszaszámlálás... BroadcastCountdown (visszaszámlálás); Ha (visszaszámlálás < = 0) { state = GameState. Játszani; startGame (); } } Case Playing - > { check WinCondition (); } az ügy végeredménye - > { displayEredmények (); resetArena (); state = GameState. Várakozás; } } } } < / kód > < / pre> < h2 > 2. lépés: A játékos adatai ECS komponensekkel < / h2 > < p > A Hytale 's Entity Component System használata játék-specifikus adatok csatolásához a játékos jogalanyokhoz. Ez tisztább, mint a külső < kód > HashMap & lt; UUID, PlayerData & gt; < / kód > térképek - az adatok önmagukban az entitáson élnek. < / p > < pre > < kód > nyilvános osztály Minigame A játékos implementációja Component & lt; EnvirontyStore & gt; { Public String arena ID = ""; Public String team = ""; nyilvános int kills = 0; közhalálozás = 0; nyilvános int score = 0; nyilvános logikai élő = igaz; nyilvános hosszú utolsó Halál = 0; @ Override public MinigamePlayer klón () { Minigame Játékos másolat = új MinigamePlayer (); copy.arena Id = ez. arenaID; Vettem. csapat = ez. csapat; másoló.kills = ez. kills; Másol.halálesetek = ez. halálesetek; copy.score = this.score; Másol.élő = ez. élő; copy.last Death = ez .last Halál; visszaküldési másolat; } } < / kód > < / pre> < p > Csatolja ezt az alkatrészt, ha egy játékos csatlakozik egy arénához, olvassa el a játék során a pontozás és a csapat logikája, és távolítsa el, amikor elmennek. < / p > < h2 > 3. lépés: Eseménykezelés játék logika < / h2 > < p > Minigames kell reagálni a játékos akciók. Minden típusra használja a megfelelő eseményrendszert: < / p > < h3 > esemény Buszesemények (globális) < / h3 > < előre > < kód > / / A játékos csatlakozik a szerverhez - mutasd meg a lobby-t getregular () .registerGlobal ( PlayerReady.class, esemény - > teleportToLobby (event.getPlayer ()) ); / / A játékos eltávolítja az arénából getregular () .registerGlobal ( PlayerDisconnectreg.class, esemény - > handlePlayerLeave (event.getPlayer ()) ); / / Chat parancsok - / csatlakozzon, / hagyja, / néző getregular () .registerAsyncGlobal ( PlayerChatre.class, jövő - > jövőben.thenAccept (esemény - > { String msg = event.getMessage (); Ha (msg.startsWith ("/ csatlakozni")) { Esemény.setCancelled (true); handleJoinCommand (event.getSender ()); } ) ); < / kód > < / pre> < h3 > ECS Események (teljes specifikus) < / h3 > < p > Blokkolási törések, sérülések és egyéb intentil szintű tevékenységek esetén hozzon létre < kódot > Ecottyerystem < / code > alosztályokat: < / p > < előre > < kód > / / Pálya öl pontozás nyilvános osztály KillTracker kiterjesztések RefChangeSystem & lt; EnvirontyStore, DeathComponent & gt; { @ Override Nyilvános űrlap a komponensen Hozzáadott (EnvirontyStore, Hiv. Halálos komponens halál) { / / Original meghalt - megtalálja a gyilkos, frissítési pontszámok Hiv killer = death.getKiller (); Ha (gyilkos! = null) { Minigame Játékos gyilkos Data = getComponent ( gyilkos, MinigamePlayer.class); Ha (gyilkos Data! = null) { gyilkos Data.kill + +; gyilkos Data.score + = Kill _ points; } } } } < / kód > < / pre> < p > < erős > Ne feledje: < / erős > Az ECS-eseményeket a < erős > szűrő < / erős > fázisban kell törölni, nem az ellenőrző fázisban. Ha meg szeretné akadályozni a blokktörést a lobby fázisban, a szűrőnek ellenőriznie kell a játék állapotát, és az akció végrehajtása előtt törölnie kell. < / p > < h2 > 4. lépés: Arena Management < / h2 > < p > A játékok, amelyek szüksége van elszigetelt játszóterek (Éhezők játékok, Bed Wars), szükség van aréna esetek: < / p > < h3 > Multi- Arena Minta < / h3 > < pre> < kód > nyilvános osztály ArenaManager { privát végleges térkép & lt; String, Arena & gt; arenas = új hashMap & lt; & gt; (); public arena createArena (String id, Elhelyezkedés) { Arena arena = new Arena (id, centre); arenas.put (ID, arena); visszatérési aréna; } public arena findAvailabarena () { return arenas.values () .stream () Szűrő (a - > a getState () = = GameState. Várakozás) Szűrő (a - > a.getPlayerCount () < a.getMaxPlayers ()) .find First () .orElse (null); } public value nickAll () { arenas.values () .forEach (Arena:: tick); } } < / kód > < / pre> < h3 > Arena Reset < / h3 > < p > Minden játék után az arénának vissza kell térnie eredeti állapotába. Két megközelítés: < / p > < ul > < li > < erŠs > Pillanatkép visszaállítás: < / erős > Mentse az aréna régió blokk adatait, mielőtt a játék kezdődik, majd vissza. Több memóriát használ, de megbízható. < / li > < li > < erős > Prefab újratöltés: < / erős > Használja a Hytale építményét a Prefab System-ben, hogy az arénát előfaként tárolja, és minden játék után helyezze vissza. Tisztább és integrálódik Hytale anyanyelvi eszközeivel. < / li > < / ul > < h2 > 5. lépés: Csapatok és pontozás < / h2 > < h3 > Csapat kijelölése < / h3 > < pre > < kód > nyilvános üres rendelés Csapatok (Arena arena) { List & lt; PlayerHif & gt; players = arena.getPlayers (); Gyűjtemények.shuffle (játékosok); String [] teams = {"Red", "Blue", "Green", "Yellow"}; (int i = 0; i < játékosok méretei (); i + +) { Minigame A játékosok adatai = getComponent ( players.get (i), MinigamePlayer.class); data.team = team [i% teams.length]; } } < / kód > < / pre> < h3 > Az eredménytábla megjelenítése < / h3 > < p > A Hytale < kódja > Üzenet < / kód > osztály formázott pontszámok megjelenítéséhez. Az üzenetrendszer támogatja a színformázást, a félkövér / dőlt stílust és a paraméter helyettesítését: < / p > < pre > < kód > nyilvános üres adás Pontok (Arena arena) {Shortcut] StringBuilder sb = új StringBuilder ("6. § = = = = Eredménytábla = = =\ n"); arena.getPlayers () .stream () .válogatott ((a, b) - > getScore (b) - getScore (a))) .foreach (p - > { Minigame A játékosok adatai = getComponent ( p, MinigamePlayer.class); sb.apfend (String.format ("§ f% s: § e% d kills § 7 their 124; § a% d pts\ n", p.getUsername (), data.kills, data.score)); ); arena.broadcast (sb.toString ()); } < / kód > < / pre> < h2 > 6. lépés: Nyerési feltételek < / h2 > < p > Közös minigame nyerési feltételek és végrehajtásuk módja: < / p > < táblázat > < fej > < tr > < th > Játék típusa < / th > < th > Win állapot < / th > < th > Check In < / th > < / tr > < / fej > < tbody > < tr > < td > Last Man Standing < / td > < td > 1 játékos / csapat él < / td > < td > Halál kezelő - számoljon élő játékosokat < / td > < / tr > < tr > < td > Pontszám Cél < / td > < td > Pontok frissítése - ellenőrzési küszöbérték < / td > < / tr > < tr > < td > Time Limit < / td > < td > Legnagyobb pontszám, amikor az idő lejár < / td > < td > Játék kullancs - check timer < / td > < / tr > < tr > < td > Objektív < / td > < td > Teljes specifikus feladat (befogási zászló, megsemmisítő ágy) < / td > < td > Egyéni ECS esemény objektív interakcióhoz < / td > < / tr > < tr > < td > Kerekek < / td > < td > Az N körök legjobbja < / td > < td > Kerek végkezelő - az adatsorok pontszáma < / td > < / tr > < / test > < / táblázat > < h2 > 7. lépés: Matchmaking és sorok < / h2 > < p > Több párhuzamos játékot futtató szerverek esetén hajtson végre egy sorban álló rendszert: < / p > < pre > < kód > nyilvános osztály Matchmaking Táblázat { zártkörű záró sor & lt; PlayerHiv & gt; sorban = új LinkedList & lt; & gt; (); zártkörű zárójelentés szükséges Játékosok; public value addPlayer (PlayerHip lejátszó) { queue.add (player); ellenőrző sor (); } privát üres ellenőrző sor () { ha (queue.size () > = követelmény lejátszó) { Arena arena = arenaManager.findAvaliabarena (); Ha (aréna! = null) { (int i = 0; i < szükséges Játékosok; i +) { PlayerHip lejátszó = queue.poll (); arena.addPlayer (játékos); } } } } } < / kód > < / pre> < p > A Hytale épülete < erős > Party System < / erős > lehetővé teszi, hogy a játékosok összefogjanak, és együtt maradjanak a szerver transzfereken. A párbajozásnak tiszteletben kell tartania a pártcsoportokat - a sorban álló párttagokat, és lehetőség szerint egy csapatba kell helyeznie őket. < / p > < h2 > Meglévő Minigame Mods a < / h2 vizsgálathoz < p > Ne építsen a semmiből - tanulmányozza, mi van már CurseForge: < / p > < táblázat > < fej > < tr > < th > Mod < / th > < th > Típus < / th > < th > A vizsgálat fő jellemzői < / th > < / tr > < / fej > < tbody > < tr > < td > < strong > Éhezők játékai < / erős > < / td > < td > Last Man Standing < / td > < td > Multi- aréna menedzsment, lobby rendszer, visszaszámlálás, PvP fázisok, auto-reset < / td > < / tr > < tr > < td > < strong > BossArena < / strong > < / td > < td > PvE Arena < / td > < td > NPC szerződéses üzletek, per- player fosztogató ládák, konfigurálható főnökök < / td > < / tr > < tr > < td > < strong > Wave Combat Arenas < / strong > < / td > < td > Horde Mode < / td > < td > Wave spawning, nehézkes méretezés, jutalmazó rendszerek < / td > < / tr > < tr > < td > < strong > Skyblock < / strong > < / td > < td > Island Survival < / td > < td > Per- player world cases, progression tracing, főnök contacters < / td > < / tr > < / test > < / táblázat > < p > Az éhező játékok mod különösen érdemes tanulmányozni - ez mutatja a teljes életciklusa versenyképes minigame: lobby → visszaszámlálás → PvP → deathmatch → eredmények → reset. < / p > < h2 > Beépített platform Jellemzők Minigame Servers < / h2 > < p > A Hytale számos funkciót biztosít a dobozból, amelyekhez a Minecraft szervereknek bővítményre van szükségük: < / p > < ul > < li > < erős > Discovery katalógus: < / erős > Beépített a főmenübe - a játékosok megtalálhatják a minigame szervert külső listás oldalak nélkül < / li > < li > < erős > pártrendszer: < / erős > Olyan bennszülött barát csoportosítás, amely a szerver-transzferek között marad < / li > < li > < erős > Fizetési átjáró: < / erős > Beépített a kliensbe olyan szerverek számára, amelyek pénzzé kívánják tenni a kozmetikumokat vagy a bónuszokat < / li > < li > < erős > Engedélyek keretrendszer: < / erős > Felhasználási szint, csoportalapú, és vad kártya engedély egyezés < / li > < / ul > < h2 > Alkalmazási ellenőrző lista < / h2 > < ol > < li > < erős > Építsd meg JAR-odat: < / erős > < kód > / gradlew build < / kód > < / li > < li > < erős > Helyi vizsgálat: < / erős > < kód >% AppData% / Roaming / Hytale / UserData / Mods / < / Code > < / li > < li > < erős > Test több klienssel: < / erős > Frissítés 4 lehetővé teszi több Hytale esetek egy PC - teszt multiplayer forgatókönyvek lokálisan < / li > < li > < erős > Szerver telepítése: < / erős > Feltöltés JAR - < kód > / opt / hytale / Server / mods / < / kód > < / li > < li > < strong > Publish on CurseForge: < / strong > Plugin csomag megfelelő < kóddal > manist.json < / kód > < / li > < li > < erős > Listázza a szerverét: < / erős > Add hozzá a < a href = "/" > HytaleCharts < / a > a "Minigames" címkével, hogy a játékosok megtalálhassanak < / li > < / ol > < p > Az alap-plugin API koncepciók ez az útmutató épül, olvassa el a < a href = "/ Hírek / hytale- modding- apia-server- plugin-development-guide" > Modding API Guide < / a >. És a nem kódolt tartalmak létrehozása, amely kiegészíti a pluginokat, nézd meg a < a href = "/ Hírek / hisztale- vizual- scripting -guide- no- code- modding" > Visual Scripting Guide < / a >. < / p > < p > < em > Minigame szerver építése? Megosztjuk a Discord - mi a közösség alkotások rendszeresen. < / em > < / p >