[TUT] Ban/Unban [zcmd+sscanf2]

Započeo dock, Septembar 03, 2012, 23:12:00 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

Evo ovako, secam se dok sam pocinjao scriptati i bilo koji mod da se uzme editovati tada (tipa ravens, gf, gtarp itd.) nije imao neki valjan BAN/UNBAN sistem, uglavnom se koristila Ban(playerid); funkcija, i koliko se secam unbanati se nije moglo cak ni preko rcona (meni nije poslo od ruke :D) ... Zato sam odlucio napraviti ovaj tut u vezi BAN/UNBAN sistema i nadam se da ce nekom pomoci ...

Sta je potrebno?

- ZCMD include fajl, sscanf2 plugin

Hajde da pocnemo. Za pocetak cemo definisati mesto za ban (ban file)


#define BanFolder "/Banani/%s.ini"


Ovo ce nam trebati da bismo imali gde da cuvamo ban fajlove (.ini fajl se koristi (bez obzira sto ne koristimo dini, y_ini.. (ne mora biti ali to je jednostavno stvar navike .. za sve koristim .ini pa i za to :)))

Naravno ovaj folder (Banani) morate imati u scriptfiles folderu da vam server nebi padao kad god koristite BAN komandu.

Hajde sada da pocnemo da pravimo komandu BAN:

Prvo sto treba da se uradi jeste da se zapocne komanda kao sto svaka u ZCMDu i pocinje:


CMD:ban(playerid,params[])
{


Sada cemo ispisati potrebne parametre za komandu pomocu sscanfa:


new id, razlog[32];
if(sscanf(params,"us[32]",id,razlog)) return SendClientMessage(playerid, -1, " >> Koristi: /ban [id igraca] [razlog]");


Ovde id predstavlja id igraca kojeg cemo banati, razlog predstavlja razlog bana (mozete videti da je boja -1, to je jos jedan nacin napisati belu boju... koristicemo osnovne boje da nebih morao da definisem boje).

Sada cemo napraviti proveru da li je igrac admin (ja cu staviti RCON admina da moze banati, vi naravno zamenite sa vasom varijablom za admina bez obzira da li to bio enum ili pvar :))


if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xff0000aa, " >> Nisi admin!");


IsPlayerAdmin je provera da li je igrac ulogiran kao RCOn admin ( ! ispred znaci da ukoliko igrac nije admin server ispise ovu poruku.)

Sada da nastavimo ka ostatku komande, prvo cemo ispisati sve poruke koje izlaze i igracu i adminu i svim igracima naravno (moraju ljudi videti ko je banan inace nista nismo uradili :D)...


new str[128];
new ime[MAX_PLAYER_NAME]; GetPlayerName(playerid, ime, sizeof(ime));
new igrac[MAX_PLAYER_NAME]; GetPlayerName(id, igrac, sizeof(igrac));
format(str,128," BAN - Banali ste igraca %s. Razlog: %s", igrac, razlog);
SendClientMessage(playerid, 0xffff00aa, str);
format(str,128," BAN - Dobili ste ban od admina %s. Razlog: %s", ime, razlog);
SendClientMessage(id, 0xff0000aa, str);
format(str,128," BAN - Igrac %s je dobio ban od admina %s. Razlog: %s",igrac, ime, razlog);
SendClientMessageToAll(0xff0000aa, str);


str - string koji formatujemo u textove koje cemo poslati
ime - ime admina
igrac - ime igraca koji je banan

Sada kada smo svima fino rekli da je igrac banan hajde i da ga banujemo :D


new banfile[64];
format(banfile,64,BanFolder,igrac);
new File:ban = fopen(banfile, io_write);
fwrite(ban, " - BAN - \n");
new var[64]; format(var,64,"Admin = %s\n", ime);
fwrite(ban,var);
new var[128]; format(var,128,"Razlog = %s\n", razlog);
fwrite(ban,var);
fclose(ban);
Kick(id);


Da objasnimo ovo ovde ima puno za objasniti :D

banfile - je mesto gde se nalazi ban (moramo ga formatirati da bi mogli ubaciti ime igraca..)
ban - to je FAJL. Uz pomoc njega pisemo u fajl sta nam treba.
fopen - otvara se fajl
io_write - znaci da zapisuje u fajl sve sta treba (brise sve sto je bilo pre), ili ako fajl ne postoji pravi ga pa pocinje da pise
fwrite - zapisuje red u fajlu
var - formatirana varijabla, da zapisemo koji je admin banao igraca, i sa kojim razlogom ..
fclose - Na kraju zatvaramo fajl.
Kick(id); - izbacuje igraca sa servera...

Sada kada smo zavrsili sve ovo zatvaramo komandu:


return 1;
}


E sada kada smo konacno banali igraca treba namestiti da taj isti igrac NE moze da se vrati na server. Pod OnPlayerConnect je potrebno ubaciti da proverava ime igraca, proverava da li je banan, ukoliko je to tacno, izbaci ga sa servera (neda mu da se konektuje)... To radimo ovako:


new ime[MAX_PLAYER_NAME]; GetPlayerName(playerid, ime, sizeof(ime));
new banfile[64];
format(banfile,64,BanFolder,ime);
if(fexist(banfile))
{
SendClientMessage(playerid, -1, " Banan si sa ovog servera.");
SendClientMessage(playerid, -1, " Ukoliko zelis ponovo da igras, trazi unban na forumu.");
SendClientMessage(playerid, -1, " Forum link: www.vas.forum");
Kick(playerid);
return 1;
}


ime - to je ime igraca koje proveravamo da li je banano
banfile - kao malopre formatiran direktorijum gde se trazi da li je korisnik banovan
fexist - znaci da fajl postoji (fexist(banfile) - znaci da ukoliko postoji BANFILE uradi sta pise ispod)

Sta se desi kada igrac udje i njegovo ime stoji u folderu Banani:

Dobije 3 poruke koje su gore ispisane, zatim je kickan sa servera. Pozeljno je da se ovo stavi na pocetak OnPlayerConnect kako bi se izbeglo pojavljivanje drugih poruka, dialoga i slicno...

Sada kada smo zabranili igracu da ulazi potrebana je komanda unban da igraca i unbana. Iz dela gore znate kako pocinje i zavrsava se komanda pa cu napisati celu te je objasniti fino :)


CMD:unban(playerid,params[])
{
    new imeigraca[24];
if(sscanf(params,"s[24]",imeigraca)) return SendClientMessage(playerid, -1, " >> Koristi: /unban [TACNO ime igraca]");
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xff0000aa, " >> Nisi admin!");
new str[128];
new banfile[64];
format(banfile,64,BanFolder,imeigraca);
if(!fexist(banfile)) return SendClientMessage(playerid, 0xff0000aa, " >> Igrac nije banovan!");
    format(str,128," UNBAN - Unbanali ste igraca %s", imeigraca);
SendClientMessage(playerid, 0xffff00aa, str);
fremove(banfile);
return 1;
}


SSCANF koristimo kao i malopre, jedina razlika sto se sada koristi novi new a to je imeigraca (to je ime igraca koje unbanamo).
str - isto sluzi za formatiranje poruke koja ide igracu
banfile - opet nas vodi do direktorijuma gde se nalazi ban igraca
!fexist - isto kao fexist samo sto ovaj ! ispred znaci da se gleda UKOLIKO NE POSTOJI FAJL (najlakse objasnjeno UKOLIKO NE POSTOJI FAJL URADI SLEDECE: a to je ispisati poruku da fajl ne postoji).
na kraju fremove sluzi da se fajl obrise i ponovo dozvoli igracu da udje.

Ja bih reko da je to to uvezi ban/unban sistema. Ne znam da li je sada vise frka oko toga uopste kao sto je pre bila, ali se secam da sam se dosta mucio oko toga jer niko nije znao to da uradi, a ko je znao cuvao je to za sebe, tako da sam odlucio da pomognem nekom ko ne zna.

Nadam se da je bilo od pomoci, mislim da problema nece biti (ali uvek je moguce jer se ovo ne nalazi ni u jednom modu - kucao sam ispocetka...)

Moram jos napomenuti ZAHVALJUJEM KARIKI jer sam preko njegove FS naucio kako se ovo radi i preko toga pravio razne sisteme. Ovo je po ugledu na tu FS (nije ta FS prebacena u tut jednostavno isto je jer nema tu neke velike nauke to je sto je i nemoze se drukcije napraviti :) na ovaj nacin bar.. :) )

To je to od mene pozdrav.
Poslednja Izmena: Septembar 08, 2012, 02:13:50 PRE PODNE od dock

Capetroon.

Mnogo mnogo svima može pomoći ovaj tut, može se preko skoro sve, predobar! 10/10!


Sve newove koje sam koristio sam objasnio koja cemu sluzi, a i nije cilj dati im komandu odma jer NIKO ama bas NIKO nece procitati tut ako imas mogucnost copy-paste.. to nije cilj tutoriala pa logicno ni moj cilj, moj cilj je da naucim nekog nesto a ne da mu serviram na tacni pa da samo kopira i da uopste ne razmislja sta je zapravo kopirao (kao sto sam ja radio kada sam pocinjao, sto mi je mnogo otezalo dalje ucenje, samo sam c/p i cao zdravo... nije to cilj)..

Sve u svemu hvala na komentaru :D





Da svaki pocetnik ovo detaljno procita neke bi stvari skuzio. Svaka cast pohvala za tut! Nadam se da ce jos biti tutorijala od tebe :)


Svaka cast!!!
10 / 10 al ja svoje nemogu napraviti  :(
Moji Radiovi!
TuT||Iz code u MTA


Super tut, samo komande i funkcije malo ljepše piši. ;)

Prvo pohvala na trudu trebalo je ovo sve i napistai.
Drugo jako opsirno i lijepo objasnjeno
Trece Jako ce pomoci pocetnicima jer bez /ban & /unban komande dabe srv haha
Cetvrto samo nastavi ovako s TuT-orijalima dobar si

Koristio si parametar I u sscanfu,to je INTEGER VALUE a ne STRING.

new id, razlog[128]; // 128 zato sto toliko moze da stane u chat
if(sscanf(params,"uz[128]",id,razlog)) return SendClientMessage(playerid, -1, " >> Koristi: /ban [id igraca] [razlog]");


Da ne ispadnem budala:
8)

http://wiki.sa-mp.com/wiki/Fast_Commands

z Optional string A reason e.g. Ban Reason, only optional at the end of a format string
Izvinjavam se na svim glupostima i ako sam nekome napisao nesto lose, neko drugi je koristio moj profil!
__________________________________________
https://bk.gta.world - GTA World Balkan - RAGEMP