AutoLoot System for tfs 1.3

Dorianek

Member
Joined
Nov 29, 2018
Messages
213
Best answers
0
Reaction score
8
Location
Poland
I am using tfs 1.3 script, it works, but you can not remove added items autoloot does not collect itself after killing. You have to open the body manually


Actionscripts

C++:
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local issue = {}
    local bodycontainer, slot, msg = {}, 0, ''
    local monster = Tile(toPosition):getTopVisibleThing()
    local corpse = getTileItemById(toPosition, monster:getId()).uid
    local slots = getContainerSize(corpse)

    if not corpse or not slots then
        return false
    end

    local logic, contlogic, bplogica = 1, {}, {}
    if getContainerSize(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid) then
    for i = 0, getContainerSize(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid) do
        contlogic[logic] = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)

        if isContainer(contlogic[logic].uid) then
        bplogica[logic] = contlogic[logic]
        logic = logic + 1
        end

    end
    end

    for times = 1, slots do
        bodycontainer[times] = getContainerItem(corpse, slot)
        if player:getAutoLootItem(bodycontainer[times].itemid) then

        local slotcorpse = bodycontainer[times].uid
        local itemcorpse = Item(slotcorpse)
        local slotgg
        local localizou
        local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. itemcorpse:getId() .. '')
            if resultId then
            local bp_id = result.getNumber(resultId, 'cont_id')
            end
        for i = 1, #bplogica do
        local tempitem = Item(bplogica[i].uid)
            if tempitem:getId() == result.getNumber(resultId, 'cont_id') and localizou ~= 1 then
                local bp = bplogica[i].uid
                local freeSlotsInBp = math.max(0, getContainerCap(bp) - getContainerSize(bp))
                if freeSlotsInBp and freeSlotsInBp > 0 then
                slotgg = bplogica[i].uid
                localizou = 1
                end
            end
        end

        local destination = Item(slotgg)

            if destination and destination:getTopParent() == player then
                itemcorpse:moveTo(destination)
                    if bodycontainer[times].type > 1 then
                    msg = ''..msg.. ', '..bodycontainer[times].type..' '..tostring(ItemType(bodycontainer[times].itemid):getPluralName())..''
                    else
                    msg = ''..msg.. ', '..tostring(ItemType(bodycontainer[times].itemid):getName())..''
                    end
            else
                if not table.contains(issue, bodycontainer[times].itemid) then
                table.insert(issue, bodycontainer[times].itemid)
                end
                itemcorpse:moveToSlot(player, 0)
            end

        else
            slot = slot + 1
        end
    end

    if msg ~= '' then
    player:sendTextMessage(MESSAGE_INFO_DESCR,'Looted:'.. string.gsub(" "..msg, "%W%l", string.lower):sub(3) ..' opening corpse')
    end

    if issue then
    if #issue >= 1 then
    for i = 1, #issue do
    player:sendTextMessage(MESSAGE_INFO_DESCR,'All main '..string.gsub(" "..string.lower(ItemType(issue[i]):getName()), "%W%l", string.upper):sub(2)..' full, buy a new or move itens to sub backpacks.')
    end
    end
    end

end
Creaturescripts

C++:
function onModalWindow(player, modalWindowId, buttonId, choiceId)
    player:unregisterEvent('autoloot')
    local limiteAutoloot = 100
    local autolootlist, sum = {}, 1
    if buttonId == 102 and modalWindowId == 1000 then
        local playerlist = player:getAutoLootList()
        if playerlist then
            table.sort(playerlist, function(a, b) return ItemType(a):getName() < ItemType(b):getName() end)
            for _, item in ipairs(playerlist) do
                table.insert(autolootlist, "".. item .."")
            end
            local itemType = ItemType(tonumber(autolootlist[choiceId]))
            player:sendTextMessage(MESSAGE_INFO_DESCR,'Removed '.. string.gsub(" "..ItemType(tonumber(autolootlist[choiceId])):getName(), "%W%l", string.upper):sub(2, 21)..' from autoloot list!')
            db.query('DELETE FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. itemType:getId() .. '')
            player:removeAutoLootItem(itemType:getId())
            call(player, 'remove')
        end
        elseif buttonId == 102 and modalWindowId == 1001 or buttonId == 103 then
        local lootBlockList = lootBlockListm[getPlayerGUID(player)]
        if lootBlockList == nil or lootBlockList == -1 then
            return false
        end
        for _, loot in pairs(lootBlockList) do
            table.insert(autolootlist, lootBlockList[sum].itemId)
            sum = sum + 1
        end
        local itemType = ItemType(tonumber(autolootlist[choiceId]))
        if buttonId == 102 then
            player:sendTextMessage(MESSAGE_INFO_DESCR,'Removed '.. string.gsub(" "..ItemType(itemType:getId()):getName(), "%W%l", string.upper):sub(2, 21)..' from autoloot list!')
            db.query('DELETE FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. itemType:getId() .. '')
            player:removeAutoLootItem(itemType:getId())
            elseif buttonId == 103 then
            if player:getAutoLootList() then
            local playerlist = player:getAutoLootList()
            end
            if playerlist then
                for _, item in ipairs(playerlist) do
                    table.insert(autolootlist, "".. item .."")
                end
            end
            if playerlist and #playerlist >= limiteAutoloot then
                player:sendCancelMessage("Reached the limit <"..#playerlist..">for itens, first remove using !autoloot or !add <monster>, selecting option remove.")
                return false
                else
                player:sendTextMessage(MESSAGE_INFO_DESCR,'Add '.. string.gsub(" "..ItemType(lootBlockList[choiceId].itemId):getName(), "%W%l", string.upper):sub(2, 21) ..' to autoloot list!')
                player:addAutoLootItem(itemType:getId())
            end
        end
        call(player, 'add')
        elseif buttonId == 105 then
        local lootBlockList = lootBlockListm[getPlayerGUID(player)]
        if lootBlockList == nil or lootBlockList == -1 then
            return false
        end
        for _, loot in pairs(lootBlockList) do
            table.insert(autolootlist, lootBlockList[sum].itemId)
            sum = sum + 1
        end
        local itemType = ItemType(tonumber(autolootlist[choiceId]))
        lastitem[getPlayerGUID(player)] = lootBlockList[choiceId].itemId
        call(player, 'backpack', modalWindowId, lastitem[getPlayerGUID(player)])
        elseif buttonId == 106 then
        local lootBlockList = player:getAutoLootList()
        table.sort(lootBlockList, function(a, b) return ItemType(a):getName() < ItemType(b):getName() end)
        if lootBlockList == nil or lootBlockList == -1 then
            return false
        end
        for _, loot in pairs(lootBlockList) do
            table.insert(autolootlist, lootBlockList[sum])
            sum = sum + 1
        end
        local itemType = ItemType(tonumber(autolootlist[choiceId]))
        lastitem[getPlayerGUID(player)] = lootBlockList[choiceId]
        call(player, 'backpack', modalWindowId, lastitem[getPlayerGUID(player)])
        elseif buttonId == 100 then
        if modalWindowId == 1005 then
            local container, bp, sequencer = {}, {}, 1
            local bp2 = {}
            for i = 0, getContainerSize(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid) do
                local thing = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)
                container[i] = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)
                if isContainer(container[i].uid) then
                    itemtester = Item(container[i].uid)
                    bp[sequencer] = itemtester
                    bp2[sequencer] = itemtester:getId()
                    sequencer = sequencer + 1
                end
            end
            if sequencer > 1 then
                if player:getAutoLootItem(lastitem[getPlayerGUID(player)]) then
                    local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. lastitem[getPlayerGUID(player)] .. '')
                    if resultId then
                        local bp_id = result.getNumber(resultId, 'cont_id')
                        else
                        db.query("INSERT INTO `player_autoloot_persist` (`player_guid`, `cont_id`, `item_id`) VALUES (".. getPlayerGUID(player) ..", ".. bp2[choiceId] ..", ".. lastitem[getPlayerGUID(player)] ..") ON DUPLICATE KEY UPDATE `cont_id` = ".. bp2[choiceId])
                    end
                    if result.getNumber(resultId, 'cont_id') and result.getNumber(resultId, 'cont_id') ~= bp2[choiceId] then
                        db.query('UPDATE `player_autoloot_persist` SET `cont_id` = '..bp2[choiceId]..' WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. lastitem[getPlayerGUID(player)] .. '')
                    end
                end
            end
            call(player, 'add')
        end
        if modalWindowId == 1006 then
            local container, bp, sequencer = {}, {}, 1
            local bp2 = {}
            for i = 0, getContainerSize(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid) do
                local thing = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)
                container[i] = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)
                if isContainer(container[i].uid) then
                    itemtester = Item(container[i].uid)
                    bp[sequencer] = itemtester
                    bp2[sequencer] = itemtester:getId()
                    sequencer = sequencer + 1
                end
            end
            if sequencer > 1 then
                local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. lastitem[getPlayerGUID(player)] .. '')
                if resultId then
                    local bp_id = result.getNumber(resultId, 'cont_id')
                    else
                    db.query("INSERT INTO `player_autoloot_persist` (`player_guid`, `cont_id`, `item_id`) VALUES (".. getPlayerGUID(player) ..", ".. bp2[choiceId] ..", ".. lastitem[getPlayerGUID(player)] ..") ON DUPLICATE KEY UPDATE `cont_id` = ".. bp2[choiceId])
                end
                if result.getNumber(resultId, 'cont_id') and result.getNumber(resultId, 'cont_id') ~= bp2[choiceId] then
                    db.query('UPDATE `player_autoloot_persist` SET `cont_id` = '..bp2[choiceId]..' WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. lastitem[getPlayerGUID(player)] .. '')
                end
            end
            call(player, 'remove')

        end
    end
end

function call(player, param, param2, tobpid)
    player:registerEvent('autoloot')
    local title = "Autoloot Helper!"
    if param == 'add' then
        local lootBlockList = lootBlockListm[getPlayerGUID(player)]
        local message = "Loots of "..string.gsub(" "..string.lower(lootBlockListn[getPlayerGUID(player)]), "%W%l", string.upper):sub(2)..":"
        local window = ModalWindow(1001, title, message)
        local check, sum = {}, 1
        for _, loot in pairs(lootBlockList) do
            local status = ''
            if player:getAutoLootItem(lootBlockList[sum].itemId) then
                status = '*'
            end
            if not table.contains(check, ItemType(lootBlockList[sum].itemId):getName()) then
                table.insert(check, ItemType(lootBlockList[sum].itemId):getName())
                local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. lootBlockList[sum].itemId .. '')
                if resultId then
                    local bp_id = result.getNumber(resultId, 'cont_id')
                end
                local backvinculo
                if result.getNumber(resultId, 'cont_id') and result.getNumber(resultId, 'cont_id') > 0 then
                    backvinculo = '| '..ItemType(result.getNumber(resultId, 'cont_id')):getName()..''
                    else
                    backvinculo = ''
                end
                window:addChoice(sum, "".. string.gsub(" "..status..""..ItemType(lootBlockList[sum].itemId):getName(), "%W%l", string.upper):sub(2, 21) .." | "..lootBlockList[sum].maxCount.." | "..(lootBlockList[sum].chance/1000).."% "..string.gsub(" "..string.lower(backvinculo), "%W%l", string.upper):sub(2).."")
            end
            sum = sum + 1
        end
        if autolootBP == 1 then
            window:addButton(105, "Backpack")
        end
        callwindow(window, player, 1)
        elseif param == 'remove' then
        local message = "You are currently looting the following items:"
        local window = ModalWindow(1000, title, message)
        local check, sum = player:getAutoLootList(), 1
        if check then
            table.sort(check, function(a, b) return ItemType(a):getName() < ItemType(b):getName() end)
            for _, item in ipairs(check) do
                local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. ItemType(check[sum]):getId() .. '')
                if resultId then
                    local bp_id = result.getNumber(resultId, 'cont_id')
                end
                local backvinculo
                if result.getNumber(resultId, 'cont_id') and result.getNumber(resultId, 'cont_id') > 0 then
                    backvinculo = '| '..ItemType(result.getNumber(resultId, 'cont_id')):getName()..''
                    else
                    backvinculo = ''
                end
                window:addChoice(sum, "".. string.gsub(" "..(ItemType(item)):getName(), "%W%l", string.upper):sub(2, 21) .." "..string.gsub(" "..string.lower(backvinculo), "%W%l", string.upper):sub(2).."")
                sum = sum + 1
            end
            else
            player:sendCancelMessage("The list is empty.")
            return false
        end
        if autolootBP == 1 then
            window:addButton(106, "Backpack")
        end
        callwindow(window, player, 2)
        elseif param == 'backpack' then
        local lootBlockList = lootBlockListm[getPlayerGUID(player)]

        local modalcode
        if param2 and param2 == 1001 then
            modalcode = 1005
            else
            modalcode = 1006
        end
        local message = "Choose a Backpack:"
        local window = ModalWindow(modalcode, title, message)
        local sum = 1
        local container, names = {}, {}
        if getContainerSize(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid) then
            for i = 0, getContainerSize(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid) do
                local thing = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)
                container[i] = getContainerItem(getPlayerSlotItem(player, CONST_SLOT_BACKPACK).uid, i)
                if isContainer(container[i].uid) then
                    if not table.contains(names, container[i].itemId) then
                        table.insert(names, container[i].itemId)
                        window:addChoice(sum, ""..string.gsub(" "..string.lower(ItemType(container[i].itemid):getName()), "%W%l", string.upper):sub(2).."")
                    end
                    sum = sum + 1
                end
            end
            else
            player:sendCancelMessage("Not find main backpack.")
            return false
        end
        if sum == 1 then
            player:sendCancelMessage("Not find sub-backpacks.")
            return false
        end
        callwindow(window, player, 3)
    end
end

function callwindow(window, player, param)
    if param == 3 then
        window:setDefaultEnterButton(100, "Confirm")
        window:addButton(100, "Confirm")
        else
        window:addButton(100, "Confirm")
        window:addButton(102, "Remove")
        window:setDefaultEnterButton(106, "Backpack")
        if param == 1 then
            window:addButton(103, "Add")
            window:setDefaultEnterButton(103, "Add")
            window:addButton(105, "Backpack")
        end
    end
    window:sendToPlayer(player)
end
Globaleventscripts

C++:
function onStartup()
    lootBlockListm = {}
    lootBlockListn = {}
    lastitem = {}
    autolootBP = 1 -- 0 = disable, 1 = enable (only works with autolootmode = 2 in config.lua)
    return true
end
Talkactionsscripts

add_autoloot

C++:
function onSay(player, words, param)
    local monsterType = MonsterType(param)
    if not monsterType then
        player:sendCancelMessage("Can't find monster.")
        return false
    end

    player:registerEvent('autoloot')
    local title = "Autoloot Helper!"
    local message = "Loots of "..string.gsub(" "..string.lower(param), "%W%l", string.upper):sub(2)..":"
    local lootBlockList = monsterType:getLoot()
    table.sort(lootBlockList, function(a, b) return ItemType(a.itemId):getName() < ItemType(b.itemId):getName() end)

        lootBlockListm[getPlayerGUID(player)] = lootBlockList
    lootBlockListn[getPlayerGUID(player)] = param

    local window = ModalWindow(1001, title, message)
    local check, sum = {}, 1
    for _, loot in pairs(lootBlockList) do
        local status = ''
        if player:getAutoLootItem(lootBlockList[sum].itemId) then
            status = '*'
        end
        if not table.contains(check, ItemType(lootBlockList[sum].itemId):getName()) then
            table.insert(check, ItemType(lootBlockList[sum].itemId):getName())
            local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. lootBlockList[sum].itemId .. '')
            if resultId then
            local bp_id = result.getNumber(resultId, 'cont_id')
            end

            local backvinculo

            if result.getNumber(resultId, 'cont_id') and result.getNumber(resultId, 'cont_id') > 0 then
            backvinculo = '| '..ItemType(result.getNumber(resultId, 'cont_id')):getName()..''
            else
            backvinculo = ''
            end
            window:addChoice(sum, "".. string.gsub(" "..status..""..ItemType(lootBlockList[sum].itemId):getName(), "%W%l", string.upper):sub(2, 21) .." | "..lootBlockList[sum].maxCount.." | "..(lootBlockList[sum].chance/1000).."% "..string.gsub(" "..string.lower(backvinculo), "%W%l", string.upper):sub(2).."")
        end
        sum = sum + 1
    end
    window:addButton(105, "Backpack")
    window:setDefaultEnterButton(103, "Add")
    window:addButton(100, "Confirm")
    if autolootBP == 1 then
    window:addButton(102, "Remove")
    end
    window:addButton(103, "Add")

    window:sendToPlayer(player)
    return false
end
Autoloot

C++:
function onSay(player, words, param)
    local lootlist, sum = player:getAutoLootList(), 1
    if lootlist then
        player:registerEvent('autoloot')
        local title = "Autoloot Helper!"
        local message = "You are currently looting the following items:"
        local window = ModalWindow(1000, title, message)
        table.sort(lootlist, function(a, b) return ItemType(a):getName() < ItemType(b):getName() end)
        for _, item in ipairs(lootlist) do
        local resultId = db.storeQuery('SELECT `cont_id` FROM `player_autoloot_persist` WHERE `player_guid` = ' .. getPlayerGUID(player) .. ' AND `item_id` = ' .. ItemType(item):getId() .. '')
                if resultId then
                    local bp_id = result.getNumber(resultId, 'cont_id')
                end
                local backvinculo
                if result.getNumber(resultId, 'cont_id') and result.getNumber(resultId, 'cont_id') > 0 then
                    backvinculo = '| '..ItemType(result.getNumber(resultId, 'cont_id')):getName()..''
                    else
                    backvinculo = ''
                end

            window:addChoice(sum, "".. string.gsub(" "..(ItemType(item)):getName(), "%W%l", string.upper):sub(2, 21) .." "..string.gsub(" "..string.lower(backvinculo), "%W%l", string.upper):sub(2).."")
            sum = sum + 1
        end
        window:addButton(106, "Backpack")
        window:addButton(100, "Confirm")
        window:addButton(102, "Remove")
        if autolootBP == 1 then
        window:setDefaultEnterButton(106, "Backpack")
        end
        window:sendToPlayer(player)
        return true
    else
        player:sendCancelMessage("The list is empty.")
        return false
    end
end
 

Zarkank

New Member
Joined
Apr 25, 2017
Messages
24
Best answers
1
Reaction score
1
Ta usando qual projeto? OTBR?
 

Zarkank

New Member
Joined
Apr 25, 2017
Messages
24
Best answers
1
Reaction score
1
No config.lua procura essa linha
autolootmode = 2
Coloca
autolootmode = 1
 
OP
D

Dorianek

Member
Joined
Nov 29, 2018
Messages
213
Best answers
0
Reaction score
8
Location
Poland
! add rat does not select loot
! autoloot show can not be deleted
 
OP
D

Dorianek

Member
Joined
Nov 29, 2018
Messages
213
Best answers
0
Reaction score
8
Location
Poland
Items instead of falling into a backpack and bag fall directly

37617
 

Evil Puncker

I'd rather kiss a rattlesnake
Joined
May 30, 2009
Messages
5,631
Best answers
19
Reaction score
1,678
Location
160,54,7
I don't really understand the issue here, care to make a gif or a video explaining?
 
OP
D

Dorianek

Member
Joined
Nov 29, 2018
Messages
213
Best answers
0
Reaction score
8
Location
Poland
37648

You can not set the possibility that items fall into the bag because they do not drop there
 

Evil Puncker

I'd rather kiss a rattlesnake
Joined
May 30, 2009
Messages
5,631
Best answers
19
Reaction score
1,678
Location
160,54,7
ohh, so the issue is they always go on the main bp?
 

Nyedson

New Member
Joined
Sep 13, 2019
Messages
1
Best answers
0
Reaction score
0
Same problem. The player has chosen the backpack for the destination, but the loot only goes to the main backpack.
 
Top