-
Mi a hiba a kódban? Csak id 0 nak méri/írja ki, a sebességét.
#include <a_samp>
new Text:Textdraw0[MAX_PLAYERS];
new Float:Velocity [3];
public OnFilterScriptInit()
{
for(new i;i < MAX_PLAYERS;i++)
{
Textdraw0 = TextDrawCreate(502.000000, 372.000000, \"-\");
TextDrawBackgroundColor(Textdraw0, 255);
TextDrawFont(Textdraw0, 2);
TextDrawLetterSize(Textdraw0, 0.300000, 1.000000);
TextDrawColor(Textdraw0, -1);
TextDrawSetOutline(Textdraw0, 0);
TextDrawSetProportional(Textdraw0, 1);
TextDrawSetShadow(Textdraw0, 1);
}
SetTimer(\"Speed\", 100, true);
return 1;
}
public OnFilterScriptExit()
{
for(new i;i < MAX_PLAYERS;i++)
{
TextDrawHideForAll(Textdraw0);
TextDrawDestroy(Textdraw0);
}
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
}
else if(oldstate == PLAYER_STATE_DRIVER)
{
TextDrawHideForPlayer(playerid, Textdraw0[playerid]);
}
return 1;
}
forward Speed(playerid);
public Speed(playerid)
{
new string[48];
format(string,sizeof(string),\"%i\",GetSpeed(playerid));
TextDrawSetString(Textdraw0[playerid],string);
return 1;
}
stock
GetSpeed ( playerid , mode = 1 )
{
GetVehicleVelocity ( GetPlayerVehicleID ( playerid ) , Velocity [ 0 ] , Velocity [ 1 ] , Velocity [ 2 ] ) ;
return IsPlayerInAnyVehicle ( playerid ) ? floatround ( ( ( floatsqroot ( ( ( Velocity [ 0 ] * Velocity [ 0 ] ) + ( Velocity [ 1 ] * Velocity [ 1 ] ) + ( Velocity [ 2 ] * Velocity [ 2 ] ) ) ) * ( !mode ? 105.0 : 162.5 ) ) ) * 1 ) : 0;
}
-
Ne sima SetTimert, hanem playeridhez köthetõ SetTimerExet használj.
-
Parancsolj, én így oldanám meg:
Amit alakítottam rajta, meghívunk egy ciklust, esetünkben 100 ms-ként ami végigmegy az összes játékoson.
Ami kiszámítja a sebbeséget DE csak akkor ha a játékos sõför (azért csináltam így mert kódóban csak akkor jeleníti meg a textdraw-ot ha sõför), és utána textdraw értékét átállítja a kiszámított értékre.
#include <a_samp>
new Text:Textdraw0[MAX_PLAYERS];
new Float:Velocity [3];
public OnFilterScriptInit()
{
for(new i;i < MAX_PLAYERS;i++)
{
Textdraw0 = TextDrawCreate(502.000000, 372.000000, \"-\");
TextDrawBackgroundColor(Textdraw0, 255);
TextDrawFont(Textdraw0, 2);
TextDrawLetterSize(Textdraw0, 0.300000, 1.000000);
TextDrawColor(Textdraw0, -1);
TextDrawSetOutline(Textdraw0, 0);
TextDrawSetProportional(Textdraw0, 1);
TextDrawSetShadow(Textdraw0, 1);
}
SetTimer(\"Speed\", 100, true);
return 1;
}
public OnFilterScriptExit()
{
for(new i;i < MAX_PLAYERS;i++)
{
TextDrawHideForAll(Textdraw0);
TextDrawDestroy(Textdraw0);
}
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
}
else if(oldstate == PLAYER_STATE_DRIVER)
{
TextDrawHideForPlayer(playerid, Textdraw0[playerid]);
}
return 1;
}
forward Speed();
public Speed()
{
for(new i = 0; i < MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
{
new string_[48];
format(string_,sizeof(string_),\"%d\",GetSpeed(i));
TextDrawSetString(Textdraw0,string_);
}
}
}
stock GetSpeed ( playerid , mode = 1 )
{
GetVehicleVelocity ( GetPlayerVehicleID ( playerid ) , Velocity [ 0 ] , Velocity [ 1 ] , Velocity [ 2 ] ) ;
return IsPlayerInAnyVehicle ( playerid ) ? floatround ( ( ( floatsqroot ( ( ( Velocity [ 0 ] * Velocity [ 0 ] ) + ( Velocity [ 1 ] * Velocity [ 1 ] ) + ( Velocity [ 2 ] * Velocity [ 2 ] ) ) ) * ( !mode ? 105.0 : 162.5 ) ) ) * 1 ) : 0;
}
-
bbTamas, akos27, ne haragudjatok, de egy kis túlzással :facepalm:
Tamás, a forráskódot a kedves témanyitó már rég megcsinálta, de csak a 0-s ID-n mûködött, valószínûleg az elsõ hszemben leírt okok miatt, hát nem értem, miért írtad le neki (rádaásul hibásan), hogy hogy csinálja meg, mikor már egyszer megcsinálta.
Ákos, igazad van, PlayerTextDrawval is megoldható a dolog, de õ simával oldotta meg. És nem ez itt a probléma, ugyanis ha megnézed a kódját, minden játékos ID-hez csatolva létrehozott egy-egy sima TextDrawot.
A Speed timernél pedig mindent jól csinált, legalábbis ott, ahol megadta a lefuttatandó függvényeket, ugyanis ott nem kell semmi féle ciklus, meg felesleges minden játékoson végigmenni. Egyszerûen playeridhez kell csatolni a timert, az OnPlayerConncet alatt meghívva. Így ráadásul csak azt a playert nézi majd a timer, aki online van a szerveren. A kód viszont lemaradt:
SetTimerEx(\"Speed\", 500, true, \"i\", playerid);
-
Köszönöm Dfoglalo, a hiba elsõ hozzászólásoddal megoldódott, csak most jutottam fórumra, hogy reagáljak.
bbTamas értem én hogy mit akartál..., csak még ott se tartottam hogy mérje a sebességet a játékosoknak.
Másrészt hogyha elindul ez a timer nem fog leállni magától hiába szabod ki feltételnek hogy csak a vezetõnél lépjen érvénybe, egyszer beszáll sofõrnek a játékos a timer onnantól kezdve fut, még akkor is ha lecsatlakozik a szerveröl, le kell állítani. Ezt akkor értettem meg mikor a KillTimer után néztem és konzolba kiírogattam\"timer fut\".
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
TextDrawShowForPlayer(playerid, Textdraw0[playerid]);
Timer1[playerid] = SetTimerEx(\"Speed\", 100, true,\"u\",playerid);
}
else if(oldstate == PLAYER_STATE_DRIVER)
{
TextDrawHideForPlayer(playerid, Textdraw0[playerid]);
KillTimer(Timer1[playerid]);
}
return 1;
}
Csak vezetõnek hívódik meg és ha kiszáll leállítja azt, azonban le kell még állítani lecsatlakozásnál, kick, stb.
-
bbTamas, akos27, ne haragudjatok, de egy kis túlzással :facepalm:
Tamás, a forráskódot a kedves témanyitó már rég megcsinálta, de csak a 0-s ID-n mûködött, valószínûleg az elsõ hszemben leírt okok miatt, hát nem értem, miért írtad le neki (rádaásul hibásan), hogy hogy csinálja meg, mikor már egyszer megcsinálta.
Ákos, igazad van, PlayerTextDrawval is megoldható a dolog, de õ simával oldotta meg. És nem ez itt a probléma, ugyanis ha megnézed a kódját, minden játékos ID-hez csatolva létrehozott egy-egy sima TextDrawot.
A Speed timernél pedig mindent jól csinált, legalábbis ott, ahol megadta a lefuttatandó függvényeket, ugyanis ott nem kell semmi féle ciklus, meg felesleges minden játékoson végigmenni. Egyszerûen playeridhez kell csatolni a timert, az OnPlayerConncet alatt meghívva. Így ráadásul csak azt a playert nézi majd a timer, aki online van a szerveren. A kód viszont lemaradt:
SetTimerEx(\"Speed\", 500, true, \"i\", playerid);
Már ne is haragudj, hogy ezt mondom, de mégis minek minden egy játékoshoz hozzárendelni egy idõzítõt?
Egyértelmûen felesleges, én tartom magam ahhoz, hogy amit leírtam megoldás, az sokkal hatékonyabban dolgozik/mûködik mint az általad javasolt megoldás.
Ciklusnál van egy feltétel ami ellenõrzi, hogy játékos online van-e, hogy vezetõ sofõr-e, ha nem, akkor nem fut le a függvény.
Én csak kijavítottam, hogy miért nem mûködik neki.
Kérlek szépen mutasd már meg légyszíves, hogy az én általam javasolt kódba mitõl hibás?
Nyilván neki is kell alakítani neki rajta valamit.
-
én bbTamas megoldását használnám :)
Dfoglalo kódjában az a baj hogy pl 30 játékosnak 1-1 timer azért elég sok...nagyobb slotnál meg ne is mondjam :)
spórolni kell az erõforrással :D még ha nem is laggolsz be miatta mert elég erõs a szerver gép, attól még oda kell figyelni hogy mennyire terheled! :)
különösebb hibát nem látok bbTamas kódjában csak 1-2 dolgot amit nem így csinálnék:
new Float:Velocity [3];
ezt lokálisan hoznám létre
new string_[48];
format(string_,sizeof(string_),\"%d\",GetSpeed(i));
ide nem raknék 48 cellát szerintem a 4 is elég...
-
én bbTamas megoldását használnám :)
Dfoglalo kódjában az a baj hogy pl 30 játékosnak 1-1 timer azért elég sok...nagyobb slotnál meg ne is mondjam :)
spórolni kell az erõforrással :D még ha nem is laggolsz be miatta mert elég erõs a szerver gép, attól még oda kell figyelni hogy mennyire terheled! :)
különösebb hibát nem látok bbTamas kódjában csak 1-2 dolgot amit nem így csinálnék:
new Float:Velocity [3];
ezt lokálisan hoznám létre
new string_[48];
format(string_,sizeof(string_),\"%d\",GetSpeed(i));
ide nem raknék 48 cellát szerintem a 4 is elég...
Ezt az elrendezést, a kedves témanyitó használta, én ezért nem nyúltam a változók neveihez, és elrendezéséhez.
Meglehet úgy is csinálni, hogy egy globális változót használunk, vagy ahogy említetted, lehet használni külön helyi változót is erre a célra.
new Float:Velocity [3];
Elvben a pawn egyszálas, tehát minden egy szálon fut, többszálas meneteket nem támogat, úgyhogy elvileg ez nem lassít a kód hatékonyságán.
Egyetértek Kovacs_Richard ahogy említette, ha sok játékos van a szerveren akkor elég komoly terhelést okozhat a sok feleslegesen létrehozott idõzítõ.
-
Ezt megbeszéltük, köszönöm mindenkinek. :)
Szóval minden egyes játékosnak nem külön timerel hívjuk meg a speed callback-et, hanem egy timerel és a speed callback-en belül minden játékosnak(csatlakozott, sofõr játékosnak) mérjük a sebességét. :yes: Világos.