Hytale Server API Reference: Wydarzenia, Wiadomości i Przewodnik Rozwoju Wtyczki

Nazwa Kategoria::: nazwa : min min read

Master Hytale server development with our complementary API reference. Dowiedz się o PlayerConnect Event, PlayerDisconnect Event, klasa wiadomości do formatowania czatu, rejestracji komend i budowania pierwszej wtyczki przy użyciu architektury Java- opartej na Legacy Engine.

< h2 > Zrozumienie architektury serwera Hytale < / h2 > < p > API serwera Hytale jest zbudowany na solidnej architekturze opartej na Java-, która będzie czuła się znajoma każdemu, kto pracował z wtyczkami serwerów Minecraft. Wraz z powrotem do Legacy Engine, deweloperzy mają teraz dostęp do dojrzałej, dobrze przetestowanej codebase, która priorytetyzuje mododing dostępności ponad złożoność platformy. < / p > < p > W sercu serwera znajduje się pakiet < strong > com.hypixel.hytale.server.core < / strong >, który stanowi podstawę dla wszystkich operacji po stronie serwera. Obejmuje to zarządzanie graczem, obsługę świata, wysyłanie zdarzeń i przetwarzanie poleceń. < / p > < h2 > Zdarzenia związane z połączeniem gracza: obsługa Dołącz i zostaw < / h2 > < p > Jednym z najczęstszych wymogów dla wtyczki serwera jest reagowanie na graczy dołączających lub opuszczających. Hytale API zapewnia dwa istotne wydarzenia w tym celu. < / p > < h3 > PlayerConnectEvent < / h3 > < p > Wypalony, gdy gracz pomyślnie połączy się z serwerem, to zdarzenie daje Ci dostęp do referencji gracza, zanim w pełni przeniesie się na świat. Kluczowe właściwości to: < / p > < ul > < li > < strong > playerRef < / strong > - instancja PlayerRef zawierająca UUID, nazwę użytkownika i informacje sieciowe < / li > < li > < strong > player < / strong > - podmiot gracza, który będzie ich reprezentował na świecie < / li > < li > < strong > world < / strong > - Światowa instancja, do której dołączają < li > < mocny > posiadacz < / silny > - Posiadacz magazynu dla dostępu do komponentów < / li > < / ul > < p > W przeciwieństwie do innych wydarzeń, PlayerConnect Event is < em > not cancellable < / em >. Jeśli musisz zapobiec przyłączeniu się gracza, powinieneś się tym zająć w warstwie uwierzytelniającej. < / p > < pre > < code > eventRegistry.register (PlayerConnectEvent:: class.java) {event - > Val player = event.playerRef logger.info ("Gracz podłączony: ${player.username}") / / Wyślij wiadomość powitalną player.sendMessage (Message.raw ("Witamy na serwerze!") < / kod > < / przed > < h3 > PlayerDisconnectEvent < / h3 > < p > Uruchomiony, gdy gracz opuszcza serwer, zdarzenie to zawiera ważny kontekst o < em > dlaczego < / em > odłączyli: < / p > < ul > < li > < strong > playerRef < / strong > - referencje odlatującego gracza < / li > < li > < strong > disconnectReason < / strong > - Enum wskazujący timeout, kick, quit lub zamknięcie serwera < / li > < / ul > < p > Zdarzenie to nie może zostać anulowane, ponieważ odłączenie nastąpiło już na poziomie sieci. < / p > < h2 > Klasa wiadomości: Bogate formatowanie tekstu < / h2 > < p > Właściciele serwerów chcący stworzyć polerowane doświadczenia czatu spędzą znaczny czas z klasą wiadomości. Położony w głównym pakiecie wiadomości, zapewnia płynną API do budowy sformatowanego tekstu. < / p > < h3 > Podstawowe tworzenie wiadomości < / h3 > < pre > < kod > / / Prosty SMS val msg = Message.raw ("Hello, world!") / / Z formatowaniem kolorów Val styled = Message.raw ("Ważne!") .color ("red") .bold (true) .italic (false) .monospace (true) < / code > < / pre > < h3 > Zastąpienie parametru < / h3 > < p > Dla zawartości dynamicznej, użyj uchwytów parametrów: < / p > < pre > < code > val welcome = Message.raw ("Welcome, {name}! Masz monety {monety}".) .param ("name", player.username) .param ("monety", playerData.coinBalance.toString ()) < / code > < / pre > < h3 > Powiązania przyciskowe < / h3 > < p > Wiadomości mogą zawierać klikalne hiperłącza: < / p > < pre > < code > val linked = Message.raw ("Kliknij tutaj, aby odwiedzić naszą stronę internetową") .link ("https: / / example.com") < / code > < / pre > < h2 > Wzory rejestracji zdarzeń < / h2 > < p > Hytale event system obsługuje zarówno synchroniczną jak i asynchroniczną obsługę zdarzeń, zapewniając deweloperom elastyczność w oparciu o ich wymagania eksploatacyjne. < / p > < h3 > Synchronous Rejestracja < / h3 > < p > Dla zdarzeń wymagających natychmiastowego przetwarzania na wątku serwera: < / p > < pre > < code > eventRegistry.register (PlayerInteractEvent:: class.java) {event - > jeżeli (event.action Typ = = ActionType.RIGHT _ CLICK) { / / Proces interakcji event.setCancelled (true) ¶ < / kod > < / przed > < h3 > Asynchroniczne Rejestracja < / h3 > < p > Dla zdarzeń, które mogą być przetwarzane z głównego wątku (jak umiarkowanie czatu): < / p > < pre > < code > eventRegistry.registerAsync (PlayerChatEvent:: class.java) {future - > Przyszłość. then Zastosuj {event - > / / Wykonuj filtrowanie czatu async if (containsBannedWords (event.content)) { event.setCancelled (true) ¶ event ¶ < / kod > < / przed > < h2 > Często Tabela odniesienia zdarzeń < / h2 > < p > Oto szybkie odniesienie do najczęściej używanych zdarzeń w rozwoju serwera: < / p > < tabela > < głowa > < tr > < th > Event Name < / th > < th > Cancellable < / th > < th > Właściwości klucza < / th > < / tr > < / głowa > < tbody > < tr > < td > PlayerConnectEvent < / td > < td > Nr < / td > < td > playerRef, player, world, holder < / td > < / tr > < tr > < td > PlayerDisconnectEvent < / td > < td > Nr < / td > < td > playerRef, disconnectReason < / td > < / tr > < tr > < td > PlayerChatEvent < / td > < td > Tak (Async) < / td > < td > Nadawca, cele, zawartość, formatowanie < / td > < / tr > < tr > < td > PlayerInteractEvent < / td > < td > Tak < / td > < td > gracz, akcja Typ, itemInHand, targeBlock, Independent Entity < / td > < / tr > < tr > < td > PlayerDeathEvent < / td > < td > Nr < / td > < td > gracz < / td > < / tr > < tr > < td > PlayerRespawnEvent < / td > < td > Nr < / td > < td > gracz < / td > < / tr > < tr > < td > BreakBlockEvent < / td > < td > Tak < / td > < td > InHand, targeBlock, blockType < / td > < / tr > < tr > < td > PlaceBlockEvent < / td > < td > Tak < / td > < td > itemInHand, targeBlock, rotation < / td > < / tr > < tr > < td > DamageBlockEvent < / td > < td > Tak < / td > < td > InHand, targeBlock, currentDamage, uszkodzenie < / td > < / tr > < tr > < td > DropItemEvent < / td > < td > Tak < / td > < td > Pozycja, lokalizacja < / td > < / tr > < tr > < td > CraftRecipeEvent < / td > < td > Tak < / td > < td > craftedRecipe, ilość < / td > < / tr > < / tbody > < / tabela > < h2 > Polecenia budowlane < / h2 > < p > System poleceń umożliwia rejestrowanie komend slash, które gracze mogą wykonywać w czacie. < / p > < h3 > Podstawowe implementacja poleceń < / h3 > < pre > < kod > klasa MyCommand: Command { derover fun getName (): String = "mycommand" derogator full full (nadawca: komendant, args: Array & lt; String & gt;) { sender.sendMessage (Message.raw) ¶ ¶ / / Zarejestruj się w fazie konfiguracji wtyczki CommandRegistry.registerCommand (MyCommand ()) < / code > < / pre > < h3 > Korzystanie z CommandManager < / h3 > < p > Możesz również programowo wykonywać polecenia: < / p > < pre > < code > val CommandManager = CommandManager.get () CommandManager.handleCommand (nadawca, "dzień czasu") < / kod > < / pre > < h2 > Wtyczka cyklu życia i struktury < / h2 > < p > Każdy serwer Hytale rozszerza klasę bazową JavaPlugin, która zapewnia niezbędne rejestry i haki cyklu życia. < / p > < h3 > Wtyczki cyklu życia < / h3 > < ol > < li > < silny > Budownictwo < / silny > - Instancja klasy wtyczek < / li > < li > < strong > PreLoad < / strong > - Inicjalizacja Async przed uruchomieniem serwera < / li > < li > < strong > Setup < / strong > - Zarejestruj komponenty, zdarzenia i polecenia < / li > < li > < strong > Start < / strong > - Serwer jest gotowy do przyjęcia graczy < / li > < li > < silny > Wyłączenie < / silne > - Oczyszczenie przed zatrzymaniem serwera < / li > < / ol > < h3 > Właściwości wtyczek kluczy < / h3 > < pre > < kod > / / Dostępne w klasie plugin logger: HytaleLogger / / Możliwość logowania manifest: PluginManifest? / / Metadane wtyczki z pliku manifest eventRegistry: EventRegistry / / Zarejestruj słuchaczy wydarzeń CommandRegistry: CommandRegistry / / Zarejestruj polecenia dane Katalog: Ścieżka Lokalizacja przechowywania wtyczek TaskRegistry: TaskRegistry / / Planowane zarządzanie zadaniami < / code > < / pre > < h3 > Pomocnik konfiguracji < / h3 > < p > Wtyczki mogą łatwo wczytać pliki konfiguracyjne JSON: < / p > < pre > < kod > / / Korzystanie z domyślnego config.json Val config: Konfiguracja & lt; MyConfiguration Class & gt; = with Config (MyConfiguraClass.CODEC) / / Używanie własnej nazwy pliku val config: Config & lt; MyConfiguration Class & gt; = with Config ("customy- name.json", MyConfiguraClass.CODEC) < / code > < / pre > < h2 > Praca z graczami < / h2 > < p > Klasa PlayerRef jest podstawowym interfejsem do interakcji z powiązanymi graczami. < / p > < h3 > Tożsamość i lokalizacja gracza < / h3 > < pre > < code > Val player: PlayerRef = event.playerRef / / Tożsamość Val uuid: UUID = player.uuid Val name: String = player.username val language: String = player.language / / Pozycja val transformata: Transform = player.transform val worldUuid: UUID = player.worldUuid Val HeadRotation: Vector3f = player.HeadRotation < / code > < / pre > < h3 > Dostęp do podmiotu gracza < / h3 > < p > Dla głębszych interakcji, takich jak zarządzanie zapasami, dostęp do podmiotu Gracza: < / p > < pre > < code > val playerEntity: Player = player.entity / / Operacje inwentaryzacji Val invent: Inventory = playerEntity.invent PlayerEntity.sendInventory () / / Menedżerowie UI Val hotbar = playerEntity.hotbarManager val windows = playerEntity.windowManager strony val = playerEntity.showManager val hud = playerEntity.hudManager / / Uprawnienia val canBuild: Boolean = playerEntity.hasPermission ("server.build") < / code > < / pre > < h2 > Zarządzanie światem i wszechświatem < p > Universe singleton zapewnia dostęp do wszystkich światów i połączonych graczy. < / p > < pre > < code > val universe = Universi.get () / / Dostęp gracza val allGracze: Lista & lt; PlayerRef & gt; = universe.players Val player Count: Int = universe.playerCount Val specificPlayer: PlayerRef? = universe.getPlayer (uuid) / / Dostęp światowy światy walne: Mapa & lt; String, World & gt; = universe.worlds val default Świat: Świat? = universe.defaultWorld swoiste Świat: Świat? = uniwerse.getWorld ("mój świat") / / Zarządzanie światem val newWorld: CompletableFuture & lt; World & gt; = universe.addWorld ("new- world") Val załadowany: Wykonalne Future & lt; World & gt; = universe.loadWorld ("existing- world") < / code > < / pre > < h3 > Ostrzeżenie o bezpieczeństwie gwintu < / h3 > < p > Dostęp do komponentów musi mieć miejsce na światowym wątku. Zawsze zawijaj operacje w bloku wykonania: < / p > < pre > < kod > world.execute { / / Bezpieczny dostęp do części tutaj walne jednostki = world.getEntities () < / kod > < / przed > < h2 > Kolejne kroki dla programistów serwerów < / h2 > < p > Z tym API jako fundament, jesteś gotowy do rozpoczęcia budowy wtyczki serwera Hytale. Kluczowe zasoby do zbadania: < / p > < ul > < li > System komponentów podmiotów (ECS) dla zaawansowanych manipulacji podmiotów < / li > < li > Budowanie w modułach takich jak NPC, Portale i systemy Quest < / li > < li > Wizualny system skryptów dla zachowań gry < / li > < li > Protokół sieciowy dla obsługi pakietów niestandardowych < / li > < / ul > < p > Pamiętaj, że gdy Hytale przechodzi przez Early Access, API może ewoluować. Pozostań połączony ze społecznością i oficjalną dokumentacją w miarę rozwoju. < / p >