🤓Exemples - Challenges
Ce document contient des exemples pratiques pour la gestion des challenges avec le plugin Horizons.
Table des matières
Progression automatique
Challenges de minage
on break of stone:
progress challenge "mine_stone" for player by 1
# Notification de progression
set {_progress} to progress of challenge "mine_stone" for player
set {_target} to target value of challenge "mine_stone"
set {_percentage} to {_progress} / {_target} * 100
send "&7⛏️ Pierre minée: &a%{_progress}%&7/&c%{_target}% &7(&a%{_percentage}%%%&7)" to player
on break of diamond ore:
progress challenge "mine_diamonds" for player by 1
progress challenge "mine_precious" for player by 1
send "&b💎 Diamant miné! Progression des challenges mise à jour." to player
on break of coal ore:
progress challenge "mine_coal" for player by 1
on break of iron ore:
progress challenge "mine_iron" for player by 1
on break of gold ore:
progress challenge "mine_gold" for player by 1
Challenges de combat
on death of zombie:
progress challenge "kill_zombies" for player by 1
progress challenge "kill_monsters" for player by 1
on death of skeleton:
progress challenge "kill_skeletons" for player by 1
progress challenge "kill_monsters" for player by 1
on death of creeper:
progress challenge "kill_creepers" for player by 1
progress challenge "kill_monsters" for player by 1
# Challenge spécial pour tuer un creeper sans explosion
if damage cause is not explosion:
progress challenge "kill_creeper_safely" for player by 1
send "&a🎯 Creeper tué sans explosion! Challenge bonus progressé." to player
on death of ender dragon:
progress challenge "kill_dragon" for player by 1
broadcast "&5🐉 %player% a vaincu l'Ender Dragon!"
Challenges de construction
on place of any block:
progress challenge "place_blocks" for player by 1
# Challenges spécifiques par matériau
if event-block is stone:
progress challenge "build_stone" for player by 1
else if event-block is wood:
progress challenge "build_wood" for player by 1
else if event-block is glass:
progress challenge "build_glass" for player by 1
on craft:
progress challenge "craft_items" for player by 1
# Challenges spécifiques
if crafted item is diamond sword:
progress challenge "craft_diamond_tools" for player by 1
send "&b⚔️ Épée en diamant craftée! Challenge progressé." to player
else if crafted item is enchanting table:
progress challenge "craft_enchanting" for player by 1
send "&5✨ Table d'enchantement craftée!" to player
Challenges d'exploration
on region enter:
# Système de découverte de biomes
set {_biome} to biome at player
if {discovered.%player%.%{_biome}%} is not set:
set {discovered.%player%.%{_biome}%} to true
progress challenge "explore_biomes" for player by 1
send "&a🗺️ Nouveau biome découvert: &e%{_biome}%!" to player
on consume:
if consumed item is golden apple:
progress challenge "eat_golden_apples" for player by 1
else if consumed item is bread:
progress challenge "eat_bread" for player by 1
Événements de challenges
Récompenses à la complétion
on challenge complete:
set {_challenge} to event-challenge
set {_isFirst} to event-first-completion
# Récompenses spécifiques par challenge
if {_challenge} is "first_kill":
if {_isFirst} is true:
broadcast "&6🎉 %player% a obtenu son premier kill!"
give golden sword named "&6Épée du Premier Sang" to player
add 100 to score of team of player
else:
send "&aEncore un kill! Continuez comme ça!" to player
give 5 emeralds to player
else if {_challenge} is "mine_stone":
send "&a⛏️ Challenge de minage de pierre complété!" to player
give efficiency 3 diamond pickaxe named "&bPioche du Mineur" to player
add 50 to score of team of player
else if {_challenge} is "kill_dragon":
broadcast "&5🐉 %player% est devenu un Tueur de Dragon!"
give elytra named "&5Ailes du Dragon" to player
give 64 emerald blocks to player
add 1000 to score of team of player
else if {_challenge} is "explore_biomes":
send "&a🗺️ Explorateur confirmé! Tous les biomes découverts!" to player
give compass named "&aBoussole de l'Explorateur" to player
add 200 to score of team of player
Notifications de progression
on challenge progress:
set {_challenge} to event-challenge
set {_previous} to event-previous-progress
set {_new} to event-new-progress
set {_added} to event-progress-added
# Notifications pour certains challenges
if {_challenge} is "mine_stone":
set {_target} to target value of challenge {_challenge}
set {_percentage} to {_new} / {_target} * 100
# Notification tous les 25%
if {_percentage} >= 25 and {_previous} / {_target} * 100 < 25:
send "&e⛏️ 25% du challenge de minage atteint!" to player
else if {_percentage} >= 50 and {_previous} / {_target} * 100 < 50:
send "&e⛏️ 50% du challenge de minage atteint!" to player
give efficiency 1 iron pickaxe to player
else if {_percentage} >= 75 and {_previous} / {_target} * 100 < 75:
send "&e⛏️ 75% du challenge de minage atteint!" to player
else if {_challenge} is "kill_monsters":
# Notification tous les 10 kills
if {_new} mod 10 is 0:
send "&c⚔️ %{_new}% monstres tués! Continuez!" to player
Systèmes de récompenses
Système de récompenses progressives
function giveProgressReward(player: player, challenge: text, progress: number):
set {_target} to target value of challenge {_challenge}
set {_percentage} to {_progress} / {_target} * 100
# Récompenses par paliers
if {_percentage} >= 25 and {_percentage} < 50:
if {reward.%{_player}%.%{_challenge}%.25} is not set:
set {reward.%{_player}%.%{_challenge}%.25} to true
give 5 emeralds to {_player}
send "&a💎 Récompense 25%: 5 émeraudes!" to {_player}
else if {_percentage} >= 50 and {_percentage} < 75:
if {reward.%{_player}%.%{_challenge}%.50} is not set:
set {reward.%{_player}%.%{_challenge}%.50} to true
give 10 emeralds to {_player}
send "&a💎 Récompense 50%: 10 émeraudes!" to {_player}
else if {_percentage} >= 75 and {_percentage} < 100:
if {reward.%{_player}%.%{_challenge}%.75} is not set:
set {reward.%{_player}%.%{_challenge}%.75} to true
give diamond to {_player}
send "&b💎 Récompense 75%: 1 diamant!" to {_player}
on challenge progress:
giveProgressReward(player, event-challenge, event-new-progress)
Système de récompenses d'équipe
on challenge complete:
if player has a team:
set {_team} to team of player
set {_challenge} to event-challenge
# Bonus d'équipe pour certains challenges
if {_challenge} is "kill_dragon":
add 500 to score of team {_team}
loop all members of team {_team}:
give 10 emerald blocks to loop-value parsed as player
send "&5🐉 Bonus d'équipe: Tueur de Dragon!" to loop-value parsed as player
else if {_challenge} is "mine_diamonds":
add 100 to score of team {_team}
loop all members of team {_team}:
give 5 diamonds to loop-value parsed as player
send "&b💎 Bonus d'équipe: Mineur de diamants!" to loop-value parsed as player
Challenges personnalisés
Challenge de survie
# Challenge: Survivre 24h sans mourir
on join:
if {survival_start.%player%} is not set:
set {survival_start.%player%} to now
on death of player:
delete {survival_start.%player%}
send "&c💀 Challenge de survie échoué! Redémarrage..." to player
every hour:
loop all players:
if {survival_start.%loop-player%} is set:
set {_duration} to difference between now and {survival_start.%loop-player%}
if {_duration} >= 24 hours:
complete challenge "survive_24h" for loop-player
delete {survival_start.%loop-player%}
Challenge de collection
# Challenge: Collecter différents types d'items
on pickup:
set {_item} to picked up item
set {_type} to type of {_item}
if {collected.%player%.%{_type}%} is not set:
set {collected.%player%.%{_type}%} to true
progress challenge "collect_items" for player by 1
send "&a📦 Nouvel item collecté: &e%{_type}%!" to player
# Vérifier si le challenge est complété
if progress of challenge "collect_items" for player >= target value of challenge "collect_items":
send "&a🎉 Challenge de collection complété!" to player
Challenge de construction massive
# Challenge: Construire une structure de 1000 blocs
on place of any block:
add 1 to {build_count.%player%}
if {build_count.%player%} >= 1000:
complete challenge "massive_build" for player
delete {build_count.%player%}
send "&a🏗️ Structure massive complétée!" to player
on break of any block:
if {build_count.%player%} > 0:
remove 1 from {build_count.%player%}
Administration des challenges
Commandes d'administration
command /challengeadmin <text> <player> [<text>] [<number>]:
permission: admin.challenges
usage: /challengeadmin <action> <joueur> [challenge] [valeur]
trigger:
set {_action} to arg-1
set {_player} to arg-2
set {_challenge} to arg-3
set {_value} to arg-4
if {_action} is "list":
send "&6=== CHALLENGES DE %{_player}% ===" to player
set {_challenges::*} to all challenges
loop {_challenges::*}:
set {_progress} to progress of challenge loop-value for {_player}
set {_target} to target value of challenge loop-value
set {_completed} to challenge loop-value is completed for {_player}
if {_completed} is true:
send "&a✅ %loop-value%: COMPLÉTÉ" to player
else:
send "&7⏳ %loop-value%: %{_progress}%/%{_target}%" to player
else if {_action} is "complete":
if {_challenge} is set:
if challenge {_challenge} exists:
complete challenge {_challenge} for {_player}
send "&a✅ Challenge %{_challenge}% complété pour %{_player}%!" to player
else:
send "&cChallenge '%{_challenge}%' introuvable!" to player
else:
send "&cVeuillez spécifier un challenge!" to player
else if {_action} is "progress":
if {_challenge} is set and {_value} is set:
if challenge {_challenge} exists:
progress challenge {_challenge} for {_player} by {_value}
send "&a✅ Challenge %{_challenge}% progressé de %{_value}% pour %{_player}%!" to player
else:
send "&cChallenge '%{_challenge}%' introuvable!" to player
else:
send "&cVeuillez spécifier un challenge et une valeur!" to player
else if {_action} is "reset":
if {_challenge} is set:
if challenge {_challenge} exists:
reset challenge {_challenge} progress for {_player}
send "&a✅ Challenge %{_challenge}% réinitialisé pour %{_player}%!" to player
else:
send "&cChallenge '%{_challenge}%' introuvable!" to player
else:
send "&cVeuillez spécifier un challenge!" to player
else:
send "&cAction invalide! Utilisez: list, complete, progress, reset" to player
Système de debug
command /challengedebug <player>:
permission: admin.challenges.debug
trigger:
set {_player} to arg-1
send "&6=== DEBUG CHALLENGES POUR %{_player}% ===" to player
set {_challenges::*} to all challenges
loop {_challenges::*}:
set {_challenge} to loop-value
set {_progress} to progress of challenge {_challenge} for {_player}
set {_target} to target value of challenge {_challenge}
set {_completed} to challenge {_challenge} is completed for {_player}
set {_available} to challenge {_challenge} is available for {_player}
set {_canComplete} to challenge {_challenge} can be completed by {_player}
send "&e%{_challenge}%:" to player
send "&7 Progression: %{_progress}%/%{_target}%" to player
send "&7 Complété: %{_completed}%" to player
send "&7 Disponible: %{_available}%" to player
send "&7 Peut compléter: %{_canComplete}%" to player
Systèmes avancés
Système de challenges quotidiens
every day at 00:00:
broadcast "&6🌅 Nouveaux challenges quotidiens disponibles!"
# Reset des challenges quotidiens
set {_dailyChallenges::*} to "daily_mining", "daily_kills", "daily_crafting"
loop all players:
loop {_dailyChallenges::*}:
reset challenge loop-value-2 progress for loop-value-1
# Notification des nouveaux objectifs
wait 5 seconds
loop all players:
send "&a📋 Vos challenges quotidiens ont été réinitialisés!" to loop-player
send "&7Tapez &e/challenges daily &7pour voir vos objectifs." to loop-player
Système de challenges par type
command /challenges [<text>]:
trigger:
if arg-1 is not set:
send "&6=== TYPES DE CHALLENGES ===" to player
send "&ePLAYER &7- Challenges individuels" to player
send "&eTEAM &7- Challenges d'équipe" to player
send "&eGLOBAL &7- Challenges globaux" to player
send "&eDAILY &7- Challenges quotidiens" to player
else if arg-1 is "daily":
send "&6=== CHALLENGES QUOTIDIENS ===" to player
set {_dailyChallenges::*} to "daily_mining", "daily_kills", "daily_crafting"
loop {_dailyChallenges::*}:
set {_progress} to progress of challenge loop-value for player
set {_target} to target value of challenge loop-value
set {_name} to name of challenge loop-value
if challenge loop-value is completed for player:
send "&a✅ %{_name}%: COMPLÉTÉ" to player
else:
send "&7⏳ %{_name}%: %{_progress}%/%{_target}%" to player
else:
set {_type} to arg-1 in uppercase
if {_type} is "PLAYER" or "TEAM" or "GLOBAL":
send "&6=== CHALLENGES %{_type}% ===" to player
set {_challenges::*} to all {_type} challenges
loop {_challenges::*}:
set {_name} to name of challenge loop-value
set {_desc} to description of challenge loop-value
set {_progress} to progress of challenge loop-value for player
set {_target} to target value of challenge loop-value
if challenge loop-value is completed for player:
send "&a✅ %{_name}%: COMPLÉTÉ" to player
else:
send "&7⏳ %{_name}%: %{_progress}%/%{_target}%" to player
send "&7 %{_desc}%" to player
else:
send "&cType invalide! Utilisez: PLAYER, TEAM, GLOBAL ou daily" to player
Système de chaînes de challenges
on challenge complete:
set {_challenge} to event-challenge
# Chaîne de challenges de minage
if {_challenge} is "mine_stone":
send "&a⛏️ Challenge suivant débloqué: Minage de fer!" to player
# Ici on pourrait débloquer le challenge suivant
else if {_challenge} is "mine_iron":
send "&a⛏️ Challenge suivant débloqué: Minage d'or!" to player
else if {_challenge} is "mine_gold":
send "&a⛏️ Challenge suivant débloqué: Minage de diamants!" to player
# Chaîne de challenges de combat
else if {_challenge} is "kill_zombies":
send "&c⚔️ Challenge suivant débloqué: Tueur de squelettes!" to player
else if {_challenge} is "kill_skeletons":
send "&c⚔️ Challenge suivant débloqué: Tueur de creepers!" to player
Notes importantes
Performance : Évitez les événements trop fréquents avec des vérifications complexes.
Stockage : Utilisez des variables pour stocker les données temporaires des challenges personnalisés.
Équilibrage : Ajustez les récompenses selon l'économie de votre serveur.
Compatibilité : Testez les challenges avec d'autres plugins pour éviter les conflits.