Jump to content
  • 0

pomoc Jail


Vankus

Dotaz

Popis problému:

Ide to všetko v pohode,keď dám niekomu jail odpočítava mu to perfektne ale jakmile sa odpojí a pripojí tak mu to odpočítava pod 2 sekundy.Nechápem prečo

Dám vám kód

.

 

Chyby/varování kompilátoru a při běhu:

--

 

Kód:

 

//príkaz[code=:0]
CMD:jail(playerid,params[])
{
	new id,dovod[225],minuty,string[128];
	if(AdminLevel[playerid] < 2)return SendClientMessage(playerid,COLOR_RED,"[!] {FFFFFF}Nemáš oprávnenie na tento príkaz");
	if(sscanf(params,"uis[225]",id,minuty,dovod))return SendClientMessage(playerid,COLOR_RED,"[!] {FFFFFF}Musíš zadat /jail [ID] [Cas v minutách] [Dôvod]");
	if(jail[id] > 0)return SendClientMessage(playerid,COLOR_RED,"[!] {FFFFFF}Tento hrác už je vo väzení");
	format(string,sizeof(string),"%s{FF3300}%s(ID:%d) ťa dal do väzenia na %i minút [Dôvod: %s]",GetPlayerAdminTitle(playerid),Meno(playerid),playerid,minuty,dovod);
	SendClientMessage(id,COLOR_RED,string);
	jail[id] = 60*minuty;
	SetPlayerInterior(id,3);
    SetPlayerPos(id,198.3796, 160.8905, 1003.03);
    PlayerTextDrawShow(playerid,VazenieTimer[playerid][0]);
    PlayerTextDrawShow(playerid,VazenieTimer[playerid][1]);
	vazenietimer[id] = SetTimerEx("vazenie",1000,true,"i",id);
	return 1;
}
[/code]
//public[code=:0]
public vazenie(playerid)
{
    if(jail[playerid] > 0)
	{
		 new string[128];
		 format(string,sizeof(string),"%s",TimeConvert(jail[playerid]));
		 jail[playerid] --;
		 PlayerTextDrawSetString(playerid,VazenieTimer[playerid][0],string);
	}
	else
	{
		  SendClientMessage(playerid,COLOR_RED,"Odpykal si si trest");
		  KillTimer(vazenietimer[playerid]);
		  SetPlayerInterior(playerid,0);
		  SetPlayerPos(playerid,1109.2490,-1796.0345,16.5938);
		  PlayerTextDrawHide(playerid,VazenieTimer[playerid][0]);
		  PlayerTextDrawHide(playerid,VazenieTimer[playerid][1]);
	}
	return 1;
}
[/code]
//onplayerspawn[code=:0]
if(jail[playerid] > 0)
	{
           PlayerTextDrawShow(playerid,VazenieTimer[playerid][0]);
	       PlayerTextDrawShow(playerid,VazenieTimer[playerid][1]);
	       vazenietimer[playerid] = SetTimerEx("vazenie",1000,true,"i",playerid);
	}
[/code]

 

 

 

Dodatečné poznámky:

--

Link to comment
Share on other sites

13 odpovědí na tuto otázku

Recommended Posts

  • 0

Ja to tak mám...ale ja keď sa pripojím tak mi to ide po 2 sekundy,nie po jednej...

V OnplayerDisconnect ukladám a zabijam timer

KillTimer(vazenietimer[playerid]);
DOF2_SetInt(Hrac,"Jail",jail[playerid]);

A v OnPlayerConnect keď napíše dobré heslo mám načítanie

jail[playerid] = DOF2_GetInt(Hrac,"Jail");

A v OnPlayerSpawn znova spúšťam ten timer

if(jail[playerid] > 0)
	{
           PlayerTextDrawShow(playerid,VazenieTimer[playerid][0]);
	       PlayerTextDrawShow(playerid,VazenieTimer[playerid][1]);
	       vazenietimer[playerid] = SetTimerEx("vazenie",1000,true,"i",playerid);
	}

Link to comment
Share on other sites

  • 0

Aha, tak to jsem tě špatně pochopil, myslel jsem, že se ti odečítají 2 sekundy v jeden moment... 

 

Btw. nechápu proč txd s časem na uvěznění zobrazuješ adminovi, co ho uvěznil... 

 

Rozhodně jelikož budeš mít duplicitní kód bych si udělal metodu Uvezni s parametrem pro hráčovo id, kde budeš zobrazovat txd, nastavíš pozici a interier, atd.

forward Uvezni(playerid);
public Uvezni(playerid)
{
    SetPlayerInterior(playerid,3);
    SetPlayerPos(playerid,198.3796, 160.8905, 1003.03);
    PlayerTextDrawShow(playerid,VazenieTimer[playerid][0]);
    PlayerTextDrawShow(playerid,VazenieTimer[playerid][1]);
    vazenietimer[playerid] = SetTimerEx("vazenie",1000,true,"i",playerid);

    return 1;
}

Pak bych to už volal jen kde je třeba:

CMD:jail(playerid,params[])
{
    new id,dovod[225],minuty,string[128];
    if(AdminLevel[playerid] < 2)return SendClientMessage(playerid,COLOR_RED,"[!] {FFFFFF}Nemáš oprávnenie na tento príkaz");
    if(sscanf(params,"uis[225]",id,minuty,dovod))return SendClientMessage(playerid,COLOR_RED,"[!] {FFFFFF}Musíš zadat /jail [ID] [Cas v minutách] [Dôvod]");
     if(jail[id] > 0)return SendClientMessage(playerid,COLOR_RED,"[!] {FFFFFF}Tento hrác už je vo väzení");
	
    format(string,sizeof(string),"%s{FF3300}%s(ID:%d) ťa dal do väzenia na %i minút [Dôvod: %s]",GetPlayerAdminTitle(playerid),Meno(playerid),playerid,minuty,dovod);
    SendClientMessage(id,COLOR_RED,string);

    jail[id] = 60*minuty;
    Uvezni(playerid);

    return 1;
}
//OnPlayerSpawn
if(jail[playerid] > 0){
    Uvezni(playerid);
}

Jinak žádnou chyby v kódu co se týče času nevidím... Hoď jsem ještě tu funkci TimeConvert... icon_e_wink.gif

Edited by GaRGoyLeS
Link to comment
Share on other sites

  • 0
stock TimeConvert(time) {
    new minutes;
    new seconds;
    new string[128];
    if(time > 59){
        minutes = floatround(time/60);
        seconds = floatround(time - minutes*60);
        if(seconds>9)format(string,sizeof(string),"%d:%d",minutes,seconds);
        else format(string,sizeof(string),"%d:0%d",minutes,seconds);
    }
    else{
        seconds = floatround(time);
        if(seconds>9)format(string,sizeof(string),"0:%d",seconds);
        else format(string,sizeof(string),"0:0%d",seconds);
    }
    return string;
}

toto

A zistil som ešte chybu,že keď sa mi odpyká trest tak mi stále píše Odpykal si si trest a stále ma to portuje na tú istú pozíciu.

Edited by Vankus
Link to comment
Share on other sites

  • 0

Pri odpojaní zrušíš (zabiješ) timer, potom keď sa pripojí, najlepšie keď sa spawne, tak spustíš timer a nastavíš textdraws.

 

takže,

 

nastavíš mu ten čas, kt. máš uložený, potom dáš funkciu, keď ten čas vo väzení je väčší než 0, tak mu spustí timer, ukáže TD a potom ho portne do väzenia.

Rád by som ti dal nejaký pomocný kód, lenže ty to máš pomocou dini.inc čo som nikdy nepoužival.


To posledné si nevšímaj, hneď ti sem niečo hodím na pomoc


takže ten tvôj problém v tom, že ťa stále portuje a píše, že si si odpykal trest, tak tu máš riešenie
public vazenie(playerid)
{
    if(jail[playerid] > 0) // keď je menšie ako 0, čo je keď ti vyprší čas, tak keď bude 0, tak ťa portne a timer pokračuje, takže ide na -1, -2, -3 ... až neviem kam, takže, ak je čas rovný 0, tak to spravý a už ťa nebude portovať
    //takže nie if(jail[playerid] > 0), ale použi "=", že je rovný 0 ten čas if(jail[playerid] = 0)
	{
		 new string[128];
		 format(string,sizeof(string),"%s",TimeConvert(jail[playerid]));
		 jail[playerid] --;
		 PlayerTextDrawSetString(playerid,VazenieTimer[playerid][0],string);
	}
	else
	{
		  SendClientMessage(playerid,COLOR_RED,"Odpykal si si trest");
		  KillTimer(vazenietimer[playerid]);
		  SetPlayerInterior(playerid,0);
		  SetPlayerPos(playerid,1109.2490,-1796.0345,16.5938);
		  PlayerTextDrawHide(playerid,VazenieTimer[playerid][0]);
		  PlayerTextDrawHide(playerid,VazenieTimer[playerid][1]);
	}
	return 1;
}
	


Link to comment
Share on other sites

  • 0

 

Pri odpojaní zrušíš (zabiješ) timer, potom keď sa pripojí, najlepšie keď sa spawne, tak spustíš timer a nastavíš textdraws.

 

takže,

 

nastavíš mu ten čas, kt. máš uložený, potom dáš funkciu, keď ten čas vo väzení je väčší než 0, tak mu spustí timer, ukáže TD a potom ho portne do väzenia.

Rád by som ti dal nejaký pomocný kód, lenže ty to máš pomocou dini.inc čo som nikdy nepoužival.

To posledné si nevšímaj, hneď ti sem niečo hodím na pomoc

takže ten tvôj problém v tom, že ťa stále portuje a píše, že si si odpykal trest, tak tu máš riešenie
public vazenie(playerid)
{
    if(jail[playerid] > 0) // keď je menšie ako 0, čo je keď ti vyprší čas, tak keď bude 0, tak ťa portne a timer pokračuje, takže ide na -1, -2, -3 ... až neviem kam, takže, ak je čas rovný 0, tak to spravý a už ťa nebude portovať
    //takže nie if(jail[playerid] > 0), ale použi "=", že je rovný 0 ten čas if(jail[playerid] = 0)
	{
		 new string[128];
		 format(string,sizeof(string),"%s",TimeConvert(jail[playerid]));
		 jail[playerid] --;
		 PlayerTextDrawSetString(playerid,VazenieTimer[playerid][0],string);
	}
	else
	{
		  SendClientMessage(playerid,COLOR_RED,"Odpykal si si trest");
		  KillTimer(vazenietimer[playerid]);
		  SetPlayerInterior(playerid,0);
		  SetPlayerPos(playerid,1109.2490,-1796.0345,16.5938);
		  PlayerTextDrawHide(playerid,VazenieTimer[playerid][0]);
		  PlayerTextDrawHide(playerid,VazenieTimer[playerid][1]);
	}
	return 1;
}
	


 

Za

1.) To co píšeš už psal, že to tam dávno má... 

2.) Vysvětluješ to špatně, tady chyba rozhodně není... Všimni jsi znaménka ( jail > 0) - větší jak 0. On potřebuje, aby se mu ten čas odečítal pokud je větší než 0, pokud není (takže se rovná 0, nebo je menší než 0), tak se vykoná else, což ho propustí... Kdyby tam dal jail = 0, tak je to prvně špatně kvůli tomu, že jsi v podmínce, takže (==) a za druhé by jsi z funkčního kódu udělal nefunkční (celé by to pracovalo obráceně - pokud by byl zatčený, tak by ho to pustilo a pokud by zatčený nebyl (==0), tak by mu to odečetlo čas (pouze jednou...)...  

stock TimeConvert(time) {
    new minutes;
    new seconds;
    new string[128];
    if(time > 59){
        minutes = floatround(time/60);
        seconds = floatround(time - minutes*60);
        if(seconds>9)format(string,sizeof(string),"%d:%d",minutes,seconds);
        else format(string,sizeof(string),"%d:0%d",minutes,seconds);
    }
    else{
        seconds = floatround(time);
        if(seconds>9)format(string,sizeof(string),"0:%d",seconds);
        else format(string,sizeof(string),"0:0%d",seconds);
    }
    return string;
}

toto

A zistil som ešte chybu,že keď sa mi odpyká trest tak mi stále píše Odpykal si si trest a stále ma to portuje na tú istú pozíciu.

 

 

V tomhle chyba teda není, zkus to předělat, jak jsem ti to poslal a pak napiš, jestli to jde... icon_e_wink.gif

 

Pokud ti to dělá tohle, tak špatně zabíjíš timer... hlídej si jestli nepracuješ se špatným id...

Edited by GaRGoyLeS
Link to comment
Share on other sites

  • 0

Spravil som to tak,ako si mi písal ale stále mi to nefunguje proste dám jail niekomu ide to úplne v pohode ale keď sa ten hráč odpojí a následne pripojí,tak ten textdraw ide po 2 sekundách napríklad to nejde 1.58,1.57 ale 1.58,1.56 a takto a keď sa mi odpyká trest tak stále píše Odpykal si si trest a stále ma to spawnuje....

Link to comment
Share on other sites

  • 0

Spravil som to tak,ako si mi písal ale stále mi to nefunguje proste dám jail niekomu ide to úplne v pohode ale keď sa ten hráč odpojí a následne pripojí,tak ten textdraw ide po 2 sekundách napríklad to nejde 1.58,1.57 ale 1.58,1.56 a takto a keď sa mi odpyká trest tak stále píše Odpykal si si trest a stále ma to spawnuje....

 

Jestli můžeš pošli mi ten fs, gm či co to je do pm ;) 

Link to comment
Share on other sites

  • 0

Opravil jsem to tím, že timer zabíjím v OnPlayerSpawn. Nedokážu pochopit proč se timer po odpojení nezabije a po dalším připojení jede po dvou sekundách (2x rychleji), dokonce se to po dalším připojení navyšuje (vždy se spustí znovu) .. což odpovídá tomu, že se Timer neukončí... zajímavé je i to, že pokud server mezitím vypnu a pak se připojím s nedokončeným odpočítáváním zase to je po 2 sekundách...

 

Vypadá to, jako by se buď Killnul špatný timer (jiná proměnná), nebo se špatnou hodnotou id, nebo kdyby se zapínal ještě někde před OnSpawnem.. Ovšem celý kód jsem prohledal na SetTimerEx a nikde navíc tam není, stejně tak se zabíjí i správny timer s nikde nepřehranou hodnotou... :( 

Link to comment
Share on other sites

  • 0

Není to třeba tím, že při každém spawnu spouštíte další timer? V průběhu hry pak bude na každého hráče x timerů, ale v proměnné budete mít jen jeden, který pak killnete.

  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

  • 0

Není to třeba tím, že při každém spawnu spouštíte další timer? V průběhu hry pak bude na každého hráče x timerů, ale v proměnné budete mít jen jeden, který pak killnete.

 

hallo.gif  to mě vůbec nenapadlo.. věnoval jsem se jen uvěznění po připojení, na to že se vykoná On..Spawn po SetPlayerPos jsem jak si nepomyslel. icon_e_wink.gif hallo.gif

Edited by GaRGoyLeS
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...