• 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!

[Mod] Auto Loot

Hello, I'm having trouble with this script when the player adds over 33 items, the server goes down, I already managed to put 50 items, but when the server goes down, it goes back to 33 items in the list, this line:
BlockItemsList

Filters only that you do not want to put, I'd like a place where these items can only use the autoloot eg
"demon shield, demon armor, mace, sword, plate armor etc."

Thxx!
 
Last edited:
Credits: MatheusMkalo & Vodkart

tested version: 8.6 and 9.1


rWxW3.png

Hb2A7.png



Auto Loot.xml
Lua:
<?xml version="1.0" encoding="ISO-8859-1"?> 
<mod name="Loot System" version="1.0" author="Vodkart And Mkalo" contact="none.com" enabled="yes"> 
<config name="Loot_func"><![CDATA[

info = {
OnlyPremium = true,
AutomaticDeposit = true,
BlockMonsters = {},
BlockItemsList = {2123,2515}
}

function setPlayerStorageTable(cid, storage, tab)
    local tabstr = "&"
    for i,x in pairs(tab) do
            tabstr = tabstr .. i .. "," .. x .. ";"
    end
    setPlayerStorageValue(cid, storage, tabstr:sub(1, #tabstr-1))
end
function getPlayerStorageTable(cid, storage)
    local tabstr = getPlayerStorageValue(cid, storage)
    local tab = {}
    if type(tabstr) ~= "string" then
            return {}
    end
    if tabstr:sub(1,1) ~= "&" then
            return {}
    end
    local tabstr = tabstr:sub(2, #tabstr)
    local a = string.explode(tabstr, ";")
    for i,x in pairs(a) do
            local b = string.explode(x, ",")
            tab[tonumber(b[1]) or b[1]] = tonumber(b[2]) or b[2]
    end
    return tab
end

function isInTable(cid, item)
         for _,i in pairs(getPlayerStorageTable(cid, 27000))do
             if tonumber(i) == tonumber(item) then
                return true
             end
         end
return false
end
function addItemTable(cid, item)
         local x = {}
               for i = 1,#getPlayerStorageTable(cid, 27000) do
                   table.insert(x,getPlayerStorageTable(cid, 27000)[I])
               end
               if x ~= 0 then
                  table.insert(x,tonumber(item))
                  setPlayerStorageTable(cid, 27000, x)
               else
                   setPlayerStorageTable(cid, 27000, {item})
               end
end
function removeItemTable(cid, item)
         local x = {}
               for i = 1,#getPlayerStorageTable(cid, 27000) do
                   table.insert(x,getPlayerStorageTable(cid, 27000)[I])
               end
               for i,v in ipairs(x) do 
                   if tonumber(v) == tonumber(item) then
                   table.remove(x,i)
               end
               end
         return setPlayerStorageTable(cid, 27000, x)
end
function ShowItemsTabble(cid)
local str,n = "-- My Loot List --\n\n",0
for i = 1,#getPlayerStorageTable(cid, 27000) do
n = n + 1
str = str..""..n.." - "..getItemNameById(getPlayerStorageTable(cid, 27000)[I]).."\n"
end
return doShowTextDialog(cid, 2529, str)
end
function getContainerItems(containeruid)
    local items = {}
    local containers = {}
    if type(getContainerSize(containeruid)) ~= "number" then
            return false
    end
    for slot = 0, getContainerSize(containeruid)-1 do
            local item = getContainerItem(containeruid, slot)
            if item.itemid == 0 then
                    break
            end
            if isContainer(item.uid) then
                    table.insert(containers, item.uid)
            end
            table.insert(items, item)
    end
    if #containers > 0 then
            for i,x in ipairs(getContainerItems(containers[1])) do
                    table.insert(items, x)
            end
            table.remove(containers, 1)
    end     
    return items
end
function getItemsInContainerById(container, itemid) -- Function By Kydrai
            local items = {}
            if isContainer(container) and getContainerSize(container) > 0 then
                            for slot=0, (getContainerSize(container)-1) do
                                            local item = getContainerItem(container, slot)
                                            if isContainer(item.uid) then
                                                            local itemsbag = getItemsInContainerById(item.uid, itemid)
                                                            for i=0, #itemsbag do
                                                                            table.insert(items, itemsbag[I])
                                                            end
                                            else
                                                            if itemid == item.itemid then
                                                                            table.insert(items, item.uid)
                                                            end
                                            end
                            end
            end
            return items
end
function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo
    local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)
    local piles = 0
    if #item > 0 then
            for i,x in pairs(item) do
                    if getThing(x).type < 100 then
                            local it = getThing(x)
                            doTransformItem(it.uid, itemid, it.type+quant)
                            if it.type+quant > 100 then
                                    doPlayerAddItem(cid, itemid, it.type+quant-100)
                            end
                    else
                           piles = piles+1
                    end
            end
    else
            return doPlayerAddItem(cid, itemid, quant)
    end
    if piles == #item then
            doPlayerAddItem(cid, itemid, quant)
    end
end
function AutomaticDeposit(cid,item,n)
local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n*1)
return doPlayerDepositMoney(cid, deposit)
end
function corpseRetireItems(cid, pos)
local check = false
for i = 0, 255 do
pos.stackpos = i
tile = getTileThingByPos(pos)
if tile.uid > 0 and isCorpse(tile.uid) then
check = true break
end
end
if check == true then
    local items = getContainerItems(tile.uid)
    for i,x in pairs(items) do
            if isInArray(getPlayerStorageTable(cid, 27000), tonumber(x.itemid)) then
                    if isItemStackable(x.itemid) then
doPlayerAddItemStacking(cid, x.itemid, x.type)
if info.AutomaticDeposit == true and isInArray({"2148","2152","2160"},tonumber(x.itemid)) then
AutomaticDeposit(cid,x.itemid,x.type)
end
                    else
                            doPlayerAddItem(cid, x.itemid)
                    end
                    doRemoveItem(x.uid)
            end
    end
end
end
]]></config>
<event type="login" name="LootLogin" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid, "MonsterAttack")
return true
end]]></event>
<event type="death" name="LootEventDeath" event="script"><![CDATA[
domodlib('Loot_func')
function onDeath(cid, corpse, deathList)
local killer,pos = deathList[1],getCreaturePosition(cid)
addEvent(corpseRetireItems,1,killer,pos)
return true
end]]></event>
<event type="combat" name="MonsterAttack" event="script"><![CDATA[
domodlib('Loot_func')
if isPlayer(cid) and isMonster(target) and not isInArray(info.BlockMonsters,string.lower(getCreatureName(target))) then
registerCreatureEvent(target, "LootEventDeath")
                end
return true]]></event>
<talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[
domodlib('Loot_func')
local t = string.explode(string.lower(param), ",")
if info_OnlyPremium == true and not isPremium(cid) then
doPlayerSendCancel(cid, "you must be a premium account.") return true
elseif not t[1] then
ShowItemsTabble(cid) return true
elseif tonumber(t[1]) or tonumber(t[2]) then
doPlayerSendCancel(cid, "enter!autoloot add,name or !autoloot remove,name") return true
elseif isInArray({"add","remove"}, tostring(t[1])) then
local func,check = tostring(t[1]) == "add" and addItemTable or removeItemTable, tostring(t[1]) == "add" and true or false
local item = getItemIdByName(tostring(t[2]), false) 
if not item then
doPlayerSendCancel(cid, "This item does not exist.") return true
elseif check == true and isInArray(info.BlockItemsList, item) then
doPlayerSendCancel(cid, "You can not add this item in the list!") return true
elseif isInTable(cid, item) == check then
doPlayerSendCancel(cid, "This Item "..(check == true and "already" or "is not").." in your list.") return true
end
func(cid, item)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,check == true and "you added the item "..t[2].." in the list" or "you removed the item "..t[2].." from the list") return true
end
return true]]></talkaction>
</mod>

Version 9.6+: http://pastebin.com/gxr52zp8

Commads:


Configuration


OBS:
If your server, you need to relog to update the list, add this function after:
Code:
func(cid, item) -- after this line
doPlayerSave(cid) -- add this function
[/I][/I][/I][/I]


hi, and very nice script.. but hoe and where do i install this?

thanks a lot
 
[1:10:27.952] [Error - CreatureScript Interface]
[1:10:27.952] In a timer event called from:
[1:10:27.952] domodlib('Loot_func')
[1:10:27.952] function onDeath(cid, corpse, deathList)
[1:10:27.952] local killer,pos = deathList[1],getCreaturePosition(cid)
[1:10:27.952] addEvent(corpseRetireItems,1,killer,pos)
[1:10:27.952] return true
[1:10:27.952] end:eek:nDeath
[1:10:27.952] Description:
[1:10:27.952] (luaGetContainerSize) Container not found

[1:10:27.952] [Error - CreatureScript Interface]
[1:10:27.952] In a timer event called from:
[1:10:27.952] domodlib('Loot_func')
[1:10:27.952] function onDeath(cid, corpse, deathList)
[1:10:27.952] local killer,pos = deathList[1],getCreaturePosition(cid)
[1:10:27.952] addEvent(corpseRetireItems,1,killer,pos)
[1:10:27.952] return true
[1:10:27.952] end:eek:nDeath
[1:10:27.952] Description:
[1:10:27.952] [string "info = {..."]:153: bad argument #1 to 'pairs' (table expected, got boolean)
[1:10:27.952] stack traceback:
[1:10:27.952] [C]: in function 'pairs'
[1:10:27.952] [string "info = {..."]:153: in function <[string "info = {..."]:142>


What is Wrong?
 
Works fine for Cryingdamson 036, tho... Wont show the list anymore after adding the first item to it.


[06/03/2014 18:44:09] [Error - TalkAction Interface]
[06/03/2014 18:44:09] buffer
[06/03/2014 18:44:09] Description:
[06/03/2014 18:44:09] data/lib/050-function.lua:222: attempt to index a boolean value
 
Works for me using tfs 0.4
Thanks!

Edit: So.. after some testing, it doesn't seem to check in bags. Can that be added?
 
Last edited:
I'm having the same issue as Oneda. It worked at first without any issue at all, but now it keeps giving the message Oneda posted and nothing works... I thought it was a great script before that though
 
Works fine for Cryingdamson 036, tho... Wont show the list anymore after adding the first item to it.


[06/03/2014 18:44:09] [Error - TalkAction Interface]
[06/03/2014 18:44:09] buffer
[06/03/2014 18:44:09] Description:
[06/03/2014 18:44:09] data/lib/050-function.lua:222: attempt to index a boolean value
a friend has same problem....any fix?
 
9/4/2015 11:25:24] [Error - TalkAction Interface]
[9/4/2015 11:25:24] local cid = 268441224
[9/4/2015 11:25:24] local words = "/autoloot"
[9/4/2015 11:25:24] local param = "add,gold coin"
[9/4/2015 11:25:24] local channel = 65534
[9/4/2015 11:25:24] domodlib('Loot_func')
[9/4/2015 11:25:24] local t = string.explode(string.lower(param), ",")
[9/4/2015 11:25:24] if info_OnlyPremium == true and not isPremium(cid) then
[9/4/2015 11:25:24] doPlayerSendCancel(cid, "you must be a premium account.") return true
[9/4/2015 11:25:24] elseif not t[1] then
[9/4/2015 11:25:24] ShowItemsTabble(cid) return true
[9/4/2015 11:25:24] elseif tonumber(t[1]) or tonumber(t[2]) then
[9/4/2015 11:25:24] doPlayerSendCancel(cid, "enter!autoloot add,name or !autoloot remove,name") return true
[9/4/2015 11:25:24] elseif isInArray({"add","remove"}, tostring(t[1])) then
[9/4/2015 11:25:24] local func,check = tostring(t[1]) == "add" and addItemTable or removeItemTable, tostring(t[1]) == "add" and true or false
[9/4/2015 11:25:24] local item = getItemIdByName(tostring(t[2]), false)
[9/4/2015 11:25:24] if not item then
[9/4/2015 11:25:24] doPlayerSendCancel(cid, "This item does not exist.") return true
[9/4/2015 11:25:24] elseif check == true and isInArray(info.BlockItemsList, item) then
[9/4/2015 11:25:24] doPlayerSendCancel(cid, "You can not add this item in the list!") return true
[9/4/2015 11:25:24] elseif isInTable(cid, item) == check then
[9/4/2015 11:25:24] doPlayerSendCancel(cid, "This Item "..(check == true and "already" or "is not").." in your list.") return true
[9/4/2015 11:25:24] end
[9/4/2015 11:25:24] func(cid, item)
[9/4/2015 11:25:24] doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,check == true and "you added the item "..t[2].." in the list" or "you removed the item "..t[2].." from the list") return true
[9/4/2015 11:25:24] end
[9/4/2015 11:25:24] return true
[9/4/2015 11:25:24] Description:
[9/4/2015 11:25:24] (luaGetItemIdByName) Item not found
 
yO I have a problem with added items.
/autoloot add,red jacket

and I get information:
"This item does not exist."

why??

Plx help me.
 
i have a vip (premium) and a Ultra vip, so how do i do that only ultra vip players may use this system? >.<
 
Back
Top