Jump to content
  • 0

pomoc Policajna kontrola


KuraMa

Dotaz

Mám znova problém,tento krát je problém v tom ,že keď mi ide dať hráč kontrolu tak mi všetko vypíše že kontrola vodicskeho preukazu atd.. ,lenže ma to necha zmrazeneho a ked nemam vodicak tak mi to neodpocita peniaze,ale tomu policajtovi co mi dal kontrolu tak to jemu odpocita peniaze ked nema vodičak.Ďakujem za odpovede.

Tu je kód:

 

 

//prikaz
ocmd:kontrola(playerid,params[])
{
new id,string[128];
if(Zamestnanie[playerid] == 0)return SendClientMessage(playerid,COLOR_CERVENA,"[!]Niesi policajt");
if(sscanf(params,"u",id))return SendClientMessage(playerid,COLOR_CERVENA,"Použi /kontrola [ID]");
if(!IsPlayerConnected(id))return SendClientMessage(playerid,COLOR_CERVENA,"Hráč neni pripojený");
if(!IsPlayerInAnyVehicle(id))return SendClientMessage(playerid,COLOR_CERVENA,"Hráč neni v aute!");
if(!GetDistanceBetweenPlayers(playerid,id)>10)return SendClientMessage(playerid,COLOR_CERVENA,"Niesi pri hráčovi");
format(string,sizeof(string),"Stoj! Policajt %s ti ide robit kontrolu",Meno(playerid));
TextDrawSetString(KontrolaVodicak2,string);
TextDrawShowForPlayer(id,KontrolaVodicak2);
SetTimerEx("stojtextdraw",2000,false,"i",id);
TogglePlayerControllable(id,false);
konieckontrola[id] = SetTimerEx("vodicaktextdraw",3000,false,"i",id);
return 1;
}
//prvy public
public vodicaktextdraw(playerid)
{
policajtkontrola[playerid] = SetTimerEx("kontrolavodicak",5000,false,"i",playerid);
TextDrawShowForPlayer(playerid,KontrolaVodicak);
return 1;
}
//druhy public
public stojtextdraw(playerid)
{
TextDrawHideForPlayer(playerid,KontrolaVodicak2);
return 1;
}
//a posledny public
public kontrolavodicak(playerid)
{
new id,string[128],string2[128];
TextDrawHideForPlayer(playerid,KontrolaVodicak);
if(vodicak[id] == 1)
{
	format(string,sizeof(string),"Hráč %s má vodičský preukaz",Jmeno(id));
	SendClientMessage(playerid,COLOR_CERVENA,string);
	SendClientMessage(id,COLOR_CERVENA,"Máš vodičský preukaz");
	TogglePlayerControllable(id,true);
	KillTimer(policajtkontrola[id]);
    KillTimer(konieckontrola[id]);
}
if(vodicak[id] == 0)
{
    Vyplata[playerid]+=5000;
    Money[id] -=5000;
    format(string2,sizeof(string2),"Dostal si pokutu od policajta %s [DOVOD:Nemal si vodičský preukaz]",Jmeno(playerid));
    SendClientMessage(id,COLOR_CERVENA,string2);
    TogglePlayerControllable(id,true);
    KillTimer(policajtkontrola[id]);
    KillTimer(konieckontrola[id]);
}
return 1;
}

 

 

Link to comment
Share on other sites

14 odpovědí na tuto otázku

Recommended Posts

  • 0


public kontrolavodicak(playerid)
{
new id,string[128];
TextDrawHideForPlayer(playerid,KontrolaVodicak);

if(vodicak[id] == 1) //jinak jistější by tu byl boolean ( new bool: vodicak[MAX_PLAYERS]
{
format(string,sizeof(string),"Hráč %s má vodičský preukaz",Jmeno(id));
SendClientMessage(id,COLOR_CERVENA,"Máš vodičský preukaz");
}
else if(vodicak[id] == 0)//jiank chyba byla v tom, že si zde nepoužil else if (pokud se nesplnila první podmínka (což je if(vodicak[id] == 1) automaticky to přeskočilo 2. podmínku a pokračovalo to ve zbylém kódu, tím else if docílíš toho, že dokud to nějakou podmínku, co je splněna nenajde "nebude pokračovat v kódu".
{
Vyplata[playerid]+=5000; //Zde máš nějakou svojí funkci, pravděpodobně si policista tento bonus vybere při výplatě
Money[id] -=5000; //Zase nějaká tvá funkce, je dost možné, že to peníze odčítá z banky, pokud nevíš jak to funguje radši použi standartní fci GivePlayerMoney
format(string,sizeof(string),"Dostal si pokutu od policajta %s [DOVOD:Nemal si vodičský preukaz]",Jmeno(playerid));
}

SendClientMessage(playerid,COLOR_CERVENA,string);//tohle bylo zbytečné, aby si to měl v každé podmínce, beztak by se to vykonalo v obou dvouch případech...
TogglePlayerControllable(id,true); //-||-
KillTimer(policajtkontrola[id]);//-||-
KillTimer(konieckontrola[id]);//-||-
return 1;
}

 

Edited by D@ndys
Link to comment
Share on other sites

  • 0

Zpravu, ze dostal hrac pokutu, posilas spatnemu hraci (policistovi).

 

Nerad mu boolean, kdyz mu je k nicemu. Neni to nijak jistejsi, je to jen useless a misto else if tam staci else. Vlastne jak na to ted koukam dal si mu sem stejne funkcni kod..

Link to comment
Share on other sites

  • 0

Boolean mi jistější přijde, protože zde vážně kontroluje jen true a false, pokud by to else napsal k této proměnné (bez booleanu) vykonalo by se to samé i kdyby, tam byla hodnota třeba 2(nebo -1,3,...) (prostě chyba - někde se přepsal), pokud by se ovšem někde snažil nacpat dvojku. nešlo by mu to.

 

K čemu teda ten boolean vlastně je, když je k ničemu? Pro srandu králíkům? :d 

 

PS: Zkoušel sis to vůbec? Jak jsem psal, když tam má pouze if, tak mu to nepůjde, ale s else if mu to půjde a je to funkční. Klidně koukni na wikinu, že žádný if, if, if tam nenajdeš... Blbost by to byla kdyby to negoval a dával tam returny...

Link to comment
Share on other sites

  • 0

Ehm, nějak nechápu tvůj příklad chyby? Pokud může použít boolean, pak počítáme s tím, že má dvě možnosti (má řidičák/nemá řidičák). 

if( ridicak == 1)
    ...
else
    ...

je pak stejné jako tvoje

if( ridicak == 1)
   ...
else if( ridicak == 0)
   ...
   

což je btw stejné jako

if ( ridicak ) // pokud počítáme s dvěma možnostma (1 a 0)
   ...
else 
   ...

Boolean je v pawn opravdu pro srandu králíkům. Klasická proměnná ti zabere 4 bajty (+- 2 miliardy range hodnot). Boolean proměnná pořád zabere v pawn 4 bajty, tudíž neušetříš žádnou paměť.

S proměnnýma navíc můžeš pracovat jako s boolean proměnnou (viz můj poslední kód nad timto textem), kdy 0 prezentuje false a všechny nenulové hodnoty true.

 

pozn. Pokud chce ušetřit paměť, ať přistupuje k jednotlivým bajtům.. 

 

Tak a teď jdeme zpochybnit tvůj kód.

if( ridicak == 1)
{

} else if( ridicak == 0) { // kontroluje se pokud se nesplní podmínka nad tímto
                           // protože se pohybujeme v hodnotách 0 a 1 (dá se přeci využít boolean ) 
                           // tak se tato podmínka splní vždy, když ne ta nad tím
                           // hmm co použít rovnou else místo else if
}

je analogické k 

if( ridicak == 1)
{

}
if (ridicak == 0) // kontroluje se i pokud se splní nad tímto, ale to nevadí, protože neupravujem hodnotu ridicaku ^^
{                 // takže pokud se splní nad tímto, nesplní se už tato 

}

Jediný problém by byl, pokud by při splnění první podmínky (ridicak == 1) nastavil ridicak na 0. Pak by se vykonala i druhá podmínka. Taky jeho kód kontroluje jak první podmínku, tak i druhou což v některých případech víc čase jako to tvoje, ale funkčnost zůstává stejná.

U tebe pokud se splní první podmínka, druhou už nekontroluje a blok druhé nevykonává vůbec. Funkčnost ale zůstává stejná.

 

Wiki slouží jako dokumentace, ne návod jak scriptovat. Navíc tam jsou někdy zastaralé způsoby. To nic nemění na tom, že klidně si if, if, if můžu použít záleží pak už jen na situaci, kdy se to hodí a kdy ne. V tomhle případě se mu zde spíš hodí if .. else (protože není důvod porovnávat druhou podmínku)

Edited by Lukasz
Link to comment
Share on other sites

  • 0

Btw.: nikde jsem nic o šetření paměti nepsal, max. v jiném topicu, tady mi šlo pouze o přehlednou a funkční podmínku. Ovšem dozvěděl, jsem se od tebe "novou věc" a to, že 0 prezentuje false a všechny nenulové hodnoty jsou true u normálních proměnných, takže pak už je boolean opravdu zbytečný. Můj cíl byl pouze vytvořit podmínku if ... else, ovšem jsem nevěděl o tomto faktu a stávající podmínku, jsem mu nechtěl měnit (takže jsem použil else if...). ;)

 

Každopádně teďka si poradil maximálně mě, ale proč to jemu nefunguje, k tomu si nic neřekl... :d 

Jinak kdyby sis přečetl první větu, měl bys z ní pochopit (možná jsem to napsal zmateně), že jsem nevěděl pouze o skutečnosti, že se normální proměnné chovají stejně jako boolean proměnné, takže sis mohl ušetřit tu práci s tím a napsat pouze tuto skutečnost, pak bych tvé předchozí snažení, mi to vysvětlit, bych pochopil. :d 

 

Každopádně by else if mělo být rychlejší (předpokládám, že to bude neznatelné :d ) než samotné if, které se vykoná, i když je podmínka nad ním pravdivá, ne? Chápu to správně? (když tak pm, ať tu není OT). ;):d

Edited by D@ndys
Link to comment
Share on other sites

  • 0

Fajn.

Chybu mas v tom, ze neinicializujes promennou id v public kontrolavodicak. A jeste mas zameneno playerid a id (zmrazis id, tak pak musis rozmrazit playerid a ne id)

Edited by Lukasz
Link to comment
Share on other sites

  • 0

Fajn.

Chybu mas v tom, ze neinicializujes prommenou id v public kontrolavodicak. A jeste mas zameneno playerid a id (zmrazis id, tak pak musis rozmrazit playerid a ne id)

~> Mě více překvapuje ta deklarovaná proměnná id v tom callbacku kontrolavodicak. Takže, ať kontroluje kohokoliv, odskáče to nakonec id 0. :d

Link to comment
Share on other sites

  • 0

Ten tvůj timer si předělej na toto (stačilo pouze přidat další parametr):

policajtkontrola[playerid] = SetTimerEx("kontrolavodicak",5000,false,"ii",playerid, id);

A takto má vypadat, public:

public kontrolavodicak(playerid, id) //pouprav si forward
{
	new string[128]; //před tím jsi tu deklaroval ("zakládal") proměnnou "id". Té si ovšem nijak nepřiřadil hodnotu, takže tam měla defaultně nastavenou nulu. Viz. ti to už napsal jak Lukasz tak i SkiBig18
	TextDrawHideForPlayer(playerid,KontrolaVodicak);
	
	if( vodicak[id] ) //pokud (pravdivá hodnota) , pravdivá hodnota = vše kolem 0, to sis mohl přečíst v naší konverzaci, nahoře  
	{
		format(string,sizeof(string),"Hráč %s má vodičský preukaz",Jmeno(id));
		SendClientMessage(id,COLOR_CERVENA,"Máš vodičský preukaz");
                SendClientMessage(playerid,COLOR_CERVENA,string);
	}
	else //jakýkoliv jiný případ
	{
	    Vyplata[playerid]+=5000;
	    Money[id] -=5000;
	    format(string,sizeof(string),"Dostal si pokutu od policajta %s [DOVOD:Nemal si vodičský preukaz]",Jmeno(playerid));
            SendClientMessage(id,COLOR_CERVENA,string);

	}
     
	TogglePlayerControllable(id,true);
	KillTimer(policajtkontrola[id]);
        KillTimer(konieckontrola[id]);
	return 1;
}

Doufám, že si pochopil, kde si udělal chybu, jestli ne, tak si raději ještě zeptej ať tu stejnou chybu znovu už neopakuješ. //A já doufám, že jsem někde něco nezapomněl :d

Edited by D@ndys
Link to comment
Share on other sites

  • 0

Tak a ještě si udělej

konieckontrola[id] = SetTimerEx("vodicaktextdraw",3000,false,"ii", playerid, id);

..
public vodcaktextdraw(playerid, id)

A není potřeba si nějak ukládat id timerů a pak je killovat. Máš vypnuté opakování a v době, kdy je rušíš už neběží.

A u Dandyse pořád posíláš zprávu o tom, žes dostal pokutu policajtovi :d

Link to comment
Share on other sites

  • 0

Jaj, chybička se našla, vůbec jsem se nekoukal, že po každý to posílá jinému id :d.

Jinak si myslím, že by sis na to zobrazování textdrawů mohl udělat třeba funkci. ;):d

Před chvilkou jsem si ji napsal: (Je to pouze pro předpoklad, že máš většinu módu dělanou přes textdrawy, který se zobrazí pouze na pár sekund)

forward TextDrawTimer(playerid, Text: text, time); //playerid, název textdrawu, čas (v sekundách) - jak dlouho má být textdraw zobrazen
public TextDrawTimer(playerid, Text: text, time)
{
 	TextDrawShowForPlayer(playerid, text);
 	SetTimerEx("HideTextDraw", 1000 * time, false, "ii", playerid, _:text);
}

forward HideTextDraw(playerid, Text:text);//po uplynutí času skryje textdraw
public HideTextDraw(playerid, Text:text)
{
	TextDrawHideForPlayer(playerid, text);
}

Jak se s tím pracuje, je v komentářích. 

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...