Post by Mr Robot on Oct 12, 2017 3:35:53 GMT
is it possible to do this script for elfbot if so how?
Edit: (by Darth Maul) Added spoiler tags, cause the script you posted is too long and makes my eyes bleed.
cID_cName = {
[1] = "3478",
[2] = "Abyssador",
[3] = "Achad",
[4] = "Acid Blob",
[5] = "Acolyte of Darkness",
[6] = "Acolyte of the Cult",
[7] = "Adept of the Cult",
[8] = "Adventurer",
[9] = "Amazon",
[10] = "Ancient Scarab",
}
cID_iID = {
[1] = {3031, 3059, 3265, 3282, 3285, 3409},
[2] = {16155, 16160, 16161, 16162, 16163, 16164, 16175, 16206},
[3] = {},
[4] = {9054},
[5] = {9615},
[6] = {2828, 3031, 3032, 3052, 3065, 3085, 3282, 5810, 6087, 9639, 11455, 11492, 11652},
[7] = {2828, 3030, 3031, 3053, 3054, 3067, 3311, 3566, 5810, 6087, 7424, 7426, 9639, 11455, 11492, 11652},
[8] = {},
[9] = {2920, 3008, 3030, 3031, 3114, 3267, 3273, 3602, 11443, 11444},
[10] = {236, 830, 3018, 3025, 3031, 3032, 3033, 3042, 3046, 3328, 3357, 3440, 9631},
}
function itemFix(item)
return 0
end
if (type(getItemCost) == "nil") then
print("XenoBot: You are using an old version that does not support Item.GetCost(). Therefore the function was replaced.")
Item.GetCost = itemFix
end
if (type(getItemValue) == "nil") then
print("XenoBot: You are using an old version that does not support Item.GetValue(). Therefore the function was replaced.")
Item.GetValue = itemFix
end
--- Get monsterid from name.
-- Returns the monsterid by providing it's name
-- @class Creature
-- @param creature the monster's name
-- @return number the monsterid
function Creature.GetMonsterID(creature)
for id, name in pairs(cID_cName) do
if (name:lower() == creature:lower()) then
return id
end
end
return 0
end
Settings = {}
--- Create deposit list
-- Prints a list for stackable and non-stackable items used for the Self.DepositItems() function
-- @class Settings
-- @param minvalue the minimum value of an item to be added to the list
-- @param stackbp the backpack index where stackable items should go to
-- @param nonstackbp the backpack index where non-stackable items should go to
-- @param creatures a table or single creature which you want to get the loot of
-- @return nothing
function Settings.CreateDepositList(minvalue, stackbp, nonstackbp, creatures, ch)
minvalue = minvalue or -1
stackbp = stackbp or 0
nonstackbp = nonstackbp or 0
local stackables = {}
local nonstackables = {}
if (type(creatures) == "table") then
for _, name in ipairs(creatures) do
local creatureID = Creature.GetMonsterID(name)
if (creatureID ~= 0) then
for _, item in ipairs(cID_iID[creatureID]) do
if (Item.GetCost(item) >= minvalue or Item.GetValue(item) >= minvalue) then
if (Item.isStackable(item) and not table.contains(stackables, item)) then
stackables[#stackables+1] = "{" .. item .. ", " .. stackbp .. "}"
elseif (not Item.isStackable(item) and not table.contains(nonstackables, item)) then
nonstackables[#nonstackables+1] = "{" .. item .. ", " .. nonstackbp .. "}"
end
end
end
else
ch:SendOrangeMessage("XenoBot", "Could not find creature with name '" .. name .. "'.")
end
end
else
local creatureID = Creature.GetMonsterID(creatures)
if (creatureID ~= 0) then
for _, item in ipairs(cID_iID[creatureID]) do
if (Item.GetCost(item) >= minvalue or Item.GetValue(item) >= minvalue) then
if (Item.isStackable(item) and not table.contains(stackables, item)) then
stackables[#stackables+1] = "{" .. item .. ", " .. stackbp .. "}"
elseif (not Item.isStackable(item) and not table.contains(nonstackables, item)) then
nonstackables[#nonstackables+1] = "{" .. item .. ", " .. nonstackbp .. "}"
end
end
end
end
end
local depositlist = {}
for i = 1, #nonstackables do
depositlist[#depositlist+1] = nonstackables[i]
end
for i = 1, #stackables do
depositlist[#depositlist+1] = stackables[i]
end
ch:SendOrangeMessage("XenoBot", "Self.DepositItems(" .. table.concat(depositlist, ", ") .. ")")
end
--- Create loot list
-- Creates a lootlist and additionally a file in your Settings folder named XenoBot - Lootlist.xbst
-- @class Settings
-- @param minvalue the minimum value of an item to be added to the list
-- @param stackbp the backpack number where stackable items should go to
-- @param nonstackbp the backpack number where non-stackable items should go to
-- @param creatures a table or single creature which you want to get the loot of
-- @return boolean true or false
function Settings.CreateLootList(minvalue, stackbp, nonstackbp, creatures, ch)
minvalue = minvalue or -1
stackbp = stackbp or 0
nonstackbp = nonstackbp or 0
local function tSort(t) table.sort(t) return pairs(t) end
local function iName(i) local n = Item.GetName(i) if (n ~= "unknown") then return n end return "?" end
local function wFile(n, t) local f = io.open("..\\Settings\\"..n..".xbst", "a") f:write(t.."\n") f:close() end
local fname = "XenoBot - Lootlist"
local lootlist = {}
local lootvalue = {}
if (type(creatures) == "table") then
header = "<!-- Creatures: "..table.concat(creatures, ", ").." -->"
for _, name in ipairs(creatures) do
local creatureID = Creature.GetMonsterID(name)
if (creatureID ~= 0) then
for _, item in ipairs(cID_iID[creatureID]) do
if (not table.contains(lootlist, item) and (Item.GetCost(item) >= minvalue or Item.GetValue(item) >= minvalue)) then
if (Item.GetValue(item) > 0) then
lootvalue[#lootvalue+1] = Item.GetValue(item)
else
lootvalue[#lootvalue+1] = 0
end
lootlist[#lootlist+1] = item
end
end
else
ch:SendOrangeMessage("XenoBot", "Could not find creature with name '" .. name .. "'.")
end
end
else
header = "<!-- Creatures: "..creatures.." -->"
local creatureID = Creature.GetMonsterID(creatures)
if (creatureID ~= 0) then
for _, item in ipairs(cID_iID[creatureID]) do
if (not table.contains(lootlist, item) and (Item.GetCost(item) >= minvalue or Item.GetValue(item) >= minvalue)) then
if (Item.GetValue(item) > 0) then
lootvalue[#lootvalue+1] = Item.GetValue(item)
else
lootvalue[#lootvalue+1] = 0
end
lootlist[#lootlist+1] = item
end
end
end
end
if (#lootlist > 0) then
local f = io.open("..\\Settings\\"..fname..".xbst", "w") f:close()
wFile(fname, header)
wFile(fname, "<panel name=\"Looter\">")
wFile(fname, " <control name=\"LootList\" first=\"0\" unlisted=\"0\">")
local val = {}
for k, v in tSort(lootvalue) do
if (not table.contains(val, v)) then
val[#val+1] = v
end
end
local i = #val
while (i > 0) do
for j = 1, #lootlist do
if (Item.GetValue(lootlist[j]) == val[i]) then
if (Item.isStackable(lootlist[j])) then
wFile(fname, " <item ID=\""..lootlist[j].."\" action=\"" .. stackbp-1 .. "\"/> <!-- "..iName(lootlist[j]).." -->")
else
wFile(fname, " <item ID=\""..lootlist[j].."\" action=\"" .. nonstackbp-1 .. "\"/> <!-- "..iName(lootlist[j]).." -->")
end
end
end
i = i - 1
end
wFile(fname, " </control>")
wFile(fname, "</panel>")
loadSettings(fname, "All")
ch:SendOrangeMessage("XenoBot", "Created lootlist successfully.")
return true
end
return false
end
function explode(div, str)
if (div == '') then
return false
end
local pos, arr = 0, {}
for st, sp in function() return string.find(str, div, pos, true) end do
table.insert(arr, string.sub(str, pos, st - 1))
pos = sp + 1
end
table.insert(arr, string.sub(str, pos))
for i = 1, #arr do
arr[i] = arr[i]:trim()
end
return arr
end
local lootlist = false
local depositlist = false
local loads = false
local list = false
function onSpeak(ch, cmd)
ch:SendYellowMessage(Self.Name(), cmd)
cmd = cmd:lower()
if (cmd == "loot" and not lootlist and not depositlist) then
lootlist = true
ch:SendOrangeMessage("XenoBot", "Please type 'load' if you want to load the creature list from a XenoBot Settings's Targeting list.")
ch:SendOrangeMessage("XenoBot", "Please type 'enter' if you want to enter the creature list yourself.")
elseif (cmd == "deposit" and not depositlist and not lootlist) then
depositlist = true
ch:SendOrangeMessage("XenoBot", "Please type 'load' if you want to load the creature list from a XenoBot Settings's Targeting list.")
ch:SendOrangeMessage("XenoBot", "Please type 'enter' if you want to enter the creature list yourself.")
elseif (cmd == "load" and (lootlist or depositlist) and not loads and not list) then
loads = true
ch:SendOrangeMessage("XenoBot", "Please type the name of the Settings file.")
elseif (cmd == "enter" and (lootlist or depositlist) and not list and not loads) then
list = true
ch:SendOrangeMessage("XenoBot", "Please type every creature name separated by a comma.")
else
if (cmd == "restart") then
lootlist = false
depositlist = false
loads = false
list = false
ch:SendOrangeMessage("XenoBot", "Please type 'loot' to create your own list for XenoBot's Looter.")
ch:SendOrangeMessage("XenoBot", "Please type 'deposit' to create your own list for XenoBot's Self.DepositItems() function.")
elseif (cmd:find(".xbst") and loads and (lootlist or depositlist)) then
if (lootlist) then
xpcall(
function()
local file = io.open("..\\Settings\\".. cmd, "r")
local data = file:read("*all")
file:close()
creatureTable = {}
for k, v in string.gmatch(data, '<item type="(.-)"') do
creatureTable[#creatureTable+1] = k
end
Settings.CreateLootList(-1, 1, 2, creatureTable, ch)
end,
function(err)
ch:SendOrangeMessage("XenoBot", "The file could not be found. Please check if you have spelled the name correctly.")
end
)
elseif (depositlist) then
xpcall(
function()
local file = io.open("..\\Settings\\".. cmd, "r")
local data = file:read("*all")
file:close()
creatureTable = {}
for k, v in string.gmatch(data, '<item type="(.-)"') do
creatureTable[#creatureTable+1] = k
end
Settings.CreateDepositList(-1, 1, 2, creatureTable, ch)
end,
function(err)
ch:SendOrangeMessage("XenoBot", "The file could not be found. Please check if you have spelled the name correctly.")
end
)
end
elseif (cmd:find(",") and list and (lootlist or depositlist)) then
if (lootlist) then
xpcall(
function()
creatureTable = explode(",", cmd)
Settings.CreateLootList(-1, 1, 2, creatureTable, ch)
end,
function(err)
ch:SendOrangeMessage("XenoBot", "Your list could not be recognised. Please check if you have separated every name with a comma")
end
)
elseif (depositlist) then
xpcall(
function()
creatureTable = explode(",", cmd)
Settings.CreateDepositList(-1, 1, 2, creatureTable, ch)
end,
function(err)
ch:SendOrangeMessage("XenoBot", "Your list could not be recognised. Please check if you have separated every name with a comma")
end
)
end
elseif (list and (lootlist or depositlist)) then
if (lootlist) then
xpcall(
function()
Settings.CreateLootList(-1, 1, 2, cmd, ch)
end,
function(err)
ch:SendOrangeMessage("XenoBot", "Your list could not be recognised. Please check if you have separated every name with a comma")
end
)
elseif (depositlist) then
xpcall(
function()
Settings.CreateDepositList(-1, 1, 2, cmd, ch)
end,
function(err)
ch:SendOrangeMessage("XenoBot", "Your list could not be recognised. Please check if you have separated every name with a comma")
end
)
end
else
ch:SendOrangeMessage("XenoBot", "Your command could not be recognized. Please read the instructions carefully.")
end
end
end
function onClose(ch)
print(ch:Name() .. " has been closed. \nPlease re-execute to continue.")
end
local ch = Channel.New("Loot Functions", onSpeak, onClose)
ch:SendOrangeMessage("XenoBot", "Welcome to the Loot / Deposit List Creator!")
ch:SendOrangeMessage("XenoBot", "Please type 'loot' to create your own list for XenoBot's Looter.")
ch:SendOrangeMessage("XenoBot", "Please type 'deposit' to create your own list for XenoBot's Self.DepositItems() function.")
ch:SendOrangeMessage("XenoBot", "Type 'restart' to go back to the start.")
Edit: (by Darth Maul) Added spoiler tags, cause the script you posted is too long and makes my eyes bleed.