2022-11-27 01:29:14 +08:00
|
|
|
#include "hotkey_service.hpp"
|
2023-03-26 13:45:46 -04:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
#include "fiber_pool.hpp"
|
|
|
|
#include "gui.hpp"
|
2022-11-29 20:48:58 +01:00
|
|
|
#include "network/ChatData.hpp"
|
|
|
|
#include "pointers.hpp"
|
2024-02-21 21:26:29 +01:00
|
|
|
#include "renderer/renderer.hpp"
|
2022-11-29 20:48:58 +01:00
|
|
|
|
2024-06-27 08:32:17 +00:00
|
|
|
#include <script/GtaThread.hpp>
|
|
|
|
|
2022-11-27 01:29:14 +08:00
|
|
|
namespace big
|
|
|
|
{
|
2023-03-01 21:27:15 +00:00
|
|
|
hotkey_service::hotkey_service()
|
|
|
|
{
|
2023-04-15 22:34:39 +02:00
|
|
|
// ordered alphabetically to more easily see if a certain hotkey is present
|
2024-03-12 09:42:11 +01:00
|
|
|
register_hotkey("beastjump", g.settings.hotkeys.beastjump, "beastjump"_J);
|
|
|
|
register_hotkey("bringpv", g.settings.hotkeys.bringvehicle, "bringpv"_J);
|
2024-05-09 02:06:25 -07:00
|
|
|
register_hotkey("clearwantedself", g.settings.hotkeys.clear_wanted, "clearwantedself"_J);
|
2024-03-12 09:42:11 +01:00
|
|
|
register_hotkey("cmdexecutor", g.settings.hotkeys.cmd_excecutor, "cmdexecutor"_J);
|
|
|
|
register_hotkey("fastquit", g.settings.hotkeys.fast_quit, "fastquit"_J);
|
|
|
|
register_hotkey("fastrun", g.settings.hotkeys.superrun, "fastrun"_J);
|
|
|
|
register_hotkey("fillammo", g.settings.hotkeys.fill_ammo, "fillammo"_J);
|
|
|
|
register_hotkey("fillsnacks", g.settings.hotkeys.fill_inventory, "fillsnacks"_J);
|
|
|
|
register_hotkey("freecam", g.settings.hotkeys.freecam, "freecam"_J);
|
|
|
|
register_hotkey("heal", g.settings.hotkeys.heal, "heal"_J);
|
|
|
|
register_hotkey("invis", g.settings.hotkeys.invis, "invis"_J);
|
|
|
|
register_hotkey("invisveh", g.settings.hotkeys.invisveh, "invisveh"_J);
|
|
|
|
register_hotkey("localinvisveh", g.settings.hotkeys.localinvisveh, "localinvisveh"_J);
|
|
|
|
register_hotkey("noclip", g.settings.hotkeys.noclip, "noclip"_J);
|
|
|
|
register_hotkey("objective", g.settings.hotkeys.teleport_objective, "objectivetp"_J);
|
|
|
|
register_hotkey("pvtp", g.settings.hotkeys.teleport_pv, "pvtp"_J);
|
|
|
|
register_hotkey("passive", g.settings.hotkeys.passive, "passive"_J);
|
|
|
|
register_hotkey("repairpv", g.settings.hotkeys.repairpv, "repairpv"_J);
|
|
|
|
register_hotkey("skipcutscene", g.settings.hotkeys.skip_cutscene, "skipcutscene"_J);
|
|
|
|
register_hotkey("superjump", g.settings.hotkeys.superjump, "superjump"_J);
|
|
|
|
register_hotkey("vehiclecontroller", g.settings.hotkeys.open_vehicle_controller, "vehiclecontrol"_J);
|
|
|
|
register_hotkey("vehiclefly", g.settings.hotkeys.vehicle_flymode, "vehiclefly"_J);
|
|
|
|
register_hotkey("waypoint", g.settings.hotkeys.teleport_waypoint, "waypointtp"_J);
|
|
|
|
register_hotkey("highlighttp", g.settings.hotkeys.teleport_selected, "highlighttp"_J);
|
2023-03-11 00:06:09 +01:00
|
|
|
|
2024-02-21 21:26:29 +01:00
|
|
|
g_renderer.add_wndproc_callback([this](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
2023-03-01 21:27:15 +00:00
|
|
|
wndproc(static_cast<eKeyState>(msg), wparam);
|
|
|
|
});
|
2022-12-16 18:55:55 +01:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
g_hotkey_service = this;
|
|
|
|
}
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
hotkey_service::~hotkey_service()
|
|
|
|
{
|
|
|
|
g_hotkey_service = nullptr;
|
|
|
|
}
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
void hotkey_service::register_hotkey(const std::string_view name, key_t key, rage::joaat_t command_hash, eKeyState state, std::optional<std::chrono::high_resolution_clock::duration> cooldown)
|
|
|
|
{
|
|
|
|
m_hotkeys[state == eKeyState::RELEASE].emplace(key, hotkey(rage::joaat(name), key, command_hash, cooldown));
|
|
|
|
}
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
bool hotkey_service::update_hotkey(const std::string_view name, const key_t key)
|
|
|
|
{
|
|
|
|
static auto update_hotkey_map = [](hotkey_map& hotkey_map, rage::joaat_t name_hash, key_t new_key) -> bool {
|
2023-08-19 11:01:08 +00:00
|
|
|
bool processed = false;
|
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
for (auto it = hotkey_map.begin(); it != hotkey_map.end(); ++it)
|
|
|
|
{
|
|
|
|
auto hotkey = it->second;
|
|
|
|
if (hotkey.name_hash() != name_hash)
|
|
|
|
continue;
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
hotkey_map.erase(it);
|
|
|
|
hotkey.set_key(new_key);
|
|
|
|
hotkey_map.emplace(new_key, hotkey);
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-08-19 11:01:08 +00:00
|
|
|
processed = true;
|
2023-03-01 21:27:15 +00:00
|
|
|
}
|
2023-08-19 11:01:08 +00:00
|
|
|
return processed;
|
2023-03-01 21:27:15 +00:00
|
|
|
};
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
const auto name_hash = rage::joaat(name);
|
2023-03-11 00:06:09 +01:00
|
|
|
return update_hotkey_map(m_hotkeys[1], name_hash, key) // released
|
|
|
|
&& update_hotkey_map(m_hotkeys[0], name_hash, key); // down
|
2023-03-01 21:27:15 +00:00
|
|
|
}
|
2022-11-27 01:29:14 +08:00
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
void hotkey_service::wndproc(eKeyState state, key_t key)
|
|
|
|
{
|
2023-04-14 18:54:07 +02:00
|
|
|
if (const auto chat_data = *g_pointers->m_gta.m_chat_data; chat_data && (chat_data->m_chat_open || chat_data->m_timer_two))
|
2023-03-01 21:27:15 +00:00
|
|
|
return;
|
2022-11-29 20:48:58 +01:00
|
|
|
|
2023-03-11 00:06:09 +01:00
|
|
|
//command executer is opened
|
|
|
|
if (g.cmd_executor.enabled)
|
|
|
|
return;
|
|
|
|
|
2023-09-20 10:27:39 -04:00
|
|
|
bool is_using_cellphone = false;
|
|
|
|
for (auto script : *g_pointers->m_gta.m_script_threads)
|
|
|
|
{
|
2024-03-12 09:42:11 +01:00
|
|
|
if (script && script->m_script_hash == "cellphone_flashhand"_J)
|
2023-09-20 10:27:39 -04:00
|
|
|
{
|
|
|
|
is_using_cellphone = script->m_context.m_state == rage::eThreadState::running;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (g_gui->is_open() || *g_pointers->m_gta.m_is_social_club_overlay_active || is_using_cellphone
|
|
|
|
|| g.settings.hotkeys.is_mp_chat_active)
|
2023-03-01 21:27:15 +00:00
|
|
|
return;
|
2023-01-22 21:57:32 +00:00
|
|
|
|
2024-08-05 09:15:42 +02:00
|
|
|
switch (state)
|
|
|
|
{
|
|
|
|
case WM_LBUTTONUP:
|
|
|
|
state = eKeyState::RELEASE;
|
|
|
|
key = VK_LBUTTON;
|
|
|
|
break;
|
|
|
|
case WM_RBUTTONUP:
|
|
|
|
state = eKeyState::RELEASE;
|
|
|
|
key = VK_RBUTTON;
|
|
|
|
break;
|
|
|
|
case WM_MBUTTONUP:
|
|
|
|
state = eKeyState::RELEASE;
|
|
|
|
key = VK_MBUTTON;
|
|
|
|
break;
|
|
|
|
case WM_XBUTTONUP:
|
|
|
|
state = eKeyState::RELEASE;
|
|
|
|
key = GET_XBUTTON_WPARAM(key) == XBUTTON1 ? VK_XBUTTON1 : VK_XBUTTON2;
|
|
|
|
break;
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
state = eKeyState::DOWN;
|
|
|
|
key = VK_LBUTTON;
|
|
|
|
break;
|
|
|
|
case WM_RBUTTONDOWN:
|
|
|
|
state = eKeyState::DOWN;
|
|
|
|
key = VK_RBUTTON;
|
|
|
|
break;
|
|
|
|
case WM_MBUTTONDOWN:
|
|
|
|
state = eKeyState::DOWN;
|
|
|
|
key = VK_MBUTTON;
|
|
|
|
break;
|
|
|
|
case WM_XBUTTONDOWN:
|
|
|
|
state = eKeyState::DOWN;
|
|
|
|
key = GET_XBUTTON_WPARAM(key) == XBUTTON1 ? VK_XBUTTON1 : VK_XBUTTON2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-03-01 21:27:15 +00:00
|
|
|
if (state == eKeyState::RELEASE || state == eKeyState::DOWN)
|
|
|
|
{
|
|
|
|
auto& hotkey_map = m_hotkeys[state == eKeyState::RELEASE];
|
2023-09-10 17:20:45 +02:00
|
|
|
for (auto [ it, end ] = hotkey_map.equal_range(key); it != end; ++it)
|
2023-03-01 21:27:15 +00:00
|
|
|
{
|
|
|
|
if (auto& hotkey = it->second; hotkey.can_exec())
|
|
|
|
{
|
|
|
|
g_fiber_pool->queue_job([&hotkey] {
|
|
|
|
hotkey.exec();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-21 21:26:29 +01:00
|
|
|
}
|