enum EItem // enum с кодами всех видов предметов
{
ITEM_NONE, // Для обозначения пустого места в слоте
ITEM_DEAGLE,
// Объявим константу __MAX_ITEM так, чтобы она была равна
// ID последнего объявленного ID предмета (т.е. ITEM_DEAGLE).
// Это пригодится для проверки правильности кодов предметов.
__DUMMY_ENUM_ITEM,
__MAX_ITEM = __DUMMY_ENUM_ITEM - 2
};
#define MAX_ITEM_SLOTS 15 // Допустим, игрок может таскать до 15 разных предметов.
#define MAX_ITEM_AMOUNT 10 // До 10 предметов на слот (при желании можно сделать массив
// и в нём отдельно установить максимум для каждого предмета).
enum EPlayerInfo
{
pAccID,
pLevel,
pMoney,
// ...
EItem:pItems[MAX_ITEM_SLOTS], // Слоты для предметов
pNumItems[MAX_ITEM_SLOTS] // Кол-во предмета в каждом слоте
};
new player_info[MAX_PLAYERS][EPlayerInfo];
Inventory_AddItem(playerid, EItem:item, amount)
{
// Для отлова ошибок с помощью crashdetect
assert(item > ITEM_NONE);
assert(item <= __MAX_ITEM);
assert(amount > 0);
// 1-й цикл: проверяем, есть ли такой предмет в инвентаре
for (new i = 0; i < MAX_ITEM_SLOTS; ++i)
{
// Если уже есть - переходим к накоплению в одном слоте
if (player_info[playerid][pItems][i] == item)
{
// Если добавляемое количество не выходит за лимит слота
// просто сохраним всё в в этом слоте и выйдем из функции.
// "return 0" означает, что мы сохранили всё без остатка.
if (player_info[playerid][pNumItems][i] + amount <= MAX_ITEM_SLOTS)
{
player_info[playerid][pNumItems][i] += amount;
return 0;
}
// Если же количество слишком большое для одного слота,
// добавляем в слот лишь столько, сколько вместится,
// оставшееся потом попытаемся добавить в другой слот.
amount -= (MAX_ITEM_SLOTS - player_info[playerid][pNumItems][i]);
player_info[playerid][pNumItems][i] = MAX_ITEM_SLOTS;
}
}
// 2-й цикл: пробуем добавить в пустые слоты.
for (new i = 0; i < MAX_ITEM_SLOTS; ++i)
{
if (player_info[playerid][pItems][i] == ITEM_NONE)
{
player_info[playerid][pItems][i] = item;
if (amount <= MAX_ITEM_SLOTS)
{
player_info[playerid][pNumItems][i] = amount;
return 0;
}
amount -= MAX_ITEM_SLOTS;
player_info[playerid][pNumItems][i] = MAX_ITEM_SLOTS;
}
}
// Если не нашлось достаточно слотов, чтобы сохранить предмет,
// вернём оставшееся количество, для которого не нашлось места.
// Так если мы попытаемся сохранить предмет в большем количестве,
// чем может вместить инвентарь, то сможем узнать, сколько не вместилось.
return amount;
}