feat(Protections): Added scripted game event protection
This commit is contained in:
parent
db13703b43
commit
55ab43563e
@ -13,6 +13,28 @@ namespace big
|
||||
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
|
||||
{
|
||||
DISABLED,
|
||||
|
@ -21,6 +21,26 @@ struct globals {
|
||||
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 {
|
||||
bool godmode = false;
|
||||
bool off_radar = false;
|
||||
@ -56,6 +76,7 @@ struct globals {
|
||||
|
||||
tunables tunables{};
|
||||
player player{};
|
||||
protections protections{};
|
||||
self self{};
|
||||
vehicle vehicle{};
|
||||
weapons weapons{};
|
||||
@ -63,6 +84,24 @@ struct globals {
|
||||
|
||||
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.no_idle_kick = j["tunables"]["no_idle_kick"];
|
||||
|
||||
@ -84,6 +123,27 @@ struct globals {
|
||||
nlohmann::json to_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", {
|
||||
{ "disable_phone", this->tunables.disable_phone },
|
||||
|
@ -59,7 +59,10 @@ namespace big
|
||||
// Report Cash Spawn Event
|
||||
m_report_cash_spawn_event_hook("RCSE", g_pointers->m_report_cash_spawn, &hooks::report_cash_spawn_handler),
|
||||
// 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_resizebuffers_index, &hooks::swapchain_resizebuffers);
|
||||
@ -96,6 +99,8 @@ namespace big
|
||||
m_report_cash_spawn_event_hook.enable();
|
||||
m_report_cheating_hook.enable();
|
||||
|
||||
m_scripted_game_event_hook.enable();
|
||||
|
||||
m_enabled = true;
|
||||
}
|
||||
|
||||
@ -103,6 +108,8 @@ namespace big
|
||||
{
|
||||
m_enabled = false;
|
||||
|
||||
m_scripted_game_event_hook.disable();
|
||||
|
||||
m_report_cheating_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 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
|
||||
@ -83,6 +85,8 @@ namespace big
|
||||
|
||||
detour_hook m_report_cash_spawn_event_hook;
|
||||
detour_hook m_report_cheating_hook;
|
||||
|
||||
detour_hook m_scripted_game_event_hook;
|
||||
};
|
||||
|
||||
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)>();
|
||||
});
|
||||
|
||||
// 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));
|
||||
|
||||
|
@ -43,6 +43,7 @@ namespace big
|
||||
|
||||
functions::increment_stat_event* m_increment_stat_event{};
|
||||
|
||||
PVOID m_scripted_game_event{};
|
||||
functions::trigger_script_event* m_trigger_script_event{};
|
||||
|
||||
// Received Event Signatures START
|
||||
|
Reference in New Issue
Block a user