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 |