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 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: 1
0 użytkowników, 1 gości, 0 anonimowych


Dodatki SourceMod



Temat jest zamknięty









