Форум Pawn.Wiki - Воплоти мечту в реальность!: Примерный принцип инвентаря - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Pawn ]
Примерный принцип инвентаря

#1
Пользователь офлайн   N1ceks 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Здравствуйте дорогие форумчане :rolleyes:

Решил впервые узнать поподробней о инвентарях на текст-дравах.
И у меня появился вопрос:
• Как работает сохранение - смотрел пару примеров, как и готовых решения и там создается enum на подобие этого:
enum e_INVENTORY_INFO
{
	iItemID,
	iUse[10],
	iName[10],
	iDesc[110],
	iType,

        Float: iItemPosX,
        Float: iItemPosY,
        Float: iItemPosZ,
        Float: iItemPosC
}

И сразу появляется вопрос - что, куда и зачем.
Я не могу понять, как именно предмет привязывается к инвентарю определенного игрока, как заменять значение стандартных ячеек на модель предмета (К примеру добавления игроку предмета при передаче от другого игрока, добывание руды на шахте и тому подобное).
Просто в моем понимании как-то должно быть: в одной таблице несколько ячеек и туда модели вписывать, а уже потом при открытии инвентаря делать запрос в базу данных для получения значений айди предметов из таблицы ну или что-то в этом роде. (Согласен, пример не самый лучший, даже говнокод).

В основном эта проблема меня мучает, а далее и-за этого я даже примерно не понимаю как обновлять предметы, добавлять т.п.
Я в Text Draw`ах не сильно бум-бум особенно с инвентарем :unsure: (Как и +- фишках мускула и подобной оптимизации кода чтоль), так что надеждой согрет.

Сообщение отредактировал N1ceks: 24 мая 2026 - 22:39

0

#2
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Создаёшь такую конструкцию:

#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), чтобы они там были в любом случае.
1

#3
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Ну и теперь для TD ты берёшь инфу из INVENTORY_INFO, а какой именно предмет хранится в inventory_player_info, в inventory_id.

new id = inventory_player_info[playerid][slot][inventory_id];

INVENTORY_INFO[id][INVENTORY_MODEL] - получить модель предмета, который находится у игрока playerid в слоте slot
1

#4
Пользователь офлайн   N1ceks 

  • Новичок
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияM I S T E V (24 мая 2026 - 23:42) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Ну вроде не кажется простым, но и не выглядит невозможным, думаю разобравшись можно понять что к чему прочитавши пару раз. Спасибо большое за информацию милейший человек :yes:
0

#5
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияN1ceks (24 мая 2026 - 23:57) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Иная реализация будет сложнее в использовании. Да, тут тебе за раз нужно задать всё, но потом просто наполняешь enum и массив информацией и всё

Сообщение отредактировал M I S T E V: 24 мая 2026 - 23:59

1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика