local iconTopMenu = nil -- @ Minimap local minimapWidget = nil -- bot fix local otmm = true local oldPos = nil local fullscreenWidget local virtualFloor = 7 local currentDayTime = { h = 12, m = 0 } local function refreshVirtualFloors() mapController.ui.layersPanel.layersMark:setMarginTop(((virtualFloor + 1) * 4) - 3) mapController.ui.layersPanel.automapLayers:setImageClip((virtualFloor * 14) .. ' 0 14 67') end local function onPositionChange() local player = g_game.getLocalPlayer() if not player then return end local pos = player:getPosition() if not pos then return end local minimapWidget = mapController.ui.minimapBorder.minimap if not (minimapWidget) or minimapWidget:isDragging() then return end if not minimapWidget.fullMapView then minimapWidget:setCameraPosition(pos) end minimapWidget:setCrossPosition(pos) virtualFloor = pos.z refreshVirtualFloors() end mapController = Controller:new() mapController:setUI('minimap', modules.game_interface.getMainRightPanel()) function onChangeWorldTime(hour, minute) --[[ check tfs c++ (old) : void ProtocolGame::sendWorldTime() tfs lua (new) : function Player.sendWorldTime(self, time) Canary: void ProtocolGame::sendTibiaTime(int32_t time) ]] currentDayTime = { h = hour % 24, m = minute } mapController:scheduleEvent(function() local nextH = currentDayTime.h local nextM = currentDayTime.m + 12 if nextM >= 60 then nextH = nextH + 1 nextM = nextM - 60 end onChangeWorldTime(nextH, nextM) end, 30000, 'dayTime') local position = math.floor((124 / (24 * 60)) * ((hour * 60) + minute)) local mainWidth = 31 local secondaryWidth = 0 if (position + 31) >= 124 then secondaryWidth = ((position + 31) - 124) + 1 mainWidth = 31 - secondaryWidth end mapController.ui.rosePanel.ambients.main:setWidth(mainWidth) mapController.ui.rosePanel.ambients.secondary:setWidth(secondaryWidth) if secondaryWidth == 0 then mapController.ui.rosePanel.ambients.secondary:hide() else mapController.ui.rosePanel.ambients.secondary:setImageClip('0 0 ' .. secondaryWidth .. ' 31') mapController.ui.rosePanel.ambients.secondary:show() end if mainWidth == 0 then mapController.ui.rosePanel.ambients.main:hide() else mapController.ui.rosePanel.ambients.main:setImageClip(position .. ' 0 ' .. mainWidth .. ' 31') mapController.ui.rosePanel.ambients.main:show() end end -- OT-MMO (23-oct): zoom con límites útiles y rueda a un paso por gesto. Antes iba de -5 a 5 (de 1/32 a 32 píxeles por -- casilla) y un gesto de panel táctil o rueda fina daba varios pasos seguidos: el mapa saltaba al extremo y parecía que -- ya no dejaba acercar. Lo comparte el mapa (M), game_mapa: ruedaConPausa. ZOOM_MIN, ZOOM_MAX = -1, 3 local PAUSA_RUEDA = 140 -- ms entre dos pasos de zoom con la rueda function ruedaConPausa(widget, alCambiar) widget.onMouseWheel = function(self, mousePos, direction) local mods = g_keyboard.getModifiers() if mods ~= KeyboardNoModifier then return UIMinimap.onMouseWheel(self, mousePos, direction) -- Ctrl + rueda: piso end local ahora = g_clock.millis() if self.ultimaRueda and ahora - self.ultimaRueda < PAUSA_RUEDA then return true end self.ultimaRueda = ahora if direction == MouseWheelUp then self:zoomIn() else self:zoomOut() end if alCambiar then alCambiar(self) end return true end end -- Encaja un zoom guardado (perfiles viejos: hasta -5 o 5) en los límites del widget. function encajarZoom(widget, zoom) zoom = tonumber(zoom) or 0 zoom = math.max(widget:getMinZoom(), math.min(widget:getMaxZoom(), zoom)) widget:setZoom(zoom) return zoom end function getZoomEstado() local m = mapController.ui.minimapBorder.minimap return m:getZoom(), m:getMinZoom(), m:getMaxZoom() end function mapController:onInit() local m = self.ui.minimapBorder.minimap local fijarMin = m.setMinZoom or m.setMixZoom -- en C++ se enlazó con errata («setMixZoom») fijarMin(m, ZOOM_MIN) m:setMaxZoom(ZOOM_MAX) ruedaConPausa(m, function() if modules.game_hud and modules.game_hud.refrescarZoom then modules.game_hud.refrescarZoom() end end) self.ui.minimapBorder.minimap:getChildById('floorUpButton'):hide() self.ui.minimapBorder.minimap:getChildById('floorDownButton'):hide() self.ui.minimapBorder.minimap:getChildById('zoomInButton'):hide() self.ui.minimapBorder.minimap:getChildById('zoomOutButton'):hide() self.ui.minimapBorder.minimap:getChildById('resetButton'):hide() end function mapController:onGameStart() mapController:registerEvents(g_game, { onChangeWorldTime = onChangeWorldTime }) mapController:registerEvents(LocalPlayer, { onPositionChange = onPositionChange }):execute() -- Load Map -- OT-MMO: sin g_minimap.clean(): aqui ya llego el primer mapa del servidor y limpiar lo borraba -- (minimapa negro hasta caminar). El .otmm guardado se carga encima igual. local minimapFile = '/minimap' local loadFnc = nil if otmm then minimapFile = minimapFile .. '.otmm' loadFnc = g_minimap.loadOtmm else minimapFile = minimapFile .. '_' .. g_game.getClientVersion() .. '.otcm' loadFnc = g_map.loadOtcm end if g_resources.fileExists(minimapFile) then loadFnc(minimapFile) end -- OT-MMO: el mundo entero (tools/map-editor/scripts/generar_minimapa.mts) encima de lo explorado: mapa sin niebla if otmm and g_resources.fileExists('/mapa-mundo.otmm') then g_minimap.loadOtmm('/mapa-mundo.otmm') end self.ui.minimapBorder.minimap:load() local m = self.ui.minimapBorder.minimap m.zoomMinimap = encajarZoom(m, m.zoomMinimap) end function mapController:onGameEnd() -- Save Map if otmm then g_minimap.saveOtmm('/minimap.otmm') else g_map.saveOtcm('/minimap_' .. g_game.getClientVersion() .. '.otcm') end self.ui.minimapBorder.minimap:save() end function mapController:onTerminate() if iconTopMenu then iconTopMenu:destroy() iconTopMenu = nil end end function zoomIn() return mapController.ui.minimapBorder.minimap:zoomIn() end function zoomOut() return mapController.ui.minimapBorder.minimap:zoomOut() end function openCyclopediaMap() if g_game.getClientVersion() >= 1310 and modules.game_cyclopedia then modules.game_cyclopedia.toggle('map') else return fullscreen() end end function fullscreen() local minimapWidget = mapController.ui.minimapBorder.minimap if not minimapWidget then minimapWidget = fullscreenWidget end local zoom; if not minimapWidget then return end if minimapWidget.fullMapView then fullscreenWidget = nil minimapWidget:setParent(mapController.ui.minimapBorder) minimapWidget:fill('parent') mapController.ui:show() zoom = minimapWidget.zoomMinimap g_keyboard.unbindKeyDown('Escape') minimapWidget.fullMapView = false else fullscreenWidget = minimapWidget mapController.ui:hide(true) minimapWidget:setParent(modules.game_interface.getRootPanel()) minimapWidget:fill('parent') zoom = minimapWidget.zoomFullmap g_keyboard.bindKeyDown('Escape', fullscreen) minimapWidget.fullMapView = true end local pos = oldPos or minimapWidget:getCameraPosition() oldPos = minimapWidget:getCameraPosition() minimapWidget:setZoom(zoom) minimapWidget:setCameraPosition(pos) end function upLayer() if virtualFloor == 0 then return end mapController.ui.minimapBorder.minimap:floorUp(1) virtualFloor = virtualFloor - 1 refreshVirtualFloors() end function downLayer() if virtualFloor == 15 then return end mapController.ui.minimapBorder.minimap:floorDown(1) virtualFloor = virtualFloor + 1 refreshVirtualFloors() end function onClickRoseButton(dir) if dir == 'north' then mapController.ui.minimapBorder.minimap:move(0, 1) elseif dir == 'north-east' then mapController.ui.minimapBorder.minimap:move(-1, 1) elseif dir == 'east' then mapController.ui.minimapBorder.minimap:move(-1, 0) elseif dir == 'south-east' then mapController.ui.minimapBorder.minimap:move(-1, -1) elseif dir == 'south' then mapController.ui.minimapBorder.minimap:move(0, -1) elseif dir == 'south-west' then mapController.ui.minimapBorder.minimap:move(1, -1) elseif dir == 'west' then mapController.ui.minimapBorder.minimap:move(1, 0) elseif dir == 'north-west' then mapController.ui.minimapBorder.minimap:move(1, 1) end end function resetMap() mapController.ui.minimapBorder.minimap:reset() local player = g_game.getLocalPlayer() if player then virtualFloor = player:getPosition().z refreshVirtualFloors() end end function getMiniMapUi() return mapController.ui.minimapBorder.minimap end function extendedView(extendedView) if extendedView then if not iconTopMenu then iconTopMenu = modules.client_topmenu.addTopRightToggleButton('miniMap', tr('Show miniMap'), '/images/topbuttons/minimap', toggle) iconTopMenu:setOn(mapController.ui:isVisible()) mapController.ui:setBorderColor('black') mapController.ui:setBorderWidth(2) end else if iconTopMenu then iconTopMenu:destroy() iconTopMenu = nil end mapController.ui:setBorderColor('alpha') mapController.ui:setBorderWidth(0) local mainRightPanel = modules.game_interface.getMainRightPanel() if not mainRightPanel:hasChild(mapController.ui) then mainRightPanel:insertChild(1, mapController.ui) end mapController.ui:show() end mapController.ui.moveOnlyToMain = not extendedView end function toggle() if iconTopMenu:isOn() then mapController.ui:hide() iconTopMenu:setOn(false) else mapController.ui:show() iconTopMenu:setOn(true) end end