Wie man benutzerdefinierte Minispiele in Hytale baut: Server Developer's Guide

Von HytaleCharts Team Kategorie: technical :minuten min gelesen

Möchten Sie die nächsten Bed Wars oder Hunger Games auf Hytale bauen? Dieser Leitfaden deckt den gesamten Workflow ab – von der Spiel-Zustands-Maschinen und der Arenaverwaltung bis hin zum ECS-basierten Playertracking, Matchmaking und Bereitstellung. Enthält echte Beispiele aus vorhandenen CurseForge Minigame Mods.

Die serverseitige Architektur von Hytale ist einzigartig für benutzerdefinierte Minispiele geeignet. Im Gegensatz zu Minecraft, wo Spielmodus Plugins gegen die Vanille Sandbox kämpfen, Hytale Plugin API und ECS geben Ihnen direkte Kontrolle über Entity-Verhalten, Weltzustand und Spielfluss. Wenn Sie Bukkit Minispiele gebaut haben, übersetzen sich die Konzepte – aber die Implementierung ist sauberer. /td> Eine Laufspielsitzung mit eigenem Zustand, Spielern und Weltregion td>Class, die eine Welt oder Region verwaltet /tr> td>>strong>Game State Machine/td>td>Controls the phase flow — wait, Countdown, playing, endingtd>Enum + timer logic per arena/tr> td>>strong>Player Data/td>>td>Tracks per Player state — score, team, living/dead, statstd>ECS an Spielereinheiten gebundene Komponenten /tr> td>>strong>Event Handlers/td> React to player actions — kills, block breaks, zone entrytd>EventBus + ECS event systems/tr> Schritt 1: Game State Machine Every minigame braucht eine staatliche Maschine. Dies ist das Rückgrat, das kontrolliert, was passiert und wann. code>public enum GameState {\cHFFFF} WAITING, // Lobby, auf Spieler warten STARTING, // Countdown vor Spielbeginn PLAYING, // Aktives Gameplay DEATHMATCH, // Optional: finale Showdownphase ENDING // Spiel vorbei, Ergebnisse anzeigen }/pre> Each arena instance hat seine eigene GameState. Transite erfolgen aufgrund von Bedingungen: STARTING → PLAYING: Countdown-Timer abläuft stark>PLAY → DEATHMATCH: Zeitgrenze oder Spielerschwelle strong>PLAY/DEATHMATCH → ENDING: Gewinnbedingung erfüllt (letzter Spieler am Leben, erzielte Punktzahl, etc.) strong>>>ENDEN → WAIT: Ergebnisse angezeigt, arena reset < ul> code>public class Arena {\cHFFFF} privat GameState state = GameState. WASSEN; Private Endliste Spieler = neue ArrayList(); Private Int Countdown = 10; öffentlichkeit nichtig() {\cHFFFF} Schalter (Zustand) { Fall WAIT -> wenn (players.size() >= MIN_PLAYERS state = GameState. ERZEUGNISSE Countdown = 10; } } Fall STARTING -> Countdown--- sendCountdown(countdown) wenn (Zähler { CheckWinCondition(); } Fall ENDING -> AnzeigeErgebnisse(); resetArena(); state = GameState. WASSEN; } } } }/pre> Schritt 2: Spielerdaten mit ECS-Komponenten Use Hytale's Entity Component System zur Befestigung von spielerischen Daten. Dies ist sauberer als die Aufrechterhaltung externer HashMap Karten — die Daten leben auf dem Unternehmen selbst. code>public class Minigame Spieler implementiert Component { public String arena Id = ""; public String team = "; öffentliche Int tötet = 0; öffentliche Todesfälle = 0; öffentliche Int-Score = 0; öffentlicher Boolean lebendig = wahr; in den Warenkorb Tod = 0; @Override Public MinigamePlayer clone() { Minigame Player copy = neuer MinigamePlayer(); Kopie.arena Id = this.arenaId; Kopie. Team = this.team; copy.kills = this.kills; copy.deaths = this.deaths; copy.score = this.score; copy.alive = this.alive; copy.lastDeath = this.last Tod; Rückgabeexemplar; } }/pre> Attach diese Komponente, wenn ein Spieler eine Arena verbindet, lesen Sie sie während des Gameplays für Scoring und Teamlogik und entfernen Sie sie, wenn sie verlassen. Schritt 3: Event Handling für Game Logic Minigames müssen auf Spieleraktionen reagieren. Verwenden Sie das entsprechende Ereignissystem für jeden Typ: Bus-Veranstaltungen (Global) code>/> Spieler schließt sich dem Server an — zeigen Sie ihnen die Lobby beEventRegistry().registerGlobal( PlayerReadyEvent.class, Veranstaltung -> teleportToLobby(event.getPlayer()) ; // Spieler trennt – von Arena entfernen beEventRegistry().registerGlobal( PlayerDisconnectEvent.class, Veranstaltung -> handlePlayerLeave(event.getPlayer()) ; // Chat befehle — /join, /leave, /spectate getEventRegistry().registerAsyncGlobal( PlayerChatEvent.class, Zukunft -> future.thenAccept(event) -> String msg = event.getMessage(); wenn (msg.startsWith("/join")) {\cHFFFF} Veranstaltung.setCancelled(true); GriffJoinCommand(event.getSender()); } }) /pre> ECS Veranstaltungen (Entity-Specific) strong>Remember: ECS-Ereignisse müssen in der Phase /strong>, nicht in der Phase der Inspektion, storniert werden. Wenn Sie verhindern möchten, dass Blockbruch während der Lobbyphase, muss der Filter den Spielzustand überprüfen und stornieren, bevor die Aktion ausgeführt. Schritt 4: Arena Management Arena Reset Nach jedem Spiel muss die Arena in ihren ursprünglichen Zustand zurückkehren. Zwei Ansätze: Schritt 5: Teams und Scoring Teamzuweisung code>öffentliche Leerstelle Teams(Arena arena) {\cHFFFF} Liste Spieler = arena.getPlayer(); Sammlungen.shuffle(player); String[] Teams = {"Red", "Blue", "Green", "Yellow"}; für (int i = 0; i < Playersize(); i++) Minigame Spielerdaten = getComponent( Spieler.get(i), MinigamePlayer.class; data.team = Teams[i % Teams.length]; } }/pre> Scoreboard Display Use Hytale's Message Klasse für formatierte Anzeiger. Das Nachrichtensystem unterstützt Farbformatierung, fette/italienische Stile und Parametersubstitution: code>öffentliche Nichtausstrahlung Scores(Arena arena) { StringBuilder sb = new StringBuilder("§6==== Scoreboard ===\n"); sindna.getPlayers().stream() .sorted((a, b) -> getScore(b) - getScore(a)) .forEach(p) Minigame Spielerdaten = getComponent( p, MinigamePlayer.class; sb.append(String.format("§f%s: §e%d tötet §7| §a%d pts\n", p.getUsername(), data.kills, data.score)); }) arena.broadcast(sb.toString()); }/pre> Schritt 6: Gewinnbedingungen Common minigame win conditions and how to implement them: =Letzter Mann mit einem Gehalt an lebenden Spielern > > > > > >=Letzter Mann mit einem Gehalt an lebenden Spielern > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > td>Score Targettd>First to X pointstd> Score Update — Prüfschwelle /tr> t > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Höchste Punktzahl, wenn die Zeit abläuft td>Spiel tick — Prüfzeit/td>/tr> td>Objective> Vollständige spezifische Aufgabe (Capture Flag, zerstören bed)td>Custom ECS-Ereignis für objektive Interaktion/tr> td>Rounds>td> Best of N roundstd>Rundendhandler — Prüfserie score/tr> Schritt 7: Matchmaking und Queues Für Server mit mehreren gleichzeitigen Spielen, implementieren Sie ein Wartesystem: code>public class Matching Bitte. Privater Abschluss Queue queue = new LinkedList(); Privater Endeinsatz erforderlich Spieler; öffentlich-privater AddPlayer(PlayerRef-Player) { queue.add(player); CheckQueue(); } private nichtig checkQueue() { wenn (queue.size() >= benötigtPlayer) {\cHFFFF} Arena arena = arenaManager.findAvailableArena(); wenn (arena != null) { für (in i = 0; i < erforderlich Spieler; i++) { PlayerRef Player = queue.poll(); arena.addPlayer(player); } } } } }/pre> Hytale's Built-in Party System erlaubt es Spielern, sich über Server-Transfers zusammenzuschließen. Ihre Matchmaking sollte Parteigruppen respektieren – Mitglieder der Warteschlange zusammen und sie nach Möglichkeit auf das gleiche Team stellen. Existing Minigame Mods to Study >strong>Wave Combat Arenas/td>>td>Horde Modetd>td>Wave spawning, Schwierigkeitssskalierung, Belohnungssysteme/tr> td>>strong>Skyblock/td>td>td>Island Survivaltd>td>Per-player-Weltinstanzen, Progression Tracking, Boss Begegnungen/tr> The Hunger Games mod ist besonders wert studieren — es zeigt den vollen Lebenszyklus eines wettbewerbsfähigen Minigames: Lobby → Countdown → PvP → Deathmatch → Ergebnisse → reset. Built-in Platform Features für Minigame Servers /gradlew build/li> strong>Test lokal: Drop in %AppData%/Roaming/Hytale/UserData/Mods//li> strong>Test mit mehreren Clients: Update 4 ermöglicht mehrere Hytale-Instanzen auf einem PC — testen Sie Multiplayer-Szenarien lokal strong>Einsatz für Server: Upload JAR bis /opt/hytale/Server/mods//li> strong>Publish on CurseForge: Paket als Plugin mit ordnungsgemäßem manifest.json/li> strong>List Ihr Server: Fügen Sie es zu HytaleCharts mit dem "Minigames"-Tag hinzu, so dass Spieler finden können Sie