←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Problem z pobieraniem textu


Najlepsza odpowiedź _McHappy 28.08.2017 20:51

Wszelako pojęte tablice z danymi przekazywane są jako argumenty funkcji(przez referencję), a nie przez nie zwracane. Patrz przykład:

public PobierzJakisTekst(id, TablicaZTekstem[], dlugoscTekstu)
{
param_convert(2);
copy(TablicaZTekstem, dlugoscTekstu, JakisTekstNpGracza[id]);
}

Wywołanie:
new szZmienna[64];
PobierzJakisTekst(id, szZmienna, 63);

Potem wykorzystanie, np:
client_print(id, print_center, "Twoja zmienna tekstowa: %s", szZmienna); Przejdź do postu

  • +
  • -
Split - zdjęcie Split 28.08.2017

Witam. Mam pewien problem, otóż od niedawana zacząłem zabawę w Pawn. Jest jeden problem. Zrobiłem tablicę z itemami (przedmiotami)

new const nazwy_przedmiotow[][] = { "Brak", 
"Item 1", // 1
}
A następnie funkcję:
public native_cod_get_user_item_name(id)
{
	new item[64]

format(item, charsmax(item), nazwy_przedmiotow[informacje_przedmiotu_gracza[id][0]])
	
	return item
}
Oczywiście "informacje_przedmiotu_gracza[id][0]" zawiera ID przedmiotu, czyli 1 to "Item 1"

Problem leży właśnie po tym że nie może mi zwrócić nazwy.

		for (new i = 1; i <= get_maxplayers(); i++)
		{
			if (!is_user_connected(i))
				continue
				
			new name[64]
			get_user_name(i, name, charsmax(name))
			
			//new item
			//item = cod_get_user_item_name(i)
			
			new player[64]
			format(player, charsmax(player), "%s (%s)", name, cod_get_user_item_name(i))
			
			menu_additem(menu, player, _, _, menu_call)
		}
I podczas zwracania wartości Pokazuje mi coś takiego:
- .WhiteBlue (s)

a powinno pisać
- .WhiteBlue (item 1)

Proszę o pomoc.
Odpowiedz

  • +
  • -
xBredeK - zdjęcie xBredeK 28.08.2017

W tym 

		for (new i = 1; i <= get_maxplayers(); i++)
		{
			if (!is_user_connected(i))
				continue
				
			new name[64]
			get_user_name(i, name, charsmax(name))
			
			//new item
			//item = cod_get_user_item_name(i)
			
			new player[64]
			format(player, charsmax(player), "%s (%s)", name, cod_get_user_item_name(i))
			
			menu_additem(menu, player, _, _, menu_call)
		}

nie powinno być zamiast "%s (%s)" takie coś "%s (%i)" ?

Odpowiedz

  • +
  • -
Split - zdjęcie Split 28.08.2017

Niestety nie, gdy %i jest to liczba a ja chcę zwracać nazwę itemu, nie ID.
Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 28.08.2017

Możesz pokazać cały public? Mam wrażenie, że błędem jest wyświetlanie opcji w menu, a nie samo formatowanie (bo z tego co widzę, to chyba kod jest spójny).

Odpowiedz

  • +
  • -
Najlepsza odpowiedź _McHappy - zdjęcie _McHappy 28.08.2017

Wszelako pojęte tablice z danymi przekazywane są jako argumenty funkcji(przez referencję), a nie przez nie zwracane. Patrz przykład:

public PobierzJakisTekst(id, TablicaZTekstem[], dlugoscTekstu)
{
param_convert(2);
copy(TablicaZTekstem, dlugoscTekstu, JakisTekstNpGracza[id]);
}

Wywołanie:
new szZmienna[64];
PobierzJakisTekst(id, szZmienna, 63);

Potem wykorzystanie, np:
client_print(id, print_center, "Twoja zmienna tekstowa: %s", szZmienna);
Użytkownik _McHappy edytował ten post 28.08.2017 21:14
Odpowiedz

  • +
  • -
Split - zdjęcie Split 28.08.2017

A mogę spytać co robi param_convert ?
Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 28.08.2017

param_convert() używane jest dla natywów o parametrze 'style'=1
Funkcja ta przygotowuje zwykły parametr do przekazania poprzez referencję.
Odpowiedz

  • +
  • -
Split - zdjęcie Split 28.08.2017

Kumam. Jak mam użyć Twojego przykładu w tej funkcji ?
 
public native_cod_get_user_item_id(id)
{

	new item = informacje_przedmiotu_gracza[id][0]
	
	return item
}

public native_cod_get_user_item_name(id)
{
	new item = nazwy_przedmiotow[informacje_przedmiotu_gracza[id][0]]
	
	return item
}
W natywach mam to:
native cod_set_user_item(id, amount)

native cod_get_user_item_id(id)

native cod_get_user_item_name(id)
Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 28.08.2017

Natyw:

native cod_get_user_item_name(id, szReturn[], iLen);

Ciało natywu:

public native_cod_get_user_item_name(id, szReturn[], iLen)
{
	param_convert(2);
        copy(szReturn, iLen, nazwy_przedmiotow[informacje_przedmiotu_gracza[id][0]]);
}

Wywołanie:

		for (new i = 1; i <= get_maxplayers(); i++)
		{
			if (!is_user_connected(i))
				continue
				
			new name[64]
			get_user_name(i, name, charsmax(name))
			
			new szItemName[32];
			cod_get_user_item_name(id, szItemName, charsmax(szItemName));
			
			new player[64]
			format(player, charsmax(player), "%s (%s)", name, szItemName)
			
			menu_additem(menu, player, _, _, menu_call)
                }

Użytkownik _McHappy edytował ten post 28.08.2017 22:17
Odpowiedz

  • +
  • -
Split - zdjęcie Split 28.08.2017

Rozwiązane. Dzięki za pomoc. Sam bym na to nie wpadł.
Odpowiedz