Como criar minigames personalizados no Hytale: Guia do desenvolvedor do servidor

Por : nome Categoria: technical : minutos min ler

Quer construir o próximo Bed Wars ou Jogos Vorazes em Hytale? Este guia cobre todo o fluxo de trabalho — desde máquinas de estado de jogo e gerenciamento de arenas até rastreamento de jogadores baseados em ECS, matchmaking e implantação. Inclui exemplos reais de mods de minijogo CurseForge existentes.

A arquitetura server-side de Hytale torna-a única para minigames personalizados. Ao contrário de Minecraft, onde plugins de modo de jogo lutam contra a sandbox de baunilha, a API de plugin da Hytale e ECS dão-lhe controle direto sobre o comportamento da entidade, estado mundial e fluxo de jogo. Se você construiu minigames Bukkit, os conceitos traduzem — mas a implementação é mais limpa. Este guia cobre os principais sistemas de todos os minijogos: gerenciamento de estado de jogo, instâncias de arena, rastreamento de jogadores, pontuação, matchmaking e implantação. Arquitetura: Como Minigames Funcionam em Hytale Antes de mergulhar em código, entenda a arquitetura de alto nível de um minijogo Hytale: LayerPurposeImplementação Game ManagerOrquestratos tudo — cria arenas, gere lobbies, routes playersSingleton service in your plugin Arena instance Uma sessão de jogo em execução com seu próprio estado, jogadores e região do mundoClass gerenciando um mundo ou região Game State MachineControla o fluxo de fase - esperando, contagem regressiva, jogando, terminandoEnum + lógica timer por arena Dados do Jogador Faixas por estado do jogador — pontuação, equipa, vivo/morto, estatísticasECS Componentes ligados a entidades de jogadores Event Handlers Reagir às acções do jogador — slauts, block breaks, zone entryEventBus + ECS event systems Passo 1: Máquina do estado do jogo Todo minijogo precisa de uma máquina de estado. Esta é a espinha dorsal que controla o que acontece e quando. public enum GameState { Esperando, // Lobby, esperando os jogadores Iniciar, // Contagem regressiva antes do jogo começar Jogando, // Jogabilidade ativa MORTE, // Opcional: fase final de confronto FIM // Fim do jogo, mostrando resultados } Cada instância de arena possui seu próprio GameState. Transições acontecem com base em condições: WAITING → COMEÇO: Número mínimo de jogadores atingido STARTING → JOGANDO: Temporizador de contagem regressiva expira PLAYING → MORTE: Limite de tempo ou limite do jogador PLAYING/DEATHMATCH → FIM: Condição de vitória satisfeita (último jogador vivo, pontuação alcançada, etc.) ESTAR → ESPERANÇA: Resultados exibidos, arena reset classe pública Arena { privado GameState state = GameState. À espera. privado final List players = novo ArrayList(); contagem regressiva interna privada = 10; vazio público tick () { Interruptor (estado) { CASO ESPERANDO -> { se (players.size() >= MIN_PLAYERS) { estado = GameState. A começar. contagem regressiva = 10; } } CASO INÍCIO -> { contagem regressiva--; difusãoCountdown( countdown); Se (contingente { VerifiqueWinCondition(); } FIM DO CASO -> { visorResults(); resetArena(); estado = GameState. À espera. } } } } Passo 2: Dados do jogador com componentes ECS Use o Sistema de Componentes de Entidade da Hytale para anexar dados específicos de jogos a entidades de jogadores. Isto é mais limpo do que manter o código externo HashMap maps — os dados vivem na própria entidade. classe pública Minigame Implementos do jogador Componente & lt;EntityStore& gt; { arena pública de cordas Id = ""; equipa pública de cordas = ""; int público mata = 0; mortes públicas int = 0; pontuação pública int = 0; público booleano vivo = verdadeiro; público longo último Morte = 0; @ Sobreride MinigamePlayer público clone () { Minigame Cópia do jogador = novo MinigamePlayer(); copy.arena Id = this.arenaId; Entendido. equipa = esta equipa; copy.kills = this.kills; Copiados.mortes = isto.mortes; copy.score = este.score; copy.vivo = este.vivo; copy.lastDeath = this.last Morte; Cópia de devolução; } } Ataque este componente quando um jogador se junta a uma arena, leia-o durante a jogabilidade para marcar e a lógica da equipe, e remova-o quando sair. Passo 3: Tratamento de eventos para a lógica do jogo Minigames precisam reagir às ações do jogador. Utilizar o sistema de eventos apropriado para cada tipo: Evento Eventos de autocarro (Global) // O jogador junta- se ao servidor — mostra- lhes o lobby getEventRegistry().registerGlobal( PlayerReadyEvent.class, event -> teleportToLobby( event.getPlayer()) ); // Jogador desconecta - remover da arena getEventRegistry().registerGlobal( PlayerDesconnectEvent.class, event -> handlePlayerLeave( event.getPlayer()) ); // Comandos de chat — /join, /leave, /spectate getEventRegistry().registerAsyncGlobal( PlayerChatEvent.class, futuro -> futuro.entãoAccept(evento -> { String msg = event.getMessage(); se (msg.startsWith("/join")) { event.setCancelled( verdade); handleJoinCommand( event.getSender(); } }) ); ECS Acontecimentos (Especificidade da entrada) Para quebras de bloco, danos e outras ações de nível de entidade, crie EntityEventSystem subclasses: // Trilha mata para marcar KillTracker de classe pública amplia RefChangeSystem { @ Sobreride Vazio público emComponente Adicionado(EntityStore store, Ref entidade, Morte // Entidade morreu — encontre o assassino, atualize as pontuações Ref killer = death.getKiller(); se (Assassino ! = nulo) { Minigame Assassino de jogadoresData = getComponent( killer, MinigamePlayer.class); se (killerData != null) { assassino Data.kills++; assassino Data.score += KILL_POINTS; } } } } Lembre-se: Os eventos ECS devem ser cancelados na fase filtro, não na fase de inspeção. Se você quiser evitar quebra de bloco durante a fase de lobby, o filtro deve verificar o estado do jogo e cancelar antes que a ação execute. Passo 4: Gestão de Arena Para jogos que precisam de espaços de jogo isolados (Hunger Games, Bed Wars), você precisa de instâncias de arena: Padrão de Arena Multi/h3> classe pública ArenaManager { arenas privadas finais Map = novo HashMap(); público Arena createArena(String id, Location center) { Arena = nova Arena(id, centro); arenas.put(id, arena); Arena de regresso; } público Arena findDisponívelArena() { return arenas.values().stream() .filter(a -> a.getState() == GameState. À espera. .filter( a -> a.getPlayerCount() < a.getMaxPlayers() .findFirst () .ou Else(null); } public void carckAll () { arenas.values().forEach(Arena::tick); } } Arena Reset Após cada jogo, a arena precisa retornar ao seu estado original. Duas abordagens: Restauração de snapshot: Salve os dados de bloco da região da arena antes do jogo começar, restaure-o depois. Usa mais memória, mas é confiável. Recarga pré-fab: Use o Sistema Prefab integrado da Hytale para armazenar a arena como uma estrutura pré-fab e recolocá-la após cada jogo. Limpa e integra-se com as ferramentas nativas da Hytale. Passo 5: Equipes e Pontuação Atribuição de Equipas public void assign Equipas(Arena) { List jogadores = arena.getPlayers(); Colections.shaffle( jogadores); String[] teams = {"Vermelho", "Azul", "Verde", "amarelo"}; para (int i = 0; i < players.size(); i++) { Minigame Dados do jogador = getComponent( players.get(i), MinigamePlayer.class); data.team = times[i % team.length]; } } Scoreboard Display Use a classe Mensagem de Hytale para exibição formatada. O sistema Mensagem suporta formatação de cores, estilos negrito/itálico e substituição de parâmetros: public void broadcast Pontuações(Arena) { StringBuilder sb = novo StringBuilder("§6=== Painel de avaliação (\n"); arena.getPlayers().stream() .sorted((a, b) -> getScore(b) - getScore(a) .paraCada(p -> { Minigame Dados do jogador = getComponent( p, MinigamePlayer.class); sb.append(String.format("§f%s: §e%d mata §7' §a%d pts\n", p.getUsername(), data.kills, data.score)); }); arena.broadcast(sb.toString(); } Passo 6: Condições de Vitória Condições comuns de vitória do minijogo e como implementá-las: Game TypeWin ConditionCheck In Last Man Standing1 jogador/equipe vivoDeath handler – contar jogadores vivos Score TargetPrimeiro a X pontos Actualização da pontuação — limiar de verificação Limite temporal Maior pontuação quando o tempo expiraTick do jogo — temporizador de verificação Objetivo Tarefa específica completa (bandeira de captura, cama de destruição)Evento ECS personalizado para interação objetiva Rounds Melhor de N rodadas Tratamento de fim redondo – pontuação da série de verificação Passo 7: Matchmaking e Filas Para servidores executando vários jogos concorrentes, implemente um sistema de fila: classe pública Matchmaking Fila { final privado Fila de espera = nova fila LinkedList(); int final privada necessária Jogadores; Public void addPlayer(PlayerRef Player) { fila.add( jogador); checkFiue(); } privada vacuum checkFiue () { se (queue.size() >= requiredPlayers) { Arena = arenaManager.findDisponívelArena(); se (arena ! = nula) { para (int i = 0; i < requerido Jogadores; i++) { PlayerRef player = fila.poll(); arena.addPlayer (jogador); } } } } } Hytale's built-in Party System permite que os jogadores se agrupem e fiquem juntos através de transferências de servidores. Seu matchmaking deve respeitar grupos de partidos — membros de grupos de grupos de fila juntos e colocá-los na mesma equipe quando possível. Existindo Minigame Mods to Study Não construa do zero — estude o que já está na CurseForge: Mod Tipo Características Principais do Estudo Hunger GamesLast Man StandingMulti-arena management, lobby system, contagem regressiva, fases PvP, auto-reset BossArena PvE ArenaNPC contract shops, por jogador saque baús, chefes configuráveis Arenas de combate waveModo hordeDesova wave, dificuldade de escala, sistemas de recompensa SkyblockIsland SurvivalPer-player world instâncias, acompanhamento de progressão, encontros de chefe O mod dos Jogos Vorazes é particularmente digno de estudo — demonstra o ciclo de vida completo de um minijogo competitivo: lobby → contagem regressiva → PvP → deathmatch → resultados → reset. Características da Plataforma de Construção para Servidores Minigame Hytale fornece várias características fora da caixa que os servidores Minecraft precisam de plugins para: Catálogo de Descoberta: Construído no menu principal — os jogadores podem encontrar o seu servidor de minigame sem sites de listagem externos Sistema de Festa: Grupo de amigos nativos que persiste nas transferências do servidor Gateway de pagamento: Construído no cliente para servidores que querem rentabilizar cosméticos ou regalias Framework de Permissões: Permissão de nível de usuário, baseada em grupo e wildcard correspondente Lista de verificação de implantação Construa o seu JAR: ./gradlew build Teste localmente: Baixar para %AppData%/Roaming/Hytale/UserData/Mods/ Teste com múltiplos clientes: A atualização 4 permite várias instâncias Hytale em um PC — testar cenários multiplayer localmente Empregue para o servidor: Envie JAR para /opt/hytale/Server/mods/ Publicar na CurseForge: Pacote como um Plugin com o próprio manifest.json Liste o seu servidor: Adicione-o a HytaleCharts com a tag "Minigames" para que os jogadores possam encontrá-lo Para os conceitos de API de plug-in fundamental, este guia baseia-se no nosso Modding API Guide. E para criação de conteúdo sem código que complementa seus plugins, confira nosso Guia de Programação Visual. Construindo um servidor minigame? Compartilhe-o em nossa Discórdia — temos criações comunitárias regularmente.