• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua Autoloot doesn't work

Vitich

Member
Joined
Nov 28, 2012
Messages
266
Reaction score
11
Hello community :)

I've got a problem with this script. No errors, all commands work fine, but the loot didn't get looted :/

creaturescripts/autoloot.lua
Code:
[LIST=1]
[*]local function scanContainer(cid, position)
[*]    local player = Player(cid)
[*]    if not player then
[*]        return
[*]    end
[*]

[*]    local corpse = Tile(position):getTopDownItem()
[*]    if not corpse or not corpse:isContainer() then
[*]        return
[*]    end
[*]

[*]    if corpse:getType():isCorpse() and corpse:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) == cid then
[*]        for a = corpse:getSize() - 1, 0, -1 do
[*]            local containerItem = corpse:getItem(a)
[*]            if containerItem then
[*]                for b = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]                    if player:getStorageValue(b) == containerItem:getId() then
[*]                        containerItem:moveTo(player)
[*]                    end
[*]                end
[*]            end
[*]        end
[*]    end
[*]end
[*]

[*]function onKill(player, target)
[*]    if not target:isMonster() then
[*]        return true
[*]    end
[*]

[*]    addEvent(scanContainer, 100, player:getId(), target:getPosition())
[*]    return true
[*]end
[/LIST]

talkactions/scripts/autoloot.lua
Code:
[LIST=1]
[*]function onSay(player, words, param)
[*]    local split = param:split(",")
[*]

[*]    local action = split[1]
[*]    if action == "add" then
[*]        local item = split[2]:gsub("%s+", "", 1)
[*]        local itemType = ItemType(item)
[*]        if itemType:getId() == 0 then
[*]            itemType = ItemType(tonumber(item))
[*]            if itemType:getId() == 0 then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "There is no item with that id or name.")
[*]                return false
[*]            end
[*]        end
[*]

[*]        local itemName = tonumber(split[2]) and itemType:getName() or item
[*]        local size = 0
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            local storage = player:getStorageValue(i)
[*]            if size == AUTO_LOOT_MAX_ITEMS then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "The list is full, please remove from the list to make some room.")
[*]                break
[*]            end
[*]

[*]            if storage == itemType:getId() then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." is already in the list.")
[*]                break
[*]            end
[*]

[*]            if storage <= 0 then
[*]                player:setStorageValue(i, itemType:getId())
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." has been added to the list.")
[*]                break
[*]            end
[*]

[*]            size = size + 1
[*]        end
[*]    elseif action == "remove" then
[*]        local item = split[2]:gsub("%s+", "", 1)
[*]        local itemType = ItemType(item)
[*]        if itemType:getId() == 0 then
[*]            itemType = ItemType(tonumber(item))
[*]            if itemType:getId() == 0 then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "There is no item with that id or name.")
[*]                return false
[*]            end
[*]        end
[*]

[*]        local itemName = tonumber(split[2]) and itemType:getName() or item
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            if player:getStorageValue(i) == itemType:getId() then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." has been removed from the list.")
[*]                player:setStorageValue(i, 0)
[*]                return false
[*]            end
[*]        end
[*]

[*]        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." was not founded in the list.")
[*]    elseif action == "show" then
[*]        local text = "-- Auto Loot List --\n"
[*]        local count = 1
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            local storage = player:getStorageValue(i)
[*]            if storage > 0 then
[*]                text = string.format("%s%d. %s\n", text, count, ItemType(storage):getName())
[*]                count = count + 1
[*]            end
[*]        end
[*]

[*]        if text == "" then
[*]            text = "Empty"
[*]        end
[*]

[*]        player:showTextDialog(1950, text, false)
[*]    elseif action == "clear" then
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            player:setStorageValue(i, 0)
[*]        end
[*]

[*]        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "The autoloot list has been cleared.")
[*]    else
[*]        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Use the commands: !autoloot {add, remove, show, clear}")
[*]    end
[*]

[*]    return false
[*]end
[/LIST]

Thanks guys! :D
 
Hello community :)

I've got a problem with this script. No errors, all commands work fine, but the loot didn't get looted :/

creaturescripts/autoloot.lua
Code:
[LIST=1]
[*]local function scanContainer(cid, position)
[*]    local player = Player(cid)
[*]    if not player then
[*]        return
[*]    end
[*]

[*]    local corpse = Tile(position):getTopDownItem()
[*]    if not corpse or not corpse:isContainer() then
[*]        return
[*]    end
[*]

[*]    if corpse:getType():isCorpse() and corpse:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) == cid then
[*]        for a = corpse:getSize() - 1, 0, -1 do
[*]            local containerItem = corpse:getItem(a)
[*]            if containerItem then
[*]                for b = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]                    if player:getStorageValue(b) == containerItem:getId() then
[*]                        containerItem:moveTo(player)
[*]                    end
[*]                end
[*]            end
[*]        end
[*]    end
[*]end
[*]

[*]function onKill(player, target)
[*]    if not target:isMonster() then
[*]        return true
[*]    end
[*]

[*]    addEvent(scanContainer, 100, player:getId(), target:getPosition())
[*]    return true
[*]end
[/LIST]

talkactions/scripts/autoloot.lua
Code:
[LIST=1]
[*]function onSay(player, words, param)
[*]    local split = param:split(",")
[*]

[*]    local action = split[1]
[*]    if action == "add" then
[*]        local item = split[2]:gsub("%s+", "", 1)
[*]        local itemType = ItemType(item)
[*]        if itemType:getId() == 0 then
[*]            itemType = ItemType(tonumber(item))
[*]            if itemType:getId() == 0 then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "There is no item with that id or name.")
[*]                return false
[*]            end
[*]        end
[*]

[*]        local itemName = tonumber(split[2]) and itemType:getName() or item
[*]        local size = 0
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            local storage = player:getStorageValue(i)
[*]            if size == AUTO_LOOT_MAX_ITEMS then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "The list is full, please remove from the list to make some room.")
[*]                break
[*]            end
[*]

[*]            if storage == itemType:getId() then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." is already in the list.")
[*]                break
[*]            end
[*]

[*]            if storage <= 0 then
[*]                player:setStorageValue(i, itemType:getId())
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." has been added to the list.")
[*]                break
[*]            end
[*]

[*]            size = size + 1
[*]        end
[*]    elseif action == "remove" then
[*]        local item = split[2]:gsub("%s+", "", 1)
[*]        local itemType = ItemType(item)
[*]        if itemType:getId() == 0 then
[*]            itemType = ItemType(tonumber(item))
[*]            if itemType:getId() == 0 then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "There is no item with that id or name.")
[*]                return false
[*]            end
[*]        end
[*]

[*]        local itemName = tonumber(split[2]) and itemType:getName() or item
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            if player:getStorageValue(i) == itemType:getId() then
[*]                player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." has been removed from the list.")
[*]                player:setStorageValue(i, 0)
[*]                return false
[*]            end
[*]        end
[*]

[*]        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, itemName .." was not founded in the list.")
[*]    elseif action == "show" then
[*]        local text = "-- Auto Loot List --\n"
[*]        local count = 1
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            local storage = player:getStorageValue(i)
[*]            if storage > 0 then
[*]                text = string.format("%s%d. %s\n", text, count, ItemType(storage):getName())
[*]                count = count + 1
[*]            end
[*]        end
[*]

[*]        if text == "" then
[*]            text = "Empty"
[*]        end
[*]

[*]        player:showTextDialog(1950, text, false)
[*]    elseif action == "clear" then
[*]        for i = AUTOLOOT_STORAGE_START, AUTOLOOT_STORAGE_END do
[*]            player:setStorageValue(i, 0)
[*]        end
[*]

[*]        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "The autoloot list has been cleared.")
[*]    else
[*]        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Use the commands: !autoloot {add, remove, show, clear}")
[*]    end
[*]

[*]    return false
[*]end
[/LIST]

Thanks guys! :D

Seems like you might have missed 1 or 2 things.
First:
In creaturescripts/scripts/login.lua
add
Lua:
player:registerEvent("AutoLoot")

Second:
In data/global.lua
add
Lua:
-- AutoLoot config
    AUTO_LOOT_MAX_ITEMS = 5

    -- Reserved storage
    AUTOLOOT_STORAGE_START = 10000
    AUTOLOOT_STORAGE_END = AUTOLOOT_STORAGE_START + AUTO_LOOT_MAX_ITEMS
-- AutoLoot config end
 
Seems like you might have missed 1 or 2 things.
First:
In creaturescripts/scripts/login.lua
add
Lua:
player:registerEvent("AutoLoot")

Second:
In data/global.lua
add
Lua:
-- AutoLoot config
    AUTO_LOOT_MAX_ITEMS = 5

    -- Reserved storage
    AUTOLOOT_STORAGE_START = 10000
    AUTOLOOT_STORAGE_END = AUTOLOOT_STORAGE_START + AUTO_LOOT_MAX_ITEMS
-- AutoLoot config end

Its already added.

Still not working
Code:
<event type="kill" name="AutoLoot" script="autoloot.lua" />

In login.lua already added, too
But not work :/
 
Back
Top