Harass players and spam killfeed (#3161)
This commit is contained in:
parent
54c7dada82
commit
1cc7532a1e
23
src/backend/looped/session/harass_players.cpp
Normal file
23
src/backend/looped/session/harass_players.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "backend/looped_command.hpp"
|
||||
#include "natives.hpp"
|
||||
#include "services/players/player_service.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
class harass_players : looped_command
|
||||
{
|
||||
using looped_command::looped_command;
|
||||
|
||||
virtual void on_enable() override
|
||||
{
|
||||
for (auto& player : g_player_service->players())
|
||||
NETWORK::NETWORK_CONCEAL_PLAYER(player.second->id(), false, false); // disable interior instance separation
|
||||
}
|
||||
|
||||
virtual void on_tick() override
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
harass_players g_harass_players("harass", "HARASS_PLAYERS", "HARASS_PLAYERS_DESC", g.session.harass_players);
|
||||
}
|
@ -68,6 +68,7 @@ namespace big
|
||||
int player_count = 0;
|
||||
|
||||
CNetGamePlayer* m_syncing_player = nullptr;
|
||||
std::uint8_t m_sync_target_player = -1;
|
||||
eNetObjType m_syncing_object_type = (eNetObjType)-1;
|
||||
|
||||
int m_remote_controller_vehicle = -1;
|
||||
@ -447,6 +448,8 @@ namespace big
|
||||
bool semi_godmode_all = false;
|
||||
bool wanted_level_all = false;
|
||||
bool vehicle_fix_all = false;
|
||||
bool harass_players = false;
|
||||
bool spam_killfeed = false;
|
||||
|
||||
bool show_cheating_message = false;
|
||||
bool anonymous_bounty = true;
|
||||
|
@ -212,4 +212,6 @@ namespace big::functions
|
||||
using can_create_vehicle = bool (*)();
|
||||
|
||||
using get_searchlight = void* (*) (CPed*);
|
||||
|
||||
using get_sector_data = void (*) (rage::fvector3* coords, std::uint16_t* x, std::uint16_t* y, std::uint16_t* z, rage::fvector3* sector_pos);
|
||||
}
|
||||
|
@ -295,7 +295,7 @@ namespace rage
|
||||
float max = (1 << length) - 1;
|
||||
int integer = (int)((value / divisor) * max);
|
||||
|
||||
Write<int>(length, integer);
|
||||
Write<int>(integer, length);
|
||||
}
|
||||
|
||||
inline float ReadSignedFloat(int length, float divisor)
|
||||
@ -311,7 +311,7 @@ namespace rage
|
||||
float max = (1 << (length - 1)) - 1;
|
||||
int integer = (int)((value / divisor) * max);
|
||||
|
||||
WriteSigned<int>(length, integer);
|
||||
WriteSigned<int>(integer, length);
|
||||
}
|
||||
|
||||
public:
|
||||
|
@ -109,7 +109,6 @@ namespace big
|
||||
PVOID m_native_return;
|
||||
PVOID m_ctext_file_ptr;
|
||||
PVOID m_get_label_text;
|
||||
functions::write_player_game_state_data_node m_write_player_game_state_data_node;
|
||||
|
||||
ChatData** m_chat_data;
|
||||
ScInfo* m_sc_info;
|
||||
@ -128,8 +127,6 @@ namespace big
|
||||
|
||||
functions::get_gameplay_cam_coords m_get_gameplay_cam_coords;
|
||||
|
||||
PVOID m_write_player_gamer_data_node;
|
||||
|
||||
functions::trigger_script_event m_trigger_script_event;
|
||||
|
||||
// Bitbuffer Read/Write START
|
||||
@ -262,16 +259,11 @@ namespace big
|
||||
|
||||
PVOID m_receive_pickup;
|
||||
|
||||
PVOID m_write_player_camera_data_node;
|
||||
|
||||
PVOID m_send_player_card_stats;
|
||||
bool* m_force_player_card_refresh;
|
||||
|
||||
PVOID m_serialize_stats;
|
||||
|
||||
PVOID m_write_player_creation_data_node;
|
||||
PVOID m_write_player_appearance_data_node;
|
||||
|
||||
PVOID m_enumerate_audio_devices;
|
||||
PVOID m_direct_sound_capture_create;
|
||||
bool* m_refresh_audio_input;
|
||||
@ -377,7 +369,10 @@ namespace big
|
||||
|
||||
GenericPool** m_vehicle_allocator; // this is not a normal pool
|
||||
|
||||
PVOID m_write_physical_script_game_state_data_node;
|
||||
PVOID m_write_node_data;
|
||||
PVOID m_can_send_node_to_player;
|
||||
PVOID m_write_node;
|
||||
functions::get_sector_data m_get_sector_data;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
static_assert(sizeof(gta_pointers) % 8 == 0, "Pointers are not properly aligned");
|
||||
|
@ -42,8 +42,6 @@ namespace big
|
||||
|
||||
detour_hook_helper::add<hooks::get_label_text>("GLT", g_pointers->m_gta.m_get_label_text);
|
||||
|
||||
detour_hook_helper::add<hooks::write_player_game_state_data_node>("WPGSDN", g_pointers->m_gta.m_write_player_game_state_data_node);
|
||||
|
||||
detour_hook_helper::add<hooks::gta_thread_start>("GTS", g_pointers->m_gta.m_gta_thread_start);
|
||||
detour_hook_helper::add<hooks::gta_thread_kill>("GTK", g_pointers->m_gta.m_gta_thread_kill);
|
||||
detour_hook_helper::add<hooks::init_native_tables>("INT", g_pointers->m_gta.m_init_native_tables);
|
||||
@ -63,7 +61,6 @@ namespace big
|
||||
detour_hook_helper::add<hooks::can_apply_data>("CAD", g_pointers->m_gta.m_can_apply_data);
|
||||
|
||||
detour_hook_helper::add<hooks::get_network_event_data>("GNED", g_pointers->m_gta.m_get_network_event_data);
|
||||
detour_hook_helper::add<hooks::write_player_gamer_data_node>("WPGDN", g_pointers->m_gta.m_write_player_gamer_data_node);
|
||||
|
||||
detour_hook_helper::add<hooks::invalid_decal>("IDC", g_pointers->m_gta.m_invalid_decal_crash);
|
||||
detour_hook_helper::add<hooks::task_parachute_object>("TPO", g_pointers->m_gta.m_task_parachute_object);
|
||||
@ -102,14 +99,9 @@ namespace big
|
||||
|
||||
detour_hook_helper::add<hooks::receive_pickup>("RPI", g_pointers->m_gta.m_receive_pickup);
|
||||
|
||||
detour_hook_helper::add<hooks::write_player_camera_data_node>("WPCDN", g_pointers->m_gta.m_write_player_camera_data_node);
|
||||
|
||||
detour_hook_helper::add<hooks::send_player_card_stats>("SPCS", g_pointers->m_gta.m_send_player_card_stats);
|
||||
detour_hook_helper::add<hooks::serialize_stats>("SS", g_pointers->m_gta.m_serialize_stats);
|
||||
|
||||
detour_hook_helper::add<hooks::write_player_creation_data_node>("WPCDN", g_pointers->m_gta.m_write_player_creation_data_node);
|
||||
detour_hook_helper::add<hooks::write_player_appearance_data_node>("WPADN", g_pointers->m_gta.m_write_player_appearance_data_node);
|
||||
|
||||
detour_hook_helper::add<hooks::get_model_info>("GMI", g_pointers->m_gta.m_get_model_info);
|
||||
|
||||
detour_hook_helper::add<hooks::task_jump_constructor>("TJC", g_pointers->m_gta.m_taskjump_constructor);
|
||||
@ -146,8 +138,9 @@ namespace big
|
||||
|
||||
detour_hook_helper::add<hooks::searchlight_crash>("SLC", g_pointers->m_gta.m_searchlight_crash);
|
||||
|
||||
detour_hook_helper::add<hooks::write_physical_script_game_state_data_node>("WPSGSDN", g_pointers->m_gta.m_write_physical_script_game_state_data_node);
|
||||
|
||||
detour_hook_helper::add<hooks::write_node_data>("WND", g_pointers->m_gta.m_write_node_data);
|
||||
detour_hook_helper::add<hooks::can_send_node_to_player>("CSNTP", g_pointers->m_gta.m_can_send_node_to_player);
|
||||
detour_hook_helper::add<hooks::write_node>("WN", g_pointers->m_gta.m_write_node);
|
||||
g_hooking = this;
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,7 @@ namespace rage
|
||||
class netEventMgr;
|
||||
class json_serializer;
|
||||
class netGameEvent;
|
||||
class netSyncDataNode;
|
||||
}
|
||||
|
||||
namespace big
|
||||
@ -101,9 +102,7 @@ namespace big
|
||||
static eAckCode received_clone_sync(CNetworkObjectMgr* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, eNetObjType object_type, uint16_t object_id, rage::datBitBuffer* bufer, uint16_t unk, uint32_t timestamp);
|
||||
static bool can_apply_data(rage::netSyncTree* tree, rage::netObject* object);
|
||||
|
||||
static void write_player_gamer_data_node(rage::netObject* player, CPlayerGamerDataNode* node);
|
||||
static void write_player_game_state_data_node(rage::netObject* player, CPlayerGameStateDataNode* node);
|
||||
|
||||
static void invalid_mods_crash_detour(int64_t a1, int64_t a2, int a3, char a4);
|
||||
static void invalid_decal(uintptr_t a1, int a2);
|
||||
static int task_parachute_object(uint64_t _this, int a2, int a3);
|
||||
static int task_ambient_clips(uint64_t _this, int a2, int a3);
|
||||
@ -141,14 +140,9 @@ namespace big
|
||||
|
||||
static bool receive_pickup(rage::netObject* netobject, void* unk, CPed* ped);
|
||||
|
||||
static void write_player_camera_data_node(rage::netObject* player, CPlayerCameraDataNode* node);
|
||||
|
||||
static rage::netGameEvent* send_player_card_stats(rage::netGameEvent* a1, CPlayerCardStats* stats);
|
||||
static void serialize_stats(CStatsSerializationContext* context, rage::joaat_t* stats, uint32_t stat_count);
|
||||
|
||||
static void write_player_creation_data_node(rage::netObject* player, CPlayerCreationDataNode* node);
|
||||
static void write_player_appearance_data_node(rage::netObject* player, CPlayerAppearanceDataNode* node);
|
||||
|
||||
static __int64 task_jump_constructor(uint64_t a1, int a2);
|
||||
|
||||
static void* task_fall_constructor(uint64_t a1, int a2);
|
||||
@ -197,9 +191,10 @@ namespace big
|
||||
|
||||
static void format_int(int64_t integer_to_format, char* format_string, size_t size_always_64, bool use_commas);
|
||||
|
||||
static void write_node_data(void* data_node, rage::netObject* net_object, rage::datBitBuffer* buffer, void* log, bool update);
|
||||
static bool can_send_node_to_player(void* node, rage::netObject* object, std::uint8_t player, int sync_type, int a5, int a6);
|
||||
static bool write_node(rage::netSyncDataNode* node, int sync_type, int a3, rage::netObject* object, rage::datBitBuffer* buffer, int a6, void* log, std::uint8_t player, int* a9, int* a10);
|
||||
static void searchlight_crash(void* a1, CPed* ped);
|
||||
|
||||
static void write_physical_script_game_state_data_node(rage::CPhysical* this_ptr, CPhysicalScriptGameStateDataNode* node);
|
||||
};
|
||||
|
||||
class minhook_keepalive
|
||||
|
31
src/hooks/spoofing/can_send_node_to_player.cpp
Normal file
31
src/hooks/spoofing/can_send_node_to_player.cpp
Normal file
@ -0,0 +1,31 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "util/sync_trees.hpp"
|
||||
#include "services/players/player_service.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
bool hooks::can_send_node_to_player(void* node, rage::netObject* object, std::uint8_t player, int sync_type, int a5, int a6)
|
||||
{
|
||||
if (g.session.harass_players)
|
||||
{
|
||||
auto& type = sync_node_finder::find(reinterpret_cast<uint64_t>(node));
|
||||
|
||||
if (type == sync_node_id("CPedGameStateDataNode") || type == sync_node_id("CSectorDataNode") || type == sync_node_id("CPlayerSectorPosNode"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (auto plyr = g_player_service->get_by_id(player); (plyr && plyr->spam_killfeed) || g.session.spam_killfeed)
|
||||
{
|
||||
auto& type = sync_node_finder::find(reinterpret_cast<uint64_t>(node));
|
||||
|
||||
if (type == sync_node_id("CPedHealthDataNode"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return g_hooking->get_original<hooks::can_send_node_to_player>()(node, object, player, sync_type, a5, a6);
|
||||
}
|
||||
}
|
42
src/hooks/spoofing/write_node.cpp
Normal file
42
src/hooks/spoofing/write_node.cpp
Normal file
@ -0,0 +1,42 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "util/sync_trees.hpp"
|
||||
#include "services/players/player_service.hpp"
|
||||
#include <netsync/netSyncDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
bool hooks::write_node(rage::netSyncDataNode* node, int sync_type, int a3, rage::netObject* object, rage::datBitBuffer* buffer, int a6, void* log, std::uint8_t player, int* a9, int* a10)
|
||||
{
|
||||
uint64_t old_sync_cache_val = 0;
|
||||
g.m_sync_target_player = player;
|
||||
|
||||
if (g.session.harass_players)
|
||||
{
|
||||
auto& type = sync_node_finder::find(reinterpret_cast<uint64_t>(node));
|
||||
|
||||
if (type == sync_node_id("CPedGameStateDataNode") || type == sync_node_id("CSectorDataNode") || type == sync_node_id("CPlayerSectorPosNode"))
|
||||
{
|
||||
std::swap(old_sync_cache_val, node->pad4);
|
||||
node->flags |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (auto plyr = g_player_service->get_by_id(player); (plyr && plyr->spam_killfeed) || g.session.spam_killfeed)
|
||||
{
|
||||
auto& type = sync_node_finder::find(reinterpret_cast<uint64_t>(node));
|
||||
|
||||
if (type == sync_node_id("CPedHealthDataNode"))
|
||||
{
|
||||
std::swap(old_sync_cache_val, node->pad4);
|
||||
node->flags |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
bool ret_val = g_hooking->get_original<hooks::write_node>()(node, sync_type, a3, object, buffer, a6, log, player, a9, a10);
|
||||
|
||||
if (old_sync_cache_val)
|
||||
std::swap(old_sync_cache_val, node->pad4);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
}
|
300
src/hooks/spoofing/write_node_data.cpp
Normal file
300
src/hooks/spoofing/write_node_data.cpp
Normal file
@ -0,0 +1,300 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "gta/net_game_event.hpp"
|
||||
#include "util/sync_trees.hpp"
|
||||
#include "util/model_info.hpp"
|
||||
#include "util/globals.hpp"
|
||||
#include "util/math.hpp"
|
||||
|
||||
#include "services/players/player_service.hpp"
|
||||
|
||||
#include <netsync/nodes/ped/CPedGameStateDataNode.hpp>
|
||||
#include <netsync/nodes/ped/CPedTaskTreeDataNode.hpp>
|
||||
#include <netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp>
|
||||
#include <netsync/nodes/proximity_migrateable/CSectorDataNode.hpp>
|
||||
#include <netsync/nodes/dynamic_entity/CDynamicEntityGameStateDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerAppearanceDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerCameraDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerGameStateDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerCreationDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerGamerDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerSectorPosNode.hpp>
|
||||
#include <netsync/nodes/ped/CPedHealthDataNode.hpp>
|
||||
#include <netsync/nodes/ped/CPedTaskSpecificDataNode.hpp>
|
||||
|
||||
namespace
|
||||
{
|
||||
using namespace big;
|
||||
static bool is_in_cutscene()
|
||||
{
|
||||
if (g_local_player && g_local_player->m_player_info)
|
||||
return g_local_player->m_player_info->m_game_state == eGameState::InMPCutscene;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_in_interior()
|
||||
{
|
||||
int id = 0;
|
||||
if (auto self_ptr = g_player_service->get_self(); self_ptr->is_valid())
|
||||
id = self_ptr->id();
|
||||
return globals::get_interior_from_player(id) != 0;
|
||||
}
|
||||
|
||||
static player_ptr get_random_player()
|
||||
{
|
||||
int players = math::rand(g_player_service->players().size() + 1);
|
||||
|
||||
for (auto& player : g_player_service->players())
|
||||
if (player.second->get_ped() && !players--)
|
||||
return player.second;
|
||||
|
||||
if (g_player_service->get_self()->get_ped() && g_player_service->get_self()->get_ped()->m_net_object)
|
||||
return g_player_service->get_self();
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
namespace big
|
||||
{
|
||||
void hooks::write_node_data(void* data_node, rage::netObject* net_object, rage::datBitBuffer* buffer, void* log, bool update)
|
||||
{
|
||||
bool node_updated = false;
|
||||
rage::datBitBuffer original_buffer = *buffer;
|
||||
g_hooking->get_original<hooks::write_node_data>()(data_node, net_object, buffer, log, update);
|
||||
|
||||
const auto& node = sync_node_finder::find(reinterpret_cast<uint64_t>(data_node));
|
||||
|
||||
switch (node)
|
||||
{
|
||||
case sync_node_id("CPhysicalScriptGameStateDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPhysicalScriptGameStateDataNode*>(data_node);
|
||||
if (g.spoofing.spoof_hide_veh_god && g_local_player && self::veh && g_local_player->m_vehicle && g_local_player->m_vehicle->m_net_object == net_object)
|
||||
{
|
||||
node->m_godmode = false;
|
||||
node->m_bullet_proof = false;
|
||||
node->m_fire_proof = false;
|
||||
node->m_smoke_proof = false;
|
||||
node->m_steam_proof = false;
|
||||
node->m_collision_proof = false;
|
||||
node->m_explosion_proof = false;
|
||||
node->m_melee_proof = false;
|
||||
node_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPlayerAppearanceDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPlayerAppearanceDataNode*>(data_node);
|
||||
if (g.spoofing.spoof_player_model)
|
||||
{
|
||||
if (const auto model_hash = rage::joaat(g.spoofing.player_model); model_info::does_model_exist(model_hash))
|
||||
{
|
||||
node->m_model_hash = model_hash;
|
||||
}
|
||||
node->m_has_head_blend_data = false;
|
||||
node->components.m_component_bitset = 0;
|
||||
node_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPlayerCreationDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPlayerCreationDataNode*>(data_node);
|
||||
if (g.spoofing.spoof_player_model)
|
||||
{
|
||||
if (const auto model_hash = rage::joaat(g.spoofing.player_model); model_info::does_model_exist(model_hash))
|
||||
{
|
||||
node->m_model = model_hash;
|
||||
}
|
||||
node_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPlayerCameraDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPlayerCameraDataNode*>(data_node);
|
||||
if (g.spoofing.spoof_hide_spectate && g.player.spectating)
|
||||
{
|
||||
node->m_free_cam_pos_x += 50.0f;
|
||||
node->m_free_cam_pos_y -= 50.0f;
|
||||
node->m_camera_x -= 50.0f;
|
||||
node_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPlayerGamerDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPlayerGamerDataNode*>(data_node);
|
||||
if (g.spoofing.spoof_crew_data)
|
||||
{
|
||||
node->m_clan_data.m_clan_member_id = 1;
|
||||
node->m_clan_data.m_clan_id = 41564112;
|
||||
node->m_clan_data.m_clan_id_2 = 41564112;
|
||||
node->m_clan_data.m_clan_color = 420;
|
||||
node->m_clan_data.m_clan_member_count = 15;
|
||||
node->m_clan_data.m_clan_created_time = 420;
|
||||
|
||||
strcpy(node->m_clan_data.m_clan_tag, g.spoofing.crew_tag.c_str());
|
||||
node->m_clan_data.m_is_system_clan = g.spoofing.rockstar_crew;
|
||||
node->m_clan_data.m_is_clan_open = g.spoofing.square_crew_tag;
|
||||
|
||||
if (g.spoofing.rockstar_crew)
|
||||
{
|
||||
strcpy(node->m_clan_data.m_clan_name, "Rockstar");
|
||||
}
|
||||
node_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPlayerGameStateDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPlayerGameStateDataNode*>(data_node);
|
||||
|
||||
if (g.spoofing.spoof_hide_god && !is_in_cutscene() && !is_in_interior())
|
||||
{
|
||||
node->m_is_invincible = false;
|
||||
node->m_bullet_proof = false;
|
||||
node->m_collision_proof = false;
|
||||
node->m_explosion_proof = false;
|
||||
node->m_fire_proof = false;
|
||||
node->m_melee_proof = false;
|
||||
node->m_steam_proof = false;
|
||||
node->m_water_proof = false;
|
||||
node_updated = true;
|
||||
}
|
||||
|
||||
if (g.spoofing.spoof_hide_spectate)
|
||||
{
|
||||
node->m_is_spectating = false;
|
||||
node->m_spectating_net_id = 0;
|
||||
node_updated = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPedGameStateDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPedGameStateDataNode*>(data_node);
|
||||
|
||||
if (g.session.harass_players && g.m_sync_target_player < 32 && *g_pointers->m_gta.m_is_session_started && g_local_player
|
||||
&& net_object == g_local_player->m_net_object)
|
||||
{
|
||||
auto plyr = g_player_service->get_by_id(g.m_sync_target_player);
|
||||
if (plyr)
|
||||
if (auto ped = plyr->get_ped(); ped && plyr->is_valid())
|
||||
{
|
||||
node->m_vehicle = *(int16_t*)(((__int64)ped->m_net_object) + 0x3D8); // 66 85 D2 4C 8B D1 0F 95 C0 or IS_REMOTE_PLAYER_IN_NON_CLONED_VEHICLE
|
||||
node->m_seat = 2; // test
|
||||
node->m_in_seat = true;
|
||||
node->m_in_vehicle = true;
|
||||
node_updated = true;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPedTaskTreeDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPedTaskTreeDataNode*>(data_node);
|
||||
|
||||
if (g.session.harass_players)
|
||||
{
|
||||
node->m_task_bitset = 0;
|
||||
node_updated = true;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CSectorDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CSectorDataNode*>(data_node);
|
||||
|
||||
if (g.session.harass_players && g.m_sync_target_player < 32 && *g_pointers->m_gta.m_is_session_started && g_local_player
|
||||
&& net_object == g_local_player->m_net_object)
|
||||
{
|
||||
auto plyr = g_player_service->get_by_id(g.m_sync_target_player);
|
||||
if (plyr)
|
||||
{
|
||||
if (auto ped = plyr->get_ped(); ped && plyr->is_valid())
|
||||
{
|
||||
g_pointers->m_gta.m_get_sector_data(ped->get_position(), &node->m_pos_x, &node->m_pos_y, &node->m_pos_z, nullptr);
|
||||
node_updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPlayerSectorPosNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPlayerSectorPosNode*>(data_node);
|
||||
|
||||
if (g.session.harass_players && g.m_sync_target_player < 32 && *g_pointers->m_gta.m_is_session_started && g_local_player
|
||||
&& net_object == g_local_player->m_net_object)
|
||||
{
|
||||
auto plyr = g_player_service->get_by_id(g.m_sync_target_player);
|
||||
if (plyr)
|
||||
{
|
||||
if (auto ped = plyr->get_ped(); ped && plyr->is_valid())
|
||||
{
|
||||
std::uint16_t _;
|
||||
g_pointers->m_gta.m_get_sector_data(ped->get_position(), &_, &_, &_, &node->m_sector_pos);
|
||||
node->m_is_standing_on_entity = false;
|
||||
node_updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case sync_node_id("CPedHealthDataNode"):
|
||||
{
|
||||
auto node = reinterpret_cast<CPedHealthDataNode*>(data_node);
|
||||
|
||||
if (g.m_sync_target_player < 32 && *g_pointers->m_gta.m_is_session_started && g_local_player
|
||||
&& net_object == g_local_player->m_net_object)
|
||||
{
|
||||
auto plyr = g_player_service->get_by_id(g.m_sync_target_player);
|
||||
if (plyr && (plyr->spam_killfeed || g.session.spam_killfeed))
|
||||
{
|
||||
if (auto ped = plyr->get_ped(); ped && plyr->is_valid())
|
||||
{
|
||||
if (math::rand(2) != 0)
|
||||
{
|
||||
// dead
|
||||
auto rand_plyr = get_random_player();
|
||||
|
||||
if (rand_plyr)
|
||||
{
|
||||
node->m_weapon_damage_entity = rand_plyr->get_ped()->m_net_object->m_object_id;
|
||||
}
|
||||
|
||||
node->m_weapon_damage_hash = "WEAPON_EXPLOSION"_J;
|
||||
node->m_has_max_health = false;
|
||||
node->m_hurt_started = true;
|
||||
node->m_health = 0;
|
||||
node->m_weapon_damage_component = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
// alive
|
||||
node->m_has_max_health = true;
|
||||
node->m_health = 100;
|
||||
}
|
||||
|
||||
node_updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (node_updated)
|
||||
{
|
||||
*buffer = original_buffer;
|
||||
g_hooking->get_original<hooks::write_node_data>()(data_node, net_object, buffer, log, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static_assert(offsetof(CPedGameStateDataNode, CPedGameStateDataNode::m_seat) == 0x138);
|
@ -1,29 +0,0 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "util/model_info.hpp"
|
||||
|
||||
#include <netsync/nodes/physical/CPhysicalScriptGameStateDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
void hooks::write_physical_script_game_state_data_node(rage::CPhysical* this_ptr, CPhysicalScriptGameStateDataNode* node)
|
||||
{
|
||||
g_hooking->get_original<hooks::write_physical_script_game_state_data_node>()(this_ptr, node);
|
||||
|
||||
auto this_vehicle = (*(CVehicle*(__fastcall**)(char*))(*((DWORD64*)this_ptr - 38) + 0xC0))((char*)this_ptr - 304);
|
||||
|
||||
if (g.spoofing.spoof_hide_veh_god && g_local_player && self::veh)
|
||||
{
|
||||
if (g_local_player->m_vehicle && g_local_player->m_vehicle == this_vehicle)
|
||||
{
|
||||
node->m_godmode = false;
|
||||
node->m_bullet_proof = false;
|
||||
node->m_fire_proof = false;
|
||||
node->m_smoke_proof = false;
|
||||
node->m_steam_proof = false;
|
||||
node->m_collision_proof = false;
|
||||
node->m_explosion_proof = false;
|
||||
node->m_melee_proof = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "util/model_info.hpp"
|
||||
|
||||
#include <netsync/nodes/player/CPlayerAppearanceDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
void hooks::write_player_appearance_data_node(rage::netObject* player, CPlayerAppearanceDataNode* node)
|
||||
{
|
||||
g_hooking->get_original<hooks::write_player_appearance_data_node>()(player, node);
|
||||
|
||||
if (g.spoofing.spoof_player_model)
|
||||
{
|
||||
if (const auto model_hash = rage::joaat(g.spoofing.player_model); model_info::does_model_exist(model_hash))
|
||||
{
|
||||
node->m_model_hash = model_hash;
|
||||
}
|
||||
node->m_has_head_blend_data = false;
|
||||
node->components.m_component_bitset = 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "services/players/player_service.hpp"
|
||||
#include "util/globals.hpp"
|
||||
|
||||
#include <netsync/nodes/player/CPlayerCameraDataNode.hpp>
|
||||
#include <netsync/nodes/player/CPlayerGameStateDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
void hooks::write_player_camera_data_node(rage::netObject* player, CPlayerCameraDataNode* node)
|
||||
{
|
||||
g_hooking->get_original<hooks::write_player_camera_data_node>()(player, node);
|
||||
|
||||
if (g.spoofing.spoof_hide_spectate && g.player.spectating)
|
||||
{
|
||||
node->m_free_cam_pos_x += 50.0f;
|
||||
node->m_free_cam_pos_y -= 50.0f;
|
||||
node->m_camera_x -= 50.0f;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
|
||||
#include <netsync/nodes/player/CPlayerCreationDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
void hooks::write_player_creation_data_node(rage::netObject* player, CPlayerCreationDataNode* node)
|
||||
{
|
||||
g_hooking->get_original<hooks::write_player_creation_data_node>()(player, node);
|
||||
|
||||
if (g.spoofing.spoof_player_model)
|
||||
node->m_model = rage::joaat(g.spoofing.player_model);
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
#include "services/players/player_service.hpp"
|
||||
#include "util/globals.hpp"
|
||||
|
||||
#include <netsync/nodes/player/CPlayerGameStateDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
static bool is_in_cutscene()
|
||||
{
|
||||
if (g_local_player && g_local_player->m_player_info)
|
||||
return g_local_player->m_player_info->m_game_state == eGameState::InMPCutscene;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_in_interior()
|
||||
{
|
||||
int id = 0;
|
||||
if (auto self_ptr = g_player_service->get_self(); self_ptr->is_valid())
|
||||
id = self_ptr->id();
|
||||
return globals::get_interior_from_player(id) != 0;
|
||||
}
|
||||
|
||||
void hooks::write_player_game_state_data_node(rage::netObject* player, CPlayerGameStateDataNode* node)
|
||||
{
|
||||
g_hooking->get_original<write_player_game_state_data_node>()(player, node);
|
||||
|
||||
if (g.spoofing.spoof_hide_god && !is_in_cutscene() && !is_in_interior())
|
||||
{
|
||||
node->m_is_invincible = false;
|
||||
node->m_bullet_proof = false;
|
||||
node->m_collision_proof = false;
|
||||
node->m_explosion_proof = false;
|
||||
node->m_fire_proof = false;
|
||||
node->m_melee_proof = false;
|
||||
node->m_steam_proof = false;
|
||||
node->m_water_proof = false;
|
||||
}
|
||||
|
||||
if (g.spoofing.spoof_hide_spectate)
|
||||
{
|
||||
node->m_is_spectating = false;
|
||||
node->m_spectating_net_id = 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
#include "hooking/hooking.hpp"
|
||||
|
||||
#include <netsync/nodes/player/CPlayerGamerDataNode.hpp>
|
||||
|
||||
namespace big
|
||||
{
|
||||
void hooks::write_player_gamer_data_node(rage::netObject* player, CPlayerGamerDataNode* node)
|
||||
{
|
||||
g_hooking->get_original<write_player_gamer_data_node>()(player, node);
|
||||
|
||||
if (g.spoofing.spoof_crew_data)
|
||||
{
|
||||
node->m_clan_data.m_clan_member_id = 1;
|
||||
node->m_clan_data.m_clan_id = 41564112;
|
||||
node->m_clan_data.m_clan_id_2 = 41564112;
|
||||
node->m_clan_data.m_clan_color = 420;
|
||||
node->m_clan_data.m_clan_member_count = 15;
|
||||
node->m_clan_data.m_clan_created_time = 420;
|
||||
|
||||
strcpy(node->m_clan_data.m_clan_tag, g.spoofing.crew_tag.c_str());
|
||||
node->m_clan_data.m_is_system_clan = g.spoofing.rockstar_crew;
|
||||
node->m_clan_data.m_is_clan_open = g.spoofing.square_crew_tag;
|
||||
|
||||
if (g.spoofing.rockstar_crew)
|
||||
{
|
||||
strcpy(node->m_clan_data.m_clan_name, "Rockstar");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -115,6 +115,12 @@ namespace big
|
||||
PED::APPLY_DAMAGE_TO_PED(ped, damage, damage_armor_first, p3, p4);
|
||||
}
|
||||
|
||||
void NETWORK_CONCEAL_PLAYER(rage::scrNativeCallContext* ctx)
|
||||
{
|
||||
if (!g.session.harass_players)
|
||||
NETWORK::NETWORK_CONCEAL_PLAYER(ctx->get_arg<Player>(0), ctx->get_arg<int>(1), ctx->get_arg<int>(2));
|
||||
}
|
||||
|
||||
void RETURN_TRUE(rage::scrNativeCallContext* src)
|
||||
{
|
||||
src->set_return_value<BOOL>(TRUE);
|
||||
|
@ -102,6 +102,7 @@ namespace big
|
||||
add_native_detour(NativeIndex::REGISTER_SCRIPT_VARIABLE, all_scripts::DO_NOTHING);
|
||||
add_native_detour(NativeIndex::UNREGISTER_SCRIPT_VARIABLE, all_scripts::DO_NOTHING);
|
||||
add_native_detour(NativeIndex::FORCE_CHECK_SCRIPT_VARIABLES, all_scripts::DO_NOTHING);
|
||||
add_native_detour(NativeIndex::NETWORK_CONCEAL_PLAYER, all_scripts::NETWORK_CONCEAL_PLAYER);
|
||||
|
||||
add_native_detour("shop_controller"_J, NativeIndex::IS_PED_SHOOTING, all_scripts::RETURN_FALSE); // prevent exploit reports
|
||||
add_native_detour("shop_controller"_J, NativeIndex::SET_WARNING_MESSAGE_WITH_HEADER, shop_controller::SET_WARNING_MESSAGE_WITH_HEADER);
|
||||
|
@ -294,15 +294,6 @@ namespace big
|
||||
g_pointers->m_gta.m_write_bitbuf_array = ptr.add(1).rip().as<decltype(gta_pointers::m_write_bitbuf_array)>();
|
||||
}
|
||||
},
|
||||
// Write Player Game State Data Node
|
||||
{
|
||||
"WPGSDN",
|
||||
"48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 30 0F B7 81",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_player_game_state_data_node = ptr.as<functions::write_player_game_state_data_node>();
|
||||
}
|
||||
},
|
||||
// Ptr To Handle
|
||||
{
|
||||
"PTH",
|
||||
@ -384,15 +375,6 @@ namespace big
|
||||
g_pointers->m_gta.m_give_pickup_rewards = ptr.sub(0x28).as<decltype(gta_pointers::m_give_pickup_rewards)>();
|
||||
}
|
||||
},
|
||||
// Write Player Gamer Data Node
|
||||
{
|
||||
"WPGDN",
|
||||
"48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 81 C1 ? ? ? ? 48 8B DA E8",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_player_gamer_data_node = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Receive Net Message
|
||||
{
|
||||
"RNM",
|
||||
@ -1067,15 +1049,6 @@ namespace big
|
||||
g_pointers->m_gta.m_receive_pickup = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Write Player Camera Data Node
|
||||
{
|
||||
"WPCDN",
|
||||
"48 8B C4 48 89 58 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 B0 48 81 EC 50 01 00 00 4C",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_player_camera_data_node = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Send Player Card Stats
|
||||
{
|
||||
"SPCS",
|
||||
@ -1103,24 +1076,6 @@ namespace big
|
||||
g_pointers->m_gta.m_serialize_stats = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Write Player Creation Data Node
|
||||
{
|
||||
"WPCDN",
|
||||
"48 83 EC 38 48 8B 81 F0",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_player_creation_data_node = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Write Player Appearance Data Node
|
||||
{
|
||||
"WPADN",
|
||||
"48 8B C4 48 89 50 10 48 89 48 08 53",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_player_appearance_data_node = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Enumerate Audio Devices
|
||||
{
|
||||
"EAD",
|
||||
@ -1777,13 +1732,40 @@ namespace big
|
||||
g_pointers->m_gta.m_vehicle_allocator = ptr.add(3).rip().as<GenericPool**>();
|
||||
}
|
||||
},
|
||||
// Write Physical Script Game State Data Node
|
||||
// Write Node Data
|
||||
{
|
||||
"WPSGSDN",
|
||||
"48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 48 83 EC 20 4C 8D B1 D0 FE",
|
||||
"WND",
|
||||
"48 8B 89 A8 00 00 00 4C 8B 11 49 FF 62 10",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_physical_script_game_state_data_node = ptr.as<PVOID>();
|
||||
g_pointers->m_gta.m_write_node_data = ptr.as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Can Send Node To Player
|
||||
{
|
||||
"CSNTP",
|
||||
"44 8B C3 FF 90 B0 00 00 00",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_can_send_node_to_player = ptr.sub(0x2E).as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Write Node
|
||||
{
|
||||
"WN",
|
||||
"49 89 43 C8 E8 E2 FB 50 00",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_write_node = ptr.sub(0x49).as<PVOID>();
|
||||
}
|
||||
},
|
||||
// Get Sector Data
|
||||
{
|
||||
"GSD",
|
||||
"40 53 48 83 EC 20 F3 0F 10 59 08",
|
||||
[](memory::handle ptr)
|
||||
{
|
||||
g_pointers->m_gta.m_get_sector_data = ptr.as<functions::get_sector_data>();
|
||||
}
|
||||
}
|
||||
>(); // don't leave a trailing comma at the end
|
||||
|
@ -100,6 +100,8 @@ namespace big
|
||||
bool trigger_desync_kick = false;
|
||||
bool trigger_end_session_kick = false;
|
||||
|
||||
bool spam_killfeed = false;
|
||||
|
||||
int spectating_player = -1;
|
||||
|
||||
protected:
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include "gta/enums.hpp"
|
||||
#include "pointers.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
@ -38,6 +39,7 @@ namespace big
|
||||
static constexpr size_t sync_tree_count = size_t(eNetObjType::NET_OBJ_TYPE_TRAIN) + 1;
|
||||
|
||||
std::array<sync_node_vft_to_ids, sync_tree_count> sync_trees_sync_node_addr_to_ids;
|
||||
sync_node_vft_to_ids global_node_identifier;
|
||||
|
||||
std::array<sync_tree_node_array_index_to_node_id_t, sync_tree_count> sync_trees_node_array_index_to_node_id = {
|
||||
{
|
||||
@ -517,9 +519,20 @@ namespace big
|
||||
public:
|
||||
static const sync_node_id& find(eNetObjType obj_type, uintptr_t addr)
|
||||
{
|
||||
if (!is_initialized()) [[unlikely]]
|
||||
init();
|
||||
|
||||
return finder.sync_trees_sync_node_addr_to_ids[(int)obj_type][addr];
|
||||
}
|
||||
|
||||
static const sync_node_id& find(uintptr_t addr)
|
||||
{
|
||||
if (!is_initialized()) [[unlikely]]
|
||||
init();
|
||||
|
||||
return finder.global_node_identifier[addr];
|
||||
}
|
||||
|
||||
static sync_node_vft_to_ids& get_object_nodes(eNetObjType obj_type)
|
||||
{
|
||||
return finder.sync_trees_sync_node_addr_to_ids[(int)obj_type];
|
||||
@ -551,6 +564,7 @@ namespace big
|
||||
const sync_node_id node_id = finder.sync_trees_node_array_index_to_node_id[i][j];
|
||||
|
||||
finder.sync_trees_sync_node_addr_to_ids[i][addr] = node_id;
|
||||
finder.global_node_identifier.emplace(addr, node_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -308,6 +308,8 @@ namespace big
|
||||
ImGui::Checkbox("NEVER_WANTED"_T.data(), &g.session.never_wanted_all);
|
||||
ImGui::Checkbox("SEMI_GODMODE"_T.data(), &g.session.semi_godmode_all);
|
||||
ImGui::Checkbox("VIEW_NET_SESSION_FIX_VEHICLE"_T.data(), &g.session.vehicle_fix_all);
|
||||
components::command_checkbox<"harass">();
|
||||
ImGui::Checkbox("SPAM_KILLFEED"_T.data(), &g.session.spam_killfeed);
|
||||
ImGui::Checkbox("EXPLOSION_KARMA"_T.data(), &g.session.explosion_karma);
|
||||
ImGui::Checkbox("DAMAGE_KARMA"_T.data(), &g.session.damage_karma);
|
||||
ImGui::Checkbox("DISABLE_PEDS"_T.data(), &g.session.disable_peds);
|
||||
|
@ -41,10 +41,11 @@ namespace big
|
||||
|
||||
if (ImGui::IsItemHovered())
|
||||
{
|
||||
auto tool_tip = std::format("{}: {}\n{}: {}\n{}: {}\n{}: {}", "SESSION_BROWSER_NUM_PLAYERS"_T, session.attributes.player_count,
|
||||
auto tool_tip = std::format("{}: {}\n{}: {}\n{}: {}\n{}: {}\n{}: {:X}", "SESSION_BROWSER_NUM_PLAYERS"_T, session.attributes.player_count,
|
||||
"REGION"_T, regions[session.attributes.region].name,
|
||||
"LANGUAGE"_T, languages[session.attributes.language].name,
|
||||
"SESSION_BROWSER_HOST_RID"_T, session.info.m_net_player_data.m_gamer_handle.m_rockstar_id);
|
||||
"SESSION_BROWSER_HOST_RID"_T, session.info.m_net_player_data.m_gamer_handle.m_rockstar_id,
|
||||
"SESSION_BROWSER_DISCRIMINATOR"_T, session.attributes.discriminator);
|
||||
ImGui::SetTooltip(tool_tip.c_str());
|
||||
}
|
||||
}
|
||||
|
@ -104,6 +104,8 @@ namespace big
|
||||
if (ImGui::IsItemHovered())
|
||||
ImGui::SetTooltip("PLAYER_TOXIC_BRING_PLAYER_OUT_GOD"_T.data());
|
||||
|
||||
ImGui::Checkbox("SPAM_KILLFEED"_T.data(), &g_player_service->get_selected()->spam_killfeed);
|
||||
|
||||
static int bounty_value = 0;
|
||||
ImGui::SetNextItemWidth(300);
|
||||
ImGui::SliderInt("BOUNTY"_T.data(), &bounty_value, 0, 10000);
|
||||
|
Reference in New Issue
Block a user