• 24 Avril 2025, 04:50:58


Auteur Sujet: Timer Destruction de Véhicules Spawnés.  (Lu 1679 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Timer Destruction de Véhicules Spawnés.
« le: 08 Novembre 2008, 12:28:27 »
Bonjour, sur mon gamemode, j'utilise plusieurs commandes permettant de faire apparaitre des véhicules (elles utilisent un PutPlayerInVehicle).
Afin d'éviter de surcharger mon serveur, j'ai employé, pour toutes mes commandes :

- Des Array tout en haut du script : new carid; new TimerCarDestroy[MAX_VEHICLES];

-Dans toutes mes commandes : carid = CreateVehicle(...);

-Un timer lorsqu'un joueur descend d'un véhicule SPAWNE : TimerCarDestroy[carid] = SetTimerEx("CarDestroy", 20000, 0, "i", carid); qui appelle un callback executant un DestroyVehicle.

-Un KillTimer si le joueur remonte dans le véhicule.

-----------------------------------------------------------------------------
Avec tout ça, mon timer fonctionne si le joueur descend d'un vehicule spawné, il est detruit 20 secondes plus tard.

Les problèmes :
- Certaines fois, quand on spawn un véhicule avec une de mes commandes, il est detruit alors que le joueur est à l'intérieur (au bout de quelques secondes) et le bug se répète si on réessaye de faire apparaître le même véhicule (ou un autre je n'ai pas essayé).
- Si le véhicule est détruit avec le joueur à l'intérieur, il se respawn automatiquement (10/15 secondes) et si on le reprend à son endroit de respawn, le timer ne s'execute plus dessus (comme s'il n'était plus considéré comme un "carid") : Je voudrais qu'il ne se respawn pas s'il est détruit par une explosion mais qu'il se detruise (DestroyVehicle).

Voilà quelques bugs ou problèmes que je voudrais régler.

Merci d'avance pour votre aide !
Jens84
« Modifié: 08 Novembre 2008, 12:33:56 par Jens84 »
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #1 le: 08 Novembre 2008, 12:52:08 »
Utilise AddStatticVehiculeEx tout simplement ;)

http://wiki.sa-mp.com/wiki/AddStaticVehicleEx

++
nikko


Hors ligne angelrider

  • Scripteur
  • *
  • Bandit
  • Messages: 299
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #2 le: 08 Novembre 2008, 13:45:23 »
Oui c'est le mieux comme ça ton véhicule respawn au bout d'un temps désigné à la fin de la ligne de ton véhicule et en seconde voila.
Nouveau Site de Mods San Andreas:
http://lcdacreation.fr

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #3 le: 08 Novembre 2008, 14:39:31 »
Salut,

dans son cas, il veut créer des véhicules durant le gameplay,

je te recommande de simplement faire une commande pour les admins qui détruit tous les véhicules où aucun joueur ne se trouve, les timers ça fini par devenir très complexe, surtout si tu veux prévoir toutes les possibilités...

++Sim++





Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #4 le: 08 Novembre 2008, 16:22:21 »
Oui il s'agit de commandes durant le gameplay.
Ou alors, je peux faire un timer qui detruit tous les carid dans lequels il n'y a aucun joueur.
Mais le problème sera, comme je l'ai signalé dans un bug, si un véhicule (carid) est détruit avec un joueur a l'intérieur, il n'est plus considéré comme un carid (je ne sais pas pourquoi, mais le timer ne s'applique pas dessus : si on le reprend et si on en sort, il n'est pas détruit).
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #5 le: 09 Novembre 2008, 21:28:44 »
Salut,

le problème vient probablement de ta callback OnPlayerEnterVehicle ou OnPlayerStateChange....
poste un bout du code et on pourra voir, selon moi tu ne met pas une bonne valeur à la variable a un certains endroit....

++Sim++





Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #6 le: 11 Novembre 2008, 09:48:27 »
Ok je vais poster tout ce qui est en relation avec mon timer, mais plus tard car je n'ai pas mon gamemode sur cet ordi.
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #7 le: 12 Novembre 2008, 12:07:18 »
Je pense que ton problème vient du bug que j'avais présenti sur la fonction KillTimer. Il me semble que dans certains cas (quand on a beaucoup de timer), elle ne fonctionne pas et le timer n'est pas détruit.
Sur Lalu's Stunt, la première version du NoFall fonctionnait avec le principe des SetTimer/KillTimer. Au bout d'un moment, le joueur ne pouvait plus descendre de sa moto .... Je suis donc passé par un seul timer général et par l'utilisation de variables indiquant si oui ou non le joueur a la NoFall. Et ça marche beaucoup mieux.

Donc si possible, il vaut mieux regrouper tout les timers ponctuels dans un seul timer permanent et réduire le nombre de timer dans le gamemode.

++
Syg
Courtesy of GtaManiac

Hors ligne [StAfF]MaN

  • [StAfF] forever ^^
  • *
  • Gangster
  • [StAfF] un jour, [StAfF] toujours ^^ !!!
  • Messages: 1040
    • Voir le profil
    • SITE [StAfF]
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #8 le: 12 Novembre 2008, 14:25:39 »
Oula ça dois être chaud a faire quand même regrouper les timers, parce que quand on en a plus de 7 (mon cas) je ne vois pas comment on peut faire la différence sans rajouter des conditions partout !! Pas plus pratique que d'avoir 7 timers différents d'ailleurs :p
^v^v^v^v|
   StAfF  |                              IP: gtaunderground.No-Ip.org

^v^v^v^v|

Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #9 le: 12 Novembre 2008, 16:12:39 »
Ah oui en effet j'ai quelques bugs de timers qui ne se killent pas certaines fois, alors si la fonction KillTimer bug quand les timers sont nombreux, c'est compréhensible car j'en utilise pas mal...
Pourrais-tu nous expliquer en détail comment procéder pour un timer global même si j'ai ma petite idée (On lance un timer dans le OnGameModeInit, on définit un temps de répétition nous arrangeant, on créé une variable en array (ex : new NoFall[MAX_PLAYERS]=0;), et dans la callback du timer, on exécute une telle action si la variable est sur 0 ou sur 1  (ex : if(NF[playerid] == 1) ) et donc lorsqu'on veut "désactiver le timer", dans une commande on remet la variable à 0 ce qui annule l'action dans le timer (pour le NoFall, ça cesse de remettre le joueur sur son véhicule quand NoFall[playerid] == 0)
Serait-ce un truc du genre ?
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #10 le: 12 Novembre 2008, 17:27:12 »
Le problème du regroupement des timers est de deux ordres :
Tout d'abord, la durée des timers à regrouper n'est pas forcément la même ce qui oblige à changer l'un ou l'autre des timers (ou les deux).
Ensuite, on multiplie les traitements dans un seul timer (bien que de toutes façons, avec un ou deux timers, il y a la même somme de traitement à faire).

Sinon, la base d'un timer global est toujours la même :
public MonTimer ()
{
   for (new p=0 ; p<MAX_PLAYERS ; p++)
   {
      if (IsPlayerConnected (p))
      {
         /* Traitement pour le joueur p */
      }
   }
}

La partie /* Traitement pour le joueur p */ contient effectivement des tests sur des variables comme NoFall[p], ...

++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Timer Destruction de Véhicules Spawnés.
« Réponse #11 le: 13 Novembre 2008, 00:32:29 »
Salut,

sur mon gm, j'ai un timer comme ça de 1 seconde (plus facile pour les différentes durées)

pour les durées modifiables, tu crée un variable juste pour cela:

new TempNoFall = temps voulu;

puis dans le timer tu la réduit puis a 1 ou 0 , tu fais ton action et tu la remet à sa valeur initiale ( je recommande d'utiliser une constante (#define ......))

public MonTimer ()
{
   if(TempsNoFall != 0)TempsNoFall--;
   else{
      TempNoFall=tempvoulu;
      for (new p=0 ; p<MAX_PLAYERS ; p++)
      {
          if (IsPlayerConnected (p))
         {
            /* Traitement pour le joueur p */
         }
      }
   }
   return 1;//je sais pas si c'est nécéssaire
}

en espérant que ce soit clair....

++Sim++