Kriax Posté(e) le 7 septembre 2015 Share Posté(e) le 7 septembre 2015 (modifié) 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 ^^" Modifié le 13 juillet 2016 par Kriax Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
CM_Delachambre Posté(e) le 7 septembre 2015 Share Posté(e) le 7 septembre 2015 Tu n'as pas de questionnaire alors je vais te poser moi une question, qu'est ce qu'un VOID pour toi ? ;). Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
alex30555 Posté(e) le 8 septembre 2015 Share Posté(e) le 8 septembre 2015 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) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kriax Posté(e) le 8 septembre 2015 Auteur Share Posté(e) le 8 septembre 2015 (modifié) 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. Modifié le 8 septembre 2015 par Kriax Correction de ma phase avec mon ordi :p Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.