mirror of
https://github.com/edubart/otclient.git
synced 2025-04-30 09:39:21 +02:00

- Add parameter 'temporary' to method 'UIMinimap:addFlag', who prevents saving flag with this parameter (look 'UIMinimap:save' method), add flag only at game session time. Old parameters list work the same at previous - backward compatibility. - Add possibility to add icon from outside (for example from module folder) using link to this file. Old system with choose flag name by number work the same at previous, now method check if paramether is number then use old system otherwise get icon from path - backward compatibility. 'Mods' friendly.
321 lines
8.3 KiB
Lua
321 lines
8.3 KiB
Lua
function UIMinimap:onCreate()
|
|
self.autowalk = true
|
|
end
|
|
|
|
function UIMinimap:onSetup()
|
|
self.flagWindow = nil
|
|
self.floorUpWidget = self:getChildById('floorUp')
|
|
self.floorDownWidget = self:getChildById('floorDown')
|
|
self.zoomInWidget = self:getChildById('zoomIn')
|
|
self.zoomOutWidget = self:getChildById('zoomOut')
|
|
self.flags = {}
|
|
self.alternatives = {}
|
|
self.onAddAutomapFlag = function(pos, icon, description) self:addFlag(pos, icon, description) end
|
|
self.onRemoveAutomapFlag = function(pos, icon, description) self:removeFlag(pos, icon, description) end
|
|
connect(g_game, {
|
|
onAddAutomapFlag = self.onAddAutomapFlag,
|
|
onRemoveAutomapFlag = self.onRemoveAutomapFlag,
|
|
})
|
|
end
|
|
|
|
function UIMinimap:onDestroy()
|
|
for _,widget in pairs(self.alternatives) do
|
|
widget:destroy()
|
|
end
|
|
self.alternatives = {}
|
|
disconnect(g_game, {
|
|
onAddAutomapFlag = self.onAddAutomapFlag,
|
|
onRemoveAutomapFlag = self.onRemoveAutomapFlag,
|
|
})
|
|
self:destroyFlagWindow()
|
|
self.flags = {}
|
|
end
|
|
|
|
function UIMinimap:onVisibilityChange()
|
|
if not self:isVisible() then
|
|
self:destroyFlagWindow()
|
|
end
|
|
end
|
|
|
|
function UIMinimap:onCameraPositionChange(cameraPos)
|
|
if self.cross then
|
|
self:setCrossPosition(self.cross.pos)
|
|
end
|
|
end
|
|
|
|
function UIMinimap:hideFloor()
|
|
self.floorUpWidget:hide()
|
|
self.floorDownWidget:hide()
|
|
end
|
|
|
|
function UIMinimap:hideZoom()
|
|
self.zoomInWidget:hide()
|
|
self.zoomOutWidget:hide()
|
|
end
|
|
|
|
function UIMinimap:disableAutoWalk()
|
|
self.autowalk = false
|
|
end
|
|
|
|
function UIMinimap:load()
|
|
local settings = g_settings.getNode('Minimap')
|
|
if settings then
|
|
if settings.flags then
|
|
for _,flag in pairs(settings.flags) do
|
|
self:addFlag(flag.position, flag.icon, flag.description)
|
|
end
|
|
end
|
|
self:setZoom(settings.zoom)
|
|
end
|
|
end
|
|
|
|
function UIMinimap:save()
|
|
local settings = { flags={} }
|
|
for _,flag in pairs(self.flags) do
|
|
if not flag.temporary then
|
|
table.insert(settings.flags, {
|
|
position = flag.pos,
|
|
icon = flag.icon,
|
|
description = flag.description,
|
|
})
|
|
end
|
|
end
|
|
settings.zoom = self:getZoom()
|
|
g_settings.setNode('Minimap', settings)
|
|
end
|
|
|
|
local function onFlagMouseRelease(widget, pos, button)
|
|
if button == MouseRightButton then
|
|
local menu = g_ui.createWidget('PopupMenu')
|
|
menu:setGameMenu(true)
|
|
menu:addOption(tr('Delete mark'), function() widget:destroy() end)
|
|
menu:display(pos)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function UIMinimap:setCrossPosition(pos)
|
|
local cross = self.cross
|
|
if not self.cross then
|
|
cross = g_ui.createWidget('MinimapCross', self)
|
|
cross:setIcon('/images/game/minimap/cross')
|
|
self.cross = cross
|
|
end
|
|
|
|
pos.z = self:getCameraPosition().z
|
|
cross.pos = pos
|
|
if pos then
|
|
self:centerInPosition(cross, pos)
|
|
else
|
|
cross:breakAnchors()
|
|
end
|
|
end
|
|
|
|
function UIMinimap:addFlag(pos, icon, description, temporary)
|
|
if not pos or not icon then return end
|
|
local flag = self:getFlag(pos, icon, description)
|
|
if flag or not icon then
|
|
return
|
|
end
|
|
temporary = temporary or false
|
|
|
|
flag = g_ui.createWidget('MinimapFlag')
|
|
self:insertChild(1, flag)
|
|
flag.pos = pos
|
|
flag.description = description
|
|
flag.icon = icon
|
|
flag.temporary = temporary
|
|
if type(tonumber(icon)) == 'number' then
|
|
flag:setIcon('/images/game/minimap/flag' .. icon)
|
|
else
|
|
flag:setIcon(resolvepath(icon, 1))
|
|
end
|
|
flag:setTooltip(description)
|
|
flag.onMouseRelease = onFlagMouseRelease
|
|
flag.onDestroy = function() table.removevalue(self.flags, flag) end
|
|
table.insert(self.flags, flag)
|
|
self:centerInPosition(flag, pos)
|
|
end
|
|
|
|
function UIMinimap:addAlternativeWidget(widget, pos, maxZoom)
|
|
widget.pos = pos
|
|
widget.maxZoom = maxZoom or 0
|
|
widget.minZoom = minZoom
|
|
table.insert(self.alternatives, widget)
|
|
end
|
|
|
|
function UIMinimap:setAlternativeWidgetsVisible(show)
|
|
local layout = self:getLayout()
|
|
layout:disableUpdates()
|
|
for _,widget in pairs(self.alternatives) do
|
|
if show then
|
|
self:insertChild(1, widget)
|
|
self:centerInPosition(widget, widget.pos)
|
|
else
|
|
self:removeChild(widget)
|
|
end
|
|
end
|
|
layout:enableUpdates()
|
|
layout:update()
|
|
end
|
|
|
|
function UIMinimap:onZoomChange(zoom)
|
|
for _,widget in pairs(self.alternatives) do
|
|
if (not widget.minZoom or widget.minZoom >= zoom) and widget.maxZoom <= zoom then
|
|
widget:show()
|
|
else
|
|
widget:hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
function UIMinimap:getFlag(pos)
|
|
for _,flag in pairs(self.flags) do
|
|
if flag.pos.x == pos.x and flag.pos.y == pos.y and flag.pos.z == pos.z then
|
|
return flag
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function UIMinimap:removeFlag(pos, icon, description)
|
|
local flag = self:getFlag(pos)
|
|
if flag then
|
|
flag:destroy()
|
|
end
|
|
end
|
|
|
|
function UIMinimap:reset()
|
|
self:setZoom(0)
|
|
if self.cross then
|
|
self:setCameraPosition(self.cross.pos)
|
|
end
|
|
end
|
|
|
|
function UIMinimap:move(x, y)
|
|
local cameraPos = self:getCameraPosition()
|
|
local scale = self:getScale()
|
|
if scale > 1 then scale = 1 end
|
|
local dx = x/scale
|
|
local dy = y/scale
|
|
local pos = {x = cameraPos.x - dx, y = cameraPos.y - dy, z = cameraPos.z}
|
|
self:setCameraPosition(pos)
|
|
end
|
|
|
|
function UIMinimap:onMouseWheel(mousePos, direction)
|
|
local keyboardModifiers = g_keyboard.getModifiers()
|
|
if direction == MouseWheelUp and keyboardModifiers == KeyboardNoModifier then
|
|
self:zoomIn()
|
|
elseif direction == MouseWheelDown and keyboardModifiers == KeyboardNoModifier then
|
|
self:zoomOut()
|
|
elseif direction == MouseWheelDown and keyboardModifiers == KeyboardCtrlModifier then
|
|
self:floorUp(1)
|
|
elseif direction == MouseWheelUp and keyboardModifiers == KeyboardCtrlModifier then
|
|
self:floorDown(1)
|
|
end
|
|
end
|
|
|
|
function UIMinimap:onMousePress(pos, button)
|
|
if not self:isDragging() then
|
|
self.allowNextRelease = true
|
|
end
|
|
end
|
|
|
|
function UIMinimap:onMouseRelease(pos, button)
|
|
if not self.allowNextRelease then return true end
|
|
self.allowNextRelease = false
|
|
|
|
local mapPos = self:getTilePosition(pos)
|
|
if not mapPos then return end
|
|
|
|
if button == MouseLeftButton then
|
|
local player = g_game.getLocalPlayer()
|
|
if self.autowalk then
|
|
player:autoWalk(mapPos)
|
|
end
|
|
return true
|
|
elseif button == MouseRightButton then
|
|
local menu = g_ui.createWidget('PopupMenu')
|
|
menu:setGameMenu(true)
|
|
menu:addOption(tr('Create mark'), function() self:createFlagWindow(mapPos) end)
|
|
menu:display(pos)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function UIMinimap:onDragEnter(pos)
|
|
self.dragReference = pos
|
|
self.dragCameraReference = self:getCameraPosition()
|
|
return true
|
|
end
|
|
|
|
function UIMinimap:onDragMove(pos, moved)
|
|
local scale = self:getScale()
|
|
local dx = (self.dragReference.x - pos.x)/scale
|
|
local dy = (self.dragReference.y - pos.y)/scale
|
|
local pos = {x = self.dragCameraReference.x + dx, y = self.dragCameraReference.y + dy, z = self.dragCameraReference.z}
|
|
self:setCameraPosition(pos)
|
|
return true
|
|
end
|
|
|
|
function UIMinimap:onDragLeave(widget, pos)
|
|
return true
|
|
end
|
|
|
|
function UIMinimap:onStyleApply(styleName, styleNode)
|
|
for name,value in pairs(styleNode) do
|
|
if name == 'autowalk' then
|
|
self.autowalk = value
|
|
end
|
|
end
|
|
end
|
|
|
|
function UIMinimap:createFlagWindow(pos)
|
|
if self.flagWindow then return end
|
|
if not pos then return end
|
|
|
|
self.flagWindow = g_ui.createWidget('MinimapFlagWindow', rootWidget)
|
|
|
|
local positionLabel = self.flagWindow:getChildById('position')
|
|
local description = self.flagWindow:getChildById('description')
|
|
local okButton = self.flagWindow:getChildById('okButton')
|
|
local cancelButton = self.flagWindow:getChildById('cancelButton')
|
|
|
|
positionLabel:setText(string.format('%i, %i, %i', pos.x, pos.y, pos.z))
|
|
|
|
local flagRadioGroup = UIRadioGroup.create()
|
|
for i=0,19 do
|
|
local checkbox = self.flagWindow:getChildById('flag' .. i)
|
|
checkbox.icon = i
|
|
flagRadioGroup:addWidget(checkbox)
|
|
end
|
|
|
|
flagRadioGroup:selectWidget(flagRadioGroup:getFirstWidget())
|
|
|
|
local successFunc = function()
|
|
self:addFlag(pos, flagRadioGroup:getSelectedWidget().icon, description:getText())
|
|
self:destroyFlagWindow()
|
|
end
|
|
|
|
local cancelFunc = function()
|
|
self:destroyFlagWindow()
|
|
end
|
|
|
|
okButton.onClick = successFunc
|
|
cancelButton.onClick = cancelFunc
|
|
|
|
self.flagWindow.onEnter = successFunc
|
|
self.flagWindow.onEscape = cancelFunc
|
|
|
|
self.flagWindow.onDestroy = function() flagRadioGroup:destroy() end
|
|
end
|
|
|
|
function UIMinimap:destroyFlagWindow()
|
|
if self.flagWindow then
|
|
self.flagWindow:destroy()
|
|
self.flagWindow = nil
|
|
end
|
|
end
|