mirror of
				https://github.com/ErikasKontenis/SabrehavenServer.git
				synced 2025-10-30 19:56:22 +01:00 
			
		
		
		
	commit client
This commit is contained in:
		
							
								
								
									
										284
									
								
								SabrehavenOTClient/modules/client_topmenu/topmenu.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								SabrehavenOTClient/modules/client_topmenu/topmenu.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,284 @@ | ||||
| -- 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 | ||||
							
								
								
									
										10
									
								
								SabrehavenOTClient/modules/client_topmenu/topmenu.otmod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								SabrehavenOTClient/modules/client_topmenu/topmenu.otmod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| Module | ||||
|   name: client_topmenu | ||||
|   description: Create the top menu | ||||
|   author: edubart | ||||
|   website: https://github.com/edubart/otclient | ||||
|   scripts: [ topmenu ] | ||||
|   sandboxed: true | ||||
|   @onLoad: init() | ||||
|   @onUnload: terminate() | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 ErikasKontenis
					ErikasKontenis