PDA

Просмотр полной версии : [Вопрос] Загрузка инвентаря.



SteveStage
28.04.2020, 00:15
В теории я написал рабочий код, но на практике загрузка инвентаря останавливается на первом слоте (по крайней мере в диалоге инвентаря 1 слот, тогда как в бд их два).

@_LoadInvent(playerid);
@_LoadInvent(playerid)
{
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
new
i = cache_get_field_content_int(0, "slotid");
inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
inv_slots{playerid}++;
static
fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d' AND `slotid` = '%d' LIMIT 1";
new
string[sizeof(fmt_str)-4+4+2+1];
format(string, sizeof(string), fmt_str, player[playerid][p_tableid], i+1);
mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
return true;
}
else return false;
}

stock DialogInvent(playerid)
{
new
string[128+1];
format(string, sizeof(string), "{00C0FF}%s [%d]", invent_items[inv[playerid][0][i_item]], inv[playerid][0][i_amount]);
if(inv_slots{playerid} >= 1)
{
for(new i = 1; i < inv_slots{playerid}; i++)
{
if(inv[playerid][i][i_item] != 0 && inv[playerid][i][i_amount] != 0)
{
new
str[17-4+16+5+1];
format(str, sizeof(str), "\n{00C0FF}%s [%d]", invent_items[inv[playerid][i][i_item]], inv[playerid][i][i_amount]);
strcat(string, str);
}
}
}
SPD(playerid, DLG_ID_INVENT_SELECT_SLOT, DSL, !"{00C0FF}Инвентарь", string, !"{00C0FF}Выбрать", !"{00C0FF}Отмена");
return true;
}

stock LoadInvent(playerid)
{
static
fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d' AND `slotid` = '0' LIMIT 1";
new
string[sizeof(fmt_str)-2+4+1];
format(string, sizeof(string), fmt_str, player[playerid][p_tableid]);
mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
return true;
}

new
inv_slots[MAX_PLAYERS char],
select_slot[MAX_PLAYERS char];

new
invent_items[22][16+1] =
{
"Пусто", "Бургер", "Пепси-Кола", "Desert Eagle", "Shotgun", "M4A1", "AK-47", "Baseball Bat", "Colt 45", "Spas-12", "Silenced Colt 45", "Golf Club",
"Nitestick", "Knife", "Chainsaw", "Grenade", "Molotov", "Tec 9", "Uzi", "Mp5", "Rifle", "Sniper rifle"
};

enum e_INVENTORY_DATA
{
i_item, i_amount
}
new
inv[MAX_PLAYERS][MAX_INVENT_SLOTS][e_INVENTORY_DATA];

enum
{
INVENT_ITEM_NONE = 0, INVENT_ITEM_BURGER = 1, INVENT_ITEM_PEPSI = 2, INVENT_WEAPON_DEAGLE, INVENT_WEAPON_SHOTGUN, INVENT_WEAPON_M4A1, INVENT_WEAPON_AK47,
INVENT_WEAPON_BAT, INVENT_WEAPON_COLT45, INVENT_WEAPON_SPAS12, INVENT_WEAPON_SILENCED_COLT45, INVENT_WEAPON_GOLFCLUB, INVENT_WEAPON_NITESTICK,
INVENT_WEAPON_KNIFE, INVENT_WEAPON_CHAINSAW, INVENT_WEAPON_FLOWER, INVENT_WEAPON_CANE, INVENT_WEAPON_GRENADE, INVENT_WEAPON_MOLOTOV, INVENT_WEAPON_TEC9,
INVENT_WEAPON_UZI, INVENT_WEAPON_MP5, INVENT_WEAPON_RIFLE, INVENT_WEAPON_SNIPER
};

#define MAX_INVENT_SLOTS 7

При авторизации и загрузке данных аккаунта:

LoadInvent(playerid);

SteveStage
28.04.2020, 12:09
Проблема оказалась не в коде, а в том, что при подключении inv_slots{playerid} равно -1 (приравнивается в стоке Clear), а должно быть равно 0.

execution
29.04.2020, 11:25
@_LoadInvent(playerid);
@_LoadInvent(playerid)
{
new
rows,
fields;
cache_get_data(rows, fields);
if(rows)
{
new
i = cache_get_field_content_int(0, "slotid");
inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
inv_slots{playerid}++;
static
fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d' AND `slotid` = '%d' LIMIT 1";
new
string[sizeof(fmt_str)-4+4+2+1];
format(string, sizeof(string), fmt_str, player[playerid][p_tableid], i+1);
mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
return true;
}
else return false;
}
stock LoadInvent(playerid)
{
static
fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d'";
new
string[sizeof(fmt_str)-2+4+1];
format(string, sizeof(string), fmt_str, player[playerid][p_tableid]);
mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
}

@_LoadInvent(playerid);
@_LoadInvent(playerid)
{
new
rows,
fields;
cache_get_data(rows, fields);

for (new i = 0, slotid = 0; i < rows; ++i)
{
if (i >= MAX_INVENT_SLOTS)
{
return 0;
}

slotid = cache_get_field_content_int(i, "slotid");

inv[playerid][slotid][i_item] = cache_get_field_content_int(i, "itemid");
inv[playerid][slotid][i_amount] = cache_get_field_content_int(i, "amountid");

inv_slots{playerid}++;
}

return 1;
}

red.inc
05.05.2020, 22:30
Я извиняюсь за грубость. Но зачем ты используешь char в переменных с ид игроком?

В одном месте ты не используешь char, в другом используешь.

Я может чего-то не понимаю?

SteveStage
06.05.2020, 01:37
Я извиняюсь за грубость. Но зачем ты используешь char в переменных с ид игроком?

В одном месте ты не используешь char, в другом используешь.

Я может чего-то не понимаю?

1) Я так не делаю.
2) Char поддерживает максимальное число 255. А слотов уж точно столько не будет, поэтому номер выбранного слота и количество загруженных слотов можно использовать char.
3) Где ты видишь, чтобы я в переменной использовал char? Только в массивах.

Оператор char надо использовать с умом, и тогда он будет приносить пользу.

Кстати, а зачем ты спрашиваешь?)

red.inc
07.05.2020, 03:30
В одной переменной у тебя используется char, в другой нет. Но они совместимы в работе

SteveStage
07.05.2020, 18:33
В одной переменной у тебя используется char, в другой нет. Но они совместимы в работе

Да где ты видишь, чтобы в переменной использовался char? Ткни пальцем, может я слепой.

red.inc
08.05.2020, 15:12
inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
inv_slots{playerid}++;

SteveStage
08.05.2020, 16:40
inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
inv_slots{playerid}++;

Ну так я хз как в трехмерных массивах использовать char. Да и amount будет иметь максимальное значение 50'000, а char - 255.