Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Guest Message by DevFuse
Wiru
Rejestracja: 09.01.2011Aktualnie: Nieaktywny
Poza forum Ostatnio: 31.03.2013 23:02
Statystyki
- Grupa: Użytkownik
- Całość postów: 54
- Odwiedzin: 3 871
- Tytuł: Pomocny
- Wiek: 39 lat
- Urodziny: Marzec 3, 1985
-
Imię
Adam
-
Płeć
Mężczyzna
-
Lokalizacja
Gliwice
Kontakt
-1
Nowy
Narzędzia użytkownika
Znajomi
Wiru nie posiada znajomych
#512183 Jail_ball only ct
Napisane przez ^KoZa w 07.02.2013 20:08
if(!(get_user_flags(id) & ADMIN_MENU) || !(cs_get_user_team(id) == CS_TEAM_CT) )
#512218 Jail_ball only ct
Napisane przez d0naciak w 07.02.2013 20:51
#116668 Generate Exp Table
Napisane przez DarkGL w 05.03.2010 23:29
http://amxx.pl/generator/ - Nowa wersja generatora
Wersja v1
Jest to program dzięki któremu w łatwy sposób wygenerujemy tabelkę expa do diablomoda program
posiada 3 tryby fast exp,normal exp i slow exp w programie możemy ustawić ilość leveli a także mnożnik
(liczbę całkowitą dodatnią ) właśnie od jego wartości zależy wielkość expa potrzebnego do zdobywanie leveli ( no i od tryby którego wybierzemy)
nie ustawiajcie zbyt dużej wartości mnożnika i zbyt dużej ilość levelów dla dużych wartość wynik może wyjść na minusie
Wersja v2
Poprawiono kod (szczególnie estetykę ) oraz pewne bugi
Łatwiejsze posługiwanie się programem
Przesunięto próg maksymalnej liczby expa (chodzi o to że czasami wyniki wychodziły na minusie teraz też to będzie występować ale rzadziej)
W wersji v3 wyeliminuje ten problem ale program trzeba przepisać a tego mi się nie chcę robić
Oraz poprawiono zbyt długo linię (to na co zwrócił uwagę pavulon)
Wersja v3
Ładna ikona ;D
Poprawa wzorów (teraz na mnożniku 1 i fast exp możemy robić nawet 30000 levele )
Poprawa bug ta sama tabelka różne tryby
Sygnalizowanie błędu gdy exp przekroczy maksymalną wartość new w pawn (dzięki R3X)
Wersja v4
Poprawa bugu (ach te moje nie sprawdzanie kodu )
Wersja v5
Program przepisany na PHP
Wersja v6
Całkowita zmiana działania programu
Optymalizacja
Ułatwienie użytkowania
Update tylko wersji PHP !
Wersja v7
Kilka dodatków
Lepszy wygląd (nudziło mi się )
Dodanie nowego coda
Przepisanie na js
Wersja v1 - ilość ściągnięć nie znana
Wersja v2 - 70
Wersja v3 - 13
Wersja v4 - Generate Exp Table.zip 136,16 KB 1902 Ilość pobrań
Wersja v5 -coś koło 1500 użyć
Wersja v6 - Generate Exp Table PHP - około 6000 użyć
Wersja v7 - Generate Exp Table v7
Wersja v1
Jest to program dzięki któremu w łatwy sposób wygenerujemy tabelkę expa do diablomoda program
posiada 3 tryby fast exp,normal exp i slow exp w programie możemy ustawić ilość leveli a także mnożnik
(liczbę całkowitą dodatnią ) właśnie od jego wartości zależy wielkość expa potrzebnego do zdobywanie leveli ( no i od tryby którego wybierzemy)
nie ustawiajcie zbyt dużej wartości mnożnika i zbyt dużej ilość levelów dla dużych wartość wynik może wyjść na minusie
Wersja v2
Poprawiono kod (szczególnie estetykę ) oraz pewne bugi
Łatwiejsze posługiwanie się programem
Przesunięto próg maksymalnej liczby expa (chodzi o to że czasami wyniki wychodziły na minusie teraz też to będzie występować ale rzadziej)
W wersji v3 wyeliminuje ten problem ale program trzeba przepisać a tego mi się nie chcę robić
Oraz poprawiono zbyt długo linię (to na co zwrócił uwagę pavulon)
Wersja v3
Ładna ikona ;D
Poprawa wzorów (teraz na mnożniku 1 i fast exp możemy robić nawet 30000 levele )
Poprawa bug ta sama tabelka różne tryby
Sygnalizowanie błędu gdy exp przekroczy maksymalną wartość new w pawn (dzięki R3X)
Wersja v4
Poprawa bugu (ach te moje nie sprawdzanie kodu )
Wersja v5
Program przepisany na PHP
Wersja v6
Całkowita zmiana działania programu
Optymalizacja
Ułatwienie użytkowania
Update tylko wersji PHP !
Wersja v7
Kilka dodatków
Lepszy wygląd (nudziło mi się )
Dodanie nowego coda
Przepisanie na js
Wersja v1 - ilość ściągnięć nie znana
Wersja v2 - 70
Wersja v3 - 13
Wersja v4 - Generate Exp Table.zip 136,16 KB 1902 Ilość pobrań
Wersja v5 -coś koło 1500 użyć
Wersja v6 - Generate Exp Table PHP - około 6000 użyć
Wersja v7 - Generate Exp Table v7
#217094 Problem z Host4Game
Napisane przez AmD w 18.02.2011 20:32
#215182 Wszystko o Amxx/Sma pisaniu pluginów..
Napisane przez DarkGL w 12.02.2011 18:44
Spoiler
#include <amxmodx> #include <amxmisc> #define PLUGIN "Menu" #define VERSION "1.0" #define AUTHOR "Krecik" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /menulist", "menu_f") register_clcmd("say /adminmenu", "adminzone") // Add your code here... } //funkcja otwierajaca menu //funkcja otwierajaca menu public menu_f(id) { //pierw trzeba stworzyc i nazwac jakos menu new menu = menu_create("\rMenu By @Krecik", "wybieranie") // pierwszy parametr to nazwa menu // drugi parametr to obsluga menu // teraz trzeba stworzyc wybor w menu menu_additem(menu, "\wAdmin Zone", "1", ADMIN_BAN) // tylko admin bedzie mogl to wybrac, dla graczy bedzie niedostepne, beda to widziec, ale nie beda mogli wybrac menu_additem(menu, "\wOgulne Zasady", "2", 0) menu_additem(menu, "\wAdmini", "3", 0) menu_additem(menu, "\wForum", "4", 0) menu_additem(menu, "\wMapy", "5", 0) menu_additem(menu, "\wBuy Zone", "6", 0) menu_setprop(menu, MPROP_EXIT, MEXIT_ALL) // teraz wyswietlanie menu menu_display(id, menu, 0) // pierwszy parametr "id" odpowiada za wyswietlenie menu graczowi, ktory wpisal komende na menu // drugi parametr pokazuje menu // trzeci parametr - kto może otworzyć menu, jeżeli 0 to wszyscy. } public wybieranie(id, menu, item) { // funkcja do wychodzenia (EXIT) z menu if (item == MENU_EXIT) { menu_destroy(menu) // destroy "rozwala menu" czyli wylacza return PLUGIN_HANDLED } // teraz trzeba dodac zmienne ktore odpowiadaja np za kupno czegos, czy wyswietlenie tekstu new data[6], iName[64] new acces, callback menu_item_getinfo(menu, item, acces, data,5, iName, 63, callback) // dodaje wybor pod klawisze new key = str_to_num(data) // teraz ustawiamy co ma wykonywac itp kazdy klawisz switch(key) { case 1:{ adminzone(id) } case 2:{ show_motd(id,"zasady.txt","MOTD") } case 3:{ show_motd(id,"admini.txt","MOTD") } case 4:{ show_motd(id,"forum.txt","MOTD") } case 5:{ show_motd(id,"mapy.txt","MOTD") } case 6:{ show_motd(id,"buyzone.txt","MOTD") } } menu_destroy(menu) return PLUGIN_CONTINUE; } public adminzone(id){ if(!(get_user_flags(id)&ADMIN_BAN)){ return PLUGIN_CONTINUE; } new menu2 = menu_create("\rAdmin Zone", "wybieranie") menu_additem(menu2, "\rPowrut", "10", 0) menu_additem(menu2, "\wAmxModX", "11", ADMIN_BAN) menu_additem(menu2, "\wKomędy Amxx", "12", ADMIN_BAN) menu_setprop(menu2, MPROP_EXIT, MEXIT_ALL) // teraz wyswietlanie menu menu_display(id, menu2, 0) // pierwszy parametr "id" odpowiada za wyswietlenie menu graczowi, ktory wpisal komende na menu // drugi parametr pokazuje menu // trzeci parametr - kto może otworzyć menu, jeżeli 0 to wszyscy. return PLUGIN_CONTINUE } public Admin(id, menu, item) { //funkcja do wychodzenia (EXIT) z menu if (item == MENU_EXIT) { menu_destroy(menu) // destroy "rozwala menu" czyli wylacza return PLUGIN_HANDLED } // teraz trzeba dodac zmienne ktore odpowiadaja np za kupno czegos, czy wyswietlenie tekstu new data[6], iName[64] new acces, callback menu_item_getinfo(menu, item, acces, data,5, iName, 63, callback) // dodaje wybor pod klawisze new key = str_to_num(data) // teraz ustawiamy co ma wykonywac itp kazdy klawisz //New menu bby krecik zdziszka pieruna xd switch(key) { case 10:{ client_cmd(id, "say /menulist") } case 11:{ client_cmd(id, "amxmodmenu") } case 12:{ show_motd(id,"amxkomends","MOTD") } } menu_destroy(menu) return PLUGIN_HANDLED }
#215219 Wszystko o Amxx/Sma pisaniu pluginów..
Napisane przez DarkGL w 12.02.2011 20:35
#69839 Tworzenie menu
Napisane przez R3X w 27.06.2009 17:39
Tworzenie menu
Stary temat składa się tylko z jednej części i autor chyba nie zamierza kontynuować, więc opiszę tworzenie menu od podstaw.
Kilka słów wstępu.
Najpierw zajrzyj do komend i operacji bitowych. Pisząc tutorial zakładam, że czytelnik wie jak budować komendy i co to jest suma bitowa.
W przykładowych źródłach celowo pomijam stałe nagłówki (#include, #define) w celu zmniejszenia objętości tekstu. Kod bez nich się nie skompiluje!
Po pierwsze trzeba wiedzieć, że mamy do dyspozycji 2 metody tworzenia menu:
Formatowanie ⇑
Niezależnie od metody, treść menu formatujemy tymi samymi znakami, a oto one:
Przykładowe (stare) menu
jako kolejne rozpoznajemy ^n, czyli po nagłówku "Widzisz to menu?" przechodzimy do nowej linii
następny ^n tworzy linijkę odstępu
teraz mamy w, czyli dalszy tekst będzie biały
ostatni jest ^t, który oddzieli opcję 'tak' od 'nie'
Efekt:
Metoda 1 ⇑
Nasze menu jest pokazywane przy użyciu funkcji
keys - suma odpowiadająca używanym klawiszom, tylko te, które się w niej zawierają będą rozpoznawane przez menu
const menu[] - treść menu, czyli to co zostanie pokazane graczowi
time - czas utrzymania menu na ekranie w sekundach, -1 oznacza, aż do naciśnięcia klawisza z menu
title[] - tytuł, potrzebny do rozpoznania menu
Korzystając z wcześniejszego przykładu menu:
Ogólnie mamy do dyspozycji 10 klawiszy:
Ok, pokazaliśmy graczowi menu, zdefiniowaliśmy klawisze, na które menu reaguje. Pora na przechwycenie zdarzeń menu.
Najpierw musimy przypisać naszemu menu jakąś publiczną funkcję. Służy do tego funkcja z
keys - suma klawiszy, powinna zawierać wszystkie możliwe do użycia w naszym menu klawiszy (np. gdy jedna z opcji jest dostępna tylko dla żywych graczy, jej klawisz również powinien być zsumowany)
function - nazwa publicznej funkcji, do której zostanie przekazane id i klawisz
outside - zmienimy na 1, gdy menu będzie z zewnętrznego źródła (inny plugin, silnik gry)
Kod powinien wyglądać tak:
Suma klawiszy powtarza się, więc użyjmy stałej. Argumenty funkcji cbMyMenu to id gracza i użyty klawisz. Przyciski numerowane są od zera, więc naciśnięcie 1 prześle key=0, naciśnięcie 2 prześle key=1 itd. Dość mylące rozwiązanie, zwłaszcza patrząc na klawisz 0, dla którego key=9
Oczywiście można dodać opcję Anuluj, dodając do sumy klawisz 0 i zmienić nieco treść menu. Nie trzeba dodawać case 9:, gdyż menu automatycznie zamknie się po złapaniu klawisza i nie ma potrzeby wykonywania innych czynności. Gdy chcesz zachować menu na wierzchu nawet po naciśnięciu klawisza za strukturą switch wywołaj funkcję mymenu(id), która ponownie je wyświetli.
------------------------------------------------------------------------------------------------------------------------------------------------
Metoda 2 ⇑
Nowy styl stworzenia menu pozwala na dynamiczne nim zarządzanie. Tworzeniem treści menu zajmują się przygotowane funkcję, nasza praca polega na dostarczeniu informacji.
Pierwszą operacją jest stworzenie uchwytu. Pozostałe operacje wymagają do niego odwołania. Jeśli pokazujemy wszystkim to samo menu uchwyt może mieć zasięg globalny, a menu utworzone w plugin_init(). W innym razie menu tworzymy tuż przed wyświetleniem. Główna funkcja to:
handler[] - nazwa publicznej funkcji, do której przekazywane będą informacje z menu
ml=0 - przestało być używane, nie podajemy
Podawanie klawiszy, na które reaguje menu jest niepotrzebne. Funkcja wyświetlająca potrafi rozpoznać niezbędne klawisze, zależnie od dostępnych opcji.
Tym razem funkcja cbMyMenu ma aż 3 argumenty: id - index gracza, menu - uchwyt menu, oraz item. Ten ostatni argument zawiera numer wybranej opcji (numerowane od zera). Pozwala np. za pomocą switch() przyporządkować operacje danej opcji. Jest to szczególnie wygodne przy menu wielostronnym. Trzeba pamiętać, że wartość item może być mniejsza od zera - opcja wyjścia z menu to item=-3.
Do dodawania opcji służy funkcja:
const name[] - tekst opcji
const info[] - informacja wewnętrzna, w większości menu wartość nieistotna
paccess - poziom dostępu do menu, tak samo jak w przypadku komend, np. ADMIN_BAN
callback - w tym miejscu możemy przypisać funkcję kontrolną, o której później
Mamy menu pokażmy je graczowi.
menu - uchwyt menu
page - podstrona menu
Żeby pokazać więcej o nowym stylu menu przeniosę uchwyt i tworzenie do mymenu(id). Podstawą różnicą jest potrzeba zniszczenia menu po zakończeniu pracy.
menu_destroy() sprawia, że nasz uchwyt staje się bezużyteczny, czyści pamięć zajmowaną dotychczas przez menu. Oczywiście zamiast go niszczyć, możemy zostawić menu na ekranie. Wystraczy w cbMyMenu ponownie wywołać menu_display(). Wtedy nie powinniśmy dopuścić do wywołania menu_destroy a zwrócić nie PLUGIN_HANDLE tylko PLUGIN_CONTINUE, np. tak:
Funkcja kontrolna
Do każdej z opcji możemy przypisać taką funkcję. Będzie ona decydować czy dana opcja jest aktywna (biała) czy nieaktywna (szara, bez reakcji na swój przycisk).
Najpierw utwórzmy uchwyt, tym razem dla publicznej funkcji.
Np. przez taką funkcję
Dostosowanie
W starym stylu wygląd menu znacznie bardziej zależy od nas, jednak projektowanie menu o kilku stronach może być kłopotliwe. Nowa metoda tworzenia mimo schematycznej budowy ma kilka opcji, które pozwalają dostosować treść menu, ale oczywiście w mniejszym stopniu.
Potrzebuje nowej funkcji:
prop - wartość z listy:
Przykład użycia:
Rezultat:
Podsumowanie
Stare menu jest znacznie elastyczniejsze, pozwala nam wpłynąć bezpośrednio na całą treść menu, jednak wymaga więcej pracy. Nowy styl menu, zwłaszcza połączony z globalnymi tablicami standardowymi/dynamicznymi, pozwala nam znacznie zautomatyzować menu. Musimy wybrać między metodami zależnie od zapotrzebowania. Obie są składnikiem biblioteki , więc ma problemu wyboru modułów.
Początkującym programistom Pawna pod AMXX polecam nowy styl - unikniecie wielu błędów.
PS. Do zamknięcia obu menu możemy użyć funkcji:
Dodatek ⇑
W przykładach menu otwierało się na komendę. Aby pokazać je zaraz po wejściu na serwer należy użyć kodu:
Stary temat składa się tylko z jednej części i autor chyba nie zamierza kontynuować, więc opiszę tworzenie menu od podstaw.
Kilka słów wstępu.
Najpierw zajrzyj do komend i operacji bitowych. Pisząc tutorial zakładam, że czytelnik wie jak budować komendy i co to jest suma bitowa.
W przykładowych źródłach celowo pomijam stałe nagłówki (#include, #define) w celu zmniejszenia objętości tekstu. Kod bez nich się nie skompiluje!
Po pierwsze trzeba wiedzieć, że mamy do dyspozycji 2 metody tworzenia menu:
- tzw. stara↵ - ręczna, wymaga więcej przygotowania, ale jest elastyczniejsza
- tzw. nowa↵ - korzystamy z przygotowanych zasobów, za organizację menu odpowiadają natywne funkcje AMXX
Formatowanie ⇑
Niezależnie od metody, treść menu formatujemy tymi samymi znakami, a oto one:
^n - nowa linia ^t - tabulator \w - dalszy tekst będzie miał kolor biały \y - dalszy tekst będzie miał kolor zółty \r - dalszy tekst będzie miał kolor czerwony \d - dalszy tekst będzie miał kolor szary \R - dalszy tekst będzie wyrównany do prawej
Przykładowe (stare) menu
na początku y, więc tekst do następnego znaku zmiany koloru będzie żółty\yWidzisz to menu?^n^n\w1. Tak^t2. Nie
jako kolejne rozpoznajemy ^n, czyli po nagłówku "Widzisz to menu?" przechodzimy do nowej linii
następny ^n tworzy linijkę odstępu
teraz mamy w, czyli dalszy tekst będzie biały
ostatni jest ^t, który oddzieli opcję 'tak' od 'nie'
Efekt:
Metoda 1 ⇑
Nasze menu jest pokazywane przy użyciu funkcji
show_menu ( index, keys, const menu[], time = -1, title[] = "" )index - id gracza
keys - suma odpowiadająca używanym klawiszom, tylko te, które się w niej zawierają będą rozpoznawane przez menu
const menu[] - treść menu, czyli to co zostanie pokazane graczowi
time - czas utrzymania menu na ekranie w sekundach, -1 oznacza, aż do naciśnięcia klawisza z menu
title[] - tytuł, potrzebny do rozpoznania menu
Korzystając z wcześniejszego przykładu menu:
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); } public mymenu(id){ show_menu(id, MENU_KEY_1| MENU_KEY_2, "yWidzisz to menu?^n^nw1. Tak^t2. Nie"); return PLUGIN_HANDLED; }Z nowości mamy:
jest to suma bitowa stałych MENU_KEY_1 i MENU_KEY_2. Pierwsza odpowiada klawiszowi 1 (slot1), druga klawiszowi 2 (slot2). Razem stanowią zbiór klawiszy przechwytywanych przez menu.MENU_KEY_1| MENU_KEY_2
Ogólnie mamy do dyspozycji 10 klawiszy:
#define MENU_KEY_1 (1<<0) #define MENU_KEY_2 (1<<1) #define MENU_KEY_3 (1<<2) #define MENU_KEY_4 (1<<3) #define MENU_KEY_5 (1<<4) #define MENU_KEY_6 (1<<5) #define MENU_KEY_7 (1<<6) #define MENU_KEY_8 (1<<7) #define MENU_KEY_9 (1<<8) #define MENU_KEY_0 (1<<9)
Ok, pokazaliśmy graczowi menu, zdefiniowaliśmy klawisze, na które menu reaguje. Pora na przechwycenie zdarzeń menu.
Najpierw musimy przypisać naszemu menu jakąś publiczną funkcję. Służy do tego funkcja z
register_menu ( title[], keys, function[], outside=0 )title - tytuł, potrzebny do rozpoznania menu, musi być dokładnie taki sam jak w show_menu
keys - suma klawiszy, powinna zawierać wszystkie możliwe do użycia w naszym menu klawiszy (np. gdy jedna z opcji jest dostępna tylko dla żywych graczy, jej klawisz również powinien być zsumowany)
function - nazwa publicznej funkcji, do której zostanie przekazane id i klawisz
outside - zmienimy na 1, gdy menu będzie z zewnętrznego źródła (inny plugin, silnik gry)
Kod powinien wyglądać tak:
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); register_menu("MyMenu",MENU_KEY_1|MENU_KEY_2,"cbMyMenu"); } public mymenu(id){ show_menu(id,MENU_KEY_1|MENU_KEY_2, "yWidzisz to menu?^n^nw1. Tak^t2. Nie",-1,"MyMenu"); return PLUGIN_HANDLED; } public cbMyMenu(id, key){ }
Suma klawiszy powtarza się, więc użyjmy stałej. Argumenty funkcji cbMyMenu to id gracza i użyty klawisz. Przyciski numerowane są od zera, więc naciśnięcie 1 prześle key=0, naciśnięcie 2 prześle key=1 itd. Dość mylące rozwiązanie, zwłaszcza patrząc na klawisz 0, dla którego key=9
#define MYMENU_KEYS MENU_KEY_1|MENU_KEY_2 public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); register_menu("MyMenu",MYMENU_KEYS,"cbMyMenu"); } public mymenu(id){ show_menu(id, MYMENU_KEYS, "yWidzisz to menu?^n^nw1. Tak^t2. Nie", -1, "MyMenu"); return PLUGIN_HANDLED; } public cbMyMenu(id, key){ client_print(id, print_chat, "Wybrales opcje: %d", key+1); }Aby przypisać operacje danemu klawiszowi wygodnie jest zastosować switch().
#define MYMENU_KEYS MENU_KEY_1|MENU_KEY_2 public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); register_menu("MyMenu",MYMENU_KEYS,"cbMyMenu"); } public mymenu(id){ show_menu(id,MYMENU_KEYS, "yWidzisz to menu?^n^nw1. Tak^t2. Nie",-1,"MyMenu"); return PLUGIN_HANDLED; } public cbMyMenu(id, key){ switch(key){ case 0:{ client_print(id, print_chat, "Wybrales opcje Tak"); } case 1:{ client_print(id, print_chat, "Wybrales opcje Nie"); } } }
Oczywiście można dodać opcję Anuluj, dodając do sumy klawisz 0 i zmienić nieco treść menu. Nie trzeba dodawać case 9:, gdyż menu automatycznie zamknie się po złapaniu klawisza i nie ma potrzeby wykonywania innych czynności. Gdy chcesz zachować menu na wierzchu nawet po naciśnięciu klawisza za strukturą switch wywołaj funkcję mymenu(id), która ponownie je wyświetli.
------------------------------------------------------------------------------------------------------------------------------------------------
Metoda 2 ⇑
Nowy styl stworzenia menu pozwala na dynamiczne nim zarządzanie. Tworzeniem treści menu zajmują się przygotowane funkcję, nasza praca polega na dostarczeniu informacji.
Pierwszą operacją jest stworzenie uchwytu. Pozostałe operacje wymagają do niego odwołania. Jeśli pokazujemy wszystkim to samo menu uchwyt może mieć zasięg globalny, a menu utworzone w plugin_init(). W innym razie menu tworzymy tuż przed wyświetleniem. Główna funkcja to:
menu_create ( title[], handler[], ml=0 )title[] - tytuł, tutaj służy również za nagłówek menu (jeśli nie podamy własnego)
handler[] - nazwa publicznej funkcji, do której przekazywane będą informacje z menu
ml=0 - przestało być używane, nie podajemy
Podawanie klawiszy, na które reaguje menu jest niepotrzebne. Funkcja wyświetlająca potrafi rozpoznać niezbędne klawisze, zależnie od dostępnych opcji.
new gMyMenu public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) gMyMenu=menu_create("Jak sie przywitasz?","cbMyMenu"); } public cbMyMenu(id, menu, item){ }
Tym razem funkcja cbMyMenu ma aż 3 argumenty: id - index gracza, menu - uchwyt menu, oraz item. Ten ostatni argument zawiera numer wybranej opcji (numerowane od zera). Pozwala np. za pomocą switch() przyporządkować operacje danej opcji. Jest to szczególnie wygodne przy menu wielostronnym. Trzeba pamiętać, że wartość item może być mniejsza od zera - opcja wyjścia z menu to item=-3.
Do dodawania opcji służy funkcja:
menu_additem(menu, const name[], const info[]="", paccess=0, callback=-1);menu - uchwyt menu
const name[] - tekst opcji
const info[] - informacja wewnętrzna, w większości menu wartość nieistotna
paccess - poziom dostępu do menu, tak samo jak w przypadku komend, np. ADMIN_BAN
callback - w tym miejscu możemy przypisać funkcję kontrolną, o której później
new gMyMenu; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) gMyMenu=menu_create("Jak sie przywitasz?","cbMyMenu"); menu_additem(gMyMenu,"Witam");//item=0 menu_additem(gMyMenu,"Czesc");//item=1 menu_additem(gMyMenu,"Przyszedl Admin :D","",ADMIN_CHAT);//item=2 } public cbMyMenu(id, menu, item){ switch(item){ case 0:{ client_cmd(id, "say Witam"); } case 1:{ client_cmd(id, "say Czesc"); } case 2:{ client_cmd(id, "say Przyszedl Admin :D"); } } }
Mamy menu pokażmy je graczowi.
menu_display(id, menu, page=0);id - index gracza
menu - uchwyt menu
page - podstrona menu
new gMyMenu; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); gMyMenu=menu_create("Jak sie przywitasz?","cbMyMenu"); menu_additem(gMyMenu,"Witam");//item=0 menu_additem(gMyMenu,"Czesc");//item=1 menu_additem(gMyMenu,"Przyszedl Admin :D","",ADMIN_CHAT);//item=2 } public mymenu(id){ menu_display(id, gMyMenu,0); return PLUGIN_HANDLED; } public cbMyMenu(id, menu, item){ switch(item){ case 0:{ client_cmd(id, "say Witam"); } case 1:{ client_cmd(id, "say Czesc"); } case 2:{ client_cmd(id, "say Przyszedl Admin :D"); } } }
Żeby pokazać więcej o nowym stylu menu przeniosę uchwyt i tworzenie do mymenu(id). Podstawą różnicą jest potrzeba zniszczenia menu po zakończeniu pracy.
menu_destroy ( menu )menu - uchwyt menu
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); } public mymenu(id){ new MyMenu=menu_create("Jak sie przywitasz?","cbMyMenu"); menu_additem(MyMenu,"Witam");//item=0 menu_additem(MyMenu,"Czesc");//item=1 menu_additem(MyMenu,"Przyszedl Admin :D","",ADMIN_CHAT);//item=2 menu_display(id, MyMenu,0); return PLUGIN_HANDLED; } public cbMyMenu(id, menu, item){ switch(item){ case 0:{ client_cmd(id, "say Witam"); } case 1:{ client_cmd(id, "say Czesc"); } case 2:{ client_cmd(id, "say Przyszedl Admin :D"); } } menu_destroy(menu); return PLUGIN_HANDLED; }
menu_destroy() sprawia, że nasz uchwyt staje się bezużyteczny, czyści pamięć zajmowaną dotychczas przez menu. Oczywiście zamiast go niszczyć, możemy zostawić menu na ekranie. Wystraczy w cbMyMenu ponownie wywołać menu_display(). Wtedy nie powinniśmy dopuścić do wywołania menu_destroy a zwrócić nie PLUGIN_HANDLE tylko PLUGIN_CONTINUE, np. tak:
public cbMyMenu(id, menu, item){ switch(item){ case 0:{ client_cmd(id, "say Witam"); menu_display(id, menu); return PLUGIN_CONTINUE; } case 1:{ client_cmd(id, "say Czesc"); } case 2:{ client_cmd(id, "say Przyszedl Admin :D"); } } menu_destroy(menu); return PLUGIN_HANDLED; }Efekt: Gdy wybierzemy "Witam" menu pozostanie na ekranie.
Funkcja kontrolna
Do każdej z opcji możemy przypisać taką funkcję. Będzie ona decydować czy dana opcja jest aktywna (biała) czy nieaktywna (szara, bez reakcji na swój przycisk).
Najpierw utwórzmy uchwyt, tym razem dla publicznej funkcji.
menu_makecallback(const function[])zwróconą wartość przekażemy do menu_additem:
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("mymenu","mymenu"); } public mymenu(id){ new MyMenu=menu_create("Jak sie przywitasz?","cbMyMenu"); new MyMenuFun=menu_makecallback("mcbMyMenu"); menu_additem(MyMenu,"Witam","",0,MyMenuFun);//item=0 menu_additem(MyMenu,"Czesc","",0,MyMenuFun);//item=1 menu_additem(MyMenu,"Przyszedl Admin :D","",ADMIN_CHAT,MyMenuFun);//item=2 menu_display(id, MyMenu,0); return PLUGIN_HANDLED; } public cbMyMenu(id, menu, item){ switch(item){ case 0:{ client_cmd(id, "say Witam"); } case 1:{ client_cmd(id, "say Czesc"); } case 2:{ client_cmd(id, "say Przyszedl Admin :D"); } } menu_destroy(menu); return PLUGIN_HANDLED; } public mcbMyMenu(id, menu, item){ return ITEM_ENABLED; }Przypisana funkcja ma taką postać. Zwracana wartość decyduje o aktywności opcji. Ta funkcja sprawi, że wszystkie opcje będą aktywne. Zwrócenie ITEM_DISABLED spowoduje brak aktywności wszystkich/danej opcji zależnie od zastosowania.
public mcbMyMenu(id, menu, item){ return ITEM_ENABLED; }
Np. przez taką funkcję
public mcbMyMenu(id, menu, item){ if(item==1) return ITEM_DISABLED; return ITEM_ENABLED; }Opcja "Czesc" będzie nieaktywna:
Dostosowanie
W starym stylu wygląd menu znacznie bardziej zależy od nas, jednak projektowanie menu o kilku stronach może być kłopotliwe. Nowa metoda tworzenia mimo schematycznej budowy ma kilka opcji, które pozwalają dostosować treść menu, ale oczywiście w mniejszym stopniu.
Potrzebuje nowej funkcji:
menu_setprop(menu, prop, ...);menu - uchwyt menu
prop - wartość z listy:
#define MPROP_PERPAGE 1 /* Liczba opcji na stronę (param1 = liczba, 0=bez stronnicowania, 7=domyślnie) */ #define MPROP_BACKNAME 2 /* Nazwa opcji Back/Wstecz (param1 = tekst) */ #define MPROP_NEXTNAME 3 /* Nazwa opcji Next/Dalej (param1 = tekst) */ #define MPROP_EXITNAME 4 /* Nazwa opcji Exit/Wyjście (param1 = tekst) */ #define MPROP_TITLE 5 /* Nagłówek menu (param1 = tekst) */ #define MPROP_EXIT 6 /* Opcja wyjścia? (param1 = liczba, MEXIT_ALL - zawsze, MEXIT_NEVER- nidgy) */ #define MPROP_NOCOLORS 8 /* Czy usunąć automatyczne kolory(param1 = liczba, 0=domyślnie) */ #define MPROP_NUMBER_COLOR 10 /* Kolor opisów przycisków (param1 = tekst, "r"=domyślny) */
Przykład użycia:
public mymenu(id){ new MyMenu=menu_create("Jak sie przywitasz?","cbMyMenu"); new MyMenuFun=menu_makecallback("mcbMyMenu"); menu_additem(MyMenu,"Witam","",0,MyMenuFun);//item=0 menu_additem(MyMenu,"Czesc","",0,MyMenuFun);//item=1 menu_additem(MyMenu,"Przyszedl Admin :D","",ADMIN_CHAT,MyMenuFun);//item=2 //opcja wyjścia "Wyjście" zamiast "Exit" menu_setprop(MyMenu,MPROP_EXITNAME,"Wyjscie"); //zawsze pokaż opcję wyjścia menu_setprop(MyMenu,MPROP_EXIT,MEXIT_ALL); //kolor cyfry przycisku zmień na żółty menu_setprop(MyMenu,MPROP_NUMBER_COLOR,"y"); menu_display(id, MyMenu,0); return PLUGIN_HANDLED; }
Rezultat:
Podsumowanie
Stare menu jest znacznie elastyczniejsze, pozwala nam wpłynąć bezpośrednio na całą treść menu, jednak wymaga więcej pracy. Nowy styl menu, zwłaszcza połączony z globalnymi tablicami standardowymi/dynamicznymi, pozwala nam znacznie zautomatyzować menu. Musimy wybrać między metodami zależnie od zapotrzebowania. Obie są składnikiem biblioteki , więc ma problemu wyboru modułów.
Początkującym programistom Pawna pod AMXX polecam nowy styl - unikniecie wielu błędów.
PS. Do zamknięcia obu menu możemy użyć funkcji:
#define hide_menu(%1) show_menu(%1,0,"^n") /* To samo co public hide_menu(id) show_menu(id,0,"^n"); */
Dodatek ⇑
W przykładach menu otwierało się na komendę. Aby pokazać je zaraz po wejściu na serwer należy użyć kodu:
#define TASK_SHOWMENU 12000 public client_putinserver(id) set_task(1.0, "show_menu_", id+TASK_SHOWMENU); public show_menu_(tid){ new id=tid-TASK_SHOWMENU; new iTeam=get_user_team(id); new menu_id, keys; new menuUp = player_menu_info( id, menu_id, keys ); if ( iTeam && (menuUp <= 0 || menu_id < 0) ) //Tu pokazujemy menu mymenu(id); else set_task(1.0, "show_menu_", tid); }który nie pozwoli nadpisać menu wyboru drużyny i modelu.
#214972 Wszystko o Amxx/Sma pisaniu pluginów..
Napisane przez mgr inż. Pavulon w 12.02.2011 09:34
#214918 Wszystko o Amxx/Sma pisaniu pluginów..
Napisane przez mgr inż. Pavulon w 11.02.2011 22:39
#210196 Wiecej lvl
Napisane przez DarkGL w 28.01.2011 11:41
#14123 PokeMod v1.2.3 RC + RC2 Test for Public
Napisane przez Abes Mapper w 31.08.2008 00:07
WERSJA Z ZAPISEM NA NICK (możliwość ustawienia)
DOWNLOAD version 1.2.3 RC2 Test
1.2.3rc2test.zip
pokemod_files.zip
SKOMPILOWANE WERSJE ZAPISU DO NVAULT:
- Na SteamID
- Na Nick
Co to jest PokeMod?
--- Jest to mod który opiera się na słynnym filmie, serialu, grze - Pokemon.
Gracze wybierają na starcie pokemona, zdobywają doświadczenie i łapią inne pokemony.
Gdy gracz zdobywa level, umiejętności jego pokemona stają się także lepsze, groźniejsze, bardziej śmiercionośne.
Jeżeli zaś pokemon gracza ewoluuje, dostaje on nowe umiejętności od jego poprzedników.
Jednak gracz może mieć tylko jednego pokemona w jednym czasie. Nie oznacza to że można mieć tylko jednego
pokemona ogółem. Może mieć ich dużo i zmieniać za pomocą komendy /go
Niektóre pokemony są oznaczone jako "globalne" czyli jak będzie u ciebie to też zdobywa doświadczenie nawet jeżeli go nie używasz
--- Istnieje również unikalny system przedmiotów, gdzie właściciele mogą zarządzać i tworzyć nowe elementy oparte na prostym pliku (items.cfg). Ten element systemu może być wykorzystany do stworzenia prawie nieskończoną ilość przedmiotów, które można sobie wyobrazić.
--- Dodatkowo w PokeMod istnieje "PokeRank", gdzie level pokemona zapisuje się. Również zapisują się inne rzeczy. Rank działa indywidualnie ale także działa podstawowy rank serwera.
--- Inną cechą w PokeMod jest "Wild (Dziki)" i "Trainer (Trener)" mod. Gracze są trenerami, ale mogą się przełączyć na tryb dziki mówiąc /wild. W trybie Wild, zostanie przydzielony losowy pokemon z losowym doświadczeniem. Dziki pokemon zdobywa doświadczenie dwa razy szybciej, od trenerów, ale po śmierci, dostajesz nowego pokemona.
--- W PokeMod jest powszechnie stosowany tryb "Safari". Ten tryb pozwala na wybór dowolnego pokemona, jeżeli serwer ma włączony tryb Safari. Nie można zdobywać doświadczenia i gracze są w stanie zmienić swobodnie pokemona. Pokemon może być wyłączony, tylko przez administratora lub gdy jest ustawiony jakiś level.
Jak mogę skonfigurować PokeMod do swoich potrzeb?
--- PokeMod ma wiele rodzajów konfiguracji, można je znaleźć w configs/pokemon/. W każdym pliku są dostępne dostosowania. Aby uzyskać więcej zmian, takich jak zapisywanie typów lub rodzaju gry, musisz edytować custom.inl lub skill_defines.inl następnie rekompilować na pokemod.amxx.
- items.cfg - jak opisano wcześniej, można zmienić i dodać przedmioty do PokeMod. Możesz ustawić co robią, ich ceny i inne rzeczy. Można również kategoryzowania ich, więc możesz kupić przedmioty łatwiejsze niż normalnie w PokeMod.
- maps.cfg - To może być użyte do konkretnych konfiguracji mapy. Możesz zrobić normalne polecenia konsoli lub dodatkowo, możesz wyłączyć PokeMod (-disabled) lub dać umiejętności na off (-skills_off), więc gracze nie mogą korzystać ze swoich umiejętności, ale wciąż mogą zdobywać doświadczenie. Z -disabled i -skills_off, PokeMod nie kożysta z wszelkich modeli, dźwięków lub sprites, ale nadal można grać na ogrnomnych mapach typu fun_allinone.
- pokedex.txt - Choć nie jest wskazane aby zmieniać ten plik, można edytować nazwy i opisy umiejętności.
- pokemod.cfg - Tutaj możesz edytować cvary dla PokeMod, gdzie zostanią załadowane na starcie mapy. Możesz zmienić czy PokeMod czy administrator jest potrzebny dla komend admina PokeMod. Jeśli chcesz zmienić wartości w tym pliku w grze, zamiast normalnego polecenia cvar (amx_cvar) zastosuj nowe polecenie pm_cvar i będzie zapisywać do pliku.
- pokemon.cfg - W tym pliku możesz zmienić wiele właściwości pokemonów. Możesz zmienić jakie opóźnienie jest po użyciu jego umiejętności, czy jest globalnym pokemonem, jakiego rodzaju jest, a nawet to, co go ewoluuje i kiedy ewoluuje.
- safari.cfg - W Safari mod, pokemonowi podano zastaw leveli, to gdzie można ustawić ten poziom. Jeśli ustawisz na 0, wtedy nie będzie można użyć tego pokemona w Safari mod. Jeśli jest ustawiony na negatywne liczby, tylko administratorzy mogą użyć tego pokemona w trybie Safari.
- XP_table.ini - Inspirowany Superhero Mod, teraz można łatwo zmienić to, jaki poziom jest i jak wiele jest poziomów. (Zauważ, że będziesz musiał także zmienić określenie w custom.inl jeśli chcesz więcej niż 99 poziomów)
Jak mogę sprawdzić czy PokeMod działa?
--- Z wersja 1.2.0, można teraz uzyskać dostęp do polecenia pokemod i pm. Jeśli nie podamy parametru, spowoduje to wyświetlenie informacji o PokeMod, np. jeśli jest wyłączony, brakuje plików lub działa płynnie.
Również z tego polecenia, można zmienić stany PokeModa na on/off.
- pokemod on/off - włącz/wyłącz pokemod
- pokemod safari on/off - włącz/wyłącz tryb safari
- pokemod debug # - zmienia poziom debugowania
- pokemod debug <word> - zmienia klucz debugowania
- pokemod debug off - wyłacza debugowanie
Gdy uruchomimy PokeMod po raz pierwszy, pliki konfiguracyjne będą zapisywane w addons/amxmodx/configs/pokemon/
Po aktualizacji do nowej wersji, wpisz w konsoli pm_reset all, aby uzyskać nowsze pliki konfiguracyjne.
Autor pluginu napisał żeby plugin kompilować lokalnie na komputerze ale to później.
Najpierw ściągamy plik pokemod_123rc.zip albo 1.2.3rc2test.zip(najnowsze!) (dostępne na samej górze) (w tym przypadku należy skompilować mod lokalnie, czyli u siebie na kompie lub pobrać skompilowane)
Otwieramy i plik pokemod.amxx kopiujemy do addons/amxmodx/plugins
Następnie dopisujemy pokemod.amxx do plugins.ini
Teraz należy ściągnąć plik pokemod_files.zip który znajduje się na samej górze, otworzyć i foldery models, sound, sprites wypakować do cstrike
Jeśli w jakiś sposób nie będzie Ci działać PokeMod to sprawdź czy masz włączone potrzebne moduły, wszystko wgrane, itp.
A jak nadal nie działa to postępuj zgodnie z tą instrukcją:
Ściągamy plik pokemod_123rc.zip albo pokemod_123rc2.zip
Jego zawartość wypakowywujemy do addons/amxmodx/scripting
Jak się spyta czy zastąpić to wybieramy TAK
Teraz plik pokemod.sma przeciągamy na plik compile.exe i czekamy aż się skompuluje.
Po niedługim czasie skompilowany plik znajdzie się w folderze compiled a dalej postępujemy jak napisałem na samym początku instalacji.
Można także pobrać już skompilowany plugin znajdujący się na samej górze tematu.
pm_givepoke <nick |="" @TEAM="" |="" @ALL=""> <nazwa pokemona=""> [level] - danie pokemona graczowi
pm_setpoke <nick |="" @TEAM="" |="" @ALL=""> <nazwa pokemona=""> - tymczasowe danie mocy pokemonowi
pm_takepoke <nick |="" @TEAM="" |="" @ALL=""> <pokemon |="" @ALL="" |="" @#="" |="" @C=""> - ustaw pokemony z dala od graczy
pm_morph <nick |="" @TEAM="" |="" @ALL=""> <pokemon |="" @ALL="" |="" @#="" |="" @C=""> <nowy pokemon=""> - zastępuję pokemona nowym
pm_givexp <nick |="" @TEAM="" |="" @ALL=""> <pokemon |="" @ALL="" |="" @#="" |="" @C=""> <ilość> - danie XP pokemonowi
pm_setxp <nick |="" @TEAM="" |="" @ALL=""> <pokemon |="" @ALL="" |="" @#="" |="" @C=""> <ilość> - ustawienie XP pokemonowi
pm_addrank <nick |="" @TEAM="" |="" @ALL=""> <ilość> - danie punktów ranku graczowi
pm_setrank <nick |="" @TEAM="" |="" @ALL=""> <ilość> - ustawienie punktów ranku dla gracza
pm_setlevel/pm_setlvl <nick |="" @TEAM="" |="" @ALL=""> <pokemon |="" @ALL="" |="" @#="" |="" @C=""> <level> - ustawienie levelu dla pokemona
pm_giveitem <nick |="" @TEAM="" |="" @ALL=""> <nazwa itemu=""> [ilość] - danie graczowi przedmiot
pm_debugger <nick |="" 0=""> - kto odbiera komunikaty debugowania
pm_help - pokazywanie pomocy - komendy admina
pm_cvar <cvar> [nowa wartość] - zobacz/zmien wartość cvary pokemodu
pm_enable <pokemon |="" @ALL=""> [dodatkowy pokemon] - włączenie używania pokemona
pm_tempenable <pokemon |="" @ALL=""> [dodatkowy pokemon] - tymczasowe włączenie używania pokemona
pm_disable <pokemon |="" @ALL=""> [dodatkowy pokemon] - wyłącz używanie pokemona
pm_tempdisable <pokemon |="" @ALL=""> [dodatkowy pokemon] - wyłączenie tymczasowego używania pokemona
pm_pokemart <nazwa pokemona="" |="" nazwa="" itemu=""> <cena> - zmiana itemów w Pokemart
pm_safari <nazwa pokemona=""> <level> - zamiana na pokemona w Safari
pm_reset <plik> - resetowanie pliku pokemoda
pm_loadconfig - ładowanie konfingu pokemoda
pm_erasexp - wyczyszczenie całego/wszystkim XP
/pokecommands - pokazuje pełną listę komend w pokecommand
/pokehelp - pokazuje podstawowe informacje o PokeMod
/save - zapisuje PokeMod data (chyba że zapisywanie jest wyłączone albo safari mod jest włączony)
/pokedex poke - pokazuje informacje na temat określonego pokemona (np.: '/pokedex 1' albo '/pokedex bulbasaur')
/pokemenu - pokazuje menu PokeMod jeśli jesteś martwy albo blisko Profesora Oak'a
/pokehud up/down - przesuwa PokeMod HUD w górę lub w dół (np.: '/pokehud up' albo '/pokehud down')
/playerspokes - pokazuje każdy pokemon
/pokemart item amount - kupienie jakiejś ilości itemów
/pokeitem item - zobacz informacje na temat jakiegoś itemu
/go - pokaż menu aby wybrać aktywnego pokemona
/mypokes - pokazuje pokemony jakie masz ogółem
/switch poke1 poke2 - przełączaj pokemonami z innymi
/release poke - uwolnienie pokemona aby stał się dziki
/give player pokemon/item - danie twojego pokemona/itemu innemu graczowi (np.: '/give [you] pikachu' albo '/give [you] potion')
/wild - zostać losowym dzikim pokemonem
/trainer - zostać trenerem
/pokerank - zobaczyć pokerank graczy
Komendy w konsoli
pokemod - pokazuje informacje o serwerze PokeMod
+pokeskill - użycie aktualnego skilla
+pokeskill# - użycie skilla bez konieczności wyboru z menu ( +pokeskill1, +pokeskill2, etc. )
+pokeitem - pokaż menu z twoimi przedmiotami
- Fakemeta
- Fun
- Nvault (jeżeli zapis jest na nvault)
TA OPCJA DOSTĘPNA W NAJNOWSZEJ WERSJI KTÓRA DOSTĘPNA JEST NA SAMEJ GÓRZE
Można wybrać zapis: Steam ID lub na Nick
Zmienia się to w pliku custom.inl
Szukamy linijki:
//how to save data ( 0 - steamid ; 1 - nickname ) #define SAVE_ID 0Gdy wpiszemy 0 zapis będzie na Steam ID, gdy wpiszemy 1 zapis będzie na Nick
Oczywiście potem należy ponownie skompilować plugin
Cały opis przetłumaczyłem Ja z pomocą translatora.
Kopiowanie na inne fora zabronione bez podania źródła.
Oryginalny tekst: PokeMod v1.2.3 RC for Public (June 25, 2008) - AlliedModders
Niech admini, moderatorzy lub inni userzy sprawdzą czy wszystko jest dobrze opisane
Załączone pliki
-
pokemod_123rc.zip 560,05 KB 4871 Ilość pobrań
-
PokeMod v1.2.2.zip 120,01 KB 2752 Ilość pobrań
-
pokemod.txt 22,56 KB 3584 Ilość pobrań
#205854 zombie admina
Napisane przez Agent w 14.01.2011 17:46
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: Wiru
- Regulamin