Saltar para o conteúdo principal

Criar Quests

webapp_banner.jpg

Quest de exemplo​

Este exemplo simplificado segue o formato do ficheiro incluído test_quest.yml.

Cria ficheiros .yml com nomes únicos em plugins/EliteMobs/customquests/, a partir da pasta do servidor. Carrega a quest e os conteúdos referenciados com /em reload e atribui-a a um NPC como se explica abaixo.

test_quest.yml

isEnabled: true
customObjectives:
Objective1:
amount: '1'
filename: test_boss.yml
objectiveType: KILL_CUSTOM
customRewards:
- filename=magmaguys_toothpick.yml:amount=1:chance=1
name: "&aKill the Test Boss"
questLore:
- "&cEnd the test boss' reign of terror!"

create_quest_quest.jpg

A imagem mostra a antiga interface de livro. /em alt altera a preferência de menu: os jogadores Java com essa preferência recebem livros antes do Minecraft 1.21.6 e diálogos do Minecraft nas versões mais recentes. Os jogadores Bedrock e quem prefere menus de inventário recebem uma interface de inventário.

Esta quest de exemplo dará aos jogadores a tarefa de derrotar 1 test_boss.yml. (O nome real do boss apresentado no rastreador de quests será o name: definido no test_boss.yml.) E, como recompensa por completar a quest, eles serão recompensados com 1 Magmaguy's Toothpick.

Os objetivos ficam ativos em simultâneo quando a quest é aceite; chaves como Objective1 e Objective2 não impõem uma ordem. É necessário cumprir todos para receber recompensas. Por predefinição, o jogador entrega depois a quest ao NPC. Com requireQuestTurnIn: false em Quests.yml, cumprir os objetivos tenta concluir imediatamente, incluindo verificar e consumir os itens de recolha. maximumActiveQuests limita as quests aceites a 10 por predefinição.

Criar quests personalizadas​

isEnabled​

Define se a quest está ativada.

ChaveValoresPredefinição
isEnabledBooleanotrue
Exemplo
isEnabled: true

customObjectives​

Define os objetivos da quest.

ChaveValoresPredefinição
customObjectivesEspecial [1]nenhum

Num boss com várias fases, referencia o ficheiro da primeira fase. O progresso é atribuído quando o boss morre, não em cada transição. KILL_CUSTOM compara o nome do ficheiro e não exige questLevel como nível mínimo do boss abatido.

Exemplos

KILL_CUSTOM:

customObjectives:
Objective1:
amount: '1'
filename: my_cool_boss.yml
objectiveType: KILL_CUSTOM

DIALOG:

customObjectives:
Objective1:
dialog:
- "&a[Dialog NPC] &fCome here often?"
- "&7&oI should eat more apples."
filename: dialog_npc.yml
npcName: Dialog NPC
location: at dialog location.
objectiveType: DIALOG

FETCH_ITEM:

Os objetivos de recolha contam as etiquetas de itens personalizados do EliteMobs no inventário. Ao entregar a quest, todos são verificados contra uma única cópia do inventário antes de remover itens ou conceder recompensas. Se dois objetivos pedirem o mesmo item, são necessárias as quantidades somadas; a mesma pilha não pode satisfazer ambos. Largar um item pode voltar a tornar incompleto um objetivo.

customObjectives:
Objective1:
amount: '99'
itemName: Red Apples
filename: my_quest_item_red_apples.yml
objectiveType: FETCH_ITEM

ARENA:

customObjectives:
Objective1:
objectiveType: ARENA
filename: my_arena.yml
name: "Complete the Arena"

create_quest_objective.jpg

Especial [1]

Expandir Tabela

Os Objetivos Personalizados são construídos usando os seguintes valores:

ChaveDescrição
objectiveTypeTipo de objetivo: KILL_CUSTOM abate um boss personalizado, FETCH_ITEM reúne um item personalizado, DIALOG fala com um NPC, ARENA conclui uma arena e CLASS_UNLOCK observa o desbloqueio de uma classe.
filenameNome obrigatório do ficheiro .yml do boss, item, NPC de diálogo, arena ou treinador. Usa uma definição carregada, não o nome apresentado. Um objetivo sem filename, ou com um objectiveType em falta ou desconhecido, desativa a quest inteira com um aviso na consola. Um CLASS_UNLOCK inválido continua na quest, mas não pode ser concluído. Corrige todos os avisos antes de oferecer a quest.
amountNúmero inteiro positivo de bosses a abater ou itens a reunir; predefinição 1. Um valor inferior a 1 desativa a quest. DIALOG, ARENA e CLASS_UNLOCK têm uma meta de um e ignoram este campo.
dialogApenas DIALOG: linhas ditas pelo NPC quando o jogador interage com ele.
locationApenas DIALOG: pista textual sobre a localização do NPC, apresentada como $location no resumo do menu.
name / npcName / itemNameNomes alternativos do campo de texto de FETCH_ITEM, DIALOG, ARENA e CLASS_UNLOCK. Define apenas um. Todos são traduzíveis e permitem uma descrição própria ou ocultar informação. Sem substituição, FETCH_ITEM usa o nome traduzido do item e DIALOG o do NPC. KILL_CUSTOM usa o nome configurado do boss.
classApenas CLASS_UNLOCK: ID da forma de classe observada, por exemplo adventurer.

Fornece um mapa customObjectives não vazio, com uma chave única por objetivo (Objective1, Objective2, ...). Os campos distinguem maiúsculas de minúsculas e os tipos usam os valores em maiúsculas indicados acima. Ficheiros antigos com entradas como KILL_CUSTOM:filename=X.yml:amount=Y são convertidos automaticamente para este formato no primeiro carregamento e guardados em disco.

As descrições dos objetivos têm entradas de tradução próprias, identificadas pelo ficheiro da quest e por um caminho como customObjectives.Objective1.itemName. Traduz essa entrada do CSV mesmo que o item já tenha tradução. Sem tradução, mantém-se a descrição original para não revelar um nome oculto. O texto de origem permanece no YAML e as traduções existentes são preservadas.


Comportamento de FETCH_ITEM

FETCH_ITEM identifica a etiqueta do ficheiro do item, não o material, nome visível ou descrição. Contam itens obtidos antes de aceitar a quest, incluindo os espaços de armadura e a mão secundária. Aceitar, apanhar ou largar itens correspondentes e receber recompensas de quests agenda uma recontagem no tick seguinte. Outras alterações do inventário podem não atualizar imediatamente a apresentação, mas a entrega verifica sempre o inventário novamente. Se tiver sucesso, consome os itens necessários; uma quantidade combinada insuficiente cancela a entrega sem remoção parcial.

DIALOG avança ao interagir com um NPC correspondente, antes de abrir o seu menu habitual. Não exige terminar de ler o diálogo. location é apenas uma pista textual, não coordenadas para a bússola. ARENA avança quando o jogador conclui a arena indicada com a quest ativa; conclusões anteriores não contam retroativamente.

Objetivos de desbloqueio de classe​

CLASS_UNLOCK observa uma classe desbloqueada pelo Sistema de Combate Avançado. Não concede a classe. Por exemplo:

customObjectives:
Objective1:
objectiveType: CLASS_UNLOCK
class: adventurer
filename: class_trainer_adventurer.yml

class deve identificar uma forma existente. filename orienta o acompanhamento para o treinador; name substitui opcionalmente o texto apresentado. A meta é um e reconhece classes desbloqueadas antes de aceitar, mesmo que não estejam equipadas. A progressão de classes deve estar disponível e o desbloqueio é verificado novamente na conclusão. Uma classe inválida ou a falta do ficheiro do treinador deixa um objetivo impossível de concluir; não é ignorado.

Acompanhamento e abandono​

Cada jogador só pode acompanhar uma quest. Com autoTrackNextQuestOnCompletion: true em Quests.yml, concluir a quest acompanhada seleciona outra ativa que permita acompanhamento no tick seguinte. questAutoTrackNextMessage aceita $questName. autoTrackQuestsOnAccept também é true por predefinição, mas atualmente usa a função de alternância: aceitar outra quest enquanto uma já é acompanhada pode parar o acompanhamento em vez de o mudar. Se necessário, volta a selecioná-lo no menu.

A bússola procura destinos suportados: bosses personalizados, NPCs de diálogo ou treinadores, e bosses ou baús cujas tabelas de loot incluam o item pedido. Não encontra todas as fontes possíveis de itens; objetivos de arena ou abate dinâmico não têm uma pesquisa de destino própria. Para outro mundo, pode apontar para um portal direto adequado ou indicar o mundo de destino, sem garantir um caminho transitável. A ausência de destino não impede o progresso.

A ação normal de abandonar pede uma segunda confirmação. O texto e a descrição usam questAbandonConfirmationText e questAbandonConfirmationHover. Abandonar remove a quest ativa e o acompanhamento, mas não inicia o bloqueio de conclusão de questLockoutMinutes nem concede o marcador de conclusão. A quest pode ser aceite novamente se cumprir as condições habituais.

Os indicadores de quest dos NPCs são pessoais e aparecem a menos de 30 blocos. A bússola inclui indicações verticais. Durante o diálogo por barras de boss, a área é exclusiva: outras barras geridas são ocultadas e a antiga opção hideKeyedBossBarsDuringQuestDialogue é removida. hideQuestScoreboardDuringQuestDialogue controla separadamente o painel lateral.

Em Java, agachar revela a página atual e depois permite avançar. O diálogo aplica Lentidão III durante um máximo de 30 segundos, sem imobilizar o jogador. Sofrer dano não cancelado superior a zero fecha os ecrãs e o diálogo da quest. Bedrock recebe este diálogo no chat. A imagem do diálogo exige os recursos correspondentes do pacote de recursos.

customRewards​

Define as recompensas da quest.

ChaveValoresPredefinição
customRewardsFormato universal de loot do EliteMobsnenhum
Exemplo
customRewards:
- currencyAmount=50:amount=1:chance=0.05
- material=COOKED_COD:amount=3:chance=1.0
- filename=magmaguys_toothpick.yml:amount=1:chance=1.0

create_quest_rewards.jpg

As quests personalizadas não geram entradas de recompensa automaticamente. Se customRewards estiver vazio, a tabela não concede itens nem moeda; os comandos de conclusão definidos separadamente continuam a executar. As recompensas automáticas aplicam-se às quests dinâmicas.

As recompensas de itens escaláveis usam o nível selecionado da masmorra dinâmica ou o nível de combate atual, com 10 % de probabilidade de somar um. Itens fixos e limitados mantêm as suas regras de escala. questLevel não define o nível real do item.

As recompensas são entregues diretamente: os itens entram no inventário, o que não couber cai aos pés do jogador e a moeda é adicionada ao saldo. Para executar comandos, usa questCompleteCommands em vez de uma entrada de loot command=.

A pré-visualização e a entrega fazem sorteios separados. Um item aleatório ou nível adicional apresentado não fica reservado para o jogador.


questAcceptPermission​

Exige um marcador de conclusão de quest do EliteMobs antes da aceitação. Uma permissão normal com o mesmo nome não satisfaz a verificação.

ChaveValoresPredefinição
questAcceptPermissionTextonenhum
Exemplo
questAcceptPermission: elitequest.my_permission

questAcceptPermissions​

Exige todos os marcadores de conclusão listados. Se também estiver definido questAcceptPermission, esse marcador é necessário além da lista.

ChaveValoresPredefinição
questAcceptPermissionsLista de textosnenhum
Exemplo
questAcceptPermissions: 
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml

questLockoutPermission​

Define o marcador concedido depois de concluir com sucesso. Pode desbloquear quests seguintes e, com questLockoutMinutes igual ou inferior a zero, impede repetir esta. Omitir o marcador não desativa um bloqueio temporal positivo.

ChaveValoresPredefinição
questLockoutPermissionTextonenhum
Exemplo
questLockoutPermission: elitequest.my_quest.yml

questLockoutMinutes​

Define quantos minutos o jogador tem de esperar antes de repetir a quest.

ChaveValoresPredefinição
questLockoutMinutesInteiro-1 (regra do marcador abaixo)

Existem dois sistemas de bloqueio:

  • Acima de 0, o controlo temporal bloqueia a quest durante esse número de minutos após a entrega e apresenta o tempo restante. A disponibilidade ignora então questLockoutPermission.
  • 0 ou menos usa o marcador questLockoutPermission, concedido permanentemente na conclusão. Sem esse marcador, a quest continua repetível.

Se ambos os campos estiverem definidos com duração positiva, o marcador continua a ser concedido, mas expira após essa duração. Uma quest seguinte que o exija deve ser aceite antes de expirar. O bloqueio temporal é guardado pelo nome do ficheiro da quest, separado do marcador de requisitos.

Exemplo
questLockoutMinutes: 60

name​

Define o nome da quest. Aceita códigos de cor.

ChaveValoresPredefinição
nameTextovazio
Exemplo
name: "&aMy Great Quest Name"

questLore​

Define a descrição (lore) da quest que aparecerá no menu de quests no jogo.

ChaveValoresPredefinição
questLoreLista de textosnenhum
Exemplo
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

create_quest_lore.jpg


temporaryPermissions​

Concede permissões Bukkit reais quando o jogador aceita a quest e reaplica-as quando uma quest ativa é restaurada após iniciar sessão. Concluir ou abandonar a quest remove-as, e terminar sessão liberta-as até ao próximo início de sessão. Cada quest concede os seus nós separadamente, pelo que duas quests ativas podem partilhar um nó: terminar uma delas mantém o nó concedido pela outra.

Para a geração normal, configura a mesma permissão no item. Esta verificação não cobre todas as formas de entrega.

ChaveValoresPredefinição
temporaryPermissionsLista de textosnenhum
Exemplo
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml

questAcceptDialog​

Define o diálogo que aparece no chat ao aceitar a quest.

Com diálogos por barras de boss ativados, esta lista também é dita pelo NPC antes da aceitação. Se estiver vazia, usa-se questLore para esse diálogo.

ChaveValoresPredefinição
questAcceptDialogLista de textosnenhum
Exemplo
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

create_quest_accept.jpg


questCompleteMessage​

Define o diálogo da entrega. Com useQuestDialogueBossBars em Quests.yml, pode aparecer antes de abrir o menu de entrega; caso contrário, aparece ao concluir com sucesso. Um diálogo de entrega mostrado recentemente não é repetido na conclusão. Bedrock recebe texto no chat. Ver o diálogo não prova, por si só, que a recompensa foi entregue.

ChaveValoresPredefinição
questCompleteMessageLista de textosnenhum
Exemplo
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

create_quest_complete.jpg


questCompleteCommands​

Define os comandos executados na conclusão. São enviados pela consola: não uses uma barra inicial nem dependas das permissões do jogador.

Placeholders suportados: $player para o nome do jogador, $getWorld para o mundo atual e $getX, $getY, $getZ para as coordenadas.

ChaveValoresPredefinição
questCompleteCommandsLista de textosnenhum
Exemplo
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1

create_quest_commands.jpg


turnInNPC​

Define o ficheiro do NPC ao qual entregar a quest. Pode ser diferente de quem a oferece; se for omitido, usa-se o NPC original. Um NPC de entrega separado deve usar interactionType: CUSTOM_QUEST_GIVER, podendo ter uma lista de ofertas vazia.

ChaveValoresPredefinição
turnInNPCNome de ficheironenhum
Exemplo
turnInNPC: my_cool_quest_npc.yml

NPCs que oferecem quests​

Para atribuir uma quest a um NPC que a dará aos jogadores, precisas de configurar o ficheiro do NPC, não o ficheiro da quest.

No ficheiro do NPC (plugins/EliteMobs/npcs/), adiciona:

interactionType: CUSTOM_QUEST_GIVER
questFileName:
- my_quest.yml

Para NPCs que dão várias quests:

interactionType: CUSTOM_QUEST_GIVER
questFileName:
- quest_one.yml
- quest_two.yml

Usa uma lista YAML mesmo para uma só quest; o valor escalar questFileName: my_quest.yml não é carregado como lista de ofertas. Para a abrir é necessário interactionType: CUSTOM_QUEST_GIVER.

Consulta a documentação de criação de NPCs para mais informações sobre como configurar NPCs.


trackable​

Permite acompanhamento manual e automático pela bússola. false não impede o progresso dos objetivos, as recompensas ou os painéis temporários de progresso.

ChaveValoresPredefinição
trackableBooleanotrue
Exemplo
trackable: true

questLevel​

Define o nível da quest. Isto é apenas um guia visual para que os jogadores saibam quão desafiante a quest será. Isto não modifica de forma alguma os níveis de bosses, itens ou outros.

ChaveValoresPredefinição
questLevelInteiro0
Exemplo
questLevel: 10

create_quest_level.jpg


questAcceptSound​

Define o som ao aceitar a quest, do Minecraft ou de um pacote de recursos. Se for omitido, usa-se o som global de aceitação de SoundsConfig.

ChaveValoresPredefinição
questAcceptSoundTextonenhum
Exemplo
questAcceptSound: entity.experience_orb.pickup

create_quest_level.jpg


questCompleteSound​

Define o som ao concluir a quest, do Minecraft ou de um pacote de recursos. Se for omitido, usa-se o som global de conclusão de SoundsConfig.

ChaveValoresPredefinição
questCompleteSoundTextonenhum
Exemplo
questCompleteSound: entity.player.levelup

create_quest_level.jpg


Tradução​

Os seguintes campos suportam localização para servidores multilíngues:

  • name
  • questLore
  • questAcceptDialog
  • questCompleteMessage
  • Em cada entrada de customObjectives: dialog, name, npcName, itemName e location

Isto permite-te fornecer traduções para diferentes idiomas no teu servidor.


Permissões​

As permissões são textos ou listas de textos. Os exemplos seguintes mostram como bloquear e desbloquear quests.

Importante: questAcceptPermission e questAcceptPermissions verificam marcadores internos do EliteMobs, não permissões normais. Concluir uma quest com o questLockoutPermission correspondente cria o marcador. Conceder o mesmo nome pelo LuckPerms não desbloqueia a quest. temporaryPermissions, por sua vez, concede permissões reais enquanto a quest está ativa.

Digamos que estás a criar a quest_3 numa série de quests que planeaste e não queres que os jogadores possam aceitar a quest_3 antes de terminarem a quest_2. Configuraríamos o ficheiro da quest assim:

questAcceptPermission: elitequest.quest_2.yml
questLockoutPermission: elitequest.quest_3.yml

A quest 2 deve conceder elitequest.quest_2.yml pelo seu próprio questLockoutPermission. A quest 3 exige esse marcador com questAcceptPermission. Com a duração não positiva por predefinição, concluir a quest 3 concede o seu marcador permanente e impede repetições. Oferecer uma quest já ativa noutro NPC não cria uma segunda cópia independente.

Caso queiras criar uma quest que só fica disponível depois de os jogadores terem completado uma série de quests, então configurarias o ficheiro da quest assim:

questAcceptPermissions: 
- elitequest.quest_2.yml
- elitequest.quest_3.yml
- elitequest.quest_4.yml

Para que aceitar a quest dê acesso à geração normal de um item, adiciona um nó a temporaryPermissions e usa-o também no campo permission do item.

Por exemplo, abriríamos o nosso ficheiro de quest e adicionaríamos o seguinte:

temporaryPermissions: 
- elitequest.my_cool_item.yml

Depois abriríamos o ficheiro do item, no nosso caso my_cool_item.yml, e então adicionaríamos o seguinte:

permission: elitequest.my_cool_item.yml

A quest concede agora o nó verificado na geração normal do item enquanto está ativa, e remove-o na conclusão ou no abandono.

Grupos e crédito de abate partilhado​

As quests continuam pessoais: aderir a um grupo não aceita, entrega ou recompensa quests de outros jogadores. Quando um membro recebe crédito por um abate, os membros online no mesmo mundo e dentro de sharedProgressRange (128 blocos por predefinição em Party.yml) também progridem nos seus objetivos ativos correspondentes, incluindo bosses personalizados.

Itens de recolha, diálogos e objetivos de arena não são partilhados. Os destinatários precisam da sua própria quest ativa correspondente e dos dados carregados. Se a sua partida já passou a espera ou o arranque, têm de pertencer à lista inicial de participantes. A verificação não compara separadamente a sua instância com a do abate; continua a exigir proximidade no mesmo mundo.

Quests dinâmicas​

As Quests Dinâmicas são quests geradas proceduralmente que são criadas e atualizadas automaticamente pelo EliteMobs. Ao contrário das quests personalizadas definidas em ficheiros de configuração, as quests dinâmicas não requerem configuração manual e adaptam-se à progressão de cada jogador.

Como funcionam​

  • NPC: usa interactionType: QUEST_GIVER. As ofertas vêm do conjunto dinâmico, não de questFileName.
  • Tier: limita o nível de combate a 1–100, divide por cinco com divisão inteira e limita o tier a 1–20. O nível 45 usa o tier 9. O tier determina as opções e a quantidade de abates; o nível mínimo dos inimigos usa o nível de combate limitado do jogador.
  • Três modelos por tier: cada modelo escolhe um tipo de entidade de questEntityTypes em Quests.yml. Tipos de entidade desconhecidos e tipos sem propriedades de mob do EliteMobs são ignorados com um aviso, e uma lista sem entradas utilizáveis desativa as ofertas de quests dinâmicas. Cada modelo escolhe também uma quantidade de abates entre tier + 1 e tier * 10, inclusive. O Elite Mob correspondente deve atingir ou ultrapassar o nível mínimo; um mob normal do Minecraft não conta.
  • Atualização: os modelos renovam-se a cada 1200 ticks, cerca de 60 segundos a 20 TPS. As quests existentes e o progresso são preservados. O menu combina-as com os três modelos do tier atual, evitando IDs de modelo duplicados; não tem necessariamente três entradas.
  • Masmorras dinâmicas: entrar atualiza o nível mínimo do inimigo, o nível apresentado e o nome das quests dinâmicas existentes para o nível selecionado, limitado a 1–100. Preserva quantidades e progresso. Não recalcula a recompensa monetária.
  • Recompensas: a moeda é fixada ao criar a oferta como floor(questLevel / 2 * targetKillCount). O item é gerado pelo sistema normal de loot na entrega, usando o nível selecionado da masmorra dinâmica ou o nível de combate atual, com 10 % de probabilidade de somar um e um limite final de 1–100. Aplicam-se as regras de disponibilidade e escala; a pré-visualização faz um sorteio separado.