SA:MP Arizona Как получить список инвентаря Arizona RP?

OblivionGM

Новичок
Автор темы
6
6
Версия SA-MP
  1. 0.3.7 (R1)
Мне нужно в lua скрипте получить незаметно список инвентаря пользователя.
Как, к примеру, это делается в скриптах для помощи с лавкой - где сканируется инвентарь и отображается список предметов в наличии.
Способ с парссингом диалога через /stats не подходит
 

OblivionGM

Новичок
Автор темы
6
6
Ничего не понятно, ты хочешь получить предметы из инвентаря другого игрока? Если да, то это невозможно
Нужно получить инвентарь пользователя скрипта и выгрузить его в переменную в этом же скрипте
 

angelsoempty

Известный
62
17
попробуй с цефами что-нибудь поделать.
смотрели месяца 3-4 назад, там была вот такая вот штука:
Код:
[LUA] [CEF]: window.executeEvent('event.inventory.playerInventory', `[{"action":0,"data":{"type":1,"items":[{"slot":0,"item":569,"amount":1,"text":"","available":1,"blackout":0,"time":0},{"slot":1,"item":512,"amount":4,"text":"4","available":1,"blackout":0,"time":0},{"slot":2,"item":513,"amount":2,"text":"2","available":1,"blackout":0,"time":0},{"slot":3,"item":7455,"amount":1,"text":"","background":-1128744961,"available":1,"blackout":0,"time":1738398653},{"slot":4,"item":3927,"amount":7,"text":"7","available":1,"blackout":0,"time":0},{"slot":5,"item":269,"amount":1,"text":"ID:78","enchant":0,"available":1,"blackout":0,"time":0},{"slot":6,"item":8247,"amount":2,"text":"2","background":847291647,"available":1,"blackout":0,"time":0},{"slot":7,"item":1939,"amount":1,"text":"","background":-1540214017,"available":1,"blackout":0,"time":0},{"slot":8,"item":7627,"amount":1,"text":"PD: 17","background":-1540214017,"available":1,"blackout":0,"time":0},{"slot":9,"item":800,"amount":1,"text":"17 day","available":1,"blackout":0,"time":1739783461},{"slot":10,"item":7655,"amount":1,"text":"PD: 16","background":-1540214017,"available":1,"blackout":0,"time":0},{"slot":11,"item":676,"amount":1,"text":"","background":-589505281,"available":1,"blackout":0,"time":0},{"slot":12},{"slot":13,"item":601,"amount":3,"text":"3","available":1,"blackout":0,"time":0},{"slot":14},{"slot":15},{"slot":16},{"slot":17},{"slot":18},{"slot":19},{"slot":20},{"slot":21},{"slot":22},{"slot":23},{"slot":24},{"slot":25},{"slot":26},{"slot":27},{"slot":28},{"slot":29},{"slot":30},{"slot":31},{"slot":32},{"slot":33},{"slot":34},{"slot":35},{"slot":36},{"slot":37},{"slot":38},{"slot":39},{"slot":40},{"slot":41},{"slot":42},{"slot":43},{"slot":44},{"slot":45},{"slot":46},{"slot":47},{"slot":48},{"slot":49},{"slot":50},{"slot":51},{"slot":52},{"slot":53},{"slot":54},{"slot":55},{"slot":56},{"slot":57},{"slot":58},{"slot":59},{"slot":60},{"slot":61},{"slot":62},{"slot":63},{"slot":64},{"slot":65},{"slot":66},{"slot":67},{"slot":68},{"slot":69},{"slot":70},{"slot":71}]}}]`);
Берём например:
Код:
{"slot":3,"item":7455,"amount":1,"text":"","background":-1128744961,"available":1,"blackout":0,"time":1738398653},
Где 7455 - айди айтема (Разрешение на ловлю, можно также рыскать через items.shinoa.tech), amount - количество предмета в слоте, time - время окончания действия в UNIX (если это лицензия/аренда и так далее).
Учитывая недавний переход инвентаря на цеф, то думаю, что особо ничего не изменилось.
Для работы с цефами можешь использовать эту библиотеку - https://www.blast.hk/threads/235586/
 
  • Нравится
Реакции: bloodletter

bloodletter

Новичок
6
1
попробуй с цефами что-нибудь поделать.
смотрели месяца 3-4 назад, там была вот такая вот штука:
Код:
[LUA] [CEF]: window.executeEvent('event.inventory.playerInventory', `[{"action":0,"data":{"type":1,"items":[{"slot":0,"item":569,"amount":1,"text":"","available":1,"blackout":0,"time":0},{"slot":1,"item":512,"amount":4,"text":"4","available":1,"blackout":0,"time":0},{"slot":2,"item":513,"amount":2,"text":"2","available":1,"blackout":0,"time":0},{"slot":3,"item":7455,"amount":1,"text":"","background":-1128744961,"available":1,"blackout":0,"time":1738398653},{"slot":4,"item":3927,"amount":7,"text":"7","available":1,"blackout":0,"time":0},{"slot":5,"item":269,"amount":1,"text":"ID:78","enchant":0,"available":1,"blackout":0,"time":0},{"slot":6,"item":8247,"amount":2,"text":"2","background":847291647,"available":1,"blackout":0,"time":0},{"slot":7,"item":1939,"amount":1,"text":"","background":-1540214017,"available":1,"blackout":0,"time":0},{"slot":8,"item":7627,"amount":1,"text":"PD: 17","background":-1540214017,"available":1,"blackout":0,"time":0},{"slot":9,"item":800,"amount":1,"text":"17 day","available":1,"blackout":0,"time":1739783461},{"slot":10,"item":7655,"amount":1,"text":"PD: 16","background":-1540214017,"available":1,"blackout":0,"time":0},{"slot":11,"item":676,"amount":1,"text":"","background":-589505281,"available":1,"blackout":0,"time":0},{"slot":12},{"slot":13,"item":601,"amount":3,"text":"3","available":1,"blackout":0,"time":0},{"slot":14},{"slot":15},{"slot":16},{"slot":17},{"slot":18},{"slot":19},{"slot":20},{"slot":21},{"slot":22},{"slot":23},{"slot":24},{"slot":25},{"slot":26},{"slot":27},{"slot":28},{"slot":29},{"slot":30},{"slot":31},{"slot":32},{"slot":33},{"slot":34},{"slot":35},{"slot":36},{"slot":37},{"slot":38},{"slot":39},{"slot":40},{"slot":41},{"slot":42},{"slot":43},{"slot":44},{"slot":45},{"slot":46},{"slot":47},{"slot":48},{"slot":49},{"slot":50},{"slot":51},{"slot":52},{"slot":53},{"slot":54},{"slot":55},{"slot":56},{"slot":57},{"slot":58},{"slot":59},{"slot":60},{"slot":61},{"slot":62},{"slot":63},{"slot":64},{"slot":65},{"slot":66},{"slot":67},{"slot":68},{"slot":69},{"slot":70},{"slot":71}]}}]`);
Берём например:
Код:
{"slot":3,"item":7455,"amount":1,"text":"","background":-1128744961,"available":1,"blackout":0,"time":1738398653},
Где 7455 - айди айтема (Разрешение на ловлю, можно также рыскать через items.shinoa.tech), amount - количество предмета в слоте, time - время окончания действия в UNIX (если это лицензия/аренда и так далее).
Учитывая недавний переход инвентаря на цеф, то думаю, что особо ничего не изменилось.
Для работы с цефами можешь использовать эту библиотеку - https://www.blast.hk/threads/235586/
а щас как работает?
 

angelsoempty

Известный
62
17
а щас как работает?
все схоже.
при заходе:
JavaScript:
window.executeEvent('event.inventory.playerInventory', `[{"action":0,"data":{"type":1,"items":[{"slot":0,"available":1,"blackout":0,"item":8141,"amount":1,"text":"","time":0},{"slot":1,"available":1,"blackout":0,"item":6508,"amount":2,"text":"2","time":0},{"slot":2,"available":1,"blackout":0,"item":679,"amount":1,"text":"","background":-589505281,"time":0},{"slot":3,"available":1,"blackout":0,"item":569,"amount":1,"text":"","time":0},{"slot":4,"available":1,"blackout":0},{"slot":5,"available":1,"blackout":0,"item":5841,"amount":1,"text":"","background":-1556328193,"time":0},{"slot":6,"available":1,"blackout":0},{"slot":7,"available":1,"blackout":0},{"slot":8,"available":1,"blackout":0},{"slot":9,"available":1,"blackout":0},{"slot":10,"available":1,"blackout":0},{"slot":11,"available":1,"blackout":0},{"slot":12,"available":1,"blackout":0},{"slot":13,"available":1,"blackout":0},{"slot":14,"available":1,"blackout":0},{"slot":15,"available":1,"blackout":0},{"slot":16,"available":1,"blackout":0},{"slot":17,"available":1,"blackout":0},{"slot":18,"available":1,"blackout":0},{"slot":19,"available":1,"blackout":0},{"slot":20,"available":1,"blackout":0},{"slot":21,"available":1,"blackout":0},{"slot":22,"available":1,"blackout":0},{"slot":23,"available":1,"blackout":0},{"slot":24,"available":1,"blackout":0},{"slot":25,"available":1,"blackout":0},{"slot":26,"available":1,"blackout":0},{"slot":27,"available":1,"blackout":0},{"slot":28,"available":1,"blackout":0},{"slot":29,"available":1,"blackout":0},{"slot":30,"available":1,"blackout":0},{"slot":31,"available":1,"blackout":0},{"slot":32,"available":1,"blackout":0},{"slot":33,"available":1,"blackout":0},{"slot":34,"available":1,"blackout":0},{"slot":35,"available":1,"blackout":0},{"slot":36,"available":1,"blackout":0},{"slot":37,"available":1,"blackout":0},{"slot":38,"available":1,"blackout":0},{"slot":39,"available":1,"blackout":0},{"slot":40,"available":1,"blackout":0},{"slot":41,"available":1,"blackout":0},{"slot":42,"available":1,"blackout":0},{"slot":43,"available":1,"blackout":0},{"slot":44,"available":1,"blackout":0},{"slot":45,"available":1,"blackout":0}]}}]`); | 220, 17, 2143, 1, window.executeEvent('event.inventory.playerInventory', `[{"action":0,"data":{"type":1,"items":[{"slot":0,"available":1,"blackout":0,"item":8141,"amount":1,"text":"","time":0},{"slot":1,"available":1,"blackout":0,"item":6508,"amount":2,"text":"2","time":0},{"slot":2,"available":1,"blackout":0,"item":679,"amount":1,"text":"","background":-589505281,"time":0},{"slot":3,"available":1,"blackout":0,"item":569,"amount":1,"text":"","time":0},{"slot":4,"available":1,"blackout":0},{"slot":5,"available":1,"blackout":0,"item":5841,"amount":1,"text":"","background":-1556328193,"time":0},{"slot":6,"available":1,"blackout":0},{"slot":7,"available":1,"blackout":0},{"slot":8,"available":1,"blackout":0},{"slot":9,"available":1,"blackout":0},{"slot":10,"available":1,"blackout":0},{"slot":11,"available":1,"blackout":0},{"slot":12,"available":1,"blackout":0},{"slot":13,"available":1,"blackout":0},{"slot":14,"available":1,"blackout":0},{"slot":15,"available":1,"blackout":0},{"slot":16,"available":1,"blackout":0},{"slot":17,"available":1,"blackout":0},{"slot":18,"available":1,"blackout":0},{"slot":19,"available":1,"blackout":0},{"slot":20,"available":1,"blackout":0},{"slot":21,"available":1,"blackout":0},{"slot":22,"available":1,"blackout":0},{"slot":23,"available":1,"blackout":0},{"slot":24,"available":1,"blackout":0},{"slot":25,"available":1,"blackout":0},{"slot":26,"available":1,"blackout":0},{"slot":27,"available":1,"blackout":0},{"slot":28,"available":1,"blackout":0},{"slot":29,"available":1,"blackout":0},{"slot":30,"available":1,"blackout":0},{"slot":31,"available":1,"blackout":0},{"slot":32,"available":1,"blackout":0},{"slot":33,"available":1,"blackout":0},{"slot":34,"available":1,"blackout":0},{"slot":35,"available":1,"blackout":0},{"slot":36,"available":1,"blackout":0},{"slot":37,"available":1,"blackout":0},{"slot":38,"available":1,"blackout":0},{"slot":39,"available":1,"blackout":0},{"slot":40,"available":1,"blackout":0},{"slot":41,"available":1,"blackout":0},{"slot":42,"available":1,"blackout":0},{"slot":43,"available":1,"blackout":0},{"slot":44,"available":1,"blackout":0},{"slot":45,"available":1,"blackout":0}]}}]`);

и, например, при получении айтема в инвентарь:
JavaScript:
window.executeEvent('event.inventory.playerInventory', `[{"action":2,"data":{"type":1,"items":[{"slot":4,"available":1,"blackout":0,"item":561,"amount":20,"text":"20","time":0}]}}]`); | 220, 17, 183, 1, window.executeEvent('event.inventory.playerInventory', `[{"action":2,"data":{"type":1,"items":[{"slot":4,"available":1,"blackout":0,"item":561,"amount":20,"text":"20","time":0}]}}]`);

то есть при авторизации можно спокойно брать список предметов в инвентаре, мониторить появление новых айтемов и так далее, но нужно чуть глубже изучить эту тему (если нужно полное отслеживание действий с инвентарем/в инвентаре).

Прям простенький пример реализации (для дефолтной гташки, не рыгсампа):
Lua:
require 'lib.moonloader'
local acef = require 'arizona-events'

local inventory = {}

function main()
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('inv parser loaded', -1)
    wait(-1)
end

function acef.onArizonaDisplay(packet)
    if acef.decode(packet) then
        if packet.event == 'event.inventory.playerInventory' then
            local data = packet.json[1]
            
            -- делаем проверку на .type == 1 в 'data":{"type":1,'
            -- так как после подгрузки инвентаря идут другие цеф пакеты с тем же названием эвента
            if data.data.type == 1 then
                if data.action == 0 then
                    for _, item in ipairs(data.data.items) do
                        if item.item then
                            inventory[item.slot] = {
                                slot = item.slot,
                                available = item.available,
                                item = item.item,
                                amount = item.amount
                            }
                        end
                    end
                    debug()
                    
                elseif data.action == 2 then
                    for _, item in ipairs(data.data.items) do
                        if item.item then
                            inventory[item.slot] = {
                                slot = item.slot,
                                available = item.available,
                                item = item.item,
                                amount = item.amount
                            }
                            sampAddChatMessage('item added: ' .. item.item, -1)
                        end
                    end
                    debug()
                end
            end
        end
    end
end

function debug()
    local count = 0
    local items = {}
    for _, item in pairs(inventory) do
        count = count + 1
        table.insert(items, item.item)
    end
    
    local ids = table.concat(items, ', ')
    sampAddChatMessage(string.format('всео в инвентаре: %d. id айтемов: %s', count, ids), -1)
end

В реализации и в принципе самой идее есть куча минусов, которые конечному разработчику нужно будет залатать.

Чуть более сложная реализация, но с куда лучшим результатом может быть, если мы например будем читать сразу из инвентаря (конечный юзер открывает инвентарь -> скрипт считывает из цефа весь инвентарь). Пример, наверно, здесь реализован... https://www.blast.hk/threads/235670/
Но не имею понятия, как напрямую данные возвращать в lua после прочтения их в цефе.