2021-04-07 21:31:27 +00:00

176 lines
5.4 KiB
Lua

local context = G.botContext
local iconsWithoutPosition = 0
context.addIcon = function(id, options, callback)
--[[
Available options:
item: {id=2160, count=100}
outfit: outfit table ({})
text: string
x: float (0.0 - 1.0)
y: float (0.0 - 1.0)
hotkey: string
switchable: true / false [default: true]
movable: true / false [default: true]
phantom: true / false [defaule: false]
]]--
local panel = modules.game_interface.gameMapPanel
if type(id) ~= "string" or id:len() < 1 then
return context.error("Invalid id for addIcon")
end
if options.switchable == false and type(callback) ~= 'function' then
return context.error("Invalid callback for addIcon")
end
if type(context.storage._icons) ~= "table" then
context.storage._icons = {}
end
if type(context.storage._icons[id]) ~= "table" then
context.storage._icons[id] = {}
end
local config = context.storage._icons[id]
local widget = g_ui.createWidget("BotIcon", panel)
widget.botWidget = true
widget.botIcon = true
if type(config.x) ~= 'number' and type(config.y) ~= 'number' then
if type(options.x) == 'number' and type(options.y) == 'number' then
config.x = math.min(1.0, math.max(0.0, options.x))
config.y = math.min(1.0, math.max(0.0, options.y))
else
config.x = 0.01 + math.floor(iconsWithoutPosition / 5) / 10
config.y = 0.05 + (iconsWithoutPosition % 5) / 5
iconsWithoutPosition = iconsWithoutPosition + 1
end
end
if options.item then
if type(options.item) == 'number' then
widget.item:setItemId(options.item)
else
widget.item:setItemId(options.item.id)
widget.item:setItemCount(options.item.count or 1)
widget.item:setShowCount(false)
end
end
if options.outfit then
widget.creature:setOutfit(options.outfit)
end
if options.switchable == false then
widget.status:hide()
widget.status:setOn(true)
else
if config.enabled ~= true then
config.enabled = false
end
widget.status:setOn(config.enabled)
end
if options.text then
if options.switchable ~= false then
widget.status:hide()
if widget.status:isOn() then
widget.text:setColor('green')
else
widget.text:setColor('red')
end
end
widget.text:setText(options.text)
end
widget.setOn = function(val)
widget.status:setOn(val)
if widget.status:isOn() then
widget.text:setColor('green')
else
widget.text:setColor('red')
end
config.enabled = widget.status:isOn()
end
widget.onClick = function(widget)
if options.switchable ~= false then
widget.setOn(not widget.status:isOn())
if type(callback) == 'table' then
callback.setOn(config.enabled)
return
end
end
callback(widget, widget.status:isOn())
end
if options.hotkey then
widget.hotkey:setText(options.hotkey)
context.hotkey(options.hotkey, "", function()
widget:onClick()
end, nil, options.switchable ~= false)
else
widget.hotkey:hide()
end
if options.movable ~= false then
widget.onDragEnter = function(widget, mousePos)
if not g_keyboard.isCtrlPressed() then
return false
end
widget:breakAnchors()
widget.movingReference = { x = mousePos.x - widget:getX(), y = mousePos.y - widget:getY() }
return true
end
widget.onDragMove = function(widget, mousePos, moved)
local parentRect = widget:getParent():getRect()
local x = math.min(math.max(parentRect.x, mousePos.x - widget.movingReference.x), parentRect.x + parentRect.width - widget:getWidth())
local y = math.min(math.max(parentRect.y - widget:getParent():getMarginTop(), mousePos.y - widget.movingReference.y), parentRect.y + parentRect.height - widget:getHeight())
widget:move(x, y)
return true
end
widget.onDragLeave = function(widget, pos)
local parent = widget:getParent()
local parentRect = parent:getRect()
local x = widget:getX() - parentRect.x
local y = widget:getY() - parentRect.y
local width = parentRect.width - widget:getWidth()
local height = parentRect.height - widget:getHeight()
config.x = math.min(1, math.max(0, x / width))
config.y = math.min(1, math.max(0, y / height))
widget:addAnchor(AnchorHorizontalCenter, 'parent', AnchorHorizontalCenter)
widget:addAnchor(AnchorVerticalCenter, 'parent', AnchorVerticalCenter)
widget:setMarginTop(math.max(height * (-0.5) - parent:getMarginTop(), height * (-0.5 + config.y)))
widget:setMarginLeft(width * (-0.5 + config.x))
return true
end
end
widget.onGeometryChange = function(widget)
if widget:isDragging() then return end
local parent = widget:getParent()
local parentRect = parent:getRect()
local width = parentRect.width - widget:getWidth()
local height = parentRect.height - widget:getHeight()
widget:setMarginTop(math.max(height * (-0.5) - parent:getMarginTop(), height * (-0.5 + config.y)))
widget:setMarginLeft(width * (-0.5 + config.x))
end
if options.phantom ~= true then
widget.onMouseRelease = function()
return true
end
end
if options.switchable ~= false then
if type(callback) == 'table' then
callback.setOn(config.enabled)
callback.icon = widget
else
callback(widget, widget.status:isOn())
end
end
return widget
end