• 05 Juin 2026, 20:51:22


Auteur Sujet: Verifier position d'un checkpoint  (Lu 1881 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Lychaos

  • *
  • Tueur en série
  • Messages: 165
    • Voir le profil
Verifier position d'un checkpoint
« le: 29 Avril 2010, 18:17:17 »
Bonsoir!

Il y a un moment deja, j'avais crée un job d'éboueur qui, tout simplement, devait faire faire une tournée et ramasser la poubelle sur un checkpoint, le probleme est que.. Je ne sais pas comment verifier qu'il soit sur le bon checkpoint. Car quand je l'ai esseyer, il suffisait que je changais de cp ( avec /gps par exemple) et quand on se rendait sur ce cp, sa comptait comme une poubelle...

Je sais pas si vous comprenez ce que je veux dire, mais  en gros c'est: Voir si la position du cp du joueur est celle du cp d'eboueur..

+Lychaos++Ster+

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #1 le: 30 Avril 2010, 10:59:19 »
Effectivement, les CP ne sont pas identifiés pour la bonne et simple raison qu'il ne peut y en avoir qu'un seul par joueur à un instant T.
Donc la seul façon de savoir si le joueur est dans le bon CP est de contrôler que le joueur est dans la bonne zone autour du CP (avec la fonction IsPlayerInRangeOfPoint par exemple).

++
Syg
Courtesy of GtaManiac

Hors ligne Lychaos

  • *
  • Tueur en série
  • Messages: 165
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #2 le: 04 Mai 2010, 10:02:36 »
Excusez moi du temps de réponse, j'ai été quelque peu occupé ^^

Mais, je ne comprend pas comment utiliser IsPlayerInRangeOfPoint car en fait, les CP sont donner de maniere aléatoire selon une liste au debut du GM...
Il y a peut etre un moyen d'enregistrer les coordonner aleatoire dans une float, et quand il va dessus, il verifie avec le float...

+Lychaos++Ster+

edit; j'ai vu aussi qu'on pouvais crevé les pneu, donc jvais poser une deuxieme question ^^ : Je voudrais faire une commande /creverpneu [1-4] et faire en sorte que si 1 pneu est deja crever, il fait crever les 2 pneu... mais j'ai vu que sa ne marchais pas avec un systeme d'addition, donc 1 (0001) c'est le pneu bas gauche crever et que la personne faire /crever 2, seul le 2eme pneu serait crever... En gros je voudrais faire en sorte, qu'on puisse crever plusieurs pneu, un a la fois. Voila mon code pour le moment :
Code: (pawn) [Sélectionner]
if(strcmp(cmd, "/creverpneu", true) == 0)
{
if(IsPlayerConnected(playerid))
{
new panels, doors, lights, tires;
GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid,0xFF0000FF,"USAGE: /creverpneu [pneu 1-4]");
return 1;
}
pneu = strval(tmp);
if(pneu < 1 || pneu > 4)
{
SendClientMessage(playerid,0xFF0000FF,"USAGE: /creverpneu [pneu 1-4]");
return 1;
}
if(pneu == 1) {
UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 8);
} else if(pneu == 2) {
UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 2);
} else if(pneu == 3) {
UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 4);
} else if(pneu == 4) {
UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 1);
}
}
return 1;
}
et pour savoir quel vehicule est a coter du joueurs?
« Modifié: 04 Mai 2010, 11:00:40 par Lychaos »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #3 le: 04 Mai 2010, 11:04:33 »
Pour les pneus, j'ai en partie répondu ici :

++
Syg
Courtesy of GtaManiac

Hors ligne Lychaos

  • *
  • Tueur en série
  • Messages: 165
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #4 le: 04 Mai 2010, 11:38:39 »
Tu tes planter dans la citation, mais je voit le poste dont tu parle ^^ Le souci c'est que si je veux faire en sorte qu'il regarde quel pneu est crever pour les additionner, il faudrais que je fasse pleins de if?

if(pneu == 1) {
if(tires == 0) UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 0+1);
if(tire == 2)  UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 2+1);
if (tirer == 3) UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, 3+1);
            
         }
et ceux, jusque 15?

mais en plus, on peux pas additionner, car 2+1 ne veux pas dire pneu 1 et intel est crever

edit: Ohh je crois que j'ai piger, avec ton systeme de Define, je n'ai que 4 if, a faire... enfin... non, car si 2 pneu sont deja crée il sauras pas :s
« Modifié: 04 Mai 2010, 12:01:15 par Lychaos »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #5 le: 04 Mai 2010, 12:07:50 »
Non, je ne me suis pas planté, je n'ai pas mis le contenu pour pas encombrer ce topic, il suffit de cliquer sur la citation pour avoir le post.

Sinon, pour faire ce que tu veux faire, il faut utiliser l'opérateur | (ou inclusif).
On peut même contrôler que le pneu n'est pas déjà crevé en utilisant l'opérateur & (et exclusif).
Je ne vais pas faire de grand discours, si quelqu'un veut plus d'explications, qu'il le demande.

#define PNEU_ARR_DROIT   1
#define PNEU_AV_DROIT   2
#define PNEU_ARR_GAUCHE   4
#define PNEU_AV_GAUCHE   8
new Pneus[4]  {PNEU_AV_GAUCHE, PNEU_AV_DROIT, PNEU_ARR_GAUCHE, PNEU_ARR_DROIT};
/* Dans le tableau ci dessus, j'ai repris ton ordre des pneus */

...

if(strcmp(cmd, "/creverpneu", true) == 0)
{
if(IsPlayerConnected(playerid))
{
new panels, doors, lights, tires;
GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid,0xFF0000FF,"USAGE: /creverpneu [pneu 1-4]");
return 1;
}
pneu = strval(tmp);
if(pneu < 1 || pneu > 4)
{
SendClientMessage(playerid,0xFF0000FF,"USAGE: /creverpneu [pneu 1-4]");
return 1;
}

/* Si le pneu est déjà crevé */
if (tires & Pneus[pneu-1])
{
SendClientMessage(playerid,0xFF0000FF,"Ce pneu est déjà crevé !");
return 1;
}

/* Mettre à jour l'état des pneus */
UpdateVehicleDamageStatus(vehicleid, panels, doors, lights, tires | Pneus[pneu-1]);
}
return 1;
}

++
Syg
Courtesy of GtaManiac

Hors ligne Lychaos

  • *
  • Tueur en série
  • Messages: 165
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #6 le: 04 Mai 2010, 12:31:42 »
je ne comprend pas ce niveau la :

Code: (pawn) [Sélectionner]
/* Si le pneu est déjà crevé */
if (tires & Pneus[pneu-1])

pourquoi pneu 1

Si c'est parce que c'est un tableau c'est pas +1?

Et puis je connais pas du tout le | inclusif et le & exclusif donc j'ai du mal a m'y faire ^^

Et pour voir le vehicule a coter de moi, je dois faire un CheckPlayerDistanceToVehicle + switch counter? <----- j'ai esseyer d'implanter un systeme de ce genre, mais mon pawn m'envoit un rapport d'erreur
« Modifié: 04 Mai 2010, 13:42:41 par Lychaos »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #7 le: 04 Mai 2010, 14:06:13 »
Ta commande demande un nombre en 1 et 4 (correspondant à chaque pneu de la voiture).
Si pneu=1, il faut aller chercher l'élément 0 du tableau (les tableaux en PAWN commencent à l'élément 0)
Si pneu=2, il faut aller chercher l'élément 1 du tableau
Etc ...

Voilà le pourquoi de pneu-1

Le & permet d'associer bit à bit deux valeurs pour en donner un troisième.
Lorsque deux bit de même rangs sont à 1 dans les deux valeurs alors le bits est à 1 dans la troisième valeur. Il est à 0 dans tous les autres cas.
Pour résumer (on parle en bit ici) :
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Exemple :
Si tires=6=4+2 (00000110 en binaire) après l'appel à GetVehicleDamageStatus.
Ceci veut dire que c'est le pneu arrière gauche et le pneu avant droit sont crevés.

Si on fait tires & PNEU_AV_GAUCHE = 6 & 8 on va trouvé 0 :
6 = 00000110
8 = 00001000
------------
    00000000 = 0


Par contre, si on fait tires & PNEU_ARR_GAUCHE = 6 & 4 on va trouvé 4 (qui est différent de 0 ce qui indique que le pneu testé est crevé)
6 = 00000110
4 = 00000100
------------
    00000100 = 4


++
Syg
Courtesy of GtaManiac

Hors ligne Lychaos

  • *
  • Tueur en série
  • Messages: 165
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #8 le: 04 Mai 2010, 16:01:42 »
Wow, c'est compliquer comme système ^^

Pour le tableau, je l'avais lu a l'envers, pour sa je comprenais pas ^^

merci pour tes info, je vais essayer de faire en sorte que ma cmd pour voir les véhicule a coter du joueurs fonctionne et je testerais sa IG ^^
+Lychaos++Ster+

Double post
Waw Syg tes TROP fort !

Sa marche grandiosement! Jvais faire en sorte qu'on puisse le faire qu'al l'exterieur du vehicule et pouvoir faire un systeme de reparage de roue pour les mecanicien et meme des roue de secours! ah c'est genial!
« Modifié: 04 Mai 2010, 17:56:54 par Lychaos »

Hors ligne Lychaos

  • *
  • Tueur en série
  • Messages: 165
    • Voir le profil
Re : Verifier position d'un checkpoint
« Réponse #9 le: 07 Mai 2010, 09:41:03 »
je me permet d'ajouter que j'ai trouver comment retrouver la postion d'un CP je posterais le code ce soir, la je ne suis pas chez moi.

edit : Tout simplement:

Code: (pawn) [Sélectionner]
new Float:PoubellePoints[26][3]={
{-2660.9,85.3,4.1}, etc etc

Et dans le public OnPlayerEnterCheckpoint(playerid)
 if(cppoubelle = 1 && PlayerToPoint2(4.0,playerid,PoubellePoints[p][0],PoubellePoints[p][1],PoubellePoints[p][2])


Voila, j'ai trouver la soluce en voyant le systeme d'essence de Mr Fredo
« Modifié: 07 Mai 2010, 12:28:27 par Lychaos »