• 06 Juillet 2025, 17:42:14


Auteur Sujet: Commande stopée  (Lu 4122 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Commande stopée
« Réponse #15 le: 12 Mai 2008, 23:43:34 »
La solution de -Alexandre est la bonne, c'est juste qu'il a oublié quelques morceaux.

Quand un joueur se connecte :
   Tu mets HaveNrg[playerid] à false (Le joueur n'a pas encore créé de moto)

Quand joueur crée une moto :
   Si HaveNrg[playerid] est ègal à true (ce qui veut dire que le joueur à précédement créé une moto)
      Tu détruits son ancienne moto -> DestroyVehicle (nrg[playerid]);
   FinSi
   Ensuite, tu mets HaveNrg[playerid] à true (même si c'est déjà fait)
   Puis nrg[playerid] = CreateVehicle(522, x, y, z, a, -1, -1, 600);

Quand un joueur se déconnecte :
   Si HaveNrg[playerid] est ègal à true (ce qui veut dire que le joueur à précédement créé une moto)
      Tu détruits son ancienne moto -> DestroyVehicle (nrg[playerid]);
   FinSi

Avec ça, le joueur qui créé une nouvelle moto verra son ancienne disparaître. Ainsi, chaque joueur ne pourra avoir qu'un seule moto max à un instant donné.

++
Syg
Courtesy of GtaManiac

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #16 le: 13 Mai 2008, 19:10:54 »
Donc ca devrait donner ca:

forward HaveNrg[playerid]

OnePlayerconected(...)
{
HaveNrg[playerid] = 0
}

If .... /nrg
{
if(HaveNrg[playerid] == 1)
{
DestroyVehicle (nrg[playerid])
}
else if(HaveNrg[playerid] == 0)
{
nrg[playerid] = CreateVehicle(522, x, y, z, a, -1, -1, 600);
(HaveNrg[playerid] == 0);
return 1;
}

Jai pas tester mais est ce que cest ca ??

++
nikko

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Commande stopée
« Réponse #17 le: 13 Mai 2008, 19:20:59 »
Test :D

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #18 le: 13 Mai 2008, 19:22:26 »
Ouai mais je pourrai pas test av un ptit bout de temps pcq ma mere a locker mon ordi mais jme suis conecter sur la session admin (elle y capte tien .. ^^)

++
nikko

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Commande stopée
« Réponse #19 le: 13 Mai 2008, 19:35:24 »
Re,

non ce n'est pas ça, enlève ta condition else if car sinon ça ne fera que supprimer le véhicule s'il existe, ou bien le supprimer si ça n'existe pas.

Hors là on veut que SI le joueur à un véhicule et qu'il en veut un autre (la première condition) on détruit son véhicule.
Et, hors condition, on lui en donne un et on met à true HaveNrg|playerid] :)

++
Alexandre

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #20 le: 13 Mai 2008, 19:41:13 »
Donc ca doit donner ca:

If .... /nrg
{
if(HaveNrg[playerid] == 1)
{
DestroyVehicle (nrg[playerid])
nrg[playerid] = CreateVehicle(522, x, y, z, a, -1, -1, 600);
(HaveNrg[playerid] == 1)
}
if(HaveNrg[playerid] == 0)
{
nrg[playerid] = CreateVehicle(522, x, y, z, a, -1, -1, 600);
(HaveNrg[playerid] == 1);
return 1;
}

Cest bien ca??

++
nikko

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Commande stopée
« Réponse #21 le: 13 Mai 2008, 19:42:31 »
Wép, sauf le return que tu doit mettre après l'accolade. ;)

++
Alexandre

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #22 le: 13 Mai 2008, 19:44:17 »
Ah ouai jai pas fait gafe, sinon le code est bon ..  :)
Merci a vous

++
nikko

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Commande stopée
« Réponse #23 le: 15 Mai 2008, 15:46:51 »
Oui, c'est bien mais quand dans un if et dans le else tu as le même bout de code, c'est mieux de le sortir, ça allège le code et c'est plus facile d'y faire des corrections  :
If .... /nrg
{
   if(HaveNrg[playerid] == 1)
   {
      DestroyVehicle (nrg[playerid])
   }
   nrg[playerid] = CreateVehicle(522, x, y, z, a, -1, -1, 600);
   HaveNrg[playerid] = 1;
// J'ai corrigé cette ligne aussi, celle d'avant ne faisait rien
   return 1;
}


En gras : la partie commune qui ne doit apparaitre qu'un seule fois.

Sinon, tu avais écrit :
forward HaveNrg[playerid];
C'est faux, il faut mettre en haut de ton code :
new HaveNrg[MAX_PLAYERS];

++
Syg
Courtesy of GtaManiac

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #24 le: 15 Mai 2008, 16:33:52 »
Ok ok merci ;)
Mais jai jamais compris pk on méttait soit forward, soit new, soit un [MAX_PLAYER] ... Ca veu dire quoi d'ailleur quand on met Max_player ??

++
nikko
« Modifié: 15 Mai 2008, 16:37:00 par nikko12 »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Commande stopée
« Réponse #25 le: 15 Mai 2008, 16:57:20 »
Bon, petit cours :

Le mot clé new permet de déclarer une variable ( = réserver une place en mémoire pour y stocker une valeur).
Ce mot clé est utilisé pour TOUTES les déclarations de variables.

Le mot clé forward permet de déclarer une fonction définie comme public (utilisable à l'extérieur du script par l'interpréteur PAWN) ou renvoyant un valeur complexe (un tableau ou un float par exemple).
Ce mot clé est utilisé exclusivement devant les callback (OnPlayerSpawn, OnVehicleDeath ...), les fonctions des timers et les fonctions qui renvoient autre chose qu'une valeur simple (définies avec le mot clé stock).

Les crochets [] derrière une variable servent à indiquer que cette variable est un tableau. Le nombre entre les crochets indique le nombre d'éléments contenu dans le tableau. Ce nombre est soit un nombre "en dur" (17, 255, 1392, ...) soit une constante définie par un #define (comme MAX_PLAYERS par exemple).
En aucun cas on peut mettre une variable entre les crochets.
Il est a noté que le premier élément d'un tableau en PAWN (comme en C/C++) porte le numéro 0.
Ainsi :
new MonTableau[12] contient 12 éléments.
Les éléments sont :
MonTableau[0], MonTableau[1], ... jusqu'à MonTableau[11]

++
Syg
Courtesy of GtaManiac

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #26 le: 15 Mai 2008, 17:06:18 »
Ok ok merci syg pour ton ptit cour  ;)

++
nikko

Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Re : Commande stopée
« Réponse #27 le: 15 Mai 2008, 19:36:22 »
Syg j'aurait besoin d'être éclairé sur un point. :happy

Ce mot clé est utilisé exclusivement devant les callback (OnPlayerSpawn, OnVehicleDeath ...), les fonctions des timers et les fonctions qui renvoient autre chose qu'une valeur simple (définies avec le mot clé stock).

Qu'est-ce qu'un stock ?

Et sinon, quelle est la différence entre static et new ?

Si tu pourrait me dire ça se serait super. :happy


Sinon:
En aucun cas on peut mettre une variable entre les crochets.

Excepté si l'on utilise enum non ?

Code: (pawn) [Sélectionner]
enum pSpec
{
Float:sPx,
Float:sPy,
Float:sPz,
sPint,
sLocal,
sCam,
};

new Unspec[MAX_PLAYERS][pSpec];
(extrait de PEN1LS)

++
Alexandre

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Commande stopper
« Réponse #28 le: 16 Mai 2008, 01:59:51 »
En fait, les fonctions déclarées avec stock n'ont pas besoin de forward autant pour moi.

Le mot clé stock permet de créer des fonctions qui renvoie autre chose qu'un nombre entier.
Exemple:
stock DonnerNomJoueur (playerid)
{
   new Nom Joueur[40];
   GetPlayerName (players, Name, 40);
   return Name; // Renvoie une chaîne de caractères
}
ou
stock Float:DonnerValeur ()
{
return 12.5; // Renvoie un nombre décimal
}
Si la fonction est définie après son appel dans le script, il faut la déclarer en amont avant de pouvoir l'appeler (de toutes façons, si le compilateur n'est pas content il mettra un warning).
La déclaration de la deuxième fonction (à mettre en tête de script par exemple) est :
Float:DonnerValeur ();
Pour ce qui est du mot clé static, il permet de conserver la valeur d'une variable à l'intérieur d'une fonction entre deux appels.
Exemple :
Compteur ()
{
static i=0;

i++;
return i;
}
Au premier appel de cette fonction, elle renverra la valeur 1. A l'appel suivant 2, puis 3, etc.
Si on met new à la place de static, la fonction renverra toujours 1.

Le mot clé enum sert, comme sont nom l'indique presque, à définir une énumération, c'est à dire une suite de constantes.
Si on reprend ton exemple, pSpec n'est pas une variable mais une constante. Il n'est pas possible de lui affecter une valeur.
Si on fait pSpec = 23;, le compilateur sortira une erreur.
Pour schématiser, pSpec est un constante égale au nombre de membres qu'il y a dans l'enum (6 dans ton exemple). Et chaque membre de l'enum à une valeur allant de 0 à 5 (dans l'ordre de leurs déclarations).
En PAWN, ce genre d'enum permet d'émuler les structures de données si pratiques dans les autres langages (notamment C/C++) et qui n'existent pas en PAWN.
Ton exemple crée un tableau à deux entrées [MAX_PLAYERS] et [pSpec] soit [200][6].
On accède aux éléments du tableau en utilisant les membres de l'enum.
Ainsi Unspec[12][sPint] sera en fait Unspec[12][3] mais sPint est plus parlant que 3 (bien que  :))

L'avantage c'est qu'avec un(une) enum, on peut mixer les types de données dans un tableau (c'est le cas dans ton exemple où cohabitent des Float et des entiers). Ceci n'est pas possible autrement.

++
Syg

Courtesy of GtaManiac

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Commande stopée
« Réponse #29 le: 16 Mai 2008, 09:25:24 »
Ok ok merci syg ca m'explique des trucs ...  ;)

++
nikko