GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: nyomo - 2014. január 29. - 21:38:18

Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: nyomo - 2014. január 29. - 21:38:18
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;
}
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: Dfoglalo - 2014. január 29. - 21:53:13
Ne sima SetTimert, hanem playeridhez köthetõ SetTimerExet használj.
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: bbTamas - 2014. január 29. - 22:47:28
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;
}
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: Dfoglalo - 2014. január 30. - 00:12:39
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);
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: nyomo - 2014. január 30. - 00:33:22
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.
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: bbTamas - 2014. január 30. - 13:17:30
Idézetet írta: Dfoglalo date=1391037159\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"46150\" data-ipsquote-contentclass=\"forums_Topic
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.
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: Kovacs_Richard - 2014. január 30. - 13:57:55
é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...
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: bbTamas - 2014. január 30. - 14:09:40
Idézetet írta: Kovacs_Richard date=1391086675\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"46150\" data-ipsquote-contentclass=\"forums_Topic
é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õ.
Cím: Miért csak ID 0 -nak mér sebességet a km/h?
Írta: nyomo - 2014. január 31. - 11:11:02
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.