Updated to OTCv8 3.1 rev 112
BIN
data/images/game/prey/prey_bigdamage.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
data/images/game/prey/prey_bigdefense.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
data/images/game/prey/prey_biginactive.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
data/images/game/prey/prey_bigloot.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
data/images/game/prey/prey_bignobonus.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
data/images/game/prey/prey_bigxp.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
data/images/game/prey/prey_bonus_reroll.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
data/images/game/prey/prey_choose.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
data/images/game/prey/prey_damage.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_defense.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_gold.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/game/prey/prey_inactive.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_loot.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_no_bonus.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_nostar.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/game/prey/prey_perm.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
data/images/game/prey/prey_perm_test.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_reroll.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
data/images/game/prey/prey_reroll_blocked.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
data/images/game/prey/prey_select.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
data/images/game/prey/prey_select_blocked.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
data/images/game/prey/prey_smallstore.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_star.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/game/prey/prey_temp.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
data/images/game/prey/prey_temp_test.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
data/images/game/prey/prey_wildcard.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/game/prey/prey_xp.png
Normal file
After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 16 KiB |
BIN
data/images/topbuttons/prey_window.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
data/images/ui/graph_background.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
data/images/ui/rarity_blue.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/ui/rarity_gold.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/ui/rarity_green.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/ui/rarity_purple.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
data/images/ui/rarity_white.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
layouts/retro/images/game/prey/prey_damage.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/game/prey/prey_defense.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/game/prey/prey_inactive.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/game/prey/prey_loot.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/game/prey/prey_no_bonus.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/game/prey/prey_xp.png
Normal file
After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/topbuttons/prey_window.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
layouts/retro/images/ui/rarity_blue.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
layouts/retro/images/ui/rarity_gold.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
layouts/retro/images/ui/rarity_green.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
layouts/retro/images/ui/rarity_purple.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
layouts/retro/images/ui/rarity_white.png
Normal file
After Width: | Height: | Size: 16 KiB |
@ -103,6 +103,13 @@ function clear()
|
|||||||
widget:destroy()
|
widget:destroy()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
for _, widget in pairs({modules.game_interface.getRightPanel(), modules.game_interface.getLeftPanel()}) do
|
||||||
|
for i, child in pairs(widget:getChildren()) do
|
||||||
|
if child.botWidget then
|
||||||
|
child:destroy()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local gameMapPanel = modules.game_interface.getMapPanel()
|
local gameMapPanel = modules.game_interface.getMapPanel()
|
||||||
if gameMapPanel then
|
if gameMapPanel then
|
||||||
@ -478,6 +485,11 @@ function initCallbacks()
|
|||||||
onImbuementWindow = botImbuementWindow,
|
onImbuementWindow = botImbuementWindow,
|
||||||
onModalDialog = botModalDialog,
|
onModalDialog = botModalDialog,
|
||||||
onAttackingCreatureChange = botAttackingCreatureChange,
|
onAttackingCreatureChange = botAttackingCreatureChange,
|
||||||
|
onAddItem = botContainerAddItem,
|
||||||
|
onRemoveItem = botContainerRemoveItem,
|
||||||
|
onGameEditText = botGameEditText,
|
||||||
|
onSpellCooldown = botSpellCooldown,
|
||||||
|
onSpellGroupCooldown = botGroupSpellCooldown
|
||||||
})
|
})
|
||||||
|
|
||||||
connect(Tile, {
|
connect(Tile, {
|
||||||
@ -508,6 +520,7 @@ function initCallbacks()
|
|||||||
onClose = botContainerClose,
|
onClose = botContainerClose,
|
||||||
onUpdateItem = botContainerUpdateItem,
|
onUpdateItem = botContainerUpdateItem,
|
||||||
onAddItem = botContainerAddItem,
|
onAddItem = botContainerAddItem,
|
||||||
|
onRemoveItem = botContainerRemoveItem,
|
||||||
})
|
})
|
||||||
|
|
||||||
connect(g_map, {
|
connect(g_map, {
|
||||||
@ -536,7 +549,10 @@ function terminateCallbacks()
|
|||||||
onChannelEvent = botChannelEvent,
|
onChannelEvent = botChannelEvent,
|
||||||
onImbuementWindow = botImbuementWindow,
|
onImbuementWindow = botImbuementWindow,
|
||||||
onModalDialog = botModalDialog,
|
onModalDialog = botModalDialog,
|
||||||
onAttackingCreatureChange = botAttackingCreatureChange
|
onAttackingCreatureChange = botAttackingCreatureChange,
|
||||||
|
onGameEditText = botGameEditText,
|
||||||
|
onSpellCooldown = botSpellCooldown,
|
||||||
|
onSpellGroupCooldown = botGroupSpellCooldown
|
||||||
})
|
})
|
||||||
|
|
||||||
disconnect(Tile, {
|
disconnect(Tile, {
|
||||||
@ -567,6 +583,7 @@ function terminateCallbacks()
|
|||||||
onClose = botContainerClose,
|
onClose = botContainerClose,
|
||||||
onUpdateItem = botContainerUpdateItem,
|
onUpdateItem = botContainerUpdateItem,
|
||||||
onAddItem = botContainerAddItem,
|
onAddItem = botContainerAddItem,
|
||||||
|
onRemoveItem = botContainerRemoveItem
|
||||||
})
|
})
|
||||||
|
|
||||||
disconnect(g_map, {
|
disconnect(g_map, {
|
||||||
@ -726,6 +743,11 @@ function botModalDialog(id, title, message, buttons, enterButton, escapeButton,
|
|||||||
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 botGameEditText(id, itemId, maxLength, text, writer, time)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onGameEditText(id, itemId, maxLength, text, writer, time) end)
|
||||||
|
end
|
||||||
|
|
||||||
function botAttackingCreatureChange(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)
|
||||||
@ -741,7 +763,22 @@ function botStatesChange(states, oldStates)
|
|||||||
safeBotCall(function() botExecutor.callbacks.onStatesChange(states, oldStates) end)
|
safeBotCall(function() botExecutor.callbacks.onStatesChange(states, oldStates) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
function botContainerAddItem(container, slot, item)
|
function botContainerAddItem(container, slot, item, oldItem)
|
||||||
if botExecutor == nil then return false end
|
if botExecutor == nil then return false end
|
||||||
safeBotCall(function() botExecutor.callbacks.onAddItem(container, slot, item) end)
|
safeBotCall(function() botExecutor.callbacks.onAddItem(container, slot, item, oldItem) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function botContainerRemoveItem(container, slot, item)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onRemoveItem(container, slot, item) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function botSpellCooldown(iconId, duration)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onSpellCooldown(iconId, duration) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function botGroupSpellCooldown(iconId, duration)
|
||||||
|
if botExecutor == nil then return false end
|
||||||
|
safeBotCall(function() botExecutor.callbacks.onGroupSpellCooldown(iconId, duration) end)
|
||||||
end
|
end
|
@ -1,105 +0,0 @@
|
|||||||
AlarmsWindow < MainWindow
|
|
||||||
!text: tr('Alarms')
|
|
||||||
size: 270 200
|
|
||||||
@onEscape: self:hide()
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: playerAttack
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: parent.top
|
|
||||||
text-align: center
|
|
||||||
text: Player Attack
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: playerDetected
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.horizontalCenter
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 4
|
|
||||||
text-align: center
|
|
||||||
text: Player Detected
|
|
||||||
|
|
||||||
CheckBox
|
|
||||||
id: playerDetectedLogout
|
|
||||||
anchors.top: playerDetected.top
|
|
||||||
anchors.left: parent.horizontalCenter
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 3
|
|
||||||
margin-left: 4
|
|
||||||
text: Logout
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: creatureDetected
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: playerDetected.bottom
|
|
||||||
margin-top: 4
|
|
||||||
text-align: center
|
|
||||||
text: Creature Detected
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: healthBelow
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.right: parent.horizontalCenter
|
|
||||||
text-align: center
|
|
||||||
margin-top: 4
|
|
||||||
text: Health < 50%
|
|
||||||
|
|
||||||
HorizontalScrollBar
|
|
||||||
id: healthValue
|
|
||||||
anchors.left: parent.horizontalCenter
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: healthBelow.top
|
|
||||||
margin-left: 3
|
|
||||||
margin-top: 2
|
|
||||||
minimum: 1
|
|
||||||
maximum: 100
|
|
||||||
step: 1
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: manaBelow
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: healthBelow.bottom
|
|
||||||
anchors.right: parent.horizontalCenter
|
|
||||||
text-align: center
|
|
||||||
margin-top: 4
|
|
||||||
text: Mana < 50%
|
|
||||||
|
|
||||||
HorizontalScrollBar
|
|
||||||
id: manaValue
|
|
||||||
anchors.left: parent.horizontalCenter
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: manaBelow.top
|
|
||||||
margin-left: 3
|
|
||||||
margin-top: 2
|
|
||||||
minimum: 1
|
|
||||||
maximum: 100
|
|
||||||
step: 1
|
|
||||||
|
|
||||||
BotSwitch
|
|
||||||
id: privateMessage
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.top: manaBelow.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
text-align: center
|
|
||||||
margin-top: 4
|
|
||||||
text: Private Message
|
|
||||||
|
|
||||||
HorizontalSeparator
|
|
||||||
id: separator
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.bottom: closeButton.top
|
|
||||||
margin-bottom: 8
|
|
||||||
|
|
||||||
Button
|
|
||||||
id: closeButton
|
|
||||||
!text: tr('Close')
|
|
||||||
font: cipsoftFont
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
size: 45 21
|
|
||||||
margin-top: 15
|
|
||||||
margin-right: 5
|
|
@ -1,437 +0,0 @@
|
|||||||
setDefaultTab("Main")
|
|
||||||
-- first, the variables
|
|
||||||
local launchTime = now
|
|
||||||
local startExp = exp()
|
|
||||||
local dmgTable = {}
|
|
||||||
local healTable = {}
|
|
||||||
local expTable = {}
|
|
||||||
local totalDmg = 0
|
|
||||||
local totalHeal = 0
|
|
||||||
local dmgDistribution = {}
|
|
||||||
local first = "-"
|
|
||||||
local second = "-"
|
|
||||||
local third = "-"
|
|
||||||
local bestHit = 0
|
|
||||||
local bestHeal = 0
|
|
||||||
local lootedItems = {}
|
|
||||||
local useData = {}
|
|
||||||
local usedItems ={}
|
|
||||||
|
|
||||||
local resetSessionData = function()
|
|
||||||
launchTime = now
|
|
||||||
startExp = exp()
|
|
||||||
dmgTable = {}
|
|
||||||
healTable = {}
|
|
||||||
expTable = {}
|
|
||||||
totalDmg = 0
|
|
||||||
totalHeal = 0
|
|
||||||
dmgDistribution = {}
|
|
||||||
first = "-"
|
|
||||||
second = "-"
|
|
||||||
third = "-"
|
|
||||||
bestHit = 0
|
|
||||||
bestHeal = 0
|
|
||||||
lootedItems = {}
|
|
||||||
useData = {}
|
|
||||||
usedItems ={}
|
|
||||||
refreshLoot()
|
|
||||||
refreshWaste()
|
|
||||||
end
|
|
||||||
|
|
||||||
function format_thousand(v)
|
|
||||||
if not v then return 0 end
|
|
||||||
local s = string.format("%d", math.floor(v))
|
|
||||||
local pos = string.len(s) % 3
|
|
||||||
if pos == 0 then pos = 3 end
|
|
||||||
return string.sub(s, 1, pos)
|
|
||||||
.. string.gsub(string.sub(s, pos+1), "(...)", ".%1")
|
|
||||||
end
|
|
||||||
|
|
||||||
local expGained = function()
|
|
||||||
return exp() - startExp
|
|
||||||
end
|
|
||||||
local expLeft = function()
|
|
||||||
local level = lvl()+1
|
|
||||||
return math.floor((50*level*level*level)/3 - 100*level*level + (850*level)/3 - 200) - exp()
|
|
||||||
end
|
|
||||||
|
|
||||||
local niceTimeFormat = function(v) -- v in seconds
|
|
||||||
local hours = string.format("%02.f", math.floor(v/3600))
|
|
||||||
local mins = string.format("%02.f", math.floor(v/60 - (hours*60)))
|
|
||||||
return hours .. ":" .. mins .. "h"
|
|
||||||
end
|
|
||||||
local uptime
|
|
||||||
local sessionTime = function()
|
|
||||||
uptime = math.floor((now - launchTime)/1000)
|
|
||||||
return niceTimeFormat(uptime)
|
|
||||||
end
|
|
||||||
sessionTime()
|
|
||||||
|
|
||||||
local expPerHour = function(calculation)
|
|
||||||
local r = 0
|
|
||||||
if #expTable > 0 then
|
|
||||||
r = exp() - expTable[1]
|
|
||||||
else
|
|
||||||
return "-"
|
|
||||||
end
|
|
||||||
|
|
||||||
if uptime < 15*60 then
|
|
||||||
r = math.ceil((r/uptime)*60*60)
|
|
||||||
else
|
|
||||||
r = math.ceil(r*8)
|
|
||||||
end
|
|
||||||
if calculation then
|
|
||||||
return r
|
|
||||||
else
|
|
||||||
return format_thousand(r)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local timeToLevel = function()
|
|
||||||
local t = 0
|
|
||||||
if expPerHour(true) == 0 or expPerHour() == "-" then
|
|
||||||
return "-"
|
|
||||||
else
|
|
||||||
t = expLeft()/expPerHour(true)
|
|
||||||
return niceTimeFormat(math.ceil(t*60*60))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local sumT = function(t)
|
|
||||||
local s = 0
|
|
||||||
for i,v in pairs(t) do
|
|
||||||
s = s + v.d
|
|
||||||
end
|
|
||||||
return s
|
|
||||||
end
|
|
||||||
|
|
||||||
local valueInSeconds = function(t)
|
|
||||||
local d = 0
|
|
||||||
local time = 0
|
|
||||||
if #t > 0 then
|
|
||||||
for i, v in ipairs(t) do
|
|
||||||
if now - v.t <= 3000 then
|
|
||||||
if time == 0 then
|
|
||||||
time = v.t
|
|
||||||
end
|
|
||||||
d = d + v.d
|
|
||||||
else
|
|
||||||
table.remove(t, 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return math.ceil(d/((now-time)/1000))
|
|
||||||
end
|
|
||||||
|
|
||||||
local regex = "You lose ([0-9]*) hitpoints due to an attack by ([a-z]*) ([a-z A-z-]*)"
|
|
||||||
onTextMessage(function(mode, text)
|
|
||||||
if mode == 21 then -- damage dealt
|
|
||||||
totalDmg = totalDmg + getFirstNumberInText(text)
|
|
||||||
table.insert(dmgTable, {d = getFirstNumberInText(text), t = now})
|
|
||||||
if getFirstNumberInText(text) > bestHit then
|
|
||||||
bestHit = getFirstNumberInText(text)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if mode == 23 then -- healing
|
|
||||||
totalHeal = totalHeal + getFirstNumberInText(text)
|
|
||||||
table.insert(healTable, {d = getFirstNumberInText(text), t = now})
|
|
||||||
if getFirstNumberInText(text) > bestHeal then
|
|
||||||
bestHeal = getFirstNumberInText(text)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- damage distribution part
|
|
||||||
if text:find("You lose") then
|
|
||||||
local data = regexMatch(text, regex)[1]
|
|
||||||
if data then
|
|
||||||
local monster = data[4]
|
|
||||||
local val = data[2]
|
|
||||||
table.insert(dmgDistribution, {v=val,m=monster,t=now})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
|
||||||
-- tables maintance
|
|
||||||
macro(500, function()
|
|
||||||
local dmgFinal = {}
|
|
||||||
local labelTable = {}
|
|
||||||
local dmgSum = 0
|
|
||||||
table.insert(expTable, exp())
|
|
||||||
if #expTable > 15*60 then
|
|
||||||
for i,v in pairs(expTable) do
|
|
||||||
if i == 1 then
|
|
||||||
table.remove(expTable, i)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for i,v in pairs(dmgDistribution) do
|
|
||||||
if now - v.t > 60*1000*10 then
|
|
||||||
table.remove(dmgDistribution, i)
|
|
||||||
else
|
|
||||||
dmgSum = dmgSum + v.v
|
|
||||||
if not dmgFinal[v.m] then
|
|
||||||
dmgFinal[v.m] = v.v
|
|
||||||
else
|
|
||||||
dmgFinal[v.m] = dmgFinal[v.m] + v.v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if not dmgFinal[1] then
|
|
||||||
first = "-"
|
|
||||||
end
|
|
||||||
if not dmgFinal[2] then
|
|
||||||
second = "-"
|
|
||||||
end
|
|
||||||
if not dmgFinal[3] then
|
|
||||||
third = "-"
|
|
||||||
end
|
|
||||||
|
|
||||||
local iter = 0
|
|
||||||
for k,v in pairs(dmgFinal) do
|
|
||||||
table.insert(labelTable, {m=k, d=tonumber(v)})
|
|
||||||
end
|
|
||||||
|
|
||||||
table.sort(labelTable, function(a,b) return a.d > b.d end)
|
|
||||||
|
|
||||||
for i,v in pairs(labelTable) do
|
|
||||||
local label = v.m .. ": " .. math.floor((v.d/dmgSum)*100) .. "%"
|
|
||||||
if i == 1 then
|
|
||||||
first = label
|
|
||||||
elseif i == 2 then
|
|
||||||
second = label
|
|
||||||
elseif i == 3 then
|
|
||||||
third = label
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- visuals
|
|
||||||
UI.Separator()
|
|
||||||
local main = UI.createWidget("MainAnalyzer")
|
|
||||||
local ui = UI.createWidget("HuntingAnalyzer")
|
|
||||||
local ui2 = UI.createWidget("LootAnalyzer")
|
|
||||||
ui:hide()
|
|
||||||
ui2:hide()
|
|
||||||
|
|
||||||
function refreshLoot()
|
|
||||||
for i, child in pairs(ui2.List:getChildren()) do
|
|
||||||
child:destroy()
|
|
||||||
end
|
|
||||||
|
|
||||||
for k,v in pairs(lootedItems) do
|
|
||||||
local label = g_ui.createWidget("LootItemLabel", ui2.List)
|
|
||||||
label:setText(v .. "x " .. k)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function refreshWaste()
|
|
||||||
for i, child in pairs(ui2.supplyList:getChildren()) do
|
|
||||||
child:destroy()
|
|
||||||
end
|
|
||||||
|
|
||||||
for k,v in pairs(usedItems) do
|
|
||||||
local label = g_ui.createWidget("LootItemLabel", ui2.supplyList)
|
|
||||||
label:setText(v .. "x " .. k)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- loot analyzer
|
|
||||||
-- adding
|
|
||||||
local containers = CaveBot.GetLootContainers()
|
|
||||||
local lastCap = freecap()
|
|
||||||
onAddItem(function(container, slot, item, oldItem)
|
|
||||||
if not table.find(containers, container:getContainerItem():getId()) then return end
|
|
||||||
if isInPz() then return end
|
|
||||||
if slot > 0 then return end
|
|
||||||
if freecap() >= lastCap then return end
|
|
||||||
local name = item:getId() == 3031 and "gold coin" or item:getId() == 3035 and "platinum coin" or item:getId() == 3043 and "crystal coin" or item:getMarketData().name
|
|
||||||
|
|
||||||
if not lootedItems[name] then
|
|
||||||
lootedItems[name] = item:getCount()
|
|
||||||
else
|
|
||||||
lootedItems[name] = lootedItems[name] + item:getCount()
|
|
||||||
end
|
|
||||||
refreshLoot()
|
|
||||||
end)
|
|
||||||
|
|
||||||
onContainerUpdateItem(function(container, slot, item, oldItem)
|
|
||||||
if not table.find(containers, container:getContainerItem():getId()) then return end
|
|
||||||
if not oldItem then return end
|
|
||||||
if isInPz() then return end
|
|
||||||
if freecap() == lastCap then return end
|
|
||||||
|
|
||||||
local name = item:getId() == 3031 and "gold coin" or item:getId() == 3035 and "platinum coin" or item:getId() == 3043 and "crystal coin" or item:getMarketData().name
|
|
||||||
local amount = item:getCount() - oldItem:getCount()
|
|
||||||
|
|
||||||
if not lootedItems[name] then
|
|
||||||
lootedItems[name] = amount
|
|
||||||
else
|
|
||||||
lootedItems[name] = lootedItems[name] + amount
|
|
||||||
end
|
|
||||||
refreshLoot()
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- waste
|
|
||||||
local regex3 = [[\d ([a-z A-Z]*)s...]]
|
|
||||||
useData = {}
|
|
||||||
usedItems = {}
|
|
||||||
onTextMessage(function(mode, text)
|
|
||||||
text = text:lower()
|
|
||||||
if not text:find("using one of") then return end
|
|
||||||
|
|
||||||
local amount = getFirstNumberInText(text)
|
|
||||||
local re = regexMatch(text, regex3)
|
|
||||||
local name = re[1][2]
|
|
||||||
|
|
||||||
if not useData[name] then
|
|
||||||
useData[name] = amount
|
|
||||||
else
|
|
||||||
if math.abs(useData[name]-amount) == 1 then
|
|
||||||
useData[name] = amount
|
|
||||||
if not usedItems[name] then
|
|
||||||
usedItems[name] = 1
|
|
||||||
else
|
|
||||||
usedItems[name] = usedItems[name] + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
refreshWaste()
|
|
||||||
end)
|
|
||||||
|
|
||||||
function toggleBetween()
|
|
||||||
if ui:isVisible() then
|
|
||||||
ui:hide()
|
|
||||||
ui2:show()
|
|
||||||
main.change:setText("Hunt")
|
|
||||||
else
|
|
||||||
ui:show()
|
|
||||||
ui2:hide()
|
|
||||||
main.change:setText("Loot")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function hideAll()
|
|
||||||
if not ui:isVisible() and not ui2:isVisible() then
|
|
||||||
ui:show()
|
|
||||||
ui2:hide()
|
|
||||||
else
|
|
||||||
ui:hide()
|
|
||||||
ui2:hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
main.reset.onClick = function(widget)
|
|
||||||
resetSessionData()
|
|
||||||
end
|
|
||||||
main.toggle.onClick = function(widget)
|
|
||||||
hideAll()
|
|
||||||
end
|
|
||||||
main.change.onClick = function(widget)
|
|
||||||
toggleBetween()
|
|
||||||
end
|
|
||||||
|
|
||||||
function hourVal(v)
|
|
||||||
return (v/uptime)*3600
|
|
||||||
end
|
|
||||||
|
|
||||||
local lootWorth
|
|
||||||
local wasteWorth
|
|
||||||
local balance
|
|
||||||
local balanceDesc
|
|
||||||
local hourDesc
|
|
||||||
local desc
|
|
||||||
local hour
|
|
||||||
|
|
||||||
|
|
||||||
function bottingStats()
|
|
||||||
lootWorth = 0
|
|
||||||
wasteWorth = 0
|
|
||||||
for k, v in pairs(lootedItems) do
|
|
||||||
if LootItems[k] then
|
|
||||||
lootWorth = lootWorth + (LootItems[k]*v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for k, v in pairs(usedItems) do
|
|
||||||
if LootItems[k] then
|
|
||||||
wasteWorth = wasteWorth + (LootItems[k]*v)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
balance = lootWorth - wasteWorth
|
|
||||||
|
|
||||||
return lootWorth, wasteWorth, balance
|
|
||||||
end
|
|
||||||
|
|
||||||
function bottingLabels(lootWorth, wasteWorth, balance)
|
|
||||||
balanceDesc = nil
|
|
||||||
hourDesc = nil
|
|
||||||
desc = nil
|
|
||||||
|
|
||||||
if balance >= 1000000 or balance <= -1000000 then
|
|
||||||
desc = balance / 1000000
|
|
||||||
balanceDesc = math.floor(desc) .. "." .. math.floor(desc * 10) % 10 .. "kk"
|
|
||||||
elseif balance >= 1000 or balance <= -1000 then
|
|
||||||
desc = balance / 1000
|
|
||||||
balanceDesc = math.floor(desc) .. "." .. math.floor(desc * 10) % 10 .."k"
|
|
||||||
else
|
|
||||||
balanceDesc = balance .. "gp"
|
|
||||||
end
|
|
||||||
|
|
||||||
hour = hourVal(balance)
|
|
||||||
if hour >= 1000000 or hour <= -1000000 then
|
|
||||||
desc = balance / 1000000
|
|
||||||
hourDesc = math.floor(hourVal(desc)) .. "." .. math.floor(hourVal(desc) * 10) % 10 .. "kk/h"
|
|
||||||
elseif hour >= 1000 or hour <= -1000 then
|
|
||||||
desc = balance / 1000
|
|
||||||
hourDesc = math.floor(hourVal(desc)) .. "." .. math.floor(hourVal(desc) * 10) % 10 .. "k/h"
|
|
||||||
else
|
|
||||||
hourDesc = math.floor(hourVal(balance)) .. "gp/h"
|
|
||||||
end
|
|
||||||
|
|
||||||
return balanceDesc, hourDesc
|
|
||||||
end
|
|
||||||
|
|
||||||
function reportStats()
|
|
||||||
local lootWorth, wasteWorth, balance = bottingStats()
|
|
||||||
local balanceDesc, hourDesc = bottingLabels(lootWorth, wasteWorth, balance)
|
|
||||||
|
|
||||||
local a, b, c
|
|
||||||
|
|
||||||
a = "Session Time: " .. sessionTime() .. ", Exp Gained: " .. format_thousand(expGained()) .. ", Exp/h: " .. expPerHour()
|
|
||||||
b = " | Balance: " .. balanceDesc .. " (" .. hourDesc .. ")"
|
|
||||||
c = a..b
|
|
||||||
|
|
||||||
return c
|
|
||||||
end
|
|
||||||
|
|
||||||
macro(500, function()
|
|
||||||
local lootWorth, wasteWorth, balance = bottingStats()
|
|
||||||
local balanceDesc, hourDesc = bottingLabels(lootWorth, wasteWorth, balance)
|
|
||||||
-- hunting
|
|
||||||
ui.one:setText(sessionTime())
|
|
||||||
ui.two:setText(format_thousand(expGained()))
|
|
||||||
ui.three:setText(expPerHour())
|
|
||||||
ui.four:setText(timeToLevel())
|
|
||||||
ui.five:setText(format_thousand(burstDamageValue()))
|
|
||||||
ui.six:setText(format_thousand(totalDmg))
|
|
||||||
ui.seven:setText(format_thousand(valueInSeconds(dmgTable)))
|
|
||||||
ui.eight:setText(format_thousand(bestHit))
|
|
||||||
ui.nine:setText(format_thousand(totalHeal))
|
|
||||||
ui.ten:setText(format_thousand(valueInSeconds(healTable)))
|
|
||||||
ui.eleven:setText(format_thousand(bestHeal))
|
|
||||||
ui.dOne:setText(first)
|
|
||||||
ui.dTwo:setText(second)
|
|
||||||
ui.dThree:setText(third)
|
|
||||||
|
|
||||||
-- loot
|
|
||||||
ui2.loot:setText(format_thousand(lootWorth))
|
|
||||||
ui2.lootHour:setText(format_thousand(hourVal(lootWorth)))
|
|
||||||
ui2.supplies:setText(format_thousand(wasteWorth))
|
|
||||||
ui2.suppliesHour:setText(format_thousand(hourVal(wasteWorth)))
|
|
||||||
ui.balance:setColor(balance >= 0 and "green" or "red")
|
|
||||||
ui.balance:setText(balanceDesc .. " (" .. hourDesc .. ")")
|
|
||||||
end)
|
|
||||||
|
|
@ -1,367 +0,0 @@
|
|||||||
LootItemLabel < Label
|
|
||||||
opacity: 0.87
|
|
||||||
text-offset: 2 0
|
|
||||||
focusable: false
|
|
||||||
height: 16
|
|
||||||
|
|
||||||
MainAnalyzer < Panel
|
|
||||||
height: 45
|
|
||||||
padding: 4
|
|
||||||
|
|
||||||
BotButton
|
|
||||||
id: toggle
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
text: Session Analyzer
|
|
||||||
|
|
||||||
BotButton
|
|
||||||
id: reset
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 4
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.horizontalCenter
|
|
||||||
margin-right: 2
|
|
||||||
text: Reset
|
|
||||||
|
|
||||||
BotButton
|
|
||||||
id: change
|
|
||||||
anchors.top: toggle.bottom
|
|
||||||
margin-top: 4
|
|
||||||
anchors.left: parent.horizontalCenter
|
|
||||||
margin-left: 2
|
|
||||||
anchors.right: toggle.right
|
|
||||||
text-align: center
|
|
||||||
text: Loot
|
|
||||||
|
|
||||||
HuntingAnalyzer < Panel
|
|
||||||
height: 275
|
|
||||||
padding: 5
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: SessionLabel
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: Session:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: XpGainLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: XP Gain:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: XpHourLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: XP/h:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: NextLevelLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: Next Level:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: BalanceLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: Balance
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: BurstDamageLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: Burst Damage:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: DamageDealtLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: Damage Dealt:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: DPSLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: DPS:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: BestHitLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: Best Hit:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: HealingDoneLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: Healing Done:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: HPSLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: HPS:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: BestHealLabel
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
margin-top: 5
|
|
||||||
text: Best Heal:
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: one
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.verticalCenter: SessionLabel.verticalCenter
|
|
||||||
text-align: right
|
|
||||||
text: 00:00h
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: two
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: three
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: -
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: four
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: -
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: balance
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 5
|
|
||||||
text: 0
|
|
||||||
text-align: right
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: five
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: six
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: -
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: seven
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: eight
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: nine
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: ten
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: eleven
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
text-align: right
|
|
||||||
text: 0
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
HorizontalSeparator
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 3
|
|
||||||
|
|
||||||
Label
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 3
|
|
||||||
text-align: center
|
|
||||||
text: Damage Distribution
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: dOne
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 5
|
|
||||||
text-align: center
|
|
||||||
text: -
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: dTwo
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 5
|
|
||||||
text-align: center
|
|
||||||
text: -
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: dThree
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 5
|
|
||||||
text-align: center
|
|
||||||
text: -
|
|
||||||
|
|
||||||
LootAnalyzer < Panel
|
|
||||||
height: 275
|
|
||||||
padding: 4
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: first
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: Supplies
|
|
||||||
|
|
||||||
Label
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: Supplies/h
|
|
||||||
|
|
||||||
TextList
|
|
||||||
id: supplyList
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 3
|
|
||||||
height: 50
|
|
||||||
vertical-scrollbar: supplyListScrollBar
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: second
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: Loot
|
|
||||||
|
|
||||||
Label
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
margin-top: 5
|
|
||||||
anchors.left: parent.left
|
|
||||||
text: Loot/h
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: supplies
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.right: parent.right
|
|
||||||
width: 150
|
|
||||||
text: 0
|
|
||||||
text-align: right
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: suppliesHour
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 5
|
|
||||||
text: 0
|
|
||||||
text-align: right
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: loot
|
|
||||||
anchors.top: second.top
|
|
||||||
anchors.right: parent.right
|
|
||||||
width: 150
|
|
||||||
text: 0
|
|
||||||
text-align: right
|
|
||||||
|
|
||||||
Label
|
|
||||||
id: lootHour
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 5
|
|
||||||
text: 0
|
|
||||||
text-align: right
|
|
||||||
width: 150
|
|
||||||
|
|
||||||
TextList
|
|
||||||
id: List
|
|
||||||
anchors.top: prev.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
margin-top: 3
|
|
||||||
height: 120
|
|
||||||
vertical-scrollbar: ListScrollBar
|
|
||||||
|
|
||||||
VerticalScrollBar
|
|
||||||
id: ListScrollBar
|
|
||||||
anchors.top: List.top
|
|
||||||
anchors.bottom: List.bottom
|
|
||||||
anchors.right: List.right
|
|
||||||
step: 14
|
|
||||||
pixels-scroll: true
|
|
||||||
|
|
||||||
VerticalScrollBar
|
|
||||||
id: supplyListScrollBar
|
|
||||||
anchors.top: supplyList.top
|
|
||||||
anchors.bottom: supplyList.bottom
|
|
||||||
anchors.right: supplyList.right
|
|
||||||
step: 14
|
|
||||||
pixels-scroll: true
|
|
@ -167,7 +167,7 @@ CaveBot.registerAction("goto", "green", function(value, retries, prev)
|
|||||||
return true -- already at position
|
return true -- already at position
|
||||||
end
|
end
|
||||||
-- check if there's a path to that place, ignore creatures and fields
|
-- check if there's a path to that place, ignore creatures and fields
|
||||||
local path = findPath(playerPos, pos, maxDist, { ignoreNonPathable = true, precision = 1, ignoreCreatures = true })
|
local path = findPath(playerPos, pos, maxDist, { ignoreNonPathable = true, precision = 1, ignoreCreatures = true, allowUnseen = true, allowOnlyVisibleTiles = false })
|
||||||
if not path then
|
if not path then
|
||||||
return false -- there's no way
|
return false -- there's no way
|
||||||
end
|
end
|
||||||
@ -206,7 +206,7 @@ CaveBot.registerAction("goto", "green", function(value, retries, prev)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- try to find path, don't ignore creatures, ignore fields
|
-- try to find path, don't ignore creatures, ignore fields
|
||||||
if CaveBot.walkTo(pos, maxDist, { ignoreNonPathable = true }) then
|
if CaveBot.walkTo(pos, maxDist, { ignoreNonPathable = true, allowUnseen = true, allowOnlyVisibleTiles = false }) then
|
||||||
return "retry"
|
return "retry"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ CaveBot.registerAction("goto", "green", function(value, retries, prev)
|
|||||||
if stairs then
|
if stairs then
|
||||||
precison = 0
|
precison = 0
|
||||||
end
|
end
|
||||||
if CaveBot.walkTo(pos, 50, { ignoreNonPathable = true, precision = precison }) then
|
if CaveBot.walkTo(pos, 50, { ignoreNonPathable = true, precision = precison, allowUnseen = true, allowOnlyVisibleTiles = false }) then
|
||||||
return "retry"
|
return "retry"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -230,7 +230,7 @@ CaveBot.registerAction("goto", "green", function(value, retries, prev)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- everything else failed, try to walk ignoring creatures, maybe will work
|
-- everything else failed, try to walk ignoring creatures, maybe will work
|
||||||
CaveBot.walkTo(pos, maxDist, { ignoreNonPathable = true, precision = 1, ignoreCreatures = true })
|
CaveBot.walkTo(pos, maxDist, { ignoreNonPathable = true, precision = 1, ignoreCreatures = true, allowUnseen = true, allowOnlyVisibleTiles = false })
|
||||||
return "retry"
|
return "retry"
|
||||||
end)
|
end)
|
||||||
|
|
@ -30,7 +30,7 @@ cavebotMacro = macro(20, function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if CaveBot.doWalking() then
|
if CaveBot.doWalking() then
|
||||||
return -- executing walking
|
return -- executing walking3
|
||||||
end
|
end
|
||||||
|
|
||||||
local actions = ui.list:getChildCount()
|
local actions = ui.list:getChildCount()
|
||||||
@ -185,6 +185,20 @@ CaveBot.setOff = function(val)
|
|||||||
config.setOff()
|
config.setOff()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
CaveBot.getCurrentProfile = function()
|
||||||
|
return storage._configs.cavebot_configs.selected
|
||||||
|
end
|
||||||
|
|
||||||
|
local botConfigName = modules.game_bot.contentsPanel.config:getCurrentOption().text
|
||||||
|
CaveBot.setCurrentProfile = function(name)
|
||||||
|
if not g_resources.fileExists("/bot/"..botConfigName.."/cavebot_configs/"..name..".cfg") then
|
||||||
|
return warn("there is no cavebot profile with that name!")
|
||||||
|
end
|
||||||
|
CaveBot.setOff()
|
||||||
|
storage._configs.cavebot_configs.selected = name
|
||||||
|
CaveBot.setOn()
|
||||||
|
end
|
||||||
|
|
||||||
CaveBot.delay = function(value)
|
CaveBot.delay = function(value)
|
||||||
cavebotMacro.delay = math.max(cavebotMacro.delay or 0, now + value)
|
cavebotMacro.delay = math.max(cavebotMacro.delay or 0, now + value)
|
||||||
end
|
end
|
@ -1,13 +1,11 @@
|
|||||||
CaveBot.Extensions.Depositor = {}
|
CaveBot.Extensions.Depositor = {}
|
||||||
|
|
||||||
--local variables
|
--local variables
|
||||||
local closedContainers = false
|
|
||||||
local reopenedContainers = false
|
|
||||||
local destination = nil
|
local destination = nil
|
||||||
local lootTable = nil
|
local lootTable = nil
|
||||||
|
local reopenedContainers = false
|
||||||
|
|
||||||
local function resetCache()
|
local function resetCache()
|
||||||
closedContainers = false
|
|
||||||
reopenedContainers = false
|
reopenedContainers = false
|
||||||
destination = nil
|
destination = nil
|
||||||
lootTable = nil
|
lootTable = nil
|
||||||
@ -41,21 +39,11 @@ CaveBot.Extensions.Depositor.setup = function()
|
|||||||
|
|
||||||
-- backpacks etc
|
-- backpacks etc
|
||||||
if value:lower() == "yes" then
|
if value:lower() == "yes" then
|
||||||
-- reopening backpacks
|
|
||||||
if not reopenedContainers then
|
if not reopenedContainers then
|
||||||
if not closedContainers then
|
CaveBot.CloseAllLootContainers()
|
||||||
if not CaveBot.CloseLootContainer() then
|
delay(3000)
|
||||||
return "retry"
|
|
||||||
else
|
|
||||||
closedContainers = true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if not CaveBot.OpenLootContainer() then
|
|
||||||
return "retry"
|
|
||||||
else
|
|
||||||
reopenedContainers = true
|
reopenedContainers = true
|
||||||
end
|
return "retry"
|
||||||
end
|
|
||||||
end
|
end
|
||||||
-- open next backpacks if no more loot
|
-- open next backpacks if no more loot
|
||||||
if not CaveBot.HasLootItems() then
|
if not CaveBot.HasLootItems() then
|
||||||
@ -70,14 +58,16 @@ CaveBot.Extensions.Depositor.setup = function()
|
|||||||
return "retry"
|
return "retry"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
-- couldn't find next container, so we done
|
-- couldn't find next container, so we done
|
||||||
print("CaveBot[Depositor]: all items stashed, no backpack to open next, proceeding")
|
print("CaveBot[Depositor]: all items stashed, no backpack to open next, proceeding")
|
||||||
|
CaveBot.CloseAllLootContainers()
|
||||||
|
delay(3000)
|
||||||
resetCache()
|
resetCache()
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- first check items
|
-- first check items
|
||||||
if retries == 0 then
|
if retries == 0 then
|
@ -35,7 +35,7 @@ end
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
addExampleFunction("Check for stamina and imbues", [[
|
addExampleFunction("Check for stamina and imbues", [[
|
||||||
if stamina() < 900 or player:getSkillLevel(11) ~= 100 then CaveBot.setOff() return false else return true end
|
if stamina() < 900 or player:getSkillLevel(11) == 0 then CaveBot.setOff() return false else return true end
|
||||||
]])
|
]])
|
||||||
|
|
||||||
addExampleFunction("buy 200 mana potion from npc Eryn", [[
|
addExampleFunction("buy 200 mana potion from npc Eryn", [[
|
||||||
@ -106,3 +106,9 @@ g_game.safeLogout()
|
|||||||
delay(1000)
|
delay(1000)
|
||||||
return "retry"
|
return "retry"
|
||||||
]])
|
]])
|
||||||
|
|
||||||
|
addExampleFunction("Close Loot Containers", [[
|
||||||
|
CaveBot.CloseAllLootContainers()
|
||||||
|
delay(3000)
|
||||||
|
return true
|
||||||
|
]])
|
@ -5,6 +5,7 @@ local lureMax = 0
|
|||||||
local anchorPosition = nil
|
local anchorPosition = nil
|
||||||
local lastCall = now
|
local lastCall = now
|
||||||
local delayFrom = nil
|
local delayFrom = nil
|
||||||
|
local dynamicLureDelay = false
|
||||||
|
|
||||||
function getWalkableTilesCount(position)
|
function getWalkableTilesCount(position)
|
||||||
local count = 0
|
local count = 0
|
||||||
@ -140,6 +141,7 @@ TargetBot.Creature.walk = function(creature, config, targets)
|
|||||||
lureMax = config.lureMax
|
lureMax = config.lureMax
|
||||||
end
|
end
|
||||||
|
|
||||||
|
dynamicLureDelay = config.dynamicLureDelay
|
||||||
delayFrom = config.delayFrom
|
delayFrom = config.delayFrom
|
||||||
|
|
||||||
-- luring
|
-- luring
|
||||||
@ -185,6 +187,7 @@ TargetBot.Creature.walk = function(creature, config, targets)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--target only movement
|
||||||
if config.avoidAttacks then
|
if config.avoidAttacks then
|
||||||
local diffx = cpos.x - pos.x
|
local diffx = cpos.x - pos.x
|
||||||
local diffy = cpos.y - pos.y
|
local diffy = cpos.y - pos.y
|
||||||
@ -235,6 +238,6 @@ onPlayerPositionChange(function(newPos, oldPos)
|
|||||||
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 targetCount < (delayFrom or lureMax/2) or not target() then return end
|
if dynamicLureDelay and targetCount < (delayFrom or lureMax/2) or not target() then return end
|
||||||
CaveBot.delay(delayValue or 0)
|
CaveBot.delay(delayValue or 0)
|
||||||
end)
|
end)
|
@ -203,6 +203,20 @@ TargetBot.setOff = function(val)
|
|||||||
config.setOff()
|
config.setOff()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
TargetBot.getCurrentProfile = function()
|
||||||
|
return storage._configs.targetbot_configs.selected
|
||||||
|
end
|
||||||
|
|
||||||
|
local botConfigName = modules.game_bot.contentsPanel.config:getCurrentOption().text
|
||||||
|
TargetBot.setCurrentProfile = function(name)
|
||||||
|
if not g_resources.fileExists("/bot/"..botConfigName.."/targetbot_configs/"..name..".json") then
|
||||||
|
return warn("there is no targetbot profile with that name!")
|
||||||
|
end
|
||||||
|
TargetBot.setOff()
|
||||||
|
storage._configs.targetbot_configs.selected = name
|
||||||
|
TargetBot.setOn()
|
||||||
|
end
|
||||||
|
|
||||||
TargetBot.delay = function(value)
|
TargetBot.delay = function(value)
|
||||||
targetbotMacro.delay = now + value
|
targetbotMacro.delay = now + value
|
||||||
end
|
end
|
@ -1075,7 +1075,7 @@ function getBestTileByPattern(pattern, minHp, maxHp, safePattern, monsterNamesTa
|
|||||||
for i, tile in pairs(tiles) do
|
for i, tile in pairs(tiles) do
|
||||||
local tPos = tile:getPosition()
|
local tPos = tile:getPosition()
|
||||||
local distance = distanceFromPlayer(tPos)
|
local distance = distanceFromPlayer(tPos)
|
||||||
if tile:canShoot() and tile:isWalkable() and (not safePattern or distance < 4) then
|
if tile:canShoot() and tile:isWalkable() and distance < 4 then
|
||||||
local amount = getMonstersInArea(2, tPos, pattern, minHp, maxHp, safePattern, monsterNamesTable)
|
local amount = getMonstersInArea(2, tPos, pattern, minHp, maxHp, safePattern, monsterNamesTable)
|
||||||
if amount > targetTile.amount then
|
if amount > targetTile.amount then
|
||||||
targetTile = {amount=amount,pos=tPos}
|
targetTile = {amount=amount,pos=tPos}
|
||||||
@ -1161,7 +1161,7 @@ macro(100, function()
|
|||||||
if entry.enabled and manapercent() >= entry.mana then
|
if entry.enabled and manapercent() >= entry.mana then
|
||||||
if (entry.spell and canCast(entry.spell, not currentSettings.ignoreMana, not currentSettings.Cooldown)) or (entry.itemId > 100 and (not currentSettings.Visible or findItem(entry.itemId))) then
|
if (entry.spell and canCast(entry.spell, not currentSettings.ignoreMana, not currentSettings.Cooldown)) or (entry.itemId > 100 and (not currentSettings.Visible or findItem(entry.itemId))) then
|
||||||
-- first PVP scenario
|
-- first PVP scenario
|
||||||
if currentSettings.pvpMode and target():getHealthPercent() >= entry.minHp and target():getHealthPercent() <= entry.maxHp then
|
if currentSettings.pvpMode and target():getHealthPercent() >= entry.minHp and target():getHealthPercent() <= entry.maxHp and target():canShoot() then
|
||||||
if entry.category == 2 then
|
if entry.category == 2 then
|
||||||
return warn("[AttackBot] Area Runes cannot be used in PVP situation!")
|
return warn("[AttackBot] Area Runes cannot be used in PVP situation!")
|
||||||
else
|
else
|
||||||
@ -1186,7 +1186,7 @@ macro(100, function()
|
|||||||
local anchorParam = (pattern == 2 or pattern == 6 or pattern == 7 or pattern > 9) and player or pos()
|
local anchorParam = (pattern == 2 or pattern == 6 or pattern == 7 or pattern > 9) and player or pos()
|
||||||
local safe = currentSettings.PvpSafe and spellPatterns[pCat][entry.pattern][2] or false
|
local safe = currentSettings.PvpSafe and spellPatterns[pCat][entry.pattern][2] or false
|
||||||
local monsterAmount = pCat ~= 8 and getMonstersInArea(entry.category, anchorParam, spellPatterns[pCat][entry.pattern][1], entry.minHp, entry.maxHp, safe, entry.monsters)
|
local monsterAmount = pCat ~= 8 and getMonstersInArea(entry.category, anchorParam, spellPatterns[pCat][entry.pattern][1], entry.minHp, entry.maxHp, safe, entry.monsters)
|
||||||
if (pattern ~= 8 and (entry.orMore and monsterAmount >= entry.count or not entry.orMore and monsterAmount == entry.count)) or pattern == 8 and bestSide >= entry.count then
|
if (pattern ~= 8 and (entry.orMore and monsterAmount >= entry.count or not entry.orMore and monsterAmount == entry.count)) or (pattern == 8 and bestSide >= entry.count and (not currentSettings.PvpSafe or getPlayers(2) == 0)) then
|
||||||
return executeAttackBotAction(entry.category, attackData, entry.cooldown)
|
return executeAttackBotAction(entry.category, attackData, entry.cooldown)
|
||||||
end
|
end
|
||||||
elseif entry.category == 2 then
|
elseif entry.category == 2 then
|
@ -235,7 +235,7 @@ Panel
|
|||||||
elseif config.cureElectrify and mana() >= config.electrifyCost and isEnergized() then say("exana vis")
|
elseif config.cureElectrify and mana() >= config.electrifyCost and isEnergized() then say("exana vis")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if (not config.ignoreInPz or not isInPz()) and config.holdUtura and mana() >= config.uturaCost and not hasPartyBuff() then say(config.uturaType)
|
if (not config.ignoreInPz or not isInPz()) and config.holdUtura and mana() >= config.uturaCost and canCast(config.uturaType) and hppercent() < 90 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
|
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
|
||||||
end)
|
end)
|
@ -441,10 +441,11 @@ end
|
|||||||
|
|
||||||
onContainerOpen(function(container, previousContainer)
|
onContainerOpen(function(container, previousContainer)
|
||||||
if renameContui.title:isOn() then
|
if renameContui.title:isOn() then
|
||||||
if not previousContainer then
|
|
||||||
if not container.window then return end
|
if not container.window then return end
|
||||||
containerWindow = container.window
|
local containerWindow = container.window
|
||||||
|
if not previousContainer then
|
||||||
containerWindow:setContentHeight(34)
|
containerWindow:setContentHeight(34)
|
||||||
|
end
|
||||||
local storageVal = config.list
|
local storageVal = config.list
|
||||||
if storageVal and #storageVal > 0 then
|
if storageVal and #storageVal > 0 then
|
||||||
for _, entry in pairs(storageVal) do
|
for _, entry in pairs(storageVal) do
|
||||||
@ -457,7 +458,6 @@ onContainerOpen(function(container, previousContainer)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local function moveItem(item, destination)
|
local function moveItem(item, destination)
|
||||||
@ -476,7 +476,7 @@ local function properTable(t)
|
|||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
|
|
||||||
macro(100, function()
|
macro(500, function()
|
||||||
if not config.sort and not config.purse then return end
|
if not config.sort and not config.purse then return end
|
||||||
|
|
||||||
local storageVal = config.list
|
local storageVal = config.list
|
||||||
@ -522,5 +522,5 @@ macro(100, function()
|
|||||||
if config.purse and config.forceOpen and not getContainerByItem(23396) then
|
if config.purse and config.forceOpen and not getContainerByItem(23396) then
|
||||||
return use(getPurse())
|
return use(getPurse())
|
||||||
end
|
end
|
||||||
delay(900)
|
delay(1500)
|
||||||
end)
|
end)
|
@ -1,3 +1,6 @@
|
|||||||
|
local standBySpells = false
|
||||||
|
local standByItems = false
|
||||||
|
|
||||||
setDefaultTab("HP")
|
setDefaultTab("HP")
|
||||||
healPanelName = "healbot"
|
healPanelName = "healbot"
|
||||||
local ui = setupUI([[
|
local ui = setupUI([[
|
||||||
@ -222,10 +225,14 @@ if rootWidget then
|
|||||||
local label = UI.createWidget("SpellEntry", healWindow.spells.spellList)
|
local label = UI.createWidget("SpellEntry", healWindow.spells.spellList)
|
||||||
label.enabled:setChecked(entry.enabled)
|
label.enabled:setChecked(entry.enabled)
|
||||||
label.enabled.onClick = function(widget)
|
label.enabled.onClick = function(widget)
|
||||||
|
standBySpells = false
|
||||||
|
standByItems = false
|
||||||
entry.enabled = not entry.enabled
|
entry.enabled = not entry.enabled
|
||||||
label.enabled:setChecked(entry.enabled)
|
label.enabled:setChecked(entry.enabled)
|
||||||
end
|
end
|
||||||
label.remove.onClick = function(widget)
|
label.remove.onClick = function(widget)
|
||||||
|
standBySpells = false
|
||||||
|
standByItems = false
|
||||||
table.removevalue(currentSettings.spellTable, entry)
|
table.removevalue(currentSettings.spellTable, entry)
|
||||||
reindexTable(currentSettings.spellTable)
|
reindexTable(currentSettings.spellTable)
|
||||||
label:destroy()
|
label:destroy()
|
||||||
@ -245,10 +252,14 @@ if rootWidget then
|
|||||||
local label = UI.createWidget("SpellEntry", healWindow.items.itemList)
|
local label = UI.createWidget("SpellEntry", healWindow.items.itemList)
|
||||||
label.enabled:setChecked(entry.enabled)
|
label.enabled:setChecked(entry.enabled)
|
||||||
label.enabled.onClick = function(widget)
|
label.enabled.onClick = function(widget)
|
||||||
|
standBySpells = false
|
||||||
|
standByItems = false
|
||||||
entry.enabled = not entry.enabled
|
entry.enabled = not entry.enabled
|
||||||
label.enabled:setChecked(entry.enabled)
|
label.enabled:setChecked(entry.enabled)
|
||||||
end
|
end
|
||||||
label.remove.onClick = function(widget)
|
label.remove.onClick = function(widget)
|
||||||
|
standBySpells = false
|
||||||
|
standByItems = false
|
||||||
table.removevalue(currentSettings.itemTable, entry)
|
table.removevalue(currentSettings.itemTable, entry)
|
||||||
reindexTable(currentSettings.itemTable)
|
reindexTable(currentSettings.itemTable)
|
||||||
label:destroy()
|
label:destroy()
|
||||||
@ -414,6 +425,8 @@ if rootWidget then
|
|||||||
healWindow.spells.spellValue:setText('')
|
healWindow.spells.spellValue:setText('')
|
||||||
healWindow.spells.manaCost:setText('')
|
healWindow.spells.manaCost:setText('')
|
||||||
end
|
end
|
||||||
|
standBySpells = false
|
||||||
|
standByItems = false
|
||||||
refreshSpells()
|
refreshSpells()
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -455,6 +468,8 @@ if rootWidget then
|
|||||||
|
|
||||||
if id > 100 then
|
if id > 100 then
|
||||||
table.insert(currentSettings.itemTable, {index = #currentSettings.itemTable+1,item = id, sign = equasion, origin = source, value = trigger, enabled = true})
|
table.insert(currentSettings.itemTable, {index = #currentSettings.itemTable+1,item = id, sign = equasion, origin = source, value = trigger, enabled = true})
|
||||||
|
standBySpells = false
|
||||||
|
standByItems = false
|
||||||
refreshItems()
|
refreshItems()
|
||||||
healWindow.items.itemId:setItemId(0)
|
healWindow.items.itemId:setItemId(0)
|
||||||
healWindow.items.itemValue:setText('')
|
healWindow.items.itemValue:setText('')
|
||||||
@ -554,9 +569,6 @@ 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 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
|
||||||
@ -625,7 +637,6 @@ macro(100, function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
-- items
|
-- items
|
||||||
local standByItems = false
|
|
||||||
macro(100, function()
|
macro(100, function()
|
||||||
if standByItems then return end
|
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
|