[ROZWIĄZANE] dodawanie do menu graczy z pr...
Best Answer BlackPerfum 31.07.2013 15:15
Chodziło mu o aby nie tworzyć zmiennej i dać tylko jeden warunek:
if(get_user_team(id2) == team) continue;
A przed pętlą sprawdzać czy czasem gracz nie jest nie przydzielony do żadnego temu lub czy jest na specu
A co do kompilacji to zamień:
menu_item_getinfo(menu, item, access, data, 1, _, _, callback);
Na:
menu_item_getinfo(menu, item, access, strid, 1, _, _, callback);Go to the full post
Rivit
29.07.2013
witam jak zrobic w tym kawalku kodu zeby do menu dodawalo tylko graczy z przeciwnego teamu?
public Gracz(id) { new menu = menu_create("Wybierz gracza:", "Gracz_handler"); for(new i=0, n=0; i<=32; i++) { if(!is_user_connected(i)) continue; if(get_user_team(i) == 1 || get_user_team(i) == 2) { gracz_id[n++] = i; new nazwa_gracza[64]; get_user_name(i, nazwa_gracza, 63) menu_additem(menu, nazwa_gracza, "0", 0); } } menu_display(id, menu); }
BlackPerfum
29.07.2013
Lekko przerobiłem twoją pętelkę:
public Gracz(id) { new menu = menu_create("Wybierz gracza:", "Gracz_handler") new Players[32], playerCount, team, id2, team2, nick[32], strid[2] team = get_user_team(id) //Zapisuję team gracza get_players(Players, playerCount, "h") // Pobieram pełną listę graczy na serwerze (omijam hltv) for(new i=0; i<playerCount; i++) { id2 = Players[i] // Pobieram id gracza z tablicy if(!is_user_connected(id2)) continue // Nie stety zawsze trzeba sprawdzić czy gracz jest podłączony do serera team2 = get_user_team(id2) // Zapisuję team gracza if(team2 == team || !team || team == 3) continue; // Sprawdzam czy gracz jest w twojej dróżynie lub czy jest nie przydzielony do dróżyny albo czy jest na specu (jeśli tak to go omijam) get_user_name(id2, nick, 31) num_to_str(id2,strid,1) // Zamieniam id na ciąg znaków menu_additem(menu, nick, strid) // Dodaje info do itemu (info to id) } menu_display(id, menu) }
Zakładam że zmienna globalna "gracz_id" jest po to aby w funkcji "Gracz_handler" można było wiedzieć którego gracza wybrano. Ja ci przedstawiam troszkę lepszą metodę za pomocą info w przycisku tzn."strid".
Teraz w funkcji wychwytującej naciśnięcie przycisku robisz mniej więcej tak:
public Gracz_handler(id,menu,item) { if(item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_CONTINUE } new access, callback, strid[2],id2 // Marnowanie miejsca menu_item_getinfo(menu, item, access, data, 1, _, _, callback) //Pobieramy dane przycisku new id2 = str_to_num(strid) // id2 to id gracza którego nick został przydzielony do przyciśniętego przycisku :D // Dalszy kod twojej funkcji }
Rivit
29.07.2013
WTF??? Kompletnie nie czaje. ja mam cos takiego:
public Gracz(id) { new menu = menu_create("Wybierz gracza:", "Gracz_handler"); for(new i=0, n=0; i<=32; i++) { if(!is_user_connected(i)) continue; if(get_user_team(i) == 1 || get_user_team(i) == 2) { gracz_id[n++] = i; new nazwa_gracza[64]; get_user_name(i, nazwa_gracza, 63) menu_additem(menu, nazwa_gracza, "0", 0); } } menu_display(id, menu); } public Gracz_handler(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_CONTINUE; } wybrany = gracz_id[item]; get_user_name(wybrany, name, 32); // i tu dalej moje rzeczy }
BlackPerfum
29.07.2013
Ty pakujesz wszystkie id do jednej zmiennej a ja poprzez info przesyłam je do drugiej funkcji id2(u mnie) == wybrany(u ciebie) tylko u ciebie pętla obraca się 32 razy a u mnie tylko tyle co jest osób na serwerze - hltv. Jak nadal nie rozumiesz to napisz dokładnie czego
Rivit
29.07.2013
z ta petla rozumiem
czyli to bedzie dzialalo Gracz(id)... ok
a co z gracz handler bo tego nie czaje
new access, callback, strid[2],id2 // Marnowanie miejsca menu_item_getinfo(menu, item, access, data, 1, _, _, callback) //Pobieramy dane przycisku new id2 = str_to_num(strid) // id2 to id gracza którego nick został przydzielony do przyciśniętego przycisku :D
jak podpiac to pod to:
public Gracz_handler(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_CONTINUE; } wybrany = gracz_id[item]; get_user_name(wybrany, name, 32); // i tu dalej moje rzeczy }
BlackPerfum
29.07.2013
Patrz:
Jeszcze dodam iż możesz usunąć zmienną "wybrany"
Edited by BlackPerfum, 29.07.2013 12:40.
BlackPerfum
29.07.2013
a za zmienna wybrany jest jaka nazwa?
Nie rozumiem do końca twojego pytania. Ale zakładam iż chodziło ci o to w jaki sposób przekazuje id pomiędzy dwoma funkcjami. Przekazuję id poprzez info w przycisku tzn. nie robię żadnej zmiennej globalnej (przynajmniej w pluginie nie wiem jak to jest przekazywane w amxx`e)
Rivit
29.07.2013
get_user_name(id2, name, 31); cod_set_user_perk(wybrany, 0);
skoro nie ma juz teraz wybrany to jak mu wyrzucic perk? co podac za wybrany? id2?
Klakier
29.07.2013
Wystarczy coś takiego:
public Gracz(id) { new menu = menu_create("Wybierz gracza:", "Gracz_handler"); for(new i=0, n=0; i<=32; i++) { if(!is_user_connected(i)) continue; if(get_user_team(i) == get_user_team(id)) continue; gracz_id[n++] = i; new nazwa_gracza[64]; get_user_name(i, nazwa_gracza, 63) menu_additem(menu, nazwa_gracza, "0", 0); } menu_display(id, menu); }
BlackPerfum
29.07.2013
Klakier twój kod podziała lecz:
- Pętla nie potrzebnie obraca się tyle razy
- Nie potrzebnie jest stworzona zmienna globalna
- Jak już robisz to zmienną globalną to musi być dwu wymiarowa a nie jedno (jak inny gracz otworzy to menu to wszystkie id się przestawią)
- "new nazwa_gracza[64]" nick może posiadać maksymalnie 31 znaków
- W najgorszym wypadku sprawdzasz 32 razy w jakim team'ie jest gracz(u którego wyświetla się menu) a wystarczy tylko jeden raz
To chyba tyle
Rivit
30.07.2013
Klakier twój kod podziała lecz:
- Pętla nie potrzebnie obraca się tyle razy
- Nie potrzebnie jest stworzona zmienna globalna
- Jak już robisz to zmienną globalną to musi być dwu wymiarowa a nie jedno (jak inny gracz otworzy to menu to wszystkie id się przestawią)
- "new nazwa_gracza[64]" nick może posiadać maksymalnie 31 znaków
- W najgorszym wypadku sprawdzasz 32 razy w jakim team'ie jest gracz(u którego wyświetla się menu) a wystarczy tylko jeden raz
petle mozna zrobic aby obrocila sie tyle razy ile jest osob na serwie
zmienna globalna? A w czym to przeszkadza??
dwuwymiarowa? a jak 3 graczy otworzy?
nazwa gracza... fakt zawsze sie daje 32
tego nie czaje. jak 32 razy?
BlackPerfum
30.07.2013
Ale nie zrobił!!!
petle mozna zrobic aby obrocila sie tyle razy ile jest osob na serwie
Marnowanie miejsca tzn. serwer nie będzie mógł już spożytkować zabieranego przez nią miejsca a ona jest nie potrzebna
zmienna globalna? A w czym to przeszkadza??
Chyba nie wiesz co to są tablice dwu wymiarowe. Tak wygląda jedna z nich:"new zmienna[33][33]" do takiej zmiennej (teoretycznie) może 33 graczy wpakować 33 id innych graczy
dwuwymiarowa? a jak 3 graczy otworzy?
W jego pętli masz coś takiego:
tego nie czaje. jak 32 razy?
if(get_user_team(i) == get_user_team(id)) continue;
Jeśli by były 32 osoby na serwerze to 31 razy nie potrzebnie sprawdził być w jakim teamie jest gracz otwierające to menu tzn. wystarczy zamienić na to:
new team = get_user_team(id) // przed pętlą
if(get_user_team(i) == team) continue;//W pętli
Rivit
31.07.2013
public Gracz(id) { new menu = menu_create("Wybierz gracza:", "Gracz_handler") new Players[32], playerCount, team, id2, team2, nick[32], strid[2] team = get_user_team(id) get_players(Players, playerCount, "h") for(new i=0; i<playerCount; i++) { id2 = Players[i] if(!is_user_connected(id2)) continue team2 = get_user_team(id2) if(team2 == team || !team || team == 3) continue; get_user_name(id2, nick, 31) num_to_str(id2,strid,1) menu_additem(menu, nick, strid) } menu_display(id, menu) } public Gracz_handler(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_CONTINUE; } new access, callback, strid[2], id2, name[32]; menu_item_getinfo(menu, item, access, data, 1, _, _, callback); new id2 = str_to_num(strid); get_user_name(id2, name, 31); get_user_name(id, wyrzucajacy, 32); cod_set_user_perk(id2, 0);
to sie kompiluje ale są warny
np.
- undefined symbol "data"
- invalid expression assumed zero
- expression has no effect
jak to naprawic? nie chce miec tych warnow
Klakier
31.07.2013
dlaczego sobie tak komplikujecie życie ?
team2 = get_user_team(id2) if(team2 == team || !team || team == 3) continue;
Best Answer
BlackPerfum
31.07.2013
Chodziło mu o aby nie tworzyć zmiennej i dać tylko jeden warunek:
if(get_user_team(id2) == team) continue;
A przed pętlą sprawdzać czy czasem gracz nie jest nie przydzielony do żadnego temu lub czy jest na specu
A co do kompilacji to zamień:
menu_item_getinfo(menu, item, access, data, 1, _, _, callback);
Na:
menu_item_getinfo(menu, item, access, strid, 1, _, _, callback);
Edited by BlackPerfum, 31.07.2013 15:17.