Clan SliD Index du Forum
Clan SliD Index du ForumFAQRechercherS’enregistrerConnexion

Les commandes chat string

 
Poster un nouveau sujet   Répondre au sujet    Clan SliD Index du Forum -> Worldedit -> Tutorials
Sujet précédent :: Sujet suivant  
Auteur Message
fulldragon
Membres
Membres

Hors ligne

Inscrit le: 16 Déc 2010
Messages: 1 295
Point(s): 50
Niveau de slide:

MessagePosté le: 03/06/2012, 15:05    Sujet du message: Les commandes chat string Répondre en citant

Vous pouvez voir le tuto en beau bien présenté avec les belles balises sur ce lien

ou sinon ici,

Comment faire simplement un système de commande chat string efficace ?

Déjà voila comment je défini une commande : -<NomDeLaCommande> <ParamêtreOptionnelRattachéALaCommande>

Dans mon exemple les commandes seront détectées par le caractère "-". Vous pouvez très bien le changer à votre guise. De plus, afin de faire simple, ce système ne permettra de gérer que des commandes contenant un seul paramètre.

Remarque : Cet event se déclenchera même si le caractère "-" n'est pas le 1er de la chaîne. On peut rajouter une sécurité en mettant la condition suivante :
(Substring((Entered chat string), 1, 1)) Egal à (==) -


I/ Le système de lecture de chat string

On se place dans un trigger avec l'event suivant :

En GUI :
Joueur - Joueur X (Rouge) types a chat message containing - as Une sous-chaîne


En JASS :
Code:
    call TriggerRegisterPlayerChatEvent( gg_trg_Commandes, Player(X), "-", false )


Bon à savoir : : on ne peut pas utiliser l'event chat avec TriggerRegisterPlayerEvent, tout simplement parce que les fonctions qui sont censées donner les strings entrés en paramètre de l'event, retournent "null" de cette façon (oui c'est un bug).

Remarque : Pour que le trigger s'active à chaque message, il suffit de ne mettre une chaîne vide en event ("" en JASS).

Vous en mettez pour autant de joueur que vous le souhaitez, dans notre exemple c'est le joueur X qui pourra utiliser nos commandes.
Bon et puis les emmerdeurs qui me diront que en jass c'est X-1 car le GUI commence à compter à 1 et le JASS à 0 je vous proute dans notre exemple le JASS et le GUI forment une parfaite harmonie


Bref, continuons :

Une fois votre event fait, il ne vous reste plus qu'à construire votre lecteur de chat string. Cela va être horriblement atroce super intéressant, car même si j'ai déjà fait ce système en JASS, je ne l'ai encore jamais fait en GUI et donc je vais bien me faire chier bien se marrer


Donc, commençons par le GUI :

Pour lire la commande entrée par le joueur, nous avons besoin tout d'abord de définir quelques variables :
-Une qui contiendra le texte, afin de le manipuler plus facilement ;
-Une qui nous indiquera combien de caractère contient la commande.
Set trigger_string = (Entered chat string)
Set nb_car = (Length of trigger_string)
Voila qui est fait.

Ensuite, on commence par lire le nom de la commande. Pour cela, on fait une boucle qui va faire prendre comme valeur à une variable de type chaîne chaque lettre de la commande, et l'ajouter dans une autre variable chaine.
Cependant, comme il se peut que la commande contienne un paramètre, il faut également détecter le caractère " " qui sépare le nom de la commande et son paramètre. Donc, il faut faire une boucle qui possède 2 sorties :
-Une qui est «quand on a atteint le dernier caractère de notre commande» qu'on peut matérialiser par «un entier qui prend comme valeur de 2 à nb_car.»
-Et une autre qui est «Si car = " "»
Or en GUI il est impossible de créer une boucle autre que For. Il faut donc passer par un subterfuge. Vous l'aurez remarqué, on a un "Si" donc une condition. On va donc utiliser un If/then/else qui donnera comme valeur à notre variable d'incrémentation celle de nb_car + 1 afin de sortir de la boucle. Soit :
For each (Integer i) from 2 to nb_car, do (Actions)
Boucle - Actions
Set car = (Substring(trigger_string, i, i))
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
car Egal Ã
Alors - Actions
Set j = i
Set i = (nb_car + 1)
Sinon - Actions
Set name = (name + car)
Set name = String( name ) as Minuscule
(Vous l'aurez vu, j'ai mis un "set j = i", j'vais vous expliquer après.)

Maintenant, il faut s'occuper de notre paramètre éventuel.
Même principe, on lit chaque caractère sauf qu'au lieu de démarrer à 2 on démarre là où l'on s'est arrêté.
Sauf que dans le cas où l'on a un paramètre, notre i a pris la valeur de nb_car + 1 donc on ne peut plus l'utiliser pour continuer (vous verrez en JASS on pourra). C'est la raison du "Set j = i". On sauvegarde la position à laquelle on s'est arrêté, afin de continuer dans une autre boucle comme si de rien n'était. On a donc :
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
car Egal Ã
Alors - Actions
For each (Integer i) from (j + 1) to nb_car, do (Actions)
Boucle - Actions
Set car = (Substring(trigger_string, i, i))
Set param = (param + car)
Sinon - Actions
Set param = String( param ) as Minuscule

Bref, si on récapitule, à la fin vous devez obtenir :

Actions
Set trigger_string = (Entered chat string)
Set nb_car = (Length of trigger_string)
For each (Integer i) from 2 to nb_car, do (Actions)
Boucle - Actions
Set car = (Substring(trigger_string, i, i))
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
car Egal Ã
Alors - Actions
Set j = i
Set i = (nb_car + 1)
Sinon - Actions
Set name = (name + car)
Set name = String( name ) as Minuscule
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
car Egal Ã
Alors - Actions
For each (Integer i) from (j + 1) to nb_car, do (Actions)
Boucle - Actions
Set car = (Substring(trigger_string, i, i))
Set param = (param + car)
Sinon - Actions
Set param = String( param ) as Minuscule


Remarque : Vous l'aurez peut être vu tout seul, mais pour que notre système prenne un paramètre supplémentaire, il suffit de rajouter une loop selon le même schéma. Cependant dans tout les cas on reste limité au nombre de loop que l'on fait, et à ce moment là si on ne veut plus être limité il existe une autre méthode qui consiste à créer un algorithme recommençant en boucle notre lecture de paramètre temps qu'il y a un " " avant le dernier caractère. Mais j'ai voulu faire simple et ne pas tutorialiser (mais oui ça existe) cette méthode.

Voix off : C'est ça ouais, dit plutôt que tu ne sais pas faire !
ET D'OU TU ME SPOIL HEIN ??

(non non je ne développe pas de schizophrénie !)
(Si si)


Voici maintenant le même système en JASS (vous allez voir c'est pas pareil, ça roxx 10 fois plus !) :

Même principe, une lecture caractère par caractère dans des loop. Seule différence, en JASS on roxx et on peut sortir d'un loop sans passer par la case départ entier ! Le exitwhen de la loop fonctionne comme une condition, soit elle retourne true et on sort soit elle retourne false et on continue.
Ah et cette fois-ci, au lieu d'utiliser des variables globales on utilise des locales, c'est plus simple. Du coup on commence par définir chacune de nos variables.
Donc :
Code:
    local string trigger_string = GetEventPlayerChatString()
    local integer nb_car = StringLength(trigger_string)
    local string name = "" // si je ne met pas de valeur, je ne peux pas l'utiliser en mode addition.
    local string car
    local integer i
    local string param = ""
   
    set i = 2
    loop
        set car = SubString(trigger_string, i-1, i)
        exitwhen (i > nb_car or car == " ") // vous voyez je définie 2 modes de sortie.
        set name = name + car
        set i = i + 1
    endloop
   
    set name = StringCase(name, false)

En plus, on a plus besoin de sauvegarder le i puisque cette fois-ci on garde sa valeur dans tout les cas !
Bref, on a plus qu'à lire le paramètre, de la même façon qu'en GUI presque :
Code:
    if car == " " then // pour pas qu'il lise quand il n'y a pas de paramètre.
        loop
            exitwhen i >= nb_car
            set i = i + 1
            set car = SubString(trigger_string, i-1, i)
            set param = param + car
        endloop
    endif

    set param = StringCase(param, false)


Et voila c'est terminé. Vous trouvez toujours que le GUI c'est plus simple que le JASS ?...
Voie off : Ba... Quand on est [Censure]très intelligent, et qu'on sent bon,[/Censure] on y peut rien !
D'OÙ TU ME CENSURES MAINTENANT ???


Remarque : Vous l'aurez notez, je reset mon name et mon param avec la fonction StringCase en jass et avec une autre fonction ayant le même effet en GUI. grâce à ça, si un joueur utilise le nom de la commande AvEc DeS MaJuScUlEs la fonction la reconnaitra toujours. Vous n'êtes pas obligé de le faire si cela ne vous intéresse pas, perso je considère que c'est pas très utile.


II/ Détection de commande.

Bon c'est joli d'avoir lu notre commande et éventuellement notre paramètre, mais maintenant faut s'en servir. Je vais donc vous montrer quelques exemples de détection de commande, c'est tout con en faite. Tout ce qu'il y a à faire c'est une condition par commande : vous vérifiez si name, votre variable qui contient le nom de votre commande, est similaire à tel ou tel nom de commande et exécutez ensuite vos actions.

Exemple GUI :

If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
name Egal à kick
Alors - Actions
For each (Integer A) from 1 to 12, do (Actions)
Boucle - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
Multiple Conditions Or - Any (Conditions) are true
Conditions
param Egal à (String((Integer A)))
param Egal à (Substring((Name of (Player((Integer A)))), 1, (Length of param)))
param Egal à Couleur_txt[(Integer A)]
Alors - Actions
Partie - Display to (All players) for 10.00 seconds the text: ((Name of (Triggering player)) + ( a kické + ((Name of (Player((Integer A)))) + de la partie.)))
Partie - Defeat (Player((Integer A))) with the message: Vous avez été kické
Sinon - Actions
Sinon - Actions

If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
name Egal à visibility
Alors - Actions
For each (Integer A) from 1 to 16, do (Actions)
Boucle - Actions
Visibilité - Destroy Visibility_AC[(Integer A)]
Visibilité - Create an initially Activé visibility modifier for (Player((Integer A))) emitting Visibilité across (Entire map)
Set Visibility_AC[(Integer A)] = (Last created visibility modifier)
Sinon - Actions

Je vous recommande fortement d'utiliser un bloc If/then/else par commande, afin que votre déclo soit plus aéré donc plus agréable à relire.
On a en premier une commande permettant de kick un joueur par 3 moyens différents :
-le slot (les valeurs qu'on retrouve en GUI de 1 à 12)
-la couleur, avec 1 variable à déploiement 12 qui se set quand la variable et le paramètre sont similaires
-le nom du joueur
En 2è on a un système de visibilité s'actionnant dans 16 régions. Hors contexte c'est pas très utile mais dans la map ça avait probablement son utilité x).


Exemple JASS :

Code:
// premier block qui vérifie si le joueur a rentré comme name "aoa" ou "angleOfAttack, cette commande change l'angle d'attaque de la caméra du triggering joueur.
        if (name == "aoa" or name == "angleOfAttack") and param != "" then
            set angle = S2R(param)
            call SetCameraFieldForPlayer(GetTriggerPlayer(), CAMERA_FIELD_ANGLE_OF_ATTACK, angle, 0.)
       
       

// un autre block, à la suite de l'autre. une nouvelle commande = nouvelle condition. celle ci règle le zoom de la caméra.
        elseif (name == "cf" or name == "cameraField") and param != "" then
            set trg_player = GetPlayerId(GetTriggerPlayer())
            set hauteur = S2R(param)
            if hauteur != 0. then
                call SetCameraFieldForPlayer(Player(trg_player), CAMERA_FIELD_TARGET_DISTANCE, hauteur, 0.)
            endif
       


//encore une autre commande qui s'occupe soit de kill soit de kick un joueur.
        elseif name == "kill" or name == "kl" or name == "kick" or name == "kc" then
            if GetTriggerPlayer() == Player(0) then
                if param == "red" or param == "rd" then
                    set trg_player = 0
                elseif param == "blue" or param == "be" then
                    set trg_player = 1
                elseif param == "teal" or param == "tl" then
                    set trg_player = 2
                elseif param == "purple" or param == "pe" then
                    set trg_player = 3
                elseif param == "orange" or param == "oe" then
                    set trg_player = 5
                elseif param == "yellow" or param == "yw" then
                    set trg_player = 4
                elseif param == "green" or param == "gn" then
                    set trg_player = 6
                elseif param == "pink" or param == "pk" then
                    set trg_player = 7
                elseif param == "gray" or param == "gy" then
                    set trg_player = 8
                elseif param == "lightblue" or param == "lb" then
                    set trg_player = 9
                elseif param == "darkgreen" or param == "gn" then
                    set trg_player = 10
                endif
            endif
            if param == "" then
                set trg_player = GetPlayerId(GetTriggerPlayer())
            endif
            if name == "kill" or name == "kl" then
                call KillUnit(udg_invisUnit_j[trg_player])
            elseif name == "kick" or name == "kc" then
                call CustomDefeatBJ(Player(trg_player), "Noob !")
            endif
        endif



Voila merci d'avoir suivi mon tuto.


Credits :
@Vladadamm : Grâce à l'un de ses tutos non validé sur le système d'administration j'ai pas eu besoin de faire les exemples de commandes GUI moi même. Vous le verrez, j'ai copié collé ses triggers (s'pour ça que c'est mal présenté aussi).
@Maximaxou : Mon système est né de son fantastique système qui lui utilise l'algorithme dont j'vous ai parlé. (Il utilise d'autres trucs d'ailleurs qui permet un contrôle plus complet des commandes)
@Fulldragon : Bin oui quand même, les exemples de commandes JASS utilisées sont de moi. Elles sont présentes dans Slide of renewal 3 (qui n'est pas encore sorti).


map exemple : créée par moi.
slide of renewal 3 non protégé et non fini.


Revenir en haut
Publicité






MessagePosté le: 03/06/2012, 15:05    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Clan SliD Index du Forum -> Worldedit -> Tutorials Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  

Portail | Index | créer son forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
darkages Template © larme d'ange
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com