Hoe u aangepaste minigames te bouwen in Hytale: Server Developer's Guide

Op:naam Categorie: naam :minuten min lezen

Wil je de volgende Bed Wars of Hunger Games bouwen op Hytale? Deze gids heeft betrekking op de volledige workflow van game state machines en arena management tot ECS-gebaseerde speler tracking, matchmaking en implementatie. Bevat echte voorbeelden van bestaande CurseForge minigame mods.

De server-side architectuur van Hytale maakt het uniek geschikt voor aangepaste minigames. In tegenstelling tot Minecraft waar game mode plugins vechten tegen de vanille sandbox, Hytale's plugin API en ECS geven u directe controle over entiteit gedrag, wereldstaat, en game flow. Als je Bukkit minigames hebt gebouwd, vertalen de concepten de vertaling maar de implementatie is schoner. Deze gids behandelt de kernsystemen die elke minigame nodig heeft: game state management, arena instanties, player tracking, scoren, matchmaking en implementatie. Architectuur: Hoe minigameplugins werken in Hytale Voor je in code gaat duiken, begrijp je de architectuur op hoog niveau van een Hytale minigame: LayerPurposeImplementatie GamemanagerOrchestrates alles wat er aangemaakt wordt is arena's, beheert lobby's, routet spelersSingleton service in uw plugin Arena Instance Eén draaiende gamesessie met eigen status, spelers en wereldregioClass beheren van een wereld of regio Game State MachineBedient de fasestroom en het aftellen, afspelen, beëindigenEnum + timerlogica per arena PlayergegevensTracks per-player status score, team, levend/dood, statistiekenECS Onderdelen verbonden aan spelerseenheden Event Handlers Reageer op de speler acties: doodt, blok breekt, zone ingang EventBus + ECS event systemen Stap 1: Spelstaatmachine Elke minigame heeft een state machine nodig. Dit is de ruggengraat die bepaalt wat er gebeurt en wanneer. public enum GameState { Wachten, // Lobby, wachten op spelers Beginnen, // Aftellen voordat het spel begint SPELEN, // Actieve gameplay DEATHMATCH, // Facultatief: laatste showdown fase SENDING // Spel voorbij, resultaten tonen } Elke arena instantie heeft zijn eigen GameState. Overgangen gebeuren op basis van omstandigheden: WAITING → STARTING: Minimum aantal spelers bereikt STARTING → SPELEN: Countdown timer verloopt PLAYING → DEATHMATCH: Termijn of spelerdrempel PLAYING/DEATHMATCH → SENDING: Winnen voorwaarde voldaan (laatste speler levend, score bereikt, enz.) ENDING → Wacht: Resultaten weergegeven, arena reset publieke klasse Arena { Private GameState state = GameState. Wachten. private final List players = new ArrayList(); prive-int countdown = 10; publieke leegtek() { switch (state) { case WAITING -> { if (spelers.size() MIN_PLAYERS) { Staat = GameState. GAANDE; aftellen = 10; } } case START -> { aftellen... broadcastCountdown (countdown); indien (telling > 0) { Staat = GameState. Spelen; startgame(); } } caseplaying -> { checkWinCondition(); } case SENDING -> { displayResults(); resetArena(); Staat = GameState. Wachten. } } } } Stap 2: Spelergegevens met ECS-componenten Gebruik Hytale's Entity Component System om spelspecifieke gegevens toe te voegen aan spelersentiteiten. Dit is schoner dan externe HashMap kaarten De gegevens leven op de entiteit zelf. publieke klasse Minigame Spelergereedschappen Component { public String arena ID = ""; publiek tekenreeksteam = ""; publieke int-doden = 0; publieke sterfgevallen = 0; publieke int score = 0; openbaar booleaans levend = waar; publiek lang geleden Overlijden = 0; @Override public MinigamePlayer kloon() { Minigame Spelerkopie = nieuwe MinigamePlayer(); kopie.arena Id = this.arenad; Begrepen. team = this.team; copy.kills = this.kills; copy.deaths = this.deaths; copy.score = this.score; copy.alive = this.alive; copy.lastDeath = this.last Dood; exemplaar van terugkeer; } } Houd dit onderdeel bij als een speler zich bij een arena voegt, lees het tijdens de gameplay voor scoren en teamlogica, en verwijder het wanneer hij vertrekt. Stap 3: Event Handling voor spellogica Minigames moeten reageren op speler acties. Gebruik het juiste gebeurtenissysteem voor elk type: Evenement Busgebeurtenissen (Global) // De speler voegt zich bij de server en toont ze de lobby getEventRegistry().registerGlobal( SpelerReadyEvent.class, event -> teleportToLobby(event.getPlayer()) ); / / De speler loskoppelt de verbinding met de arena getEventRegistry().registerGlobal( SpelerDisconnectEvent.class, event -> handlePlayerLeave(event.getPlayer()) ); / / Chat commando's /join, /leave, /spectate getEventRegistry().registerAsyncGlobal( SpelerChatEvent.class, toekomst -> future.thenAccept(event -> { tekenreeks msg = event.getMessage(); als (msg.startsWith("/join")) { event.setGeannuleerd(true); handleJoinCommand(event.getSender()); } }) ); ECS Gebeurtenissen (Entity-Specific) Voor blokbreuken, schade en andere acties op entiteitsniveau, maak EntityEventSysteem subklassen: // Track kills voor scoren publieke klasse KillTracker breidt uit RefChangeSystem { @Override openbare leegte opComponent Toegevoegd(EntityStore store, Ref. entiteit, DeathComponent death) { / / Entity stierf Vind de moordenaar, update scores Ref killer = death.getKiller(); if (killer != null) { Minigame Speler moordenaarData = getComponent( moordenaar, MinigamePlayer.class); if (killerData != null) { moordenaar Data.kills++; moordenaar Data.score += KILL_POINTS; } } } } Onthoud: ECS-gebeurtenissen moeten worden geannuleerd in de filter fase, niet in de inspectiefase. Als u tijdens de lobbyfase blokbreuk wilt voorkomen, moet het filter de spelstatus controleren en annuleren voordat de actie wordt uitgevoerd. Stap 4: Arenabeheer Voor games die geïsoleerde speelruimtes nodig hebben (Hunger Games, Bed Wars), heb je arena instanties nodig: Multi-Arena patroon publieke klasse ArenaManager { private final Maparenas = new HashMap(); publieke Arena createArena(String id, Locatiecentrum) { Arena arena = nieuwe Arena(id, centrum); Arenas.put(id, arena); terugkeerarena; } publieke Arena vinden AvailableArena() { return arenas.values().stream() .filter(a -> a.getState() == GameState. Wacht. .filter(a -> a.getPlayerCount() < a.getMaxPlayers()) .findFirst() .orElse(null); } publieke leegtekAll() { arenas.values().forElk(Arena::tick); } } Arena Reset Na elk spel moet de arena terugkeren naar zijn oorspronkelijke staat. Twee benaderingen: Snapshot restore: Sla de blokgegevens van de arenaregio op voordat het spel begint, herstel het daarna. Gebruikt meer geheugen maar is betrouwbaar. Prefab herladen: Gebruik Hytale's ingebouwde Prefab System om de arena op te slaan als een prefab structuur en opnieuw te vervangen na elk spel. Reinigt en integreert met Hytale's native tools. Stap 5: Teams en scoren Teamopdracht publieke leegte toewijzen Teams(Arena arena) { List players = arena.getPlayers(); Collecties.shuffle(spelers); String[] teams = {"Rood," "Blauw," "Groen," "Geel"}; voor (int i = 0; i < spelers.size(); i++) { Minigame Spelergegevens = getComponent( spelers.get(i), MinigamePlayer.class); data.team = teams[i % teams.length]; } } Scorebordweergave Gebruik Hytale's Bericht klasse voor geformatteerde score displays. Het berichtensysteem ondersteunt kleuropmaak, vet/italic stijlen en parametervervanging: openbaar ongeldige uitzending Scores(Arena arena) { StringBuilder sb = nieuwe StringBuilder("§6== Scorebord ==\n"); arena.getPlayers().stream() .sorted((a, b) -> getScore(b) - getScore(a)) .forEach(p -> { Minigame Spelergegevens = getComponent( p, MinigamePlayer.class); sb.append(String.format("§f%s: §e%d doodt §7 p.getUsername(), data.kills, data.score)); }); arena.broadcasting(sb.toString()); } Stap 6: Win Voorwaarden Common minigame win conditions and how to implement them: GametypeWinconditieCheck In Last Man Standing1 speler/team in levenDeath handler telt levende spelers Score TargetEerst naar X-punten Controledrempel voor score-updates Tijdlimiet Hoogste score wanneer de tijd verstrijkt Game tick Doel De specifieke taak voltooien (vlag vangen, bed vernietigen)Aangepaste ECS-gebeurtenis voor objectieve interactie Rounds Beste van N-rondesRound end handler Controleseriescore Stap 7: Matchmaking en wachtrijen Voor servers die meerdere gelijktijdige spellen draaien, een wachtrijsysteem implementeren: publieke klasse Matchmaking Wachtrij { particuliere finale Queue wachtrij = nieuwe LinkedList(); privé-eind-int vereist spelers; publiek ongeldig addPlayer(PlayerRef speler) { wachtrij.add(speler); checkQueue(); } privaat ongeldige controleQueue() { indien (queue.size() >= vereist Spelers) { Arena arena = arenaManager.findAvailableArena(); als (arena != null) { voor (int i = 0; i < vereist Spelers; i++) { spelerRef speler = wachtrij.poll(); arena.addPlayer(speler); } } } } } Hytale's ingebouwde Party System laat spelers bij elkaar komen en blijven gedurende servertransfers. Uw matchmaking dient partijgroepen te respecteren en de leden van de partij in de rij samen te plaatsen en zo mogelijk in hetzelfde team te plaatsen. Er bestaan minigamemods voor onderzoek Bouw niet vanuit het niets Mod Type Belangrijkste kenmerken van studie Hunger GamesLast Man StandingMulti-arena management, lobby systeem, countdown, PvP fases, auto-reset BossArena PvE ArenaNPC contractshops, perplayer buit kisten, configureerbare bazen Wave Combat ArenasHorde ModeWave paaien, moeilijk schalen, beloningssystemen SkyblockEiland SurvivalPer-player world instances, progression tracking, boss meetings De Honger Games mod is vooral de moeite waard om te bestuderen en toont de volledige levenscyclus van een competitieve minigame: lobby → countdown → PvP → deathmatch → resultaten → reset. Ingebouwde platformfuncties voor minigameservers Hytale biedt verschillende functies uit de doos die Minecraft servers nodig hebben plugins voor: Discovery Catalogus: Ingebouwd in het hoofdmenu kunnen spelers uw minigameserver vinden zonder externe sites Party System: Native friend grouping that persisted about server transfers Payment Gateway: Ingebouwd in de client voor servers die cosmetica of extraatjes willen gelden Toestemmingskader: Gebruikers-niveau, groepsgebaseerde en wildcard-toestemming die overeenkomt met Implementatiechecklist Bouw je JAR: ./gradlew build Test lokaal: In %AppData%/Roaming/Hytale/UserData/Mods/ Test met meerdere clients: Update 4 maakt het mogelijk meerdere Hytale instanties op één PC te testen multiplayer scenario's lokaal Verzet naar server: Upload JAR naar /opt/hytale/Server/mods/ Publiceren op CurseForge: Pakket als plugin met de juiste manifest.json Lijst uw server: Voeg het toe aan HytaleCharts met de "Minigames" tag zodat spelers je kunnen vinden Voor de basis plugin API concepten die deze gids bouwt, lees onze API-gids wijzigen. En voor het aanmaken van no-code-inhoud die uw plugins aanvult, bekijk onze Visuele Scripting Guide. Een minigameserver bouwen? Deel het op onze Discord