Aller au contenu

Skript School #5 - Les listes et les boucles


Le prochain Skript School  

51 membres ont voté

  1. 1. Le prochain Skript School

    • Un TP
      14
    • Split / Parse
      23
    • Autre ? (précisez dans les commentaires si vous pouvez)
      0
    • Les fonctions
      14


Messages recommandés

Posté(e)

10645d648b.png

 

 

Un titre que l'on ne comprends pas ? C'est normal, vous êtes bien sur Skript School, la série de tutoriel afin d'apprendre à programmer Skript de A à Z. Je vous recommande, voire vous demande si vous n'avez aucune connaissances en skript d'aller voir les précédents Skript School (voir plus bas).

 

Je précise juste que, Skript School est adapté et fait pour les débutants. Pour le moment, si vous êtes bons en skript vous n'apprendez sûrement rien. Néanmoins, les prochains tutoriels passeront la barre au dessus niveau difficulté.

 

LES LISTES ET LES BOUCLES

Les bases

Premièrement, voyons les listes. Dans Skript School #3 nous avons pu découvrir les variables qui permettent de stocker une valeur. Désormais nous allons nous étendre un peu plus sur le sujet et allons stocker plusieurs valeurs dans une de ces variables, qui sera une liste.

 

Une liste se déclare de la même manière qu'une variable, mais avec ::* derrière.

{masuperbeliste::*}

 

ok cool mais là elle est vide ta liste

Comme ton cerveau Bien sûr, je plaisante. Effectivement elle est vide, mais ça, c'est si vous le déclarez dans les Variables tout en haut. Maintenant, dans une commande ou un évènement, nous allons ajouter quelque chose - une valeur - à notre magnifique liste (qui peut être créer directement dans l'effect que nous allons voir)

 

Pour se faire, il suffit d'écrire ceci dans votre évènement ou votre commande.

add "Salut" to {masuperbeliste::*}

Pour ceux qui ont encore du mal, on va faire une décomposition très simple. "add [une valeur] to [liste]" ce qui, traduit littéralement, signifie "ajouter [une valeur] à [liste]" et maintenant vous devriez comprendre.

 

Panique panique, peut-on mettre autre chose qu'une simple string (text) ?

 

Evidemment. Dans notre liste, on peut ajouter plus qu'un string. On peut ajouter une variable simple, un chiffre, le nom d'un joueur, son uuid... tout. Voici quelques exemples

add uuid of player to {list::*}

add player to {list::*}
add "salut" to {list::*}
add 15 to {list::*}

 

Donc on peut mélanger pleins de types de variables dans une liste ?

Absolument, on peut mélanger un chiffre, un string, tout.

 

De cette manière, on peut retirer quelque chose d'une liste et la vider.

# Retire un élément de la liste

remove "salut" from {list::*}

# Vide la liste
clear {list::*}

 

 

 

L'affichage

Il y a plusieurs moyens d'afficher une liste. Élément par élément, ou tout d'un coup. Reprenons la liste {list::*} (le précédent exemple) pou cela.

 

Le plus simple, un affichage qui marche comme toutes les variables. Par exemple :

broadcast "%{list::*}%"

Si vous avez fait cela correctement, vous obtiendrez quelque chose de la sorte (pas les mêmes valeurs si vous n'avez pas repris la liste de l'exemple, évidemment)

f4fa33e986.png

 

Et la deuxième méthode consiste à afficher éléments par éléments. Pour cela nous allons utiliser une boucle, "loop". Je vais écrire le code puis expliquer.

loop {list::*}:

   send "%loop-value%"

C'est très simple. Première ligne, on indique que l'on va faire une boucle pour la liste {list::*}. En quelque sorte, on dit à Skript : "Pour chaque élément de {list::*}:"

Ensuite on utilise send pour tester en utilisant loop-value. Loop-value correspond à la valeur - l'élément - de la boucle. Résumons simplement : "Pour chaque élément de {list::*}: envoyer message "élément""

 

Récupérer un élément précis

Pour cela, nous allons utiliser un index. L'index, c'est l'équivalent de loop-value, en chiffre et dans l'ordre d'ajout. Si s'ajoute "mdr", puis "lol", pour ensuite ajouter "rofl"à ma liste {uneliste;;*}, mdr aura l'index 1, lol l'index 2 et ainsi de suite.

 

Si je veux récupérer et afficher, par exemple, "lol", il me suffira de faire :

send "%{uneliste::2}%"

 

D'ailleus, on peut également loop l'index avec %loop-index%

 

Ainsi, on peut également modifier un élément précis.

set {uneliste::2} to "roflrofl"

 

Voilà, c'est tout pour ce (long) tutoriel, mais désormais les listes et vous ne font qu'un ! Si vous avez quelconque question, n'hésitez pas à me la poser, ou à venir me voir sur le Discord de Skript-MC, j'y suis très souvent.

 

Skript School #1 - Skript School #2 - Skript School #3 - Skript School #4

 

 

 

 

  • J'aime 3
Posté(e)
Un bon tutoriel, pour ceux qui apprennent les bases. Cependant dans le titre tu parle de "loop" et la tu parle que de la façon de loop une liste, comptes tu faire un autre tuto sur les autres "types" de loop ?

Oui bien sûr, là j'en parle de manière brève, mais je ferai quelque chose de plus complet après :)

Posté(e)

Salut,

 

C'est possible de faire que par exemple si il y a 3joueurs dans la liste si un joueur arrive 1er dans la liste 'comme une file d'attente' il soit tp dans une salle ?

Posté(e)

Si on ajoute trois joueurs à une liste, le troisième seras "indexé" ( Je pense pas que ça existe mais bon.. ) dans la liste en numéro 3 {list::3}

Si on retire par la suite les deux autre joueurs, il seras toujours "indexé" en numéro 3 ou alors passera t-il au numéro 1 ?

J'espère que tu auras compris ma demande ^^

Posté(e)
Si on ajoute trois joueurs à une liste, le troisième seras "indexé" ( Je pense pas que ça existe mais bon.. ) dans la liste en numéro 3 {list::3}

Si on retire par la suite les deux autre joueurs, il seras toujours "indexé" en numéro 3 ou alors passera t-il au numéro 1 ?

J'espère que tu auras compris ma demande ^^

Si tu as une liste

1. Polymeth

2. Synatiks

3. LavaPower

 

et que je retire Polymeth par exemple, l'index ne changera pas, c'est-à-dire:

2. Synatiks

3. LavaPower

Posté(e)
Une question :

Mais si on ajoute Snowach

Ca fera :

1- Snowach

2- Synatiks

3- LavaPower

 

ou :

2- Synatiks

3- LavaPower

4- Snowach

 

?

La deuxième, les index c'est toujours dans l'ordre d'ajout :)

Posté(e)

Salut ! Merci pour ce tuto sympatique ! :)

J'ai tout de même une question, il y a t-il un moyen de tester le contenu d'une liste comme demander si la liste {red::*} contient le terme "rouge" ou faut-il forcément passer par une boucle ?

Posté(e)
Salut ! Merci pour ce tuto sympatique ! :)

J'ai tout de même une question, il y a t-il un moyen de tester le contenu d'une liste comme demander si la liste {red::*} contient le terme "rouge" ou faut-il forcément passer par une boucle ?

Tu peux faire comme ça :

if "%{red::*}%" contain "rouge":

  • J'aime 1
Posté(e)

La technique de @GauvainWizard marche bien, mais n'est pas au point. Car imaginons; si dans ta liste tu as :

- Blanc

- Vert

- Bleu

- Rouge

- Bleu foncé

 

Et que tu testes si la couleur bleu est présente dans la liste avec la technique de @GauvainWizard :

 

if "%{ta.liste::*}%" contain "Bleu"

 

Cela va bien marcher, mais ça va aussi détecter la couleur "Bleu foncé".

 

Avant, cela, je fais un petit rappel sur la déclaration d'un liste.

 

Une liste, c'est comme une variable, elle peut contenir du texte comme des joueurs, des nombres, des items. Une liste aura son type lors de sa déclaration :

 

add 12 sticks to {ta.liste::*}

 

Après cette déclaration, ta liste aura comme type des items.

 

Contrairement à une variable, une liste ne peut être parsée, elle gardera son type pour toujours jusqu'à sa suppression. Le seul moyen de parser une liste, et d'en refaire une :

 

# Au début, ma liste contient des textes.

set {_liste::*} to {ta.liste::*} # On fait une copie de la liste.
delete {ta.liste::*} # On supprime notre ancienne liste.
loop (size of {_liste::*}) times: # On va répéter une action plusieurs fois. 
   set {_liste::%loop-number%} to "%{_liste::%loop-number%}%" parsed as an item # On va parser chaque objet de la copie de notre ancienne liste.
   add {_liste::%loop-number%} to {ta.liste::*} # Puis on les ajouter à une nouvelle liste.

# Maintenant, ma liste contient des items.

 

Pour savoir si une liste contient quelque chose, on fait ceci :

 

command /verify <player>:
   trigger:
       if {ta.liste::*} contain arg 1 # Ici, ma liste contient des joueurs.

 

Mais ne pas faire ceci ! :

 

if "%{ta.liste::*}%" contain "%player%"

 

Parce que là, vous récupérer tout le contenu de votre liste sous forme de texte, et vous tester si celle-ci contient un texte elle même ! Donc la bonne chose à faire est (cas de @Oromis):

 

if {red::*} contain "rouge" # Ici, ma liste contient des textes.

 

MAIS ! Oui, il y a un "mais" !

 

Depuis la version 2.2 Fixes de Skript, il n'est plus possible de vérifier si une liste (qui contient seulement des textes) contient un texte.

 

Donc le dernier code donné ne fonctionnera pas. Il existe donc une petite solution, qui est de vérifier si une liste ne contient PAS un texte, puis de mettre un "<else>" par la suite :

 

if {red::*} does not contain "red": # Le "does not contain" quant à lui, fonctionne toujours !
   stop trigger
else:
   broadcast "La liste {_red::*} contient le texte ""rouge"" !"

 

Donc au final, si tu voudrais tester le contenu d'un texte dans une liste, tu devras faire ceci^^ !

  • J'aime 3
Posté(e)

Ouep m'enfin si t'en ras réduit à ça, autant direct passé par une boucle, mais ça, c'est mon avis.

Mais autant faire ça sans else:

if {red::*} does not contain "red": # Le "does not contain" quant à lui, fonctionne toujours !
   stop
broadcast "La liste {_red::*} contient le texte ""rouge"" !"

  • 2 semaines après...
Posté(e)

Bonsoir. Pour détecter le nombre d'éléments dans une liste, comment se fait-ce ?

Style

command /four:
trigger:
  add 1 to {liste::*}
  add 1 tp {liste::*}
command /assiette:
trigger:
  send "{liste::*}"

 

Et là il me dit qu'in y a eu 2 éléments dans la liste. (Chez moi, il me dit qu'il y en a 1 et 1 et non 2).

Merci d'avance.

Posté(e)

Bonsoir Benjazt23.

C'est normal, tu lui dis d'ajouter "1" a la liste.

Si c'est pour un compteur pas besoin de liste.

La liste perso je m'en sers pour les coordonnées, joueurs ect.

Posté(e)

J'ai une question, je voudrais savoir combien de métier à un joueur, au lieu d'avoir 3 variables et devoir regarder dans chaque une d'elle si un métier est dedans, je voudrais bien un système plus optimisable.

 

Par expemple je rejoins le metier Bucheron, Mineur et je voudrais être chasseur, mais seul les "VIP" ont le droit à 3 métiers, je voudrais donc savoir combien de métier il y a dans ma listes: {jobs.%UUID of player::*}

  • 8 mois après...
Posté(e)

Bonjour,

Oui, ce tutoriel date :D -_-

 

Mais je suis sur un skript...

J'ai besoin d'ajouter <player> to {liste::*}

Et apres téléporté cette liste donc, teleport {liste::*} to {point.de.tp}

Et pour enlever ces joueurs delete <player> to {liste::*}

 

Conclusion:

#Si je veux faire un skript de salle d'attente e.t.c (voir skript)

/join [<text>]:
   trigger:
       if arg-1 is "red":
           add {test.%player%} to "red"
           add {test.%player%} to {jeu::*}
       if arg-1 is "blue":
#Opposé, flemme de faire

/forcereset:
   trigger:
       teleport {jeu::*} to {position.of.tp}[/b]
#Comment je reset le "{test.%player%}" sans être joueur, ou mettre arg-X

 

 

Je sais pas si j'ai été claire dans ma demande, en tous cas je l'espere (avoir une réponse aussi j'espere :D)

Merci d'avoir lu, et/ou y répondre !

Posté(e)
Essaie ça :

/forcereset:
   trigger:
       loop {jeu::*}:
           teleport loop-value to {TP}
           remove loop-value from {jeu::*}

C'est pas vraiment ce que je demande...

Ce code est un exemple, a adapter, mais j'aimerais supprimer le {varible.%player% sans etre ce joueur, ni precisé le joueur !

Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.