• 04 Juin 2026, 23:24:51


Auteur Sujet: OnPlayerUpdate freeze les autres joueurs  (Lu 2167 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
OnPlayerUpdate freeze les autres joueurs
« le: 04 Février 2013, 19:14:55 »
Bonsoir,

j'ai fait un petit script pour qu'une barre de vie 3DText s'affiche sur la voiture mais je n'ai rien trouvé de mieu que d'appeler ma fonction dans la callback OnPlayerUpdate(), seulement quand je vais en jeux, je peut bouger mais je voit les autres joueurs figer avec un sablier à coter de leur nom  :wacko:

Voici le script en question

Code: (pawn) [Sélectionner]
#define filterscripts

#include <a_samp>

new Text3D:CarLabel[MAX_VEHICLES];
new CarID[MAX_VEHICLES];

UpdateLife(playerid);
UpdateString(Float:Health, playerid);

public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
    CarID[playerid] = GetPlayerVehicleID(playerid);

CarLabel[playerid] = Create3DTextLabel("", -1, 0, 0, 1, 20.0, 0, 1);
Attach3DTextLabelToVehicle(CarLabel[playerid], CarID[playerid], 0, 0, 1);
UpdateLife(playerid);
}
else
{
Delete3DTextLabel(CarLabel[playerid]);
}

return 1;
}


public OnPlayerUpdate(playerid)
{
UpdateLife(playerid);
}

stock UpdateLife(playerid)
{
new Float:Health;
GetVehicleHealth(CarID[playerid], Health);

UpdateString(Health, playerid);
}

stock UpdateString(Float:Health, playerid)
{
new str[28];
if(Health == 1000)          format(str,sizeof(str),"{00ff00}__________");
else if(Health >= 900)  format(str,sizeof(str),"{66ff00}_________{ffffff}_");
else if(Health >= 800) format(str,sizeof(str),"{7fff00}________{ffffff}__");
else if(Health >= 700) format(str,sizeof(str),"{ccff00}_______{ffffff}___");
else if(Health >= 600) format(str,sizeof(str),"{f7f21a}______{ffffff}____");
else if(Health >= 500) format(str,sizeof(str),"{f4c430}_____{ffffff}_____");
else if(Health >= 400) format(str,sizeof(str),"{e49b0f}____{ffffff}______");
else if(Health >= 300) format(str,sizeof(str),"{e4650e}___{ffffff}_______");
else if(Health >= 250) format(str,sizeof(str),"{ff2400}__{ffffff}________");
else format(str,sizeof(str),"{ff2400}Boom!");

Update3DTextLabelText(CarLabel[playerid], -1, str);
}

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #1 le: 04 Février 2013, 19:18:20 »
Normal, il manque le
Code: (pawn) [Sélectionner]
return 1;dans OnPlayerUpdate.

Par contre je te déconseille d'utiliser OnPlayerUpdate c'est appeler très très souvent, fais ça avec un timer.



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #2 le: 04 Février 2013, 19:26:17 »
En effet merci !

Un timer, oui mais qui s'appel tous les combiens ?

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #3 le: 04 Février 2013, 20:46:21 »
Toutes les secondes ?



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #4 le: 04 Février 2013, 21:45:19 »
Ok merci  :-[

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #5 le: 07 Février 2013, 16:19:55 »
Salut !

J'ai voulu faire un timer toutes les 0.5 secondes, mais seulement je ne sait pas où l'appeler car j'ai besoin de récuperer le playerid du joueur, et si je l'apel dans OnPlayerUpdate(), sa semble bugger en jeux..

Code: (c++) [Sélectionner]
#define FILTERSCRIPT

#include <a_samp>

forward LapsUpdate(playerid);

public OnPlayerUpdate(playerid)
{
LapsUpdate(playerid);
return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
SetPlayerHealth(killerid, 0);
return 1;
}

public LapsUpdate(playerid)
{
    if(IsPlayerInAnyVehicle(playerid))
{
UpdateCarLife(playerid);
OnVehicleEnterInWatter(playerid);
}
}

stock UpdateCarLife(playerid)
{
if(IsPlayerInAnyVehicle(playerid))
{
new Float:PlayerHealth, Float:VehHealth, Float:TrueVehHealth;
GetPlayerHealth(playerid, PlayerHealth);
GetVehicleHealth(GetPlayerVehicleID(playerid), VehHealth);
TrueVehHealth = floatround(floatround(VehHealth - 250)/ 7.5);

SetPlayerHealth(playerid, TrueVehHealth);

if(PlayerHealth <= 2)
    SetPlayerHealth(playerid, 2);
}
}

stock OnVehicleEnterInWatter(playerid)
{
    if(IsPlayerInAnyVehicle(playerid))
{
new Float:x, Float:y, Float:z;
GetVehiclePos(GetPlayerVehicleID(playerid), x, y ,z);

if(z <= 0)
{
SetVehicleHealth(GetPlayerVehicleID(playerid), 0);
}
}
}

Hors ligne Infu

  • *
  • Modo LS - Admin FnF
  • Messages: 3551
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #6 le: 07 Février 2013, 19:49:38 »
Code: (pawn) [Sélectionner]
forward Montimer(playerid[MAX_PLAYERID]);
Non?


Adju ♥
(-_-)



Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #7 le: 08 Février 2013, 17:57:46 »
Merci  :happy:

EDIT :

Enfaîte je suis bloquer, où mettre playerid[MAX_PLAYERS] ?
mais normalement le timer devrait s'appeler * pour chaques joueurs non ?

Code: (c++) [Sélectionner]
forward LapsUpdate(playerid);

public OnPlayerUpdate(playerid)
{
SetTimer("LapsUpdate", 500, true);
return 1;
}

public LapsUpdate(playerid)
{
    if(IsPlayerInAnyVehicle(playerid))
{
UpdateCarLife(playerid);
OnVehicleEnterInWatter(playerid);
        }
}
« Modifié: 08 Février 2013, 18:08:27 par Ashley11 »

Hors ligne chneubeul

  • *
  • Gangster
  • GTA Online Addict :)
  • Messages: 1132
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #8 le: 09 Février 2013, 15:38:31 »
Salut,

réfléchis un peu à ceux que tu viens de faire, à chaque appel de OnPlayerUpdate, tu va appelez dans 500ms la fonction LapsUdate en boucle, OnplayerUpdate j'ai fait le test une fois, est appelé environ 200-300 fois par seconde à 2 joueurs, oui c'est enorme.. :p

Hors ligne Kiloutre

  • Nolife, nerd et geek passionné d'Ordinatique ! ^^
  • *
  • Grand Banditisme
  • Messages: 567
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #9 le: 10 Février 2013, 02:30:51 »
Tu devrais plutôt lancer le timer dans OnGameModeInit, et à la place d'essayer d'inclure l'option playerid, fait une boucle sur tout les véhicules
for(new v; v <= MAX_VEHICLES, v++)
etc...
Pas la peine de créer une fonction pour mettre à jour la vie du véhicule, autant tout faire dans la boucle.

[/url]

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : OnPlayerUpdate freeze les autres joueurs
« Réponse #10 le: 10 Février 2013, 16:54:30 »
Merci pour tout !
« Modifié: 10 Février 2013, 17:05:23 par Ashley11 »