]> git.lizzy.rs Git - minetest.git/blob - src/client/inputhandler.cpp
Make sounds stop playing when entering game or mainmenu
[minetest.git] / src / client / inputhandler.cpp
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include "util/numeric.h"
22 #include "inputhandler.h"
23 #include "gui/mainmenumanager.h"
24
25 void KeyCache::populate_nonchanging()
26 {
27         key[KeyType::ESC] = EscapeKey;
28 }
29
30 void KeyCache::populate()
31 {
32         key[KeyType::FORWARD] = getKeySetting("keymap_forward");
33         key[KeyType::BACKWARD] = getKeySetting("keymap_backward");
34         key[KeyType::LEFT] = getKeySetting("keymap_left");
35         key[KeyType::RIGHT] = getKeySetting("keymap_right");
36         key[KeyType::JUMP] = getKeySetting("keymap_jump");
37         key[KeyType::SPECIAL1] = getKeySetting("keymap_special1");
38         key[KeyType::SNEAK] = getKeySetting("keymap_sneak");
39
40         key[KeyType::AUTOFORWARD] = getKeySetting("keymap_autoforward");
41
42         key[KeyType::DROP] = getKeySetting("keymap_drop");
43         key[KeyType::INVENTORY] = getKeySetting("keymap_inventory");
44         key[KeyType::CHAT] = getKeySetting("keymap_chat");
45         key[KeyType::CMD] = getKeySetting("keymap_cmd");
46         key[KeyType::CMD_LOCAL] = getKeySetting("keymap_cmd_local");
47         key[KeyType::CONSOLE] = getKeySetting("keymap_console");
48         key[KeyType::MINIMAP] = getKeySetting("keymap_minimap");
49         key[KeyType::FREEMOVE] = getKeySetting("keymap_freemove");
50         key[KeyType::FASTMOVE] = getKeySetting("keymap_fastmove");
51         key[KeyType::NOCLIP] = getKeySetting("keymap_noclip");
52         key[KeyType::HOTBAR_PREV] = getKeySetting("keymap_hotbar_previous");
53         key[KeyType::HOTBAR_NEXT] = getKeySetting("keymap_hotbar_next");
54         key[KeyType::MUTE] = getKeySetting("keymap_mute");
55         key[KeyType::INC_VOLUME] = getKeySetting("keymap_increase_volume");
56         key[KeyType::DEC_VOLUME] = getKeySetting("keymap_decrease_volume");
57         key[KeyType::CINEMATIC] = getKeySetting("keymap_cinematic");
58         key[KeyType::SCREENSHOT] = getKeySetting("keymap_screenshot");
59         key[KeyType::TOGGLE_HUD] = getKeySetting("keymap_toggle_hud");
60         key[KeyType::TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat");
61         key[KeyType::TOGGLE_FOG] = getKeySetting("keymap_toggle_fog");
62         key[KeyType::TOGGLE_UPDATE_CAMERA] = getKeySetting("keymap_toggle_update_camera");
63         key[KeyType::TOGGLE_DEBUG] = getKeySetting("keymap_toggle_debug");
64         key[KeyType::TOGGLE_PROFILER] = getKeySetting("keymap_toggle_profiler");
65         key[KeyType::CAMERA_MODE] = getKeySetting("keymap_camera_mode");
66         key[KeyType::INCREASE_VIEWING_RANGE] =
67                         getKeySetting("keymap_increase_viewing_range_min");
68         key[KeyType::DECREASE_VIEWING_RANGE] =
69                         getKeySetting("keymap_decrease_viewing_range_min");
70         key[KeyType::RANGESELECT] = getKeySetting("keymap_rangeselect");
71         key[KeyType::ZOOM] = getKeySetting("keymap_zoom");
72
73         key[KeyType::QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
74         key[KeyType::QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
75         key[KeyType::QUICKTUNE_INC] = getKeySetting("keymap_quicktune_inc");
76         key[KeyType::QUICKTUNE_DEC] = getKeySetting("keymap_quicktune_dec");
77
78         for (int i = 0; i < 23; i++) {
79                 std::string slot_key_name = "keymap_slot" + std::to_string(i + 1);
80                 key[KeyType::SLOT_1 + i] = getKeySetting(slot_key_name.c_str());
81         }
82
83         if (handler) {
84                 // First clear all keys, then re-add the ones we listen for
85                 handler->dontListenForKeys();
86                 for (const KeyPress &k : key) {
87                         handler->listenForKey(k);
88                 }
89                 handler->listenForKey(EscapeKey);
90                 handler->listenForKey(CancelKey);
91         }
92 }
93
94 bool MyEventReceiver::OnEvent(const SEvent &event)
95 {
96         /*
97                 React to nothing here if a menu is active
98         */
99         if (isMenuActive()) {
100 #ifdef HAVE_TOUCHSCREENGUI
101                 if (m_touchscreengui) {
102                         m_touchscreengui->Toggle(false);
103                 }
104 #endif
105                 return g_menumgr.preprocessEvent(event);
106         }
107
108         // Remember whether each key is down or up
109         if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
110                 const KeyPress &keyCode = event.KeyInput;
111                 if (keysListenedFor[keyCode]) {
112                         if (event.KeyInput.PressedDown) {
113                                 keyIsDown.set(keyCode);
114                                 keyWasDown.set(keyCode);
115                         } else {
116                                 keyIsDown.unset(keyCode);
117                         }
118                         return true;
119                 }
120         }
121
122 #ifdef HAVE_TOUCHSCREENGUI
123         // case of touchscreengui we have to handle different events
124         if (m_touchscreengui && event.EventType == irr::EET_TOUCH_INPUT_EVENT) {
125                 m_touchscreengui->translateEvent(event);
126                 return true;
127         }
128 #endif
129
130         if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) {
131                 /* TODO add a check like:
132                 if (event.JoystickEvent != joystick_we_listen_for)
133                         return false;
134                 */
135                 return joystick->handleEvent(event.JoystickEvent);
136         }
137         // handle mouse events
138         if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
139                 if (isMenuActive()) {
140                         left_active = false;
141                         middle_active = false;
142                         right_active = false;
143                 } else {
144                         left_active = event.MouseInput.isLeftPressed();
145                         middle_active = event.MouseInput.isMiddlePressed();
146                         right_active = event.MouseInput.isRightPressed();
147
148                         if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
149                                 leftclicked = true;
150                         }
151                         if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
152                                 rightclicked = true;
153                         }
154                         if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
155                                 leftreleased = true;
156                         }
157                         if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
158                                 rightreleased = true;
159                         }
160                         if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) {
161                                 mouse_wheel += event.MouseInput.Wheel;
162                         }
163                 }
164         } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) {
165                 static const LogLevel irr_loglev_conv[] = {
166                                 LL_VERBOSE, // ELL_DEBUG
167                                 LL_INFO,    // ELL_INFORMATION
168                                 LL_WARNING, // ELL_WARNING
169                                 LL_ERROR,   // ELL_ERROR
170                                 LL_NONE,    // ELL_NONE
171                 };
172                 assert(event.LogEvent.Level < ARRLEN(irr_loglev_conv));
173                 g_logger.log(irr_loglev_conv[event.LogEvent.Level],
174                                 std::string("Irrlicht: ") + event.LogEvent.Text);
175                 return true;
176         }
177         /* always return false in order to continue processing events */
178         return false;
179 }
180
181 /*
182  * RandomInputHandler
183  */
184 s32 RandomInputHandler::Rand(s32 min, s32 max)
185 {
186         return (myrand() % (max - min + 1)) + min;
187 }
188
189 void RandomInputHandler::step(float dtime)
190 {
191         {
192                 static float counter1 = 0;
193                 counter1 -= dtime;
194                 if (counter1 < 0.0) {
195                         counter1 = 0.1 * Rand(1, 40);
196                         keydown.toggle(getKeySetting("keymap_jump"));
197                 }
198         }
199         {
200                 static float counter1 = 0;
201                 counter1 -= dtime;
202                 if (counter1 < 0.0) {
203                         counter1 = 0.1 * Rand(1, 40);
204                         keydown.toggle(getKeySetting("keymap_special1"));
205                 }
206         }
207         {
208                 static float counter1 = 0;
209                 counter1 -= dtime;
210                 if (counter1 < 0.0) {
211                         counter1 = 0.1 * Rand(1, 40);
212                         keydown.toggle(getKeySetting("keymap_forward"));
213                 }
214         }
215         {
216                 static float counter1 = 0;
217                 counter1 -= dtime;
218                 if (counter1 < 0.0) {
219                         counter1 = 0.1 * Rand(1, 40);
220                         keydown.toggle(getKeySetting("keymap_left"));
221                 }
222         }
223         {
224                 static float counter1 = 0;
225                 counter1 -= dtime;
226                 if (counter1 < 0.0) {
227                         counter1 = 0.1 * Rand(1, 20);
228                         mousespeed = v2s32(Rand(-20, 20), Rand(-15, 20));
229                 }
230         }
231         {
232                 static float counter1 = 0;
233                 counter1 -= dtime;
234                 if (counter1 < 0.0) {
235                         counter1 = 0.1 * Rand(1, 30);
236                         leftdown = !leftdown;
237                         if (leftdown)
238                                 leftclicked = true;
239                         if (!leftdown)
240                                 leftreleased = true;
241                 }
242         }
243         {
244                 static float counter1 = 0;
245                 counter1 -= dtime;
246                 if (counter1 < 0.0) {
247                         counter1 = 0.1 * Rand(1, 15);
248                         rightdown = !rightdown;
249                         if (rightdown)
250                                 rightclicked = true;
251                         if (!rightdown)
252                                 rightreleased = true;
253                 }
254         }
255         mousepos += mousespeed;
256 }