blueblasterz Posté(e) le 12 juin 2017 Posté(e) le 12 juin 2017 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 2
LavaPower Posté(e) le 12 juin 2017 Posté(e) le 12 juin 2017 GG Je n'aurais pas eu le courage de le faire ^^
Inerska Posté(e) le 12 juin 2017 Posté(e) le 12 juin 2017 Pas mal, mais je vais pas en quoi ça peut servir o_O
blueblasterz Posté(e) le 12 juin 2017 Auteur Posté(e) le 12 juin 2017 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 :)
Skripting Posté(e) le 19 juin 2017 Posté(e) le 19 juin 2017 On peut faire ça pour retirer la couleur : set {_test} to first 5 characters of uncolored "&a&lCoucou"
blueblasterz Posté(e) le 19 juin 2017 Auteur Posté(e) le 19 juin 2017 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.
PheonBest Posté(e) le 16 juillet 2017 Posté(e) le 16 juillet 2017 Je n'ai jamais autant utilisé une fonction qui n'a pas été faite par moi :D Un énorme Bravo <3
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