How to Build Custom Minigames in Hytale: Server Developer's Guide

By HytaleCharts Team Category: technical 7 min read

Bir sonraki Bed Wars veya Açlık Oyunları Hytale'de inşa etmek ister misiniz? Bu kılavuz tam iş akışını kapsar - oyun devlet makineleri ve ECS tabanlı oyuncu izleme, maçlık ve dağıtım. Mevcut CurseForge minigame modlarından gerçek örnekler içerir.

Hytale'in sunucu-side mimarisi, özel mini oyunlar için eşsiz bir şekilde uygun hale getirir. Minecraft oyununun vanilya kumbox'a karşı savaştığından farklı olarak, Hytale'in eklenti API ve ECS size varlık davranışı, dünya durumu ve oyun akışı üzerinde doğrudan kontrol veriyor. Bukkit minigames inşa ederseniz, kavramlar tercüme edilir - ancak uygulama daha temiz. Bu kılavuz her mini oyun ihtiyacı olan temel sistemleri kapsar: oyun devleti yönetimi, arena örnekleri, oyuncu izleme, skorlama, maçlama ve dağıtım. Architecture: Minigame Plugins Work in Hytale Koda girmeden önce, bir Hytale minigame'nin üst düzey mimarisini anlayın: LayerPurposeImplementation Game ManagerOrchestrates Her şey - oluşturur arenas, loblar, oyuncularSingleton hizmeti eklentinizde Arena Instance Kendi devlet, oyuncular ve dünya bölgesi ile çalışan bir oyun oturumu, bir dünya veya bölge yönetmek Game State MachineDış akışını kontrol edin - bekleme, sayılama, oyun, son oyuncular = yeni DiziList (); Özel int countdown = 10; Public blank tick() { (devlet) Dava WAITING -> { Eğer (players.size() >= MIN_PLAYERS) eyalet = GameState. İLGİLİ; sayı = 10; } } Vaka Sayım- yayınCountdown(countdown); Eğer (sayın { checkWinCondition(); } ENDING -> { EkranResults(); resetna(); eyalet = GameState. İLGİLİ; } } } Step 2: ECS Bileşenler ile Oyuncu Verileri Hytale'in Entity Bitirme Sistemini oyuncu varlıklara özel verileri eklemek için kullanın. Bu dış korumaktan daha temizdir. HashMap haritalar - veriler varlığın kendisi üzerinde yaşar. public class Minigame Oyuncu uygular Bitirme { Public String arena Id = ""; Public String ekibi = ""; Halk öldürür = 0; Halk ölümleri = 0; Halk puan = 0; Halk boolean hayatta = gerçek; Halk uzun son Ölüm = 0; @Override Public MinigamePlayer klon() { Minigame Oyuncu kopyası = yeni MinigamePlayer(); kopya.arena Id = this.arenaId; kopya. Takım = bu.team; kopya.kills = bu.kills; kopya.deaths = bu.deaths; kopyası = bu. işaret; kopya.alive = bu.alive; copy.last death = this.last Ölüm; dönüş kopyası; } Bir oyuncunun bir arenaya katıldığı bu bileşeni, puanlama ve takım mantığı için oyun sırasında okuyun ve terk ettiklerinde kaldırır. Step 3: Oyun Mantık için Olayı Minigames oyuncu eylemlerine tepki vermek gerekir. Her tip için uygun olay sistemini kullanın: Event Bus Events (Global) // / Oyuncu sunucuya katılır - onlara lobiyi göster Get EventRegistry(). RegisterGlobal (İngilizce). OyuncuOkuy Event.class, Olay -> teleportToLobby (event.getPlayer()) ); // // // // Oyuncu kapanışları - Arena Get EventRegistry(). RegisterGlobal (İngilizce). OyuncuDis event.class, event -> handlePlayerLeave(event.getPlayer()) ); // // // // Chat komutları - /join, / bırakın / Get EventRegistry(). RegisterAsyncGlobal (İngilizce). OyuncuChat Event.class, gelecek -> gelecek.thenAccept(event -> { String msg = event.getMessage(); Eğer (msg.startsWith("/join") { Olay.setCancelled (gerçek); İşiJoinCommand(event.getSender()); } ) ); ECS Etkinlikler (Entity-Specific) Blok molaları, hasar ve diğer varlık seviyesindeki eylemler için Entity EventSystem alt sınıflar: // / Track skorlama için öldürür Public class KillTracker genişletilebilir genişleme RefChange System { @Override Component Eklenen(Entity Shop store, Ref varlık, DeathComponent death) // // // // Entity öldü - katil bulmak, güncelleme puanları Katil = ölüm.getKiller(); if (killer ! = null) Minigame Oyuncu katilData =Component( Katil, MinigamePlayer.class; Eğer (killerData ! = null) katil katil Data.kills++; katil katil Data.score + = KILL_POINTS; } } } Hatırla: ECS olayları filter aşamasında iptal edilmelidir, denetim aşamasında değil. Lobi aşamasında blok kırılmasını engellemek istiyorsanız, filtre oyunu kontrol etmeli ve eylem yürütmeden önce iptal etmelidir. Step 4: Arena Yönetimi Ayrılan oyun alanlarına ihtiyaç duyan oyunlar için (Hunger Games, Bed Wars) ihtiyacınız var: Multi-Arena Pattern public class ArenaManager { Özel son Map arenas = yeni HashMap(); Public Arena Arena(String id, Location center) { Arena arena = yeni Arena(id, merkezi); arenas.put(id, arena); Geri dönüş arena; } Public Arena Available Arena() { Geri dönüş arenas.values().stream() .filter(a -> a.getState() == GameState. WAITING) .filter(a -> a.getPlayerCount() < a.getMaxPlayers()) . Find First() .orElse(null); } public blank tickAll() arenas.values().for each( Arena::tick); } Arena reset Her oyundan sonra, arenanın orijinal durumuna geri dönmesi gerekir. İki yaklaşım: Snapshot restore: Oyun başlamadan önce arena bölgesinin blok verilerini kurtarın, sonra restore edin. Daha fazla hafıza kullanın ama güvenilir. Prefab reload: Hytale'nin inşa edilmiş Prefab sistemini her oyundan sonra bir prefab yapısı olarak depolamak ve yeniden yerleştirmek için kullanın. Temiz ve Hytale'nin yerli araçlarıyla bütünleşir. Step 5: Takımlar ve Scoring Team Assignment public boşluk atama Takımlar (Arena arena) { Liste < PlayerRef > oyuncular = arena.getPlayers(); Koleksiyonlar.shuffle (playerlar); String[] takımlar = {"Red", "Mavi", "Green", "Yellow"; (int i = 0; i < oyuncuları.size(); i++) Minigame Oyuncu verileri =Component( Oyuncular.get(i), MinigamePlayer.class; Veri.team = takımlar (% % takımlar); } Scoreboard Display Use Hytale's Message class for formatted puan görüntüler. Mesaj sistemi renk formatını, cesur/italic stillerini ve parametre alt montajını destekler: public blank yayın Puanlar (Arena arena) StringBuilder sb = yeni StringBuilder ("§6 == Puanboard:\n"); arena.getPlayers().stream() .sorted(a, b) -> getScore(b) - getScore(a)) Her (p -> { Minigame Oyuncu verileri =Component( p, MinigamePlayer.class; sb.append(String.format("§f%s: §%d §7| §a%d pts\n", p.getUsername(), data.kills, data.mark)); =) arena.broadcast(sb.toString()); Step 6: Win Koşulları Common minigame koşulları kazanmak ve bunları nasıl uygulamak: Game TypeWin DurumCheck In Last Man Standing1 oyuncu/team canlıÖlüm eller - canlı oyuncuları say Score Targetİlk olarak x puan Puan güncelleme - kontrol eşi Time Limit Zaman bittiğinde en yüksek puanGame tick - check timer Objective Tamam özel görev (kapı bayrağı, yatak yok)Müşteri etkileşimi için ECS etkinliği Rounds N roundsRound end handler - kontrol serisi puan Step 7: Matchmaking ve Queues Birden çok eş zamanlı oyunlar çalışan sunucular için, bir kuyruk sistemi uygulayın: public class Matchmaking Queue { Özel final Queue< PlayerRef> kuyruk = yeni LinkedList(); Özel son gerekli Oyuncular; public blank addPlayer (PlayerRef player) { kuyruk.add(player); checkQueue(); } Özel boşluk checkQueue() (queue.size() >= gerekliPlayers) { Arena arena = arenaManager. FindAvailable Arena(); Eğer (arena! = null) (int i = 0; i < gerekli Oyuncular; i++) OyuncuRef oyuncu = kuyruk.poll(); arena.addPlayer (player); } } } } Hytale's built-in Party System, oyuncular grup yukarı çıkıp sunucu transferleri boyunca birlikte kalmalarını sağlar. Çöplüğün parti gruplarına saygı duymalı - birlikte kuyruk parti üyeleri ve onları mümkün olduğunda aynı takımda oturmalıdır. Çalışmak için Minigame Mods Sıfırdan inşa etmeyin - CurseForge'de zaten neler olduğunu incelemek: Mod Type Çalışmak için Anahtar Özellikler Hunger GamesLast Man StandingMulti-arena yönetimi, lobi sistemi, sayım, PvP aşamaları, auto-reset Bos Arena PvE ArenaNPC sözleşme dükkanları, oyuncu yağma göğüsleri, yapılandırılabilir patronlar Wave Combat ArenasHorde ModeWave spawning, zorluk ölçeklendirme, ödül sistemleri SkyblockIsland SurvivalPer-player dünya örnekleri, ilerleme izleme, patron karşılaşmaları Açlık Oyunları modu özellikle okumaya değer - rekabetçi bir mini oyunun tam yaşam döngüsünü gösteriyor: lobi → sayı → PvP → ölüm maç → sonuçlar → sıfır. Built-in Platform Özellikler Minigame Servers Hytale, Minecraft sunucularının ihtiyaç duyduğu kutudan birkaç özellik sunar: Discovery katalog: Ana menüye inşa edilmiş - oyuncular dış liste siteleri olmadan minigame sunucunuzu bulabilirler Party System: Bu, sunucu transferleri boyunca devam eden yerli arkadaş grubu Payment Gateway: Kozmetik veya perks İzinler Çerçeve: Kullanıcı seviyesi, grup tabanlı ve vahşi kart izini eşleşen Deployment Checklist JAR: . /gradlew build Test yerel: %AppData%/Roaming/Hytale/UserData/Mods/ Birden çok müşteri ile test: Update 4, birden çok Hytale örneği bir PC'de sağlar - yerel olarak çok oyunculu senaryoları test edin. Deploy to server: download JAR to /opt/hytale/mods/ Publish on CurseForge: Uygun manifest.json sunucunuzu dinleyin: HytaleCharts "Minigames" etiketiyle ekleyin, böylece oyuncular sizi Temel eklenti API konseptleri için bu kılavuz üzerinde inşa eder, Modding API Guide okuyun. Ve eklentilerinizi tamamlayan şifre içerik yaratımı için, Görsel Senaryolama Kılavuzu. Bir minigame sunucusu kurmak? Bunu Discordumuzda paylaşın - topluluk yaratımlarını düzenli olarak sunuyoruz.