aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2020-07-28 13:51:32 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2020-07-28 13:51:32 +0200
commitf7a042223f9c82c7764c0df3a3531bda04e9ad64 (patch)
tree1d227816dc680ea883ba16a385c2151714e65961
parent344fddc1727f637b3c4e2a9b88844d952b91fe4f (diff)
downloaddragonfireclient-f7a042223f9c82c7764c0df3a3531bda04e9ad64.tar.xz
Added cheat Menu
-rw-r--r--builtin/client/cheats.lua30
-rw-r--r--builtin/client/init.lua1
-rw-r--r--builtin/settingtypes.txt2
-rw-r--r--src/client/client.cpp2
-rw-r--r--src/client/game.cpp37
-rw-r--r--src/client/game.h4
-rw-r--r--src/client/gameui.cpp9
-rw-r--r--src/client/gameui.h2
-rw-r--r--src/client/inputhandler.cpp6
-rw-r--r--src/client/keys.h6
-rw-r--r--src/defaultsettings.cpp7
-rw-r--r--src/gui/CMakeLists.txt2
-rw-r--r--src/gui/cheatMenu.cpp129
-rw-r--r--src/gui/cheatMenu.h71
-rw-r--r--src/gui/guiCheatMenu.cpp19
-rw-r--r--src/gui/guiCheatMenu.h34
-rw-r--r--src/gui/guiKeyChangeMenu.cpp28
-rw-r--r--src/script/cpp_api/CMakeLists.txt1
-rw-r--r--src/script/cpp_api/s_cheats.cpp121
-rw-r--r--src/script/cpp_api/s_cheats.h57
-rw-r--r--src/script/scripting_client.h4
21 files changed, 501 insertions, 71 deletions
diff --git a/builtin/client/cheats.lua b/builtin/client/cheats.lua
new file mode 100644
index 000000000..efd8c6452
--- /dev/null
+++ b/builtin/client/cheats.lua
@@ -0,0 +1,30 @@
+core.cheats = {
+ ["Combat"] = {
+ ["Killaura"] = "killaura",
+ ["AntiKnockback"] = "antiknockback",
+ ["NoFallDamage"] = "prevent_natural_damage",
+ ["AutoRespawn"] = "autorespawn",
+ },
+ ["Movement"] = {
+ ["DragonRider"] = "entity_speed",
+ ["Freecam"] = "freecam",
+ ["PrivBypass"] = "priv_bypass",
+ },
+ ["Render"] = {
+ ["Xray"] = "xray",
+ ["Fullbright"] = "fullbright",
+ ["HUDBypass"] = "hud_flags_bypass",
+ ["NoHurtCam"] = "no_hurt_cam"
+ },
+ ["World"] = {
+ ["FastDig"] = "fastdig",
+ ["AutoDig"] = "autodig",
+ ["IncreasedRange"] = "increase_tool_range",
+ ["UnlimitedRange"] = "increase_tool_range_plus",
+ },
+ ["Misc"] = {
+ ["Enderchest"] = function()
+ minetest.open_special_inventory()
+ end,
+ }
+}
diff --git a/builtin/client/init.lua b/builtin/client/init.lua
index ee344e7bc..44703a57c 100644
--- a/builtin/client/init.lua
+++ b/builtin/client/init.lua
@@ -9,4 +9,5 @@ dofile(commonpath .. "chatcommands.lua")
dofile(commonpath .. "vector.lua")
dofile(clientpath .. "util.lua")
dofile(clientpath .. "chatcommands.lua")
+dofile(clientpath .. "cheats.lua")
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index 9c4c57f56..b706294db 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -2252,5 +2252,3 @@ hud_flags_bypass (HUDBypass) bool true
antiknockback (AntiKnockback) bool false
autorespawn (AutoRespawn) bool false
-
-show_cheat_hud (CheatHUD) bool true
diff --git a/src/client/client.cpp b/src/client/client.cpp
index d2330ecae..f7fc637db 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -206,6 +206,8 @@ void Client::loadMods()
// Run a callback when mods are loaded
m_script->on_mods_loaded();
+ m_script->init_cheats();
+
// Create objects if they're ready
if (m_state == LC_Ready)
m_script->on_client_ready(m_env.getLocalPlayer());
diff --git a/src/client/game.cpp b/src/client/game.cpp
index b366ac0a3..3c3ce555d 100644
--- a/src/client/game.cpp
+++ b/src/client/game.cpp
@@ -593,11 +593,20 @@ bool Game::initGui()
// Chat backend and console
gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(),
-1, chat_backend, client, &g_menumgr);
+
if (!gui_chat_console) {
*error_message = "Could not allocate memory for chat console";
errorstream << *error_message << std::endl;
return false;
}
+
+ m_cheat_menu = new CheatMenu(client);
+
+ if (!m_cheat_menu) {
+ *error_message = "Could not allocate memory for cheat menu";
+ errorstream << *error_message << std::endl;
+ return false;
+ }
#ifdef HAVE_TOUCHSCREENGUI
@@ -1084,6 +1093,16 @@ void Game::processKeyInput()
toggleKillaura();
} else if (wasKeyDown(KeyType::FREECAM)) {
toggleFreecam();
+ } else if (wasKeyDown(KeyType::SELECT_UP)) {
+ m_cheat_menu->selectUp();
+ } else if (wasKeyDown(KeyType::SELECT_DOWN)) {
+ m_cheat_menu->selectDown();
+ } else if (wasKeyDown(KeyType::SELECT_LEFT)) {
+ m_cheat_menu->selectLeft();
+ } else if (wasKeyDown(KeyType::SELECT_RIGHT)) {
+ m_cheat_menu->selectRight();
+ } else if (wasKeyDown(KeyType::SELECT_CONFIRM)) {
+ m_cheat_menu->selectConfirm();
#if USE_SOUND
} else if (wasKeyDown(KeyType::MUTE)) {
if (g_settings->getBool("enable_sound")) {
@@ -1137,6 +1156,8 @@ void Game::processKeyInput()
m_game_ui->toggleChat();
} else if (wasKeyDown(KeyType::TOGGLE_FOG)) {
toggleFog();
+ } else if (wasKeyDown(KeyType::TOGGLE_CHEAT_MENU)) {
+ m_game_ui->toggleCheatMenu();
} else if (wasKeyDown(KeyType::TOGGLE_UPDATE_CAMERA)) {
toggleUpdateCamera();
} else if (wasKeyDown(KeyType::TOGGLE_DEBUG)) {
@@ -2272,7 +2293,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
if (g_settings->getBool("increase_tool_range"))
d++;
if (g_settings->getBool("increase_tool_range_plus"))
- d = 500;
+ d = 1000;
core::line3d<f32> shootline;
@@ -3187,13 +3208,19 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
graph->draw(10, screensize.Y - 10, driver, g_fontengine->getFont());
/*
+ Cheat menu
+ */
+
+ if (m_game_ui->m_flags.show_cheat_menu && ! gui_chat_console->isOpen())
+ m_cheat_menu->draw(driver, m_game_ui->m_flags.show_debug);
+
+ /*
Damage flash
*/
- if (runData.damage_flash > 0.0f && ! g_settings->getBool("no_hurt_cam")) {
+ if (runData.damage_flash > 0.0f) {
video::SColor color(runData.damage_flash, 180, 0, 0);
- driver->draw2DRectangle(color,
- core::rect<s32>(0, 0, screensize.X, screensize.Y),
- NULL);
+ if (! g_settings->getBool("no_hurt_cam"))
+ driver->draw2DRectangle(color, core::rect<s32>(0, 0, screensize.X, screensize.Y), NULL);
runData.damage_flash -= 384.0f * dtime;
}
diff --git a/src/client/game.h b/src/client/game.h
index af34fb056..21651c510 100644
--- a/src/client/game.h
+++ b/src/client/game.h
@@ -41,6 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "filesys.h"
#include "gettext.h"
+#include "gui/cheatMenu.h"
#include "gui/guiChatConsole.h"
#include "gui/guiConfirmRegistration.h"
#include "gui/guiFormSpecMenu.h"
@@ -855,7 +856,7 @@ public:
ISoundManager *sound = nullptr;
bool sound_is_dummy = false;
SoundMaker *soundmaker = nullptr;
-
+
ChatBackend *chat_backend = nullptr;
LogOutputBuffer m_chat_log_buf;
@@ -865,6 +866,7 @@ public:
std::unique_ptr<GameUI> m_game_ui;
GUIChatConsole *gui_chat_console = nullptr; // Free using ->Drop()
+ CheatMenu *m_cheat_menu = nullptr;
MapDrawControl *draw_control = nullptr;
Camera *camera = nullptr;
Clouds *clouds = nullptr; // Free using ->Drop()
diff --git a/src/client/gameui.cpp b/src/client/gameui.cpp
index a20c2c40d..d34f7343c 100644
--- a/src/client/gameui.cpp
+++ b/src/client/gameui.cpp
@@ -275,6 +275,15 @@ void GameUI::toggleChat()
showTranslatedStatusText("Chat hidden");
}
+void GameUI::toggleCheatMenu()
+{
+ m_flags.show_cheat_menu = !m_flags.show_cheat_menu;
+ if (m_flags.show_cheat_menu)
+ showTranslatedStatusText("Cheat Menu shown");
+ else
+ showTranslatedStatusText("Cheat Menu hidden");
+}
+
void GameUI::toggleHud()
{
m_flags.show_hud = !m_flags.show_hud;
diff --git a/src/client/gameui.h b/src/client/gameui.h
index 67c6a9921..0b6298c78 100644
--- a/src/client/gameui.h
+++ b/src/client/gameui.h
@@ -59,6 +59,7 @@ public:
bool show_minimap = false;
bool show_debug = true;
bool show_profiler_graph = false;
+ bool show_cheat_menu = true;
};
void init();
@@ -91,6 +92,7 @@ public:
void updateProfiler();
void toggleChat();
+ void toggleCheatMenu();
void toggleHud();
void toggleProfiler();
diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp
index 3c39976ec..b78304d96 100644
--- a/src/client/inputhandler.cpp
+++ b/src/client/inputhandler.cpp
@@ -62,6 +62,7 @@ void KeyCache::populate()
key[KeyType::TOGGLE_HUD] = getKeySetting("keymap_toggle_hud");
key[KeyType::TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat");
key[KeyType::TOGGLE_FOG] = getKeySetting("keymap_toggle_fog");
+ key[KeyType::TOGGLE_CHEAT_MENU] = getKeySetting("keymap_toggle_cheat_menu");
key[KeyType::TOGGLE_UPDATE_CAMERA] = getKeySetting("keymap_toggle_update_camera");
key[KeyType::TOGGLE_DEBUG] = getKeySetting("keymap_toggle_debug");
key[KeyType::TOGGLE_PROFILER] = getKeySetting("keymap_toggle_profiler");
@@ -76,6 +77,11 @@ void KeyCache::populate()
key[KeyType::FULLBRIGHT] = getKeySetting("keymap_toggle_fullbright");
key[KeyType::KILLAURA] = getKeySetting("keymap_toggle_killaura");
key[KeyType::FREECAM] = getKeySetting("keymap_toggle_freecam");
+ key[KeyType::SELECT_UP] = getKeySetting("keymap_select_up");
+ key[KeyType::SELECT_DOWN] = getKeySetting("keymap_select_down");
+ key[KeyType::SELECT_LEFT] = getKeySetting("keymap_select_left");
+ key[KeyType::SELECT_RIGHT] = getKeySetting("keymap_select_right");
+ key[KeyType::SELECT_CONFIRM] = getKeySetting("keymap_select_confirm");
key[KeyType::QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
key[KeyType::QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
diff --git a/src/client/keys.h b/src/client/keys.h
index 68ba197f0..98c51f7a5 100644
--- a/src/client/keys.h
+++ b/src/client/keys.h
@@ -61,6 +61,7 @@ public:
TOGGLE_HUD,
TOGGLE_CHAT,
TOGGLE_FOG,
+ TOGGLE_CHEAT_MENU,
TOGGLE_UPDATE_CAMERA,
TOGGLE_DEBUG,
TOGGLE_PROFILER,
@@ -73,6 +74,11 @@ public:
FULLBRIGHT,
KILLAURA,
FREECAM,
+ SELECT_UP,
+ SELECT_DOWN,
+ SELECT_LEFT,
+ SELECT_RIGHT,
+ SELECT_CONFIRM,
QUICKTUNE_NEXT,
QUICKTUNE_PREV,
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index d9cad452b..8903c97e7 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -79,6 +79,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("antiknockback", "false");
settings->setDefault("entity_speed", "false");
settings->setDefault("autodig", "false");
+ settings->setDefault("autorespawn", "false");
// Keymap
settings->setDefault("remote_port", "30000");
@@ -113,6 +114,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("keymap_toggle_hud", "KEY_F1");
settings->setDefault("keymap_toggle_chat", "KEY_F2");
settings->setDefault("keymap_toggle_fog", "KEY_F3");
+ settings->setDefault("keymap_toggle_cheat_menu", "KEY_F8");
#if DEBUG
settings->setDefault("keymap_toggle_update_camera", "KEY_F4");
#else
@@ -128,6 +130,11 @@ void set_default_settings(Settings *settings)
settings->setDefault("keymap_toggle_fullbright", "KEY_KEY_F");
settings->setDefault("keymap_toggle_killaura", "KEY_KEY_G");
settings->setDefault("keymap_toggle_freecam", "KEY_KEY_L");
+ settings->setDefault("keymap_select_up", "KEY_UP");
+ settings->setDefault("keymap_select_down", "KEY_DOWN");
+ settings->setDefault("keymap_select_left", "KEY_LEFT");
+ settings->setDefault("keymap_select_right", "KEY_RIGHT");
+ settings->setDefault("keymap_select_confirm", "KEY_RETURN");
settings->setDefault("keymap_slot1", "KEY_KEY_1");
settings->setDefault("keymap_slot2", "KEY_KEY_2");
settings->setDefault("keymap_slot3", "KEY_KEY_3");
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index ae54adcff..7befba37c 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -1,4 +1,5 @@
set(gui_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/cheatMenu.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiAnimatedImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiBackgroundImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiBox.cpp
@@ -6,7 +7,6 @@ set(gui_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/guiButtonImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiButtonItemImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiChatConsole.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/guiCheatMenu.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiConfirmRegistration.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBoxWithScrollbar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEngine.cpp
diff --git a/src/gui/cheatMenu.cpp b/src/gui/cheatMenu.cpp
new file mode 100644
index 000000000..600625537
--- /dev/null
+++ b/src/gui/cheatMenu.cpp
@@ -0,0 +1,129 @@
+/*
+Dragonfire
+Copyright (C) 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "cheatMenu.h"
+#include "script/scripting_client.h"
+#include "client/client.h"
+#include "client/fontengine.h"
+
+CheatMenu::CheatMenu(Client *client):
+ m_client(client)
+{
+ m_font = g_fontengine->getFont(FONT_SIZE_UNSPECIFIED, FM_Fallback);
+
+ if (!m_font) {
+ errorstream << "CheatMenu: Unable to load fallback font" << std::endl;
+ } else {
+ core::dimension2d<u32> dim = m_font->getDimension(L"M");
+ m_fontsize = v2u32(dim.Width, dim.Height);
+ m_font->grab();
+ }
+ m_fontsize.X = MYMAX(m_fontsize.X, 1);
+ m_fontsize.Y = MYMAX(m_fontsize.Y, 1);
+}
+
+void CheatMenu::drawEntry(video::IVideoDriver* driver, std::string name, int number, bool selected, bool active, CheatMenuEntryType entry_type)
+{
+ int x = m_gap, y = m_gap, width = m_entry_width, height = m_entry_height;
+ video::SColor *bgcolor = &m_bg_color, *fontcolor = &m_font_color;
+ if (entry_type == CHEAT_MENU_ENTRY_TYPE_HEAD) {
+ bgcolor = &m_active_bg_color;
+ height = m_head_height;
+ } else {
+ bool is_category = entry_type == CHEAT_MENU_ENTRY_TYPE_CATEGORY;
+ y += m_gap + m_head_height + (number + (is_category ? 0 : m_selected_category)) * (m_entry_height + m_gap);
+ x += (is_category ? 0 : m_gap + m_entry_width);
+ if (active)
+ bgcolor = &m_active_bg_color;
+ if (selected)
+ fontcolor = &m_selected_font_color;
+ }
+ core::rect<s32> bounds(x, y, x + width, y + height);
+ driver->draw2DRectangle(*bgcolor, bounds);
+ driver->draw2DRectangleOutline(bounds, *fontcolor);
+ int fx = x + 5, fy = y + (height - m_fontsize.Y) / 2;
+ core::rect<s32> fontbounds(fx, fy, fx + m_fontsize.X * name.size(), fy + m_fontsize.Y);
+ m_font->draw(name.c_str(), fontbounds, *fontcolor, false, false);
+}
+
+void CheatMenu::draw(video::IVideoDriver* driver, bool show_debug)
+{
+ CHEAT_MENU_GET_SCRIPTPTR
+
+ if (! show_debug)
+ drawEntry(driver, "Dragonfireclient", 0, false, false, CHEAT_MENU_ENTRY_TYPE_HEAD);
+ int category_count = 0;
+ for (auto category = script->m_cheat_categories.begin(); category != script->m_cheat_categories.end(); category++) {
+ bool is_selected = category_count == m_selected_category;
+ drawEntry(driver, (*category)->m_name, category_count, is_selected, false, CHEAT_MENU_ENTRY_TYPE_CATEGORY);
+ if (is_selected && m_cheat_layer) {
+ int cheat_count = 0;
+ for (auto cheat = (*category)->m_cheats.begin(); cheat != (*category)->m_cheats.end(); cheat++) {
+ drawEntry(driver, (*cheat)->m_name, cheat_count, cheat_count == m_selected_cheat, (*cheat)->is_enabled());
+ cheat_count++;
+ }
+ }
+ category_count++;
+ }
+}
+
+void CheatMenu::selectUp()
+{
+ CHEAT_MENU_GET_SCRIPTPTR
+
+ int max = (m_cheat_layer ? script->m_cheat_categories[m_selected_category]->m_cheats.size() : script->m_cheat_categories.size()) - 1;
+ int *selected = m_cheat_layer ? &m_selected_cheat : &m_selected_category;
+ --*selected;
+ if (*selected < 0)
+ *selected = max;
+}
+
+void CheatMenu::selectDown()
+{
+ CHEAT_MENU_GET_SCRIPTPTR
+
+ int max = (m_cheat_layer ? script->m_cheat_categories[m_selected_category]->m_cheats.size() : script->m_cheat_categories.size()) - 1;
+ int *selected = m_cheat_layer ? &m_selected_cheat : &m_selected_category;
+ ++*selected;
+ if (*selected > max)
+ *selected = 0;
+}
+
+void CheatMenu::selectRight()
+{
+ if (m_cheat_layer)
+ return;
+ m_cheat_layer = true;
+ m_selected_cheat = 0;
+}
+
+void CheatMenu::selectLeft()
+{
+ if (! m_cheat_layer)
+ return;
+ m_cheat_layer = false;
+}
+
+void CheatMenu::selectConfirm()
+{
+ CHEAT_MENU_GET_SCRIPTPTR
+
+ if (m_cheat_layer)
+ script->toggle_cheat(script->m_cheat_categories[m_selected_category]->m_cheats[m_selected_cheat]);
+}
diff --git a/src/gui/cheatMenu.h b/src/gui/cheatMenu.h
new file mode 100644
index 000000000..ec0c81659
--- /dev/null
+++ b/src/gui/cheatMenu.h
@@ -0,0 +1,71 @@
+/*
+Dragonfire
+Copyright (C) 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#pragma once
+
+#include "irrlichttypes_extrabloated.h"
+#include <string>
+
+#define CHEAT_MENU_GET_SCRIPTPTR ClientScripting *script = m_client->getScript(); if (! script || ! script->m_cheats_loaded) return;
+
+class Client;
+
+typedef enum
+{
+ CHEAT_MENU_ENTRY_TYPE_HEAD,
+ CHEAT_MENU_ENTRY_TYPE_CATEGORY,
+ CHEAT_MENU_ENTRY_TYPE_ENTRY,
+}
+CheatMenuEntryType;
+
+class CheatMenu
+{
+public:
+ CheatMenu(Client* client);
+
+ virtual void draw(video::IVideoDriver* driver, bool show_debug);
+
+ void drawEntry(video::IVideoDriver* driver, std::string name, int number, bool selected, bool active, CheatMenuEntryType entry_type = CHEAT_MENU_ENTRY_TYPE_ENTRY);
+
+ void selectUp();
+ void selectDown();
+ void selectLeft();
+ void selectRight();
+ void selectConfirm();
+
+private:
+ bool m_cheat_layer = false;
+ int m_selected_cheat = 0;
+ int m_selected_category = 0;
+
+ int m_head_height = 50;
+ int m_entry_height = 40;
+ int m_entry_width = 200;
+ int m_gap = 2;
+
+ video::SColor m_bg_color = video::SColor(192, 255, 175, 191);
+ video::SColor m_active_bg_color = video::SColor(192, 255, 32, 76);
+ video::SColor m_font_color = video::SColor(255, 89, 0, 65);
+ video::SColor m_selected_font_color = video::SColor(255, 87, 0, 242);
+
+ Client *m_client;
+
+ gui::IGUIFont *m_font = nullptr;
+ v2u32 m_fontsize;
+};
diff --git a/src/gui/guiCheatMenu.cpp b/src/gui/guiCheatMenu.cpp
deleted file mode 100644
index 41c9fb84d..000000000
--- a/src/gui/guiCheatMenu.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-Dragonfire
-Copyright (C) 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
-
-This program 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.
-
-This program 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 this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
diff --git a/src/gui/guiCheatMenu.h b/src/gui/guiCheatMenu.h
deleted file mode 100644
index 99f9b0e21..000000000
--- a/src/gui/guiCheatMenu.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Dragonfire
-Copyright (C) 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
-
-This program 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.
-
-This program 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 this program; if not, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
-
-#pragma once
-
-#include "irrlichttypes_extrabloated.h"
-#include "modalMenu.h"
-#include "config.h"
-
-class GUICheatMenuEntry : public gui::IGUIElement
-{
- GUICheatMenu(gui::IGUIEnvironment* env,
- gui::IGUIElement* parent,
- s32 id,
- Client* client,
- IMenuManager* menumgr);
-
-};
diff --git a/src/gui/guiKeyChangeMenu.cpp b/src/gui/guiKeyChangeMenu.cpp
index 593cda66b..98cb131a8 100644
--- a/src/gui/guiKeyChangeMenu.cpp
+++ b/src/gui/guiKeyChangeMenu.cpp
@@ -73,13 +73,19 @@ enum
GUI_ID_KEY_CHATLOG_BUTTON,
GUI_ID_KEY_HUD_BUTTON,
GUI_ID_KEY_FOG_BUTTON,
+ GUI_ID_KEY_CHEAT_MENU_BUTTON,
GUI_ID_KEY_DEC_RANGE_BUTTON,
GUI_ID_KEY_INC_RANGE_BUTTON,
GUI_ID_KEY_AUTOFWD_BUTTON,
- GUI_ID_KEY_XRAY,
- GUI_ID_KEY_FULLBRIGHT,
- GUI_ID_KEY_KILLAURA,
- GUI_ID_KEY_FREECAM,
+ GUI_ID_KEY_XRAY_BUTTON,
+ GUI_ID_KEY_FULLBRIGHT_BUTTON,
+ GUI_ID_KEY_KILLAURA_BUTTON,
+ GUI_ID_KEY_FREECAM_BUTTON,
+ GUI_ID_KEY_SELECT_UP_BUTTON,
+ GUI_ID_KEY_SELECT_DOWN_BUTTON,
+ GUI_ID_KEY_SELECT_LEFT_BUTTON,
+ GUI_ID_KEY_SELECT_RIGHT_BUTTON,
+ GUI_ID_KEY_SELECT_CONFIRM_BUTTON,
// other
GUI_ID_CB_AUX1_DESCENDS,
GUI_ID_CB_DOUBLETAP_JUMP,
@@ -451,8 +457,14 @@ void GUIKeyChangeMenu::init_keys()
this->add_key(GUI_ID_KEY_HUD_BUTTON, wgettext("Toggle HUD"), "keymap_toggle_hud");
this->add_key(GUI_ID_KEY_CHATLOG_BUTTON, wgettext("Toggle chat log"), "keymap_toggle_chat");
this->add_key(GUI_ID_KEY_FOG_BUTTON, wgettext("Toggle fog"), "keymap_toggle_fog");
- this->add_key(GUI_ID_KEY_XRAY, wgettext("Toggle X-Ray"), "keymap_toggle_xray");
- this->add_key(GUI_ID_KEY_FULLBRIGHT, wgettext("Toggle Fullbr."), "keymap_toggle_fullbright");
- this->add_key(GUI_ID_KEY_KILLAURA, wgettext("Toggle Killaura"), "keymap_toggle_killaura");
- this->add_key(GUI_ID_KEY_FREECAM, wgettext("Toggle Freec."), "keymap_toggle_freecam");
+ this->add_key(GUI_ID_KEY_CHEAT_MENU_BUTTON,wgettext("Toggle C. Menu"),"keymap_toggle_cheat_menu");
+ this->add_key(GUI_ID_KEY_XRAY_BUTTON, wgettext("Toggle X-Ray"), "keymap_toggle_xray");
+ this->add_key(GUI_ID_KEY_FULLBRIGHT_BUTTON,wgettext("Toggle Fullbr."), "keymap_toggle_fullbright");
+ this->add_key(GUI_ID_KEY_KILLAURA_BUTTON, wgettext("Toggle Killaura"), "keymap_toggle_killaura");
+ this->add_key(GUI_ID_KEY_FREECAM_BUTTON, wgettext("Toggle Freec."), "keymap_toggle_freecam");
+ this->add_key(GUI_ID_KEY_SELECT_UP_BUTTON, wgettext("C. Menu Up"), "keymap_select_up");
+ this->add_key(GUI_ID_KEY_SELECT_DOWN_BUTTON,wgettext("C. Menu Down"), "keymap_select_down");
+ this->add_key(GUI_ID_KEY_SELECT_LEFT_BUTTON,wgettext("C. Menu Left"), "keymap_select_left");
+ this->add_key(GUI_ID_KEY_SELECT_RIGHT_BUTTON,wgettext("C. Menu Right"),"keymap_select_right");
+ this->add_key(GUI_ID_KEY_SELECT_CONFIRM_BUTTON,wgettext("C. Menu Enter"),"keymap_select_confirm");
}
diff --git a/src/script/cpp_api/CMakeLists.txt b/src/script/cpp_api/CMakeLists.txt
index 3cfd7709a..d2c55b7c5 100644
--- a/src/script/cpp_api/CMakeLists.txt
+++ b/src/script/cpp_api/CMakeLists.txt
@@ -15,6 +15,7 @@ set(common_SCRIPT_CPP_API_SRCS
set(client_SCRIPT_CPP_API_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/s_client.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/s_cheats.cpp
${CMAKE_CURRENT_SOURCE_DIR}/s_mainmenu.cpp
PARENT_SCOPE)
diff --git a/src/script/cpp_api/s_cheats.cpp b/src/script/cpp_api/s_cheats.cpp
new file mode 100644
index 000000000..82a314265
--- /dev/null
+++ b/src/script/cpp_api/s_cheats.cpp
@@ -0,0 +1,121 @@
+/*
+Dragonfire
+Copyright (C) 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "cpp_api/s_cheats.h"
+#include "cpp_api/s_base.h"
+#include "cpp_api/s_internal.h"
+#include "settings.h"
+
+ScriptApiCheatsCheat::ScriptApiCheatsCheat(const std::string &name, const std::string &setting) :
+ m_name(name),
+ m_setting(setting),
+ m_function_ref(0)
+{
+}
+
+
+ScriptApiCheatsCheat::ScriptApiCheatsCheat(const std::string &name, const int &function) :
+ m_name(name),
+ m_setting(""),
+ m_function_ref(function)
+{
+}
+
+bool ScriptApiCheatsCheat::is_enabled()
+{
+ return ! m_function_ref && g_settings->getBool(m_setting);
+}
+
+void ScriptApiCheatsCheat::toggle(lua_State *L, int error_handler)
+{
+ if (m_function_ref) {
+ lua_rawgeti(L, LUA_REGISTRYINDEX, m_function_ref);
+ lua_pcall(L, 0, 0, error_handler);
+ } else
+ g_settings->setBool(m_setting, !g_settings->getBool(m_setting));
+}
+
+ScriptApiCheatsCategory::ScriptApiCheatsCategory(const std::string &name) :
+ m_name(name)
+{
+}
+
+ScriptApiCheatsCategory::~ScriptApiCheatsCategory()
+{
+ for (auto i = m_cheats.begin(); i != m_cheats.end(); i++)
+ delete *i;
+}
+
+void ScriptApiCheatsCategory::read_cheats(lua_State *L)
+{
+ lua_pushnil(L);
+ while (lua_next(L, -2)) {
+ ScriptApiCheatsCheat *cheat = nullptr;
+ std::string name = lua_tostring(L, -2);
+ if (lua_isstring(L, -1))
+ cheat = new ScriptApiCheatsCheat(name, lua_tostring(L, -1));
+ else if (lua_isfunction(L, -1)) {
+ cheat = new ScriptApiCheatsCheat(name, luaL_ref(L, LUA_REGISTRYINDEX));
+ lua_pushnil(L);
+ }
+ if (cheat)
+ m_cheats.push_back(cheat);
+ lua_pop(L, 1);
+ }
+}
+
+ScriptApiCheats::~ScriptApiCheats()
+{
+ for (auto i = m_cheat_categories.begin(); i != m_cheat_categories.end(); i++)
+ delete *i;
+}
+
+void ScriptApiCheats::init_cheats()
+{
+ SCRIPTAPI_PRECHECKHEADER
+
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "cheats");
+ if (! lua_istable(L, -1)) {
+ lua_pop(L, 2);
+ return;
+ }
+ lua_pushnil(L);
+ while (lua_next(L, -2)) {
+ if (lua_istable(L, -1)) {
+ ScriptApiCheatsCategory *category = new ScriptApiCheatsCategory(lua_tostring(L, -2));
+ category->read_cheats(L);
+ m_cheat_categories.push_back(category);
+ }
+ lua_pop(L, 1);
+ }
+ lua_pop(L, 2);
+ m_cheats_loaded = true;
+}
+
+void ScriptApiCheats::toggle_cheat(ScriptApiCheatsCheat *cheat)
+{
+ SCRIPTAPI_PRECHECKHEADER
+
+ PUSH_ERROR_HANDLER(L);
+ int error_handler = lua_gettop(L) - 1;
+ lua_insert(L, error_handler);
+
+ cheat->toggle(L, error_handler);
+}
diff --git a/src/script/cpp_api/s_cheats.h b/src/script/cpp_api/s_cheats.h
new file mode 100644
index 000000000..a93768659
--- /dev/null
+++ b/src/script/cpp_api/s_cheats.h
@@ -0,0 +1,57 @@
+/*
+Dragonfire
+Copyright (C) 2020 Elias Fleckenstein <eliasfleckenstein@web.de>
+
+This program 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.
+
+This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#pragma once
+
+#include "cpp_api/s_base.h"
+#include <vector>
+#include <string>
+
+class ScriptApiCheatsCheat
+{
+public:
+ ScriptApiCheatsCheat(const std::string &name, const std::string &setting);
+ ScriptApiCheatsCheat(const std::string &name, const int &function);
+ std::string m_name;
+ bool is_enabled();
+ void toggle(lua_State *L, int error_handler);
+private:
+ std::string m_setting;
+ int m_function_ref;
+};
+
+class ScriptApiCheatsCategory
+{
+public:
+ ScriptApiCheatsCategory(const std::string &name);
+ ~ScriptApiCheatsCategory();
+ std::string m_name;
+ void read_cheats(lua_State *L);
+ std::vector<ScriptApiCheatsCheat*> m_cheats;
+};
+
+class ScriptApiCheats : virtual public ScriptApiBase
+{
+public:
+ virtual ~ScriptApiCheats();
+ void init_cheats();
+ void toggle_cheat(ScriptApiCheatsCheat *cheat);
+ bool m_cheats_loaded = false;
+ std::vector<ScriptApiCheatsCategory*> m_cheat_categories;
+};
diff --git a/src/script/scripting_client.h b/src/script/scripting_client.h
index 3088029f0..e162f8bcf 100644
--- a/src/script/scripting_client.h
+++ b/src/script/scripting_client.h
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h"
#include "cpp_api/s_client.h"
+#include "cpp_api/s_cheats.h"
#include "cpp_api/s_modchannels.h"
#include "cpp_api/s_security.h"
@@ -34,7 +35,8 @@ class ClientScripting:
virtual public ScriptApiBase,
public ScriptApiSecurity,
public ScriptApiClient,
- public ScriptApiModChannels
+ public ScriptApiModChannels,
+ public ScriptApiCheats
{
public:
ClientScripting(Client *client);