<?xml version="1.0" encoding="ISO-8859-1"?>
<mod name="Perfect Auto Loot" version="2.0" author="Vodkart" contact="none.com" enabled="no">
<config name="Loot_func"><![CDATA[
info = {
directory = "data/logs/autoloot",
Warn_Bp_Slots = 5,
Talkaction_delay = 5,
BlockMonsters = {},
BlockItemsList = {},
Money_ids = {2148, 2152, 2160},
Max_Slots = {free = 3, premium = 5},
Storages = {988801, 988802, 988803, 988804, 988805, 988806, 988807}
}
Color_Loot = {
[0] = {MESSAGE_STATUS_CONSOLE_ORANGE, "orange"},
[1] = {MESSAGE_STATUS_CONSOLE_BLUE, "blue"},
[2] = {MESSAGE_INFO_DESCR, "green"},
[3] = {MESSAGE_STATUS_CONSOLE_RED, "red"},
[4] = {MESSAGE_STATUS_DEFAULT, "white"}
}
function getPlayerColorLootMessage(cid)
return getPlayerStorageValue(cid, info.Storages[5]) <= 0 and 0 or getPlayerStorageValue(cid, info.Storages[5])
end
function isInTable(cid, item)
for _,i in pairs(getItensFromAutoloot(cid)) do
if tonumber(i) == tonumber(item) then
return true
end
end
return false
end
function doremoveItemFromAutoloot(cid, itemid)
local file, fileContent = io.open(info.directory.."/"..getCreatureName(cid)..".txt", 'r'),{}
for line in file:lines() do
if line ~= "" and tonumber(line) ~= tonumber(itemid) then
fileContent[#fileContent + 1] = line
end
end
io.close(file)
file = io.open(info.directory.."/"..getCreatureName(cid)..".txt", 'w')
for index, value in ipairs(fileContent) do
file:write(value..'\n')
end
io.close(file)
end
function doAddItemFromAutoloot(cid, itemid)
if not existsAutoloot(cid) then
doCreateLootUserName(cid, itemid) return true
end
local file = io.open(info.directory.."/"..getCreatureName(cid)..".txt", "a+")
file:write('\n'..itemid)
file:close()
end
function existsAutoloot(cid)
local f = io.open(info.directory.."/"..getCreatureName(cid)..".txt", "rb")
if f then f:close() end
return f ~= nil
end
function doCreateLootUserName(cid, itemid)
newFile = io.open(info.directory.."/"..getCreatureName(cid)..".txt", "w+" )
newFile:write(itemid)
newFile:close()
end
function getItensFromAutoloot(cid)
if not existsAutoloot(cid) then return {} end
lines = {}
for line in io.lines(info.directory.."/"..getCreatureName(cid)..".txt") do
if line ~= "" then
lines[#lines + 1] = tonumber(line)
end
end
return lines
end
function doCleanAutoloot(cid)
return os.remove(info.directory.."/"..getCreatureName(cid)..".txt")
end
function ShowItemsTabble(cid)
local auto_list = getItensFromAutoloot(cid)
local n,str = 0,"[+] Auto Loot Commands [+]\n\n!autoloot item name --> to add or remove item from list.\n!autoloot money --> to collect gold automatically.\n!autoloot clear --> to clear the list.\n!autoloot run --> to enable or disable the auto loot system.\n!autoloot message --> to enable or disable message from collecting items.\n!autoloot color --> to change color message from collecting items.\n!autoloot warn --> to enable or disable message warning of "..info.Warn_Bp_Slots.." or less slots in the backpack.\n!autoloot deposit --> to enable or disable automatic money deposit at the bank.\n\n[+] Auto Loot Info [+]\n\nSystem: "..(getPlayerStorageValue(cid, info.Storages[1]) <= 0 and "activated" or "disabled")..".\nGold collecting: "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "activated" or "disabled")..".\nMessage: "..(getPlayerStorageValue(cid, info.Storages[6]) <= 0 and "activated" or "disabled")..".\nColor message: "..Color_Loot[getPlayerColorLootMessage(cid)][2]..".\nWarn backpack: "..(getPlayerStorageValue(cid, info.Storages[3]) <= 0 and "activated" or "disabled")..".\nAutomatic gold deposit: "..(getPlayerStorageValue(cid, info.Storages[4]) > 0 and "activated" or "disabled")..".\nTotal bank balance: ["..getPlayerBalance(cid).."]\nMaximum slots: ["..#auto_list.."/"..(isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free).."]\n\n[+] Auto Loot Slots [+]\n\n"
if #auto_list > 0 then
for i = 1, #auto_list do
n = n + 1
str = str.."Slot "..n.." - "..getItemNameById(auto_list[i]).."\n"
end
end
return doPlayerPopupFYI(cid, str)
end
function getContainerItems(container, array, haveCap)
array = array or {}
haveCap = haveCap or false
if not isContainer(container.uid) or getContainerSize(container.uid) == 0 then
array[#array +1] = container
else
local size = getContainerSize(container.uid)
haveCap = (getContainerCap(container.uid) -size) > 0
for slot = 0, (size -1) do
local item = getContainerItem(container.uid, slot)
if item.itemid > 1 then
getContainerItems(item, array, haveCap)
end
end
end
return #array >= 1 and array, haveCap
end
function getContainerItemsById(container, itemid)
local founds = {}
local items = not container.uid and container or getContainerItems(container)
for index, item in pairs(items) do
if item.itemid == itemid then
founds[#founds +1] = item
end
end
return #founds >= 1 and founds
end
function AutomaticDeposit(cid, item, n)
if isInArray(info.Money_ids, item) and getPlayerStorageValue(cid, info.Storages[4]) > 0 then
local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n)
doPlayerDepositMoney(cid, deposit)
end
return true
end
function getAllContainerFree(cid) -- by vodka
local containers,soma = {},0
for i = CONST_SLOT_FIRST, CONST_SLOT_LAST do
local sitem = getPlayerSlotItem(cid, i)
if sitem.uid > 0 then
if isContainer(sitem.uid) then
table.insert(containers, sitem.uid)
soma = soma + getContainerSlotsFree(sitem.uid)
end
end
end
while #containers > 0 do
for k = (getContainerSize(containers[1]) - 1), 0, -1 do
local tmp = getContainerItem(containers[1], k)
if isContainer(tmp.uid) then
table.insert(containers, tmp.uid)
soma = soma + getContainerSlotsFree(tmp.uid)
end
end
table.remove(containers, 1)
end
return soma
end
function getContainerSlotsFree(container) -- by vodka
return getContainerCap(container)-getContainerSize(container)
end
function doPlayerAddItemStackable(cid, itemid, count)
local container = getPlayerSlotItem(cid, CONST_SLOT_BACKPACK)
if container.itemid > 1 then
local items = getContainerItemsById(container, itemid)
if not items then
return doPlayerAddItem(cid, itemid, count)
else
local piles = #items
for index, item in pairs(items) do
if item.type < 100 then
local sum = item.type + count
local result = doTransformItem(item.uid, itemid, sum)
if sum <= 100 then
return result
else
return doPlayerAddItem(cid, itemid, sum - 100)
end
else
piles = piles - 1
if piles == 0 then
return doPlayerAddItem(cid, itemid, count)
end
end
end
end
end
return false
end
function corpseRetireItems(cid, pos)
local check, slots = false, 0
for i = 0, 255 do
pos.stackpos = i
if getThingFromPos(pos).uid > 0 and isContainer(getThingFromPos(pos).uid) then
corpse = getThingFromPos(pos)
check = true
break
end
end
if check == true then
local str, id_list = "", getItensFromAutoloot(cid)
for _, item in pairs(getContainerItems(corpse)) do
local id = item.itemid
if #id_list > 0 and isInArray(id_list, id) or getPlayerStorageValue(cid, info.Storages[2]) > 0 and isInArray(info.Money_ids, id) then
local amount = isItemStackable(id) and item.type or 1
local total_cap = getItemWeightById(id, amount)
slots = getAllContainerFree(cid)
if slots > 0 and getPlayerFreeCap(cid) >= total_cap then
str = str.." " .. getItemInfoLoot(id, amount)
if isItemStackable(id) then
doPlayerAddItemStackable(cid, id, amount)
AutomaticDeposit(cid, id, amount)
else
doPlayerAddItem(cid, id)
end
doRemoveItem(item.uid)
end
end
end
if str ~= "" and getPlayerStorageValue(cid, info.Storages[6]) <= 0 then
doPlayerSendTextMessage(cid, Color_Loot[getPlayerColorLootMessage(cid)][1],"[Auto Loot]: collected"..string.sub(str, 1, -2)..".")
end
if getPlayerStorageValue(cid, info.Storages[3]) <= 0 and slots > 0 and slots <= info.Warn_Bp_Slots then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[Auto Loot]: you only have "..slots.." slots free in your backpack.")
end
end
end
function ExistItemByName(name) -- by vodka
local items = io.open("data/items/items.xml", "r"):read("*all")
local get = items:lower():match('name="' .. name:lower() ..'"')
if get == nil or get == "" then
return false
end
return true
end
function getItemInfoLoot(id, amount)
local info = getItemInfo(id)
return isItemStackable(id) and amount.." "..(amount > 1 and info.plural or info.name).."," or info.article.." " .. info.name ..","
end
]]></config>
<event type="login" name="LootLogin" event="script"><![CDATA[
domodlib('Loot_func')
function onLogin(cid)
registerCreatureEvent(cid, "LootEventKIll")
if isPremium(cid) and getPlayerStorageValue(cid, 853608) <= 0 then
setPlayerStorageValue(cid, 853608, 1)
elseif getPlayerStorageValue(cid, 853608) > 0 and not isPremium(cid) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[Auto Loot]: your premium is over, start a new list.")
setPlayerStorageValue(cid, 853608, -1)
doCleanAutoloot(cid)
end
return true
end]]></event>
<event type="kill" name="LootEventKIll" event="script"><![CDATA[
domodlib('Loot_func')
function onKill(cid, target, lastHit)
if isPlayer(cid) and getPlayerStorageValue(cid, info.Storages[1]) <= 0 and isMonster(target) and not isInArray(info.BlockMonsters, getCreatureName(target):lower()) then
addEvent(corpseRetireItems, 0, cid ,getThingPos(target))
end
return true
end]]></event>
<talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[
domodlib('Loot_func')
local param, slots = param:lower(), isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free
if not param or param == "" then
ShowItemsTabble(cid) return true
elseif tonumber(param) then
doPlayerSendCancel(cid, "[Auto Loot]: !autoloot item name [+] !autoloot clean [+] !autoloot money [+] !autoloot on/off") return true
elseif isInArray({"clean", "clear"}, param) then
if existsAutoloot(cid) then doCleanAutoloot(cid) end
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: your list has been cleaned.") return true
elseif isInArray({"start","stop","on","off", "run"}, param) then
setPlayerStorageValue(cid, info.Storages[1], getPlayerStorageValue(cid, info.Storages[1]) <= 0 and 1 or 0)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: system "..(getPlayerStorageValue(cid, info.Storages[1]) > 0 and "disabled" or "activated")..".") return true
elseif isInArray({"warn"}, param) then
setPlayerStorageValue(cid, info.Storages[3], getPlayerStorageValue(cid, info.Storages[3]) <= 0 and 1 or 0)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: backpack warn "..(getPlayerStorageValue(cid, info.Storages[3]) > 0 and "disabled" or "activated")..".") return true
elseif isInArray({"message", "msg"}, param) then
setPlayerStorageValue(cid, info.Storages[6], getPlayerStorageValue(cid, info.Storages[6]) <= 0 and 1 or 0)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: message "..(getPlayerStorageValue(cid, info.Storages[6]) > 0 and "disabled" or "activated")..".") return true
elseif isInArray({"color"}, param) then
setPlayerStorageValue(cid, info.Storages[5], getPlayerColorLootMessage(cid) == #Color_Loot and 0 or getPlayerColorLootMessage(cid)+1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: message color changed to "..Color_Loot[getPlayerColorLootMessage(cid)][2]..".") return true
elseif isInArray({"money","gold","gps"}, param) then
setPlayerStorageValue(cid, info.Storages[2], getPlayerStorageValue(cid, info.Storages[2]) <= 0 and 1 or 0)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: gold colleting "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "activated" or "disabled")..".") return true
elseif isInArray({"bank","deposit","autodeposit"}, param) then
setPlayerStorageValue(cid, info.Storages[4], getPlayerStorageValue(cid, info.Storages[4]) <= 0 and 1 or 0)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"[Auto Loot]: automatic deposit to bank "..(getPlayerStorageValue(cid, info.Storages[4]) > 0 and "activated" or "disabled")..".") return true
end
local item = ExistItemByName(tostring(param))
if not item then
doPlayerSendCancel(cid, "[Auto Loot]: this item does not exist.") return true
end
local item = getItemIdByName(tostring(param))
local var = isInTable(cid, item)
if isInArray(info.Money_ids, item) then
doPlayerSendCancel(cid, "[Auto Loot]: enter !autoloot money to add money in your list.") return true
elseif isInArray(info.BlockItemsList, item) then
doPlayerSendCancel(cid, "[Auto Loot]: You can not add this item in the list.") return true
elseif not var and #getItensFromAutoloot(cid) >= slots then
doPlayerSendCancel(cid, "[Auto Loot]: you have only "..slots.." max slots to add items to auto loot.") return true
elseif getPlayerStorageValue(cid, info.Storages[7]) - os.time() > 0 then
doPlayerSendCancel(cid, "[Auto Loot]: wait a second to use this command again") return true
end
if not var then
doAddItemFromAutoloot(cid, item)
else
doremoveItemFromAutoloot(cid, item)
end
setPlayerStorageValue(cid, info.Storages[7], os.time()+info.Talkaction_delay)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, not var and "[Auto Loot]: you added the item "..param.." in the list." or "[Auto Loot]: you removed the item "..param.." from the list, please wait 5 seconds to save the directory.")
return true]]></talkaction>
</mod>