• 28 Mars 2024, 19:17:56


Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - CarCrasher

Pages: [1] 2
1
Scripting SA-MP [Pawn center] / Paquets perdus
« le: 12 Décembre 2014, 20:04:31 »
Bonjour bonjour !

Alors pour commencer à exposer mon problème je vais introduire la situation !
Sur mon serveur, j'organise des events pour les événements IRL, par exemple, à Halloween, j'ai fait envahir la ville de Blueberry (dans la campagne, mon serveur se déroule sur Red County) par des zombies (NPCs) à tuer,  on gagnait des citrouilles (Monnaie), qu'on pouvait échanger contre des vêtements d'halloween, des armes exclusives, de l'argent, etc. !

Ainsi pour Noël, j'avais fait ceci, vous deviez vous rendre à l'atelier du père noël se situant vers la rivière au sud de Red County, là, vous pouviez prendre un traineau (Objets de rennes, cadeaux, planches etc. sur un dodo invisible), et en cliquant, ça prenait le vecteur de la caméra, et ça lançait un cadeau en fonction, qui explosait lorsqu'il était en dessous de la map (GetPointZPos), ou lorsque son trajet était terminé (+- 400 mètres), on avait aussi une map rajoutant des sapins dans les jardins, des lumières de noël etc., et aussi un script qui nous attachait un objet de neige qui tombe.

Pour activer le mode Noël, Halloween, etc., j'utilise des defines:

Code: ("pawn") [Sélectionner]
//#define EVENT_HALLOWEEN
//#define EVENT_NOEL

Pour activer ou désactiver un script, il suffit d'enlever ou d'ajouter
//Compiler, Upload sur le serveur dédié et reboot.


Jusque là, tout va bien, le traineau vole bien, les cadeaux pêtent bien, la neige est pas mal, et j'avais scripté une monnaie (Les mini-cadeaux), échangeables contre un gros cadeau qui contenait des vêtements de noël, des armes, des objets, de l'exp, de l'argent, etc.

Le problème, c'est que vu que tout marchait bien, j'ai décidé de scripter la mission de Noël, en gros, le traineau apparu, vous avez une maison où le cadeau doit être livré, vous avez 100 cadeaux, une fois tous livrés, vous gagnez ceux que vous avez correctement lancé et qui n'ont pas atterri à côté !

Je script je script je script, et lorsque je lance le serveur, tout va bien, le problème est lorsque je me connecte.

Là, ça nous affiche bien le dialog qui nous demande notre mot de passe, ça affiche bien les textdraws, ça affiche un message de bienvenue, en somme, ça exécute OnPlayerConnect.

Mais justement, c'est tout ce que ça exécute, après, plus rien ne s'exécute, le mot de passe rentré ne fait rien, et la sélection de team customisée ne s'affiche pas, rien ne marche plus, alors je vais voir les logs:

Warning: client exceeded 'ackslimit' ***.***.***.***:***** (3265) Limit: 3000/sec

Alors, je me suis dit que c'était normal que ça arrive des fois, alors j'ai réessayé, et non, ça refaisait tout le temps pareil !

J'ai essayé alors de prendre server.cfg, changer l'ackslimit sur 5000, rebelote, toujours inaccessible !

J'ai bien envie de voir ce qui ne marche pas, alors je mets carrément sur 40.000 ! Le problème est que sur 40000, je peux me connecter, rentrer mon mot de passe, parfois choisir mon skin, spawn, mais après 15 secondes de connexion, le problème revient !

J'ai aussi demandé à 3 autres personnes de venir tester, pas la peine de vous dire la réponse je pense.

Ainsi, j'ai décidé de désactiver le mod Noël, résultat: ça marche. Puis, j'ai activé le mod Halloween (Qui est bien plus massif, mange beaucoup plus de variables, et de mémoire (les NPCs...), ça marche !

J'avais en effet au début pensé que j'avais peut-être brisé une limite (Mon code approche des 100.000 lignes de code), mais non.

J'ai alors décidé d'extraire mon code de Noël et de le mettre dans le gamemode lvdm fourni de base avec sa-mp. Là ça vacille, je peux aller au village, prendre un traineau, mais les cadeaux ne marchent pas, et lorsque j'annule la mission de Noël et tente de la reprendre, la commande se solde par un Server: Unknown Command...

Le plus curieux dans cette histoire, c'est que le script de Noël n’apparaît même pas encore sur la callback OnPlayerConnect !

J'ai vraiment essayé beaucoup de choses, mais ne trouve pas non plus de vraie solution sur cela, et je ne comprends pas ce qui peut causer ça, j'ai relu des millions de fois mon code, et je reste sur mon incompréhension :/

Enfin voilà; Je vous fournis le code de tout ce qui est entouré par des #if defined EVENT_NOEL & #endif (Sauf les scripts de météo qui ne fait qu'enlever certaines météos comme la pluie qui ne va pas spécialement avec la neige & le script de chargement du nombre de mini-cadeaux !), ainsi que le OnPlayerConnect:

OnPlayerConnect(playerid): http://pastebin.com/mC9b4y2C
Noël: http://pastebin.com/vRD1xV6a

P.-S.: Je sais que je respecte pas des masses de convention et que mon code est bizarrement indenté !



2
Showroom SA:MP / [FS]Super Mega Rockin' Fun Racin' System v1.0
« le: 26 Août 2014, 17:24:10 »
Bonjour bonjour !

Aujourd'hui j'ai à vous présenter ma dernière innovation en matière de courses !
Vous allez me dire : "Nom d'un bulbizarre ! Mais y'en a déjà cent quatre-vingt-trois milliards des systèmes de course !", mais celui-ci est un peu différent !




The introduction:

La principale nouveauté, est, à moins que cela ait déjà été fait à mon insu, que l'on peut contrairement aux anciens systèmes de courses où l'on ne pouvait que placer les checkpoints, lancer, jouer, est qu'on peut absolument tout paramétrer !

Par exemple;

Les checkpoints sont trop grands pour une course à pied ? Pas de problème, on peut modifier la taille à sa guise !

Oh là là, j'aime bien la Elegy pour le drift, mais là je voudrais faire un saut dans les airs et elle est trop lente, pas de problème, vous pouvez changer le véhicule du joueur a tout moment en conservant sa vitesse !

Mon dieu mon dieu, j'ai commencé ma course au plein milieu du désert et je veux aller à Los Santos sans utiliser les ponts ! No problemo, vous pouvez donner un boost surpuissant à vos véhicules !

C'est bien beau de faire une course de bateaux, mais malheureusement, je ne sais pas si vous savez, mais ça vole moins bien qu'un hélicoptère ! Vous pouvez changer les véhicules à votre guise, les supprimer pour mettre le joueur à pied, lui donner un parachute, un jet-pack, tout !

Mais et si jamais on veut... TOUT ! Mais vous êtes sourde ma parole jeune fille ! ò_Ó

En effet, vous pourrez lors de chaque passage de checkpoint:


  • Rien
  • Transformer le véhicule
  • Booster la vitesse (Paramétrable) du véhicule (Joueur aussi)
  • Arrêt du véhicule (Arrête instantanément le véhicule)
  • Saut du véhicule (Fait faire un saut au véhicule, paramétrable aussi)
  • Éclater les pneus du véhicule
  • Réparer les pneus du véhicule
  • Réparer le véhicule
  • Donner un Jet-Pack au joueur
  • Retirer le Jet-Pack du joueur
  • Donner un parachute au joueur



Vidéo:


Voici une petite vidéo qui montre deux courses entièrement faites par ce système !

https://www.youtube.com/watch?v=KrARg6OgbbU





Téléchargement:

https://www.sendspace.com/file/us0rj2



Credits:


- Moi, [Pix], le script de à peu près tout !
- C_30, j'ai pioché le feu rouge du départ dans XRace !
- [M2R]Draiike, qui m'a aidé à tester tant sa persévérance était !





N'hésitez pas à déposer les bugs à corriger, vos suggestions, vos déclarations d'amour etc. !


3
Coucou !

Donc tout d'abord, je suis pas un noob qui vient de débarquer ! J'ai exploré le pawn dans la plupart des angles possibles, et voilà, j'ai commencé à me demander quelque chose; Faire un jeu sur SA-MP, sur une map assez grande, avec des NPC, des cinématiques, des boss à vaincre, en gros, imaginez, sur une île, un naufragé débarque et doit devenir le roi de l'archipel ! Mais contrairement à un serveur RP naufragé, il s'agirait d'un jeu à part entière, jouable par exemple jusqu'à 4 joueurs ou tout seul, un scénario, des missions, etc.

J'ai beaucoup de temps à investir, je map bien, et pour moi ce projet est totalement faisable d'un point de vue technique, mais je m'adresse à vous, les grands experts, serait-ce une bonne idée, SA-MP est-il adapté pour ce genre de choses ?

4
Scripting SA-MP [Pawn center] / Les timers...
« le: 22 Mai 2014, 22:33:41 »
Coucou et me revoilà !

Donc aujourd'hui pas vraiment de problème par rapport à d'habitude, mais quelque chose que j'avais réalisé il y a pas mal de temps, c'est que les timers sur SA-MP ont une durée qui n'est pas celle qu'on leur attribue.

Par exemple, lorsqu'on démarre un timer d'une minute par exemple, il n'est jamais d'une minute, mais plutôt de quelque chose comme une minute, et quelques secondes.
Les minutes sont donc plus longues que prévues !

Donc par exemple pour une horloge. On aura tendance à faire la plupart du temps un timer d'une minute au terme du quel la fonction d'actualisation du textdraw (ou autre) sera appelée, ou bien seconde, mais le principe reste le même.

Donc SetTimer("UpdateClock", 60000, true);, mais dans ce cas, il s'agira de 64 secondes au lieu de 60.
Maintenant par exemple, il y a des serveurs où des heures sont 'programmées' pour avoir une action, par exemple, un Jour de paie à xxh00 !
Mais imaginons que la dernière fois où UpdateClock aura été appelée était à l'heure réelle de xx-1h59 et 58 secondes !
Le cadran in game affichera xx-1h59, mais lors de la prochaine échéance du timer, l'horloge passera directement de xx-1h59 à xxh01, ce qui dans le cas énoncé peut être frustrant de redevoir attendre une heure.

Même si ça peut paraître assez minime, j'aime pas l'idée que ça se passe comme ça, les bugs doivent être éradiqués !

Donc, ma question, quelqu'un aurait-il un coefficient x tel que (t = temps imputé au timer && ms = millisecondes passées réellement) ms = xt ?!
Et sinon, comment pourrait-on obtenir une valeur exacte et pas un truc genre 16/15 (64/60) !
Avec une fonction Gettickcount (que je ne maîtrise malheureusement pas) en même temps qu'un timer ?!

Enfin celui qui me trouve ça aura un dessin plein de coeurs de ma part !

Alors petit edit ! Finalement je me suis rendu compte que j'étais un imbécile, que GetTickCount c'était super facile à utiliser, une simple soustraction entre deux nombres, à la fin du timer moins au lancage du serveur !

J'ai donc lancé un petit timer de 20 heures, je vous transmettrai les résultats précis de mon enquête !

5
Scripting SA-MP [Pawn center] / Problème trigonométrique !
« le: 02 Mai 2014, 10:51:25 »
Bonjour bonjour !

Aujourd'hui me revoilà avec un nouveau problème plus mathématique que de script !

Donc dans mon script, j'ai un script de vêtements, dont certains sont rares à avoir, mais bon ça on s'en fout !
Donc certains équipements ont une caractéristique spéciale, par exemple la dynamite que l'on peut porter sur le dos provoque une explosion si le joueur meurt !

Mais donc, ici je crée un équipement les yeux laser ! Comme le nom l'indique, il s'agit de pourvoir les yeux du joueur de lasers !
Néanmoins, je voudrais que ces lasers créent des flammes lorsque le joueur appuie sur une telle touche, à l'endroit où les lasers touchent le sol, actuellement, je voudrais que ces explosions ne puissent se faire que lorsque le joueur est immobile, problème réglé en 5 minutes à l'air de GetPlayerVelocity.

Mais le moment où ça coince, c'est le calcul de l'endroit où les lasers touchent le sol !

Donc je me rends compte que le pawno est un peu limité pour ce genre de choses, je me contente de créer une explosion légèrement plus approximative.

Donc ici, j'ai pris des coordonnées, de façon à voir à peu près le truc...

Lorsqu'on est face au nord, càd avec le Facing Angle = 0; L'explosion devrait se produire :
- À 1.6 unités en moins à l’abscisse (xExplosion = xJoueur-1.6)
- À 11 unités en plus à l'ordonnée (yExplosion = yJoueur+11)

Donc en fait le problème réside surtout dans le fait que la divergence sur l'abscisse n'est pas isométrique à celle sur l'ordonnée, donc ça fait pas un cercle, mais plutôt une sorte d'ovale trigonométrique ! :happy:

Code: (pawn) [Sélectionner]
new Float:x, Float:y, Float:z, Float:angle;
GetPlayerPos(playerid,x,y,z);
GetPlayerFacingAngle(playerid, angle);
x += (-1.6 * floatsin(-angle, degrees));
y += (11 * floatcos(-angle, degrees));
CreateExplosion(x, y, z, 1, 7.0);

Je sais absolutiment pas comment le modifier de façon à ce que ça fonctionne, là en fait, le code fonctionne lorsque le joueur est face au nord ou au sud, mais lorsque c'est vers l'est ou l'ouest, l'explosion se produit à l'inverse de loin et un peu décallé, c'est à dire tout près :(

Enfin merci mes choupinous ! :kiss:

6
Bonjour les enfants !
Dans l'optique de faire un système qui, pour chaque heure jouée, on reçoit un certain nombre de points d'expérience et tout ça... je voulais le faire à une autre manière que d'habitude, d'habitude c'est genre à xxh00 ou quelque chose comme ça, mais là, je voudrais faire pour chaque heure réelle jouée par le joueur, ainsi, j'ai fait ceci...

Code: (pawn) [Sélectionner]
public OnPlayerPlaysAMinute()
{
for(new i = 0; i < MAX_PLAYERS; i ++)
  {
if(IsPlayerConnected(i) && !afk[i])
{
PlayerInfo[i][pGameTime] ++;
}
}
}

Ce code marche parfaitement, mais j'aimerais ajouter une fonctionnalité qui calculerait si le joueur a atteint un nombre qui soit un multiple de 60, donc chaque heure, mais je ne sais pas quelle marche je pourrais suivre pour calculer cela, à part prévoir tous les nombres à l'avance, mais c'est pas un truc de programmeur ça ! C'est pour les noobs !

La solution que j'aurais vu, aurait été de diviser PlayerInfo[playerid][pGameTime] par 60, et de voir s'il en résulte un nombre entier, mais là encore, je ne sais pas comment le savoir :/

Enfin merci à vous de m'aider !  :kiss:

7
Showroom SA:MP / [TUTO]Système d'inventaire
« le: 20 Mars 2014, 13:04:01 »


Bonjour bonjour !

Aujourd'hui, je vous propose de créer un de mes scripts bien aimé, mon système d'inventaire.

Pour suivre ce tutoriel, je vous recommande de connaitre un minimum le pawn, de pas bêtement copier sans rien comprendre, c'est pour cela que je ne posterais aucun script complet, pour obliger les petits malins à lire jusqu'au bout ! :wink:
J'essayerai d'expliquer un maximum tout ce qui me semble être utile à savoir pour comprendre le script, et j'introduirai des petits conseils ! Mais bon, ça n'en reste jamais qu'un premier tuto, alors par pitié, ne mettez pas encore le feu à ma maison :sad:

Ce système d'inventaire ressemblerait à ceci une fois terminé :



Ainsi, comme vous pouvez le voir, ce système ne comporte qu'une seule place, il n'est donc peut-être pas adapté à tous les serveurs, mais comme c'est du script, et que je l'espère, vous n'allez pas bêtement copier-coller, vous saurez le personnaliser à votre goût !

Ouvrons donc notre Nouveau fichier, GameMode, notre Filterscript, ou, créons donc une include !

Comme vous pouvez le voir, dans le screenshot précédemment donné, le système "visuel" est basé sur 3 textdraws. Le premier, le texte "Inventaire", est le seul textdraw fixe. Les deux textdraws suivants sont l'image de l'objet ainsi que son cadre, et le nom de l'objet, ces deux derniers sont donc dynamiques (Ce serait pas très pratique un inventaire qui ne pourrait que supporter un hamburger !

Créons alors nos variables...

Code: ("Pawno") [Sélectionner]
new Text:InventTitre;
new Text:InventObjet[MAX_PLAYERS];
new Text:InventNom[MAX_PLAYERS];

Grâce à notre incroyable pouvoir de déduction (Et de lecture), on sait déterminer quelle variable correspondra à quel TextDraw :biggrin:

Si vous avez lu, vous constaterez que les deux dernières variables sont des tableaux de variables ! Mais lorsqu'on jette un coup d'oeil sur les limites de SA-MP, on peut voir que le maximum de TextDraws est fixé à 2048 ! Ca en fait déjà 1001 ! Mais non ! MAX_PLAYERS est défini dans a_samp.inc comme 500, étant le nombre maximum de joueurs... Mais on peut changer les defines (C'est d'ailleurs pour cela qu'on n'écrit pas directement le nombre dans le code, comme ça, si on veut changer, on peut le faire en un clin d'oeil !).

Donc ouvrez donc a_samp.inc (\pawno\include) et trouvez la ligne (J'espère que vous en serez capables !) et changez le 500 en la limite de joueurs de votre serveur ! Bah oui, pourquoi créer plus de variables qu'il n'en faut après tout ?

Revenons à nos TextDraws, maintenant que j'ai déclaré mes variables, que fais-je ? Oignon, je suis perdu, guidez-moi, soyez le phare dans la nuit de mon ignorance :laugh:

Créons donc nos TextDraws, pour cela, allons donc dans notre chère amie la callback OnGameMode(FilterScript)Init() :

- Vu qu'on aime la facilité, commençons par créer notre entête, "Inventaire" :

Code: (pawn) [Sélectionner]
        InventTitre = TextDrawCreate(520.000000, 200.000000, "Inventaire");//On crée le TextDraw, à sa position, et on écrit directement son contenu.
TextDrawBackgroundColor(InventTitre, 0x00000000);//La couleur de l'outline, de l'ombre, du contour des lettres, ici le noir, vous pouvez la modifier selon vos désirs !
TextDrawFont(InventTitre, 0);//La police d'écriture, voir plus bas !
TextDrawLetterSize(InventTitre, 0.700000, 2.000000);//La taille des lettres, la première valeur est la longueur, et la seconde, la hauteur, réglable selon vos désirs !
TextDrawColor(InventTitre, 0xFFFFFFFF);//La couleur des lettres, ici le blanc, modifiez par la couleur hexadécimale de vos désirs !
TextDrawSetOutline(InventTitre, 1);//Booléene, pour mettre ou non un contour aux lettres, 0 pour non, 1 pour oui !
TextDrawSetProportional(InventTitre, 1);//Permet de garder une proportionnalité de la taille des lettres ! Encore une fois, 0 = Non, 1 = Oui.

Voici les différentes polices disponibles pour les textdraws : http://wiki.sa-mp.com/wiki/TextDrawFont

Il n'y a pas grand chose à expliquer, surtout si on sait lire ne serait-ce qu'un peu l'anglais :smile:

Maintenant passons à la création d'un plus gros morceau !

Vu que chaque joueur aura son propre inventaire (Et par cela, j'entends un objet et son nom), et pas le même pour tout le monde, il nous faut un textdraw pour chaque joueur !

Alors, ici intervient le tableau, et notre très chère amie la boucle...

Code: (pawn) [Sélectionner]
for(new i = 0; i < MAX_PLAYERS; i++)//Pour chaque nombre entier i, qui va croitre tant qu'il sera inférieur au nombre MAX_PLAYERS
{
InventObjet[i] = TextDrawCreate(530.000000, 211.000000, "Inventaire");//Cette ligne n'est utile que pour créer le textdraw, le texte "Inventaire" n'est pas utile étant donné qu'il n’apparaîtra pas sur l'écran.
TextDrawBackgroundColor(InventObjet[i], 136);//Couleur de l'ombre, ou du contour, très important, car ce n'est pas la couleur de la boite qui déterminera la couleur de ce qui sera visible sur votre écran !
TextDrawFont(InventObjet[i], 5);//La police(font) d'un textdraw pour qu'il puisse afficher des objets modélisés de GTA3.IMG ou de SAMP.IMG doit OBLIGATOIREMENT être la 5 !
TextDrawLetterSize(InventObjet[i], -1.400000, -3.600000);//Inutile dans le cas d'un objet, mais on préférera le garder tout de même
TextDrawColor(InventObjet[i], -1);//Laissez sur -1 pour que l'objet qui sera affiché n'aie pas de reflets de couleurs autres qu'à l'origine.
TextDrawSetProportional(InventObjet[i], 1);//Garder des mesures proportionnelles, pour ne pas avoir votre objet étiré vers le haut ou bas, ou vers la gauche ou vers la droite !
TextDrawSetShadow(InventObjet[i], 1);//Permet d'activer l'ombre, et c'est cette ombre qui aura la couleur surpassant la boite entourant votre objet.
TextDrawUseBox(InventObjet[i], 1);//La boite autour d'un textdraw est obligatoire si l'on veut que la modélisation(l'objet) apparaisse (Je ne sais pas pourquoi, mais bon !)
TextDrawBoxColor(InventObjet[i], 255);//La couleur de la boite, pas forcément utile dans ce dernier cas !
TextDrawTextSize(InventObjet[i], 90.000000, 100.000000);//Vous pouvez modifier la taille de la boite en fonction de la taille désirée, j'y reviendrai après.
TextDrawSetPreviewModel(InventObjet[i], 18888);//L'objet avec l'ID 18888 est invisible, c'est donc parce que de base, on veut que si l'inventaire soit vide, on doit prendre quelque chose d'invisible !
TextDrawSetPreviewRot(InventObjet[i], 0.000000, 0.000000, 0.000000, 1.000000);//Vu que l'objet est invisible, on s'en fout de sa rotation, mais on l'utilisera plus tard !

J'avais dit que je reviendrai plus tard sur la ligne "TextDrawTextSize(InventObjet, 90.000000, 100.000000);", le moment est déjà venu !

Donc, si vous désirez une boite d'inventaire plus grande ou plus petite, vous changez la taille de la boite, 90.0 étant l’abscisse, et 100.0 étant l'ordonnée (X et Y quoi !)
Mais si vous souhaitez conserver le TextDraw avec le nom de l'objet à sa place, vous devrez changer sa position en conséquent !
Et d'ailleurs nous y voilà...
 
Code: (pawn) [Sélectionner]
//---
InventNom[i] = TextDrawCreate(535.000000, 286.000000, "Rien");//Encore une fois, pour désigner la position, mais cette fois le texte "Rien", n'est pas inutile, il désigne le nom de l'objet.
TextDrawFont(InventNom[i], 2);//Encore une fois la police d'écriture, réglez comme vous le voulez en fonction de ce qui vous plait le plus.
TextDrawLetterSize(InventNom[i], 0.300000, 1.000000);//La taille de votre calligraphie !
TextDrawColor(InventNom[i], 0x00000000);//La couleur de votre lettrage !
TextDrawSetOutline(InventNom[i], 0);//À nouveau, un contour, oui ou non autour de vos lettres.
TextDrawSetProportional(InventNom[i], 1);//Si vous ne voulez pas avoir de lettres difformes !
TextDrawSetShadow(InventNom[i], 1);//Vous pouvez modifier toutes ces infos à votre guise pour changer le texte, la police etc., je ne vais pas tout vous indiquer, vu que mon tuto ne porte pas directement sur cela.
}//On ferme la boucle

Voilà ! Nous en somme arrivés au bout !

Maintenant, vous allez me dire : "Mais nom d'un bulbizarre, je savais déjà faire des textdraw !"

Oui, et comme vous le savez, ce n'est pas tout de le créer, il faut l'afficher (C'est ça le pouvoir de la transition) :

Vous pourriez bêtement l'afficher à la connexion ou lorsque le joueur se connecte, mais non, on va utiliser la bonne vieille technique de la factorisation en créant une fonction qui sera utilisée plusieurs fois !

Tout d'abord, il nous faudrait des variables ! (On en mangerait tellement on nage dedans !) :

Code: (pawn) [Sélectionner]
new inventnomobjet[MAX_PLAYERS][30];
new inventidobjet[MAX_PLAYERS];
new Float:inventrot[MAX_PLAYERS][3];

- inventnomobjet[MAX_PLAYERS][30];

Cette variable va donc servir, comme son nom l'indique à stocker les caractères formant le nom de nos magnifiques objets. Pour ceux à qui cela ne parle pas vraiment, c'est un équivalent à la chaine de caractères que vous connaissez surement : new string[256];
Sauf que vu qu'un nom d'un objet ne fait certainement pas 255 caractères (Ce serait beaucoup trop long), mettons 30, cela devrait suffire.

- inventidobjet[MAX_PLAYERS];

Celle-ci va stocker l'id de l'objet (Comme dans la fonction CreateObject en gros !) que le joueur a dans son inventaire.

- Float:inventrot[MAX_PLAYERS][3]

Float ! Un nombre à virgule ! Vous comprenez surement le MAX_PLAYERS, mais le 3, qu'est-ce donc que cela ? Eh bien, la rotation se désigne par les axes X, Y & Z, et pour éviter de créer trois lignes, nous allons les condenser en un tableau.
Les paramètres de rotation de l'objet ne sont pas les plus utiles, néanmoins, certains objets rendent mieux sous un certain angle :smile:

Maintenant passons à la fonction directement !

Code: (pawn) [Sélectionner]
stock UpdatePlayerInventory(playerid)//Le stock indique la création d'une fonction, et ignorant les 'warnings' lors de la compilation, mettez le si vous écrivez une include, sinon, vous pourriez passer par dessus une erreur. (Si vous ne le mettez pas, écrivez simplement "UpdatePlayerInventory(playerid)"
{
if(inventidobjet[playerid] == 0) inventidobjet[playerid] = 18888;//Pour éviter que le skin de CJ apparaisse au lieu du 'vide' (Le modèle du skin CJ est le 0)
TextDrawSetPreviewModel(InventObjet[playerid], inventidobjet[playerid]);//On change d'objet à montrer.
TextDrawSetPreviewRot(InventObjet[playerid], inventrot[playerid][0], inventrot[playerid][1], inventrot[playerid][2], 1.000000);//On change sa rotation, et son zoom (1.000000, mais on n'y touchera pas pour garder une vue globale de l'objet)
TextDrawShowForPlayer(playerid, InventObjet[playerid]);//On affiche le TextDraw
TextDrawSetString(InventNom[playerid], inventnomobjet[playerid]);//On change le string du TextDraw contenant le nom par notre chaine de caractères.
  TextDrawShowForPlayer(playerid, InventObjet[playerid]);//On affiche le second aussi.
}

Vous allez éventuellement me dire, mais espèce de suppôt de Satan, à chaque fois qu'on va changer l'objet, on affiche le TextDraw ?! Eh bien oui, si on ne fait que changer ses paramètres, cela ne fera rien (Du moins visuellement). Mais pas de craintes, cela n'affichera pas plusieurs fois votre TextDraw.

Maintenant qu'on a créé notre fonction UpdatePlayerInventory(playerid);, qu'est-ce qu'on en fait ?!
Eh bien on l'utilise lorsque qu'on change l'objet de l'inventaire, soit quand on se connecte, et surtout si votre serveur est équipé d'un système de connexion, assurez-vous de l'utiliser après avoir récupéré les données ! Et aussi, si vous voulez que l'inventaire se sauvegarde, n'oubliez pas de sauvegarder les trois dernières variables que nous avons créé !

P.-S.: N'oubliez pas que dans la plupart des includes, la sauvegarde des Floats et des Strings diffère de celle d'une variable normale.

Bon !

Maintenant qu'on sait afficher des jolis petits objets dans un carré noir transparent, on fait quoi ?

Pour faire plus propre, on va déjà commencer par créer une nouvelle fonction !

Code: (pawn) [Sélectionner]
stock GivePlayerInventoryObject(playerid, name[], objectid, Float:xrot, Float:yrot, Float:zrot)//Encore une fois, n'ajoutez que le 'stock' si vous créez une include.
{
if(objectid == -1)
{
format(inventnomobjet[playerid], 30, "Rien");//On remplace donc le 'string' (La chaine de caractères) par "Rien" dans ce cas-ci.
inventidobjet[playerid] = 18888;//L'id de l'objet pour le joueur devient 18888.
inventrot[playerid][0] = xrot;//La rotation de l'objet se change selon les paramètres inscrits lors de l'exécution de la fonction, pour xrot, il s'agira du 4ème paramètre
inventrot[playerid][1] = yrot;//Pareil que pour au dessus, à l'exception qu'il s'agit de la rotation Y
inventrot[playerid][2] = zrot;//Pareil que pour au dessus, à l'exception qu'il s'agit de la rotation Z
}
else
{
    if(strlen(name) < 30)//Alors vous pouvez vous demander, 'Mais si jamais ça fait pile 30 ?!' Eh bien, il y a toujours quelque chose qu'on appelle la case vide à la fin d'une chaine, et il faut la prendre en compte !
    {
new string[30];
format(string, sizeof(string), name);//Lors de ces deux lignes, on crée une chaine de caractères dans laquelle inclure le paramètre 'name', il s'agit du nom de l'objet que vous donnerez.
  inventnomobjet[playerid] = string;//Le nom de l'objet pour le joueur devient le 'string'
inventidobjet[playerid] = objectid;//Maintenant, les quatre lignes ici sont déjà expliquées plus haut !
inventrot[playerid][0] = xrot;
inventrot[playerid][1] = yrot;
inventrot[playerid][2] = zrot;
}
else return 0;
}
UpdatePlayerInventory(playerid);
    return 1;
}

Analysons donc cette fonction !

Tout d'abord, nous affrontons une condition...

Si objectid vaut -1, alors l'inventaire affichera l'objet invisible, et changera le texte en "Rien", et d'un point de vue visuel, la rotation n'aura pas une réelle importance.

Exemple : GivePlayerInventoryObject(playerid, "Osef", -1, 180.0, 90.0, 0.0);

Cette fonction "videra" l'inventaire du joueur, mais ne prendra pas en compte le paramètre name[], il sera automatiquement changé en "Rien".

Maintenant, passons à plus intéressant, "else", si l'id ne vaut pas -1.
Si tel est le cas alors, la fonction vérifie un autre paramètre..."strlen", cette fonction vérifie la longueur d'un "string". Dans ce cas-ci, on vérifie si la longueur est inférieure à 30. Si elle ne l'est pas, la fonction ne fait rien.

Pourquoi ? Parce que la longueur maximale définie ici est de 30, et si on prend en compte les chaines où il y en a plus, on aura des textes coupés !

Alors donc; Si name contient moins de 30 caractères, le nouveau nom de l'objet devient name, l'objet devient l'id donné, et ainsi de suite pour la rotation.

Et puis, si l'id donné vaut -1, ou pas, alors, dans les deux cas, ça exécute la fonction UpdatePlayerInventory sur le joueur donné.

Fabuleux, maintenant on sait changer l'objet dans l'inventaire, maintenant j'en fais quoi ?!

Alors là, vous devrez en faire ce que votre imagination (Et vos capacités à scripter) vous dicteront !
Pour créer un objet, c'est très simple, vous allez sur MTA Map Editor, vous récupérez des ID d'objets, et vous leur donnez un nom, vous inventez une manière de l'obtenir (Par commande, un pickup à récupérer, etc. !)

Maintenant, passons à l'étape finale de ce tutoriel, et à sa question fatidique... Nom d'un réfrigérateur ! Qu'est-ce que je suis censé faire de ce truc ?! C'est bien beau d'avoir un joli petit truc qui affiche des objets, mais ma tortue vient d'échanger ma femme contre une brouette, je suis trop stressé pour réfléchir !

Eh bien, l'idéal, c'est de pouvoir utiliser les objets ! Et pour ça comment faire ?! Alors là, vous avez plusieurs alternatives, soit vous pouvez créer une commande comme /utiliser, /use, etc. Ou alors, ma méthode de prédilection, c'est-à-dire, utiliser une touche relativement peu utilisée dans SA-MP telle que la touche N.

Dans le cas de la commande cela se passera comme ceci :

Code: (pawn) [Sélectionner]
if(strcmp(cmdtext, "/use", true) == 0)
{
    if(inventidobjet[playerid] != 18888)
    {
        switch(inventidobjet[playerid])
        {
            case IDOBJET:
            {
                //Les actions perpétrées par tel objet
                        GivePlayerInventoryObject(playerid, "Osef", -1, 180.0, 90.0, 0.0);
            }
        }
    }
    else
    {
        SendClientMessage(playerid, 0xCC0000FF, "Vous n'avez pas d'objet !");
    }
return 1;
}

D'abord on vérifie si la commande utilisée est /use. Ensuite, si l'objet du joueur a comme ID 18888, la commande retourne un message "Vous n'avez pas d'objet !", sinon, il y a un switch, et si l'id de l'objet est par exemple égal à tel ou tel nombre, ça exécute telle action, de plus, vous revoyez notre amie la fonction GivePlayerInventoryObject, qui dans ce cas, videra l'inventaire !

Bonne chance ! N'hésitez pas à demander si vous ne comprenez pas quelque chose, à moi, ou à quelqu'un de plus compétent, ou bien, n'hésitez pas à montrer votre oeuvre !


P.-S.: Si un admin pouvait placer ce tuto dans la section appropriée si il est pas trop inutile, ce serait sympathique *-*

8
Scripting SA-MP [Pawn center] / Problème GetClosestPlayer !
« le: 08 Mars 2014, 14:18:24 »
Bonjour amis scripteurs et dans un monde innexistant scripteuses :D
Me revoilà pour vous importuner une nouvelle fois !

Cette fois-ci mon bug se pose sur mes fonctions GetNotTeamClosestPlayer & GetTeamClosestPlayer.
En effet, ma fonction GetClosestPlayer marche parfaitement, mais, pour faire un anti-nof, je me suis penché sur des variantes qui ne prennent en compte que les joueurs dont la team est différente ou la même, et celles-là ne marchent pas !

Par exemple, on peut se rendre au bar pour s'abreuver et reconstituer notre barre de vie, sauf si un joueur d'une team différente est dans les environs.

Code: (pawno) [Sélectionner]
if(GetDistanceBetweenPlayers(playerid, GetNotTeamClosestPlayer(playerid)) > 50)

Néanmoins, ça me dit toujours qu'un joueur d'une team différente est trop proche !

Alors, voici donc les fautifs !

http://pastebin.com/Y3BJfZXB

P.-S. : Je sais ma façon d'ident est différente

Merci  :biggrin:

9
Scripting SA-MP [Pawn center] / Problème de TextDraw[Résolu]
« le: 04 Mars 2014, 02:51:16 »
Coucou !

Me revoilà, à quémander votre aide tel le renard au corbeau, pour un nouveau problème !

Aujourd'hui j'en ai eu marre de ce stupide écran de sélection de classe ! Alors j'ai entrepris l'idée d'en créer un nouveau !

Je n'avais jamais encore utilisé les Selectable Text Draws, alors j'ai un peu trifouillé dans ce que j'ai pu trouver, mais je ne vois pas vraiment où est mon erreur  :sad:

Donc en fait, mon système par du moment où l'on doit changer de team, la callback OnPlayerRequestClass est invoquée, elle passe, et emmène directement le joueur sur mon écran personnalisé ! Jusque là tout va bien.

Sur ma sélection, ça consiste en une série de textdraws où l'on peut cliquer dessus, et lorsque l'on clique dessus, ça nous affiche un autre TextDraw nous indiquant les caractéristiques de la classe ainsi que le nom, etc. (Celui-là marche parfaitement)

Ce qui marche moins bien, c'est les textdraw contenant les skins, en fait, c'est le seul truc qui marche pas, on peut cliquer dessus, ça marche parfaitement, mais ce qui ne marche pas, c'est l'affichage des textdraws, déjà le modèle du skin apparait pas, et le pire, c'est qu'il y'a juste un truc noir, je vous laisse juger par vous même en fait :



Et donc, j'ai conclu que le problème survient lors de la création des TextDraw, et donc j'isole cette partie, qui se trouve dans OnGameModeInit :

http://pastebin.com/9eApUceS

Enfin, si quelqu'un trouve, il gagne un bon de réduction : À l'achat de 18 Pizzas, 2 % de ristourne sur la 19ème (Offre non-valable du mardi au dimanche)

Merci d'avance !

P.-S. : La pizzeria est fermée le lundi :wacko:

EDIT : J'ai trouvé tout seul en trifouillant !
Pour ceux qui auraient le même problème, il faut absolument mettre une boite autour du textdraw, sinon ça marche pas !

10
Showroom SA:MP / [MAP]Island in the Sun
« le: 05 Février 2014, 14:11:26 »
Coucou !

Après des années d'aide reçue, je vais enfin pouvoir partager quelque chose !
Et ce quelque chose est...



C'est une map assez grande !

Si on dit qu'une unité de position de SA-MP vaut un mètre, la map mesure 682 mètres de longueur sur 709 mètres de largeur, soit 483538 m² ou encore un peu plus de 48 hectares !

Trêve de chiffres, passons à l'exhibition !

Island in the Sun

Voici une vidéo très mal faite qui vous montrera en gros la map !

Cette map peut aussi bien servir de map de DM pour un affrontement que de map de RP pour un club de vacances, ou encore un RP naufragés !  :laugh:

On peut entrer dans tous les bâtiments (même s'ils ne sont pas tous énormément remplis), j'ai essayé de respecter au maximum l'aspect perdu, en utilisant le maximum de bois possible, tout en ajoutant quelques stupidités juste pour le fun  :smile:

La map est très diversifiée, il y a beaucoup d'endroits différents, cependant, il y a un défaut qui a dépassé ma volonté, càd, le bug de l'océan, en effet, sur SA-MP, lorsqu'on map hors des limites de la map "normale", on peut poser la map où l'on veut, même derrière les murs, ce qui fait qu'on ne voit plus vraiment son skin.

Si vous voulez l'utiliser sur votre serveur, je vous demanderais, et c'est naturel, de mentionner la phrase "Map de l'île par l'incroyable Pix", mais ne dîtes pas que c'est de vous, sinon je viendrais chez vous casser vos fenêtres !

Si vous avez des idées de ce que je pourrais ajouter, proposez-les, je cherche toujours à agrandir !

Cependant, la map fait actuellement 1967 objets, alors n'oubliez pas de vous équiper d'un streamer et de convertir la map dans les fonctions du streamer, car si vous me dites "Hé ! Y'a que la moitié de l'île qui apparaît sur mon serveur, elle bug ta map !", je prendrai même pas la peine de répondre :biggrin:
De plus, vu la taille de la map, je vous conseille de vous munir d'un bon serveur pour pouvoir la supporter et ne pas avoir des énormes coups de lag !

Voici le code !

P.-S.: Voici la position que je recommande pour un départ sur l'île !
-3734.7263, -3167.3877, 2.3410
[/size]

11
Scripting SA-MP [Pawn center] / Lag lors de la sauvegarde
« le: 03 Janvier 2014, 00:33:49 »
Rebonjour ! Oui encore lui !

Cette fois-ci je n'ai pas vraiment un problème de script, mais donc :
J'ai récemment changé mon système de sauvegarde de fichiers en YSI vers du Dini, pour des raisons pratiques, mais maintenant, la sauvegarde lors de la déconnexion donne un petit coup de lag à tous les joueurs, par exemple, imaginons quelqu'un se déconnecte, alors pendant la sauvegarde tous les joueurs ont ce fameux p'tit truc, qui fait que lorsqu'on envoie un message, commande, ou lorsqu'on envoie quelque chose au serveur, il y a ce coup de lag, ce laps de temps pendant lequel il ne se passe rien, il faut attendre quelques secondes avant que ça remarche. Et c'est encore pire lors de la sauvegarde automatique des comptes et des autres fichiers du serveur !


Enfin voici le code quand même  http://pastebin.com/6hWN7PUP

Merci d'utiliser le temps que vous pourriez utiliser pour autre chose de plus intéressant que de m'aider :laugh:

12
Scripting SA-MP [Pawn center] / Problème de string
« le: 07 Décembre 2013, 15:57:09 »
Bonjour ! Je vais une fois de plus vous importuner avec mes problèmes !

Donc je suis en train de faire un système de vêtements avec les objets ajoutés lors des précédentes versions de sa-mp, et pour ça, je fais un magasin !

Lors de l'achat d'un article je sauvegarde l'id de l'objet voulu, et le nom que j'ai attribué à l'article (Pour pouvoir le proposer dans un menu plus tard)

Alors le problème réside dans le nom de l'objet.

Tout d'abord j'ai créé l'énumération et la variable qui va avec pour stocker les informations sur les 5 différents types d'habits.

Code: (pawno) [Sélectionner]
enum habits
{
    teteid,
    tetenom[30],
    visageid,
    visagenom[30],
    montreid,
    montrenom[30],
    dosid,
    dosnom[30],
    mainid,
    mainnom[30]
}
new vetements[MAX_PLAYERS][habits];

Comme vous pouvez le constater, le nom d'un article est de 29 caractères plus la case vide, le plus long nom est de 26 caractères, mais j'ai élargi ! (Faut voir grand dans la vie ! Quitte à voyager dans le temps, autant le faire dans une voiture qui ait de la gueule !)

Donc, quand on achète tel ou tel article, le nom était directement mis dans la variable correspondante.

Au début j'ai fais ça de cette manière :

Code: (pawno) [Sélectionner]
vetements[playerid][tetenom] = "Beret rouge";
J'ai eu l'agréable surprise d'avoir 236 987 546 erreurs (environ).

Mais réalistement, 26 fois
Citation de: Andouille de compilateur
error 047: array sizes do not match, or destination array is too small

Alors oui, j'ai directement pensé à utiliser le sizeof pour plus avoir ça.

Code: (pawno) [Sélectionner]
format(vetements[playerid][tetenom], sizeof(vetements[playerid][tetenom]),"Beret noir");
BIM !

Citation de: Pawno
error 001: expected token: "]", but found "-identifier-"
warning 215: expression has no effect
error 001: expected token: ";", but found "]"
error 029: invalid expression, assumed zero
fatal error 107: too many error messages on one line

Alors j'ai tenté une dernière approche...

Code: (pawno) [Sélectionner]
new string[30];
vetements[playerid][teteid] = 18921;
format(string, sizeof(string), "Beret noir");
vetements[playerid][tetenom] = string;

Là, ça a marché, plus d'erreurs à cette ligne là, mais alors, j'ai remplacé toutes les lignes par cela, BIM le compilateur crash ! Et là, je sais pas !

J'ai pensé à la fameuse accolade manquante, mais j'ai même vérifié avec Missing Bracket Finder, et rien !

Vous avez des idées ? :s

Merci d'avance aux monsieurs qui répondront !

13
Scripting SA-MP [Pawn center] / Sauvegarde sous YSI
« le: 09 Octobre 2013, 13:50:01 »
Rebonjour tout le monde, c'est ENCORE moi  :laugh:

La dernière fois je vous demandais aussi quelque chose à propos de YSI, mais cette fois-çi ça concerne plutôt l'écriture d'un nouveau fichier, comme expliqué dans ma dernière requête, ça concerne un système de gangs...

Donc, à partir d'un certain niveau on peut créer un gang, qui conquérira des territoires, mais mon problème, cette fois ci se situe à la création du fichier du gang, qui sera nécessaire pour synchroniser les statistiques du gang avec les joueurs du gang.

Cependant, lors de l'écriture, aucun fichier ne se crée et rien n'est écrit dedans même si je le crée, vierge, au préalable...

Donc, comme variable pour l'enregistrement des stats, il s'agit d'un tableau (Chaque gang a son ID, et donc son propre index dans le tableau) et d'une énum, et chaque joueur aura aussi son enum regroupant les stats de son gang, voici donc le code de la création du fichier.

Code: (pawno) [Sélectionner]

if(dialogid == 32)
    {
        if(!response) return SendClientMessage(playerid, ROUGE, "Vous avez quitté la création de votre gang.");
        if(response)
            {
SendClientMessage(playerid, JAUNE, "Bravo vous venez de créer votre gang !");
gangPlayerData[playerid][grade] = 3;
nombredegangs ++;
gangPlayerData[playerid][gang] = nombredegangs;
GivePlayerMoney(playerid, -500000);
new stringidgang[3];
format(stringidgang,sizeof(stringidgang),"/Gangs/%d.ini",nombredegangs);
new INI:MyGang = INI_Open(stringidgang);
    INI_SetTag(MyGang,"data");
    INI_WriteInt(MyGang,"IDGang",nombredegangs);
    INI_WriteInt(MyGang,"Territoires",0);
    INI_WriteString(MyGang,"Nom",gangPlayerData[playerid][nomdugang]);
    INI_WriteInt(MyGang,"Couleur",0);
    INI_WriteInt(MyGang,"Membres",1);
    INI_Close(MyGang);
    gangdata[nombredegangs][idgang] = nombredegangs;
    gangdata[nombredegangs][territoires] = 0;
    gangdata[nombredegangs][nomdugang] = gangPlayerData[playerid][nomdugang];
    gangdata[nombredegangs][couleurgang] = 0;
    gangdata[nombredegangs][membres] = 1;
}
    }


Merci de votre charitable aide *-*

14
Scripting SA-MP [Pawn center] / Couleurs sous YSI
« le: 02 Octobre 2013, 02:09:50 »
Bonjour bonjour, je reviens vous importuner !

Alors voilà voilà ^^

Cette fois-ci, sur mon serveur je m'attaque à quelque chose d'assez coriace, mais bon, c'est comme ça qu'on apprend ^^
Je fais donc un système ou les 10 villages de San Andreas seraient des zones capturables par des gangs formés au préalable par les joueurs !
Pour ne pas tout vous dévoiler, et surtout, ne pas écrire plus sur la description que pour la demande d'aide, je vais directement au but.

Chaque gang aurait sa couleur, et dans le fichier recensant toutes les couleurs des zones et leurs propriétaires, j'ai lancé mon serveur avec des codes couleurs au hasard juste pour voir, mais, à ma grande déception, aucune gangzone ne s'affichait. (J'en ai conclu que la valeur ne s'était pas chargée, et vu que la couleur est une variable, la variable restant 0, la couleur ne s'affiche pas, donc gangzone invisible.)

Donc, sur cette base, j'ai cru isoler le problème au niveau du chargement des données.

Cependant, ayant déjà scripté la sauvegarde de ces couleurs, si la variable était 0, elle aurait du s'afficher dans le fichier sauvegardé.

(J'ai testé les couleurs en décimal & hexadécimal, pour ne pas me faire dire qu'une couleur ne doit pas être sauvegardée comme ça)

Donc voici mon code :

En dehors des callbacks

[spoiler]
Code: (pawno) [Sélectionner]
INI:main[examples](name[], value[])
{
INI_Int("NombreDeGangs",nombredegangs);
INI_Int("ColGangzone1",colgang1);
INI_Int("ProprioGangZone1",propriogang1);
INI_Int("ColGangzone2",colgang2);
INI_Int("ProprioGangZone2",propriogang2);
INI_Int("ColGangzone3",colgang3);
INI_Int("ProprioGangZone3",propriogang3);
INI_Int("ColGangzone4",colgang4);
INI_Int("ProprioGangZone4",propriogang4);
INI_Int("ColGangzone5",colgang5);
INI_Int("ProprioGangZone5",propriogang5);
INI_Int("ColGangzone6",colgang6);
INI_Int("ProprioGangZone6",propriogang6);
INI_Int("ColGangzone7",colgang7);
INI_Int("ProprioGangZone7",propriogang7);
INI_Int("ColGangzone8",colgang8);
INI_Int("ProprioGangZone8",propriogang8);
INI_Int("ColGangzone9",colgang9);
INI_Int("ProprioGangZone9",propriogang9);
INI_Int("ColGangzone10",colgang10);
INI_Int("ProprioGangZone10",propriogang10);
return 1;
}
[/spoiler]

[spoiler]
Code: (pawno) [Sélectionner]
new gangzone1;// Angel Pine
new gangzone2; // Bayside
new gangzone3; // El Quebrados
new gangzone4; // Las Barrancas
new gangzone5; // Las Payasadas
new gangzone6; // Blueberry
new gangzone7; // Montgommery
new gangzone8; // Dillimore
new gangzone9; // Palomino Creek
new gangzone10; // Fort Carson
[/spoiler]

Dans OnGameModeInit

[spoiler]
Code: (pawno) [Sélectionner]
            INI_Load("/Gangs/main.ini");
        gangzone1 = GangZoneCreate(-2335.575, -2592.488, -1961.883, -2195.441);// Angel Pine
    gangzone2 = GangZoneCreate(-2662.556, 2148.729, -2137.051, 2545.777);// Bayside
    gangzone3 = GangZoneCreate(-1669.936, 2475.709, -1226.177, 2744.301);// El Quebrados
    gangzone4 = GangZoneCreate(-899.1964, 1401.345, -618.9274, 1634.903);// Las Barrancas
    gangzone5 = GangZoneCreate(-397.0478, 2569.133, -105.1009, 2802.69);// Las Payasadas
    gangzone6 = GangZoneCreate(81.74512, -326.9805, 397.0478, 70.06725);// Blueberry
    gangzone7 = GangZoneCreate(1132.754, 93.423, 1483.09, 490.4708);// Montgommery
    gangzone8 = GangZoneCreate(572.2159, -712.3504, 887.5186, -397.0478);// Dillimore
    gangzone9 = GangZoneCreate(2125.373, -140.1345, 2592.488, 245.2354);// Palomino Creek
    gangzone10 = GangZoneCreate(-373.692, 887.5186, 105.1009, 1284.566);// Fort Carson
[/spoiler]

Dans OnGameModeExit

[spoiler]
Code: (pawno) [Sélectionner]
new INI:File = INI_Open("/Gangs/main.ini");
    INI_SetTag(File,"data");
    INI_WriteInt(File,"NombreDeGangs",nombredegangs);
    INI_WriteInt(File,"ColGangzone1",colgang1);
    INI_WriteInt(File,"ProprioGangZone1",propriogang1);
    INI_WriteInt(File,"ColGangzone2",colgang2);
    INI_WriteInt(File,"ProprioGangZone2",propriogang2);
    INI_WriteInt(File,"ColGangzone3",colgang3);
    INI_WriteInt(File,"ProprioGangZone3",propriogang3);
    INI_WriteInt(File,"ColGangzone4",colgang4);
    INI_WriteInt(File,"ProprioGangZone4",propriogang4);
    INI_WriteInt(File,"ColGangzone5",colgang5);
    INI_WriteInt(File,"ProprioGangZone5",propriogang5);
    INI_WriteInt(File,"ColGangzone6",colgang6);
    INI_WriteInt(File,"ProprioGangZone6",propriogang6);
    INI_WriteInt(File,"ColGangzone7",colgang7);
    INI_WriteInt(File,"ProprioGangZone7",propriogang7);
    INI_WriteInt(File,"ColGangzone8",colgang8);
    INI_WriteInt(File,"ProprioGangZone8",propriogang8);
    INI_WriteInt(File,"ColGangzone9",colgang9);
    INI_WriteInt(File,"ProprioGangZone9",propriogang9);
    INI_WriteInt(File,"ColGangzone10",colgang10);
    INI_WriteInt(File,"ProprioGangZone10",propriogang10);
    INI_Close(File);
[/spoiler]

Dans OnPlayerSpawn

[spoiler]
Code: (pawno) [Sélectionner]
            GangZoneShowForPlayer(playerid, gangzone1, colgang1);
    GangZoneShowForPlayer(playerid, gangzone2, colgang2);
    GangZoneShowForPlayer(playerid, gangzone3, colgang3);
    GangZoneShowForPlayer(playerid, gangzone4, colgang4);
    GangZoneShowForPlayer(playerid, gangzone5, colgang5);
    GangZoneShowForPlayer(playerid, gangzone6, colgang6);
    GangZoneShowForPlayer(playerid, gangzone7, colgang7);
    GangZoneShowForPlayer(playerid, gangzone8, colgang8);
    GangZoneShowForPlayer(playerid, gangzone9, colgang9);
    GangZoneShowForPlayer(playerid, gangzone10, colgang10);
[/spoiler]

Et à tout hasard je vous donne aussi le fichier main.ini

[spoiler][data]
NombreDeGangs = 0
ColGangzone1 = 4278223103
ProprioGangZone1 = 0
ColGangzone2 = 2155905174
ProprioGangZone2 = 0
ColGangzone3 = 2155905174
ProprioGangZone3 = 0
ColGangzone4 = 2155905174
ProprioGangZone4 = 0
ColGangzone5 = 2155905174
ProprioGangZone5 = 0
ColGangzone6 = 2155905174
ProprioGangZone6 = 0
ColGangzone7 = 2155905174
ProprioGangZone7 = 0
ColGangzone8 = 2155905174
ProprioGangZone8 = 0
ColGangzone9 = 2155905174
ProprioGangZone9 = 0
ColGangzone10 = 2155905174
ProprioGangZone10 = 0
[/spoiler]

J'ai suivi un tutoriel en anglais sur l'include YSI (En particulier y_ini), et j'ai essayé de comprendre seul, mais rien n'y fait, je comprends pas mon erreur. Merci de consacrer votre temps à moi *-*

15
Scripting SA-MP [Pawn center] / Pickups qui se confondent !
« le: 26 Septembre 2013, 15:55:31 »
Bonjour bonjour messieurs !

J'ai le fameux bug des pickups qui font autre chose que leur code qui leur est assigné ^^
J'ai bien été voir d'autres topics où il était indiqué de pas mettre de return 1; à la fin d'une condition mais des else if, chose que j'ai faite, mais rien n'y fait, tous mes pickups sont des var = CreatePickup(blablabla, etc.);
Alors j'ai cru comprendre que les pickups retournent donc le nombre 1 quand ils n'ont pas de variable les désignant, or, tous mes pickups le sont.

http://pastebin.com/aXXef750

Voici donc mon code ^^

Alors une de mes hypothèse est que vu que certains pickups ne sont créés qu'à un moment précis, la variable existant déjà, mais ne désignant rien, vaut donc 0, mais je n'ai pas vraiment d'idée sur le comment de règler le problème, à part créer tous les pickups au préalable, mais voilà voilà, comme vous l'aurez deviné, on ne doit pas pouvoir les récupérer n'importe quand ^^

Donc je viens quérir votre savoir, qui éclairera la nuit de mon incapacité à corriger ce bug  :laugh:

Merci  :tongue:

Pages: [1] 2