Skocz do zawartości

Rekomendowane odpowiedzi

Witajcie Panowie, mam problem z CODMODem by d0naciak.

Wszystko śmiga prawidłowo poza sklepem do modyfikacji.
Wszystko wygląda tak jakby sklep przechowywał tylko 30itemów, a reszta niby jest wczytana, ale tablica się wysypuje.

Oto wyciąg z konsoli dotyczący tych błędów:

L 09/18/2020 - 22:47:39: [SM] Exception reported: Invalid index 33 (count: 30)
L 09/18/2020 - 22:47:39: [SM] Blaming: d0_shop.smx
L 09/18/2020 - 22:47:39: [SM] Call stack trace:
L 09/18/2020 - 22:47:39: [SM]   [0] ArrayList.GetString
L 09/18/2020 - 22:47:39: [SM]   [1] Line 459, C:\Users\Irek\Desktop\Surf+RPG\cod scripting\d0_shop.sp::BuyItemMenu
L 09/18/2020 - 22:47:39: [SM]   [2] Line 429, C:\Users\Irek\Desktop\Surf+RPG\cod scripting\d0_shop.sp::PlayerItemMenu_Handler
L 09/18/2020 - 22:47:43: [SM] Exception reported: Invalid index 37 (count: 30)
L 09/18/2020 - 22:47:43: [SM] Blaming: d0_shop.smx
L 09/18/2020 - 22:47:43: [SM] Call stack trace:
L 09/18/2020 - 22:47:43: [SM]   [0] ArrayList.GetString
L 09/18/2020 - 22:47:43: [SM]   [1] Line 459, C:\Users\Irek\Desktop\Surf+RPG\cod scripting\d0_shop.sp::BuyItemMenu
L 09/18/2020 - 22:47:43: [SM]   [2] Line 429, C:\Users\Irek\Desktop\Surf+RPG\cod scripting\d0_shop.sp::PlayerItemMenu_Handler

 

Sprawdzałem rozmiary tablic deklarowanych i niby jest ok, ale ten błąd nie jest z niczego.
Oczywiście wszystkie itemy z kategorii można kupić normalnie, lecz kategoria Traile i item trzeci w tej kategorii i następne już nie, jakby miały za duże indexy.


Wstawiam kod tych funkcji, w których ten błąd się znajduje.

Spoiler
public int PlayerItemMenu_Handler(Menu menu, MenuAction action, int client, int item) {
	switch(action) {
		case MenuAction_Cancel: {
			if (item == MenuCancel_ExitBack) {
				SelectItem(client, g_plrLastSelectedCategory[client]);
			}
		}

		case MenuAction_End: {
			if(menu != null) {
				delete menu;
			}
		}

		case MenuAction_DrawItem: {
			char info[4];
			menu.GetItem(item, info, sizeof(info));

			if(info[0] == '0') {
				return ITEMDRAW_DISABLED;
			}
		}

		case MenuAction_Select: {
			char info[32];
			menu.GetItem(item, info, sizeof(info));
			strcopy(info, sizeof(info), info[2]);

			int itemID = g_plrLastSelectedItem[client];
			if(StrEqual(info, "buy_item_menu")) {
				BuyItemMenu(client, itemID);
			} else if (StrEqual(info, "buy_item")) {
				BuyItem(client, itemID, 0);
			}  else if (StrEqual(info, "equip_item")) {
				EquipItem(client, itemID);
				ItemMenu(client, itemID);
			} else if (StrEqual(info, "takeoff_item")) {
				TakeoffItem(client, itemID);
				ItemMenu(client, itemID);
			} else if (StrEqual(info, "use_item")) {
				UseItem(client, itemID);
				ItemMenu(client, itemID);
			}
		}
	}

	return 0;
}

void BuyItemMenu(int client, int itemID) {
	char item[256], data[128];
	int itemQUsNum = g_itemQUsNum.Get(itemID);
	Menu menu = new Menu(BuyItemMenu_Handler, MENU_ACTIONS_ALL);

	g_itemName.GetString(itemID, data, sizeof(data));
	Format(item, sizeof(item), "Kup przedmiot %s:", data);
	menu.SetTitle(item);

	for(int i = 0; i < itemQUsNum; i++) {
		g_itemQUName[i].GetString(itemID, data, sizeof(data));
		Format(item, sizeof(item), "%s za %d$", data, g_itemQUPrice[i].Get(itemID));
		menu.AddItem("", item);
	}

	menu.ExitBackButton = true;
	menu.Display(client, MENU_TIME_FOREVER);
}

public int BuyItemMenu_Handler(Menu menu, MenuAction action, int client, int item) {
	switch(action) {
		case MenuAction_Cancel: {
			if (item == MenuCancel_ExitBack) {
				ItemMenu(client, g_plrLastSelectedItem[client]);
			}
		}

		case MenuAction_End: {
			if(menu != null) {
				delete menu;
			}
		}

		case MenuAction_DrawItem: {
			int itemID = g_plrLastSelectedItem[client];

			if(CodD0_GetClientCoins(client) < g_itemQUPrice[item].Get(itemID)) {
				return ITEMDRAW_DISABLED;
			}
		}

		case MenuAction_Select: {
			BuyItem(client, g_plrLastSelectedItem[client], item);
		}
	}

	return 0;
}

void BuyItem(int client, int itemID, int quID) {
	int plrCoins = CodD0_GetClientCoins(client), price = g_itemQUPrice[quID].Get(itemID);

	if(plrCoins < price) {
		PrintToChat(client, " \x06\x04[d0:Shop]\x01 Brakuje Ci monet na ten przedmiot!");
	} else {
		char itemKey[32], escapedItemKey[64], steamID[64];

		if(!GetClientAuthId(client, AuthId_Steam2, steamID, sizeof(steamID))) {
			PrintToChat(client, " \x06\x04[d0:Shop]\x01 Wystąpił problem z autoryzacją.");
		} else {
			char query[512];
			int itemQUValue = g_itemQUValue[quID].Get(itemID);

			CodD0_SetClientCoins(client, plrCoins - price);

			g_itemKey.GetString(itemID, itemKey, sizeof(itemKey));
			g_sqlConn.Escape(itemKey, escapedItemKey, sizeof(escapedItemKey));

			if(g_typeEquipMode.Get(g_itemTypeID.Get(itemID)) == d0s_EQMode_Use) {
				g_plrItemQUValue.Set(itemID, g_plrItemQUValue.Get(itemID, client) + itemQUValue, client);
				Format(query, sizeof(query), "INSERT INTO d0s_playersitems (playerID, itemID, quantityUnitValue) SELECT p.playerID, i.itemID, %d FROM d0s_players AS p, d0s_items AS i WHERE p.steamID='%s' AND i.itemKey='%s' ON DUPLICATE KEY UPDATE quantityUnitValue=quantityUnitValue+%d", itemQUValue, steamID, escapedItemKey, itemQUValue);
			} else {
				itemQUValue += GetTime();
				g_plrItemQUValue.Set(itemID, itemQUValue, client);
				Format(query, sizeof(query), "INSERT INTO d0s_playersitems (playerID, itemID, quantityUnitValue) SELECT p.playerID, i.itemID, %d FROM d0s_players AS p, d0s_items AS i WHERE p.steamID='%s' AND i.itemKey='%s' ON DUPLICATE KEY UPDATE quantityUnitValue=%d", itemQUValue, steamID, escapedItemKey, itemQUValue);
			}

			g_isPlrDataLoaded[client][Q_ACT] = false;

			//LogMessage("%N BuyItem, query %s", client, query);
			g_sqlConn.Query(tquery_GiveClientItem, query, GetClientUserId(client));
		}
	}
}

 

 

 

A błąd dotyczy stricte linijek:
 

458: 	g_itemQUName[i].GetString(itemID, data, sizeof(data));

428:    if(StrEqual(info, "buy_item_menu")) {
429:		BuyItemMenu(client, itemID);

 

 

Z góry dzięki za pomoc.
Za gotowe rozwiązanie mogę wypłacić podziękowanie :)

Pozdrawiam, S3V.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W danej tablicy dynamicznej jest 30 itemów, a index wybranego przedmiotu jest większy od 30.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Właśnie to to ja wiem.
Tylko że sytuacja wygląda tak że ta tablica jest deklarowana na samym poczatku tak:

ArrayList g_itemName, g_itemTypeID, g_itemCategoryID, g_itemKey, g_itemDesc, g_itemData, g_plrItemQUValue, g_plrItemIsEquipped;
ArrayList g_itemQUName[d0s_MaxQUs], g_itemQUPrice[d0s_MaxQUs], g_itemQUValue[d0s_MaxQUs], g_itemQUsNum; //ta linijka
ArrayList g_categoryName;
ArrayList g_typeKey, g_typeEquipMode;

 

a stała: d0s_MaxQUs ma wartość:

#define d0s_MaxQUs 64

 

I debugując tę tablicę (I mean wyświetlam sobie tą stałą na czacie w grze) wyświetla poprawnie jako 64, mogę zmieniać na 256 i tez będzie.
Mimo wszystko w grze po wybraniu czegoś powyżej indexu 30 mam błąd.
Totalnie nie potrafię znaleźć przyczyny.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W pokazanym przez ciebie momencie definiujesz ilość tablic.

 

Tak definiujesz rozmiar danej tablicy w OnPluginStart:

nazwa_tablicy = new ArrayList(64)

 

Natomiast tak dodajesz itemy do danej tablicy np.

nazwa_tablicy.PushString("string");

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tylko że kurczaczek wszystko wczytuje się do arrayów prawidłowo :/
Tak samo wszystkie itemy z configu wczytują się do bazy mysql.

Nie wiem czemu akurat w tym menu występuje błąd.

@Paweł byłbyś w stanie przejrzeć kod? Nie ma tego dużo. Raptem pare metod po drodze.

 

Wynagrodzę za rozwiązanie problemu :/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...