mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-05 06:45:32 +00:00
Move input actions handling to the separate file
This commit is contained in:
parent
fcac7d3ab7
commit
ce40294124
5 changed files with 572 additions and 477 deletions
|
@ -25,7 +25,7 @@ add_openmw_dir (mwrender
|
|||
)
|
||||
|
||||
add_openmw_dir (mwinput
|
||||
actions inputmanagerimp mousemanager sdlmappings sensormanager
|
||||
actions actionmanager inputmanagerimp mousemanager sdlmappings sensormanager
|
||||
)
|
||||
|
||||
add_openmw_dir (mwgui
|
||||
|
|
484
apps/openmw/mwinput/actionmanager.cpp
Normal file
484
apps/openmw/mwinput/actionmanager.cpp
Normal file
|
@ -0,0 +1,484 @@
|
|||
#include "actionmanager.hpp"
|
||||
|
||||
#include <MyGUI_InputManager.h>
|
||||
|
||||
#include <SDL_keyboard.h>
|
||||
|
||||
#include <extern/oics/ICSInputControlSystem.h>
|
||||
|
||||
#include <components/settings/settings.hpp>
|
||||
|
||||
#include "../mwbase/inputmanager.hpp"
|
||||
#include "../mwbase/statemanager.hpp"
|
||||
#include "../mwbase/environment.hpp"
|
||||
#include "../mwbase/mechanicsmanager.hpp"
|
||||
#include "../mwbase/windowmanager.hpp"
|
||||
#include "../mwbase/world.hpp"
|
||||
|
||||
#include "../mwworld/player.hpp"
|
||||
#include "../mwworld/class.hpp"
|
||||
#include "../mwworld/inventorystore.hpp"
|
||||
#include "../mwworld/esmstore.hpp"
|
||||
|
||||
#include "../mwmechanics/npcstats.hpp"
|
||||
#include "../mwmechanics/actorutil.hpp"
|
||||
|
||||
#include "actions.hpp"
|
||||
|
||||
namespace MWInput
|
||||
{
|
||||
const float ZOOM_SCALE = 120.f; /// Used for scrolling camera in and out
|
||||
const int fakeDeviceID = 1;
|
||||
|
||||
ActionManager::ActionManager(ICS::InputControlSystem* inputBinder,
|
||||
osgViewer::ScreenCaptureHandler::CaptureOperation* screenCaptureOperation,
|
||||
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler)
|
||||
: mInputBinder(inputBinder)
|
||||
, mViewer(viewer)
|
||||
, mScreenCaptureHandler(screenCaptureHandler)
|
||||
, mScreenCaptureOperation(screenCaptureOperation)
|
||||
, mAlwaysRunActive(Settings::Manager::getBool("always run", "Input"))
|
||||
, mSneaking(false)
|
||||
{
|
||||
}
|
||||
|
||||
void ActionManager::executeAction(int action)
|
||||
{
|
||||
// trigger action activated
|
||||
switch (action)
|
||||
{
|
||||
case A_GameMenu:
|
||||
toggleMainMenu ();
|
||||
break;
|
||||
case A_Screenshot:
|
||||
screenshot();
|
||||
break;
|
||||
case A_Inventory:
|
||||
toggleInventory ();
|
||||
break;
|
||||
case A_Console:
|
||||
toggleConsole ();
|
||||
break;
|
||||
case A_Activate:
|
||||
MWBase::Environment::get().getInputManager()->resetIdleTime();
|
||||
activate();
|
||||
break;
|
||||
case A_MoveLeft:
|
||||
case A_MoveRight:
|
||||
case A_MoveForward:
|
||||
case A_MoveBackward:
|
||||
handleGuiArrowKey(action);
|
||||
break;
|
||||
case A_Journal:
|
||||
toggleJournal ();
|
||||
break;
|
||||
case A_AutoMove:
|
||||
toggleAutoMove ();
|
||||
break;
|
||||
case A_AlwaysRun:
|
||||
toggleWalking ();
|
||||
break;
|
||||
case A_ToggleWeapon:
|
||||
toggleWeapon ();
|
||||
break;
|
||||
case A_Rest:
|
||||
rest();
|
||||
break;
|
||||
case A_ToggleSpell:
|
||||
toggleSpell ();
|
||||
break;
|
||||
case A_QuickKey1:
|
||||
quickKey(1);
|
||||
break;
|
||||
case A_QuickKey2:
|
||||
quickKey(2);
|
||||
break;
|
||||
case A_QuickKey3:
|
||||
quickKey(3);
|
||||
break;
|
||||
case A_QuickKey4:
|
||||
quickKey(4);
|
||||
break;
|
||||
case A_QuickKey5:
|
||||
quickKey(5);
|
||||
break;
|
||||
case A_QuickKey6:
|
||||
quickKey(6);
|
||||
break;
|
||||
case A_QuickKey7:
|
||||
quickKey(7);
|
||||
break;
|
||||
case A_QuickKey8:
|
||||
quickKey(8);
|
||||
break;
|
||||
case A_QuickKey9:
|
||||
quickKey(9);
|
||||
break;
|
||||
case A_QuickKey10:
|
||||
quickKey(10);
|
||||
break;
|
||||
case A_QuickKeysMenu:
|
||||
showQuickKeysMenu();
|
||||
break;
|
||||
case A_ToggleHUD:
|
||||
MWBase::Environment::get().getWindowManager()->toggleHud();
|
||||
break;
|
||||
case A_ToggleDebug:
|
||||
MWBase::Environment::get().getWindowManager()->toggleDebugWindow();
|
||||
break;
|
||||
case A_ZoomIn:
|
||||
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playerviewswitch") && MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols") && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWorld()->setCameraDistance(ZOOM_SCALE, true, true);
|
||||
break;
|
||||
case A_ZoomOut:
|
||||
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playerviewswitch") && MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols") && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWorld()->setCameraDistance(-ZOOM_SCALE, true, true);
|
||||
break;
|
||||
case A_QuickSave:
|
||||
quickSave();
|
||||
break;
|
||||
case A_QuickLoad:
|
||||
quickLoad();
|
||||
break;
|
||||
case A_CycleSpellLeft:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
||||
MWBase::Environment::get().getWindowManager()->cycleSpell(false);
|
||||
break;
|
||||
case A_CycleSpellRight:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
||||
MWBase::Environment::get().getWindowManager()->cycleSpell(true);
|
||||
break;
|
||||
case A_CycleWeaponLeft:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||
MWBase::Environment::get().getWindowManager()->cycleWeapon(false);
|
||||
break;
|
||||
case A_CycleWeaponRight:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||
MWBase::Environment::get().getWindowManager()->cycleWeapon(true);
|
||||
break;
|
||||
case A_Sneak:
|
||||
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
||||
if (isToggleSneak)
|
||||
{
|
||||
toggleSneaking();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool isLeftOrRightButton(int action, ICS::InputControlSystem* ics, int deviceId, bool joystick)
|
||||
{
|
||||
int mouseBinding = ics->getMouseButtonBinding(ics->getControl(action), ICS::Control::INCREASE);
|
||||
if (mouseBinding != ICS_MAX_DEVICE_BUTTONS)
|
||||
return true;
|
||||
int buttonBinding = ics->getJoystickButtonBinding(ics->getControl(action), deviceId, ICS::Control::INCREASE);
|
||||
if (joystick && (buttonBinding == 0 || buttonBinding == 1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ActionManager::checkAllowedToUseItems() const
|
||||
{
|
||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||
if (player.getClass().getNpcStats(player).isWerewolf())
|
||||
{
|
||||
// Cannot use items or spells while in werewolf form
|
||||
MWBase::Environment::get().getWindowManager()->messageBox("#{sWerewolfRefusal}");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void ActionManager::screenshot()
|
||||
{
|
||||
bool regularScreenshot = true;
|
||||
|
||||
std::string settingStr;
|
||||
|
||||
settingStr = Settings::Manager::getString("screenshot type","Video");
|
||||
regularScreenshot = settingStr.size() == 0 || settingStr.compare("regular") == 0;
|
||||
|
||||
if (regularScreenshot)
|
||||
{
|
||||
mScreenCaptureHandler->setFramesToCapture(1);
|
||||
mScreenCaptureHandler->captureNextFrame(*mViewer);
|
||||
}
|
||||
else
|
||||
{
|
||||
osg::ref_ptr<osg::Image> screenshot (new osg::Image);
|
||||
|
||||
if (MWBase::Environment::get().getWorld()->screenshot360(screenshot.get(),settingStr))
|
||||
{
|
||||
(*mScreenCaptureOperation) (*(screenshot.get()),0);
|
||||
// FIXME: mScreenCaptureHandler->getCaptureOperation() causes crash for some reason
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ActionManager::toggleMainMenu()
|
||||
{
|
||||
if (MyGUI::InputManager::getInstance().isModalAny())
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
||||
return;
|
||||
}
|
||||
|
||||
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode()) //No open GUIs, open up the MainMenu
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
|
||||
}
|
||||
else //Close current GUI
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode();
|
||||
}
|
||||
}
|
||||
|
||||
void ActionManager::toggleSpell()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
|
||||
// Not allowed before the magic window is accessible
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playermagic") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
return;
|
||||
|
||||
if (!checkAllowedToUseItems())
|
||||
return;
|
||||
|
||||
// Not allowed if no spell selected
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
MWWorld::InventoryStore& inventory = player.getPlayer().getClass().getInventoryStore(player.getPlayer());
|
||||
if (MWBase::Environment::get().getWindowManager()->getSelectedSpell().empty() &&
|
||||
inventory.getSelectedEnchantItem() == inventory.end())
|
||||
return;
|
||||
|
||||
if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(player.getPlayer()))
|
||||
return;
|
||||
|
||||
MWMechanics::DrawState_ state = player.getDrawState();
|
||||
if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing)
|
||||
player.setDrawState(MWMechanics::DrawState_Spell);
|
||||
else
|
||||
player.setDrawState(MWMechanics::DrawState_Nothing);
|
||||
}
|
||||
|
||||
void ActionManager::quickLoad()
|
||||
{
|
||||
if (!MyGUI::InputManager::getInstance().isModalAny())
|
||||
MWBase::Environment::get().getStateManager()->quickLoad();
|
||||
}
|
||||
|
||||
void ActionManager::quickSave()
|
||||
{
|
||||
if (!MyGUI::InputManager::getInstance().isModalAny())
|
||||
MWBase::Environment::get().getStateManager()->quickSave();
|
||||
}
|
||||
|
||||
void ActionManager::toggleWeapon()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
|
||||
// Not allowed before the inventory window is accessible
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playerfighting") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
return;
|
||||
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
// We want to interrupt animation only if attack is preparing, but still is not triggered
|
||||
// Otherwise we will get a "speedshooting" exploit, when player can skip reload animation by hitting "Toggle Weapon" key twice
|
||||
if (MWBase::Environment::get().getMechanicsManager()->isAttackPreparing(player.getPlayer()))
|
||||
player.setAttackingOrSpell(false);
|
||||
else if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(player.getPlayer()))
|
||||
return;
|
||||
|
||||
MWMechanics::DrawState_ state = player.getDrawState();
|
||||
if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing)
|
||||
player.setDrawState(MWMechanics::DrawState_Weapon);
|
||||
else
|
||||
player.setDrawState(MWMechanics::DrawState_Nothing);
|
||||
}
|
||||
|
||||
void ActionManager::rest()
|
||||
{
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
return;
|
||||
|
||||
if (!MWBase::Environment::get().getWindowManager()->getRestEnabled () || MWBase::Environment::get().getWindowManager()->isGuiMode ())
|
||||
return;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_Rest); //Open rest GUI
|
||||
}
|
||||
|
||||
void ActionManager::toggleInventory()
|
||||
{
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
return;
|
||||
|
||||
if (MyGUI::InputManager::getInstance().isModalAny())
|
||||
return;
|
||||
|
||||
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
||||
return;
|
||||
|
||||
// Toggle between game mode and inventory mode
|
||||
if(!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Inventory);
|
||||
else
|
||||
{
|
||||
MWGui::GuiMode mode = MWBase::Environment::get().getWindowManager()->getMode();
|
||||
if(mode == MWGui::GM_Inventory || mode == MWGui::GM_Container)
|
||||
MWBase::Environment::get().getWindowManager()->popGuiMode();
|
||||
}
|
||||
|
||||
// .. but don't touch any other mode, except container.
|
||||
}
|
||||
|
||||
void ActionManager::toggleConsole()
|
||||
{
|
||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||
return;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
||||
}
|
||||
|
||||
void ActionManager::toggleJournal()
|
||||
{
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
return;
|
||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||
return;
|
||||
|
||||
if(MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Journal
|
||||
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_MainMenu
|
||||
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Settings
|
||||
&& MWBase::Environment::get().getWindowManager ()->getJournalAllowed())
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Journal);
|
||||
}
|
||||
else if(MWBase::Environment::get().getWindowManager()->containsMode(MWGui::GM_Journal))
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Journal);
|
||||
}
|
||||
}
|
||||
|
||||
void ActionManager::quickKey (int index)
|
||||
{
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playerfighting") || !MWBase::Environment::get().getInputManager()->getControlSwitch("playermagic"))
|
||||
return;
|
||||
if (!checkAllowedToUseItems())
|
||||
return;
|
||||
|
||||
if (MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")!=-1)
|
||||
return;
|
||||
|
||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWindowManager()->activateQuickKey (index);
|
||||
}
|
||||
|
||||
void ActionManager::showQuickKeysMenu()
|
||||
{
|
||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode ()
|
||||
&& MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")==-1)
|
||||
{
|
||||
if (!checkAllowedToUseItems())
|
||||
return;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_QuickKeysMenu);
|
||||
}
|
||||
else if (MWBase::Environment::get().getWindowManager()->getMode () == MWGui::GM_QuickKeysMenu)
|
||||
{
|
||||
while(MyGUI::InputManager::getInstance().isModalAny())
|
||||
{ //Handle any open Modal windows
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
||||
}
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode(); //And handle the actual main window
|
||||
}
|
||||
}
|
||||
|
||||
void ActionManager::activate()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
{
|
||||
bool joystickUsed = MWBase::Environment::get().getInputManager()->joystickLastUsed();
|
||||
if (!SDL_IsTextInputActive() && !isLeftOrRightButton(A_Activate, mInputBinder, fakeDeviceID, joystickUsed))
|
||||
MWBase::Environment::get().getWindowManager()->injectKeyPress(MyGUI::KeyCode::Return, 0, false);
|
||||
}
|
||||
else if (MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
{
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
player.activate();
|
||||
}
|
||||
}
|
||||
|
||||
void ActionManager::toggleAutoMove()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
|
||||
if (MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols"))
|
||||
{
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
player.setAutoMove (!player.getAutoMove());
|
||||
}
|
||||
}
|
||||
|
||||
void ActionManager::toggleWalking()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode() || SDL_IsTextInputActive()) return;
|
||||
mAlwaysRunActive = !mAlwaysRunActive;
|
||||
|
||||
Settings::Manager::setBool("always run", "Input", mAlwaysRunActive);
|
||||
}
|
||||
|
||||
void ActionManager::toggleSneaking()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
if (!MWBase::Environment::get().getInputManager()->getControlSwitch("playercontrols")) return;
|
||||
mSneaking = !mSneaking;
|
||||
MWWorld::Player& player = MWBase::Environment::get().getWorld()->getPlayer();
|
||||
player.setSneak(mSneaking);
|
||||
}
|
||||
|
||||
void ActionManager::clear()
|
||||
{
|
||||
}
|
||||
|
||||
void ActionManager::handleGuiArrowKey(int action)
|
||||
{
|
||||
bool joystickUsed = MWBase::Environment::get().getInputManager()->joystickLastUsed();
|
||||
// This is currently keyboard-specific code
|
||||
// TODO: see if GUI controls can be refactored into a single function
|
||||
if (joystickUsed)
|
||||
return;
|
||||
|
||||
if (SDL_IsTextInputActive())
|
||||
return;
|
||||
|
||||
if (isLeftOrRightButton(action, mInputBinder, fakeDeviceID, joystickUsed))
|
||||
return;
|
||||
|
||||
MyGUI::KeyCode key;
|
||||
switch (action)
|
||||
{
|
||||
case A_MoveLeft:
|
||||
key = MyGUI::KeyCode::ArrowLeft;
|
||||
break;
|
||||
case A_MoveRight:
|
||||
key = MyGUI::KeyCode::ArrowRight;
|
||||
break;
|
||||
case A_MoveForward:
|
||||
key = MyGUI::KeyCode::ArrowUp;
|
||||
break;
|
||||
case A_MoveBackward:
|
||||
default:
|
||||
key = MyGUI::KeyCode::ArrowDown;
|
||||
break;
|
||||
}
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->injectKeyPress(key, 0, false);
|
||||
}
|
||||
}
|
68
apps/openmw/mwinput/actionmanager.hpp
Normal file
68
apps/openmw/mwinput/actionmanager.hpp
Normal file
|
@ -0,0 +1,68 @@
|
|||
#ifndef MWINPUT_ACTIONMANAGER_H
|
||||
#define MWINPUT_ACTIONMANAGER_H
|
||||
|
||||
#include <osg/ref_ptr>
|
||||
#include <osgViewer/ViewerEventHandlers>
|
||||
|
||||
namespace ICS
|
||||
{
|
||||
class InputControlSystem;
|
||||
}
|
||||
|
||||
namespace osgViewer
|
||||
{
|
||||
class Viewer;
|
||||
class ScreenCaptureHandler;
|
||||
}
|
||||
|
||||
namespace MWInput
|
||||
{
|
||||
class ActionManager
|
||||
{
|
||||
public:
|
||||
|
||||
ActionManager(ICS::InputControlSystem* inputBinder,
|
||||
osgViewer::ScreenCaptureHandler::CaptureOperation* screenCaptureOperation,
|
||||
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler);
|
||||
|
||||
void clear();
|
||||
|
||||
void executeAction(int action);
|
||||
|
||||
bool checkAllowedToUseItems() const;
|
||||
|
||||
void toggleMainMenu();
|
||||
void toggleSpell();
|
||||
void toggleWeapon();
|
||||
void toggleInventory();
|
||||
void toggleConsole();
|
||||
void screenshot();
|
||||
void toggleJournal();
|
||||
void activate();
|
||||
void toggleWalking();
|
||||
void toggleSneaking();
|
||||
void toggleAutoMove();
|
||||
void rest();
|
||||
void quickLoad();
|
||||
void quickSave();
|
||||
|
||||
void quickKey (int index);
|
||||
void showQuickKeysMenu();
|
||||
|
||||
bool isAlwaysRunActive() const { return mAlwaysRunActive; };
|
||||
bool isSneaking() const { return mSneaking; };
|
||||
|
||||
private:
|
||||
void handleGuiArrowKey(int action);
|
||||
|
||||
ICS::InputControlSystem* mInputBinder;
|
||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
||||
osgViewer::ScreenCaptureHandler::CaptureOperation* mScreenCaptureOperation;
|
||||
|
||||
bool mAlwaysRunActive;
|
||||
bool mSneaking;
|
||||
};
|
||||
}
|
||||
#endif
|
|
@ -30,6 +30,7 @@
|
|||
#include "../mwmechanics/npcstats.hpp"
|
||||
#include "../mwmechanics/actorutil.hpp"
|
||||
|
||||
#include "actionmanager.hpp"
|
||||
#include "mousemanager.hpp"
|
||||
#include "sdlmappings.hpp"
|
||||
#include "sensormanager.hpp"
|
||||
|
@ -41,14 +42,10 @@ namespace MWInput
|
|||
osg::ref_ptr<osgViewer::Viewer> viewer,
|
||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> screenCaptureHandler,
|
||||
osgViewer::ScreenCaptureHandler::CaptureOperation *screenCaptureOperation,
|
||||
const std::string& userFile, bool userFileExists,
|
||||
const std::string& userControllerBindingsFile,
|
||||
const std::string& userFile, bool userFileExists, const std::string& userControllerBindingsFile,
|
||||
const std::string& controllerBindingsFile, bool grab)
|
||||
: mWindow(window)
|
||||
, mWindowVisible(true)
|
||||
, mViewer(viewer)
|
||||
, mScreenCaptureHandler(screenCaptureHandler)
|
||||
, mScreenCaptureOperation(screenCaptureOperation)
|
||||
, mJoystickLastUsed(false)
|
||||
, mPlayer(nullptr)
|
||||
, mInputManager(nullptr)
|
||||
|
@ -56,8 +53,6 @@ namespace MWInput
|
|||
, mUserFile(userFile)
|
||||
, mDragDrop(false)
|
||||
, mGrabCursor (Settings::Manager::getBool("grab cursor", "Input"))
|
||||
, mInvertX (Settings::Manager::getBool("invert x axis", "Input"))
|
||||
, mInvertY (Settings::Manager::getBool("invert y axis", "Input"))
|
||||
, mControlsDisabled(false)
|
||||
, mJoystickEnabled (Settings::Manager::getBool("enable controller", "Input"))
|
||||
, mPreviewPOVDelay(0.f)
|
||||
|
@ -67,12 +62,8 @@ namespace MWInput
|
|||
, mDetectingKeyboard(false)
|
||||
, mOverencumberedMessageDelay(0.f)
|
||||
, mGamepadZoom(0)
|
||||
, mUserFileExists(userFileExists)
|
||||
, mAlwaysRunActive(Settings::Manager::getBool("always run", "Input"))
|
||||
, mSneakToggles(Settings::Manager::getBool("toggle sneak", "Input"))
|
||||
, mSneakToggleShortcutTimer(0.f)
|
||||
, mSneakGamepadShortcut(false)
|
||||
, mSneaking(false)
|
||||
, mAttemptJump(false)
|
||||
, mGamepadCursorSpeed(Settings::Manager::getFloat("gamepad cursor speed", "Input"))
|
||||
, mFakeDeviceID(1)
|
||||
|
@ -139,6 +130,8 @@ namespace MWInput
|
|||
|
||||
mMouseManager = new MouseManager(mInputBinder, mInputManager, window);
|
||||
mInputManager->setMouseEventCallback (mMouseManager);
|
||||
|
||||
mActionManager = new ActionManager(mInputBinder, screenCaptureOperation, viewer, screenCaptureHandler);
|
||||
}
|
||||
|
||||
void InputManager::clear()
|
||||
|
@ -147,6 +140,7 @@ namespace MWInput
|
|||
for (std::map<std::string, bool>::iterator it = mControlSwitch.begin(); it != mControlSwitch.end(); ++it)
|
||||
it->second = true;
|
||||
|
||||
mActionManager->clear();
|
||||
mSensorManager->clear();
|
||||
mMouseManager->clear();
|
||||
}
|
||||
|
@ -155,6 +149,8 @@ namespace MWInput
|
|||
{
|
||||
mInputBinder->save (mUserFile);
|
||||
|
||||
delete mActionManager;
|
||||
delete mMouseManager;
|
||||
delete mSensorManager;
|
||||
|
||||
delete mInputBinder;
|
||||
|
@ -183,51 +179,6 @@ namespace MWInput
|
|||
}
|
||||
}
|
||||
|
||||
bool isLeftOrRightButton(int action, ICS::InputControlSystem* ics, int deviceId, bool joystick)
|
||||
{
|
||||
int mouseBinding = ics->getMouseButtonBinding(ics->getControl(action), ICS::Control::INCREASE);
|
||||
if (mouseBinding != ICS_MAX_DEVICE_BUTTONS)
|
||||
return true;
|
||||
int buttonBinding = ics->getJoystickButtonBinding(ics->getControl(action), deviceId, ICS::Control::INCREASE);
|
||||
if (joystick && (buttonBinding == 0 || buttonBinding == 1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void InputManager::handleGuiArrowKey(int action)
|
||||
{
|
||||
// This is currently keyboard-specific code
|
||||
// TODO: see if GUI controls can be refactored into a single function
|
||||
if (mJoystickLastUsed)
|
||||
return;
|
||||
|
||||
if (SDL_IsTextInputActive())
|
||||
return;
|
||||
|
||||
if (isLeftOrRightButton(action, mInputBinder, mFakeDeviceID, mJoystickLastUsed))
|
||||
return;
|
||||
|
||||
MyGUI::KeyCode key;
|
||||
switch (action)
|
||||
{
|
||||
case A_MoveLeft:
|
||||
key = MyGUI::KeyCode::ArrowLeft;
|
||||
break;
|
||||
case A_MoveRight:
|
||||
key = MyGUI::KeyCode::ArrowRight;
|
||||
break;
|
||||
case A_MoveForward:
|
||||
key = MyGUI::KeyCode::ArrowUp;
|
||||
break;
|
||||
case A_MoveBackward:
|
||||
default:
|
||||
key = MyGUI::KeyCode::ArrowDown;
|
||||
break;
|
||||
}
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->injectKeyPress(key, 0, false);
|
||||
}
|
||||
|
||||
bool InputManager::gamepadToGuiControl(const SDL_ControllerButtonEvent &arg)
|
||||
{
|
||||
// Presumption of GUI mode will be removed in the future.
|
||||
|
@ -375,127 +326,7 @@ namespace MWInput
|
|||
}
|
||||
|
||||
if (currentValue == 1)
|
||||
{
|
||||
// trigger action activated
|
||||
switch (action)
|
||||
{
|
||||
case A_GameMenu:
|
||||
toggleMainMenu ();
|
||||
break;
|
||||
case A_Screenshot:
|
||||
screenshot();
|
||||
break;
|
||||
case A_Inventory:
|
||||
toggleInventory ();
|
||||
break;
|
||||
case A_Console:
|
||||
toggleConsole ();
|
||||
break;
|
||||
case A_Activate:
|
||||
resetIdleTime();
|
||||
activate();
|
||||
break;
|
||||
case A_MoveLeft:
|
||||
case A_MoveRight:
|
||||
case A_MoveForward:
|
||||
case A_MoveBackward:
|
||||
handleGuiArrowKey(action);
|
||||
break;
|
||||
case A_Journal:
|
||||
toggleJournal ();
|
||||
break;
|
||||
case A_AutoMove:
|
||||
toggleAutoMove ();
|
||||
break;
|
||||
case A_AlwaysRun:
|
||||
toggleWalking ();
|
||||
break;
|
||||
case A_ToggleWeapon:
|
||||
toggleWeapon ();
|
||||
break;
|
||||
case A_Rest:
|
||||
rest();
|
||||
break;
|
||||
case A_ToggleSpell:
|
||||
toggleSpell ();
|
||||
break;
|
||||
case A_QuickKey1:
|
||||
quickKey(1);
|
||||
break;
|
||||
case A_QuickKey2:
|
||||
quickKey(2);
|
||||
break;
|
||||
case A_QuickKey3:
|
||||
quickKey(3);
|
||||
break;
|
||||
case A_QuickKey4:
|
||||
quickKey(4);
|
||||
break;
|
||||
case A_QuickKey5:
|
||||
quickKey(5);
|
||||
break;
|
||||
case A_QuickKey6:
|
||||
quickKey(6);
|
||||
break;
|
||||
case A_QuickKey7:
|
||||
quickKey(7);
|
||||
break;
|
||||
case A_QuickKey8:
|
||||
quickKey(8);
|
||||
break;
|
||||
case A_QuickKey9:
|
||||
quickKey(9);
|
||||
break;
|
||||
case A_QuickKey10:
|
||||
quickKey(10);
|
||||
break;
|
||||
case A_QuickKeysMenu:
|
||||
showQuickKeysMenu();
|
||||
break;
|
||||
case A_ToggleHUD:
|
||||
MWBase::Environment::get().getWindowManager()->toggleHud();
|
||||
break;
|
||||
case A_ToggleDebug:
|
||||
MWBase::Environment::get().getWindowManager()->toggleDebugWindow();
|
||||
break;
|
||||
case A_ZoomIn:
|
||||
if (mControlSwitch["playerviewswitch"] && mControlSwitch["playercontrols"] && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWorld()->setCameraDistance(ZOOM_SCALE, true, true);
|
||||
break;
|
||||
case A_ZoomOut:
|
||||
if (mControlSwitch["playerviewswitch"] && mControlSwitch["playercontrols"] && !MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWorld()->setCameraDistance(-ZOOM_SCALE, true, true);
|
||||
break;
|
||||
case A_QuickSave:
|
||||
quickSave();
|
||||
break;
|
||||
case A_QuickLoad:
|
||||
quickLoad();
|
||||
break;
|
||||
case A_CycleSpellLeft:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
||||
MWBase::Environment::get().getWindowManager()->cycleSpell(false);
|
||||
break;
|
||||
case A_CycleSpellRight:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Magic))
|
||||
MWBase::Environment::get().getWindowManager()->cycleSpell(true);
|
||||
break;
|
||||
case A_CycleWeaponLeft:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||
MWBase::Environment::get().getWindowManager()->cycleWeapon(false);
|
||||
break;
|
||||
case A_CycleWeaponRight:
|
||||
if (checkAllowedToUseItems() && MWBase::Environment::get().getWindowManager()->isAllowed(MWGui::GW_Inventory))
|
||||
MWBase::Environment::get().getWindowManager()->cycleWeapon(true);
|
||||
break;
|
||||
case A_Sneak:
|
||||
if (mSneakToggles)
|
||||
{
|
||||
toggleSneaking();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
mActionManager->executeAction(action);
|
||||
}
|
||||
|
||||
void InputManager::updateCursorMode()
|
||||
|
@ -521,18 +352,6 @@ namespace MWInput
|
|||
}
|
||||
}
|
||||
|
||||
bool InputManager::checkAllowedToUseItems() const
|
||||
{
|
||||
MWWorld::Ptr player = MWMechanics::getPlayer();
|
||||
if (player.getClass().getNpcStats(player).isWerewolf())
|
||||
{
|
||||
// Cannot use items or spells while in werewolf form
|
||||
MWBase::Environment::get().getWindowManager()->messageBox("#{sWerewolfRefusal}");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void InputManager::update(float dt, bool disableControls, bool disableEvents)
|
||||
{
|
||||
mControlsDisabled = disableControls;
|
||||
|
@ -638,7 +457,8 @@ namespace MWInput
|
|||
mPlayer->setForwardBackward (1);
|
||||
}
|
||||
|
||||
if (!mSneakToggles)
|
||||
static const bool isToggleSneak = Settings::Manager::getBool("toggle sneak", "Input");
|
||||
if (!isToggleSneak)
|
||||
{
|
||||
if(mJoystickLastUsed)
|
||||
{
|
||||
|
@ -649,20 +469,20 @@ namespace MWInput
|
|||
if(mSneakToggleShortcutTimer <= 0.3f)
|
||||
{
|
||||
mSneakGamepadShortcut = true;
|
||||
toggleSneaking();
|
||||
mActionManager->toggleSneaking();
|
||||
}
|
||||
else
|
||||
mSneakGamepadShortcut = false;
|
||||
}
|
||||
|
||||
if(!mSneaking)
|
||||
toggleSneaking();
|
||||
if(!mActionManager->isSneaking())
|
||||
mActionManager->toggleSneaking();
|
||||
mSneakToggleShortcutTimer = 0.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!mSneakGamepadShortcut && mSneaking)
|
||||
toggleSneaking();
|
||||
if(!mSneakGamepadShortcut && mActionManager->isSneaking())
|
||||
mActionManager->toggleSneaking();
|
||||
if(mSneakToggleShortcutTimer <= 0.3f)
|
||||
mSneakToggleShortcutTimer += dt;
|
||||
}
|
||||
|
@ -678,7 +498,7 @@ namespace MWInput
|
|||
mOverencumberedMessageDelay = 0.f;
|
||||
}
|
||||
|
||||
if ((mAlwaysRunActive && alwaysRunAllowed) || isRunning)
|
||||
if ((mActionManager->isAlwaysRunActive() && alwaysRunAllowed) || isRunning)
|
||||
mPlayer->setRunState(!actionIsActive(A_Run));
|
||||
else
|
||||
mPlayer->setRunState(actionIsActive(A_Run));
|
||||
|
@ -773,12 +593,6 @@ namespace MWInput
|
|||
for (Settings::CategorySettingVector::const_iterator it = changed.begin();
|
||||
it != changed.end(); ++it)
|
||||
{
|
||||
if (it->first == "Input" && it->second == "invert x axis")
|
||||
mInvertX = Settings::Manager::getBool("invert x axis", "Input");
|
||||
|
||||
if (it->first == "Input" && it->second == "invert y axis")
|
||||
mInvertY = Settings::Manager::getBool("invert y axis", "Input");
|
||||
|
||||
if (it->first == "Input" && it->second == "grab cursor")
|
||||
mGrabCursor = Settings::Manager::getBool("grab cursor", "Input");
|
||||
|
||||
|
@ -808,6 +622,7 @@ namespace MWInput
|
|||
Settings::Manager::getBool("window border", "Video"));
|
||||
}
|
||||
|
||||
mMouseManager->processChangedSettings(changed);
|
||||
mSensorManager->processChangedSettings(changed);
|
||||
}
|
||||
|
||||
|
@ -1022,246 +837,6 @@ namespace MWInput
|
|||
MWBase::Environment::get().getStateManager()->requestQuit();
|
||||
}
|
||||
|
||||
void InputManager::toggleMainMenu()
|
||||
{
|
||||
if (MyGUI::InputManager::getInstance().isModalAny())
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
||||
return;
|
||||
}
|
||||
|
||||
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode()) //No open GUIs, open up the MainMenu
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_MainMenu);
|
||||
}
|
||||
else //Close current GUI
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode();
|
||||
}
|
||||
}
|
||||
|
||||
void InputManager::quickLoad() {
|
||||
if (!MyGUI::InputManager::getInstance().isModalAny())
|
||||
MWBase::Environment::get().getStateManager()->quickLoad();
|
||||
}
|
||||
|
||||
void InputManager::quickSave() {
|
||||
if (!MyGUI::InputManager::getInstance().isModalAny())
|
||||
MWBase::Environment::get().getStateManager()->quickSave();
|
||||
}
|
||||
void InputManager::toggleSpell()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
|
||||
// Not allowed before the magic window is accessible
|
||||
if (!mControlSwitch["playermagic"] || !mControlSwitch["playercontrols"])
|
||||
return;
|
||||
|
||||
if (!checkAllowedToUseItems())
|
||||
return;
|
||||
|
||||
// Not allowed if no spell selected
|
||||
MWWorld::InventoryStore& inventory = mPlayer->getPlayer().getClass().getInventoryStore(mPlayer->getPlayer());
|
||||
if (MWBase::Environment::get().getWindowManager()->getSelectedSpell().empty() &&
|
||||
inventory.getSelectedEnchantItem() == inventory.end())
|
||||
return;
|
||||
|
||||
if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(mPlayer->getPlayer()))
|
||||
return;
|
||||
|
||||
MWMechanics::DrawState_ state = mPlayer->getDrawState();
|
||||
if (state == MWMechanics::DrawState_Weapon || state == MWMechanics::DrawState_Nothing)
|
||||
mPlayer->setDrawState(MWMechanics::DrawState_Spell);
|
||||
else
|
||||
mPlayer->setDrawState(MWMechanics::DrawState_Nothing);
|
||||
}
|
||||
|
||||
void InputManager::toggleWeapon()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
|
||||
// Not allowed before the inventory window is accessible
|
||||
if (!mControlSwitch["playerfighting"] || !mControlSwitch["playercontrols"])
|
||||
return;
|
||||
|
||||
// We want to interrupt animation only if attack is preparing, but still is not triggered
|
||||
// Otherwise we will get a "speedshooting" exploit, when player can skip reload animation by hitting "Toggle Weapon" key twice
|
||||
if (MWBase::Environment::get().getMechanicsManager()->isAttackPreparing(mPlayer->getPlayer()))
|
||||
mPlayer->setAttackingOrSpell(false);
|
||||
else if (MWBase::Environment::get().getMechanicsManager()->isAttackingOrSpell(mPlayer->getPlayer()))
|
||||
return;
|
||||
|
||||
MWMechanics::DrawState_ state = mPlayer->getDrawState();
|
||||
if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing)
|
||||
mPlayer->setDrawState(MWMechanics::DrawState_Weapon);
|
||||
else
|
||||
mPlayer->setDrawState(MWMechanics::DrawState_Nothing);
|
||||
}
|
||||
|
||||
void InputManager::rest()
|
||||
{
|
||||
if (!mControlSwitch["playercontrols"])
|
||||
return;
|
||||
|
||||
if (!MWBase::Environment::get().getWindowManager()->getRestEnabled () || MWBase::Environment::get().getWindowManager()->isGuiMode ())
|
||||
return;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_Rest); //Open rest GUI
|
||||
|
||||
}
|
||||
|
||||
void InputManager::screenshot()
|
||||
{
|
||||
bool regularScreenshot = true;
|
||||
|
||||
std::string settingStr;
|
||||
|
||||
settingStr = Settings::Manager::getString("screenshot type","Video");
|
||||
regularScreenshot = settingStr.size() == 0 || settingStr.compare("regular") == 0;
|
||||
|
||||
if (regularScreenshot)
|
||||
{
|
||||
mScreenCaptureHandler->setFramesToCapture(1);
|
||||
mScreenCaptureHandler->captureNextFrame(*mViewer);
|
||||
}
|
||||
else
|
||||
{
|
||||
osg::ref_ptr<osg::Image> screenshot (new osg::Image);
|
||||
|
||||
if (MWBase::Environment::get().getWorld()->screenshot360(screenshot.get(),settingStr))
|
||||
{
|
||||
(*mScreenCaptureOperation) (*(screenshot.get()),0);
|
||||
// FIXME: mScreenCaptureHandler->getCaptureOperation() causes crash for some reason
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InputManager::toggleInventory()
|
||||
{
|
||||
if (!mControlSwitch["playercontrols"])
|
||||
return;
|
||||
|
||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||
return;
|
||||
|
||||
if (MWBase::Environment::get().getWindowManager()->isConsoleMode())
|
||||
return;
|
||||
|
||||
// Toggle between game mode and inventory mode
|
||||
if(!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Inventory);
|
||||
else
|
||||
{
|
||||
MWGui::GuiMode mode = MWBase::Environment::get().getWindowManager()->getMode();
|
||||
if(mode == MWGui::GM_Inventory || mode == MWGui::GM_Container)
|
||||
MWBase::Environment::get().getWindowManager()->popGuiMode();
|
||||
}
|
||||
|
||||
// .. but don't touch any other mode, except container.
|
||||
}
|
||||
|
||||
void InputManager::toggleConsole()
|
||||
{
|
||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||
return;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->toggleConsole();
|
||||
}
|
||||
|
||||
void InputManager::toggleJournal()
|
||||
{
|
||||
if (!mControlSwitch["playercontrols"])
|
||||
return;
|
||||
if (MyGUI::InputManager::getInstance ().isModalAny())
|
||||
return;
|
||||
|
||||
if(MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Journal
|
||||
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_MainMenu
|
||||
&& MWBase::Environment::get().getWindowManager()->getMode() != MWGui::GM_Settings
|
||||
&& MWBase::Environment::get().getWindowManager ()->getJournalAllowed())
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Journal);
|
||||
}
|
||||
else if(MWBase::Environment::get().getWindowManager()->containsMode(MWGui::GM_Journal))
|
||||
{
|
||||
MWBase::Environment::get().getWindowManager()->removeGuiMode(MWGui::GM_Journal);
|
||||
}
|
||||
}
|
||||
|
||||
void InputManager::quickKey (int index)
|
||||
{
|
||||
if (!mControlSwitch["playercontrols"] || !mControlSwitch["playerfighting"] || !mControlSwitch["playermagic"])
|
||||
return;
|
||||
if (!checkAllowedToUseItems())
|
||||
return;
|
||||
|
||||
if (MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")!=-1)
|
||||
return;
|
||||
|
||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
MWBase::Environment::get().getWindowManager()->activateQuickKey (index);
|
||||
}
|
||||
|
||||
void InputManager::showQuickKeysMenu()
|
||||
{
|
||||
if (!MWBase::Environment::get().getWindowManager()->isGuiMode ()
|
||||
&& MWBase::Environment::get().getWorld()->getGlobalFloat ("chargenstate")==-1)
|
||||
{
|
||||
if (!checkAllowedToUseItems())
|
||||
return;
|
||||
|
||||
MWBase::Environment::get().getWindowManager()->pushGuiMode (MWGui::GM_QuickKeysMenu);
|
||||
|
||||
}
|
||||
else if (MWBase::Environment::get().getWindowManager()->getMode () == MWGui::GM_QuickKeysMenu) {
|
||||
while(MyGUI::InputManager::getInstance().isModalAny()) { //Handle any open Modal windows
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentModal();
|
||||
}
|
||||
MWBase::Environment::get().getWindowManager()->exitCurrentGuiMode(); //And handle the actual main window
|
||||
}
|
||||
}
|
||||
|
||||
void InputManager::activate()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode())
|
||||
{
|
||||
if (!SDL_IsTextInputActive() && !isLeftOrRightButton(A_Activate, mInputBinder, mFakeDeviceID, mJoystickLastUsed))
|
||||
MWBase::Environment::get().getWindowManager()->injectKeyPress(MyGUI::KeyCode::Return, 0, false);
|
||||
}
|
||||
else if (mControlSwitch["playercontrols"])
|
||||
mPlayer->activate();
|
||||
}
|
||||
|
||||
void InputManager::toggleAutoMove()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
|
||||
if (mControlSwitch["playercontrols"])
|
||||
mPlayer->setAutoMove (!mPlayer->getAutoMove());
|
||||
}
|
||||
|
||||
void InputManager::toggleWalking()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode() || SDL_IsTextInputActive()) return;
|
||||
mAlwaysRunActive = !mAlwaysRunActive;
|
||||
|
||||
Settings::Manager::setBool("always run", "Input", mAlwaysRunActive);
|
||||
}
|
||||
|
||||
void InputManager::toggleSneaking()
|
||||
{
|
||||
if (MWBase::Environment::get().getWindowManager()->isGuiMode()) return;
|
||||
if (!mControlSwitch["playercontrols"]) return;
|
||||
mSneaking = !mSneaking;
|
||||
mPlayer->setSneak(mSneaking);
|
||||
}
|
||||
|
||||
void InputManager::resetIdleTime()
|
||||
{
|
||||
if (mTimeIdle < 0)
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
namespace MWInput
|
||||
{
|
||||
class ActionManager;
|
||||
class MouseManager;
|
||||
class SensorManager;
|
||||
}
|
||||
|
@ -51,18 +52,10 @@ namespace SDLUtil
|
|||
class VideoWrapper;
|
||||
}
|
||||
|
||||
namespace osgViewer
|
||||
{
|
||||
class Viewer;
|
||||
class ScreenCaptureHandler;
|
||||
}
|
||||
|
||||
struct SDL_Window;
|
||||
|
||||
namespace MWInput
|
||||
{
|
||||
const float ZOOM_SCALE = 120.f; /// Used for scrolling camera in and out
|
||||
|
||||
/**
|
||||
* @brief Class that handles all input and key bindings for OpenMW.
|
||||
*/
|
||||
|
@ -167,9 +160,6 @@ namespace MWInput
|
|||
private:
|
||||
SDL_Window* mWindow;
|
||||
bool mWindowVisible;
|
||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||
osg::ref_ptr<osgViewer::ScreenCaptureHandler> mScreenCaptureHandler;
|
||||
osgViewer::ScreenCaptureHandler::CaptureOperation *mScreenCaptureOperation;
|
||||
|
||||
bool mJoystickLastUsed;
|
||||
MWWorld::Player* mPlayer;
|
||||
|
@ -185,9 +175,6 @@ namespace MWInput
|
|||
|
||||
bool mGrabCursor;
|
||||
|
||||
bool mInvertX;
|
||||
bool mInvertY;
|
||||
|
||||
bool mControlsDisabled;
|
||||
bool mJoystickEnabled;
|
||||
|
||||
|
@ -202,12 +189,9 @@ namespace MWInput
|
|||
float mOverencumberedMessageDelay;
|
||||
|
||||
float mGamepadZoom;
|
||||
bool mUserFileExists;
|
||||
bool mAlwaysRunActive;
|
||||
bool mSneakToggles;
|
||||
float mSneakToggleShortcutTimer;
|
||||
bool mSneakGamepadShortcut;
|
||||
bool mSneaking;
|
||||
bool mAttemptJump;
|
||||
|
||||
std::map<std::string, bool> mControlSwitch;
|
||||
|
@ -215,6 +199,7 @@ namespace MWInput
|
|||
float mInvUiScalingFactor;
|
||||
float mGamepadCursorSpeed;
|
||||
|
||||
ActionManager* mActionManager;
|
||||
MouseManager* mMouseManager;
|
||||
SensorManager* mSensorManager;
|
||||
|
||||
|
@ -229,23 +214,6 @@ namespace MWInput
|
|||
|
||||
void updateCursorMode();
|
||||
|
||||
bool checkAllowedToUseItems() const;
|
||||
|
||||
void toggleMainMenu();
|
||||
void toggleSpell();
|
||||
void toggleWeapon();
|
||||
void toggleInventory();
|
||||
void toggleConsole();
|
||||
void screenshot();
|
||||
void toggleJournal();
|
||||
void activate();
|
||||
void toggleWalking();
|
||||
void toggleSneaking();
|
||||
void toggleAutoMove();
|
||||
void rest();
|
||||
void quickLoad();
|
||||
void quickSave();
|
||||
|
||||
void quickKey (int index);
|
||||
void showQuickKeysMenu();
|
||||
|
||||
|
|
Loading…
Reference in a new issue