←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] dodawanie do menu graczy z pr...


Najlepsza odpowiedź 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);
Przejdź do postu

  • +
  • -
Rivit - zdjęcie 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);
}
Odpowiedz

Yakashi - zdjęcie Yakashi 29.07.2013

tu masz podzial na druzyny

 

http://darkgl.amxx.p...brojenie-bomby/

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 29.07.2013

ale ktora to petla

 

wklej kod petli

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie 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 :D 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
}
Odpowiedz

  • +
  • -
Rivit - zdjęcie 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
}
Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 29.07.2013

Ty pakujesz wszystkie id do jednej zmiennej a ja poprzez info przesyłam je do drugiej funkcji :D 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

Odpowiedz

  • +
  • -
Rivit - zdjęcie 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
}
Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 29.07.2013

Patrz:

Spoiler

Jeszcze dodam iż możesz usunąć zmienną "wybrany"


Użytkownik BlackPerfum edytował ten post 29.07.2013 12:40
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 29.07.2013

a za zmienna wybrany jest jaka nazwa?
 

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie 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)

Odpowiedz

  • +
  • -
Rivit - zdjęcie 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?

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 29.07.2013

Tak id2 to id gracza którego nick wybrałeś w menu :D

Odpowiedz

  • +
  • -
Klakier - zdjęcie 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);
}
Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie 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 :D

Odpowiedz

  • +
  • -
Rivit - zdjęcie 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?

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 30.07.2013


petle mozna zrobic aby obrocila sie tyle razy ile jest osob na serwie
Ale nie zrobił!!!


zmienna globalna? A w czym to przeszkadza??
Marnowanie miejsca tzn. serwer nie będzie mógł już spożytkować zabieranego przez nią miejsca a ona jest nie potrzebna


dwuwymiarowa? a jak 3 graczy otworzy?
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


tego nie czaje. jak 32 razy?
W jego pętli masz coś takiego:
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
Odpowiedz

  • +
  • -
Rivit - zdjęcie 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

Odpowiedz

  • +
  • -
Klakier - zdjęcie Klakier 31.07.2013

dlaczego sobie tak komplikujecie życie ?

 team2 = get_user_team(id2) 
if(team2 == team || !team || team == 3)    continue;
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 31.07.2013

@up

 

co proponujesz??

Odpowiedz

  • +
  • -
Najlepsza odpowiedź BlackPerfum - zdjęcie 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);

Użytkownik BlackPerfum edytował ten post 31.07.2013 15:17
Odpowiedz