GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Disa25 le 29 Octobre 2009, 11:46:18
-
Bonjour,sur mon serveur RP je voudrais incorporer un systeme de radars automatiques.J'ai cherché dans votre forum,il a beaucoup de sujet qui en parle mais je ne comprend pas trop.J'aurais besoin d'aide ou par exemple d'un exmple de radars pour miex comprendre s'il vous plait.Merci.
-
J'en cherche un comme toi ^^
-
Go >>>> forum samp
-
J'ai pas trouver, si quelqu'un trouve qu'il me fasse signe.
-
Go >>>> forum samp
ou le périphe de ta ville :dry >:( :dejadehors
non sinon tu peut t'aider d'un compteur ou cherche sur le forum samp ;)
++
-
M'aider d'un compteur?
-
Salut,
simple remarque, vous pouvez désormais utiliser GetPlayerVelocity...
pour avoir la vitesse en km/h:
Float:GetPlayerSpeed(playerid)
{
new Float:X, Float:Y, Float:Z;
new vehid;
if((vehid = GetVehicleID(playerid)))
{
GetVehicleVelocity(vehid, X, Y, Z);
}
else
{
GetPlayerVelocity(playerid, X, Y, Z);
}
return (floatsqroot(X * X + Y * Y + Z * Z) * 180);
}
voilà qui devrait simplifier la création d'un radar...
++Sim++
-
Tanks pour la fonction sa m'evitera de la refaire
ps: je prepare une include pour un systeme de radar automatique (sur base du code que j'avait fait pour mon ancien serveur)
-
Salut,
simple remarque, vous pouvez désormais utiliser GetPlayerVelocity...
pour avoir la vitesse en km/h:
Float:GetPlayerSpeed(playerid)
{
new Float:X, Float:Y, Float:Z;
new vehid;
if((vehid = GetVehicleID(playerid)))
{
GetVehicleVelocity(vehid, X, Y, Z);
}
else
{
GetPlayerVelocity(playerid, X, Y, Z);
}
return (floatsqroot(X * X + Y * Y + Z * Z) * 180);
}
voilà qui devrait simplifier la création d'un radar...
++Sim++
Peux tu un peux m'expliquer a quoi correspond chaque terme? J'abuse un peux de toi :s
-
Float:GetPlayerSpeed(playerid) // ici on declare une fonction comme si on fesais new mais pour une fonction
{
new Float:X, Float:Y, Float:Z; // ici on declare les variable qui vont contenir des position pour calculer la vitesse ( ce n est oas vraiment des position moi meme je ne sais pas pourquoi on a besoin de 3 variable)
new vehid; // ici on declare une variable qui va contenir l id du vehicule
if((vehid = GetVehicleID(playerid))) // ici on regarde si le gars est dans une vehicule et s l est dedans on prend l id du vehicule qu on stocke dans la variable vehid
{
GetVehicleVelocity(vehid, X, Y, Z); // la on prend la vitesse
}
else // la si le joueur est a pied
{
GetPlayerVelocity(playerid, X, Y, Z); // on prend ca vitesse a pied
}
return (floatsqroot(X * X + Y * Y + Z * Z) * 180); // ici on retourne la valeur de la vitesse comme si on calculer la distance mais on multiplie par 180 pour avoir le tout en KM/h
}
-
c'est moi ou dans le script il ne passera jamais dans else?
j'aurai plutot mis sa moi :
Float:GetPlayerSpeed(playerid) // ici on declare une fonction comme si on fesais new mais pour une fonction
{
new Float:X, Float:Y, Float:Z; // ici on declare les variable qui vont contenir des position pour calculer la vitesse ( ce n est oas vraiment des position moi meme je ne sais pas pourquoi on a besoin de 3 variable)
new vehid; // ici on declare une variable qui va contenir l id du vehicule
if(IsPlayerInAnyVehicle(playerid)) // ici on regarde si le gars est dans une vehicule
{
vehid = GetPlayerVehicleID(playerid) // on recupere l'id du vehicule
GetVehicleVelocity(vehid, X, Y, Z); // la on prend la vitesse
}
else // la si le joueur est a pied
{
GetPlayerVelocity(playerid, X, Y, Z); // on prend ca vitesse a pied
}
return (floatsqroot(X * X + Y * Y + Z * Z) * 180); // ici on retourne la valeur de la vitesse comme si on calculer la distance mais on multiplie par 180 pour avoir le tout en KM/h
}
de plus la fonction GetVehicleID(playerid) n'existe pas c'est GetPlayerVehicleID
-
Ta solution est meilleure rafffel car elle est plus claire.
Mais celle de Sim fonctionne quand même.
GetPlayerVehicleID renvoie 0 si le joueur n'est pas dans un véhicule donc le test va fonctionner.
Ceci fonctionne car il n'y a pas de véhicule avec l'ID 0, le premier véhicule créé à l'ID 1.
Je conseille fortement d'éviter ce genre de raccourci qui peut être source d'erreur.
Je préconise donc la fonction de rafffel.
++
Syg
-
A bon .
Si on met if(0) il ne passera jamais dans le if ?
Je pensais que c'etait a travers un true ou false qu'il jugeait si la condition etait bonne ou non .
et comme justement GetPlayerVehicleID renvoie 0 ce n'est pas false .
en plus c'est le retour de l'assignation de la variable qui est juger non?
donc si on met 0 dans vehid l'operation d'assignation retournera true .
Faudrat que je fasse des test.
J'avance ça sans vraiment être sur .
Edit : j'ai dit que des conneries XD if(0) ne passe pas .
on peut juger sur une assignation si c'est egal a 0 c'est comme si on avait false.
-
Un test est vrai si la valeur testée est différente de 0.
Donc on passera dans un if si ce qui est à l'intérieur des parenthèses (=le résultat de l'évaluation du test) est différent de 0.
1) Dans le cas d'un test sur une variable seule, c'est simple, si la valeur de la variable est différente de 0 on "entre" dans le if.
if (IsLogged[playerid])
{
printf ("Joueur logué");
}
2) Dans le cas où l'on teste l'appel d'un fonction, c'est la valeur de retour de la fonction qui est évalué. Si la fonction retourne 0, on n'entre pas dans le test.
if (IsPlayerAdmin (playerid))
{
printf ("Joueur admin");
}
3) Dans le cas d'une comparaison, la valeur évaluée est celle du résultat de la comparaison qui peut être soit vrai (=1), soit faux (=0)
if (a==3)
{
printf ("a vaut 3");
}
4) Dans le cas où l'on teste une affectation, c'est la valeur de la variable la plus à gauche qui est évaluée. On retombe dans le cas 1)
if (Vid=GetPlayerVehicleID (playerid))
{
printf ("Le joueur est dans un véhicule");
}
Il est même possible de faire plusieurs affectations en une seule ligne :
if (a=b=c=GetPlayerVehicleID (playerid))
{
printf ("a, b et c ont la valeur du vehicleID");
}
else
{
printf ("a, b et c valent tous 0");
}
Dans le cas ci-dessus, c'est normalement la valeur de a qui est utilisée mais comme toutes les variables ont forcément la même valeur, ça n'a aucune importance.
Dans le cas d'un test multiple il suffit de savoir que le signe && correspond à un multiplication et le signe || à une addition.
Par exemple :
<Expression1> && <Expression2>
Le résultat évalué est valeur de (Expression1) multipliée par valeur de (Expression2)
Donc si l'une des deux vaut 0, le résultat vaudra 0.
<Expression1> || <Expression2>
Le résultat évalué est valeur de (Expression1) plus valeur de (Expression2)
Donc le résultat vaudra 0, 1 ou 2 selon les cas.
Dans les deux exemples ci-dessus, <Expression1> et <Expression2> peuvent être n'importe quel des 4 cas cités plus haut.
++
Syg
-
merci syg on en apprend tout les jours même si pour le coup j'ai un peut honte XD un simple if de base et je dis n'importe quoi ^^.
-
j' aurais une question syg
True est egal a quoi ? en chiffre
de meme pour false ( j en deduit que c 'est egal a 0)
-
true vaut 1 si j'me trompe pas
ps: bonne nouvelle j'ai presque fini mon include me reste a faire un ti GM pour tester si tout fonctionne correctement ;)
-
Béh d apres mes connaissance true vaut (> 0) ou (<0 pas sur)
-
true c'est >0 et false 0.
Pour tester fait sa (en C) :
int v = 0;
if(v)
{
printf("Vrai\n");
}
else
{
printf("Faux\n");
}
Et test avec plusieurs valeur tu verra ;)
Enfin tu doit connaitre je pense :)
-
Je profite de se post pour signaler que j'ai presque fini mon include pour un systeme de radar, demain j'commence les test si vous vous debrouillez bien en pawn et que vous voulez m'aider pour les test envoyer moi un MP ;)
-
true c'est >0 et false 0.
Pour tester fait sa (en C) :
int v = 0;
if(v)
{
printf("Vrai\n");
}
else
{
printf("Faux\n");
}
Et test avec plusieurs valeur tu verra ;)
Enfin tu doit connaitre je pense :)
Ouais je connaissais mais je me demande si true le boolean a une valeur a lui une valeur propre
-
Ah ben moi ce que j'ai appris c'est qu'il a juste une valeur différente de 0
-
True (vrai) est une constante et a, comme le dit sasuke, pour valeur 1. Pour s'en convaincre, il suffit de rajouter la ligne suivante dans un script pawn : printf ("true=%d", true); qui produira l'affichage true=1
False (faux) quand à lui, a pour valeur 0 (on peut faire la même chose que pour true).
La négation de l'un des deux (vrai ou faux) donne l'autre (!false=!0=true=1 et !true=!1=!2=!3=...=false=0).
On peut très facilement tester tout ceci avec des printfs dans le main d'un gamemode.
En C ou en PAWN, un test est TOUJOURS une comparaison d'une expression avec 0. Si l'expression vaut 0, le corps du test n'est pas effectué.
L'instruction if n'utilise pas true et false pour savoir si le code sera exécuté ou non, elle n'utilise que 0.
De ce fait, par abus de language, on considère que ce qui n'est pas égal à 0 (faux) est vrai (donc égal à 1).
Et quand je parle d'expression, je parle de la valeur finale de ce qui est contenu entre les parenthèses qui suivent le if.
Ex :
if (IsplayerAdmin(playerid) && Vid=GetPlayerVehicleID(playerid) && (score[playerid]==50 || score[playerid]==60))
{
printf ("L'expression à une valeur différente de 0");
}
Ce qui est en gras est l'expression qui sera évaluée au moment du test puis comparée à 0. Dans cet exemple, l'expression vaudra 0 ou 1 à cause de la présence des opérateurs &&.
Mais dans l'exemple suivant, l'expression peut prendre n'importe quelle valeur entre 0 et 10000 :
if (Alea=random(10001))
{
printf ("Le nombre choisi est %d", Alea);
}
else
{
printf ("Le nombre choisi est 0");
}
Mais comme je le disais précédemment, je déconseille fortement de mettre des affectations dans un test.
Un des risques d'une telle utilisation vient du fait que l'expression peut ne pas être évalué dans sa totalité.
Dans le test suivant, la variable Alea ne sera renseignée que si b vaut 7. Si b ne vaut pas 7, l'instruction Alea=random(10001) ne sera pas exécutée.
if (b==7 && Alea=random(10001))
Exemple concret :
new a=10005, b=2;
if (b==2 && (a=random(10001)))
printf ("b=%d, a=%d", b, a);
else
printf ("b=%d, a=%d", b, a);
a=10005;
if (b==3 && (a=random(10001)))
printf ("b=%d, a=%d", b, a);
else
printf ("b=%d, a=%d", b, a);
Ce bout de code produit l'affichage suivant :
b=2, a=1655
b=2, a=10005
NB : Ce qui est en gras peux varier car c'est un nombre aléatoire.
La valeur 10005 ne pouvant pas être obtenue avec random(10001) c'est que, dans le deuxième test, l'instruction a=random(10001) n'a pas été exécutée.
++
Syg
-
Merci syg pour ces precision =)
-
Salut,
Juste pour prevenir que j'ai casiment terminé mon include de radar , j'ai encore un dernier test a faire pour sortir un premiere version public j'aurait besoin de voir si lorsqu'il ya plusieurs joueur le systeme marche tjr aussi bien
Pour sa j'ai ouvert un serveur (0.3a) : 94.23.208.227:7770
Je vous invite a vous y connecter et utiliser les voiture que j'ai spawn pour passé devant les radar et voir si tout fonctionne bien.
Le mot de passe est: gtaonline
-
GG Mr Fredo fonctionnelle a souhaite avec l'effet de flash de surcroit ^^
-
:D
Normalement se soir j'met l'include en telechargement :)
-
Tester et approuver ^^
-
De même :)
-
Une seul chose a dire, GENIAL, bravo, et l'effet du flash Hmmm je me suis régalé xD
-
Salut,
en voyant le screen, peut-être une petite correction:
Flasher à %d. Vitesse maximum autoriser: %d.
>>
Flashé à %d. Vitesse maximale autorisée: %d.
mais c'est pas dans l'include ça je croit...
++Sim++
-
Salut,
en voyant le screen, peut-être une petite correction:
Flasher à %d. Vitesse maximum autoriser: %d.
>>
Flashé à %d. Vitesse maximale autorisée: %d.
mais c'est pas dans l'include ça je croit...
++Sim++
Les fautes ne sont pas un gros problème. Il suffit juste de modifier un peu l'orthographe soit même (la moindre des choses quand on sait que le système fonctionne ;) )
-
De toute facon le message c'est juste dans le FS de demo (qui sert uniquement a montrer comment utiliser les fonction de creation de radar)
Desolé je n'ai pas pu poster l'inc hier soir j'la posterai normalement se soir si j'suis la