Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система Инвентаря на TextDraw

Redoreck

Компетентный
INVENTORY SYSTEM

Здравствуйте, уважаемые пользователи/гости P-I.
​
Используемые include: , ,
Инвентарь на TextDraw с использованием Меню выбор (Use, Info) на слот. (img0, img1 или же пролистав ниже можно их увидеть)

Спасибо @OKStyle, @Pawno_Code за помощь с созданием расчёта. ;)
Спасибо @execution за улучшения кода, @faraday. за исправление орфографии. ?

Сделал простенький инвентарь, всем кому нужно поменяют. Это сделать легко, изменив всего несколько строчек (наверное). ?

Небольшое описание:
Открыть инвентарь: /inventory
Выдать предмет: /additem [itemid] [amount]
Забрать предмет: /remove [itemid] [amount]

Обновление:
Я тут заметил, что была небольшая проблема, если добавить предмет с разными поворотами, то если его сдвинуть он становился все равно на 0.0, тут это исправлено.
Теперь нельзя выдать предмет, которого нету в gInventoryItem. (если конечно не постараться)

Код:
PHP:
#include     <a_samp>

#include    <sscanf2>
#include    <Pawn.CMD>
#include    <rustext>

#define     INVENTORY_SPACE_SLOTS                   38.0
#define     INVENTORY_WIDTH                         4
#define     INVENTORY_HEIGHT                        5
#define     INVENTORY_SIZE                          (INVENTORY_HEIGHT * INVENTORY_WIDTH)
#define     INVENTORY_MAX_SLOT                      INVENTORY_SIZE

#define     INVALID_INVENTORY_CLICK_SLOT            -1
#define     INVALID_INVENTORY_ITEM_ID               0
PHP:
enum {
    /*
        Глобальные TextDraws Inventory
    */
    Text: INVENTORY_GTD_BG,
    Text: INVENTORY_GTD_TEXT,
    Text: INVENTORY_GTD_CLOSE,
    MAX_INVENTORY_GTEXTDRAWS
}

enum {
    /*
         TextDraws игрока: Меню выбора USE, INFO, DRO
    */
    PlayerText: INVENTORY_PTD_USE_BG,
    PlayerText: INVENTORY_PTD_USE,
    PlayerText: INVENTORY_PTD_INFO_BG,
    PlayerText: INVENTORY_PTD_INFO,
    MAX_INVENTORY_PTD_CLICKSLOT
}

enum {
    /*
        TextDraws игрока: Текст для слотов
    */
    PlayerText: INVENTORY_PTD_AMOUNT     [INVENTORY_SIZE],
    PlayerText: INVENTORY_PTD_NAME       [INVENTORY_SIZE],
    MAX_INVENTORY_PTD_TEXT
}

new
    Text: gInventoryGTextDraw            [MAX_INVENTORY_GTEXTDRAWS],                 /* Глобальные TextDraw Inventory: Задний фон, Текст, Закрытие */

    PlayerText: gInventoryPTDClickSlot   [MAX_PLAYERS][MAX_INVENTORY_PTD_CLICKSLOT], /* TextDraws игрока: Меню выбора USE, INFO, DROP */
    PlayerText: gInventoryPTDSlots       [MAX_PLAYERS][INVENTORY_SIZE],              /* TextDraws игрока: Слоты */
    PlayerText: gInventoryPTDTextSlots   [MAX_PLAYERS][MAX_INVENTORY_PTD_TEXT],      /* TextDraws игрока: Текст для слотов */

    bool: gInventoryOpen                 [MAX_PLAYERS char],
    gInventoryClickSlot                  [MAX_PLAYERS]
;

enum {
    ITEM_TYPE_SKIN = 0,     // Скин

    __DUMMY_ELEMENT_,
    ITEM_TYPE_COUNT = __DUMMY_ELEMENT_
}

enum e_InventoryItems {
    /*
        Enum, содержащий информацию о предметах Инвентаря
    */
    iItemID,
    iUse[10],
    iName[30],
    iDesc[110],
    iType,

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

new gInventoryItem[][e_InventoryItems] = {
    {0, " ", " ", " ", __DUMMY_ELEMENT_, 0.0, 0.0, 0.0, 1.0},
    {1, "НАДЕТЬ", "Одежда Truth №1",     "Можно приобрести в магазине одежды", ITEM_TYPE_SKIN, 0.0, 0.0, 0.0, 1.0},
    {2, "НАДЕТЬ", "Одежда Maccer №2",    "Можно приобрести в магазине одежды", ITEM_TYPE_SKIN, 0.0, 0.0, 0.0, 1.0},
    {3, "НАДЕТЬ", "Одежда Andre №3",     "Можно приобрести в магазине одежды", ITEM_TYPE_SKIN, 0.0, 0.0, 0.0, 1.0},
    {4, "НАДЕТЬ", "Одежда Bbthin №4",    "Можно приобрести в магазине одежды", ITEM_TYPE_SKIN, 0.0, 0.0, 0.0, 1.0}
};

enum e_InventoryData {
    idItem      [INVENTORY_MAX_SLOT],
    idAmount    [INVENTORY_MAX_SLOT]
}
new pInventoryData[MAX_PLAYERS][e_InventoryData];
PHP:
stock GetPlayerInventoryItemByIDX(playerid, slot) {
    if(!(0 <= slot <= INVENTORY_MAX_SLOT - 1))
        return -1;

    return pInventoryData[playerid][idItem][slot];
}

stock GetPlayerInventoryAmountByIDX(playerid, slot) {
    if(!(0 <= slot <= INVENTORY_MAX_SLOT - 1))
        return -1;

    return pInventoryData[playerid][idAmount][slot];
}

stock SetPlayerInventoryItemByIDX(playerid, slot, itemid) {
    if(!(0 <= slot <= INVENTORY_MAX_SLOT - 1))
        return 0;

    pInventoryData[playerid][idItem][slot] = itemid;

    if(IsPlayerOpenInventory(playerid)) {
        RelogSlot(playerid, slot);
    }
    return 1;
}

stock SetPlayerInventoryAmountByIDX(playerid, slot, amount) {
    if(!(0 <= slot <= INVENTORY_MAX_SLOT - 1))
        return -1;

    pInventoryData[playerid][idAmount][slot] = amount;

    if(IsPlayerOpenInventory(playerid)) {
        RelogSlot(playerid, slot);
    }
    return 1;
}

stock AddPlayerInventoryAmountByIDX(playerid, slot, amount) {
    if(!(0 <= slot <= INVENTORY_MAX_SLOT - 1))
        return -1;

    pInventoryData[playerid][idAmount][slot] += amount;

    if(IsPlayerOpenInventory(playerid)) {
        RelogSlot(playerid, slot);
    }
    return 1;
}

stock DelPlayerInventoryAmountByIDX(playerid, slot, amount) {
    if(!(0 <= slot <= INVENTORY_MAX_SLOT - 1))
        return -1;

    pInventoryData[playerid][idAmount][slot] -= amount;

    if(IsPlayerOpenInventory(playerid)) {
        RelogSlot(playerid, slot);
    }
    return 1;
}


stock IsPlayerOpenInventory(playerid) {
    return gInventoryOpen{playerid};
}

stock SetStatusInventory(playerid, bool: status) {
    return gInventoryOpen{playerid} = status;
}

stock IsPlayrClickSlot(playerid) {
    return gInventoryClickSlot[playerid] != INVALID_INVENTORY_CLICK_SLOT;
}

stock SetClickedSlot(playerid, slot) {
    return gInventoryClickSlot[playerid] = slot;
}

stock ClickedSlot(playerid) {
    return gInventoryClickSlot[playerid];
}

stock GetInventoryItemID(item) {
    for(new item_id; item_id < sizeof(gInventoryItem); item_id++) {
        if(gInventoryItem[item_id][iItemID] != item)
              continue;

        return item_id;
    }
    return 0;
}

stock AddInventoryItem(playerid, itemid, amount) {
    new item_id = GetInventoryItemID(itemid);
    if(gInventoryItem[item_id][iItemID] == INVALID_INVENTORY_ITEM_ID)
        return -1;

    new bool: no_full;
    for(new slot; slot < INVENTORY_SIZE; slot++) {
        if(GetPlayerInventoryItemByIDX(playerid, slot) != itemid) {
            if(GetPlayerInventoryItemByIDX(playerid, slot))
                continue;

            SetPlayerInventoryItemByIDX(playerid, slot, itemid);
            SetPlayerInventoryAmountByIDX(playerid, slot, amount);

            no_full = true;
            break;
        }
        else {
            AddPlayerInventoryAmountByIDX(playerid, slot, amount);

            no_full = true;
            break;
        }
    }

    if(!no_full) {
        return SendClientMessage(playerid, -1, !"У вас полный инвентарь");
    }

    return 0;
}

stock RemoveInventoryItem(playerid, itemid, amount = 1) {
    for(new slot; slot < INVENTORY_SIZE; slot++) {
        if(GetPlayerInventoryItemByIDX(playerid, slot) != itemid)
            continue;

        DelPlayerInventoryAmountByIDX(playerid, slot, amount);

        if(GetPlayerInventoryAmountByIDX(playerid, slot) < 1) {
            SetPlayerInventoryItemByIDX(playerid, slot, INVALID_INVENTORY_ITEM_ID);
        }
    }
}

stock CreateInventoryGTextDraws() {
    gInventoryGTextDraw[INVENTORY_GTD_BG] =
    TextDrawCreate            (449.9, 247.1, !"_");
    TextDrawLetterSize        (gInventoryGTextDraw[INVENTORY_GTD_BG], 0.0, 20.9);
    TextDrawTextSize          (gInventoryGTextDraw[INVENTORY_GTD_BG], 600.6, 5.0);
    TextDrawUseBox            (gInventoryGTextDraw[INVENTORY_GTD_BG], 1);
    TextDrawBoxColor          (gInventoryGTextDraw[INVENTORY_GTD_BG], 112);

    gInventoryGTextDraw[INVENTORY_GTD_TEXT] =
    TextDrawCreate            (500.9, 235.5, !"Инвентарь");
    TextDrawLetterSize        (gInventoryGTextDraw[INVENTORY_GTD_TEXT], 0.2, 1.3);
    TextDrawFont              (gInventoryGTextDraw[INVENTORY_GTD_TEXT], 2);
    TextDrawSetShadow         (gInventoryGTextDraw[INVENTORY_GTD_TEXT], 0);

    gInventoryGTextDraw[INVENTORY_GTD_CLOSE] =
    TextDrawCreate            (595.6, 235.3, !"X");
    TextDrawLetterSize        (gInventoryGTextDraw[INVENTORY_GTD_CLOSE], 0.3, 1.0);
    TextDrawTextSize          (gInventoryGTextDraw[INVENTORY_GTD_CLOSE], 8.0, 8.0);
    TextDrawColor             (gInventoryGTextDraw[INVENTORY_GTD_CLOSE], -16777104);
    TextDrawAlignment         (gInventoryGTextDraw[INVENTORY_GTD_CLOSE], 2);
    TextDrawSetShadow         (gInventoryGTextDraw[INVENTORY_GTD_CLOSE], 0);
    TextDrawSetSelectable     (gInventoryGTextDraw[INVENTORY_GTD_CLOSE], true);
}


stock InventoryDestroySlots(playerid) {
    for(new slot; slot < INVENTORY_SIZE; slot++) {
        PlayerTextDrawDestroy(playerid, gInventoryPTDSlots[playerid][slot]);
        gInventoryPTDSlots[playerid][slot] = PlayerText: INVALID_TEXT_DRAW;

        PlayerTextDrawDestroy(playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot]);
        gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot] = PlayerText: INVALID_TEXT_DRAW;
    }
}

stock InventorDestroysClickedSlot(playerid) {
    SetClickedSlot(playerid, INVALID_INVENTORY_CLICK_SLOT);

    for(new slot; slot < MAX_INVENTORY_PTD_CLICKSLOT; slot++) {
        PlayerTextDrawDestroy(playerid, gInventoryPTDClickSlot[playerid][slot]);
        gInventoryPTDClickSlot[playerid][slot] = PlayerText: INVALID_TEXT_DRAW;
    }
}

stock ShowPlayerInventory(playerid) {
    if(IsPlayerOpenInventory(playerid)) {
        InventoryDestroySlots(playerid);

        if(IsPlayrClickSlot(playerid)) {
            InventorDestroysClickedSlot(playerid);
        }
    }

    TextDrawShowForPlayer(playerid, gInventoryGTextDraw[INVENTORY_GTD_BG]);
    TextDrawShowForPlayer(playerid, gInventoryGTextDraw[INVENTORY_GTD_TEXT]);
    TextDrawShowForPlayer(playerid, gInventoryGTextDraw[INVENTORY_GTD_CLOSE]);

    new amount[5];
    for(new slot, x, y; slot < INVENTORY_SIZE; slot++) {
        gInventoryPTDSlots[playerid][slot] =
        CreatePlayerTextDraw            (playerid, 450.0 + (x * INVENTORY_SPACE_SLOTS), 246.7 + (y * INVENTORY_SPACE_SLOTS), !"_");
        PlayerTextDrawTextSize          (playerid, gInventoryPTDSlots[playerid][slot], 37.0, 36.0);
        PlayerTextDrawBackgroundColor   (playerid, gInventoryPTDSlots[playerid][slot], 387257936);
        PlayerTextDrawFont              (playerid, gInventoryPTDSlots[playerid][slot], 5);
        PlayerTextDrawSetSelectable     (playerid, gInventoryPTDSlots[playerid][slot], true);

        new
            item_idx = GetPlayerInventoryItemByIDX(playerid, slot),
            item_id = GetInventoryItemID(item_idx),

            item_amount_idx = GetPlayerInventoryAmountByIDX(playerid, slot)
        ;

        PlayerTextDrawSetPreviewRot     (playerid, gInventoryPTDSlots[playerid][slot],
            gInventoryItem[item_id][iItemPosX], gInventoryItem[item_id][iItemPosY], gInventoryItem[item_id][iItemPosZ], gInventoryItem[item_id][iItemPosC]
        );

        PlayerTextDrawSetPreviewModel   (playerid, gInventoryPTDSlots[playerid][slot],
            (item_idx == INVALID_INVENTORY_ITEM_ID) ? (18670) : (item_idx)
        );

        PlayerTextDrawShow(playerid, gInventoryPTDSlots[playerid][slot]);

        format(amount, sizeof(amount),
            "%d",
            item_amount_idx
        );

        gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot] =
        CreatePlayerTextDraw            (playerid, 486.2 + (x * INVENTORY_SPACE_SLOTS), 276.8  + (y * INVENTORY_SPACE_SLOTS), amount);
        PlayerTextDrawAlignment         (playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot], 3);
        PlayerTextDrawLetterSize        (playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot], 0.0961, 0.5712);
        PlayerTextDrawSetShadow         (playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot], 0);

        if(item_amount_idx > 1) {
            PlayerTextDrawShow(playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot]);
        }

        if( ++ x >= INVENTORY_WIDTH) {
            x = 0;
            y ++;
        }
    }

    SetStatusInventory(playerid, true);
    SelectTextDraw(playerid, 0xFFFFFFFF);
}

stock HidePlayerInventory(playerid) {
    InventoryDestroySlots(playerid);

    if(IsPlayrClickSlot(playerid)) {
        InventorDestroysClickedSlot(playerid);
    }

    TextDrawHideForPlayer(playerid, gInventoryGTextDraw[INVENTORY_GTD_BG]);
    TextDrawHideForPlayer(playerid, gInventoryGTextDraw[INVENTORY_GTD_TEXT]);
    TextDrawHideForPlayer(playerid, gInventoryGTextDraw[INVENTORY_GTD_CLOSE]);

    SetStatusInventory(playerid, false);
    CancelSelectTextDraw(playerid);
}

stock UseInventoryItem(playerid, slot, itemid, type) {
    switch(type) {
        case ITEM_TYPE_SKIN: {
            if(GetPlayerSkin(playerid) == itemid)
                return 1;

            SetPlayerSkin(playerid, itemid);
        }
    }

    if(GetPlayerInventoryAmountByIDX(playerid, slot) > 1) {
        DelPlayerInventoryAmountByIDX(playerid, slot, 1);
    }
    else {
        SetPlayerInventoryItemByIDX(playerid, slot, INVALID_INVENTORY_ITEM_ID);
        SetPlayerInventoryAmountByIDX(playerid, slot, 0);
    }

    InventorDestroysClickedSlot(playerid);
    return 1;
}

stock RelogSlot(playerid, slot) {
    PlayerTextDrawHide(playerid, gInventoryPTDSlots[playerid][slot]);

    new
        item_idx = GetPlayerInventoryItemByIDX(playerid, slot),
        item_id = GetInventoryItemID(item_idx),

        item_amount_idx = GetPlayerInventoryAmountByIDX(playerid, slot)
    ;

    PlayerTextDrawSetPreviewRot     (playerid, gInventoryPTDSlots[playerid][slot],
        gInventoryItem[item_id][iItemPosX], gInventoryItem[item_id][iItemPosY], gInventoryItem[item_id][iItemPosZ], gInventoryItem[item_id][iItemPosC]
    );

    PlayerTextDrawSetPreviewModel   (playerid, gInventoryPTDSlots[playerid][slot],
        (item_idx == INVALID_INVENTORY_ITEM_ID) ? (18670) : (item_idx)
    );
    PlayerTextDrawShow(playerid, gInventoryPTDSlots[playerid][slot]);

    PlayerTextDrawHide(playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot]);

    new amount[5];
    format(amount, sizeof(amount),
        "%d",
        item_amount_idx
    );
    PlayerTextDrawSetString(playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot], amount);

    if(item_amount_idx > 1) {
        PlayerTextDrawShow(playerid, gInventoryPTDTextSlots[playerid][INVENTORY_PTD_AMOUNT][slot]);
    }
}

stock PlayerClickSlot(playerid, slot) {
    new
        Float:pos_X = (slot % INVENTORY_WIDTH) * (INVENTORY_SPACE_SLOTS + 2.0),
        Float:pos_Y = (slot / INVENTORY_WIDTH) * (INVENTORY_SPACE_SLOTS + 2.0),

        item_id = GetInventoryItemID(GetPlayerInventoryItemByIDX(playerid, slot))
    ;

    gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG] =
    CreatePlayerTextDraw          (playerid, 500.0 + pos_X, 250.0 + pos_Y, !"_");
    PlayerTextDrawLetterSize      (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG], 0.0, 1.0);
    PlayerTextDrawTextSize        (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG], 0.0, 42.0);
    PlayerTextDrawColor           (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG], -1);
    PlayerTextDrawBoxColor        (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG], 255);
    PlayerTextDrawUseBox          (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG], 1);
    PlayerTextDrawAlignment       (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE_BG], 2);

    gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE] =
    CreatePlayerTextDraw          (playerid, 497.9 + pos_X, 250.7 + pos_Y, gInventoryItem[item_id][iUse]);
    PlayerTextDrawLetterSize      (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE], 0.1, 0.9);
    PlayerTextDrawTextSize        (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE], 8.0, 41.0);
    PlayerTextDrawAlignment       (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE], 2);
    PlayerTextDrawFont            (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE], 2);
    PlayerTextDrawSetShadow       (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE], 0);
    PlayerTextDrawSetSelectable   (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE], true);

    gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG] =
    CreatePlayerTextDraw          (playerid, 500.0 + pos_X, 263.0 + pos_Y, !"_");
    PlayerTextDrawLetterSize      (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG], 0.0, 1.0);
    PlayerTextDrawTextSize        (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG], 0.0, 42.0);
    PlayerTextDrawColor           (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG], -1);
    PlayerTextDrawBoxColor        (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG], 255);
    PlayerTextDrawUseBox          (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG], 1);
    PlayerTextDrawAlignment       (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO_BG], 2);

    gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO] =
    CreatePlayerTextDraw          (playerid, 498.2 + pos_X, 263.0 + pos_Y, !"Информация");
    PlayerTextDrawLetterSize      (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO], 0.1, 0.9);
    PlayerTextDrawTextSize        (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO], 8.0, 41.0);
    PlayerTextDrawAlignment       (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO], 2);
    PlayerTextDrawFont            (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO], 2);
    PlayerTextDrawSetShadow       (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO], 0);
    PlayerTextDrawSetSelectable   (playerid, gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO], true);


    for(new clicked_slot; clicked_slot < MAX_INVENTORY_PTD_CLICKSLOT; clicked_slot++) {
        PlayerTextDrawShow(playerid, gInventoryPTDClickSlot[playerid][clicked_slot]);
    }
}
PHP:
public OnPlayerClickTextDraw(playerid, Text:clickedid) {
    if(_:clickedid == INVALID_TEXT_DRAW) {
        if(IsPlayerOpenInventory(playerid)) {
            HidePlayerInventory(playerid);
        }
    }

    if(clickedid == gInventoryGTextDraw[INVENTORY_GTD_CLOSE]) {
        HidePlayerInventory(playerid);
    }
    return 1;
}
PHP:
CreateInventoryGTextDraws();
PHP:
public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid) {
    if(IsPlayerOpenInventory(playerid)) {
        new clickedslot = ClickedSlot(playerid);

        for(new slot; slot < INVENTORY_SIZE; slot++) {
            if(playertextid == gInventoryPTDSlots[playerid][slot]) {
                new item_idx = GetPlayerInventoryItemByIDX(playerid, slot);
                if(clickedslot == INVALID_INVENTORY_CLICK_SLOT && item_idx == 0)
                    break;

                if(clickedslot == INVALID_INVENTORY_CLICK_SLOT) {
                    SetClickedSlot(playerid, slot);
                    PlayerClickSlot(playerid, slot);
                    break;
                }

                if(clickedslot != INVALID_INVENTORY_CLICK_SLOT && playertextid == gInventoryPTDSlots[playerid][clickedslot]) {
                    InventorDestroysClickedSlot(playerid);
                    break;
                }

                if(clickedslot != INVALID_INVENTORY_CLICK_SLOT && clickedslot != slot) {
                    new
                        save_amount = GetPlayerInventoryAmountByIDX(playerid, slot),

                        item_clicked_slot = GetPlayerInventoryItemByIDX(playerid, clickedslot),
                        item_amount_clicked_slot = GetPlayerInventoryAmountByIDX(playerid, clickedslot)
                    ;

                    SetPlayerInventoryItemByIDX(playerid, slot, item_clicked_slot);
                    SetPlayerInventoryAmountByIDX(playerid, slot, item_amount_clicked_slot);
                    RelogSlot(playerid, slot);

                    SetPlayerInventoryItemByIDX(playerid, clickedslot, item_idx);
                    SetPlayerInventoryAmountByIDX(playerid, clickedslot, save_amount);
                    RelogSlot(playerid, clickedslot);

                    InventorDestroysClickedSlot(playerid);

                    SetClickedSlot(playerid, slot);
                    PlayerClickSlot(playerid, slot);
                    break;
                }
            }
        }
        if(playertextid == gInventoryPTDClickSlot[playerid][INVENTORY_PTD_USE]) {
            new
                item_idx = GetPlayerInventoryItemByIDX(playerid, clickedslot),
                item_id = GetInventoryItemID(item_idx)
            ;

            UseInventoryItem(playerid, clickedslot, item_idx, gInventoryItem[item_id][iType]);
        }

        if(playertextid == gInventoryPTDClickSlot[playerid][INVENTORY_PTD_INFO]) {
            new
                item_id = GetInventoryItemID(GetPlayerInventoryItemByIDX(playerid, clickedslot)),
                str[150]
            ;

            format(str, sizeof(str),
                "Наименование: %s\
                \nКоличество: %d\
                \n\n%s",
                gInventoryItem[item_id][iName],
                GetPlayerInventoryAmountByIDX(playerid, clickedslot),
                gInventoryItem[item_id][iDesc]
            );
            ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX,
                !" ",
                str,
                !"Закрыть", !""
            );
        }
    }
    return 1;
}
PHP:
public OnPlayerConnect(playerid) {
    for(new slot = 0; slot < INVENTORY_MAX_SLOT; slot++) {
        SetPlayerInventoryItemByIDX(playerid, slot, INVALID_INVENTORY_ITEM_ID);
        SetPlayerInventoryAmountByIDX(playerid, slot, 0);
    }

    SetStatusInventory(playerid, false);
    SetClickedSlot(playerid, INVALID_INVENTORY_CLICK_SLOT);
    return 1;
}
PHP:
CMD:additem(playerid, params[]) {
    extract params -> new itemid, amount; else
        return 1;

    new item = AddInventoryItem(playerid, itemid, amount);

    if(item == -1)
        SendClientMessage(playerid, -1, !"Не удалось добавить Предмет, т.к его не существует");
    return 1;
}

CMD:remove(playerid, params[]) {
    extract params -> new itemid, amount; else
        return 1;

    RemoveInventoryItem(playerid, itemid, amount);
    return 1;
}

CMD:inventory(playerid) {
    ShowPlayerInventory(playerid);
    return 1;
}

P.S Если что, то цифры, которые возле скинов - это не номер слота, а кол-во того, что находится в слоте.
 

Вложения

Последнее редактирование:
Сверху Снизу