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; }