mirror of
https://github.com/edubart/otclient.git
synced 2025-10-15 03:54:54 +02:00
Game control precision edits and many other fixes:
* Updated the walking(mouse/keys) control to be a lot more responsive/smooth! * Updated creature diagonal steps to animate faster (due to demand). * Added a warning popup for boost walker option in cipsoft servers. * Added KeyUp event controls in the g_keyboard class. * Fixed an issue with the minimap not reconfiguring. * Fixed a bug with creature lights drawing properly. * Fixed refreshContainer method. * Some layout edits. * Some minor typo fixes. TODO: * Add walk event stack. * Test new walking edits extensively. * Finish pending state feature.
This commit is contained in:
@@ -11,10 +11,10 @@ Module
|
||||
//- client_particles
|
||||
- client_topmenu
|
||||
- client_background
|
||||
- client_entergame
|
||||
- client_options
|
||||
- client_terminal
|
||||
- client_modulemanager
|
||||
- client_entergame
|
||||
//- client_stats
|
||||
|
||||
@onLoad: |
|
||||
|
@@ -3,6 +3,7 @@ EnterGame = { }
|
||||
-- private variables
|
||||
local loadBox
|
||||
local enterGame
|
||||
local motdWindow
|
||||
local motdButton
|
||||
local enterGameButton
|
||||
local protocolBox
|
||||
@@ -121,6 +122,8 @@ function EnterGame.terminate()
|
||||
enterGame = nil
|
||||
enterGameButton:destroy()
|
||||
enterGameButton = nil
|
||||
motdWindow:destroy()
|
||||
motdWindow = nil
|
||||
motdButton:destroy()
|
||||
motdButton = nil
|
||||
protocolBox = nil
|
||||
@@ -200,7 +203,9 @@ function EnterGame.doLogin()
|
||||
end
|
||||
|
||||
function EnterGame.displayMotd()
|
||||
displayInfoBox(tr('Message of the day'), G.motdMessage)
|
||||
if not motdWindow or not motdWindow:isVisible() then
|
||||
motdWindow = displayInfoBox(tr('Message of the day'), G.motdMessage)
|
||||
end
|
||||
end
|
||||
|
||||
function EnterGame.setDefaultServer(host, port, protocol)
|
||||
|
@@ -25,11 +25,13 @@ local defaultOptions = {
|
||||
painterEngine = 0
|
||||
}
|
||||
|
||||
local warningWindow
|
||||
local optionsWindow
|
||||
local optionsButton
|
||||
local optionsTabBar
|
||||
local options = {}
|
||||
local generalPanel
|
||||
local gamePanel
|
||||
local consolePanel
|
||||
local graphicsPanel
|
||||
|
||||
local function setupGraphicsEngines()
|
||||
@@ -62,6 +64,21 @@ local function setupGraphicsEngines()
|
||||
end
|
||||
end
|
||||
|
||||
function displayWarning(widget, warning)
|
||||
if warningWindow and warningWindow:isVisible() then
|
||||
return
|
||||
end
|
||||
if g_game.isOfficialTibia() and widget:isChecked() then
|
||||
local yesCallback = function() warningWindow:destroy() warningWindow=nil end
|
||||
local noCallback = function() widget:setChecked(false) warningWindow:destroy() warningWindow=nil end
|
||||
|
||||
warningWindow = displayGeneralBox('Warning', tr(warning), {
|
||||
{ text='Yes', callback=yesCallback },
|
||||
{ text='No', callback=noCallback },
|
||||
anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
|
||||
end
|
||||
end
|
||||
|
||||
function Options.init()
|
||||
-- load options
|
||||
for k,v in pairs(defaultOptions) do
|
||||
@@ -83,15 +100,21 @@ function Options.init()
|
||||
optionsTabBar = optionsWindow:getChildById('optionsTabBar')
|
||||
optionsTabBar:setContentWidget(optionsWindow:getChildById('optionsTabContent'))
|
||||
|
||||
generalPanel = g_ui.loadUI('game.otui')
|
||||
optionsTabBar:addTab(tr('Game'), generalPanel)
|
||||
gamePanel = g_ui.loadUI('game.otui')
|
||||
optionsTabBar:addTab(tr('Game'), gamePanel)
|
||||
|
||||
generalPanel = g_ui.loadUI('console.otui')
|
||||
optionsTabBar:addTab(tr('Console'), generalPanel)
|
||||
consolePanel = g_ui.loadUI('console.otui')
|
||||
optionsTabBar:addTab(tr('Console'), consolePanel)
|
||||
|
||||
graphicsPanel = g_ui.loadUI('graphics.otui')
|
||||
optionsTabBar:addTab(tr('Graphics'), graphicsPanel)
|
||||
|
||||
local optionWalkBooster = gamePanel:getChildById('walkBooster')
|
||||
optionWalkBooster.onCheckChange = function(widget)
|
||||
displayWarning(widget, "This feature could be detectable by official Tibia servers. Would like to continue?")
|
||||
Options.setOption(widget:getId(), widget:isChecked())
|
||||
end
|
||||
|
||||
setupGraphicsEngines()
|
||||
end
|
||||
|
||||
@@ -103,7 +126,8 @@ function Options.terminate()
|
||||
optionsButton:destroy()
|
||||
optionsButton = nil
|
||||
optionsTabBar = nil
|
||||
generalPanel = nil
|
||||
gamePanel = nil
|
||||
consolePanel = nil
|
||||
graphicsPanel = nil
|
||||
Options = nil
|
||||
end
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 281 B |
BIN
modules/client_skins/skins/default/images/menubutton.png
Normal file
BIN
modules/client_skins/skins/default/images/menubutton.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 315 B |
@@ -8,7 +8,7 @@ PopupMenuButton < UIButton
|
||||
text-offset: 0 0
|
||||
font: verdana-11px-antialised
|
||||
|
||||
image-source: /images/button_square.png
|
||||
image-source: /images/menubutton.png
|
||||
image-color: white
|
||||
image-clip: 0 0 20 20
|
||||
image-border: 2
|
||||
|
@@ -171,6 +171,9 @@ KeyNumpad7 = 148
|
||||
KeyNumpad8 = 149
|
||||
KeyNumpad9 = 150
|
||||
|
||||
FirstKey = KeyUnknown
|
||||
LastKey = KeyNumpad9
|
||||
|
||||
ExtendedActivate = 0
|
||||
ExtendedLocales = 1
|
||||
ExtendedParticles = 2
|
||||
|
@@ -80,6 +80,17 @@ local function onWidgetKeyDown(widget, keyCode, keyboardModifiers)
|
||||
return false
|
||||
end
|
||||
|
||||
local function onWidgetKeyUp(widget, keyCode, keyboardModifiers)
|
||||
if keyCode == KeyUnknown then return false end
|
||||
local keyComboDesc = determineKeyComboDesc(keyCode, keyboardModifiers)
|
||||
local callback = widget.boundKeyUpCombos[keyComboDesc]
|
||||
if callback then
|
||||
callback()
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function onWidgetKeyPress(widget, keyCode, keyboardModifiers, autoRepeatTicks)
|
||||
if keyCode == KeyUnknown then return false end
|
||||
local keyComboDesc = determineKeyComboDesc(keyCode, keyboardModifiers)
|
||||
@@ -97,6 +108,12 @@ local function connectKeyDownEvent(widget)
|
||||
widget.boundKeyDownCombos = {}
|
||||
end
|
||||
|
||||
local function connectKeyUpEvent(widget)
|
||||
if widget.boundKeyUpCombos then return end
|
||||
connect(widget, { onKeyUp = onWidgetKeyUp })
|
||||
widget.boundKeyUpCombos = {}
|
||||
end
|
||||
|
||||
local function connectKeyPressEvent(widget)
|
||||
if widget.boundKeyPressCombos then return end
|
||||
connect(widget, { onKeyPress = onWidgetKeyPress })
|
||||
@@ -114,6 +131,16 @@ function g_keyboard.bindKeyDown(keyComboDesc, callback, widget)
|
||||
widget.boundKeyDownCombos[keyComboDesc] = callback
|
||||
end
|
||||
|
||||
function g_keyboard.bindKeyUp(keyComboDesc, callback, widget)
|
||||
widget = widget or rootWidget
|
||||
connectKeyUpEvent(widget)
|
||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||
if widget.boundKeyUpCombos[keyComboDesc] then
|
||||
pwarning('KeyUp event \'' .. keyComboDesc .. '\' redefined on widget ' .. widget:getId())
|
||||
end
|
||||
widget.boundKeyUpCombos[keyComboDesc] = callback
|
||||
end
|
||||
|
||||
function g_keyboard.bindKeyPress(keyComboDesc, callback, widget, autoRepeatDelay)
|
||||
autoRepeatDelay = autoRepeatDelay or 500
|
||||
widget = widget or rootWidget
|
||||
@@ -135,6 +162,15 @@ function g_keyboard.unbindKeyDown(keyComboDesc, widget)
|
||||
end
|
||||
end
|
||||
|
||||
function g_keyboard.unbindKeyUp(keyComboDesc, widget)
|
||||
widget = widget or rootWidget
|
||||
if widget.boundKeyUpCombos == nil then return end
|
||||
local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
|
||||
if keyComboDesc then
|
||||
widget.boundKeyUpCombos[keyComboDesc] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function g_keyboard.unbindKeyPress(keyComboDesc, widget)
|
||||
widget = widget or rootWidget
|
||||
if widget.boundKeyPressCombos == nil then return end
|
||||
@@ -155,6 +191,32 @@ function g_keyboard.isKeyPressed(key)
|
||||
return g_window.isKeyPressed(key)
|
||||
end
|
||||
|
||||
function g_keyboard.isKeySetPressed(keys, all)
|
||||
all = all or false
|
||||
local result = {}
|
||||
for k,v in pairs(keys) do
|
||||
if type(v) == 'string' then
|
||||
key = getKeyCode(v)
|
||||
end
|
||||
if g_window.isKeyPressed(key) then
|
||||
if not all then
|
||||
return true
|
||||
end
|
||||
table.insert(result, true)
|
||||
end
|
||||
end
|
||||
return #result == #keys
|
||||
end
|
||||
|
||||
function g_keyboard.isInUse()
|
||||
for i = FirstKey, LastKey do
|
||||
if g_window.isKeyPressed(key) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function g_keyboard.isCtrlPressed()
|
||||
return bit32.band(g_window.getKeyboardModifiers(), KeyboardCtrlModifier) ~= 0
|
||||
end
|
||||
|
@@ -1,4 +1,4 @@
|
||||
WALK_AUTO_REPEAT_DELAY = 180
|
||||
WALK_AUTO_REPEAT_DELAY = 80
|
||||
|
||||
gameRootPanel = nil
|
||||
gameMapPanel = nil
|
||||
@@ -12,6 +12,18 @@ logoutWindow = nil
|
||||
exitWindow = nil
|
||||
bottomSplitter = nil
|
||||
|
||||
lastWalkDir = nil
|
||||
arrowKeys = {
|
||||
[North] = "Up",
|
||||
[South] = 'Down',
|
||||
[East] = 'Right',
|
||||
[West] = 'Left',
|
||||
[NorthEast] = 'Numpad9',
|
||||
[SouthEast] = 'Numpad3',
|
||||
[NorthWest] = 'Numpad7',
|
||||
[SouthWest] = 'Numpad1'
|
||||
}
|
||||
|
||||
function init()
|
||||
g_ui.importStyle('styles/countwindow.otui')
|
||||
|
||||
@@ -49,6 +61,12 @@ function bindKeys()
|
||||
g_keyboard.bindKeyPress('Right', function() smartWalk(East) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
g_keyboard.bindKeyPress('Down', function() smartWalk(South) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
g_keyboard.bindKeyPress('Left', function() smartWalk(West) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
|
||||
g_keyboard.bindKeyDown('Up', function() smartWalk(North) end, gameRootPanel)
|
||||
g_keyboard.bindKeyDown('Right', function() smartWalk(East) end, gameRootPanel)
|
||||
g_keyboard.bindKeyDown('Down', function() smartWalk(South) end, gameRootPanel)
|
||||
g_keyboard.bindKeyDown('Left', function() smartWalk(West) end, gameRootPanel)
|
||||
|
||||
g_keyboard.bindKeyPress('Numpad8', function() smartWalk(North) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
g_keyboard.bindKeyPress('Numpad9', function() smartWalk(NorthEast) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
g_keyboard.bindKeyPress('Numpad6', function() smartWalk(East) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
@@ -164,7 +182,34 @@ function tryLogout()
|
||||
end
|
||||
|
||||
function smartWalk(defaultDir)
|
||||
local dir
|
||||
--[[ TODO: Add walk event stack ]]
|
||||
local rebindKey = false
|
||||
local lastKey = arrowKeys[lastWalkDir]
|
||||
|
||||
-- choose a new direction
|
||||
if not g_keyboard.isKeyPressed(arrowKeys[defaultDir]) then
|
||||
local changeDir = false
|
||||
for k,v in pairs(arrowKeys) do
|
||||
if g_keyboard.isKeyPressed(v) then
|
||||
defaultDir = k
|
||||
changeDir = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if not changeDir then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- key is still pressed from previous walk event
|
||||
if lastWalkDir and lastWalkDir ~= defaultDir and g_keyboard.isKeyPressed(lastKey) then
|
||||
if g_keyboard.isKeySetPressed(arrowKeys) then
|
||||
g_keyboard.unbindKeyPress(lastKey, gameRootPanel)
|
||||
rebindKey = true
|
||||
end
|
||||
end
|
||||
|
||||
local dir = defaultDir
|
||||
if Options.getOption('smartWalk') then
|
||||
if g_keyboard.isKeyPressed('Up') and g_keyboard.isKeyPressed('Left') then
|
||||
dir = NorthWest
|
||||
@@ -176,9 +221,6 @@ function smartWalk(defaultDir)
|
||||
dir = SouthEast
|
||||
end
|
||||
end
|
||||
if not dir then
|
||||
dir = defaultDir
|
||||
end
|
||||
|
||||
if Options.getOption('walkBooster') then
|
||||
if g_game.getLocalPlayer():canWalk(dir) then
|
||||
@@ -187,8 +229,17 @@ function smartWalk(defaultDir)
|
||||
g_game.forceWalk(dir)
|
||||
end
|
||||
else
|
||||
g_game.walk(dir)
|
||||
--if g_game.getLocalPlayer():canWalk(dir) then
|
||||
g_game.walk(dir)
|
||||
--else
|
||||
|
||||
--end
|
||||
end
|
||||
|
||||
if rebindKey then
|
||||
g_keyboard.bindKeyPress(lastKey, function() smartWalk(lastWalkDir) end, gameRootPanel, WALK_AUTO_REPEAT_DELAY)
|
||||
end
|
||||
lastWalkDir = dir
|
||||
end
|
||||
|
||||
function updateStretchShrink()
|
||||
|
@@ -23,8 +23,7 @@ function init()
|
||||
onGameEnd = offline,
|
||||
onAutomapFlag = addMapFlag
|
||||
})
|
||||
connect(LocalPlayer, { onPositionChange = center,
|
||||
onPositionChange = updateMapFlags })
|
||||
connect(LocalPlayer, { onPositionChange = center })
|
||||
|
||||
g_keyboard.bindKeyDown('Ctrl+M', toggle)
|
||||
|
||||
@@ -63,8 +62,7 @@ function terminate()
|
||||
onGameEnd = offline,
|
||||
onAutomapFlag = addMapFlag
|
||||
})
|
||||
disconnect(LocalPlayer, { onPositionChange = center,
|
||||
onPositionChange = updateMapFlags })
|
||||
disconnect(LocalPlayer, { onPositionChange = center })
|
||||
|
||||
destroyFlagWindow()
|
||||
saveMapFlags()
|
||||
@@ -303,10 +301,7 @@ function reset()
|
||||
end
|
||||
|
||||
function center()
|
||||
local player = g_game.getLocalPlayer()
|
||||
if not player then return end
|
||||
minimapWidget:followCreature(player)
|
||||
|
||||
reset()
|
||||
updateMapFlags()
|
||||
end
|
||||
|
||||
|
@@ -123,7 +123,7 @@ function report()
|
||||
elseif comment == "" then
|
||||
displayErrorBox(tr("Error"), tr("You must enter a comment."))
|
||||
else
|
||||
g_game.reportRuleVilation(target, reason, action, comment, statement, statementId, ipBanishment)
|
||||
g_game.reportRuleViolation(target, reason, action, comment, statement, statementId, ipBanishment)
|
||||
hide()
|
||||
end
|
||||
end
|
||||
|
@@ -1,5 +1,3 @@
|
||||
TextScrollbar < VerticalScrollBar
|
||||
|
||||
TextWindow < MainWindow
|
||||
id: textWindow
|
||||
size: 280 280
|
||||
@@ -30,7 +28,7 @@ TextWindow < MainWindow
|
||||
margin-top: 30
|
||||
margin-bottom: 30
|
||||
|
||||
TextScrollbar
|
||||
VerticalScrollBar
|
||||
id: textScroll
|
||||
anchors.left: prev.right
|
||||
anchors.top: prev.top
|
||||
@@ -56,4 +54,4 @@ TextWindow < MainWindow
|
||||
anchors.top: text.bottom
|
||||
anchors.right: text.right
|
||||
margin-top: 10
|
||||
width: 60
|
||||
width: 60
|
||||
|
Reference in New Issue
Block a user