feat(hooks): General cleanup on hooks and pointers (#322)

This commit is contained in:
Forever Gone 2022-07-05 16:54:45 -04:00 committed by GitHub
parent 6a4ee2b282
commit 10f549183b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 512 additions and 522 deletions

View File

@ -9,16 +9,19 @@ namespace big
{ {
void backend::loop() void backend::loop()
{ {
g->attempt_save(); while (true) {
looped::system_self_globals(); g->attempt_save();
looped::system_update_pointers(); looped::system_self_globals();
looped::system_update_pointers();
if (g_local_player != nullptr && !api::util::signed_in()) if (g_local_player != nullptr && !api::util::signed_in())
{
g_thread_pool->push([]
{ {
looped::api_login_session(); g_thread_pool->push([]
}); {
looped::api_login_session();
});
}
script::get_current()->yield();
} }
} }

View File

@ -1 +1 @@
#include "common.hpp" #include "common.hpp"

View File

@ -45,6 +45,7 @@
#include <optional> #include <optional>
#include <variant> #include <variant>
#define FMT_HEADER_ONLY
#include <fmt/format.h> #include <fmt/format.h>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>

View File

@ -19,7 +19,7 @@ namespace big
} }
else else
{ {
throw std::runtime_error(fmt::format("Failed to create hook '{}' at 0x{:X} (error: {})", m_name, reinterpret_cast<std::uintptr_t>(m_target), MH_StatusToString(status))); throw std::runtime_error(fmt::format("Failed to create hook '{}' at 0x{:X} (error: {})", m_name, uintptr_t(m_target), MH_StatusToString(status)));
} }
} }
@ -41,7 +41,7 @@ namespace big
} }
else else
{ {
throw std::runtime_error(fmt::format("Failed to enable hook 0x{:X} ({})", reinterpret_cast<std::uintptr_t>(m_target), MH_StatusToString(status))); throw std::runtime_error(fmt::format("Failed to enable hook 0x{:X} ({})", uintptr_t(m_target), MH_StatusToString(status)));
} }
} }
@ -66,20 +66,14 @@ namespace big
void detour_hook::fix_hook_address() void detour_hook::fix_hook_address()
{ {
__try __try {
{
auto ptr = memory::handle(m_target); auto ptr = memory::handle(m_target);
while (ptr.as<std::uint8_t&>() == 0xE9) while (ptr.as<std::uint8_t&>() == 0xE9)
{
ptr = ptr.add(1).rip(); ptr = ptr.add(1).rip();
}
m_target = ptr.as<void*>(); m_target = ptr.as<void*>();
} }
__except (exp_handler(GetExceptionInformation(), m_name)) __except (exp_handler(GetExceptionInformation(), m_name)) {
{ [this]() {
[this]()
{
throw std::runtime_error(fmt::format("Failed to fix hook address for '{}'", m_name)); throw std::runtime_error(fmt::format("Failed to fix hook address for '{}'", m_name));
}(); }();
} }

View File

@ -1,27 +0,0 @@
#include "common.hpp"
#include "features.hpp"
#include "logger.hpp"
#include "script.hpp"
#include "backend/backend.hpp"
namespace big
{
void features::run_tick()
{
backend::loop();
}
void features::script_func()
{
while (true)
{
TRY_CLAUSE
{
run_tick();
}
EXCEPT_CLAUSE
script::get_current()->yield();
}
}
}

View File

@ -1,8 +0,0 @@
#pragma once
#include "common.hpp"
namespace big::features
{
void run_tick();
void script_func();
}

View File

@ -7,37 +7,48 @@
namespace big::functions namespace big::functions
{ {
using run_script_threads_t = bool(*)(std::uint32_t ops_to_execute); using run_script_threads = bool(*)(std::uint32_t ops_to_execute);
using get_native_handler_t = rage::scrNativeHandler(*)(rage::scrNativeRegistrationTable*, rage::scrNativeHash); using get_native_handler = rage::scrNativeHandler(*)(rage::scrNativeRegistrationTable* registration_table, rage::scrNativeHash hash);
using fix_vectors_t = void(*)(rage::scrNativeCallContext*); using fix_vectors = void(*)(rage::scrNativeCallContext* call_ctx);
using get_net_game_player = CNetGamePlayer*(Player player); using get_net_game_player = CNetGamePlayer*(*)(Player player);
using trigger_script_event = void(int event_group, int64_t* args, int arg_count, int player_bits); using trigger_script_event = void(*)(int event_group, int64_t* args, int arg_count, int player_bits);
using increment_stat_event = bool(uint64_t net_event_struct, int64_t sender, int64_t a3); using increment_stat_event = bool(*)(uint64_t net_event_struct, int64_t sender, int64_t a3);
using ptr_to_handle = Entity(void* entity); using ptr_to_handle = Entity(*)(void* entity);
using get_screen_coords_for_world_coords = bool(float* world_coords, float* out_x, float* out_y); using get_gameplay_cam_coords = Vector3(*)();
using get_gameplay_cam_coords = Vector3(); using get_screen_coords_for_world_coords = bool(*)(float* world_coords, float* out_x, float* out_y);
using give_pickup_rewards = void(int players, uint32_t hash); using give_pickup_rewards = void(*)(int players, uint32_t hash);
// Bitbuffer read/write START
using read_bitbuf_dword = bool(*)(rage::datBitBuffer* buffer, PVOID read, int bits);
using read_bitbuf_string = bool(*)(rage::datBitBuffer* buffer, char* read, int bits);
using read_bitbuf_bool = bool(*)(rage::datBitBuffer* buffer, bool* read, int bits);
using read_bitbuf_array = bool(*)(rage::datBitBuffer* buffer, PVOID read, int bits, int unk);
using write_bitbuf_qword = bool(*)(rage::datBitBuffer* buffer, uint64_t val, int bits);
using write_bitbuf_dword = bool(*)(rage::datBitBuffer* buffer, uint32_t val, int bits);
using write_bitbuf_int64 = bool(*)(rage::datBitBuffer* buffer, int64_t val, int bits);
using write_bitbuf_int32 = bool(*)(rage::datBitBuffer* buffer, int32_t val, int bits);
using write_bitbuf_bool = bool(*)(rage::datBitBuffer* buffer, bool val, int bits);
using write_bitbuf_array = bool(*)(rage::datBitBuffer* buffer, uint8_t* val, int bits, int unk);
// Bitbuffer read/write END
// Received Event Signatures START // Received Event Signatures START
using read_bitbuf_array = bool(rage::datBitBuffer* buffer, PVOID read, int bits, int); using send_event_ack = void(*)(rage::netEventMgr* event_manager, CNetGamePlayer* source_player, CNetGamePlayer* target_player, int event_index, int event_handled_bitset);
using read_bitbuf_dword = bool(rage::datBitBuffer* buffer, PVOID read, int bits);
using send_event_ack = void(rage::netEventMgr* event_manager, CNetGamePlayer* source_player, CNetGamePlayer* target_player, int event_index, int event_handled_bitset);
// Received Event Signatures END // Received Event Signatures END
//Sync signatures START //Sync signatures START
using get_sync_type_info = const char* (uint16_t sync_type, char a2); using get_sync_type_info = const char*(*)(uint16_t sync_type, char a2);
using get_sync_tree_for_type = __int64(CNetworkObjectMgr* mgr, uint16_t sync_type); using get_sync_tree_for_type = int64_t(*)(CNetworkObjectMgr* mgr, uint16_t sync_type);
using get_net_object = rage::netObject* (__fastcall)(CNetworkObjectMgr* mgr, int16_t id, bool unk3); using get_net_object = rage::netObject*(*)(CNetworkObjectMgr* mgr, int16_t id, bool unk3);
using get_net_object_for_player = rage::netObject* (__fastcall) (CNetworkObjectMgr*, int16_t, CNetGamePlayer*, bool); using get_net_object_for_player = rage::netObject*(*)(CNetworkObjectMgr*, int16_t, CNetGamePlayer*, bool);
//Sync signatures END //Sync signatures END
} }

View File

@ -726,96 +726,96 @@ enum class NetObjEntityType : uint16_t
NetObjEntityType_Max NetObjEntityType_Max
}; };
enum class RockstarEvent : uint16_t enum class eNetworkEvents : uint16_t
{ {
OBJECT_ID_FREED_EVENT, CObjectIdFreedEvent,
OBJECT_ID_REQUEST_EVENT, CObjectIdRequestEvent,
ARRAY_DATA_VERIFY_EVENT, CArrayDataVerifyEvent,
SCRIPT_ARRAY_DATA_VERIFY_EVENT, CScriptArrayDataVerifyEvent,
REQUEST_CONTROL_EVENT, CRequestControlEvent,
GIVE_CONTROL_EVENT, CGiveControlEvent,
WEAPON_DAMAGE_EVENT, CWeaponDamageEvent,
REQUEST_PICKUP_EVENT, CRequestPickupEvent,
REQUEST_MAP_PICKUP_EVENT, CRequestMapPickupEvent,
GAME_CLOCK_EVENT, CGameClockEvent,
GAME_WEATHER_EVENT, CGameWeatherEvent,
RESPAWN_PLAYER_PED_EVENT, CRespawnPlayerPedEvent,
GIVE_WEAPON_EVENT, CGiveWeaponEvent,
REMOVE_WEAPON_EVENT, CRemoveWeaponEvent,
REMOVE_ALL_WEAPONS_EVENT, CRemoveAllWeaponsEvent,
VEHICLE_COMPONENT_CONTROL_EVENT, CVehicleComponentControlEvent,
FIRE_EVENT, CFireEvent,
EXPLOSION_EVENT, CExplosionEvent,
START_PROJECTILE_EVENT, CStartProjectileEvent,
UPDATE_PROJECTILE_TARGET_EVENT, CUpdateProjectileTargetEvent,
REMOVE_PROJECTILE_ENTITY_EVENT, CRemoveProjectileEntityEvent,
BREAK_PROJECTILE_TARGET_LOCK_EVENT, CBreakProjectileTargetLockEvent,
ALTER_WANTED_LEVEL_EVENT, CAlterWantedLevelEvent,
CHANGE_RADIO_STATION_EVENT, CChangeRadioStationEvent,
RAGDOLL_REQUEST_EVENT, CRagdollRequestEvent,
PLAYER_TAUNT_EVENT, CPlayerTauntEvent,
PLAYER_CARD_STAT_EVENT, CPlayerCardStatEvent,
DOOR_BREAK_EVENT, CDoorBreakEvent,
SCRIPTED_GAME_EVENT, CScriptedGameEvent,
REMOTE_SCRIPT_INFO_EVENT, CRemoteScriptInfoEvent,
REMOTE_SCRIPT_LEAVE_EVENT, CRemoteScriptLeaveEvent,
MARK_AS_NO_LONGER_NEEDED_EVENT, CMarkAsNoLongerNeededEvent,
CONVERT_TO_SCRIPT_ENTITY_EVENT, CConvertToScriptEntityEvent,
SCRIPT_WORLD_STATE_EVENT, CScriptWorldStateEvent,
CLEAR_AREA_EVENT, CClearAreaEvent,
CLEAR_RECTANGLE_AREA_EVENT, CClearRectangleAreaEvent,
NETWORK_REQUEST_SYNCED_SCENE_EVENT, CNetworkRequestSyncedSceneEvent,
NETWORK_START_SYNCED_SCENE_EVENT, CNetworkStartSyncedSceneEvent,
NETWORK_STOP_SYNCED_SCENE_EVENT, CNetworkStopSyncedSceneEvent,
NETWORK_UPDATE_SYNCED_SCENE_EVENT, CNetworkUpdateSyncedSceneEvent,
INCIDENT_ENTITY_EVENT, CIncidentEntityEvent,
GIVE_PED_SCRIPTED_TASK_EVENT, CGivePedScriptedTaskEvent,
GIVE_PED_SEQUENCE_TASK_EVENT, CGivePedSequenceTaskEvent,
NETWORK_CLEAR_PED_TASKS_EVENT, CNetworkClearPedTasksEvent,
NETWORK_START_PED_ARREST_EVENT, CNetworkStartPedArrestEvent,
NETWORK_START_PED_UNCUFF_EVENT, CNetworkStartPedUncuffEvent,
NETWORK_SOUND_CAR_HORN_EVENT, CNetworkSoundCarHornEvent,
NETWORK_ENTITY_AREA_STATUS_EVENT, CNetworkEntityAreaStatusEvent,
NETWORK_GARAGE_OCCUPIED_STATUS_EVENT, CNetworkGarageOccupiedStatusEvent,
PED_CONVERSATION_LINE_EVENT, CPedConversationLineEvent,
SCRIPT_ENTITY_STATE_CHANGE_EVENT, CScriptEntityStateChangeEvent,
NETWORK_PLAY_SOUND_EVENT, CNetworkPlaySoundEvent,
NETWORK_STOP_SOUND_EVENT, CNetworkStopSoundEvent,
NETWORK_PLAY_AIRDEFENSE_FIRE_EVENT, CNetworkPlayAirdefenseFireEvent,
NETWORK_BANK_REQUEST_EVENT, CNetworkBankRequestEvent,
NETWORK_AUDIO_BARK_EVENT, CNetworkAudioBarkEvent,
REQUEST_DOOR_EVENT, CRequestDoorEvent,
NETWORK_TRAIN_REPORT_EVENT, CNetworkTrainReportEvent,
NETWORK_TRAIN_REQUEST_EVENT, CNetworkTrainRequestEvent,
NETWORK_INCREMENT_STAT_EVENT, CNetworkIncrementStatEvent,
MODIFY_VEHICLE_LOCK_WORD_STATE_DATA, CModifyVehicleLockWordStateData,
MODIFY_PTFX_WORD_STATE_DATA_SCRIPTED_EVOLVE_EVENT, CModifyPtfxWordStateDataScriptedEvolveEvent,
REQUEST_PHONE_EXPLOSION_EVENT, CRequestPhoneExplosionEvent,
REQUEST_DETACHMENT_EVENT, CRequestDetachmentEvent,
KICK_VOTES_EVENT, CKickVotesEvent,
GIVE_PICKUP_REWARDS_EVENT, CGivePickupRewardsEvent,
NETWORK_CRC_HASH_CHECK_EVENT, CNetworkCrcHashCheckEvent,
BLOW_UP_VEHICLE_EVENT, CBlowUpVehicleEvent,
NETWORK_SPECIAL_FIRE_EQUIPPED_WEAPON, CNetworkSpecialFireEquippedWeapon,
NETWORK_RESPONDED_TO_THREAT_EVENT, CNetworkRespondedToThreatEvent,
NETWORK_SHOUT_TARGET_POSITION, CNetworkShoutTargetPosition,
VOICE_DRIVEN_MOUTH_MOVEMENT_FINISHED_EVENT, CVoiceDrivenMouthMovementFinishedEvent,
PICKUP_DESTROYED_EVENT, CPickupDestroyedEvent,
UPDATE_PLAYER_SCARS_EVENT, CUpdatePlayerScarsEvent,
NETWORK_CHECK_EXE_SIZE_EVENT, CNetworkCheckExeSizeEvent,
NETWORK_PTFX_EVENT, CNetworkPtfxEvent,
NETWORK_PED_SEEN_DEAD_PED_EVENT, CNetworkPedSeenDeadPedEvent,
REMOVE_STICKY_BOMB_EVENT, CRemoveStickyBombEvent,
NETWORK_CHECK_CODE_CRCS_EVENT, CNetworkCheckCodeCrcsEvent,
INFORM_SILENCED_GUNSHOT_EVENT, CInformSilencedGunshotEvent,
PED_PLAY_PAIN_EVENT, CPedPlayPainEvent,
CACHE_PLAYER_HEAD_BLEND_DATA_EVENT, CCachePlayerHeadBlendDataEvent,
REMOVE_PED_FROM_PEDGROUP_EVENT, CRemovePedFromPedgroupEvent,
REPORT_MYSELF_EVENT, CUpdateFxnEvent,
REPORT_CASH_SPAWN_EVENT, CReportCashSpawnEvent,
ACTIVATE_VEHICLE_SPECIAL_ABILITY_EVENT, CActivateVehicleSpecialAbilityEvent,
BLOCK_WEAPON_SELECTION, CBlockWeaponSelection,
NETWORK_CHECK_CATALOG_CRC CNetworkCheckCatalogCrc
}; };
enum class BlipIcons enum class BlipIcons

View File

@ -54,12 +54,45 @@ namespace rage
std::int32_t m_data_count; std::int32_t m_data_count;
std::uint32_t m_data[48]; std::uint32_t m_data[48];
}; };
static_assert(sizeof(scrNativeCallContext) == 0xE0);
using scrNativeHash = std::uint64_t; using scrNativeHash = std::uint64_t;
using scrNativeMapping = std::pair<scrNativeHash, scrNativeHash>; using scrNativeMapping = std::pair<scrNativeHash, scrNativeHash>;
using scrNativeHandler = void(*)(scrNativeCallContext*); using scrNativeHandler = void(*)(scrNativeCallContext*);
class scrNativeRegistration; class scrNativeRegistration {
public:
uint64_t m_nextRegistration1;
uint64_t m_nextRegistration2;
void* m_handlers[7];
uint32_t m_numEntries1;
uint32_t m_numEntries2;
uint64_t m_hashes;
scrNativeRegistration* get_next_registration() {
std::uintptr_t result;
auto nextReg = uintptr_t(&m_nextRegistration1);
auto newReg = nextReg ^ m_nextRegistration2;
auto charTableOfRegs = (char*)&result - nextReg;
for (auto i = 0; i < 3; i++) {
*(DWORD*)&charTableOfRegs[nextReg] = static_cast<DWORD>(newReg) ^ *(DWORD*)nextReg;
nextReg += 4;
}
return reinterpret_cast<scrNativeRegistration*>(result);
}
std::uint32_t get_num_entries() {
return static_cast<std::uint32_t>(((std::uintptr_t)&m_numEntries1) ^ m_numEntries1 ^ m_numEntries2);
}
std::uint64_t get_hash(std::uint32_t index) {
auto nativeAddress = 16 * index + std::uintptr_t(&m_nextRegistration1) + 0x54;
std::uint64_t result;
auto charTableOfRegs = (char*)&result - nativeAddress;
auto addressIndex = nativeAddress ^ *(DWORD*)(nativeAddress + 8);
for (auto i = 0; i < 3; i++) {
*(DWORD*)&charTableOfRegs[nativeAddress] = static_cast<DWORD>(addressIndex ^ *(DWORD*)(nativeAddress));
nativeAddress += 4;
}
return result;
}
};
#pragma pack(push, 1) #pragma pack(push, 1)
class scrNativeRegistrationTable class scrNativeRegistrationTable
@ -69,8 +102,6 @@ namespace rage
bool m_initialized; bool m_initialized;
}; };
#pragma pack(pop) #pragma pack(pop)
static_assert(sizeof(scrNativeCallContext) == 0xE0);
} }
using Void = void; using Void = void;

View File

@ -7,139 +7,266 @@
namespace rage namespace rage
{ {
class netPlayer; class netPlayer;
class datBitBuffer class datBitBuffer
{ {
public: public:
inline datBitBuffer(void* data, uint32_t size) datBitBuffer(uint8_t* data, uint32_t size) {
{
m_data = data; m_data = data;
m_f8 = 0; m_bitOffset = 0;
m_maxBit = size * 8; m_maxBit = size * 8;
m_bitsRead = 0; m_bitsRead = 0;
m_curBit = 0; m_curBit = 0;
m_unk2Bit = 0; m_highestBitsRead = 0;
m_flagBits = 0; m_flagBits = 0;
} }
uint32_t GetPosition() {
inline uint32_t GetPosition()
{
return m_bitsRead; return m_bitsRead;
} }
bool Seek(uint32_t bits) {
inline bool Seek(uint32_t bits) if (bits >= 0) {
{
if (bits >= 0)
{
uint32_t length = (m_flagBits & 1) ? m_maxBit : m_curBit; uint32_t length = (m_flagBits & 1) ? m_maxBit : m_curBit;
if (bits <= length) if (bits <= length)
{
m_bitsRead = bits; m_bitsRead = bits;
}
} }
return false; return false;
} }
bool WriteBool(bool integer) {
inline int GetDataLength() return big::g_pointers->m_write_bitbuf_bool(this, integer, 1);
{ }
bool ReadBool(bool* integer) {
return big::g_pointers->m_read_bitbuf_bool(this, integer, 1);
}
bool ReadPeerId(uint64_t* integer) {
return this->ReadQWord(integer, 0x32);
}
uint64_t ReadBits(size_t numBits) {
auto const totalBits = (m_flagBits & 1) ? m_maxBit : m_curBit;
if ((m_flagBits & 2) || m_bitsRead + numBits > totalBits)
return 0;
auto const bufPos = m_bitsRead + m_bitOffset;
auto const initialBitOffset = bufPos & 0b111;
auto const start = &m_data[bufPos / 8];
auto const next = &start[1];
auto result = (start[0] << initialBitOffset) & 0xff;
for (auto i = 0; i < ((numBits - 1) / 8); i++) {
result <<= 8;
result |= next[i] << initialBitOffset;
}
if (initialBitOffset)
result |= next[0] >> (8 - initialBitOffset);
m_bitsRead += static_cast<uint32_t>(numBits);
if (m_bitsRead > m_highestBitsRead)
m_highestBitsRead = m_bitsRead;
return result >> ((8 - numBits) % 8);
}
int GetDataLength() {
int leftoverBit = (m_curBit % 8) ? 1 : 0; int leftoverBit = (m_curBit % 8) ? 1 : 0;
return (m_curBit / 8) + leftoverBit; return (m_curBit / 8) + leftoverBit;
} }
bool ReadString(char* string, int bits) {
inline bool ReadByte(uint8_t* integer, int bits) return big::g_pointers->m_read_bitbuf_string(this, string, bits);
{ }
bool WriteByte(uint8_t integer, int bits) {
return big::g_pointers->m_write_bitbuf_dword(this, integer, bits);
}
bool ReadByte(uint8_t* integer, int bits) {
uint32_t read; uint32_t read;
if (big::g_pointers->m_read_bitbuf_dword(this, &read, bits)) if (big::g_pointers->m_read_bitbuf_dword(this, &read, bits)) {
{
*integer = read; *integer = read;
return true; return true;
} }
return false; return false;
} }
bool WriteWord(uint16_t integer, int bits) {
inline bool ReadWord(uint16_t* integer, int bits) return big::g_pointers->m_write_bitbuf_dword(this, integer, bits);
{ }
bool ReadWord(uint16_t* integer, int bits) {
uint32_t read; uint32_t read;
if (big::g_pointers->m_read_bitbuf_dword(this, &read, bits)) if (big::g_pointers->m_read_bitbuf_dword(this, &read, bits)) {
{
*integer = read; *integer = read;
return true; return true;
} }
return false; return false;
} }
bool WriteDword(uint32_t integer, int bits) {
inline bool ReadDword(uint32_t* integer, int bits) return big::g_pointers->m_write_bitbuf_dword(this, integer, bits);
{ }
bool ReadDword(uint32_t* integer, int bits) {
return big::g_pointers->m_read_bitbuf_dword(this, integer, bits); return big::g_pointers->m_read_bitbuf_dword(this, integer, bits);
} }
bool WriteInt32(int32_t integer, int bits) {
inline bool ReadInt32(int32_t* integer, int bits) return big::g_pointers->m_write_bitbuf_int32(this, integer, bits);
{ }
bool ReadInt32(int32_t* integer, int bits) {
int32_t v8; int32_t v8;
int32_t v9; int32_t v9;
if (ReadDword((uint32_t*)&v8, 1u) && ReadDword((uint32_t*)&v9, bits - 1)) if (ReadDword((uint32_t*)&v8, 1u) && ReadDword((uint32_t*)&v9, bits - 1)) {
{
*integer = v8 + (v9 ^ -v8); *integer = v8 + (v9 ^ -v8);
return true; return true;
} }
return false; return false;
} }
bool WriteQWord(uint64_t integer, int bits) {
inline bool ReadQWord(uint64_t* integer, int bits) return big::g_pointers->m_write_bitbuf_qword(this, integer, bits);
{ }
if (bits <= 32) bool ReadQWord(uint64_t* integer, int bits) {
{ if (bits <= 32) {
uint32_t v10{}; uint32_t v10;
if (ReadDword(&v10, bits)) if (ReadDword(&v10, bits)) {
{
*integer = v10; *integer = v10;
return true; return true;
} }
return false;
} }
else else {
{ uint32_t v10, v11;
uint32_t v10{}, v11{}; if (ReadDword(&v11, 32u) && ReadDword(&v10, bits - 32u)) {
if (ReadDword(&v11, 32u) && ReadDword(&v10, bits - 32u))
{
*integer = v11 | ((uint64_t)v10 << 32); *integer = v11 | ((uint64_t)v10 << 32);
return true; return true;
} }
return false;
} }
return false;
} }
bool WriteInt64(int64_t integer, int bits) {
inline bool ReadInt64(int64_t* integer, int bits) return big::g_pointers->m_write_bitbuf_int64(this, integer, bits);
{ }
bool ReadInt64(int64_t* integer, int bits) {
uint32_t v8; uint32_t v8;
uint64_t v9; uint64_t v9;
if (ReadDword(&v8, 1u) && ReadQWord(&v9, bits - 1)) if (ReadDword(&v8, 1u) && ReadQWord(&v9, bits - 1)) {
{
*integer = v8 + (v9 ^ -(int64_t)v8); *integer = v8 + (v9 ^ -(int64_t)v8);
return true; return true;
} }
return false; return false;
} }
bool WriteArray(uint8_t* array, int size) {
inline bool ReadArray(PVOID array, int size) return big::g_pointers->m_write_bitbuf_array(this, array, size, 0);
{ }
bool ReadArray(PVOID array, int size) {
return big::g_pointers->m_read_bitbuf_array(this, array, size, 0); return big::g_pointers->m_read_bitbuf_array(this, array, size, 0);
} }
public: public:
void* m_data; //0x0000 uint8_t* m_data; //0x0000
uint32_t m_f8; //0x0008 uint32_t m_bitOffset; //0x0008
uint32_t m_maxBit; //0x000C uint32_t m_maxBit; //0x000C
uint32_t m_bitsRead; //0x0010 uint32_t m_bitsRead; //0x0010
uint32_t m_curBit; //0x0014 uint32_t m_curBit; //0x0014
uint32_t m_unk2Bit; //0x0018 uint32_t m_highestBitsRead; //0x0018
uint8_t m_flagBits; //0x001C uint8_t m_flagBits; //0x001C
char pad_0x01D[3];
uint32_t m_f20;
}; };
enum class eNetMessage : uint32_t {
CMsgInvalid = 0xFFFFF,
CMsgSessionAcceptChat = 0x62,
CMsgStartMatchCmd = 0x2D,
CMsgSetInvitableCmd = 0x1F,
CMsgSessionMemberIds = 0x23,
CMsgRequestGamerInfo = 0x54,
CMsgRemoveGamersFromSessionCmd = 0x53,
CMsgNotMigrating = 0x35,
CMsgMigrateHostResponse = 0x12,
CMsgMigrateHostRequest = 0x66,
CMsgJoinResponse = 0x2A,
CMsgJoinRequest = 0x41,
CMsgHostLeftWhilstJoiningCmd = 0x58,
CMsgConfigResponse = 0x5F,
CMsgConfigRequest = 0x48,
CMsgChangeSessionAttributesCmd = 0x5A,
CMsgAddGamerToSessionCmd = 0x64, // this is where send net info to lobby is called, among other things
CMsgReassignResponse = 0x10,
CMsgReassignNegotiate = 0x01,
CMsgReassignConfirm = 0x26,
CMsgPlayerData = 0x18,
CMsgPackedReliables = 0x30,
CMsgPackedCloneSyncACKs = 0x3B,
CMsgNonPhysicalData = 0x16,
CMsgNetArrayMgrUpdateAck = 0x5D,
CMsgNetArrayMgrUpdate = 0x60,
CMsgNetArrayMgrSplitUpdateAck = 0x25,
CMsgScriptVerifyHostAck = 0x0B,
CMsgScriptVerifyHost = 0x3E,
CMsgScriptNewHost = 0x0E,
CMsgScriptMigrateHostFailAck = 0x1A,
CMsgScriptMigrateHost = 0x33,
CMsgScriptLeaveAck = 0x40,
CMsgScriptLeave = 0x17,
CMsgScriptJoinHostAck = 0x4D,
CMsgScriptJoinAck = 0x43,
CMsgScriptJoin = 0x5C,
CMsgScriptHostRequest = 0x67,
CMsgScriptHandshakeAck = 0x5B,
CMsgScriptHandshake = 0x57,
CMsgScriptBotLeave = 0x2B, // unused?
CMsgScriptBotJoinAck = 0x63, // unused?
CMsgScriptBotJoin = 0x1C, // unused?
CMsgScriptBotHandshakeAck = 0x31, // unused?
CMsgScriptBotHandshake = 0x4B, // unused?
CMsgPartyLeaveGame = 0x3D,
CMsgPartyEnterGame = 0x1E,
CMsgCloneSync = 0x4E, // aka clone_create, clone_sync etc.
CMsgActivateNetworkBot = 0x65, // unused?
CMsgRequestObjectIds = 0x29,
CMsgInformObjectIds = 0x09,
CMsgTextMessage = 0x24, // this one is for chat
CMsgPlayerIsTyping = 0x61,
CMsgPackedEvents = 0x4F, // aka received_event
CMsgPackedEventReliablesCMsgs = 0x20,
CMsgRequestKickFromHost = 0x0D,
CMsgTransitionToGameStart = 0x50,
CMsgTransitionToGameNotify = 0x02,
CMsgTransitionToActivityStart = 0x06,
CMsgTransitionToActivityFinish = 0x36,
CMsgTransitionParameters = 0x3C,
CMsgTransitionParameterString = 0x37,
CMsgTransitionLaunchNotify = 0x1B,
CMsgTransitionLaunch = 0x19,
CMsgTransitionGamerInstruction = 0x14,
CMsgTextMessage2 = 0x0A, // this one is for phone message
CMsgSessionEstablishedRequest = 0x52,
CMsgSessionEstablished = 0x07,
CMsgRequestTransitionParameters = 0x42,
CMsgRadioStationSyncRequest = 0x47,
CMsgRadioStationSync = 0x46,
CMsgPlayerCardSync = 0x3A,
CMsgPlayerCardRequest = 0x6A,
CMsgLostConnectionToHost = 0x81,
CMsgKickPlayer = 0x34, // host kick
CMsgDebugStall = 0x7E, // unused?
CMsgCheckQueuedJoinRequestReply = 0x59,
CMsgCheckQueuedJoinRequest = 0x51,
CMsgBlacklist = 0x0C,
CMsgRoamingRequestBubbleRequiredResponse = 0x83,
CMsgRoamingRequestBubbleRequiredCheck = 0x82,
CMsgRoamingRequestBubble = 0x2E,
CMsgRoamingJoinBubble = 0x4C,
CMsgRoamingJoinBubbleAck = 0x3F,
CMsgRoamingInitialBubble = 0x32,
CMsgVoiceStatus = 0x03,
CMsgTextChatStatus = 0x00,
CMsgJoinResponse2 = 0x08,
CMsgJoinRequest2 = 0x68,
CMsgNetTimeSync = 0x38, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 37
CMsgNetComplaint = 0x55, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 54
CMsgNetLagPing = 0x27, // unused? ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 26
CMsgSearchResponse = 0x6B, // unused? ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 6A
CMsgSearchRequest = 0x05, // unused?
CMsgQosProbeResponse = 0x2C, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 2B
CMsgQosProbeRequest = 0x1D, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 1C
CMsgCxnRelayAddressChanged = 0x49, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 48
CMsgCxnRequestRemoteTimeout = 0x2F, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 2E
CMsgSessionDetailRequest = 0x22, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 21
CMsgSessionDetailResponse = 0x13, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 12
CMsgKeyExchangeOffer = 0x0F, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 0E (last result)
CMsgKeyExchangeAnswer = 0x44, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 43
CMsg_0x87 = 0x87,
CMsg_0x88 = 0x88,
CMsg_0x80 = 0x80,
CMsg_0x28 = 0x28,
CMsg_0x11 = 0x11,
CMsg_0x45 = 0x45,
CMsg_0x89 = 0x89,
CMsg_0x86 = 0x86,
};
namespace netConnection { namespace netConnection {
class InFrame class InFrame
{ {
@ -159,122 +286,6 @@ namespace rage
char pad_007C[4]; //0x007C char pad_007C[4]; //0x007C
void* m_data; //0x0080 void* m_data; //0x0080
}; };
enum class MessageType : std::uint32_t
{
MsgInvalid = 0xFFFFF,
MsgSessionAcceptChat = 0x62,
MsgStartMatchCmd = 0x2D,
MsgSetInvitableCmd = 0x1F,
MsgSessionMemberIds = 0x23,
MsgRequestGamerInfo = 0x54,
MsgRemoveGamersFromSessionCmd = 0x53,
MsgNotMigrating = 0x35,
MsgMigrateHostResponse = 0x12,
MsgMigrateHostRequest = 0x66,
MsgJoinResponse = 0x2A,
MsgJoinRequest = 0x41,
MsgHostLeftWhilstJoiningCmd = 0x58,
MsgConfigResponse = 0x5F,
MsgConfigRequest = 0x48,
MsgChangeSessionAttributesCmd = 0x5A,
MsgAddGamerToSessionCmd = 0x64, // this is where send net info to lobby is called, among other things
MsgReassignResponse = 0x10,
MsgReassignNegotiate = 0x01,
MsgReassignConfirm = 0x26,
MsgPlayerData = 0x18,
MsgPackedReliables = 0x30,
MsgPackedCloneSyncACKs = 0x3B,
MsgNonPhysicalData = 0x16,
MsgNetArrayMgrUpdateAck = 0x5D,
MsgNetArrayMgrUpdate = 0x60,
MsgNetArrayMgrSplitUpdateAck = 0x25,
MsgScriptVerifyHostAck = 0x0B,
MsgScriptVerifyHost = 0x3E,
MsgScriptNewHost = 0x0E,
MsgScriptMigrateHostFailAck = 0x1A,
MsgScriptMigrateHost = 0x33,
MsgScriptLeaveAck = 0x40,
MsgScriptLeave = 0x17,
MsgScriptJoinHostAck = 0x4D,
MsgScriptJoinAck = 0x43,
MsgScriptJoin = 0x5C,
MsgScriptHostRequest = 0x67,
MsgScriptHandshakeAck = 0x5B,
MsgScriptHandshake = 0x57,
MsgScriptBotLeave = 0x2B, // unused?
MsgScriptBotJoinAck = 0x63, // unused?
MsgScriptBotJoin = 0x1C, // unused?
MsgScriptBotHandshakeAck = 0x31, // unused?
MsgScriptBotHandshake = 0x4B, // unused?
MsgPartyLeaveGame = 0x3D,
MsgPartyEnterGame = 0x1E,
MsgCloneSync = 0x4E, // aka clone_create, clone_sync etc.
MsgActivateNetworkBot = 0x65, // unused?
MsgRequestObjectIds = 0x29,
MsgInformObjectIds = 0x09,
MsgTextMessage = 0x24, // this one is for chat
MsgPlayerIsTyping = 0x61,
MsgPackedEvents = 0x4F, // aka received_event
MsgPackedEventReliablesMsgs = 0x20,
MsgRequestKickFromHost = 0x0D,
MsgTransitionToGameStart = 0x50,
MsgTransitionToGameNotify = 0x02,
MsgTransitionToActivityStart = 0x06,
MsgTransitionToActivityFinish = 0x36,
MsgTransitionParameters = 0x3C,
MsgTransitionParameterString = 0x37,
MsgTransitionLaunchNotify = 0x1B,
MsgTransitionLaunch = 0x19,
MsgTransitionGamerInstruction = 0x14,
MsgTextMessage2 = 0x0A, // this one is for phone message
MsgSessionEstablishedRequest = 0x52,
MsgSessionEstablished = 0x07,
MsgRequestTransitionParameters = 0x42,
MsgRadioStationSyncRequest = 0x47,
MsgRadioStationSync = 0x46,
MsgPlayerCardSync = 0x3A,
MsgPlayerCardRequest = 0x6A,
MsgLostConnectionToHost = 0x81,
MsgKickPlayer = 0x34, // host kick
MsgDebugStall = 0x7E, // unused?
MsgCheckQueuedJoinRequestReply = 0x59,
MsgCheckQueuedJoinRequest = 0x51,
MsgBlacklist = 0x0C,
MsgRoamingRequestBubbleRequiredResponse = 0x83,
MsgRoamingRequestBubbleRequiredCheck = 0x82,
MsgRoamingRequestBubble = 0x2E,
MsgRoamingJoinBubble = 0x4C,
MsgRoamingJoinBubbleAck = 0x3F,
MsgRoamingInitialBubble = 0x32,
MsgVoiceStatus = 0x03,
MsgTextChatStatus = 0x00,
MsgJoinResponse2 = 0x08,
MsgJoinRequest2 = 0x68,
MsgNetTimeSync = 0x38, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 37
MsgNetComplaint = 0x55, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 54
MsgNetLagPing = 0x27, // unused? ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 26
MsgSearchResponse = 0x6B, // unused? ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 6A
MsgSearchRequest = 0x05, // unused?
MsgQosProbeResponse = 0x2C, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 2B
MsgQosProbeRequest = 0x1D, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 1C
MsgCxnRelayAddressChanged = 0x49, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 48
MsgCxnRequestRemoteTimeout = 0x2F, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 2E
MsgSessionDetailRequest = 0x22, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 21
MsgSessionDetailResponse = 0x13, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 12
MsgKeyExchangeOffer = 0x0F, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 0E (last result)
MsgKeyExchangeAnswer = 0x44, // ctor 40 53 48 83 EC 20 BA ? ? ? ? 4C 8D 0D ? ? ? ? 48 8B D9 44 8D 42 43
Msg_0x87 = 0x87,
Msg_0x88 = 0x88,
Msg_0x80 = 0x80,
Msg_0x28 = 0x28,
Msg_0x11 = 0x11,
Msg_0x45 = 0x45,
Msg_0x89 = 0x89,
Msg_0x86 = 0x86,
};
} }
class CEventNetwork class CEventNetwork

View File

@ -83,11 +83,6 @@ namespace big
view::always(); view::always();
} }
void gui::script_init()
{
g_notification_service->push("Welcome", fmt::format("Loaded YimMenu. Press {} to open", ImGui::key_names[g->settings.hotkeys.menu_toggle]));
}
void gui::script_on_tick() void gui::script_on_tick()
{ {
TRY_CLAUSE TRY_CLAUSE
@ -128,7 +123,7 @@ namespace big
void gui::script_func() void gui::script_func()
{ {
g_gui.script_init(); g_notification_service->push("Welcome", fmt::format("Loaded YimMenu. Press {} to open", ImGui::key_names[g->settings.hotkeys.menu_toggle]));
while (true) while (true)
{ {
g_gui.script_on_tick(); g_gui.script_on_tick();

View File

@ -10,7 +10,6 @@ namespace big
void dx_on_tick(); void dx_on_tick();
void always_draw(); void always_draw();
void script_init();
void script_on_tick(); void script_on_tick();
static void script_func(); static void script_func();
public: public:

View File

@ -19,13 +19,9 @@ namespace big
hooking::hooking() : hooking::hooking() :
// Swapchain // Swapchain
m_swapchain_hook(*g_pointers->m_swapchain, hooks::swapchain_num_funcs), m_swapchain_hook(*g_pointers->m_swapchain, hooks::swapchain_num_funcs),
// SetCursorPos
m_set_cursor_pos_hook("SCP", memory::module("user32.dll").get_export("SetCursorPos").as<void*>(), &hooks::set_cursor_pos),
// Script Hook // Script Hook
m_run_script_threads_hook("SH", g_pointers->m_run_script_threads, &hooks::run_script_threads), m_run_script_threads_hook("SH", g_pointers->m_run_script_threads, &hooks::run_script_threads),
// ConvertThreadToFibe
m_convert_thread_to_fiber_hook("CTTF", memory::module("kernel32.dll").get_export("ConvertThreadToFiber").as<void*>(), &hooks::convert_thread_to_fiber),
// GTA Thead Start // GTA Thead Start
m_gta_thread_start_hook("GTS", g_pointers->m_gta_thread_start, &hooks::gta_thread_start), m_gta_thread_start_hook("GTS", g_pointers->m_gta_thread_start, &hooks::gta_thread_start),
@ -80,11 +76,9 @@ namespace big
void hooking::enable() void hooking::enable()
{ {
m_swapchain_hook.enable(); m_swapchain_hook.enable();
m_og_wndproc = reinterpret_cast<WNDPROC>(SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(&hooks::wndproc))); m_og_wndproc = WNDPROC(SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, LONG_PTR(&hooks::wndproc)));
m_set_cursor_pos_hook.enable();
m_run_script_threads_hook.enable(); m_run_script_threads_hook.enable();
m_convert_thread_to_fiber_hook.enable();
m_gta_thread_start_hook.enable(); m_gta_thread_start_hook.enable();
m_gta_thread_kill_hook.enable(); m_gta_thread_kill_hook.enable();
@ -137,10 +131,8 @@ namespace big
m_gta_thread_kill_hook.disable(); m_gta_thread_kill_hook.disable();
m_gta_thread_start_hook.disable(); m_gta_thread_start_hook.disable();
m_convert_thread_to_fiber_hook.disable();
m_run_script_threads_hook.disable(); m_run_script_threads_hook.disable();
m_set_cursor_pos_hook.disable();
SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(m_og_wndproc)); SetWindowLongPtrW(g_pointers->m_hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(m_og_wndproc));
m_swapchain_hook.disable(); m_swapchain_hook.disable();
} }
@ -164,34 +156,8 @@ namespace big
g_script_mgr.tick(); g_script_mgr.tick();
} }
return g_hooking->m_run_script_threads_hook.get_original<functions::run_script_threads_t>()(ops_to_execute); return g_hooking->m_run_script_threads_hook.get_original<functions::run_script_threads>()(ops_to_execute);
} EXCEPT_CLAUSE } EXCEPT_CLAUSE
return false; return false;
} }
void *hooks::convert_thread_to_fiber(void *param)
{
TRY_CLAUSE
{
if (IsThreadAFiber())
{
return GetCurrentFiber();
}
return g_hooking->m_convert_thread_to_fiber_hook.get_original<decltype(&convert_thread_to_fiber)>()(param);
} EXCEPT_CLAUSE
return nullptr;
}
BOOL hooks::set_cursor_pos(int x, int y)
{
TRY_CLAUSE
{
if (g_gui.m_opened)
return true;
return g_hooking->m_set_cursor_pos_hook.get_original<decltype(&set_cursor_pos)>()(x, y);
} EXCEPT_CLAUSE
return FALSE;
}
} }

View File

@ -12,7 +12,6 @@ namespace big
struct hooks struct hooks
{ {
static bool run_script_threads(std::uint32_t ops_to_execute); static bool run_script_threads(std::uint32_t ops_to_execute);
static void *convert_thread_to_fiber(void *param);
static constexpr auto swapchain_num_funcs = 19; static constexpr auto swapchain_num_funcs = 19;
static constexpr auto swapchain_present_index = 8; static constexpr auto swapchain_present_index = 8;
@ -21,7 +20,6 @@ namespace big
static HRESULT swapchain_resizebuffers(IDXGISwapChain *this_, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT new_format, UINT swapchain_flags); static HRESULT swapchain_resizebuffers(IDXGISwapChain *this_, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT new_format, UINT swapchain_flags);
static LRESULT wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); static LRESULT wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
static BOOL set_cursor_pos(int x, int y);
static GtaThread* gta_thread_start(unsigned int** a1, unsigned int a2); static GtaThread* gta_thread_start(unsigned int** a1, unsigned int a2);
static rage::eThreadState gta_thread_kill(GtaThread* thread); static rage::eThreadState gta_thread_kill(GtaThread* thread);
@ -55,10 +53,10 @@ namespace big
static bool send_net_info_to_lobby(rage::netPlayerData* player, int64_t a2, int64_t a3, DWORD* a4); static bool send_net_info_to_lobby(rage::netPlayerData* player, int64_t a2, int64_t a3, DWORD* a4);
static bool receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame); static bool receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame);
static void get_network_event_data(__int64 a1, rage::CEventNetwork* net_event); static void get_network_event_data(int64_t unk, rage::CEventNetwork* net_event);
//SYNC //SYNC
static signed __int64 received_clone_sync(CNetworkObjectMgr* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, unsigned __int16 sync_type, unsigned __int16 obj_id, rage::datBitBuffer* a6, unsigned __int16 a7, unsigned int timestamp); static int64_t received_clone_sync(CNetworkObjectMgr* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, uint16_t sync_type, uint16_t obj_id, rage::datBitBuffer* bufer, uint16_t unk, uint32_t timestamp);
}; };
struct minhook_keepalive struct minhook_keepalive
@ -84,10 +82,8 @@ namespace big
vmt_hook m_swapchain_hook; vmt_hook m_swapchain_hook;
WNDPROC m_og_wndproc = nullptr; WNDPROC m_og_wndproc = nullptr;
detour_hook m_set_cursor_pos_hook;
detour_hook m_run_script_threads_hook; detour_hook m_run_script_threads_hook;
detour_hook m_convert_thread_to_fiber_hook;
detour_hook m_gta_thread_start_hook; detour_hook m_gta_thread_start_hook;
detour_hook m_gta_thread_kill_hook; detour_hook m_gta_thread_kill_hook;

View File

@ -2,11 +2,9 @@
namespace big namespace big
{ {
void hooks::get_network_event_data(__int64 a1, rage::CEventNetwork* net_event) void hooks::get_network_event_data(int64_t unk, rage::CEventNetwork* net_event)
{ {
__int64 event_type = net_event->get_type(); switch (net_event->get_type()) {
switch (event_type) {
case 161: //CEventNetworkRemovedFromSessionDueToComplaints case 161: //CEventNetworkRemovedFromSessionDueToComplaints
{ {
g_notification_service->push_warning("Kicked", "You have been desync kicked."); g_notification_service->push_warning("Kicked", "You have been desync kicked.");
@ -14,6 +12,6 @@ namespace big
} }
} }
return g_hooking->m_get_network_event_data_hook.get_original<decltype(&get_network_event_data)>()(a1, net_event); return g_hooking->m_get_network_event_data_hook.get_original<decltype(&get_network_event_data)>()(unk, net_event);
} }
} }

View File

@ -1,86 +1,50 @@
#include "hooking.hpp" #include "hooking.hpp"
#include "services/players/player_service.hpp" #include "services/players/player_service.hpp"
#include <natives.hpp>
namespace big namespace big
{ {
bool get_msg_type(rage::eNetMessage& msgType, rage::datBitBuffer& buffer)
inline bool get_message_type(rage::netConnection::MessageType& msg_type, rage::datBitBuffer& buffer)
{ {
uint32_t pos; uint32_t pos;
uint32_t magic; uint32_t magic;
uint32_t length; uint32_t length;
uint32_t extended{}; uint32_t extended{};
if ((buffer.m_flagBits & 2) != 0 || (buffer.m_flagBits & 1) == 0 ? (pos = buffer.m_curBit) : (pos = buffer.m_maxBit), if ((buffer.m_flagBits & 2) != 0 || (buffer.m_flagBits & 1) == 0 ? (pos = buffer.m_curBit) : (pos = buffer.m_maxBit),
buffer.m_bitsRead + 15 > pos || !buffer.ReadDword(&magic, 14) || magic != 0x3246 || !buffer.ReadDword(&extended, 1)) buffer.m_bitsRead + 15 > pos || !buffer.ReadDword(&magic, 14) || magic != 0x3246 || !buffer.ReadDword(&extended, 1)) {
{ msgType = rage::eNetMessage::CMsgInvalid;
msg_type = rage::netConnection::MessageType::MsgInvalid;
return false; return false;
} }
length = extended ? 16 : 8; length = extended ? 16 : 8;
if ((buffer.m_flagBits & 1) == 0 ? (pos = buffer.m_curBit) : (pos = buffer.m_maxBit), length + buffer.m_bitsRead <= pos && buffer.ReadDword((uint32_t*)&msgType, length))
if ((buffer.m_flagBits & 1) == 0 ? (pos = buffer.m_curBit) : (pos = buffer.m_maxBit), length + buffer.m_bitsRead <= pos && buffer.ReadDword((uint32_t*)&msg_type, length))
return true; return true;
else else
return false; return false;
} }
bool hooks::receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame) bool hooks::receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame)
{ {
if (frame->get_type() == 4) if (frame->get_type() == 4)
{ {
rage::datBitBuffer buffer((uint8_t*)frame->m_data, frame->m_length); rage::datBitBuffer buffer((uint8_t*)frame->m_data, frame->m_length);
buffer.m_flagBits = 1; buffer.m_flagBits = 1;
rage::netConnection::MessageType msg_type; rage::eNetMessage msgType;
const auto player = g_player_service->get_by_msg_id(frame->m_msg_id); const auto player = g_player_service->get_by_msg_id(frame->m_msg_id);
if (player && get_message_type(msg_type, buffer)) if (player && get_msg_type(msgType, buffer))
{ {
switch (msg_type) switch (msgType)
{ {
//Desync Kick //Desync Kick
case rage::netConnection::MessageType::MsgNetComplaint: case rage::eNetMessage::CMsgNetComplaint:
{ {
uint64_t host_token{}; uint64_t hostToken;
buffer.ReadQWord(&host_token, 64); buffer.ReadQWord(&hostToken, 0x40);
buffer.Seek(0);
std::vector<CNetGamePlayer*> players; player_ptr sender = g_player_service->get_by_host_token(hostToken);
sender->get_net_game_player()->m_complaints = USHRT_MAX; //Sender
uint32_t num_of_host_token{}; g_notification_service->push_warning("Blocked Kick", fmt::format("Desync kick from {}", sender->get_name()));
buffer.ReadDword(&num_of_host_token, 32);
if (num_of_host_token <= 64) {
std::vector<uint64_t> host_token_list{};
for (uint32_t i = 0; i < num_of_host_token; i++) {
uint64_t array_element{};
buffer.ReadQWord(&array_element, 64);
host_token_list.push_back(array_element);
const auto big_player = g_player_service->get_by_host_token(array_element);
if (big_player)
if (CNetGamePlayer* net_player = big_player->get_net_game_player())
players.push_back(net_player);
}
}
buffer.Seek(0); buffer.Seek(0);
if (!players.empty())
{
const auto& player = players.at(0);
if (player && player->is_valid())
{
player->m_complaints = 65535;
g_notification_service->push_warning("Blocked Kick", std::string("Blocked desync kick from ") + player->get_name());
}
}
return false; return false;
} }
} }
} }
} }

View File

@ -26,14 +26,7 @@ namespace big {
*/ */
signed __int64 hooks::received_clone_sync(CNetworkObjectMgr* mgr, int64_t hooks::received_clone_sync(CNetworkObjectMgr* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, uint16_t sync_type, uint16_t obj_id, rage::datBitBuffer* buffer, uint16_t unk, uint32_t timestamp) {
CNetGamePlayer* src,
CNetGamePlayer* dst,
unsigned __int16 sync_type,
unsigned __int16 obj_id,
rage::datBitBuffer* buffer,
unsigned __int16 a7,
unsigned int timestamp) {
auto sync_tree = g_pointers->m_get_sync_tree_for_type(mgr, sync_type); auto sync_tree = g_pointers->m_get_sync_tree_for_type(mgr, sync_type);
auto tree_name = g_pointers->m_get_sync_type_info(sync_type, 0); auto tree_name = g_pointers->m_get_sync_type_info(sync_type, 0);
@ -53,14 +46,15 @@ namespace big {
if (invalidsync) { if (invalidsync) {
if (g->notifications.invalid_sync.log)
if (g->notifications.invalid_sync.log) LOG(WARNING) << "Invalid sync: " << "Type: " << sync_type << " Tree name: " << tree_name << " From: " << src->get_name(); LOG(WARNING) << "Invalid sync: " << "Type: " << sync_type << " Tree name: " << tree_name << " From: " << src->get_name();
if (g->notifications.invalid_sync.notify) g_notification_service->push_warning("Invalid sync " + std::string(src->get_name()), "Type: " + std::to_string(sync_type) + "\nType name: " + tree_name); if (g->notifications.invalid_sync.notify)
g_notification_service->push_warning(fmt::format("Invalid Sync from {}", src->get_name()), fmt::format("Type {} in sync tree {}", sync_type, tree_name));
return 2; return 2;
} }
auto result = g_hooking->m_received_clone_sync_hook.get_original<decltype(&received_clone_sync)>()(mgr, src, dst, sync_type, obj_id, buffer, a7, timestamp); auto result = g_hooking->m_received_clone_sync_hook.get_original<decltype(&received_clone_sync)>()(mgr, src, dst, sync_type, obj_id, buffer, unk, timestamp);
return result; return result;

View File

@ -29,9 +29,9 @@ namespace big
return; return;
} }
switch ((RockstarEvent)event_id) switch (static_cast<eNetworkEvents>(event_id))
{ {
case RockstarEvent::NETWORK_INCREMENT_STAT_EVENT: case eNetworkEvents::CNetworkIncrementStatEvent:
{ {
const auto increment_stat_event = std::make_unique<CNetworkIncrementStatEvent>(); const auto increment_stat_event = std::make_unique<CNetworkIncrementStatEvent>();
buffer->ReadDword(&increment_stat_event->m_stat, 0x20); buffer->ReadDword(&increment_stat_event->m_stat, 0x20);
@ -45,7 +45,7 @@ namespace big
buffer->Seek(0); buffer->Seek(0);
break; break;
} }
case RockstarEvent::SCRIPT_ENTITY_STATE_CHANGE_EVENT: case eNetworkEvents::CScriptEntityStateChangeEvent:
{ {
uint16_t entity; uint16_t entity;
buffer->ReadWord(&entity, 13); buffer->ReadWord(&entity, 13);
@ -53,21 +53,15 @@ namespace big
buffer->ReadDword(&type, 4); buffer->ReadDword(&type, 4);
uint32_t unk; uint32_t unk;
buffer->ReadDword(&unk, 32); buffer->ReadDword(&unk, 32);
if (type == 6) {
if (type == 6)
{
uint16_t unk2; uint16_t unk2;
buffer->ReadWord(&unk2, 13); buffer->ReadWord(&unk2, 13);
uint32_t action; uint32_t action;
buffer->ReadDword(&action, 8); buffer->ReadDword(&action, 8);
if (action >= 15 && action <= 18) {
if (action >= 15 && action <= 18)
{
g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset);
if (g->notifications.received_event.vehicle_temp_action.log) if (g->notifications.received_event.vehicle_temp_action.log)
LOG(INFO) << "RECEIVED_EVENT_HANDLER : " << source_player->get_name() << "sent TASK_VEHICLE_TEMP_ACTION crash."; LOG(INFO) << "RECEIVED_EVENT_HANDLER : " << source_player->get_name() << "sent TASK_VEHICLE_TEMP_ACTION crash.";
if (g->notifications.received_event.vehicle_temp_action.notify) if (g->notifications.received_event.vehicle_temp_action.notify)
g_notification_service->push_warning("Protection", g_notification_service->push_warning("Protection",
fmt::format("{} sent TASK_VEHICLE_TEMP_ACTION crash.", source_player->get_name())); fmt::format("{} sent TASK_VEHICLE_TEMP_ACTION crash.", source_player->get_name()));
@ -78,7 +72,7 @@ namespace big
buffer->Seek(0); buffer->Seek(0);
break; break;
} }
case RockstarEvent::SCRIPTED_GAME_EVENT: case eNetworkEvents::CScriptedGameEvent:
{ {
const auto scripted_game_event = std::make_unique<CScriptedGameEvent>(); const auto scripted_game_event = std::make_unique<CScriptedGameEvent>();
buffer->ReadDword(&scripted_game_event->m_args_size, 32); buffer->ReadDword(&scripted_game_event->m_args_size, 32);
@ -95,7 +89,7 @@ namespace big
break; break;
} }
case RockstarEvent::NETWORK_CLEAR_PED_TASKS_EVENT: case eNetworkEvents::CNetworkClearPedTasksEvent:
{ {
if (source_player->m_player_id < 32) if (source_player->m_player_id < 32)
{ {
@ -116,7 +110,7 @@ namespace big
} }
// Don't block this event, we still want to report this player // Don't block this event, we still want to report this player
// because if we still report others, our account seems less fishy // because if we still report others, our account seems less fishy
case RockstarEvent::REPORT_CASH_SPAWN_EVENT: case eNetworkEvents::CReportCashSpawnEvent:
{ {
uint32_t money; uint32_t money;
@ -138,8 +132,8 @@ namespace big
break; break;
} }
// player sending this event is a modder // player sending this event is a modder
case RockstarEvent::NETWORK_CHECK_CODE_CRCS_EVENT: case eNetworkEvents::CNetworkCheckCodeCrcsEvent:
case RockstarEvent::REPORT_MYSELF_EVENT: case eNetworkEvents::CUpdateFxnEvent:
{ {
if (g->notifications.received_event.modder_detect.log) if (g->notifications.received_event.modder_detect.log)
LOG(INFO) << "RECEIVED_EVENT_HANDLER : " << source_player->get_name() << " sent modder event."; LOG(INFO) << "RECEIVED_EVENT_HANDLER : " << source_player->get_name() << " sent modder event.";
@ -151,7 +145,7 @@ namespace big
break; break;
} }
case RockstarEvent::REQUEST_CONTROL_EVENT: case eNetworkEvents::CRequestControlEvent:
{ {
g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset);

View File

@ -1,6 +1,5 @@
#include "common.hpp" #include "common.hpp"
#include "core/globals.hpp" #include "core/globals.hpp"
#include "features.hpp"
#include "fiber_pool.hpp" #include "fiber_pool.hpp"
#include "gui.hpp" #include "gui.hpp"
#include "logger.hpp" #include "logger.hpp"
@ -82,9 +81,9 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
auto gui_service_instance = std::make_unique<gui_service>(); auto gui_service_instance = std::make_unique<gui_service>();
LOG(INFO) << "Registered service instances..."; LOG(INFO) << "Registered service instances...";
g_script_mgr.add_script(std::make_unique<script>(&features::script_func, "Backend Main", false));
g_script_mgr.add_script(std::make_unique<script>(&gui::script_func, "GUI", false)); g_script_mgr.add_script(std::make_unique<script>(&gui::script_func, "GUI", false));
g_script_mgr.add_script(std::make_unique<script>(&backend::loop, "Backend Loop", false));
g_script_mgr.add_script(std::make_unique<script>(&backend::self_loop, "Self")); g_script_mgr.add_script(std::make_unique<script>(&backend::self_loop, "Self"));
g_script_mgr.add_script(std::make_unique<script>(&backend::weapons_loop, "Weapon")); g_script_mgr.add_script(std::make_unique<script>(&backend::weapons_loop, "Weapon"));
g_script_mgr.add_script(std::make_unique<script>(&backend::vehicles_loop, "Vehicle")); g_script_mgr.add_script(std::make_unique<script>(&backend::vehicles_loop, "Vehicle"));

View File

@ -42,20 +42,20 @@ namespace big
main_batch.add("NH", "48 8D 0D ? ? ? ? 48 8B 14 FA E8 ? ? ? ? 48 85 C0 75 0A", [this](memory::handle ptr) main_batch.add("NH", "48 8D 0D ? ? ? ? 48 8B 14 FA E8 ? ? ? ? 48 85 C0 75 0A", [this](memory::handle ptr)
{ {
m_native_registration_table = ptr.add(3).rip().as<rage::scrNativeRegistrationTable*>(); m_native_registration_table = ptr.add(3).rip().as<rage::scrNativeRegistrationTable*>();
m_get_native_handler = ptr.add(12).rip().as<functions::get_native_handler_t>(); m_get_native_handler = ptr.add(12).rip().as<functions::get_native_handler>();
}); });
// Fix Vectors // Fix Vectors
main_batch.add("FV", "83 79 18 00 48 8B D1 74 4A FF 4A 18 48 63 4A 18 48 8D 41 04 48 8B 4C CA", [this](memory::handle ptr) main_batch.add("FV", "83 79 18 00 48 8B D1 74 4A FF 4A 18 48 63 4A 18 48 8D 41 04 48 8B 4C CA", [this](memory::handle ptr)
{ {
m_fix_vectors = ptr.as<functions::fix_vectors_t>(); m_fix_vectors = ptr.as<functions::fix_vectors>();
}); });
// Script Threads // Script Threads
main_batch.add("ST", "45 33 F6 8B E9 85 C9 B8", [this](memory::handle ptr) main_batch.add("ST", "45 33 F6 8B E9 85 C9 B8", [this](memory::handle ptr)
{ {
m_script_threads = ptr.sub(4).rip().sub(8).as<decltype(m_script_threads)>(); m_script_threads = ptr.sub(4).rip().sub(8).as<decltype(m_script_threads)>();
m_run_script_threads = ptr.sub(0x1F).as<functions::run_script_threads_t>(); m_run_script_threads = ptr.sub(0x1F).as<functions::run_script_threads>();
}); });
// Script Programs // Script Programs
@ -120,6 +120,13 @@ namespace big
m_received_event = ptr.as<decltype(m_received_event)>(); m_received_event = ptr.as<decltype(m_received_event)>();
}); });
// Send Event Acknowledge
main_batch.add("SEA", "48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 80 7A", [this](memory::handle ptr)
{
m_send_event_ack = ptr.sub(5).as<decltype(m_send_event_ack)>();
});
// Received Event Signatures END
// Read Bitbugger WORD/DWORD // Read Bitbugger WORD/DWORD
main_batch.add("RBWD", "48 89 74 24 ? 57 48 83 EC 20 48 8B D9 33 C9 41 8B F0 8A", [this](memory::handle ptr) main_batch.add("RBWD", "48 89 74 24 ? 57 48 83 EC 20 48 8B D9 33 C9 41 8B F0 8A", [this](memory::handle ptr)
{ {
@ -132,12 +139,65 @@ namespace big
m_read_bitbuf_array = ptr.as<decltype(m_read_bitbuf_array)>(); m_read_bitbuf_array = ptr.as<decltype(m_read_bitbuf_array)>();
}); });
// Send Event Acknowledge // Read Bitbuffer WORD/DWORD
main_batch.add("SEA", "48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 80 7A", [this](memory::handle ptr) main_batch.add("RBD", "48 89 74 24 ? 57 48 83 EC 20 48 8B D9 33 C9 41 8B F0 8A", [this](memory::handle ptr)
{ {
m_send_event_ack = ptr.sub(5).as<decltype(m_send_event_ack)>(); m_read_bitbuf_dword = ptr.sub(5).as<decltype(m_read_bitbuf_dword)>();
});
// Read Bitbuffer String
main_batch.add("RBS", "E8 ? ? ? ? 48 8D 4F 3C", [this](memory::handle ptr)
{
m_read_bitbuf_string = ptr.add(1).rip().as<decltype(m_read_bitbuf_string)>();
});
// Read Bitbuffer Boolean
main_batch.add("RBB", "E8 ? ? ? ? 84 C0 74 2D 48 8D 57 20", [this](memory::handle ptr)
{
m_read_bitbuf_bool = ptr.add(1).rip().as<decltype(m_read_bitbuf_bool)>();
});
// Read Bitbuffer Arrau
main_batch.add("RBA", "48 89 5C 24 ? 57 48 83 EC 30 41 8B F8 4C", [this](memory::handle ptr)
{
m_read_bitbuf_array = ptr.as<decltype(m_read_bitbuf_array)>();
});
// Write Bitbuffer WORD/DWORD
main_batch.add("WBD", "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 83 EC 20 8B EA BF 01 ? ? ?", [this](memory::handle ptr)
{
m_write_bitbuf_dword = ptr.as<decltype(m_write_bitbuf_dword)>();
});
// Write Bitbuffer QWORD
main_batch.add("WBQ", "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 20 41 8B F0 48 8B EA 48 8B D9 41 83 F8 20", [this](memory::handle ptr)
{
m_write_bitbuf_qword = ptr.as<decltype( m_write_bitbuf_qword)>();
});
// Write Bitbuffer Int64
main_batch.add("WBI64", "E8 ? ? ? ? 8A 53 39 48 8B CF", [this](memory::handle ptr)
{
m_write_bitbuf_int64 = ptr.add(1).rip().as<decltype(m_write_bitbuf_int64)>();
});
// Write Bitbuffer Int32
main_batch.add("WBI32", "E8 ? ? ? ? 8A 53 74", [this](memory::handle ptr)
{
m_write_bitbuf_int32 = ptr.add(1).rip().as<decltype(m_write_bitbuf_int32)>();
});
// Write Bitbuffer Boolean
main_batch.add("WBB", "E8 ? ? ? ? 8A 57 39", [this](memory::handle ptr)
{
m_write_bitbuf_bool = ptr.add(1).rip().as<decltype(m_write_bitbuf_bool)>();
});
// Write Bitbuffer Array
main_batch.add("WBA", "E8 ? ? ? ? 01 7E 08", [this](memory::handle ptr)
{
m_write_bitbuf_array = ptr.add(1).rip().as<decltype(m_write_bitbuf_array)>();
}); });
// Received Event Signatures END
// Request Control of Entity PATCH // Request Control of Entity PATCH
main_batch.add("RCOE-Patch", "48 89 5C 24 ? 57 48 83 EC 20 8B D9 E8 ? ? ? ? ? ? ? ? 8B CB", [this](memory::handle ptr) main_batch.add("RCOE-Patch", "48 89 5C 24 ? 57 48 83 EC 20 8B D9 E8 ? ? ? ? ? ? ? ? 8B CB", [this](memory::handle ptr)
@ -215,13 +275,13 @@ namespace big
// GET_SCREEN_COORDS_FROM_WORLD_COORDS // GET_SCREEN_COORDS_FROM_WORLD_COORDS
main_batch.add("GSCFWC", "E8 ? ? ? ? 84 C0 74 19 F3 0F 10 44 24", [this](memory::handle ptr) main_batch.add("GSCFWC", "E8 ? ? ? ? 84 C0 74 19 F3 0F 10 44 24", [this](memory::handle ptr)
{ {
m_get_screen_coords_for_world_coords = ptr.add(1).rip().as<functions::get_screen_coords_for_world_coords*>(); m_get_screen_coords_for_world_coords = ptr.add(1).rip().as<functions::get_screen_coords_for_world_coords>();
}); });
// Get Gameplay Cam Coords // Get Gameplay Cam Coords
main_batch.add("GGCC", "8B 90 ? ? ? ? 89 13", [this](memory::handle ptr) main_batch.add("GGCC", "8B 90 ? ? ? ? 89 13", [this](memory::handle ptr)
{ {
m_get_gamplay_cam_coords = ptr.sub(0xE).as<functions::get_gameplay_cam_coords*>(); m_get_gameplay_cam_coords = ptr.sub(0xE).as<functions::get_gameplay_cam_coords>();
}); });
// Give Pickup Reward // Give Pickup Reward

View File

@ -19,28 +19,27 @@ namespace big
public: public:
HWND m_hwnd{}; HWND m_hwnd{};
eGameState *m_game_state{}; eGameState* m_game_state{};
bool *m_is_session_started{}; bool* m_is_session_started{};
CPedFactory** m_ped_factory{}; CPedFactory** m_ped_factory{};
CNetworkPlayerMgr** m_network_player_mgr{}; CNetworkPlayerMgr** m_network_player_mgr{};
CNetworkObjectMgr** m_network_object_mgr{}; CNetworkObjectMgr** m_network_object_mgr{};
rage::CReplayInterface** m_replay_interface{}; rage::CReplayInterface** m_replay_interface{};
functions::ptr_to_handle* m_ptr_to_handle{};
rage::scrNativeRegistrationTable *m_native_registration_table{}; functions::ptr_to_handle m_ptr_to_handle{};
functions::get_native_handler_t m_get_native_handler{}; rage::scrNativeRegistrationTable* m_native_registration_table{};
functions::fix_vectors_t m_fix_vectors{}; functions::get_native_handler m_get_native_handler{};
functions::fix_vectors m_fix_vectors{};
rage::atArray<GtaThread*> *m_script_threads{}; rage::atArray<GtaThread*>* m_script_threads{};
rage::scrProgramTable *m_script_program_table{}; rage::scrProgramTable* m_script_program_table{};
functions::run_script_threads_t m_run_script_threads{}; functions::run_script_threads m_run_script_threads{};
std::int64_t **m_script_globals{}; std::int64_t** m_script_globals{};
CGameScriptHandlerMgr **m_script_handler_mgr{}; CGameScriptHandlerMgr** m_script_handler_mgr{};
IDXGISwapChain **m_swapchain{}; IDXGISwapChain** m_swapchain{};
int* m_resolution_x; int* m_resolution_x;
int* m_resolution_y; int* m_resolution_y;
@ -54,7 +53,7 @@ namespace big
FriendRegistry* m_friend_registry{}; FriendRegistry* m_friend_registry{};
functions::get_screen_coords_for_world_coords* m_get_screen_coords_for_world_coords{}; functions::get_screen_coords_for_world_coords m_get_screen_coords_for_world_coords{};
HashTable<CBaseModelInfo*>* m_model_table; HashTable<CBaseModelInfo*>* m_model_table;
@ -68,33 +67,43 @@ namespace big
PVOID m_player_has_joined{}; PVOID m_player_has_joined{};
PVOID m_player_has_left{}; PVOID m_player_has_left{};
functions::get_gameplay_cam_coords* m_get_gamplay_cam_coords; functions::get_gameplay_cam_coords m_get_gameplay_cam_coords;
functions::give_pickup_rewards* m_give_pickup_rewards{}; functions::give_pickup_rewards m_give_pickup_rewards{};
functions::trigger_script_event* m_trigger_script_event{}; functions::trigger_script_event m_trigger_script_event{};
// Bitbuffer Read/Write START
functions::read_bitbuf_dword m_read_bitbuf_dword{};
functions::read_bitbuf_string m_read_bitbuf_string{};
functions::read_bitbuf_bool m_read_bitbuf_bool{};
functions::read_bitbuf_array m_read_bitbuf_array{};
functions::write_bitbuf_qword m_write_bitbuf_qword{};
functions::write_bitbuf_dword m_write_bitbuf_dword{};
functions::write_bitbuf_int64 m_write_bitbuf_int64{};
functions::write_bitbuf_int32 m_write_bitbuf_int32{};
functions::write_bitbuf_bool m_write_bitbuf_bool{};
functions::write_bitbuf_array m_write_bitbuf_array{};
// Bitbuffer Read/Write END
// Received Event Signatures START // Received Event Signatures START
functions::read_bitbuf_array* m_read_bitbuf_array{};
functions::read_bitbuf_dword* m_read_bitbuf_dword{};
PVOID m_received_event{}; PVOID m_received_event{};
functions::send_event_ack* m_send_event_ack{}; functions::send_event_ack m_send_event_ack{};
// Received Event Signatures END // Received Event Signatures END
//Sync Signatures START //Sync Signatures START
PVOID m_received_clone_sync; PVOID m_received_clone_sync;
functions::get_sync_tree_for_type* m_get_sync_tree_for_type{}; functions::get_sync_tree_for_type m_get_sync_tree_for_type{};
functions::get_sync_type_info* m_get_sync_type_info{}; functions::get_sync_type_info m_get_sync_type_info{};
functions::get_net_object* m_get_net_object{}; functions::get_net_object m_get_net_object{};
functions::get_net_object_for_player* m_get_net_object_for_player{}; functions::get_net_object_for_player m_get_net_object_for_player{};
//Sync Signatures END //Sync Signatures END
PVOID m_send_net_info_to_lobby{}; PVOID m_send_net_info_to_lobby{};
PVOID m_receive_net_message{}; PVOID m_receive_net_message{};
PVOID m_get_network_event_data{}; PVOID m_get_network_event_data{};
}; };
inline pointers *g_pointers{}; inline pointers* g_pointers{};
} }

View File

@ -32,7 +32,7 @@ namespace big::math
inline float calculate_distance_from_game_cam (rage::fvector3 player_position) inline float calculate_distance_from_game_cam (rage::fvector3 player_position)
{ {
const Vector3 plyr_coords = { player_position.x, player_position.y, player_position.z }; const Vector3 plyr_coords = { player_position.x, player_position.y, player_position.z };
const Vector3 cam_coords = g_pointers->m_get_gamplay_cam_coords(); const Vector3 cam_coords = g_pointers->m_get_gameplay_cam_coords();
return (float)distance_between_vectors(plyr_coords, cam_coords); return (float)distance_between_vectors(plyr_coords, cam_coords);
} }