←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Jak przekazać strukturę danych w menu?


Best Answer Rivit 13.07.2017 15:43

int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max)
{
	register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
	register cell* start = dest;

#if defined BINLOG_ENABLED
	if (g_binlog_level & 2)
	{
		CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
		if (pl)
			g_BinLog.WriteOp(BinLog_SetString, pl->getId(), amx_addr, max, source);
	}
#endif
	
	while (max-- && *source)
		*dest++ = (unsigned char)*source++;
	
	*dest = 0;
	
	return dest - start;
}
//Gets info about a menu option
//native menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback);
static cell AMX_NATIVE_CALL menu_item_getinfo(AMX *amx, cell *params)
{
	GETMENU(params[1]);

	menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));

	if (!pItem)
		return 0;

	cell *addr = get_amxaddr(amx, params[3]);
	addr[0] = pItem->access;

	set_amxstring(amx, params[4], pItem->cmd.chars(), params[5]);
	set_amxstring(amx, params[6], pItem->name.chars(), params[7]);

	if (params[8])
	{
		addr = get_amxaddr(amx, params[8]);
		if (addr)
			addr[0] = pItem->handler;
	}

	return 1;
}

Chyba ta pętla

while (max-- && *source)
	*dest++ = (unsigned char)*source++;

wrażliwa jestna ten terminator stringa, aczkolwiek mogę się mylić

Go to the full post

  • +
  • -
_McHappy's Photo _McHappy 13.07.2017

Witajcie.

Czy istnieje możliwość przekazania poprzez parametr 'info': menu_additem(iMenu, szNazwaPozycji, szInfoPozycji)

struktury danych w stylu:

enum g_enumJakisZbior {
     iZmienna, 
     szZmienna[16],
     szZmienna2[32],
     iZmienna2
}

?

 

Gdy próbuję wykonać podobną akcję, argument info[] funkcji menu_item_getinfo() zawiera elementy struktury do pierwszej zmiennej tekstowej włącznie, tzn. jedynie iZmienna oraz szZmienna przekazane prawidłowo.

Pozostałe są zwyczajnie równe wartości początkowej (0).

 

Nie wiem, czy chodzi może o terminację string'a ('^0'), czy coś w tym stylu? :D

 

Dla zobrazowania o co chodzi:

Spoiler
Quote

  • +
  • -
Best Answer Rivit's Photo Rivit 13.07.2017

int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max)
{
	register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr));
	register cell* start = dest;

#if defined BINLOG_ENABLED
	if (g_binlog_level & 2)
	{
		CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx);
		if (pl)
			g_BinLog.WriteOp(BinLog_SetString, pl->getId(), amx_addr, max, source);
	}
#endif
	
	while (max-- && *source)
		*dest++ = (unsigned char)*source++;
	
	*dest = 0;
	
	return dest - start;
}
//Gets info about a menu option
//native menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback);
static cell AMX_NATIVE_CALL menu_item_getinfo(AMX *amx, cell *params)
{
	GETMENU(params[1]);

	menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2]));

	if (!pItem)
		return 0;

	cell *addr = get_amxaddr(amx, params[3]);
	addr[0] = pItem->access;

	set_amxstring(amx, params[4], pItem->cmd.chars(), params[5]);
	set_amxstring(amx, params[6], pItem->name.chars(), params[7]);

	if (params[8])
	{
		addr = get_amxaddr(amx, params[8]);
		if (addr)
			addr[0] = pItem->handler;
	}

	return 1;
}

Chyba ta pętla

while (max-- && *source)
	*dest++ = (unsigned char)*source++;

wrażliwa jestna ten terminator stringa, aczkolwiek mogę się mylić

Quote

  • +
  • -
_McHappy's Photo _McHappy 13.07.2017


Chyba ta pętla

while (max-- && *source)
*dest++ = (unsigned char)*source++;

wrażliwa jestna ten terminator stringa, aczkolwiek mogę się mylić

 

Jeszcze to rzutowanie 0.0, na co to komu...

O niebo lepiej byłoby gdyby pozwolili przekazywać prostą tablicę...

 

No nic, pozostaje formatex i ładowanie danych do string'a...

Dzięki za źródło.

Quote

  • +
  • -
Rivit's Photo Rivit 13.07.2017

Zauwaz że taka strukturka co sobie zrobiłeś to jest w rzeczywistości prosta tablica, tylko że odwołujesz się do poszczególnych komórek.

 

Może format(ex) + parse jakieś, nie wiem. Albo obejdź i globalna tymczasowa strukturka ;)

Quote

  • +
  • -
Ogen Dogen's Photo Ogen Dogen 13.07.2017

Enum to nie struktura tylko typ wyliczeniowy ;) W AMXX jedynymi strukturami są tablice, a to co próbujesz osiągnąć jest możliwe w normalnym języku programowania przez tablice asocjacyjne. (przechowujące klucz + wartość)

Tutaj pozostaje ci tylko tablica i odwoływanie się po indeksach.

Quote

  • +
  • -
Rivit's Photo Rivit 13.07.2017

Kiedys robiłem coś takiego (może podobne), miałem chyba z 6 parametrów do przesłania. Dajmy na to tablica 64. Pierwsze 6 komórek to były pozycje od których się zaczynają dane. Potem pętlą wyodrębniałem dane do struktury.

 

Tak jakby na początku tablicy miałem takie 'spis treści' a potem skakałem sobie do tych miejsc. Dziś uważam że to było wymyślanie koła na nowo, ale doświadczenie zawsze się przydaje.

Quote

  • +
  • -
_McHappy's Photo _McHappy 13.07.2017

Użyłem stwierdzenia "struktura danych" ponieważ ogólnie rzecz biorąc przekazywana zmienna zawiera w sobie dane różnych typów, co jest charakterystyczne właśnie dla struktur.

W normalnym języku prog. to cuda niewidy można robić :D

Pomysł z pre-indeksowaniem przyznam - ciekawy (szczególnie jeśli chodzi właśnie o stringi), ale stawiam na prostotę i czytelność ;)

Globalna struktura-enum odpada - zbyt duży rozmiar (64x7 pozycji w najgorszym przypadku).

Miałem rozwiązanie z wykorzystaniem wbudowanego parsera, ale ten enum mnie cholernie swędział.
Edited by _McHappy, 13.07.2017 19:16.
Quote

  • +
  • -
Ogen Dogen's Photo Ogen Dogen 13.07.2017

Kiedys robiłem coś takiego (może podobne), miałem chyba z 6 parametrów do przesłania. Dajmy na to tablica 64. Pierwsze 6 komórek to były pozycje od których się zaczynają dane. Potem pętlą wyodrębniałem dane do struktury.

 

Tak jakby na początku tablicy miałem takie 'spis treści' a potem skakałem sobie do tych miejsc. Dziś uważam że to było wymyślanie koła na nowo, ale doświadczenie zawsze się przydaje.

Raczej nie odkryłeś Ameryki, bo coś podobnego używa się w strukturach plików i pakietów.

Quote

  • +
  • -
Rivit's Photo Rivit 13.07.2017

Wiem że nie odkryłem, napisałem tylko jak ja sobie radziłem. Może autor wpadnie na jakiś pomysł
Quote

  • +
  • -
_McHappy's Photo _McHappy 13.07.2017

W obecnie rozpatrywanej sytuacji pozostanę przy starym, dobrym formatex'ie i parserze (optymalizacja)...
#można zamknąć
Quote