GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: scott1 le 06 Novembre 2009, 19:01:02
-
Bonsoir a tous, j'ai créer cette commande:
http://pastebin.com/m475e1890 (http://pastebin.com/m475e1890)
Quand je fait /fouiller il me dit toujours arme: Aucune
-
Sa vient du GetPlayerWeaponData car toutes les armes que tu vérifie ne viennent pas forcement du slot n°1.
-
mais si j'ai une arme elle est automatiquement dans le slot 1 si je l'est pas en main?
-
Salut,
le slot de l'arme correspond à son type
par exemple une mitraillette n'est pas dans le même slot que le m4 ou encore le minigun
++Sim++
-
Peut tu me dire a quoi correspond le slot 1 stp ? Car j'ai copîer d'un code préexistant que j'ai transformer et en cmd.
-
Tiens, vas à ce lien : http://wiki.sa-mp.com/wiki/Weapons (http://wiki.sa-mp.com/wiki/Weapons)
Sinon :
- GetPlayerWeaponData donne l'arme que possède le joueur dans un slot donné. On se sert de cette fonction pour faire la liste des armes que possède un joueur (cf plus bas).
- GetPlayerWeapon sert à connaître l'arme que le joueur à en main (celle qu'il est en train d'utiliser)
Il y a un slot par type d'arme et chaque slot ne peux contenir qu'une seule arme (ce qui explique pourquoi on ne peux pas avoir en même temps un couteau et une batte de basebal ou un 9mm et un Desert Eagle)
Voici un bout de script qui permet de récupérer pour chaque slot l'arme que le joueur possède (donc au final de faire la liste de toutes les armes possédées par le joueur) :
new Armes[13][2];
for (i=0 ; i<12 ; i++)
{
GetPlayerWeaponData (Target, i, Armes[i][0], Armes[i][1]);
}
Une fois ce bout de script exécuté, le tableau Armes contient pour chaque slot, l'arme et le nombre de munition.
Si on trouve la valeur -1 comme arme c'est que le slot est vide (le joueur ne possède pas d'arme de ce type).
Certaines armes sans munitions (parachute ou couteau par exemple) ont -1 comme nombre de munitions.
++
Syg
-
Je ne vois pas comment je pourrai intégré ceci dan smon code, car il enverai toujours le meme nom de l'arme puisque les nom sont les même pour les 13slot :/
-
sa te renveras seulement si il y a une arme dans le slot
-
En fait j'aimerai que si il a une arme on lui envoi Arme: Nomarme avec x munitions
-
Si tu veux savoir le nom de l'arme que le joueur à dans le main, tu fais un GetPlayerWeapon et tu convertis l'ID retourné par cette fonction en nom. Ensuite, si l'ID est différent de -1, tu fais un GetPlayerAmmo pour connaître le nombre de munition (si le nombre de munitions est -1 c'est que l'arme en question n'a pas de munition).
Pour convertir l'ID de l'arme en nom, tu t'aides du lien que je t'ai donné dans ma première réponse.
Sinon, tu parcours le tableau Arme après l'avoir rempli et chaque fois que Arme[ i ][0] != -1, tu convertis en nom et tu utilise Arme[ i ][1] pour avoir le nombre de munitions.
Je te conseille la deuxième solution car il semblerait que GetPlayerAmmunition ne fonctionne pas selon le Wiki SAMP mais je n'ai pas testé cette fonction.
++
Syg
-
Sinon, tu parcours le tableau Arme après l'avoir rempli et chaque fois que Arme[ i ][0] != -1, tu convertis en nom et tu utilise Arme[ i ][1] pour avoir le nombre de munitions.
Pas compris :D
-
"Parcourir un tableau" veut dire "tester chacun de ses éléments".
"Remplir un tableau" veut dire "affecter une valeur à chacun de ses éléments".
"Convertir en nom" veut dire "transformer un chiffre (l'ID de l'arme) en mot (le nom de l'arme)"
"Utiliser un élément du tableau" veut dire "se servir de sa valeur".
Comme tu risques de me dire que tu ne comprend pas mieux, je vais te donner un petit bout de code (que je ne vais pas tester).
A toi de le compléter.
Tout d'abord, une ébauche d'un fonction qui converti un ID d'arme en nom d'arme :
strcpy (Dest[], Source[])
{
new i=0;
while ((Dest[i]=Source[i])) i++;
}
DonnerNomArme (IDArme, NomArme[])
{
switch (IDArme)
{
case 0:
{
strcpy (NomArme, "Non armé");
}
case 1:
{
strcpy (NomArme, "Poing américain");
}
case 2:
{
strcpy (NomArme, "Club de golf");
}
/* A TOI DE COMPLETER */
default:
{
strcpy (NomArme, "Aucune arme");
}
}
}
Ensuite, une petite boucle qui affiche le nom de toutes les armes d'un joueur (avec le nombre de munition associé le cas échéant)
new i;
new Arme;
new Munitions;
new NomArme[128];
/* Boucle sur les slots du joueur */
for (i=0 ; i<12 ; i++)
{
GetPlayerWeaponData (playerid, i, Armes, Munitions);
/* Si il y a une arme dans ce slot */
if (Arme != -1)
{
/* On récupère le nom de l'arme */
DonnerNomArme (Arme, NomArme);
/* Si il y a des munitions pour cette arme */
if (Munitions != -1)
{
printf ("Slot %d : %s avec %d munition(s)", i, NomArme, Munitions);
}
else
{
printf ("Slot %d : %s", i, NomArme);
}
}
NB : Tu peux remplacer les printf par des format suivis de SendClientMessage
PS : Je vous laisse admirer ma fonction strcpy (ou comment rendre presque incompréhensible quelque chose de très simple).
++
Syg
-
PS : Je vous laisse admirer ma fonction strcpy (ou comment rendre presque incompréhensible quelque chose de très simple).
++
Syg
Bien se que je me disait tu est tordu ! ^^ Grand merci j'essayerai demain
-
Salut,
PS : Je vous laisse admirer ma fonction strcpy (ou comment rendre presque incompréhensible quelque chose de très simple).
je la fait pratiquement de la même façon :P
on peut aussi l'écrire de plein d'autres façons, celle de Syg étant la plus simple,
je préfère néanmoins celle ci:
strcpy(Dest[], Source[])
{
new i = 0;
while((Dest[i] = Source[i]))
{
i++;
}
Dest[i] = '\0';//on marque la fin du string pour être certain
return 1;
}
++Sim++
-
Moi comme cella
strcpy (&Dest[],Source[])
{
format(Dest,sizeof(Dest),"%s",Source);
}
^^ encore moi compliquez lol
-
Sim : Ta fonction est exactement identique à celle que j'ai donné sauf que tu as ajouté plein de trucs qui ne servent à rien (les accolades, le forçage du 0 en fin de chaîne et le return 1). D'ailleurs, si tu enlèves tout ça, tu retombes sur la fonction de mon post précédent.
NB : En terme de rapidité, ta fonction fait deux instructions supplémentaires (affectation du 0 de fin de chaîne et return 1;) donc elle est forcément moins rapide.
Sazuke : Ta fonction est certainement moins rapide qu'un while qui n'a pas à décortiquer une chaîne de format. De plus, ce qui est gênant dans format, c'est le sizeof (Dest) qui dépend de la déclaration de la chaîne et qui n'est pas connu dans la fonction (ceci provoque un warning du compilo).
Le "%s" est ici inutile car la chaîne source peut tout à fait servir de format.
Voici une version peut-être moins rapide, en tous cas plus jolie :
strcpy (Dest[],Source[])
{
format (Dest, strlen(Dest)+1, Source);
}
NB : Le & devant Dest n'est pas nécessaire ici car on a affaire à des tableaux qui sont toujours passés en paramètre en tant que pointeurs. D'ailleurs, en PAWN, ceci provoque une erreur
Sinon, on peut aussi utiliser memcpy (mais ce n'est pas la version la plus optimisée) :
strcpy (Dest[],Source[])
{
memcpy (Dest, strlen(Dest)+1, Source);
}
NB : Pour les considérations de vitesse, tout ceci reste abstrait sur des machines aussi puissantes que les PC actuels, la différence de temps d'exécution entre ces fonctions est infime.
++
Syg
-
Je n'y arrive toujours pas :/ j'ai chercher et chercher masi ça ne marche pas:/
-
Salut,
pour l'affectation du 0...je n'avais pas pensé que le source est en fait copier dans la chaine destination puis testé ce qui entraine l'affectation du 0 puisque la source devrait le comprendre...
par contre, je trouve qu'il est pratique de placer un return à la fin de la fonction afin de pouvoir faire un test si la fonction s'est bien exécutée ou non...même si les risque d'erreurs graves sont très minces
mais en ce qui concerne le problème de scott1 (pour revenir au sujet original), ce serait bien de nous informer de la partie que tu n'arrive pas à faire. La fonction indiquée par Syg te permettant de donner le nom désirée à une arme fonctionne?
si c'est plutôt en ce qui concerne d'envoyer le message avec l'arme ou non, le dernier code de Syg (dans son super méga génial post du 9 novembre) devrait te permettre de comprendre comment y parvenir
++Sim++
-
si c'est plutôt en ce qui concerne d'envoyer le message avec l'arme ou non, le dernier code de Syg (dans son super méga génial post du 9 novembre) devrait te permettre de comprendre comment y parvenir
++Sim++
J'ai essayer mais je n'y arrive pas :s
-
donc cherche la commande dans le forum samp elle y est :)
-
J'ai reussi merci.
Autre question, voici mon code
for(i = 1;i <= 12;i++)
{
GetPlayerWeaponData(giveplayerid,i,Player_Weapons[i],Player_Ammos[i]);
if(Player_Weapons[i] != 0)
{
new weaponName[256];
GetWeaponName(Player_Weapons[i],weaponName,255);
format(string, sizeof(string), "Arme: %s avec %d munitions",weaponName,Player_Ammos[i]);
SendClientMessage(playerid, COLOR_GREY, string);
}
}
Comment faire pour que si il n'y a aucune arme on me dise "Arme: Aucune"
Car quand je fait
for(i = 1;i <= 12;i++)
{
GetPlayerWeaponData(giveplayerid,i,Player_Weapons[i],Player_Ammos[i]);
if(Player_Weapons[i] != 0)
{
new weaponName[256];
GetWeaponName(Player_Weapons[i],weaponName,255);
format(string, sizeof(string), "Arme: %s avec %d munitions",weaponName,Player_Ammos[i]);
SendClientMessage(playerid, COLOR_GREY, string);
}
else
SendClientMessage(playerid, COLOR_GREY, "Arme: Aucune");
}
}
Il m'envoi 12fois arme aucune.
Merci
-
Hmm, il faut que tu mette le else juste en dessous de ta callback déjà. ^^
-
Hmm, il faut que tu mette le else juste en dessous de ta callback déjà. ^^
T'inquiette ils sont alligné sur le gm, mais avec le fofo sa beug
-
Salut,
ce que tu peut faire c,est une variable qui indique le nombre d'arme du joueur, il te suffit d'augmenter la valeur de la variable de 1 à chaque fois que tu trouve une arme
Par la suite, après la loop, si la variable n'a pas changé de valeur, c'est que le joueur n'a aucune arme
++Sim++
-
Salut,
ce que tu peut faire c,est une variable qui indique le nombre d'arme du joueur, il te suffit d'augmenter la valeur de la variable de 1 à chaque fois que tu trouve une arme
Par la suite, après la loop, si la variable n'a pas changé de valeur, c'est que le joueur n'a aucune arme
++Sim++
Et pour les noob comme moi ça veux dire?
-
Salut,
....
ça veut dire un truc du genre:
on crée une petite variable;
for(une boucle sur toutes les armes)
{
récupérer l'arme du joueur
si (le joueur a une arme dans cet emplacement)
{
tu lui envoie ton message
tu ajoute 1 à la variable créé au début
}
}
allez, amuse toi ;)
++Sim++
-
Du style:
new armes;
for(i = 1;i <= 12;i++)
{
GetPlayerWeaponData(giveplayerid,i,Player_Weapons[i],Player_Ammos[i]);
if(Player_Weapons[i] != 0)
{
new weaponName[256];
GetWeaponName(Player_Weapons[i],weaponName,255);
format(string, sizeof(string), "Arme: %s avec %d munitions",weaponName,Player_Ammos[i]);
SendClientMessage(playerid, COLOR_GREY, string);
armes ++;
}
}
if(armes == 0)
{
SendClientMessage(playerid, COLOR_GREY, "Arme: Aucune");
}