feat(Protections): Added scripted game event protection
This commit is contained in:
parent
db13703b43
commit
55ab43563e
@ -13,6 +13,28 @@ namespace big
|
|||||||
VEHICLE_GUN
|
VEHICLE_GUN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class RemoteEvent : int64_t
|
||||||
|
{
|
||||||
|
Bounty = -1906146218,
|
||||||
|
CeoBan = 1355230914,
|
||||||
|
CeoKick = -316948135,
|
||||||
|
CeoMoney = 1152266822,
|
||||||
|
ClearWantedLevel = 1187364773,
|
||||||
|
FakeDeposit = 153488394,
|
||||||
|
ForceMission = -1147284669,
|
||||||
|
GtaBanner = 1659915470,
|
||||||
|
PersonalVehicleDestroyed = 299217086,
|
||||||
|
RemoteOffradar = -397188359,
|
||||||
|
RotateCam = -1320260596,
|
||||||
|
SendToCutscene = 1889984715,
|
||||||
|
SendToIsland = -1479371259,
|
||||||
|
SoundSpam = 1537221257,
|
||||||
|
Spectate = -148441291,
|
||||||
|
Teleport = 1249026189,
|
||||||
|
TransactionError = -2041535807,
|
||||||
|
VehicleKick = -1005623606
|
||||||
|
};
|
||||||
|
|
||||||
enum class SpeedoMeter
|
enum class SpeedoMeter
|
||||||
{
|
{
|
||||||
DISABLED,
|
DISABLED,
|
||||||
|
@ -21,6 +21,26 @@ struct globals {
|
|||||||
bool spectating = false;
|
bool spectating = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct protections {
|
||||||
|
bool bounty = true;
|
||||||
|
bool ceo_ban = true;
|
||||||
|
bool ceo_kick = true;
|
||||||
|
bool ceo_money = true;
|
||||||
|
bool clear_wanted_level = true;
|
||||||
|
bool fake_deposit = true;
|
||||||
|
bool force_mission = true;
|
||||||
|
bool force_teleport = true;
|
||||||
|
bool gta_banner = true;
|
||||||
|
bool personal_vehicle_destroyed = true;
|
||||||
|
bool remote_off_radar = true;
|
||||||
|
bool send_to_cutscene = true;
|
||||||
|
bool send_to_island = true;
|
||||||
|
bool sound_spam = true;
|
||||||
|
bool spectate = true;
|
||||||
|
bool transaction_error = true;
|
||||||
|
bool vehicle_kick = true;
|
||||||
|
};
|
||||||
|
|
||||||
struct self {
|
struct self {
|
||||||
bool godmode = false;
|
bool godmode = false;
|
||||||
bool off_radar = false;
|
bool off_radar = false;
|
||||||
@ -56,6 +76,7 @@ struct globals {
|
|||||||
|
|
||||||
tunables tunables{};
|
tunables tunables{};
|
||||||
player player{};
|
player player{};
|
||||||
|
protections protections{};
|
||||||
self self{};
|
self self{};
|
||||||
vehicle vehicle{};
|
vehicle vehicle{};
|
||||||
weapons weapons{};
|
weapons weapons{};
|
||||||
@ -63,6 +84,24 @@ struct globals {
|
|||||||
|
|
||||||
void from_json(const nlohmann::json& j)
|
void from_json(const nlohmann::json& j)
|
||||||
{
|
{
|
||||||
|
this->protections.bounty = j["protections"]["bounty"];
|
||||||
|
this->protections.ceo_ban = j["protections"]["ceo_ban"];
|
||||||
|
this->protections.ceo_kick = j["protections"]["ceo_kick"];
|
||||||
|
this->protections.ceo_money = j["protections"]["ceo_money"];
|
||||||
|
this->protections.clear_wanted_level = j["protections"]["clear_wanted_level"];
|
||||||
|
this->protections.fake_deposit = j["protections"]["fake_deposit"];
|
||||||
|
this->protections.force_mission = j["protections"]["force_mission"];
|
||||||
|
this->protections.force_teleport = j["protections"]["force_teleport"];
|
||||||
|
this->protections.gta_banner = j["protections"]["gta_banner"];
|
||||||
|
this->protections.personal_vehicle_destroyed = j["protections"]["personal_vehicle_destroyed"];
|
||||||
|
this->protections.remote_off_radar = j["protections"]["remote_off_radar"];
|
||||||
|
this->protections.send_to_cutscene = j["protections"]["send_to_cutscene"];
|
||||||
|
this->protections.send_to_island = j["protections"]["send_to_island"];
|
||||||
|
this->protections.sound_spam = j["protections"]["sound_spam"];
|
||||||
|
this->protections.spectate = j["protections"]["spectate"];
|
||||||
|
this->protections.transaction_error = j["protections"]["transaction_error"];
|
||||||
|
this->protections.vehicle_kick = j["protections"]["vehicle_kick"];
|
||||||
|
|
||||||
this->tunables.disable_phone = j["tunables"]["disable_phone"];
|
this->tunables.disable_phone = j["tunables"]["disable_phone"];
|
||||||
this->tunables.no_idle_kick = j["tunables"]["no_idle_kick"];
|
this->tunables.no_idle_kick = j["tunables"]["no_idle_kick"];
|
||||||
|
|
||||||
@ -84,6 +123,27 @@ struct globals {
|
|||||||
nlohmann::json to_json()
|
nlohmann::json to_json()
|
||||||
{
|
{
|
||||||
return nlohmann::json{
|
return nlohmann::json{
|
||||||
|
{
|
||||||
|
"protections", {
|
||||||
|
{ "bounty", this->protections.bounty },
|
||||||
|
{ "ceo_ban", this->protections.ceo_ban },
|
||||||
|
{ "ceo_kick", this->protections.ceo_kick },
|
||||||
|
{ "ceo_money", this->protections.ceo_money },
|
||||||
|
{ "clear_wanted_level", this->protections.clear_wanted_level },
|
||||||
|
{ "fake_deposit", this->protections.fake_deposit },
|
||||||
|
{ "force_mission", this->protections.force_mission },
|
||||||
|
{ "force_teleport", this->protections.force_teleport },
|
||||||
|
{ "gta_banner", this->protections.gta_banner },
|
||||||
|
{ "personal_vehicle_destroyed", this->protections.personal_vehicle_destroyed },
|
||||||
|
{ "remote_off_radar", this->protections.remote_off_radar },
|
||||||
|
{ "send_to_cutscene", this->protections.send_to_cutscene },
|
||||||
|
{ "send_to_island", this->protections.send_to_island },
|
||||||
|
{ "sound_spam", this->protections.sound_spam },
|
||||||
|
{ "spectate", this->protections.spectate },
|
||||||
|
{ "transaction_error", this->protections.transaction_error },
|
||||||
|
{ "vehicle_kick", this->protections.vehicle_kick }
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"tunables", {
|
"tunables", {
|
||||||
{ "disable_phone", this->tunables.disable_phone },
|
{ "disable_phone", this->tunables.disable_phone },
|
||||||
|
@ -59,7 +59,10 @@ namespace big
|
|||||||
// Report Cash Spawn Event
|
// Report Cash Spawn Event
|
||||||
m_report_cash_spawn_event_hook("RCSE", g_pointers->m_report_cash_spawn, &hooks::report_cash_spawn_handler),
|
m_report_cash_spawn_event_hook("RCSE", g_pointers->m_report_cash_spawn, &hooks::report_cash_spawn_handler),
|
||||||
// Report Cheating Hook
|
// Report Cheating Hook
|
||||||
m_report_cheating_hook("RC", g_pointers->m_report_cheating, &hooks::report_cheating_handler)
|
m_report_cheating_hook("RC", g_pointers->m_report_cheating, &hooks::report_cheating_handler),
|
||||||
|
|
||||||
|
// Scripted Game Event Hook
|
||||||
|
m_scripted_game_event_hook("SGEH", g_pointers->m_scripted_game_event, &hooks::scripted_game_event)
|
||||||
{
|
{
|
||||||
m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present);
|
m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present);
|
||||||
m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers);
|
m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers);
|
||||||
@ -96,6 +99,8 @@ namespace big
|
|||||||
m_report_cash_spawn_event_hook.enable();
|
m_report_cash_spawn_event_hook.enable();
|
||||||
m_report_cheating_hook.enable();
|
m_report_cheating_hook.enable();
|
||||||
|
|
||||||
|
m_scripted_game_event_hook.enable();
|
||||||
|
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +108,8 @@ namespace big
|
|||||||
{
|
{
|
||||||
m_enabled = false;
|
m_enabled = false;
|
||||||
|
|
||||||
|
m_scripted_game_event_hook.disable();
|
||||||
|
|
||||||
m_report_cheating_hook.disable();
|
m_report_cheating_hook.disable();
|
||||||
m_report_cash_spawn_event_hook.disable();
|
m_report_cash_spawn_event_hook.disable();
|
||||||
|
|
||||||
|
@ -43,6 +43,8 @@ namespace big
|
|||||||
|
|
||||||
static bool report_cash_spawn_handler(__int64 creport_cash_spawn_event, CNetGamePlayer* source_player);
|
static bool report_cash_spawn_handler(__int64 creport_cash_spawn_event, CNetGamePlayer* source_player);
|
||||||
static void report_cheating_handler(__int64 a1, unsigned int a2, unsigned int a3, unsigned int a4);
|
static void report_cheating_handler(__int64 a1, unsigned int a2, unsigned int a3, unsigned int a4);
|
||||||
|
|
||||||
|
static bool scripted_game_event(CScriptedGameEvent* scripted_game_event, CNetGamePlayer* player);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct minhook_keepalive
|
struct minhook_keepalive
|
||||||
@ -83,6 +85,8 @@ namespace big
|
|||||||
|
|
||||||
detour_hook m_report_cash_spawn_event_hook;
|
detour_hook m_report_cash_spawn_event_hook;
|
||||||
detour_hook m_report_cheating_hook;
|
detour_hook m_report_cheating_hook;
|
||||||
|
|
||||||
|
detour_hook m_scripted_game_event_hook;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline hooking *g_hooking{};
|
inline hooking *g_hooking{};
|
||||||
|
130
BigBaseV2/src/hooks/script_event_handler.cpp
Normal file
130
BigBaseV2/src/hooks/script_event_handler.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#include "hooking.hpp"
|
||||||
|
#include "gta/enums.hpp"
|
||||||
|
#include "util/notify.hpp"
|
||||||
|
|
||||||
|
namespace big
|
||||||
|
{
|
||||||
|
bool hooks::scripted_game_event(CScriptedGameEvent* scripted_game_event, CNetGamePlayer* player)
|
||||||
|
{
|
||||||
|
auto args = scripted_game_event->m_args;
|
||||||
|
|
||||||
|
RemoteEvent hash = (RemoteEvent)args[0];
|
||||||
|
|
||||||
|
char type[32] = "";
|
||||||
|
|
||||||
|
|
||||||
|
switch (hash)
|
||||||
|
{
|
||||||
|
case RemoteEvent::Bounty:
|
||||||
|
if (g.protections.bounty)
|
||||||
|
strcpy(type, "Bounty");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::CeoBan:
|
||||||
|
if (g.protections.ceo_ban)
|
||||||
|
strcpy(type, "Ceo Ban");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::CeoKick:
|
||||||
|
if (g.protections.ceo_kick)
|
||||||
|
strcpy(type, "Ceo Kick");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::CeoMoney:
|
||||||
|
if (g.protections.ceo_money)
|
||||||
|
strcpy(type, "Ceo Money");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::ClearWantedLevel:
|
||||||
|
if (g.protections.clear_wanted_level)
|
||||||
|
strcpy(type, "Clear Wanted Level");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::FakeDeposit:
|
||||||
|
if (g.protections.fake_deposit)
|
||||||
|
strcpy(type, "Fake Deposit");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::ForceMission:
|
||||||
|
if (g.protections.force_mission)
|
||||||
|
strcpy(type, "Force Mission");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::GtaBanner:
|
||||||
|
if (g.protections.gta_banner)
|
||||||
|
strcpy(type, "GTA Banner");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::PersonalVehicleDestroyed:
|
||||||
|
if (g.protections.personal_vehicle_destroyed)
|
||||||
|
strcpy(type, "Personal Vehicle Destroyed");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::RemoteOffradar:
|
||||||
|
if (g.protections.remote_off_radar)
|
||||||
|
strcpy(type, "Remote Off Radar");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::SendToCutscene:
|
||||||
|
if (g.protections.send_to_cutscene)
|
||||||
|
strcpy(type, "Send To Cutscene");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::SendToIsland:
|
||||||
|
if (g.protections.send_to_island)
|
||||||
|
strcpy(type, "Send To Island");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::SoundSpam:
|
||||||
|
if (g.protections.sound_spam)
|
||||||
|
strcpy(type, "Sound Spam");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::Spectate:
|
||||||
|
if (g.protections.spectate)
|
||||||
|
strcpy(type, "Specate");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::Teleport:
|
||||||
|
if (g.protections.force_teleport)
|
||||||
|
strcpy(type, "Force Teleport");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::TransactionError:
|
||||||
|
if (g.protections.transaction_error)
|
||||||
|
strcpy(type, "Transaction Error");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case RemoteEvent::VehicleKick:
|
||||||
|
if (g.protections.vehicle_kick)
|
||||||
|
strcpy(type, "Vehicle Kick");
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(type) != 0)
|
||||||
|
{
|
||||||
|
char msg[128];
|
||||||
|
strcpy(msg, "~g~BLOCKED SCRIPT EVENT~s~\nFrom: <C>");
|
||||||
|
strcat(msg, player->get_name());
|
||||||
|
strcat(msg, "</C>\nEvent Type: ~b~");
|
||||||
|
strcat(msg, type);
|
||||||
|
|
||||||
|
notify::above_map(msg);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false)
|
||||||
|
{
|
||||||
|
LOG(INFO) << "Received Script Event";
|
||||||
|
LOG(INFO) << "Player: " << player->get_name();
|
||||||
|
LOG(INFO) << "Hash: " << (int64_t)hash;
|
||||||
|
|
||||||
|
for (int i = 1; i < sizeof(args); i++)
|
||||||
|
LOG(INFO) << "Arg #" << i << ": " << args[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_hooking->m_scripted_game_event_hook.get_original<decltype(&hooks::scripted_game_event)>()(scripted_game_event, player);
|
||||||
|
}
|
||||||
|
}
|
@ -179,6 +179,12 @@ namespace big
|
|||||||
{
|
{
|
||||||
m_report_cheating = ptr.as<decltype(m_report_cheating)>();
|
m_report_cheating = ptr.as<decltype(m_report_cheating)>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Scripted Game Event Handler
|
||||||
|
main_batch.add("SGEH", "40 53 48 81 EC ? ? ? ? 44 8B 81 ? ? ? ? 4C 8B CA 41 8D 40 FF 3D ? ? ? ? 77 42", [this](memory::handle ptr)
|
||||||
|
{
|
||||||
|
m_scripted_game_event = ptr.as<decltype(m_scripted_game_event)>();
|
||||||
|
});
|
||||||
|
|
||||||
main_batch.run(memory::module(nullptr));
|
main_batch.run(memory::module(nullptr));
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ namespace big
|
|||||||
|
|
||||||
functions::increment_stat_event* m_increment_stat_event{};
|
functions::increment_stat_event* m_increment_stat_event{};
|
||||||
|
|
||||||
|
PVOID m_scripted_game_event{};
|
||||||
functions::trigger_script_event* m_trigger_script_event{};
|
functions::trigger_script_event* m_trigger_script_event{};
|
||||||
|
|
||||||
// Received Event Signatures START
|
// Received Event Signatures START
|
||||||
|
Reference in New Issue
Block a user