• 15 Mai 2024, 20:43:34


Auteur Sujet: [Résolu] Définir la vie de certains véhicules  (Lu 2384 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Ouzdi Broono

  • Fondateur de World War 3
  • *
  • Criminel
  • Fan de jeux vidéos et du web !
  • Messages: 36
    • Voir le profil
    • World War 3
[Résolu] Définir la vie de certains véhicules
« le: 31 Juillet 2013, 13:56:23 »
Bonjour à tous, je débute dans l'utilisation des opérateurs for et while, je ne sais donc pas trop comment m'y prendre.
J'essais de définir les points de vie de certains véhicules.
Voila ce que j'ai fais:
public VehiculesBlindees(carid, playerid)
{
for (new i=1;i<2000;i++)
{
new IsOk;
while(IsOk == 0)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid) == 422){SetVehicleHealth(carid, 1500.0); return 1;} // Bobcat
else if(GetVehicleModel(vehicleid) == 470){SetVehicleHealth(carid, 3000.0); return 1;} // Patriot
else if(GetVehicleModel(vehicleid) == 528){SetVehicleHealth(carid, 6000.0); return 1;} // FBItruck
else if(GetVehicleModel(vehicleid) == 433){SetVehicleHealth(carid, 3000.0); return 1;} // Barrack
///// Air Force ////
else if(GetVehicleModel(vehicleid) == 548){SetVehicleHealth(carid, 6000.0); return 1;} // Cargobob
else if(GetVehicleModel(vehicleid) == 425){SetVehicleHealth(carid, 1500.0); return 1;} // Hunter
else if(GetVehicleModel(vehicleid) == 520){SetVehicleHealth(carid, 1500.0); return 1;} // Hydra
///// Compagnie blindée /////
else if(GetVehicleModel(vehicleid) == 432){SetVehicleHealth(carid, 10000.0); return 1;} // Tank
return 1;
}
}
return 1;
}
Ou:
public VehiculesBlindees(carid, playerid)
{
for (new i=1;i<2000;i++)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid) == 422){SetVehicleHealth(carid, 1500.0); return 1;} // Bobcat
else if(GetVehicleModel(vehicleid) == 470){SetVehicleHealth(carid, 3000.0); return 1;} // Patriot
else if(GetVehicleModel(vehicleid) == 528){SetVehicleHealth(carid, 6000.0); return 1;} // FBItruck
else if(GetVehicleModel(vehicleid) == 433){SetVehicleHealth(carid, 3000.0); return 1;} // Barrack
///// Air Force ////
else if(GetVehicleModel(vehicleid) == 548){SetVehicleHealth(carid, 6000.0); return 1;} // Cargobob
else if(GetVehicleModel(vehicleid) == 425){SetVehicleHealth(carid, 1500.0); return 1;} // Hunter
else if(GetVehicleModel(vehicleid) == 520){SetVehicleHealth(carid, 1500.0); return 1;} // Hydra
///// Compagnie blindée /////
else if(GetVehicleModel(vehicleid) == 432){SetVehicleHealth(carid, 10000.0); return 1;} // Tank
return 1;
}
return 1;
}
Ça n'a aucun effet alors que quand je fais ça:
public VehiculesBlindees(carid, playerid)
{
for (new i=1;i<2000;i++) SetVehicleHealth(carid, 1500.0);
return 1;
}
Ça définit les points de vie de tous les véhicules.
Je vous remercie de votre aide.
« Modifié: 31 Juillet 2013, 20:30:56 par Ouzdi Broono »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Définir la vie de certains véhicules
« Réponse #1 le: 31 Juillet 2013, 14:38:48 »
Dans le premier exemple de code que tu donnes, le while n'a aucune utilité. D'ailleurs, si le reste du code était juste, tu ne sortirais jamais de cette fonction.

Le deuxième exemple de code est ce qui se rapproche le plus de ce que tu veux faire mais vire-moi tous ces return 1; qui te font sortir de la fonction dès le premier véhicule.
De plus, dans ton cas, il n'y a pas besoin de faire de return.

Ensuite, pour que ce soit plus efficace (et plus joli), tu pourras remplacer les if/else if à l'intérieur de ta boucle for par un switch/case.

++
Syg
Courtesy of GtaManiac

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Définir la vie de certains véhicules
« Réponse #2 le: 31 Juillet 2013, 14:44:10 »
Salut,
Remplace tes (GetVehicleModel(vehicleid) == 520){SetVehicleHealth(carid, 1500.0) par (GetVehicleModel(i) == 520){SetVehicleHealth(carid, 1500.0)

Ici, i = vehicleid, sauf que i vaut 0 puis 1 puis 2... jusqu'à 2000.

D'ailleurs, il y a peut-être un moyen pour faire en sorte d'éviter des boucles inutiles, comme redéfinir la constante MAX_VEHICLES.

Code: (pawn) [Sélectionner]
// En haut du script
#undef MAX_VEHICLES
#define MAX_VEHICLES 1000

Et tu remplaces i<2000 par i<MAX_VEHICLES quand tu crées ta boucle, si ton serveur utilise 1000 véhicules tu gagneras pas mal de temps.

Et enfin, les id de véhicules commencent sûrement à 0 et pas à 1, donc n'initialise pas i à 1 mais plutôt à 0 dans ta boucle, sinon le 1er véhicule risque d'être oublié.

Allez au boulot  :biggrin:

EDIT : Même erreur dans ta 2e fonction, au lieu de :
public VehiculesBlindees(carid, playerid)
{
for (new i=1;i<2000;i++) SetVehicleHealth(carid, 1500.0);
return 1;
}

J'aurais plutôt fait ça quand le joueur entre dans le véhicule et/ou dans un timer, là tu redonnes de la vie à tous tes véhicules alors que le joueur ne peut être que dans un seul à la fois, ton serveur va lagger :p
(Sachant qu'à l'arrêt, les véhicules ne peuvent pas être détruits... du moins jusqu'à la 0.3d, après je sais pas ^^)

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Définir la vie de certains véhicules
« Réponse #3 le: 31 Juillet 2013, 14:54:06 »
J'ai répondu rapidement mais tous ces return 1; m'ont fait mal aux yeux.

En y regardant de plus près, après la réponse de Gilux, ce que tu veux faire n'est pas très clair.

Tu nous montres une fonction avec comme paramètre un identifiant de véhicule (carid) et un identifiant de joueur (playerid) ce qui laisse penser que ta fonction va s'occuper d'un seul véhicule pour un seul joueur. Donc il n'y a pas besoin de boucle dans cette fonction, il suffit juste de tester que le véhicule du joueur est d'un certain type et de lui mettre les points de santé en conséquence.
Ou alors, ces paramètres sont un reste d'un copier/coller et n'ont rien à faire ici. Dans ce cas, la solution de Gilux est la bonne.

Essaie de nous expliquer ce que doit faire cette fonction (VehiculesBlindees) et quand elle est appelée.

++
Syg
Courtesy of GtaManiac

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Définir la vie de certains véhicules
« Réponse #4 le: 31 Juillet 2013, 14:55:32 »
D'ailleurs la majorité des véhicules ne supporteront pas un crash ou une roquette  :tongue:

Hors ligne Ouzdi Broono

  • Fondateur de World War 3
  • *
  • Criminel
  • Fan de jeux vidéos et du web !
  • Messages: 36
    • Voir le profil
    • World War 3
Re : Définir la vie de certains véhicules
« Réponse #5 le: 31 Juillet 2013, 15:01:00 »
Oui il reste des bouts de copier/coller car pour tester la fonction SetVehicleHealth j'avais d'abord tester de l'utiliser dans OnPlayerStateChange, quand le joueur monte dans un véhicule.
Mais j'ai remarqué qu'à chaque fois que le joueur remonte dedans les points de vie du véhicule se régénère ce qui est très embêtant.
Donc la j'ai fais une commande /vieveh avec un timer qui se déclenche au bout d'une seconde qui s'appel VehiculesBlindees.
Donc la boucle se situe dans ce timer.
J'ai du utiliser un timer car je ne peux pas utiliser les fonctions dans directement à l'initialisation du gamemode, (dans OnGameModeInit) vus qu'on ne peux pas mettre de paramètres entre les deux parenthèses.
Dites moi si vous avez compris, merci encore.

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Définir la vie de certains véhicules
« Réponse #6 le: 31 Juillet 2013, 15:10:08 »
Si c'est dans un timer, teste plutôt les id de joueurs (même remarque, il y a MAX_PLAYERS si t'as pas 500 slots), après t'as GetPlayerVehicleId et IsPlayerInAnyVehicle qui te serviront, comme ça tu ne répares que les véhicules occupés, c'est suffisant si ton timer tourne toutes les 2/3 secondes.

En gros ça doit donner un truc dans le genre :

Code: (pawn) [Sélectionner]
public ReparerVehicules()
{
     for(new i; i < MAX_PLAYERS; i++)
     {
          if(IsPlayerInAnyVehicle(i)) // i = playerid 0, 1, 2...
          {
                SetVehicleHealth(GetPlayerVehicleId(i),1000);
          }
      }
}



Hors ligne Ouzdi Broono

  • Fondateur de World War 3
  • *
  • Criminel
  • Fan de jeux vidéos et du web !
  • Messages: 36
    • Voir le profil
    • World War 3
Re : Définir la vie de certains véhicules
« Réponse #7 le: 31 Juillet 2013, 15:26:36 »
J'ai viré le timer en fait il sert plus à rien.
J'ai essayé de remplacer les if/else if par switch/case comme me la suggéré Syg et j'ai redéfinis MAX_VEHICULES à 500 comme tu me l'as suggéré Gilux.
Voila ce que j'ai fais:
Code: (pawn) [Sélectionner]
if(strcmp(cmd, "/vieveh", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(PlayerInfo[playerid][pAdmin] == 2)
{
for (new i=0;i<MAX_VEHICULES;i++)
{
new vehicleid = GetPlayerVehicleID(playerid);
new test;
switch(test == 0)
{
case 0: // Bobcat
{
if(GetVehicleModel(vehicleid) == 422)
{
    SendClientMessage(playerid, COLOR_SAY, "Les points de vie des véhicules blindés ont été modifié.");
SetVehicleHealth(i, 1500.0);
}
}
case 1: // Patriot
{
if(GetVehicleModel(vehicleid) == 470)
{
SetVehicleHealth(i, 3000.0);
}
}
}
}
}
else
{
SendClientMessage(playerid, COLOR_SAY, "Vous n'êtes pas autorisé à utiliser cette commande.");
return 1;
}
}
return 1;
}
Par contre je ne vois pas du tous comment faire pour qu'une case contient une condition comme "GetVehicleModel(vehicleid) == 422)" par exemple.
J'ai mis que deux type de véhicules pour une meilleure lisibilités et je pense que c'est suffisant pour faire les tests.
Dites moi si je suis dans la bonne direction s'il vous plait et expliquez moi pour les cases.
Je vous remercie. :bye:
« Modifié: 31 Juillet 2013, 15:38:01 par Ouzdi Broono »

Hors ligne Ouzdi Broono

  • Fondateur de World War 3
  • *
  • Criminel
  • Fan de jeux vidéos et du web !
  • Messages: 36
    • Voir le profil
    • World War 3
Re : Définir la vie de certains véhicules
« Réponse #8 le: 31 Juillet 2013, 20:30:37 »
J'ai opté pour une solution un peu plus simple que celle que j'envisagé.
Quand je tape la commande /blindage ça augmente la vie du véhicule dans le quel on se trouve.
Cette commande est autorisé qu'aux ingénieurs sur mon serveur et j'ai fais en sorte qu'ils peuvent l'utiliser qu'une seule fois toutes les 5 minutes pour éviter les abus de réparations.
Je vous remercie beaucoup pour votre aide, à très bientôt ! :bye:

Sujet résolu.

Hors ligne Xolokos

  • PAWN/XHTML/CSS/PHP/SQL/JS
  • *
  • Grand Banditisme
  • What are you waiting for ?
  • Messages: 681
    • Voir le profil
Re : [Résolu] Définir la vie de certains véhicules
« Réponse #9 le: 02 Août 2013, 17:31:55 »
Code: (PAWN) [Sélectionner]
forward BLINDAGE();
public BLINDAGE()
{
  for(new V = 0; V < MAX_VEHICLES; V++)
  {
    SetVehicleToRespawn(V); // Tu respawn le véhicule.
    switch(GetVehicleModel(V))
    {
        case ID: return SetVehicleHealth(V, /*LA VIE 1000 c'est fulllife.*/); // Pour un model de véhicule.
        case ID..IDI: return SetVehicleHealth(V, VIE); // Pour une plage de model de véhicule de ID a IDI.
        default: return SetVehicleHealth(V, 1000.0); // Si aucune ID ne corresponde au véhicule. Par défaut.
    }
  }
   return 1;
}

public OnGameModeInit()
{
   //Tout ton code ici les spawn de vehicule etc.
   BLINDAGE();
}

Et quand le véhicule respawn tu lui remet bien-sûre...
(J'ai fais le code vite fait la donc si il bug... )
Nippah !

Hors ligne Ouzdi Broono

  • Fondateur de World War 3
  • *
  • Criminel
  • Fan de jeux vidéos et du web !
  • Messages: 36
    • Voir le profil
    • World War 3
Re : [Résolu] Définir la vie de certains véhicules
« Réponse #10 le: 02 Août 2013, 18:00:09 »
Je vous poste mon code quand même.
Dites moi si rien ne cloche et si je peux l'optimiser, merci. :smile:

Code: (pawn) [Sélectionner]
// Commande version 2.0

if (strcmp("/blindage", cmdtext, true, 10) == 0)
{
if(IsPlayerConnected(playerid))
{
    if(PlayerInfo[playerid][pClasse] == 6)
    {
if(PlayerInfo[playerid][pBlindage] == 1)
{
if(IsPlayerInAnyVehicle(playerid))
{
for(new i = 0; i < MAX_VEHICLES; i++)
{
print("Début du blindage.");
new vehicleid = GetPlayerVehicleID(playerid);
// Infanterie
if(GetVehicleModel(vehicleid) == 470) // Patriot
{
SetVehicleHealth(vehicleid, 2000.0);
SendClientMessage(playerid, COLOR_SAY, "Blindage du patriot effectué.");
}
else if(GetVehicleModel(vehicleid) == 528) // FBIblindé
{
SetVehicleHealth(vehicleid, 3000.0);
SendClientMessage(playerid, COLOR_SAY, "Blindage du blindé léger effectué.");
}
else if(GetVehicleModel(vehicleid) == 433) // Barrack
{
SetVehicleHealth(vehicleid, 3000.0);
SendClientMessage(playerid, COLOR_SAY, "Blindage du barrack effectué.");
}
// Air Force
else if(GetVehicleModel(vehicleid) == 548) // Cargobob
{
SetVehicleHealth(vehicleid, 5000.0);
SendClientMessage(playerid, COLOR_SAY, "Blindage du cargobob effectué.");
}
else if(GetVehicleModel(vehicleid) == 425) // Hunter
{
SetVehicleHealth(vehicleid, 1500.0);
SendClientMessage(playerid, COLOR_SAY, "Blindage de l'hunter effectué.");
}
// Blindé
else if(GetVehicleModel(vehicleid) == 432) // Tank
{
SetVehicleHealth(vehicleid, 10000.0);
SendClientMessage(playerid, COLOR_SAY, "Blindage du chars effectué.");
}
PlayerInfo[playerid][pBlindage] = 0;
SetTimerEx("TimerAutorisationBlindage", 300000, false, "i");
print("Fin du blindage.");
return 1;
}
}
else
{
    SendClientMessage(playerid, COLOR_SAY, "Vous devez être dans un véhicule pour utiliser cette commande.");
    print("Tentative de blindage échoué.");
    return 1;
}
}
else
{
    SendClientMessage(playerid, COLOR_SAY, "Tu as déjà blindé un véhicule, tu ne peux pas en blinder un autre avant 5 minutes.");
    print("Tentative de blindage échoué.");
    return 1;
}
}
else
{
    SendClientMessage(playerid, COLOR_SAY, "Vous n'êtes pas autorisé à blinder un véhicule.");
return 1;
}
}
return 1;
}

En fait je crois que la boucle for n'a plus d’utilité ? Puisque la commande s'applique uniquement au véhicule dans le quel le joueur se trouve.

Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Résolu] Définir la vie de certains véhicules
« Réponse #11 le: 02 Août 2013, 18:04:10 »
Les if imbriqués les uns dans les autres pourraient être plus lisibles et rapides s'il n'y en avait qu'un seul (avec une condition à facteurs multiples). D'autant plus que tu ne sembles pas avoir besoin de vérifier la sortie en dehors de ces conditions.

Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : [Résolu] Définir la vie de certains véhicules
« Réponse #12 le: 02 Août 2013, 18:08:28 »
En effet Gzsume a raison, de plus que tu peux supprimer le OnPlayerConnect, car en général quelqu'un de non-connecté n'effectue pas de commande ;)

[/url]

Hors ligne Ouzdi Broono

  • Fondateur de World War 3
  • *
  • Criminel
  • Fan de jeux vidéos et du web !
  • Messages: 36
    • Voir le profil
    • World War 3
Re : [Résolu] Définir la vie de certains véhicules
« Réponse #13 le: 02 Août 2013, 18:10:15 »
A bon, comment savoir précisément quelle erreur est retourné (classe requise, être dans un véhicule, être connecté) si nous avons qu'une seule ligne de condition ?
Forcément nous aurons qu'un seul else...

Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : [Résolu] Définir la vie de certains véhicules
« Réponse #14 le: 02 Août 2013, 18:11:14 »
Si tu en as besoin, alors laisses ça comme ça. Mais si ce n'est pas utile, une seule condition suffit. C'est à toi de voir si c'est utile ou non.