mirror of
				https://github.com/ErikasKontenis/SabrehavenServer.git
				synced 2025-10-30 19:56:22 +01:00 
			
		
		
		
	commit client
This commit is contained in:
		
							
								
								
									
										216
									
								
								SabrehavenOTClient/modules/client_mobile/mobile.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								SabrehavenOTClient/modules/client_mobile/mobile.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| local overlay | ||||
| local keypad | ||||
| local touchStart = 0 | ||||
| local updateCursorEvent | ||||
| local zoomInButton | ||||
| local zoomOutButton | ||||
| local keypadButton | ||||
| local keypadEvent | ||||
| local keypadMousePos = {x=0.5, y=0.5} | ||||
| local keypadTicks = 0 | ||||
|  | ||||
| -- public functions | ||||
| function init() | ||||
|   if not g_app.isMobile() then return end | ||||
|   overlay = g_ui.displayUI('mobile') | ||||
|   keypad = overlay.keypad | ||||
|   overlay:raise() | ||||
|    | ||||
|   zoomInButton = modules.client_topmenu.addLeftButton('zoomInButton', 'Zoom In', '/images/topbuttons/zoomin', function() g_app.scaleUp() end) | ||||
|   zoomOutButton = modules.client_topmenu.addLeftButton('zoomOutButton', 'Zoom Out', '/images/topbuttons/zoomout', function() g_app.scaleDown() end) | ||||
|   keypadButton = modules.client_topmenu.addLeftGameToggleButton('keypadButton', 'Keypad', '/images/topbuttons/keypad', function() | ||||
|     keypadButton:setChecked(not keypadButton:isChecked()) | ||||
|     if not g_game.isOnline() then | ||||
|       keypad:setVisible(false) | ||||
|       return | ||||
|     end | ||||
|     keypad:setVisible(keypadButton:isChecked()) | ||||
|   end) | ||||
|   keypadButton:setChecked(true) | ||||
|    | ||||
|   scheduleEvent(function() | ||||
|     g_app.scale(5.0) | ||||
|   end, 10) | ||||
|    | ||||
|   connect(overlay, {  | ||||
|     onMousePress = onMousePress, | ||||
|     onMouseRelease = onMouseRelease, | ||||
|     onTouchPress = onMousePress, | ||||
|     onTouchRelease = onMouseRelease, | ||||
|     onMouseMove = onMouseMove  | ||||
|   }) | ||||
|   connect(keypad, { | ||||
|     onTouchPress = onKeypadTouchPress, | ||||
|     onTouchRelease = onKeypadTouchRelease,   | ||||
|     onMouseMove = onKeypadTouchMove | ||||
|   }) | ||||
|   connect(g_game, {  | ||||
|     onGameStart = online, | ||||
|     onGameEnd = offline  | ||||
|   }) | ||||
|   if g_game.isOnline() then | ||||
|     online() | ||||
|   end | ||||
| end | ||||
|  | ||||
| function terminate() | ||||
|   if not g_app.isMobile() then return end | ||||
|   removeEvent(updateCursorEvent) | ||||
|   removeEvent(keypadEvent) | ||||
|   keypadEvent = nil | ||||
|   disconnect(overlay, {  | ||||
|     onMousePress = onMousePress, | ||||
|     onMouseRelease = onMouseRelease, | ||||
|     onTouchPress = onMousePress, | ||||
|     onTouchRelease = onMouseRelease, | ||||
|     onMouseMove = onMouseMove  | ||||
|   }) | ||||
|   disconnect(keypad, { | ||||
|     onTouchPress = onKeypadTouchPress, | ||||
|     onTouchRelease = onKeypadTouchRelease,   | ||||
|     onMouseMove = onKeypadTouchMove | ||||
|   }) | ||||
|   disconnect(g_game, {  | ||||
|     onGameStart = online, | ||||
|     onGameEnd = offline  | ||||
|   }) | ||||
|   zoomInButton:destroy() | ||||
|   zoomOutButton:destroy() | ||||
|   keypadButton:destroy() | ||||
|   overlay:destroy() | ||||
|   overlay = nil | ||||
| end | ||||
|  | ||||
| function hide() | ||||
|   overlay:hide() | ||||
| end | ||||
|  | ||||
| function show() | ||||
|   overlay:show() | ||||
| end | ||||
|  | ||||
| function online() | ||||
|   if keypadButton:isChecked() then | ||||
|     keypad:raise() | ||||
|     keypad:show() | ||||
|   end | ||||
| end | ||||
|  | ||||
| function offline() | ||||
|   keypad:hide() | ||||
| end | ||||
|  | ||||
| function onMouseMove(widget, pos, offset) | ||||
|  | ||||
| end | ||||
|  | ||||
| function onMousePress(widget, pos, button) | ||||
|   overlay:raise() | ||||
|   if button == MouseTouch then -- touch | ||||
|     overlay:raise() | ||||
|     overlay.cursor:show() | ||||
|     overlay.cursor:setPosition({x=pos.x - 32, y = pos.y - 32})   | ||||
|     touchStart = g_clock.millis() | ||||
|     updateCursor() | ||||
|   else | ||||
|     overlay.cursor:hide() | ||||
|     removeEvent(updateCursorEvent) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function onMouseRelease(widget, pos, button) | ||||
|   if button == MouseTouch then | ||||
|     overlay.cursor:hide() | ||||
|     removeEvent(updateCursorEvent) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function updateCursor() | ||||
|   removeEvent(updateCursorEvent) | ||||
|   if not g_mouse.isPressed(MouseTouch) then return end | ||||
|   local percent = 100 - math.max(0, math.min(100, (g_clock.millis() - touchStart) / 5)) -- 500 ms | ||||
|   overlay.cursor:setPercent(percent) | ||||
|   if percent > 0 then | ||||
|     overlay.cursor:setOpacity(0.5) | ||||
|     updateCursorEvent = scheduleEvent(updateCursor, 10) | ||||
|   else | ||||
|     overlay.cursor:setOpacity(0.8) | ||||
|   end | ||||
| end | ||||
|  | ||||
| function onKeypadTouchMove(widget, pos, offset) | ||||
|   keypadMousePos = {x=(pos.x - widget:getPosition().x) / widget:getWidth(),  | ||||
|                     y=(pos.y - widget:getPosition().y) / widget:getHeight()} | ||||
|   return true | ||||
| end | ||||
|  | ||||
| function onKeypadTouchPress(widget, pos, button) | ||||
|   if button ~= MouseTouch then return false end | ||||
|   keypadTicks = 0 | ||||
|   keypadMousePos = {x=(pos.x - widget:getPosition().x) / widget:getWidth(),  | ||||
|                     y=(pos.y - widget:getPosition().y) / widget:getHeight()} | ||||
|   executeWalk() | ||||
|   return true | ||||
| end | ||||
|  | ||||
| function onKeypadTouchRelease(widget, pos, button) | ||||
|   if button ~= MouseTouch then return false end | ||||
|   keypadMousePos = {x=(pos.x - widget:getPosition().x) / widget:getWidth(),  | ||||
|                     y=(pos.y - widget:getPosition().y) / widget:getHeight()} | ||||
|   executeWalk() | ||||
|   removeEvent(keypadEvent) | ||||
|   keypad.pointer:setMarginTop(0) | ||||
|   keypad.pointer:setMarginLeft(0) | ||||
|   return true | ||||
| end | ||||
|  | ||||
| function executeWalk() | ||||
|   removeEvent(keypadEvent) | ||||
|   keypadEvent = nil | ||||
|   if not modules.game_walking or not g_mouse.isPressed(MouseTouch) then | ||||
|     keypad.pointer:setMarginTop(0) | ||||
|     keypad.pointer:setMarginLeft(0) | ||||
|     return | ||||
|   end | ||||
|   keypadEvent = scheduleEvent(executeWalk, 20) | ||||
|   keypadMousePos.x = math.min(1, math.max(0, keypadMousePos.x)) | ||||
|   keypadMousePos.y = math.min(1, math.max(0, keypadMousePos.y)) | ||||
|   local angle = math.atan2(keypadMousePos.x - 0.5, keypadMousePos.y - 0.5) | ||||
|   local maxTop = math.abs(math.cos(angle)) * 75 | ||||
|   local marginTop = math.max(-maxTop, math.min(maxTop, (keypadMousePos.y - 0.5) * 150)) | ||||
|   local maxLeft = math.abs(math.sin(angle)) * 75 | ||||
|   local marginLeft = math.max(-maxLeft, math.min(maxLeft, (keypadMousePos.x - 0.5) * 150)) | ||||
|   keypad.pointer:setMarginTop(marginTop) | ||||
|   keypad.pointer:setMarginLeft(marginLeft) | ||||
|   local dir | ||||
|   if keypadMousePos.y < 0.3 and keypadMousePos.x < 0.3 then | ||||
|     dir = Directions.NorthWest      | ||||
|   elseif keypadMousePos.y < 0.3 and keypadMousePos.x > 0.7 then | ||||
|     dir = Directions.NorthEast | ||||
|   elseif keypadMousePos.y > 0.7 and keypadMousePos.x < 0.3 then | ||||
|     dir = Directions.SouthWest | ||||
|   elseif keypadMousePos.y > 0.7 and keypadMousePos.x > 0.7 then | ||||
|     dir = Directions.SouthEast | ||||
|   end | ||||
|   if not dir and (math.abs(keypadMousePos.y - 0.5) > 0.1 or math.abs(keypadMousePos.x - 0.5) > 0.1) then | ||||
|     if math.abs(keypadMousePos.y - 0.5) > math.abs(keypadMousePos.x - 0.5) then | ||||
|       if keypadMousePos.y < 0.5 then | ||||
|         dir = Directions.North | ||||
|       else | ||||
|         dir = Directions.South | ||||
|       end | ||||
|     else | ||||
|       if keypadMousePos.x < 0.5 then | ||||
|         dir = Directions.West | ||||
|       else | ||||
|         dir = Directions.East | ||||
|       end     | ||||
|     end   | ||||
|   end | ||||
|   if dir then | ||||
|     modules.game_walking.walk(dir, keypadTicks) | ||||
|     if keypadTicks == 0 then | ||||
|       keypadTicks = 100 | ||||
|     end | ||||
|   end | ||||
| end | ||||
							
								
								
									
										9
									
								
								SabrehavenOTClient/modules/client_mobile/mobile.otmod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								SabrehavenOTClient/modules/client_mobile/mobile.otmod
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| Module | ||||
|   name: client_mobile | ||||
|   description: Handles the mobile interface for smartphones | ||||
|   author: otclient@otclient.ovh | ||||
|   website: http://otclient.net | ||||
|   sandboxed: true | ||||
|   scripts: [ mobile ] | ||||
|   @onLoad: init() | ||||
|   @onUnload: terminate() | ||||
							
								
								
									
										39
									
								
								SabrehavenOTClient/modules/client_mobile/mobile.otui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								SabrehavenOTClient/modules/client_mobile/mobile.otui
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| UIWidget | ||||
|   anchors.fill: parent | ||||
|   focusable: false | ||||
|   phantom: true | ||||
|  | ||||
|   UIProgressRect | ||||
|     id: cursor | ||||
|     size: 64 64 | ||||
|     background: #FF5858 | ||||
|     percent: 100 | ||||
|     visible: false | ||||
|     x: 0 | ||||
|     y: 0 | ||||
|     focusable: false | ||||
|     phantom: true | ||||
|  | ||||
|   UIWidget | ||||
|     id: keypad | ||||
|     size: 200 150 | ||||
|     anchors.bottom: parent.bottom | ||||
|     anchors.right: parent.right | ||||
|     phantom: false | ||||
|     focusable: false | ||||
|     visible: false | ||||
|     background: #00000044 | ||||
|     image-source: /images/game/mobile/keypad | ||||
|     image-fixed-ratio: true | ||||
|     image-rect: 25 0 150 150 | ||||
|      | ||||
|     UIWidget | ||||
|       id: pointer | ||||
|       size: 49 49 | ||||
|       anchors.verticalCenter: parent.verticalCenter | ||||
|       anchors.horizontalCenter: parent.horizontalCenter | ||||
|       image-source: /images/game/mobile/keypad_pointer | ||||
|       image-fixed-ratio: true | ||||
|       phantom: true | ||||
|       focusable: false | ||||
|        | ||||
		Reference in New Issue
	
	Block a user
	 ErikasKontenis
					ErikasKontenis