Come Costruire Minigames personalizzati in Hytale: Guida dello sviluppatore del server

Per nome Categoria: :minuti leggere

Vuoi costruire il prossimo Bed Wars o Hunger Games su Hytale? Questa guida copre il flusso di lavoro completo — dalle macchine di stato del gioco e la gestione dell'arena al monitoraggio del giocatore basato su ECS, matchmaking e distribuzione. Include esempi reali delle mods di minigioco CurseForge esistenti.

L'architettura server-side di Hytale lo rende unico per i minigiochi personalizzati. A differenza di Minecraft dove i plugin di modalità di gioco combattono contro la sandbox della vaniglia, l'API del plugin di Hytale e l'ECS ti danno il controllo diretto sul comportamento dell'entità, lo stato del mondo e il flusso di gioco. Se hai costruito i minigiochi Bukkit, i concetti traducono — ma l'implementazione è più pulita. > Questa guida copre i sistemi di base ogni necessità di minigioco: gestione dello stato di gioco, istanze di arena, monitoraggio del giocatore, punteggio, matchmaking e distribuzione. Architetto: Come funzionano i minigame Plugins in Hytale Prima di immergersi in codice, capire l'architettura di alto livello di un minigioco Hytale: > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > Traduzione: tutto — crea arene, gestisce lobby, percorsi i giocatori < > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > < > > > < > > > > > > > > > > < > > > > > > > > > > > > > < > > > > > > > > < > > > > > > > > > > < > > < > > > > > > > < > > > > > < > > > > > > > > > < > > > > > > Una sessione di gioco in esecuzione con il proprio stato, i giocatori e la regione del mondo Game State Machine ̧strong>Player Data Componenti allegati alle entità dei giocatori < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > < > > < > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > < > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Reagire alle azioni del giocatore — uccide, blocca le interruzioni, entrata della zona > < > Step 1: Macchina di stato del gioco Ogni minigioco ha bisogno di una macchina statale. Questa è la spina dorsale che controlla cosa succede e quando. public enum GameState (') WAITING, // Lobby, in attesa dei giocatori STARTING, // Countdown prima dell'inizio del gioco IMPIEGAZIONE, // Gioco attivo DEATHMATCH, // Facoltativo: fase finale FINE // Game over, mostra i risultati Traduzione: Ogni istanza contiene il proprio GameState . Le transizioni avvengono in base alle condizioni: > < > > SVILUPPO Contatore minimo raggiunto < > STARTING → PLAYING: Timer conto alla rovescia scade Traduzione: Limiti di tempo o soglia del giocatore > PLAYING/DEATHMATCH Condizioni di vincita soddisfatte (ultimo giocatore vivo, punteggio raggiunto, ecc) < > ADESIONE → ATTIVITÀ: Risultati visualizzati, arena reset < > > > classe pubblica Arena (') privato GameState stato = GameState. WAITING; lista giocatori = nuovo ArrayList(); conto alla rovescia privata = 10; pubblico vuoto tick() (') interruttore (stato) { FORMAZIONE PROFESSIONALE se (players.size() >= MIN_PLAYERS stato = GameState. STARTING; conto alla rovescia = 10; # # FORMAZIONE PROFESSIONALE conto alla rovescia... trasmissioneconto alla rovescia(conto alla rovescia); se (conto alla rovescia — i dati vivono sull'entità stessa. Indirizzocode> public class Minigame Strumenti del giocatore Component< EntityStore> { pubblico String arena Id = ""; public String team = ""; int pubblica uccide = 0; morti int pubblici = 0; pubblico int punteggio = 0; pubblico booleano vivo = vero; pubblico lungo Morte = 0; @Override pubblico Minigiocatore clone() { Minigioco Copia giocatore = nuovo MinigamePlayer(); copia.arena Id = questo.arenaId; copia. squadra = questo.team; copy.kills = this.kills; copy.deaths = this.deaths; copy.score = questo.score; copy.alive = this.alive; copy.lastDeath = this.last Morte; copia di ritorno; # Traduzione: Collegare questo componente quando un giocatore entra in un'arena, leggerlo durante il gameplay per il punteggio e la logica di squadra, e rimuoverlo quando si lasciano. Step 3: Gestione degli eventi per la logica del gioco Minigames deve reagire alle azioni del giocatore. Utilizzare il sistema di eventi appropriato per ogni tipo: < > Avvento Eventi per gli autobus (Global) < < < < > > > > > Il giocatore si unisce al server — mostra loro la lobby ottenereEventRegistry().registerGlobal( PlayerReadyEvent.class, evento -> teleportToLobby(event.getPlayer()) ); // Il giocatore disconnette — rimuovere dall'arena ottenereEventRegistry().registerGlobal( PlayerDisconnectEvent.class, evento -> handlePlayerLeave(event.getPlayer()) ); // Comandi di chat — /join, /leave, /spectate ottenereEventRegistry().registerAsyncGlobal( PlayerChatEvent.class, futuro - > futuro. String msg = event.getMessage(); se (msg.startsWith("/join")) (') event.setCancelled(true); manigliaJoinCommand(event.getSender()); # } ); < Eventi (Entity-Specific) > Per le interruzioni di blocco, i danni e altre azioni a livello di entità, creare EntityEventSystem < < < < > > > > > Track uccide per il punteggio classe pubblica KillTracker Si estende RefChangeSystem { @Override vuoto pubblico suComponent Aggiunto(EntityStore store, Ente di riflessione, DeathComponent death) { // Entità morta — trovare l'assassino, aggiornare i punteggi Ref killer = death.getKiller(); se (uccidere!= null) { Minigioco Player killerData = getComponent( killer, MinigamePlayer.class); se (killerData!= null) { assassino Data.kills++; assassino Data.score += KILL_POINTS; # # # Traduzione: Gli eventi ECS devono essere annullati nella fase filter , non nella fase di ispezione. Se si desidera evitare la rottura del blocco durante la fase della lobby, il filtro deve controllare lo stato del gioco e annullare prima che l'azione esegue. Step 4: Gestione dell'arena > Per i giochi che hanno bisogno di spazi di gioco isolati (Hunger Games, Bed Wars), è necessario istanze arena: Multi-Arena Modello Traduzione: (') Map arenas = nuovo HashMap(); pubblico Arena creareArena(String id, Centro città) (') Arena arena = nuova Arena(id, centro); arenas.put(id, arena); ritorno arena; # arena pubblica trovareArena disponibile() (') ritorno arenas.valori().stream() .filter(a -> a.getState() == GameState. WAITING) .filter(a -> a.getPlayerCount() < a.getMaxPlayers() .findFirst() .orElse(null); # pubblico vuoto tickAll() { arenas.valori().per ogni(Arena::tick); # Traduzione: Traduzione: Dopo ogni partita, l'arena deve tornare al suo stato originale. Due approcci: > < > Ripristino delle impronte: Salvare i dati del blocco della regione dell'arena prima dell'inizio del gioco, ripristinarlo dopo. Utilizza più memoria ma è affidabile. Reload prefabbricato: Utilizzare il sistema Prefab integrato di Hytale per memorizzare l'arena come struttura prefabbricata e sostituirla dopo ogni partita. Pulisci e integra gli strumenti nativi di Hytale. < > Step 5: Team e punteggio Assegnazione =code> vuoto pubblico assegnare Squadre(Arena arena) (') List giocatori = arena.getPlayers(); Collezioni.shuffle (giocatori); String[] team = {"Red", "Blue", "Green", "Yellow"}; per (int i = 0; i < player.size(); i++) { Minigioco Dati del giocatore = getComponent( giocatori.get(i), MinigamePlayer.class); data.team = team[i% team.length]; # Traduzione: Visualizzazione della tastiera Utilizzare la classe Message di Hytale per i display a punteggio formattato. Il sistema Message supporta la formattazione del colore, stili audaci/italici e la sostituzione dei parametri: =code> public void broadcast Punteggio(Arena arena) { StringBuilder sb = nuovo StringBuilder("§6===== Traduzione: arena.getPlayers().stream() (a, b) -> getScore(b) - getScore(a)) .per ogni(p) Minigioco Dati del giocatore = getComponent( p, MinigamePlayer.class); sb.append(String.format("§f%s: §e%d kills §7| §a%d pts\n", p.getUsername(), data.kills, data.score)); }); arena.broadcast(sb.toString()); Traduzione: Step 6: Condizioni di vincita Condizioni di vincita del minigioco comune e come implementarle: > > > Tipo di parola ι/th> > < > > Ultimo uomo che sta in piedi > 1 giocatore/team vivo Score Target < > > prima di X punti Aggiornamento del punteggio — soglia di controllo < > > Limite di tempo Punteggio più alto quando il tempo scade < > > > > > > > > > > > > Completo compito specifico (bandiera di cattura, distruggere letto) =td> Rulli Il migliore dei giri N Handler finale round — il punteggio della serie di controllo > < > Step 7: Matchmaking e Queues Per i server che eseguono più giochi contemporaneamente, implementare un sistema di coda: > classe pubblica Condividi su Google finale privato Queue coda = nuovo LinkedList(); privato finale int richiesto Giocatori; public void addPlayer(PlayerRef player) { code.add (player); checkQueue(); # privato void checkQueue() { se (queue.size() >= richiesto Giocatori) (') Arena arena = arenaManager.findAvailableArena(); se (arena!= null) { per (int i = 0; i < richiesto Giocatori; i++) { PlayerRef player = code.poll(); arena.addPlayer(player); # # # # Traduzione: Hytale's built-in Party System consente ai giocatori di raggrupparsi e stare insieme attraverso i trasferimenti di server. Il matchmaking dovrebbe rispettare i gruppi di partito — membri del gruppo di coda insieme e metterli nella stessa squadra quando possibile. Esistere Minigame Mods per studiare > Non costruire da zero — studiare cosa c'è già su CurseForge: > > > Modo > > Tipo: Caratteristiche chiave per studiare < > > < > > > > ι > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < > > > > > > > > > > > > > > > > PvE Arena Negozi di contratti NPC, casse di bottino per giocatore, boss configurabili ̧strong>Wave Combat Arenas > < > Il mod Hunger Games vale la pena studiare - dimostra il ciclo di vita completo di un minigioco competitivo: lobby → conto alla rovescia → PvP → deathmatch → risultati → reset. Caratteristiche della piattaforma per i server Minigame > Hytale fornisce diverse funzionalità dalla scatola che i server Minecraft hanno bisogno di plugin per: > Scopri il catalogo: Costruito nel menu principale — i giocatori possono trovare il server minigame senza siti di elenco esterni < > Sistema di lavoro: Gruppo di amici nativi che persiste nei trasferimenti di server gateway di pagamento: Costruito nel client per server che vogliono monetizzare cosmetici o perks Permissioni Quadro: Permesso di livello utente, basato su gruppo e wildcard corrispondente a < > Elenco di controllo della distribuzione > ̧strong>Build your JAR: ./gradlew build ι > Test localmente: Goccia in % AppData%/Roaming/Hytale/UserData/Mods/♥/code> < Test con più clienti: Aggiornamento 4 consente più istanze Hytale su un PC — testa scenari multiplayer localmente < < > Distribuire al server: Caricare JAR per /opt/hytale/Server/mods/ Pubblicare su CurseForge: Pacchetto come Plugin con corretto manifest.json > Individuare il server: Aggiungilo a HytaleCharts con il tag "Minigames" in modo che i giocatori possano trovarti < > > Per i concetti base API plugin questa guida si basa, leggere il nostro Modding API E per la creazione di contenuti senza codice che completa i plugin, controlla il nostro Guida di scrittura visiva Costruire un server minigame? Condividilo sul nostro Discord — abbiamo regolarmente le creazioni della comunità