mirror of
				https://github.com/OTCv8/otclientv8.git
				synced 2025-10-31 10:56:24 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			284 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- private variables
 | |
| local topMenu
 | |
| local fpsUpdateEvent = nil
 | |
| local statusUpdateEvent = nil
 | |
| 
 | |
| -- private functions
 | |
| local function addButton(id, description, icon, callback, panel, toggle, front, index)
 | |
|   local class
 | |
|   if toggle then
 | |
|     class = 'TopToggleButton'
 | |
|   else
 | |
|     class = 'TopButton'
 | |
|   end
 | |
|   
 | |
|   if topMenu.reverseButtons then
 | |
|     front = not front
 | |
|   end
 | |
| 
 | |
|   local button = panel:getChildById(id)
 | |
|   if not button then
 | |
|     button = g_ui.createWidget(class)
 | |
|     if front then
 | |
|       panel:insertChild(1, button)
 | |
|     else
 | |
|       panel:addChild(button)
 | |
|     end
 | |
|   end
 | |
|   button:setId(id)
 | |
|   button:setTooltip(description)
 | |
|   button:setIcon(resolvepath(icon, 3))
 | |
|   button.onMouseRelease = function(widget, mousePos, mouseButton)
 | |
|     if widget:containsPoint(mousePos) and mouseButton ~= MouseMidButton and mouseButton ~= MouseTouch then
 | |
|       callback()
 | |
|       return true
 | |
|     end
 | |
|   end
 | |
|   button.onTouchRelease = button.onMouseRelease
 | |
|   if not button.index and type(index) == 'number' then
 | |
|     button.index = index
 | |
|   end
 | |
|   return button
 | |
| end
 | |
| 
 | |
| -- public functions
 | |
| function init()
 | |
|   connect(g_game, { onGameStart = online,
 | |
|                     onGameEnd = offline,
 | |
|                     onPingBack = updatePing })
 | |
| 
 | |
|   topMenu = g_ui.createWidget('TopMenu', g_ui.getRootWidget())  
 | |
|   g_keyboard.bindKeyDown('Ctrl+Shift+T', toggle)
 | |
|   
 | |
|   if g_game.isOnline() then
 | |
|     scheduleEvent(online, 10)
 | |
|   end
 | |
|   
 | |
|   updateFps()  
 | |
|   updateStatus()
 | |
| end
 | |
| 
 | |
| function terminate()
 | |
|   disconnect(g_game, { onGameStart = online,
 | |
|                        onGameEnd = offline,
 | |
|                        onPingBack = updatePing })
 | |
|   removeEvent(fpsUpdateEvent)
 | |
|   removeEvent(statusUpdateEvent)
 | |
|   
 | |
|   g_keyboard.unbindKeyDown('Ctrl+Shift+T')
 | |
|   topMenu:destroy()
 | |
| end
 | |
| 
 | |
| function online()
 | |
|   if topMenu.hideIngame then
 | |
|     hide()
 | |
|   else
 | |
|     modules.game_interface.getRootPanel():addAnchor(AnchorTop, 'topMenu', AnchorBottom)
 | |
|   end
 | |
|   if topMenu.onlineLabel then
 | |
|     topMenu.onlineLabel:hide()
 | |
|   end
 | |
|   
 | |
|   showGameButtons()
 | |
| 
 | |
|   if topMenu.pingLabel then
 | |
|     addEvent(function()
 | |
|       if modules.client_options.getOption('showPing') and (g_game.getFeature(GameClientPing) or g_game.getFeature(GameExtendedClientPing)) then
 | |
|         topMenu.pingLabel:show()
 | |
|       else
 | |
|         topMenu.pingLabel:hide()      
 | |
|       end
 | |
|     end)
 | |
|   end
 | |
| end
 | |
| 
 | |
| function offline()
 | |
|   if topMenu.hideIngame then
 | |
|     show()
 | |
|   end
 | |
|   if topMenu.onlineLabel then
 | |
|     topMenu.onlineLabel:show()
 | |
|   end
 | |
| 
 | |
|   hideGameButtons()
 | |
|   if topMenu.pingLabel then
 | |
|     topMenu.pingLabel:hide()
 | |
|   end
 | |
|   updateStatus()
 | |
| end
 | |
| 
 | |
| function updateFps()
 | |
|   if not topMenu.fpsLabel then return end
 | |
|   fpsUpdateEvent = scheduleEvent(updateFps, 500)
 | |
|   text = 'FPS: ' .. g_app.getFps()
 | |
|   topMenu.fpsLabel:setText(text)
 | |
| end
 | |
| 
 | |
| function updatePing(ping)
 | |
|   if not topMenu.pingLabel then return end
 | |
|   if g_proxy and g_proxy.getPing() > 0 then
 | |
|     ping = g_proxy.getPing()
 | |
|   end
 | |
|   
 | |
|   local text = 'Ping: '
 | |
|   local color
 | |
|   if ping < 0 then
 | |
|     text = text .. "??"
 | |
|     color = 'yellow'
 | |
|   else
 | |
|     text = text .. ping .. ' ms'
 | |
|     if ping >= 500 then
 | |
|       color = 'red'
 | |
|     elseif ping >= 250 then
 | |
|       color = 'yellow'
 | |
|     else
 | |
|       color = 'green'
 | |
|     end
 | |
|   end
 | |
|   topMenu.pingLabel:setColor(color)
 | |
|   topMenu.pingLabel:setText(text)
 | |
| end
 | |
| 
 | |
| function setPingVisible(enable)
 | |
|   if not topMenu.pingLabel then return end
 | |
|   topMenu.pingLabel:setVisible(enable)
 | |
| end
 | |
| 
 | |
| function setFpsVisible(enable)
 | |
|   if not topMenu.fpsLabel then return end
 | |
|   topMenu.fpsLabel:setVisible(enable)
 | |
| end
 | |
| 
 | |
| function addLeftButton(id, description, icon, callback, front, index)
 | |
|   return addButton(id, description, icon, callback, topMenu.leftButtonsPanel, false, front, index)
 | |
| end
 | |
| 
 | |
| function addLeftToggleButton(id, description, icon, callback, front, index)
 | |
|   return addButton(id, description, icon, callback, topMenu.leftButtonsPanel, true, front, index)
 | |
| end
 | |
| 
 | |
| function addRightButton(id, description, icon, callback, front, index)
 | |
|   return addButton(id, description, icon, callback, topMenu.rightButtonsPanel, false, front, index)
 | |
| end
 | |
| 
 | |
| function addRightToggleButton(id, description, icon, callback, front, index)
 | |
|   return addButton(id, description, icon, callback, topMenu.rightButtonsPanel, true, front, index)
 | |
| end
 | |
| 
 | |
| function addLeftGameButton(id, description, icon, callback, front, index)
 | |
|   local button = addButton(id, description, icon, callback, topMenu.leftGameButtonsPanel, false, front, index)
 | |
|   if modules.game_buttons then
 | |
|     modules.game_buttons.takeButton(button)
 | |
|   end
 | |
|   return button
 | |
| end
 | |
| 
 | |
| function addLeftGameToggleButton(id, description, icon, callback, front, index)
 | |
|   local button = addButton(id, description, icon, callback, topMenu.leftGameButtonsPanel, true, front, index)
 | |
|   if modules.game_buttons then
 | |
|     modules.game_buttons.takeButton(button)
 | |
|   end
 | |
|   return button
 | |
| end
 | |
| 
 | |
| function addRightGameButton(id, description, icon, callback, front, index)
 | |
|   local button = addButton(id, description, icon, callback, topMenu.rightGameButtonsPanel, false, front, index)
 | |
|   if modules.game_buttons then
 | |
|     modules.game_buttons.takeButton(button)
 | |
|   end
 | |
|   return button
 | |
| end
 | |
| 
 | |
| function addRightGameToggleButton(id, description, icon, callback, front, index)
 | |
|   local button = addButton(id, description, icon, callback, topMenu.rightGameButtonsPanel, true, front, index)
 | |
|   if modules.game_buttons then
 | |
|     modules.game_buttons.takeButton(button)
 | |
|   end
 | |
|   return button
 | |
| end
 | |
| 
 | |
| function showGameButtons()
 | |
|   topMenu.leftGameButtonsPanel:show()
 | |
|   topMenu.rightGameButtonsPanel:show()
 | |
|   if modules.game_buttons then
 | |
|     modules.game_buttons.takeButtons(topMenu.leftGameButtonsPanel:getChildren())
 | |
|     modules.game_buttons.takeButtons(topMenu.rightGameButtonsPanel:getChildren())
 | |
|   end
 | |
| end
 | |
| 
 | |
| function hideGameButtons()
 | |
|   topMenu.leftGameButtonsPanel:hide()
 | |
|   topMenu.rightGameButtonsPanel:hide()
 | |
| end
 | |
| 
 | |
| function getButton(id)
 | |
|   return topMenu:recursiveGetChildById(id)
 | |
| end
 | |
| 
 | |
| function getTopMenu()
 | |
|   return topMenu
 | |
| end
 | |
| 
 | |
| function toggle()
 | |
|   if not topMenu then
 | |
|     return
 | |
|   end
 | |
|   
 | |
|   if topMenu:isVisible() then
 | |
|     hide()
 | |
|   else
 | |
|     show()
 | |
|   end
 | |
| end
 | |
| 
 | |
| function hide()
 | |
|   topMenu:hide()
 | |
|   if not topMenu.hideIngame then
 | |
|     modules.game_interface.getRootPanel():addAnchor(AnchorTop, 'parent', AnchorTop)
 | |
|   end
 | |
|   if modules.game_stats then
 | |
|     modules.game_stats.show()
 | |
|   end
 | |
| end
 | |
| 
 | |
| function show()
 | |
|   topMenu:show()
 | |
|   if not topMenu.hideIngame then
 | |
|     modules.game_interface.getRootPanel():addAnchor(AnchorTop, 'topMenu', AnchorBottom)
 | |
|   end
 | |
|   if modules.game_stats then
 | |
|     modules.game_stats.hide()
 | |
|   end
 | |
| end
 | |
| 
 | |
| function updateStatus()
 | |
|   removeEvent(statusUpdateEvent)
 | |
|   if not Services or not Services.status or Services.status:len() < 4 then return end
 | |
|   if not topMenu.onlineLabel then return end
 | |
|   if g_game.isOnline() then return end
 | |
|   HTTP.postJSON(Services.status, {type="cacheinfo"}, function(data, err)
 | |
|     if err then
 | |
|       g_logger.warning("HTTP error for " .. Services.status .. ": " .. err) 
 | |
|       statusUpdateEvent = scheduleEvent(updateStatus, 5000)
 | |
|       return
 | |
|     end
 | |
|     if topMenu.onlineLabel then
 | |
|       if data.online then
 | |
|         topMenu.onlineLabel:setText(data.online)
 | |
|       elseif data.playersonline then
 | |
|         topMenu.onlineLabel:setText(data.playersonline .. " players online")
 | |
|       end
 | |
|     end
 | |
|     if data.discord_online and topMenu.discordLabel then
 | |
|       topMenu.discordLabel:setText(data.discord_online)
 | |
|     end
 | |
|     if data.discord_link and topMenu.discordLabel and topMenu.discord then
 | |
|       local discordOnClick = function()
 | |
|         g_platform.openUrl(data.discord_link)
 | |
|       end
 | |
|       topMenu.discordLabel.onClick = discordOnClick
 | |
|       topMenu.discord.onClick = discordOnClick
 | |
|     end
 | |
|     statusUpdateEvent = scheduleEvent(updateStatus, 60000)
 | |
|   end)
 | |
| end | 
