←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Invalid cellvector handle pro...


Najlepsza odpowiedź sebul 23.08.2014 11:40

W tym samym czasie przynajmniej dwie osoby korzystają z tego menu i jeśli jedna osoba kupi (czyli wykona się ArrayDeleteItem), to wtedy wszystkie inne rzeczy znajdujące się w array, przesuwają się i druga osoba chcąc kupić ostatni perk, nie kupi go, bo został już on przesunięty na wcześniejszą pozycję. Albo Ty, albo ktoś inny po prostu napisał nie do końca przemyślany kod. Przejdź do postu
Zablokowany

  • +
  • -
Eryk172 - zdjęcie Eryk172 23.08.2014

Witam, proszę o pomoc.

Co w tym kodzie jest źle? ( Niżej ERROR)

public rynek_kupno(id)
{
	new szText[128], data[2];
	
	formatex(szText, charsmax(szText), "\yDostepne Oferty:");
	new menu = menu_create(szText, "rynek_kupno_handler");
	
	for(new i = 0; i < ArraySize(items); ++i)
	{
		new perk[e_Perk], name[33];

		ArrayGetArray(items,i,perk);
		get_user_name(perk[OWNER_ID], name, 32);
		data[0] = i+1;
		data[1] = perk[ITEM_ID];
		formatex(szText, charsmax(szText), "%s\y [%s]\w Cena:\r [%i Monet]\w Wytrzymalosc:\r [%d/100]", name, perk[PERK_NAME],perk[PERK_PRICE],perk[PERK_DURABILITY]);
		menu_additem(menu, szText, data);
	}
	
	menu_setprop(menu, MPROP_BACKNAME, "Wstecz");
	menu_setprop(menu, MPROP_NEXTNAME, "Dalej");
	menu_setprop(menu, MPROP_EXIT, "Wyjscie");
	menu_display(id, menu);
	
	return PLUGIN_CONTINUE;
}

public rynek_kupno_handler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new szText[512], iLen = 0, iMax = sizeof(szText) - 1;
	new perk[e_Perk], opis[64], name[32];
	new data[2], zaccess, callback;
	menu_item_getinfo(menu, item, zaccess, data, 2, _, _, callback);
	
	ArrayGetArray(items,item,perk);
	
	get_user_name(perk[OWNER_ID], name, 32);
	cod_get_perk_desc(perk[PERK_ID], opis, charsmax(opis));
		
	iLen += formatex(szText[iLen], iMax-iLen, "Potwierdzenie kupna perku od: \r%s^n", name);
	iLen += formatex(szText[iLen], iMax-iLen, "\yPerk: \r%s^n", perk[PERK_NAME]);
	iLen += formatex(szText[iLen], iMax-iLen, "\yOpis: \r%s^n", opis);
	iLen += formatex(szText[iLen], iMax-iLen, "\yKoszt: \r%d Monet^n", perk[PERK_PRICE]);
	iLen += formatex(szText[iLen], iMax-iLen, "\yWytrzymalosc: \r%d/100^n^n", perk[PERK_DURABILITY]);
	iLen += formatex(szText[iLen], iMax-iLen, "\wCzy chcesz kupic ten perk?");
	
	new menu = menu_create(szText, "rynek_kupno_potwierdzenie");
	
	menu_additem(menu, "\yTak", data);
	menu_additem(menu, "\rNie");

	menu_setprop(menu,MPROP_EXIT,MEXIT_NEVER)
	menu_display(id, menu);
	
	return PLUGIN_CONTINUE;
}

public rynek_kupno_potwierdzenie(id, menu, item)
{
	if(item == MENU_EXIT || item == 1)
	{
		rynek_kupno(id);
		return PLUGIN_HANDLED;
	}
	
	new data[2], zaccess, callback;
	menu_item_getinfo(menu, item, zaccess, data, 2, _, _, callback);
	
	new perk[e_Perk];
	new item_id = data[0]-1;
	ArrayGetArray(items,item_id,perk);
	
	if(data[1] != perk[ITEM_ID])
	{
		ColorChat(id, GREEN, "[%s]^x03 Perk zostal juz kupiony.", PREFIX);
		rynek_kupno(id);
		return PLUGIN_CONTINUE;
	}

	if(cod_get_user_coins(id) < perk[PERK_PRICE])
	{
		ColorChat(id, GREEN, "[%s]^x03 Masz za malo monet!", PREFIX);
		rynek_kupno(id);
	}
	else
	{
		new nick[32];
		get_user_name(id, nick, charsmax(nick));
		cod_set_user_coins(id, cod_get_user_coins(id) - perk[PERK_PRICE]);
		cod_set_user_coins(perk[OWNER_ID], cod_get_user_coins(perk[OWNER_ID]) + perk[PERK_PRICE]);
		
		cod_set_user_perk(id, perk[PERK_ID]);
		cod_set_perk_durability(id, perk[PERK_DURABILITY]);
		
		ColorChat(id, GREEN, "[%s]^x03 Perk zostal zakupiony pomyslnie!", PREFIX);
		ColorChat(perk[OWNER_ID], GREEN, "[%s]^x03 Twoj perk zostal zakupiony przez^x04 %s^x03. Otrzymujesz^x04 %i Monet^x03.", PREFIX, nick, perk[PERK_PRICE]);
		ArrayDeleteItem(items,item_id)
	}
	
	return PLUGIN_CONTINUE;
}

public rynek_usun(id) {
	new szText[128], data[2];
	
	formatex(szText, charsmax(szText), "\yTwoje Oferty:");
	new menu = menu_create(szText, "rynek_usun_handler");
	
	for(new i = 0; i < ArraySize(items); ++i)
	{
		new perk[e_Perk];
		ArrayGetArray(items,i,perk);
		
		if(perk[OWNER_ID] != id)
			continue;
			
		data[0] = i+1;
		data[1] = perk[ITEM_ID];
		formatex(szText, charsmax(szText), "\y[%s]\w Cena:\r [%i Monet]\w Wytrzymalosc:\r [%d/100]", perk[PERK_NAME],perk[PERK_PRICE],perk[PERK_DURABILITY]);
		menu_additem(menu, szText, data);
	}
	
	menu_setprop(menu, MPROP_BACKNAME, "Wstecz");
	menu_setprop(menu, MPROP_NEXTNAME, "Dalej");
	menu_setprop(menu, MPROP_EXIT, "Wyjscie");
	menu_display(id, menu);
}

public rynek_usun_handler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new szText[256], iLen = 0, iMax = sizeof(szText) - 1;
	new perk[e_Perk], item_id;
	new data[2], zaccess, callback;
	menu_item_getinfo(menu, item, zaccess, data, 2, _, _, callback);
	item_id = data[0]-1;
	
	ArrayGetArray(items,item_id,perk);
		
	iLen += formatex(szText[iLen], iMax-iLen, "Potwierdzenie usuniecia perku.^n");
	iLen += formatex(szText[iLen], iMax-iLen, "\yPerk: \r%s^n", perk[PERK_NAME]);
	iLen += formatex(szText[iLen], iMax-iLen, "\yKoszt: \r%d Monet^n", perk[PERK_PRICE]);
	iLen += formatex(szText[iLen], iMax-iLen, "\yWytrzymalosc: \r%d/100^n^n", perk[PERK_DURABILITY]);
	iLen += formatex(szText[iLen], iMax-iLen, "\wCzy chcesz usunac ten perk?");
	
	new menu = menu_create(szText, "rynek_usun_potwierdzenie");
	
	menu_additem(menu, "\yTak", data);
	menu_additem(menu, "\rNie");

	menu_setprop(menu,MPROP_EXIT,MEXIT_NEVER)
	menu_display(id, menu);
	
	return PLUGIN_CONTINUE;
}

public rynek_usun_potwierdzenie(id, menu, item)
{
	if(item == MENU_EXIT || item == 1)
	{
		rynek_usun(id);
		return PLUGIN_HANDLED;
	}
	
	new data[2], zaccess, callback;
	menu_item_getinfo(menu, item, zaccess, data, 2, _, _, callback);
	
	new perk[e_Perk];
	new item_id = data[0]-1;
	ArrayGetArray(items,item_id,perk);
	
	if(data[1] != perk[ITEM_ID])
	{
		ColorChat(id, GREEN, "[%s]^x03 Perk zostal juz kupiony.", PREFIX);
		rynek_usun(id);
		return PLUGIN_CONTINUE;
	}
	
	ArrayDeleteItem(items,item_id)
	ColorChat(id, GREEN, "[%s]^x03 Perk zostal pomyslnie usuniety z rynku!", PREFIX)
	rynek_usun(id);
	
	return PLUGIN_CONTINUE;
}

error:

L 08/23/2014 - 10:50:44: Start of error session.
L 08/23/2014 - 10:50:44: Info (map "de_dust2_long_2012") (file "addons/amxmodx/logs/error_20140823.log")
L 08/23/2014 - 10:50:44: Invalid cellvector handle provided (2:1:1)
L 08/23/2014 - 10:50:44: [AMXX] Displaying debug trace (plugin "cod_rynek.amxx")
L 08/23/2014 - 10:50:44: [AMXX] Run time error 10: native error (native "ArrayGetArray")
L 08/23/2014 - 10:50:44: [AMXX]    [0] cod_rynek.sma::rynek_kupno_handler (line 223)

Odpowiedz

  • +
  • -
Najlepsza odpowiedź sebul - zdjęcie sebul 23.08.2014

W tym samym czasie przynajmniej dwie osoby korzystają z tego menu i jeśli jedna osoba kupi (czyli wykona się ArrayDeleteItem), to wtedy wszystkie inne rzeczy znajdujące się w array, przesuwają się i druga osoba chcąc kupić ostatni perk, nie kupi go, bo został już on przesunięty na wcześniejszą pozycję. Albo Ty, albo ktoś inny po prostu napisał nie do końca przemyślany kod.
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 23.08.2014

Dobre i złe nawyki tworzenia menu
To powinno wyczerpać temat.
Odpowiedz
Zablokowany