mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-04-29 18:59:20 +02:00
Updated to OTCv8 3.0 rev 91
This commit is contained in:
parent
e2e56f82ed
commit
de2ac3e972
@ -475,9 +475,9 @@ function initCallbacks()
|
|||||||
onOpenChannel = botOpenChannel,
|
onOpenChannel = botOpenChannel,
|
||||||
onCloseChannel = botCloseChannel,
|
onCloseChannel = botCloseChannel,
|
||||||
onChannelEvent = botChannelEvent,
|
onChannelEvent = botChannelEvent,
|
||||||
onImbuementWindow = botOnImbuementWindow,
|
onImbuementWindow = botImbuementWindow,
|
||||||
onModalDialog = botOnModalDialog,
|
onModalDialog = botModalDialog,
|
||||||
onAttackingCreatureChange = botOnAttackingCreatureChange
|
onAttackingCreatureChange = botAttackingCreatureChange,
|
||||||
})
|
})
|
||||||
|
|
||||||
connect(Tile, {
|
connect(Tile, {
|
||||||
@ -499,12 +499,15 @@ function initCallbacks()
|
|||||||
onHealthPercentChange = botCraetureHealthPercentChange,
|
onHealthPercentChange = botCraetureHealthPercentChange,
|
||||||
onTurn = botCreatureTurn,
|
onTurn = botCreatureTurn,
|
||||||
onWalk = botCreatureWalk,
|
onWalk = botCreatureWalk,
|
||||||
|
onManaChange = botManaChange,
|
||||||
|
onStatesChange = botStatesChange
|
||||||
})
|
})
|
||||||
|
|
||||||
connect(Container, {
|
connect(Container, {
|
||||||
onOpen = botContainerOpen,
|
onOpen = botContainerOpen,
|
||||||
onClose = botContainerClose,
|
onClose = botContainerClose,
|
||||||
onUpdateItem = botContainerUpdateItem
|
onUpdateItem = botContainerUpdateItem,
|
||||||
|
onAddItem = botContainerAddItem,
|
||||||
})
|
})
|
||||||
|
|
||||||
connect(g_map, {
|
connect(g_map, {
|
||||||
@ -531,9 +534,9 @@ function terminateCallbacks()
|
|||||||
onOpenChannel = botOpenChannel,
|
onOpenChannel = botOpenChannel,
|
||||||
onCloseChannel = botCloseChannel,
|
onCloseChannel = botCloseChannel,
|
||||||
onChannelEvent = botChannelEvent,
|
onChannelEvent = botChannelEvent,
|
||||||
onImbuementWindow = botOnImbuementWindow,
|
onImbuementWindow = botImbuementWindow,
|
||||||
onModalDialog = botOnModalDialog,
|
onModalDialog = botModalDialog,
|
||||||
onAttackingCreatureChange = botOnAttackingCreatureChange
|
onAttackingCreatureChange = botAttackingCreatureChange
|
||||||
})
|
})
|
||||||
|
|
||||||
disconnect(Tile, {
|
disconnect(Tile, {
|
||||||
@ -555,12 +558,15 @@ function terminateCallbacks()
|
|||||||
onHealthPercentChange = botCraetureHealthPercentChange,
|
onHealthPercentChange = botCraetureHealthPercentChange,
|
||||||
onTurn = botCreatureTurn,
|
onTurn = botCreatureTurn,
|
||||||
onWalk = botCreatureWalk,
|
onWalk = botCreatureWalk,
|
||||||
|
onManaChange = botManaChange,
|
||||||
|
onStatesChange = botStatesChange
|
||||||
})
|
})
|
||||||
|
|
||||||
disconnect(Container, {
|
disconnect(Container, {
|
||||||
onOpen = botContainerOpen,
|
onOpen = botContainerOpen,
|
||||||
onClose = botContainerClose,
|
onClose = botContainerClose,
|
||||||
onUpdateItem = botContainerUpdateItem
|
onUpdateItem = botContainerUpdateItem,
|
||||||
|
onAddItem = botContainerAddItem,
|
||||||
})
|
})
|
||||||
|
|
||||||
disconnect(g_map, {
|
disconnect(g_map, {
|
||||||
@ -660,9 +666,9 @@ function botContainerClose(container)
|
|||||||
safeBotCall(function() botExecutor.callbacks.onContainerClose(container) end)
|
safeBotCall(function() botExecutor.callbacks.onContainerClose(container) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function botContainerUpdateItem(container, slot, item)
|
function botContainerUpdateItem(container, slot, item, oldItem)
|
||||||
if botExecutor == nil then return false end
|
if botExecutor == nil then return false end
|
||||||
safeBotCall(function() botExecutor.callbacks.onContainerUpdateItem(container, slot, item) end)
|
safeBotCall(function() botExecutor.callbacks.onContainerUpdateItem(container, slot, item, oldItem) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function botOnMissle(missle)
|
function botOnMissle(missle)
|
||||||
@ -710,17 +716,32 @@ function botCreatureWalk(creature, oldPos, newPos)
|
|||||||
safeBotCall(function() botExecutor.callbacks.onWalk(creature, oldPos, newPos) end)
|
safeBotCall(function() botExecutor.callbacks.onWalk(creature, oldPos, newPos) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function botOnImbuementWindow(itemId, slots, activeSlots, imbuements, needItems)
|
function botImbuementWindow(itemId, slots, activeSlots, imbuements, needItems)
|
||||||
if botExecutor == nil then return false end
|
if botExecutor == nil then return false end
|
||||||
safeBotCall(function() botExecutor.callbacks.onImbuementWindow(itemId, slots, activeSlots, imbuements, needItems) end)
|
safeBotCall(function() botExecutor.callbacks.onImbuementWindow(itemId, slots, activeSlots, imbuements, needItems) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function botOnModalDialog(id, title, message, buttons, enterButton, escapeButton, choices, priority)
|
function botModalDialog(id, title, message, buttons, enterButton, escapeButton, choices, priority)
|
||||||
if botExecutor == nil then return false end
|
if botExecutor == nil then return false end
|
||||||
safeBotCall(function() botExecutor.callbacks.onModalDialog(id, title, message, buttons, enterButton, escapeButton, choices, priority) end)
|
safeBotCall(function() botExecutor.callbacks.onModalDialog(id, title, message, buttons, enterButton, escapeButton, choices, priority) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function botOnAttackingCreatureChange(creature, oldCreature)
|
function botAttackingCreatureChange(creature, oldCreature)
|
||||||
if botExecutor == nil then return false end
|
if botExecutor == nil then return false end
|
||||||
safeBotCall(function() botExecutor.callbacks.onAttackingCreatureChange(creature,oldCreature) end)
|
safeBotCall(function() botExecutor.callbacks.onAttackingCreatureChange(creature,oldCreature) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function botManaChange(player, mana, maxMana, oldMana, oldMaxMana)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onManaChange(player, mana, maxMana, oldMana, oldMaxMana) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function botStatesChange(states, oldStates)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onStatesChange(states, oldStates) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function botContainerAddItem(container, slot, item)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onAddItem(container, slot, item) end)
|
||||||
end
|
end
|
@ -1,57 +0,0 @@
|
|||||||
-- load all otui files, order doesn't matter
|
|
||||||
local configName = modules.game_bot.contentsPanel.config:getCurrentOption().text
|
|
||||||
|
|
||||||
local configFiles = g_resources.listDirectoryFiles("/bot/" .. configName .."/vBot/", true, false)
|
|
||||||
for i, file in ipairs(configFiles) do
|
|
||||||
local ext = file:split(".")
|
|
||||||
if ext[#ext]:lower() == "ui" or ext[#ext]:lower() == "otui" then
|
|
||||||
g_ui.importStyle(file)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function loadScript(name)
|
|
||||||
return dofile("/vBot/" .. name .. ".lua")
|
|
||||||
end
|
|
||||||
|
|
||||||
-- here you can set manually order of scripts
|
|
||||||
-- libraries should be loaded first
|
|
||||||
local luaFiles = {
|
|
||||||
"main",
|
|
||||||
"vlib",
|
|
||||||
"new_cavebot_lib",
|
|
||||||
"configs", -- do not change this and above
|
|
||||||
"extras",
|
|
||||||
"playerlist",
|
|
||||||
"BotServer",
|
|
||||||
"alarms",
|
|
||||||
"Conditions",
|
|
||||||
"pushmax",
|
|
||||||
"combo",
|
|
||||||
"HealBot",
|
|
||||||
"Sio",
|
|
||||||
"AttackBot", -- last of major modules
|
|
||||||
"ingame_editor",
|
|
||||||
"items_management",
|
|
||||||
"quiver_manager",
|
|
||||||
"tools",
|
|
||||||
"antiRs",
|
|
||||||
"cavebot",
|
|
||||||
"depot_withdraw",
|
|
||||||
"eat_food",
|
|
||||||
"equip",
|
|
||||||
"exeta",
|
|
||||||
"info",
|
|
||||||
"items",
|
|
||||||
"jewellery_equipper",
|
|
||||||
"spy_level",
|
|
||||||
"supplies"
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, file in ipairs(luaFiles) do
|
|
||||||
loadScript(file)
|
|
||||||
end
|
|
||||||
|
|
||||||
setDefaultTab("Main")
|
|
||||||
UI.Separator()
|
|
||||||
UI.Label("Private Scripts:")
|
|
||||||
UI.Separator()
|
|
@ -1,188 +0,0 @@
|
|||||||
CaveBot.Extensions.DWithdraw = {}
|
|
||||||
|
|
||||||
comparePosition = function(pPos, tPos)
|
|
||||||
return (getDistanceBetween(pPos, tPos) <= 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
local depotIDs = {3497, 3498, 3499, 3500}
|
|
||||||
local depotContainers = {22797, 22798, 22799, 22800, 22801, 22802, 22803, 22804, 22805, 22806, 22807, 22808, 22809, 22810, 22811, 22812, 22813}
|
|
||||||
storage.stopSearch = false
|
|
||||||
storage.lootContainerOpen = false
|
|
||||||
local i = 1
|
|
||||||
|
|
||||||
|
|
||||||
CaveBot.Extensions.DWithdraw.setup = function()
|
|
||||||
CaveBot.registerAction("dpwithdraw", "#002FFF", function(value, retries)
|
|
||||||
local capLimit = nil
|
|
||||||
if retries > 600 then
|
|
||||||
print("CaveBot[DepotWithdraw]: actions limit reached, proceeding")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
delay(50)
|
|
||||||
if not value or #string.split(value, ",") ~= 3 and #string.split(value, ",") ~= 4 then
|
|
||||||
warn("CaveBot[DepotWithdraw]: incorrect value!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
local indexDp = tonumber(string.split(value, ",")[1]:trim())
|
|
||||||
local destName = string.split(value, ",")[2]:trim()
|
|
||||||
local destId = tonumber(string.split(value, ",")[3]:trim())
|
|
||||||
if #string.split(value, ",") == 4 then
|
|
||||||
capLimit = tonumber(string.split(value, ",")[4]:trim())
|
|
||||||
end
|
|
||||||
if freecap() < (capLimit or 200) then
|
|
||||||
print("CaveBot[DepotWithdraw]: cap limit reached, proceeding")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
local destContainer
|
|
||||||
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if container:getName():lower() == destName:lower() then
|
|
||||||
destContainer = container
|
|
||||||
end
|
|
||||||
if string.find(container:getName():lower(), "depot box") then
|
|
||||||
if #container:getItems() == 0 then
|
|
||||||
print("CaveBot[DepotWithdraw]: all items withdrawn")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not destContainer then
|
|
||||||
print("CaveBot[DepotWithdraw]: container not found!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
if destContainer:getCapacity() == destContainer:getSize() then
|
|
||||||
for j, item in pairs(destContainer:getItems()) do
|
|
||||||
if item:getId() == destId then
|
|
||||||
g_game.open(item, destContainer)
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
print("CaveBot[DepotWithdraw]: loot containers full!")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local tileList = {}
|
|
||||||
local tPos
|
|
||||||
local depotClear = false
|
|
||||||
local depotOpen = false
|
|
||||||
local depotBoxOpen = false
|
|
||||||
for _,tile in pairs(g_map.getTiles(posz())) do
|
|
||||||
for i,thing in pairs(tile:getThings()) do
|
|
||||||
if table.find(depotIDs, thing:getId()) then
|
|
||||||
table.insert(tileList, {tileObj = tile, distance = getDistanceBetween(pos(), tile:getPosition()), depotID = thing:getId()})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
table.sort(tileList, function(a,b) return a.distance < b.distance end)
|
|
||||||
::findEmptyDP::
|
|
||||||
if tileList[i] and not storage.stopSearch then
|
|
||||||
if tileList[i].depotID == 3498 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x + 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3499 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y + 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3500 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x - 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3497 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y - 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
end
|
|
||||||
if tPos then
|
|
||||||
local dest = g_map.getTile(tPos)
|
|
||||||
if not comparePosition(pos(), dest:getPosition()) then
|
|
||||||
if not dest:getCreatures()[1] and dest:isWalkable() then
|
|
||||||
if CaveBot.walkTo(dest:getPosition(), {ignoreNonPathable=true}) then
|
|
||||||
storage.stopSearch = true
|
|
||||||
delay(100)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
i = i + 1
|
|
||||||
goto findEmptyDP
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i].tileObj and not table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) and comparePosition(pos(), tileList[i].tileObj:getPosition()) then
|
|
||||||
for j=1,table.getn(tileList[i].tileObj:getThings()),1 do
|
|
||||||
if not tileList[i].tileObj:getThings()[j]:isNotMoveable() then
|
|
||||||
delay(500)
|
|
||||||
g_game.move(tileList[i].tileObj:getThings()[j], pos(), tileList[i].tileObj:getThings()[j]:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) then
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
if depotClear then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "locker" then
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i].tileObj and depotClear and not depotOpen and not storage.lootContainerOpen then
|
|
||||||
delay(500)
|
|
||||||
g_game.use(tileList[i].tileObj:getTopUseThing())
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
i = 1
|
|
||||||
--Version Check to know what to do with the depot--
|
|
||||||
if g_game.getClientVersion() > 910 then
|
|
||||||
if depotOpen then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if findItem(3502) and not depotBoxOpen then
|
|
||||||
delay(500)
|
|
||||||
g_game.use(findItem(3502))
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if depotBoxOpen and not storage.lootContainerOpen then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
for _, item in ipairs(container:getItems()) do
|
|
||||||
if item:isContainer() and table.find({22797, 22798}, item:getId()) then
|
|
||||||
g_game.open(findItem(depotContainers[indexDp]), container)
|
|
||||||
delay(500)
|
|
||||||
for _, cont in pairs(g_game.getContainers()) do
|
|
||||||
if string.find(cont:getName():lower(), "depot box") then
|
|
||||||
storage.lootContainerOpen = true
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, container in pairs(g_game.getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "depot box") then
|
|
||||||
for j, item in ipairs(container:getItems()) do
|
|
||||||
g_game.move(item, destContainer:getSlotPosition(destContainer:getItemsCount()), item:getCount())
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
return "retry"
|
|
||||||
end)
|
|
||||||
|
|
||||||
CaveBot.Editor.registerAction("dpwithdraw", "dpwithdraw", {
|
|
||||||
value="1, shopping bag, 21411",
|
|
||||||
title="Loot Withdraw",
|
|
||||||
description="insert index, destination container name and it's ID",
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
onPlayerPositionChange(function(newPos, oldPos)
|
|
||||||
storage.lootContainerOpen = false
|
|
||||||
storage.stopSearch = false
|
|
||||||
end)
|
|
@ -1,384 +0,0 @@
|
|||||||
CaveBot.Extensions.Depositor = {}
|
|
||||||
|
|
||||||
local depotIDs = {3497, 3498, 3499, 3500}
|
|
||||||
local reset = function()
|
|
||||||
storage.stopSearch = false
|
|
||||||
storage.lootContainerOpen = false
|
|
||||||
storage.containersClosed = false
|
|
||||||
storage.containersReset = false
|
|
||||||
storage.currentStack = 0
|
|
||||||
storage.currentNonStack = nonStackMin
|
|
||||||
storage.lastTry = nil
|
|
||||||
storage.lootItemsCount = 0
|
|
||||||
storage.depositDone = false
|
|
||||||
end
|
|
||||||
local i = 1
|
|
||||||
|
|
||||||
local ifPing = function()
|
|
||||||
if ping() and ping() > 150 then
|
|
||||||
return ping()
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
CaveBot.Extensions.Depositor.setup = function()
|
|
||||||
CaveBot.registerAction("depositor", "#002FFF", function(value, retries)
|
|
||||||
if retries > 400 then
|
|
||||||
print("CaveBot[Depositor]: Depositor actions limit reached, proceeding")
|
|
||||||
reset()
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
local name = storage["_configs"]["targetbot_configs"]["selected"]
|
|
||||||
local file = configDir .. "/targetbot_configs/" .. name .. ".json"
|
|
||||||
local data = g_resources.readFileContents(file)
|
|
||||||
local lootList = Config.parse(data)['looting']['items']
|
|
||||||
local lootContainers = Config.parse(data)['looting']['containers']
|
|
||||||
local mainBp
|
|
||||||
local stackBp
|
|
||||||
local nonStackBp
|
|
||||||
|
|
||||||
local valueString = string.split(value, ",") -- if 3 then it's old tibia
|
|
||||||
|
|
||||||
-- if old tibia then setup backpacks
|
|
||||||
if #valueString == 3 then
|
|
||||||
mainBp = tonumber(valueString[1]:trim())
|
|
||||||
stackBp = tonumber(valueString[2]:trim()) -- non-stack bp count
|
|
||||||
nonStackBp = tonumber(valueString[3]:trim()) -- stack bp count
|
|
||||||
|
|
||||||
if not mainBp or not stackBp or not nonStackBp then
|
|
||||||
warn("CaveBot[Depositor]: incorrect values! should be 3x ID of containers!")
|
|
||||||
reset()
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- start with checking the containers
|
|
||||||
local lootDestination = {}
|
|
||||||
for _, container in pairs(lootContainers) do
|
|
||||||
if not table.find(lootDestination, container['id']) then
|
|
||||||
table.insert(lootDestination, container['id'])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- pretty much every container action is needed only if you want to work with containers
|
|
||||||
if (value:lower() == "yes" or #valueString == 3) and not storage.containersReset then
|
|
||||||
|
|
||||||
-- what is open and what's not
|
|
||||||
local currentContainers = {}
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if not table.find(currentContainers, container:getContainerItem():getId()) then
|
|
||||||
table.insert(currentContainers, container:getContainerItem():getId())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
delay(500 + 2*ifPing()) -- slow down this function until containers reset
|
|
||||||
if #lootDestination > 0 then
|
|
||||||
-- first closing all that are opened
|
|
||||||
if not storage.containersClosed then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if table.find(lootDestination, container:getContainerItem():getId()) then
|
|
||||||
g_game.close(container)
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
storage.containersClosed = true
|
|
||||||
end
|
|
||||||
-- now reopen them
|
|
||||||
if not storage.containersReset and storage.containersClosed then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if table.find(lootDestination, item:getId()) and not table.find(currentContainers, item:getId()) then
|
|
||||||
g_game.open(item)
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
storage.containersReset = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if storage.depositDone then
|
|
||||||
reset()
|
|
||||||
print("CaveBot[Depositor]: Deposit finished, proceeding")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
local tileList = {}
|
|
||||||
local tPos
|
|
||||||
local depotClear = false
|
|
||||||
local depotOpen = false
|
|
||||||
local depotBoxOpen = false
|
|
||||||
for _,tile in pairs(g_map.getTiles(posz())) do
|
|
||||||
for i,thing in pairs(tile:getThings()) do
|
|
||||||
if table.find(depotIDs, thing:getId()) then
|
|
||||||
table.insert(tileList, {tileObj = tile, distance = getDistanceBetween(pos(), tile:getPosition()), depotID = thing:getId()})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
table.sort(tileList, function(a,b) return a.distance < b.distance end)
|
|
||||||
::findEmptyDP::
|
|
||||||
if tileList[i] and not storage.stopSearch then
|
|
||||||
if tileList[i].depotID == 3498 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x + 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3499 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y + 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3500 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x - 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3497 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y - 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
end
|
|
||||||
if tPos then
|
|
||||||
local dest = g_map.getTile(tPos)
|
|
||||||
if not (getDistanceBetween(pos(), dest:getPosition()) <= 1) then
|
|
||||||
if not dest:getCreatures()[1] and dest:isWalkable() then
|
|
||||||
if CaveBot.walkTo(dest:getPosition(), {ignoreNonPathable=true}) then
|
|
||||||
storage.stopSearch = true
|
|
||||||
delay(100+ifPing())
|
|
||||||
end
|
|
||||||
else
|
|
||||||
i = i + 1
|
|
||||||
goto findEmptyDP
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i] and not table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) and (getDistanceBetween(pos(), tileList[i].tileObj:getPosition()) <= 1) then
|
|
||||||
for j=1,table.getn(tileList[i].tileObj:getThings()),1 do
|
|
||||||
if not tileList[i].tileObj:getThings()[j]:isNotMoveable() then
|
|
||||||
delay(500+2*ifPing())
|
|
||||||
g_game.move(tileList[i].tileObj:getThings()[j], pos(), tileList[i].tileObj:getThings()[j]:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) then
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
if depotClear then
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
if container:getName():lower() == "locker" then
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i] and depotClear and not depotOpen and not storage.lootContainerOpen then
|
|
||||||
delay(500+2*ifPing())
|
|
||||||
g_game.use(tileList[i].tileObj:getTopUseThing())
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
i = 1
|
|
||||||
|
|
||||||
-- finding depot
|
|
||||||
if depotOpen then
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if findItem(3502) and not depotBoxOpen then
|
|
||||||
delay(500+2*ifPing())
|
|
||||||
g_game.use(findItem(3502))
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if depotBoxOpen and not storage.lootContainerOpen then
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
for _, item in ipairs(container:getItems()) do
|
|
||||||
if #valueString ~= 3 then -- new depot
|
|
||||||
if item:isContainer() and table.find({22797, 22798}, item:getId()) then
|
|
||||||
delay(500+2*ifPing())
|
|
||||||
storage.lootContainerOpen = true
|
|
||||||
break
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if item:isContainer() and item:getId() == mainBp then
|
|
||||||
delay(500+2*ifPing())
|
|
||||||
g_game.use(item, container)
|
|
||||||
storage.lootContainerOpen = true
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if #valueString == 3 then
|
|
||||||
delay(150+ifPing())
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
if container:getContainerItem():getId() == mainBp then
|
|
||||||
storage.lootContainerOpen = true
|
|
||||||
storage.isDepositing = true
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local looting = {}
|
|
||||||
for _, lootItem in pairs(lootList) do
|
|
||||||
if not table.find(looting, lootItem['id']) and not table.find({3031, 3035, 3043}, lootItem['id']) then
|
|
||||||
table.insert(looting, lootItem['id'])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
delay(200+ifPing())
|
|
||||||
local currentItems = 0
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
for _, item in ipairs(container:getItems()) do
|
|
||||||
if table.find(looting, item:getId()) then
|
|
||||||
currentItems = currentItems + item:getCount()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if currentItems == 0 then
|
|
||||||
if value:lower() ~= "yes" and #valueString ~= 3 then
|
|
||||||
storage.containersClosed = false
|
|
||||||
storage.containersReset = false
|
|
||||||
storage.depositDone = true
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if table.find(lootDestination, container:getContainerItem():getId()) and table.find(lootDestination, item:getId()) then
|
|
||||||
g_game.open(item, container)
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
storage.containersClosed = false
|
|
||||||
storage.containersReset = false
|
|
||||||
storage.depositDone = true
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- only if old depot
|
|
||||||
local stackMin
|
|
||||||
local stackMax
|
|
||||||
local nonStackMin
|
|
||||||
local nonStackMax
|
|
||||||
if #valueString == 3 then
|
|
||||||
-- backpacks setup
|
|
||||||
local stack = 0
|
|
||||||
local nonStack = 0
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if container:getContainerItem():getId() == mainBp then
|
|
||||||
for i, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == stackBp then
|
|
||||||
stack = stack + 1
|
|
||||||
elseif item:getId() == nonStackBp then
|
|
||||||
nonStack = nonStack + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
stackMax = stack - 1
|
|
||||||
nonStackMin = stack
|
|
||||||
nonStackMax = (stack + nonStack) - 1
|
|
||||||
|
|
||||||
storage.currentStack = 0
|
|
||||||
storage.currentNonStack = nonStackMin
|
|
||||||
|
|
||||||
if storage.lootItemsCount == currentItems then
|
|
||||||
if storage.lastTry == 1 then
|
|
||||||
if storage.currentStack < stackMax then
|
|
||||||
storage.currentStack = storage.currentStack + 1
|
|
||||||
else
|
|
||||||
warn("CaveBot[Depositer]: Stack Backpack full! Proceeding.")
|
|
||||||
reset()
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
elseif storage.lastTry == 2 then
|
|
||||||
if storage.currentNonStack < nonStackMax then
|
|
||||||
storage.currentNonStack = storage.currentNonStack + 1
|
|
||||||
else
|
|
||||||
warn("CaveBot[Depositer]: Non-Stack Backpack full! Proceeding.")
|
|
||||||
reset()
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
storage.lootItemsCount = currentItems
|
|
||||||
end
|
|
||||||
|
|
||||||
if #looting > 0 then
|
|
||||||
if #valueString ~= 3 then -- version check, if value is set of 3 i
|
|
||||||
for i, depotcontainer in pairs(getContainers()) do
|
|
||||||
containerItemId = depotcontainer:getContainerItem():getId()
|
|
||||||
--check if open depot
|
|
||||||
if containerItemId == 3502 then
|
|
||||||
-- check all containers and items
|
|
||||||
for l, lootcontainer in pairs(getContainers()) do
|
|
||||||
for j, item in ipairs(lootcontainer:getItems()) do
|
|
||||||
-- now the criteria
|
|
||||||
if table.find(looting, item:getId()) then
|
|
||||||
-- move the item
|
|
||||||
if item:isStackable() then
|
|
||||||
g_game.move(item, depotcontainer:getSlotPosition(1), item:getCount())
|
|
||||||
return "retry"
|
|
||||||
else
|
|
||||||
g_game.move(item, depotcontainer:getSlotPosition(0), item:getCount())
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else -- to be written, last part missing is stashing items for old depots
|
|
||||||
for i, depotcontainer in pairs(getContainers()) do
|
|
||||||
containerItemId = depotcontainer:getContainerItem():getId()
|
|
||||||
--check if open depot
|
|
||||||
if containerItemId == mainBp then
|
|
||||||
-- check all containers and items
|
|
||||||
for l, lootcontainer in pairs(getContainers()) do
|
|
||||||
for j, item in ipairs(lootcontainer:getItems()) do
|
|
||||||
-- now the criteria
|
|
||||||
if table.find(looting, item:getId()) then
|
|
||||||
-- move the item
|
|
||||||
if item:isStackable() then
|
|
||||||
g_game.move(item, depotcontainer:getSlotPosition(storage.currentStack), item:getCount())
|
|
||||||
storage.lastTry = 1
|
|
||||||
return "retry"
|
|
||||||
else
|
|
||||||
g_game.move(item, depotcontainer:getSlotPosition(storage.currentNonStack), item:getCount())
|
|
||||||
storage.lastTry = 2
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
else
|
|
||||||
warn("no items in looting list!")
|
|
||||||
reset()
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return "retry"
|
|
||||||
end)
|
|
||||||
|
|
||||||
CaveBot.Editor.registerAction("depositor", "depositor", {
|
|
||||||
value="no",
|
|
||||||
title="Depositor",
|
|
||||||
description="No - just deposit \n Yes - also reopen loot containers \n mainID, stackId, nonStackId - for older tibia",
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
onPlayerPositionChange(function(newPos, oldPos)
|
|
||||||
if CaveBot.isOn() then
|
|
||||||
reset()
|
|
||||||
end
|
|
||||||
end)
|
|
@ -1,184 +0,0 @@
|
|||||||
CaveBot.Extensions.InWithdraw = {}
|
|
||||||
|
|
||||||
comparePosition = function(pPos, tPos)
|
|
||||||
return (getDistanceBetween(pPos, tPos) <= 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
local depotIDs = {3497, 3498, 3499, 3500}
|
|
||||||
storage.stopSearch = false
|
|
||||||
storage.inboxContainerOpen = false
|
|
||||||
local i = 1
|
|
||||||
|
|
||||||
|
|
||||||
CaveBot.Extensions.InWithdraw.setup = function()
|
|
||||||
CaveBot.registerAction("inwithdraw", "#002FFF", function(value, retries)
|
|
||||||
local data = string.split(value, ",")
|
|
||||||
local withdrawId
|
|
||||||
local count
|
|
||||||
local itemCount = 0
|
|
||||||
local depotAmount = 0
|
|
||||||
if #data ~= 2 then
|
|
||||||
warn("CaveBot[InboxWithdraw]: incorrect withdraw value")
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
withdrawId = tonumber(data[1])
|
|
||||||
count = tonumber(data[2])
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if not string.find(container:getName():lower(), "inbox") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawId then
|
|
||||||
itemCount = itemCount + item:getCount()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if itemCount >= count then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "your inbox") then
|
|
||||||
g_game.close(container)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
print("CaveBot[InboxWithdraw]: enough items, proceeding")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
if retries > 400 then
|
|
||||||
print("CaveBot[InboxWithdraw]: actions limit reached, proceeding")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
delay(200)
|
|
||||||
local tileList = {}
|
|
||||||
local tPos
|
|
||||||
local depotClear = false
|
|
||||||
local depotOpen = false
|
|
||||||
local depotBoxOpen = false
|
|
||||||
for _,tile in pairs(g_map.getTiles(posz())) do
|
|
||||||
for i,thing in pairs(tile:getThings()) do
|
|
||||||
if table.find(depotIDs, thing:getId()) then
|
|
||||||
table.insert(tileList, {tileObj = tile, distance = getDistanceBetween(pos(), tile:getPosition()), depotID = thing:getId()})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
table.sort(tileList, function(a,b) return a.distance < b.distance end)
|
|
||||||
::findEmptyDP::
|
|
||||||
if tileList[i] and not storage.stopSearch then
|
|
||||||
if tileList[i].depotID == 3498 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x + 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3499 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y + 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3500 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x - 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3497 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y - 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
end
|
|
||||||
if tPos then
|
|
||||||
local dest = g_map.getTile(tPos)
|
|
||||||
if not comparePosition(pos(), dest:getPosition()) then
|
|
||||||
if not dest:getCreatures()[1] and dest:isWalkable() then
|
|
||||||
if CaveBot.walkTo(dest:getPosition(), {ignoreNonPathable=true}) then
|
|
||||||
storage.stopSearch = true
|
|
||||||
delay(100)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
i = i + 1
|
|
||||||
goto findEmptyDP
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i].tileObj and not table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) and comparePosition(pos(), tileList[i].tileObj:getPosition()) then
|
|
||||||
for j=1,table.getn(tileList[i].tileObj:getThings()),1 do
|
|
||||||
if not tileList[i].tileObj:getThings()[j]:isNotMoveable() then
|
|
||||||
delay(500)
|
|
||||||
g_game.move(tileList[i].tileObj:getThings()[j], pos(), tileList[i].tileObj:getThings()[j]:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) then
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
if depotClear then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "locker" then
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i].tileObj and depotClear and not depotOpen and not storage.inboxContainerOpen then
|
|
||||||
delay(500)
|
|
||||||
g_game.use(tileList[i].tileObj:getTopUseThing())
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
i = 1
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "your inbox" then
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if depotOpen and not depotBoxOpen then
|
|
||||||
if findItem(12902) then
|
|
||||||
delay(500)
|
|
||||||
g_game.use(findItem(12902))
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if depotBoxOpen and not storage.inboxContainerOpen then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "your" then
|
|
||||||
storage.inboxContainerOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
delay(500)
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "your") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawId then
|
|
||||||
depotAmount = depotAmount + item:getCount()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local destination
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if container:getCapacity() > #container:getItems() and not string.find(container:getName():lower(), "quiver") and not string.find(container:getName():lower(), "depot") and not string.find(container:getName():lower(), "loot") and not string.find(container:getName():lower(), "inbox") then
|
|
||||||
destination = container
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if itemCount < count and destination then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "your inbox") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawId then
|
|
||||||
if item:isStackable() then
|
|
||||||
g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), math.min(item:getCount(), (count - itemCount)))
|
|
||||||
return "retry"
|
|
||||||
else
|
|
||||||
g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), 1)
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return "retry"
|
|
||||||
end)
|
|
||||||
|
|
||||||
CaveBot.Editor.registerAction("inwithdraw", "in withdraw", {
|
|
||||||
value="id,amount",
|
|
||||||
title="Withdraw Items",
|
|
||||||
description="insert item id and amount",
|
|
||||||
})
|
|
||||||
end
|
|
@ -1,71 +0,0 @@
|
|||||||
CaveBot.Extensions.SupplyCheck = {}
|
|
||||||
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
CaveBot.Extensions.SupplyCheck.setup = function()
|
|
||||||
CaveBot.registerAction("supplyCheck", "#db5a5a", function(value)
|
|
||||||
local supplies = SuppliesConfig[suppliesPanelName]
|
|
||||||
local softCount = itemAmount(6529) + itemAmount(3549)
|
|
||||||
local totalItem1 = itemAmount(supplies.item1)
|
|
||||||
local totalItem2 = itemAmount(supplies.item2)
|
|
||||||
local totalItem3 = itemAmount(supplies.item3)
|
|
||||||
local totalItem4 = itemAmount(supplies.item4)
|
|
||||||
local totalItem5 = itemAmount(supplies.item5)
|
|
||||||
local totalItem6 = itemAmount(supplies.item6)
|
|
||||||
|
|
||||||
if SuppliesConfig.supplyRetries > 50 then
|
|
||||||
print("CaveBot[SupplyCheck]: Round limit reached, going back on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (supplies.imbues and player:getSkillLevel(11) == 0) then
|
|
||||||
print("CaveBot[SupplyCheck]: Imbues ran out. Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (supplies.staminaSwitch and stamina() < tonumber(supplies.staminaValue)) then
|
|
||||||
print("CaveBot[SupplyCheck]: Stamina ran out. Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (softCount < 1 and supplies.SoftBoots) then
|
|
||||||
print("CaveBot[SupplyCheck]: No soft boots left. Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (totalItem1 < tonumber(supplies.item1Min) and supplies.item1 > 100) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item1 .. "(only " .. totalItem1 .. " left). Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (totalItem2 < tonumber(supplies.item2Min) and supplies.item2 > 100) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item2 .. "(only " .. totalItem2 .. " left). Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (totalItem3 < tonumber(supplies.item3Min) and supplies.item3 > 100) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item3 .. "(only " .. totalItem3 .. " left). Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (totalItem4 < tonumber(supplies.item4Min) and supplies.item4 > 100) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item4 .. "(only " .. totalItem4 .. " left). Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (totalItem5 < tonumber(supplies.item5Min) and supplies.item5 > 100) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item5 .. "(only " .. totalItem5 .. " left). Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (totalItem6 < tonumber(supplies.item6Min) and supplies.item6 > 100) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item6 .. "(only " .. totalItem6 .. " left). Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
elseif (freecap() < tonumber(supplies.capValue) and supplies.capSwitch) then
|
|
||||||
print("CaveBot[SupplyCheck]: Not enough capacity. Going on refill.")
|
|
||||||
SuppliesConfig.supplyRetries = 0
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
print("CaveBot[SupplyCheck]: Enough supplies. Hunting. Round (" .. SuppliesConfig.supplyRetries .. "/50)")
|
|
||||||
SuppliesConfig.supplyRetries = SuppliesConfig.supplyRetries + 1
|
|
||||||
return CaveBot.gotoLabel(value)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
CaveBot.Editor.registerAction("supplycheck", "supply check", {
|
|
||||||
value="startHunt",
|
|
||||||
title="Supply check label",
|
|
||||||
description="Insert here hunting start label",
|
|
||||||
})
|
|
||||||
end
|
|
@ -1,221 +0,0 @@
|
|||||||
CaveBot.Extensions.Withdraw = {}
|
|
||||||
|
|
||||||
comparePosition = function(pPos, tPos)
|
|
||||||
return (getDistanceBetween(pPos, tPos) <= 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
local depotContainers = {22797, 22798, 22799, 22800, 22801, 22802, 22803, 22804, 22805, 22806, 22807, 22808, 22809, 22810, 22811, 22812, 22813}
|
|
||||||
local depotIDs = {3497, 3498, 3499, 3500}
|
|
||||||
storage.stopSearch = false
|
|
||||||
storage.lootContainerOpen = false
|
|
||||||
local i = 1
|
|
||||||
|
|
||||||
|
|
||||||
CaveBot.Extensions.Withdraw.setup = function()
|
|
||||||
CaveBot.registerAction("withdraw", "#002FFF", function(value, retries)
|
|
||||||
local data = string.split(value, ",")
|
|
||||||
local stashIndex
|
|
||||||
local withdrawId
|
|
||||||
local count
|
|
||||||
local itemCount = 0
|
|
||||||
local depotAmount
|
|
||||||
if #data ~= 3 then
|
|
||||||
warn("incorrect withdraw value")
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
stashIndex = tonumber(data[1])
|
|
||||||
withdrawId = tonumber(data[2])
|
|
||||||
count = tonumber(data[3])
|
|
||||||
end
|
|
||||||
local withdrawSource = depotContainers[stashIndex]
|
|
||||||
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if not string.find(container:getName():lower(), "depot") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawId then
|
|
||||||
itemCount = itemCount + item:getCount()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if itemCount >= count then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "depot box") then
|
|
||||||
g_game.close(container)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
print("enough items")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
if retries > 400 then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
delay(200)
|
|
||||||
local tileList = {}
|
|
||||||
local tPos
|
|
||||||
local depotClear = false
|
|
||||||
local depotOpen = false
|
|
||||||
local depotBoxOpen = false
|
|
||||||
for _,tile in pairs(g_map.getTiles(posz())) do
|
|
||||||
for i,thing in pairs(tile:getThings()) do
|
|
||||||
if table.find(depotIDs, thing:getId()) then
|
|
||||||
table.insert(tileList, {tileObj = tile, distance = getDistanceBetween(pos(), tile:getPosition()), depotID = thing:getId()})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
table.sort(tileList, function(a,b) return a.distance < b.distance end)
|
|
||||||
::findEmptyDP::
|
|
||||||
if tileList[i] and not storage.stopSearch then
|
|
||||||
if tileList[i].depotID == 3498 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x + 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3499 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y + 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3500 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x - 1, y = tileList[i].tileObj:getPosition().y, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
elseif tileList[i].depotID == 3497 then
|
|
||||||
tPos = {x = tileList[i].tileObj:getPosition().x, y = tileList[i].tileObj:getPosition().y - 1, z = tileList[i].tileObj:getPosition().z}
|
|
||||||
end
|
|
||||||
if tPos then
|
|
||||||
local dest = g_map.getTile(tPos)
|
|
||||||
if not comparePosition(pos(), dest:getPosition()) then
|
|
||||||
if not dest:getCreatures()[1] and dest:isWalkable() then
|
|
||||||
if CaveBot.walkTo(dest:getPosition(), {ignoreNonPathable=true}) then
|
|
||||||
storage.stopSearch = true
|
|
||||||
delay(100)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
i = i + 1
|
|
||||||
goto findEmptyDP
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i].tileObj and not table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) and comparePosition(pos(), tileList[i].tileObj:getPosition()) then
|
|
||||||
for j=1,table.getn(tileList[i].tileObj:getThings()),1 do
|
|
||||||
if not tileList[i].tileObj:getThings()[j]:isNotMoveable() then
|
|
||||||
delay(500)
|
|
||||||
g_game.move(tileList[i].tileObj:getThings()[j], pos(), tileList[i].tileObj:getThings()[j]:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if table.find(depotIDs, tileList[i].tileObj:getTopLookThing():getId()) then
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
depotClear = true
|
|
||||||
end
|
|
||||||
if depotClear then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "locker" then
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tileList[i].tileObj and depotClear and not depotOpen and not storage.lootContainerOpen then
|
|
||||||
delay(500)
|
|
||||||
g_game.use(tileList[i].tileObj:getTopUseThing())
|
|
||||||
depotOpen = true
|
|
||||||
end
|
|
||||||
i = 1
|
|
||||||
--Version Check to know what to do with the depot--
|
|
||||||
if g_game.getClientVersion() > 910 then
|
|
||||||
if depotOpen then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if findItem(3502) and not depotBoxOpen then
|
|
||||||
delay(500)
|
|
||||||
g_game.use(findItem(3502))
|
|
||||||
depotBoxOpen = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if depotBoxOpen and not storage.lootContainerOpen then
|
|
||||||
for _, container in pairs(g_game.getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
for _, item in ipairs(container:getItems()) do
|
|
||||||
if item:isContainer() and table.find({22797, 22798}, item:getId()) then
|
|
||||||
delay(500)
|
|
||||||
storage.lootContainerOpen = true
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local boxOpened = false
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "depot box") then
|
|
||||||
boxOpened = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not boxOpened then
|
|
||||||
for _, container in pairs(getContainers()) do
|
|
||||||
if container:getName():lower() == "depot chest" then
|
|
||||||
for _, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawSource then
|
|
||||||
g_game.open(item)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "depot") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawId then
|
|
||||||
depotAmount = depotAmount + item:getCount()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if depotAmount == 0 then
|
|
||||||
print("lack of withdraw items!")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
local destination
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if container:getCapacity() > #container:getItems() and not string.find(container:getName():lower(), "quiver") and not string.find(container:getName():lower(), "depot") and not string.find(container:getName():lower(), "loot") and not string.find(container:getName():lower(), "inbox") then
|
|
||||||
destination = container
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if itemCount < count and destination then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if string.find(container:getName():lower(), "depot box") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if item:getId() == withdrawId then
|
|
||||||
if item:isStackable() then
|
|
||||||
g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), math.min(item:getCount(), (count - itemCount)))
|
|
||||||
return "retry"
|
|
||||||
else
|
|
||||||
g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), 1)
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return "retry"
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
CaveBot.Editor.registerAction("withdraw", "withdraw", {
|
|
||||||
value="index,id,amount",
|
|
||||||
title="Withdraw Items",
|
|
||||||
description="insert source index, item id and amount",
|
|
||||||
})
|
|
||||||
end
|
|
@ -1,247 +0,0 @@
|
|||||||
setDefaultTab("HP")
|
|
||||||
local conditionPanelName = "ConditionPanel"
|
|
||||||
local ui = setupUI([[
|
|
||||||
Panel
|
|
||||||
height: 19
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: title
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
text-align: center
|
|
||||||
width: 130
|
|
||||||
!text: tr('Conditions')
|
|
||||||
|
|
||||||
Button
|
|
||||||
id: conditionList
|
|
||||||
anchors.top: prev.top
|
|
||||||
anchors.left: prev.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-left: 3
|
|
||||||
height: 17
|
|
||||||
text: Setup
|
|
||||||
|
|
||||||
]])
|
|
||||||
ui:setId(conditionPanelName)
|
|
||||||
|
|
||||||
if not HealBotConfig[conditionPanelName] then
|
|
||||||
HealBotConfig[conditionPanelName] = {
|
|
||||||
enabled = false,
|
|
||||||
curePosion = false,
|
|
||||||
poisonCost = 20,
|
|
||||||
cureCurse = false,
|
|
||||||
curseCost = 80,
|
|
||||||
cureBleed = false,
|
|
||||||
bleedCost = 45,
|
|
||||||
cureBurn = false,
|
|
||||||
burnCost = 30,
|
|
||||||
cureElectrify = false,
|
|
||||||
electrifyCost = 22,
|
|
||||||
cureParalyse = false,
|
|
||||||
paralyseCost = 40,
|
|
||||||
paralyseSpell = "utani hur",
|
|
||||||
holdHaste = false,
|
|
||||||
hasteCost = 40,
|
|
||||||
hasteSpell = "utani hur",
|
|
||||||
holdUtamo = false,
|
|
||||||
utamoCost = 40,
|
|
||||||
holdUtana = false,
|
|
||||||
utanaCost = 440,
|
|
||||||
holdUtura = false,
|
|
||||||
uturaType = "",
|
|
||||||
uturaCost = 100,
|
|
||||||
ignoreInPz = true,
|
|
||||||
stopHaste = false
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.title:setOn(HealBotConfig[conditionPanelName].enabled)
|
|
||||||
ui.title.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].enabled = not HealBotConfig[conditionPanelName].enabled
|
|
||||||
widget:setOn(HealBotConfig[conditionPanelName].enabled)
|
|
||||||
vBotConfigSave("heal")
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.conditionList.onClick = function(widget)
|
|
||||||
conditionsWindow:show()
|
|
||||||
conditionsWindow:raise()
|
|
||||||
conditionsWindow:focus()
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
local rootWidget = g_ui.getRootWidget()
|
|
||||||
if rootWidget then
|
|
||||||
conditionsWindow = UI.createWindow('ConditionsWindow', rootWidget)
|
|
||||||
conditionsWindow:hide()
|
|
||||||
|
|
||||||
-- text edits
|
|
||||||
conditionsWindow.Cure.PoisonCost:setText(HealBotConfig[conditionPanelName].poisonCost)
|
|
||||||
conditionsWindow.Cure.PoisonCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].poisonCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.CurseCost:setText(HealBotConfig[conditionPanelName].curseCost)
|
|
||||||
conditionsWindow.Cure.CurseCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].curseCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.BleedCost:setText(HealBotConfig[conditionPanelName].bleedCost)
|
|
||||||
conditionsWindow.Cure.BleedCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].bleedCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.BurnCost:setText(HealBotConfig[conditionPanelName].burnCost)
|
|
||||||
conditionsWindow.Cure.BurnCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].burnCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.ElectrifyCost:setText(HealBotConfig[conditionPanelName].electrifyCost)
|
|
||||||
conditionsWindow.Cure.ElectrifyCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].electrifyCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.ParalyseCost:setText(HealBotConfig[conditionPanelName].paralyseCost)
|
|
||||||
conditionsWindow.Cure.ParalyseCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].paralyseCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.ParalyseSpell:setText(HealBotConfig[conditionPanelName].paralyseSpell)
|
|
||||||
conditionsWindow.Cure.ParalyseSpell.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].paralyseSpell = text
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.HasteSpell:setText(HealBotConfig[conditionPanelName].hasteSpell)
|
|
||||||
conditionsWindow.Hold.HasteSpell.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].hasteSpell = text
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.HasteCost:setText(HealBotConfig[conditionPanelName].hasteCost)
|
|
||||||
conditionsWindow.Hold.HasteCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].hasteCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.UtamoCost:setText(HealBotConfig[conditionPanelName].utamoCost)
|
|
||||||
conditionsWindow.Hold.UtamoCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].utamoCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.UtanaCost:setText(HealBotConfig[conditionPanelName].utanaCost)
|
|
||||||
conditionsWindow.Hold.UtanaCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].utanaCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.UturaCost:setText(HealBotConfig[conditionPanelName].uturaCost)
|
|
||||||
conditionsWindow.Hold.UturaCost.onTextChange = function(widget, text)
|
|
||||||
HealBotConfig[conditionPanelName].uturaCost = tonumber(text)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- combo box
|
|
||||||
conditionsWindow.Hold.UturaType:setOption(HealBotConfig[conditionPanelName].uturaType)
|
|
||||||
conditionsWindow.Hold.UturaType.onOptionChange = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].uturaType = widget:getCurrentOption().text
|
|
||||||
end
|
|
||||||
|
|
||||||
-- checkboxes
|
|
||||||
conditionsWindow.Cure.CurePoison:setChecked(HealBotConfig[conditionPanelName].curePoison)
|
|
||||||
conditionsWindow.Cure.CurePoison.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].curePoison = not HealBotConfig[conditionPanelName].curePoison
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].curePoison)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.CureCurse:setChecked(HealBotConfig[conditionPanelName].cureCurse)
|
|
||||||
conditionsWindow.Cure.CureCurse.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].cureCurse = not HealBotConfig[conditionPanelName].cureCurse
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].cureCurse)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.CureBleed:setChecked(HealBotConfig[conditionPanelName].cureBleed)
|
|
||||||
conditionsWindow.Cure.CureBleed.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].cureBleed = not HealBotConfig[conditionPanelName].cureBleed
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].cureBleed)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.CureBurn:setChecked(HealBotConfig[conditionPanelName].cureBurn)
|
|
||||||
conditionsWindow.Cure.CureBurn.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].cureBurn = not HealBotConfig[conditionPanelName].cureBurn
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].cureBurn)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.CureElectrify:setChecked(HealBotConfig[conditionPanelName].cureElectrify)
|
|
||||||
conditionsWindow.Cure.CureElectrify.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].cureElectrify = not HealBotConfig[conditionPanelName].cureElectrify
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].cureElectrify)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Cure.CureParalyse:setChecked(HealBotConfig[conditionPanelName].cureParalyse)
|
|
||||||
conditionsWindow.Cure.CureParalyse.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].cureParalyse = not HealBotConfig[conditionPanelName].cureParalyse
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].cureParalyse)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.HoldHaste:setChecked(HealBotConfig[conditionPanelName].holdHaste)
|
|
||||||
conditionsWindow.Hold.HoldHaste.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].holdHaste = not HealBotConfig[conditionPanelName].holdHaste
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].holdHaste)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.HoldUtamo:setChecked(HealBotConfig[conditionPanelName].holdUtamo)
|
|
||||||
conditionsWindow.Hold.HoldUtamo.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].holdUtamo = not HealBotConfig[conditionPanelName].holdUtamo
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].holdUtamo)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.HoldUtana:setChecked(HealBotConfig[conditionPanelName].holdUtana)
|
|
||||||
conditionsWindow.Hold.HoldUtana.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].holdUtana = not HealBotConfig[conditionPanelName].holdUtana
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].holdUtana)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.HoldUtura:setChecked(HealBotConfig[conditionPanelName].holdUtura)
|
|
||||||
conditionsWindow.Hold.HoldUtura.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].holdUtura = not HealBotConfig[conditionPanelName].holdUtura
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].holdUtura)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.IgnoreInPz:setChecked(HealBotConfig[conditionPanelName].ignoreInPz)
|
|
||||||
conditionsWindow.Hold.IgnoreInPz.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].ignoreInPz = not HealBotConfig[conditionPanelName].ignoreInPz
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].ignoreInPz)
|
|
||||||
end
|
|
||||||
|
|
||||||
conditionsWindow.Hold.StopHaste:setChecked(HealBotConfig[conditionPanelName].stopHaste)
|
|
||||||
conditionsWindow.Hold.StopHaste.onClick = function(widget)
|
|
||||||
HealBotConfig[conditionPanelName].stopHaste = not HealBotConfig[conditionPanelName].stopHaste
|
|
||||||
widget:setChecked(HealBotConfig[conditionPanelName].stopHaste)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- buttons
|
|
||||||
conditionsWindow.closeButton.onClick = function(widget)
|
|
||||||
conditionsWindow:hide()
|
|
||||||
vBotConfigSave("heal")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local utanaCast = nil
|
|
||||||
macro(500, function()
|
|
||||||
if not HealBotConfig[conditionPanelName].enabled or modules.game_cooldown.isGroupCooldownIconActive(2) then return end
|
|
||||||
if hppercent() > 95 then
|
|
||||||
if HealBotConfig[conditionPanelName].curePoison and mana() >= HealBotConfig[conditionPanelName].poisonCost and isPoisioned() then say("exana pox")
|
|
||||||
elseif HealBotConfig[conditionPanelName].cureCurse and mana() >= HealBotConfig[conditionPanelName].curseCost and isCursed() then say("exana mort")
|
|
||||||
elseif HealBotConfig[conditionPanelName].cureBleed and mana() >= HealBotConfig[conditionPanelName].bleedCost and isBleeding() then say("exana kor")
|
|
||||||
elseif HealBotConfig[conditionPanelName].cureBurn and mana() >= HealBotConfig[conditionPanelName].burnCost and isBurning() then say("exana flam")
|
|
||||||
elseif HealBotConfig[conditionPanelName].cureElectrify and mana() >= HealBotConfig[conditionPanelName].electrifyCost and isEnergized() then say("exana vis")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if (not HealBotConfig[conditionPanelName].ignoreInPz or not isInPz()) and HealBotConfig[conditionPanelName].holdUtura and mana() >= HealBotConfig[conditionPanelName].uturaCost and not hasPartyBuff() then say(HealBotConfig[conditionPanelName].uturaType)
|
|
||||||
elseif (not HealBotConfig[conditionPanelName].ignoreInPz or not isInPz()) and HealBotConfig[conditionPanelName].holdUtana and mana() >= HealBotConfig[conditionPanelName].utanaCost and (not utanaCast or (now - utanaCast > 120000)) then say("utana vid") utanaCast = now
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
macro(50, function()
|
|
||||||
if not HealBotConfig[conditionPanelName].enabled then return end
|
|
||||||
if (not HealBotConfig[conditionPanelName].ignoreInPz or not isInPz()) and HealBotConfig[conditionPanelName].holdUtamo and mana() >= HealBotConfig[conditionPanelName].utamoCost and not hasManaShield() then say("utamo vita")
|
|
||||||
elseif (not HealBotConfig[conditionPanelName].ignoreInPz or not isInPz()) and HealBotConfig[conditionPanelName].holdHaste and mana() >= HealBotConfig[conditionPanelName].hasteCost and not hasHaste() and not getSpellCoolDown(HealBotConfig[conditionPanelName].hasteSpell) and (not target() or not HealBotConfig[conditionPanelName].stopHaste or TargetBot.isCaveBotActionAllowed()) then say(HealBotConfig[conditionPanelName].hasteSpell)
|
|
||||||
elseif HealBotConfig[conditionPanelName].cureParalyse and mana() >= HealBotConfig[conditionPanelName].paralyseCost and isParalyzed() and not getSpellCoolDown(HealBotConfig[conditionPanelName].paralyseSpell) then say(HealBotConfig[conditionPanelName].paralyseSpell)
|
|
||||||
end
|
|
||||||
end)
|
|
@ -1,178 +0,0 @@
|
|||||||
alarmsPanelName = "alarms"
|
|
||||||
local ui = setupUI([[
|
|
||||||
Panel
|
|
||||||
height: 19
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: title
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
text-align: center
|
|
||||||
width: 130
|
|
||||||
!text: tr('Alarms')
|
|
||||||
|
|
||||||
Button
|
|
||||||
id: alerts
|
|
||||||
anchors.top: prev.top
|
|
||||||
anchors.left: prev.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-left: 3
|
|
||||||
height: 17
|
|
||||||
text: Edit
|
|
||||||
|
|
||||||
]])
|
|
||||||
ui:setId(alarmsPanelName)
|
|
||||||
|
|
||||||
if not storage[alarmsPanelName] then
|
|
||||||
storage[alarmsPanelName] = {
|
|
||||||
enabled = false,
|
|
||||||
playerAttack = false,
|
|
||||||
playerDetected = false,
|
|
||||||
playerDetectedLogout = false,
|
|
||||||
creatureDetected = false,
|
|
||||||
healthBelow = false,
|
|
||||||
healthValue = 40,
|
|
||||||
manaBelow = false,
|
|
||||||
manaValue = 50,
|
|
||||||
privateMessage = false
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.title:setOn(storage[alarmsPanelName].enabled)
|
|
||||||
ui.title.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].enabled = not storage[alarmsPanelName].enabled
|
|
||||||
widget:setOn(storage[alarmsPanelName].enabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
rootWidget = g_ui.getRootWidget()
|
|
||||||
if rootWidget then
|
|
||||||
alarmsWindow = UI.createWindow('AlarmsWindow', rootWidget)
|
|
||||||
alarmsWindow:hide()
|
|
||||||
|
|
||||||
alarmsWindow.closeButton.onClick = function(widget)
|
|
||||||
alarmsWindow:hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.playerAttack:setOn(storage[alarmsPanelName].playerAttack)
|
|
||||||
alarmsWindow.playerAttack.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].playerAttack = not storage[alarmsPanelName].playerAttack
|
|
||||||
widget:setOn(storage[alarmsPanelName].playerAttack)
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.playerDetected:setOn(storage[alarmsPanelName].playerDetected)
|
|
||||||
alarmsWindow.playerDetected.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].playerDetected = not storage[alarmsPanelName].playerDetected
|
|
||||||
widget:setOn(storage[alarmsPanelName].playerDetected)
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.playerDetectedLogout:setChecked(storage[alarmsPanelName].playerDetectedLogout)
|
|
||||||
alarmsWindow.playerDetectedLogout.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].playerDetectedLogout = not storage[alarmsPanelName].playerDetectedLogout
|
|
||||||
widget:setChecked(storage[alarmsPanelName].playerDetectedLogout)
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.creatureDetected:setOn(storage[alarmsPanelName].creatureDetected)
|
|
||||||
alarmsWindow.creatureDetected.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].creatureDetected = not storage[alarmsPanelName].creatureDetected
|
|
||||||
widget:setOn(storage[alarmsPanelName].creatureDetected)
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.healthBelow:setOn(storage[alarmsPanelName].healthBelow)
|
|
||||||
alarmsWindow.healthBelow.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].healthBelow = not storage[alarmsPanelName].healthBelow
|
|
||||||
widget:setOn(storage[alarmsPanelName].healthBelow)
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.healthValue.onValueChange = function(scroll, value)
|
|
||||||
storage[alarmsPanelName].healthValue = value
|
|
||||||
alarmsWindow.healthBelow:setText("Health < " .. storage[alarmsPanelName].healthValue .. "%")
|
|
||||||
end
|
|
||||||
alarmsWindow.healthValue:setValue(storage[alarmsPanelName].healthValue)
|
|
||||||
|
|
||||||
alarmsWindow.manaBelow:setOn(storage[alarmsPanelName].manaBelow)
|
|
||||||
alarmsWindow.manaBelow.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].manaBelow = not storage[alarmsPanelName].manaBelow
|
|
||||||
widget:setOn(storage[alarmsPanelName].manaBelow)
|
|
||||||
end
|
|
||||||
|
|
||||||
alarmsWindow.manaValue.onValueChange = function(scroll, value)
|
|
||||||
storage[alarmsPanelName].manaValue = value
|
|
||||||
alarmsWindow.manaBelow:setText("Mana < " .. storage[alarmsPanelName].manaValue .. "%")
|
|
||||||
end
|
|
||||||
alarmsWindow.manaValue:setValue(storage[alarmsPanelName].manaValue)
|
|
||||||
|
|
||||||
alarmsWindow.privateMessage:setOn(storage[alarmsPanelName].privateMessage)
|
|
||||||
alarmsWindow.privateMessage.onClick = function(widget)
|
|
||||||
storage[alarmsPanelName].privateMessage = not storage[alarmsPanelName].privateMessage
|
|
||||||
widget:setOn(storage[alarmsPanelName].privateMessage)
|
|
||||||
end
|
|
||||||
|
|
||||||
onTextMessage(function(mode, text)
|
|
||||||
if storage[alarmsPanelName].enabled and storage[alarmsPanelName].playerAttack and mode == 16 and string.match(text, "hitpoints due to an attack") and not string.match(text, "hitpoints due to an attack by a ") then
|
|
||||||
playSound("/sounds/Player_Attack.ogg")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
macro(100, function()
|
|
||||||
if not storage[alarmsPanelName].enabled then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if storage[alarmsPanelName].playerDetected then
|
|
||||||
for _, spec in ipairs(getSpectators()) do
|
|
||||||
if spec:isPlayer() and spec:getName() ~= name() then
|
|
||||||
specPos = spec:getPosition()
|
|
||||||
if math.max(math.abs(posx()-specPos.x), math.abs(posy()-specPos.y)) <= 8 then
|
|
||||||
playSound("/sounds/Player_Detected.ogg")
|
|
||||||
delay(1500)
|
|
||||||
if storage[alarmsPanelName].playerDetectedLogout then
|
|
||||||
modules.game_interface.tryLogout(false)
|
|
||||||
end
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if storage[alarmsPanelName].creatureDetected then
|
|
||||||
for _, spec in ipairs(getSpectators()) do
|
|
||||||
if not spec:isPlayer()then
|
|
||||||
specPos = spec:getPosition()
|
|
||||||
if math.max(math.abs(posx()-specPos.x), math.abs(posy()-specPos.y)) <= 8 then
|
|
||||||
playSound("/sounds/Creature_Detected.ogg")
|
|
||||||
delay(1500)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if storage[alarmsPanelName].healthBelow then
|
|
||||||
if hppercent() <= storage[alarmsPanelName].healthValue then
|
|
||||||
playSound("/sounds/Low_Health.ogg")
|
|
||||||
delay(1500)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if storage[alarmsPanelName].manaBelow then
|
|
||||||
if manapercent() <= storage[alarmsPanelName].manaValue then
|
|
||||||
playSound("/sounds/Low_Mana.ogg")
|
|
||||||
delay(1500)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
onTalk(function(name, level, mode, text, channelId, pos)
|
|
||||||
if mode == 4 and storage[alarmsPanelName].enabled and storage[alarmsPanelName].privateMessage then
|
|
||||||
playSound("/sounds/Private_Message.ogg")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.alerts.onClick = function(widget)
|
|
||||||
alarmsWindow:show()
|
|
||||||
alarmsWindow:raise()
|
|
||||||
alarmsWindow:focus()
|
|
||||||
end
|
|
@ -1,441 +0,0 @@
|
|||||||
setDefaultTab("Main")
|
|
||||||
ComboPanelName = "combobot"
|
|
||||||
local ui = setupUI([[
|
|
||||||
Panel
|
|
||||||
height: 19
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: title
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
text-align: center
|
|
||||||
width: 130
|
|
||||||
!text: tr('ComboBot')
|
|
||||||
|
|
||||||
Button
|
|
||||||
id: combos
|
|
||||||
anchors.top: prev.top
|
|
||||||
anchors.left: prev.right
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-left: 3
|
|
||||||
height: 17
|
|
||||||
text: Setup
|
|
||||||
|
|
||||||
]])
|
|
||||||
ui:setId(ComboPanelName)
|
|
||||||
|
|
||||||
if not storage[ComboPanelName] then
|
|
||||||
storage[ComboPanelName] = {
|
|
||||||
enabled = false,
|
|
||||||
onSayEnabled = false,
|
|
||||||
onShootEnabled = false,
|
|
||||||
onCastEnabled = false,
|
|
||||||
followLeaderEnabled = false,
|
|
||||||
attackLeaderTargetEnabled = false,
|
|
||||||
attackSpellEnabled = false,
|
|
||||||
attackItemToggle = false,
|
|
||||||
sayLeader = "",
|
|
||||||
shootLeader = "",
|
|
||||||
castLeader = "",
|
|
||||||
sayPhrase = "",
|
|
||||||
spell = "",
|
|
||||||
serverLeader = "",
|
|
||||||
item = 3155,
|
|
||||||
attack = "",
|
|
||||||
follow = "",
|
|
||||||
commandsEnabled = true,
|
|
||||||
serverEnabled = false,
|
|
||||||
serverLeaderTarget = false,
|
|
||||||
serverTriggers = true
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.title:setOn(storage[ComboPanelName].enabled)
|
|
||||||
ui.title.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].enabled = not storage[ComboPanelName].enabled
|
|
||||||
widget:setOn(storage[ComboPanelName].enabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.combos.onClick = function(widget)
|
|
||||||
comboWindow:show()
|
|
||||||
comboWindow:raise()
|
|
||||||
comboWindow:focus()
|
|
||||||
end
|
|
||||||
|
|
||||||
rootWidget = g_ui.getRootWidget()
|
|
||||||
if rootWidget then
|
|
||||||
comboWindow = UI.createWindow('ComboWindow', rootWidget)
|
|
||||||
comboWindow:hide()
|
|
||||||
|
|
||||||
-- bot item
|
|
||||||
|
|
||||||
comboWindow.actions.attackItem:setItemId(storage[ComboPanelName].item)
|
|
||||||
comboWindow.actions.attackItem.onItemChange = function(widget)
|
|
||||||
storage[ComboPanelName].item = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- switches
|
|
||||||
|
|
||||||
comboWindow.actions.commandsToggle:setOn(storage[ComboPanelName].commandsEnabled)
|
|
||||||
comboWindow.actions.commandsToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].commandsEnabled = not storage[ComboPanelName].commandsEnabled
|
|
||||||
widget:setOn(storage[ComboPanelName].commandsEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.server.botServerToggle:setOn(storage[ComboPanelName].serverEnabled)
|
|
||||||
comboWindow.server.botServerToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].serverEnabled = not storage[ComboPanelName].serverEnabled
|
|
||||||
widget:setOn(storage[ComboPanelName].serverEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.server.Triggers:setOn(storage[ComboPanelName].serverTriggers)
|
|
||||||
comboWindow.server.Triggers.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].serverTriggers = not storage[ComboPanelName].serverTriggers
|
|
||||||
widget:setOn(storage[ComboPanelName].serverTriggers)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.server.targetServerLeaderToggle:setOn(storage[ComboPanelName].serverLeaderTarget)
|
|
||||||
comboWindow.server.targetServerLeaderToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].serverLeaderTarget = not storage[ComboPanelName].serverLeaderTarget
|
|
||||||
widget:setOn(storage[ComboPanelName].serverLeaderTarget)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- buttons
|
|
||||||
comboWindow.closeButton.onClick = function(widget)
|
|
||||||
comboWindow:hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- combo boxes
|
|
||||||
|
|
||||||
comboWindow.actions.followLeader:setOption(storage[ComboPanelName].follow)
|
|
||||||
comboWindow.actions.followLeader.onOptionChange = function(widget)
|
|
||||||
storage[ComboPanelName].follow = widget:getCurrentOption().text
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.actions.attackLeaderTarget:setOption(storage[ComboPanelName].attack)
|
|
||||||
comboWindow.actions.attackLeaderTarget.onOptionChange = function(widget)
|
|
||||||
storage[ComboPanelName].attack = widget:getCurrentOption().text
|
|
||||||
end
|
|
||||||
|
|
||||||
-- checkboxes
|
|
||||||
comboWindow.trigger.onSayToggle:setChecked(storage[ComboPanelName].onSayEnabled)
|
|
||||||
comboWindow.trigger.onSayToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].onSayEnabled = not storage[ComboPanelName].onSayEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].onSayEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.trigger.onShootToggle:setChecked(storage[ComboPanelName].onShootEnabled)
|
|
||||||
comboWindow.trigger.onShootToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].onShootEnabled = not storage[ComboPanelName].onShootEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].onShootEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.trigger.onCastToggle:setChecked(storage[ComboPanelName].onCastEnabled)
|
|
||||||
comboWindow.trigger.onCastToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].onCastEnabled = not storage[ComboPanelName].onCastEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].onCastEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.actions.followLeaderToggle:setChecked(storage[ComboPanelName].followLeaderEnabled)
|
|
||||||
comboWindow.actions.followLeaderToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].followLeaderEnabled = not storage[ComboPanelName].followLeaderEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].followLeaderEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.actions.attackLeaderTargetToggle:setChecked(storage[ComboPanelName].attackLeaderTargetEnabled)
|
|
||||||
comboWindow.actions.attackLeaderTargetToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].attackLeaderTargetEnabled = not storage[ComboPanelName].attackLeaderTargetEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].attackLeaderTargetEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.actions.attackSpellToggle:setChecked(storage[ComboPanelName].attackSpellEnabled)
|
|
||||||
comboWindow.actions.attackSpellToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].attackSpellEnabled = not storage[ComboPanelName].attackSpellEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].attackSpellEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.actions.attackItemToggle:setChecked(storage[ComboPanelName].attackItemEnabled)
|
|
||||||
comboWindow.actions.attackItemToggle.onClick = function(widget)
|
|
||||||
storage[ComboPanelName].attackItemEnabled = not storage[ComboPanelName].attackItemEnabled
|
|
||||||
widget:setChecked(storage[ComboPanelName].attackItemEnabled)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- text edits
|
|
||||||
comboWindow.trigger.onSayLeader:setText(storage[ComboPanelName].sayLeader)
|
|
||||||
comboWindow.trigger.onSayLeader.onTextChange = function(widget, text)
|
|
||||||
storage[ComboPanelName].sayLeader = text
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.trigger.onShootLeader:setText(storage[ComboPanelName].shootLeader)
|
|
||||||
comboWindow.trigger.onShootLeader.onTextChange = function(widget, text)
|
|
||||||
storage[ComboPanelName].shootLeader = text
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.trigger.onCastLeader:setText(storage[ComboPanelName].castLeader)
|
|
||||||
comboWindow.trigger.onCastLeader.onTextChange = function(widget, text)
|
|
||||||
storage[ComboPanelName].castLeader = text
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.trigger.onSayPhrase:setText(storage[ComboPanelName].sayPhrase)
|
|
||||||
comboWindow.trigger.onSayPhrase.onTextChange = function(widget, text)
|
|
||||||
storage[ComboPanelName].sayPhrase = text
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.actions.attackSpell:setText(storage[ComboPanelName].spell)
|
|
||||||
comboWindow.actions.attackSpell.onTextChange = function(widget, text)
|
|
||||||
storage[ComboPanelName].spell = text
|
|
||||||
end
|
|
||||||
|
|
||||||
comboWindow.server.botServerLeader:setText(storage[ComboPanelName].serverLeader)
|
|
||||||
comboWindow.server.botServerLeader.onTextChange = function(widget, text)
|
|
||||||
storage[ComboPanelName].serverLeader = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- bot server
|
|
||||||
-- [[ join party made by Frosty ]] --
|
|
||||||
|
|
||||||
local shouldCloseWindow = false
|
|
||||||
local firstInvitee = true
|
|
||||||
local isInComboTeam = false
|
|
||||||
macro(10, function()
|
|
||||||
if shouldCloseWindow and storage[ComboPanelName].serverEnabled and storage[ComboPanelName].enabled then
|
|
||||||
local channelsWindow = modules.game_console.channelsWindow
|
|
||||||
if channelsWindow then
|
|
||||||
local child = channelsWindow:getChildById("buttonCancel")
|
|
||||||
if child then
|
|
||||||
child:onClick()
|
|
||||||
shouldCloseWindow = false
|
|
||||||
isInComboTeam = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
comboWindow.server.partyButton.onClick = function(widget)
|
|
||||||
if storage[ComboPanelName].serverEnabled and storage[ComboPanelName].enabled then
|
|
||||||
if storage[ComboPanelName].serverLeader:len() > 0 and storage.BotServerChannel:len() > 0 then
|
|
||||||
talkPrivate(storage[ComboPanelName].serverLeader, "request invite " .. storage.BotServerChannel)
|
|
||||||
else
|
|
||||||
error("Request failed. Lack of data.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
onTextMessage(function(mode, text)
|
|
||||||
if storage[ComboPanelName].serverEnabled and storage[ComboPanelName].enabled then
|
|
||||||
if mode == 20 then
|
|
||||||
if string.find(text, "invited you to") then
|
|
||||||
local regex = "[a-zA-Z]*"
|
|
||||||
local regexData = regexMatch(text, regex)
|
|
||||||
if regexData[1][1]:lower() == storage[ComboPanelName].serverLeader:lower() then
|
|
||||||
local leader = getCreatureByName(regexData[1][1])
|
|
||||||
if leader then
|
|
||||||
g_game.partyJoin(leader:getId())
|
|
||||||
g_game.requestChannels()
|
|
||||||
g_game.joinChannel(1)
|
|
||||||
shouldCloseWindow = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
onTalk(function(name, level, mode, text, channelId, pos)
|
|
||||||
if storage[ComboPanelName].serverEnabled and storage[ComboPanelName].enabled then
|
|
||||||
if mode == 4 then
|
|
||||||
if string.find(text, "request invite") then
|
|
||||||
local access = string.match(text, "%d.*")
|
|
||||||
if access and access == storage.BotServerChannel then
|
|
||||||
local minion = getCreatureByName(name)
|
|
||||||
if minion then
|
|
||||||
g_game.partyInvite(minion:getId())
|
|
||||||
if firstInvitee then
|
|
||||||
g_game.requestChannels()
|
|
||||||
g_game.joinChannel(1)
|
|
||||||
shouldCloseWindow = true
|
|
||||||
firstInvitee = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
talkPrivate(name, "Incorrect access key!")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- [[ End of Frosty's Code ]] --
|
|
||||||
if storage[ComboPanelName].enabled and storage[ComboPanelName].enabled then
|
|
||||||
if name:lower() == storage[ComboPanelName].sayLeader:lower() and string.find(text, storage[ComboPanelName].sayPhrase) and storage[ComboPanelName].onSayEnabled then
|
|
||||||
startCombo = true
|
|
||||||
end
|
|
||||||
if (storage[ComboPanelName].castLeader and name:lower() == storage[ComboPanelName].castLeader:lower()) and isAttSpell(text) and storage[ComboPanelName].onCastEnabled then
|
|
||||||
startCombo = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if storage[ComboPanelName].enabled and storage[ComboPanelName].commandsEnabled and (storage[ComboPanelName].shootLeader and name:lower() == storage[ComboPanelName].shootLeader:lower()) or (storage[ComboPanelName].sayLeader and name:lower() == storage[ComboPanelName].sayLeader:lower()) or (storage[ComboPanelName].castLeader and name:lower() == storage[ComboPanelName].castLeader:lower()) then
|
|
||||||
if string.find(text, "ue") then
|
|
||||||
say(storage[ComboPanelName].spell)
|
|
||||||
elseif string.find(text, "sd") then
|
|
||||||
local params = string.split(text, ",")
|
|
||||||
if #params == 2 then
|
|
||||||
local target = params[2]:trim()
|
|
||||||
if getCreatureByName(target) then
|
|
||||||
useWith(3155, getCreatureByName(target))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
elseif string.find(text, "att") then
|
|
||||||
local attParams = string.split(text, ",")
|
|
||||||
if #attParams == 2 then
|
|
||||||
local atTarget = attParams[2]:trim()
|
|
||||||
if getCreatureByName(atTarget) and storage[ComboPanelName].attack == "COMMAND TARGET" then
|
|
||||||
g_game.attack(getCreatureByName(atTarget))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if isAttSpell(text) and storage[ComboPanelName].enabled and storage[ComboPanelName].serverEnabled then
|
|
||||||
BotServer.send("trigger", "start")
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
onMissle(function(missle)
|
|
||||||
if storage[ComboPanelName].enabled and storage[ComboPanelName].onShootEnabled then
|
|
||||||
if not storage[ComboPanelName].shootLeader or storage[ComboPanelName].shootLeader:len() == 0 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local src = missle:getSource()
|
|
||||||
if src.z ~= posz() then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local from = g_map.getTile(src)
|
|
||||||
local to = g_map.getTile(missle:getDestination())
|
|
||||||
if not from or not to then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local fromCreatures = from:getCreatures()
|
|
||||||
local toCreatures = to:getCreatures()
|
|
||||||
if #fromCreatures ~= 1 or #toCreatures ~= 1 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local c1 = fromCreatures[1]
|
|
||||||
local t1 = toCreatures[1]
|
|
||||||
leaderTarget = t1
|
|
||||||
if c1:getName():lower() == storage[ComboPanelName].shootLeader:lower() then
|
|
||||||
if storage[ComboPanelName].attackItemEnabled and storage[ComboPanelName].item and storage[ComboPanelName].item > 100 and findItem(storage[ComboPanelName].item) then
|
|
||||||
useWith(storage[ComboPanelName].item, t1)
|
|
||||||
end
|
|
||||||
if storage[ComboPanelName].attackSpellEnabled and storage[ComboPanelName].spell:len() > 1 then
|
|
||||||
say(storage[ComboPanelName].spell)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
macro(10, function()
|
|
||||||
if not storage[ComboPanelName].enabled or not storage[ComboPanelName].attackLeaderTargetEnabled then return end
|
|
||||||
if leaderTarget and storage[ComboPanelName].attack == "LEADER TARGET" then
|
|
||||||
if not getTarget() or (getTarget() and getTarget():getName() ~= leaderTarget:getName()) then
|
|
||||||
g_game.attack(leaderTarget)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if storage[ComboPanelName].enabled and storage[ComboPanelName].serverEnabled and storage[ComboPanelName].attack == "SERVER LEADER TARGET" and serverTarget then
|
|
||||||
if serverTarget and not getTarget() or (getTarget() and getTarget():getname() ~= serverTarget)
|
|
||||||
then
|
|
||||||
g_game.attack(serverTarget)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
|
||||||
local toFollow
|
|
||||||
local toFollowPos = {}
|
|
||||||
|
|
||||||
macro(100, function()
|
|
||||||
toFollow = nil
|
|
||||||
if not storage[ComboPanelName].enabled or not storage[ComboPanelName].followLeaderEnabled then return end
|
|
||||||
if leaderTarget and storage[ComboPanelName].follow == "LEADER TARGET" and leaderTarget:isPlayer() then
|
|
||||||
toFollow = leaderTarget:getName()
|
|
||||||
elseif storage[ComboPanelName].follow == "SERVER LEADER TARGET" and storage[ComboPanelName].serverLeader:len() ~= 0 then
|
|
||||||
toFollow = serverTarget
|
|
||||||
elseif storage[ComboPanelName].follow == "SERVER LEADER" and storage[ComboPanelName].serverLeader:len() ~= 0 then
|
|
||||||
toFollow = storage[ComboPanelName].serverLeader
|
|
||||||
elseif storage[ComboPanelName].follow == "LEADER" then
|
|
||||||
if storage[ComboPanelName].onSayEnabled and storage[ComboPanelName].sayLeader:len() ~= 0 then
|
|
||||||
toFollow = storage[ComboPanelName].sayLeader
|
|
||||||
elseif storage[ComboPanelName].onCastEnabled and storage[ComboPanelName].castLeader:len() ~= 0 then
|
|
||||||
toFollow = storage[ComboPanelName].castLeader
|
|
||||||
elseif storage[ComboPanelName].onShootEnabled and storage[ComboPanelName].shootLeader:len() ~= 0 then
|
|
||||||
toFollow = storage[ComboPanelName].shootLeader
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not toFollow then return end
|
|
||||||
local target = getCreatureByName(toFollow)
|
|
||||||
if target then
|
|
||||||
local tpos = target:getPosition()
|
|
||||||
toFollowPos[tpos.z] = tpos
|
|
||||||
end
|
|
||||||
if player:isWalking() then return end
|
|
||||||
local p = toFollowPos[posz()]
|
|
||||||
if not p then return end
|
|
||||||
if CaveBot.walkTo(p, 20, {ignoreNonPathable=true, precision=1, ignoreStairs=false}) then
|
|
||||||
delay(100)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
onCreaturePositionChange(function(creature, oldPos, newPos)
|
|
||||||
if creature:getName() == toFollow and newPos then
|
|
||||||
toFollowPos[newPos.z] = newPos
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
local timeout = now
|
|
||||||
macro(10, function()
|
|
||||||
if storage[ComboPanelName].enabled and startCombo then
|
|
||||||
if storage[ComboPanelName].attackItemEnabled and storage[ComboPanelName].item and storage[ComboPanelName].item > 100 and findItem(storage[ComboPanelName].item) then
|
|
||||||
useWith(storage[ComboPanelName].item, getTarget())
|
|
||||||
end
|
|
||||||
if storage[ComboPanelName].attackSpellEnabled and storage[ComboPanelName].spell:len() > 1 then
|
|
||||||
say(storage[ComboPanelName].spell)
|
|
||||||
end
|
|
||||||
startCombo = false
|
|
||||||
end
|
|
||||||
-- attack part / server
|
|
||||||
if BotServer._websocket and storage[ComboPanelName].enabled and storage[ComboPanelName].serverEnabled then
|
|
||||||
if target() and now - timeout > 500 then
|
|
||||||
targetPos = target():getName()
|
|
||||||
BotServer.send("target", targetPos)
|
|
||||||
timeout = now
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
onUseWith(function(pos, itemId, target, subType)
|
|
||||||
if BotServer._websocket and itemId == 3155 then
|
|
||||||
BotServer.send("useWith", target:getPosition())
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
if BotServer._websocket and storage[ComboPanelName].enabled and storage[ComboPanelName].serverEnabled then
|
|
||||||
BotServer.listen("trigger", function(name, message)
|
|
||||||
if message == "start" and name:lower() ~= player:getName():lower() and name:lower() == storage[ComboPanelName].serverLeader:lower() and storage[ComboPanelName].serverTriggers then
|
|
||||||
startCombo = true
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
BotServer.listen("target", function(name, message)
|
|
||||||
if name:lower() ~= player:getName():lower() and name:lower() == storage[ComboPanelName].serverLeader:lower() then
|
|
||||||
if not target() or target():getName() == getCreatureByName(message) then
|
|
||||||
if storage[ComboPanelName].serverLeaderTarget then
|
|
||||||
serverTarget = getCreatureByName(message)
|
|
||||||
g_game.attack(getCreatureByName(message))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
BotServer.listen("useWith", function(name, message)
|
|
||||||
local tile = g_map.getTile(message)
|
|
||||||
if storage[ComboPanelName].serverTriggers and name:lower() ~= player:getName():lower() and name:lower() == storage[ComboPanelName].serverLeader:lower() and storage[ComboPanelName].attackItemEnabled and storage[ComboPanelName].item and findItem(storage[ComboPanelName].item) then
|
|
||||||
useWith(storage[ComboPanelName].item, tile:getTopUseThing())
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
@ -1,115 +0,0 @@
|
|||||||
setDefaultTab("Tools")
|
|
||||||
function quiverManager()
|
|
||||||
quiverPanelName = "quiverManager"
|
|
||||||
|
|
||||||
local ui = setupUI([[
|
|
||||||
Panel
|
|
||||||
height: 33
|
|
||||||
margin-top: 2
|
|
||||||
|
|
||||||
BotItem
|
|
||||||
id: BoltsID
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: parent.top
|
|
||||||
|
|
||||||
BotItem
|
|
||||||
id: ArrowsID
|
|
||||||
anchors.left: prev.right
|
|
||||||
anchors.verticalCenter: prev.verticalCenter
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: BoltsSwitch
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.bottom: prev.verticalCenter
|
|
||||||
anchors.right: parent.right
|
|
||||||
text: Sort Bolts
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: ArrowsSwitch
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.bottom: ArrowsID.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
text: Sort Arrows
|
|
||||||
|
|
||||||
]])
|
|
||||||
ui:setId(quiverPanelName)
|
|
||||||
|
|
||||||
if not storage[quiverPanelName] then
|
|
||||||
storage[quiverPanelName] = {
|
|
||||||
arrowsId = 35848,
|
|
||||||
boltsId = 35849,
|
|
||||||
bolts = false,
|
|
||||||
arrows = false
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
ui.BoltsSwitch:setOn(storage[quiverPanelName].bolts)
|
|
||||||
ui.BoltsSwitch.onClick = function(widget)
|
|
||||||
storage[quiverPanelName].bolts = not storage[quiverPanelName].bolts
|
|
||||||
widget:setOn(storage[quiverPanelName].bolts)
|
|
||||||
end
|
|
||||||
ui.ArrowsSwitch:setOn(storage[quiverPanelName].arrows)
|
|
||||||
ui.ArrowsSwitch.onClick = function(widget)
|
|
||||||
storage[quiverPanelName].arrows = not storage[quiverPanelName].arrows
|
|
||||||
widget:setOn(storage[quiverPanelName].arrows)
|
|
||||||
end
|
|
||||||
ui.BoltsID:setItemId(storage[quiverPanelName].boltsId)
|
|
||||||
ui.BoltsID.onItemChange = function(widget)
|
|
||||||
storage[quiverPanelName].boltsId = widget:getItemId()
|
|
||||||
end
|
|
||||||
ui.ArrowsID:setItemId(storage[quiverPanelName].arrowsId)
|
|
||||||
ui.ArrowsID.onItemChange = function(widget)
|
|
||||||
storage[quiverPanelName].arrowsId = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
local arrows = {16143, 763, 761, 7365, 3448, 762, 21470, 7364, 14251, 3447, 3449, 15793, 25757, 774}
|
|
||||||
local bolts = {6528, 7363, 3450, 16141, 25758, 14252, 3446, 16142}
|
|
||||||
|
|
||||||
macro(200, function()
|
|
||||||
local dArrow
|
|
||||||
local dBolt
|
|
||||||
for _, c in pairs(getContainers()) do
|
|
||||||
if not containerIsFull(c) then
|
|
||||||
if c:getContainerItem():getId() == storage[quiverPanelName].arrowsId and storage[quiverPanelName].arrows then
|
|
||||||
dArrow = c
|
|
||||||
elseif c:getContainerItem():getId() == storage[quiverPanelName].boltsId and storage[quiverPanelName].bolts then
|
|
||||||
dBolt = c
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if dArrow and storage[quiverPanelName].arrows then
|
|
||||||
for _, c in pairs(getContainers()) do
|
|
||||||
if c:getName():lower():find("backpack") or c:getName():lower():find("bag") or c:getName():lower():find("chess") then
|
|
||||||
for _, i in pairs(c:getItems()) do
|
|
||||||
if table.find(arrows, i:getId()) then
|
|
||||||
return g_game.move(i, dArrow:getSlotPosition(dArrow:getItemsCount()), i:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if dBolt and storage[quiverPanelName].bolts then
|
|
||||||
for _, c in pairs(getContainers()) do
|
|
||||||
if c:getName():lower():find("backpack") or c:getName():lower():find("bag") or c:getName():lower():find("chess") then
|
|
||||||
for _, i in pairs(c:getItems()) do
|
|
||||||
if table.find(bolts, i:getId()) then
|
|
||||||
return g_game.move(i, dBolt:getSlotPosition(dBolt:getItemsCount()), i:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
if voc() == 2 or voc() == 12 then
|
|
||||||
addSeparator()
|
|
||||||
UI.Label("[[ Quiver Manager ]]")
|
|
||||||
addSeparator()
|
|
||||||
quiverManager()
|
|
||||||
end
|
|
@ -1,402 +0,0 @@
|
|||||||
function SuppliesPanel(parent)
|
|
||||||
suppliesPanelName = "supplies"
|
|
||||||
if not parent then
|
|
||||||
parent = panel
|
|
||||||
end
|
|
||||||
|
|
||||||
if not SuppliesConfig[suppliesPanelName] then
|
|
||||||
SuppliesConfig[suppliesPanelName] = {
|
|
||||||
item1 = 0,
|
|
||||||
item2 = 0,
|
|
||||||
item3 = 0,
|
|
||||||
item4 = 0,
|
|
||||||
item5 = 0,
|
|
||||||
item6 = 0,
|
|
||||||
item7 = 0,
|
|
||||||
capValue = 0,
|
|
||||||
capSwitch = false,
|
|
||||||
SoftBoots = false,
|
|
||||||
staminaSwitch = false,
|
|
||||||
staminaValue = 900,
|
|
||||||
imbues = false,
|
|
||||||
item1Min = 0,
|
|
||||||
item1Max = 0,
|
|
||||||
item2Min = 0,
|
|
||||||
item2Max = 0,
|
|
||||||
item3Min = 0,
|
|
||||||
item3Max = 0,
|
|
||||||
item4Min = 0,
|
|
||||||
item4Max = 0,
|
|
||||||
item5Min = 0,
|
|
||||||
item5Max = 0,
|
|
||||||
item6Min = 0,
|
|
||||||
item6Max = 0,
|
|
||||||
item7Max = 0,
|
|
||||||
sortSupplies = false,
|
|
||||||
potionBp = 0,
|
|
||||||
runeBp = 0,
|
|
||||||
ammoBp = 0
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- data validation
|
|
||||||
local setup = SuppliesConfig[suppliesPanelName]
|
|
||||||
setup.item1 = setup.item1 or 0
|
|
||||||
setup.item2 = setup.item2 or 0
|
|
||||||
setup.item3 = setup.item3 or 0
|
|
||||||
setup.item4 = setup.item4 or 0
|
|
||||||
setup.item5 = setup.item5 or 0
|
|
||||||
setup.item6 = setup.item6 or 0
|
|
||||||
setup.item1Min = setup.item1Min or 0
|
|
||||||
setup.item1Max = setup.item1Max or 0
|
|
||||||
setup.item2Min = setup.item2Min or 0
|
|
||||||
setup.item2Max = setup.item2Max or 0
|
|
||||||
setup.item3Min = setup.item3Min or 0
|
|
||||||
setup.item3Max = setup.item3Max or 0
|
|
||||||
setup.item4Min = setup.item4Min or 0
|
|
||||||
setup.item4Max = setup.item4Max or 0
|
|
||||||
setup.item5Min = setup.item5Min or 0
|
|
||||||
setup.item5Max = setup.item5Max or 0
|
|
||||||
setup.item6Min = setup.item6Min or 0
|
|
||||||
setup.item6Max = setup.item6Max or 0
|
|
||||||
setup.capValue = setup.capValue or 0
|
|
||||||
setup.staminaValue = setup.staminaValue or 0
|
|
||||||
setup.potionBp = setup.potionBp or 0
|
|
||||||
setup.runeBp = setup.runeBp or 0
|
|
||||||
setup.ammoBp = setup.ammoBp or 0
|
|
||||||
|
|
||||||
rootWidget = g_ui.getRootWidget()
|
|
||||||
if rootWidget then
|
|
||||||
SuppliesWindow = g_ui.createWidget('SuppliesWindow', rootWidget)
|
|
||||||
SuppliesWindow:hide()
|
|
||||||
|
|
||||||
SuppliesWindow.capSwitch:setOn(SuppliesConfig[suppliesPanelName].capSwitch)
|
|
||||||
SuppliesWindow.capSwitch.onClick = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].capSwitch = not SuppliesConfig[suppliesPanelName].capSwitch
|
|
||||||
widget:setOn(SuppliesConfig[suppliesPanelName].capSwitch)
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.SoftBoots:setOn(SuppliesConfig[suppliesPanelName].SoftBoots)
|
|
||||||
SuppliesWindow.SoftBoots.onClick = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].SoftBoots = not SuppliesConfig[suppliesPanelName].SoftBoots
|
|
||||||
widget:setOn(SuppliesConfig[suppliesPanelName].SoftBoots)
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.imbues:setOn(SuppliesConfig[suppliesPanelName].imbues)
|
|
||||||
SuppliesWindow.imbues.onClick = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].imbues = not SuppliesConfig[suppliesPanelName].imbues
|
|
||||||
widget:setOn(SuppliesConfig[suppliesPanelName].imbues)
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.staminaSwitch:setOn(SuppliesConfig[suppliesPanelName].staminaSwitch)
|
|
||||||
SuppliesWindow.staminaSwitch.onClick = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].staminaSwitch = not SuppliesConfig[suppliesPanelName].staminaSwitch
|
|
||||||
widget:setOn(SuppliesConfig[suppliesPanelName].staminaSwitch)
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.SortSupplies:setOn(SuppliesConfig[suppliesPanelName].sortSupplies)
|
|
||||||
SuppliesWindow.SortSupplies.onClick = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].sortSupplies = not SuppliesConfig[suppliesPanelName].sortSupplies
|
|
||||||
widget:setOn(SuppliesConfig[suppliesPanelName].sortSupplies)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- bot items
|
|
||||||
|
|
||||||
SuppliesWindow.item1:setItemId(SuppliesConfig[suppliesPanelName].item1)
|
|
||||||
SuppliesWindow.item1.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].item1 = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item2:setItemId(SuppliesConfig[suppliesPanelName].item2)
|
|
||||||
SuppliesWindow.item2.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].item2 = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item3:setItemId(SuppliesConfig[suppliesPanelName].item3)
|
|
||||||
SuppliesWindow.item3.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].item3 = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item4:setItemId(SuppliesConfig[suppliesPanelName].item4)
|
|
||||||
SuppliesWindow.item4.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].item4 = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item5:setItemId(SuppliesConfig[suppliesPanelName].item5)
|
|
||||||
SuppliesWindow.item5.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].item5 = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item6:setItemId(SuppliesConfig[suppliesPanelName].item6)
|
|
||||||
SuppliesWindow.item6.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].item6 = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.PotionBp:setItemId(SuppliesConfig[suppliesPanelName].potionBp)
|
|
||||||
SuppliesWindow.PotionBp.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].potionBp = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.RuneBp:setItemId(SuppliesConfig[suppliesPanelName].runeBp)
|
|
||||||
SuppliesWindow.RuneBp.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].runeBp = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.AmmoBp:setItemId(SuppliesConfig[suppliesPanelName].ammoBp)
|
|
||||||
SuppliesWindow.AmmoBp.onItemChange = function(widget)
|
|
||||||
SuppliesConfig[suppliesPanelName].ammoBp = widget:getItemId()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- text windows
|
|
||||||
SuppliesWindow.capValue:setText(SuppliesConfig[suppliesPanelName].capValue)
|
|
||||||
SuppliesWindow.capValue.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.capValue:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.capValue:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].capValue = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].capValue = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item1Min:setText(SuppliesConfig[suppliesPanelName].item1Min)
|
|
||||||
SuppliesWindow.item1Min.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item1Min:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item1Min:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item1Min = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item1Min = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item1Max:setText(SuppliesConfig[suppliesPanelName].item1Max)
|
|
||||||
SuppliesWindow.item1Max.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item1Max:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item1Max:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item1Max = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item1Max = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item2Min:setText(SuppliesConfig[suppliesPanelName].item2Min)
|
|
||||||
SuppliesWindow.item2Min.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item2Min:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item2Min:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item2Min = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item2Min = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item2Max:setText(SuppliesConfig[suppliesPanelName].item2Max)
|
|
||||||
SuppliesWindow.item2Max.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item2Max:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item2Max:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item2Max = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item2Max = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item3Min:setText(SuppliesConfig[suppliesPanelName].item3Min)
|
|
||||||
SuppliesWindow.item3Min.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item3Min:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item3Min:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item3Min = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item3Min = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item3Max:setText(SuppliesConfig[suppliesPanelName].item3Max)
|
|
||||||
SuppliesWindow.item3Max.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item3Max:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item3Max:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item3Max = 0
|
|
||||||
else
|
|
||||||
SuppliesConfig[suppliesPanelName].item3Max = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item4Min:setText(SuppliesConfig[suppliesPanelName].item4Min)
|
|
||||||
SuppliesWindow.item4Min.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item4Min:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item4Min:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item4Min = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item4Min = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.staminaValue:setText(SuppliesConfig[suppliesPanelName].staminaValue)
|
|
||||||
SuppliesWindow.staminaValue.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.staminaValue:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.staminaValue:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].staminaValue = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].staminaValue = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item4Max:setText(SuppliesConfig[suppliesPanelName].item4Max)
|
|
||||||
SuppliesWindow.item4Max.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item4Max:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item4Max:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item4Max = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item4Max = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item5Min:setText(SuppliesConfig[suppliesPanelName].item5Min)
|
|
||||||
SuppliesWindow.item5Min.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item5Min:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item5Min:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item5Min = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item5Min = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item5Max:setText(SuppliesConfig[suppliesPanelName].item5Max)
|
|
||||||
SuppliesWindow.item5Max.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item5Max:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item5Max:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item5Max = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item5Max = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item6Min:setText(SuppliesConfig[suppliesPanelName].item6Min)
|
|
||||||
SuppliesWindow.item6Min.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item6Min:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item6Min:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item6Min = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item6Min = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
SuppliesWindow.item6Max:setText(SuppliesConfig[suppliesPanelName].item6Max)
|
|
||||||
SuppliesWindow.item6Max.onTextChange = function(widget, text)
|
|
||||||
local value = tonumber(SuppliesWindow.item6Max:getText())
|
|
||||||
if not value then
|
|
||||||
SuppliesWindow.item6Max:setText(0)
|
|
||||||
SuppliesConfig[suppliesPanelName].item6Max = 0
|
|
||||||
else
|
|
||||||
text = text:match("0*(%d+)")
|
|
||||||
SuppliesConfig[suppliesPanelName].item6Max = text
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
UI.Button("Supplies", function()
|
|
||||||
SuppliesWindow:show()
|
|
||||||
SuppliesWindow:raise()
|
|
||||||
SuppliesWindow:focus()
|
|
||||||
end)
|
|
||||||
|
|
||||||
SuppliesWindow.close.onClick = function(widget)
|
|
||||||
SuppliesWindow:hide()
|
|
||||||
vBotConfigSave("supply")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local potions = {23375, 268, 237, 238, 23373, 266, 236, 239, 7643, 7642, 23374}
|
|
||||||
local runes = {3725, 3203, 3161, 3147, 3178, 3177, 3153, 3148, 3197, 3149, 3164, 3166, 3200, 3192, 3188, 3190, 3189, 3191, 3198, 3182, 3158, 3152, 3174, 3180, 3165, 3173, 3172, 3176, 3195, 3179, 3175, 3155, 3202, 3160, 3156}
|
|
||||||
local ammo = {3446, 16142, 6528, 7363, 3450, 16141, 25785, 14252, 3447, 3449, 15793, 25757, 774, 16143, 763, 761, 7365, 3448, 762, 21470, 7364, 14251, 7368, 25759, 3287, 7366, 3298, 25758}
|
|
||||||
|
|
||||||
macro(250, function()
|
|
||||||
if not SuppliesConfig[suppliesPanelName].sortSupplies then return end
|
|
||||||
local sortPotions = SuppliesConfig[suppliesPanelName].potionBp > 100
|
|
||||||
local sortRunes = SuppliesConfig[suppliesPanelName].runeBp > 100
|
|
||||||
local sortAmmo = SuppliesConfig[suppliesPanelName].ammoBp > 100
|
|
||||||
local potionsContainer = nil
|
|
||||||
local runesContainer = nil
|
|
||||||
local ammoContainer = nil
|
|
||||||
|
|
||||||
-- set the containers
|
|
||||||
if not potionsContainer or not runesContainer or not ammoContainer then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if not containerIsFull(container) then
|
|
||||||
if sortPotions and container:getContainerItem():getId() == SuppliesConfig[suppliesPanelName].potionBp then
|
|
||||||
potionsContainer = container
|
|
||||||
elseif sortRunes and container:getContainerItem():getId() == SuppliesConfig[suppliesPanelName].runeBp then
|
|
||||||
runesContainer = container
|
|
||||||
elseif sortAmmo and container:getContainerItem():getId() == SuppliesConfig[suppliesPanelName].ammoBp then
|
|
||||||
ammoContainer = container
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- potions
|
|
||||||
if potionsContainer then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if (container:getContainerItem():getId() ~= SuppliesConfig[suppliesPanelName].potionBp and (string.find(container:getName(), "backpack") or string.find(container:getName(), "bag") or string.find(container:getName(), "chess"))) then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if table.find(potions, item:getId()) then
|
|
||||||
return g_game.move(item, potionsContainer:getSlotPosition(potionsContainer:getItemsCount()), item:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- runes
|
|
||||||
if runesContainer then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if (container:getContainerItem():getId() ~= SuppliesConfig[suppliesPanelName].runeBp and (string.find(container:getName(), "backpack") or string.find(container:getName(), "bag") or string.find(container:getName(), "chess"))) then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if table.find(runes, item:getId()) then
|
|
||||||
return g_game.move(item, runesContainer:getSlotPosition(runesContainer:getItemsCount()), item:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- ammo
|
|
||||||
if ammoContainer then
|
|
||||||
for i, container in pairs(getContainers()) do
|
|
||||||
if (container:getContainerItem():getId() ~= SuppliesConfig[suppliesPanelName].ammoBp and (string.find(container:getName(), "backpack") or string.find(container:getName(), "bag") or string.find(container:getName(), "chess"))) and not string.find(container:getName():lower(), "loot") then
|
|
||||||
for j, item in pairs(container:getItems()) do
|
|
||||||
if table.find(ammo, item:getId()) then
|
|
||||||
return g_game.move(item, ammoContainer:getSlotPosition(ammoContainer:getItemsCount()), item:getCount())
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
UI.Separator()
|
|
||||||
SuppliesPanel(setDefaultTab("Cave"))
|
|
60
modules/game_bot/default_configs/vBot_3.01/_Loader.lua
Normal file
60
modules/game_bot/default_configs/vBot_3.01/_Loader.lua
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
-- load all otui files, order doesn't matter
|
||||||
|
local configName = modules.game_bot.contentsPanel.config:getCurrentOption().text
|
||||||
|
|
||||||
|
local configFiles = g_resources.listDirectoryFiles("/bot/" .. configName .. "/vBot", true, false)
|
||||||
|
for i, file in ipairs(configFiles) do
|
||||||
|
local ext = file:split(".")
|
||||||
|
if ext[#ext]:lower() == "ui" or ext[#ext]:lower() == "otui" then
|
||||||
|
g_ui.importStyle(file)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function loadScript(name)
|
||||||
|
return dofile("/vBot/" .. name .. ".lua")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- here you can set manually order of scripts
|
||||||
|
-- libraries should be loaded first
|
||||||
|
local luaFiles = {
|
||||||
|
"main",
|
||||||
|
"vlib",
|
||||||
|
"new_cavebot_lib",
|
||||||
|
"configs", -- do not change this and above
|
||||||
|
"extras",
|
||||||
|
"playerlist",
|
||||||
|
"BotServer",
|
||||||
|
"alarms",
|
||||||
|
"Conditions",
|
||||||
|
"pushmax",
|
||||||
|
"combo",
|
||||||
|
"HealBot",
|
||||||
|
"Sio",
|
||||||
|
"AttackBot", -- last of major modules
|
||||||
|
"ingame_editor",
|
||||||
|
"Dropper",
|
||||||
|
"Containers",
|
||||||
|
"quiver_manager",
|
||||||
|
"tools",
|
||||||
|
"antiRs",
|
||||||
|
"cavebot",
|
||||||
|
"depot_withdraw",
|
||||||
|
"cast_food",
|
||||||
|
"eat_food",
|
||||||
|
"equip",
|
||||||
|
"exeta",
|
||||||
|
"info",
|
||||||
|
"jewellery_equipper",
|
||||||
|
"spy_level",
|
||||||
|
"supplies",
|
||||||
|
"depositer_config",
|
||||||
|
"npc_talk"
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, file in ipairs(luaFiles) do
|
||||||
|
loadScript(file)
|
||||||
|
end
|
||||||
|
|
||||||
|
setDefaultTab("Main")
|
||||||
|
UI.Separator()
|
||||||
|
UI.Label("Private Scripts:")
|
||||||
|
UI.Separator()
|
@ -2,7 +2,7 @@ CaveBot.Extensions.BuySupplies = {}
|
|||||||
|
|
||||||
CaveBot.Extensions.BuySupplies.setup = function()
|
CaveBot.Extensions.BuySupplies.setup = function()
|
||||||
CaveBot.registerAction("BuySupplies", "#C300FF", function(value, retries)
|
CaveBot.registerAction("BuySupplies", "#C300FF", function(value, retries)
|
||||||
local supplies = SuppliesConfig[suppliesPanelName]
|
local supplies = SuppliesConfig.supplies
|
||||||
local item1Count = itemAmount(supplies.item1)
|
local item1Count = itemAmount(supplies.item1)
|
||||||
local item2Count = itemAmount(supplies.item2)
|
local item2Count = itemAmount(supplies.item2)
|
||||||
local item3Count = itemAmount(supplies.item3)
|
local item3Count = itemAmount(supplies.item3)
|
@ -5,6 +5,7 @@ CaveBot.Extensions.ClearTile.setup = function()
|
|||||||
local data = string.split(value, ",")
|
local data = string.split(value, ",")
|
||||||
local pos = {x=tonumber(data[1]), y=tonumber(data[2]), z=tonumber(data[3])}
|
local pos = {x=tonumber(data[1]), y=tonumber(data[2]), z=tonumber(data[3])}
|
||||||
local doors
|
local doors
|
||||||
|
local pPos = player:getPosition()
|
||||||
if #data == 4 then
|
if #data == 4 then
|
||||||
doors = true
|
doors = true
|
||||||
end
|
end
|
||||||
@ -27,6 +28,7 @@ CaveBot.Extensions.ClearTile.setup = function()
|
|||||||
print("CaveBot[ClearTile]: can't find tile or tile is unreachable, skipping")
|
print("CaveBot[ClearTile]: can't find tile or tile is unreachable, skipping")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
local tPos = tile:getPosition()
|
||||||
|
|
||||||
-- no items on tile and walkability means we are done
|
-- no items on tile and walkability means we are done
|
||||||
if tile:isWalkable() and tile:getTopUseThing():isNotMoveable() and not tile:hasCreature() and not doors then
|
if tile:isWalkable() and tile:getTopUseThing():isNotMoveable() and not tile:hasCreature() and not doors then
|
@ -0,0 +1,96 @@
|
|||||||
|
CaveBot.Extensions.DWithdraw = {}
|
||||||
|
|
||||||
|
CaveBot.Extensions.DWithdraw.setup = function()
|
||||||
|
CaveBot.registerAction("dpwithdraw", "#002FFF", function(value, retries)
|
||||||
|
local capLimit
|
||||||
|
local data = string.split(value, ",")
|
||||||
|
if retries > 600 then
|
||||||
|
print("CaveBot[DepotWithdraw]: actions limit reached, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
local destContainer
|
||||||
|
local depotContainer
|
||||||
|
|
||||||
|
-- input validation
|
||||||
|
if not value or #data ~= 3 and #data ~= 4 then
|
||||||
|
warn("CaveBot[DepotWithdraw]: incorrect value!")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
local indexDp = tonumber(data[1]:trim())
|
||||||
|
local destName = data[2]:trim():lower()
|
||||||
|
local destId = tonumber(data[3]:trim())
|
||||||
|
if #data == 4 then
|
||||||
|
capLimit = tonumber(data[4]:trim())
|
||||||
|
end
|
||||||
|
|
||||||
|
-- cap check
|
||||||
|
if freecap() < (capLimit or 200) then
|
||||||
|
print("CaveBot[DepotWithdraw]: cap limit reached, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- containers
|
||||||
|
for i, container in ipairs(getContainers()) do
|
||||||
|
local cName = container:getName():lower()
|
||||||
|
if destName == cName then
|
||||||
|
destContainer = container
|
||||||
|
elseif cName:find("depot box") then
|
||||||
|
depotContainer = container
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not destContainer then
|
||||||
|
print("CaveBot[DepotWithdraw]: container not found!")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if containerIsFull(destContainer) then
|
||||||
|
for i, item in pairs(destContainer:getItems()) do
|
||||||
|
if item:getId() == destId then
|
||||||
|
g_game.open(item, destContainer)
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- stash validation
|
||||||
|
if depotContainer and #depotContainer:getItems() == 0 then
|
||||||
|
print("CaveBot[DepotWithdraw]: all items withdrawn")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if containerIsFull(destContainer) then
|
||||||
|
for i, item in pairs(destContainer:getItems()) do
|
||||||
|
if item:getId() == destId then
|
||||||
|
g_game.open(foundNextContainer, destContainer)
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print("CaveBot[DepotWithdraw]: loot containers full!")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if not CaveBot.OpenDepotBox(indexDp) then
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
|
||||||
|
CaveBot.PingDelay(2)
|
||||||
|
|
||||||
|
for i, container in pairs(g_game.getContainers()) do
|
||||||
|
if string.find(container:getName():lower(), "depot box") then
|
||||||
|
for j, item in ipairs(container:getItems()) do
|
||||||
|
g_game.move(item, destContainer:getSlotPosition(destContainer:getItemsCount()), item:getCount())
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return "retry"
|
||||||
|
end)
|
||||||
|
|
||||||
|
CaveBot.Editor.registerAction("dpwithdraw", "dpwithdraw", {
|
||||||
|
value="1, shopping bag, 21411",
|
||||||
|
title="Loot Withdraw",
|
||||||
|
description="insert index, destination container name and it's ID",
|
||||||
|
})
|
||||||
|
end
|
125
modules/game_bot/default_configs/vBot_3.01/cavebot/depositor.lua
Normal file
125
modules/game_bot/default_configs/vBot_3.01/cavebot/depositor.lua
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
CaveBot.Extensions.Depositor = {}
|
||||||
|
|
||||||
|
--local variables
|
||||||
|
local closedContainers = false
|
||||||
|
local reopenedContainers = false
|
||||||
|
local destination = nil
|
||||||
|
local lootTable = nil
|
||||||
|
|
||||||
|
local function resetCache()
|
||||||
|
closedContainers = false
|
||||||
|
reopenedContainers = false
|
||||||
|
destination = nil
|
||||||
|
lootTable = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local description = g_game.getClientVersion() > 960 and "No - just deposit \n Yes - also reopen loot containers" or "currently not supported, will be added in near future"
|
||||||
|
|
||||||
|
CaveBot.Extensions.Depositor.setup = function()
|
||||||
|
CaveBot.registerAction("depositor", "#002FFF", function(value, retries)
|
||||||
|
-- version check, TODO old tibia
|
||||||
|
if g_game.getClientVersion() < 960 then
|
||||||
|
warn("CaveBot[Depositor]: unsupported Tibia version, will be added in near future")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- loot list check
|
||||||
|
lootTable = lootTable or CaveBot.GetLootItems()
|
||||||
|
if #lootTable == 0 then
|
||||||
|
print("CaveBot[Depositor]: no items in loot list. Wrong TargetBot Config? Proceeding")
|
||||||
|
resetCache()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- backpacks etc
|
||||||
|
if value:lower() == "yes" then
|
||||||
|
-- reopening backpacks
|
||||||
|
if not reopenedContainers then
|
||||||
|
if not closedContainers then
|
||||||
|
if not CaveBot.CloseLootContainer() then
|
||||||
|
return "retry"
|
||||||
|
else
|
||||||
|
closedContainers = true
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if not CaveBot.OpenLootContainer() then
|
||||||
|
return "retry"
|
||||||
|
else
|
||||||
|
reopenedContainers = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- open next backpacks if no more loot
|
||||||
|
if not CaveBot.HasLootItems() then
|
||||||
|
local lootContainers = CaveBot.GetLootContainers()
|
||||||
|
for _, container in ipairs(getContainers()) do
|
||||||
|
local cId = container:getContainerItem():getId()
|
||||||
|
if table.find(lootContainers, cId) then
|
||||||
|
for i, item in ipairs(container:getItems()) do
|
||||||
|
if item:getId() == cId then
|
||||||
|
g_game.open(item, container)
|
||||||
|
delay(100)
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- couldn't find next container, so we done
|
||||||
|
print("CaveBot[Depositor]: all items stashed, no backpack to open next, proceeding")
|
||||||
|
resetCache()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- first check items
|
||||||
|
if retries == 0 then
|
||||||
|
if not CaveBot.HasLootItems() then -- resource consuming function
|
||||||
|
print("CaveBot[Depositor]: no items to stash, proceeding")
|
||||||
|
resetCache()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- next check retries
|
||||||
|
if retries > 400 then
|
||||||
|
print("CaveBot[Depositor]: Depositor actions limit reached, proceeding")
|
||||||
|
resetCache()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- reaching and opening depot
|
||||||
|
if not CaveBot.ReachAndOpenDepot() then
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- add delay to prevent bugging
|
||||||
|
CaveBot.PingDelay(2)
|
||||||
|
|
||||||
|
-- prep time and stashing
|
||||||
|
destination = destination or getContainerByName("Depot chest")
|
||||||
|
if not destination then return "retry" end
|
||||||
|
|
||||||
|
for _, container in pairs(getContainers()) do
|
||||||
|
local name = container:getName():lower()
|
||||||
|
if not name:find("depot") and not name:find("your inbox") then
|
||||||
|
for _, item in pairs(container:getItems()) do
|
||||||
|
local id = item:getId()
|
||||||
|
if table.find(lootTable, id) then
|
||||||
|
local index = getStashingIndex(id) or item:isStackable() and 1 or 0
|
||||||
|
CaveBot.StashItem(item, index, destination)
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- we gucci
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
|
||||||
|
CaveBot.Editor.registerAction("depositor", "depositor", {
|
||||||
|
value="no",
|
||||||
|
title="Depositor",
|
||||||
|
description=description,
|
||||||
|
})
|
||||||
|
end
|
@ -0,0 +1,89 @@
|
|||||||
|
CaveBot.Extensions.InWithdraw = {}
|
||||||
|
|
||||||
|
CaveBot.Extensions.InWithdraw.setup = function()
|
||||||
|
CaveBot.registerAction("inwithdraw", "#002FFF", function(value, retries)
|
||||||
|
local data = string.split(value, ",")
|
||||||
|
local withdrawId
|
||||||
|
local amount
|
||||||
|
|
||||||
|
-- validation
|
||||||
|
if #data ~= 2 then
|
||||||
|
warn("CaveBot[InboxWithdraw]: incorrect withdraw value")
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
withdrawId = tonumber(data[1])
|
||||||
|
amount = tonumber(data[2])
|
||||||
|
end
|
||||||
|
|
||||||
|
local currentAmount = itemAmount(withdrawId)
|
||||||
|
|
||||||
|
if currentAmount >= amount then
|
||||||
|
print("CaveBot[InboxWithdraw]: enough items, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if retries > 400 then
|
||||||
|
print("CaveBot[InboxWithdraw]: actions limit reached, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- actions
|
||||||
|
local inboxContainer = getContainerByName("your inbox")
|
||||||
|
delay(100)
|
||||||
|
if not inboxContainer then
|
||||||
|
if not CaveBot.ReachAndOpenInbox() then
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local inboxAmount = 0
|
||||||
|
if not inboxContainer then
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
for i, item in pairs(inboxContainer:getItems()) do
|
||||||
|
if item:getId() == withdrawId then
|
||||||
|
inboxAmount = inboxAmount + item:getCount()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if inboxAmount == 0 then
|
||||||
|
warn("CaveBot[InboxWithdraw]: not enough items in inbox container, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local destination
|
||||||
|
for i, container in pairs(getContainers()) do
|
||||||
|
if container:getCapacity() > #container:getItems() and not string.find(container:getName():lower(), "quiver") and not string.find(container:getName():lower(), "depot") and not string.find(container:getName():lower(), "loot") and not string.find(container:getName():lower(), "inbox") then
|
||||||
|
destination = container
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not destination then
|
||||||
|
print("CaveBot[InboxWithdraw]: couldn't find proper destination container, skipping")
|
||||||
|
return falsed
|
||||||
|
end
|
||||||
|
|
||||||
|
CaveBot.PingDelay(2)
|
||||||
|
|
||||||
|
for i, container in pairs(getContainers()) do
|
||||||
|
if string.find(container:getName():lower(), "your inbox") then
|
||||||
|
for j, item in pairs(container:getItems()) do
|
||||||
|
if item:getId() == withdrawId then
|
||||||
|
if item:isStackable() then
|
||||||
|
g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), math.min(item:getCount(), (amount - currentAmount)))
|
||||||
|
return "retry"
|
||||||
|
else
|
||||||
|
g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), 1)
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
return "retry"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
CaveBot.Editor.registerAction("inwithdraw", "in withdraw", {
|
||||||
|
value="id,amount",
|
||||||
|
title="Withdraw Items",
|
||||||
|
description="insert item id and amount",
|
||||||
|
})
|
||||||
|
end
|
@ -0,0 +1,119 @@
|
|||||||
|
CaveBot.Extensions.SupplyCheck = {}
|
||||||
|
|
||||||
|
local supplyRetries = 0
|
||||||
|
local missedChecks = 0
|
||||||
|
local time = nil
|
||||||
|
CaveBot.Extensions.SupplyCheck.setup = function()
|
||||||
|
CaveBot.registerAction("supplyCheck", "#db5a5a", function(value)
|
||||||
|
local data = string.split(value, ",")
|
||||||
|
local round = 0
|
||||||
|
local label = data[1]:trim()
|
||||||
|
local pos = nil
|
||||||
|
if #data == 4 then
|
||||||
|
pos = {x=tonumber(data[2]),y=tonumber(data[3]),z=tonumber(data[4])}
|
||||||
|
end
|
||||||
|
|
||||||
|
if pos then
|
||||||
|
if missedChecks >= 4 then
|
||||||
|
missedChecks = 0
|
||||||
|
supplyRetries = 0
|
||||||
|
print("CaveBot[SupplyCheck]: Missed 5 supply checks, proceeding with waypoints")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if getDistanceBetween(player:getPosition(), pos) > 10 then
|
||||||
|
missedChecks = missedChecks + 1
|
||||||
|
print("CaveBot[SupplyCheck]: Missed supply check! ".. 5-missedChecks .. " tries left before skipping.")
|
||||||
|
return CaveBot.gotoLabel(label)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if time then
|
||||||
|
round = math.ceil((now - time)/1000) .. "s"
|
||||||
|
else
|
||||||
|
round = ""
|
||||||
|
end
|
||||||
|
time = now
|
||||||
|
|
||||||
|
local supplies = SuppliesConfig.supplies
|
||||||
|
local softCount = itemAmount(6529) + itemAmount(3549)
|
||||||
|
local totalItem1 = itemAmount(supplies.item1)
|
||||||
|
local totalItem2 = itemAmount(supplies.item2)
|
||||||
|
local totalItem3 = itemAmount(supplies.item3)
|
||||||
|
local totalItem4 = itemAmount(supplies.item4)
|
||||||
|
local totalItem5 = itemAmount(supplies.item5)
|
||||||
|
local totalItem6 = itemAmount(supplies.item6)
|
||||||
|
|
||||||
|
if supplyRetries > (storage.extras.huntRoutes or 50) then
|
||||||
|
print("CaveBot[SupplyCheck]: Round limit reached, going back on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (supplies.imbues and player:getSkillLevel(11) == 0) then
|
||||||
|
print("CaveBot[SupplyCheck]: Imbues ran out. Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (supplies.staminaSwitch and stamina() < tonumber(supplies.staminaValue)) then
|
||||||
|
print("CaveBot[SupplyCheck]: Stamina ran out. Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (softCount < 1 and supplies.SoftBoots) then
|
||||||
|
print("CaveBot[SupplyCheck]: No soft boots left. Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (totalItem1 < tonumber(supplies.item1Min) and supplies.item1 > 100) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item1 .. "(only " .. totalItem1 .. " left). Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (totalItem2 < tonumber(supplies.item2Min) and supplies.item2 > 100) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item2 .. "(only " .. totalItem2 .. " left). Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (totalItem3 < tonumber(supplies.item3Min) and supplies.item3 > 100) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item3 .. "(only " .. totalItem3 .. " left). Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (totalItem4 < tonumber(supplies.item4Min) and supplies.item4 > 100) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item4 .. "(only " .. totalItem4 .. " left). Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (totalItem5 < tonumber(supplies.item5Min) and supplies.item5 > 100) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item5 .. "(only " .. totalItem5 .. " left). Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (totalItem6 < tonumber(supplies.item6Min) and supplies.item6 > 100) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough item: " .. supplies.item6 .. "(only " .. totalItem6 .. " left). Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif (freecap() < tonumber(supplies.capValue) and supplies.capSwitch) then
|
||||||
|
print("CaveBot[SupplyCheck]: Not enough capacity. Going on refill. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
elseif ForcedRefill then
|
||||||
|
print("CaveBot[SupplyCheck]: Forced refill, going back to city. Last round took: " .. round)
|
||||||
|
supplyRetries = 0
|
||||||
|
missedChecks = 0
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
print("CaveBot[SupplyCheck]: Enough supplies. Hunting. Round (" .. supplyRetries .. "/" .. (storage.extras.huntRoutes or 50) .."). Last round took: " .. round)
|
||||||
|
supplyRetries = supplyRetries + 1
|
||||||
|
missedChecks = 0
|
||||||
|
return CaveBot.gotoLabel(label)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
CaveBot.Editor.registerAction("supplycheck", "supply check", {
|
||||||
|
value=function() return "startHunt," .. posx() .. "," .. posy() .. "," .. posz() end,
|
||||||
|
title="Supply check label",
|
||||||
|
description="Insert here hunting start label",
|
||||||
|
})
|
||||||
|
end
|
@ -80,7 +80,7 @@ CaveBot.Extensions.Tasker.setup = function()
|
|||||||
|
|
||||||
-- let's cover markers now
|
-- let's cover markers now
|
||||||
if marker == 1 then -- starting task
|
if marker == 1 then -- starting task
|
||||||
NPC.Conversation("hi", "task", taskName, "yes")
|
CaveBot.Conversation("hi", "task", taskName, "yes")
|
||||||
delay(talkDelay*4)
|
delay(talkDelay*4)
|
||||||
|
|
||||||
storage.caveBotTasker.monster = monster
|
storage.caveBotTasker.monster = monster
|
||||||
@ -114,7 +114,7 @@ CaveBot.Extensions.Tasker.setup = function()
|
|||||||
|
|
||||||
|
|
||||||
elseif marker == 3 then -- reporting task
|
elseif marker == 3 then -- reporting task
|
||||||
NPC.Conversation("hi", "report", "task")
|
CaveBot.Conversation("hi", "report", "task")
|
||||||
delay(talkDelay*3)
|
delay(talkDelay*3)
|
||||||
|
|
||||||
resetTaskData()
|
resetTaskData()
|
@ -0,0 +1,45 @@
|
|||||||
|
CaveBot.Extensions.Withdraw = {}
|
||||||
|
|
||||||
|
CaveBot.Extensions.Withdraw.setup = function()
|
||||||
|
CaveBot.registerAction("withdraw", "#002FFF", function(value, retries)
|
||||||
|
-- validation
|
||||||
|
local data = string.split(value, ",")
|
||||||
|
if #data ~= 3 then
|
||||||
|
print("CaveBot[Withdraw]: incorrect data! skipping")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- variables declaration
|
||||||
|
local source = tonumber(data[1])
|
||||||
|
local id = tonumber(data[2])
|
||||||
|
local amount = tonumber(data[3])
|
||||||
|
|
||||||
|
-- validation for correct values
|
||||||
|
if not id or not amount then
|
||||||
|
print("CaveBot[Withdraw]: incorrect id or amount! skipping")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check for retries
|
||||||
|
if retries > 100 then
|
||||||
|
print("CaveBot[Withdraw]: actions limit reached, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check for items
|
||||||
|
if itemAmount(id) >= amount then
|
||||||
|
print("CaveBot[Withdraw]: enough items, proceeding")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
CaveBot.WithdrawItem(id, amount, source)
|
||||||
|
CaveBot.PingDelay()
|
||||||
|
return "retry"
|
||||||
|
end)
|
||||||
|
|
||||||
|
CaveBot.Editor.registerAction("withdraw", "withdraw", {
|
||||||
|
value="source,id,amount",
|
||||||
|
title="Withdraw Items",
|
||||||
|
description="index/inbox, item id and amount",
|
||||||
|
})
|
||||||
|
end
|
@ -2,8 +2,7 @@ local targetBotLure = false
|
|||||||
local targetCount = 0
|
local targetCount = 0
|
||||||
local delayValue = 0
|
local delayValue = 0
|
||||||
local lureMax = 0
|
local lureMax = 0
|
||||||
local delayedLure = false
|
local anchorPosition = nil
|
||||||
|
|
||||||
TargetBot.Creature.attack = function(params, targets, isLooting) -- params {config, creature, danger, priority}
|
TargetBot.Creature.attack = function(params, targets, isLooting) -- params {config, creature, danger, priority}
|
||||||
if player:isWalking() then
|
if player:isWalking() then
|
||||||
lastWalk = now
|
lastWalk = now
|
||||||
@ -91,8 +90,6 @@ TargetBot.Creature.walk = function(creature, config, targets)
|
|||||||
targetBotLure = false
|
targetBotLure = false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
delayedLure = config.dynamicLureDelay
|
|
||||||
targetCount = targets
|
targetCount = targets
|
||||||
delayValue = config.lureDelay
|
delayValue = config.lureDelay
|
||||||
|
|
||||||
@ -105,10 +102,12 @@ TargetBot.Creature.walk = function(creature, config, targets)
|
|||||||
if TargetBot.canLure() and (config.lure or config.lureCavebot or config.dynamicLure) and not (config.chase and creature:getHealthPercent() < 5) and not isTrapped then
|
if TargetBot.canLure() and (config.lure or config.lureCavebot or config.dynamicLure) and not (config.chase and creature:getHealthPercent() < 5) and not isTrapped then
|
||||||
local monsters = 0
|
local monsters = 0
|
||||||
if targetBotLure then
|
if targetBotLure then
|
||||||
|
anchorPosition = nil
|
||||||
return TargetBot.allowCaveBot(150)
|
return TargetBot.allowCaveBot(150)
|
||||||
else
|
else
|
||||||
if targets < config.lureCount then
|
if targets < config.lureCount then
|
||||||
if config.lureCavebot then
|
if config.lureCavebot then
|
||||||
|
anchorPosition = nil
|
||||||
return TargetBot.allowCaveBot(150)
|
return TargetBot.allowCaveBot(150)
|
||||||
else
|
else
|
||||||
local path = findPath(pos, cpos, 5, {ignoreNonPathable=true, precision=2})
|
local path = findPath(pos, cpos, 5, {ignoreNonPathable=true, precision=2})
|
||||||
@ -121,13 +120,20 @@ TargetBot.Creature.walk = function(creature, config, targets)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local currentDistance = findPath(pos, cpos, 10, {ignoreCreatures=true, ignoreNonPathable=true, ignoreCost=true})
|
local currentDistance = findPath(pos, cpos, 10, {ignoreCreatures=true, ignoreNonPathable=true, ignoreCost=true})
|
||||||
if config.chase and (creature:getHealthPercent() < 30 or not config.keepDistance) then
|
if config.chase and (creature:getHealthPercent() < (storage.extras.killUnder or 30) or not config.keepDistance) then
|
||||||
if #currentDistance > 1 then
|
if #currentDistance > 1 then
|
||||||
return TargetBot.walkTo(cpos, 10, {ignoreNonPathable=true, precision=1})
|
return TargetBot.walkTo(cpos, 10, {ignoreNonPathable=true, precision=1})
|
||||||
end
|
end
|
||||||
elseif config.keepDistance then
|
elseif config.keepDistance then
|
||||||
|
if not anchorPosition or distanceFromPlayer(anchorPosition) > config.anchorRange then
|
||||||
|
anchorPosition = pos
|
||||||
|
end
|
||||||
if #currentDistance ~= config.keepDistanceRange and #currentDistance ~= config.keepDistanceRange + 1 then
|
if #currentDistance ~= config.keepDistanceRange and #currentDistance ~= config.keepDistanceRange + 1 then
|
||||||
return TargetBot.walkTo(cpos, 10, {ignoreNonPathable=true, marginMin=config.keepDistanceRange, marginMax=config.keepDistanceRange + 1})
|
if config.anchor and anchorPosition and getDistanceBetween(pos, anchorPosition) <= config.anchorRange*2 then
|
||||||
|
return TargetBot.walkTo(cpos, 10, {ignoreNonPathable=true, marginMin=config.keepDistanceRange, marginMax=config.keepDistanceRange + 1, maxDistanceFrom={anchorPosition, config.anchorRange}})
|
||||||
|
else
|
||||||
|
return TargetBot.walkTo(cpos, 10, {ignoreNonPathable=true, marginMin=config.keepDistanceRange, marginMax=config.keepDistanceRange + 1})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -180,8 +186,6 @@ onPlayerPositionChange(function(newPos, oldPos)
|
|||||||
if TargetBot.isOff() then return end
|
if TargetBot.isOff() then return end
|
||||||
if not lureMax then return end
|
if not lureMax then return end
|
||||||
if storage.TargetBotDelayWhenPlayer then return end
|
if storage.TargetBotDelayWhenPlayer then return end
|
||||||
if not delayedLure then return end
|
|
||||||
|
|
||||||
|
|
||||||
if targetCount < lureMax/2 or not target() then return end
|
if targetCount < lureMax/2 or not target() then return end
|
||||||
CaveBot.delay(delayValue or 0)
|
CaveBot.delay(delayValue or 0)
|
@ -80,6 +80,7 @@ TargetBot.Creature.edit = function(config, callback) -- callback = function(newC
|
|||||||
addScrollBar("danger", "Danger", 0, 10, 1)
|
addScrollBar("danger", "Danger", 0, 10, 1)
|
||||||
addScrollBar("maxDistance", "Max distance", 1, 10, 10)
|
addScrollBar("maxDistance", "Max distance", 1, 10, 10)
|
||||||
addScrollBar("keepDistanceRange", "Keep distance", 1, 5, 1)
|
addScrollBar("keepDistanceRange", "Keep distance", 1, 5, 1)
|
||||||
|
addScrollBar("anchorRange", "Anchoring Range", 1, 10, 3)
|
||||||
addScrollBar("lureCount", "Classic Lure", 0, 5, 1)
|
addScrollBar("lureCount", "Classic Lure", 0, 5, 1)
|
||||||
addScrollBar("lureMin", "Dynamic lure min", 0, 9, 1)
|
addScrollBar("lureMin", "Dynamic lure min", 0, 9, 1)
|
||||||
addScrollBar("lureMax", "Dynamic lure max", 1, 9, 3)
|
addScrollBar("lureMax", "Dynamic lure max", 1, 9, 3)
|
||||||
@ -87,6 +88,7 @@ TargetBot.Creature.edit = function(config, callback) -- callback = function(newC
|
|||||||
|
|
||||||
addCheckBox("chase", "Chase", true)
|
addCheckBox("chase", "Chase", true)
|
||||||
addCheckBox("keepDistance", "Keep Distance", false)
|
addCheckBox("keepDistance", "Keep Distance", false)
|
||||||
|
addCheckBox("anchor", "Anchoring", false)
|
||||||
addCheckBox("dontLoot", "Don't loot", false)
|
addCheckBox("dontLoot", "Don't loot", false)
|
||||||
addCheckBox("lure", "Lure", false)
|
addCheckBox("lure", "Lure", false)
|
||||||
addCheckBox("lureCavebot", "Lure using cavebot", false)
|
addCheckBox("lureCavebot", "Lure using cavebot", false)
|
@ -26,15 +26,7 @@ TargetBot.Creature.calculatePriority = function(creature, config, path)
|
|||||||
-- extra priority for paladin diamond arrows
|
-- extra priority for paladin diamond arrows
|
||||||
if config.diamondArrows then
|
if config.diamondArrows then
|
||||||
local mobCount = getCreaturesInArea(creature:getPosition(), diamondArrowArea, 2)
|
local mobCount = getCreaturesInArea(creature:getPosition(), diamondArrowArea, 2)
|
||||||
if mobCount > 5 then
|
priority = priority + (mobCount * 4)
|
||||||
priority = priority + 4
|
|
||||||
elseif mobCount > 4 then
|
|
||||||
priority = priority + 3
|
|
||||||
elseif mobCount > 3 then
|
|
||||||
priority = priority + 2
|
|
||||||
elseif mobCount > 2 then
|
|
||||||
priority = priority + 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- extra priority for low health
|
-- extra priority for low health
|
@ -102,7 +102,7 @@ TargetBot.Looting.process = function(targets, dangerLevel)
|
|||||||
TargetBot.Looting.list = {}
|
TargetBot.Looting.list = {}
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
local loot = TargetBot.Looting.list[1]
|
local loot = storage.extras.lootLast and TargetBot.Looting.list[#TargetBot.Looting.list] or TargetBot.Looting.list[1]
|
||||||
if loot == nil then
|
if loot == nil then
|
||||||
status = ""
|
status = ""
|
||||||
return false
|
return false
|
||||||
@ -134,7 +134,7 @@ TargetBot.Looting.process = function(targets, dangerLevel)
|
|||||||
local dist = math.max(math.abs(pos.x-loot.pos.x), math.abs(pos.y-loot.pos.y))
|
local dist = math.max(math.abs(pos.x-loot.pos.x), math.abs(pos.y-loot.pos.y))
|
||||||
local maxRange = storage.extras.looting or 40
|
local maxRange = storage.extras.looting or 40
|
||||||
if loot.tries > 30 or loot.pos.z ~= pos.z or dist > maxRange then
|
if loot.tries > 30 or loot.pos.z ~= pos.z or dist > maxRange then
|
||||||
table.remove(TargetBot.Looting.list, 1)
|
table.remove(TargetBot.Looting.list, storage.extras.lootLast and #TargetBot.Looting.list or 1)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ TargetBot.Looting.process = function(targets, dangerLevel)
|
|||||||
|
|
||||||
local container = tile:getTopUseThing()
|
local container = tile:getTopUseThing()
|
||||||
if not container or not container:isContainer() then
|
if not container or not container:isContainer() then
|
||||||
table.remove(TargetBot.Looting.list, 1)
|
table.remove(TargetBot.Looting.list, storage.extras.lootLast and #TargetBot.Looting.list or 1)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -246,14 +246,14 @@ TargetBot.Looting.lootContainer = function(lootContainers, container)
|
|||||||
-- looting finished, remove container from list
|
-- looting finished, remove container from list
|
||||||
container.lootContainer = false
|
container.lootContainer = false
|
||||||
g_game.close(container)
|
g_game.close(container)
|
||||||
table.remove(TargetBot.Looting.list, 1)
|
table.remove(TargetBot.Looting.list, storage.extras.lootLast and #TargetBot.Looting.list or 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
onTextMessage(function(mode, text)
|
onTextMessage(function(mode, text)
|
||||||
if TargetBot.isOff() then return end
|
if TargetBot.isOff() then return end
|
||||||
if #TargetBot.Looting.list == 0 then return end
|
if #TargetBot.Looting.list == 0 then return end
|
||||||
if string.find(text:lower(), "you are not the owner") then -- if we are not the owners of corpse then its a waste of time to try to loot it
|
if string.find(text:lower(), "you are not the owner") then -- if we are not the owners of corpse then its a waste of time to try to loot it
|
||||||
table.remove(TargetBot.Looting.list, 1)
|
table.remove(TargetBot.Looting.list, storage.extras.lootLast and #TargetBot.Looting.list or 1)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
@ -955,7 +955,7 @@ macro(100, function()
|
|||||||
cast(entry.attack, entry.cd)
|
cast(entry.attack, entry.cd)
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
if not AttackBotConfig.isUsing and target():canShoot() then
|
if not vBot.isUsing and target():canShoot() then
|
||||||
g_game.useInventoryItemWith(entry.attack, target())
|
g_game.useInventoryItemWith(entry.attack, target())
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -965,7 +965,7 @@ macro(100, function()
|
|||||||
if entry.category == 6 or entry.category == 7 then
|
if entry.category == 6 or entry.category == 7 then
|
||||||
if getMonsters(4) >= entry.minMonsters then
|
if getMonsters(4) >= entry.minMonsters then
|
||||||
if type(entry.attack) == "number" then
|
if type(entry.attack) == "number" then
|
||||||
if not AttackBotConfig.isUsing then
|
if not vBot.isUsing then
|
||||||
g_game.useInventoryItemWith(entry.attack, target())
|
g_game.useInventoryItemWith(entry.attack, target())
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -992,7 +992,7 @@ macro(100, function()
|
|||||||
cast(entry.attack, entry.cd)
|
cast(entry.attack, entry.cd)
|
||||||
return
|
return
|
||||||
elseif entry.category == 8 and bestTile and bestTile.count >= entry.minMonsters then
|
elseif entry.category == 8 and bestTile and bestTile.count >= entry.minMonsters then
|
||||||
if not AttackBotConfig.isUsing then
|
if not vBot.isUsing then
|
||||||
g_game.useInventoryItemWith(entry.attack, bestTile.pos:getTopUseThing())
|
g_game.useInventoryItemWith(entry.attack, bestTile.pos:getTopUseThing())
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
@ -1003,7 +1003,7 @@ macro(100, function()
|
|||||||
if entry.category == 6 or entry.category == 7 then
|
if entry.category == 6 or entry.category == 7 then
|
||||||
if getMonsters(4) >= entry.minMonsters then
|
if getMonsters(4) >= entry.minMonsters then
|
||||||
if type(entry.attack) == "number" then
|
if type(entry.attack) == "number" then
|
||||||
if not AttackBotConfig.isUsing then
|
if not vBot.isUsing then
|
||||||
g_game.useInventoryItemWith(entry.attack, target())
|
g_game.useInventoryItemWith(entry.attack, target())
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -1018,7 +1018,7 @@ macro(100, function()
|
|||||||
if entry.category == 6 or entry.category == 7 then
|
if entry.category == 6 or entry.category == 7 then
|
||||||
if getMonsters(4) >= entry.minMonsters then
|
if getMonsters(4) >= entry.minMonsters then
|
||||||
if type(entry.attack) == "number" then
|
if type(entry.attack) == "number" then
|
||||||
if not AttackBotConfig.isUsing then
|
if not vBot.isUsing then
|
||||||
g_game.useInventoryItemWith(entry.attack, target())
|
g_game.useInventoryItemWith(entry.attack, target())
|
||||||
return
|
return
|
||||||
end
|
end
|
@ -34,7 +34,7 @@ end
|
|||||||
local channel = tostring(storage.BotServerChannel)
|
local channel = tostring(storage.BotServerChannel)
|
||||||
BotServer.init(name(), channel)
|
BotServer.init(name(), channel)
|
||||||
|
|
||||||
BotServerMembers = {}
|
vBot.BotServerMembers = {}
|
||||||
|
|
||||||
rootWidget = g_ui.getRootWidget()
|
rootWidget = g_ui.getRootWidget()
|
||||||
if rootWidget then
|
if rootWidget then
|
||||||
@ -189,7 +189,7 @@ BotServer.listen("voc", function(name, message)
|
|||||||
if message == "yes" and config.vocation then
|
if message == "yes" and config.vocation then
|
||||||
BotServer.send("voc", player:getVocation())
|
BotServer.send("voc", player:getVocation())
|
||||||
else
|
else
|
||||||
BotServerMembers[name] = message
|
vBot.BotServerMembers[name] = message
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
249
modules/game_bot/default_configs/vBot_3.01/vBot/Conditions.lua
Normal file
249
modules/game_bot/default_configs/vBot_3.01/vBot/Conditions.lua
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
setDefaultTab("HP")
|
||||||
|
local panelName = "ConditionPanel"
|
||||||
|
local ui = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 19
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: title
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-align: center
|
||||||
|
width: 130
|
||||||
|
!text: tr('Conditions')
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: conditionList
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-left: 3
|
||||||
|
height: 17
|
||||||
|
text: Setup
|
||||||
|
|
||||||
|
]])
|
||||||
|
ui:setId(panelName)
|
||||||
|
|
||||||
|
if not HealBotConfig[panelName] then
|
||||||
|
HealBotConfig[panelName] = {
|
||||||
|
enabled = false,
|
||||||
|
curePosion = false,
|
||||||
|
poisonCost = 20,
|
||||||
|
cureCurse = false,
|
||||||
|
curseCost = 80,
|
||||||
|
cureBleed = false,
|
||||||
|
bleedCost = 45,
|
||||||
|
cureBurn = false,
|
||||||
|
burnCost = 30,
|
||||||
|
cureElectrify = false,
|
||||||
|
electrifyCost = 22,
|
||||||
|
cureParalyse = false,
|
||||||
|
paralyseCost = 40,
|
||||||
|
paralyseSpell = "utani hur",
|
||||||
|
holdHaste = false,
|
||||||
|
hasteCost = 40,
|
||||||
|
hasteSpell = "utani hur",
|
||||||
|
holdUtamo = false,
|
||||||
|
utamoCost = 40,
|
||||||
|
holdUtana = false,
|
||||||
|
utanaCost = 440,
|
||||||
|
holdUtura = false,
|
||||||
|
uturaType = "",
|
||||||
|
uturaCost = 100,
|
||||||
|
ignoreInPz = true,
|
||||||
|
stopHaste = false
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = HealBotConfig[panelName]
|
||||||
|
|
||||||
|
ui.title:setOn(config.enabled)
|
||||||
|
ui.title.onClick = function(widget)
|
||||||
|
config.enabled = not config.enabled
|
||||||
|
widget:setOn(config.enabled)
|
||||||
|
vBotConfigSave("heal")
|
||||||
|
end
|
||||||
|
|
||||||
|
ui.conditionList.onClick = function(widget)
|
||||||
|
conditionsWindow:show()
|
||||||
|
conditionsWindow:raise()
|
||||||
|
conditionsWindow:focus()
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
local rootWidget = g_ui.getRootWidget()
|
||||||
|
if rootWidget then
|
||||||
|
conditionsWindow = UI.createWindow('ConditionsWindow', rootWidget)
|
||||||
|
conditionsWindow:hide()
|
||||||
|
|
||||||
|
-- text edits
|
||||||
|
conditionsWindow.Cure.PoisonCost:setText(config.poisonCost)
|
||||||
|
conditionsWindow.Cure.PoisonCost.onTextChange = function(widget, text)
|
||||||
|
config.poisonCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.CurseCost:setText(config.curseCost)
|
||||||
|
conditionsWindow.Cure.CurseCost.onTextChange = function(widget, text)
|
||||||
|
config.curseCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.BleedCost:setText(config.bleedCost)
|
||||||
|
conditionsWindow.Cure.BleedCost.onTextChange = function(widget, text)
|
||||||
|
config.bleedCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.BurnCost:setText(config.burnCost)
|
||||||
|
conditionsWindow.Cure.BurnCost.onTextChange = function(widget, text)
|
||||||
|
config.burnCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.ElectrifyCost:setText(config.electrifyCost)
|
||||||
|
conditionsWindow.Cure.ElectrifyCost.onTextChange = function(widget, text)
|
||||||
|
config.electrifyCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.ParalyseCost:setText(config.paralyseCost)
|
||||||
|
conditionsWindow.Cure.ParalyseCost.onTextChange = function(widget, text)
|
||||||
|
config.paralyseCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.ParalyseSpell:setText(config.paralyseSpell)
|
||||||
|
conditionsWindow.Cure.ParalyseSpell.onTextChange = function(widget, text)
|
||||||
|
config.paralyseSpell = text
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.HasteSpell:setText(config.hasteSpell)
|
||||||
|
conditionsWindow.Hold.HasteSpell.onTextChange = function(widget, text)
|
||||||
|
config.hasteSpell = text
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.HasteCost:setText(config.hasteCost)
|
||||||
|
conditionsWindow.Hold.HasteCost.onTextChange = function(widget, text)
|
||||||
|
config.hasteCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.UtamoCost:setText(config.utamoCost)
|
||||||
|
conditionsWindow.Hold.UtamoCost.onTextChange = function(widget, text)
|
||||||
|
config.utamoCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.UtanaCost:setText(config.utanaCost)
|
||||||
|
conditionsWindow.Hold.UtanaCost.onTextChange = function(widget, text)
|
||||||
|
config.utanaCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.UturaCost:setText(config.uturaCost)
|
||||||
|
conditionsWindow.Hold.UturaCost.onTextChange = function(widget, text)
|
||||||
|
config.uturaCost = tonumber(text)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- combo box
|
||||||
|
conditionsWindow.Hold.UturaType:setOption(config.uturaType)
|
||||||
|
conditionsWindow.Hold.UturaType.onOptionChange = function(widget)
|
||||||
|
config.uturaType = widget:getCurrentOption().text
|
||||||
|
end
|
||||||
|
|
||||||
|
-- checkboxes
|
||||||
|
conditionsWindow.Cure.CurePoison:setChecked(config.curePoison)
|
||||||
|
conditionsWindow.Cure.CurePoison.onClick = function(widget)
|
||||||
|
config.curePoison = not config.curePoison
|
||||||
|
widget:setChecked(config.curePoison)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.CureCurse:setChecked(config.cureCurse)
|
||||||
|
conditionsWindow.Cure.CureCurse.onClick = function(widget)
|
||||||
|
config.cureCurse = not config.cureCurse
|
||||||
|
widget:setChecked(config.cureCurse)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.CureBleed:setChecked(config.cureBleed)
|
||||||
|
conditionsWindow.Cure.CureBleed.onClick = function(widget)
|
||||||
|
config.cureBleed = not config.cureBleed
|
||||||
|
widget:setChecked(config.cureBleed)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.CureBurn:setChecked(config.cureBurn)
|
||||||
|
conditionsWindow.Cure.CureBurn.onClick = function(widget)
|
||||||
|
config.cureBurn = not config.cureBurn
|
||||||
|
widget:setChecked(config.cureBurn)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.CureElectrify:setChecked(config.cureElectrify)
|
||||||
|
conditionsWindow.Cure.CureElectrify.onClick = function(widget)
|
||||||
|
config.cureElectrify = not config.cureElectrify
|
||||||
|
widget:setChecked(config.cureElectrify)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Cure.CureParalyse:setChecked(config.cureParalyse)
|
||||||
|
conditionsWindow.Cure.CureParalyse.onClick = function(widget)
|
||||||
|
config.cureParalyse = not config.cureParalyse
|
||||||
|
widget:setChecked(config.cureParalyse)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.HoldHaste:setChecked(config.holdHaste)
|
||||||
|
conditionsWindow.Hold.HoldHaste.onClick = function(widget)
|
||||||
|
config.holdHaste = not config.holdHaste
|
||||||
|
widget:setChecked(config.holdHaste)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.HoldUtamo:setChecked(config.holdUtamo)
|
||||||
|
conditionsWindow.Hold.HoldUtamo.onClick = function(widget)
|
||||||
|
config.holdUtamo = not config.holdUtamo
|
||||||
|
widget:setChecked(config.holdUtamo)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.HoldUtana:setChecked(config.holdUtana)
|
||||||
|
conditionsWindow.Hold.HoldUtana.onClick = function(widget)
|
||||||
|
config.holdUtana = not config.holdUtana
|
||||||
|
widget:setChecked(config.holdUtana)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.HoldUtura:setChecked(config.holdUtura)
|
||||||
|
conditionsWindow.Hold.HoldUtura.onClick = function(widget)
|
||||||
|
config.holdUtura = not config.holdUtura
|
||||||
|
widget:setChecked(config.holdUtura)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.IgnoreInPz:setChecked(config.ignoreInPz)
|
||||||
|
conditionsWindow.Hold.IgnoreInPz.onClick = function(widget)
|
||||||
|
config.ignoreInPz = not config.ignoreInPz
|
||||||
|
widget:setChecked(config.ignoreInPz)
|
||||||
|
end
|
||||||
|
|
||||||
|
conditionsWindow.Hold.StopHaste:setChecked(config.stopHaste)
|
||||||
|
conditionsWindow.Hold.StopHaste.onClick = function(widget)
|
||||||
|
config.stopHaste = not config.stopHaste
|
||||||
|
widget:setChecked(config.stopHaste)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- buttons
|
||||||
|
conditionsWindow.closeButton.onClick = function(widget)
|
||||||
|
conditionsWindow:hide()
|
||||||
|
vBotConfigSave("heal")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local utanaCast = nil
|
||||||
|
macro(500, function()
|
||||||
|
if not config.enabled or modules.game_cooldown.isGroupCooldownIconActive(2) then return end
|
||||||
|
if hppercent() > 95 then
|
||||||
|
if config.curePoison and mana() >= config.poisonCost and isPoisioned() then say("exana pox")
|
||||||
|
elseif config.cureCurse and mana() >= config.curseCost and isCursed() then say("exana mort")
|
||||||
|
elseif config.cureBleed and mana() >= config.bleedCost and isBleeding() then say("exana kor")
|
||||||
|
elseif config.cureBurn and mana() >= config.burnCost and isBurning() then say("exana flam")
|
||||||
|
elseif config.cureElectrify and mana() >= config.electrifyCost and isEnergized() then say("exana vis")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (not config.ignoreInPz or not isInPz()) and config.holdUtura and mana() >= config.uturaCost and not hasPartyBuff() then say(config.uturaType)
|
||||||
|
elseif (not config.ignoreInPz or not isInPz()) and config.holdUtana and mana() >= config.utanaCost and (not utanaCast or (now - utanaCast > 120000)) then say("utana vid") utanaCast = now
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
macro(50, function()
|
||||||
|
if not config.enabled then return end
|
||||||
|
if (not config.ignoreInPz or not isInPz()) and config.holdUtamo and mana() >= config.utamoCost and not hasManaShield() then say("utamo vita")
|
||||||
|
elseif (not config.ignoreInPz or not isInPz()) and standTime() < 5000 and config.holdHaste and mana() >= config.hasteCost and not hasHaste() and not getSpellCoolDown(config.hasteSpell) and (not target() or not config.stopHaste or TargetBot.isCaveBotActionAllowed()) then say(config.hasteSpell)
|
||||||
|
elseif config.cureParalyse and mana() >= config.paralyseCost and isParalyzed() and not getSpellCoolDown(config.paralyseSpell) then say(config.paralyseSpell)
|
||||||
|
end
|
||||||
|
end)
|
527
modules/game_bot/default_configs/vBot_3.01/vBot/Containers.lua
Normal file
527
modules/game_bot/default_configs/vBot_3.01/vBot/Containers.lua
Normal file
@ -0,0 +1,527 @@
|
|||||||
|
setDefaultTab("Tools")
|
||||||
|
local panelName = "renameContainers"
|
||||||
|
if type(storage[panelName]) ~= "table" then
|
||||||
|
storage[panelName] = {
|
||||||
|
enabled = false;
|
||||||
|
purse = true;
|
||||||
|
all = true;
|
||||||
|
list = {
|
||||||
|
{
|
||||||
|
value = "Main Backpack",
|
||||||
|
enabled = true,
|
||||||
|
item = 9601,
|
||||||
|
min = false,
|
||||||
|
items = { 3081, 3048 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value = "Runes",
|
||||||
|
enabled = true,
|
||||||
|
item = 2866,
|
||||||
|
min = true,
|
||||||
|
items = { 3161, 3180 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value = "Money",
|
||||||
|
enabled = true,
|
||||||
|
item = 2871,
|
||||||
|
min = true,
|
||||||
|
items = { 3031, 3035, 3043 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value = "Purse",
|
||||||
|
enabled = true,
|
||||||
|
item = 23396,
|
||||||
|
min = true,
|
||||||
|
items = {}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = storage[panelName]
|
||||||
|
|
||||||
|
local renameContui = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 38
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: title
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-align: center
|
||||||
|
width: 130
|
||||||
|
!text: tr('Minimise Containers')
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: editContList
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-left: 3
|
||||||
|
height: 17
|
||||||
|
text: Setup
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: reopenCont
|
||||||
|
!text: tr('Reopen Containers')
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: 17
|
||||||
|
margin-top: 3
|
||||||
|
|
||||||
|
]])
|
||||||
|
renameContui:setId(panelName)
|
||||||
|
|
||||||
|
g_ui.loadUIFromString([[
|
||||||
|
BackpackName < Label
|
||||||
|
background-color: alpha
|
||||||
|
text-offset: 18 0
|
||||||
|
focusable: true
|
||||||
|
height: 16
|
||||||
|
|
||||||
|
CheckBox
|
||||||
|
id: enabled
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: 15
|
||||||
|
height: 15
|
||||||
|
margin-top: 2
|
||||||
|
margin-left: 3
|
||||||
|
|
||||||
|
$focus:
|
||||||
|
background-color: #00000055
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: state
|
||||||
|
!text: tr('M')
|
||||||
|
anchors.right: remove.left
|
||||||
|
margin-right: 5
|
||||||
|
width: 15
|
||||||
|
height: 15
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: remove
|
||||||
|
!text: tr('x')
|
||||||
|
!tooltip: tr('Remove')
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-right: 15
|
||||||
|
width: 15
|
||||||
|
height: 15
|
||||||
|
|
||||||
|
ContListsWindow < MainWindow
|
||||||
|
!text: tr('Container Names')
|
||||||
|
size: 445 170
|
||||||
|
@onEscape: self:hide()
|
||||||
|
|
||||||
|
TextList
|
||||||
|
id: itemList
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
size: 180 83
|
||||||
|
margin-top: 3
|
||||||
|
margin-bottom: 3
|
||||||
|
margin-left: 3
|
||||||
|
vertical-scrollbar: itemListScrollBar
|
||||||
|
|
||||||
|
VerticalScrollBar
|
||||||
|
id: itemListScrollBar
|
||||||
|
anchors.top: itemList.top
|
||||||
|
anchors.bottom: itemList.bottom
|
||||||
|
anchors.right: itemList.right
|
||||||
|
step: 14
|
||||||
|
pixels-scroll: true
|
||||||
|
|
||||||
|
VerticalSeparator
|
||||||
|
id: sep
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: itemList.right
|
||||||
|
anchors.bottom: separator.top
|
||||||
|
margin-top: 3
|
||||||
|
margin-bottom: 6
|
||||||
|
margin-left: 10
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: lblName
|
||||||
|
anchors.left: sep.right
|
||||||
|
anchors.top: sep.top
|
||||||
|
width: 70
|
||||||
|
text: Name:
|
||||||
|
margin-left: 10
|
||||||
|
margin-top: 3
|
||||||
|
|
||||||
|
TextEdit
|
||||||
|
id: contName
|
||||||
|
anchors.left: lblName.right
|
||||||
|
anchors.top: sep.top
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
Label
|
||||||
|
id: lblCont
|
||||||
|
anchors.left: lblName.left
|
||||||
|
anchors.verticalCenter: contId.verticalCenter
|
||||||
|
width: 70
|
||||||
|
text: Container:
|
||||||
|
|
||||||
|
BotItem
|
||||||
|
id: contId
|
||||||
|
anchors.left: contName.left
|
||||||
|
anchors.top: contName.bottom
|
||||||
|
margin-top: 3
|
||||||
|
|
||||||
|
BotContainer
|
||||||
|
id: sortList
|
||||||
|
anchors.left: prev.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 3
|
||||||
|
height: 32
|
||||||
|
|
||||||
|
Label
|
||||||
|
anchors.left: lblCont.left
|
||||||
|
anchors.verticalCenter: prev.verticalCenter
|
||||||
|
width: 70
|
||||||
|
text: Items:
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: addItem
|
||||||
|
anchors.right: contName.right
|
||||||
|
anchors.top: contName.bottom
|
||||||
|
margin-top: 5
|
||||||
|
text: Add
|
||||||
|
width: 40
|
||||||
|
font: cipsoftFont
|
||||||
|
|
||||||
|
HorizontalSeparator
|
||||||
|
id: separator
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.bottom: closeButton.top
|
||||||
|
margin-bottom: 8
|
||||||
|
|
||||||
|
CheckBox
|
||||||
|
id: all
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
text: Open All
|
||||||
|
tooltip: Opens all containers in main backpack.
|
||||||
|
width: 90
|
||||||
|
height: 15
|
||||||
|
margin-top: 2
|
||||||
|
margin-left: 3
|
||||||
|
|
||||||
|
CheckBox
|
||||||
|
id: purse
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
text: Open Purse
|
||||||
|
tooltip: Opens Store/Charm Purse
|
||||||
|
width: 90
|
||||||
|
height: 15
|
||||||
|
margin-top: 2
|
||||||
|
margin-left: 3
|
||||||
|
|
||||||
|
CheckBox
|
||||||
|
id: sort
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
text: Sort Items
|
||||||
|
tooltip: Sort items based on items widget
|
||||||
|
width: 90
|
||||||
|
height: 15
|
||||||
|
margin-top: 2
|
||||||
|
margin-left: 15
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: closeButton
|
||||||
|
!text: tr('Close')
|
||||||
|
font: cipsoftFont
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
size: 45 21
|
||||||
|
margin-top: 15
|
||||||
|
]])
|
||||||
|
|
||||||
|
function findItemsInArray(t, tfind)
|
||||||
|
local tArray = {}
|
||||||
|
for x,v in pairs(t) do
|
||||||
|
if type(v) == "table" then
|
||||||
|
local aItem = t[x].item
|
||||||
|
local aEnabled = t[x].enabled
|
||||||
|
if aItem then
|
||||||
|
if tfind and aItem == tfind then
|
||||||
|
return x
|
||||||
|
elseif not tfind then
|
||||||
|
if aEnabled then
|
||||||
|
table.insert(tArray, aItem)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not tfind then return tArray end
|
||||||
|
end
|
||||||
|
|
||||||
|
local lstBPs
|
||||||
|
|
||||||
|
|
||||||
|
local openContainer = function(id)
|
||||||
|
local t = {getRight(), getLeft(), getAmmo()} -- if more slots needed then add them here
|
||||||
|
for i=1,#t do
|
||||||
|
local slotItem = t[i]
|
||||||
|
if slotItem and slotItem:getId() == id then
|
||||||
|
return g_game.open(slotItem, nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, container in pairs(g_game.getContainers()) do
|
||||||
|
for i, item in ipairs(container:getItems()) do
|
||||||
|
if item:isContainer() and item:getId() == id then
|
||||||
|
return g_game.open(item, nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function reopenBackpacks()
|
||||||
|
lstBPs = findItemsInArray(config.list)
|
||||||
|
|
||||||
|
for _, container in pairs(g_game.getContainers()) do g_game.close(container) end
|
||||||
|
bpItem = getBack()
|
||||||
|
if bpItem ~= nil then
|
||||||
|
g_game.open(bpItem)
|
||||||
|
end
|
||||||
|
|
||||||
|
schedule(250, function()
|
||||||
|
local delay = 200
|
||||||
|
|
||||||
|
if config.purse then
|
||||||
|
local item = getPurse()
|
||||||
|
if item then
|
||||||
|
use(item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if config.all then
|
||||||
|
local nextContainers = {}
|
||||||
|
containers = getContainers()
|
||||||
|
for i, container in pairs(g_game.getContainers()) do
|
||||||
|
for i, item in ipairs(container:getItems()) do
|
||||||
|
if item:isContainer() then
|
||||||
|
if item:isContainer() and config.all then
|
||||||
|
table.insert(nextContainers, item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #nextContainers > 0 then
|
||||||
|
for i = 1, #nextContainers do
|
||||||
|
schedule(delay, function()
|
||||||
|
g_game.open(nextContainers[i], nil)
|
||||||
|
end)
|
||||||
|
delay = delay + 250
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for i=1,#lstBPs do
|
||||||
|
schedule(delay, function()
|
||||||
|
openContainer(lstBPs[i])
|
||||||
|
end)
|
||||||
|
delay = delay + 250
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
rootWidget = g_ui.getRootWidget()
|
||||||
|
if rootWidget then
|
||||||
|
contListWindow = UI.createWindow('ContListsWindow', rootWidget)
|
||||||
|
contListWindow:hide()
|
||||||
|
|
||||||
|
renameContui.editContList.onClick = function(widget)
|
||||||
|
contListWindow:show()
|
||||||
|
contListWindow:raise()
|
||||||
|
contListWindow:focus()
|
||||||
|
end
|
||||||
|
|
||||||
|
renameContui.reopenCont.onClick = function(widget)
|
||||||
|
reopenBackpacks()
|
||||||
|
end
|
||||||
|
|
||||||
|
renameContui.title:setOn(config.enabled)
|
||||||
|
renameContui.title.onClick = function(widget)
|
||||||
|
config.enabled = not config.enabled
|
||||||
|
widget:setOn(config.enabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
contListWindow.closeButton.onClick = function(widget)
|
||||||
|
contListWindow:hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
contListWindow.purse.onClick = function(widget)
|
||||||
|
config.purse = not config.purse
|
||||||
|
contListWindow.purse:setChecked(config.purse)
|
||||||
|
end
|
||||||
|
contListWindow.purse:setChecked(config.purse)
|
||||||
|
|
||||||
|
contListWindow.sort.onClick = function(widget)
|
||||||
|
config.sort = not config.sort
|
||||||
|
contListWindow.sort:setChecked(config.sort)
|
||||||
|
end
|
||||||
|
contListWindow.sort:setChecked(config.sort)
|
||||||
|
|
||||||
|
contListWindow.all.onClick = function(widget)
|
||||||
|
config.all = not config.all
|
||||||
|
contListWindow.all:setChecked(config.all)
|
||||||
|
label.enabled:setTooltip(config.all and 'Opens all containers in main backpack.' or 'Opens listed containers from main backpack.')
|
||||||
|
end
|
||||||
|
contListWindow.all:setChecked(config.all)
|
||||||
|
|
||||||
|
local function refreshSortList(k, t)
|
||||||
|
t = t or {}
|
||||||
|
UI.Container(function()
|
||||||
|
t = contListWindow.sortList:getItems()
|
||||||
|
config.list[k].items = t
|
||||||
|
end, true, nil, contListWindow.sortList)
|
||||||
|
contListWindow.sortList:setItems(t)
|
||||||
|
end
|
||||||
|
refreshSortList(t)
|
||||||
|
|
||||||
|
local refreshContNames = function(tFocus)
|
||||||
|
local storageVal = config.list
|
||||||
|
if storageVal and #storageVal > 0 then
|
||||||
|
for i, child in pairs(contListWindow.itemList:getChildren()) do
|
||||||
|
child:destroy()
|
||||||
|
end
|
||||||
|
for k, entry in pairs(storageVal) do
|
||||||
|
local label = g_ui.createWidget("BackpackName", contListWindow.itemList)
|
||||||
|
label.onMouseRelease = function()
|
||||||
|
contListWindow.contId:setItemId(entry.item)
|
||||||
|
contListWindow.contName:setText(entry.value)
|
||||||
|
if not entry.items then
|
||||||
|
entry.items = {}
|
||||||
|
end
|
||||||
|
contListWindow.sortList:setItems(entry.items)
|
||||||
|
refreshSortList(k, entry.items)
|
||||||
|
end
|
||||||
|
label.enabled.onClick = function(widget)
|
||||||
|
entry.enabled = not entry.enabled
|
||||||
|
label.enabled:setChecked(entry.enabled)
|
||||||
|
label.enabled:setTooltip(entry.enabled and 'Disable' or 'Enable')
|
||||||
|
label.enabled:setImageColor(entry.enabled and '#00FF00' or '#FF0000')
|
||||||
|
end
|
||||||
|
label.remove.onClick = function(widget)
|
||||||
|
table.removevalue(config.list, entry)
|
||||||
|
label:destroy()
|
||||||
|
end
|
||||||
|
label.state:setChecked(entry.min)
|
||||||
|
label.state.onClick = function(widget)
|
||||||
|
entry.min = not entry.min
|
||||||
|
label.state:setChecked(entry.min)
|
||||||
|
label.state:setColor(entry.min and '#00FF00' or '#FF0000')
|
||||||
|
label.state:setTooltip(entry.min and 'Open Minimised' or 'Do not minimise')
|
||||||
|
end
|
||||||
|
|
||||||
|
label:setText(entry.value)
|
||||||
|
label.enabled:setChecked(entry.enabled)
|
||||||
|
label.enabled:setTooltip(entry.enabled and 'Disable' or 'Enable')
|
||||||
|
label.enabled:setImageColor(entry.enabled and '#00FF00' or '#FF0000')
|
||||||
|
label.state:setColor(entry.min and '#00FF00' or '#FF0000')
|
||||||
|
label.state:setTooltip(entry.min and 'Open Minimised' or 'Do not minimise')
|
||||||
|
|
||||||
|
if tFocus and entry.item == tFocus then
|
||||||
|
tFocus = label
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if tFocus then contListWindow.itemList:focusChild(tFocus) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
contListWindow.addItem.onClick = function(widget)
|
||||||
|
local id = contListWindow.contId:getItemId()
|
||||||
|
local trigger = contListWindow.contName:getText()
|
||||||
|
|
||||||
|
if id > 100 and trigger:len() > 0 then
|
||||||
|
local ifind = findItemsInArray(config.list, id)
|
||||||
|
if ifind then
|
||||||
|
config.list[ifind] = { item = id, value = trigger, enabled = config.list[ifind].enabled, min = config.list[ifind].min, items = config.list[ifind].items}
|
||||||
|
else
|
||||||
|
table.insert(config.list, { item = id, value = trigger, enabled = true, min = false, items = {} })
|
||||||
|
end
|
||||||
|
contListWindow.contId:setItemId(0)
|
||||||
|
contListWindow.contName:setText('')
|
||||||
|
contListWindow.contName:setColor('white')
|
||||||
|
contListWindow.contName:setImageColor('#ffffff')
|
||||||
|
contListWindow.contId:setImageColor('#ffffff')
|
||||||
|
refreshContNames(id)
|
||||||
|
else
|
||||||
|
contListWindow.contId:setImageColor('red')
|
||||||
|
contListWindow.contName:setImageColor('red')
|
||||||
|
contListWindow.contName:setColor('red')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
refreshContNames()
|
||||||
|
end
|
||||||
|
|
||||||
|
onContainerOpen(function(container, previousContainer)
|
||||||
|
if renameContui.title:isOn() then
|
||||||
|
if not previousContainer then
|
||||||
|
if not container.window then return end
|
||||||
|
containerWindow = container.window
|
||||||
|
containerWindow:setContentHeight(34)
|
||||||
|
local storageVal = config.list
|
||||||
|
if storageVal and #storageVal > 0 then
|
||||||
|
for _, entry in pairs(storageVal) do
|
||||||
|
if entry.enabled and string.find(container:getContainerItem():getId(), entry.item) then
|
||||||
|
if entry.min then
|
||||||
|
containerWindow:minimize()
|
||||||
|
end
|
||||||
|
containerWindow:setText(entry.value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local function moveItem(item, destination)
|
||||||
|
return g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), item:getCount())
|
||||||
|
end
|
||||||
|
|
||||||
|
local function properTable(t)
|
||||||
|
local r = {}
|
||||||
|
|
||||||
|
for _, entry in pairs(t) do
|
||||||
|
table.insert(r, entry.id)
|
||||||
|
end
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
|
||||||
|
macro(100, function()
|
||||||
|
if not config.sort then return end
|
||||||
|
|
||||||
|
local storageVal = config.list
|
||||||
|
for _, entry in pairs(storageVal) do
|
||||||
|
local dId = entry.item
|
||||||
|
local items = properTable(entry.items)
|
||||||
|
|
||||||
|
for _, container in pairs(getContainers()) do
|
||||||
|
local cName = container:getName():lower()
|
||||||
|
if not cName:find("depot") and not cName:find("depot") and not cName:find("quiver") then
|
||||||
|
local cId = container:getContainerItem():getId()
|
||||||
|
for __, item in ipairs(container:getItems()) do
|
||||||
|
local id = item:getId()
|
||||||
|
if table.find(items, id) and cId ~= dId then
|
||||||
|
local destination = getContainerByItem(dId)
|
||||||
|
if destination and not containerIsFull(destination) then
|
||||||
|
return moveItem(item, destination)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
delay(900)
|
||||||
|
end)
|
146
modules/game_bot/default_configs/vBot_3.01/vBot/Dropper.lua
Normal file
146
modules/game_bot/default_configs/vBot_3.01/vBot/Dropper.lua
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
setDefaultTab("Tools")
|
||||||
|
|
||||||
|
local ui = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 19
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: title
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-align: center
|
||||||
|
width: 130
|
||||||
|
!text: tr('Dropper')
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: edit
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-left: 3
|
||||||
|
height: 17
|
||||||
|
text: Edit
|
||||||
|
]])
|
||||||
|
|
||||||
|
local edit = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 150
|
||||||
|
|
||||||
|
Label
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-top: 5
|
||||||
|
text-align: center
|
||||||
|
text: Trash:
|
||||||
|
|
||||||
|
BotContainer
|
||||||
|
id: TrashItems
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: 32
|
||||||
|
|
||||||
|
Label
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 5
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
text-align: center
|
||||||
|
text: Use:
|
||||||
|
|
||||||
|
BotContainer
|
||||||
|
id: UseItems
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: 32
|
||||||
|
|
||||||
|
Label
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
margin-top: 5
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
text-align: center
|
||||||
|
text: Drop if below 150 cap:
|
||||||
|
|
||||||
|
BotContainer
|
||||||
|
id: CapItems
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
height: 32
|
||||||
|
]])
|
||||||
|
edit:hide()
|
||||||
|
|
||||||
|
if not storage.dropper then
|
||||||
|
storage.dropper = {
|
||||||
|
enabled = false,
|
||||||
|
trashItems = { 283, 284, 285 },
|
||||||
|
useItems = { 21203, 14758 },
|
||||||
|
capItems = { 21175 }
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = storage.dropper
|
||||||
|
|
||||||
|
local showEdit = false
|
||||||
|
ui.edit.onClick = function(widget)
|
||||||
|
showEdit = not showEdit
|
||||||
|
if showEdit then
|
||||||
|
edit:show()
|
||||||
|
else
|
||||||
|
edit:hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ui.title:setOn(config.enabled)
|
||||||
|
ui.title.onClick = function(widget)
|
||||||
|
config.enabled = not config.enabled
|
||||||
|
ui.title:setOn(config.enabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
UI.Container(function()
|
||||||
|
config.trashItems = edit.TrashItems:getItems()
|
||||||
|
end, true, nil, edit.TrashItems)
|
||||||
|
edit.TrashItems:setItems(config.trashItems)
|
||||||
|
|
||||||
|
UI.Container(function()
|
||||||
|
config.useItems = edit.UseItems:getItems()
|
||||||
|
end, true, nil, edit.UseItems)
|
||||||
|
edit.UseItems:setItems(config.useItems)
|
||||||
|
|
||||||
|
UI.Container(function()
|
||||||
|
config.capItems = edit.CapItems:getItems()
|
||||||
|
end, true, nil, edit.CapItems)
|
||||||
|
edit.CapItems:setItems(config.capItems)
|
||||||
|
|
||||||
|
local function properTable(t)
|
||||||
|
local r = {}
|
||||||
|
|
||||||
|
for _, entry in pairs(t) do
|
||||||
|
table.insert(r, entry.id)
|
||||||
|
end
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
|
||||||
|
macro(200, function()
|
||||||
|
if not config.enabled then return end
|
||||||
|
local tables = {properTable(config.capItems), properTable(config.useItems), properTable(config.trashItems)}
|
||||||
|
|
||||||
|
local containers = getContainers()
|
||||||
|
for i=1,3 do
|
||||||
|
for _, container in pairs(containers) do
|
||||||
|
for __, item in ipairs(container:getItems()) do
|
||||||
|
for ___, userItem in ipairs(tables[i]) do
|
||||||
|
if item:getId() == userItem then
|
||||||
|
return i == 1 and freecap() < 150 and g_game.move(item, pos(), item:getCount()) or
|
||||||
|
i == 2 and use(item) or
|
||||||
|
g_game.move(item, pos(), item:getCount())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end)
|
@ -554,7 +554,11 @@ if rootWidget then
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- spells
|
-- spells
|
||||||
|
local lastMana = mana()
|
||||||
|
local standBySpells = false
|
||||||
|
local iterationsSpells = 0
|
||||||
macro(100, function()
|
macro(100, function()
|
||||||
|
if standBySpells then return end
|
||||||
if not currentSettings.enabled or modules.game_cooldown.isGroupCooldownIconActive(2) or #currentSettings.spellTable == 0 then return end
|
if not currentSettings.enabled or modules.game_cooldown.isGroupCooldownIconActive(2) or #currentSettings.spellTable == 0 then return end
|
||||||
|
|
||||||
for _, entry in pairs(currentSettings.spellTable) do
|
for _, entry in pairs(currentSettings.spellTable) do
|
||||||
@ -616,14 +620,18 @@ macro(100, function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
standBySpells = true
|
||||||
|
lastMana = mana()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- items
|
-- items
|
||||||
|
local standByItems = false
|
||||||
macro(100, function()
|
macro(100, function()
|
||||||
|
if standByItems then return end
|
||||||
if not currentSettings.enabled or #currentSettings.itemTable == 0 then return end
|
if not currentSettings.enabled or #currentSettings.itemTable == 0 then return end
|
||||||
if currentSettings.Delay and storage.isUsing then return end
|
if currentSettings.Delay and vBot.isUsing then return end
|
||||||
if currentSettings.MessageDelay and storage.isUsingPotion then return end
|
if currentSettings.MessageDelay and vBot.isUsingPotion then return end
|
||||||
|
|
||||||
if not currentSettings.MessageDelay then
|
if not currentSettings.MessageDelay then
|
||||||
delay(400)
|
delay(400)
|
||||||
@ -698,5 +706,23 @@ macro(100, function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
standByItems = true
|
||||||
|
lastMana = mana()
|
||||||
end)
|
end)
|
||||||
UI.Separator()
|
UI.Separator()
|
||||||
|
|
||||||
|
onAddThing(function(tile, thing)
|
||||||
|
if thing == player then return end
|
||||||
|
if getDistanceBetween(tile:getPosition(), player:getPosition()) == 0 then
|
||||||
|
standByItems = false
|
||||||
|
standBySpells = false
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
macro(5000, function()
|
||||||
|
if (standByItems or standBySpells) and mana() >= lastMana then
|
||||||
|
lastMana = mana()
|
||||||
|
standByItems = false
|
||||||
|
standBySpells = false
|
||||||
|
end
|
||||||
|
end)
|
@ -165,7 +165,7 @@ Panel
|
|||||||
local function isValid(name)
|
local function isValid(name)
|
||||||
if not newTibia then return true end
|
if not newTibia then return true end
|
||||||
|
|
||||||
local voc = BotServerMembers[name]
|
local voc = vBot.BotServerMembers[name]
|
||||||
if not voc then return true end
|
if not voc then return true end
|
||||||
|
|
||||||
if voc == 11 then voc = 1
|
if voc == 11 then voc = 1
|
180
modules/game_bot/default_configs/vBot_3.01/vBot/alarms.lua
Normal file
180
modules/game_bot/default_configs/vBot_3.01/vBot/alarms.lua
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
local panelName = "alarms"
|
||||||
|
local ui = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 19
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: title
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-align: center
|
||||||
|
width: 130
|
||||||
|
!text: tr('Alarms')
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: alerts
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-left: 3
|
||||||
|
height: 17
|
||||||
|
text: Edit
|
||||||
|
|
||||||
|
]])
|
||||||
|
ui:setId(panelName)
|
||||||
|
|
||||||
|
if not storage[panelName] then
|
||||||
|
storage[panelName] = {
|
||||||
|
enabled = false,
|
||||||
|
playerAttack = false,
|
||||||
|
playerDetected = false,
|
||||||
|
playerDetectedLogout = false,
|
||||||
|
creatureDetected = false,
|
||||||
|
healthBelow = false,
|
||||||
|
healthValue = 40,
|
||||||
|
manaBelow = false,
|
||||||
|
manaValue = 50,
|
||||||
|
privateMessage = false
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = storage[panelName]
|
||||||
|
|
||||||
|
ui.title:setOn(config.enabled)
|
||||||
|
ui.title.onClick = function(widget)
|
||||||
|
config.enabled = not config.enabled
|
||||||
|
widget:setOn(config.enabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
rootWidget = g_ui.getRootWidget()
|
||||||
|
if rootWidget then
|
||||||
|
alarmsWindow = UI.createWindow('AlarmsWindow', rootWidget)
|
||||||
|
alarmsWindow:hide()
|
||||||
|
|
||||||
|
alarmsWindow.closeButton.onClick = function(widget)
|
||||||
|
alarmsWindow:hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.playerAttack:setOn(config.playerAttack)
|
||||||
|
alarmsWindow.playerAttack.onClick = function(widget)
|
||||||
|
config.playerAttack = not config.playerAttack
|
||||||
|
widget:setOn(config.playerAttack)
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.playerDetected:setOn(config.playerDetected)
|
||||||
|
alarmsWindow.playerDetected.onClick = function(widget)
|
||||||
|
config.playerDetected = not config.playerDetected
|
||||||
|
widget:setOn(config.playerDetected)
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.playerDetectedLogout:setChecked(config.playerDetectedLogout)
|
||||||
|
alarmsWindow.playerDetectedLogout.onClick = function(widget)
|
||||||
|
config.playerDetectedLogout = not config.playerDetectedLogout
|
||||||
|
widget:setChecked(config.playerDetectedLogout)
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.creatureDetected:setOn(config.creatureDetected)
|
||||||
|
alarmsWindow.creatureDetected.onClick = function(widget)
|
||||||
|
config.creatureDetected = not config.creatureDetected
|
||||||
|
widget:setOn(config.creatureDetected)
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.healthBelow:setOn(config.healthBelow)
|
||||||
|
alarmsWindow.healthBelow.onClick = function(widget)
|
||||||
|
config.healthBelow = not config.healthBelow
|
||||||
|
widget:setOn(config.healthBelow)
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.healthValue.onValueChange = function(scroll, value)
|
||||||
|
config.healthValue = value
|
||||||
|
alarmsWindow.healthBelow:setText("Health < " .. config.healthValue .. "%")
|
||||||
|
end
|
||||||
|
alarmsWindow.healthValue:setValue(config.healthValue)
|
||||||
|
|
||||||
|
alarmsWindow.manaBelow:setOn(config.manaBelow)
|
||||||
|
alarmsWindow.manaBelow.onClick = function(widget)
|
||||||
|
config.manaBelow = not config.manaBelow
|
||||||
|
widget:setOn(config.manaBelow)
|
||||||
|
end
|
||||||
|
|
||||||
|
alarmsWindow.manaValue.onValueChange = function(scroll, value)
|
||||||
|
config.manaValue = value
|
||||||
|
alarmsWindow.manaBelow:setText("Mana < " .. config.manaValue .. "%")
|
||||||
|
end
|
||||||
|
alarmsWindow.manaValue:setValue(config.manaValue)
|
||||||
|
|
||||||
|
alarmsWindow.privateMessage:setOn(config.privateMessage)
|
||||||
|
alarmsWindow.privateMessage.onClick = function(widget)
|
||||||
|
config.privateMessage = not config.privateMessage
|
||||||
|
widget:setOn(config.privateMessage)
|
||||||
|
end
|
||||||
|
|
||||||
|
onTextMessage(function(mode, text)
|
||||||
|
if config.enabled and config.playerAttack and mode == 16 and string.match(text, "hitpoints due to an attack") and not string.match(text, "hitpoints due to an attack by a ") then
|
||||||
|
playSound("/sounds/Player_Attack.ogg")
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
macro(100, function()
|
||||||
|
if not config.enabled then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if config.playerDetected then
|
||||||
|
for _, spec in ipairs(getSpectators()) do
|
||||||
|
if spec:isPlayer() and spec:getName() ~= name() then
|
||||||
|
specPos = spec:getPosition()
|
||||||
|
if math.max(math.abs(posx()-specPos.x), math.abs(posy()-specPos.y)) <= 8 then
|
||||||
|
playSound("/sounds/Player_Detected.ogg")
|
||||||
|
delay(1500)
|
||||||
|
if config.playerDetectedLogout then
|
||||||
|
modules.game_interface.tryLogout(false)
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if config.creatureDetected then
|
||||||
|
for _, spec in ipairs(getSpectators()) do
|
||||||
|
if not spec:isPlayer()then
|
||||||
|
specPos = spec:getPosition()
|
||||||
|
if math.max(math.abs(posx()-specPos.x), math.abs(posy()-specPos.y)) <= 8 then
|
||||||
|
playSound("/sounds/Creature_Detected.ogg")
|
||||||
|
delay(1500)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if config.healthBelow then
|
||||||
|
if hppercent() <= config.healthValue then
|
||||||
|
playSound("/sounds/Low_Health.ogg")
|
||||||
|
delay(1500)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if config.manaBelow then
|
||||||
|
if manapercent() <= config.manaValue then
|
||||||
|
playSound("/sounds/Low_Mana.ogg")
|
||||||
|
delay(1500)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
onTalk(function(name, level, mode, text, channelId, pos)
|
||||||
|
if mode == 4 and config.enabled and config.privateMessage then
|
||||||
|
playSound("/sounds/Private_Message.ogg")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
ui.alerts.onClick = function(widget)
|
||||||
|
alarmsWindow:show()
|
||||||
|
alarmsWindow:raise()
|
||||||
|
alarmsWindow:focus()
|
||||||
|
end
|
@ -5,7 +5,6 @@ local frags = 0
|
|||||||
onTextMessage(function(mode, text)
|
onTextMessage(function(mode, text)
|
||||||
if not m.isOn() then return end
|
if not m.isOn() then return end
|
||||||
if not text:lower():find("warning! the murder of") then return end
|
if not text:lower():find("warning! the murder of") then return end
|
||||||
info(text)
|
|
||||||
say("Don't bother, I have anti-rs and shit EQ. Don't waste our time.")
|
say("Don't bother, I have anti-rs and shit EQ. Don't waste our time.")
|
||||||
frags = frags + 1
|
frags = frags + 1
|
||||||
if killsToRs() < 6 or frags > 1 then
|
if killsToRs() < 6 or frags > 1 then
|
443
modules/game_bot/default_configs/vBot_3.01/vBot/combo.lua
Normal file
443
modules/game_bot/default_configs/vBot_3.01/vBot/combo.lua
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
setDefaultTab("Main")
|
||||||
|
local panelName = "combobot"
|
||||||
|
local ui = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 19
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: title
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
text-align: center
|
||||||
|
width: 130
|
||||||
|
!text: tr('ComboBot')
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: combos
|
||||||
|
anchors.top: prev.top
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-left: 3
|
||||||
|
height: 17
|
||||||
|
text: Setup
|
||||||
|
|
||||||
|
]])
|
||||||
|
ui:setId(panelName)
|
||||||
|
|
||||||
|
if not storage[panelName] then
|
||||||
|
storage[panelName] = {
|
||||||
|
enabled = false,
|
||||||
|
onSayEnabled = false,
|
||||||
|
onShootEnabled = false,
|
||||||
|
onCastEnabled = false,
|
||||||
|
followLeaderEnabled = false,
|
||||||
|
attackLeaderTargetEnabled = false,
|
||||||
|
attackSpellEnabled = false,
|
||||||
|
attackItemToggle = false,
|
||||||
|
sayLeader = "",
|
||||||
|
shootLeader = "",
|
||||||
|
castLeader = "",
|
||||||
|
sayPhrase = "",
|
||||||
|
spell = "",
|
||||||
|
serverLeader = "",
|
||||||
|
item = 3155,
|
||||||
|
attack = "",
|
||||||
|
follow = "",
|
||||||
|
commandsEnabled = true,
|
||||||
|
serverEnabled = false,
|
||||||
|
serverLeaderTarget = false,
|
||||||
|
serverTriggers = true
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = storage[panelName]
|
||||||
|
|
||||||
|
ui.title:setOn(config.enabled)
|
||||||
|
ui.title.onClick = function(widget)
|
||||||
|
config.enabled = not config.enabled
|
||||||
|
widget:setOn(config.enabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
ui.combos.onClick = function(widget)
|
||||||
|
comboWindow:show()
|
||||||
|
comboWindow:raise()
|
||||||
|
comboWindow:focus()
|
||||||
|
end
|
||||||
|
|
||||||
|
rootWidget = g_ui.getRootWidget()
|
||||||
|
if rootWidget then
|
||||||
|
comboWindow = UI.createWindow('ComboWindow', rootWidget)
|
||||||
|
comboWindow:hide()
|
||||||
|
|
||||||
|
-- bot item
|
||||||
|
|
||||||
|
comboWindow.actions.attackItem:setItemId(config.item)
|
||||||
|
comboWindow.actions.attackItem.onItemChange = function(widget)
|
||||||
|
config.item = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- switches
|
||||||
|
|
||||||
|
comboWindow.actions.commandsToggle:setOn(config.commandsEnabled)
|
||||||
|
comboWindow.actions.commandsToggle.onClick = function(widget)
|
||||||
|
config.commandsEnabled = not config.commandsEnabled
|
||||||
|
widget:setOn(config.commandsEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.server.botServerToggle:setOn(config.serverEnabled)
|
||||||
|
comboWindow.server.botServerToggle.onClick = function(widget)
|
||||||
|
config.serverEnabled = not config.serverEnabled
|
||||||
|
widget:setOn(config.serverEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.server.Triggers:setOn(config.serverTriggers)
|
||||||
|
comboWindow.server.Triggers.onClick = function(widget)
|
||||||
|
config.serverTriggers = not config.serverTriggers
|
||||||
|
widget:setOn(config.serverTriggers)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.server.targetServerLeaderToggle:setOn(config.serverLeaderTarget)
|
||||||
|
comboWindow.server.targetServerLeaderToggle.onClick = function(widget)
|
||||||
|
config.serverLeaderTarget = not config.serverLeaderTarget
|
||||||
|
widget:setOn(config.serverLeaderTarget)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- buttons
|
||||||
|
comboWindow.closeButton.onClick = function(widget)
|
||||||
|
comboWindow:hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- combo boxes
|
||||||
|
|
||||||
|
comboWindow.actions.followLeader:setOption(config.follow)
|
||||||
|
comboWindow.actions.followLeader.onOptionChange = function(widget)
|
||||||
|
config.follow = widget:getCurrentOption().text
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.actions.attackLeaderTarget:setOption(config.attack)
|
||||||
|
comboWindow.actions.attackLeaderTarget.onOptionChange = function(widget)
|
||||||
|
config.attack = widget:getCurrentOption().text
|
||||||
|
end
|
||||||
|
|
||||||
|
-- checkboxes
|
||||||
|
comboWindow.trigger.onSayToggle:setChecked(config.onSayEnabled)
|
||||||
|
comboWindow.trigger.onSayToggle.onClick = function(widget)
|
||||||
|
config.onSayEnabled = not config.onSayEnabled
|
||||||
|
widget:setChecked(config.onSayEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.trigger.onShootToggle:setChecked(config.onShootEnabled)
|
||||||
|
comboWindow.trigger.onShootToggle.onClick = function(widget)
|
||||||
|
config.onShootEnabled = not config.onShootEnabled
|
||||||
|
widget:setChecked(config.onShootEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.trigger.onCastToggle:setChecked(config.onCastEnabled)
|
||||||
|
comboWindow.trigger.onCastToggle.onClick = function(widget)
|
||||||
|
config.onCastEnabled = not config.onCastEnabled
|
||||||
|
widget:setChecked(config.onCastEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.actions.followLeaderToggle:setChecked(config.followLeaderEnabled)
|
||||||
|
comboWindow.actions.followLeaderToggle.onClick = function(widget)
|
||||||
|
config.followLeaderEnabled = not config.followLeaderEnabled
|
||||||
|
widget:setChecked(config.followLeaderEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.actions.attackLeaderTargetToggle:setChecked(config.attackLeaderTargetEnabled)
|
||||||
|
comboWindow.actions.attackLeaderTargetToggle.onClick = function(widget)
|
||||||
|
config.attackLeaderTargetEnabled = not config.attackLeaderTargetEnabled
|
||||||
|
widget:setChecked(config.attackLeaderTargetEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.actions.attackSpellToggle:setChecked(config.attackSpellEnabled)
|
||||||
|
comboWindow.actions.attackSpellToggle.onClick = function(widget)
|
||||||
|
config.attackSpellEnabled = not config.attackSpellEnabled
|
||||||
|
widget:setChecked(config.attackSpellEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.actions.attackItemToggle:setChecked(config.attackItemEnabled)
|
||||||
|
comboWindow.actions.attackItemToggle.onClick = function(widget)
|
||||||
|
config.attackItemEnabled = not config.attackItemEnabled
|
||||||
|
widget:setChecked(config.attackItemEnabled)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- text edits
|
||||||
|
comboWindow.trigger.onSayLeader:setText(config.sayLeader)
|
||||||
|
comboWindow.trigger.onSayLeader.onTextChange = function(widget, text)
|
||||||
|
config.sayLeader = text
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.trigger.onShootLeader:setText(config.shootLeader)
|
||||||
|
comboWindow.trigger.onShootLeader.onTextChange = function(widget, text)
|
||||||
|
config.shootLeader = text
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.trigger.onCastLeader:setText(config.castLeader)
|
||||||
|
comboWindow.trigger.onCastLeader.onTextChange = function(widget, text)
|
||||||
|
config.castLeader = text
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.trigger.onSayPhrase:setText(config.sayPhrase)
|
||||||
|
comboWindow.trigger.onSayPhrase.onTextChange = function(widget, text)
|
||||||
|
config.sayPhrase = text
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.actions.attackSpell:setText(config.spell)
|
||||||
|
comboWindow.actions.attackSpell.onTextChange = function(widget, text)
|
||||||
|
config.spell = text
|
||||||
|
end
|
||||||
|
|
||||||
|
comboWindow.server.botServerLeader:setText(config.serverLeader)
|
||||||
|
comboWindow.server.botServerLeader.onTextChange = function(widget, text)
|
||||||
|
config.serverLeader = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- bot server
|
||||||
|
-- [[ join party made by Frosty ]] --
|
||||||
|
|
||||||
|
local shouldCloseWindow = false
|
||||||
|
local firstInvitee = true
|
||||||
|
local isInComboTeam = false
|
||||||
|
macro(10, function()
|
||||||
|
if shouldCloseWindow and config.serverEnabled and config.enabled then
|
||||||
|
local channelsWindow = modules.game_console.channelsWindow
|
||||||
|
if channelsWindow then
|
||||||
|
local child = channelsWindow:getChildById("buttonCancel")
|
||||||
|
if child then
|
||||||
|
child:onClick()
|
||||||
|
shouldCloseWindow = false
|
||||||
|
isInComboTeam = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
comboWindow.server.partyButton.onClick = function(widget)
|
||||||
|
if config.serverEnabled and config.enabled then
|
||||||
|
if config.serverLeader:len() > 0 and storage.BotServerChannel:len() > 0 then
|
||||||
|
talkPrivate(config.serverLeader, "request invite " .. storage.BotServerChannel)
|
||||||
|
else
|
||||||
|
error("Request failed. Lack of data.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
onTextMessage(function(mode, text)
|
||||||
|
if config.serverEnabled and config.enabled then
|
||||||
|
if mode == 20 then
|
||||||
|
if string.find(text, "invited you to") then
|
||||||
|
local regex = "[a-zA-Z]*"
|
||||||
|
local regexData = regexMatch(text, regex)
|
||||||
|
if regexData[1][1]:lower() == config.serverLeader:lower() then
|
||||||
|
local leader = getCreatureByName(regexData[1][1])
|
||||||
|
if leader then
|
||||||
|
g_game.partyJoin(leader:getId())
|
||||||
|
g_game.requestChannels()
|
||||||
|
g_game.joinChannel(1)
|
||||||
|
shouldCloseWindow = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
onTalk(function(name, level, mode, text, channelId, pos)
|
||||||
|
if config.serverEnabled and config.enabled then
|
||||||
|
if mode == 4 then
|
||||||
|
if string.find(text, "request invite") then
|
||||||
|
local access = string.match(text, "%d.*")
|
||||||
|
if access and access == storage.BotServerChannel then
|
||||||
|
local minion = getCreatureByName(name)
|
||||||
|
if minion then
|
||||||
|
g_game.partyInvite(minion:getId())
|
||||||
|
if firstInvitee then
|
||||||
|
g_game.requestChannels()
|
||||||
|
g_game.joinChannel(1)
|
||||||
|
shouldCloseWindow = true
|
||||||
|
firstInvitee = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
talkPrivate(name, "Incorrect access key!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- [[ End of Frosty's Code ]] --
|
||||||
|
if config.enabled and config.enabled then
|
||||||
|
if name:lower() == config.sayLeader:lower() and string.find(text, config.sayPhrase) and config.onSayEnabled then
|
||||||
|
startCombo = true
|
||||||
|
end
|
||||||
|
if (config.castLeader and name:lower() == config.castLeader:lower()) and isAttSpell(text) and config.onCastEnabled then
|
||||||
|
startCombo = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if config.enabled and config.commandsEnabled and (config.shootLeader and name:lower() == config.shootLeader:lower()) or (config.sayLeader and name:lower() == config.sayLeader:lower()) or (config.castLeader and name:lower() == config.castLeader:lower()) then
|
||||||
|
if string.find(text, "ue") then
|
||||||
|
say(config.spell)
|
||||||
|
elseif string.find(text, "sd") then
|
||||||
|
local params = string.split(text, ",")
|
||||||
|
if #params == 2 then
|
||||||
|
local target = params[2]:trim()
|
||||||
|
if getCreatureByName(target) then
|
||||||
|
useWith(3155, getCreatureByName(target))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif string.find(text, "att") then
|
||||||
|
local attParams = string.split(text, ",")
|
||||||
|
if #attParams == 2 then
|
||||||
|
local atTarget = attParams[2]:trim()
|
||||||
|
if getCreatureByName(atTarget) and config.attack == "COMMAND TARGET" then
|
||||||
|
g_game.attack(getCreatureByName(atTarget))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if isAttSpell(text) and config.enabled and config.serverEnabled then
|
||||||
|
BotServer.send("trigger", "start")
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
onMissle(function(missle)
|
||||||
|
if config.enabled and config.onShootEnabled then
|
||||||
|
if not config.shootLeader or config.shootLeader:len() == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local src = missle:getSource()
|
||||||
|
if src.z ~= posz() then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local from = g_map.getTile(src)
|
||||||
|
local to = g_map.getTile(missle:getDestination())
|
||||||
|
if not from or not to then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local fromCreatures = from:getCreatures()
|
||||||
|
local toCreatures = to:getCreatures()
|
||||||
|
if #fromCreatures ~= 1 or #toCreatures ~= 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local c1 = fromCreatures[1]
|
||||||
|
local t1 = toCreatures[1]
|
||||||
|
leaderTarget = t1
|
||||||
|
if c1:getName():lower() == config.shootLeader:lower() then
|
||||||
|
if config.attackItemEnabled and config.item and config.item > 100 and findItem(config.item) then
|
||||||
|
useWith(config.item, t1)
|
||||||
|
end
|
||||||
|
if config.attackSpellEnabled and config.spell:len() > 1 then
|
||||||
|
say(config.spell)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
macro(10, function()
|
||||||
|
if not config.enabled or not config.attackLeaderTargetEnabled then return end
|
||||||
|
if leaderTarget and config.attack == "LEADER TARGET" then
|
||||||
|
if not getTarget() or (getTarget() and getTarget():getName() ~= leaderTarget:getName()) then
|
||||||
|
g_game.attack(leaderTarget)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if config.enabled and config.serverEnabled and config.attack == "SERVER LEADER TARGET" and serverTarget then
|
||||||
|
if serverTarget and not getTarget() or (getTarget() and getTarget():getname() ~= serverTarget)
|
||||||
|
then
|
||||||
|
g_game.attack(serverTarget)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
local toFollow
|
||||||
|
local toFollowPos = {}
|
||||||
|
|
||||||
|
macro(100, function()
|
||||||
|
toFollow = nil
|
||||||
|
if not config.enabled or not config.followLeaderEnabled then return end
|
||||||
|
if leaderTarget and config.follow == "LEADER TARGET" and leaderTarget:isPlayer() then
|
||||||
|
toFollow = leaderTarget:getName()
|
||||||
|
elseif config.follow == "SERVER LEADER TARGET" and config.serverLeader:len() ~= 0 then
|
||||||
|
toFollow = serverTarget
|
||||||
|
elseif config.follow == "SERVER LEADER" and config.serverLeader:len() ~= 0 then
|
||||||
|
toFollow = config.serverLeader
|
||||||
|
elseif config.follow == "LEADER" then
|
||||||
|
if config.onSayEnabled and config.sayLeader:len() ~= 0 then
|
||||||
|
toFollow = config.sayLeader
|
||||||
|
elseif config.onCastEnabled and config.castLeader:len() ~= 0 then
|
||||||
|
toFollow = config.castLeader
|
||||||
|
elseif config.onShootEnabled and config.shootLeader:len() ~= 0 then
|
||||||
|
toFollow = config.shootLeader
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not toFollow then return end
|
||||||
|
local target = getCreatureByName(toFollow)
|
||||||
|
if target then
|
||||||
|
local tpos = target:getPosition()
|
||||||
|
toFollowPos[tpos.z] = tpos
|
||||||
|
end
|
||||||
|
if player:isWalking() then return end
|
||||||
|
local p = toFollowPos[posz()]
|
||||||
|
if not p then return end
|
||||||
|
if CaveBot.walkTo(p, 20, {ignoreNonPathable=true, precision=1, ignoreStairs=false}) then
|
||||||
|
delay(100)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
onCreaturePositionChange(function(creature, oldPos, newPos)
|
||||||
|
if creature:getName() == toFollow and newPos then
|
||||||
|
toFollowPos[newPos.z] = newPos
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local timeout = now
|
||||||
|
macro(10, function()
|
||||||
|
if config.enabled and startCombo then
|
||||||
|
if config.attackItemEnabled and config.item and config.item > 100 and findItem(config.item) then
|
||||||
|
useWith(config.item, getTarget())
|
||||||
|
end
|
||||||
|
if config.attackSpellEnabled and config.spell:len() > 1 then
|
||||||
|
say(config.spell)
|
||||||
|
end
|
||||||
|
startCombo = false
|
||||||
|
end
|
||||||
|
-- attack part / server
|
||||||
|
if BotServer._websocket and config.enabled and config.serverEnabled then
|
||||||
|
if target() and now - timeout > 500 then
|
||||||
|
targetPos = target():getName()
|
||||||
|
BotServer.send("target", targetPos)
|
||||||
|
timeout = now
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
onUseWith(function(pos, itemId, target, subType)
|
||||||
|
if BotServer._websocket and itemId == 3155 then
|
||||||
|
BotServer.send("useWith", target:getPosition())
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
if BotServer._websocket and config.enabled and config.serverEnabled then
|
||||||
|
BotServer.listen("trigger", function(name, message)
|
||||||
|
if message == "start" and name:lower() ~= player:getName():lower() and name:lower() == config.serverLeader:lower() and config.serverTriggers then
|
||||||
|
startCombo = true
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
BotServer.listen("target", function(name, message)
|
||||||
|
if name:lower() ~= player:getName():lower() and name:lower() == config.serverLeader:lower() then
|
||||||
|
if not target() or target():getName() == getCreatureByName(message) then
|
||||||
|
if config.serverLeaderTarget then
|
||||||
|
serverTarget = getCreatureByName(message)
|
||||||
|
g_game.attack(getCreatureByName(message))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
BotServer.listen("useWith", function(name, message)
|
||||||
|
local tile = g_map.getTile(message)
|
||||||
|
if config.serverTriggers and name:lower() ~= player:getName():lower() and name:lower() == config.serverLeader:lower() and config.attackItemEnabled and config.item and findItem(config.item) then
|
||||||
|
useWith(config.item, tile:getTopUseThing())
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
@ -0,0 +1,65 @@
|
|||||||
|
setDefaultTab("Cave")
|
||||||
|
local panelName = "specialDeposit"
|
||||||
|
local depositerPanel
|
||||||
|
|
||||||
|
UI.Button("Depositer Settings", function()
|
||||||
|
depositerPanel:show()
|
||||||
|
depositerPanel:raise()
|
||||||
|
depositerPanel:focus()
|
||||||
|
end)
|
||||||
|
|
||||||
|
if not storage[panelName] then
|
||||||
|
storage[panelName] = {
|
||||||
|
items = {}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = storage[panelName]
|
||||||
|
|
||||||
|
|
||||||
|
local rootWidget = g_ui.getRootWidget()
|
||||||
|
if rootWidget then
|
||||||
|
depositerPanel = UI.createWindow('DepositerPanel', rootWidget)
|
||||||
|
depositerPanel:hide()
|
||||||
|
|
||||||
|
-- basic one
|
||||||
|
depositerPanel.CloseButton.onClick = function()
|
||||||
|
depositerPanel:hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
if config.items and #config.items > 0 then
|
||||||
|
for _, value in ipairs(config.items) do
|
||||||
|
local label = g_ui.createWidget("ItemLabel", depositerPanel.DepositerList)
|
||||||
|
label.remove.onClick = function(widget)
|
||||||
|
table.remove(config.items, table.find(value))
|
||||||
|
label:destroy()
|
||||||
|
end
|
||||||
|
label:setText("Stash (".. value.id .. ") to depot: (" .. value.index .. ")")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
depositerPanel.Add.onClick = function(widget)
|
||||||
|
local itemId = depositerPanel.ID:getItemId()
|
||||||
|
local index = tonumber(depositerPanel.Index:getText())
|
||||||
|
if index and itemId > 100 and not config.items[itemId] then
|
||||||
|
local value = {id=itemId,index=index}
|
||||||
|
table.insert(config.items, value)
|
||||||
|
local label = g_ui.createWidget("ItemLabel", depositerPanel.DepositerList)
|
||||||
|
label.remove.onClick = function(widget)
|
||||||
|
table.remove(config.items, table.find(value))
|
||||||
|
label:destroy()
|
||||||
|
end
|
||||||
|
label:setText("Stash (".. itemId .. ") to depot: (" .. index..")")
|
||||||
|
depositerPanel.ID:setItemId(0)
|
||||||
|
depositerPanel.Index:setText(0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function getStashingIndex(id)
|
||||||
|
for _, v in pairs(config.items) do
|
||||||
|
if v.id == id then
|
||||||
|
return v.index - 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,86 @@
|
|||||||
|
ItemLabel < Label
|
||||||
|
background-color: alpha
|
||||||
|
text-offset: 2 0
|
||||||
|
focusable: true
|
||||||
|
height: 16
|
||||||
|
|
||||||
|
$focus:
|
||||||
|
background-color: #00000055
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: remove
|
||||||
|
!text: tr('x')
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-right: 15
|
||||||
|
width: 15
|
||||||
|
height: 15
|
||||||
|
|
||||||
|
DepositerPanel < MainWindow
|
||||||
|
size: 250 450
|
||||||
|
!text: tr('Depositer Panel')
|
||||||
|
@onEscape: self:hide()
|
||||||
|
|
||||||
|
TextList
|
||||||
|
id: DepositerList
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
margin-top: 15
|
||||||
|
margin-bottom: 5
|
||||||
|
margin-right: 3
|
||||||
|
padding: 1
|
||||||
|
height: 300
|
||||||
|
vertical-scrollbar: DepositerScrollBar
|
||||||
|
|
||||||
|
VerticalScrollBar
|
||||||
|
id: DepositerScrollBar
|
||||||
|
anchors.top: DepositerList.top
|
||||||
|
anchors.bottom: DepositerList.bottom
|
||||||
|
anchors.right: DepositerList.right
|
||||||
|
step: 14
|
||||||
|
pixels-scroll: true
|
||||||
|
|
||||||
|
BotItem
|
||||||
|
id: ID
|
||||||
|
anchors.top: DepositerList.bottom
|
||||||
|
margin-top: 3
|
||||||
|
anchors.left: DepositerList.left
|
||||||
|
|
||||||
|
SpinBox
|
||||||
|
id: Index
|
||||||
|
anchors.top: DepositerList.bottom
|
||||||
|
margin-top: 3
|
||||||
|
anchors.left: prev.right
|
||||||
|
margin-left: 3
|
||||||
|
anchors.bottom: prev.bottom
|
||||||
|
width: 50
|
||||||
|
minimum: 3
|
||||||
|
maximum: 17
|
||||||
|
step: 1
|
||||||
|
text-align: center
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: Add
|
||||||
|
anchors.top: DepositerList.bottom
|
||||||
|
margin-top: 3
|
||||||
|
anchors.left: prev.right
|
||||||
|
margin-left: 3
|
||||||
|
anchors.right: DepositerList.right
|
||||||
|
anchors.bottom: prev.bottom
|
||||||
|
!text: tr('Add Item')
|
||||||
|
|
||||||
|
HorizontalSeparator
|
||||||
|
anchors.bottom: CloseButton.top
|
||||||
|
margin-bottom: 5
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
|
||||||
|
Button
|
||||||
|
id: CloseButton
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
margin-right: 5
|
||||||
|
margin-bottom: 5
|
||||||
|
!text: tr('Close')
|
||||||
|
font: cipsoftFont
|
||||||
|
size: 41 25
|
@ -17,7 +17,8 @@ if voc == 1 or voc == 11 then
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
macro(500, "ExetaIfPlayer", function()
|
macro(500, "ExetaIfPlayer", function()
|
||||||
if getMonsters(6) >= 1 and getPlayers(6) > 0 then
|
if CaveBot.isOff() then return end
|
||||||
|
if getMonsters(1) >= 1 and getPlayers(6) > 0 then
|
||||||
say("exeta res")
|
say("exeta res")
|
||||||
delay(6000)
|
delay(6000)
|
||||||
end
|
end
|
@ -92,6 +92,9 @@ addItem("machete", "Machete Item", 9596, leftPanel)
|
|||||||
addItem("scythe", "Scythe Item", 9596, leftPanel)
|
addItem("scythe", "Scythe Item", 9596, leftPanel)
|
||||||
addScrollBar("talkDelay", "Global NPC Talk Delay", 0, 2000, 1000, leftPanel)
|
addScrollBar("talkDelay", "Global NPC Talk Delay", 0, 2000, 1000, leftPanel)
|
||||||
addScrollBar("looting", "Max Loot Distance", 0, 50, 40, leftPanel)
|
addScrollBar("looting", "Max Loot Distance", 0, 50, 40, leftPanel)
|
||||||
|
addScrollBar("huntRoutes", "Hunting Routes Limit", 0, 300, 50, leftPanel)
|
||||||
|
addScrollBar("killUnder", "Kill monsters below", 0, 100, 30, leftPanel)
|
||||||
|
addCheckBox("lootLast", "Start loot from last corpse", true, leftPanel)
|
||||||
|
|
||||||
addCheckBox("title", "Custom Window Title", true, rightPanel)
|
addCheckBox("title", "Custom Window Title", true, rightPanel)
|
||||||
if true then
|
if true then
|
||||||
@ -127,7 +130,8 @@ if true then
|
|||||||
6257, 6256, 2772, 27260, 2773, 1632, 1633, 1948, 435, 6252, 6253, 5007, 4911,
|
6257, 6256, 2772, 27260, 2773, 1632, 1633, 1948, 435, 6252, 6253, 5007, 4911,
|
||||||
1629, 1630, 5108, 5107, 5281, 1968, 435, 1948, 5542, 31116, 31120, 30742, 31115,
|
1629, 1630, 5108, 5107, 5281, 1968, 435, 1948, 5542, 31116, 31120, 30742, 31115,
|
||||||
31118, 20474, 5737, 5736, 5734, 5733, 31202, 31228, 31199, 31200, 33262, 30824,
|
31118, 20474, 5737, 5736, 5734, 5733, 31202, 31228, 31199, 31200, 33262, 30824,
|
||||||
5125, 5126, 5116, 5117, 8257, 8258, 8255, 8256, 5120, 30777, 30776}
|
5125, 5126, 5116, 5117, 8257, 8258, 8255, 8256, 5120, 30777, 30776, 23873, 23877,
|
||||||
|
5736, 6264, 31262, 31130, 31129, 6250, 6249, 5122, 30049}
|
||||||
local shovelId = {606, 593, 867}
|
local shovelId = {606, 593, 867}
|
||||||
local ropeId = {17238, 12202, 12935, 386, 421, 21966, 14238}
|
local ropeId = {17238, 12202, 12935, 386, 421, 21966, 14238}
|
||||||
local macheteId = {2130, 3696}
|
local macheteId = {2130, 3696}
|
||||||
@ -218,7 +222,7 @@ end
|
|||||||
|
|
||||||
addCheckBox("stake", "Skin Monsters", false, leftPanel)
|
addCheckBox("stake", "Skin Monsters", false, leftPanel)
|
||||||
if true then
|
if true then
|
||||||
local knifeBodies = {4272, 4173, 4011, 4025, 4047, 4052, 4057, 4062, 4112, 4212, 4321, 4324, 4327, 10352, 10356, 10360, 10364}
|
local knifeBodies = {4286, 4272, 4173, 4011, 4025, 4047, 4052, 4057, 4062, 4112, 4212, 4321, 4324, 4327, 10352, 10356, 10360, 10364}
|
||||||
local stakeBodies = {4097, 4137, 8738, 18958}
|
local stakeBodies = {4097, 4137, 8738, 18958}
|
||||||
local fishingBodies = {9582}
|
local fishingBodies = {9582}
|
||||||
macro(500, function()
|
macro(500, function()
|
||||||
@ -281,7 +285,8 @@ if true then
|
|||||||
local doorsIds = { 5007, 8265, 1629, 1632, 5129, 6252, 6249, 7715, 7712, 7714,
|
local doorsIds = { 5007, 8265, 1629, 1632, 5129, 6252, 6249, 7715, 7712, 7714,
|
||||||
7719, 6256, 1669, 1672, 5125, 5115, 5124, 17701, 17710, 1642,
|
7719, 6256, 1669, 1672, 5125, 5115, 5124, 17701, 17710, 1642,
|
||||||
6260, 5107, 4912, 6251, 5291, 1683, 1696, 1692, 5006, 2179, 5116,
|
6260, 5107, 4912, 6251, 5291, 1683, 1696, 1692, 5006, 2179, 5116,
|
||||||
1632, 11705, 30772, 30774, 6248, 5735, 5732, 5120 }
|
1632, 11705, 30772, 30774, 6248, 5735, 5732, 5120, 23873, 5736,
|
||||||
|
6264, 5122, 30049, 30042 }
|
||||||
|
|
||||||
function checkForDoors(pos)
|
function checkForDoors(pos)
|
||||||
local tile = g_map.getTile(pos)
|
local tile = g_map.getTile(pos)
|
||||||
@ -432,3 +437,69 @@ if true then
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
addCheckBox("checkPlayer", "Check Players", true, rightPanel)
|
||||||
|
if true then
|
||||||
|
|
||||||
|
local function checkPlayers()
|
||||||
|
local found = false
|
||||||
|
for i, spec in ipairs(getSpectators()) do
|
||||||
|
if spec:isPlayer() and spec:getText() == "" and spec:getPosition().z == posz() and spec ~= player then
|
||||||
|
g_game.look(spec)
|
||||||
|
found = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if found then
|
||||||
|
schedule(20, function() modules.game_textmessage.clearMessages() end)
|
||||||
|
schedule(40, function() modules.game_textmessage.clearMessages() end)
|
||||||
|
schedule(60, function() modules.game_textmessage.clearMessages() end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
checkPlayers()
|
||||||
|
|
||||||
|
onPlayerPositionChange(function(x,y)
|
||||||
|
if not settings.checkPlayer then return end
|
||||||
|
if x.z ~= y.z then
|
||||||
|
schedule(20, function() checkPlayers() end)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
onCreatureAppear(function(creature)
|
||||||
|
if not settings.checkPlayer then return end
|
||||||
|
local found = false
|
||||||
|
if creature:isPlayer() and creature:getText() == "" and creature:getPosition().z == posz() and creature ~= player then
|
||||||
|
g_game.look(creature)
|
||||||
|
found = true
|
||||||
|
end
|
||||||
|
if found then
|
||||||
|
schedule(20, function() modules.game_textmessage.clearMessages() end)
|
||||||
|
schedule(40, function() modules.game_textmessage.clearMessages() end)
|
||||||
|
schedule(60, function() modules.game_textmessage.clearMessages() end)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
local regex = [[You see ([a-z 'A-z-]*) \(Level ([0-9]*)\)]]
|
||||||
|
onTextMessage(function(mode, text)
|
||||||
|
if not settings.checkPlayer then return end
|
||||||
|
if mode ~= 20 then return end
|
||||||
|
|
||||||
|
local re = regexMatch(text, regex)
|
||||||
|
if #re ~= 0 then
|
||||||
|
local name = re[1][2]
|
||||||
|
local level = re[1][3]
|
||||||
|
local voc
|
||||||
|
if text:lower():find("sorcerer") then
|
||||||
|
voc = "MS"
|
||||||
|
elseif text:lower():find("druid") then
|
||||||
|
voc = "ED"
|
||||||
|
elseif text:lower():find("knight") then
|
||||||
|
voc = "EK"
|
||||||
|
elseif text:lower():find("paladin") then
|
||||||
|
voc = "RP"
|
||||||
|
end
|
||||||
|
local creature = getCreatureByName(name)
|
||||||
|
if creature then
|
||||||
|
creature:setText(level..voc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
@ -1,3 +1,3 @@
|
|||||||
UI.Label("vBot 2.11 \n Vithrax#5814")
|
UI.Label("vBot 3.01 \n Vithrax#5814")
|
||||||
UI.Button("Official OTCv8 Discord!", function() g_platform.openUrl("https://discord.gg/yhqBE4A") end)
|
UI.Button("Official OTCv8 Discord!", function() g_platform.openUrl("https://discord.gg/yhqBE4A") end)
|
||||||
UI.Separator()
|
UI.Separator()
|
@ -15,6 +15,12 @@ CaveBot = {} -- global namespace
|
|||||||
|
|
||||||
-- local variables, constants and functions, used by global functions
|
-- local variables, constants and functions, used by global functions
|
||||||
local LOCKERS_LIST = {3497, 3498, 3499, 3500}
|
local LOCKERS_LIST = {3497, 3498, 3499, 3500}
|
||||||
|
local LOCKER_ACCESSTILE_MODIFIERS = {
|
||||||
|
[3497] = {0,-1},
|
||||||
|
[3498] = {1,0},
|
||||||
|
[3499] = {0,1},
|
||||||
|
[3500] = {-1,0}
|
||||||
|
}
|
||||||
|
|
||||||
local function CaveBotConfigParse()
|
local function CaveBotConfigParse()
|
||||||
local name = storage["_configs"]["targetbot_configs"]["selected"]
|
local name = storage["_configs"]["targetbot_configs"]["selected"]
|
||||||
@ -76,6 +82,23 @@ function CaveBot.GetLootItems()
|
|||||||
return returnTable
|
return returnTable
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Checks whether player has any visible items to be stashed
|
||||||
|
-- @return boolean
|
||||||
|
function CaveBot.HasLootItems()
|
||||||
|
for _, container in pairs(getContainers()) do
|
||||||
|
local name = container:getName():lower()
|
||||||
|
if not name:find("depot") and not name:find("your inbox") then
|
||||||
|
for _, item in pairs(container:getItems()) do
|
||||||
|
local id = item:getId()
|
||||||
|
if table.find(CaveBot.GetLootItems(), id) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--- Parses config and extracts loot containers.
|
--- Parses config and extracts loot containers.
|
||||||
-- @return table
|
-- @return table
|
||||||
function CaveBot.GetLootContainers()
|
function CaveBot.GetLootContainers()
|
||||||
@ -152,7 +175,6 @@ function CaveBot.OpenLootContainer()
|
|||||||
for _, item in pairs(container:getItems()) do
|
for _, item in pairs(container:getItems()) do
|
||||||
local id = item:getId()
|
local id = item:getId()
|
||||||
if table.find(containers, id) and not table.find(t, id) then
|
if table.find(containers, id) and not table.find(t, id) then
|
||||||
test()
|
|
||||||
return g_game.open(item)
|
return g_game.open(item)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -185,7 +207,7 @@ function CaveBot.GoTo(position, precision)
|
|||||||
if not precision then
|
if not precision then
|
||||||
precision = 3
|
precision = 3
|
||||||
end
|
end
|
||||||
return CaveBot.walkTo(position, 20, {ignoreNonPathable = true, precision = precision})
|
return CaveBot.walkTo(position, 20, {ignoreCreatures = true, precision = precision})
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Finds position of npc by name and reaches its position.
|
--- Finds position of npc by name and reaches its position.
|
||||||
@ -213,6 +235,9 @@ end
|
|||||||
|
|
||||||
--- Reaches closest locker.
|
--- Reaches closest locker.
|
||||||
-- @return void(acion) or boolean
|
-- @return void(acion) or boolean
|
||||||
|
|
||||||
|
local depositerLockerTarget = nil
|
||||||
|
local depositerLockerReachRetries = 0
|
||||||
function CaveBot.ReachDepot()
|
function CaveBot.ReachDepot()
|
||||||
local pPos = player:getPosition()
|
local pPos = player:getPosition()
|
||||||
local tiles = getNearTiles(player:getPosition())
|
local tiles = getNearTiles(player:getPosition())
|
||||||
@ -220,31 +245,53 @@ function CaveBot.ReachDepot()
|
|||||||
for i, tile in pairs(tiles) do
|
for i, tile in pairs(tiles) do
|
||||||
for i, item in pairs(tile:getItems()) do
|
for i, item in pairs(tile:getItems()) do
|
||||||
if table.find(LOCKERS_LIST, item:getId()) then
|
if table.find(LOCKERS_LIST, item:getId()) then
|
||||||
|
depositerLockerTarget = nil
|
||||||
|
depositerLockerReachRetries = 0
|
||||||
return true -- if near locker already then return function
|
return true -- if near locker already then return function
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local candidate = {}
|
if depositerLockerReachRetries > 20 then
|
||||||
|
depositerLockerTarget = nil
|
||||||
|
depositerLockerReachRetries = 0
|
||||||
|
end
|
||||||
|
|
||||||
for i, tile in pairs(g_map.getTiles(posz())) do
|
local candidates = {}
|
||||||
local tPos = tile:getPosition()
|
|
||||||
local distance = getDistanceBetween(pPos, tPos)
|
if not depositerLockerTarget or distanceFromPlayer(depositerLockerTarget, pPos) > 12 then
|
||||||
for i, item in pairs(tile:getItems()) do
|
for i, tile in pairs(g_map.getTiles(posz())) do
|
||||||
if table.find(LOCKERS_LIST, item:getId()) then
|
local tPos = tile:getPosition()
|
||||||
if findPath(pos(), tPos, 10, {ignoreNonPathable = true, precision = 1}) then
|
for i, item in pairs(tile:getItems()) do
|
||||||
if #candidate == 0 or candidate.dist < distance then
|
if table.find(LOCKERS_LIST, item:getId()) then
|
||||||
candidate = {pos = tPos, dist = distance}
|
local lockerTilePos = tile:getPosition()
|
||||||
|
lockerTilePos.x = lockerTilePos.x + LOCKER_ACCESSTILE_MODIFIERS[item:getId()][1]
|
||||||
|
lockerTilePos.y = lockerTilePos.y + LOCKER_ACCESSTILE_MODIFIERS[item:getId()][2]
|
||||||
|
local lockerTile = g_map.getTile(lockerTilePos)
|
||||||
|
if not lockerTile:hasCreature() then
|
||||||
|
if findPath(pos(), tPos, 20, {ignoreNonPathable = false, precision = 1, ignoreCreatures = true}) then
|
||||||
|
local distance = getDistanceBetween(tPos, pPos)
|
||||||
|
table.insert(candidates, {pos=tPos, dist=distance})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if #candidates > 1 then
|
||||||
|
table.sort(candidates, function(a,b) return a.dist < b.dist end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if candidate.pos then
|
depositerLockerTarget = depositerLockerTarget or candidates[1].pos
|
||||||
if not CaveBot.MatchPosition(candidate.pos) then
|
|
||||||
CaveBot.GoTo(candidate.pos, 1)
|
if depositerLockerTarget then
|
||||||
|
if not CaveBot.MatchPosition(depositerLockerTarget) then
|
||||||
|
depositerLockerReachRetries = depositerLockerReachRetries + 1
|
||||||
|
return CaveBot.GoTo(depositerLockerTarget, 1)
|
||||||
else
|
else
|
||||||
|
depositerLockerReachRetries = 0
|
||||||
|
depositerLockerTarget = nil
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -319,7 +366,7 @@ end
|
|||||||
function CaveBot.OpenDepotBox(index)
|
function CaveBot.OpenDepotBox(index)
|
||||||
local depot = getContainerByName("Depot chest")
|
local depot = getContainerByName("Depot chest")
|
||||||
if not depot then
|
if not depot then
|
||||||
return CaveBot.OpenDepotChest()
|
return CaveBot.ReachAndOpenDepot()
|
||||||
end
|
end
|
||||||
|
|
||||||
local foundParent = false
|
local foundParent = false
|
||||||
@ -364,13 +411,10 @@ end
|
|||||||
-- @param destination is object
|
-- @param destination is object
|
||||||
-- @return void
|
-- @return void
|
||||||
function CaveBot.StashItem(item, index, destination)
|
function CaveBot.StashItem(item, index, destination)
|
||||||
local depotContainer
|
destination = destination or getContainerByName("Depot chest")
|
||||||
if not destination then
|
if not destination then return false end
|
||||||
depotContainer = getContainerByName("Depot chest")
|
|
||||||
end
|
|
||||||
if not depotContainer then return false end
|
|
||||||
|
|
||||||
return g_game.move(item, depotContainer:getSlotPosition(index), item:getCount())
|
return g_game.move(item, destination:getSlotPosition(index), item:getCount())
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Withdraws item from depot chest or mail inbox.
|
--- Withdraws item from depot chest or mail inbox.
|
||||||
@ -414,7 +458,6 @@ function CaveBot.WithdrawItem(id, amount, fromDepot, destination)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local toMove = amount - itemCount
|
local toMove = amount - itemCount
|
||||||
info(toMove)
|
|
||||||
for i, item in pairs(depot:getItems()) do
|
for i, item in pairs(depot:getItems()) do
|
||||||
if item:getId() == id then
|
if item:getId() == id then
|
||||||
return g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), math.min(toMove, item:getCount()))
|
return g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), math.min(toMove, item:getCount()))
|
@ -0,0 +1,5 @@
|
|||||||
|
onAttackingCreatureChange(function(creature, OldCreature)
|
||||||
|
if creature and creature:isNpc() and distanceFromPlayer(creature:getPosition()) <= 3 then
|
||||||
|
CaveBot.Conversation("hi", "trade")
|
||||||
|
end
|
||||||
|
end)
|
@ -54,7 +54,7 @@ Panel
|
|||||||
specOutfit.legs = 88
|
specOutfit.legs = 88
|
||||||
specOutfit.feet = 88
|
specOutfit.feet = 88
|
||||||
if storage.BOTserver.outfit then
|
if storage.BOTserver.outfit then
|
||||||
local voc = BotServerMembers[spec:getName()]
|
local voc = vBot.BotServerMembers[spec:getName()]
|
||||||
specOutfit.addons = 3
|
specOutfit.addons = 3
|
||||||
if voc == 1 then
|
if voc == 1 then
|
||||||
specOutfit.type = 131
|
specOutfit.type = 131
|
||||||
@ -98,7 +98,7 @@ Panel
|
|||||||
specOutfit.legs = 88
|
specOutfit.legs = 88
|
||||||
specOutfit.feet = 88
|
specOutfit.feet = 88
|
||||||
if storage.BOTserver.outfit then
|
if storage.BOTserver.outfit then
|
||||||
local voc = BotServerMembers[creature:getName()]
|
local voc = vBot.BotServerMembers[creature:getName()]
|
||||||
specOutfit.addons = 3
|
specOutfit.addons = 3
|
||||||
if voc == 1 then
|
if voc == 1 then
|
||||||
specOutfit.type = 131
|
specOutfit.type = 131
|
@ -35,10 +35,12 @@ if not storage[panelName] then
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
ui.title:setOn(storage[panelName].enabled)
|
local config = storage[panelName]
|
||||||
|
|
||||||
|
ui.title:setOn(config.enabled)
|
||||||
ui.title.onClick = function(widget)
|
ui.title.onClick = function(widget)
|
||||||
storage[panelName].enabled = not storage[panelName].enabled
|
config.enabled = not config.enabled
|
||||||
widget:setOn(storage[panelName].enabled)
|
widget:setOn(config.enabled)
|
||||||
end
|
end
|
||||||
|
|
||||||
ui.push.onClick = function(widget)
|
ui.push.onClick = function(widget)
|
||||||
@ -57,34 +59,34 @@ if rootWidget then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local updateDelayText = function()
|
local updateDelayText = function()
|
||||||
pushWindow.delayText:setText("Push Delay: ".. storage[panelName].pushDelay)
|
pushWindow.delayText:setText("Push Delay: ".. config.pushDelay)
|
||||||
end
|
end
|
||||||
updateDelayText()
|
updateDelayText()
|
||||||
pushWindow.delay.onValueChange = function(scroll, value)
|
pushWindow.delay.onValueChange = function(scroll, value)
|
||||||
storage[panelName].pushDelay = value
|
config.pushDelay = value
|
||||||
updateDelayText()
|
updateDelayText()
|
||||||
end
|
end
|
||||||
pushWindow.delay:setValue(storage[panelName].pushDelay)
|
pushWindow.delay:setValue(config.pushDelay)
|
||||||
|
|
||||||
pushWindow.runeId.onItemChange = function(widget)
|
pushWindow.runeId.onItemChange = function(widget)
|
||||||
storage[panelName].pushMaxRuneId = widget:getItemId()
|
config.pushMaxRuneId = widget:getItemId()
|
||||||
end
|
end
|
||||||
pushWindow.runeId:setItemId(storage[panelName].pushMaxRuneId)
|
pushWindow.runeId:setItemId(config.pushMaxRuneId)
|
||||||
pushWindow.mwallId.onItemChange = function(widget)
|
pushWindow.mwallId.onItemChange = function(widget)
|
||||||
storage[panelName].mwallBlockId = widget:getItemId()
|
config.mwallBlockId = widget:getItemId()
|
||||||
end
|
end
|
||||||
pushWindow.mwallId:setItemId(storage[panelName].mwallBlockId)
|
pushWindow.mwallId:setItemId(config.mwallBlockId)
|
||||||
|
|
||||||
pushWindow.hotkey.onTextChange = function(widget, text)
|
pushWindow.hotkey.onTextChange = function(widget, text)
|
||||||
storage[panelName].pushMaxKey = text
|
config.pushMaxKey = text
|
||||||
end
|
end
|
||||||
pushWindow.hotkey:setText(storage[panelName].pushMaxKey)
|
pushWindow.hotkey:setText(config.pushMaxKey)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- variables for config
|
-- variables for config
|
||||||
|
|
||||||
local config = storage[panelName]
|
local config = config
|
||||||
local pushDelay = tonumber(config.pushDelay)
|
local pushDelay = tonumber(config.pushDelay)
|
||||||
local rune = tonumber(config.pushMaxRuneId)
|
local rune = tonumber(config.pushMaxRuneId)
|
||||||
local customMwall = config.mwallBlockId
|
local customMwall = config.mwallBlockId
|
||||||
@ -189,9 +191,9 @@ macro(20, function()
|
|||||||
local topThing = targetTile:getTopUseThing():getId()
|
local topThing = targetTile:getTopUseThing():getId()
|
||||||
if topThing == 2129 or topThing == 2130 or topThing == customMwall then
|
if topThing == 2129 or topThing == 2130 or topThing == customMwall then
|
||||||
if targetTile:getTimer() < pushDelay+500 then
|
if targetTile:getTimer() < pushDelay+500 then
|
||||||
storage.isUsing = true
|
vBot.isUsing = true
|
||||||
schedule(pushDelay+700, function()
|
schedule(pushDelay+700, function()
|
||||||
storage.isUsing = false
|
vBot.isUsing = false
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
if targetTile:getTimer() > pushDelay then
|
if targetTile:getTimer() > pushDelay then
|
@ -0,0 +1,111 @@
|
|||||||
|
setDefaultTab("Tools")
|
||||||
|
function quiverManager()
|
||||||
|
local panelName = "quiverManager"
|
||||||
|
|
||||||
|
local ui = setupUI([[
|
||||||
|
Panel
|
||||||
|
height: 33
|
||||||
|
margin-top: 2
|
||||||
|
|
||||||
|
BotItem
|
||||||
|
id: BoltsID
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
|
||||||
|
BotItem
|
||||||
|
id: ArrowsID
|
||||||
|
anchors.left: prev.right
|
||||||
|
anchors.verticalCenter: prev.verticalCenter
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: BoltsSwitch
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.bottom: prev.verticalCenter
|
||||||
|
anchors.right: parent.right
|
||||||
|
text: Sort Bolts
|
||||||
|
|
||||||
|
BotSwitch
|
||||||
|
id: ArrowsSwitch
|
||||||
|
anchors.top: prev.bottom
|
||||||
|
anchors.bottom: ArrowsID.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
text: Sort Arrows
|
||||||
|
|
||||||
|
]]
|
||||||
|
)
|
||||||
|
ui:setId(panelName)
|
||||||
|
|
||||||
|
if not storage[panelName] then
|
||||||
|
storage[panelName] = {
|
||||||
|
arrowsId = 35848,
|
||||||
|
boltsId = 35849,
|
||||||
|
bolts = false,
|
||||||
|
arrows = false
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = storage[panelName]
|
||||||
|
|
||||||
|
ui.BoltsSwitch:setOn(config.bolts)
|
||||||
|
ui.BoltsSwitch.onClick = function(widget)
|
||||||
|
config.bolts = not config.bolts
|
||||||
|
widget:setOn(config.bolts)
|
||||||
|
end
|
||||||
|
ui.ArrowsSwitch:setOn(config.arrows)
|
||||||
|
ui.ArrowsSwitch.onClick = function(widget)
|
||||||
|
config.arrows = not config.arrows
|
||||||
|
widget:setOn(config.arrows)
|
||||||
|
end
|
||||||
|
ui.BoltsID:setItemId(config.boltsId)
|
||||||
|
ui.BoltsID.onItemChange = function(widget)
|
||||||
|
config.boltsId = widget:getItemId()
|
||||||
|
end
|
||||||
|
ui.ArrowsID:setItemId(config.arrowsId)
|
||||||
|
ui.ArrowsID.onItemChange = function(widget)
|
||||||
|
config.arrowsId = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
local arrows = {16143, 763, 761, 7365, 3448, 762, 21470, 7364, 14251, 3447, 3449, 15793, 25757, 774, 35901}
|
||||||
|
local bolts = {6528, 7363, 3450, 16141, 25758, 14252, 3446, 16142, 35902}
|
||||||
|
|
||||||
|
macro(100, function()
|
||||||
|
local dArrow
|
||||||
|
local dBolt
|
||||||
|
for _, c in pairs(getContainers()) do
|
||||||
|
if not containerIsFull(c) then
|
||||||
|
if c:getContainerItem():getId() == config.arrowsId and config.arrows then
|
||||||
|
dArrow = c
|
||||||
|
elseif c:getContainerItem():getId() == config.boltsId and config.bolts then
|
||||||
|
dBolt = c
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, c in pairs(getContainers()) do
|
||||||
|
if c:getName():lower():find("backpack") or c:getName():lower():find("bag") or c:getName():lower():find("chess") then
|
||||||
|
for _, i in pairs(c:getItems()) do
|
||||||
|
-- arrows
|
||||||
|
if dArrow and config.arrows then
|
||||||
|
if table.find(arrows, i:getId()) and c ~= dArrow then
|
||||||
|
return g_game.move(i, dArrow:getSlotPosition(dArrow:getItemsCount()), i:getCount())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- bolts
|
||||||
|
if dBolt and config.bolts then
|
||||||
|
if table.find(bolts, i:getId()) and c ~= dBolt then
|
||||||
|
return g_game.move(i, dBolt:getSlotPosition(dBolt:getItemsCount()), i:getCount())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
delay(900)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
addSeparator()
|
||||||
|
if voc() == 2 or voc() == 12 then
|
||||||
|
UI.Label("[[ Quiver Manager ]]")
|
||||||
|
addSeparator()
|
||||||
|
quiverManager()
|
||||||
|
addSeparator()
|
||||||
|
end
|
311
modules/game_bot/default_configs/vBot_3.01/vBot/supplies.lua
Normal file
311
modules/game_bot/default_configs/vBot_3.01/vBot/supplies.lua
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
function SuppliesPanel(parent)
|
||||||
|
local panelName = "supplies"
|
||||||
|
if not parent then
|
||||||
|
parent = panel
|
||||||
|
end
|
||||||
|
|
||||||
|
if not SuppliesConfig[panelName] then
|
||||||
|
SuppliesConfig[panelName] = {
|
||||||
|
item1 = 0,
|
||||||
|
item2 = 0,
|
||||||
|
item3 = 0,
|
||||||
|
item4 = 0,
|
||||||
|
item5 = 0,
|
||||||
|
item6 = 0,
|
||||||
|
item7 = 0,
|
||||||
|
capValue = 0,
|
||||||
|
capSwitch = false,
|
||||||
|
SoftBoots = false,
|
||||||
|
staminaSwitch = false,
|
||||||
|
staminaValue = 900,
|
||||||
|
imbues = false,
|
||||||
|
item1Min = 0,
|
||||||
|
item1Max = 0,
|
||||||
|
item2Min = 0,
|
||||||
|
item2Max = 0,
|
||||||
|
item3Min = 0,
|
||||||
|
item3Max = 0,
|
||||||
|
item4Min = 0,
|
||||||
|
item4Max = 0,
|
||||||
|
item5Min = 0,
|
||||||
|
item5Max = 0,
|
||||||
|
item6Min = 0,
|
||||||
|
item6Max = 0,
|
||||||
|
item7Max = 0,
|
||||||
|
sortSupplies = false,
|
||||||
|
potionBp = 0,
|
||||||
|
runeBp = 0,
|
||||||
|
ammoBp = 0
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local config = SuppliesConfig[panelName]
|
||||||
|
|
||||||
|
-- data validation
|
||||||
|
local setup = config
|
||||||
|
setup.item1 = setup.item1 or 0
|
||||||
|
setup.item2 = setup.item2 or 0
|
||||||
|
setup.item3 = setup.item3 or 0
|
||||||
|
setup.item4 = setup.item4 or 0
|
||||||
|
setup.item5 = setup.item5 or 0
|
||||||
|
setup.item6 = setup.item6 or 0
|
||||||
|
setup.item1Min = setup.item1Min or 0
|
||||||
|
setup.item1Max = setup.item1Max or 0
|
||||||
|
setup.item2Min = setup.item2Min or 0
|
||||||
|
setup.item2Max = setup.item2Max or 0
|
||||||
|
setup.item3Min = setup.item3Min or 0
|
||||||
|
setup.item3Max = setup.item3Max or 0
|
||||||
|
setup.item4Min = setup.item4Min or 0
|
||||||
|
setup.item4Max = setup.item4Max or 0
|
||||||
|
setup.item5Min = setup.item5Min or 0
|
||||||
|
setup.item5Max = setup.item5Max or 0
|
||||||
|
setup.item6Min = setup.item6Min or 0
|
||||||
|
setup.item6Max = setup.item6Max or 0
|
||||||
|
setup.capValue = setup.capValue or 0
|
||||||
|
setup.staminaValue = setup.staminaValue or 0
|
||||||
|
|
||||||
|
rootWidget = g_ui.getRootWidget()
|
||||||
|
if rootWidget then
|
||||||
|
SuppliesWindow = g_ui.createWidget('SuppliesWindow', rootWidget)
|
||||||
|
SuppliesWindow:hide()
|
||||||
|
|
||||||
|
SuppliesWindow.capSwitch:setOn(config.capSwitch)
|
||||||
|
SuppliesWindow.capSwitch.onClick = function(widget)
|
||||||
|
config.capSwitch = not config.capSwitch
|
||||||
|
widget:setOn(config.capSwitch)
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.SoftBoots:setOn(config.SoftBoots)
|
||||||
|
SuppliesWindow.SoftBoots.onClick = function(widget)
|
||||||
|
config.SoftBoots = not config.SoftBoots
|
||||||
|
widget:setOn(config.SoftBoots)
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.imbues:setOn(config.imbues)
|
||||||
|
SuppliesWindow.imbues.onClick = function(widget)
|
||||||
|
config.imbues = not config.imbues
|
||||||
|
widget:setOn(config.imbues)
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.staminaSwitch:setOn(config.staminaSwitch)
|
||||||
|
SuppliesWindow.staminaSwitch.onClick = function(widget)
|
||||||
|
config.staminaSwitch = not config.staminaSwitch
|
||||||
|
widget:setOn(config.staminaSwitch)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- bot items
|
||||||
|
|
||||||
|
SuppliesWindow.item1:setItemId(config.item1)
|
||||||
|
SuppliesWindow.item1.onItemChange = function(widget)
|
||||||
|
config.item1 = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item2:setItemId(config.item2)
|
||||||
|
SuppliesWindow.item2.onItemChange = function(widget)
|
||||||
|
config.item2 = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item3:setItemId(config.item3)
|
||||||
|
SuppliesWindow.item3.onItemChange = function(widget)
|
||||||
|
config.item3 = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item4:setItemId(config.item4)
|
||||||
|
SuppliesWindow.item4.onItemChange = function(widget)
|
||||||
|
config.item4 = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item5:setItemId(config.item5)
|
||||||
|
SuppliesWindow.item5.onItemChange = function(widget)
|
||||||
|
config.item5 = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item6:setItemId(config.item6)
|
||||||
|
SuppliesWindow.item6.onItemChange = function(widget)
|
||||||
|
config.item6 = widget:getItemId()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- text windows
|
||||||
|
SuppliesWindow.capValue:setText(config.capValue)
|
||||||
|
SuppliesWindow.capValue.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.capValue:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.capValue:setText(0)
|
||||||
|
config.capValue = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.capValue = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item1Min:setText(config.item1Min)
|
||||||
|
SuppliesWindow.item1Min.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item1Min:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item1Min:setText(0)
|
||||||
|
config.item1Min = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item1Min = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item1Max:setText(config.item1Max)
|
||||||
|
SuppliesWindow.item1Max.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item1Max:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item1Max:setText(0)
|
||||||
|
config.item1Max = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item1Max = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item2Min:setText(config.item2Min)
|
||||||
|
SuppliesWindow.item2Min.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item2Min:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item2Min:setText(0)
|
||||||
|
config.item2Min = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item2Min = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item2Max:setText(config.item2Max)
|
||||||
|
SuppliesWindow.item2Max.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item2Max:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item2Max:setText(0)
|
||||||
|
config.item2Max = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item2Max = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item3Min:setText(config.item3Min)
|
||||||
|
SuppliesWindow.item3Min.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item3Min:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item3Min:setText(0)
|
||||||
|
config.item3Min = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item3Min = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item3Max:setText(config.item3Max)
|
||||||
|
SuppliesWindow.item3Max.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item3Max:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item3Max:setText(0)
|
||||||
|
config.item3Max = 0
|
||||||
|
else
|
||||||
|
config.item3Max = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item4Min:setText(config.item4Min)
|
||||||
|
SuppliesWindow.item4Min.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item4Min:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item4Min:setText(0)
|
||||||
|
config.item4Min = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item4Min = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.staminaValue:setText(config.staminaValue)
|
||||||
|
SuppliesWindow.staminaValue.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.staminaValue:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.staminaValue:setText(0)
|
||||||
|
config.staminaValue = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.staminaValue = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item4Max:setText(config.item4Max)
|
||||||
|
SuppliesWindow.item4Max.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item4Max:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item4Max:setText(0)
|
||||||
|
config.item4Max = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item4Max = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item5Min:setText(config.item5Min)
|
||||||
|
SuppliesWindow.item5Min.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item5Min:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item5Min:setText(0)
|
||||||
|
config.item5Min = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item5Min = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item5Max:setText(config.item5Max)
|
||||||
|
SuppliesWindow.item5Max.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item5Max:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item5Max:setText(0)
|
||||||
|
config.item5Max = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item5Max = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item6Min:setText(config.item6Min)
|
||||||
|
SuppliesWindow.item6Min.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item6Min:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item6Min:setText(0)
|
||||||
|
config.item6Min = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item6Min = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SuppliesWindow.item6Max:setText(config.item6Max)
|
||||||
|
SuppliesWindow.item6Max.onTextChange = function(widget, text)
|
||||||
|
local value = tonumber(SuppliesWindow.item6Max:getText())
|
||||||
|
if not value then
|
||||||
|
SuppliesWindow.item6Max:setText(0)
|
||||||
|
config.item6Max = 0
|
||||||
|
else
|
||||||
|
text = text:match("0*(%d+)")
|
||||||
|
config.item6Max = text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
UI.Button("Supplies", function()
|
||||||
|
SuppliesWindow:show()
|
||||||
|
SuppliesWindow:raise()
|
||||||
|
SuppliesWindow:focus()
|
||||||
|
end)
|
||||||
|
|
||||||
|
SuppliesWindow.close.onClick = function(widget)
|
||||||
|
SuppliesWindow:hide()
|
||||||
|
vBotConfigSave("supply")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
UI.Separator()
|
||||||
|
SuppliesPanel(setDefaultTab("Cave"))
|
@ -82,56 +82,6 @@ SuppliesWindow < MainWindow
|
|||||||
margin-left: 10
|
margin-left: 10
|
||||||
text: No Imbues
|
text: No Imbues
|
||||||
|
|
||||||
HorizontalSeparator
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: prev.left
|
|
||||||
anchors.right: prev.right
|
|
||||||
margin-top: 5
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: SortSupplies
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: prev.left
|
|
||||||
anchors.right: prev.right
|
|
||||||
margin-top: 5
|
|
||||||
text: Sort Supplies
|
|
||||||
|
|
||||||
BotItem
|
|
||||||
id: PotionBp
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: prev.left
|
|
||||||
margin-top: 3
|
|
||||||
|
|
||||||
Label
|
|
||||||
anchors.verticalCenter: prev.verticalCenter
|
|
||||||
anchors.left: prev.right
|
|
||||||
margin-left: 5
|
|
||||||
text: Potions
|
|
||||||
|
|
||||||
BotItem
|
|
||||||
id: RuneBp
|
|
||||||
anchors.top: PotionBp.bottom
|
|
||||||
anchors.left: PotionBp.left
|
|
||||||
margin-top: 3
|
|
||||||
|
|
||||||
Label
|
|
||||||
anchors.verticalCenter: prev.verticalCenter
|
|
||||||
anchors.left: prev.right
|
|
||||||
margin-left: 5
|
|
||||||
text: Runes
|
|
||||||
|
|
||||||
BotItem
|
|
||||||
id: AmmoBp
|
|
||||||
anchors.top: RuneBp.bottom
|
|
||||||
anchors.left: RuneBp.left
|
|
||||||
margin-top: 3
|
|
||||||
|
|
||||||
Label
|
|
||||||
anchors.verticalCenter: prev.verticalCenter
|
|
||||||
anchors.left: prev.right
|
|
||||||
margin-left: 5
|
|
||||||
text: Ammo
|
|
||||||
|
|
||||||
BotItem
|
BotItem
|
||||||
id: item1
|
id: item1
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
@ -4,8 +4,26 @@
|
|||||||
-- sums monster hits on a span of last 3seconds
|
-- sums monster hits on a span of last 3seconds
|
||||||
-- if last message was more than 3s ago then clears the table
|
-- if last message was more than 3s ago then clears the table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- initial global variables declaration
|
-- initial global variables declaration
|
||||||
BotServerMembers = {}
|
vBot = {} -- global namespace for bot variables
|
||||||
|
vBot.BotServerMembers = {}
|
||||||
|
vBot.standTime = now
|
||||||
|
vBot.isUsingPotion = false
|
||||||
|
vBot.isUsing = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- scripts / functions
|
||||||
|
onPlayerPositionChange(function(x,y)
|
||||||
|
vBot.standTime = now
|
||||||
|
end)
|
||||||
|
|
||||||
|
function standTime()
|
||||||
|
return now - vBot.standTime
|
||||||
|
end
|
||||||
|
|
||||||
local dmgTable = {}
|
local dmgTable = {}
|
||||||
local lastDmgMessage = now
|
local lastDmgMessage = now
|
||||||
@ -46,6 +64,7 @@ function whiteInfoMessage(text)
|
|||||||
return modules.game_textmessage.displayGameMessage(text)
|
return modules.game_textmessage.displayGameMessage(text)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- same as above but red message
|
||||||
function broadcastMessage(text)
|
function broadcastMessage(text)
|
||||||
return modules.game_textmessage.displayBroadcastMessage(text)
|
return modules.game_textmessage.displayBroadcastMessage(text)
|
||||||
end
|
end
|
||||||
@ -170,16 +189,16 @@ function killsToRs()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- calculates exhaust for potions based on "Aaaah..." message
|
-- calculates exhaust for potions based on "Aaaah..." message
|
||||||
-- changes state of storage variable, can be used in other scripts
|
-- changes state of vBot variable, can be used in other scripts
|
||||||
-- already used in pushmax, healbot, etc
|
-- already used in pushmax, healbot, etc
|
||||||
storage.isUsingPotion = false
|
|
||||||
onTalk(function(name, level, mode, text, channelId, pos)
|
onTalk(function(name, level, mode, text, channelId, pos)
|
||||||
if name ~= player:getName() then return end
|
if name ~= player:getName() then return end
|
||||||
if mode ~= 34 then return end
|
if mode ~= 34 then return end
|
||||||
|
|
||||||
if text == "Aaaah..." then
|
if text == "Aaaah..." then
|
||||||
storage.isUsingPotion = true
|
vBot.isUsingPotion = true
|
||||||
schedule(950, function() storage.isUsingPotion = false end)
|
schedule(950, function() vBot.isUsingPotion = false end)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@ -266,26 +285,35 @@ end
|
|||||||
-- based on info extracted by getSpellData checks if spell is on cooldown
|
-- based on info extracted by getSpellData checks if spell is on cooldown
|
||||||
-- returns boolean
|
-- returns boolean
|
||||||
function getSpellCoolDown(text)
|
function getSpellCoolDown(text)
|
||||||
if not text then return false end
|
if not text then return nil end
|
||||||
text = text:lower()
|
text = text:lower()
|
||||||
if not getSpellData(text) then return false end
|
local data = getSpellData(text)
|
||||||
for i, v in pairs(Spells) do
|
if not data then return false end
|
||||||
if v.words == text then
|
local icon = modules.game_cooldown.isCooldownIconActive(data.id)
|
||||||
return modules.game_cooldown.isCooldownIconActive(v.id)
|
local group = false
|
||||||
|
for groupId, duration in pairs(data.group) do
|
||||||
|
if modules.game_cooldown.isGroupCooldownIconActive(groupId) then
|
||||||
|
group = true
|
||||||
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if icon or group then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- global var to indicate that player is trying to do something
|
-- global var to indicate that player is trying to do something
|
||||||
-- prevents action blocking by scripts
|
-- prevents action blocking by scripts
|
||||||
-- below callbacks are triggers to changing the var state
|
-- below callbacks are triggers to changing the var state
|
||||||
local isUsingTime = now
|
local isUsingTime = now
|
||||||
storage.isUsing = false
|
|
||||||
macro(100, function()
|
macro(100, function()
|
||||||
storage.isUsing = now < isUsingTime and true or false
|
vBot.isUsing = now < isUsingTime and true or false
|
||||||
end)
|
end)
|
||||||
onUse(function(pos, itemId, stackPos, subType)
|
onUse(function(pos, itemId, stackPos, subType)
|
||||||
if pos.x > 65000 then return end
|
if pos.x > 65000 then return end
|
||||||
|
if getDistanceBetween(player:getPosition(), pos) > 1 then return end
|
||||||
local tile = g_map.getTile(pos)
|
local tile = g_map.getTile(pos)
|
||||||
if not tile then return end
|
if not tile then return end
|
||||||
|
|
||||||
@ -323,7 +351,7 @@ function isFriend(c)
|
|||||||
if table.find(storage.playerList.friendList, name) then
|
if table.find(storage.playerList.friendList, name) then
|
||||||
CachedFriends[c] = true
|
CachedFriends[c] = true
|
||||||
return true
|
return true
|
||||||
elseif BotServerMembers[name] ~= nil then
|
elseif vBot.BotServerMembers[name] ~= nil then
|
||||||
CachedFriends[c] = true
|
CachedFriends[c] = true
|
||||||
return true
|
return true
|
||||||
elseif storage.playerList.groupMembers then
|
elseif storage.playerList.groupMembers then
|
||||||
@ -347,9 +375,18 @@ end
|
|||||||
-- similar to isFriend but lighter version
|
-- similar to isFriend but lighter version
|
||||||
-- accepts only name string
|
-- accepts only name string
|
||||||
-- returns boolean
|
-- returns boolean
|
||||||
function isEnemy(name)
|
function isEnemy(c)
|
||||||
|
local name = c
|
||||||
|
local p
|
||||||
|
if type(c) ~= "string" then
|
||||||
|
if c == player then return false end
|
||||||
|
name = c:getName()
|
||||||
|
p = c
|
||||||
|
end
|
||||||
if not name then return false end
|
if not name then return false end
|
||||||
local p = getCreatureByName(name, true)
|
if not p then
|
||||||
|
p = getCreatureByName(name, true)
|
||||||
|
end
|
||||||
if not p then return end
|
if not p then return end
|
||||||
if p:isLocalPlayer() then return end
|
if p:isLocalPlayer() then return end
|
||||||
|
|
||||||
@ -361,6 +398,43 @@ function isEnemy(name)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function getPlayerDistribution()
|
||||||
|
local friends = {}
|
||||||
|
local neutrals = {}
|
||||||
|
local enemies = {}
|
||||||
|
for i, spec in ipairs(getSpectators()) do
|
||||||
|
if spec:isPlayer() and not spec:isLocalPlayer() then
|
||||||
|
if isFriend(spec) then
|
||||||
|
table.insert(friends, spec)
|
||||||
|
elseif isEnemy(spec) then
|
||||||
|
table.insert(enemies, spec)
|
||||||
|
else
|
||||||
|
table.insert(neutrals, spec)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return friends, neutrals, enemies
|
||||||
|
end
|
||||||
|
|
||||||
|
function getFriends()
|
||||||
|
local friends, neutrals, enemies = getPlayerDistribution()
|
||||||
|
|
||||||
|
return friends
|
||||||
|
end
|
||||||
|
|
||||||
|
function getNeutrals()
|
||||||
|
local friends, neutrals, enemies = getPlayerDistribution()
|
||||||
|
|
||||||
|
return neutrals
|
||||||
|
end
|
||||||
|
|
||||||
|
function getEnemies()
|
||||||
|
local friends, neutrals, enemies = getPlayerDistribution()
|
||||||
|
|
||||||
|
return enemies
|
||||||
|
end
|
||||||
|
|
||||||
-- based on first word in string detects if text is a offensive spell
|
-- based on first word in string detects if text is a offensive spell
|
||||||
-- returns boolean
|
-- returns boolean
|
||||||
function isAttSpell(expr)
|
function isAttSpell(expr)
|
@ -65,7 +65,10 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, relo
|
|||||||
onWalk = {},
|
onWalk = {},
|
||||||
onImbuementWindow = {},
|
onImbuementWindow = {},
|
||||||
onModalDialog = {},
|
onModalDialog = {},
|
||||||
onAttackingCreatureChange = {}
|
onAttackingCreatureChange = {},
|
||||||
|
onManaChange = {},
|
||||||
|
onStatesChange = {},
|
||||||
|
onAddItem = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
-- basic functions & classes
|
-- basic functions & classes
|
||||||
@ -75,6 +78,7 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, relo
|
|||||||
context.tostring = tostring
|
context.tostring = tostring
|
||||||
context.math = math
|
context.math = math
|
||||||
context.table = table
|
context.table = table
|
||||||
|
context.setmetatable = setmetatable
|
||||||
context.string = string
|
context.string = string
|
||||||
context.tonumber = tonumber
|
context.tonumber = tonumber
|
||||||
context.type = type
|
context.type = type
|
||||||
@ -301,9 +305,9 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, relo
|
|||||||
callback(container)
|
callback(container)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
onContainerUpdateItem = function(container, slot, item)
|
onContainerUpdateItem = function(container, slot, item, oldItem)
|
||||||
for i, callback in ipairs(context._callbacks.onContainerUpdateItem) do
|
for i, callback in ipairs(context._callbacks.onContainerUpdateItem) do
|
||||||
callback(container, slot, item)
|
callback(container, slot, item, oldItem)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
onMissle = function(missle)
|
onMissle = function(missle)
|
||||||
@ -361,6 +365,21 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, relo
|
|||||||
callback(creature, oldCreature)
|
callback(creature, oldCreature)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
onManaChange = function(player, mana, maxMana, oldMana, oldMaxMana)
|
||||||
|
for i, callback in ipairs(context._callbacks.onManaChange) do
|
||||||
|
callback(player, mana, maxMana, oldMana, oldMaxMana)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
onAddItem = function(container, slot, item)
|
||||||
|
for i, callback in ipairs(context._callbacks.onAddItem) do
|
||||||
|
callback(container, slot, item)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
onStatesChange = function(states, oldStates)
|
||||||
|
for i, callback in ipairs(context._callbacks.onStatesChange) do
|
||||||
|
callback(states, oldStates)
|
||||||
|
end
|
||||||
|
end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
@ -125,7 +125,7 @@ context.onContainerClose = function(callback)
|
|||||||
return context.callback("onContainerClose", callback)
|
return context.callback("onContainerClose", callback)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- onContainerUpdateItem -- callback = function(container, slot, item)
|
-- onContainerUpdateItem -- callback = function(container, slot, item, oldItem)
|
||||||
context.onContainerUpdateItem = function(callback)
|
context.onContainerUpdateItem = function(callback)
|
||||||
return context.callback("onContainerUpdateItem", callback)
|
return context.callback("onContainerUpdateItem", callback)
|
||||||
end
|
end
|
||||||
@ -190,6 +190,21 @@ context.onAttackingCreatureChange = function(callback)
|
|||||||
return context.callback("onAttackingCreatureChange", callback)
|
return context.callback("onAttackingCreatureChange", callback)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- onManaChange -- callback = function(player, mana, maxMana, oldMana, oldMaxMana)
|
||||||
|
context.onManaChange = function(callback)
|
||||||
|
return context.callback("onManaChange", callback)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- onAddItem - callback = function(container, slot, item)
|
||||||
|
context.onAddItem = function(callback)
|
||||||
|
return context.callback("onAddItem", callback)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- onStatesChange - callback = function(states, oldStates)
|
||||||
|
context.onStatesChange = function(callback)
|
||||||
|
return context.callback("onStatesChange", callback)
|
||||||
|
end
|
||||||
|
|
||||||
-- CUSTOM CALLBACKS
|
-- CUSTOM CALLBACKS
|
||||||
|
|
||||||
-- listen(name, callback) -- callback = function(text, channelId, pos)
|
-- listen(name, callback) -- callback = function(text, channelId, pos)
|
||||||
|
@ -33,9 +33,12 @@ NPCItemBox < UICheckBox
|
|||||||
MainWindow
|
MainWindow
|
||||||
id: npcWindow
|
id: npcWindow
|
||||||
!text: tr('NPC Trade')
|
!text: tr('NPC Trade')
|
||||||
size: 550 340
|
size: 550 460
|
||||||
@onEscape: modules.game_npctrade.closeNpcTrade()
|
@onEscape: modules.game_npctrade.closeNpcTrade()
|
||||||
|
|
||||||
|
$mobile:
|
||||||
|
size: 550 360
|
||||||
|
|
||||||
TabButton
|
TabButton
|
||||||
id: buyTab
|
id: buyTab
|
||||||
!tooltip: tr("List of items that you're able to buy")
|
!tooltip: tr("List of items that you're able to buy")
|
||||||
@ -56,12 +59,15 @@ MainWindow
|
|||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
|
|
||||||
FlatPanel
|
FlatPanel
|
||||||
height: 150
|
height: 250
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.top: prev.bottom
|
anchors.top: prev.bottom
|
||||||
margin-top: 5
|
margin-top: 5
|
||||||
|
|
||||||
|
$mobile:
|
||||||
|
height: 150
|
||||||
|
|
||||||
VerticalScrollBar
|
VerticalScrollBar
|
||||||
id: itemsPanelListScrollBar
|
id: itemsPanelListScrollBar
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
|
BIN
otclient_dx.exe
BIN
otclient_dx.exe
Binary file not shown.
BIN
otclient_gl.exe
BIN
otclient_gl.exe
Binary file not shown.
BIN
otclient_linux
BIN
otclient_linux
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user