Aller au contenu

Messages recommandés

Posté(e)

Bonjour !

Cette 'petite' fonction va vous permettre de tronquer un texte pour qu'il ait une certaine longueur.

Il existe déjà une expression inclue dans Skript permettant de prendre les x premières/dernières lettres d'un texte, mais elle ne prend pas en compte le code couleur.

Par exemple ce texte : "§4§lTexte génial" apparait comme ceci : "Texte génial" dans minecraft. Mais si vous utilisez par exemple 'first 5 characters of "§4§lTexte génial"', vous n'obtiendrez pas "Texte" mais bien "T", car les marques de couleur et mise en page comptent pour 2 lettres chacune. Si par contre vous utilisez ma fonction, le code couleur sera ignoré, et vous obtiendrez bien le texte voulu. Pour utiliser la fonction, il vous suffit d'écrire :

decouper("§4§lTexte génial" , 5 , "")

Le dernier argument ("") est ici laissé vide. Si par exemple vous vous servez de cette fonction pour raccourcir le nom d'un joueur, il serai utile de rajouter quelque chose comme "...". Si vous voulez les 10 premières lettres du nom d'un joueur, avec "..." à la fin, il vous faut donc écrire :

decouper(player's name , 10 , "...")

Notez que si le texte que vous envoyez est plus court que la limite donnée, le résultat sera le texte d'origine, sans les "..." à la fin.

Voici la fonction, commentée et expliquée :

function decouper(t: text , s: number , end: text) :: text:
  set {_split::*} to {_t} split by "" # on découpe le teste d'origine, pour le prendre lettre par lettre

  set {_formatSave::*} to "" and "" #éviter des <none>
  set {_countLetters} to 0 # pour compter les lettres, et pas les formatages (§a,§b,..)

  set {_noFormatName::1} to "" # éviter un "none" plus tard
  set {_nextFormat} to 0 
  set {_STOP} to 0
  set {_absoluteCount} to 0 # pour compter toute les lettres

  loop {_split::*}: # on fait défiler toutes les lettres
    add 1 to {_countLetters} #compteur ..
    add 1 to {_absoluteCount}
    if loop-value is "§": # si on a une marque de formatage
      set {_nextFormat} to 1 # on précise que la prochaine lettre sera ledit format
      set {_STOP} to 1 # pour que l'on passe directement à la lettre suivante

    if {_STOP} is 1: # 
      set {_STOP} to 0

    else: # si on a pas de marque de formatage = pas de "§"
      if {_nextFormat} is 1: # càd si la lettre précédante était "§"
        set {_nextFormat} to 0 # pour réinitialiser
        remove 2 from {_countLetters} # car countLetters ne prend que les lettres visibles et pas les formatages
        set {_formatSave::%{_absoluteCount}%} to "%{_countLetters} + 1%||%loop-value%" # on sauvegarde en premier la place du formatage dans le texte, puis le format en lui même
      else: # si c'est une lettre normale,
        set {_noFormatName::%{_countLetters}%} to loop-value # on l'ajoute à une liste de lettre correspondant au texte, sans les couleurs, mise en page

  set {_finalName} to "" # éviter des nones.....
  set {_toBeAdded} to ""
  set {_STOP} to 0
  set {_endWhile} to size of {_noFormatName::*}
  set {_whileCount} to 0 # représente le nombre de lettres apparrantes dans le texte final
  set {_whileVerif} to 0 # en cas de problème avec while, fait automatiquement s'arreter la boucle si ça dure trop longtemps (évite un crash du serveur)
  while {_whileCount} is smaller than {_endWhile}: # tant qu'on est pas arrivé au bout de toutes les lettres
    loop {_formatSave::*}: # on fait défiler les formats, qui sont tous enregistrés dans cette variable
      set {_temp::*} to (loop-value) split by "||" #on sépare les 2 informations
      if "%{_temp::1}%" is equal to "%{_whileCount} + 1%": # whileCount représente la place dans le texte. Si à cette place un formatage est mis, alors on sauvegarde ce formatage
        set {_toBeAdded} to "%{_temp::2}%" # sauvegarde du format
        delete {_formatSave::%loop-index%} # on supprime la format récupéré, pour éviter une boucle
        set {_STOP} to 1 # et on précise que le code doit s'arrêter juste après
        set {_finalName} to "%{_finalName}%§%{_toBeAdded}%" # on ajoute le formatage, sans pour autant ajouter quoi que ce soit au nombre total de lettre, car les formatages sont "invisibles"
        exit 2 sections # car parfois il peut y avoir plusieurs formatage d'affilé, donc on force le passage à la suite
    if {_STOP} is 1: #..
      set {_STOP} to 0
    else: # si il n'y a pas de marque de formatage à cet endroit,
      add 1 to {_whileCount} # on ajoute 1 au nombre total de lettre
      set {_newLetter} to {_noFormatName::%{_whileCount}%}
      set {_finalName} to "%{_finalName}%%{_newLetter}%" # et on ajoute la lettre correspondante au texte final

    if {_whileCount} is greater than {_s}: # Si whileCount (nbre de lettre), dépasse le nombre donné en arguments,
      set {_whileCount} to {_endWhile} +1 # on force la sortie de la boucle while
      set {_finalName} to "%{_finalName}%%{_end}%" # et on ajoute le texte donné au bout du texte déjà obtenu

    # wait 1 tick # ?? renvoie une erreur si décommenté, pour des raisons zobscures
    add 1 to {_whileVerif} # vérification, pour éviter un crash serveur en cas de bug du while
    if {_whileVerif} is greater than 300: # modifiable si vous comptez utiliser ce script pour des textes plus longs
      set {_whileCount} to {_endWhile} +1
  return {_finalName} # on renvoi le texte généré
# Au passage, les noms des variables ont toutes un rapport avec "name", car dans le skript où j'ai eu besoin de créer ce code, cela avait un rapport avec des noms

Je suis conscient que c'est pas très opti, mais boon.

Au passage, vous pourrez voir que le 'wait 1 tick' est mis en commentaire, car pour une raison qui m'échappe, Skript considère que l'on sort de la fonction après ça (j'ai une erreur sur le 'return' si je le décommente). À part ça, tout le code est fonctionnel.

J'espère que ça vous sera utile :)

 

[spoiler=PS]Rappelez vous que la fonction doit être placé soit tout en haut de votre script, soit dans un autre fichier de script situé au dessus dans l'ordre alphabétique. Personnellement, si je dois utiliser une même fonction dans plusieurs de mes scripts, je la met dans un fichier nommé "+fonctions.sk", comme cela je suis quasi sûr qu'il sera chargé en premier. Sinon je la met juste en dessous des options de mon script. L'essentiel est que la fonction soit chargé avant son utilisation dans votre script

  • J'aime 2
Posté(e)
Pas mal, mais je vais pas en quoi ça peut servir o_O
En fait la principale utilisation que je vois, c'est quand on ouvre un GUI avec un nom variable, pour éviter que ce nom dépasse de l'interface. On peut aussi imaginer un item avec une lore coupée pour donner par exemple la première ligne de description d'un item. J'avoue qu'en soit ça n'a pas beaucoup d'utilité, mais je suis sûr que ça servira un jour à quelqu'un ;)

 

Et merci @LavaPower :)

Posté(e)
On peut faire ça pour retirer la couleur :

 

set {_test} to first 5 characters of uncolored "&a&lCoucou"

En effet, tu m'apprend un truc ^^ Néanmoins je suis obligé de retirer le formatage lettre par lettre comme je le fait, car je l'enregistre dans le même temps pour pouvoir "recomposer" le texte avec les X premières lettres ET le code couleur.

  • 4 semaines aprè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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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.