Diálogos de NPCs

From DragonMineZ Wiki
Revision as of 01:32, 22 October 2026 by Shokkoh (talk | contribs) (Translation sync from dragonminez-wiki repository)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Os diálogos de NPCs permitem dar aos NPCs mestres conversas ramificadas apenas com JSON, sem Java. Uma árvore de diálogo é um conjunto de nós: cada nó é uma fala do NPC, mais as opções com que o jogador pode responder. As opções podem levar a outro nó, ficar ocultas atrás de condições e executar ações como mudar a índole, dar TP, executar um comando ou iniciar uma missão.

Os diálogos são dados de cada mundo, assim como as missões e os desejos.

Onde ficam os arquivos

<world save>/dragonminez/dialogues/*.json

A pasta é criada na primeira vez que o servidor inicia, junto com um _example.json que você pode copiar. Cada arquivo .json da pasta (sem subpastas) contém uma árvore para um NPC. Os arquivos são carregados em ordem alfabética; se dois arquivos apontam para o mesmo NPC, vale o último.

Os diálogos são carregados quando o servidor inicia e recarregados com /dmzreload story (ou /dmzreload all); veja Recarregar e atualizar mudanças.

Código-fonte: src/main/java/com/dragonminez/common/dialogue/ (DialogueRegistry, DialogueParser, DialogueService, DialogueAction).

Quais NPCs podem usá-los

As árvores de diálogo funcionam com os NPCs mestres: os treinadores colocados por Posicionamento e índole de NPCs, como o Mestre Kame ou o Goku. O campo npc é o id do mestre. Os mestres que o DragonMineZ coloca por padrão usam estes ids: roshi, goku, karin, dende, popo, gero, guru, kingkai (Rei Kai), toribot, enma, baba, grandkai, otherworld_announcer

Quando um mestre tem uma árvore, clicar nele com o botão direito mostra a árvore em vez das opções habituais do mestre (Missões, Habilidades, Treinar e serviços; veja Mestres). A árvore usa a mesma janela de diálogo: a fala aparece no centro da faixa inferior e as opções são listadas à direita. Dê a uma das suas opções a ação OPEN_QUESTS para que os jogadores ainda consigam chegar às missões do mestre. O jogador precisa ter criado um personagem antes. O requisito de índole de um mestre não impede a conversa (um mestre que não gosta de você o cumprimenta com uma fala de desagrado); ele só bloqueia Habilidades, Treinar e as missões secundárias novas desse mestre, enquanto as missões de saga e as que já estão em andamento continuam disponíveis (veja Mestres e Índole).

Os NPCs de missões padrão (dragonminez:quest_npc, por exemplo a Bulma) mantêm sua lista de missões e não usam árvores de diálogo.

Formato do arquivo

{
  "npc": "roshi",
  "start": "greet",
  "nodes": {
    "greet": {
      "line": "Well, if it isn't %player%! What brings you here?",
      "choices": [
        {
          "text": "I want to get stronger.",
          "goto": "training",
          "conditions": { "operator": "AND", "conditions": [ { "type": "LEVEL", "minLevel": 5 } ] }
        },
        {
          "text": "Give me your money!",
          "goto": "angry",
          "actions": [ { "type": "ALIGNMENT", "amount": -5 } ]
        },
        { "text": "Show me your quests.", "actions": [ { "type": "OPEN_QUESTS" } ] },
        { "text": "Goodbye." }
      ]
    },
    "training": {
      "line": "Ha! I like your spirit. Take these training points and come back later.",
      "choices": [
        { "text": "Thank you!", "actions": [ { "type": "TPS", "amount": 50 } ] }
      ]
    },
    "angry": {
      "line": "How dare you! Leave my sight at once!"
    }
  }
}

Árvore

Campo Tipo O que faz
npc Texto Obrigatório. O id do mestre ao qual a árvore pertence (sem diferenciar maiúsculas e minúsculas). Um id que começa com _ deixa o arquivo inativo; é assim que o _example.json fica desligado.
start Texto Id do primeiro nó. Padrão: "start".
nodes Objeto Obrigatório. Mapa de id de nó para nó.

Uma árvore é ignorada (e o motivo é registrado no log) quando falta npc ou nodes, ou quando o nó start não existe.

Nó

Campo Tipo O que faz
line Texto Obrigatório. O que o NPC diz. Uma chave de tradução ou texto simples; aceita marcadores. Um nó sem line é ignorado.
choices Array As respostas do jogador, listadas como opções. Um nó sem opções só mostra sua fala; o jogador sai com Fechar ou Esc.

Opção

Campo Tipo O que faz
text Texto Obrigatório. Texto do botão. Uma chave de tradução ou texto simples; aceita marcadores. Uma opção sem text é ignorada.
goto Texto Nó a ser mostrado em seguida. Omita-o (ou aponte para um nó que não existe) para encerrar a conversa.
conditions Objeto Opcional. A opção só aparece quando as condições são atendidas. Mesmo formato dos prerequisites das missões (veja abaixo). Se o bloco não puder ser lido, a opção inteira é descartada em vez de aparecer para todos.
actions Array Opcional. Ações executadas em ordem quando a opção é escolhida (veja abaixo).

Condições

conditions usa o formato de árvore de condições das missões: um operator (AND ou OR) e uma lista de conditions, que podem ser aninhadas. Qualquer tipo de condição de missão funciona, por exemplo:

{ "operator": "OR", "conditions": [
    { "type": "RACE", "race": "saiyan" },
    { "type": "SAGA_QUEST", "sagaId": "saiyan_saga", "questId": 12 },
    { "type": "ALIGNMENT", "max": 40 }
] }

Os tipos disponíveis são SAGA_QUEST, QUEST, LEVEL, STAT, RACE, CLASS, SKILL, BIOME, DIMENSION, STRUCTURE, ALIGNMENT e TIME. Os nomes dos campos são os mesmos das missões (por exemplo, LEVEL usa minLevel); veja Missões personalizadas.

As condições são verificadas de novo no servidor quando o jogador escolhe a opção, então não dá para forçar uma opção oculta.

Ações

type Campos O que faz
ALIGNMENT amount Soma amount à índole do jogador (valores negativos a diminuem).
TPS amount Dá amount pontos de treino (apenas quantidades positivas).
COMMAND command Executa um comando pelo servidor com permissões de operador. %player% é substituído pelo nome do jogador.
START_QUEST quest Inicia uma missão com as mesmas regras de quando ela é iniciada pelo registro de missões (pré-requisitos, requisitos de início, grupo). Use o id da missão secundária (por exemplo, "bulma_gero_blueprints") ou sagaId:questId para uma missão de saga (por exemplo, "saiyan_saga:3"). Se a missão não puder ser iniciada, nada acontece.
OPEN_QUESTS Nenhum Troca a mesma janela para a lista de missões do NPC (aceitar, entregar, ver missões bloqueadas) e encerra a árvore (goto é ignorado).

value é aceito como alias genérico de command e quest. Uma ação com um type desconhecido é ignorada e registrada no log.

Marcadores

As falas e os textos das opções podem conter estes marcadores; eles são preenchidos para o jogador que os lê:

Marcador Valor
%player% Nome do jogador
%race% Id da raça
%class% Id da classe
%level% Nível do jogador
%alignment% Índole
%deaths% Número de mortes
%form% Forma ativa (base quando não transformado)
%dimension% Nome da dimensão (por exemplo, overworld)

Os marcadores também funcionam dentro das suas próprias traduções. Addons em Java podem adicionar mais com DMZTextPlaceholders.register(...); veja Implementação e eventos.

Traduções

line e text aparecem traduzidos quando correspondem a uma chave de tradução de um arquivo de idioma, e como foram escritos caso contrário. A aba de nome acima da fala mostra o nome habitual do NPC (o nome da entidade, por exemplo entity.dragonminez.master_roshi). As traduções próprias se combinam com as do Crowdin da mesma forma que nas raças personalizadas.

Recarregar e validar

  1. Salve seu arquivo em <world save>/dragonminez/dialogues/.
  2. Valide a sintaxe JSON (veja Como usar JSON).
  3. Execute /dmzreload story; veja Recarregar e atualizar mudanças.
  4. Confira o console do servidor: ele registra quantas árvores foram carregadas e aponta qualquer nó, opção ou ação que tenha sido ignorado.
  5. Fale com o NPC e percorra todos os ramos, incluindo as opções que dependem de condições.