Skip to content

Commit

Permalink
[KeyboardHandler] Added. Keys are now saved to config/keys.lua on cli…
Browse files Browse the repository at this point in the history
…ent exit.
  • Loading branch information
Unarelith committed May 14, 2020
1 parent db78953 commit 147394e
Show file tree
Hide file tree
Showing 9 changed files with 189 additions and 40 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ openminer_server
*.dat
*.zip
test_atlas.png
client.lua
server.lua
config/client.lua
config/keys.lua
config/server.lua
TODO

23 changes: 0 additions & 23 deletions resources/config/keys.xml

This file was deleted.

4 changes: 3 additions & 1 deletion source/client/core/ClientApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ void ClientApplication::init() {

Config::loadConfigFromFile("config/client.lua");

m_keyboardHandler.loadKeysFromFile("resources/config/keys.xml");
m_keyboardHandler.loadKeysFromFile("config/keys.lua");
gk::GamePad::init(m_keyboardHandler);

sf::ContextSettings settings;
Expand Down Expand Up @@ -132,6 +132,8 @@ void ClientApplication::onEvent(const sf::Event &event) {

void ClientApplication::onExit() {
Config::saveConfigToFile("config/client.lua");

m_keyboardHandler.saveKeysToFile("config/keys.lua");
}

void ClientApplication::initOpenGL() {
Expand Down
4 changes: 2 additions & 2 deletions source/client/core/ClientApplication.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
#define CLIENTAPPLICATION_HPP_

#include <gk/core/CoreApplication.hpp>
#include <gk/core/input/KeyboardHandler.hpp>

#include "KeyboardHandler.hpp"
#include "Registry.hpp"

class ClientApplication : public gk::CoreApplication {
Expand All @@ -46,7 +46,7 @@ class ClientApplication : public gk::CoreApplication {

static void initOpenGL();

gk::KeyboardHandler m_keyboardHandler;
KeyboardHandler m_keyboardHandler;

Registry m_registry;

Expand Down
14 changes: 7 additions & 7 deletions source/client/core/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
*
* =====================================================================================
*/
#include <fstream>

#include <gk/core/Debug.hpp>
#include <gk/core/Filesystem.hpp>

#include <sol.hpp>

#include "Config.hpp"

// Gameplay
Expand Down Expand Up @@ -54,11 +61,6 @@ float Config::aoStrength = 1.0f;
// Input
u8 Config::mouseSensitivity = 8;

#include <gk/core/Debug.hpp>
#include <gk/core/Filesystem.hpp>

#include <sol.hpp>

void Config::loadConfigFromFile(const char *filename) {
if (gk::Filesystem::fileExists(filename)) {
sol::state lua;
Expand Down Expand Up @@ -98,8 +100,6 @@ void Config::loadConfigFromFile(const char *filename) {
}
}

#include <fstream>

void Config::saveConfigToFile(const char *filename) {
std::ofstream file{filename, std::ofstream::out | std::ofstream::trunc};
file << "isFlyModeEnabled = " << (isFlyModeEnabled ? "true" : "false") << std::endl;
Expand Down
113 changes: 113 additions & 0 deletions source/client/core/KeyboardHandler.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
* =====================================================================================
*
* OpenMiner
*
* Copyright (C) 2018-2020 Unarelith, Quentin Bazin <[email protected]>
* Copyright (C) 2019-2020 the OpenMiner contributors (see CONTRIBUTORS.md)
*
* This file is part of OpenMiner.
*
* OpenMiner is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* OpenMiner is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with OpenMiner; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* =====================================================================================
*/
#include <fstream>

#include <gk/core/Debug.hpp>
#include <gk/core/Filesystem.hpp>

#include <sol.hpp>

#include "GameKey.hpp"
#include "KeyboardHandler.hpp"

KeyboardHandler::KeyboardHandler() {
addKey(GameKey::Left, "Left", sf::Keyboard::A);
addKey(GameKey::Right, "Right", sf::Keyboard::D);
addKey(GameKey::Up, "Up", sf::Keyboard::W);
addKey(GameKey::Down, "Down", sf::Keyboard::S);

addKey(GameKey::Jump, "Jump", sf::Keyboard::Space);
addKey(GameKey::Fly, "Fly", sf::Keyboard::X);
addKey(GameKey::Sneak, "Sneak", sf::Keyboard::LShift);
addKey(GameKey::Sprint, "Sprint", sf::Keyboard::LControl);

addKey(GameKey::Dig, "Dig", sf::Keyboard::L);
addKey(GameKey::Use, "Use", sf::Keyboard::M);

addKey(GameKey::Inventory, "Inventory", sf::Keyboard::E);
addKey(GameKey::CreativeWindow, "CreativeWindow", sf::Keyboard::H);

addKey(GameKey::Chat, "Chat", sf::Keyboard::T);
addKey(GameKey::Command, "Command", sf::Keyboard::Divide);

addKey(GameKey::Shift, "Shift", sf::Keyboard::LShift);
}

void KeyboardHandler::loadKeysFromFile(const std::string &filename) {
if (gk::Filesystem::fileExists(filename)) {
sol::state lua;

try {
lua.safe_script_file(filename);

sol::optional<sol::table> keys = lua["keys"];
if (keys != sol::nullopt) {
for (auto &it : keys.value()) {
const std::string &keyName = it.first.as<std::string>();
const std::string &keyValue = it.second.as<std::string>();

auto keyit = m_keyNames.find(keyName);
if (keyit != m_keyNames.end()) {
gk::GameKey key = keyit->second;
m_keys[key] = gk::KeyboardUtils::getKeyFromName(keyValue);
if (m_keys[key] == sf::Keyboard::Unknown) {
gkWarning() << "Key name '" + keyValue + "' not recognized";
}
}
else
gkWarning() << "Key '" + keyName + "' is invalid (maybe deprecated?)";
}
}

gkInfo() << "Key mapping loaded successfully";
}
catch (sol::error &e) {
gkError() << e.what();
}
}
}

void KeyboardHandler::saveKeysToFile(const std::string &filename) {
std::ofstream file{filename, std::ofstream::out | std::ofstream::trunc};
file << "keys = {" << std::endl;
for (auto &it : m_keyNames) {
file << "\t" << it.first << " = \"" << getKeyName(it.second) << "\"," << std::endl;
}
file << "}" << std::endl;
}

bool KeyboardHandler::isKeyPressed(gk::GameKey key) {
return sf::Keyboard::isKeyPressed(m_keys[key]);
}

void KeyboardHandler::addKey(gk::GameKey key, const std::string &name, sf::Keyboard::Key defaultKey) {
m_keys.emplace(key, defaultKey);
m_keyNames.emplace(name, key);

InputHandler::addKey(key);
}

56 changes: 56 additions & 0 deletions source/client/core/KeyboardHandler.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* =====================================================================================
*
* OpenMiner
*
* Copyright (C) 2018-2020 Unarelith, Quentin Bazin <[email protected]>
* Copyright (C) 2019-2020 the OpenMiner contributors (see CONTRIBUTORS.md)
*
* This file is part of OpenMiner.
*
* OpenMiner is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* OpenMiner is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with OpenMiner; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* =====================================================================================
*/
#ifndef KEYBOARDHANDLER_HPP_
#define KEYBOARDHANDLER_HPP_

#include <unordered_map>
#include <string>

#include <gk/core/input/InputHandler.hpp>
#include <gk/core/input/KeyboardUtils.hpp>

class KeyboardHandler : public gk::InputHandler {
public:
KeyboardHandler();

void loadKeysFromFile(const std::string &filename);
void saveKeysToFile(const std::string &filename);

bool isKeyPressed(gk::GameKey key) override;

sf::Keyboard::Key getKeycode(gk::GameKey key) { return m_keys[key]; }
std::string getKeyName(gk::GameKey key) { return gk::KeyboardUtils::getNameFromKey(m_keys[key]); }
void setKeycode(gk::GameKey key, sf::Keyboard::Key keycode) { m_keys[key] = keycode; }

protected:
void addKey(gk::GameKey key, const std::string &name, sf::Keyboard::Key defaultKey);

std::unordered_map<gk::GameKey, sf::Keyboard::Key> m_keys;
std::unordered_map<std::string, gk::GameKey> m_keyNames;
};

#endif // KEYBOARDHANDLER_HPP_
4 changes: 2 additions & 2 deletions source/client/states/GameState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@
#include <gk/core/GameClock.hpp>
#include <gk/core/Exception.hpp>
#include <gk/core/Mouse.hpp>
#include <gk/core/input/KeyboardHandler.hpp>
#include <gk/gl/OpenGL.hpp>
#include <gk/resource/ResourceHandler.hpp>

#include "ChatState.hpp"
#include "Events.hpp"
#include "GameKey.hpp"
#include "GameState.hpp"
#include "KeyboardHandler.hpp"
#include "LuaGUIState.hpp"
#include "PauseMenuState.hpp"
#include "Registry.hpp"
Expand Down Expand Up @@ -79,7 +79,7 @@ void GameState::onEvent(const sf::Event &event) {
}

if (!m_stateStack->empty() && &m_stateStack->top() == this) {
gk::KeyboardHandler *keyboardHandler = (gk::KeyboardHandler *)gk::GamePad::getInputHandler();
KeyboardHandler *keyboardHandler = (KeyboardHandler *)gk::GamePad::getInputHandler();

#ifdef __APPLE__
if (event.type == sf::Event::MouseMoved) {
Expand Down
6 changes: 3 additions & 3 deletions source/client/states/SettingsMenuState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
#include <algorithm>

#include <gk/core/input/GamePad.hpp>
#include <gk/core/input/KeyboardHandler.hpp>
#include <gk/core/ApplicationStateStack.hpp>
#include <gk/core/Debug.hpp>
#include <gk/core/EventHandler.hpp>
Expand All @@ -38,6 +37,7 @@

#include "Config.hpp"
#include "Events.hpp"
#include "KeyboardHandler.hpp"
#include "SettingsMenuState.hpp"
#include "World.hpp"

Expand Down Expand Up @@ -77,7 +77,7 @@ void SettingsMenuState::onEvent(const sf::Event &event) {
doneButtonAction();
}
else if (m_currentKeyButton && event.type == sf::Event::KeyPressed) {
gk::KeyboardHandler *keyboardHandler = (gk::KeyboardHandler *)gk::GamePad::getInputHandler();
KeyboardHandler *keyboardHandler = dynamic_cast<KeyboardHandler *>(gk::GamePad::getInputHandler());
keyboardHandler->setKeycode(m_currentKey, event.key.code);

m_currentKeyButton->setText(m_currentKeyButton->text() + keyboardHandler->getKeyName(m_currentKey));
Expand Down Expand Up @@ -229,7 +229,7 @@ void SettingsMenuState::addInputButtons() {

m_menuWidget.reset(2, 8);

gk::KeyboardHandler *keyboardHandler = (gk::KeyboardHandler *)gk::GamePad::getInputHandler();
KeyboardHandler *keyboardHandler = dynamic_cast<KeyboardHandler *>(gk::GamePad::getInputHandler());
for (auto &it : keys) {
m_menuWidget.addButton(it.second + ": " + keyboardHandler->getKeyName(it.first), [this, it] (TextButton &button) {
button.setText(it.second + ": ");
Expand Down

0 comments on commit 147394e

Please sign in to comment.