No more GetKeyState/GetAsyncKeyState
I’ve seen too many people use these functions, so I’ve decided to post about this.
Luckily, the game already keeps track of which buttons are down or not, which is handled in CInputSystem:
bool CInputSystem::IsButtonDown( ButtonCode_t code ) const
{
return m_InputState[INPUT_STATE_CURRENT].m_ButtonState.IsBitSet( code );
}
It’s also handy since when you’re tabbed out for example, the buttons won’t be updated, so you won’t be aimbotting when you’re going about in Windows.
Internally, you can get this interface via the vstdlib.dll’s factory (or appsystem): InputSystemVersion001
Then, you can call bool IsButtonDown(ButtonCode_t code) at vtable index 15.
Externally, you also need the interface pointer (I use a reversed version of CreateInterface, it’s also posted here if you need it, search!). Once you have the interface pointer, here’s a reversed version of IsButtonDown:
bool is_button_down(const buttoncode_t& button)
{
auto a2 = static_cast(button);
DWORD result;
if (!get_memory_manager()->read_raw(get_pointer() + (((a2 >> 5) * sizeof(DWORD)) + offsets::button_bits), &result, sizeof(result))) return false;
return ((1 << (a2 & 0x1F)) & result) != 0;
}
get_pointer() being the interface pointer.
offsets::button_bits:
GET_OFFSET_FROM_PATTERN(offsets::button_bits, inputsystem, "8D 9F ? ? ? ? 69 C0 ? ? ? ? 03 D8 8B C2 C1 F8 05", 0x0, 0, false, false, true);
offsets::button_bits = inputsystem->dereference_file_offset(offsets::button_bits + 2) + inputsystem->dereference_file_offset(offsets::button_bits + 8);
in inputsystem.dll.
ButtonCode_t:
enum ButtonCode_t
{
BUTTON_CODE_INVALID = -1,
BUTTON_CODE_NONE = 0,
KEY_FIRST = 0,
KEY_NONE = KEY_FIRST,
KEY_0,
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_A,
KEY_B,
KEY_C,
KEY_D,
KEY_E,
KEY_F,
KEY_G,
KEY_H,
KEY_I,
KEY_J,
KEY_K,
KEY_L,
KEY_M,
KEY_N,
KEY_O,
KEY_P,
KEY_Q,
KEY_R,
KEY_S,
KEY_T,
KEY_U,
KEY_V,
KEY_W,
KEY_X,
KEY_Y,
KEY_Z,
KEY_PAD_0,
KEY_PAD_1,
KEY_PAD_2,
KEY_PAD_3,
KEY_PAD_4,
KEY_PAD_5,
KEY_PAD_6,
KEY_PAD_7,
KEY_PAD_8,
KEY_PAD_9,
KEY_PAD_DIVIDE,
KEY_PAD_MULTIPLY,
KEY_PAD_MINUS,
KEY_PAD_PLUS,
KEY_PAD_ENTER,
KEY_PAD_DECIMAL,
KEY_LBRACKET,
KEY_RBRACKET,
KEY_SEMICOLON,
KEY_APOSTROPHE,
KEY_BACKQUOTE,
KEY_COMMA,
KEY_PERIOD,
KEY_SLASH,
KEY_BACKSLASH,
KEY_MINUS,
KEY_EQUAL,
KEY_ENTER,
KEY_SPACE,
KEY_BACKSPACE,
KEY_TAB,
KEY_CAPSLOCK,
KEY_NUMLOCK,
KEY_ESCAPE,
KEY_SCROLLLOCK,
KEY_INSERT,
KEY_DELETE,
KEY_HOME,
KEY_END,
KEY_PAGEUP,
KEY_PAGEDOWN,
KEY_BREAK,
KEY_LSHIFT,
KEY_RSHIFT,
KEY_LALT,
KEY_RALT,
KEY_LCONTROL,
KEY_RCONTROL,
KEY_LWIN,
KEY_RWIN,
KEY_APP,
KEY_UP,
KEY_LEFT,
KEY_DOWN,
KEY_RIGHT,
KEY_F1,
KEY_F2,
KEY_F3,
KEY_F4,
KEY_F5,
KEY_F6,
KEY_F7,
KEY_F8,
KEY_F9,
KEY_F10,
KEY_F11,
KEY_F12,
KEY_CAPSLOCKTOGGLE,
KEY_NUMLOCKTOGGLE,
KEY_SCROLLLOCKTOGGLE,
KEY_LAST = KEY_SCROLLLOCKTOGGLE,
KEY_COUNT = KEY_LAST - KEY_FIRST + 1,
// Mouse
MOUSE_FIRST = KEY_LAST + 1,
MOUSE_LEFT = MOUSE_FIRST,
MOUSE_RIGHT,
MOUSE_MIDDLE,
MOUSE_4,
MOUSE_5,
MOUSE_WHEEL_UP, // A fake button which is 'pressed' and 'released' when the wheel is moved up
MOUSE_WHEEL_DOWN, // A fake button which is 'pressed' and 'released' when the wheel is moved down
MOUSE_LAST = MOUSE_WHEEL_DOWN,
MOUSE_COUNT = MOUSE_LAST - MOUSE_FIRST + 1,
};
|
|
|