GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: chneubeul le 21 Novembre 2010, 20:41:42
-
Bonjour, je pense que c'est la meilleurs solution pour moi de regrouper tous mes demandes aides dans un seul topic, comme ça je n'ai pas à chercher mes anciens topics, pour reconsulter les informations qui m'ont été donner :)
Voila mon petit problème, j'aimerais rendre possible d'utiliser soit le nom soit l'id du véhicule, grâce à l'aide de Sim, j'ai pu réaliser le code ci dessous, mais qui renvoie bien l'id de la voiture, mais à cause du return 1; la suite du code ne s'exécute pas.. :(
if (sscanf(params, "dD(0)D(0)", id, col1, col2))
{
if (sscanf(params, "s[20]D(0)D(0)", id2, col1, col2))
{
SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /veh <nom/id> <col1> <col2>");
return 1;
}
else
{
modelid = ReturnModelByName(id2);
format(string, sizeof(string), "modelid : %d", modelid);
SendClientMessage(playerid, COL_YELLOW, string);
}
return 1;
}
else { modelid = id; }
Merci de votre aide.
Sam. :cheers
-
Salut,
tu devraiis pouvoir enlever le return 1 comme les cas où l'information n'est pas correcte sont déjà gérés.
Pour te donner une petite idée:
if (sscanf(params, "dD(0)D(0)", modelid, col1, col2))
{
if (sscanf(params, "s[20]D(0)D(0)", id2, col1, col2))
{
SendClientMessage(playerid, COLOR_YELLOW, "USAGE: /veh <nom/id> <col1> <col2>");
return 1;
}
else
{
modelid = ReturnModelByName(id2);
format(string, sizeof(string), "modelid : %d", modelid);//pourquoi? tu devrais plutot vérifier que modelid est valide et le bloquer si ce n'est pas le cas
SendClientMessage(playerid, COL_YELLOW, string);
}
}
//suite de la commande
++Sim++
-
sinon le return 1 devrais pouvoir ce positionner juste en dessous du SendClientMessage
-
Ah merci. Je ne savais pas que si la commande échoué, c'était déjà validé, donc par habitude, je n'ai pas songé à enlever ce return 1;
Cristab, les sendclientmessage étais juste pour '' débugguer " ^^ Comme je n'avais jamais encore réaliser de système comme ça, je n'étais pas sûr et donc j'voulais m'assurer qu'il retournais bien l'ID du véhicule.. :)
Merci à vous deux.
:dling
-
Bonjour, :)
Voila donc je poste mon code pour enregistrer les positions, j'aimerais savoir si celui est bon et/ou comment l'optimiser.
Merci de votre aide.
function PrisePos(playerid)
{
new Float:X, Float:Y, Float:Z, stringg[32], string[32] = "anderiusmap.ini";
GetPlayerPos(playerid, X, Y, Z);
new File:File = fopen(string, io_write);
if (File)
{
format(stringg, sizeof(stringg), "%.1f|%.1f|%.1f\r\n", X, Y, Z);
fblockwrite(File,stringg, 20);
fclose(File);
}
}
-
Ton code est bon mais je te déconseil d'utiliser fblocwrite dans ton cas vu que tu ne pourra pas lire les valeurs des positions avec notepad, utilise plutôt fwrite :)
-
Docteur Sim, m'a dit le contraire ^^ à la limite osef que j'peut pas lire via notepad :)
Si j'veut vérifier si c'est bon, j'fait un p'tit script IG :)
-
enfaite ça dépend de ce que tu veut en faire, si c'est pour ton truc qui permet de récupérer la position Z sur le mod que tu utilise la méthode de Sim est meilleur, mais si tu veut juste prendre des positions comme pour le /save, celle de Sim est bien, mais le top pour pouvoir lire les valeurs avec notepad est d'utiliser fwrite ^^
-
Nan c'pour mon truc pour récupérer la position Z :)
Double post
Bonjour :)
Dans mon bus tout à l'heure j'étais pensif, et d'un coup paf un flash ! Comment fonctionne la fonction '' do ''
par exemple si je me met ceci
MaFonction(playerid)
{
do var++;
while
{
var <= 150;
}
}
Donc si jamais je charge cette fonction, est-ce que le code va continuer tout seul, ou je suis obliger de la charger avec un timer ?
-
Salut chneubeul,
je ne suis pas sur de comprendre ta question.
Dans l'exemple que tu donne, la syntaxe n'est pas bonne. Enfin, je n'ai pas testé, mais je n'ai jamais vu personne utiliser do de cette façon, ni while.
Les do-while sont des boucles au même titre que les while ou les for. La principale différence, c'est que l'action contenue dans la loop sera exécutée au moins 1 fois, peu importe que le test soit validé ou non.
La syntaxe générale est:
do
{
//code de la boucle
}
while(condition);
En ordre, le code de la boucle est exécuté, puis, si le test est validé, au retourne au do et ainsi de suite tant que le test est validé.
Un petit exemple:
new myvar =10;
do
{
myvar--;
}
while(myvar > 0);
Dans ce cas ci, le résultat est le même que:
while(myvar > 0)
{
myvar--;
}
La différence apparait dans les cas où le premier test peut ne pas être validé:
new myvar = 3;
do
{
myvar = 10;
}
while(myvar < 2);
printf("Myvar: %d", myvar);
Le printf sortira donc myvar = 10.
Avec un simple while:
new myvar = 3;
while(myvar < 2)
{
myvar = 10;
}
printf("myvar: %d", myvar);
Si tu parle d'une autre utilisation qu'en boucle, dit le et quelqu'un (peut-être moi) tentera de t'expliquer. Ensuite, si tu parle effectivement de l'utilisation en boucle, mais que mon explication n'est pas claire, tu peut toujours demander.
++Sim++
-
Bonsoir Sim,
Tu m'a permis d'éclairer un peu ma lanterne :)
Le but primaire de ma requête bien que ton post est très intéressant résulte d'une boucle.
J'aimerais savoir si le while se comporte comme un '' timer en boucle " il va se répéter par exemple tant que la condition n'est pas atteinte, ou c'est une autre façon d'écrire un if ?
A+, Sam.
-
Une boucle c'est du code qui se répète tant que la condition est vrai, si elle est fausse alors la boucle est arrêtée ^^
-
Oui, je sais ça ^^
Mais le while est une boucle ?
Bref :)
Je tourne cours au sujet, on en reparlas un peu plus tard j'ai une petite question un peu plus urgente :)
Voila donc pour simplifier un peu le code, j'aimerais utiliser foreach le problème, c'est que ben ça ne marche pas x')
Je m'en suis rendu compte, en mettant mes textdraw dans ongamemodeinit et je l'ai charger via une boucle
qu'ils fonctionnent très bien SANS le foreach c'est à dire une boucle classique for(new i=0; i< ...
Et la je test, avec foreach, rien n'apparait. :(
Est-ce un bug connu ? Ma syntaxe je l'ai écris comme ça :
foreach(Player, i)
Je trouve ça très louche, j'ai regardé un peu dans l'include et perso je trouve ça bizarre, à peine l'ombre de foreach mininuscule..
Merci de votre aide,
Sam. :cheers
-
Salut,
foreach fait une loop de tous les joueurs connectés, donc dans OnGameModeInit ce n'est pas à utiliser.
++Sim++
-
Ben j'vais mettre dans OnPlayerConnect :)
Merci à toi Sim. :dling
-
Une boucle c'est du code qui se répète tant que la condition est vrai, si elle est fausse alors la boucle est arrêtée ^^
C'est le contraire il me semble, tant que la condition est fausse, elle se répète et s’arrête quand elle est vrai !
-
Dans les 2 cas, c'est bon. Ça dépend comment tu code.. :happy
-
Euh ? Je dirai comme mon prof de français "Je suis dans la 4ème dimension ?" lol
for( new i = 0; i < 10; i++ )
Lit ce code et tu comprendra par toi même ^^
-
Oui, c'est bien que se que je dis, tant que i n'est pas égal à 10 (faux), on incrémente i.
Mais on peut le voir des deux côtés si on réfléchie bien, car tant que i est plus petit que 10 (vrai), on incrémente i.
Cela revient à dire deux choses opposés pour deux choses égales, mais je me demande laquelle est réellement la bonne !
-
L'opérateur < ne veut pas du tout dire égal, il veut dire plus petit que.
Donc si i est plus petit que 10 on l'incrémente, sinon on arrête la boucle ^^
édit: rooh faillais pas édit ton texte maintenant le mien ne veut plus rien dire lol
-
Sa reviens au même, c'est "plus petit que" mais cela repend exactement ce que je dis au mot prés.
Je pense que nous avons tout les deux raisons mais nous avons un raisonnement différent.
Une autre personne pourrait nous éclaircir ?
-
@Xartrick : Ton raisonnement est pas tout à fait faux, il n'est pas tout à fait vrai non plus. Et en lisant cette phrase, tu te retrouve dans la même situation qu'une boucle conditionnelle. Le soucis c'est que tu mélange tout, a la fois une boucle et à la fois une condition. La boucle "for" peut ne pas être conditionnelle et pourtant elle bouclera. Ce qui est appelé une boucle conditionnelle c'est une boucle qui bouclera tant que son expression conditionnelle sera vrai. Par conséquent tant que dans l'exemple a sasuke i sera inférieur a 10 ça executera le code. Des que i sera supérieur ou egal a 10 l'expression conditionnelle sera fausse et la boucle s'arretera.
Apres c'est une erreur de langage, une expression vrai l'est autant qu'une expression pas fausse...
-
Bonjour, :)
Voila donc je poste mon code pour enregistrer les positions, j'aimerais savoir si celui est bon et/ou comment l'optimiser.
Merci de votre aide.
function PrisePos(playerid)
{
new Float:X, Float:Y, Float:Z, stringg[32], string[32] = "anderiusmap.ini";
GetPlayerPos(playerid, X, Y, Z);
new File:File = fopen(string, io_write);
if (File)
{
format(stringg, sizeof(stringg), "%.1f|%.1f|%.1f\r\n", X, Y, Z);
fblockwrite(File,stringg, 20);
fclose(File);
}
}
Chneubeul je te conseil d'ouvrir le fichier avec io_readwrite comme mode, sinon à l'ouverture de ton fichier le contenu du fichier sera effacé ^^
-
Je comprend mieux maintenant.
Merci à Sasuke78200 et UZI-I.
-
Mais derien :)
( ça fais plaisir de voir des gens comme toi, qui ne font pas que de râler ^^ )
-
C'est bien mieux en effet.
Donc si je comprend bien, selon les boucles, leurs sens peuvent changer ?
Certaines boucles vont s'exécuter au moins une fois même si c'est faux, et d'autres, si la valeur est fausse, ne vont pas s'exécuter une seule fois.
-
En faite seul do-while s'exécute une fois sans tester sa condition, while et for ( si for est conditionnel ) test toujours la condition avant d'exécuter le code ^^
-
C'est plus facile à comprendre quand on comprend :)
Merci encore !
-
C'est plus facile à comprendre quand on comprend
Philosophe ? x')
Xartrick et Sasuke, je vous remercie d'avoir skouaté mon topic, j'ai appris des choses ^^
Pour le script pour relever les pts, je vais le faire finalement pour gta united, le mod anderius est trop sophistiqués, je ne veut pas passer 100 ans à checker des zones particulières.. ^^ Du coup je vais faire autrement, et ça surement mieux comme ça. Pour GTA-United si des personnes sont intéressés, ben faudra attendre que je trouve un PC pour héberger le script avec gta en route ^^
Double post
Soir'
J'aimerais faire une sorte d'auto ciblage, en fonction de où le joueur regarde. Le soucis c'est que j'me souviens vaguement d'un script ou l'on cliqué et une explosion se produise à l'endroit ou l'on regarder.
Je sais que ce script est très différent de celui du wiki que voila :
public OnPlayerCommandText(playerid, cmdtext[])
{
if (!strcmp(cmdtext, "/test camera vector"))
{
new
Float:fPX, Float:fPY, Float:fPZ,
Float:fVX, Float:fVY, Float:fVZ,
Float:object_x, Float:object_y, Float:object_z;
// Change me to change the scale you want. A larger scale increases the distance from the camera.
// A negative scale will inverse the vectors and make them face in the opposite direction.
const
Float:fScale = 5.0;
GetPlayerCameraPos(playerid, fPX, fPY, fPZ);
GetPlayerCameraFrontVector(playerid, fVX, fVY, fVZ);
object_x = fPX + floatmul(fVX, fScale);
object_y = fPY + floatmul(fVY, fScale);
object_z = fPZ + floatmul(fVZ, fScale);
CreateObject(345, object_x, object_y, object_z, 0.0, 0.0, 0.0);
return 1;
}
return 0;
}
Mais j'aimerais savoir pourquoi on doit faire un tas de calcul avant d'avoir la position, et surtout est-ce que sa vaut vraiment le coup, car mon script va être appeler en boucle et donc à force de calcul, le serveur va lagguer avec du peuple..
Merci de votre aide.
Sam. :dling
-
Je ne pense pas que le nombre de personne puisse influer car ton calcul ne s'exécute seulement quand on tape une commande et non en permanence.
Après, si 200 joueurs exécute en même temps la commande, je pense que là oui, ton serveur va avoir quelque problème temporaire :-\ !
-
Ce n'est pas une commande, mais bien un code placé dans une fonction qui va être checké en boucle.. :)
Je peut simplifier, j'y pense. En permettant au joueur de se mettre en mod combat ou pas. :)
-
Salut,
les calculs fait ici sont probablement beaucoup plus rapides que l'appel des fonctions en elles-mêmes. Le volume de calcul est très restreint, d'ailleurs tu pourrais (même devrais) retiré les fonction floatmul et simplement utiliser * .
Explique ta véritable application et on pourra t'aider d'avantage. Toutefois, je dirais que tu ne rencontrera pas de problèmes niveau calcul. Un streamer comporte beaucoup, beaucoup plus de calcul et pourtant ça fonctionne.
++Sim++
-
Voila, donc finalement, je vais rajouter la possibilité du mode combat, ça éviterais le PK :happy
Donc, enfaite si un joueur est un mod combat, il si il regarde un autre joueur qui lui aussi l'est, une flèche au dessus de celui ci sera afficher, ce qui va montrer sa cible. Si le joueur qui le vise lance un sort, alors le sort sera contre le joueur ciblé.
-
Salut,
j'aime bien l'idée, toutefois faudra faire attention, faire le test assez rapidement mais ne pas permettre que ça change tous les 200 ms, sinon on risque d'avoir de la difficulté.
Ce qu'il te faudrait faire, c'est établir des points dans la direction qu'il regarde et avec des sphères (de rayon qui augmente avec la distance) chercher les joueurs dans ces sphères, en s'assurant qu'ils sont en mode combat. Le mieux ce serait de trouver celui qui se rapproche le plus de la ligne où le joueur regarde. Ce qui est bien, c'est que si on veut on peut appliquer ici des maths moyennement avancés, avec la distance entre un point et une droite en 3 dimensions. Bien sur, ce n'est pas essentiel.
En sauvegardant simplement le joueur visé dans une variable, tu pourras rendre ta commande (ou autre) de sortilège très simple.
D'ailleurs, de cette façon on peut rendre certaines armes plus efficace, par exemple, le sniper (en utilisant de petites sphères).
simple conseil: la distance entre les sphères ne devrait pas dépasser leurs rayon.
++Sim++
-
Salut :)
Au pire ce que je peut faire c'est utiliser, GetXYFront qui utilise une sorte de produit scalaire je crois. ( sin et cos) puis checker devant le joueur à la distance ou le joueur regarde voir si il y a un joueur en mode combat.
Je vais faire un petite brouillon pour voir, et tester ça.
PS: une fois j'ai vu un petit système lorsque qu'on activé le scope avec le sniper ou pouvoir la distance de tir, si on se pointer sur une victime, je l'ai tester, c'était très précis, il faut que je le retrouve et voir comme ceci fonctionne, voir le système que le codeur à utiliser et comparer avec nos théorie.
A toute à l'heure,
Sam. :dling
Edit : Voila donc j'ai réaliser le script. Je résume :
Ce système permet de cibler un joueur pour pouvoir lui lancer des sorts sans devoir taper l'id ou quoi que ce soit.
Quand le joueur va se mettre en mode combat et si il rencontre une cible elle aussi en mode combat, une flêche va s'afficher au dessus de la cible, l'id de la cible va alors s'enregistrer dans une variable, et si le joueur veut la garder alors il doit appuyer sur une touche.
Pastebin GTAOnline (http://pastebin.gtaonline.fr/pastebin.php?show=954)
-
Salut,
ça me parait plutôt bien comme code, seulement tu as mis un return 1 dans ta boucle, dans le cas où tu test le joueur en question. Il faudrait remplacer ce return par un continue sinon tu ne traiteras pas les cas où l'ID est plus grand que celui du joueur.
Si tu veut être plus précis, je te recommande de faire varié le rayon de ta sphère acceptée avec la distance, je t'explique en code:
new Float:Dist = 25.0;//supposons que ceci est la distance entre les deux joueurs
new Float:rayon = 0.02;//le rapport rayon/distance est de 0.02, donc un angle de 1.15° à côté du joueur est accepté, tu peut mettre plus
rayon *= Dist;//ici on ajuste le rayon à la distance
if(IsPlayerInRangeOfPoint(toplayer, rayon, X, Y, Z))
{
//il est dans la bonne zone, on le cible.
}
par contre il y a un truc que je ne comprend pas à quoi ça sert, le x, y, z (dans ton code).
Fais aussi attention, GetXYinFrontOf ... fonctionne avec un angle, ici tu as le vecteur directeur de la caméra (à vérifier)
il te suffit de faire:
new Float:X, Float:Y, Float:Z;
new Float:X2, Float:Y2, Float:Z2;
new Float:Dist;
//on récupère les positions du joueur:
GetPlayerPos(playerid, X, Y, Z);
foreach(toplayer)
{
//on récupère les positions du second joueur:
GetPlayerPos(toplayer, X2,Y2, Z2);
X2 -= X;
Y2 -= Y;
Z2 -= Z;
Dist = floatsqroot(X2 * X2 + Y2 * Y2 + Z2 * Z2);
if(Dist > 20.0)continue;//ça c'est à voir...
X2 += X - CamX * Dist;//on soustrait car je le fait à l'envers (permet de sauver 1 groupe de variable)
Y2 += Y - CamY * Dist;
Z2 += Z - CamZ * Dist;
Dist *= 0.02;//je calcule mon rayon comme précédemment.
if(PointToPoint( X, Y, Z, X2, Y2, Z2, Dist))//fonction à définir avec un define, je te le ferai si tu veut
{
....
}
...
vois avec ça, je doit aller à mon cours, au pire je vais éditer pour terminer.
PS. codé sur le forum alors peut contenir de nombreuses fautes.
++Sim++
-
Salut :)
Merci d'avoir répondu aussi précisément.
Pour te répondre x, y, z sert à calculer la position ou le joueur regarde que je complète avec la position devant le joueur. ^^
J'ai remplacer mon code par le tiens, ça simplifie énormément x')
Je cherche pour faire le define pointtopoint là :)
Par contre CamX, CamY et CamZ comment on le définis ?
edit : j'ai trouvé pointtopoint, que tu as créé :D
#define PointToPoint(%0,%1,%2,%3,%4,%5,%6) ((%0 - %3) * (%0 - %3) + (%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5) <= (%6 * %6))
-
Salut,
CamX, CamY, CamZ est le vecteur directeur de la caméra du joueur, à récupérer avec GetPlayerCameraFrontVector.
Comme j'ai dit à la fin de mon message précédent, je n'ai pas testé ce code, il se peut donc qu'il ne soit pas tout à fait fonctionnel, il y a peut-être de petits ajustement à faire, mais l'idée principale est là.
++Sim++
-
Salut :)
Merci à toi Sim, j'ai tout modifier et compiler aucune erreur de syntaxe etc.. reste à savoir si ça fonctionne, je ne pourrais pas tester avant ce soir.. :(
A+, Sam.
-
Soir', je coupe court à l'autre sujet, car je ne peut pas le tester me faut un gens qui est le temps ^^ ( je reprendrais après le problème qui va suivre)
Voila mon autres problèmes :
J'ai installer le système djson une upgrade de dini, mais apparemment l'écriture de string, merdouille un peu.
Voila ce qui est marqué sur le topic officiel :
Known Issues
- Writing strings with unescaped " does not work! You have to replace " with \" first! This will be fixed in future versions.
A ce que j'ai compris, j'ai fait ça :
djSet(ini, \"Key", password);
[code]
Mais ça ne marche pas.. voila ce qui est enregistrée :
"Key":""
J'ai même essayer de formater le password, j'ai bidouiller un tas de trucs, et rien ne marche..
Merci de votre aide.
[/code]
-
c'est celui ci que tu as ??? http://forum.sa-mp.com/showthread.php?t=175565 (http://forum.sa-mp.com/showthread.php?t=175565)
-
Non, le y_ini je l'ai tester, il ne marchais pas, peut être ça venez du code que j'ai produit, mais en tout cas si faut plus se casser la tête c'pas la peine, autant passer direct au SQL et pas se faire chier ^^
Sinon moi j'ai :
http://forum.sa-mp.com/showthread.php?t=48439 (http://forum.sa-mp.com/showthread.php?t=48439)
A+, Sam.
-
je pense que c'est djSetInt et non djSet
-
integer = nombre entier, le mdp peut contenir des chiffres comme des lettres et on doit stocker le tout sous string.
Double post
Bonsoir, j'ai beaucoup réfléchis, et le système de fichier et pas terrible finalement, comme j'aimerais développer un mode entièrement dynamique. Pour cela, il me faudrait passer au SQL ( site sur un autre dédié) mais quels plugins me conseilleriez vous ? Il y en a pleins ^^
En cas de problème, ou si je plante, j'ai un amis qui si j'le chope sur TS, peut m'aider. Donc pour l'utilisation et les conseilles de sécurité, il pourra m'éclairer.
Merci de votre aide,
Sam.
-
J'utilise celui ci et cela marche à la perfection !
http://forum.sa-mp.com/showthread.php?t=56564 (http://forum.sa-mp.com/showthread.php?t=56564)
Et voici un code (par moi) qui permet juste de vérifié si un compte existe.
#include <a_samp>
#include <a_mysql>
new Handle;
main(){}
public OnGameModeInit()
{
new rows;
if(mysql_connect("localhost" , "root" , "samp", "" )) {
mysql_debug(1);
print("[MYSQL]: La connexion à `localhost` est établie !");
}
else {
print("[MYSQL][ERREUR]: La connexion à `localhost` à échoué !");
}
mysql_query("SELECT * FROM `users` WHERE `user_name` = 'player';");
mysql_store_result();
rows = mysql_num_rows();
mysql_free_result();
printf("%d", rows);
// rows = 1 -> Le compte existe
// rows = 0 -> La compte n'existe pas !
// rows = -1 -> Erreur !
return 1;
}
public OnGameModeExit()
{
mysql_close(Handle);
return 1;
}
-
Le plugin que Xartick te conseille est pas mal.
Sinon moi je préfère de loin celui ci: http://forum.sa-mp.com/showthread.php?t=56564 (http://forum.sa-mp.com/showthread.php?t=56564)
Je l'utilise depuis le début et jamais été déçu, après c'est selon le point de vu.
Et pour t'aider, les pages wiki de chaque plugin:
Celui que Xartrick te conseille: http://wiki.sa-mp.com/wiki/MySQL_Plugin (http://wiki.sa-mp.com/wiki/MySQL_Plugin)
Celui que je te conseille: http://wiki.sa-mp.com/wiki/MySQL (http://wiki.sa-mp.com/wiki/MySQL)
A toi de voir lequel te convient le mieux
-
Excusé moi de mon erreur, mais celui que steve76 recommande est bien celui que j’utilise, donc je te conseil également de prendre celui-ci !
PS: J'édit mon message :P.
-
Ouki, merci beaucoup Xartrik et Steve ! :)
-
Ceci dit l'autre n'est pas mauvais mais je préfère quand même celui de G-sTyLeZzZ.
Par contre n'utilise surtout pas celui ADreNaLiNe-DJ, il n'est plus mit à jours, est pas mal buggé et provoque de nombreux crash
-
On peut voir pourquoi ici: http://forum.sa-mp.com/showthread.php?t=161726 (http://forum.sa-mp.com/showthread.php?t=161726)
-
Je l'avais vu aussi ^^, le plugin crash avant la fin du test. Et pour l'avoir testé je le conseille pas.
-
Bonsoir,
J'ai une petite question qui me tracasse vous allez me dire, que je suis un perfectionniste mais bon ^^
Lorsque je dois imposer une condition, qui est par exemple 0 ou 1 ( non booléenne :p ) quel méthode est la mieux :
if(.. != 0)
if(.. == 1)
Sachant que ma variable ne sera jamais différent de 0 ou 1 (c'est pour l'exemple j'aurais pu prendre 1 et 2 ^^)
Il y a-t-il une différence entre les deux ?
Merci de vos réponses.
Sam. :cheers
-
tu peu faire ceci aussi
if(Var) qui est semblable a if(Var == 1) ou if(Var != 0)
est aussi if(!Var) qui est semblable a if(Var == 0)
Quoi qu'il en soit il me semble que le mieu pour toi lors de la relecture il vaut mieux utiliser if(Var==1) ou if(Var==0) sa revient au meme
-
Oki, merci beaucoup. On ne sais jamais des fois avec le code, si des vérifications peuvent être instable ou imprécise :)
-
Salut,
Oki, merci beaucoup. On ne sais jamais des fois avec le code, si des vérifications peuvent être instable ou imprécise :)
on peut le savoir, au pire tu fais des tests avec printf^^.
Par contre, fait attention car ces test ne sont pas équivalents.
Par exemple: if(var != 0) -> si la variable est différente de 0 alors que if(var == 1) si la variable vaut 1.
Ce n'est pas la même chose.
L'équivalence n'est vraie que dans le cas où la variable ne prend que les valeurs 0 ou 1.
Il vaut toujours mieux prendre l'option qui correspond le mieux à l'utilisation, même si tu utilise un entier comme un booléen.
Que tu le veule ou non, ce n'est pas vraiment un booléen...
ps. je préfère if(var == 0) à if(!var)
++Sim++
-
Salut Sim,
Merci d'avoir répondu. Moi aussi je préfère :
if(var == 0) à if(!var)
pour des conditions avec variables par contre lors de fonction j'utilise assez souvent le !
if(!IsPlayerConnected(playerid))
par exemple.
Bonne journée, Sam. :)
Double post
Bonsoir,
J'aimerais enregistrer les dommages causés sur une voiture et en cas de crash ou reboot du serveur que voit la voiture soit restauré avec tous ses dégâts. Donc pour réaliser un petit test, j'ai utiliser la callback OnVehicleDamageStatusUpdate pour ressortir les données décimales des dégâts.
public OnVehicleDamageStatusUpdate(vehicleid, playerid)
{
#pragma unused playerid
new panels, doors, lightss, tires, string[128];
GetVehicleDamageStatus(vehicleid, panels, doors, lightss, tires);
format(string, sizeof(string), "Vehicle Status : [Panels] : %d - [Doors] : %d - [Lights] : %d - [Tires] : %d",panels,doors,lightss,tires);
SendClientMessage(playerid, COLOR_YELLOW, string);
return 1;
}
Les nombres qui m'en sont ressortis, je l'ai ai mis de coter et utiliser ceci :
UpdateVehicleDamageStatus(veh, 2162721, 67108868, 5, 0);
Avec un exemple de nombre. Le problème c'est lorsque je veut restituer les dommages, cela ne m'affiche qu'une partie. Donc j'ai eu une petite idée, sachant que les données étant en binaires 0 ou 1 pour casser ou non. On obtient une série de données et on transforme en binaire. Mais lorsque qu'on veut restituer des dégâts, la fonction gère peut être mal la conversion décimal > binaire. ( ce qui est long à faire lorsqu'on a de très grand nombre (division successive par 2 :happy))
Merci de votre aide.
Sam. :cheers
-
public OnVehicleDamageStatusUpdate(vehicleid, playerid)
{
#pragma unused playerid
new panels, doors, lightss, tires, string[128];
GetVehicleDamageStatus(vehicleid, panels, doors, lightss, tires);
format(string, sizeof(string), "Vehicle Status : [Panels] : %d - [Doors] : %d - [Lights] : %d - [Tires] : %d",panels,doors,lightss,tires);
SendClientMessage(playerid, COLOR_YELLOW, string);
return 1;
}
Ton erreur est toute simple. ;) Et pourquoi ne pas mettre string[256]; ? Mieux vaut prévoir un peu plus pour une récupération qui demande beaucoup.
-
Le nom de la variable n'influe en rien le chargement des données. La variable string, à un tableau de 128, ce qui est amplement suffisant, sachant que la limite de caractères dans le chat est de 128, même je vois pas en quoi cela changerais la récupération des données a part l'affichage, le message serais juste coupé ce qui n'est pas le cas :happy
-
Essaye en mettant directement tes variables dans la fonction UpdateVehicleDamageStatus
Comme ceci : UpdateVehicleDamageStatus(veh, panels, doors, lightss, tires);
Je ne sais pas si cela va changer grand chose mais sur le wiki c'est comme ca qu'ils font.
Ça évite d'avoir des modif en cours de route, et peut-être que la fonction gère mieux de cette façon.
Je ne sais pas ce que ca va donner mais je n'ai jamais utilisé cette fonction. Ça coute rien d'essayer
@denko: Faut arrêter de vouloir mettre des 256 partout, beaucoup ont tendance à surestimer mais il faut mieux chercher à voir le maximum que la variable peut contenir plutôt que de mettre une valeur beaucoup trop grande
EDIT: Je viens de voir un post sur le forum de SAMP, apparemment on ne peut utiliser cette fonction uniquement si il y a un Conducteur dans le véhicule.
-
Chneubeul normalement le code est bon c'est juste que tu affiche mal tes variables ^^
format(string, sizeof(string), "Vehicle Status : [Panels] : %d - [Doors] : %d - [Lights] : %d - [Tires] : %d",panels,doors,lightss,tires);
j'aurai plutôt mis
format(string, sizeof(string), "Vehicle Status : [Panels] : %b - [Doors] : %b - [Lights] : %b - [Tires] : %b",panels,doors,lightss,tires);
-
Oué car je connais pas non plus %b, que %f, %d, %s, %i
-
ça sert à afficher des nombres binaires
http://wiki.sa-mp.com/wiki/Format (http://wiki.sa-mp.com/wiki/Format)
-
Je vais essayer pour temps c'est sortis du wiki ;) Toujours pareil :(
-
Ceci ne te dit rien ?
011010100010110101001011101011101010000111101010
J'espère que tu connais le langage machine, enfin, son fonctionnement schématisé ?
-
L'assembleur et encore au dessus et l'hexadécimal n'est binaire, il n'est composé que de 0 et de 1 !
http://fr.wikipedia.org/wiki/Binaire (http://fr.wikipedia.org/wiki/Binaire)
-
C'est un mot, qui désigne une action électrique. Par exemple dans ton PC, on peut dire que tu as des 0 et 1 qui circulent à fond la patate. Enfaite ça symbole une courbe avec un signal logique (sinusoïdale, carré, ou triangulaire) avec des états haut 1 ou bas 0. Donc, à partir de ça, on peut tirer quelques conversions, qui va nous permettre de '' coder '' ces informations en binaire pour les envoyer au ordinateur. Pour faire des conversions binaires, tu peut te créé un petit tableau.
exemple :
000 -> 0
001 -> 1
010 -> 2
011 -> 3
101 -> 4
100 -> 5
111 -> 6
110 -> 7
Je sais pas si tu peut remarquer, mais dans la première colonne, les chiffres passe de 0 à 1 tous les 4 lignes. Dans la deuxième tous les 2 et la première tous les 1. Pourquoi ? Car c'est le poids du chiffres.
Pour exemple (101)2 <- Un mot binaire, 1 - 0 -0 et non 100
le premier 1 => 1 bits
le 0 => 2 bits
le deuxième 1 => 4 bits
Soit le mot (101)2 vaut 5 bits car ( 4+1) on ne prend que le poids ou il y a des 1
Comment convertir du décimal en binaire ?
Par simple divisions successive par 2 :)
Exemple j'ai un nombre : (53)10 <= Nombre sur la base 10
53/2 = 26 reste 1
26/2 = 13 reste 0
13/2 = 6 reste 1
6/2 = 3 reste 0
3/2 = 1 reste 1
On ne peut plus diviser, donc on reporte les nombres en commençant par la fin donc :
(110101)2
On peut donc écrire (53)10 = (110101)2
Voila si tu veux des précisions supplémentaires n'hésite pas.
-
Ça à l'air d'être ça. :)
C'est super simple. Ensuite je vois que tu parlais d'hexa, qui est une base 16 donc je vais t'apprendre à compter :happy
0,1,2,3,4,5,6,7,8,9 .. ( et non pas 10 :D), A, B, C, D, E, F
Si tu veux mettre un nombre décimal en hexa tu divise par 16 comme pour le binaire :
exemple 26
26/16 = 1 reste 10
On ne peut plus diviser donc on remonte comme avec le binaire donc
(26)10 = (1A)16
Le A vient veut enfaite dire 10
comme F vaut 16. :)
-
Bonsoir, voulant enregistrer des comptes joueurs, j'ai opter pour la méthode par ini ( car système de site qui utilise aussi .ini :) ) Mais tout d'abord, quel système prendre, le système de base ou le système Y_ini ?
Si je prenais le système de base, comment enregistrer des comptes efficacement ?
- En enregistrant les données une par une. J'entends par là comme sur les GF donc on format et on écris aussitôt.
- En formatant un gros ensemble de données pour sauvegarder en une seul requête.
Merci de votre aide.
Sam. :cheers
-
Salut,
Bonsoir, voulant enregistrer des comptes joueurs, j'ai opter pour la méthode par ini ( car système de site qui utilise aussi .ini :) ) Mais tout d'abord, quel système prendre, le système de base ou le système Y_ini ?
Si je prenais le système de base, comment enregistrer des comptes efficacement ?
- En enregistrant les données une par une. J'entends par là comme sur les GF donc on format et on écris aussitôt.
- En formatant un gros ensemble de données pour sauvegarder en une seul requête.
Merci de votre aide.
Sam. :cheers
Regarde ce que j'ai fait avec AdminOnDuty, le résultat est un fichier de structure identique à un .ini (à la sauvegarde des positions près).
C'est beaucoup plus efficace que d'utiliser dini pour faire le même travail.
++Sim++
-
Salut,
Ben enfaite c'est la méthode de base quoi. Merci beaucoup.
-
Bonsoir, un ami m'a dit qu'il avait sur un serveur, un menu avec plusieurs stock emplacement qu'on ne pouvais sélectionner, en fait ce sont des SetMenuColumnHeader(...); mais, j'ai essayer et il n'y en à qu'un qui apparait chez moi.. Alors comment en metres plusieurs ?
MCarac1 = CreateMenu("Caracteristique", 1, 440, 140, 150, 40);
SetMenuColumnHeader(MCarac1, 0, "1ere ligne");
AddMenuItem(MCarac1, 0, "Ajouter");
AddMenuItem(MCarac1, 0, "Enlever");
SetMenuColumnHeader(MCarac1, 0, "2eme ligne");
AddMenuItem(MCarac1, 0, "Ajouter");
AddMenuItem(MCarac1, 0, "Enlever");
SetMenuColumnHeader(MCarac1, 0, "3eme ligne");
AddMenuItem(MCarac1, 0, "Ajouter");
AddMenuItem(MCarac1, 0, "Enlever");
AddMenuItem(MCarac1, 0, "Descendre");
Voila le code que j'ai utiliser pour mon test.
Merci, Sam. :cheers
J'ai trouvé avec une petite recherche dans les includes de sa:mp ^^
native DisableMenuRow(Menu:menuid, row);
-
Bonsoir, :p
Alors voila j'aimerais enregistrer des informations, mais le problème c'est qu'il y en n'a tout plein :p donc j'aimerais utiliser le fameux caractères \ mais le problème c'est que lorsque je l'utilise comme ceci :
format(st, sizeof(st), "%s|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%f|%f|%f|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|\
%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|\
%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|\
%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|\
%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|\
%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|\
%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f|%d|%f|%f|%f|%f|%f|%f",
Pawno me gronde et me dit : " fatal error 102: table overflow: "staging buffer" "
Il me dit que j'ai dépasser la table, peut être qu'on ne peut mettre qu'un seul \ ? Mais alors comment faire ? ^^
Humm, j'ai trouvé sur le forum sa:mp, j'ai oublié de chercher avant >.<
Enfaite c'est parce que j'ai dépasser la capacité de la fonction format ^^
Du coup, now j'ai répartis sur 3 strings les données, le format peut contenir environ 75 données. Mais, en modifiant la lecture des données, j'ai eu la même erreur, donc cela est une limite du pawno. :)
Comment pourrais-je contourner ce problème ? :(
Merci de votre aide.