mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-05-02 03:59:20 +02:00
100 lines
3.0 KiB
Lua
100 lines
3.0 KiB
Lua
|
|
TargetBot.Creature = {}
|
|
TargetBot.Creature.configsCache = {}
|
|
TargetBot.Creature.cached = 0
|
|
|
|
TargetBot.Creature.resetConfigs = function()
|
|
TargetBot.targetList:destroyChildren()
|
|
TargetBot.Creature.resetConfigsCache()
|
|
end
|
|
|
|
TargetBot.Creature.resetConfigsCache = function()
|
|
TargetBot.Creature.configsCache = {}
|
|
TargetBot.Creature.cached = 0
|
|
end
|
|
|
|
TargetBot.Creature.addConfig = function(config, focus)
|
|
if type(config) ~= 'table' or type(config.name) ~= 'string' then
|
|
return error("Invalid targetbot creature config (missing name)")
|
|
end
|
|
TargetBot.Creature.resetConfigsCache()
|
|
|
|
if not config.regex then
|
|
config.regex = ""
|
|
for part in string.gmatch(config.name, "[^,]+") do
|
|
if config.regex:len() > 0 then
|
|
config.regex = config.regex .. "|"
|
|
end
|
|
config.regex = config.regex .. "^" .. part:trim():lower():gsub("%*", ".*"):gsub("%?", ".?") .. "$"
|
|
end
|
|
end
|
|
|
|
local widget = UI.createWidget("TargetBotEntry", TargetBot.targetList)
|
|
widget:setText(config.name)
|
|
widget.value = config
|
|
|
|
widget.onDoubleClick = function(entry) -- edit on double click
|
|
schedule(20, function() -- schedule to have correct focus
|
|
TargetBot.Creature.edit(entry.value, function(newConfig)
|
|
entry:setText(newConfig.name)
|
|
entry.value = newConfig
|
|
TargetBot.Creature.resetConfigsCache()
|
|
TargetBot.save()
|
|
end)
|
|
end)
|
|
end
|
|
|
|
if focus then
|
|
widget:focus()
|
|
TargetBot.targetList:ensureChildVisible(widget)
|
|
end
|
|
return widget
|
|
end
|
|
|
|
TargetBot.Creature.getConfigs = function(creature)
|
|
if not creature then return {} end
|
|
local name = creature:getName():trim():lower()
|
|
-- this function may be slow, so it will be using cache
|
|
if TargetBot.Creature.configsCache[name] then
|
|
return TargetBot.Creature.configsCache[name]
|
|
end
|
|
local configs = {}
|
|
for _, config in ipairs(TargetBot.targetList:getChildren()) do
|
|
if regexMatch(name, config.value.regex)[1] then
|
|
table.insert(configs, config.value)
|
|
end
|
|
end
|
|
if TargetBot.Creature.cached > 1000 then
|
|
TargetBot.Creature.resetConfigsCache() -- too big cache size, reset
|
|
end
|
|
TargetBot.Creature.configsCache[name] = configs -- add to cache
|
|
TargetBot.Creature.cached = TargetBot.Creature.cached + 1
|
|
return configs
|
|
end
|
|
|
|
TargetBot.Creature.calculateParams = function(creature, path)
|
|
local configs = TargetBot.Creature.getConfigs(creature)
|
|
local priority = 0
|
|
local danger = 0
|
|
local selectedConfig = nil
|
|
for _, config in ipairs(configs) do
|
|
local config_priority = TargetBot.Creature.calculatePriority(creature, config, path)
|
|
if config_priority > priority then
|
|
priority = config_priority
|
|
danger = TargetBot.Creature.calculateDanger(creature, config, path)
|
|
selectedConfig = config
|
|
end
|
|
end
|
|
return {
|
|
config = selectedConfig,
|
|
creature = creature,
|
|
danger = danger,
|
|
priority = priority
|
|
}
|
|
end
|
|
|
|
TargetBot.Creature.calculateDanger = function(creature, config, path)
|
|
-- config is based on creature_editor
|
|
return config.danger
|
|
end
|