GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Ashley11 le 04 Février 2013, 19:14:55

Titre: OnPlayerUpdate freeze les autres joueurs
Posté par: Ashley11 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);
}
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ssk 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.
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ashley11 le 04 Février 2013, 19:26:17
En effet merci !

Un timer, oui mais qui s'appel tous les combiens ?
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ssk le 04 Février 2013, 20:46:21
Toutes les secondes ?
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ashley11 le 04 Février 2013, 21:45:19
Ok merci  :-[
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ashley11 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);
}
}
}
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Infu le 07 Février 2013, 19:49:38
Code: (pawn) [Sélectionner]
forward Montimer(playerid[MAX_PLAYERID]);
Non?
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ashley11 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);
        }
}
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: chneubeul 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
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Kiloutre 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.
Titre: Re : OnPlayerUpdate freeze les autres joueurs
Posté par: Ashley11 le 10 Février 2013, 16:54:30
Merci pour tout !