Szerző Téma: Miért csak ID 0 -nak mér sebességet a km/h?  (Megtekintve 883 alkalommal)

Nem elérhető nyomo

  • 159
    • Profil megtekintése
Miért csak ID 0 -nak mér sebességet a km/h?
« Dátum: 2014. január 29. - 21:38:18 »
0 Show voters
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;
}
« Utoljára szerkesztve: 2014. január 29. - 21:39:49 írta nyomo »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #1 Dátum: 2014. január 29. - 21:53:13 »
+1 Show voters
Ne sima SetTimert, hanem playeridhez köthetõ SetTimerExet használj.

Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #2 Dátum: 2014. január 29. - 22:47:28 »
0 Show voters
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;
}
« Utoljára szerkesztve: 2014. január 29. - 22:49:26 írta bbTamas »

Nem elérhető Dfoglalo

  • 4069
  • Globális Moderátor
    • Profil megtekintése
Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #3 Dátum: 2014. január 30. - 00:12:39 »
0 Show voters
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);
« Utoljára szerkesztve: 2014. január 30. - 00:26:00 írta Dfoglalo »

Nem elérhető nyomo

  • 159
    • Profil megtekintése
Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #4 Dátum: 2014. január 30. - 00:33:22 »
0 Show voters
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.
« Utoljára szerkesztve: 2014. január 30. - 02:22:15 írta nyomo »

Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #5 Dátum: 2014. január 30. - 13:17:30 »
0 Show voters
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.

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #6 Dátum: 2014. január 30. - 13:57:55 »
0 Show voters
é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...
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #7 Dátum: 2014. január 30. - 14:09:40 »
0 Show voters
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õ.
« Utoljára szerkesztve: 2014. január 30. - 14:12:04 írta bbTamas »

Nem elérhető nyomo

  • 159
    • Profil megtekintése
Miért csak ID 0 -nak mér sebességet a km/h?
« Válasz #8 Dátum: 2014. január 31. - 11:11:02 »
0 Show voters
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.   

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal