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: tudvari - 2014. Április 27. - 15:27:21

Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 27. - 15:27:21
Sziasztok!
Amikor valaki kicrashel,vagy csak valamiért nem rendeltetésszerûen lép ki,a timerek nem állnak le valamiért,és ezután belép egy játékos,kétszer olyan gyorsan telik az idõ számára.
Nem tudom,hogy ez csak a haverommal fordul elõ,vagy csak a többiek nem jelentik,de elég idegesítõ.
Cím: Timerek nem állnak le
Írta: Flash - 2014. Április 27. - 15:32:32
Kódok?
Egyébként: http://wiki.sa-mp.com/wiki/KillTimer
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 27. - 15:34:53
Az leáll.De csak akkor ha disconectel a játékos.És úgy látszik,hogy néha nem fut le.
Cím: Timerek nem állnak le
Írta: Flash - 2014. Április 27. - 15:37:39
Idézetet írta: Flash date=1398605552\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"47926\" data-ipsquote-contentclass=\"forums_Topic
Kódok?
 
Cím: Timerek nem állnak le
Írta: bbTamas - 2014. Április 27. - 16:02:36
Talán azért mert nem SetTimerEx függvényt kellene használni vagyis én nem ajánlanám pont erre a célra.
Hanem inkább úgy kellene megcsinálni, hogy létrehozni egy idõzítõt, és ciklussal végigmennél az összes játékoson, és akkor nem lenne ilyen probléma.
Nem kell elindítani egy újabb idõzítõt és leállítgatni, elég egy darab ilyen célokra.
foreach.inc szükséges!
 
public OnGameModeInit()
{
SetTimer(\"OsszesJatekos\",1000,true);
return 1;
}
forward OsszesJatekos();
public OsszesJatekos()
{
foreach(new i;Player) //végigmegyünk az összes játékoson
{
new asd = GetPlayerVehicleID(i); // stb..  játékos idõ számlálása stb
}
}

 
[mod]Javítottam pawn code tagre![/mod]
Cím: Timerek nem állnak le
Írta: Flash - 2014. Április 27. - 16:23:23
Adj a timernek egy változót, és úgy killtimerezz!
 
new timer;
public OnGameModeInit()
{
        timer = SetTimer(\"OsszesJatekos\",1000,true);
        return 1;
}

 
És ahol megszeretnéd állítani:
 
KillTimer(timer);
Cím: Timerek nem állnak le
Írta: kiakovi - 2014. Április 27. - 16:40:05
Gondolom a szerveredhez kell. Én úgy csinálom a timereket, ha be van jelentkezve a játékos, akkor mindig elindul egy nem ismétlõdõ timer. Így a disconnect-nél csak a bejelentkezést kell eltávolítani és megáll a timer teljesen.
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 27. - 17:54:17
Szóval egy timerrel nézed,hogy ha online,akkor elindítson egy timert? :D
Ui.: Igen tudom,hogy változókkal kell stb,meg le is állítom stb stb stb. Nem emiatt lesz a hiba.
Cím: Timerek nem állnak le
Írta: Zsolesszka - 2014. Április 28. - 22:56:53
Ha játékosonként tárolod egy elindított idõzítõ azonosítóját mondjuk így:
 
new timer[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
    timer[playerid] = SetTimer.........
    ....

 
Akkor a változó továbbra is tárolni fogja az elindított timer azonosító számát akkor is ha a játékos kifagy vagy crashel.
Ebbõl kiindulva le lehet állítani akkor is ha egy új játékos fellép a szerverre gyakorlatilag a helyére (ugyanazt az id-t kapja meg amelyik a kifagyott játékosé volt.
Persze azt nem tudni hogy a samp programozója ezt hogyan kezeli hogy idõzítõ azonosításra újra felhasznál-e olyan értéket amit korábban leállításra került, ezért biztonságra törekedve meglehet határozni egy értéket ami azt jelenti hogy az idõzítõ leállításra vagy egyáltalán nem is lett elindítva, ami lehetne mondjuk a -1.
 
new timer[MAX_PLAYERS] = { -1, ... };
public
OnPlayerConnect(playerid)
{
if(timer[playerid] != -1) KillTimer(timer[playerid]); // Így ha véletlenül nem kerülne meghívásra játékos kifagyásakor az OnPlayerDisconnect akkor OnPlayerConnect alatt le lehet állítani egy másik játékos által elindított idõzítõt
    timer[playerid] = SetTimer(\"bla\", 1000, 1);
return 1;
}
public
OnPlayerDisconnect(playerid, reason)
{
KillTimer(timer[playerid]);
timer[playerid] = -1;
}

 
Ez lenne az elmélet, a kérdés hogy mûködik-e a valóságban?
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 29. - 06:33:48
és a killtimer után alapból milyen értéket vesz fel a változó?
Cím: Timerek nem állnak le
Írta: Zsolesszka - 2014. Április 30. - 22:35:32
Ugyanaz marad mint ami volt, ez elég zavaró samp esetén. (tudtommal)
Ezért írtam KillTimer után egy negatív érték megadást \"timer[playerid] = -1;\".
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Május 01. - 00:16:35
ja ez sok mindent megmagyaráz :D én azt hittem,hogy alapból átírja a változót.Miért nem csinálják ilyenre a SA-MP fejlesztõi?
Cím: Timerek nem állnak le
Írta: KovaNovik - 2014. Május 01. - 07:47:35
Hookold meg, ahogy zsoleszka is mondta, és nem kell hozzányúni ahhoz, amit már megírtál olyanra.
 
stock KillTimerJav(&timerid)
{
    if(KillTimer(timerid)) timerid = -1, return 1;
    else return 0;
}
#if defined _ALS_KillTimer
    #undef KillTimer
#else
    #define _ALS_KillTimer
#endif
#define KillTimer KillTimerJav

 
Báár, nem tudom jó-e. Amúgy a KillTimerei használata elõtt, de még az a_samp include után rakd, nekem egyszer ebbõl volt egy kis gond :D
Cím: Timerek nem állnak le
Írta: Flash - 2014. Május 24. - 14:54:15
[mod]Témát zártam! Ha mégsem oldódott meg a problémád, kérlek jelezd PÜ-be, és megnyitom a témát![/mod]
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 27. - 15:27:21
Sziasztok!
Amikor valaki kicrashel,vagy csak valamiért nem rendeltetésszerûen lép ki,a timerek nem állnak le valamiért,és ezután belép egy játékos,kétszer olyan gyorsan telik az idõ számára.
Nem tudom,hogy ez csak a haverommal fordul elõ,vagy csak a többiek nem jelentik,de elég idegesítõ.
Cím: Timerek nem állnak le
Írta: Flash - 2014. Április 27. - 15:32:32
Kódok?
Egyébként: http://wiki.sa-mp.com/wiki/KillTimer
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 27. - 15:34:53
Az leáll.De csak akkor ha disconectel a játékos.És úgy látszik,hogy néha nem fut le.
Cím: Timerek nem állnak le
Írta: Flash - 2014. Április 27. - 15:37:39
Idézetet írta: Flash date=1398605552\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"47926\" data-ipsquote-contentclass=\"forums_Topic
Kódok?
 
Cím: Timerek nem állnak le
Írta: bbTamas - 2014. Április 27. - 16:02:36
Talán azért mert nem SetTimerEx függvényt kellene használni vagyis én nem ajánlanám pont erre a célra.
Hanem inkább úgy kellene megcsinálni, hogy létrehozni egy idõzítõt, és ciklussal végigmennél az összes játékoson, és akkor nem lenne ilyen probléma.
Nem kell elindítani egy újabb idõzítõt és leállítgatni, elég egy darab ilyen célokra.
foreach.inc szükséges!
 
public OnGameModeInit()
{
SetTimer(\"OsszesJatekos\",1000,true);
return 1;
}
forward OsszesJatekos();
public OsszesJatekos()
{
foreach(new i;Player) //végigmegyünk az összes játékoson
{
new asd = GetPlayerVehicleID(i); // stb..  játékos idõ számlálása stb
}
}

 
[mod]Javítottam pawn code tagre![/mod]
Cím: Timerek nem állnak le
Írta: Flash - 2014. Április 27. - 16:23:23
Adj a timernek egy változót, és úgy killtimerezz!
 
new timer;
public OnGameModeInit()
{
        timer = SetTimer(\"OsszesJatekos\",1000,true);
        return 1;
}

 
És ahol megszeretnéd állítani:
 
KillTimer(timer);
Cím: Timerek nem állnak le
Írta: kiakovi - 2014. Április 27. - 16:40:05
Gondolom a szerveredhez kell. Én úgy csinálom a timereket, ha be van jelentkezve a játékos, akkor mindig elindul egy nem ismétlõdõ timer. Így a disconnect-nél csak a bejelentkezést kell eltávolítani és megáll a timer teljesen.
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 27. - 17:54:17
Szóval egy timerrel nézed,hogy ha online,akkor elindítson egy timert? :D
Ui.: Igen tudom,hogy változókkal kell stb,meg le is állítom stb stb stb. Nem emiatt lesz a hiba.
Cím: Timerek nem állnak le
Írta: Zsolesszka - 2014. Április 28. - 22:56:53
Ha játékosonként tárolod egy elindított idõzítõ azonosítóját mondjuk így:
 
new timer[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
    timer[playerid] = SetTimer.........
    ....

 
Akkor a változó továbbra is tárolni fogja az elindított timer azonosító számát akkor is ha a játékos kifagy vagy crashel.
Ebbõl kiindulva le lehet állítani akkor is ha egy új játékos fellép a szerverre gyakorlatilag a helyére (ugyanazt az id-t kapja meg amelyik a kifagyott játékosé volt.
Persze azt nem tudni hogy a samp programozója ezt hogyan kezeli hogy idõzítõ azonosításra újra felhasznál-e olyan értéket amit korábban leállításra került, ezért biztonságra törekedve meglehet határozni egy értéket ami azt jelenti hogy az idõzítõ leállításra vagy egyáltalán nem is lett elindítva, ami lehetne mondjuk a -1.
 
new timer[MAX_PLAYERS] = { -1, ... };
public
OnPlayerConnect(playerid)
{
if(timer[playerid] != -1) KillTimer(timer[playerid]); // Így ha véletlenül nem kerülne meghívásra játékos kifagyásakor az OnPlayerDisconnect akkor OnPlayerConnect alatt le lehet állítani egy másik játékos által elindított idõzítõt
    timer[playerid] = SetTimer(\"bla\", 1000, 1);
return 1;
}
public
OnPlayerDisconnect(playerid, reason)
{
KillTimer(timer[playerid]);
timer[playerid] = -1;
}

 
Ez lenne az elmélet, a kérdés hogy mûködik-e a valóságban?
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Április 29. - 06:33:48
és a killtimer után alapból milyen értéket vesz fel a változó?
Cím: Timerek nem állnak le
Írta: Zsolesszka - 2014. Április 30. - 22:35:32
Ugyanaz marad mint ami volt, ez elég zavaró samp esetén. (tudtommal)
Ezért írtam KillTimer után egy negatív érték megadást \"timer[playerid] = -1;\".
Cím: Timerek nem állnak le
Írta: tudvari - 2014. Május 01. - 00:16:35
ja ez sok mindent megmagyaráz :D én azt hittem,hogy alapból átírja a változót.Miért nem csinálják ilyenre a SA-MP fejlesztõi?
Cím: Timerek nem állnak le
Írta: KovaNovik - 2014. Május 01. - 07:47:35
Hookold meg, ahogy zsoleszka is mondta, és nem kell hozzányúni ahhoz, amit már megírtál olyanra.
 
stock KillTimerJav(&timerid)
{
    if(KillTimer(timerid)) timerid = -1, return 1;
    else return 0;
}
#if defined _ALS_KillTimer
    #undef KillTimer
#else
    #define _ALS_KillTimer
#endif
#define KillTimer KillTimerJav

 
Báár, nem tudom jó-e. Amúgy a KillTimerei használata elõtt, de még az a_samp include után rakd, nekem egyszer ebbõl volt egy kis gond :D
Cím: Timerek nem állnak le
Írta: Flash - 2014. Május 24. - 14:54:15
[mod]Témát zártam! Ha mégsem oldódott meg a problémád, kérlek jelezd PÜ-be, és megnyitom a témát![/mod]