GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: CarCrasher le 26 Septembre 2013, 15:55:31

Titre: Pickups qui se confondent !
Posté par: CarCrasher 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 (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:
Titre: Re : Pickups qui se confondent !
Posté par: Infu le 26 Septembre 2013, 17:32:07
Bonjour,

Dans tout ce que tu nous as envoyé, je ne vois pas où tu créés les "noms" des pickup. J'veux parler des "new monpickup;"

C'est possible de les voir ?
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 26 Septembre 2013, 17:47:41
D'accord ^^
Mais je vois pas l'utilité, enfin si tu pouvais m'expliquer, c'est toujours bon d'apprendre *-*

Code: (pawno) [Sélectionner]
new pickupcables[MAX_PLAYERS];
new pickupgaz;
new pickuptuyau;
new pickupplan[MAX_PLAYERS];
new paquetspas12;
new paquetpistolets;
new pickupcle1quete[MAX_PLAYERS];
new pickupcle2quete[MAX_PLAYERS];
new pickupviande[MAX_PLAYERS];
new paquetfric1;
new paquetfric2;
new jetpack;
new gilet1;
new gilet2;
new gilet3;
new gilet4;
new gilet5;
new gilet6;
new gilet7;
new gilet8;
new gilet9;
new gilet10;
new gilet11;
new gilet12;
new gilet13;
new gilet14;
new gilet15;
new gilet16;
new gilet17;
new gilet18;
new gilet19;
new gilet20;
new incipickups;

Rien de bien spécial en gros :/
Titre: Re : Pickups qui se confondent !
Posté par: Infu le 26 Septembre 2013, 17:50:41
Ah, et l'endroit où tu créés tes pickups stp, tu me montrer comment tu les as créé ?
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 26 Septembre 2013, 18:07:17
D'accord  :biggrin:

[spoiler]
Code: (pawno) [Sélectionner]
OnGameModeInit()
{
gilet1 = CreatePickup(1242, 3,-552.2299,-181.3831,78.4063); // Kevlar1
gilet2 = CreatePickup(1242, 3,-99.2357,-37.3909,3.1094); // Kevlar2
gilet3 = CreatePickup(1242, 3,245.5813,-53.9622,1.5776); // Kevlar3
gilet4 = CreatePickup(1242, 3,1092.5510,-73.5867,53.2554); // Kevlar4
gilet5 = CreatePickup(1242, 3,681.6131,-469.5823,22.5705); // Kevlar5
gilet6 = CreatePickup(1242, 3,785.9963,-487.4437,17.3439); // Kevlar6
gilet7 = CreatePickup(1242, 3,1045.6665,-300.0080,77.3594); // Kevlar7
gilet8 = CreatePickup(1242, 3,1651.3701,-316.3216,36.7115); // Kevlar8
gilet9 = CreatePickup(1242, 3,1896.7166,-112.0837,16.9034); // Kevlar9
gilet10 = CreatePickup(1242, 3,2113.1570,101.6895,34.5332); // Kevlar10
gilet11 = CreatePickup(1242, 3,2162.0518,-102.5171,2.7500); // Kevlar11
gilet12 = CreatePickup(1242, 3,2266.5317,-76.7234,24.5859); // Kevlar12
gilet13 = CreatePickup(1242, 3,1624.1851,15.0045,21.8471); // Kevlar13
gilet14 = CreatePickup(1242, 3,2565.2256,86.5469,31.2111); // Kevlar14
gilet15 = CreatePickup(1242, 3,2324.3569,-3.8492,26.5597); // Kevlar15
gilet16 = CreatePickup(1242, 3,2355.8152,-648.2770,128.0547); // Kevlar16
gilet17 = CreatePickup(1242, 3,2188.5400,-694.9771,56.3157); // Kevlar17
gilet18 = CreatePickup(1242, 3,1705.4987,426.6324,18.9117); // Kevlar18
gilet19 = CreatePickup(1242, 3,1254.0929,354.3783,24.5555); // Kevlar19
gilet20 = CreatePickup(1242, 3,1417.9495,219.8144,19.5618); // Kevlar20
paquetspas12 = CreatePickup(1254, 2, -3998.8572, -2786.0715, -1.4080, 0); // PAQUET SPAS12
paquetfric1 = CreatePickup(1550, 3, 194.5924,-31.3224,-13.1166, 0); // FRIC 1
paquetfric2 = CreatePickup(1550, 2, 131.6553,2446.8269,18.5870, 100); // FRIC 2
paquetpistolets = CreatePickup(1254, 3, 2053.4607,-168.1729,1452.4199, 0); // PAQUET PISTOLETS
pickupgaz = CreatePickup(918, 2, -607.6959, -496.6972, 25.5308, -1); // GAZ NITRO
pickuptuyau = CreatePickup(18633, 3, 554.6950,490.2650,-39.9431, 0); // TUYAU NITRO
return 1;
}
[/spoiler]

Pour le pickup jetpack, le code c'est pour OnPlayerDisconnect & OnPlayerDeath

[spoiler]
Code: (pawno) [Sélectionner]
if(area1[playerid] == 1||area2[playerid] == 1)
{
area1[playerid] = 0;
area2[playerid] = 0;
if(jetpackeur[playerid] == 1)
{
jetpackeur[playerid] = 0;
jetpack = CreatePickup(370, 2, 268.7742,1883.9447,-30.0938, 5);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(area1[i] == 1||area2[i] == 1)
{
SendClientMessage(i, ORANGE, "Voleur déconnecté ! Jetpack remis à sa place !");
}
}
}
}
[/spoiler]

[spoiler]
Code: (pawno) [Sélectionner]
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmd, "/quetebateau") == 0)
{
if(cle1quete[playerid] == 0 && cle2quete[playerid] == 0 && cle3quete[playerid] == 0 && cle4quete[playerid] == 0 && cle5quete[playerid] == 0)
{
pickupcle1quete[playerid] = CreatePickup(1581, 3, -2866.1704,1774.4386,4.5981);
pickupcle2quete[playerid] = CreatePickup(1581, 3, -2830.3623,1835.1381,1203.9778);
pickupviande[playerid] = CreatePickup(2804, 3, -2822.4771,1806.4404,1203.9778);
}
else
{
if(cle1quete[playerid] == 0)
{
pickupcle1quete[playerid] = CreatePickup(1581, 3, -2866.1704,1774.4386,4.5981);
}
if(cle4quete[playerid] == 0)
{
pickupcle2quete[playerid] = CreatePickup(1581, 3, -2830.3623,1835.1381,1203.9778);
}
pickupviande[playerid] = CreatePickup(2804, 3, -2822.4771,1806.4404,1203.9778);
}
return 1;
}
}
[/spoiler]

[spoiler]
Code: (pawno) [Sélectionner]
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys == KEY_FIRE)
{
if(IsPlayerInRangeOfPoint(playerid, 5.0, 80.7929993,854.8319702,37.3909988))
{
if(cables[playerid] == 0)
{
if(comptetapes[playerid] < 5)
{
comptetapes[playerid] ++;
}
else
{
echelle1[playerid] = CreateDynamicObject(1437,80.7109985,852.3090210,42.9010010,339.9974365,0.0000000,0.0000000); //object(dyn_ladder_2) (3)
echelle2[playerid] = CreateDynamicObject(1437,80.7300034,849.6719971,38.3510017,339.9938965,0.0000000,0.0000000); //object(dyn_ladder_2) (4)
pickupcables[playerid] = CreatePickup(1279, 2, 80.750045776367, 854.34735107422, 47.48482131958, -1);
comptetapes[playerid] = 0;
}
}
}
}
return 1;
}
[/spoiler]

[spoiler]
Code: (pawno) [Sélectionner]
public UpdateTime()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
new Hour, Min;
new string[16];
gettime(Hour, Min);
format(string, sizeof(string), "%02d:%02d", Hour, Min);
SetPlayerTime(i, Hour, Min);
TextDrawSetString(Clock[i], string);
if(Min == 47)
{
if(IsPlayerInRangeOfPoint(i, 20.0, -219.6454, 1403.8811, 27.7734))
{
pickupplan[i] = CreatePickup(3017, 2, -219.6454, 1403.8811, 27.7734, -1); // PLANS NITRO
}
}
if(Min == 48)
{
DestroyPickup(pickupplan[i]);
}
}
return 1;
}
[/spoiler]

Désolé j'ai du faire du découpage dans mon code, alors c'est pas ident :(
Mais chaque bout de code fait pas plus de 20 lignes ou pas beaucoup plus, alors c'est dans le respect des règles et ça devrait aller pour tes pauvres yeux :/
Titre: Re : Pickups qui se confondent !
Posté par: Infu le 26 Septembre 2013, 19:47:52
Si tu pouvais mettre sous Spoiler tes balises de code ce serait sympa  :smile:, penses à ceux qui ont une connexion en mousse  :biggrin:

Si j'ai bien compris, tu as un / plusieurs pickup qui font l'effet d'un autre pickup ?


Si tu veux vérifier d'où vient le/les problèmes, je te recommande de faire comme ceci:

Code: (pawn) [Sélectionner]
new monpickup1 = CreatePickup();
new monpickup2 = CreatePickup();
new monpickup3 = CreatePickup();
new monpickup4 = CreatePickup();
new monpickup5 = CreatePickup();
new monpickup6 = CreatePickup();

if(pickupid == monpickup1)
{
     SendClientMessage(playerid, color_red, "Pickup 1 franchit !");
}
else if(pickupid == monpickup2)
{
     SendClientMessage(playerid, color_red, "Pickup 2 franchit !");
}
else if(pickupid == monpickup3)
{
     SendClientMessage(playerid, color_red, "Pickup 3 franchit !");
}
else if(pickupid == monpickup4)
{
     SendClientMessage(playerid, color_red, "Pickup 4 franchit !");
}
else if(pickupid == monpickup5)
{
     SendClientMessage(playerid, color_red, "Pickup 5 franchit !");
}
else if(pickupid == monpickup6)
{
     SendClientMessage(playerid, color_red, "Pickup 6 franchit !");
}

Et donc, en jeu tu verras si tu as bien franchit le pickup que tu devais franchir.
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 26 Septembre 2013, 20:01:27
En fait, le pickup dont l'action est effectuée par erreur, c'est toujours le même, "cle1quete[playerid]", soit, le premier vérifié dans la callback OnPlayerPickUpPickup, et oui, pour les IDs inversés je suis sûr.

J'ai jamais eu d'erreurs de compilation sur ça hormis des erreurs d'inattention (Oublier ; Ou d'autres trucs dans le genre).

Par contre, si ça peut aider, avant, je n'avais que 21 pickups, les 20 gilets pare-balles, étant là en permanence, et le pickup du JetPack d'un de mes minijeux, et lorsque je prenais le premier gilet pare-balles (Le premier dans la liste de ceux qui spawnent), ça effectuait l'action du pickup jetpack, et pas du tout celle du pickup ramassé, ce qui a renforcé ma théorie que les pickups qui n'ont pas encore été créé sont en cause :/
Titre: Re : Re : Pickups qui se confondent !
Posté par: Infu le 26 Septembre 2013, 21:22:56
En fait, le pickup dont l'action est effectuée par erreur, c'est toujours le même, "cle1quete[playerid]", soit, le premier vérifié dans la callback OnPlayerPickUpPickup, et oui, pour les IDs inversés je suis sûr.

Dans ce cas vérifie if(pickupid == cle1quete[playerid]) et celui du Jetpack. Ajoute un simple "print" dans la condition que j'ai cité juste avant.

Code: (pawn) [Sélectionner]
if(pickupid == cle1quete[playerid])
{
     print("tu as prit le pickup bidule !");
}
else if(pickupid == jetpack[playerid])
{
     print("pickup jetpack");
}

Et donc, si tu reçois (dans ta console) le message du jetpack alors que tu as franchit cle1quete c'est que tu as inversé.  :grin:
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 26 Septembre 2013, 22:53:22
Eh bien, j'ai récupéré le pickup cle1quete, et il exécute bien sa besogne  :biggrin:
Cependant, lorsqu'après je récupère le pickup jetpack, ça ne fait rien du tout.  :sad:                                                                         
Titre: Re : Pickups qui se confondent !
Posté par: Infu le 27 Septembre 2013, 15:06:32
Tu peux me donner le code qui concerne le JetPack s'il te plaît, petit fainéantise de chercher  :happy:
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 27 Septembre 2013, 17:13:25
Quelle partie ? :/
Titre: Re : Pickups qui se confondent !
Posté par: Infu le 27 Septembre 2013, 18:16:41
Quand il entre dans le pickup
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 27 Septembre 2013, 18:46:51
Code: (pawno) [Sélectionner]
else if(pickupid == jetpack)
                    {
                                DestroyPickup(jetpack);
                                MoveDynamicObject(jetdoor, 268.6600037, 1874.8800049, 16.0660000, 2);
                                jetpackeur[playerid] = 1;
                                SetPlayerSpecialAction(playerid,2);
                                SetPlayerCheckpoint(playerid, -164.9927,2257.5029,29.1074, 2);
                                patriot1 = CreateVehicle(470,193.6896,1915.8914,17.6337,179.5064,43,0,60);
                                patriot2 = CreateVehicle(470,230.3378,1877.4802,17.6368,0.0000,43,0,60);
                                patriot3 = CreateVehicle(470,197.5331,1877.5741,17.6381,357.8704,43,0,60);
                                patriot4 = CreateVehicle(470,204.9827,1877.4537,17.6381,0.1854,43,0,60);
                                patriot5 = CreateVehicle(470,202.4198,1915.8859,17.6337,180.8017,43,0,60);
                                patriot6 = CreateVehicle(470,211.6357,1916.0370,17.6359,179.0975,43,0,60);
                                patriot7 = CreateVehicle(470,220.7590,1915.8881,17.6386,182.0833,43,0,60);
                                SetVehicleVirtualWorld(patriot1, 5);
                                SetVehicleVirtualWorld(patriot2, 5);
                                SetVehicleVirtualWorld(patriot3, 5);
                                SetVehicleVirtualWorld(patriot4, 5);
                                SetVehicleVirtualWorld(patriot5, 5);
                                SetVehicleVirtualWorld(patriot6, 5);
                                SetVehicleVirtualWorld(patriot7, 5);
                                for(new i = 0; i < MAX_PLAYERS; i++)
                                        {
                                                if(area2[i] == 1)
                                                        {
                                                                SetPlayerWorldBounds(i, 9999.9999, -9999.9999, 9999.9999, -9999.9999);
                                                                SendClientMessage(i, ORANGE, "Protégez le voleur du jet-pack");
                                                        }
                                                if(area1[i] == 1)
                                                        {
                                                                 SetPlayerWorldBounds(i, 9999.9999, -9999.9999, 9999.9999, -9999.9999);
                                                                 SendClientMessage(i, ORANGE, "Tir à volonté !! Abattez le voleur par tous les moyens !");
                                                        }
                                        }
                }
Titre: Re : Pickups qui se confondent !
Posté par: Infu le 27 Septembre 2013, 18:53:21
Le principe c'est de lui donner un jetpack, non?
T'es sur que tu as affiché le pickup aussi?
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 27 Septembre 2013, 19:32:39
Oui, il s'affiche, mais donc en fait, le pickup donne un jetpack, et fait apparaitre le checkpoint pour la fin du minijeu, enfin oui, il s'affiche, je vois vraiment pas d'où vient le bug, j'ai vraiment cherché, c'est pour ça que je sais pas du tout quoi faire :/
Titre: Re : Pickups qui se confondent !
Posté par: vincentdu90 le 28 Septembre 2013, 10:36:47
Bonjour/Bonsoir,

    Pourquoi avoir créer des tableaux pour certains de tes pickups ?
Les pickups ne sont pas "unique" pour chaque joueur donc tu utilises de la mémoire pour pas grand chose au final.
De plus j'ai vu, par exemple que tu avais ceci :

Code: (Pawn) [Sélectionner]
    public UpdateTime()
    {
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
           // [...]
   
             if(IsPlayerInRangeOfPoint(i, 20.0, -219.6454, 1403.8811, 27.7734))
             {
                  pickupplan[i] = CreatePickup(3017, 2, -219.6454, 1403.8811, 27.7734, -1); // PLANS NITRO
             }

        // [...]
        }
    }
     

Du coup ici tu créé un pickup pour chaque joueur, à proximité d'une zone, mais ces pickups sont tous à la même position.
Au final Tableaux+Multiples pickups = Matière à beaucoup de conflit.
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 28 Septembre 2013, 20:24:26
Bah en fait, la raison pour laquelle j'ai fais ce genre de choses, c'est pour que seuls les joueurs étant à une certaine heure aie le pickup, et que les retardataires non :/

Et sinon, en gros tu me conseillerais de plutôt faire ça :

Code: (Pawn) [Sélectionner]
    public UpdateTime()
    {
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
           // [...]
   
             if(IsPlayerInRangeOfPoint(i, 20.0, -219.6454, 1403.8811, 27.7734))
             {
                  variable[i] = 1;
                  pickupplan = CreatePickup(3017, 2, -219.6454, 1403.8811, 27.7734, -1); // PLANS NITRO
             }

        // [...]
        }
    }
     

?
Titre: Re : Pickups qui se confondent !
Posté par: vincentdu90 le 28 Septembre 2013, 21:00:52
Ça ne changera pas grand chose.
Ton pickup sera créé, à nouveau en plusieurs exemplaires, pour chaque joueur qui se trouvera dans ta zone.

Ce que tu peux faire pour les "retardataires" c'est de tous simplement de ne pas appliquer ton code lorsqu'ils passent sur tes pickups, ou bien de supprimer les pickups au bout d'un certain temps, ou encore après qu'ils aient été récupérés un certain nombre de fois ect...

Après tu peux toujours demander de l'aide si tu veux faire quelque chose de précis ou bien cherche sur le forum ou sur Sa-Mp.com .

Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 29 Septembre 2013, 14:14:31
Ah oui j'ai fail dans la correction, je voulais mettre le createpickup en dehors de la boucle :/

ça irait ?
Titre: Re : Pickups qui se confondent !
Posté par: vincentdu90 le 29 Septembre 2013, 15:49:43
Et bien comme je ne sais pas exactement ce que tu voudrais faire je ne peux pas t'éclairer.
Sinon en le mettant en dehors de la boucle ça créera un pickup à chaque fois que la fonction est appelée donc ça sera pire  :grin:.
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 29 Septembre 2013, 18:31:14
Code: (pawno) [Sélectionner]
public UpdateTime()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
new Hour, Min;
new string[16];
    gettime(Hour, Min);
format(string, sizeof(string), "%02d:%02d", Hour, Min);
SetPlayerTime(i, Hour, Min);
TextDrawSetString(Clock[i], string);
if(Min == 47)
    {
        if(IsPlayerInRangeOfPoint(i, 20.0, -219.6454, 1403.8811, 27.7734))
            {
pickupplanok[i] = 1;
            }
    }
if(Min == 48)
    {
pickupplanok[i] = 1;
    }
}
if(Min == 47)
    {
pickupplan = CreatePickup(3017, 2, -219.6454, 1403.8811, 27.7734, -1);
}
if(Min == 48)
    {
        DestroyPickup(pickupplan);
    }
return 1;
}

Voilà ce que je pensais faire ^^
Titre: Re : Pickups qui se confondent !
Posté par: vincentdu90 le 29 Septembre 2013, 19:16:55
Je n'avais pas vu que tu avais appelé gettime(), mais en effet là ça devrait être mieux pour ce pickup.
Titre: Re : Pickups qui se confondent !
Posté par: CarCrasher le 30 Septembre 2013, 02:39:44
Oui, en fait tout est rapporté à l'horloge ^^