W jaki sposób zaprojektować komendę, aby odpowiadała naszym wymaganiom?
Podstawą jest funkcja:
register_concmd ( const cmd[], const function[], flags=-1, info[]="")
Definiujemy samą komendę, przypisujemy jej funkcję wywoływaną po wpisaniu komendy. Reszta jest opcjonalna i opiszę niżej. Użyta może być poprzez dowolną konsolę.
oraz jej 'siostra'
register_clcmd ( const client_cmd[],const function[], flags=-1, info[]="" )
Działa tak samo, tylko komenda użyta może być jedynie w konsoli gracza.
-----
Argumenty:
const cmd[] lub client_cmd[] - nazwa komendy; zwykle z prefiksem (np. amx_)
const function[] - nazwa publicznej funkcji, obsługującej naszą komendę
flags=-1 - flagi potrzebne do użycia komendy
info[]="" - opis parametrów funkcji
Przykład:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("komenda1","fnKomenda1");
register_concmd("komenda2","fnKomenda2",ADMIN_BAN);
register_concmd("komenda3","fnKomenda3",ADMIN_BAN, "<tekst> <liczba>");
}
public fnKomenda1(id)
{
console_print(id,"Uzyles komendy nr 1");
return PLUGIN_HANDLED;
}
public fnKomenda2(id,level,cid)
{
if (!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED;
console_print(id,"Uzyles komendy nr 2");
return PLUGIN_HANDLED;
}
public fnKomenda3(id,level,cid)
{
if (!cmd_access(id,level,cid,3))
return PLUGIN_HANDLED;
new tekst[64],szliczba[4],iliczba;
read_argv(1, tekst, 63);
read_argv(2,szliczba,3);
iliczba=str_to_num(szliczba);
console_print(id, "Uzyles komendy nr 3 z parametrami: %s %d",tekst,iliczba);
return PLUGIN_HANDLED;
}
Każda funkcja będąca wywoływana przez komendy powinna zwracać PLUGIN_HANDLED; trochę inaczej wygląda sprawa, jeśli komendy używamy przez czat.return PLUGIN_HANDLED; nie pozwoli wysłać do czatu podanej komendy natomiast return PLUGIN_CONTINUE; tego nie zablokuje.
komenda1 - bez argumentów, dostęp ma każdyNie wymaga komentarza
komenda2 - bez argumentów, dostęp ma gracz z flagą ADMIN_BANWarto opisać tu działanie
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED;Na podstawie argumentów funkcji sprawdza czy osoba używająca komendy ma odpowiednie flagi.
Dodatkowo sprawdza ilość parametrów komendy - tablica parametrów zaczyna się nazwą komendy więc wymagamy 1 argumentu. Odpowiada też za komunikat o brakujących parametrach i braku dostępu.
komenda3
Użyłem tutaj funkcji :
read_argv(1, tekst, 63);
Jak wspomniałem wartość 0 to nazwa komendy, stąd prosimy o 1. Ta linia pobiera pierwszy parametr komendy i zapisuje do zmiennej 'tekst'. Pamiętamy o wolnym znaku na /0 (zmienna tekst ma 64 indeksy, a pobieramy 63 znaki).
Podobnie z drugim parametrem, który jednak używać będziemy jako liczby - dlatego pobieramy do stringai konwertujemy do liczby całkowitej funkcją
str_to_num();
Analizując ten tekst można się domyślić, że komendy o podobnej konstrukcji działania może obsługiwać jedna funkcja:
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "New Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("komenda1","fnKomenda");
register_concmd("komenda2","fnKomenda",ADMIN_BAN);
register_concmd("komenda3","fnKomenda",ADMIN_BAN, "<tekst> <liczba>");
}
public fnKomenda(id,level,cid)
{
new cmd[32];
read_argv(0, cmd, 31);
if(equal(cmd,"komenda1"))
{
console_print(id,"Uzyles komendy nr 1");
}
else if(equal(cmd,"komenda2"))
{
if (!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED;
console_print(id,"Uzyles komendy nr 2");
}
else if(equal(cmd,"komenda3"))
{
if (!cmd_access(id,level,cid,3))
return PLUGIN_HANDLED;
new tekst[64],szliczba[4],iliczba;
read_argv(1, tekst, 63);
read_argv(2,szliczba,3);
iliczba=str_to_num(szliczba);
console_print(id, "Uzyles komendy nr 3 z parametrami: %s %d",tekst,iliczba);
}
return PLUGIN_HANDLED;
}


Dodatki SourceMod













