Cum de a construi Minigame personalizate în Hytale: Ghidul Dezvoltatorului Server

După: nume Categorie: : nume : minute min citește

Vrei să construieşti următorul Bed Wars sau Hunger Games pe Hytale? Acest ghid se referă la fluxul complet de lucru Include exemple reale din modurile de joc ale CurseForge.

Arhitectura serverului Hytale o face potrivită pentru minigame personalizate. Spre deosebire de Minecraft în cazul în care modul de joc plugin-uri lupta împotriva cutiei de nisip vanilie, plugin-ul Hytale API și ECS vă oferă controlul direct asupra comportamentului entității, starea mondială, și fluxul de joc. Dacă ați construit minigames Bukkit, conceptele traduc, dar implementarea este mai curată. Acest ghid acoperă sistemele de bază de care are nevoie fiecare minigame: managementul de stat al jocului, instanţele arenei, urmărirea jucătorilor, scorul, matchmaking-ul şi implementarea. Arhitectură: Cum Minigame Module de lucru în Hytale Înainte de scufundare în cod, să înțeleagă arhitectura la nivel înalt a unui minigame Hytale: LayerPurposeImplementation Game ManagerOrchestrates totul creează arene, gestionează lobby-uri, trasee jucători Singleton serviciu în plugin-ul Arenactor O sesiune de joc rulează cu propriul său stat, jucători, și regiunea mondială Clasă de gestionare a unei lumi sau regiuni Game State Machine Controls the faze flow Player Data Tracks per-player state Componentele atașate entităților de jucător Event Handlers Reacţionează la acţiunile jucătorului: ucideri, pauze de bloc, intrare în zonă step 1: Game State Machine Fiecare joc are nevoie de un aparat de stat. Aceasta este coloana vertebrală care controlează ce se întâmplă și când. enum public GameState { Lobby, aşteaptă jucătorii. Începe numărătoarea inversă înainte de începerea jocului Joc, Joc activ Opţional: faza finală de confruntare ÎNCHIDEREA Jocul s-a terminat, arătând rezultatele } Fiecare arena instanta detine propria sa GameState. Tranzițiile au loc pe baza condițiilor: Traducerea şi adaptarea: Număr minim de jucători atins Traducerea şi adaptarea: Numărătoarea inversă expiră Traducerea şi adaptarea: Termen sau prag de jucător Traducerea şi adaptarea: Starea câștigului atins (ultimul jucător în viață, scor atins etc.) Traducerea şi adaptarea: Rezultate afișate, resetare arenă Clasă publică Arena { Statul de joc privat = GameState. Aşteptând. privat final List jucători = noi ArrayList(); Numărătoarea inversă a int privată = 10; căpuşă goală publică () { comutator (stat) { Caz în aşteptare - > { dacă (jucători.size() > MIN_JUCĂTORI) { stat = GameState. ÎNCETAREA; Numărătoarea inversă = 10; } } Cazul STARTING - > { Numărătoarea inversă... radiodifuzareCountdown (numărătoare inversă); dacă (număr scăzut { checkWinCondition (); } Cazul de închidere - > { Rezultate de afișare (); resetArena (); stat = GameState. Aşteptând. } } } } Pasul 2: datele jucătorilor cu componentele ECS Folosiţi sistemul de componente al entităţii Hytale pentru a ataşa date specifice jocului entităţilor jucătorului. Acest lucru este mai curat decât menținerea externă HashMap hărţi Clasă publică Minigame Implementarea jucătorilor Componentă { arenă string publică Id = ""; echipa publică de string = ""; ucideri int publice = 0; decese publice interne = 0; scorul int public = 0; boolean public viu = adevărat; public lung Moarte = 0; @ Override public MinigamePlayer clone() { Minigame Copie jucător = nou MinigamePlayer (); Copie.arena Id = aceasta.arenald; Recepţionat. echipa = aceasta. echipa; copie.skills = this.kills; copie.moarte=acest.moarte; copie.score = this.score; Copie.viu = viu; Copiere.ultima moarte = aceasta.ultima Moartea; copie returnată; } } Ataşaţi această componentă atunci când un jucător se alătură unei arene, citiţi-o în timpul jocului pentru punctaj şi logica echipei, şi scoateţi-o când pleacă. Pasul 3: Manipularea evenimentelor pentru logica jocului Minigames trebuie să reacţioneze la acţiunile jucătorului. Utilizați sistemul de evenimente corespunzător pentru fiecare tip: Eveniment Bus Events (Global) // Jucătorul se alătură serverului getEventRegistry () RegisterGlobal( PlayerReadyEvenimente.clase, Eveniment - > teleportareToLobby (eveniment.getPlayer())) ); - Nu. Jucătorul se deconectează de la arena getEventRegistry () RegisterGlobal( PlayerDisconnectEvent.class, eveniment - > mânerPlayerLeave (eveniment.getPlayer())) ); - Nu. Comenzi de chat / alătură-te, / leave, /spectate getEventRegistry () RegisterAsyncglobal( PlayerChatEvenimente.clasă, viitor - > viitor. atunci Accept (eveniment - > { String msg = eveniment.getMessage(); dacă (msg.startswith("/join")) { eveniment.setAnulat (adevărat); mânerJoinCommand (eveniment.get Sender()); } }) ); ECS Evenimente (Entitate specifică) Pentru pauze de bloc, daune și alte acțiuni la nivel de entitate, creați EntityEventSystem subclase: // Track ucide pentru notare Clasa publică KillTracker se extinde RefChangeSystem { @ Override gol public onComponent Adăugat (EntityStore magazin), Entitatea de ref; DeathComponent death) { - Nu. Entitatea a murit Ucigaș de ref = moarte.getKiller(); dacă (criminal! = nul) Minigame Player killerData = getComponent( criminal, MinigamePlayer.class); dacă (Data ucigaşului! = nul) criminal Data.kills++; criminal Date.score += KILL_points; } } } } Traducerea şi adaptarea: Evenimentele ECS trebuie anulate în faza filtru , nu în faza de inspecție. Dacă doriți să preveniți spargerea blocului în timpul fazei de lobby, filtrul trebuie să verifice starea jocului și să anuleze înainte de executarea acțiunii. Pasul 4: Managementul arenei Pentru jocuri care au nevoie de spații de joacă izolate (Jocuri Hunger, războaie pat), aveți nevoie de cazuri arenă: Multi-Arena Model clasa publică ArenaManager { Map final privat < String, Arena> arenas = nou HashMap(); Public Arena creareArena (String id, Centru de localizare) { Arena arenă = noua Arena (id, centru); arenas.put (id, arena); arena de returnare; } Public Arena find AvailableArena () { arene de returnare. valori().stream() .filtru(a -> a.getState() == GameState. Așteptare) .filtru(a -> a.getPlayerCount() < a.getMaxPlayers())) .FindFirst() .orElse (null); } gol public TickAll() { arenas. values (). forEach (Arena::tick); } } Arena Reset După fiecare joc, arena trebuie să revină la starea sa inițială. Două abordări: Traducerea şi adaptarea: Salvați datele blocului regiunii arenei înainte de începerea jocului, restaurați-l după. Folosește mai multă memorie, dar este de încredere. Prefab reload: Utilizați Hytale 's built-in Prefab System pentru a stoca arena ca o structură prefab și re-place-l după fiecare joc. Mai curat și se integrează cu instrumentele native ale lui Hytale. Pasul 5: echipe și scoruri Atribuirea de echipe alocarea nulă publică Echipe (Arena arenei) { Listă < PlayerRef> jucători = arena.getPlayers (); Colecții.shuffle (jucători); Siring[] teams = {"Red" , "Blue," "Green," "Yellow"}; pentru (int i = 0; i < jucători.size(); i++) { Minigame Date jucător = getComponent( jucători.get(i), MinigamePlayer.class); Data.team = echipe[i % echipe.long]; } } Scoreboard Display Use Hytale's Mesaj class for formatate score shows. Sistemul de mesaje suportă formatarea culorilor, stilurile aldine/italice și înlocuirea parametrilor: difuzare nulă publică Scoruri (Arena arenă) { StringBuilder sb = stringBuilder nou["§6=== Tabloul de bord ===\n"; arena.getPlayers().stream() .sortate ((a, b) -> getScore (b) - getScore (a)) {pentru fiecare[p-> { Minigame Date jucător = getComponent( p, MinigamePlayer.class); sb.apendice (String.format) ["§f%s: §e%d kills §7 p.getUsername(), data.kills, data.score)); }); arena. transmisie (sb.toString()); } Pasul 6: Condiţiile de câştig Condiţii comune de câştig în minigame şi modul de punere în aplicare a acestora: Game Type Win conditionCheck In Traducerea şi adaptarea: Score TargetFirst to X points Actualizarea scorului Time Limit Cel mai mare scor atunci când timpul expiră Game tick Obiectiv Sarcina specifică completă (pavilionul de captură, patul de distrugere) Evenimentul ECS custom pentru interacțiune obiectivă Rounds Best of N rounds Round end handler Pasul 7: Matchmaking and Queues Pentru serverele care rulează mai multe jocuri concurente, implementați un sistem de coadă: Clasă publică Matchmaking La coadă. final privat Queue coadă = nou LinkedList(); Int final privat necesar Jucători; addPlayer (PlayerRef player) { coadă.add (jucător); checkQueue (); } { în cazul în care (queue.size() > necesarPlayers) { Arena arenă = arenaManager.findAvailableArena(); dacă (arenă! = nul) pentru (int i = 0; i < necesar Jucători; i++) { JucătorRef = coadă.poll(); arena.addPlayer (jucător); } } } } } Hytale's built-in Party System le permite jucătorilor să se grupeze și să rămână împreună prin transferuri de servere. Petcoming dvs. ar trebui să respecte grupurile de partid Existing Minigame Mods to Study Nu construiți de la zero Mod Tipul Caracteristici cheie ale studiului Jocuri hunger Last Man Standing Multi-arena management, sistem de lobby, numărătoare inversă, faze PvP, auto-resetare BossArena PvE Arena Magazine contractuale NPC, cufere de pradă per-player, şefi configurabili Wave Combat Arenas Horde Mode Wave reproducening, dificultate scalare, sisteme de recompensare SkyblockIsland SurvivalPer-player world instances, progressive tracking, boss intalniri Modul Jocurilor foamei merită studiat în mod deosebit Built-in Caracteristici Platforma pentru Servere Minigame Hytale oferă mai multe caracteristici din cutie care serverele Minecraft au nevoie de module pentru: Discovery Catalog: Construit în meniul principal Party System: Gruparea de prieteni nativi care persistă peste transferuri de server Payment Gateway: Construit în client pentru servere care doresc să monetizeze cosmetice sau avantaje Permisii Cadru: Permisiune de nivel de utilizator, bazat pe grup și wildcard de potrivire Lista de verificare a implementării Construiţi JAR: ./gradlew build Test local: Drop into %AppData%/Roaming/Hytale/UserData/Mods/ Test cu mai mulţi clienţi: Actualizarea 4 permite mai multe cazuri de Hytale pe un PC-ul de testare multiplayer scenarii locale Deplasați pe server: Upload JAR la /opt/hytale/Server/mods/ Traducerea şi adaptarea: Pachet ca un modul cu manifest.json Lista serverului: Adăugaţi-l la