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
-
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
-
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
-
Effectivement sa fonctionne ! merci beaucoup !
-
Le premier code n'était pas juste? ou alors j'ai mal compris
-
Salut,
Non scott, tu avais raison, le 1er code était faux, et celui de cristab est juste. ;)
++
Lloyd
-
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
-
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
-
Cristab fait nous un cours d'optimisation ^^
-
^^ 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 :)
-
J'irais faire une petite recherche alors
-
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)
-
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
-
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
-
tendis qu'avec la methode de syg non?
-
beaucoup moin car a la premier condition le code s'arrete ou continue si il doit continuer
-
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; }
-
sa exist un code aussi sale :o
-
Sérieusement?
Et on l'optimiserais comment?
-
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é !
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;
-
Quelqu'un pourrait il m'expliquer l'intendation?
Ce que s'est et en quoi ça conciste ^^
-
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).
-
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
-
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é
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.
-
Donc pour le serveur, le dernier est le pire?
-
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).
-
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 ;)
-
Syg te conseillera d'indenter ton code, pas besoin de l'attendre ;) !
-
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.
-
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.
-
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++
-
Ok, mais dnas la mesure du possible j'essaye de rendre mon code lisible pour une demande d'aide