Создаёшь такую конструкцию:
#define MAX_INVENTORY_ITEM_NAME 30
#define SIZE_INVENTORY_ITEM_NAME (MAX_INVENTORY_ITEM_NAME+1)
enum E_INVENTORY_ITEM
{
INVALID_INVENTORY = 0,
INVENTORY_1 = 1,
INVENTORY_2 = 2,
INVENTORY_3 = 3,
...
}
enum E_INVENTORY_INFO
{
INVENTORY_MODEL, // модель, которая отображается
INVENTORY_NAME[SIZE_INVENTORY_ITEM_NAME], // название предмета
Float:INVENTORY_OFFSET_X, // смещение модельки по xyz
Float:INVENTORY_OFFSET_Y,
Float:INVENTORY_OFFSET_Z,
Float:INVENTORY_ROT_X, // вращение модельки по xyz
Float:INVENTORY_ROT_Y,
Float:INVENTORY_ROT_Z,
Float:INVENTORY_ZOOM // зум модельки по z
}
new INVENTORY_INFO[E_INVENTORY_ITEM][E_INVENTORY_INFO] =
{
{0, "", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, // INVENTORY_NONE
{1000, "Item 1", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, // INVENTORY_1
{2000, "Item 2", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0}, // INVENTORY_2
{3000, "Item 3", 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0} // INVENTORY_3
};
В
E_INVENTORY_ITEM перечисляешь все предметы, которые будут использоваться у тебя. В
E_INVENTORY_INFO перечисляешь все возможные свойства, тут я указал по минимуму, а так их может быть 20+. Далее
INVENTORY_INFO заполняешь информацией о предметах. Рекомендую явно прописывать ID предмета в
E_INVENTORY_ITEM и прописывать название предмета в
INVENTORY_INFO (в комментариях).
Теперь создаёшь такое:
#define MAX_INVENTORY_PLAYER_SLOT 20
enum E_INVENTORY_PLAYER_INFO
{
E_INVENTORY_ITEM:inventory_id,
inventory_count,
inventory_extra
}
new inventory_player_info[MAX_PLAYERS][MAX_INVENTORY_PLAYER_SLOT][E_INVENTORY_PLAYER];
new INVENTORY_PLAYER_INFO_NULL[E_INVENTORY_PLAYER] =
{
INVALID_INVENTORY,
0,
0
};
Тут будешь хранить информацию о предметах игрока.
inventory_id - это предмет, который ты записал в
E_INVENTORY_ITEM.
inventory_count - количество предметов в слоте.
inventory_extra - дополнительное свойство предмета (используй только если
inventory_count = 1), тут можешь записывать состояние предмета, время начала/конца действия и т.д.
INVENTORY_PLAYER_INFO_NULL - служит для обнуления данных в массиве игрока.
Теперь ты можешь делать функции для управления инвентарём игрока. Работаешь с массивом
inventory_player_info, у тебя есть инфа о каждом слоте (
MAX_INVENTORY_PLAYER_SLOT).
В бд делаешь одну общую таблицу
inventory такого вида, все столбцы INT:
id | account_id | slot_idx | item_id | count | extra
Где
id - это столбец auto_increment,
account_id - id аккаунта игрока,
slot_idx - индекс слота (
MAX_INVENTORY_PLAYER_SLOT),
item_id - ID предмета (
E_INVENTORY_ITEM),
count - количество в слоте,
extra - доп инфа о предмете.
Загружаешь так:
"SELECT slot_idx, item_id, count, extra FROM inventory WHERE account_id = %i;"
Далее заносишь инфу в массив:
{
new rows = cache_num_rows();
if(rows > MAX_INVENTORY_PLAYER_SLOT)
rows = MAX_INVENTORY_PLAYER_SLOT; // на всякий случай
for(new slot = 0; slot < MAX_INVENTORY_PLAYER_SLOT; slot++)
inventory_player_info[playerid][slot] = INVENTORY_PLAYER_INFO_NULL; // очищаем массив игрока
enum {SLOT, ITEM, COUNT, EXTRA}
for(new row = 0, slot; row < rows; row++)
{
cache_get_value_index_int(row, SLOT, slot);
if(slot >= MAX_INVENTORY_PLAYER_SLOT) // на всякий случай
continue;
cache_get_value_index_int(row, ITEM, inventory_player_info[playerid][slot][inventory_id]);
cache_get_value_index_int(row, COUNT, inventory_player_info[playerid][slot][inventory_count]);
cache_get_value_index_int(row, EXTRA, inventory_player_info[playerid][slot][inventory_extra]);
}
}
Обновляешь так:
"UPDATE inventory SET item_id = %i, count = %i, extra = %i WHERE account_id = %i AND slot_idx = %i;"
Соответственно, если нужно обновить все сразу (при выходе), то делаешь через цикл:
for(new slot = 0; slot < MAX_INVENTORY_PLAYER_SLOT; slot++)
Не забудь только при регистрации добавить все эти строки в таблицу (
INSERT), чтобы они там были в любом случае.