Hur man bygger anpassade Minigames i Hytale: Server Developer Guide

FrånHytaleCharts Team Kategori: Namn minuter min läst

Vill du bygga nästa sängkrig eller hungerspel på Hytale? Denna guide täcker hela arbetsflödet - från speltillståndsmaskiner och arenahantering till ECS-baserad spelarspårning, matchmaking och distribution. Inkluderar verkliga exempel från befintliga CurseForge-minigamemods.

Hytales server-side arkitektur gör den unikt lämpad för anpassade minigamer. Till skillnad från Minecraft där spelläge plugins slåss mot vanilj sandlådan, Hytales plugin API och ECS ger dig direkt kontroll över entitet beteende, världsstatus och spelflöde. Om du har byggt Bukkit-minigamer översätts begreppen - men implementeringen är renare. Denna guide täcker kärnsystemen varje minigame behöver: spelstatistik, arenainstanser, spelarspårning, scoring, matchmaking och distribution. Arkitektur: Hur Minigame Plugins fungerar i Hytale Innan dykning i kod, förstå hög nivå arkitektur av en Hytale minigame: LayerPurposeImplementation Game ManagerOrchestrates Allt - skapar arenor, hanterar lobbyer, rutter spelare Singleton service i din plugin Arena Instance En löpande spelsession med sitt eget tillstånd, spelare och världsregionKlass som hanterar en värld eller region Game State MachineKontrollerar fasflödet — väntar, nedräkning, spelar, slutarEnum + timerlogik per arena Player DataTracks per-player state -- score, team, alive/dead, statsECS Komponenter knutna till spelarenheter Event Handlers Reagera på spelaråtgärder - dödar, blockbrytningar, zoninträde EventBus + ECS event systems Step 1: Game State Machine Varje minigam behöver en statsmaskin. Detta är ryggraden som styr vad som händer och när. Public Enum GameState { Väntar, // Lobby, väntar på spelare STARTING, / / Countdown innan spelet börjar Placering, // Aktiv gameplay DEATHMATCH, // Valfritt: slutgiltig nedgångsfas ENDING // Spel över, visar resultat ≤/code> Varje arenainstans har sin egen GameState. Övergångar sker baserat på villkor: WAITING → STARTING: Minsta antal spelare nådde STARTING → PLAYING: Nedräkningstimer löper ut PLAYING → DEATHMATCH: Tidsgräns eller tröskelvärde för spelare PLAYING/DEATHMATCH → ENDING: Vintillståndet träffades (sista spelare vid liv, poäng nådde etc.) ENDING → WAITING: Resultat som visas, arena återställning Public Class Arena { Private GameState State = GameState. Att vänta; private final List player = new ArrayList(); privat int countdown = 10; offentlig tomrum fästing() { Växla (state) Fall med -> om (players.size() >= MIN_PLAYERS) { State = GameState. STARTING; nedräkning = 10; } } fall STARTING -> nedräkning -; broadcastCountdown (countdown); Om (räkna = 0) State = GameState. PLAYING; StartGame(); } } fall PLAYING -> checkWinCondition(); } fall ENDING -> displayResults(), Återställaren(); State = GameState. Att vänta; } } } ≤/code> Steg 2: Spelardata med ECS Components Använd Hytales enhetskomponentsystem för att bifoga spelspecifika data till spelarenheter. Detta är renare än att upprätthålla extern HashMap kartor - data lever på företaget själv. Public class Minigame Spelare implementerar Komponent & lt; EntityStore & gt; Public String Arena Id = ""; Public String team = ""; offentlig int dödar = 0; offentlig int dödsfall = 0; offentlig int score = 0; offentlig boolean vid liv = sant; offentligt länge Död = 0; @Override MinigamePlayer klon() Minigame Spelarkopia = ny MinigamePlayer(); copy.arena Id = this.arenaId; kopiera. team = this.team; copy.kills = this.kills; copy.deaths = this.deaths; copy.score = this.score; copy.alive = this.alive; copy.lastDeath = this.last Döden; returnera kopia; } ≤/code> Ta denna komponent när en spelare går med i en arena, läs den under spel för poäng och lag logik, och ta bort den när de lämnar. Steg 3: Event Handling för Game Logic Minigames måste reagera på spelarens handlingar. Använd lämpligt evenemangssystem för varje typ: Event Bus Events (Global) /// Spelaren går med i servern - visa dem lobbyn GetEventRegistry().registerGlobal() PlayerReadyEvent.class, TeleportToLobby(event.getPlayer() ); //// Spelaren kopplar bort – ta bort från arena GetEventRegistry().registerGlobal() PlayerDisconnectEvent.class, Event -> HandtagPlayerLeave(event.getPlayer() ); //// Chattkommandon - /join, /lämna, /spectate fåEventRegistry().registerAsyncGlobal() PlayerChatEvent.class, framtid -> future.thenAccept(event -> String msg = event.getMessage(); Om (msg.startsWith("/join") { Event.setCancelled (sann); hanteraJoinCommand(event.getSender(); } }) ); ECS Händelser (Entity-Specific) För blockavbrott, skador och andra entitetsnivååtgärder, skapa EntityEventSystem underklasser: /// Track kills för scoring KillTracker för allmänheten Förlängningar RefChangeSystem @Override Offentligt tomrum påComponent Tillagd (EntityStore Store, Ref Entity, DeathComponent död //// Entity dog - hitta mördaren, uppdatera poäng Ref killer = death.getKiller(); Om (Killer!= Null) Minigame Spelare mördareData = getComponent( mördare, MinigamePlayer.class); Om (KillerData != null) mördare Data.kills++; mördare Data.score += KILL_POINTS; } } } ≤/code> Kom ihåg: ECS-händelser måste annulleras i filter-fasen, inte inspektfasen. Om du vill förhindra blockbrytning under lobbyfasen måste filtret kontrollera speltillståndet och avbryta innan åtgärden utförs. Steg 4: Arena Management För spel som behöver isolerade spelutrymmen (Hunger Games, Bed Wars), behöver du arenainstanser: Multi-Arena Pattern public class ArenaManager { privata slutliga karta & lt; String, Arena & gt; arenor = nya HashMap & lt; & gt;(); Public Arena skaparArena (String id, Platscenter) { Arena arena = ny arena (id, center); arenas.put (id, arena); Retur arena; } Public Arena findAvailableArena() { returnera arenas.values().stream() .filter(a -> a.getState() == GameState. Att vänta) .filter(a-> a.getPlayerCount() Arena Reset Efter varje spel måste arenan återvända till sitt ursprungliga tillstånd. Två tillvägagångssätt: Snapshot restaurering: Spara arenaregionens blockdata innan spelet startar, återställa den efter. Använder mer minne men är tillförlitlig. Prefab reload: Använd Hytales inbyggda Prefab System för att lagra arenan som en prefab-struktur och återplacera den efter varje spel. Renare och integrerar med Hytales inhemska verktyg. Steg 5: Teams and Scoring Team Assignment Public void assign Team (Arena arena) { List spelare = arena.getPlayers(); Collections.shuffle(players); String [] lag = { "Red", "Blue", "Green", "Yellow"}; för (int i = 0; i < player.size(); i++) { Minigame Spelardata = getComponent( player.get(i), MinigamePlayer.class); data.team = lag[i % teams.length]; } ≤/code> Scoreboard Display Använd Hytales Message klass för formaterade poängvisningar. Meddelandesystemet stöder färgformatering, djärva/itala stilar och parametersubstitution: Public void sändning Betyg (Arena arena) StringBuilder sb = ny StringBuilder("§6 | Scoreboard nn”); Arena.getPlayers().stream() .sorted((a, b) -> getScore(b) - getScore(a)) För varje(p) Minigame Spelardata = getComponent( p, MinigamePlayer.class); sb.append(String.format("§f%s: §e%d dödar §7| §a%d pts\n", p.getUsername(), data.kills, data.score); }); arena.broadcast(sb.toString(); ≤/code> Steg 6: Win Conditions Common minigame win villkor och hur man implementerar dem: Game TypeWin ConditionCheck In Last Man Standing1 player/team aliveDeath Handtager - räkna levande spelare Score TargetFirst to X points Score update – check threshold Time Limit Högsta poäng när tiden går ut Game tick - check timer Objective Fullständig specifik uppgift (fånga flaggor, förstöra sängen)Custom ECS event för objektiv interaktion Rounds Bäst av N-rundor Round end-handtagare - kolla serieresultat Steg 7: Matchmaking och Queues För servrar som kör flera samtidiga spel, implementera ett kösystem: Public Class Matchmaking Queue { privat slutlig Queue queue = new LinkedList(); privat slutlig int krävs Spelare; public void addPlayer (PlayerRef player) queue.add(player); checkQue(); } privat ogiltig checkQue() { Om (queue.size() >= krävsPlayers) { Arena arena = arenaManager.findAvailableArena(); Om (arena != null) för (int i = 0; i < krävs Spelare; i+++) PlayerRef-spelare = queue.poll(); arena.addPlayer(player); } } } } ≤/code> Hytales inbyggda Party System låter spelarna gruppera upp och stanna tillsammans över serveröverföringar. Din matchmaking bör respektera partigrupper - köpartier tillsammans och placera dem på samma lag när det är möjligt. Befintliga Minigame Mods för att studera Bygg inte från början - studera vad som redan finns på CurseForge: Mod Typ Nyckelfunktioner för att studera Hunger GamesLast Man StandingMulti-arena management, lobbysystem, nedräkning, PvP-faser, auto-reset BossArena PvE ArenaNPC kontraktsbutiker, per-player loot chests, konfigurerbara chefer Wave Combat ArenasHorde Mode>Wave spawning, hardy scaling, belöningssystem SkyblockIsland SurvivalPer-player-världsinstanser, progressionsspårning, bossträffar The Hunger Games mod är särskilt värt att studera - det visar hela livscykeln av ett konkurrenskraftigt minigame: lobby → nedräkning → PvP → dödmatch → resultat → återställs. Built-in Platform Funktioner för Minigame Servers Hytale ger flera funktioner ur lådan som Minecraft-servrar behöver plugins för: Discovery Catalogue: Byggd i huvudmenyn - spelare kan hitta din minigame-server utan externa listningswebbplatser Party System: Native friend grouping som kvarstår över serveröverföringar Payment Gateway: Byggd i klienten för servrar som vill tjäna kosmetika eller förmåner Permissions Framework: Användarnivå, gruppbaserad och Wildcard-tillstånd som matchar Deployment Checklist Build your JAR: ./gradlew build Test lokalt: Släpp in %AppData%/Roaming/Hytale/UserData/Mods/ Test med flera kunder: Uppdatering 4 tillåter flera Hytale-instanser på en PC - test multiplayer-scenarier lokalt Deploy to server: Ladda upp JAR till /opt/hytale/Server/mods/ Publish on CurseForge: Paket som en Plugin med rätt manifest.json List din server: Lägg till det till HytaleCharts med "Minigames"-taggen så att spelare kan hitta dig För de grundläggande plugin API-koncepten bygger den här guiden vidare, läs vår Modding API Guide. Och för innehållsskapande utan kod som kompletterar dina plugins, kolla in vår Visuell Scripting Guide. Bygga en minigame server? Dela det på vår Discord - vi har gemenskapsskapelser regelbundet.