mirror of
				https://github.com/OTCv8/otclientv8.git
				synced 2025-10-31 19:06:23 +01: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 | 
