mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-04-29 18:59:20 +02:00
176 lines
5.4 KiB
Lua
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 |