diff --git a/modules/client_entergame/characterlist.lua b/modules/client_entergame/characterlist.lua index 9f233f09..b3fdaa94 100644 --- a/modules/client_entergame/characterlist.lua +++ b/modules/client_entergame/characterlist.lua @@ -22,7 +22,7 @@ local function tryLogin(charInfo, tries) if g_game.isOnline() then g_game.safeLogout() if tries == 1 then - loadBox = displayCancelBox(tr('Please wait'), tr('Loggin out...')) + loadBox = displayCancelBox(tr('Please wait'), tr('Logging out...')) end scheduleEvent(function() tryLogin(charInfo, tries+1) end, 250) return diff --git a/modules/corelib/mouse.lua b/modules/corelib/mouse.lua index 1aa94b76..0d3848dc 100644 --- a/modules/corelib/mouse.lua +++ b/modules/corelib/mouse.lua @@ -32,14 +32,18 @@ function g_mouse.isPressed(button) return g_window.isMouseButtonPressed(button) end -function g_mouse.bindAutoPress(widget, callback, delay) +function g_mouse.bindAutoPress(widget, callback, delay, button) + local button = button or MouseLeftButton connect(widget, { onMousePress = function(widget, mousePos, mouseButton) + if(mouseButton ~= button) then + return false + end local startTime = g_clock.millis() callback(widget, mousePos, mouseButton, 0) periodicalEvent(function() callback(widget, g_window.getMousePosition(), mouseButton, g_clock.millis() - startTime) end, function() - return widget:isPressed() + return g_mouse.isPressed(mouseButton) end, 30, delay) return true end }) diff --git a/modules/game_hotkeys/hotkeys_manager.lua b/modules/game_hotkeys/hotkeys_manager.lua index 53c59386..7b834281 100644 --- a/modules/game_hotkeys/hotkeys_manager.lua +++ b/modules/game_hotkeys/hotkeys_manager.lua @@ -334,6 +334,7 @@ function HotkeysManager.checkSelectedHotkey(focused) if hotkeyLabelSelectedOnList.itemId == nil then hotkeyText:enable() + hotkeyText:focus() hotKeyTextLabel:enable() hotkeyText:setText(hotkeyLabelSelectedOnList.value) diff --git a/modules/game_interface/gameinterface.lua b/modules/game_interface/gameinterface.lua index 5754a9b6..2497446f 100644 --- a/modules/game_interface/gameinterface.lua +++ b/modules/game_interface/gameinterface.lua @@ -9,6 +9,10 @@ local gameBottomPanel local logoutButton local mouseGrabberWidget +local countWindow +local logoutWindow +local exitWindow + local function onLeftPanelVisibilityChange(leftPanel, visible) if not visible then local children = leftPanel:getChildren() @@ -97,6 +101,9 @@ function GameInterface.terminate() gameLeftPanel = nil gameBottomPanel = nil mouseGrabberWidget = nil + countWindow = nil + logoutWindow = nil + exitWindow = nil GameInterface = nil end @@ -125,23 +132,34 @@ function GameInterface.exit() end function GameInterface.tryExit() - local exitWindow = g_ui.createWidget('ExitWindow', rootWidget) + if(exitWindow) then + return true + end + exitWindow = g_ui.createWidget('ExitWindow', rootWidget) local exitButton = exitWindow:getChildById('buttonExit') - local logoutButton = exitWindow:getChildById('buttonLogout') + local logButton = exitWindow:getChildById('buttonLogout') + local cancelButton = exitWindow:getChildById('buttonCancel') local exitFunc = function() GameInterface.exit() exitButton:getParent():destroy() end - local logoutFunc = function() GameInterface.logout() - logoutButton:getParent():destroy() + logButton:getParent():destroy() + exitWindow = nil + end + local cancelFunc = function() + cancelButton:getParent():destroy() + exitWindow = nil end + exitWindow.onEscape = cancelFunc exitWindow.onEnter = logoutFunc + exitButton.onClick = exitFunc - logoutButton.onClick = logoutFunc + logButton.onClick = logoutFunc + cancelButton.onClick = cancelFunc return true -- signal closing end @@ -153,16 +171,28 @@ function GameInterface.logout() end function GameInterface.tryLogout() - local logoutWindow = g_ui.createWidget('LogoutWindow', rootWidget) + if(logoutWindow) then + return + end + logoutWindow = g_ui.createWidget('LogoutWindow', rootWidget) local yesButton = logoutWindow:getChildById('buttonYes') - + local noButton = logoutWindow:getChildById('buttonNo') + local logoutFunc = function() GameInterface.logout() yesButton:getParent():destroy() + logoutWindow = nil + end + local cancelFunc = function() + noButton:getParent():destroy() + logoutWindow = nil end logoutWindow.onEnter = logoutFunc + logoutWindow.onEscape = cancelFunc + yesButton.onClick = logoutFunc + noButton.onClick = cancelFunc end function GameInterface.onMouseGrabberRelease(self, mousePosition, mouseButton) @@ -375,7 +405,8 @@ function GameInterface.processMouseAction(menuPosition, mouseButton, autoWalkPos end else if multiUseThing and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton and not g_mouse.isPressed(MouseLeftButton) then - if multiUseThing:asCreature() then + local player = g_game.getLocalPlayer() + if multiUseThing:asCreature() and multiUseThing:asCreature() ~= player then g_game.attack(multiUseThing:asCreature()) return true elseif multiUseThing:isContainer() then @@ -422,6 +453,9 @@ function GameInterface.processMouseAction(menuPosition, mouseButton, autoWalkPos end function GameInterface.moveStackableItem(item, toPos) + if(countWindow) then + return + end if g_keyboard.isCtrlPressed() then g_game.move(item, toPos, item:getCount()) return @@ -431,7 +465,7 @@ function GameInterface.moveStackableItem(item, toPos) end local count = item:getCount() - local countWindow = g_ui.createWidget('CountWindow', rootWidget) + countWindow = g_ui.createWidget('CountWindow', rootWidget) local spinbox = countWindow:getChildById('countSpinBox') local scrollbar = countWindow:getChildById('countScrollBar') spinbox:setMaximum(count) @@ -447,10 +481,19 @@ function GameInterface.moveStackableItem(item, toPos) local moveFunc = function() g_game.move(item, toPos, spinbox:getValue()) okButton:getParent():destroy() + countWindow = nil + end + local cancelButton = countWindow:getChildById('buttonCancel') + local cancelFunc = function() + cancelButton:getParent():destroy() + countWindow = nil end countWindow.onEnter = moveFunc + countWindow.onEscape = cancelFunc + okButton.onClick = moveFunc + cancelButton.onClick = cancelFunc end function GameInterface.getRootPanel() diff --git a/modules/game_interface/styles/countwindow.otui b/modules/game_interface/styles/countwindow.otui index 843e1c6c..7f648052 100644 --- a/modules/game_interface/styles/countwindow.otui +++ b/modules/game_interface/styles/countwindow.otui @@ -2,7 +2,6 @@ CountWindow < MainWindow id: countWindow !text: tr('Move Stackable Item') size: 196 112 - @onEscape: self:destroy() Label !text: tr('Amount:') @@ -38,4 +37,3 @@ CountWindow < MainWindow width: 64 anchors.right: parent.right anchors.bottom: parent.bottom - @onClick: self:getParent():destroy() diff --git a/modules/game_interface/styles/exitwindow.otui b/modules/game_interface/styles/exitwindow.otui index a1affa38..f47ece50 100644 --- a/modules/game_interface/styles/exitwindow.otui +++ b/modules/game_interface/styles/exitwindow.otui @@ -2,31 +2,15 @@ ExitWindow < MainWindow id: exitWindow !text: tr('Exit') size: 550 135 - @onEscape: self:destroy() Label - !text: tr('If you shut down the program, you character might stay in the game.') + !text: tr('If you shut down the program, you character might stay in the game.\nClick on "Logout" to ensure that you character leaves the game property.\nClick on "Exit" if you want to exit the program without logging out your character.') width: 550 + height: 110 anchors.left: parent.left anchors.top: parent.top margin-left: 10 margin-top: 2 - - Label - !text: tr('Click on "Logout" to ensure that you character leaves the game property.') - width: 550 - anchors.left: parent.left - anchors.top: prev.bottom - margin-left: 10 - margin-top: 2 - - Label - !text: tr('Click on "Exit" if you want to exit the program without logging out your character.') - width: 550 - anchors.left: parent.left - anchors.top: prev.bottom - margin-left: 10 - margin-top: 2 Button id: buttonExit @@ -34,7 +18,7 @@ ExitWindow < MainWindow width: 64 anchors.left: parent.left anchors.bottom: parent.bottom - margin-left: 155 + margin-left: 160 Button id: buttonLogout @@ -51,4 +35,3 @@ ExitWindow < MainWindow anchors.left: prev.right anchors.bottom: parent.bottom margin-left: 5 - @onClick: self:getParent():destroy() diff --git a/modules/game_interface/styles/logoutwindow.otui b/modules/game_interface/styles/logoutwindow.otui index 5be1be5f..ab11375f 100644 --- a/modules/game_interface/styles/logoutwindow.otui +++ b/modules/game_interface/styles/logoutwindow.otui @@ -2,7 +2,6 @@ LogoutWindow < MainWindow id: logoutWindow !text: tr('Logout') size: 300 100 - @onEscape: self:destroy() Label !text: tr('Are you sure you want to logout?') diff --git a/modules/game_minimap/minimap.lua b/modules/game_minimap/minimap.lua index 422d6e84..3998c8ee 100644 --- a/modules/game_minimap/minimap.lua +++ b/modules/game_minimap/minimap.lua @@ -5,6 +5,8 @@ local minimapWidget local minimapButton local minimapWindow local DEFAULT_ZOOM = 60 +local MAX_FLOOR_UP = 0 +local MAX_FLOOR_DOWN = 15 local navigating = false minimapFirstLoad = true @@ -54,7 +56,7 @@ function Minimap.init() minimapWidget = minimapWindow:recursiveGetChildById('minimap') - g_mouse.bindAutoPress(minimapWidget, Minimap.compassClick) + g_mouse.bindAutoPress(minimapWidget, Minimap.compassClick, nil, MouseRightButton) minimapWidget:setAutoViewMode(false) minimapWidget:setViewMode(1) -- mid view minimapWidget:setDrawMinimapColors(true) @@ -125,8 +127,8 @@ function Minimap.compassClick(self, mousePos, mouseButton, elapsed) local dx = px - self:getWidth()/2 local dy = -(py - self:getHeight()/2) local radius = math.sqrt(dx*dx+dy*dy) - local movex=0 - local movey=0 + local movex = 0 + local movey = 0 dx = dx/radius dy = dy/radius @@ -148,11 +150,15 @@ function Minimap.onButtonClick(id) elseif id == "floorUp" then local pos = minimapWidget:getCameraPosition() pos.z = pos.z - 1 - minimapWidget:setCameraPosition(pos) + if(pos.z > MAX_FLOOR_UP) then + minimapWidget:setCameraPosition(pos) + end elseif id == "floorDown" then local pos = minimapWidget:getCameraPosition() pos.z = pos.z + 1 - minimapWidget:setCameraPosition(pos) + if(pos.z < MAX_FLOOR_DOWN) then + minimapWidget:setCameraPosition(pos) + end end end diff --git a/modules/game_minimap/minimap.otui b/modules/game_minimap/minimap.otui index 9bb1fab1..aca13288 100644 --- a/modules/game_minimap/minimap.otui +++ b/modules/game_minimap/minimap.otui @@ -34,7 +34,7 @@ MiniWindow text: ? text-align: center phantom: false - !tooltip: tr('Hold left mouse button to navigate\nScroll mouse middle button to zoom') + !tooltip: tr('Hold right mouse button to navigate\nScroll mouse middle button to zoom') anchors.top: minimizeButton.top anchors.right: minimizeButton.left margin-right: 3 diff --git a/modules/game_textmessage/deathwindow.otui b/modules/game_textmessage/deathwindow.otui new file mode 100644 index 00000000..4e395bc0 --- /dev/null +++ b/modules/game_textmessage/deathwindow.otui @@ -0,0 +1,29 @@ +DeathWindow < MainWindow + id: deathWindow + !text: tr('You are dead') + size: 350 155 + + Label + !text: tr('Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!') + width: 550 + height: 140 + anchors.left: parent.left + anchors.top: parent.top + margin-left: 10 + margin-top: 2 + + Button + id: buttonOk + !text: tr('Ok') + width: 64 + anchors.left: parent.left + anchors.bottom: parent.bottom + margin-left: 160 + + Button + id: buttonCancel + !text: tr('Cancel') + width: 64 + anchors.left: prev.right + anchors.bottom: parent.bottom + margin-left: 5 diff --git a/modules/game_textmessage/textmessage.lua b/modules/game_textmessage/textmessage.lua index 97e5da37..e3587c76 100644 --- a/modules/game_textmessage/textmessage.lua +++ b/modules/game_textmessage/textmessage.lua @@ -20,6 +20,7 @@ local MessageTypes = { local centerTextMessagePanel local bottomStatusLabel local privateLabel +local deathWindow -- private functions local function displayMessage(msgtype, msg, time) @@ -57,6 +58,8 @@ end -- public functions function TextMessage.init() + g_ui.importStyle('deathwindow.otui') + connect(g_game, { onDeath = TextMessage.displayDeadMessage, onTextMessage = TextMessage.display, onGameStart = TextMessage.clearMessages }) @@ -93,6 +96,7 @@ function TextMessage.terminate() centerTextMessagePanel = nil bottomStatusLabel = nil privateLabel = nil + deathWindow = nil TextMessage = nil end @@ -127,4 +131,28 @@ function TextMessage.displayDeadMessage() local advanceLabel = GameInterface.getMapPanel():recursiveGetChildById('centerAdvance') if advanceLabel:isVisible() then return end TextMessage.displayEventAdvance(tr('You are dead.')) + + if(deathWindow) then + return + end + deathWindow = g_ui.createWidget('DeathWindow', rootWidget) + local okButton = deathWindow:getChildById('buttonOk') + local cancelButton = deathWindow:getChildById('buttonCancel') + + local okFunc = function() + CharacterList.doLogin() + okButton:getParent():destroy() + deathWindow = nil + end + local cancelFunc = function() + GameInterface.logout() + cancelButton:getParent():destroy() + deathWindow = nil + end + + deathWindow.onEnter = okFunc + deathWindow.onEscape = cancelFunc + + okButton.onClick = okFunc + cancelButton.onClick = cancelFunc end