Aller au contenu principal

Créer des Quêtes

webapp_banner.jpg

Exemple de quête​

Cet exemple simplifié suit le format du fichier fourni test_quest.yml.

Créez des fichiers .yml aux noms uniques dans plugins/EliteMobs/customquests/, depuis le dossier du serveur. Chargez la quête et les contenus référencés avec /em reload, puis attribuez-la à un PNJ comme indiqué ci-dessous.

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

L'image montre l'ancienne interface de livre. /em alt change la préférence de menu : les joueurs Java qui la sélectionnent reçoivent des livres avant Minecraft 1.21.6 et des dialogues Minecraft sur les versions plus récentes. Les joueurs Bedrock et ceux qui préfèrent les menus d'inventaire reçoivent une interface d'inventaire.

Cette quête d'exemple donnera aux joueurs la tâche d'abattre 1 test_boss.yml. (Le nom réel du boss affiché dans le suivi de quête sera le name: défini dans test_boss.yml.) Et en récompense de la complétion de la quête, ils recevront 1 Cure-dent de Magmaguy.

Les objectifs deviennent actifs ensemble à l'acceptation ; Objective1, Objective2, etc. n'imposent aucun ordre. Tous doivent être remplis avant de recevoir les récompenses. Par défaut, le joueur rend ensuite la quête à son PNJ. Avec requireQuestTurnIn: false dans Quests.yml, remplir les objectifs tente immédiatement de terminer la quête, avec vérification et consommation des objets à rapporter. maximumActiveQuests limite les quêtes acceptées à 10 par défaut.

Créer des quêtes personnalisées​

isEnabled​

Définit si la quête est activée.

CléValeursDéfaut
isEnabledBooléentrue
Exemple
isEnabled: true

customObjectives​

Définit les objectifs de la quête.

CléValeursDéfaut
customObjectivesSpécial [1]aucun

Pour un boss à plusieurs phases, référencez le fichier de sa première phase. La progression est accordée à sa mort, pas à chaque transition. KILL_CUSTOM compare le nom du fichier sans imposer questLevel comme niveau minimal du boss éliminé.

Exemples

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 :

Les objectifs de collecte comptent les objets portant les étiquettes d'objet personnalisé EliteMobs dans l'inventaire. Lors de la remise, tous sont vérifiés sur une même copie de l'inventaire avant toute consommation ou récompense. Si deux objectifs demandent le même objet, leurs quantités s'additionnent ; une pile ne peut pas satisfaire les deux à la fois. Lâcher un objet peut rendre un objectif de nouveau incomplet.

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

Spécial [1]

Déplier le Tableau

Les Objectifs Personnalisés sont construits à l'aide des valeurs suivantes :

CléDescription
objectiveTypeType d'objectif : KILL_CUSTOM élimine un boss personnalisé, FETCH_ITEM réunit un objet personnalisé, DIALOG demande de parler à un PNJ, ARENA termine une arène et CLASS_UNLOCK observe le déblocage d'une classe.
filenameNom de fichier .yml obligatoire du boss, de l'objet, du PNJ de dialogue, de l'arène ou de l'entraîneur. Utilisez une définition chargée, pas son nom affiché. Un objectif sans filename, ou dont l'objectiveType est absent ou inconnu, désactive toute la quête avec un avertissement dans la console. Un CLASS_UNLOCK invalide reste dans la quête mais ne peut pas être accompli. Corrigez tous les avertissements avant de proposer la quête.
amountNombre entier positif de boss à éliminer ou d'objets à réunir ; 1 par défaut. Une valeur inférieure à 1 désactive la quête. DIALOG, ARENA et CLASS_UNLOCK ont une cible de un et ignorent ce champ.
dialogDIALOG uniquement — les lignes que le PNJ prononce lorsque le joueur lui parle.
locationDIALOG uniquement — une indication en texte libre sur l'endroit où se trouve le PNJ, affichée sous forme de $location dans la ligne de résumé du menu de quête.
name / npcName / itemNameAlias facultatifs du libellé de FETCH_ITEM, DIALOG, ARENA et CLASS_UNLOCK. N'en définissez qu'un. Tous sont traduisibles et permettent une formulation particulière ou de cacher une information. Sans remplacement, FETCH_ITEM utilise le nom traduit de l'objet et DIALOG celui du PNJ. KILL_CUSTOM utilise le nom configuré du boss.
classCLASS_UNLOCK uniquement : ID de la forme de classe à observer, par exemple adventurer.

Fournissez une table customObjectives non vide avec une clé unique par objectif (Objective1, Objective2, ...). Les noms de champs sont sensibles à la casse ; les types utilisent les valeurs en majuscules indiquées ci-dessus. Les anciens fichiers utilisant des chaînes comme KILL_CUSTOM:filename=X.yml:amount=Y sont convertis à ce format au premier chargement et enregistrés sur disque.

Les libellés ont leurs propres entrées de traduction, identifiées par le fichier de quête et un chemin comme customObjectives.Objective1.itemName. Traduisez cette entrée du CSV même si l'objet sous-jacent est déjà traduit. Sans traduction, le libellé original reste affiché afin de ne pas révéler un nom caché. Le texte source reste dans le YAML et les traductions existantes sont conservées.

Comportement de FETCH_ITEM

FETCH_ITEM identifie l'étiquette du fichier de l'objet, pas son matériau, son nom visible ou sa description. Les objets obtenus avant l'acceptation comptent, y compris dans les emplacements d'armure et de main secondaire. L'acceptation, le ramassage ou l'abandon d'objets correspondants et les récompenses de quête programment un recomptage au tick suivant. Les autres modifications de l'inventaire peuvent ne pas se refléter immédiatement, mais la remise vérifie toujours l'inventaire à nouveau. En cas de réussite, les objets requis sont consommés ; une quantité totale insuffisante annule la remise sans retrait partiel.

DIALOG progresse lors de l'interaction avec un PNJ correspondant, avant l'ouverture de son menu habituel. Le joueur n'a pas besoin de finir de lire. location n'est qu'une indication textuelle, pas des coordonnées pour la boussole. ARENA progresse lorsque le joueur termine l'arène indiquée avec la quête active ; une victoire antérieure ne compte pas.


Objectifs de déblocage de classe​

CLASS_UNLOCK observe une classe débloquée avec le système de combat avancé. Il ne donne pas la classe. Par exemple :

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

class doit identifier une forme existante. filename dirige le suivi vers son entraîneur ; name remplace facultativement le libellé. L'objectif compte jusqu'à un et reconnaît une classe débloquée avant l'acceptation, même si elle n'est pas équipée. La progression de classe doit être disponible et le déblocage est revérifié à la fin. Une classe invalide ou un fichier d'entraîneur manquant laisse un objectif impossible à terminer ; il n'est pas ignoré.

Suivi et abandon​

Un joueur ne peut suivre qu'une quête à la fois. Avec autoTrackNextQuestOnCompletion: true dans Quests.yml, terminer la quête suivie en sélectionne une autre active et suivable au tick suivant. questAutoTrackNextMessage accepte $questName. autoTrackQuestsOnAccept vaut également true par défaut, mais utilise actuellement le bouton de bascule : accepter une quête alors qu'une autre est suivie peut arrêter le suivi au lieu de le transférer. Réactivez-le depuis le menu si nécessaire.

La boussole cherche les destinations prises en charge : boss personnalisés, PNJ de dialogue ou entraîneurs, et boss ou coffres dont les tables de butin contiennent l'objet demandé. Elle ne trouve pas toutes les sources possibles d'objets ; les objectifs d'arène ou d'élimination dynamique n'ont pas de recherche de destination spécifique. Pour un autre monde, elle peut indiquer un portail direct approprié ou le monde de destination, sans garantir un chemin praticable. L'absence de destination n'empêche pas de progresser.

L'abandon normal demande une seconde confirmation. Le message et son survol utilisent questAbandonConfirmationText et questAbandonConfirmationHover. Abandonner retire la quête active et son suivi ; cela ne déclenche pas le délai de fin défini par questLockoutMinutes et n'accorde pas le marqueur de fin. La quête peut être reprise si ses conditions habituelles le permettent.

Les indicateurs de quête des PNJ sont propres à chaque joueur et apparaissent dans un rayon de 30 blocs. La boussole comprend des indications verticales. Pendant un dialogue par barres de boss, la zone est réservée : les autres barres gérées sont masquées et l'ancienne option hideKeyedBossBarsDuringQuestDialogue est supprimée. hideQuestScoreboardDuringQuestDialogue contrôle séparément le panneau latéral.

Sur Java, s'accroupir révèle la page en cours, puis permet d'avancer. Le dialogue applique Lenteur III pendant 30 secondes au maximum, sans immobiliser le joueur. Des dégâts non annulés supérieurs à zéro ferment les écrans et le dialogue de quête. Bedrock reçoit ce dialogue dans le chat. Son illustration nécessite les ressources correspondantes du pack.

customRewards​

Définit les récompenses de la quête.

CléValeursDéfaut
customRewardsFormat de butin universel d'EliteMobsaucun
Exemple
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

Les quêtes personnalisées ne génèrent pas automatiquement de récompenses. Si customRewards est vide, cette table n'accorde ni objets ni monnaie ; les commandes de fin configurées séparément s'exécutent tout de même. Les récompenses automatiques concernent les quêtes dynamiques.

Les objets à niveau adaptable utilisent le niveau sélectionné du donjon dynamique ou le niveau de combat actuel du joueur, avec 10 % de chances de gagner un niveau. Les objets fixes et limités conservent leurs règles. questLevel ne définit pas le niveau réel de la récompense.

Les récompenses sont remises directement : les objets vont dans l'inventaire, le surplus tombe aux pieds du joueur et la monnaie est ajoutée à son solde. Pour exécuter des commandes, utilisez questCompleteCommands plutôt qu'une entrée de butin command=.

L'aperçu et la remise effectuent des tirages séparés. Une récompense aléatoire ou un niveau bonus affiché n'est pas réservé au joueur.


questAcceptPermission​

Exige un marqueur de fin de quête EliteMobs pour accepter la quête. Accorder une permission ordinaire du même nom ne satisfait pas cette condition.

CléValeursDéfaut
questAcceptPermissionChaîneaucun
Exemple
questAcceptPermission: elitequest.my_permission

questAcceptPermissions​

Exige tous les marqueurs de fin de quête indiqués. Si questAcceptPermission est également défini, son marqueur est requis en plus de la liste.

CléValeursDéfaut
questAcceptPermissionsListe de chaînesaucun
Exemple
questAcceptPermissions: 
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml

questLockoutPermission​

Définit le marqueur accordé après une réussite. Il peut débloquer d'autres quêtes et, si questLockoutMinutes est nul ou négatif, empêche de refaire celle-ci. Son omission ne désactive pas un délai positif.

CléValeursDéfaut
questLockoutPermissionChaîneaucune
Exemple
questLockoutPermission: elitequest.my_quest.yml

questLockoutMinutes​

Définit le nombre de minutes à attendre avant de pouvoir refaire la quête.

CléValeursDéfaut
questLockoutMinutesEntier-1 (règle du marqueur ci-dessous)

Deux systèmes de verrouillage existent :

  • Au-dessus de 0, le suivi temporel bloque cette quête après sa remise pendant la durée indiquée et affiche le temps restant. La disponibilité ignore alors questLockoutPermission.
  • À 0 ou moins, le marqueur questLockoutPermission est accordé définitivement et bloque la répétition. Sans ce marqueur, la quête reste répétable.

Si les deux champs sont définis avec une durée positive, le marqueur est tout de même accordé, mais expire après cette durée. Une quête suivante qui l'exige doit être acceptée avant son expiration. Le délai est enregistré par nom de fichier de quête, séparément du marqueur de prérequis.

Exemple
questLockoutMinutes: 60

name​

Définit le nom de la quête. Accepte les codes couleur.

CléValeursDéfaut
nameChaînevide
Exemple
name: "&aMy Great Quest Name"

questLore​

Définit le lore de la quête qui apparaîtra dans le menu de quête en jeu.

CléValeursDéfaut
questLoreListe de chaînesaucun
Exemple
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

create_quest_lore.jpg


temporaryPermissions​

Accorde de véritables permissions Bukkit à l'acceptation et les réapplique lorsqu'une quête active est restaurée après connexion. Terminer ou abandonner la quête les retire, et la déconnexion les libère jusqu'à la connexion suivante. Chaque quête accorde ses nœuds séparément : deux quêtes actives peuvent donc partager un nœud, et terminer l'une d'elles laisse le nœud accordé par l'autre.

Pour la génération normale d'objets, configurez la même permission dans l'objet. Ce contrôle ne couvre pas toutes les voies de remise.

CléValeursDéfaut
temporaryPermissionsListe de chaînesaucun
Exemple
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml

questAcceptDialog​

Définit le dialogue qui apparaît dans le chat lors de l'acceptation de la quête.

Lorsque les dialogues par barres de boss sont activés, cette liste sert aussi de texte au donneur de quête avant l'acceptation. Si elle est vide, questLore est utilisé à la place.

CléValeursDéfaut
questAcceptDialogListe de chaînesaucun
Exemple
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

create_quest_accept.jpg


questCompleteMessage​

Définit le dialogue de remise. Avec useQuestDialogueBossBars dans Quests.yml, il peut apparaître avant le menu de remise ; sinon, il apparaît après une réussite. Un dialogue de remise affiché récemment n'est pas répété à la fin. Bedrock reçoit du texte dans le chat. Voir ce dialogue ne prouve pas que les récompenses ont été accordées.

CléValeursDéfaut
questCompleteMessageListe de chaînesaucun
Exemple
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

create_quest_complete.jpg


questCompleteCommands​

Définit les commandes qui s'exécuteront lors de la complétion de la quête. Les commandes sont envoyées depuis la console : n'incluez donc pas de barre oblique initiale et ne comptez pas sur le fait que le joueur ait la permission de les exécuter.

Placeholders pris en charge : $player pour le nom du joueur, $getWorld pour le nom du monde dans lequel il se trouve, et $getX, $getY, $getZ pour ses coordonnées.

CléValeursDéfaut
questCompleteCommandsListe de chaînesaucun
Exemple
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1

create_quest_commands.jpg


turnInNPC​

Définit le fichier du PNJ auquel rendre la quête. Il peut différer du donneur initial ; s'il est omis, ce dernier est utilisé. Un PNJ de remise séparé doit utiliser interactionType: CUSTOM_QUEST_GIVER, même avec une liste d'offres vide.

CléValeursDéfaut
turnInNPCNom de fichieraucun
Exemple
turnInNPC: my_cool_quest_npc.yml

Donneurs de quêtes​

Pour attribuer une quête à un PNJ qui la donnera aux joueurs, vous devez configurer le fichier du PNJ, et non le fichier de la quête.

Dans le fichier du PNJ (plugins/EliteMobs/npcs/), ajoutez :

interactionType: CUSTOM_QUEST_GIVER
questFileName:
- my_quest.yml

Pour les PNJ qui donnent plusieurs quêtes :

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

Utilisez une liste YAML même pour une seule quête ; la valeur scalaire questFileName: my_quest.yml n'est pas chargée comme liste d'offres. interactionType: CUSTOM_QUEST_GIVER est nécessaire pour l'ouvrir.

Consultez la documentation sur la création de PNJ pour plus d'informations sur la configuration des PNJ.


trackable​

Autorise le suivi manuel et automatique par boussole. Le désactiver n'arrête ni la progression, ni les récompenses, ni les panneaux temporaires de progression.

CléValeursDéfaut
trackableBooléentrue
Exemple
trackable: true

questLevel​

Définit le niveau de la quête. Il s'agit uniquement d'un guide visuel permettant aux joueurs de savoir à quel point la quête sera difficile. Cela ne modifie en aucune façon les niveaux des boss, des objets ou autres.

CléValeursDéfaut
questLevelEntier0
Exemple
questLevel: 10

create_quest_level.jpg


questAcceptSound​

Définit le son à l'acceptation, provenant de Minecraft ou d'un pack de ressources. Si le champ est omis, le son global d'acceptation de SoundsConfig est utilisé.

CléValeursDéfaut
questAcceptSoundChaîneaucun
Exemple
questAcceptSound: entity.experience_orb.pickup

create_quest_level.jpg


questCompleteSound​

Définit le son lorsque la quête est terminée, provenant de Minecraft ou d'un pack de ressources. Si le champ est omis, le son global de fin de quête de SoundsConfig est utilisé.

CléValeursDéfaut
questCompleteSoundChaîneaucun
Exemple
questCompleteSound: entity.player.levelup

create_quest_level.jpg


Traduction​

Les champs suivants prennent en charge la localisation pour les serveurs multilingues :

  • name
  • questLore
  • questAcceptDialog
  • questCompleteMessage
  • Dans chaque entrée de customObjectives : dialog, name, npcName, itemName et location

Cela vous permet de fournir des traductions pour différentes langues sur votre serveur.


Permissions​

Les permissions sont des chaînes ou des listes de chaînes. Voici comment les utiliser pour verrouiller et débloquer des quêtes.

Important : questAcceptPermission et questAcceptPermissions vérifient les marqueurs internes d'EliteMobs, pas les permissions ordinaires. Terminer une quête avec le questLockoutPermission correspondant crée le marqueur. Accorder le même nom avec LuckPerms ne débloque pas la quête. temporaryPermissions accorde au contraire de vraies permissions tant que la quête est active.

Disons que vous créez quest_3 dans une série de quêtes que vous avez planifiée et que vous ne voulez pas que les joueurs puissent prendre quest_3 avant d'avoir terminé quest_2. Nous configurerions le fichier de quête comme ceci :

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

La quête 2 doit accorder elitequest.quest_2.yml par son propre questLockoutPermission. La quête 3 exige alors ce marqueur avec questAcceptPermission. Avec la durée non positive par défaut, terminer la quête 3 accorde son marqueur permanent et empêche de la répéter. Proposer une quête déjà active depuis un autre PNJ n'en crée pas une seconde copie indépendante.

Si vous souhaitez créer une quête qui ne devient disponible qu'après que les joueurs ont terminé une série de quêtes, vous configureriez alors le fichier de quête comme ceci :

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

Pour que l'acceptation autorise la génération normale d'un objet, ajoutez un nœud à temporaryPermissions et utilisez le même dans le champ permission de l'objet.

Par exemple, nous ouvririons notre fichier de quête et ajouterions ce qui suit :

temporaryPermissions: 
- elitequest.my_cool_item.yml

Ensuite, nous ouvririons le fichier d'objet, dans notre cas my_cool_item.yml, puis nous ajouterions ce qui suit :

permission: elitequest.my_cool_item.yml

La quête accorde maintenant le nœud contrôlé lors de la génération normale tant qu'elle est active, et le retire lorsqu'elle est terminée ou abandonnée.

Groupes et crédit d'élimination partagé​

Les quêtes restent personnelles : rejoindre un groupe n'accepte, ne rend et ne récompense aucune quête pour autrui. Lorsqu'un membre obtient le crédit d'une élimination, les membres connectés dans le même monde et à portée de sharedProgressRange (128 blocs par défaut dans Party.yml) progressent aussi dans leurs objectifs actifs correspondants, y compris ceux visant un boss personnalisé.

Les objets de collecte, dialogues et objectifs d'arène ne sont pas partagés. Les bénéficiaires doivent avoir leur propre quête correspondante active et leurs données chargées. Si leur partie a dépassé l'attente ou le démarrage, ils doivent figurer dans sa liste initiale de participants. Le contrôle ne compare pas séparément leur instance à celle de l'élimination ; la proximité dans le même monde reste nécessaire.

Quêtes dynamiques​

Les Quêtes Dynamiques sont des quêtes générées de manière procédurale qui sont automatiquement créées et actualisées par EliteMobs. Contrairement aux quêtes personnalisées définies dans les fichiers de configuration, les quêtes dynamiques ne nécessitent aucune configuration manuelle et s'adaptent à la progression de chaque joueur.

Fonctionnement​

  • Donneur : utilisez un PNJ avec interactionType: QUEST_GIVER. Ses offres viennent des modèles dynamiques, pas de questFileName.
  • Palier : limitez le niveau de combat à 1–100, divisez-le par cinq avec une division entière, puis limitez le palier à 1–20. Le niveau 45 donne le palier 9. Le palier détermine les modèles et le nombre de victimes ; le niveau minimal des ennemis utilise le niveau de combat borné du joueur.
  • Trois modèles par palier : chacun choisit un type d'entité dans questEntityTypes de Quests.yml. Les types d'entité inconnus et ceux sans propriétés de mob EliteMobs sont ignorés avec un avertissement, et une liste sans entrée utilisable désactive les offres de quêtes dynamiques. Chaque modèle choisit aussi un nombre de victimes entre tier + 1 et tier * 10, bornes incluses. L'Elite Mob correspondant doit atteindre ou dépasser le niveau minimal ; un monstre Minecraft ordinaire ne compte pas.
  • Actualisation : les modèles changent toutes les 1200 ticks, soit environ 60 secondes à 20 TPS. Les quêtes existantes et leur progression sont conservées. Le menu les combine avec les trois modèles du palier actuel, sans dupliquer leurs IDs ; il ne contient donc pas forcément trois entrées.
  • Donjons dynamiques : entrer dans un donjon adapte le niveau minimal des ennemis, le niveau affiché et le nom des quêtes dynamiques existantes au niveau choisi, borné à 1–100. Les quantités et la progression sont conservées. La monnaie n'est pas recalculée.
  • Récompenses : la monnaie est fixée à la création de l'offre par floor(questLevel / 2 * targetKillCount). L'objet est généré par le système normal de butin à la remise, au niveau sélectionné du donjon dynamique ou au niveau de combat actuel, avec 10 % de chances de gagner un niveau et une limite finale de 1–100. Les règles de disponibilité et d'adaptation des objets s'appliquent ; l'aperçu est un tirage séparé.