Jump to content

[TuT/Script] Ban na určitou dobu (časový ban)


Patrony

Recommended Posts

Takže, koukal jsem tak po fóru co tu je a co tu nění a přemýšlel co bych mohl ve volném čase udělat za scriptík. No nakonec mě napadlo trochu si procvičit práci s časem a datumem a udělat časový ban. Funguje to tak, že zadáte na jak dlouho bude mít hráč ban (roky, měsíce, dny, hodiny, minuty a vteřiny). Protože je lepší ho mít vbudovaný do modu a ne do filterscriptu, tak přidělám i návod jak...

 

1. část - Download

 

Celý script ke stažení (.pwn, .amx) i s include do pawna zde:

http://uloz.to/xAE4idt/timeban-rar

 

2. část - Funkce v include

 

include obsahuje 2 proměnné, které jsou dále použity v kódu:

BanedID - ID hráče, který bude zabanovaný

BanTime - čas, na jak dlouho bude ban udělen (ve formátu: R:M:D:H:M:S)

 

A následující funkce:

BanedIPListCreate() - tato funkce se volá automaticky, vytváří soubor kam se zapisují bany

AddBanedIp(IP[],time[]) - tato funkce přidá do seznamu banů IP adresu s už naformátovaným časem (volá se automaticky)

FindBannedIp(IP[]) - zkontroluje jestli je IP adresa v seznamu zabanovaných a případně vrátí příslušný řádek

TimeFromString(time[], TimeArray[][]) - No převede čas z formátu R:M:D:H:M:S do 2 rozměrného pole

CompareDates(TimeArray[][]) - tato funkce porovná aktuální datum s datem které je obsaženo v 2 rozměrném poli

SetBanTime(bantime[]) - funkce, která z délky banu kterou zadáte vygeneruje datum unbanu

IsPlayerBanned(playerid) - funkce zkontroluje jestli je IP zabanovaná nebo ne

PlayerIP(playerid) - zjistí hráčovu IP a vratí její podobu

GiveTimeBanToPlayer(adminid, process, time[]) - funkce, která používá dialog k nastavení délky banu apod... tato funkce je vlastně jen ukázkou toho jak script funguje.

RemoveIp(IP[]) - odstraní zablokovanou IP ze seznamu (banlistu)

BanPlayer(playerid, time[]) - okamžitě zablokuje hráčovu IP bez nutnosti zadávání hodnoty do dialogu. (Použití: BanPlayer(playerid, "0:0:0:2:0:0"); - zabanuje hráče na 2 hodiny)

 

3. část - Kód do modu/scriptu

 

Definice dcmd kvůli příkazu pro ban:

#define dcmd(%1,%2,%3) if((strcmp((%3)[1],#%1,true,(%2))==0)&&((((%3)[(%2)+1]==0)&&(dcmd_%1(playerid,"")))||(((%3)[(%2)+1]==32)&&(dcmd_%1(playerid,(%3)[(%2)+2]))))) return 1

 

Tento script funguje tak, že při "zabanování" hráče nebude doslova zabanován, ale bude jeho IP adresa zablokována. Proto musí být v public OnPlayerConnect(playerid) podmínka, která kontroluje zda je IP adresa připojujícího-se hráče zablokována nebo ne. Pokud je zablokována tak je hráč vykopnut. Script funguje tak, že pokud je IP zablokována, rovnou to zkontroluje, jestli už nevypršela doba banu. pokud už doba banu vypršela, pak to hráče na server pustí. pokud ne tak ho to vyhodí.

 

public OnPlayerConnect(playerid)
{
if(IsPlayerBanned(playerid)) // kontroluje jestli je IP blokována
{ // pokud ano spustí se následující kód
    new string[255], IP[16], TimeArray[6][5];
	format(IP, 255, "%s-",PlayerIP(playerid));
	format(string, 255, "%s",FindBannedIp(IP));
	strdel(string,0,strlen(IP));
	TimeFromString(string, TimeArray); // získá datum unbanu
	if(CompareDates(TimeArray)) // porovná dnešní datum a datum unbanu
	{ // pokud doba banu vypršela je odbanován
	    format(string, 255, "%s-",PlayerIP(playerid));
	    RemoveIp(string); // odblokuje
		SendClientMessage(playerid, 0xFFFFFFF, "Doba tvého banu vypršela.");
	}
	else // pokud nevypršela je vykopnut
	{
		SendClientMessage(playerid, 0xFFFFFFF, "Byl jsi zabanován na tomto serveru!");
		Kick(playerid);
	}
}
return 1;
}

 

Co se samotného banování týče, udělal jsem názornou ukázku toho jak by mělo vypadat.

Hráč zadá příkaz /timeban ID a objeví se dialog, kam se zadá doba banu v poměrně nepraktickém formátu:

R:M:D:H:M:S

tedy

Roky:Měsíce:Dny:Hodiny:Minuty:Sekundy

 

Příkaz:

public OnPlayerCommandText(playerid, cmdtext[])
{
   dcmd(timeban,7, cmdtext);
return 0;
}

dcmd_timeban(playerid, params[])
{
       if (!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,0xFF0404FF,"Příkaz pouze pro adminy RCON!"); // Zde si dejte vlastní podmínku podle toho, kdo bude moct příkaz použít
if (strlen(params)==0) return SendClientMessage(playerid,0xFF0404FF,"Použij [/timeban ID]");

BanedID = strval(params); // nastaví se proměnná BanedID
if(!IsPlayerConnected(BanedID)) return SendClientMessage(playerid,0xFF0404FF,"Hráč s tímto ID není připojen!");

GiveTimeBanToPlayer(playerid, 0, ""); // spustí se dialog atd..
return true;
}

 

Poté se klikne na tlačítko Ban a zobrazí se další dialog který je něco jako potvrzení banu a zároveň se může zadat i důvod banu.

 

Proto se musí ještě nastavit public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])

 

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
   if(dialogid == (2*MAX_PLAYERS)+playerid) // (2*MAX_PLAYERS)+playerid zajistí vždy originální ID dialogu
   {
       if(!response) return 0;
       if(strlen(inputtext) < 11 || strlen(inputtext) > 23) return SendClientMessage(playerid,0xFF0404FF,"Zadal jsi špatný formát!");
	format(BanTime, sizeof(BanTime), "%s", inputtext);
	GiveTimeBanToPlayer(playerid, 1,BanTime);
       return 1;
   }
   if(dialogid == (3*MAX_PLAYERS)+playerid)
   {
       if(!response) return 0;
       new msg[1024], Pname[25], TimeArray[6][5], Aname[25];
       GetPlayerName(BanedID, Pname, sizeof(Pname));
       GetPlayerName(playerid, Aname, sizeof(Aname));
       TimeFromString(BanTime, TimeArray);
       format(msg, sizeof(msg), "Hráč %s byl zabanován administrátorem %s na %s let, %s měsíců, %s dní, %s hodin, %s minut, %s sekund [Důvod: %s]",Pname,Aname,TimeArray[0],TimeArray[1],TimeArray[2],TimeArray[3], TimeArray[4], TimeArray[5], inputtext);
       SendClientMessageToAll(0xFF0404FF, msg);
       printf("[TimeBan] %s", msg);
       BanPlayer(BanedID, BanTime); // zablokuje IP hráče
       Kick(BanedID); // a vyhodí ho ze serveru
   }
return 1;
}

 

pro ty zaostalejší: celé jsem to dělal sám a nic z toho není "copy" takže se toho ušetřete

Link to comment
Share on other sites

  • Replies 61
  • Created
  • Last Reply

Top Posters In This Topic

Twl GOOD tut :thumbup: ,akorát tam chybí podmínka na rcon (možna jsem ji přehlédl xD). Protože time je zbytecne zdlouhavý tak by se tam mohlo něco doladit př.když dam /Voteban id tak se zobrazí 6boxu na rok,měsíc,den,hodina,minuta,sec(tam kliknu třeba na hodina,otevře se další okno a tam bude počet hodin). GOOD 10/10

Link to comment
Share on other sites

Twl GOOD tut :thumbup: ,akorát tam chybí podmínka na rcon (možna jsem ji přehlédl xD). Protože time je zbytecne zdlouhavý tak by se tam mohlo něco doladit př.když dam /Voteban id tak se zobrazí 6boxu na rok,měsíc,den,hodina,minuta,sec(tam kliknu třeba na hodina,otevře se další okno a tam bude počet hodin). GOOD 10/10

jo ta podmínka na rcon tam není... dělal jsem to jen jako ukázku, každý si to může už udělat podle sebe. K tomu je to inc aby se to dalo použít u více věcí třeba u toho /voteban apd.. jinak dik :d

Link to comment
Share on other sites

  • 3 weeks later...
  • 2 weeks later...

Nechyba tam podmienka pre admina ? mohol si ju doplnit :d lebo teraz si pride nejaky jefo na serveru , a vsetkych zbanuje :d IsPlayerAdmin(playerid) si mohol dat :p

 

ale aj tak je to dobre, davam 9,5/10 :)

Link to comment
Share on other sites

Nechyba tam podmienka pre admina ? mohol si ju doplnit :d lebo teraz si pride nejaky jefo na serveru , a vsetkych zbanuje :d IsPlayerAdmin(playerid) si mohol dat :p

 

ale aj tak je to dobre, davam 9,5/10 :)

Už si děláte srandu ne? KAŽDEJ si tam snad dokáže dát podmínku... kašlu na vás jdu ji tam dát, komentáře typu "nemáš tam podmínku pro admina" mě už štvou.

Link to comment
Share on other sites

  • 1 month later...
prosím vás kde sa tam mení príkaz? v jakom riadku? možno som slepý, neviem to tam nájsť.

 

pravdepodobne neovladas dcmd

dcmd_timeban(playerid, params[])

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