Miten rakentaa Custom Minigames Hytale: Server Developer's Guide

Nimi: Luokka:: nimi : minuutteja min lue

Haluatko rakentaa seuraavat Nälkäpelit Hytaleen? Tämä opas kattaa täyden työnkulun peli valtion koneita ja areenan hallinta ECS-pohjainen pelaaja seuranta, matchmaking, ja käyttöönotto. Sisältää todellisia esimerkkejä olemassa CurseForge minipeli mods.

Hytalen palvelimenpuoleinen arkkitehtuuri tekee siitä ainutlaatuisen räätälöidyille minigameille. Toisin kuin Minecraft, jossa pelitila plugins taistella vanilja hiekkalaatikko, Hytale plugin API ja ECS antaa sinulle suoran hallinnan yhteisön käyttäytymistä, maailman tilaa ja pelin virtausta. Jos olet rakentanut Bukkit minigames, käsitteet kääntää ... mutta toteutus on puhtaampaa. Tämä opas kattaa keskeiset järjestelmät, joita kaikki minipelit tarvitsevat: pelinhallinta, areenatilanteet, pelaajien seuranta, pisteytys, matchmaking ja käyttöönotto. Arkkitehti: Miten minigame-liitännäiset toimivat Hytale Ennen koodiin sukeltamista on ymmärrettävä Hytale-minipelin korkean tason arkkitehtuuri: Layer Purpose th>Täytäntöönpano Game Manager Orkesterit Kaikki Arena instanssi > Yksi käynnissä oleva pelisessio, jossa on oma osavaltio, pelaajat ja maailman alue Luokka, joka johtaa maailmaa tai aluetta Game State Machine Player Data Tracks per-player state Pelaajayhteisöihin liittyvät osat Esittelijät > React to player actions ... tappaa, estää taukoja, vyöhykemerkintä EventBus + ECS-tapahtumajärjestelmät vaihe 1: Pelin tilakone Jokainen minipeli tarvitsee valtion koneen. Tämä on selkäranka, joka ohjaa mitä tapahtuu ja milloin. public enum GameState { Odotan pelaajia. Aloitetaan, / / Lähtölaskenta ennen pelin alkua Soitan. Aktiivinen pelattavuus KUOLEMAATIKKO, // Valinnainen: lopullinen välilyönnin vaihe Rahoitus// Game over, tulokset } Kullakin areenalla on oma GameState . Siirtymät tapahtuvat olosuhteiden perusteella: VAIHTOEHTO → ALOITUS: Pienin pelaajamäärä saavutettu STARsting → SOITTO: Lähtölaskenta-aika päättyy PELAUS → KUOLEMANNE: Määräaika tai pelaajakynnys PELASTAUS/DEATHMATCH → MEND: Voiton edellytys täyttyy (viimeinen pelaaja elossa, pisteet saavutettu jne.) MÄÄRITYS → VALMIUS: Näytetyt tulokset, areena nollaa julkinen areena { yksityinen GameState tila = GameState. Odota. yksityinen lopullinen luettelo pelaajat = uusi ArrayList(); yksityinen lähtölaskenta = 10; julkinen mitätöinti rastilla() { kytkin (tila) { { jos (pelaajat. koko() MIN_PLAIERS) { tila = GameState. ALOITUS lähtölaskenta = 10; } } Case Starting -> { Lähtölaskenta... broadcastCountdown; jos (laskettu) tila = GameState. Soitan. StartGame(); } } case PLAYING -> { tarkistaaWinCondition(); } Tapaus MODUULI > { NäyttöTulokset(); ResetArena(); tila = GameState. Odota. } } } } vaihe 2: Pelaajatiedot ECS-komponentteja Käytä Hytalen Entity Component System -järjestelmää liittääksesi pelikohtaisia tietoja pelaajille. Tämä on puhtaampaa kuin säilyttää ulkoinen HashMap < UUID, PlayerData> kartat . julkinen luokka Minigaami Soittovälineet Osa { julkinen String areena Id = ""; julkinen merkkijonoryhmä = "; julkiset tapot = 0; julkiset kuolemat = 0; julkinen pistemäärä = 0; julkinen boolean elävänä = totta; julkinen pitkä viimeinen Kuolema = 0 @Override julkinen MinigamePlayer klooni() { Minigaami Pelaajan kopio = uusi MinigamePlayer(); Copy.arena Id = tämä.arenald; Selvä. tiimi = tämä ryhmä; Copy.tappoja = tämä.tappoja; Kuolemat = tämä. copy.score = this.score; copy.alive = this.alive; copy.lastDeath = this.last Kuolema palautuskappale; } } Käytä tätä komponenttia, kun pelaaja liittyy areenalle, lue se pelin aikana pisteytys- ja joukkuelogiikka, ja poista se, kun he lähtevät. vaihe 3: Pelin logiikan tapahtumakäsittely Minigamesin on reagoitava pelaajien toimiin. Käytä sopivaa tapahtumajärjestelmää kunkin tyypin osalta: Tapahtuma Bussitapahtumat (Global) // Player liittyy palvelimeen Näytä heille aula getEvent Registry().registerGlobal( PelaajareadyEvent.class, tapahtuma -> teleportToLobby(event.getPlayer()) ); / Pelaaja irrottaa yhteyden areenalta getEvent Registry().registerGlobal( PlayerDisconnectEvent.class, tapahtuma -> kahvaPlayerLeave(event.getPlayer()) ); / Chat-komennot /join, /leave, /katso getEventRegistry().registerAsyncGlobal( PelaajaChatEvent.class, future -> future.thenAccept( event -> { Merkkijono msg = event.getMessage(); jos (msg.startsWith("/join")) { tapahtuma.setCancelled(true); kahvaJoinCommand(event.getSender() } }) ); ECS Tapahtumat (Entity-specific) Kenttäkatkojen, vahinkojen ja muiden yhteisötason toimien osalta luo EntityEventSystem alaluokat: // Rata tappaa pisteytys julkinen luokka KillTracker Laajentaa RefChangeSystem { @Override julkinen tyhjiö Componentissa Lisätty viiteyhteisö Kuolema. / Entiteetti kuoli . Etsi tappaja, päivitä tulokset. Viitetappaja = kuolema.getKiller(); Jos (tappaja!) { Minigaami Pelaaja tappajaData = getComponent( tappaja, MinigamePlayer. luokka); jos (tappajatieto! = null) { tappaja Data.tappoja++; tappaja Tieto.score += KILL_POINTS; } } } } Muista: ECS-tapahtumat on peruutettava filter -vaiheessa eikä tarkastusvaiheessa. Jos haluat estää lohkon murtumisen aulavaiheen aikana, suodattimen on tarkistettava pelin tila ja peruutettava se ennen toimen suorittamista. vaihe 4: Areenan hallinta Peleihin, jotka tarvitsevat erillisiä leikkipaikkoja (Nummen pelit, Bed Wars), tarvitset areenaesiintymiä: Multi-Arena kuvio julkinen luokka ArenaManager { yksityinen lopullinen kartta < String, Arena > areenat = uusi HashMap (); julkinen areena luodaArena(String id, Sijaintikeskus) { Arena areena = uusi Arena(id, keskusta); Arenes.put(id, areena); palautusareena; } julkinen Arena findAvailableArena() { return areenas.values().stream() .filter(a -> a.getState() == GameState. Odota. .filter(a -> a.getPlayerCount() < a.getMaxPlayers()) .findFirst() .orElse(null); } julkinen tyhjyys tickAll() { Arena:: tik) } } Arena Nollaa Kunkin pelin jälkeen areenan on palattava alkuperäiseen tilaansa. Kaksi lähestymistapaa: Snapshot restauration: Tallenna areenan alueen lohkon tiedot ennen pelin alkua, palauttaa sen jälkeen. Käyttää enemmän muistia, mutta on luotettava. Prefab reload: Käytä Hytale n sisäänrakennettu Prefab System tallentaa areena prefab rakenne ja vaihtaa sen jälkeen kunkin pelin. Puhdistaa ja integroituu Hytalen natiivityökaluihin. vaihe 5: Joukkueet ja pisteytys Team Assignment julkinen mitättömyys Joukkueet(Arena areena) { Luettelo pelaajat = areena.getPlayers(); Collections.shuffle; String[] joukkueet = {"punainen," "sininen," "vihreä," "keltainen"}; (i = 0; i < pelaajat.size(); i++) { Minigaami Pelaajan tiedot = getComponent( pelaajat.get(i), MinigamePlayer.class); data.tiimi = joukkueet[i % joukkueet.pituus]; } } tulostaulun näyttö Käytä Hytalen Message -luokkaa formaattisille pisteille. Viestijärjestelmä tukee värimuotoilua, lihavoituja/taitaitavia tyylejä ja parametrin korvaamista: Julkinen mitätön lähetys Tulokset(Arena areena) { StringBuilder sb = uusi StringBuilder("§6==== Tulostaulu ===\n"); areena.getPlayers().stream() Lajiteltu((a, b) -> getScore(b) - getScore(a)) Kustakin [p -> { Minigaami Pelaajan tiedot = getComponent( p, MinigamePlayer. class); sb. lisäys(String.format("§f%s: §e%d tappaa §7.a%d pts\n" p.getUsername(), data.tappoja, data.score)); }); areena.broadcasting(sb.toString()); } vaihe 6: Voiton ehdot Voittoehdot ja niiden toteuttaminen: Game type Win condition Tarkista Viimeinen ihminen seisomassa 1 pelaaja/tiimi elävänä Kuoleman käsittelijä ... Pistetavoite Ensimmäiset-X-pisteet Pistemäärän päivitys ... tarkastuskynnys Aikaraja Korkein pistemäärä, kun aika päättyy Peli rasti ... tavoite Täydennä erityistehtävä (saapumislippu, tuhoa sänky) Muokkaa ECS-tapahtumaa objektiiviseen vuorovaikutukseen Rounds N-kierrosten paras Round end handler ... Vaihe 7: Yhteensovittaminen ja Queeus Kaksi samanaikaista peliä käyttävien palvelimien osalta toteuta jonotusjärjestelmä: julkinen luokka Jono { yksityinen lopullinen Jono jono = uusi LinkedList(); Yksityinen lopullinen Pelaajat julkinen tyhjä addPlayer(PlayerRef-soitin) { jono.add(soittaja); CheckQueue(); } yksityinen tyhjennystarkistusQueue() { if (queue.size() price requiredPlayers) { Arena areena = areenaManager.findAvailableArena(); jos (arena!= null) { (i = 0; i < vaaditaan) Pelaajat; i++) { PelaajaRef-soitin = jono.poll(); areena.addPlayer(soitin); } } } } } Hytalen sisäänrakennettu Party System antaa pelaajille mahdollisuuden ryhmittyä ja pysyä yhdessä palvelinsiirtojen välillä. Sinun matchmaking pitäisi kunnioittaa puolueryhmiä jonossa puolueen jäsenet yhdessä ja sijoittaa ne samaan joukkueeseen mahdollisuuksien mukaan. Esittävät minigame-modit tutkimukseen Älä rakenna tyhjästä. Tutki, mitä on jo CurseForgessa: Mod Tyyppi Tutkimuksen tärkeimmät ominaisuudet Nälkäpelit Viimeinen seisova mies Multi-areenanhallinta, aulajärjestelmä, lähtölaskenta, PvP-vaiheet, auto-reset BossArena PvE Arena NPC-sopimusliikkeet, per-player-ryöstöarkku, konfiguroitavat pomot Wave Combat Arenas Horde Mode Wave kutu, vaikeus skaalautua, palkitsemisjärjestelmät Skyblock Island Survival Per-player world -tapaukset, progression seuranta, pomo kohtaa Nälkäpelien mod on erityisen tutkimisen arvoinen. Rakennetut Platform-ominaisuudet minigame-palvelimille Hytale tarjoaa useita ominaisuuksia laatikosta, että Minecraft palvelimet tarvitsevat liitännäisiä: Tietoluettelo: Päävalikkoon rakennetut pelaajat voivat löytää minipelipalvelimen ilman ulkoisia listaussivustoja Party System: Oman ystävän ryhmittely, joka jatkuu kaikissa palvelinsiirroissa Payment Gateway: Rakennettu asiakkaalle palvelimille, jotka haluavat rahallistaa kosmetiikkaa tai etuja Lupakehys: Käyttäjän taso, ryhmäpohjainen ja villikorttien lupa täsmääminen Käyttöönottotarkastuslista Rakenna JAR: ./gradlew building Test paikallistasolla: Laskeudu %AppData%/Roaming/Hytale/UserData/Mods/ Test with multiple customers: Päivitys 4 mahdollistaa useita Hytale-tapauksia yhdellä PC:n testimoninpeliskenaariolla paikallisesti Poista palvelimelle: Lataa JAR /opt/hytale/Server/mods/ Kustannettu kirouksella: Paketti liitännäisenä, jossa on oikea manivest.json Lue palvelin: Lisää se HytaleCharts -merkkiin, jotta pelaajat löytävät sinut Perustavan plugin API-konsepteja tämä opas perustuu, lue meidän Modding API Guide . Ja ei-koodi sisällön luominen, joka täydentää plugins, tutustu meidän Visual Scripting Guide . Minipelipalvelimen rakentaminen? Jaa se Discordillamme