#include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun> #include <hamsandwich> #define PLUGIN "Zombie Attack" #define VERSION "1.0" #define AUTHOR "BananaXS" // CVARY DLA ZOMBIE // MENU new gTT; const Float:g_fDestroyMenuTime = 5.0; // po ilu sekundach niszczyc menu public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) // MENU TT gTT=menu_create("Klasy TT","cbTT"); menu_additem(gTT,"Szybcior"); // klasa zwykla menu_additem(gTT,"Czolg"); // klasa szbycior RegisterHam(Ham_Spawn,"player","ham_spawn",1) } public TTm(id){ if(get_user_team(id) == 1){ static iData[1], iTask; iData[0] = gTT; iTask = id + 1337; remove_task(iTask); set_task(g_fDestroyMenuTime, "RemoveMenu", iTask, iData, 1); menu_display(id, gTT); return PLUGIN_HANDLED; } else if(get_user_team(id) == 2){ client_cmd(id,"Nie mozesz tego uzyc!") } return PLUGIN_HANDLED; } public RemoveMenu(iData[1], id) { id -= 1337; static iMenu, iNewMenu; if(player_menu_info(id, iMenu, iNewMenu) && iNewMenu == iData[0]) { show_menu(id, 0, "^n", 1); } } public cbTT(id, menu, item){ switch(item){ case 0:{ if(is_user_alive(id)){ szybcior(id); } } case 1:{ if(is_user_alive(id)){ czolg(id); } } } } public ham_spawn(id){ if(is_user_alive(id)){ TTm(id); if(get_user_team(id) == 1) { strip_user_weapons(id); give_item(id,"weapon_knife"); set_user_health(id,800); set_user_maxspeed(id,get_user_maxspeed(id)+100); } } return PLUGIN_HANDLED; } public szybcior(id){ set_user_health(id,500); set_user_maxspeed(id,get_user_maxspeed(id)+600); } public czolg(id){ set_user_health(id,2000); set_user_maxspeed(id,get_user_maxspeed(id)-50); }
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.
|
KRAKOW
Rejestracja: 20.04.2014Aktualnie: Nieaktywny
Poza forum Ostatnio: 12.01.2021 22:02





Statystyki
- Grupa: Użytkownik
- Całość postów: 83
- Odwiedzin: 5 050
- Tytuł: Zaawansowany
- Wiek: Wiek nie został ustalony
- Urodziny: Data urodzin nie została podana
-
Płeć
Mężczyzna
-
Lokalizacja
Kraków
Kontakt
Narzędzia użytkownika
Ostatnio byli
#737274 Niszczenie menu po kilku sekundach
Napisane przez Asiap
w 10.03.2017 04:54
#736018 Indexy graczy i zmienne
Napisane przez _McHappy
w 08.02.2017 18:35
new bool:m1[33]; //bool: oszczędność pamięci - zmienna tak/nie. Domyślnie jest 0 = nie. public zaczep1(id,menuh,item) { switch(item) { case 0: { if(m1[id]==0){ m1[id]=1; set_hudmessage(0, 255, 0, 0.1, 0.1, 0, 0.0, 3600.0, 0.0, 0.0, 3); show_hudmessage(id,"m1 jest aktywne") } } ... } } public newRound() { new maxP = get_maxplayers(); for(new i = 1; i<=maxP; i++) { if(m1[i]==1) { set_hudmessage(0, 255, 0, 0.1, 0.1, 0, 0.0, 3600.0, 0.0, 0.0, 3); show_hudmessage(i,"m1 jest aktywne"); } else { set_hudmessage(0, 255, 0, 0.1, 0.1, 0, 0.0, 3600.0, 0.0, 0.0, 3); show_hudmessage(i,"m1 nieaktywne"); } } }
Powyższy kod modyfikuje zmienną osobno dla każdego gracza.
Należy pamiętać o zerowaniu stanu zmiennej przy wyjściu danego gracza z serwera
#132878 Troche o nVault
Napisane przez G[o]Q
w 07.05.2010 20:34
1. Opis uzywanych funkcji - opisze funkcje ktore beda nam nie zbedne
a) nvault_open - otwiera ona plik Vault do zapisu danych.
skladnia:
nvault_open ( const nazwa[] )
zwraca ona index pliku vault dlatego dobrze jest przypisac wywolanie funkcji do zmiennej globalnej i uzywac funkcji w plugin_init/plugin_cfg/plugin_precache
moze tez zwrocic -1( INVALID_HANDLE) wtedy gdy nie mozna otworzyc/stworzyc pliku Vault

skladnia:
nvault_close ('wskaznik')
wskaznik to wartosc zwracana przez nvault_open (zmienna do ktorej to przypisalismy)
c) nvault_set - pozwala nam zapisac dane do pliku identyfikatorem danych jest klucz ktory podajemy dlatego musimy zadbac aby dla kazdego wpisu byl inny
skladnia:
nvault_set ( wskaznik, const klucz[], const wartosci[] )
d) nvault_get - pozwala nam odczytac z pliku dane wlasciwe dla podanego klucza mozna uzyc przypisujac do zmiennej lub podac jako 3 parametr tablice a jako 4 jej dlugosc wtedy dane zapisane bd w tablicy
skladnia:
nvault_get ( wskaznik, const klucz[], ... )
e) nvault_remove - usuwa dany klucz z pliku
skladnia:
nvault_remove ( wskaznik, const klucz[] )
2. Przykladowe uzycie:
powiedzmy ze do zapisu i odczytu mamy liczbe fragow gracza ktora musi zostac zapisana przy rozlaczeniu i wczytana przy polaczeniu dodatkowo zapisujemy liczbe dead'ow. Przy okazji jest też pokazany sposób zapisania ciągu znaków, w tym przypadku nick gracza.
(wazniejsze linie maja komentarze)
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <fun>
#include <cstrike>
#define PLUGIN "Plugin"
#define VERSION "0.1"
#define AUTHOR "G[o]Q"
new fragi[33] // fragi
new deads[33] // deady
new g_name[33][48]
new plik_vault
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say poka", "pokaz")
plik_vault = nvault_open("fragi") //tutaj podajemy "nazwe" pliku z danymi
if(plik_vault == INVALID_HANDLE)
set_fail_state("Nie moge otworzyc pliku :/");
}
public client_authorized(id)
load_frags(id);
public client_disconnect(id) {
save_frags(id)
fragi[id]=0 // zeby ktos kto wejdzie po nas nie mial naszych fragow zapisanych w tablicy
deads[id]=0
copy(g_name[id], 47, "");
// mozna by wyswietlic komunikat ale tylko gdy uzywamy komendy bo inaczej nie dosc ze nic sie nie wyswietli
// to w logach zobaczymy "index out of bound"
}
public plugin_end()
nvault_close(plik_vault)
public pokaz(id) // funkcje nie ustawiaja liczby frags/deads a plugin mial tylko pokazywac dzialanie stad komenda
client_print(id, print_chat, "fragi: %d deady: %d nick: %s", fragi[id], deads[id], g_name[id]);
public load_frags(id)
{
new name[48]
get_user_name(id,name,47)
new vaultkey[64],vaultdata[128]
formatex(vaultkey,63,"%s-fragi",name)
if(nvault_get(plik_vault,vaultkey,vaultdata,127)) { // pobieramy dane
new fragitemp[16], deadstemp[16], nametemp[48];
parse(vaultdata, fragitemp, 15, deadstemp, 15, nametemp, 47) // wydobywamy z ciagu vaultdata nasze dane
fragi[id]=str_to_num(fragitemp) // przypisujemy danym ich wartosci wczytane
deads[id]=str_to_num(deadstemp)
set_user_frags(id,fragi[id])
cs_set_user_deaths ( id, deads[id] )
copy(g_name[id], 47, nametemp);
}
return PLUGIN_CONTINUE
}
public save_frags(id) {
fragi[id]+=get_user_frags(id) // zwiekszamy liczbe fragow i deadow o stan bierzacy
deads[id]+=get_user_deaths(id)
new name[48]
get_user_name(id,name,47)
new vaultkey[64],vaultdata[128] // 2 zmienne na klucz i dane ktore bedziemy zapisywac
formatex(vaultkey,63,"%s-fragi",name) //formatujemy klucz czyli nasz identyfikator dostepu najlepiej zeby roznil sie on 1 czlonem od pozostalych
formatex(vaultdata,127,"%d %d ^"%s^"", fragi[id], deads[id], name) // formatujemy dane
nvault_set(plik_vault,vaultkey,vaultdata) // zapisujemy dane "pod" danym kluczem w pliku
return PLUGIN_CONTINUE
}
#280343 Rezerwacja nicków na sid lub hasło
Napisane przez sebul
w 09.08.2011 18:59

Plugin do rezerwacji nicków na sid lub hasło. Nie ma co tu dużo opisywać, jeśli w pliku "reservation.ini" będzie znajdował się jakiś nick, to żeby móc wejść na serwer z tym nickiem, trzeba albo wpisać hasło, albo wbić na serwer z odpowiednim sidem.

amx_reservation_pass "_res" // to należy wpisywać po "setinfo"

Jeśli nick jest na hasło należy przed każdym wejściem na serwer wpisać w konsoli
setinfo _res "HASŁO"lub dopisać komendę do swojego cfg (tego już nie będę opisywał).

Tylko dla admina z flagą "a", można to zmienić w sma.
amx_reservation <nick> <steamid or password>

Miałem tego nie dodawać, ale skoro jest już parę podobnych pluginów...
Generalnie plugin pisałem ja, ale parę rzeczy wykorzystałem z innego pluginu, a dokładniej sposób w jaki została napisana dynamiczna tablica array.

Standardowa, czyli txt do lang, sma do scripting, amxx do plugins, a ini do configs.






#639782 [ROZWIĄZANE] Zapisywanie IP graczy do pliku
Napisane przez Ogen Dogen
w 22.05.2014 18:28
Chyba te funkcje ci się przydadzą :
http://amxx.pl/dokum...1/get-user-name
http://amxx.pl/dokum...f70/get-user-ip
http://amxx.pl/dokum...907/file-exists
http://amxx.pl/dokum...f88/log-to-file - jeśli chcesz żeby nick był w nazwie pliku to wystarczy że w tej funkcji wpiszesz odpowiednio sformatowaną wcześniej tablicę z nickiem gracza do nazwy , spróbuj np. :
new nick[64]; get_user_name(id,nick,63); new txt[] = ".txt"; add(nick,sizeof(nick),txt,sizeof(txt)); log_to_file(nick,"To co chcesz zapisać"); // log_to_file sam tworzy plik jeśli nie istnieje
#633062 Modele pisanek
Napisane przez White
w 19.04.2014 10:58
Modele pisanek zrobione przeze mnie i osobę ode mnie z sieci.
Załączone pliki
-
Pisanki.rar 45,87 KB 29 Ilość pobrań
#637311 Smuga za pociskiem - objaśnienie
Napisane przez BlackPerfum
w 09.05.2014 02:43
Za smugę "podążającą za pociskiem, którego nie ma" jest to odpowiredzialne:
message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, iPlayer) write_byte(TE_TRACER) write_coord(x) write_coord(y) write_coord(z) write_coord_f(fX) write_coord_f(fY) write_coord_f(fZ) message_end()
Teraz co za co jest odpowiedzialne:
message_begin - Odsyłam do dokumentacji
write_byte(TE_TRACER) - Pierwszy parametr/argument (jak kto woli) wiadomości typu SVC_TEMPENTITY
Ten argument jest kluczowy bo to dzięki niemu wiemy jakie wiadomość będzie miała następne argumenty oraz co dana wiadomość będzie robić.
Mała lekturka do poczytania nad opcjami tego argumentu : klik , klik (jest około kilkadziesiąt - kilkaset opcji do wyboru dlatego nie mam zamiaru się rozpisywać)
Teraz szukamy w necie opcji TE_TRACER i dowiadujemy sie że przyjmuje ona jeszcze dodatkowo 6 argumentów typu coord (najzywklejszy int)
Pierwsze 3 paramtery będą przechowywać położenie punktu startu Efektu, a 3 ostatnie będą przechowywać położenie punktu końca Efektu.
Czyli nasze:
write_coord // Pozycja startu x
write_coord // Pozycja startu y
write_coord // Pozycja startu z
write_coord_f // Pozycja końca x
write_coord_f // Pozycja końca y
write_coord_f // Pozycja końca z
write_coord nie różni się niczym od write_coord_f (poza tym że przyjmuje wartość typu float) tylko amxmodx (a może to na innym poziomie jest konwertowane?? Nwm ale wątpie bo do klienta dochodzi wiadomość już przekonwertowana na 100% ) musi dodatkowo przekonwertować typ float na int
(x/y/z)* - To tylko umowne nazwy osi każdy może nazywać je jak chce bo to tylko aliasy
Następnie nie zapominamy o message_end i to tyle trudu.
#431939 Paczka FFA By Robson
Napisane przez ROBSON.
w 14.07.2012 12:24
Witam. Chciałem wam pokazać moją paczkę FFA.
Nie oceniajcie zbyt surowo bo to moja pierwsza paczka ;d
Jeżeli będą jakieś problemy pisać GG: 10683262
Plugins.iniadvanced_bans.amxx ; Ban z powodem ; AMX Mod X plugins ; Admin Base - Always one has to be activated advanced_bans.amxx ; Ban z powodem admin.amxx ; admin base (required for any admin-related) ;admin_sql.amxx ; admin base - SQL version (comment admin.amxx) ; Basic admincmd.amxx ; basic admin console commands adminhelp.amxx ; help command for admin console commands adminslots.amxx ; slot reservation multilingual.amxx ; Multi-Lingual management ; Menus menufront.amxx ; front-end for admin menus cmdmenu.amxx ; command menu (speech, settings) plmenu.amxx ; players menu (kick, ban, client cmds.) ;telemenu.amxx ; teleport menu (Fun Module required!) mapsmenu.amxx ; maps menu (vote, changelevel) pluginmenu.amxx ; Menus for commands/cvars organized by plugin ; Chat / Messages adminchat.amxx ; console chat commands antiflood.amxx ; prevent clients from chat-flooding the server scrollmsg.amxx ; displays a scrolling message imessage.amxx ; displays information messages adminvote.amxx ; vote commands ; Map related nextmap.amxx ; displays next map in mapcycle mapchooser.amxx ; allows to vote for next map timeleft.amxx ; displays time left on map ; Configuration pausecfg.amxx ; allows to pause and unpause some plugins statscfg.amxx ; allows to manage stats plugins via menu and commands ; Enable to use AMX Mod plugins ;amxmod_compat.amxx ; AMX Mod backwards compatibility layer ; Custom - Add 3rd party plugins here admin_chat_colors.amxx ;Kolorowy chat Admina w say'u. admin_spec_esp.amxx ;Admin po śmierci ma "esp", przydatne w złapaniu haków. amx_ssban.amxx ;Robienie SS. galileo.amxx ;Rozbudowany system votowania map. polski_cs.amxx ;Polskie napisy typu "Bomba została podłozona" itp. c4.amxx ;Czas do wybuchu bomby. pokazuj.amxx ;Info w say. grenade_trail.amxx ;Plugin który zostawia "smugę" która tworzy się za linią lotu granata. parachute.amxx ;Spadochron. Automaticknifeduel.amxx ;Gdy zostaje 2 graczy po potarciu nożem pyta się o pojedynek na noże. backweapons.amxx ;Plugin pokazuje broń na plecach przy czym wspiera tylko: Wszystkie rifles,Smgs (mp5, ump, p90),Shotguns,Machine gun. lastmanbets.amxx ;Plugin pozwala na obstawienie na to, który gracz wygra, w zamian dostajemy dodatkowe pieniądze, życie itp. deathbones.amxx ;Jest to plugin zamieniający zabitych w kościo-trupy. ptb.amxx ;Plugin który balansuje, wyrównuje drużyny. Dodając ten plugin będziesz pewny, że problem "Dream Team" zapadanie Ci w niepamięć. interp.amxx ;Strażnik interpu. ad_manager.amxx ;Reklamy w say.
Download
#590861 [Zapowiedz] AMXX Editor Online
Napisane przez DarkGL
w 06.12.2013 17:24
Zrzut ekranu z 2013-12-02 13:10:31.png 111,34 KB 15 Ilość pobrań
Cel to wpełni działające środowisko programistyczne w przeglądarce ( wraz z znanymi ułatwieniami tzn. generatory ) oraz możliwość przenoszenia kodu między różnymi komputerami itp.
Mam nadzieję że projekt uda się ukończyć jednak jest mnóstwo problemów z obsługą w różnych przeglądarkach oraz problemów wydajnościowych.
#636105 [ROZWIĄZANE] Przerobienie blokady HE na danych mapach.
Napisane przez VertekS
w 02.05.2014 16:27
Proszę bardzo:
#include <amxmodx> new bool:blokada new bool:blokada_mapy; public plugin_init() { register_plugin("Blokada HE", "1.0", "xenos") register_logevent("Poczatek_Rundy", 2, "1=Round_Start") register_event("CurWeapon","CurWeapon","be", "1=1") blokada_mapy=false; new mapa[14]; get_mapname(mapa, 13); if(equal(mapa, "de_dust2_long", 13) || equal(mapa, "cs_wiocha",9)) blokada_mapy=true; } public Poczatek_Rundy() { blokada = true set_task(15.0, "Odblokuj") } public CurWeapon(id) { new iWeapon = read_data(2) if(iWeapon == CSW_HEGRENADE && blokada) engclient_cmd(id, "lastinv") return PLUGIN_CONTINUE } public Odblokuj(id){ if(blokada_mapy==false) blokada = false }
Załączone pliki
-
blokada_he.sma 902 bajtów 26 Ilość pobrań
blokada_he.amxx
#198593 Poszukuję Losowanie Gracza w Rundzie
Napisane przez DarkGL
w 22.12.2010 17:23
#634208 Jak dodać coś na ekran gracza (Tak jakby HUD)?
Napisane przez mastah7991
w 23.04.2014 11:40
#69839 Tworzenie menu
Napisane przez R3X
w 27.06.2009 17:39
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:
menu1.JPG 4,42 KB 3186 Ilość pobrań
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"); } } }
menu2.JPG 6,62 KB 2975 Ilość pobrań
Ż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:
menu3.JPG 7,16 KB 3051 Ilość pobrań
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:
menu4.JPG 7,37 KB 2740 Ilość pobrań
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.
#633151 proszę o vipa na dd2
Napisane przez Maupa
w 19.04.2014 18:03
proszę bardzo tylko skompiluj go i wrzuć na serwer
http://speedy.sh/WkfV6/vip.zip
Pamiętaj że jest generator vip i sam możesz go sobie napisać
- AMXX.pl: Support AMX Mod X i SourceMod
- → Przeglądanie profilu: Reputacja: KRAKOW
- Regulamin