mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-04-30 19:29:21 +02: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 |