# Exemple de script pour une quête
# https://guide.denizenscript.com/guides/put-it-together/kill-quest.html
#
# Ce script est conçu de telle sorte que vous puissiez le copier/coller et le charger sur votre serveur,
# et l'assigner à un PNJ avec /npc assign --set npc_killquest
# ou /ex assignation set npc_killquest, et tout fonctionnera.
# Vous pouvez ensuite le personnaliser et/ou l'utiliser comme référence pour apprendre.
#
# Script d'affectation de base à affecter a un NPC
#
# # Traduction en français des items mobs ... https://meta.denizenscript.com/Docs/Tags/&translate # #
# ex: <&translate[entity.minecraft.spider]> = Araignée
# <&translate[item.minecraft.diamond_sword]>" = Epée en diamant
npc_killquest:
type: assignment
actions:
on assignment:
# Activer les deux déclencheurs qui seront utilisés
- trigger name:click state:true
- trigger name:chat state:true
interact scripts:
# Et liez le script d'interaction ci-dessous
- npc_killquest_interact
# Format de chat alternatif pour le PNJ si vous n'aimez pas le "chat" par défaut
# si vous créez plusieurs PNJ avec ce script comme modèle, rappelez-vous que vous n'avez besoin que des scripts de format *une fois* (sauf si vous l'avez différent par PNJ)
cchat:
type: format
format: <&b><npc.name> <&f>à vous<&co> <&2><[text]>
pchat:
type: format
format: <&f>Vous à <&b><npc.name> <&6><[text]>
# Un format propre mais simple pour les instructions données au joueur par le script plutôt que par le PNJ
# (La clarification hors du personnage de ce que le PNJ a dit dans le personnage).
instruction_format:
type: format
# Light Gray + Italic
# Peut aussi s'écrire comme <gray><italic>
format: <&7><&o>[<[text]><&7><&o>]
npc_killquest_interact:
type: interact
steps:
# Étape par défaut : attendre que le joueur interagisse
waiting*:
# L'interaction initiale du joueur avec ce PNJ consiste toujours à faire un clic droit dessus
click trigger:
script:
# Exemple d'engagement par joueur avec un drapeau
# L'engagement est un moyen d'empêcher les joueurs de spammer les interactions avec un PNJ et de faire échouer les scripts en conséquence.
# Cela oblige simplement le joueur à attendre sa prochaine interaction jusqu'à ce que l'actuelle soit terminée.
# Cela fonctionne en utilisant une vérification has_flag au début de chaque interaction pour s'arrêter plus tôt, et en ajoutant/supprimant avant/après les interactions lentes comme les récits avec attentes ci-dessous.
- if <player.has_flag[npc_engaged]>:
- stop
# Vérifiez le temps de recharge avant de vous engager afin que nous n'ayons pas à nous désengager à l'intérieur du if
- if <player.has_flag[kill_mobs_quest_cooldown]>:
# Alors qu'un temps de recharge *pourrait* être une étape ou une commande de "temps de recharge", l'avoir comme indicateur vous permet de suivre et d'afficher clairement le temps de recharge, ce que les joueurs apprécieront.
- narrate format:instruction_format "Vous pourrez répéter cette quête dans <player.flag_expiration[kill_mobs_quest_cooldown].from_now.formatted>."
# Si nous plaçons le script * après * un engagement, le désengagement irait ici - juste avant toute commande "stop".
- stop
# Ajoutez le drapeau d'engagement pendant une minute - soit il sera effacé via la commande flag, soit s'il y a un bogue, il s'effacera tout seul après une minute
- flag player npc_engaged expire:1m
# Choisir unu entitée a tuer
- random:
- flag player npc_kill_quest_mob_select:zombie
- flag player npc_kill_quest_mob_select:spider
- flag player npc_kill_quest_mob_select:pig
- flag player npc_kill_quest_mob_select:cow
# choisir la quantitée
- random:
- flag player npc_kill_quest_max_number_kill:4
- flag player npc_kill_quest_max_number_kill:5
- flag player npc_kill_quest_max_number_kill:6
# Fixer un flag selon l'entitée tiré au sort
- choose <player.flag[npc_kill_quest_mob_select]>:
- case zombie:
- flag player npc_kill_quest_bool_zombie:1
- case spider:
- flag player npc_kill_quest_bool_spider:1
- case pig:
- flag player npc_kill_quest_bool_pig:1
- case cow:
- flag player npc_kill_quest_bool_cow:1
# Alternativement, au lieu des drapeaux de joueur, vous pouvez utiliser des commandes d'engagement pour engager par PNJ,
# ce qui est plus simple à faire (tout est dans la seule commande courte) mais gêne souvent les autres joueurs
#- engage
- narrate format:cchat "Bonjour. Voudriez-vous un prix spécial ?""
- wait 5t
- narrate format:cchat "Si c'est le cas, vous pouvez tuer <player.flag[npc_kill_quest_max_number_kill]> <&translate[entity.minecraft.<player.flag[npc_kill_quest_mob_select]>]>s pour moi."
- wait 5t
- narrate format:cchat "Accepteriez-vous de m'aider ?"
- wait 5t
# Le joueur peut taper "oui" ou "non" dans le chat normalement OU cliquer sur le mot pour le dire automatiquement
- narrate format:instruction_format "Type <&b><&o><element[Oui].click_chat[oui]><&7><&o> ou <&b><&o><element[Non].click_chat[non]>"
# Passez à l'étape qui contient le déclencheur de chat. Ajoutez une limite de cinq minutes pour que si le joueur s'enfuit et revienne, le PNJ n'attend toujours pas de réponse.
- zap accept_question 5m
- flag player npc_engaged:!
#- disengage
# Deuxième étape : active uniquement en attendant une réponse à la question donnée dans le déclencheur de clic
accept_question:
chat trigger:
1:
# Déclencheur de chat principal simple : si le joueur dit oui, il commence la quête
trigger: format:pchat "/Oui/ J'accepte de vous aider."
script:
- flag player npc_kill_quest_npc_name:<npc.name>
- if <player.has_flag[npc_engaged]>:
- stop
- flag player npc_engaged expire:1m
#- engage
- narrate format:cchat "D'accord! Super!"
- wait 5t
- narrate format:instruction_format "Tuez <player.flag[npc_kill_quest_max_number_kill]> <&translate[entity.minecraft.<player.flag[npc_kill_quest_mob_select]>]>s!"
# Démarrez un drapeau de compteur à zéro (pas encore de monstres tués).
- flag player npc_kill_quest_mobs_count:0
# Sautez à l'étape pour terminer la quête et verrouillez-la (pas de délai d'attente).
- zap finish_quest
- flag player npc_engaged:!
#- disengage
2:
# Même si ce n'est pas vraiment nécessaire, ajoutez une réponse "non" qui revient juste
trigger: format:pchat "/Non/ Je n'ai pas le temps"
script:
- if <player.has_flag[npc_engaged]>:
- stop
# Les messages plus fréquemment affichés peuvent devenir ennuyeux pour les joueurs qui doivent les voir constamment.
# Ajouter du caractère aléatoire à certains messages est une petite touche qui rend les scripts un peu plus agréables pour les joueurs
- random:
- narrate format:cchat "Ok ben partez!"
- narrate format:cchat "Ok alors."
- narrate format:cchat "Ne m'ennuyez pas plus longtemps !"
# Ils ont refusé, alors revenez à l'étape par défaut et attendez.
# detruire flag pc_kill_quest_bool_xxx
- flag player npc_kill_quest_bool_zombie:!
- flag player npc_kill_quest_bool_spider:!
- flag player npc_kill_quest_bool_pig:!
- flag player npc_kill_quest_bool_cow:!
- flag player npc_kill_quest_mob_select:!
- flag player npc_kill_quest_mobs_count:!
- flag player npc_kill_quest_max_number_kill:!
- zap *
# 3rd step: la seule interaction autorisée est le clic, ils sont coincés ici jusqu'à ce qu'ils terminent la quête
finish_quest:
click trigger:
script:
# Cette étape n'a pas d'interactions différées, donc aucun engagement n'est nécessaire.
# Si la quête est marquée comme terminée, donnez des récompenses.
- if <player.has_flag[kill_mobs_quest_complete]>:
- narrate format:cchat "Bien joué! Voici votre récompense!"
- give diamond
# Ensuite, supprimez le drapeau "terminé" et définissez le temps de recharge
- flag player kill_mobs_quest_complete:!
#supprimmer le mob aléatoire
- flag player npc_kill_quest_mob_select:!
- flag player npc_kill_quest_npc_name:!
- flag player kill_mobs_quest_cooldown expire:24h
# Et revenez à l'étape par défaut pour qu'ils puissent réessayer la quête une fois le temps de recharge terminé.
- zap *
- else:
# Sinon, donnez simplement un bavardage en attente.
- random:
- narrate format:cchat "Tu n'as pas encore tué ces <&translate[entity.minecraft.<player.flag[npc_kill_quest_mob_select]>]>s ?"
- narrate format:cchat "J'attends toujours les <&translate[entity.minecraft.<player.flag[npc_kill_quest_mob_select]>]>s."
- narrate format:cchat "Tu vas tuer ces <&translate[entity.minecraft.<player.flag[npc_kill_quest_mob_select]>]>s ou quoi ?"
killquest_mob_world:
type: world
events:
# Écoutez l'événement d'un joueur tuant des monstres
# Écouter uniquement lorsque le drapeau du compteur et le boolean mob (npc_kill_quest_bool_xxx) est mis sur true
after player kills pig flagged:npc_kill_quest_mobs_count|npc_kill_quest_bool_pig:
- run update_quest
after player kills zombie flagged:npc_kill_quest_mobs_count|npc_kill_quest_bool_zombie:
- run update_quest
after player kills spider flagged:npc_kill_quest_mobs_count|npc_kill_quest_bool_spider:
- run update_quest
after player kills cow flagged:npc_kill_quest_mobs_count|npc_kill_quest_bool_cow:
- run update_quest
update_quest:
type: task
debug: true
script:
- narrate "Quête en cours..."
# Après la mise à mort, incrémentez le compteur de mise à mort du joueur
- flag player npc_kill_quest_mobs_count:++
- define reste_mob_kill <player.flag[npc_kill_quest_max_number_kill].sub_int[<player.flag[npc_kill_quest_mobs_count]>]>
- random:
- narrate "Et un de moins! j'en suis à <player.flag[npc_kill_quest_mobs_count]>/5!"
- narrate "Plus que <[reste_mob_kill]> à tuer!"
- narrate "Encore un petit effort."
# Quand il atteint cinq, vous avez terminé !
- if <player.flag[npc_kill_quest_mobs_count]> == <player.flag[npc_kill_quest_max_number_kill]>:
- narrate format:instruction_format "Mobs Quest Complétée: Vous avez tué <player.flag[npc_kill_quest_max_number_kill]> <&translate[entity.minecraft.<player.flag[npc_kill_quest_mob_select]>]>s, retournez voir <player.flag[npc_kill_quest_npc_name]>"
# Supprimez donc les variables ajoutez un nouveau drapeau indiquant que la quête est terminée
- flag player npc_kill_quest_bool_zombie:!
- flag player npc_kill_quest_bool_spider:!
- flag player npc_kill_quest_bool_pig:!
- flag player npc_kill_quest_bool_cow:!
- flag player npc_kill_quest_mob_select:!
- flag player npc_kill_quest_mobs_count:!
- flag player npc_kill_quest_max_number_kill:!
# Alternativement au drapeau, utiliser '- zap npc_killquest_interact quest_completed' et une nouvelle étape correspondante fonctionnerait également.
# Le drapeau + if/else a été choisi principalement pour avoir des exemples de différentes méthodologies.
- flag player kill_mobs_quest_complete