🤓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

  1. Performance : Évitez les événements trop fréquents avec des vérifications complexes.

  2. Stockage : Utilisez des variables pour stocker les données temporaires des challenges personnalisés.

  3. Équilibrage : Ajustez les récompenses selon l'économie de votre serveur.

  4. Compatibilité : Testez les challenges avec d'autres plugins pour éviter les conflits.