public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /menu", "menu_handle") } public menu_handle(id) { new menu = menu_create("Lista graczy:", "menu_handler") new players[32], num, name[32] get_players(players, num) for(new i = 1; i<num; i++){ get_user_name(i, name, 31) menu_additem(menu, name) } menu_display(id, menu) } public menu_handler(id, menu, item) { switch(item) { case 0: { client_print(id, print_chat, "Wybrales gracza %s" /*i nie wiem jak pobrac teraz poprawnie nazwe gracza bez tworzenia nowych zmiennych etc.*/) } } }Tutaj fragment kodu. Za pomoc będę wdzięczny Daję +
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.
|
[ROZWIĄZANE] Jak stworzyc menu z listą graczy?
Najlepsza odpowiedź Droso, 24.11.2013 21:08
Myślę, że łatwiej będzie Ci to zrozumieć:
Najpierw tworzymy jakby uchwyt i nazwę naszego menu:
new menu = menu_create("Lista Graczy:", "menu_handler");
Następnie przystępujemy to pętli, ty użyłeś do tego jeszcze funkcji get_players, ale ja osobiście jej nie lubię , bo zawiera błędy itd.
Dlatego użyjemy samej pętli
Najpierw zmienne
new maxplayers = get_maxplayers(); // ile osob moze byc maksymalnie na serwerze new name[32] // zmienna przechowujaca nick gracza new data[6] // to bedzie ID gracza, ktore wysylamy w info :)
Teraz pętla:
for(new i=1; i<=maxplayers; i++) // pętla od 1 DO MAKSYMALNEJ LICZBY GRACZY { if(!is_user_connected(i)) continue; // jezeli gracz o danym ID (i) nie jest polaczony to go pomijamy uzwajać "continue" if(is_user_hltv(i) || is_user_bot(i)) continue; // jezeli dane ID to HLTV/BOT - pomijamy! num_to_str(i, data, 5); get_user_name(id, name, 31); // pobieramy nick menu_additem(menu, name, data); // dodajemy do menu gracza. }
Zakończenie menu, czyli wyświetlelnie:
menu_display(id, menu, item);
Teraz funkcja menu_handler
public menu_handler(id, menu, item) { if(item == MENU_EXIT) // jezeli gracz wyszedl z MENU - nic nie robimy :) return; if(!is_user_connected(id)) // jezeli gracz, ktory wybieral cos z menu nie jest polaczony to konczymy interakcje :D return; // zmienne sa wymagane ;( new name[32]; // ta zmienna bedzie przechowywala nick gracza, a inaczej tekst wybranej czesci menu. new callback; // to jest callback na razie Ci nie potrzebny nie zwracaj uwagi new data[6]; // to będzie ID gracza ;) new dostep; // to Ci nie potrzebne; menu_item_getinfo(menu, item, dostep, data, 5, name, 31, callback); // pobieramy dane wybranego/ej itemu/opcji z menu! new id2 = str_to_num(data); if(!is_user_connected(id2)) return; // id2 - to id gracza wybranego z menu :) // name - to jego nick. client_print(id, print_chat, "Wybrales gracza: %s o ID: %d", name, id2); :) }
Proszę.
Nie rozumiesz, pisz - wytłumaczymy w tym temacie.
Przejdź do postu
#1
Napisano 24.11.2013 20:52
Kick All (administracja) - Wyrzuca graczy nakładając hasło na serwer.
Zlecenie Zabójstwa (4FUN) - Przyjmij zlecenie, wykonaj je, zdobądź punkty, a następnie wydaj je na dodatki, które pozwolą ci skuteczniej i szybciej wykonywać zlecenia.
#2
Napisano 24.11.2013 21:08 Najlepsza odpowiedź
Popularny
Myślę, że łatwiej będzie Ci to zrozumieć:
Najpierw tworzymy jakby uchwyt i nazwę naszego menu:
new menu = menu_create("Lista Graczy:", "menu_handler");
Następnie przystępujemy to pętli, ty użyłeś do tego jeszcze funkcji get_players, ale ja osobiście jej nie lubię , bo zawiera błędy itd.
Dlatego użyjemy samej pętli
Najpierw zmienne
new maxplayers = get_maxplayers(); // ile osob moze byc maksymalnie na serwerze new name[32] // zmienna przechowujaca nick gracza new data[6] // to bedzie ID gracza, ktore wysylamy w info :)
Teraz pętla:
for(new i=1; i<=maxplayers; i++) // pętla od 1 DO MAKSYMALNEJ LICZBY GRACZY { if(!is_user_connected(i)) continue; // jezeli gracz o danym ID (i) nie jest polaczony to go pomijamy uzwajać "continue" if(is_user_hltv(i) || is_user_bot(i)) continue; // jezeli dane ID to HLTV/BOT - pomijamy! num_to_str(i, data, 5); get_user_name(id, name, 31); // pobieramy nick menu_additem(menu, name, data); // dodajemy do menu gracza. }
Zakończenie menu, czyli wyświetlelnie:
menu_display(id, menu, item);
Teraz funkcja menu_handler
public menu_handler(id, menu, item) { if(item == MENU_EXIT) // jezeli gracz wyszedl z MENU - nic nie robimy :) return; if(!is_user_connected(id)) // jezeli gracz, ktory wybieral cos z menu nie jest polaczony to konczymy interakcje :D return; // zmienne sa wymagane ;( new name[32]; // ta zmienna bedzie przechowywala nick gracza, a inaczej tekst wybranej czesci menu. new callback; // to jest callback na razie Ci nie potrzebny nie zwracaj uwagi new data[6]; // to będzie ID gracza ;) new dostep; // to Ci nie potrzebne; menu_item_getinfo(menu, item, dostep, data, 5, name, 31, callback); // pobieramy dane wybranego/ej itemu/opcji z menu! new id2 = str_to_num(data); if(!is_user_connected(id2)) return; // id2 - to id gracza wybranego z menu :) // name - to jego nick. client_print(id, print_chat, "Wybrales gracza: %s o ID: %d", name, id2); :) }
Proszę.
Nie rozumiesz, pisz - wytłumaczymy w tym temacie.
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
#3
Napisano 24.11.2013 21:36
To chyba tyle jeżeli chodzi o pytania
PS.
Ale i tak dzięki za szybką reakcję[..]a nie chcę wzorować się na gotowcach, bo tak się nic nie nauczę i nie chcę też dostawać tutaj gotowych odpowiedzi, a raczej proszę o naprowadzenie mnie na właściwe rozwiązanie.
Kick All (administracja) - Wyrzuca graczy nakładając hasło na serwer.
Zlecenie Zabójstwa (4FUN) - Przyjmij zlecenie, wykonaj je, zdobądź punkty, a następnie wydaj je na dodatki, które pozwolą ci skuteczniej i szybciej wykonywać zlecenia.
#4
Napisano 24.11.2013 22:09
O co chodzi z przypisaniem zmiennej data jako info itemu w pętli (To jest potrzebne do menu_item_getinfo, tak?)?
Tak, parametr info w menu_additem - jest bardzo przydatny - możesz umieścić tam ID gracza (tylko najpierw trzeba zamienić liczbę na string num_to_str) i wiele innych rzeczy.
Właściwie ty chciałeś tylko nick gracza, ale ja jeszcze w handlerze pobrałem Ci ID gracza właśnie dzięki temu służy info.
Funkcją menu_item_getinfo pobierasz informacje o wybranej opcji (itemie) z menu - ja pobrałem zawartość tekstową opcji czyli nick oraz info - czyli ID w stringu (jeszcze pobrałem callbacka i dostęp - ale o tym poczytaj w poradniku w dziale Turtoriale)
Następnie zamieniłem string na liczbę (str_to_num) - następnie sprawdziłem, czy ten gracz jest jeszcze na serwerze .
Tak podałem Ci jeszcze ID gracza mimo iż prosiłeś tylko o nick - ale jak wiemy mając ID możemy też pobrać nick , więc ID daje nam więcej możliwości.
Czy funkcja menu_handler stała się jedną dla wszystkich itemów?
Zawsze tak jest - tylko zmienia się parametr item w funkcji (trzeci parametr).
ITEM nie jest równe ID gracza wybranego - dlatego to info między innymi .
Mam rozumieć, że wartość "data" w "new id2 = num_to_str(data)" jest pobierana z powyższego "item_menu_getinfo"?
Tak - wyżej zgrubsza to wyjaśniłem w dokumentacji powinno być to bardziej opisane. -> menu_item_getinfo
PS.
Ale i tak dzięki za szybką reakcję[..]a nie chcę wzorować się na gotowcach, bo tak się nic nie nauczę i nie chcę też dostawać tutaj gotowych odpowiedzi, a raczej proszę o naprowadzenie mnie na właściwe rozwiązanie.
Sorki, ale cięzko to przedstawić bez dokładnych przykładów itd., lepiej podać tak niż bez żadnych moich komentarzy
Użytkownik HubertTM edytował ten post 24.11.2013 22:11
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
#5
Napisano 24.11.2013 22:12
@@edit
PS. Popraw literówki, bo ktoś może nie zauważyć, że w
client_print(id, print_chat, "Wybrales gracza: %s o ID: %d", name, id2); :)uśmieszek jest niezakomentowany i potem dziwić się, że się nie skompiluje
@@edit2
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /menu", "menu_handle") } public menu_handle(id) { new menu = menu_create("Lista graczy:", "menu_handler") new maxplayers = get_maxplayers() new name[32], data[6] for(new i=1;i<=maxplayers;i++) { if(!is_user_connected(i)) continue; if(!is_user_hltv(i) || !is_user_bot(i)) continue; num_to_str(i, data, 5); get_user_name(i, name, 31); menu_additem(menu, name, data); } menu_display(id, menu) } public menu_handler(id, menu, item) { if(item == MENU_EXIT) return; if(!is_user_connected(id)) return; new name[32] new callback new data[6] new dostep menu_item_getinfo(menu, item, dostep, data, 5, name, 31, callback); new id2 = str_to_num(data); if(!is_user_connected(id2)) return; client_print(id, print_chat, "Wybrales gracza %s o id: %d", name, id2); }
Wygląda to tak, ale po wpisaniu na say /menu nic się nie dzieje Dx.
Użytkownik Mister Silenzo edytował ten post 24.11.2013 22:40
Kick All (administracja) - Wyrzuca graczy nakładając hasło na serwer.
Zlecenie Zabójstwa (4FUN) - Przyjmij zlecenie, wykonaj je, zdobądź punkty, a następnie wydaj je na dodatki, które pozwolą ci skuteczniej i szybciej wykonywać zlecenia.
#6
Napisano 25.11.2013 18:42
[code=pawn:27] if(!is_user_hltv(i) || !is_user_bot(i))
continue;[/pawn]
Warunek ten oznacza:
Jeśli gracz NIE jest HLTV lub NIE jest botem, pomiń jego dodawanie do menu (instrukcja continue pomija bieżące wykonanie pętli i przeskakuje do następnego). Co oznacza, że w menu dostaniesz tylko graczy, którzy są jednocześnie HLTV i botami, a tacy nie istnieją. Dlatego nic się nie dzieje
Prawidłowo powinno być bez wykrzykników, wtedy nie negujesz warunków.
Co do menu, podpowiem tylko, że jeśli korzystasz z ID gracza to możesz wywołać przypadkiem opcję z menu dla gracza, który już opuścił serwer, a na jego miejsce wszedł inny. Dlatego dobrze jest w takich miejscach użyć zamiast ID, userid, które jest zawsze unikalne, więc jak gracz opuści serwer, to na 100% będziesz o tym wiedział
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#7
Napisano 25.11.2013 20:15
Kick All (administracja) - Wyrzuca graczy nakładając hasło na serwer.
Zlecenie Zabójstwa (4FUN) - Przyjmij zlecenie, wykonaj je, zdobądź punkty, a następnie wydaj je na dodatki, które pozwolą ci skuteczniej i szybciej wykonywać zlecenia.
#8
Napisano 25.11.2013 20:22
get_user_useridNo tak, nie zauważyłem błędu w tej negacji ;_; Mówiąc userid masz na myśli SID i "SID" z revEmu, tak?
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#9
Napisano 25.11.2013 21:41
Dlatego dobrze jest w takich miejscach użyć zamiast ID, userid, które jest zawsze unikalne, więc jak gracz opuści serwer, to na 100% będziesz o tym wiedział
Gwynu masz rację - ale jaka jest szansa, że to nastąpi? Gracz musi wyjść i wejść ktoś na serwer i musi to ID być aktualnie najmniejsze + menu musi być prawdopodobnie bardzo wolno wciskane .
Owszem masz rację, ale po co chłopakowi utrudniać może zrobić tak w menu_handler:
Pobiera nick gracza i sprawdza czy taką samą opcję wybrał (pobieramy nazwę itemu menu_item_getinfo)
czyli:
new name2[32]; get_user_name(id2, name2, 31) if(equal(name, name2)) // tego samego gracza wybral
Oczywiście narażamy się na zmianę nicku, ale przynajmniej kod się nie wykona , i wcale koledze nie utrudnimy sprawdzania tego gracza , bo jak byśmy użyli userid to musiałby pętli użyć
Średni z tego argument, ale jednak jak ja bym się uczył to nie wiedział bym jak użyć twej wskazówki.
Dlatego jeśli Mister Silenzo jest ciekaw o co chodzi Gwynowi
Wystarczy użyć tego:
for(new i=1; i<=maxplayers; i++) // pętla od 1 DO MAKSYMALNEJ LICZBY GRACZY { if(!is_user_connected(i)) continue; // jezeli gracz o danym ID (i) nie jest polaczony to go pomijamy uzwajać "continue" if(is_user_hltv(i) || is_user_bot(i)) continue; // jezeli dane ID to HLTV/BOT - pomijamy! num_to_str(get_user_userid(i), data, 5); get_user_name(id, name, 31); // pobieramy nick menu_additem(menu, name, data); // dodajemy do menu gracza. }
oraz tego:
public menu_handler(id, menu, item) { if(item == MENU_EXIT) return; if(!is_user_connected(id)) return; new name[32] new callback new data[6] new dostep menu_item_getinfo(menu, item, dostep, data, 5, name, 31, callback); new userid = str_to_num(data); new id2 = get_id_by_userid(userid); if(!id2) return; client_print(id, print_chat, "Wybrales gracza %s o id: %d", name, id2); } stock get_id_by_userid(userid){ for(new i=1; i<33; i++) // tutaj warto dodac zmienna z maxplayers graczy if(is_user_connected(i) && get_user_userid(i) == userid) return i; return 0; }
Można też użyć cmd_target, ale i tak moja wersja jest raczej lepsza
Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!
Na zlecenie i bez zlecenia zresztą też!
#10
Napisano 25.11.2013 23:50
Jakie są szanse? Często podaję ten sam przykład z autopsji: na jednym z serwerów moich jest plugin na transfer kasy, wpisujesz w czacie /transfer, wybierasz komu i ile kasy chcesz przekazać i przekazuje tyle i tyle kasy. Często niestety się gracze skarżyli, że kasa idzie do nie tej osoby, którą wybrali w menu... właśnie przez brak takiego sprawdzenia... Przy pełnym 32 slotowym serwerze jest bardzo duża szansa, że ktoś akurat po kimś innym ID zajmie w mgnieniu oka...
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych