Olyno Posté(e) le 6 mars 2018 Posté(e) le 6 mars 2018 Bonjour, dans ce tutoriel, je vais vous expliquer les loops de manières très poussés en skript. Ce tutoriel s'adresse à tout les développeurs de scripts, que ce soit débutant ou niveau très poussé. Ce tutoriel sera divisé en 3 parties pour que vous puissiez voir la/les parties à votre niveau. Sommaire : [spoiler=Niveau débutant] I/ Niveau débutant : Une loop peut être traduit par "boucle" en français. Il s'agit de répéter une action un certain nombre de fois, allant de 1 à un nombre infinis de fois. En skript, il n'existe pas de boucle "for" comme dans la plupart des langages mais uniquement 2 loops : "loop" et "while" La boucle "while" va faire une boucle infinis, juqu'à ce qu'une condition la brise. La boucle "loop" va cibler un nombre de fois définis et ne va se répéter que ce nombre de fois. Une loop est donc une boucle qui va se répéter un certain nombre de fois. Voici donc un bref résumé de ce qu'il se passe dans une boucle: [spoiler=Avec loop] loop 5 times: #étape 1 : création de la boucle add 1 to {_a} #On ajouter 1 à cette variable # broadcast "%{_a}%" #On broadcast un message avec le nombre contenant {_a} # Code #retour à l'étape 1 # [spoiler=Avec while] set {_a} to 5 while {_a} > 0: #étape 1 : création de la boucle remove 1 from {_a} #On ajouter 1 à cette variable # broadcast "%{_a}%" #On broadcast un message avec le nombre contenant {_a} # Code #retour à l'étape 1 # Ainsi, nous pouvons mettre une loop dans un code tel que: [spoiler=Avec loop] #mon code loop 5 times: broadcast "hey" broadcast "fin de la loop" [spoiler=Avec while] #mon code set {_a} to 5 while {_a} > 0: broadcast "hey" remove 1 from {_a} broadcast "fin de la loop" Ce sera très important pour la suite, vous en avez ma parole ;) [spoiler=Tips]Le while peut etre une boucle inintéréssante à première vue, mais est très importante lorsque nous savons l'utiliser. [spoiler=Niveau intermédiaire] II/ Niveau intermédiaire : Pour le niveau intermédiaire, il y a quelques astuces que vous devez connaitre. Vous devez dans un premier temps savoir que chaque loop renvoit une valeur, et que cette valeur augmente à chaque tour. Par exemple, si vous faites: command /test: trigger: loop 5 times: broadcast "%loop-value%" Vous pourrez remarquer qu'il va vous dire "1", "2", "3", "4" et "5". [spoiler=Pourquoi ?]Car chaque boucle avec "loop" démarre de 1 pour finir à son point culminant, comme dans l'exemple où le point culminant est "5" Sachez aussi que les variables listes peuvent être bouclés, tel que : command /test: trigger: set {_mavar::*} to "je", "renvoi", "une" and "phrase!" loop {_mavar::*}: broadcast "%loop-value%" Vous remarquerez ici qu'il va vous broadcast dans l'ordre "je renvoi une phrase!" en revenant toujours à la ligne. [spoiler=Pourquoi ?]Car il va reprendre le même système que la boucle avec "loop" précédente. Chaque boucle commence par la valeur 1, et chaque variable liste commence par l'index 1. Lorsque vous ajouter une valeurs, celle-ci y sera ajouté à la suite, tel une musique ajoutée à une file d'attente. Si votre valeur est la 5ème valeur ajoutée, elle sera donc en 5ème position. [spoiler=Tips]"loop-value" ne fonctionne pas pour les boucles "while" Une chose importante est à prévoir. Si vous utilisez une boucle dans une boucle, il ne faudra pas utiliser "loop-value" mais "loop-value-1" pour cibler une valeur de la boucle 1 par exemple ou "loop-value-2" pour la seconde. Tel que: [spoiler=Avec loop] command /test: trigger: set {_hey::*} to "je", "vais", "être", "broadcast", "5" and "fois" loop 5 times: loop {_hey::*}: broadcast "%loop-value-1% : %loop-value-2%" [spoiler=Tips]Vous pouvez bouclé tout ce qui est multiple, tel que l'inventaire d'un joueur, le nombre de blocs autour d'une position... Cela inclut aussi les expressions tel que all players, intergers from 1 to 5... Une autre fonctionnalité est le "exit loop", qui équivaut à un "stop loop" qui va arreter la boucle en cours. Exemple: loop 99 times: if loop-value = 2: broadcast "oh, la valeur est égale à 2" exit loop broadcast "Cette boucle ne fera pas 99 fois" [spoiler=Tips]Les "while" peuvent contenir des conditions tel que: while player is op: [spoiler=Niveau poussé] II/ Niveau poussé : Pour le niveau poussé, nous allons parler avec un vocabulaire que j'ai inventé mais qui reste cohérent. Désormais, considérer les loop en tant que "block". Vous pouvez optimiser votre code avec les loops, vous évitant de créer 1000 et 1 fonction. Voici un exemple de code que vous pouvez optimiser: Avant: command /test: trigger: broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast " " broadcast "Le chat a été vidé par %player%" Après: [spoiler=Avec loop] command /test: trigger: loop 13 times: broadcast " " broadcast "Le chat a été vidé par %player%" [spoiler=Avec while] command /test: trigger: set {_a} to 13 while {_a} > 0: broadcast " " remove 1 from {_a} broadcast "Le chat a été vidé par %player%" Ca supprime un grand nombre de ligne n'est-ce pas ? Merci d'avoir lu ce tutoriel. Pensez à jeter un oeil sur les exemples ci-dessous si vous voulez avoir des exemples concret d'utilisation des boucles ;) [spoiler=Exemples] [spoiler=Compte à rebour] [spoiler=Exemples] [spoiler=Avec loop] loop 5 times: wait 1 second [spoiler=Avec while] set {_a} to 5 while {_a} > 0: wait 1 second remove 1 from {_a} Ici, tant que la variable sera supérieur à 0, cette partie se répétera. Pour éviter un nombre de fois infinis de répétition, nous enlevons 1 à chaque fois de notre variable {_a}. [spoiler=Templates] [spoiler=Avec loop] #Exemple 1: options: temps : 5 parsed_as : second function Timer(): loop {@temps} times: wait 1 {@parsed_as} #Exemple 2: function Timer(temps: integer, parsedas: text = "seconds"): loop {_temps} times: wait 1 {_parsedas} [spoiler=Avec while] #Exemple 1 options: temps : 5 parsed_as : second function Timer(): set {_a} to {@temps} while {_a} > 0: wait 1 {@parsed_as} remove 1 from {_a} #Exemple 2 function Timer(temps: integer, parsed_as: text = "seconds"): while {_temps} > 0: wait 1 {_parsedas} remove 1 from {_temps} 1
noftaly Posté(e) le 6 mars 2018 Posté(e) le 6 mars 2018 au lieu de faire ton while en deux lignes set {_a} to 5 while {_a} > 0: remove 1 from {_a} (= tant que a +grand que 5) tu peux faire while {_a} != 5: add 1 to {_a} (= tant que "a" n'est pas égal a 5) ou while {_a} =< 5: add 1 to {_a} (= tant que "a" est plus petit ou égal à 5) sinon très bon tuto, même si je pense que le niveau intermédiaire pourrait convenir a un débutant et que le poussé pourrait convenir a un intermédiaire ^^
Olyno Posté(e) le 6 mars 2018 Auteur Posté(e) le 6 mars 2018 au lieu de faire ton while en deux lignes set {_a} to 5 while {_a} > 0: remove 1 from {_a} (= tant que a +grand que 5) tu peux faire while {_a} != 5: add 1 to {_a} (= tant que "a" n'est pas égal a 5) ou while {_a} =< 5: add 1 to {_a} (= tant que "a" est plus petit ou égal à 5) sinon très bon tuto, même si je pense que le niveau intermédiaire pourrait convenir a un débutant et que le poussé pourrait convenir a un intermédiaire ^^ J'ai utilisé sous forme de variable pour que ce soit simple à comprendre et à décomposer, mais oui sinon tu peux aussi faire de cette manière ;)
Soufreur78 Posté(e) le 7 mars 2018 Posté(e) le 7 mars 2018 Rien sur les : - loop integer between ? - loop-index ? - loop all players ? - loop all players where [player input] ? - While avec d'autres conditions ? (variable, position, environnement) Explique que l'on peut mettre n'importe quoi dans des loops; - loop size of {Membres::*} times: - loop blocks from the block below the player to the block 10 east of the block below the player: - loop blocks in radius 5 around the player: - loop all players where [player input has permission "test"]: - loop blocks within {1} to {2}: Pareil pour les whiles: - while player is alive: - while block below player is dirt: - while "%{Membres::*}%" contains "Soufreur78": - while player's health >= 5: - while player's fly mode is true: - while number of all players < 5: - while name of current inventory of player is "Test": - while player has 5 diamonds in her inventory: - While "%region at player%" is "test": - while file "plugins/test.bat" exists: - while player has potion slowness: - while player is within {variable} to {variable2}: Si tu souhaites faire un tuto complet il faut le préciser 2
Olyno Posté(e) le 7 mars 2018 Auteur Posté(e) le 7 mars 2018 Rien sur les : - loop integer between ? - loop-index ? - loop all players ? - loop all players where [player input] ? - While avec d'autres conditions ? (variable, position, environnement) Explique que l'on peut mettre n'importe quoi dans des loops; - loop size of {Membres::*} times: - loop blocks from the block below the player to the block 10 east of the block below the player: - loop blocks in radius 5 around the player: - loop all players where [player input has permission "test"]: - loop blocks within {1} to {2}: Pareil pour les whiles: - while player is alive: - while block below player is dirt: - while "%{Membres::*}%" contains "Soufreur78": - while player's health >= 5: - while player's fly mode is true: - while number of all players < 5: - while name of current inventory of player is "Test": - while player has 5 diamonds in her inventory: - While "%region at player%" is "test": - while file "plugins/test.bat" exists: - while player has potion slowness: - while player is within {variable} to {variable2}: Si tu souhaites faire un tuto complet il faut le préciser et Disponible depuis un petit moment dans la partie intermédiaire. En ce qui concerne les whiles, si on dit qu'ils peuvent contenir des conditions, je pense qu'il ne faut pas être bête pour utiliser les conditions disponible que nous offre les addons ou encore skript lui même. En ce qui concerne "loop all players" par exemple, "all players" reste une expression. Etant donné que j'avais précisé "tout ce qui est multiple", ca me paraissait logique d'inclure les expressions de ce style, je l'ai quand même repréciser. Le tutoriel est sur les loops, et non les expressions et l'utilisation des expressions, c'est donc normal que je n'ai pas inclut ça dans le tutoriel. Merci tout de même pour ta/tes remarque(s) ;) 1
kumakuma215 Posté(e) le 25 mars 2018 Posté(e) le 25 mars 2018 Euuuuh, ton while dans le niveau poussé la, ça fait crash le serveur car t'as pas rajouté de "remove 1 from {_a}" @AlexLew xD
Shelk Posté(e) le 26 mars 2018 Posté(e) le 26 mars 2018 Euh y'as une boucle while infini il me semble x)
kumakuma215 Posté(e) le 26 mars 2018 Posté(e) le 26 mars 2018 Euh y'as une boucle while infini il me semble x) Je l'avais déjà signalée :(
Olyno Posté(e) le 26 mars 2018 Auteur Posté(e) le 26 mars 2018 @Shelk @kumakuma215 Edité, merci de me l'avoir signalé ;)
MiiTsY Posté(e) le 25 mai 2022 Posté(e) le 25 mai 2022 (modifié) Bonjour, désolé de up le tuto. Je suis un débutant complet en skript et du coup j'y connais rien en addons etc. Mon problème est que j'ai essayé plusieurs loop et j'ai toujours le même erreur dans la console qui ressemble à ca : #!#! Current node: loop 5 times: (Scoreboard.sk, line 5) J'ai essayé "while player is online" | "loop all players" et c'est la même erreur. Alors du coup j'ai essayé la première partie du tuto (débutant) et c'est la même chose 😕 edit: les addons que j'utilise : SkBee SkVault Skript-holo Skript-placeholders Skellet Skript-GUI version du serveur paper1.17.1 hébergeur : minehut.gg edit: edit: Alors voila j'ai pensé que ca venais peut être des addons donc j'ai removed 1 par 1 les addons et on dirais bien que c'est Skellet le responsable et qu'il cassais les boucles. Modifié le 26 mai 2022 par MiiTsY Plus d'infos
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant