Posicionamento e índole de NPCs
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.
/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
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 | O jogador precisa de pelo menos esta índole para falar com o NPC. Mesmo que o NPC não seja hostil, uma índole baixa o suficiente ainda bloqueia a interação. 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 está presente, mas não conversa (a índole está abaixo do min_alignment de 61); com 61 ou mais ele é amigável e dá para falar com ele.
NpcDispositionService.getRelation() verifica a relação nesta ordem:
- Uma
relationdefinida no posicionamento (placements.json) tem prioridade. - Os limites
hostile_belowehostile_aboveda regra. - Um
alignmentdefinido no posicionamento. - O
default_relationda 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
FRIENDLYcommin_alignment: 41(ou61para Goku, Guru, Dende, Rei Kai e o Ancião Namekuseijin) ehostile_below: 25. gerousa por padrãoNEUTRALcommax_alignment: 60.enma,baba,toribot,grandkai,otherworld_announcerevegetausam por padrãoNEUTRALsem limites.piccolousa por padrãoNEUTRALcom limites próprios (min_alignment: 41,hostile_below: 20).
Recarregar e validar
- Edite os arquivos em
<world save>/dragonminez/npcs/. - Valide a sintaxe JSON (veja Como usar JSON).
- Execute
/dmzreload config(ou/dmzreload all); veja Recarregar e atualizar mudanças. - 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).