1 votes

Comment créer un compte à rebours qui déclenche un événement à sa fin ?

J'ai trouvé un article pour mettre en place une simple minuterie et cela fonctionne bien. Mais j'essaie de faire en sorte que quelque chose s'exécute quand il arrive à 0. Voici ce que j'ai jusqu'à présent :

Je l'exécute une fois pour créer la variable de la minuterie :

scoreboard objectives add timerObjective dummy "Timer Objective"
scoreboard players set nonexistenuser timerObjective 100
scoreboard objectives setdisplay sidebar timerObjective

Je crée ensuite un bloc de commande qui s'exécute tous les 20 ticks (1 seconde) pour décrémenter le minuteur :

scoreboard players remove @a timerObjective 1
execute @a[name=nonexistenuser,scores={timerObjective=0}] ~ ~ ~ fill 1049 1 1050 1001 49 1049 air 

Le décompte se fait à partir de 100 et je peux le voir dans l'affichage du score de l'utilisateur. nonexistentuser . Mais quand il atteint 0, il n'exécute pas la commande parce qu'il n'y a pas de joueur appelé. nonexistentuser . Si je remplace le nom par mon propre ID, cela fonctionne car je suis un joueur réel. J'ai testé la commande manuellement et j'ai trouvé le sélecteur @a[name=nonexistenuser,scores={timerObjective=0}] ne renvoie aucune cible, même si je peux voir le score de ce "joueur" à l'écran. Y a-t-il un autre moyen de créer un simple compte à rebours qui fasse quelque chose à la fin ?

1voto

Richie Frame Points 1800

Vous pouvez utiliser à la place /scoreboard players test :

/scoreboard players test nonexistentuser timerObjective 0 0

La commande réussit si le nombre est égal à 0, et échoue s'il ne l'est pas. Il suffit de placer un bloc de commande de chaîne conditionnelle après cela avec votre /fill et il ne sera exécuté que si la commande réussit.

0voto

George Points 195

J'ai trouvé une option avec laquelle je peux vivre pour les minuteries multiples et je peux l'étendre à autant de fois que je veux. Elle utilise plusieurs fichiers de fonctions mais chaque minuterie peut être suivie et fonctionne indépendamment des autres minuteries. La solution ne nécessite qu'un seul bloc de commande répétitif. Vous pouvez démarrer le timer via un second bloc de commande (/fonction timer1Start par exemple), appeler la fonction timer1start directement dans la console, ou appeler timer1Start depuis une autre fonction.

Je suis en train de créer une fonction de construction de bataille. Il y aura donc un bouton sur lequel l'utilisateur cliquera et qui exécutera une autre fonction buildBattle. La fonction buildBattle, à son tour, appellera directement la fonction timer1Start. Avec 3 timers, je peux avoir 3 batailles de construction différentes en même temps, chacune sur son propre timer et chacune peut exécuter une fonction séparée une fois terminée.

Je suppose que la même chose pourrait être mise en place sans fonctions en utilisant un tas de blocs de commande - mais qui veut faire cela ;)

J'ai créé ces fichiers :

mondial :

  • timerInit.mcfunction : exécutez cette fonction une seule fois pour configurer toutes les minuteries.
  • TimerTick.mcfunction : mettez-le dans un bloc de commande répétitif qui s'exécute tous les 20 ticks.

fichiers timer1

  • timer1start.mcfunction :
    • règle la minuterie active sur 1 et démarre une minuterie de 15 secondes
    • appeler /fonction timer1start pour démarrer le timer
  • timer1tick.mcfunction : tout ce qui se trouve ici sera exécuté une fois par seconde.
  • timer1done.mcfunction : tout ce qui se trouve ici sera exécuté une fois après l'expiration du timer1.

fichiers timer2

  • timer2start.mcfunction :
    • règle la minuterie active sur 2 et démarre une minuterie de 30 secondes
    • appeler /fonction timer2start pour démarrer le timer
  • timer2tick.mcfunction : tout ce qui se trouve ici sera exécuté une fois par seconde.
  • timer2done.mcfunction : tout ce qui se trouve ici sera exécuté une fois après l'expiration du timer2.

fichiers timer3

  • timer3start.mcfunction : règle la minuterie active sur 3 et démarre une minuterie de 45 secondes
    • règle la minuterie active sur 3 et démarre une minuterie de 45 secondes
    • appeler /fonction timer3start pour démarrer cette minuterie
  • timer3tick.mcfunction : tout ce qui se trouve ici sera exécuté une fois par seconde.
  • timer3done.mcfunction : tout ce qui se trouve ici sera exécuté une fois après l'expiration du timer3.

timerInit.mcfunction :

scoreboard objectives add timer1 dummy "Timer 1"
scoreboard objectives add timer2 dummy "Timer 2"
scoreboard objectives add timer3 dummy "Timer 3"
scoreboard objectives add activeTimer dummy "activeTimer"

TimerTick.mcfunction :

#update the 3 individual timers
scoreboard players remove timeTracker1 timer1 1
scoreboard players remove timeTracker2 timer2 1
scoreboard players remove timeTracker3 timer3 1

#synch each players timer with the time tracker 'player' 
scoreboard players operation @a timer1 = timeTracker1 timer1
scoreboard players operation @a timer2 = timeTracker2 timer2
scoreboard players operation @a timer3 = timeTracker3 timer3

#update all players to show them their active timer in the side bar (optional)
execute @a[scores={activeTimer=1}] ~ ~ ~ scoreboard objectives setdisplay sidebar timer1
execute @a[scores={activeTimer=2}] ~ ~ ~ scoreboard objectives setdisplay sidebar timer2
execute @a[scores={activeTimer=3}] ~ ~ ~ scoreboard objectives setdisplay sidebar timer3

#execute something every second for the timers (for instance show time or some other command)
function timer1Tick
function timer2Tick
function timer3Tick

#execute these functions ONE TIME when the timer expires
execute @p[scores={timer1=-1}] ~ ~ ~ function timer1Done
execute @p[scores={timer2=-1}] ~ ~ ~ function timer2Done
execute @p[scores={timer3=-1}] ~ ~ ~ function timer3Done

timer1start.mcfunction

scoreboard players set @a timer1 15
scoreboard players set timeTracker1 timer1 15
scoreboard players set @a activeTimer 1

timer1tick.mcfunction :

#execute @a[scores={activeTimer=1}] ~ ~ ~ say hello
title @a[scores={timer1=10,activeTimer=1}] actionbar 10 seconds left
title @a[scores={timer1=9,activeTimer=1}] actionbar 9
title @a[scores={timer1=8,activeTimer=1}] actionbar 8
title @a[scores={timer1=7,activeTimer=1}] actionbar 7
title @a[scores={timer1=6,activeTimer=1}] actionbar 6
title @a[scores={timer1=5,activeTimer=1}] actionbar 5
title @a[scores={timer1=4,activeTimer=1}] actionbar 4
title @a[scores={timer1=3,activeTimer=1}] actionbar 3
title @a[scores={timer1=2,activeTimer=1}] actionbar 2
title @a[scores={timer1=1,activeTimer=1}] actionbar 1
title @a[scores={timer1=0,activeTimer=1}] actionbar  Times up!

timer1Done.mcfunction

#do something when the timer completes
title @a[scores={timer1=..0}] actionbar timer 1 countdown complete

timer2start.mcfunction

scoreboard players set @a timer2 30
scoreboard players set timeTracker2 timer2 30
scoreboard players set @a activeTimer 2

timer2tick.mcfunction :

#do something when timer 2 executes

timer2Done.mcfunction :

#do something when timer 2 expires

timer3start.mcfunction

scoreboard players set @a timer3 45
scoreboard players set timeTracker3 timer3 45
scoreboard players set @a activeTimer 3

timer3tick.mcfunction :

#do something when timer 3 executes 

timer3Done.mcfunction :

#do something when timer 3 expires

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X