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
-
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
#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);
}
-
Normal, il manque le
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.
-
En effet merci !
Un timer, oui mais qui s'appel tous les combiens ?
-
Toutes les secondes ?
-
Ok merci :-[
-
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..
#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);
}
}
}
-
forward Montimer(playerid[MAX_PLAYERID]);
Non?
-
Merci :happy:
EDIT :
Enfaîte je suis bloquer, où mettre playerid[MAX_PLAYERS] ?
mais normalement le timer devrait s'appeler * pour chaques joueurs non ?
forward LapsUpdate(playerid);
public OnPlayerUpdate(playerid)
{
SetTimer("LapsUpdate", 500, true);
return 1;
}
public LapsUpdate(playerid)
{
if(IsPlayerInAnyVehicle(playerid))
{
UpdateCarLife(playerid);
OnVehicleEnterInWatter(playerid);
}
}
-
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
-
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.
-
Merci pour tout !