mirror of
				https://github.com/OTCv8/otclientv8.git
				synced 2025-10-31 10:56:24 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			216 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 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 | 
