summaryrefslogtreecommitdiff
path: root/cheat/gmod/input_system.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cheat/gmod/input_system.cpp')
-rw-r--r--cheat/gmod/input_system.cpp527
1 files changed, 527 insertions, 0 deletions
diff --git a/cheat/gmod/input_system.cpp b/cheat/gmod/input_system.cpp
new file mode 100644
index 0000000..881fa02
--- /dev/null
+++ b/cheat/gmod/input_system.cpp
@@ -0,0 +1,527 @@
+#include <Windows.h>
+
+#include "input_system.hpp"
+#include "util.hpp"
+
+util::c_input_manager g_input;
+
+NAMESPACE_REGION( util )
+
+const char* const key_names_short[] = {
+ "unk",
+ "m1",
+ "m2",
+ "can",
+ "m3",
+ "m4",
+ "m5",
+ "unk",
+ "back",
+ "tab",
+ "unk",
+ "unk",
+ "clr",
+ "ret",
+ "unk",
+ "unk",
+ "shift",
+ "ctrl",
+ "alt",
+ "pause",
+ "caps",
+ "kana",
+ "unk",
+ "junja",
+ "final",
+ "kanji",
+ "unk",
+ "esc",
+ "convert",
+ "nonconvert",
+ "accept",
+ "modechange",
+ " ",
+ "prior",
+ "next",
+ "end",
+ "home",
+ "left",
+ "up",
+ "right",
+ "down",
+ "slct",
+ "prnt",
+ "execute",
+ "snapshot",
+ "ins",
+ "del",
+ "help",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "lwin",
+ "rwin",
+ "apps",
+ "unk",
+ "unk",
+ "num0",
+ "num1",
+ "num2",
+ "num3",
+ "num4",
+ "num5",
+ "num6",
+ "num7",
+ "num8",
+ "num9",
+ "*",
+ "+",
+ "sep",
+ "-",
+ ",",
+ "/",
+ "f1",
+ "f2",
+ "f3",
+ "f4",
+ "f5",
+ "f6",
+ "f7",
+ "f8",
+ "f9",
+ "f10",
+ "f11",
+ "f12",
+ "f13",
+ "f14",
+ "f15",
+ "f16",
+ "f17",
+ "f18",
+ "f19",
+ "f20",
+ "f21",
+ "f22",
+ "f23",
+ "f24",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "numlock",
+ "scroll",
+ "oem_nec_equal",
+ "oem_fj_masshou",
+ "oem_fj_touroku",
+ "oem_fj_loya",
+ "oem_fj_roya",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "unk",
+ "lshift",
+ "rshift",
+ "lctrl",
+ "rctrl",
+ "lalt",
+ "ralt",
+};
+
+const char* const key_names[] = {
+ "unknown",
+ "mouse_1",
+ "mouse_2",
+ "cancel",
+ "mouse_3",
+ "mouse_4",
+ "mouse_5",
+ "unknown",
+ "back",
+ "tab",
+ "unknown",
+ "unknown",
+ "clear",
+ "return",
+ "unknown",
+ "unknown",
+ "shift",
+ "control",
+ "alt",
+ "pause",
+ "capital",
+ "kana",
+ "unknown",
+ "junja",
+ "final",
+ "kanji",
+ "unknown",
+ "escape",
+ "convert",
+ "nonconvert",
+ "accept",
+ "modechange",
+ "space",
+ "prior",
+ "next",
+ "end",
+ "home",
+ "left",
+ "up",
+ "right",
+ "down",
+ "select",
+ "print",
+ "execute",
+ "snapshot",
+ "insert",
+ "delete",
+ "help",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "lwin",
+ "rwin",
+ "apps",
+ "unknown",
+ "unknown",
+ "numpad0",
+ "numpad1",
+ "numpad2",
+ "numpad3",
+ "numpad4",
+ "numpad5",
+ "numpad6",
+ "numpad7",
+ "numpad8",
+ "numpad9",
+ "multiply",
+ "add",
+ "separator",
+ "subtract",
+ "decimal",
+ "divide",
+ "f1",
+ "f2",
+ "f3",
+ "f4",
+ "f5",
+ "f6",
+ "f7",
+ "f8",
+ "f9",
+ "f10",
+ "f11",
+ "f12",
+ "f13",
+ "f14",
+ "f15",
+ "f16",
+ "f17",
+ "f18",
+ "f19",
+ "f20",
+ "f21",
+ "f22",
+ "f23",
+ "f24",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "numlock",
+ "scroll",
+ "oem_nec_equal",
+ "oem_fj_masshou",
+ "oem_fj_touroku",
+ "oem_fj_loya",
+ "oem_fj_roya",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "unknown",
+ "lshift",
+ "rshift",
+ "lcontrol",
+ "rcontrol",
+ "lmenu",
+ "rmenu",
+};
+
+void c_input_manager::capture_mouse_move( ulong_t lparam ) {
+ m_mouse_pos[ 0 ] = LOWORD( lparam );
+ m_mouse_pos[ 1 ] = HIWORD( lparam );
+}
+
+void c_input_manager::clear_keys( ) {
+ memset( m_pressed_keys, 0, sizeof( m_pressed_keys ) );
+}
+
+bool c_input_manager::register_key_press( int key_event, int key )
+{
+ switch ( key_event ) {
+ case KEYDOWN: {
+ if ( is_valid_key( key ) )
+ m_pressed_keys[ key ] = true;
+ return true;
+ }
+ case KEYUP: {
+ if ( is_valid_key( key ) )
+ m_pressed_keys[ key ] = false;
+ return true;
+ }
+ case SYSKEYDOWN: { //WTF IS THIS STUPID SHIT, WHY IS ALT LITERALLY THE ONLY FUCKING KEY UNDER SYSKEYDOWN OUT OF ALL THE MODIFIER KEYS?
+ if ( key == KEYS_ALT )
+ m_pressed_keys[ key ] = true;
+ break;
+ }
+ case SYSKEYUP: {
+ if ( key == KEYS_ALT )
+ m_pressed_keys[ key ] = false;
+ break;
+ }
+ case LBUTTONDOWN:
+ m_pressed_keys[ KEYS_MOUSE1 ] = true;
+ return true;
+ case LBUTTONUP:
+ m_pressed_keys[ KEYS_MOUSE1 ] = false;
+ return true;
+ case RBUTTONDOWN:
+ m_pressed_keys[ KEYS_MOUSE2 ] = true;
+ return true;
+ case RBUTTONUP:
+ m_pressed_keys[ KEYS_MOUSE2 ] = false;
+ return true;
+ case MBUTTONDOWN:
+ m_pressed_keys[ KEYS_MOUSE3 ] = true;
+ return true;
+ case MBUTTONUP:
+ m_pressed_keys[ KEYS_MOUSE3 ] = false;
+ return true;
+ case XBUTTONDOWN: {
+ bool pressed_xbutton = static_cast<bool>( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true
+ m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = true;
+ return true;
+ }
+ case XBUTTONUP: {
+ bool pressed_xbutton = static_cast<bool>( HIWORD( key ) - 1 ); //should result in mouse4 as false, and mouse5 as true
+ m_pressed_keys[ pressed_xbutton ? KEYS_MOUSE5 : KEYS_MOUSE4 ] = false;
+ return true;
+ }
+ case MOUSEWHEEL: {
+ short scroll_input = ( short )HIWORD( key );
+ m_scroll_wheel_state = scroll_input > 0 ? 1 : -1;
+ return true;
+ }
+ }
+
+ return key_event == 0x200 || key_event == 0x203 || key_event == 0x206 || key_event == 0x209; //gotta block WM_MOUSEFIST | WM_LBUTTONDBLCLK | WM_RBUTTONDBLCLK | WM_MBUTTONDBLCLK
+}
+
+bool c_input_manager::is_key_pressed( int key ) {
+ auto k = key;
+ return is_valid_key( k ) && m_pressed_keys[ k ];
+}
+
+const char* c_input_manager::get_key_name( int key ) {
+ if ( !is_valid_key( key ) || key > KEYS_MAX )
+ return key_names[ KEYS_NONE ];
+
+ return key_names[ key ];
+}
+
+const char* c_input_manager::get_short_name( int key ) {
+ return key_names_short[ is_valid_key( key ) ? key : KEYS_NONE ];
+}
+
+VirtualKeys_t c_input_manager::is_any_key_pressed( ) {
+ for ( size_t i{ }; i < KEYS_MAX; ++i ) {
+ if ( m_pressed_keys[ i ] ) {
+ return VirtualKeys_t( i );
+ }
+ }
+
+ return KEYS_NONE;
+}
+
+int c_input_manager::get_scroll_state( ) {
+ int current_state = m_scroll_wheel_state;
+ m_scroll_wheel_state = 0;
+ return current_state;
+}
+
+char c_input_manager::get_pressed_char( int* out ) {
+ size_t pressed_character{ };
+ for ( size_t i{ }; i < KEYS_MAX; ++i ) {
+ if ( is_key_pressed( VirtualKeys_t( i ) ) ) {
+ if ( ( i >= KEYS_A && i <= KEYS_Z )
+ || ( i >= KEYS_N0 && i <= KEYS_N9 ) ) {
+ pressed_character = i;
+ }
+ }
+ }
+
+ if ( pressed_character ) {
+ if ( out ) {
+ *out = int( pressed_character );
+ }
+
+ if ( is_key_pressed( KEYS_SHIFT ) ) {
+ if ( pressed_character >= KEYS_A
+ && pressed_character <= KEYS_Z )
+ return char( pressed_character );
+
+ //gay way to shift it to symbols
+ if ( pressed_character >= KEYS_N0
+ && pressed_character <= KEYS_N9 ) {
+ switch ( pressed_character ) {
+ case KEYS_N0:
+ return ')';
+ case KEYS_N1:
+ return '!';
+ case KEYS_N2:
+ return '@';
+ case KEYS_N3:
+ return '#';
+ case KEYS_N4:
+ return '$';
+ case KEYS_N5:
+ return '%';
+ case KEYS_N6:
+ return '^';
+ case KEYS_N7:
+ return '&';
+ case KEYS_N8:
+ return '*';
+ case KEYS_N9:
+ return '(';
+ }
+ }
+ }
+ else {
+ if ( pressed_character >= KEYS_A
+ && pressed_character <= KEYS_Z )
+ return char( ::tolower( pressed_character ) );
+
+ if ( pressed_character >= KEYS_N0
+ && pressed_character <= KEYS_N9 )
+ return char( pressed_character );
+ }
+ }
+ else if ( is_key_pressed( KEYS_SPACE ) ) {
+ if ( out )
+ *out = KEYS_SPACE;
+
+ return ' ';
+ }
+ else if ( is_key_pressed( KEYS_BACK ) ) {
+ if ( out )
+ *out = KEYS_BACK;
+
+ return 0;
+ }
+
+ if ( out )
+ *out = KEYS_NONE;
+
+ return 0;
+}
+
+END_REGION \ No newline at end of file