GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: vardanega le 02 Décembre 2010, 18:07:22

Titre: Probleme "ispassenger"
Posté par: vardanega le 02 Décembre 2010, 18:07:22
Bonsoir, je voudrais que tout les joueurs puissent entrez en passager dans les véhicules de faction mais il ne peuvent pas entrez du tout dans les véhicules protégé a part les membres de l'equipe a laquelle appartient le véhicule.

Voici mon code:

if(vehicleid <= 10)
{
    if(PlayerInfo[playerid][pMember] != 1 || PlayerInfo[playerid][pLeader] != 1 && !ispassenger)
    {
    SendClientMessage(playerid, 0xFF0000FF, "Vous n'avez pas les clefs de ce véhicule !");//VEHICULE STARS
    RemovePlayerFromVehicle(playerid);
    TogglePlayerControllable(playerid, 1);
    return 1;
}
else if(PlayerInfo[playerid][pMember] == 2 || PlayerInfo[playerid][pLeader] == 2 && ispassenger)
{
    return 1;
}
}



Je voudrais seulement que les joueurs puissent entrez en passager.

Merci beaucoup

Vincent
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 02 Décembre 2010, 18:41:56
if(vehicleid <= 10)
{
   if(!ispassenger)
   {
      if(PlayerInfo[playerid][pMember] != 1 || PlayerInfo[playerid][pLeader] != 1)
      {
         SendClientMessage(playerid, 0xFF0000FF, "Vous n'avez pas les clefs de ce véhicule !");//VEHICULE STARS
RemovePlayerFromVehicle(playerid);
TogglePlayerControllable(playerid, 1);
return 1;
      }
      else if(PlayerInfo[playerid][pMember] == 2 || PlayerInfo[playerid][pLeader] == 2)
      {
         return 1;
      }
   }
}

tente comme ceci par contre le titre de ton sujet n'as rien avoir avec ton probleme
Titre: Re : Probleme "ispassenger"
Posté par: vardanega le 02 Décembre 2010, 19:27:44
Effectivement sa fonctionne ! merci beaucoup !
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 02 Décembre 2010, 23:02:16
Le premier code n'était pas juste? ou alors j'ai mal compris
Titre: Re : Probleme "ispassenger"
Posté par: Pixect le 02 Décembre 2010, 23:36:15
Salut,

Non scott, tu avais raison, le 1er code était faux, et celui de cristab est juste. ;)

++
Lloyd
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 03 Décembre 2010, 13:49:17
if(!ispassenger)
   {
      if(PlayerInfo[playerid][pMember] != 1 || PlayerInfo[playerid][pLeader] != 1)
      {


s'est la meme chose que

if(PlayerInfo[playerid][pMember] != 1 || PlayerInfo[playerid][pLeader] != 1 && !ispassenger)
    {


Non? Ou alors je vais pas bien mais pour moi s'est la même chose
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 03 Décembre 2010, 14:02:44
c'est censer oui mais les RP sont tellement bien optimiser qu'apparement sa n'as pas le temps de lire toutes les condition donc autant soulager le serveur avec une seul condition pour commencer
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 14:07:22
Cristab fait nous un cours d'optimisation ^^
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 04 Décembre 2010, 14:30:46
^^ je pense que syg a deja fait un tuto la dessus apres le plus simple et de penser comment rendre le plus simple possible la lecture d'un code est ce en lui mettant plein de condition a ne plus finir ou est ce de lui faire comprendre que si Z on fait E et si A on fait X :)
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 14:53:33
J'irais faire une petite recherche alors
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 04 Décembre 2010, 15:01:56
voila pour toi  http://www.gtaonline.fr/forums/index.php/topic,6250.0.html (http://www.gtaonline.fr/forums/index.php/topic,6250.0.html)
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 15:05:01
merci bien car "optimisation" ne donnais guère de résultats

Double post
LES CONDITIONS

Les conditions sont la clé d'un code non linéraire. Elles permettent d'orienter le script en fonction de ce qui se passe sur le serveur.
Les conditions s'utilisent avec les mots clés (ou instructions) suivants : if, while, do/while et for.
Les conditions peuvent très vite devenir très compliquées à formuler et il ne faut pas hésiter à les éclater en plusieurs conditions.
Par exemple, on veut tester pour chaque joueur qui est connecté si il est passager d'un véhicule ou si il est à pied.
On pourrait écrire :
for (i=0 ; i<MAX_PLAYERS ; i++)
{
   if (IsPlayerConnected (i) && (IsPlayerInAnyVehicle (i) && GetPlayerState (i) == PLAYER_PASSENGER) || GetPlayerState (i) == PLAYER_ON_FOOT))
   {
      /* On fait quelque chose */
   }
}
On voit très vite dans ce bout de code qu'il est très facile de se tromper dans la condition (parenthèses, opérateurs).

Il vaut donc mieux écrire :
for (i=0 ; i<MAX_PLAYERS ; i++)
{
   if (IsPlayerConnected (i))
   {
      if (IsPlayerInAnyVehicle (i))
      {
         if (GetPlayerState (i) == PLAYER_PASSENGER)
         {
            /* On fait quelque chose */
         }
      }
      else if (GetPlayerState (i) == PLAYER_ON_FOOT)
      {
         /* On fait quelque chose */
      }
   }
}
NB : Ici, on tombe dans un autre travers où l'on est obligé d'utiliser deux fois le même code (/* On fait quelque chose */) mais ce n'est qu'un exemple

Il ne parle pas de rapidité, juste d'erreur que l'on pourrai faire,

J'irais faire un tour du coté de Y_Less
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 04 Décembre 2010, 15:31:51
on peu oui faire des erreure mais si tu met des printf partout tu verras que de temps a autre il y en a qui sont sauter
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 18:25:35
tendis qu'avec la methode de syg non?
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 04 Décembre 2010, 18:26:51
beaucoup moin car a la premier condition le code s'arrete ou continue si il doit continuer
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 19:55:31
un truc du genre s'est orrible alors?

if(giveplayerid == playerid) { Message(playerid,4000,"~r~Vous ne pouvez pas utilisez cette commande sur vous meme."); return 1; }
        if(!IsPlayerConnected(giveplayerid) || JoueurInfos[giveplayerid][jSpawn] != 1) { Message(playerid,4000,"~r~Ce joueur n'est pas connecte ou n'a pas encore spawn."); return 1; }
            if(!IsPlayerInAnyVehicle(playerid)){ Message(playerid,4000,"~r~Vous n'etes pas dans un vehicule de police."); return 1; }
if(!GetDistanceBetweenPlayers(playerid,giveplayerid,5.0)) { Message(playerid,4000,"~r~Ce joueur n'est pas pres de vous."); return 1; }
            new carid = GetPlayerVehicleID(playerid);
if(VehiculeInfos[carid][vType] != 8) { Message(playerid,4000,"~r~Vous n'etes pas dans un vehicule de police."); return 1; }
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) { Message(playerid,4000,"~r~Vous n'etes pas conducteur."); return 1; }
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 04 Décembre 2010, 20:07:10
sa exist un code aussi sale :o
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 20:17:42
Sérieusement?

Et on l'optimiserais comment?
Titre: Re : Probleme "ispassenger"
Posté par: Xartrick le 04 Décembre 2010, 20:34:15
Vraiment mal indenté, je vois également des return partout alors qu'on pourrait en utiliser qu'un seul grâce à else if.
Voilà un code bien indenté et légèrement optimisé !

Code: (Pawn) [Sélectionner]
new carid = GetPlayerVehicleID(playerid);

if(giveplayerid == playerid)
{
Message(playerid, 4000, "~r~Vous ne pouvez pas utilisez cette commande sur vous meme.");
}
else if(!IsPlayerConnected(giveplayerid) || JoueurInfos[giveplayerid][jSpawn] != 1)
{
Message(playerid, 4000, "~r~Ce joueur n'est pas connecte ou n'a pas encore spawn.");
}
else if(!IsPlayerInAnyVehicle(playerid))
{
Message(playerid, 4000, "~r~Vous n'etes pas dans un vehicule de police.");
}
else if(!GetDistanceBetweenPlayers(playerid, giveplayerid, 5.0))
{
Message(playerid, 4000, "~r~Ce joueur n'est pas pres de vous.");
}
else if(VehiculeInfos[carid][vType] != 8)
{
Message(playerid, 4000, "~r~Vous n'etes pas dans un vehicule de police.");
}
else if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
Message(playerid, 4000, "~r~Vous n'etes pas conducteur.");
}
return 1;
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 21:24:11
Quelqu'un pourrait il m'expliquer l'intendation?

Ce que s'est et en quoi ça conciste ^^
Titre: Re : Probleme "ispassenger"
Posté par: Brian Turner le 04 Décembre 2010, 21:33:38
Sa consiste a rendre le code plus "beau" plus compréhensible, apres je sais pas si c'est pareil pour le logiciel que pour nous(plus comprehensible).
Titre: Re : Probleme "ispassenger"
Posté par: cristab le 04 Décembre 2010, 22:07:57
Oo j'avais repondut mon post ni est plus pour le compilot c'est plus lisible

mais juste un truc pourquoi ne pas regarder si le playerid remplit les condition avant le giveplayerid c'est pas logique le code
Titre: Re : Probleme "ispassenger"
Posté par: Xartrick le 04 Décembre 2010, 22:20:22
L'indentation permet une meilleur lisibilité du code présenté.
Cela donne plus envie à une personne de lire et de comprendre ton code sans avoir à le déchiffrer !


Indentation:
Très souvent utilisée en programmation, elle rend le code source plus clair et plus lisible.
- Wikipedia.org


EDIT: Voici trois code identique mais qui sont indenté différemment.
Tu pourra me dire quelle est pour toi la meilleur chose à faire: indenter ou ne pas indenter.

Code indenté

Code: (Pawn) [Sélectionner]
if(CPS_IsPlayerInCheckpoint(playerid, cpammu2)) {
AMMUBOX[playerid] = 0;

if(gTeam[playerid] != COP && gTeam[playerid] != Medic && gTeam[playerid] != SWAT && gTeam[playerid] != FBI && gTeam[playerid] != ARMY) {
if(Ammu2RecentlyRobbed == 0) {
new chances = random(500);

if(chances >= 0 && chances <= 400) {
new string[250];

RobAmmu2[playerid] = 20;
Ammu2RecentlyRobbed = 150;

format(string, sizeof(string), "%s[ID:%d] started a robbery at Ammunation!", name, playerid);
Announce(string);

return true;
}
else if(chances >= 401 && chances <= 500) {
new copmsg[250];

SendClientMessage(playerid, ERROR, "Your attempt to rob Ammunation failed!");
SendClientMessage(playerid, ERROR, "The Police are on their way to the store.");

SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid) + 5);

format(copmsg, sizeof(copmsg), "[HQ] %s attemped to rob Ammunation.", name);
SendRadioMessageToCops(copmsg);

Ammu2RecentlyRobbed = 100;

return true;
}
}
else if(Ammu2RecentlyRobbed > 0) return SendClientMessage(playerid, ERROR, "Ammunation has been robbed recently!");
}
else SendClientMessage(playerid, ERROR, "Your team cannot rob anything.");
}

Code non-indenté
if(CPS_IsPlayerInCheckpoint(playerid, cpammu2))
{
AMMUBOX[playerid] = 0;
if(gTeam[playerid] != COP && gTeam[playerid] != Medic && gTeam[playerid] != SWAT && gTeam[playerid] != FBI && gTeam[playerid] != ARMY)
{
if(Ammu2RecentlyRobbed == 0)
{
new chances = random(500);
if(chances >= 0 && chances <= 400)
{
new string[250];
RobAmmu2[playerid] = 20;
Ammu2RecentlyRobbed = 150;
format(string, sizeof(string), "%s[ID:%d] started a robbery at Ammunation!", name, playerid);
Announce(string);
return true;
}
else if(chances >= 401 && chances <= 500)
{
new copmsg[250];
SendClientMessage(playerid, ERROR, "Your attempt to rob Ammunation failed!");
SendClientMessage(playerid, ERROR, "The Police are on their way to the store.");
SetPlayerWantedLevel(playerid,GetPlayerWantedLevel(playerid)+ 5);
format(copmsg, sizeof(copmsg), "[HQ] %s attemped to rob Ammunation.", name);
SendRadioMessageToCops(copmsg);
Ammu2RecentlyRobbed = 100;
return true;
}
}
else if(Ammu2RecentlyRobbed > 0) return SendClientMessage(playerid, ERROR, "Ammunation has been robbed recently!");
}
else SendClientMessage(playerid, ERROR, "Your team cannot rob anything.");
}

Code non-indenté et mal rangé
if(CPS_IsPlayerInCheckpoint(playerid, cpammu2)){AMMUBOX[playerid] = 0;
if(gTeam[playerid] != COP && gTeam[playerid] != Medic && gTeam[playerid] != SWAT && gTeam[playerid] != FBI && gTeam[playerid] != ARMY){if(Ammu2RecentlyRobbed == 0)
{new chances = random(500);if(chances >= 0 && chances <= 400){new string[250];RobAmmu2[playerid] = 20;Ammu2RecentlyRobbed = 150;
format(string, sizeof(string), "%s[ID:%d] started a robbery at Ammunation!", name, playerid);Announce(string);
return true;}else if(chances >= 401 && chances <= 500){new copmsg[250];SendClientMessage(playerid, ERROR, "Your attempt to rob Ammunation failed!");
SendClientMessage(playerid, ERROR, "The Police are on their way to the store.");SetPlayerWantedLevel(playerid,GetPlayerWantedLevel(playerid)+ 5);
format(copmsg, sizeof(copmsg), "[HQ] %s attemped to rob Ammunation.", name);SendRadioMessageToCops(copmsg);Ammu2RecentlyRobbed = 100;
return true;}}else if(Ammu2RecentlyRobbed > 0) return SendClientMessage(playerid, ERROR, "Ammunation has been robbed recently!");
}else SendClientMessage(playerid, ERROR, "Your team cannot rob anything.");}

Tu pourra remarquer que le dernier code est très petit (en ligne) mais est complètement illisible !
PS: Code tiré aléatoirement du gamemode RuNix's Cops and Robbers codé par Raul_Ro du forum officiel de SA:MP.
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 04 Décembre 2010, 22:50:55
Donc pour le serveur, le dernier est le pire?
Titre: Re : Probleme "ispassenger"
Posté par: Xartrick le 04 Décembre 2010, 22:52:38
Après être compiler, un code est un code.
Le compilateur lui, peut avoir du mal à diriger ton code mais ton serveur, une fois qu'il à un code compilé (sans erreurs), il l'exécute mais l'indentation ne l'affectera pas (à moins que je me trompe).
Titre: Re : Re : Probleme "ispassenger"
Posté par: scott1 le 05 Décembre 2010, 00:19:58
Après être compiler, un code est un code.
Le compilateur lui, peut avoir du mal à diriger ton code mais ton serveur, une fois qu'il à un code compilé (sans erreurs), il l'exécute mais l'indentation ne l'affectera pas (à moins que je me trompe).


Donc en fait je choisis la methode que je prefere.

ça n'affecte pas les performance? Ooooh grand maitre syg passe par ici ;)


Titre: Re : Probleme "ispassenger"
Posté par: Xartrick le 05 Décembre 2010, 00:20:43
Syg te conseillera d'indenter ton code, pas besoin de l'attendre ;) !
Titre: Re : Probleme "ispassenger"
Posté par: Ssk le 05 Décembre 2010, 00:33:57
En faite à la compilation leur compilateur enlève tout les "Blancs" donc que le code soit indenté ou pas ça n'affecte pas le compilateur ( sauf pour les warning d'indentation ), mais comme le dit Xartrick Syg te conseillerai d'indenter ton code.
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 05 Décembre 2010, 00:37:46
L'indenter pour ma lecture, mais pas pour celle du serveur, donc pas de soucis au niveau des performance.


Je suis bisard mais cette écriture me plait donc si niveau performance aucun soucis, je la garde.
Titre: Re : Probleme "ispassenger"
Posté par: S!m le 05 Décembre 2010, 21:04:42
Salut,

effectivement il n'y a aucun soucis à l'exécution, ni à la compilation. Comme tous les autres l'ont dit, le fichier compilé n'est pas influencé par l'indentation (C'est un peu comme si tu laisse des lignes vides dans ton script pour séparer deux parties, il n'y aura pas de lignes vides dans le code compilé, de toute façon ce n'est pas du texte alors...)

Par contre, quand tu demande de l'aide, il est beaucoup plus difficile et moins tentant de t'aider avec un code non indenté et mal arrangé. Après, si ça te plait, c'est toi qui voit.

PS. comme c'est aussi plus évident de voir les niveaux de code etc... c'est plus évident de voir les erreurs d'accolade, de return mal placés....

++Sim++
Titre: Re : Probleme "ispassenger"
Posté par: scott1 le 05 Décembre 2010, 21:38:58
Ok, mais dnas la mesure du possible j'essaye de rendre mon code lisible pour une demande d'aide