Pravljenje prostih admin komandi

Započeo V01D, Jun 15, 2018, 15:41:29 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Cao svima,danas pravimo admin komandu.Objasnicu vam kako se to radi,kako se koristi zcmd i sscanf.
Linkovi:
http://forum.sa-mp.com/showthread.php?t=602923 - SSCANF 2
http://forum.sa-mp.com/showthread.php?t=91354 - ZCMD

Pre svega idemo include ta dva plugina:
[pawn]#include <zcmd>
#include <sscanf2>[/pawn]

Kada smo includovali ove 2 baze podataka, idemo na pravljenje komandi.Nadjete mesto kod ostalih komandi i napravite mesta za novu.

Prva linija ce biti :
[pawn]CMD:fine[playerid, params[]) [/pawn]

Sada smo kreirali novu komandu fine,playerid se odnosi na igraca.Uglavnom sada idu { } simboli.Oni oznacavaju kraj i pocetak komande.

[pawn]CMD:fine[playerid, params[])
{

}
[/pawn]

Sada cemo unutar { } simboli odraditi ono sto ce nasa komanda raditi.Uglavnom se na pocetku komande nalaze provere za admine,lidere,gamemastere itd.Tako da ukoliko je neko tipa Admin manji od 2 ne moze koristiti komandu.

Provera se radi sa IF sto prevedeno sa engleskog znaci AKO.Znaci mi postavljamo pitanje "Ako je igrac admin manji od 1 uradi sledece..."

To bi izgledalo ovako :
[pawn]if(PlayerInfo[playerid][pAdmin] < 1 ) return SendClientMessage(playerid, -1, "Ne mozes koristiti ovo zato sto nisi admin!");[/pawn]

Sada ukoliko neko ukuca komandu /fine a nije admin ispisuje mu tekst Ne mozes koristititi ovo zato sto nisi admin!.Takodje mozete da umesto SendClientMessage da stavite sledece:
[pawn]if(PlayerInfo[playerid][pAdmin] < 1) return Kick(playerid);[/pawn]
Ukoliko neko kukuca /fine a nije admin kikovace ga :D  .

Sada nakon provere idemo da dodamo par stvari:
[pawn]new igrac,tekst[512],novac,razlog;[/pawn]

Sada smo bukvalno dodali varijable igrac(to ce nam biti igrac na kome primenjujemo komandu),tekst[512](tekst koji pisemo igrac-u i playerid-u.512 oznacava duzinu teksta),novac(novac koji cemo oduzeti igracu).

Napomena - playerid je za onoga ko koristi komandu a na "igrac" se upotrebljava komanda.Igrac je poremljiva,znaci moze se menjati.

Sada cemo iskoristiti sscanf2 plugin

[pawn]if(sscanf(params, "uds[512]",target,novac,razlog)) return SendClientMessage(playerid, -1, "UPOTREBA | /fine [ID] [NOVAC] [RAZLOG]");[/pawn]

Znaci sada ako korisnik ukuca samo /fine ili ne ispuni podatke iz sscanf-a onda mu izbaci poruku za upotrebu.
E sada znaci verovatno se pitate sta je "ud" ?
U zavisnosti sta smo prvo stavili,posto sam ja prvo stavio target znaci to je igrac onda koristimo "u " ,zatim se menja u novac sto je broj, i posle razlog
sto je string.Znaci idemo "u" pa zatim ide broj sto je "d" i string "s[broj duzine]".Sada kada se to spoji u jedno, ispada "uds[512]"
Tutorial samo za sscanf mozete naci klikom na : LINK

Da nastavimo dalje...

Nakon sto smo odradili deo za sscanf,znaci ukoliko igrac ne ukuca sve potrebne podatke,izbacuje mu upotrebu.

Sada cemo da dodamo ispod svega ovoga
[pawn]else
{

}[/pawn]

Znaci ako je igrac prosao sve provere,ide na sledece izmedju ovih zagrada ispod else :
Posto pravimo komandu za fine,hocemo da se igracu oduzme novac
Za to koristimo:
[pawn]GivePlayerMoney(igrac,-novac);[/pawn]

U ovoj funkciji ce da igracu(onom kome smo uneli ID) oduzeti vrednost novca koju smo uneli.Jos jedna upotreba ove funkcije je da se da igracu odredjen novac,ako je taj slucaj obrise se "-novac" i ubacite svoj novac.Ako cete da se oduzima ide - ispred.Ukoliko hocete da date sebi umesto "igrac" ide "playerid".

Sada cemo da stavimo da igracu pise nekakva poruka.To radimo preko funkcije :

[pawn]format(string,sizeof(string), "Oduzet ti je novac od strane admina : %s | Kolicina : %d | Razlog: %s ",GetPlayerName(playerid),novac,razlog);[/pawn]

Pomocu ovoga smo samo formatirali tekst unutar " " .
%s - to je za stringove,tacnije tekst
%d - za brojeve
Posle zareza stavljamo vrednosti koje ce da se ispisu pomocu %s ili %d.Znaci vrednosti idu redom,znaci ako je prvo %s na redu,mora posle zarezi biti string,tacnije tekst.
GetPlayerName(playerid) - Uzima ime od playerid-a tacnije onoga ko je kucao i iskoristio komandu.
novac - varijabla novca koji ce biti oduzet/dat
razlog - razlog koji smo upisali

Sada cemo tu poruku poslati igracu kome je oduzet novac :

[pawn]SendClientMessage(igrac, -1, string);[/pawn]

SendClientMessage - sluzi da se neka poruka posalje igracu
igrac - Onaj kome ce poruka biti poslata,ukoliko stavimo playerid,poruku ce slati igracu koji je ukucao komandu
-1 - Boja,boje takodje mozete dodavati u tekstu ukoliko su definisane primer : ""CRVENA"Cao
string - to je ona varijabla koju smo formatirali,tacnije tekst

Sada mozete odraditi isto tako samo sto umesto igrac stoji playerid pri SendClientMessage.Pod format ce biti sve isto umesto teksta

Primer :
[pawn]format(string,sizeof(string), "Oduzeo si igracu novac : %d | Razlog:%s",novac,razlog);
SendClientMessage(playerid, -1, string);[/pawn]

Ista stvar kao i gore samo sta salje drugaciju poruku igracu koji je iskoristio komandu.

Sve u svemu komanda izgleda ovako :
[pawn]CMD:fine[playerid, params[])
{
    if(PlayerInfo[playerid][pAdmin] < 1 ) return SendClientMessage(playerid, -1, "Ne mozes koristiti ovo zato sto nisi admin!");
    new igrac,tekst[512],novac,razlog;
    if(sscanf(params, "uds[512]",target,novac,razlog)) return SendClientMessage(playerid, -1, "UPOTREBA | /fine [ID] [NOVAC] [RAZLOG]");
    else
    {
         GivePlayerMoney(igrac,-novac);
         format(string,sizeof(string), "Oduzet ti je novac od strane admina : %s | Kolicina : %d | Razlog: %s ",GetPlayerName(playerid),novac,razlog);
         SendClientMessage(igrac, -1, string);
         format(string,sizeof(string), "Oduzeo si igracu novac : %d | Razlog:%s",novac,razlog);
         SendClientMessage(playerid, -1, string);
    }
    return 1;
}
[/pawn]

To bi bilo to,ukoliko imate pitanje,slobodno pitajte ili ukoliko vam nesto nije bilo jasno.Ovo je moj prvi tutorial tako da budite blagi :) :D  8)




Pohvale na trudu ali ima par grešaka..A s obzirom da su tutorijali namijenjeni za početnike to bi trebalo biti bez grešaka jer bi inače moglo zbuniti početnike i naučiti ih skroz pogrešno.

1.
CitatKada smo includovali ove 2 baze podataka

Baze podataka?Ha?
http://www.znanje.org/abc/tutorials/accessMMX/01/Baze_podataka.htm

2.

Citatnew igrac,tekst[512],novac,razlog;

Sam si rekao,citiram "512 oznacava duzinu teksta)" zašto onda stavljaš 512 ako koristiš manje od 100 karaktera?
Primjer teksta:



3.

Ne znam jesi li uopće testirao ovu komandu ali "razlog" ti nebi radio.Odnosno nebi ga pravilno ispisivalo.

Citatsscanf(params, "uds[512]",target,novac,razlog))

Ovdje koristiš razlog kao uspisivanje stringa ali nisi isto označio iznad što znači da nebi ispisivalo pravilno razlog.(I opet 512...)
Ako ne shvaćaš što točno nije dobro sa "razlog" pogledaj ponovo ovdje kako si označio :

Citatnew igrac,tekst[512],novac,razlog;

Ispravno bi bilo

Citatnew igrac,tekst[128],novac,razlog[20];
sscanf(params, "uds[20]",target,novac,razlog))


4.


CitatSada cemo da dodamo ispod svega ovoga
[pawn]else
{

}[/pawn]

....
....
....

Volio bih da mi objasniš svoju logiku čemu else ovdje?
Ako igrač ne proÄ'e jednu od provjera svejedno neće doći do else-a jer će ga vratiti(return) koji si stavio.Tako da je else potpuno nepotrebno i samo će zbuniti početnike.

5.

CitatGetPlayerName(playerid)

Tako kako si ga ti koristio u komandi se ne može koristiti.
Pogledja kako se koristi:
http://wiki.sa-mp.com/wiki/GetPlayerName

Citat: Paul Castellano poslato Jun 16, 2018, 11:04:30 PRE PODNE
Pohvale na trudu ali ima par grešaka..A s obzirom da su tutorijali namijenjeni za početnike to bi trebalo biti bez grešaka jer bi inače moglo zbuniti početnike i naučiti ih skroz pogrešno.

1.
Baze podataka?Ha?
http://www.znanje.org/abc/tutorials/accessMMX/01/Baze_podataka.htm

Hvala pre svega na odgovoru.
1.Tako su me ucili pre 2 godine u skoli.Kako su to baze podataka.Hvala sto si mi ispravio gresku.

Citat: Paul Castellano poslato Jun 16, 2018, 11:04:30 PRE PODNE
2.

Sam si rekao,citiram "512 oznacava duzinu teksta)" zašto onda stavljaš 512 ako koristiš manje od 100 karaktera?
Primjer teksta:

2.To si u pravu.Mada sam stavljao 512 radi primera.U zavisnosti od komande razlicita je duzina teksta.To je radjeno da ne bi kopirali komandu,nego da nesto nauce.Sve je objasnjeno,takodje da se duzina teksta stavlja u zavisnosti od potreba.
Citat: Paul Castellano poslato Jun 16, 2018, 11:04:30 PRE PODNE
3.

Ne znam jesi li uopće testirao ovu komandu ali "razlog" ti nebi radio.Odnosno nebi ga pravilno ispisivalo.

Ovdje koristiš razlog kao uspisivanje stringa ali nisi isto označio iznad što znači da nebi ispisivalo pravilno razlog.(I opet 512...)
Ako ne shvaćaš što točno nije dobro sa "razlog" pogledaj ponovo ovdje kako si označio :

Ispravno bi bilo
Potpuno sam to zaboravio.Moja greska i izvinjavam se na tome....
Citat: Paul Castellano poslato Jun 16, 2018, 11:04:30 PRE PODNE
4.


....
....
....

Volio bih da mi objasniš svoju logiku čemu else ovdje?
Ako igrač ne proÄ'e jednu od provjera svejedno neće doći do else-a jer će ga vratiti(return) koji si stavio.Tako da je else potpuno nepotrebno i samo će zbuniti početnike.
Kao sto sam napomenuo gore,tako sam ucio da radim.Po meni je to laksi nacin,nisam siguran kako je ostalima...
Citat: Paul Castellano poslato Jun 16, 2018, 11:04:30 PRE PODNE
5.

Tako kako si ga ti koristio u komandi se ne može koristiti.
Pogledja kako se koristi:
http://wiki.sa-mp.com/wiki/GetPlayerName

Opet moja greska,ispravio bih malo temu kada bih mogao.Hvala sto si mi ukazao na greske,cenim to :) :D <3

CitatKao sto sam napomenuo gore,tako sam ucio da radim.Po meni je to laksi nacin,nisam siguran kako je ostalima...

Nema ti šta bit lakše ne bit kada je to pogrešno :) To se ne koristi u tom slučaju u kojem si ga ti koristio.Else znači inače,ako nijedna od provjera nije istinita.Ali u tvom slučaju on ne može doći do else-a.

Citatif(PlayerInfo[playerid][pAdmin] < 1 ) return SendClientMessage(playerid, -1, "Ne mozes koristiti ovo zato sto nisi admin!");

U prijevodu znači:
Ako je pAdmin manji od 1 --> vraća ga sa porukom(SCM) .Znači skripta dalje ne provjerava ništa.Ako je igrač manji od pAdmin1 tu sve staje za njega,ne može proći dalje :))

Tako da ako igrač nije A1 ili nije ispravno unio parametre on nikad neće doći do else-a.Defintivno to nebi trebao koristiti u ovakvim slučajevima.