Jump to content
View in the app

A better way to browse. Learn more.

Forum Supreme-Elite

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Dertione

Membre Supreme-Elite
  • Joined

  • Last visited

Everything posted by Dertione

  1. Pour toutes questions, n'hesite pas a me la poser que ce soit ts3, steam fofo ^^.
  2. Bonjour à tous voilà le moment tant attendu ! Votre premier plugin ! Dans ce tutoriel, nous allons voir comment est organisé un plugin dans counter strike source, quelles sont les différentes fonctions utiles et de la programmation pur et dure. Voici tout les liens qui vous seront utiles pour réaliser et comprendre ce plugin : http://wiki.alliedmods.net/Counter-Strike:_Source_Events tout les events dans counter strike http://wiki.alliedmods.net/Generic_Source_Events http://docs.sourcemod.net/api/ Toutes les fonctions sourcepawn Le plugin que nous allons créer est un bonus aléatoires (gift) que nous donnons aux joueurs lorsqu'il spawn. la création du plugin se fait bout par bout. 1°/ Les Includes : Quelles librairies nous faudrait-il pour créer ce plugin ? Sourcemod ==> Obligatoire si nous voulons créer un plugin sourcemod ^^ ! Colors ==> Pour ajouter de la couleur et de la lisibilité ! 2°/ Les variables : Les variables que nous utiliserons aujourd'hui seront principalement des tableaux. Pourquoi des tableaux ? Les tableaux sont indispensables lors de création de plugin (dans 99% des plugins vous avez au moins une variable à tableau). Qu'est ce qu'un tableau ? http://www.siteduzero.com/informatique/tutoriels/apprenez-a-programmer-en-c/les-tableaux-dans-la-memoire Pour résumer ce qui est sur ce site : Un tableau est une grosse variable qui rassemble plusieurs valeurs dans une seule variable. Comment définit-on un tableau en sourcepawn ? Cela dépend du type que vous voulez pour votre tableau (string, nombre, etc ...) new tableau[25]; Mais attention, pour créer une chaîne de caractères nous avons déjà besoin d'utiliser un tableau pour définir le nombre de caractère que nous voulons, donc pour créer un tableau composant plusieurs chaines de caractères nous devons faire comme ceci : new String:tableau[5][10] ; /*Ici nous pouvons mettre 5 chaînes de caractère avec un place maximum de 10 caractères*/ Pourquoi utiliser un tableau pour le sourcepawn ? Dans un premier temps, je vais vous expliquer comment sont référencés les joueurs sur un serveur. Lorsqu'un joueur rentre dans un serveur ont lui attribue un chiffre unique pour celui ci qui permettra au plugin de reconnaître plus facilement les joueurs. Nous pouvons attribuer un nombre jusqu'à maximum 64 joueurs qui est le nombre maximum de joueur possible sur un serveur css. Donc lorsque nous voulons utiliser un variable qui prend en compte qu'un seul joueur, nous utiliserons un tableau d'une place de 64 joueurs. Dans le sourcepawn, il y a des variables qui sont déjà prédéfinis pour ne pas se tromper (car rappelons le nous, le sourcepawn n'est pas fait que pour counter strike source et pour un soucis de portabilité, nous utiliserons cette variable pour définir le nombre maximum de joueur dans une partie : MAXPLAYERS +1 . Quelles sont les variables que nous utiliserons pour notre plugin ? new gift[MAXPLAYERS+1]; /* création de la variable gift qui prend en compte tout les joueurs sur le serveur*/ new medik[MAXPLAYERS+1];/* création de la variable medik qui prend en compte tout les joueurs sur le serveur*/ new g_packhe[MAXPLAYERS+1]; /* création de la variable packhe qui prend en compte tout les joueurs sur le serveur*/ 3°/ Les info du plugin : Les informations du plugin sont important, pour savoir de quoi il s'agit ou pour retrouver l'auteur. Donc systématiquement dans votre plugin vous mettrais ceci : public Plugin:myinfo = { name = "Gift", author = "Toi", description = "Plugin Gift", version = "0.1", url = "http://forum.supreme-elite.fr" } 4°/ Le démarrage du plugin : Pour un plugin sourcepawn, nous avons une fonction qui permet d'initialiser toutes les fonctions que vous voulez. Chaque fonction sera initialiser dans cette boucle. public OnPluginStart() { /*Initialisation de vos fonctions, variables etc ... } Il y a beaucoup de sous fonction qui permette de les initialiser : RegConsoleCmd("sm_gift", Command_Gift); RegConsoleCmd("sm_medik", Command_Medik);/* création de la commande medik */RegConsoleCmd("sm_packhe", Command_PackHe); /* création de la commande packhe */ /* Ces sous fonction (en violet), permettent d'initialiser une commande qui nous taperons dans le chat ou dans la console. Entre guillemet, nous avons ce qui nous devrons tapez pour lancer la fonction. En dernier, le nom de la fonction dans notre plugin. */ HookEvent("player_spawn", OnPlayerSpawn); /* Cette sous fonction permet d'initialiser un événement de counter strike source qui est ici "player_spawn". Pour connaître tout les événements référencez-vous au lien au tout début. Entre guillemet, c'est le nom de l'événement. En dernier, Le nom de la fonction qui nous utiliserons dans notre plugin Donc voici les 4 sous fonctions que nous mettrons dans le plugin start. Ce qui nous donnera : public OnPluginStart() { RegConsoleCmd("sm_gift", Command_Gift); /* création de la commande gift */ RegConsoleCmd("sm_medik", Command_Medik);/* création de la commande medik */ RegConsoleCmd("sm_packhe", Command_PackHe); /* création de la commande packhe */ HookEvent("player_spawn", OnPlayerSpawn); } 5°/ Fonction OnPlayerSpawn : Nous utiliserons cette fonction pour initialiser le gift et les flags pour pouvoir utiliser les commandes medik et packhe. Pour ce qui ne savent pas ce qu'est un flag : C'est un nom qu'on donne souvent à une variable qui va permette de savoir si oui ou non l'utilisateur pourra utiliser la fonction bloqué par ce flag. public OnPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) /*partie qui se passe à chaque spawn d'un joueur */ { new client = GetClientOfUserId(GetEventInt(event, "userid")); /* on récupère le chiffre attribué au joueur */ g_bCutdammage[client] = false; medik[client]=0; /* Flag : on autorise la commande gift 0 fois */ g_packhe[client]=0; /* Flag : on autorise la commande gift 0 fois */ g_bKnife[client]=0; /* Flag : on autorise la commande gift 0 fois */ if (GetUserFlagBits(client) & ADMFLAG_CUSTOM6 || GetUserFlagBits(client) & ADMFLAG_BAN) /* si le joueur est admin ou vip, on fait ce que ce passe entre parenthèse sinon on passe a la suite*/ { CPrintToChat(client, " {green}[VIP] : Vous pouvez taper !gift."); /* écrit au joueur seulement*/ gift[client] = 1; /* Flag : on autorise la commande gift 1 fois */ } } 6°/ Commande GIFT : Cette commande va attribuer un cadeau aléatoire au joueur qui tapera la commande : public Action:Command_Gift(client, args) /* commande gift*/ { if ((GetUserFlagBits(client) & ADMFLAG_CUSTOM6 || GetUserFlagBits(client) & ADMFLAG_BAN)&&IsPlayerAlive(client)) { if (gift[client] > 0) /* si gift =1 ou est superieur alors on autorise la commane*/ { new bonus = GetRandomInt(1, 200); /* on met un nombre au hasard dans le variable bonus entre 1 et 200*/ new team = GetClientTeam(client); if(team==2||team==3) /* si le joueurs est en anti ou en terro */ { if(bonus<=10) // si le nombre tiré au hasard est inférieur ou égal a 10 sinon on passe au "else if" ligne 84 { new health = GetClientHealth(client); /* on prend le valeur de la vie du joueur*/ new nowhealth = health + 15; /* on lui ajoute 15 */ SetEntityHealth(client, nowhealth); /* on applique la nouvelle vie donc on ajoute 15 Hp */ CPrintToChat(client, " {green}[VIP] : Vous avez gagner 15 HP."); gift[client]--; /* gift ne sera plus utilisable */ return Plugin_Handled; } else if (bonus<=20) // si le nombre tiré au hasard est inférieur ou égal a 20 sinon on passe au "else if" ligne 94 { new health = GetClientHealth(client); new nowhealth = health - 15; SetEntityHealth(client, nowhealth); CPrintToChat(client, " {green}[VIP] : Vous avez perdu 15 HP."); gift[client]--; return Plugin_Handled; } else if (bonus<=30) // si le nombre tiré au hasard est inférieur ou égal a 30 sinon on passe au "else if" ligne 104 { GivePlayerItem(client, "weapon_awp"); /* on donne un usp a un joueur */ SetWeaponAmmo(client, 7); /* on lui donne 7 balles */ SetWeaponClipAmmo(client, 2, 0); /* 0 balle dans le chargeur */ CPrintToChat(client, " {green}[VIP] : Vous avez gagner 1 USP"); gift[client]--; return Plugin_Handled; } else if (bonus<=38) // si le nombre tiré au hasard est inférieur ou égal a 38 sinon on passe au "else if" ligne 115 { g_packhe[client]=1;/* la commande packhe est utilisable */ medik[client]=1;/* la commande medik est utilisable */ CPrintToChat(client, " {green}[VIP] : Vous avez gagner un !packhe et un !medik."); gift[client]--; return Plugin_Handled; } else if (bonus<=60) // si le nombre tiré au hasard est inférieur ou égal a 60 sinon on passe au "else if" ligne 126 { new Float:speed = GetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue"); /* on prend la valeur de la vitesse du joueur */ new Float:nowspeed = speed + 0.1; /* on lui ajoute 0.1 donc normalement 1+0.1 */ SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", nowspeed); /* on applique cette nouvelle vitesse */ CPrintToChat(client, " {green}[VIP] : Vous avez gagner de la vitesse pendant 15sec."); gift[client]--; CreateTimer(15.0, Timer_Gift_speed2, client) ; /* au bout de 15 secondes, on execute ce qui a dans le fonction timer_gift_speed2 */ return Plugin_Handled; } else if (bonus<=65) // si le nombre tiré au hasard est inférieur ou égal a 65 sinon on passe au "else" ligne 138 { new Float:speed = GetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue"); new Float:nowspeed = speed - 0.1; SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", nowspeed); CPrintToChat(client, " {green}[VIP] : Vous avez gagner de la vitesse pendant 15sec."); gift[client]--; CreateTimer(15.0, Timer_Gift_speed1, client) ; return Plugin_Handled; } else //sinon { CPrintToChat(client, " {green}[VIP] : Pas de chance vous avez perdu !."); gift[client]--; } } else { CPrintToChat(client, " {green}[VIP] : Erreur le plugin ne fonctionne que pour les terroristes."); } } else // si le gift =0 { CPrintToChat(client, " {green}[VIP] : Vous avez déjà utilisé votre !gift."); return Plugin_Handled; } } else // si la personn est morte ou non-vip { CPrintToChat(client, " {green}[VIP] : Vous devez etre vivant ou vip."); return Plugin_Handled; } return Plugin_Continue; } public Action:Timer_Gift_speed1(Handle:timer, any:client) /* en gros on remet la vitesse initiale */ { new Float:speed1 = GetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue"); new Float:nowspeed1 = speed1 + 0.1; SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", nowspeed1); CPrintToChat(client, " {green}[VIP] : Vous avez perdu votre malus vitesse !"); } public Action:Timer_Gift_speed2(Handle:timer, any:client) /* en gros on remet la vitesse initiale */ { new Float:speed1 = GetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue"); new Float:nowspeed1 = speed1 - 0.1; SetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue", nowspeed1); CPrintToChat(client, " {green}[VIP] : Vous avez perdu votre bonus vitesse !"); } 7°/ Commande medik : public Action:Command_Medik(client, args) { if(medik[client]==1) /* si le flag medik autorise le passage */ { new health = GetClientHealth(client); /* on crée une variable health et on recupère celle du joueur */ if(health>=70) /* si sa vie est supérieur a 70 */ { CPrintToChat(client, " {green}[VIP] : Vous avez deja plus de 70 Hp."); return Plugin_Handled; } else { new nowhealth = health + 40; /* on crée une nouvelle variable et on lui ajoute 40 de plus que health */ SetEntityHealth(client, nowhealth); /* on applique la vie qu'il y a dans la variable newhealth */ CPrintToChat(client, " {green}[VIP] : Vous avez gagner 40 Hp."); medik[client]=0; /* on interdit une prochaine commande medik */ return Plugin_Handled; } } else { CPrintToChat(client, " {green}[VIP] : Vous n'avez pas acces a cette commande."); return Plugin_Handled; } return Plugin_Continue; } 8°/ Commande packhe : public Action:Command_PackHe(client, args) { if ((GetUserFlagBits(client) & ADMFLAG_CUSTOM6 || GetUserFlagBits(client) & ADMFLAG_BAN)&&IsPlayerAlive(client)) { if(g_packhe[client]==1) { CPrintToChat(client, " {green}[VIP] : Vous avez gagné un pack HE !"); GivePlayerItem(client, "weapon_hegrenade"); /* on donne les trois grenade */ GivePlayerItem(client, "weapon_flashbang"); GivePlayerItem(client, "weapon_smokegrenade"); g_packhe[client]=0; return Plugin_Handled; } else { CPrintToChat(client, " {green}[VIP] : Vous n'avez pas accès à cette commande !"); return Plugin_Handled; } } else { CPrintToChat(client, " {green}[VIP] : Il faut etre vip pour utiliser cette commande !"); return Plugin_Handled; } return Plugin_Continue; } 9°/ fonction créer par un utilisateur et utiliser dans la commande gift : stock SetWeaponClipAmmo(client, slot, ammo) { new ammoOffset = FindSendPropInfo("CCSPlayer", "m_iAmmo"); return SetEntData(client, ammoOffset+(slot*4), ammo); } stock SetWeaponAmmo(client, ammo) { new iWeapon = GetEntDataEnt2(client, FindSendPropInfo("CCSPlayer", "m_hActiveWeapon")); SetEntData(iWeapon, FindSendPropInfo("CBaseCombatWeapon", "m_iClip1"), ammo); } 10°/ plugin complet : J'aimerais savoir si vous avez rencontrés des difficultés à comprendre ce tuto et si oui, lesquelles ? Pour toutes questions n'hésitez pas !
  3. on a deja un GG DM
  4. Je penses qu'un serveur multigaming serait beaucoup mieux comme vous avez dit precedemment. Mais attendont 1 mois pour voir comment ca va se passer pour le gungame.
  5. vous voulez pas le batman ? mdr sinon ouais no soucis faites sa ^^ !
  6. Quand je vais t'enlever 50 points, on va voir si tu seras tjrs premier .Je modifie ca quand j'ai le temps ^^.
  7. Je suis la a partir de 22h30/23h
  8. Le probleme, c'est que le RP, j'en ai pas lol. Je vais me renseigner, si je peux tavoir sa. Je te redis ca dans la semaine.
  9. Salut tout le monde ! Je tiens à préciser que ce tutoriel sera une base pour l'apprentissage du sourcepawn donc ce sujet sera assez "précis". Si vous voulez apprendre un autre langage, vous pouvez également suivre ce tutoriel mais je vous conseille de poursuivre sur le site du zéro ! Les phrases ou mot dans ce tutoriel seront "grossière" dans le sens où cela ne sera pas totalement vrai mais ça en donne une bonne description. Je tient à rappeler également qu'il ne sera surement pas le plus exhaustif possible, donc si vous avez des questions ou autre n'hésitez pas. À quoi cela va nous servir exactement ? -Le sourcepawn est un langage spécialisé pour le jeu counter strike : source. Donc cela nous servira à améliorer/modifier/créer un mod de jeu. Donc ce tutoriel va fonctionner dans l'analyse d'un fichier source. Je vais vous expliquer à quoi servent chacune des parties d'un fichier source. Commençons ! 1°/ Les includes : Elles sont TOUJOURS défini en début de votre fichier source. Elles sont là principalement pour vous permettre de programmer plus facilement dans le sens où elles vous proposent un large stock de fonction. #include <sourcemod> #include <colors> #include "mesfonctions.h" Avez vous suivi mon tuto sur la compilation d'un plugin ? Si oui, vous devriez remarquer la présence d'include familière comme sourcemod et colors. Voici un exemple de fonction disponible grâce à ces deux librairies : PrintToChat ==> cela permettra d'écrire dans le chat en jeu, une des fonctions les plus utiliser. GetClientTeam ==> Permet de savoir si un joueur est terroristes ou non CPrintToChat ==> vous allez me dire que c'est la même fonction que la première mais elle ne vient pas de la même librairies. "PrintToChat" vient de la librairie <sourcemod> et "CPrintToChat" vient de la librairie colors. La différence, c'est qu'avec "CPrintToChat" nous pouvons écrire en couleur. Pourquoi la troisième librairie n'est elle pas écrite comme les autres ? Car celle ci est une librairie que vous avez créer vous même et qui est relié à votre projet. Nous n'allons pas nous attarder la dessus car c'est pas encore de votre niveau ^^ ! 2°/ Les variables : Il existe un bon nombre de variable et nous pouvons les définir par de nombreuse manière. Les variables sont la pour stocké des informations que vous voulez stocker et de n'importe quel forme. Dans ces variables vous pouvez stocker du texte, des chiffres, des nombres, une suite de caractère etc etc ... a) Comment et où les définit-on ? Vous avez de nombreux choix qui s'offre à vous. Dans un premier temps vous avez les variables globales qui seront définies juste en dessus des includes. Les variables globales sont des variables qui pourront être utilisé dans n'importe quel fonction de notre programme mais elles seront également modifier dès que vous changerez ce qu'il y a dedans. Elles sont très pratique dans le sourcepawn mais attention à n'en pas en abuser. Ensuite nous avons les variables tout court, dans le sens où elles sont utilisés, reconnu et modifié seulement dans la fonction / la boucle où elle sera définie. Nous pouvons donner n'importe quel nom à notre variable mais évitez les caractères spéciaux. Comment les définit-on ? Très simple voici les différentes manières de définir une variable : PS : j'utiliserais la même variable à chaque fois, mais n'oubliez pas qu'une variable ne peut être défini qu'une fois si elle est défini en variable globale mais elle peut être défini plusieurs fois seulement si nous ne l'a définissons pas dans la même fonction / boucles. new tuto = 7 ; ==> je déclare une variable sous le nom de "tuto" et je lui introduit le nombre "7". Ici la variables n'acceptera que les nombres entier new bool:tuto = true ; ==> Ici j'ai déclaré une variable booléan ce qui veut dire qu'elle accepte que deux valeurs "true" ou "false" qui n'est autre que "1" ou "0" new Float:Nombre; ==> ici nous acceptons aussi les nombres à virgules new String:tuto[64]="bonjour tout le monde" ==> Ici j'ai déclaré une variable qui n'acceptera qu'une suite de caractère (donc suite de mots ou de nombres). "String" veut dire "chaine" et 64 signifie le nombre de caractère que nous pouvons mettre dans la variable qui comprends chiffre, lettre, espace, caractère spéciaux etc ... Attention Lorsque vous écrivez du texte il est impératif de le mettre entre guillemets ! Nous pouvons faire ce que l'on veut avec ces variables et nous pouvons les additionner/soustraire/multiplier/diviser lorsque c'est des nombres : Nous allons prendre le petit programme que j'avais pris en exemple dans mon tutoriel sur la compilation : #include <sourcemod> #include <colors> new alibaba = 7; OnClientPutInServer(client) // ==> nous verrons après, dites vous que c'est une fonction quelconque { new voleur = 0; new String:Phrase[64]="lol" ; alilibaba = 9; voleur = alibaba ; PrintToChat(client, Phrase); } c) Petit exercice sur les variables : Que vaut la valeur qui est dans "alibaba" à la fin du programme ? Que vaut la valeur qui est dans "voleur" à la fin du programme ? Qu'est ce qui est écrit lorsque nous utilisons "PrintToChat" avec notre variable "Phrase" ? Réfléchissez et voici ensuite les réponses pour vous corriger : 3°/ Les fonctions / les boucles : Les fonctions généralistes : J'appelles cela des fonctions "généralistes" car elles sont utilisés dans un grand nombre de langage de programmation et non pas seulement que dans le sourcepawn. a) la condition "if" : Pour commencer "if" veut dire "si" en français. Cela va se structurer comme une propriété de mathématique que vous avez appris au collège : SI ma condition est vrai alors "je fais ce qui est dans la boucle" SINON "je fais autre chose" Il existe plusieurs "test" que nous pouvons faire dans ce "if" : On peut également faire plusieurs test dans un même "if" grâce à des transitions comme celles-ci : En langage de programmation cela s'écrit comme ceci : //SANS TRANSITIONS if(tuto == 5) //Si tuto est égale à 5 alors { Nous faisons quelque chose } else //Sinon { Nous faisons autre chose } //AVEC TRANSITIONSif(tuto == 5 && voleur ==6) //Si tuto est égale à 5 ET voleur est égale à 6 alors { Nous faisons quelque chose } else // Sinon { Nous faisons autre chose } la condition "switch" : (copiez sur le site du zéro et modifié pour le sourcepawn) La condition if... else que l'on vient de voir est le type de condition le plus souvent utilisé. En fait, il n'y a pas 36 façons de faire une condition en Sourcepawn . Le if... else permet de gérer tous les cas. Toutefois, le if... else peut s'avérer quelque peu… répétitif. Prenons cet exemple : if (age == 2) { PrintToChat(client,"Salut bebe !"); } else if (age == 6) { PrintToChat(client, "Salut gamin !"); } else if (age == 12) { PrintToChat(client, "Salut jeune !"); } else if (age == 16) { PrintToChat(client, "Salut ado !"); } else if (age == 18) { PrintToChat(client, "Salut adulte !"); } else if (age == 68) { PrintToChat(client, "Salut papy !"); } else { PrintToChat(client, "Je n'ai aucune phrase de prête pour ton age"); } Construire un switch : Les informaticiens détestent faire des choses répétitives. Alors, pour éviter d'avoir à faire des répétitions comme ça quand on teste la valeur d'une seule et même variable, ils ont inventé une autre structure que le if... else. Cette structure particulière s'appelle switch. Voici un switch basé sur l'exemple qu'on vient de voir : switch (age) { case 2: PrintToChat(client,"Salut bebe !"); break; case 6: PrintToChat(client,"Salut gamin !"); break; case 12: PrintToChat(client, "Salut jeune !"); break; case 16: PrintToChat(client, "Salut ado !"); break; case 18: PrintToChat(client, "Salut adulte !"); break; case 68: PrintToChat(client, "Salut papy !"); break; default: PrintToChat(client, "Je n'ai aucune phrase de prête pour ton age "); break; } Imprégnez-vous de mon exemple pour créer vos propres switch. On les utilise plus rarement, mais c'est vrai que c'est pratique car ça fait (un peu) moins de code à taper. L'idée c'est donc d'écrire switch (maVariable) pour dire « je vais tester la valeur de la variable maVariable ». Vous ouvrez ensuite des accolades que vous refermez tout en bas. Ensuite, à l'intérieur de ces accolades, vous gérez tous les cas : case 2, case 4, case 5, case 45… Attention Vous devez mettre une instruction break; obligatoirement à la fin de chaque cas. Si vous ne le faites pas, alors l'ordinateur ira lire les instructions en dessous censées être réservées aux autres cas ! L'instruction break; commande en fait à l'ordinateur de « sortir » des accolades. Enfin, le cas default correspond en fait au else qu'on connaît bien maintenant. Si la variable ne vaut aucune des valeurs précédentes, l'ordinateur ira lire le default. c) la boucle "while" : (copiez sur le site du zéro et modifié pour le sourcepawn) une boucle est une structure qui permet de répéter les mêmes instructions plusieurs fois. Tout comme pour les conditions, il y a plusieurs façons de réaliser des boucles. Au bout du compte, cela revient à faire la même chose : répéter les mêmes instructions un certain nombre de fois. Nous allons voir trois types de boucles courantes en C : Dans tous les cas, le schéma est le même (fig. suivante). http://uploads.siteduzero.com/files/7001_8000/7855.gif Voici ce qu'il se passe dans l'ordre : Le problème dans ce système c'est que si on ne l'arrête pas, le serveur est capable de répéter les instructions à l'infini ! Il n'est pas du genre à se plaindre, vous savez : il fait ce qu'on lui dit de faire… Il pourrait très bien se bloquer dans une boucle infinie, c'est d'ailleurs une des nombreuses craintes des programmeurs (plantage du serveur). Et c'est là qu'on retrouve… les conditions ! Quand on crée une boucle, on indique toujours une condition. Cette condition signifiera « Répète la boucle tant que cette condition est vraie ». Comme je vous l'ai dit, il y a plusieurs manières de s'y prendre. Voyons voir sans plus tarder comment on réalise une boucle de type while en C. Voici comment on construit une boucle while : while (/* Condition */) { // Instructions à répéter } While veut dire "tant que" en français, donc nous pourrions traduire le code juste au dessus par : Tant que la condition est vrai, nous faisons l'instruction à répéter. Dès que cette condition n'est plus vrai, on passe à la suite. Petit exemple : new compteur= 1 ; while(compteur< 6) { PrintToChat(client, "salut"); compteur = compteur + 1; // On ajoute 1 a chaque fois que l'on rentre dans la boucle } //Ici la boucle est effectué 5 fois. Elle est donc effectué jusqu'à que compteur égale 5. d) la boucle do - while : (copiez sur le site du zéro et modifié pour le sourcepawn) Ce type de boucle est très similaire à while, bien qu'un peu moins utilisé en général. La seule chose qui change en fait par rapport à while, c'est la position de la condition. Au lieu d'être au début de la boucle, la condition est à la fin : new compteur = 0; do { PrintToChat(client, "Salut tout le monde !"); compteur++; } while (compteur < 10); Qu'est-ce que ça change ? C'est très simple : la boucle while pourrait très bien ne jamais être exécutée si la condition est fausse dès le départ. Par exemple, si on avait initialisé le compteur à 50, la condition aurait été fausse dès le début et on ne serait jamais rentré dans la boucle. Pour la boucle do… while, c'est différent : cette boucle s'exécutera toujours au moins une fois. En effet, le test se fait à la fin comme vous pouvez le voir. Si on initialise compteur à 50, la boucle s'exécutera une fois. Il est donc parfois utile de faire des boucles de ce type, pour s'assurer que l'on rentre au moins une fois dans la boucle. Attention ! Il y a une particularité dans la boucle do… while qu'on a tendance à oublier quand on débute : il y a un point-virgule tout à la fin ! N'oubliez pas d'en mettre un après le while, sinon votre programme plantera à la compilation ! Je crois quand dans le sourcepawn, les virgules ne sont pas obligatoires mais prenez le réflexe maintenant si vous voulez apprendre d'autre langage par la suite e) la boucle for : (copiez sur le site du zéro et modifié pour le sourcepawn) En théorie, la boucle while permet de réaliser toutes les boucles que l'on veut. Toutefois, tout comme le switch pour les conditions, il est dans certains cas utile d'avoir un autre système de boucle plus « condensé », plus rapide à écrire. Les boucles for sont très très utilisées en programmation. Je n'ai pas de statistiques sous la main, mais sachez que vous utiliserez certainement autant de for que de while, si ce n'est plus, il vous faudra donc savoir manipuler ces deux types de boucles. Comme je vous le disais, les boucles for sont juste une autre façon de faire une boucle while. Voici un exemple de boucle while que nous avons vu tout à l'heure : new compteur = 0; while (compteur < 10) { PrintToChat(client, "Salut tout le monde !"); compteur++; } Voici maintenant l'équivalent en boucle for : new compteur = 0; for( compteur = 0 ; compteur < 10 ; compteur ++) { PrintToChat(client, " Salut tout le monde !"); } Quelles différences ? Vous noterez que l'on n'a pas initialisé la variable compteur à 0 dès sa déclaration (mais on aurait pu le faire). Il y a beaucoup de choses entre les parenthèses après le for (nous allons détailler ça après). Il n'y a plus de compteur++; dans la boucle. Intéressons-nous à ce qui se trouve entre les parenthèses, car c'est là que réside tout l'intérêt de la boucle for. Il y a trois instructions condensées, chacune séparée par un point-virgule. La première est l'initialisation : cette première instruction est utilisée pour préparer notre variable compteur. Dans notre cas, on initialise la variable à 0. La seconde est la condition : comme pour la boucle while, c'est la condition qui dit si la boucle doit être répétée ou non. Tant que la condition est vraie, la boucle for continue. Enfin, il y a l'incrémentation : cette dernière instruction est exécutée à la fin de chaque tour de boucle pour mettre à jour la variable compteur. La quasi-totalité du temps on fera une incrémentation, mais on peut aussi faire une décrémentation (variable--) ou encore n'importe quelle autre opération (variable += 2; pour avancer de 2 en 2 par exemple). Bref, comme vous le voyez la boucle for n'est rien d'autre qu'un condensé. Sachez vous en servir, vous en aurez besoin plus d'une fois ! Les fonctions spécialistes : Ces fonctions là sont particulières au sourcepawn et vous pourrez les retrouver dans d'autres langages de programmation pour certaines mais pour d'autre non. Je vais vous en expliquer une mais si vous voulez en apprendre plus je vous conseille ce site qui référence toutes les fonctions existantes dans le langage sourcepawn : http://docs.sourcemod.net/api/ Il faut savoir également que les fonctions sont structurés d'une certaine manière : 1°) Le type de la fonction (comme pour une variable) (en vert, elle est facultative) 2°) Le nom de la fonction (en rouge) 3°) Les paramètres que vous passez à la fonction (en orange) Attention Lorsque vous écrivez du texte il est impératif de le mettre entre guillemets ! Dans cette fonction nous pouvons mettre des variables entre les guillements. Mais comment ? Car la fonction ne va pas reconnaître la variable mais du simple texte ! Pas de panique voici la solution : //Lorsque vous avez "lol" dans votre fonction, dans la chat va s'afficher le mot lol //Mais si vous faites comme ceci : new String:Phrase[64] = "mdr"; PrintToChat(client, "lol %s", Phrase); // Dans le chat va s'afficher la phrase : "lol mdr" Voici toutes les formes de raccourcis que nous pouvons mettre en guillemet %s ==> pour une variable de texte %d ==> pour une variable de nombre Ce sont les deux principales que vous utiliserez Voilà c'est fini pour cette introduction à la programmation. Preparez vous sur des exercices que je mettrais plus tard à la suite du topic car dans quelque jour, vous me suivrez pour créer votre premier plugin et voir comment les fichiers source sont organisés ! Vous pourrez vous aider également des ces sites si vous voulez vous approfondir la dedans : http://docs.sourcemod.net/api/ http://wiki.alliedmods.net/Introduction_to_SourcePawn http://wiki.alliedmods.net/Category:SourceMod_Scripting Mais également voir de plus près les tableaux : http://www.siteduzero.com/informatique/tutoriels/apprenez-a-programmer-en-c/les-tableaux-2 Bonne journée ! Si j'ai oublié ou fait une faute, c'est possible donc dites le moi ! Pour toutes questions, postez à la suite du topic.
  10. J'ai un RP franklin ou tu peux lasser tes chaussures, tu veux ? Non sans deconner, c'est trop rare, sinon les rp sont buguer mais nous on en a pas.
  11. Moi OP
  12. quand je serais motivé, je le reparerais pour qu'il ne puisse pas s'activer près d'un terro.
  13. Moi je suis chaud papate pour me faire tuer le premier xD ! Je suis partanr
  14. Salut tout le monde ! Je vais pour montrer comment compiler un plugin sourcemod, c'est assez facile mais pas toujours évident pour les débutants. Le tuto va se dérouler en deux partie : -Compilation simple sans "include" particulière -Compilation avec plusieurs include 1°/ Compilation simple sans "include" particulier : Dans un premier temps rendez-vous sur le site sourcemod partie compilation : http://www.sourcemod.net/compiler.php Choisissez votre fichier et cliquez sur compile : http://upload.supreme-elite.fr/images/na1cf.png Voilà c'est déjà fini pour cette partie du tuto qui était relativement simple. Il suffira de glisser ce plugin dans votre serveur et hop, c'est partit ! 2°/ Compilation avec plusieurs include : Comment reconnaître un plugin qui a plusieurs include ? Et bien il suffit de l'ouvrir avec votre éditeur de texte (de préférence notepad ++) et de regarder tout en haut du plugin : http://upload.supreme-elite.fr/images/EDuYA.png Donc commençons par télécharger sourcemod ici : http://www.sourcemod.net/snapshots.php WAOUH !! Il y en a un paquet ! Pas de panique voici une illustration pour vous dire lequel choisir : http://upload.supreme-elite.fr/images/HLOY4.png Pour vous, je vous ais fait un pack tout prêt avec de nombreux include personnalisé : https://mega.co.nz/#!1kgRWJwC!YcE273yxwzwzfZZVQXVqYzED0a0qntgXA7zJVUNMTx8 Ensuite extraire l'archive et rendez-vous dans le sous dossier : /addons/sourcemod/scripting/ Et vous verrez ceci (suivez les instructions et c'est good) : http://upload.supreme-elite.fr/images/cuVa.png Je tiens à préciser que si le fichier que vous avez glissé dans "spcomp.exe" a des erreurs aucun fichier ne se créera ! Voilà , c'est fini. Si j'ai oublié des étapes ou que vous ne comprennez pas une étape, toutes les questions sont les bienvenues.
  15. Salut, je partage un warmup que j'ai réaliser pour le zm:ua car celui du plugin zombie reloaded est complètement planté. C'est assez simple comme warmup, c'est surtout pour attendre les retardataires. surtout vérifiez bien que le temps de votre warmup est inférieur au temps d'apparition du premier zombie, sinon le plugin zombiereloaded plantera. Il est entièrement commenté pour ce qui désire jeter un coup d’œil ou apprendre le sourcepawn. Pour toutes questions n'hésitez pas à poster ici. il se peut qu'il y ait des bug avec le plugin zombie reloaded car je ne sais plus si c'est la bonne version de la source mais le principale est la, si vous voulez vraiment le plugin tout fait je le mettrais en pièce jointe. warmupunlimited.sp
  16. moi je vais me ramener avec une zclass "CHEATEUR OMG"
  17. MDR ! Bientôt dans les truc interdit au bac, il y aura : -Lunette de vue -Lentille de contact Mais comment je vois correctement ???
  18. D'autre lunette vont sortir avant la google glass et son mieux donc...
  19. présent également !
  20. commençons avec l'avis de caca qui n'a pas pu s'exprimer lors d'un sujet de mapping car il a été modérer. Ce n'était pas le sujet principale et ça faisais flood le post d'ignamarte. Donc ici parlons de vos avis politique sans modération. A vous !
  21. Serieux stop flood son topic, vous faites vraiment chier les gas. Et c'est qu'un jeu, stop faire son interressant en sortant ce que tu viens d'apprendre aujourd'hui a l'ecole. C'est un jeu, il se lance dans un projet de mapping assez ambitieux et ils leur fallait un theme comme tout les jeux de guerre qui existe actuellement. Sur ce tout message qui n'aura rien a voir avec son post sera caché.
  22. Vous prenez tout les deux 1 jour de ban, j'espère que ça vous calmera. Je tiens insister sur quelques points qui sont important sur le serveur : -Les insultes quelque soit le contexte sont INTERDITES. -Les incitations de voteban pour 1 fk sont INTERDITES, car cette commande est réservé au cas urgent (grosse grosse insulte, fk de masse). Si quelqu'un fait un freekill ou insulte, regroupez des témoignages et des preuves et les faire parvenir à un staff ou un admin. -Etre zen sur le serveur et ne pas se prendre la tête.
  23. Bon maintenant on arrête les commentaires et les dialogues de sourd, je vais vérifier ce que je peux dans les logs et en conclure ce qui se passera pas la suite. Merci de votre compréhension.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.