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

Titre: CMD /fouiller
Posté 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
Titre: Re : CMD /fouiller
Posté par: ghm94 le 06 Novembre 2009, 23:40:28
Sa vient du GetPlayerWeaponData car toutes les armes que tu vérifie ne viennent pas forcement du slot n°1.
Titre: Re : CMD /fouiller
Posté par: scott1 le 07 Novembre 2009, 16:17:09
mais si j'ai une arme elle est automatiquement dans le slot 1 si je l'est pas en main?
Titre: Re : CMD /fouiller
Posté par: S!m le 07 Novembre 2009, 16:47:21
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++
Titre: Re : CMD /fouiller
Posté par: scott1 le 07 Novembre 2009, 18:31:37
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.
Titre: Re : CMD /fouiller
Posté par: Syg le 07 Novembre 2009, 23:24:20
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
Titre: Re : CMD /fouiller
Posté par: scott1 le 08 Novembre 2009, 12:35:42
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 :/
Titre: Re : CMD /fouiller
Posté par: cristab le 08 Novembre 2009, 13:28:51
sa te renveras seulement si il y a une arme dans le slot
Titre: Re : CMD /fouiller
Posté par: scott1 le 08 Novembre 2009, 14:06:58
En fait j'aimerai que si il a une arme on lui envoi Arme: Nomarme avec x munitions
Titre: Re : CMD /fouiller
Posté par: Syg le 09 Novembre 2009, 09:43:51
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
Titre: Re : Re : CMD /fouiller
Posté par: scott1 le 09 Novembre 2009, 16:57:27

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
Titre: Re : CMD /fouiller
Posté par: Syg le 09 Novembre 2009, 22:21:25
"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
Titre: Re : Re : CMD /fouiller
Posté par: scott1 le 09 Novembre 2009, 22:29:35


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
Titre: Re : Re : CMD /fouiller
Posté par: S!m le 10 Novembre 2009, 03:06:33
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++
Titre: Re : CMD /fouiller
Posté par: Ssk le 10 Novembre 2009, 07:55:22
Moi comme cella

strcpy (&Dest[],Source[])
{
format(Dest,sizeof(Dest),"%s",Source);
}

^^ encore moi compliquez lol
Titre: Re : CMD /fouiller
Posté par: Syg le 10 Novembre 2009, 11:08:50
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
Titre: Re : CMD /fouiller
Posté par: scott1 le 17 Novembre 2009, 18:35:08
Je n'y arrive toujours pas :/ j'ai chercher et chercher masi ça ne marche pas:/

Titre: Re : CMD /fouiller
Posté par: S!m le 18 Novembre 2009, 00:33:44
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++
Titre: Re : Re : CMD /fouiller
Posté par: scott1 le 18 Novembre 2009, 16:24:18
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
Titre: Re : CMD /fouiller
Posté par: cristab le 18 Novembre 2009, 18:37:11
donc cherche la commande dans le forum samp elle y est :)
Titre: Re : CMD /fouiller
Posté par: scott1 le 19 Novembre 2009, 19:10:04
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
Titre: Re : CMD /fouiller
Posté par: sizeof(Raw); le 19 Novembre 2009, 19:15:25
Hmm, il faut que tu mette le else juste en dessous de ta callback déjà. ^^
Titre: Re : Re : CMD /fouiller
Posté par: scott1 le 19 Novembre 2009, 20:41:36
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
Titre: Re : CMD /fouiller
Posté par: S!m le 19 Novembre 2009, 23:10:45
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++
Titre: Re : Re : CMD /fouiller
Posté par: scott1 le 20 Novembre 2009, 11:31:05
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?
Titre: Re : CMD /fouiller
Posté par: S!m le 20 Novembre 2009, 15:25:00
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++
Titre: Re : CMD /fouiller
Posté par: scott1 le 20 Novembre 2009, 16:32:32
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");
}