Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
News ticker
  • Bienvenue sur le nouveau forum VeryGames
  • Welcome to the new VeryGames forum
  • VeryNews

    Tuto #3 : Les fonctions


    Recommended Posts

    Hellow,

     

    Troisième tuto pour dev en Sourcepawn.

    Ici nous allons apprendres les fonctions.

    #Attentions, sans connaitres comment compiler un plugin en locale ça ne vous serviras pas (Un tutos de compilations arrive).

     

    Explications :

    Les fonctions sont les bases dans un languages de programation, ce sont les mots qui permettent de faire différentes choses.

    Elles sont définis par leur languages mais des extentions, includes, ... peuvent en apporter bien plus.

     

    Dans le Sourcepawn une fonction est appeller par une include (principalement !).

    Une include est une librairie de fonction, ça permet aussi de moduler un plugin, mais nous verront ça bien bien après.

     

    Pour inclure un librairie de fonction nous devons dire au plugins de lire l'include, ce n'est pas compliquers.

    Ici nous allons utiliser l'include sdktools qui permet de donner une arme, ...

    #include <sdktools>
    

    Voilà, le plugins sais que il dois lire l'include sdktools

     

    Nous allons désormais créé un plugin qui permetteras de donner un deagle, c'est simple.

    Nous allons utiliser :

    OnPluginStart : Appeller quand le plugins se lance
    RegConsoleCmd : Définis une commande console (! et / dans le chat OU sm_ dans la console)
    GivePlayerItem : Permet de donner une arme (un item)
    IsClientInGame : Permet de vérifier si le joueur est en jeu
    IsClientConnected : Permet de vérifier si le joueur est connecter
    IsPlayerAlive : Permet de vérifier si le joueur est en vie
    PrintToChat : Envois un message dans le chat à l'index du client demander
    GetClientTeam : Permet de reprendre la team de l'index du client demander
    

    Dans certaines fonctions nous allons utiliser se que on appel un CallBack.

    Le CallBack est simplement l'appellation de se que dois faire la fonction.

    Fonction = Maman | CallBack = Enfant (En très gros c'est ça).

     

    Pour pouvoir donner une arme nous avons besoin de l'include sdktools et de définir la commande quand le plugins se lance

    #include <sdktools>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    

    Vous avez surement remarquer que dans le RegConsoleCmd nous avons se que nous appellons des arguments.

    Le premier arguments est la commande qui permet d'appeller le callback (sm_deagle dans la console ou !deagle dans le chat ou /deagle dans le chat).

    Le deuxième argument est le nom du CallBack de la commande, nous aurions pus l'appeller CallBackDeLaCommandeDeagle, mais le CallBack appeller doit porter le même nom, sinon ça ne marche pas.

    Le troisième argument est l’explication de la commande dans le sm_help (Perso je l'utilise jamais).

     

    Maintenant nous devons appeler le callback de la commande

    #include <sdktools>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    
    public Action Command_Deagle(int client, int args)
    {
    
    }
    

    Ici commence la complication : (client, args)

    Ce sont les arguments demander quand vous définisser une commande.

    La variable client permet de définir le joueur qui tape la commande, l'arguments args c'est le nombre d'argument après la commande :

    !deagle toto prout caca auras trois arguments.

    #Informations : Vous pouvez nommer les variables comme vous avez envie

     

    Maintenant nous allons vérifie que le joueur est connecter et en jeu. Cela évite d'avoir un message dans les logs du genre

    "Index clients XXX is invalid"

    Pour cela nous allons utiliser les conditions d’existence (Tuto #2)

    #include <sdktools>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    
    public Action Command_Deagle(int client, int args)
    {
       if(IsClientInGame(client) && IsClientConnected(client))
       {
    
       }
    }
    

    Nous vérifions maintenant que sont équipe est supérieur celle des CT sinon on lui dit qu'il est en CT

    #include <sdktools>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    
    public Action Command_Deagle(int client, int args)
    {
       if(IsClientInGame(client) && IsClientConnected(client))
       {
           if(GetClientTeam(client) > 1)
           {
    
           }
           else
           {
               PrintToChat(client, "Vous ne pouvez pas utiliser la commande en spectateur");
           }
       }
    }
    

    On vérifie qu'il est en vie sinon on lui dit qu'il est mort

    #include <sdktools>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    
    public Action Command_Deagle(int client, int args)
    {
       if(IsClientInGame(client) && IsClientConnected(client))
       {
           if(GetClientTeam(client) > 1)
           {
               if(IsPlayerAlive(client))
               {
    
               }
               else
               {
                   PrintToChat(client, "Vous ne pouvez pas utiliser la commande en étant mort");
               }
           }
           else
           {
               PrintToChat(client, "Vous ne pouvez pas utiliser la commande en spectateur");
           }
       }
    }
    

    Et on donne le deagle si il est en vie

    #include <sdktools>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    
    public Action Command_Deagle(int client, int args)
    {
       if(IsClientInGame(client) && IsClientConnected(client))
       {
           if(GetClientTeam(client) > 1)
           {
               if(IsPlayerAlive(client))
               {
                   GivePlayerItem(client, "weapon_deagle");
               }
               else
               {
                   PrintToChat(client, "Vous ne pouvez pas utiliser la commande en "étant mort");
               }
           }
           else
           {
               PrintToChat(client, "Vous ne pouvez pas utiliser la commande en spectateur");
           }
       }
    }
    

    Voilà, le plugin est coder, mais il y a un problème, si le joueur à déjà une arme secondaire (un petit gun) ça donneras l'arme à terre et la commande peut-être flood.

    Pour cela nous allons faire une vérification, et si il à déja un gun on lui retire.

    Pour faire tout cela nous allons avoir besoin de l'include <cstrike>

     

    Nous allons utiliser :

    GetPlayerWeaponSlot : Permet de reprendre une arme de l'index du client utiliser

    CS_SLOT_SECONDARY : Define défini par l'include cstrike (nous verrons les defines plus tard)

    RemovePlayerItem : Permet de retirer l'item d'un joueur

     

     

    Nous allons créé une nouvelle variable nommer weapon et y stocker l'arme secondaire :

    Si ce n'est pas vide (au dessus de -1) on donne l'arme, sinon on la remove et on la donne

    #include <sdktools>
    #include <cstrike>
    
    public void OnPluginStart()
    {
       RegConsoleCmd("sm_deagle", Command_Deagle, "Commande qui permet de donner un deagle");
    }
    
    public Action Command_Deagle(int client, int args)
    {
       if(IsClientInGame(client) && IsClientConnected(client))
       {
           if(GetClientTeam(client) > 1)
           {
               if(IsPlayerAlive(client))
               {
                   int weapon = GetPlayerWeaponSlot(client, CS_SLOT_SECONDARY)
    
                   if(weapon != -1)
                   {
                       RemovePlayerItem(client, weapon);
                       GivePlayerItem(client, "weapon_deagle");
                   }
                   else
                   {
                       GivePlayerItem(client, "weapon_deagle");
                   }
               }
               else
               {
                   PrintToChat(client, "Vous ne pouvez pas utiliser la commande en "étant mort");
               }
           }
           else
           {
               PrintToChat(client, "Vous ne pouvez pas utiliser la commande en spectateur");
           }
       }
    }
    

    Pour les fonctions vous pouvez aussi les créés tout commes les includes.

    La création d'une fonction se fais simplement :

    stock void SetClientSpeed(client, float amount)
    {
       SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", amount);
    }
    

     

    Je passe le questionnaire pour ce tutos, j'ai pas trop d'idée ^^"

    Edited by Kriax
    Link to post
    Share on other sites
    Tu n'as pas de questionnaire alors je vais te poser moi une question, qu'est ce qu'un VOID pour toi ? ;).

     

    void = rien

    En théorie pour dire qu'une fonction ne retourne rien.

    En C, souvent pour déclarer des pointeurs. (Mais je crois pas qu'il y a de Pointeurs en Sourcepawn)

    Link to post
    Share on other sites

    Dans d'autres language c'est déclarer par un * et permettent d'utiliser une valeur avec un & (en C si j'dit pas de connerie) si je dit pas de connerie et le sp le comprends donc techniquement je pense que c'est possible, je me suis jamais poser la question.

     

    Par curiosité je ferais une recherche.

     

    Delachambre, si t'as envie de m’ennuyer j'ignorerais.

    La réponse se trouve au dessus, et au passage merci Alex.

    Edited by Kriax
    Correction de ma phase avec mon ordi :p
    Link to post
    Share on other sites

    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.

    Guest
    Reply to this topic...

    ×   Pasted as rich text.   Paste as plain text instead

      Only 75 emoji are allowed.

    ×   Your link has been automatically embedded.   Display as a link instead

    ×   Your previous content has been restored.   Clear editor

    ×   You cannot paste images directly. Upload or insert images from URL.

    ×
    ×
    • Create New...