Posicionamento e índole de NPCs

De DragonMineZ Wiki
Esta página é uma versão traduzida da página NPC Placement and Alignment e a tradução está 100% completa.

Posicionamento e índole de NPCs trata dos arquivos que decidem onde ficam os NPCs mestres e treinadores e como a índole de um jogador muda a forma como cada NPC o trata. Isso é feito por dois arquivos JSON relacionados de cada mundo, ambos em <world save>/dragonminez/npcs/, além de um formato de datapack para os NPCs que vivem dentro de estruturas.

Arquivo O que controla
placements.json Onde os NPCs mestres e treinadores aparecem (posição, dimensão, índole ou relação inicial).
alignment_rules.json Como a índole do jogador afeta a hostilidade, a simpatia e a disponibilidade para interação de cada NPC.

Os dois arquivos são carregados quando o servidor inicia e recarregados com /dmzreload config (ou /dmzreload all); veja Recarregar e atualizar mudanças. Uma recarga também reaplica os posicionamentos em todas as dimensões carregadas.

Mundos antigos mantêm seus arquivos antigos Os dois arquivos só são criados com os valores padrão do DragonMineZ quando não existem. Um mundo criado com uma versão anterior do DragonMineZ mantém seus arquivos antigos, então não recebe as novas entradas padrão (por exemplo, os NPCs do Outro Mundo da v2.2 e suas novas coordenadas). Para obter os padrões atuais, apague o arquivo (faça backup antes se você o editou) e execute /dmzreload config.

Posicionamento de NPCs

placements.json lista todos os NPCs que o DragonMineZ coloca e onde.

Código-fonte: src/main/java/com/dragonminez/server/world/npc/NPCPlacementManager.java.

{
  "schema": 1,
  "placements": [
    {
      "id": "master_roshi",
      "entity": "dragonminez:master_roshi",
      "dimension": "minecraft:overworld",
      "structure": "roshi_house",
      "x": 0.0,
      "y": 0.0,
      "z": 0.0,
      "yaw": 225.0,
      "pitch": 0.0,
      "surface": true,
      "relative_to_spawn": false,
      "enabled": true,
      "override": false
    }
  ]
}
Campo Tipo O que faz
id Texto Id único do posicionamento. Ele é marcado na entidade gerada para que o DragonMineZ possa encontrá-la e atualizá-la depois. Se dois posicionamentos têm o mesmo id, vale o último do arquivo (um aviso é registrado no log).
entity Texto Id de registro do tipo de entidade.
dimension Texto Padrão: minecraft:overworld.
npc_id Texto Só tem efeito para entidades dragonminez:quest_npc: liga ao id de NPC do sistema de missões.
model / texture Texto Usado apenas para entidades quest_npc.
structure Texto Se definido, x, y e z passam a ser um deslocamento a partir da origem dessa estrutura, em vez de coordenadas do mundo. Valores válidos: roshi_house, goku_house, elder_guru, timechamber, kamilookout, gero_lab. Um valor não reconhecido faz x, y e z serem tratados como coordenadas brutas do mundo (com um aviso no log).
x, y, z Número Coordenadas do mundo, ou o deslocamento a partir da estrutura (veja acima). Padrões: 0.5, 64.0, 0.5.
yaw, pitch Número Direção para onde olha, em graus.
surface Booleano Se for true, ajusta o Y à superfície do terreno ao carregar, em vez de usar o Y informado.
relative_to_spawn Booleano Se for true, soma o ponto de spawn do mundo a x e z (aplicado depois de qualquer deslocamento de estrutura).
enabled Booleano Se for false, este posicionamento é totalmente ignorado.
override Booleano Se for true, a entidade é sempre gerada de novo, mesmo que já exista uma para este id. Caso contrário, a entidade existente é só atualizada no lugar.
alignment Inteiro (0–100) Índole opcional para este NPC específico: acima de 60 ele é amigável, de 41 a 60 neutro e com 40 ou menos hostil (a menos que uma regra de índole o torne hostil antes, veja abaixo).
relation Texto Substituição opcional para esta instância (HOSTILE, NEUTRAL ou FRIENDLY), guardada na própria entidade em vez de ser consultada nas regras de índole.

Chaves desconhecidas são indicadas no relatório de carregamento do JSON.

Posicionamentos padrão

O arquivo padrão gera ativamente estes NPCs:

Id do posicionamento Entidade Onde
master_roshi dragonminez:master_roshi Casa do Kame
master_goku dragonminez:master_goku Casa do Goku
master_karin, master_dende, master_popo dragonminez:master_karin, master_dende, master_popo Mirante de Kami
master_gero dragonminez:master_gero Laboratório do Dr. Gero
master_guru dragonminez:master_guru Casa do Grande Ancião (Namekusei)
master_kaiosama dragonminez:master_kaiosama Outro Mundo, 54.5 299 1031.5
master_toribot dragonminez:master_toribot Outro Mundo, 50.5 298 1030.5
master_enma dragonminez:master_enma Outro Mundo, 0.5 150 17.5
master_baba dragonminez:master_uranai Outro Mundo, 9.5 150 3.5
master_grandkai dragonminez:master_grandkai Outro Mundo, -30.5 150 12.5
npc_hell_ogre dragonminez:quest_npc (npc_id hell_ogre) Outro Mundo, 9.5 150 16.5
master_otherworld_announcer dragonminez:master_otherworld_announcer Arena do Torneio do Outro Mundo, -25.5 352 -1164.5 (só é colocado depois que a arena do torneio é construída)

NPCs de missões e NPCs mestres

Os NPCs de missões (Bulma, Kuririn, Yamcha, Tenshinhan, Piccolo, Gohan, Vegeta, Trunks, Chi-Chi, Videl, Shin e o Ancião Namekuseijin) também aparecem no arquivo padrão, mas com "enabled": false: eles não são mais gerados durante o jogo por este sistema. Eles estão embutidos diretamente no NBT da estrutura, então ficam em pontos fixos colocados à mão, em vez de se amontoarem no spawn do mundo. As entradas deles aqui são apenas para referência. Os NPCs adicionados a uma estrutura depois que o NBT dela foi feito vêm dos arquivos de NPCs de estruturas (a Chi-Chi na Casa do Goku é um deles).

Os NPCs do Outro Mundo (master_kaiosama, master_enma, master_baba, master_toribot, master_grandkai, master_otherworld_announcer e npc_hell_ogre) sempre forçam override: true internamente, independentemente do que diz o arquivo, já que precisam existir de forma confiável em uma dimensão gerada. Veja Outro Mundo.

NPCs de estruturas

Os arquivos de NPCs de estruturas colocam NPCs dentro de uma estrutura do DragonMineZ sem editar o arquivo .nbt dela. Diferente dos arquivos acima, estes são arquivos de datapack: data/<namespace>/structure_npcs/*.json, um por estrutura, carregados com os datapacks (e pelo /reload).

{
  "structure": "dragonminez:goku_house",
  "npcs": [
    {
      "id": "npc_chi_chi",
      "entity": "dragonminez:quest_npc",
      "npc_id": "chi_chi",
      "model": "saga_videl",
      "texture": "saga_chichi",
      "pos": [67.5, 5.0, 50.5],
      "yaw": 90.0
    }
  ]
}
Campo Obrigatório O que faz
structure Sim Id da estrutura à qual os NPCs pertencem.
id Sim Id único deste NPC dentro da estrutura. Ele também é a chave de rastreamento, então não o renomeie depois que mundos já o usarem.
entity Sim Tipo de entidade a ser gerada (por exemplo, dragonminez:quest_npc ou o id de entidade de um mestre).
npc_id Não Id do NPC de missões, para dragonminez:quest_npc.
model, texture Não Nomes de modelo e textura para os NPCs de missões.
template Não O template da estrutura ao qual a posição é relativa, para estruturas formadas por várias peças.
pos Sim Posição relativa ao template da estrutura, então ela fica certa qualquer que seja a rotação com que a estrutura foi gerada.
yaw Não Orientação, também relativa ao template (padrão 0).
alignment, relation Não Índole e relação iniciais, como em placements.json.

Cada NPC aparece uma vez por estrutura gerada quando o chunk dela carrega, incluindo estruturas geradas antes de o arquivo existir, e o spawn fica registrado: um NPC que morre não volta.

Para obter as coordenadas, fique onde o NPC deve estar e execute /dmzstructure here: ele mostra a estrutura, o template dela e sua posição e yaw relativos ao template, com um botão Copy NPC JSON que copia uma entrada pronta. /dmzstructure npcs lista os NPCs da estrutura em que você está e se cada um já apareceu. Os dois comandos exigem a permissão dragonminez.dmzstructure (veja Permissões).

Regras de índole de NPCs

Veja também: Índole, Mestres

alignment_rules.json decide como cada NPC reage à índole do jogador.

Código-fonte: src/main/java/com/dragonminez/common/alignment/NpcAlignmentRules.java.

{
  "npcs": {
    "goku": {
      "default_relation": "FRIENDLY",
      "interaction": { "min_alignment": 61 },
      "hostile_below": 25
    },
    "gero": {
      "default_relation": "NEUTRAL",
      "interaction": { "max_alignment": 60 }
    }
  }
}

As chaves em npcs são ids de NPC sem nenhum namespace (dragonminez:roshi vira a chave roshi).

Campo Tipo O que faz
default_relation HOSTILE / NEUTRAL / FRIENDLY Relação base quando nenhum dos limites abaixo a substitui. Padrão: NEUTRAL.
hostile_below Inteiro Se a índole do jogador estiver abaixo deste valor, o NPC fica hostil independentemente de default_relation.
hostile_above Inteiro O mesmo, mas para uma índole acima deste valor.
interaction.min_alignment Inteiro Abaixo desta índole o NPC continua falando com o jogador, mas o cumprimenta com frieza, e as missões secundárias dele aparecem bloqueadas (missões de saga, missões com a própria condição de índole e missões já em andamento continuam disponíveis). Também pode ser escrito direto na regra, sem o invólucro interaction.
interaction.max_alignment Inteiro O mesmo, mas como limite superior.

Os quatro campos de limite são opcionais: omita os que não se aplicam. Usando a entrada goku acima como exemplo: com índole abaixo de 25, o Goku é hostil; de 25 a 60 ele continua falando com você, mas com frieza, e as missões secundárias dele continuam bloqueadas (a índole está abaixo do min_alignment de 61); com 61 ou mais ele é amigável e tudo fica disponível.

NpcDispositionService.getRelation() verifica a relação nesta ordem:

  1. Uma relation definida no posicionamento (placements.json) tem prioridade.
  2. Os limites hostile_below e hostile_above da regra.
  3. Um alignment definido no posicionamento.
  4. O default_relation da regra.

NPCs mestres

Para os NPCs mestres e treinadores, o arquivo de regras decide a hostilidade, mas o filtro de índole deles é uma regra fixa em vez de interaction: sempre dá para falar com os mestres, mas Goku, Gohan, Rei Kai, Velho Kaioshin, Mestre Kame e Kuririn só liberam Habilidades, Treinar e as missões novas com uma índole de pelo menos 61, e Cell e Freeza com 40 ou menos. Nenhum outro mestre tem filtro de índole. Veja Mestres.

Ids de NPC incluídos por padrão

O arquivo padrão inclui goku, roshi, karin, guru, dende, popo, kingkai, gero, enma, baba, toribot, grandkai, otherworld_announcer, bulma, krillin, yamcha, tien, chiaotzu, gohan, trunks, chi_chi, videl, namek_elder, shin, piccolo e vegeta.

  • A maioria usa por padrão FRIENDLY com min_alignment: 41 (ou 61 para Goku, Guru, Dende, Rei Kai e o Ancião Namekuseijin) e hostile_below: 25.
  • gero usa por padrão NEUTRAL com max_alignment: 60.
  • enma, baba, toribot, grandkai, otherworld_announcer e vegeta usam por padrão NEUTRAL sem limites.
  • piccolo usa por padrão NEUTRAL com limites próprios (min_alignment: 41, hostile_below: 20).

Recarregar e validar

  1. Edite os arquivos em <world save>/dragonminez/npcs/.
  2. Valide a sintaxe JSON (veja Como usar JSON).
  3. Execute /dmzreload config (ou /dmzreload all); veja Recarregar e atualizar mudanças.
  4. Confira se o NPC apareceu ou se moveu como esperado, e se a hostilidade e a interação conforme a índole se comportam como configurado (teste com alguns valores de índole, se puder).