Πώς να κατασκευάσετε προσαρμοσμένα Minigames σε Hytale: Οδηγός προγραμματιστή Server

By HytaleCharts Team Category: technical 7 min read

Θέλεις να χτίσεις τους επόμενους Πολέμους Κρεβατιών ή Αγώνες Πείνας στο Hytale; Ο οδηγός αυτός καλύπτει την πλήρη ροή εργασίας — από τα μηχανήματα της πολιτείας του παιχνιδιού και τη διαχείριση της αρένας έως την παρακολούθηση, την ταύτιση και την ανάπτυξη παικτών με βάση το ECS. Περιλαμβάνει πραγματικά παραδείγματα από τα υπάρχοντα μοντέλα CurseForge minigame.

Η αρχιτεκτονική πλευρά του διακομιστή Hytale το καθιστά μοναδικό κατάλληλο για προσαρμοσμένα minigames. Σε αντίθεση με το Minecraft όπου η λειτουργία παιχνιδιού plugins αγωνίζονται ενάντια στη βανίλια sandbox, το plugin API και ECS της Hytale σας δίνει άμεσο έλεγχο της συμπεριφοράς της οντότητας, της παγκόσμιας κατάστασης και της ροής του παιχνιδιού. Εάν έχετε χτίσει Bukkit minigames, οι έννοιες μεταφράζουν - αλλά η υλοποίηση είναι καθαρότερη. < p> Αυτός ο οδηγός καλύπτει τα βασικά συστήματα κάθε minigame ανάγκες: διαχείριση κατάσταση παιχνίδι, αρένα περιπτώσεις, παρακολούθηση παίκτη, βαθμολόγηση, προξενιά, και ανάπτυξη. Αρχιτεκτονική: Πώς τα πρόσθετα Minigame λειτουργούν σε Hytale Πριν την κατάδυση σε κώδικα, κατανοήστε την υψηλή αρχιτεκτονική ενός μίνι παιχνιδιού Hytale: < πίνακα> < thead> < tr> Ξύπνα ΣκοπόςΕφαρμογή < tbody> < tr> Διαχειριστής παιχνιδιούOrchestrates τα πάντα - δημιουργεί αρένες, διαχειρίζεται λόμπι, διαδρομές παίκτες Singleton υπηρεσία στο plugin σας < tr>Περίπτωση Arena Μια συνεδρία παιχνιδιού με το δικό της κράτος, παίκτες και παγκόσμια περιοχή Class που διαχειρίζεται έναν κόσμο ή μια περιοχή < tr>Game State Machineελέγχει τη ροή της φάσης — αναμονή, αντίστροφη μέτρηση, παιχνίδι, τερματισμός Enum + λογική χρονομέτρων ανά αρένα < tr>Player DataTracks per-player state — σκορ, ομάδα, ζωντανός/νεκρός, στατιστικάECS Στοιχεία που συνδέονται με οντότητες του παίκτη < tr> Χειριστές event Αντιδράστε σε ενέργειες παικτών — δολοφονίες, διαλείμματα μπλοκ, καταχώρηση ζώνης EventBus + συστήματα εκδηλώσεων ECS Βήμα 1: Μηχανή κατάστασης παιχνιδιού Κάθε μίνι παιχνίδι χρειάζεται μια κρατική μηχανή. Αυτή είναι η ραχοκοκαλιά που ελέγχει τι συμβαίνει και πότε. < pre> < code>δημόσιο παιχνίδι { Περιμένοντας, // Lobby, περιμένοντας τους παίκτες Έναρξη, // Αντίστροφη μέτρηση πριν αρχίσει το παιχνίδι Παίζοντας, // Ενεργό παιχνίδι ΘΑΝΑΤΟΣ, // Προαιρετικό: τελική φάση αναμέτρησης ΤΕΛΟΣ // Τέλος παιχνιδιού, εμφάνιση αποτελεσμάτων } Κάθε περίπτωση αρένας κατέχει το δικό του GameState. Οι μεταβάσεις συμβαίνουν με βάση τους όρους: < ul> Αναμονή → Έναρξη: Ελάχιστος αριθμός παικτών έφτασε STARTING → Παίζοντας: Ο χρονομετρητής αντίστροφης μέτρησης λήγει PLAYING → ΘΑΝΑΤΟΣ: Χρονικό όριο ή όριο παίκτη ΠΛΑΙΣΙΑ/ΑΠΟΔΟΣΗ → Τελειώνοντας: Κατάσταση νίκης ικανοποιημένη (τελευταίος ζωντανός παίκτης, σκορ έφτασε, κ.λπ.) Τελειώνοντας → Αναμονή: Εμφανίστηκαν αποτελέσματα, επαναφορά αρένας δημόσια τάξη Arena { private GameState state = GameState. Περιμένω. ιδιωτικό τελικό List παίκτες = νέα ArrayList()· αντίστροφη μέτρηση ιδιωτικής εισόδου = 10· δημόσιο κενό tick() { διακόπτης (κατάσταση) { περίπτωση αναμονή -> { εάν (players.size () >= MIN_PLAYERS) { πολιτεία = GameState. ΕΝΑ STARTΞΗ, αντίστροφη μέτρηση = 10, } } Υπόθεση Έναρξη -> { αντίστροφη μέτρηση... radioCountdown (υπολογισμός)· εάν (υπολογισμός < 0) { πολιτεία = GameState. Παίζοντας? Έναρξη παιχνιδιού ()· } } περίπτωση αναπαραγωγής -> { ΈλεγχοςWinCondition()· } περίπτωση λήξης -> { εμφάνιση αποτελεσμάτων ()· resetArena()· πολιτεία = GameState. Περιμένω. } } } } Βήμα 2: Δεδομένα παικτών με στοιχεία ECS Χρησιμοποιήστε το Σύστημα Συστατικό Οντοτήτων της Hytale για να επισυνάψετε δεδομένα ειδικά για το παιχνίδι σε οντότητες παικτών. Αυτό είναι καθαρότερο από τη διατήρηση του εξωτερικού HashMap χάρτες — τα δεδομένα ζουν στην ίδια την οντότητα. Δημόσια τάξη Minigame Εφαρμογή του παίκτη Συνιστώσα { δημόσια αρένα εγχόρδων Ιδ = ""· δημόσια ομάδα συμβολοσειρών = "", θάνατοι σε δημόσιο χώρο = 0· θάνατοι από δημόσια υπηρεσία = 0· βαθμός δημόσιας υπηρεσίας = 0· δημόσια boolean ζωντανός = αληθής· δημόσια τελευταία Θάνατος = 0· Παράκαμψη @Overide δημόσιος κλώνος MinigamePlayer () { Μίνι παιχνίδι Αντίγραφο παίκτη = νέος παίκτης MinigamePlayer()· Αντιγραφή.arena Ιδ = αυτό.arenaId; Ελήφθη. ομάδα = αυτή.ομάδα; copy. kills = αυτό. kills; copy.deaths = αυτό.deaths? copy.score = αυτό.score· αντίγραφο.ζωντανό = αυτό.ζωντανό· copy.lastDeath = αυτό.last Θάνατος. αντίγραφο επιστροφής· } } Σύνδεσε αυτό το συστατικό όταν ένας παίκτης ενταχθεί σε μια αρένα, διάβασε το κατά τη διάρκεια του παιχνιδιού για βαθμολόγηση και λογική της ομάδας, και αφαίρεσέ το όταν φύγει. Βήμα 3: Χειρισμός γεγονότων για λογική παιχνιδιού Τα μινιγκάμες πρέπει να αντιδράσουν στις πράξεις των παικτών. Χρήση του κατάλληλου συστήματος γεγονότων για κάθε τύπο: Περιστατικό Γεγονότα λεωφορείων (Παγκόσμιο) < pre> < code>// Ο παίκτης μπαίνει στο διακομιστή — δείξτε τους το λόμπι GetEventRegistry(). registerGlobal ( (στα Αγγλικά). Παίκτης ReadyEvent.class, event -> teleportToLobby(event.getPlayer()) ), // Αποσυνδέσεις παικτών — αφαίρεση από την αρένα GetEventRegistry(). registerGlobal ( (στα Αγγλικά). PlayerDisconnectEvent.class, εκδήλωση -> λαβήPlayerLeave(event.getPlayer()) ), // Εντολές συνομιλίας — /join, /leave, /spectate GetEventRegistry().registerAsyncGlobal( ΠαίκτηςChatEvent.class, μέλλον -> μέλλον.τότεcept(event -> { συμβολοσειρά msg = event.getMessage()· εάν (msg.startsWith("/join")) { event.setΑκύρωση( true)? Χειρισμός JoinCommand(event.getSend ())? } }) ), ΕΚ Γεγονότα (Ειδικότητα) < p> Για διαλείμματα μπλοκ, ζημιές και άλλες ενέργειες σε επίπεδο οντότητας, δημιουργήστε EntityEventSystem υποκλάσεις: < pre> < code>// Θάνατοι κομματιού για βαθμολόγηση δημόσια τάξη KillTracker εκτείνεται RefChangeSystem { Παράκαμψη @Overide δημόσιο κενό επί του συστατικού Προστέθηκε( EntityStore store, Αναφ. οντότητα, Θάνατος Συντακτικός θάνατος) { // Οντότητα πέθανε — βρείτε το δολοφόνο, ενημέρωση βαθμολογιών Ref killer = θάνατος.getKiller(), Εάν (δολοφόνος! = μηδέν) { Μίνι παιχνίδι Παίκτης δολοφόνοςData = getComponent ( δολοφόνος, MinigamePlayer. τάξη; Εάν (δολοφόνοςData!= null) { δολοφόνος Data. kills++, δολοφόνος Σύνολο δεδομένων += ΔΟΛΟΦΟΝΙΑ } } } } Να θυμάσαι: Τα γεγονότα ECS πρέπει να ακυρωθούν στη φάση filter, όχι στη φάση επιθεώρησης. Αν θέλετε να αποτρέψετε το block break κατά τη φάση του λόμπι, το φίλτρο πρέπει να ελέγξει την κατάσταση του παιχνιδιού και να ακυρώσει πριν από την εκτέλεση της ενέργειας. Βήμα 4: Διαχείριση Arena < p> Για παιχνίδια που χρειάζονται απομονωμένους χώρους παιχνιδιού (Hunger Games, Bed Wars), θα πρέπει να αρένα περιπτώσεις: Μοτίβο πολλαπλών αρένων δημόσια τάξη ArenaManager { private final Map< String, Arena> arenas = new HashMap()· public Arena createArena(Δυνατό id, Κέντρο Τοποθεσίας) { Arena = νέα Arena(id, κέντρο), arenas.put(id, αρένα)· αρένα επιστροφής· } δημόσια Arena βρείτεΔιαθέσιμο Arena() { τιμές επιστροφής().stream() .filter(a -> a.getState() == Κατάσταση παιχνιδιού. Περίμενε. .filter( a -> a.getPlayerCount () < a.getMaxPlayers ())) .findFirst() .ή Else(null)· } δημόσιο κενό tickAll() { arenas.values(). για τον καθένα(Arena:: tick)? } } Αναστοιχειοθέτηση αρένας Μετά από κάθε παιχνίδι, η αρένα πρέπει να επιστρέψει στην αρχική της κατάσταση. Δύο προσεγγίσεις: < ul> < li>< strong>Αποκατάσταση Snapshot: Αποθήκευση των στοιχείων μπλοκ της περιοχής της αρένας πριν από την έναρξη του παιχνιδιού, επαναφορά μετά. Χρησιμοποιεί περισσότερη μνήμη αλλά είναι αξιόπιστη. < li>< strong>Προfab επαναφόρτωση: Χρησιμοποιήστε το ενσωματωμένο σύστημα προκατασκευής του Hytale για να αποθηκεύσετε την αρένα ως προκατασκευαστική δομή και να την επανατοποθετήσετε μετά από κάθε παιχνίδι. Καθαρότερο και ενσωματώνεται με τα εγγενή εργαλεία της Hytale. Βήμα 5: Ομάδες και βαθμολογία Αποστολή ομάδας δημόσια άκυρη εκχώρηση Ομάδες (αρένα) { List players = arena.getPlayers()· Συλλογές.shuffle (παίκτες)· Ομάδες εγχόρδων = {Red", "Blue", "Green", "Κίτρινο"} για (int i = 0, i < players.size(), i++) { Μίνι παιχνίδι Δεδομένα παίκτη = getComponent ( παίκτες.get(i), MinigamePlayer.class; data.team = ομάδες[i % ομάδες.μήκος] } } Εμφάνιση πίνακα σκορ Χρησιμοποιήστε την κλάση του Hytale < code>Message για μορφοποιημένες οθόνες αποτελεσμάτων. Το σύστημα μηνυμάτων υποστηρίζει χρωματική μορφοποίηση, τολμηρά/ιταλικά στυλ, και αντικατάσταση παραμέτρου: δημόσια άκυρη μετάδοση Βαθμολογία (αρένα) { StringBuilder sb = νέα StringBuilder("§6 ============================================================================================================================================================================================================================================== Πίνακας αποτελεσμάτων ===\n") arena.getPlayers(). stream() .sorted((a, b) -> getScore(b) - getScore(a)) για τον καθένα( p -> { Μίνι παιχνίδι Δεδομένα παίκτη = getComponent ( p, MinigamePlayer.class), sb.append( String.format("§f%s: §e%d σκοτώνει §7 p.getUsername (), data. kills, data.score), }), arena.broadcast(sb.toString())· } Βήμα 6: Συνθήκες νίκης Κοινές συνθήκες νίκης minigame και πώς να τις υλοποιήσετε: < πίνακα> < thead> < tr> Τύπος παιχνιδιού Κατάσταση κερδώνΕλέγξτε σε < tbody> < tr>Τελευταίος άνθρωπος στέκεται 1 παίκτης/ομάδα ζωντανόςθανατος χειριστής - μετρήστε ζωντανούς παίκτες < tr> Στόχος σκορΠρώτα προς X σημεία Επικαιροποίηση αποτελεσμάτων — κατώτατο όριο ελέγχου < tr> Χρονικό όριο Υψηλότερη βαθμολογία όταν ο χρόνος λήγει Tick παιχνιδιού - ελέγξτε το χρονόμετρο < tr> Στόχος Πλήρης ειδική εργασία (σημαία σύλληψης, καταστροφή κρεβατιού) Προσαρμοσμένη εκδήλωση ECS για αντικειμενική αλληλεπίδραση < tr> < td>Οδοιπορικά Καλύτερος από N γύρους Τέλος του κύκλου χειριστή - βαθμολογία σειράς ελέγχου Βήμα 7: Αντιστοίχιση και σειρές Για διακομιστές που εκτελούν πολλαπλά ταυτόχρονα παιχνίδια, εφαρμόστε ένα σύστημα ουράς: Δημόσια τάξη matchmaking Σε αναμονή { ιδιωτικό τελικό Queue ουρά = νέα LinkedList()· private final int που απαιτείται Παίκτες, δημόσιο κενό addPlayer (PlayerRef player) { stue.ad( παίκτης)· ΈλεγχοςQueue()· } ιδιωτικός έλεγχος κενούQueue () { εάν (queue.size() >= requiredPlayers) { Αρένα αρένα = αρέναManager.findΔιαθέσιμη Αρένα()· Εάν (αρένα! = μηδέν) { για (int i = 0· i < απαιτείται Παίκτες; i++) { PlayerRef player = ουρά.pol()· arena.addPlayer (παίχτης)· } } } } } Το ενσωματωμένο Party System του Hytale επιτρέπει στους παίκτες να ομαδοποιηθούν και να μείνουν μαζί σε όλες τις μεταφορές server. Τα προξενιά σας θα πρέπει να σέβονται τις ομάδες των κομμάτων - μέλη του κόμματος ουρά μαζί και να τα τοποθετήσετε στην ίδια ομάδα, όταν είναι δυνατόν. Υφιστάμενα Minigame Mods για Μελέτη < p> Μην χτίζετε από το μηδέν - μελέτη τι είναι ήδη στο CurseForge: < πίνακα> < thead> < tr>Mod Τύπος Βασικά χαρακτηριστικά για μελέτη < tbody> < tr> Παιχνίδια πείναςΤελευταίος άνθρωπος στέκεται Διαχείριση πολυαρένας, σύστημα λόμπι, αντίστροφη μέτρηση, φάσεις PvP, αυτόματη επαναρύθμιση < tr>BossArena PvE Arena Συμβόλαια με NPC καταστήματα, κλοπιμαία κατά παίκτη, διαμορφώσιμα αφεντικά < tr>Wave Combat ArenasHorde ModeWave γόνος, δυσκολία κλιμάκωσης, συστήματα ανταμοιβής < tr>SkyblockΝησιωτική επιβίωσηΠαγκόσμια περιστατικά ανά παίκτη, παρακολούθηση εξέλιξης, συναντήσεις αφεντικών Το παιχνίδι πείνας mod αξίζει ιδιαίτερα τη μελέτη - δείχνει τον πλήρη κύκλο ζωής ενός ανταγωνιστικού minigame: λόμπι → αντίστροφη μέτρηση → PvP → deathmatch → αποτελέσματα → επαναφορά. Ενσωματωμένη πλατφόρμα Χαρακτηριστικά για εξυπηρετητές Minigame < p> Η Hytale παρέχει πολλά χαρακτηριστικά από το πλαίσιο που οι διακομιστές Minecraft χρειάζονται πρόσθετα για: < ul> Discovery Κατάλογος: Ενσωματωμένο στο κύριο μενού — οι παίκτες μπορούν να βρουν το διακομιστή minigame σας χωρίς εξωτερικές τοποθεσίες λίστας < li>< strong> Σύστημα Party: Ιθαγενής ομαδοποίηση φίλων που επιμένει σε όλες τις μεταφορές διακομιστή Πύλη πληρωμής: Ενσωματώθηκε στον πελάτη για servers που θέλουν να monetize καλλυντικά ή προνόμια Πλαίσιο αδειών: Επίπεδο χρήστη, ομάδα-based, και άδεια μπαλαντέρ που ταιριάζουν Κατάλογος ελέγχου ανάπτυξης < ol> < li>< strong> Χτίστε JAR σας: < code> < code>./ gradlew build Δοκιμάστε τοπικά: Μετάβαση σε < code>%AppData%/Roaming/Hytale/UserData/Mods/ Δοκιμάστε με πολλούς πελάτες: Η ενημέρωση 4 επιτρέπει πολλαπλές περιπτώσεις Hytale σε έναν υπολογιστή — δοκιμή σεναρίων πολλαπλών παικτών τοπικά < li>Ανεβάστε JAR σε < code>/opt/hytale/Server/ mods/ Δημοσίευση στο CurseForge: Πακέτο ως πρόσθετο με σωστό < code> manifest.json Κατάλογος διακομιστή σας: Προσθέστε το σε