Saltar al contenido principal

Crear Misiones

webapp_banner.jpg

Misión de Ejemplo

EliteMobs viene preempaquetado con un test_quest.yml, que se analizará aquí como un formato de misión sencillo a seguir.

¡Las Misiones Personalizadas están en la carpeta ~plugins/EliteMobs/customquests!

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

Si tu interfaz de misiones no se ve así, puedes cambiarla para que coincida usando /em alt.

Esta misión de ejemplo dará a los jugadores la tarea de matar 1 test_boss.yml. (El nombre real del boss mostrado en el rastreador de misiones será el name: establecido en test_boss.yml.) Y como recompensa por completar la misión serán recompensados con 1 Magmaguy's Toothpick.

Crear Misiones Personalizadas

isEnabled

Establece si la misión está habilitada.

KeyValuesDefault
isEnabledBooleantrue
Ejemplo
isEnabled: true

customObjectives

Establece los objetivos de la misión.

KeyValuesDefault
customObjectivesSpecial [1]none

Nota: Si usas un boss multifase como tu objetivo, entonces el objetivo debería usar la primera fase como objetivo.

Ejemplos

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:

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

Special [1]

Expandir Tabla

Los Objetivos Personalizados se construyen usando los siguientes valores:

KeyDescripción
objectiveTypeSe usa para establecer el tipo de objetivo que representa. Los valores válidos son KILL_CUSTOM, FETCH_ITEM, DIALOG y ARENA. KILL_CUSTOM indica que la misión implica matar a un Boss Personalizado específico, FETCH_ITEM indica que la misión implica conseguir un Objeto Personalizado específico, DIALOG indica que la misión implica hablar con un NPC, y ARENA indica que la misión implica completar una arena específica.
filenameSe usa para establecer el nombre de archivo del Boss Personalizado, del Objeto Personalizado que el jugador tiene que matar / obtener, del NPC con el que tienen que hablar, o de la arena que deben completar. Obligatorio: un objetivo sin filename se descarta con una advertencia en la consola.
amountSe usa para establecer la cantidad de Bosses Personalizados que deben matarse o de objetos que deben obtenerse. Por defecto es 1 si no se especifica. Lo ignoran DIALOG (siempre 1) y ARENA.
dialogSolo DIALOG: las líneas que dice el NPC cuando el jugador habla con él.
locationSolo DIALOG: una pista en texto libre sobre dónde está el NPC, mostrada como $location en la línea de resumen del menú de misiones.
name / npcName / itemNameTres nombres intercambiables para el mismo campo: el nombre visible del objetivo en el rastreador de misiones y en los menús. Solo con fines visuales; usa el que mejor encaje con el tipo de objetivo. En FETCH_ITEM, omitirlo hace que se recurra al name configurado en el archivo del objeto personalizado.

Cada objetivo vive bajo su propia clave dentro de customObjectives (Objective1, Objective2, ...) y sus campos son claves YAML normales. Los archivos de misión antiguos que usaban el formato de cadena de una sola línea KILL_CUSTOM:filename=X.yml:amount=Y se convierten automáticamente a esta disposición en la primera carga y se guardan de vuelta en el disco.

Comportamiento de FETCH_ITEM

El progreso de FETCH_ITEM se vuelve a contar a partir del inventario del jugador cada vez que recoge o suelta un objeto, cuando se acepta la misión y cuando intenta entregarla, de modo que los objetos obtenidos antes de aceptar la misión también cuentan. El jugador debe seguir teniendo la cantidad requerida en el momento de la entrega: si no es así, la entrega se cancela. En una entrega correcta, los objetos de la misión se consumen del inventario del jugador.


customRewards

Establece las recompensas de la misión.

KeyValuesDefault
customRewardsFormato universal de botín de EliteMobsnone
Ejemplo
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

Nota: Las misiones personalizadas no generan recompensas automáticamente. Si dejas customRewards vacío, la misión no otorga nada al completarse, así que define siempre las recompensas de forma explícita. (Las recompensas automáticas escaladas por nivel — moneda y objetos según la dificultad de la misión — solo se aplican a las Misiones Dinámicas generadas proceduralmente, no a las misiones personalizadas definidas en configuración.)

Las recompensas de misión se entregan directamente: los objetos van al inventario del jugador (lo que no quepa se suelta a sus pies) y la moneda se añade a su saldo. Para ejecutar comandos al completarse, usa questCompleteCommands en lugar de una entrada de botín command=.


questAcceptPermission

Establece el permiso que el jugador debe tener para poder aceptar la misión.

KeyValuesDefault
questAcceptPermissionStringnone
Ejemplo
questAcceptPermission: elitequest.my_permission

questAcceptPermissions

Establece los permisos que el jugador debe tener para poder aceptar la misión.

KeyValuesDefault
questAcceptPermissionsString Listnone
Ejemplo
questAcceptPermissions: 
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml

questLockoutPermission

Establece el permiso que el jugador obtendrá al completar la misión, que le impedirá hacer la misión de nuevo. Si no se especifica, no se asigna ningún permiso de bloqueo y la misión permanece disponible.

KeyValuesDefault
questLockoutPermissionStringninguno
Ejemplo
questLockoutPermission: elitequest.my_quest.yml

questLockoutMinutes

Establece cuánto tiempo, en minutos, tendrá que esperar el jugador antes de poder hacer la misión de nuevo.

KeyValuesDefault
questLockoutMinutesInteger-1(nunca se repetirá)

Hay dos sistemas de bloqueo, y esta clave decide cuál se usa:

  • Cualquier valor superior a 0 usa el rastreador de bloqueo temporizado. El jugador queda bloqueado para esta misión durante esos minutos tras entregarla, se le indica cuánto queda cuando intenta volver a cogerla, y questLockoutPermission se ignora en la comprobación de disponibilidad.
  • 0 o menos recurre al marcador antiguo questLockoutPermission, que se otorga de forma permanente al completarla. Si tampoco hay ningún questLockoutPermission establecido, la misión sigue siendo repetible.
Ejemplo
questLockoutMinutes: 60

name

Establece el nombre de la misión. Acepta Color Codes.

KeyValuesDefault
nameStringninguno
Ejemplo
name: "&aMy Great Quest Name"

questLore

Establece la descripción (lore) de la misión que aparecerá en el menú de misiones del juego.

KeyValuesDefault
questLoreString Listnone
Ejemplo
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

create_quest_lore.jpg


temporaryPermissions

Establece los permisos asignados al jugador hasta que entregue la misión.

Si estás usando este ajuste para asegurarte de que un objeto solo caiga cuando los jugadores tengan una misión específica activa, también tendrás que configurar el mismo permiso en el archivo de configuración del objeto.

KeyValuesDefault
temporaryPermissionsString Listnone
Ejemplo
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml

questAcceptDialog

Establece el diálogo que aparece en el chat al aceptar la misión.

Cuando las barras de jefe de diálogo de misión están activadas, esta lista sirve además como el diálogo que pronuncia quien da la misión en el cuadro de diálogo antes de que se acepte. Si está vacía, se usa questLore para ese diálogo.

KeyValuesDefault
questAcceptDialogString Listnone
Ejemplo
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

create_quest_accept.jpg


questCompleteMessage

Establece el diálogo que se muestra al entregar la misión. Si las barras de jefe de diálogo de misión están activadas (useQuestDialogueBossBars en QuestsConfig), se representa en el cuadro de diálogo; en caso contrario se envía al chat. Los jugadores de Bedrock siempre reciben la versión de chat.

KeyValuesDefault
questCompleteMessageString Listnone
Ejemplo
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

create_quest_complete.jpg


questCompleteCommands

Establece los comandos que se ejecutarán al completar la misión. Los comandos se lanzan desde la consola, así que no incluyas la barra inicial ni cuentes con que el jugador tenga permiso para ellos.

Marcadores de posición admitidos: $player para el nombre del jugador, $getWorld para el nombre del mundo en el que está, y $getX, $getY, $getZ para las coordenadas de su ubicación.

KeyValuesDefault
questCompleteCommandsString Listnone
Ejemplo
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1

create_quest_commands.jpg


turnInNPC

Establece el nombre de archivo del NPC con el que los jugadores tienen que hablar/interactuar para completar la misión. Este no tiene que ser el mismo NPC que entregó la misión.

KeyValuesDefault
turnInNPCFilenamenone
Ejemplo
turnInNPC: my_cool_quest_npc.yml

Dadores de Misiones

Para asignar una misión a un NPC que se la dará a los jugadores, necesitas configurar el archivo del NPC, no el archivo de la misión.

En tu archivo de configuración del NPC (~/plugins/EliteMobs/npcs/), añade:

interactionType: CUSTOM_QUEST_GIVER
questFileName: my_quest.yml

Para NPCs que dan varias misiones:

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

interactionType: CUSTOM_QUEST_GIVER es obligatorio: sin él, el NPC ignora questFileName por completo.

Consulta la documentación de creación de NPCs para más información sobre cómo configurar NPCs.


trackable

Establece si la misión usará el rastreador de misiones.

KeyValuesDefault
trackableBooleantrue
Ejemplo
trackable: true

questLevel

Establece el nivel de la misión. Esto es solo una guía visual para que los jugadores puedan saber lo desafiante que será la misión. Esto no modifica de ninguna manera los niveles de boss, objetos u otros.

KeyValuesDefault
questLevelInteger0
Ejemplo
questLevel: 10

create_quest_level.jpg


questAcceptSound

Establece el sonido que se reproduce cuando se acepta una misión. Es posible reproducir tanto sonidos de Minecraft como sonidos de un paquete de recursos. Cuando no se establece, EliteMobs reproduce en su lugar el sonido global de aceptación de misión de SoundsConfig.

KeyValuesDefault
questAcceptSoundStringnone
Ejemplo
questAcceptSound: entity.experience_orb.pickup

create_quest_level.jpg


questCompleteSound

Establece el sonido que se reproduce cuando se completa (se entrega) una misión. Es posible reproducir tanto sonidos de Minecraft como sonidos de un paquete de recursos. Cuando no se establece, EliteMobs reproduce en su lugar el sonido global de misión completada de SoundsConfig.

KeyValuesDefault
questCompleteSoundStringnone
Ejemplo
questCompleteSound: entity.player.levelup

create_quest_level.jpg


Soporte de Localización

Los siguientes campos admiten localización para servidores multilingües:

  • name
  • questLore
  • questAcceptDialog
  • questCompleteMessage
  • Dentro de cada entrada de customObjectives: dialog, npcName y location

Esto te permite proporcionar traducciones para distintos idiomas en tu servidor.


Permisos

Como se mencionó en las tablas anteriores, los permisos suelen ser Strings o String Lists. Pero veamos con más detalle cómo los usarás para bloquear y desbloquear misiones.

Importante: questAcceptPermission y questAcceptPermissions no son nodos de un plugin de permisos. EliteMobs comprueba sus propios marcadores internos de misión, que un jugador solo recibe al completar una misión cuyo questLockoutPermission coincida. Conceder la misma cadena mediante LuckPerms o cualquier otro plugin de permisos no desbloqueará la misión. (temporaryPermissions es distinto: esos sí se adjuntan como nodos de permiso reales mientras la misión está activa, que es por lo que el bloqueo por permission de objetos funciona con ellos.)

Supongamos que estás haciendo quest_3 en una serie de misiones que has planeado y no quieres que los jugadores puedan tomar quest_3 antes de terminar quest_2. Configuraríamos el archivo de la misión así:

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

Al establecer questAcceptPermissions en elitequest.quest_2.yml ahora hemos impedido que los jugadores tomen quest_3.yml antes de terminar quest_2.yml.
Al establecer questLockoutPermission en elitequest.quest_3.yml hemos impedido que los jugadores puedan recibir esa misión mientras ya tengan esa misión en su rastreador o si ya terminaron esa misión. Esto impide que los jugadores puedan repetir la misión.

Si quieres hacer una misión que solo esté disponible después de que los jugadores hayan completado una serie de misiones, entonces configurarías el archivo de la misión así:

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

Si quieres que los jugadores solo puedan saquear ciertos objetos cuando tengan la misión correcta activa, podemos hacerlo usando temporaryPermissions. Crearíamos un permiso en el archivo de la misión usando temporaryPermissions y luego crearíamos un permiso coincidente en el archivo del objeto usando permission.

Por ejemplo, abriríamos nuestro archivo de misión y añadiríamos lo siguiente:

temporaryPermissions: 
- elitequest.my_cool_item.yml

Luego abriríamos el archivo del objeto, en nuestro caso my_cool_item.yml, y añadiríamos lo siguiente:

permission: elitequest.my_cool_item.yml

Ahora ambos archivos tienen permisos coincidentes, lo que debería hacer que nuestro objeto solo caiga cuando los jugadores tengan la misión correcta activa.

Misiones Dinámicas

Las Misiones Dinámicas son misiones generadas procedimentalmente que EliteMobs crea y actualiza automáticamente. A diferencia de las misiones personalizadas definidas en archivos de configuración, las misiones dinámicas no requieren ninguna configuración manual y se adaptan a la progresión de cada jugador.

Cómo Funcionan

  • Nivel de misión (Quest Tier): El nivel de misión dinámica de un jugador se deriva de su nivel de combate: tier = combatLevel / 5, limitado a un rango de 1 a 20. Por ejemplo, un jugador con nivel de combate 45 recibirá misiones dinámicas de nivel 9. Las misiones en sí (y sus recompensas) se escalan al nivel de combate real del jugador, que se limita a un rango de 1 a 100.
  • 3 Misiones Por Nivel: Para cada uno de los 20 niveles de misión, el sistema genera exactamente 3 objetivos de misión aleatorios a la vez. A los jugadores se les ofrecen las 3 misiones que coinciden con su nivel actual.
  • Ciclo de Actualización Automática: El conjunto de objetivos de misión dinámica se regenera cada 60 segundos (cada 1200 ticks). Cuando el conjunto se actualiza, los nuevos objetivos reemplazan a los antiguos, dando a los jugadores una selección rotativa de tareas.
  • Adaptación a Mazmorras Dinámicas: Cuando un jugador entra en una mazmorra dinámica con una selección de nivel específica, todas sus misiones dinámicas activas se adaptan para coincidir con el nivel de los mobs de la mazmorra. El nivel de la misión, los objetivos y el nombre mostrado se actualizan en consecuencia para que las misiones sigan siendo relevantes para el contenido de la mazmorra.

Grupos y crédito de eliminación compartido

Las misiones siempre son personales, pero cuando un miembro obtiene crédito por una muerte, los miembros conectados en el mismo mundo y dentro de sharedProgressRange (128 bloques de forma predeterminada en Party.yml) reciben progreso para los objetivos de eliminación activos coincidentes. No se comparten objetos de recolección, diálogo de NPC ni objetivos de arena, y los jugadores que estén en una instancia activa no relacionada quedan excluidos. Consulta el sistema de grupos.