Aller au contenu

4rno

Modérateur Discord
  • Compteur de contenus

    149
  • Inscription

  • Dernière visite

  • Jours gagnés

    3

Messages posté(e)s par 4rno


  1. 4rno submitted a new resource:

     

    [plain]Labyrinthe.sk[/plain] - [plain]Générez de vrais labyrinthes ![/plain]

     

    Voici un script vous permettant de générer des labyrinthes très facilement !

     

    Les labyrinthes générés seront toujours réalisables, vous n'allez donc pas passer 1 heure à trouver une sortie inexistante ;) En effet, dans les labyrinthes générés ici, tout endroit du labyrinthe est joignable depuis n'importe quel autre point !

     

    Ce script comporte en réalité 2 systèmes de générations, l'un plus rapide, l'autre plus lent, mais avec une génération plus "équilibrée"....

     

    Read more about this resource...


  2. 4rno submitted a new resource:

     

    [plain]JetPack.sk[/plain] - [plain]Volez dans Minecraft à l'aide de ce système de jetpack ![/plain]

     

    Petit script de 70 lignes: JetPack.sk

     

    Le nom décrit l'essentiel du script, c-à-d un système de Jetpack, obtenable avec la commande '/jetpack'

     

    Quelques fonctionnalités supplémentaires sont présentes, tel qu'un système de carburant et de particules (tous 2 paramétrables dans les options du .sk)

     

    Cliquez ici pour une vidéo de démonstration !

     

    Version de Minecraft testée: 1.10.2

    Version de...

     

    Read more about this resource...


  3. 4rno submitted a new resource:

     

    [plain][Alpha] Ping-pong.sk[/plain] - [plain]Jouer au ping-pong seul ou entre amis :)[/plain]

     

    - Le script -

     

    Petit script permettant de jouer au ping-pong, contre un bot ou à 2 !

    Ce script en est encore à ses débuts, beaucoup d'améliorations sont à venir !

     

    - Comment jouer ? -

     

    Pour jouer, il vous suffit d'exécuter la commande '/pingpong', une arène se créera alors et vous pourrez jouer contre le bot.

    Voici la syntaxe complète de la commande:

    /pingpong [<adversaire> (sinon contre le bot)] [<vitesse> (décroissant, par défaut à 2)] 

     

    Et une...

     

    Read more about this resource...


  4. Ce ne serait pas plutot "Hey %loop-player%" ?

    Effectivement , petit oubli de ma part, j'ai voulu ajouter à la dernière minute un côté "personnalisé" au message, afin d'éviter une remarque genre "Eh mais t'aurais pu simplement faire un 'broadcast" msg" lol, t'es trop con".

     

    Je sais que j'ai assez d'expérience, mais ça me paraît logique perso, pour moi c'est pas une subtilité quelconque.

    Effectivement c'est assez logique quand on a déjà fait de la programmation, mais j'énonçais plutôt les "caractéristiques" inhérentes aux 'loop', terme que j'ai d'ailleurs utilisé par la suite. Et en même temps, ça permet de montrer l'usage des boucles comme compteurs ;)

     

     

    Merci de ta critique ;)


  5. Bonjour à tous, et bienvenue à ce cours.

     

    Nous allons aujourd'hui voir différentes fonctionnalités de Skript relativement méconnues.

    En effet, beaucoup de personnes connaissent plus ou moins bien les boucles et listes de valeurs, mais il y a beaucoup de subtilités dans ce domaine permettant d'accomplir des tâches complexes de façon très simple et efficace.

     

    Nous allons donc aborder différentes choses étroitement liées:

     

    - Tout d'abord, nous allons rapidement voir qu'est ce qu'une liste de valeurs.

     

    - Ensuite nous verrons les boucles 'loop', et certaines de leurs applications spécifiques.

     

    - Par la suite, nous nous intéresseront aux listes de variables (au cours suivant).

     

     

    - Les listes de valeurs -

     

    Attention, ici, je ne parle pas encore de ce que l'on appelle communément des variables listes, que nous verrons par la suite, mais bien de simple liste de valeurs, quel qu’elles soient.

    On va commencer par le commencement: les listes de valeurs

    Posons nous donc d'abord la question: qu'est ce qu'une liste de valeurs ?

     

    Une liste de valeurs est simplement un ensemble de valeurs, étant généralement du même type ('player', 'items', 'entities').

     

    Une des valeurs d'une liste est appelée un élément.

    Vous avez sans doute déjà utilisé des listes de valeurs, une des plus connues est sans doute 'all players'.

    Vous pouvez d'ailleurs récupérer diverses listes de valeurs en utilisant l'expression 'all <type au pluriel>', cela permet de récupérer la liste des valeurs existantes d'un type donné. 'all players' renvoie par exemple la liste de tous les joueurs présents sur votre serveur, 'all blocks' tous les blocs qui existent dans Minecraft, ...

     

    Vous pouvez cependant manipuler facilement vos propres listes de valeurs, simplement en énonçant chacun des éléments de la liste, séparée de virgule entre chaque élément, avec entre les 2 derniers éléments un 'and' comme ceci: '"a", "b", "c" and "d"'

    Il existe également d'autres expressions permettant de récupérer des listes de valeurs, comme par exemple 'split <texte> at <delimiteur>' ou encore 'integers between 0 and 5'.

     

    Je pense que cette partie était relativement simple à comprendre, mais néanmoins nécessaire à la compréhension de la suite de ce cours. C'est pourquoi j'ai voulu refixer précisément la nature des listes de valeurs.

     

    - Les boucles 'loop' -

     

    Une 'loop' est une méthode en Skript permettant d'appliquer une série d'opération à une liste de valeurs.

    Voici comment se présente une boucle 'loop':

    loop <liste de valeurs>:
      <instructions>
    

    Cette forme est très basique. Dans la majorité des cas, on aura également besoin de pouvoir récupérer ce que l'on appelle communément la "valeur courante", c'est à dire la valeur de notre liste de valeurs que l'on va utiliser dans nos opérations.

    La valeur courante peut être appelée avec 'loop-value' ou bien 'loop-<type de la valeur>'.

     

    Histoire de contextualiser un peu la théorie, voici un exemple très simple:

    loop all players:
      send "Hey %loop-player%, tu joues actuellement sur le cube épique ! Rejoins nous sur Discord à cette adresse: xxx !" to loop-player
    

    Dans ce code, on retrouve bien 'loop all players:' avec 'all players' comme liste de valeurs. Ensuite, dans nos instructions, nous utilisons 'loop-player' comme valeur courante pour lui envoyer un message.

     

    Il y a quelques subtilités intéressantes à noter au niveau des boucles 'loop'. Déjà, les boucles de liste de valeurs s'effectuent les uns après les autres, et non de façon simultanée.

    De ce fait, si on utilise l'effet 'wait' dans une boucle, il y aura un délai entre l'exécution du code pour chaque élément de la liste.

     

    Il est donc par exemple très facile de créer un compteur:

    loop 10 times:
      send "%loop-value%"
      wait 1 second
    

    Ici, la liste de valeurs est l'expression '10 times', qui renverra les nombres entiers de 1 à 10. On aurait pu avoir le même résultat en écrivant 'integers between 1 and 10' ou alors en citant toutes les valeurs directement '1, 2, 3, 4, 5, 6, 7, 8, 9 and 10'. Le résultat sera un compteur de 1 à 10, à intervalle de 1 seconde donc.

     

    Deuxième caractéristique des boucles 'loop', on peut les imbriquer, c'est à dire faire des boucles dans des boucles. Dans ce cas-ci, si l'on veut récupérer la valeur courante, on doit alors préciser la boucle en donnant le numéro de l'ordre de "création" de la boucle, de cette façon par exemple: 'loop-value-3'. Si 2 boucles bouclent des types de valeurs différentes, on peut alors s'abstenir de préciser de quelle boucle vient la valeur courante à condition d'utiliser 'loop-<type>' (à moins d'avoir plusieurs boucles utilisant les mêmes types de valeurs, alors là il faut tout de même préciser le numéro de la boucle).

    loop all players:
      loop all items of loop-player:
        broadcast "%loop-value-1% possède %loop-value-2%"
    

    Dernière petite info, on peut arrêter prématurément une boucle avec 'stop loop', par exemple si on cherche une valeur dans une liste de valeurs, on peut arrêter la boucle dès qu'on a trouvé ce que l'on cherche.

    loop message split at " ":
       if loop-value is "une insulte", "un gros mot" or "un mot pas gentil":
           send "%player% a dit '%loop-value%' ! :O" to console
           stop loop
    

     

    Voilà, c'est tout pour aujourd'hui !

     

    Comme annoncé en introduction, le prochain tutoriel se concentrera sur les listes de variables, et complétera accessoirement les caractéristiques des boucles 'loop' (pour les connaisseurs, les 'loop-index').

     

     

    J'espère que ce tutoriel vous aura plus, et si c'est le cas, n'hésitez pas à le manifester ;)

     

     

    4rno


  6. Bonjour !

     

    Suite à une demande d'aide, j'ai réalisé une petite fonction qui peut s'avérer très utile !

     

    Elle permet de découper un texte de façon relativement propre, en essayant de ne pas couper les mots si c'est possible.

     

    Tuske permet, en théorie, de faire la même chose, mais il semble que cette fonctionnalité soit cassée chez certains :/ Cette fonction ci permet donc de pallier à ce problème !

     

    Voici le code:

    function splitText(text: text, dist: integer=50) :: texts:
       set {_text::*} to {_text} split by ""
       set {_pos} to {_dist}
       set {_ok} to false
       while {_ok} is not true:
           set {_posok} to false
           while {_posok} is not true:
               if {_text::%{_pos}%} is " ":
                   set {_posok} to true
               else:
                   remove 1 from {_pos}
               set {_c} to (amount of {_pos::*})
               if {_pos} is {_pos::%{_c}%}:
                   set {_pos} to {_pos::%{_c}%}+{_dist}
                   set {_posok} to true
               if {_pos} is 1:
                   set {_pos} to {_pos::%{_c}%}+{_dist}
                   set {_posok} to true
           add {_pos} to {_pos::*}
           set {_pos} to {_pos}+{_dist}+1
           if {_pos} > amount of {_text::*}:
               set {_ok} to true
               add amount of {_text::*} to {_pos::*}
       set {_pos::0} to 0
       loop (amount of {_pos::*}) times:
           add subtext of {_text} between index {_pos::%(loop-value)-1%}+1 and {_pos::%loop-value%} to {_return::*}
       return {_return::*}

    Pour l'utiliser, il suffit de faire

    splitText(<texte>,<Longueur maximale de chaque partie du texte>)

    Elle renverra alors une liste contenant le texte découpé.

     

    Son fonctionnement n'est pas très compliqué. La fonction va d'abord découper le texte demandé à chaque caractère (de cette façon, je peux vérifier à quoi correspond le 16e caractère par exemple). À partir de là, je vais tester si le caractère à la position de la découpe demandée est un espace. Si c'est le cas, c'est bon je sais que je peux split mon texte directement à cette position; sinon je vais diminuer de 1 ma position jusqu'à trouver un espace. Dans le cas où il y a une trèèsss looonnng mot, je teste par précaution si je ne suis pas retombé sur la position de mon split précédent. Alors là seulement je vais devoir découper le mot en 2.

    Je continue cette opération autant de fois que nécessaire pour que le nombre de caractères restants est plus petit que la longueur maximale autorisée.

     

    Voici un petit exemple :

    send splitText("Bonjour je suis un message de test, je vous en prie, testez moi !Je vais être découpé en plein de petits morceaux ^^", 30)

    [ATTACH=full]7208[/ATTACH]

     

     

    Ou en plus long (là je n'ai pas indiqué de longueur maximale, celle par défaut est de 50):

    send splitText("Bonjour je suis un message de test, je vous en prie, testez moi !Je vais être découpé en plein de petits morceaux ^^")

    [ATTACH=full]7209[/ATTACH]

     

     

     

    Bonne utilisation !

    4rno

    • J'aime 1

  7. Autant l'utilisation de "stop" pourrait aider (et encore, car Skript ne lira que des "else"/"else if" par la suite, donc autant dire que l'impact performance est minime).

     

    PS: Les stops à la fin de l’event permettent de stopper totalement l’event et dans certains cas ils évitent des boucles infinies sont si ils sont utiles.

    Si le bloc de code (de l'event entier) est fini, il n'y a aucune raison de mettre un "stop", c'est le but de l'indentation de délimiter le code ^^

     

    PPS: Cette méthode est beaucoup plus structurée car si tu as beaucoup de conditions, la lecture se fait en ligne droite et pas en diagonale.

    Je reste perplexe devant cette argument...

    Ce serait la même chose que de dire "Bah dans un fichier YAML/JSON/XML, n'utilise aucune hiérarchie pour tes données, ça affiche le résultat en diagonale, c'est plus structuré de mettre toutes les données les unes après les autres."


  8. Bof, perso je n'aime pas trop ce genre de pratique, ça complique la lecture et c'est moins structuré.

    Je vois personnellement aucun intérêt à limiter l'indentation, vu que c'est justement là pour mieux structurer son code...

    Le principe des "else" est de justement s'exécuter quand la condition a échouée, donc Skript n'exécutera de toute façon pas le code que tes "else" contiennent, si tes conditions sont vérifiées.

    D'ailleurs, chacun de tes exemple fait exactement le même nombres de ligne, donc bon (en dehors de tes "stop" à la fin de tes 2 derniers exemples, qui sont eux totalement inutiles, à part ajouter une ligne o_O)...


  9. 4rno submitted a new resource:

     

    [plain]GetCursorFace[/plain] - [plain]Récupérez la face du bloc visée par un joueur ![/plain]

     

    Voici un très petit script, mais extrêmement utile !

     

    Celui-ci vous permettra, à travers une unique fonction, de récupérer la face du bloc visé par un joueur.

    Cette fonctionnalité, complètement inexistante de Skript et de ses addons, peut vous être très utile. Pour obtenir ce résultat, il a fallu ici recalculer de toute pièce la géométrie de Minecraft, de façon à récupérer la face visée.

     

     

    Son utilisation est très simple:

    GetCursorFace(player)

    Renvoie la face du bloc visé...

     

    Read more about this resource...


  10. On ne peut pas dire que Skript est un langage de programmation sachant qu'on ne peut que l'utiliser que sur Minecraft.

    Heu.... Wait ?!?

    Cet argument n'a strictement aucun sens, j'aimerais bien savoir depuis quand "parce que l'utilisation d'un langage de programmation" est limité, ça n'en est pas un ?

     

    Et encore:

    Pour débuter votre initiation à Skript, vous devez installer un IDE, un ide est un environnement de programmation d'ou son nom "Environnement de Développement", pour cela vous avez un large choix pour en choisir un, "Atom", "Sublime Text", "Notepad ++" et j'en passe..

    Alors déjà tu dis "environnement de programmation", j'aimerais bien savoir comment utiliser un environnement de programmation sans langage de programmation...

    De plus, dans le cas de Skript, ces logiciels ne sont pas utilisés en tant qu'IDE complet, mais juste comme des éditeurs de texte. Un IDE regroupe, en plus d'un simple éditeur de texte, d'autres outils comme un compilateur ou un débogueur.

     

     

    Enfin bref, c'est à revoir...

    • J'aime 1

  11. Hey,

     

    Voici un petit fragment qui permet d'avoir une durabilité custom pour vos items (attention, non fonctionnel avec les armures !)

    La particularité de ce code, c'est qu'il ne va pas "pré user" l'item pour descendre sa durabilité. Non, ici, la barre d'usure va être "synchronisée" avec l'usure custom de votre objet ;)

    Cependant, le tooltip de l'item ne sera pas correctement défini (vu que à ma connaissance il est impossible de modifier les valeurs inscrites à cet endroit là)

     

    Pour que l'item soit pris en compte comme ayant une durabilité custom, il vous suffit de lui ajouter le nbt tag "{CustomDurability:<durabilité max>}".

     

    En Skript, avec un give, vous pouvez donc faire quelque chose du genre:

    give diamond pickaxe with nbt "{CustomDurability:50}" to player

     

     

    Voici le code (Skstuff et Tuske nécessaires):

    on item damage:
      if event-item is player's tool:
        if tag "CustomDurability" of nbt of event-item is set:
          if tag "CustomDamage" of nbt of event-item is set:
          else:
            add "{CustomDamage:0}" to nbt of player's tool
          set {_maxdamage} to "%tag ""CustomDurability"" of nbt of event-item%" parsed as number - 1
          set {_previousdamage} to "%tag ""CustomDamage"" of nbt of event-item%" parsed as number
          add "{CustomDamage:%{_previousdamage} + item damage%}" to nbt of player's tool
          set durability of player's tool to ({_previousdamage}/{_maxdamage}) * max durability of event-item
    


  12. Merci, mais c'est pas vraiment fait dans un but exhaustif. Il manque des tas d'erreurs, je voulais juste mettre celles qui sont pas forcément simples à comprendre.

    Bon bah alors ça ne te dérange pas si je reprends certaines de tes descriptions d'erreurs (et en ajoutant celles que tu n'a pas marqué) ?

    Comme ça il y aura une description complète de la plupart des erreurs possible ;)

     

    4rno

    • J'aime 1

  13. Bonjour/bonsoir !

     

    Beaucoup énormément de gens demande de l'aide sur le forum ou bien sur le discord inutilement.

    Pas forcément des questions idiotes -bien qu'il y en a ^^- , mais qu'ils pourraient trouver par eux même, en expérimentant et en testant; c'est pourquoi j'ai décidé de faire ce tutoriel ;)

     

    - Installer/Configurer les outils nécessaires -

     

    Déjà pour commencer, on va installer/configurer tout ce qu'il faut pour pouvoir débugger/tester du code facilement ! Il y a -pour moi- plusieurs choses quasiment indispensable au développement Skript:

     

    Utiliser un éditeur de texte correct ! Exit les notes-blocs Windows et autres, faites place à quelque chose de performant et complet !

    Selon moi, un "bon" éditeur de texte doit satisfaire plusieurs critères:

    • Utilisation efficace des fonctions basiques: chercher/remplacer, indentation du code automatique, ...
       
    • Affichage des caractères invisibles, à activer absolument car ça permet d'éviter des bêtes erreurs de tabulations/espaces mélangés au sein d'un même bloc de code
    • Idéalement, une coloration syntaxique adaptée, ça aide également ^^

    Que ce soit Sublime Text, Atom ou bien NotePad++ pour ne citer que les plus connus, chacun peut trouver son bonheur grâce à la multitude des éditeurs de textes existants. N'hésitez donc pas à en tester plusieurs pour vous faire votre propre avis ;)

     

    Le deuxième point important, c'est de posséder un serveur MC dédié au développement, local de préférence, pour pouvoir développer tranquillement, sans crainte de tout casser ^^

    Sur ce serveur, je vous conseille d'installer Skript et ses addons habituels, mais également d'activer dans Skript les "effects commands" ! Cette option se trouve dans le fichier config.sk du dossier Skript, vous devez passer la ligne "enable effect commands" à "true", mais également la ligne "allow ops to use effect commands" à "true".

    Les "effect commands" sont une fonctionnalité de Skript vous permettant d'exécuter des effets directement à partir du chat de Minecraft, un peu comme les commandes. Pour cela, il vous suffit de mettre un point d'exclamation "!" au début de votre message.

    C'est très pratique pour tester des effets sans devoir écrire dans un fichier et recharger un script ;)

     

     

    Maintenant que l'on a tout configuré comme il faut, on peut voir quelques "bonnes pratiques", utile pour éviter de spammer le channel #aide du discord toutes les 2 minutes.

     

    - Écrire du code -

     

    Tout d'abord, si vous cherchez comment formuler quelque chose en Skript, je vous invite à tout d'abord effectuer un recherche sur SkUnity (et vérifiez les addons nécessaires !), dans la grande majorité des cas, vous y trouverez la réponse attendue. Sinon, vous avez également à votre disposition une quantité colossale de tutoriels et autres disponibles sur internet (et ce forum entre autre). il se peut également que la fonctionnalité recherchée ne soit pas implémentée tel quel dans Skript (ou ses addons). À ce moment, il est probable que ce soit possible de le faire de façon détournée (par exemple avec les NBT, très utiles eux aussi).

     

    Si par contre ce n'est pas la syntaxe qui vous bloque mais plus la logique de programmation, que vous n'arrivez pas à imaginer comment faire quelque chose, n'hésitez pas prendre une feuille de papier, un crayon et à imaginer une structure, une logique de programmation qui vous permettra d'arriver à vos fins.

     

    De plus, n'hésitez pas non plus à tester votre code (par exemple de légères variantes si la syntaxe n'est pas acceptée et que vous ne trouvez pas de documentation précise).

     

    - Débugger du code -

     

    Après une heure de travail acharné, Skript vous sort une montagne d'erreurs ? Ne vous inquiétez pas, la plupart du temps ce n'est que des bêtes erreurs de syntaxes faciles à corriger. Cependant, @Gaël Erhlich a déjà fait un tutoriel décrivant les différents messages d'erreurs.

     

    Skript ne vous sort plus d'erreurs, mais votre code ne fonctionne toujours pas ? Il est alors intéressant de placer à différents endroits du code des messages de debugs (Ex. des "broadcast" qui vont vous permettre de vous assurez que tout va bien jusque là). Cela vous permettra de voir précisément à quel endroit il y a un problème, et de ainsi pouvoir le résoudre efficacement.

     

     

     

    Si et seulement si, après avoir suivi les conseils de ce tutoriel, vous ne parvenez toujours pas à résoudre votre problème, les membres de Skript-MC peuvent vous être d'une aide utile, mais, pour ma part, je redirigerai désormais toute question bête ou peu évoluée vers ce topic ^^

     

     

    4rno

    • J'aime 5

  14. Bonjour !

     

    @AlexLew m'avait obligé demandé de présenter un petit système de traduction que j'avais imaginé pour l'aider dans l'optimisation de ses scripts, mais vu qu'il est impatient il l'a présenté lui même, en oubliant certains éléments (et optimisations :O).

     

    Voilà pourquoi je vous présente aujourd'hui un petit système de traduction amélioré.

     

     

    Bon alors on est pas dans la section tutoriel, et puis le code ne fait que 5 lignes, donc je vous décris pas chaque lignes de codes, mais plutôt son utilisation !

    function MsgLang(id: text, p: player, arg: texts="NoValue") :: text:
           set {_content} to single value "ID.%{_id}%.%{lang::%{_p}%}%" get of "language.yml"
           loop (size of {_arg::*}) times:
                   replace all "[%loop-value%]" in {_content} with {_arg::%loop-value%}
           return {_content}

     

     

    L'idée de base de cette fonction est de, en lui renseignant le joueur et un ID de texte, renvoyer le texte correspondant dans la langue du joueur (définie par {lang::%player%}). Toutes ces traductions vont être enregistrées au préalable dans un fichier au format YAML, en suivant cet exemple:

    ID:
     newjoin:
       FR: [1] a rejoint pour la première fois le serveur, dites lui bienvenue !
       EN: [1] is a new player on the server, say him hello !
       NL: [1] is een nieuwe speler op de server, zeg hem hallo !
     jointeam:
       FR: Vous avez rejoint l'équipe [1] ! Vos équipiers sont [2].
       EN: You joined the [1] team. Your teammates are [2].
       NL: Je ben in de [1] ploeg. Jouwe teamgenoten zijn [2].

     

    Donc comme déjà dit, ce système est légèrement amélioré dans le sens où vous pouvez utiliser des arguments/paramètres/champs personnalisés (appelez ça comme vous voulez) destinés à contenir une liste de joueurs, un timer, ... bref, une donnée variable !

     

    En gros, dans votre fichier de traduction, vous pouvez inclure à des endroits des [1], [2], etc (utilisez en autant que vous voulez) pour dire à la fonction "À cet endroit là, je veux que tu utilises ce texte: ..."

    À ce moment là, vous indiquer en troisième argument de la fonction le ou les champs à compléter.

     

    Petite astuce, vous pouvez écrire directement la liste de "champs personnalisés" à passer sans utiliser de variables liste en utilisant:

    MsgLang(<id>, <player> , ("<première argument>", "<deuxième argument>", ...))

     

     

     

    Cependant, ce système a quelques défauts, par exemple, dans le 2e texte "jointeam", il faudrait également traduire les couleurs des équipes disponibles...

     

     

    Voilà c'est tout, il ne vous reste plus qu'à créer un système pour définir la langue du joueur, par exemple avec une commande, et à compléter le fichier de traduction !

     

     

    4rno

    • J'aime 2
×

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.