Update to 1.64 (#691)

* Update some globals
* fix(pointers): bypass C4 limit
* fix(pointers): CanApplyData signature
* feat(hooks): removed metric formatter
The function in question no longer exists along with the other metric functions.

* chore(metadata): bumped online and build number
* fix(pointers): updated Rage Security signature
* Updated some globals and locals. Part 1
* Update crossmap
* chore(Script): update script patches
* chore(nativeHooks): Update rage::scrProgram vtable size
* chore(nativeHooks): Fix rage::scrProgram destructor index
* fix(Sigscanner): Temporarily disable AC bypass
* chore(Hooks): disable can_apply_data
* Updated some globals and locals. Part 2
* chore(globals): Update transition state global
* chore(ScriptLauncher): Update local index
* feat(Toxic): Add new teleport locations
* fix(Protections): Update max interior index

Co-authored-by: Yimura <24669514+Yimura@users.noreply.github.com>
Co-authored-by: Bugisoft <58910128+BugisoftRSG@users.noreply.github.com>
Co-authored-by: BugisoftRSG <metaclientauth@gmail.com>
This commit is contained in:
maybegreat48 2022-12-14 16:27:40 +00:00 committed by GitHub
parent bb405bb375
commit 795929f96c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 5959 additions and 6411 deletions

View File

@ -1,6 +1,6 @@
{ {
"game": { "game": {
"online": "1.63", "online": "1.64",
"build": "2699" "build": "2802"
} }
} }

View File

@ -3,7 +3,7 @@ include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
gtav_classes gtav_classes
GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git
GIT_TAG 6fe1eefa9f24ec37727807bfe7a18a4dd2ef8621 GIT_TAG 620948d00e390246f3f36b28595da80eb33b7d29
GIT_PROGRESS TRUE GIT_PROGRESS TRUE
CONFIGURE_COMMAND "" CONFIGURE_COMMAND ""
BUILD_COMMAND "" BUILD_COMMAND ""

View File

@ -14,7 +14,7 @@ namespace big
while (g_running) while (g_running)
{ {
g->attempt_save(); g->attempt_save();
looped::system_disable_sigscanner(); // looped::system_disable_sigscanner();
looped::system_self_globals(); looped::system_self_globals();
looped::system_update_pointers(); looped::system_update_pointers();
looped::system_desync_kick_protection(); looped::system_desync_kick_protection();

View File

@ -82,7 +82,7 @@ namespace big
"Spawn Into Personal Vehicle" "Spawn Into Personal Vehicle"
}; };
auto transition_state = script_global(1574991); auto transition_state = script_global(1574993);
eTransitionState last_state = eTransitionState::TRANSITION_STATE_EMPTY; eTransitionState last_state = eTransitionState::TRANSITION_STATE_EMPTY;
void looped::hud_transition_state() void looped::hud_transition_state()
{ {

View File

@ -57,10 +57,10 @@ namespace big
if (g->self.dance_mode && g->m_dance_thread->m_handler) if (g->self.dance_mode && g->m_dance_thread->m_handler)
{ {
*script_global(1946244).as<bool*>() = true; *script_global(1950102).as<bool*>() = true;
misc::set_bit(scr_globals::gpbd_fm_1.at(self::id, scr_globals::size::gpbd_fm_1).at(267).at(295).at(7).as<int*>(), 0); misc::set_bit(scr_globals::gpbd_fm_1.at(self::id, scr_globals::size::gpbd_fm_1).at(267).at(310).at(7).as<int*>(), 0);
misc::set_bit(scr_globals::gpbd_fm_1.at(self::id, scr_globals::size::gpbd_fm_1).at(267).at(295).at(7).as<int*>(), 1); misc::set_bit(scr_globals::gpbd_fm_1.at(self::id, scr_globals::size::gpbd_fm_1).at(267).at(310).at(7).as<int*>(), 1);
misc::set_bit(scr_globals::gpbd_fm_1.at(self::id, scr_globals::size::gpbd_fm_1).at(267).at(295).at(7).as<int*>(), 2); misc::set_bit(scr_globals::gpbd_fm_1.at(self::id, scr_globals::size::gpbd_fm_1).at(267).at(310).at(7).as<int*>(), 2);
scr_functions::dance_loop.call(g->m_dance_thread, g->m_dance_program, {}); scr_functions::dance_loop.call(g->m_dance_thread, g->m_dance_program, {});
} }
} }

View File

@ -5,6 +5,6 @@ namespace big
{ {
void looped::tunables_disable_phone() void looped::tunables_disable_phone()
{ {
*script_global(20249).as<bool*>() = g->tunables.disable_phone; *script_global(20366).as<bool*>() = g->tunables.disable_phone; // Who even uses that...
} }
} }

View File

@ -9,8 +9,8 @@ namespace big
static bool state = false; static bool state = false;
static bool busy = false; static bool busy = false;
constexpr auto CARMOD_SHOP_STRUCT = 728; // struct<688> Local_ constexpr auto CARMOD_SHOP_STRUCT = 730; // move_m@generic_idles@std -- one function below -- first local
constexpr auto CARMOD_SHOP_CUTSCENE = 2149; // "carmod_fam1" -- first boolean local below it constexpr auto CARMOD_SHOP_CUTSCENE = 2208; // "carmod_fam1" -- first boolean local below it
void looped::vehicle_ls_customs() void looped::vehicle_ls_customs()
{ {
@ -58,7 +58,7 @@ namespace big
{ {
if (auto carmod_shop_thread = gta_util::find_script_thread(hash); carmod_shop_thread) if (auto carmod_shop_thread = gta_util::find_script_thread(hash); carmod_shop_thread)
{ {
*script_local(carmod_shop_thread, CARMOD_SHOP_STRUCT).at(406).as<int*>() = veh; // "HIDDEN_RADIO_09_HIPHOP_OLD" *script_local(carmod_shop_thread, CARMOD_SHOP_STRUCT).at(409).as<int*>() = veh; // "HIDDEN_RADIO_09_HIPHOP_OLD"
*script_local(carmod_shop_thread, CARMOD_SHOP_CUTSCENE).as<bool*>() = false; // skips cutscene that's invisible *script_local(carmod_shop_thread, CARMOD_SHOP_CUTSCENE).as<bool*>() = false; // skips cutscene that's invisible
*script_local(carmod_shop_thread, CARMOD_SHOP_STRUCT).at(11).as<int*>() = 4; *script_local(carmod_shop_thread, CARMOD_SHOP_STRUCT).at(11).as<int*>() = 4;

View File

@ -6,12 +6,12 @@ namespace big
{ {
void register_script_patches() void register_script_patches()
{ {
g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 08 00 ? 38 00 5D ? ? ? 2A 06", 5, {0x6E, 0x2E, 0x01, 0x01}, &g->session.decloak_players }); g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 08 00 ? 38 00 5D ? ? ? 2A 06", 5, {0x71, 0x2E, 0x01, 0x01}, &g->session.decloak_players });
g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 04 00 ? 2C ? ? ? 5D ? ? ? 6E 57 ? ? 2C", 5, { 0x2E, 0x01, 0x00 }, &g->protections.script_host_kick }); g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 04 00 ? 2C ? ? ? 5D ? ? ? 71 57 ? ? 2C", 5, { 0x2E, 0x01, 0x00 }, &g->protections.script_host_kick });
g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 08 00 00 5D ? ? ? 56 ? ? 6E", 5, { 0x2E, 0x01, 0x00 }, &g->tunables.no_idle_kick }); g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 00 07 00 00 5D ? ? ? 56 ? ? 71", 5, { 0x2E, 0x00, 0x00 }, &g->tunables.no_idle_kick });
g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "5D ? ? ? 73 57 ? ? 5D ? ? ? 73", 0, { 0x2E, 0x00, 0x00 }, nullptr }); // end session kick protection g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "5D ? ? ? 76 57 ? ? 5D ? ? ? 76", 0, { 0x2E, 0x00, 0x00 }, nullptr }); // end session kick protection
g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 09 00 00 5D ? ? ? 56 ? ? 2E", 5, { 0x2E, 0x01, 0x00 }, nullptr }); // disable death when undermap/spectating g_script_patcher_service->add_patch({ RAGE_JOAAT("freemode"), "2D 01 09 00 00 5D ? ? ? 56 ? ? 2E", 5, { 0x2E, 0x01, 0x00 }, nullptr }); // disable death when undermap/spectating
g_script_patcher_service->add_patch({ RAGE_JOAAT("shop_controller"), "2D 01 04 00 00 2C ? ? ? 56 ? ? 6E", 5, { 0x6E, 0x2E, 0x01, 0x01 }, nullptr }); // despawn bypass g_script_patcher_service->add_patch({ RAGE_JOAAT("shop_controller"), "2D 01 04 00 00 2C ? ? ? 56 ? ? 71", 5, { 0x71, 0x2E, 0x01, 0x01 }, nullptr }); // despawn bypass
g_script_patcher_service->add_patch({ RAGE_JOAAT("shop_controller"), "38 00 5D ? ? ? 38 00 5D ? ? ? 38 00 41", 0, std::vector<uint8_t>(12, 0x0), nullptr}); // godmode/invisibility detection bypass g_script_patcher_service->add_patch({ RAGE_JOAAT("shop_controller"), "38 00 5D ? ? ? 38 00 5D ? ? ? 38 00 41", 0, std::vector<uint8_t>(12, 0x0), nullptr}); // godmode/invisibility detection bypass
for (auto& entry : *g_pointers->m_script_program_table) for (auto& entry : *g_pointers->m_script_program_table)

View File

@ -137,47 +137,43 @@ namespace big
enum class eRemoteEvent enum class eRemoteEvent
{ {
Bounty = 1294995624, // (137, "FM_TXT_BNTY0", iVar1, PLAYER::GET_PLAYER_NAME(Var2.f_1), "", 5000, Var2.f_6); Bounty = 1370461707, // (137, "FM_TXT_BNTY0", iVar1, PLAYER::GET_PLAYER_NAME(Var2.f_1), "", 5000, Var2.f_6);
CeoBan = 1240068495, // mpply_vipgameplaydisabledtimer CeoBan = 316066012, // mpply_vipgameplaydisabledtimer
CeoKick = -1425016400, // BGDISMISSED CeoKick = -1831959078, // BGDISMISSED
CeoMoney = 547083265, // Goon_Paid_Large CeoMoney = 245065909, // Goon_Paid_Large
ClearWantedLevel = 1449852136, ClearWantedLevel = 2080651008,
ForceMission = -283041276, // ), Var0.f_2, 1)) ForceMission = 1858712297, // ), Var0.f_2, 1))
ForceMission2 = -1908874529, ForceMission2 = -1578682814, // TICK_PH_INVA
GiveCollectible = -1178972880, // DLC_SUM20_HIDDEN_COLLECTIBLES xref GiveCollectible = 697566862, // DLC_SUM20_HIDDEN_COLLECTIBLES xref
GtaBanner = 145637109, // NETWORK::NETWORK_IS_SCRIPT_ACTIVE("BUSINESS_BATTLES", -1, true, 0) second one GtaBanner = -795380017, // NETWORK::NETWORK_IS_SCRIPT_ACTIVE("BUSINESS_BATTLES", -1, true, 0) second one
NetworkBail = 1674887089, // NETWORK::NETWORK_BAIL(16, 0, 0); xref func NetworkBail = 915462795, // NETWORK::NETWORK_BAIL(16, 0, 0); xref func
PersonalVehicleDestroyed = -1838276770, // PLYVEH_INS_DES1 PersonalVehicleDestroyed = -964882004, // PLYVEH_INS_DES1
RemoteOffradar = -1973627888, // NETWORK::GET_TIME_DIFFERENCE(NETWORK::GET_NETWORK_TIME(), Var0.f_2) RemoteOffradar = -162943635, // NETWORK::GET_TIME_DIFFERENCE(NETWORK::GET_NETWORK_TIME(), Var0.f_2)
SendToCutscene = 2131601101, // (bVar3, bVar4, 125f, 1) SendToCutscene = 392606458, // (bVar3, bVar4, 125f, 1)
SendToCayoPerico = 1361475530, // CELL_HI_INV SendToCayoPerico = -910497748, // CELL_HI_INV
SendToLocation = 1214823473, // &Var222, 11); SendToLocation = 1214823473, // &Var222, 11);
SHKick = 1037001637, SoundSpam = -1891171016, // CELL_APTINVYACHT
SoundSpam = 1111927333, // CELL_APTINVYACHT Spectate = -1903870031, // SPEC_TCK1
Spectate = -2131157870, // SPEC_TCK1 Teleport = -168599209, // Mission_Pass_Notify
Teleport = -1390976345, // Mission_Pass_Notify TeleportToWarehouse = 434937615, // .f_4 == 50
TeleportToWarehouse = 2130458390, // CAM::FORCE_CINEMATIC_RENDERING_THIS_UPDATE(true) xref counter
TransactionError = -768108950, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH TransactionError = -768108950, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH
VehicleKick = -714268990, // PIM_RFMOC VehicleKick = -852914485, // PIM_RFMOC
Kick = 1674887089, MCTeleport = 879177392, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one)
ChangeMCRole = 656530441, // _PLAYSTATS_CHANGE_MC_ROLE StartActivity = 243072129, // (Var0.f_2, -1); first match
DisableRecording = 867047895, // GET_FINAL_RENDERED_CAM_COORD MarkPlayerAsBeast = -2001677186, // GB_BOSSBST xref == PLAYER... global (sadly doesn't actually turn people into the beast)
MCTeleport = -555356783, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one) KickFromInterior = 1454834612, // ENTITY::SET_ENTITY_HEALTH(PLAYER::PLAYER_PED_ID(), PED::GET_PED_MAX_HEALTH(PLAYER::PLAYER_PED_ID()), false)
StartActivity = 1368055548, // (Var0.f_2, -1); first match InteriorControl = 1268038438, // eventData.f_3 != _INVALID_PLAYER_INDEX_0()
MarkPlayerAsBeast = -490124271, // GB_BOSSBST xref == PLAYER... global (sadly doesn't actually turn people into the beast)
KickFromInterior = -1549662639, // ENTITY::SET_ENTITY_HEALTH(PLAYER::PLAYER_PED_ID(), PED::GET_PED_MAX_HEALTH(PLAYER::PLAYER_PED_ID()), false)
InteriorControl = 111242367, // eventData.f_3 != _INVALID_PLAYER_INDEX_0()
Crash = 526822748, // SET_NO_LOADING_SCREEN, xref it Crash = -904555865, // SET_NO_LOADING_SCREEN, xref it
Crash2 = 1348481963, Crash2 = 1775863255,
TSECommand = -1388926377, // CnCTG_IN_BF TSECommand = 113023613, // CnCTG_IN_BF
TSECommandRotateCam = -1762807505, // != 29) && f TSECommandRotateCam = 0x69979fea /*joaat("pats_horse_right") in script*/, // != 29) && f
Notification = -1529596656, Notification = 548471420,
NotificationMoneyBanked = -849958015, // TICK_TC_BANK NotificationMoneyBanked = -1032040118, // TICK_TC_BANK
NotificationMoneyRemoved = -290070531, // TICK_TC_REMO NotificationMoneyRemoved = -1197151915, // TICK_TC_REMO
NotificationMoneyStolen = -1640162684, // TICK_TC_STOL NotificationMoneyStolen = -28878294, // TICK_TC_STOL
}; };
enum class eCollectibleType enum class eCollectibleType

View File

@ -5,33 +5,25 @@ namespace big::scr_globals
{ {
namespace size namespace size
{ {
constexpr int globalplayer_bd = 453; constexpr int globalplayer_bd = 466;
constexpr int gpbd_fm_3 = 599; constexpr int gpbd_fm_3 = 608;
constexpr int gpbd_fm_1 = 888; constexpr int gpbd_fm_1 = 862;
} }
namespace offset static inline script_global gsbd(2648605);
{ static inline script_global gsbd_fm(1835504);
namespace globalplayer_bd static inline script_global gsbd_kicking(1885209);
{ static inline script_global gsbd_fm_events(1923597);
constexpr int orbital_cannon_bitset = 416; static inline script_global gsbd_block_c(2652258);
}
}
static inline script_global gsbd(2680265); static inline script_global globalplayer_bd(2657589);
static inline script_global gsbd_fm(1835502); static inline script_global gpbd_fm_3(1894573);
static inline script_global gsbd_kicking(1883751); static inline script_global gpbd_fm_1(1853910);
static inline script_global gsbd_fm_events(1920255);
static inline script_global gsbd_block_c(2683918);
static inline script_global globalplayer_bd(2689235); static inline script_global launcher_global(2756257);
static inline script_global gpbd_fm_3(1892703);
static inline script_global gpbd_fm_1(1853348);
static inline script_global launcher_global(2779753); static inline script_global sp(113648);
static inline script_global mission_definition(91469);
static inline script_global sp(113386);
static inline script_global mission_definition(91229);
static inline script_global creator_job_metadata(4718592); static inline script_global creator_job_metadata(4718592);
static inline script_global terminate_creator(1574607); // NETWORK::NETWORK_BAIL(1, 0, 0); fm_*_creator static inline script_global terminate_creator(1574607); // NETWORK::NETWORK_BAIL(1, 0, 0); fm_*_creator
@ -39,18 +31,18 @@ namespace big::scr_globals
static inline script_global mission_creator_radar_follows_camera(2621443); static inline script_global mission_creator_radar_follows_camera(2621443);
static inline script_global mission_creator_exited(1574530); static inline script_global mission_creator_exited(1574530);
static inline script_global in_multiplayer(78319); // g_bInMultiplayer static inline script_global in_multiplayer(78558); // g_bInMultiplayer
static inline script_global vehicle_global = script_global(1585857); static inline script_global vehicle_global = script_global(1586468);
static inline script_global mechanic_global = script_global(2815059); static inline script_global mechanic_global = script_global(2793044);
static inline script_global spawn_global = script_global(2725439); static inline script_global spawn_global = script_global(2694560);
} }
namespace big::scr_locals namespace big::scr_locals
{ {
namespace am_hunt_the_beast namespace am_hunt_the_beast
{ {
constexpr static auto broadcast_idx = 597; constexpr static auto broadcast_idx = 599;
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -31,7 +31,7 @@ namespace big
} }
detour_hook_helper::add<hooks::run_script_threads>("SH", g_pointers->m_run_script_threads); detour_hook_helper::add<hooks::run_script_threads>("SH", g_pointers->m_run_script_threads);
detour_hook_helper::add<hooks::get_label_text>("GLT", g_pointers->m_get_label_text); detour_hook_helper::add<hooks::get_label_text>("GLT", g_pointers->m_get_label_text);
detour_hook_helper::add<hooks::multiplayer_chat_filter>("MCF", g_pointers->m_multiplayer_chat_filter); detour_hook_helper::add<hooks::multiplayer_chat_filter>("MCF", g_pointers->m_multiplayer_chat_filter);
@ -56,13 +56,11 @@ namespace big
detour_hook_helper::add<hooks::received_clone_create>("RCC", g_pointers->m_received_clone_create); detour_hook_helper::add<hooks::received_clone_create>("RCC", g_pointers->m_received_clone_create);
detour_hook_helper::add<hooks::received_clone_sync>("RCS", g_pointers->m_received_clone_sync); detour_hook_helper::add<hooks::received_clone_sync>("RCS", g_pointers->m_received_clone_sync);
detour_hook_helper::add<hooks::can_apply_data>("CAD", g_pointers->m_can_apply_data); // detour_hook_helper::add<hooks::can_apply_data>("CAD", g_pointers->m_can_apply_data);
detour_hook_helper::add<hooks::get_network_event_data>("GNED", g_pointers->m_get_network_event_data); detour_hook_helper::add<hooks::get_network_event_data>("GNED", g_pointers->m_get_network_event_data);
detour_hook_helper::add<hooks::write_player_gamer_data_node>("WPGDN", g_pointers->m_write_player_gamer_data_node); detour_hook_helper::add<hooks::write_player_gamer_data_node>("WPGDN", g_pointers->m_write_player_gamer_data_node);
detour_hook_helper::add<hooks::format_metric_for_sending>("FMFS", g_pointers->m_format_metric_for_sending);
detour_hook_helper::add<hooks::invalid_mods_crash_detour>("IMCD", g_pointers->m_invalid_mods_crash_detour); detour_hook_helper::add<hooks::invalid_mods_crash_detour>("IMCD", g_pointers->m_invalid_mods_crash_detour);
detour_hook_helper::add<hooks::constraint_attachment_crash>("CAC", g_pointers->m_constraint_attachment_crash); detour_hook_helper::add<hooks::constraint_attachment_crash>("CAC", g_pointers->m_constraint_attachment_crash);
detour_hook_helper::add<hooks::invalid_decal>("IDC", g_pointers->m_invalid_decal_crash); detour_hook_helper::add<hooks::invalid_decal>("IDC", g_pointers->m_invalid_decal_crash);

View File

@ -25,7 +25,6 @@ class ClonedTakeOffPedVariationInfo;
namespace rage namespace rage
{ {
class rlMetric;
class snSession; class snSession;
class JSONNode; class JSONNode;
class netArrayHandlerBase; class netArrayHandlerBase;
@ -87,8 +86,6 @@ namespace big
static void* assign_physical_index(CNetworkPlayerMgr* netPlayerMgr, CNetGamePlayer* player, uint8_t new_index); static void* assign_physical_index(CNetworkPlayerMgr* netPlayerMgr, CNetGamePlayer* player, uint8_t new_index);
static void format_metric_for_sending(int a1, int64_t a2, int64_t a3, rage::rlMetric* metric);
//SYNC //SYNC
static bool received_clone_create(CNetworkObjectMgr* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, eNetObjType object_type, int32_t object_id, int32_t object_flag, rage::datBitBuffer* buffer, int32_t timestamp); static bool received_clone_create(CNetworkObjectMgr* mgr, CNetGamePlayer* src, CNetGamePlayer* dst, eNetObjType object_type, int32_t object_id, int32_t object_flag, rage::datBitBuffer* buffer, int32_t timestamp);
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 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);

View File

@ -1,55 +0,0 @@
#include "hooking.hpp"
#include <rage/rlMetric.hpp>
namespace rage
{
#pragma pack(push, 1)
class json_serializer
{
uint32_t unk0; // 0x00
uint32_t unk1; // 0x00
char* buffer; // 0x08
uint32_t curlen; // 0x10
uint32_t maxlen; // 0x14
uint32_t unk4; // 0x18
uint8_t flags; // 0x1C
public:
json_serializer(char* _buffer, uint32_t _length) :
buffer(_buffer),
maxlen(_length)
{
unk0 = 0;
unk1 = 0;
curlen = 0;
unk4 = 1;
flags = 0;
}
inline char* get_string() const
{
return buffer;
}
};
static_assert(sizeof(json_serializer) == 0x1D); // size is actually 0x20
#pragma pack(pop)
}
namespace big
{
void log_metric(rage::rlMetric* metric)
{
char buffer[256]{};
rage::json_serializer serializer(buffer, sizeof(buffer));
metric->serialize(&serializer);
LOG_IF(G3LOG_DEBUG, g->debug.logs.metric_logs) << "METRIC: " << metric->get_name() << "; DATA: " << serializer.get_string();
}
using send_metric_f = bool(*)(void* metric_mgr, rage::rlMetric*);
void hooks::format_metric_for_sending(int a1, int64_t a2, int64_t a3, rage::rlMetric* metric)
{
log_metric(metric);
}
}

View File

@ -141,14 +141,6 @@ namespace big
return true; return true;
} }
break; break;
case eRemoteEvent::NetworkBail:
if (g->protections.script_events.network_bail)
{
format_string(player_name, "Network Bail", notify.network_bail.log, notify.network_bail.notify);
return true;
}
break;
case eRemoteEvent::PersonalVehicleDestroyed: case eRemoteEvent::PersonalVehicleDestroyed:
if (g->protections.script_events.personal_vehicle_destroyed) if (g->protections.script_events.personal_vehicle_destroyed)
{ {
@ -275,7 +267,7 @@ namespace big
return true; return true;
} }
break; break;
case eRemoteEvent::SHKick: case eRemoteEvent::NetworkBail:
if (g->protections.script_events.network_bail) if (g->protections.script_events.network_bail)
{ {
if (auto plyr = g_player_service->get_by_id(player->m_player_id)) if (auto plyr = g_player_service->get_by_id(player->m_player_id))
@ -339,7 +331,7 @@ namespace big
} }
case eRemoteEvent::InteriorControl: case eRemoteEvent::InteriorControl:
int interior = (int)args[2]; int interior = (int)args[2];
if (interior < 0 || interior > 158) // the upper bound will change after an update if (interior < 0 || interior > 161) // the upper bound will change after an update
{ {
if (auto plyr = g_player_service->get_by_id(player->m_player_id)) if (auto plyr = g_player_service->get_by_id(player->m_player_id))
session::add_infraction(plyr, Infraction::TRIED_KICK_PLAYER); session::add_infraction(plyr, Infraction::TRIED_KICK_PLAYER);

View File

@ -63,7 +63,7 @@ namespace memory
//Loop data //Loop data
const auto scan_end = module_size - length; const auto scan_end = module_size - length;
for (std::size_t current_idx{}; current_idx != scan_end;) for (std::size_t current_idx{}; current_idx <= scan_end;)
{ {
for (std::ptrdiff_t sig_idx{ (std::ptrdiff_t)max_idx }; sig_idx >= 0; --sig_idx) for (std::ptrdiff_t sig_idx{ (std::ptrdiff_t)max_idx }; sig_idx >= 0; --sig_idx)
{ {

View File

@ -51,8 +51,8 @@ namespace big
void native_hook::hook_instance(rage::scrProgram* program, const std::unordered_map<rage::scrNativeHash, rage::scrNativeHandler>& native_replacements) void native_hook::hook_instance(rage::scrProgram* program, const std::unordered_map<rage::scrNativeHash, rage::scrNativeHandler>& native_replacements)
{ {
m_program = program; m_program = program;
m_vmt_hook = std::make_unique<vmt_hook>(m_program, 3); m_vmt_hook = std::make_unique<vmt_hook>(m_program, 9);
m_vmt_hook->hook(0, &scrprogram_dtor); m_vmt_hook->hook(6, &scrprogram_dtor);
m_vmt_hook->enable(); m_vmt_hook->enable();
m_handler_hook = std::make_unique<vmt_hook>(&m_program->m_native_entrypoints, m_program->m_native_count); m_handler_hook = std::make_unique<vmt_hook>(&m_program->m_native_entrypoints, m_program->m_native_count);
@ -85,7 +85,7 @@ namespace big
{ {
if (auto it = g_native_hooks->m_native_hooks.find(this_); it != g_native_hooks->m_native_hooks.end()) if (auto it = g_native_hooks->m_native_hooks.find(this_); it != g_native_hooks->m_native_hooks.end())
{ {
auto og_func = it->second->m_vmt_hook->get_original<decltype(&native_hook::scrprogram_dtor)>(0); auto og_func = it->second->m_vmt_hook->get_original<decltype(&native_hook::scrprogram_dtor)>(6);
it->second->m_vmt_hook->disable(); it->second->m_vmt_hook->disable();
it->second->m_vmt_hook.reset(); it->second->m_vmt_hook.reset();
it->second->m_handler_hook->disable(); it->second->m_handler_hook->disable();

View File

@ -15,7 +15,7 @@ namespace big
if (g->notifications.transaction_rate_limit.notify) if (g->notifications.transaction_rate_limit.notify)
g_notification_service->push_warning("Transaction Rate Limit", "You're receiving transaction rate limits, whatever you're doing do it less."); g_notification_service->push_warning("Transaction Rate Limit", "You're receiving transaction rate limits, whatever you're doing do it less.");
*script_global(4535606).as<int*>() = 0; *script_global(4536673).as<int*>() = 0;
return; return;
} }

View File

@ -317,9 +317,9 @@ namespace big
}); });
// Can Apply Data // Can Apply Data
main_batch.add("CAD", "49 8B CE FF 50 70 84 C0 74 31 33 FF", [this](memory::handle ptr) main_batch.add("CAD", "E8 ? ? ? ? 84 C0 0F 84 AF 01 00 00 48 8B 03", [this](memory::handle ptr)
{ {
m_can_apply_data = ptr.sub(0x2C).as<PVOID>(); m_can_apply_data = ptr.add(1).rip().as<PVOID>();
}); });
// Received clone sync & Get sync tree for type & Get net object for player & Get sync type info & Get net object // Received clone sync & Get sync tree for type & Get net object for player & Get sync type info & Get net object
@ -430,12 +430,6 @@ namespace big
m_send_chat_message = ptr.sub(21).as<functions::send_chat_message>(); m_send_chat_message = ptr.sub(21).as<functions::send_chat_message>();
}); });
// Format Metric For Sending
main_batch.add("FMFS", "48 8B C4 48 89 58 ? 48 89 70 ? 48 89 78 ? 4C 89 70 ? 55 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 83 3D", [this](memory::handle ptr)
{
m_format_metric_for_sending = ptr.as<PVOID>();
});
// Start Get Session By Gamer Handle // Start Get Session By Gamer Handle
main_batch.add("SGSBGH", "E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 8B 05 ? ? ? ? 48 8D 4C 24", [this](memory::handle ptr) main_batch.add("SGSBGH", "E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 8B 05 ? ? ? ? 48 8D 4C 24", [this](memory::handle ptr)
{ {
@ -606,7 +600,7 @@ namespace big
}); });
// Broadcast Net Array // Broadcast Net Array
main_batch.add("BNA", "48 89 5C 24 ? 48 89 54 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 40 48 8B 05 ? ? ? ? 66 44 89 4C 24 ?", [this](memory::handle ptr) main_batch.add("BNA", "48 89 5C 24 ? 48 89 54 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 40 48 8B 05 ? ? ? ? 66 44 89 4C 24", [this](memory::handle ptr)
{ {
m_broadcast_net_array = ptr.as<PVOID>(); m_broadcast_net_array = ptr.as<PVOID>();
}); });
@ -618,7 +612,7 @@ namespace big
}); });
// Rage Security // Rage Security
main_batch.add("RS", "48 8B ? ? ? ? ? 33 F6 E9 ? ? ? ? 55 48 8D ? ? ? ? ? 48 87 2C 24 C3 48 8B 45 50 0F B6 00", [this](memory::handle ptr) main_batch.add("RS", "48 8B 1D ? ? ? ? 33 F6 BD C3 9E 26 00", [this](memory::handle ptr)
{ {
m_security = ptr.add(3).rip().as<rage::atSingleton<rage::RageSecurity>*>(); m_security = ptr.add(3).rip().as<rage::atSingleton<rage::RageSecurity>*>();
}); });
@ -697,7 +691,7 @@ namespace big
} }
else LOG(WARNING) << "socialclub.dll module was not loaded within the time limit."; else LOG(WARNING) << "socialclub.dll module was not loaded within the time limit.";
if (auto pat = mem_region.scan("41 80 78 28 ? 0F 85 F5 01 00 00")) if (auto pat = mem_region.scan("41 80 78 28 ? 0F 85 ? ? ? ? 49 8B 80"))
{ {
m_bypass_max_count_of_active_sticky_bombs = memory::byte_patch::make(pat.add(4).as<uint8_t*>(), { 99 }).get(); m_bypass_max_count_of_active_sticky_bombs = memory::byte_patch::make(pat.add(4).as<uint8_t*>(), { 99 }).get();

View File

@ -123,8 +123,6 @@ namespace big
PVOID m_get_network_event_data{}; PVOID m_get_network_event_data{};
PVOID m_assign_physical_index{}; PVOID m_assign_physical_index{};
PVOID m_format_metric_for_sending;
Network** m_network; Network** m_network;
functions::start_get_session_by_gamer_handle m_start_get_session_by_gamer_handle; functions::start_get_session_by_gamer_handle m_start_get_session_by_gamer_handle;

View File

@ -26,7 +26,7 @@ namespace big::kick
const size_t arg_count = 3; const size_t arg_count = 3;
int64_t args[arg_count] = int64_t args[arg_count] =
{ {
(int64_t)eRemoteEvent::Kick, (int64_t)eRemoteEvent::NetworkBail,
(int64_t)self::id, (int64_t)self::id,
*scr_globals::gpbd_fm_3.at(target->id(), scr_globals::size::gpbd_fm_3).at(510).as<int64_t*>() *scr_globals::gpbd_fm_3.at(target->id(), scr_globals::size::gpbd_fm_3).at(510).as<int64_t*>()
}; };

View File

@ -13,7 +13,7 @@
namespace big::mobile namespace big::mobile
{ {
inline auto player_global = script_global(2689235); inline auto player_global = script_global(2657589);
namespace util namespace util
{ {
@ -28,7 +28,7 @@ namespace big::mobile
inline int get_current_personal_vehicle() inline int get_current_personal_vehicle()
{ {
return *script_global(2359296).at(0, 5559).at(675).at(2).as<int*>(); return *script_global(2359296).at(0, 5568).at(681).at(2).as<int*>();
} }
} }
@ -36,8 +36,8 @@ namespace big::mobile
{ {
inline void off_radar(bool toggle) inline void off_radar(bool toggle)
{ {
*scr_globals::globalplayer_bd.at(PLAYER::GET_PLAYER_INDEX(), scr_globals::size::globalplayer_bd).at(208).as<int*>() = toggle; *scr_globals::globalplayer_bd.at(PLAYER::GET_PLAYER_INDEX(), scr_globals::size::globalplayer_bd).at(210).as<int*>() = toggle;
*script_global(2703735).at(56).as<int*>() = NETWORK::GET_NETWORK_TIME() + 1; *script_global(2672505).at(56).as<int*>() = NETWORK::GET_NETWORK_TIME() + 1;
} }
} }
@ -45,12 +45,12 @@ namespace big::mobile
{ {
inline void request_ammo_drop() inline void request_ammo_drop()
{ {
*script_global(scr_globals::mechanic_global).at(874).as<int*>() = 1; *script_global(scr_globals::mechanic_global).at(886).as<int*>() = 1;
} }
inline void request_helicopter_pickup() inline void request_helicopter_pickup()
{ {
*script_global(scr_globals::mechanic_global).at(876).as<int*>() = 1; *script_global(scr_globals::mechanic_global).at(888).as<int*>() = 1;
} }
} }
@ -98,12 +98,12 @@ namespace big::mobile
{ {
inline Vehicle get_personal_vehicle() inline Vehicle get_personal_vehicle()
{ {
return *scr_globals::mechanic_global.at(298).as<Vehicle*>(); return *scr_globals::mechanic_global.at(299).as<Vehicle*>();
} }
inline void summon_vehicle_by_index(int veh_idx) inline void summon_vehicle_by_index(int veh_idx)
{ {
if (*scr_globals::mechanic_global.at(958).as<int*>() != -1) if (*scr_globals::mechanic_global.at(979).as<int*>() != -1)
return g_notification_service->push_warning("Vehicle", "Mechanic is not ready to deliver a vehicle right now."); return g_notification_service->push_warning("Vehicle", "Mechanic is not ready to deliver a vehicle right now.");
if (g->clone_pv.spawn_inside && self::veh) if (g->clone_pv.spawn_inside && self::veh)
@ -115,19 +115,19 @@ namespace big::mobile
script::get_current()->yield(100ms); script::get_current()->yield(100ms);
*scr_globals::mechanic_global.at(924).as<int*>() = 1; // disable vehicle node distance check *scr_globals::mechanic_global.at(936).as<int*>() = 1; // disable vehicle node distance check
*scr_globals::mechanic_global.at(911).as<int*>() = 1; // tell freemode to spawn our vehicle *scr_globals::mechanic_global.at(923).as<int*>() = 1; // tell freemode to spawn our vehicle
*scr_globals::mechanic_global.at(961).as<int*>() = 0; // required *scr_globals::mechanic_global.at(982).as<int*>() = 0; // required
*scr_globals::mechanic_global.at(958).as<int*>() = veh_idx; *scr_globals::mechanic_global.at(979).as<int*>() = veh_idx;
script::get_current()->yield(100ms); script::get_current()->yield(100ms);
GtaThread* freemode_thread = gta_util::find_script_thread(RAGE_JOAAT("freemode")); GtaThread* freemode_thread = gta_util::find_script_thread(RAGE_JOAAT("freemode"));
if (freemode_thread) if (freemode_thread)
*script_local(freemode_thread, 18399).at(176).as<int*>() = 0; // spawn vehicle instantly *script_local(freemode_thread, 18630).at(176).as<int*>() = 0; // spawn vehicle instantly
// blocking call till vehicle is delivered // blocking call till vehicle is delivered
notify::busy_spinner("Delivering vehicle...", scr_globals::mechanic_global.at(958).as<int*>(), -1); notify::busy_spinner("Delivering vehicle...", scr_globals::mechanic_global.at(979).as<int*>(), -1);
if (g->clone_pv.spawn_inside) if (g->clone_pv.spawn_inside)
{ {

View File

@ -87,7 +87,7 @@ namespace big::scripts
{ {
if (launcher->m_net_component->is_player_a_participant(plyr->get_net_game_player())) if (launcher->m_net_component->is_player_a_participant(plyr->get_net_game_player()))
{ {
if (*script_local(launcher->m_stack, 230).at(plyr->id(), 3).at(2).as<int*>() == state) if (*script_local(launcher->m_stack, 232).at(plyr->id(), 3).at(2).as<int*>() == state)
{ {
set = true; set = true;
break; break;
@ -155,7 +155,7 @@ namespace big::scripts
// 6) Actually get the script to start // 6) Actually get the script to start
misc::set_bit(scr_globals::launcher_global.at(1).as<int*>(), 1); // run immediately misc::set_bit(scr_globals::launcher_global.at(1).as<int*>(), 1); // run immediately
*scr_globals::launcher_global.at(2).as<int*>() = 6; // will change to 7 shortly but that's fine as players are guaranteed not to be in the waiting stage *scr_globals::launcher_global.at(2).as<int*>() = 6; // will change to 7 shortly but that's fine as players are guaranteed not to be in the waiting stage
*script_local(launcher->m_stack, 230).at(self::id, 3).at(2).as<int*>() = 6; *script_local(launcher->m_stack, 232).at(self::id, 3).at(2).as<int*>() = 6;
*scr_globals::launcher_global.at(3).at(1).as<int*>() = script_id; *scr_globals::launcher_global.at(3).at(1).as<int*>() = script_id;
launcher->m_context.m_state = rage::eThreadState::running; launcher->m_context.m_state = rage::eThreadState::running;
@ -234,18 +234,18 @@ incorrect:
if (auto program = gta_util::find_script_program(hash)) if (auto program = gta_util::find_script_program(hash))
{ {
patch_script(program, get_code_location_by_pattern(program, "2D 02 04 00 ? 38 01 38 00 42 13"), { patch_script(program, get_code_location_by_pattern(program, "2D 02 04 00 ? 38 01 38 00 42 13"), {
0x6F, // PUSH_CONST_1 0x72, // PUSH_CONST_1
0x00 // NOP 0x00 // NOP
}, 5); // place anywhere }, 5); // place anywhere
patch_script(program, get_code_location_by_pattern(program, "6E 08 2A 56 ? ? 2C ? ? ? 1F 56 ? ? 6F"), { patch_script(program, get_code_location_by_pattern(program, "71 08 2A 56 ? ? 2C ? ? ? 1F 56 ? ? 72"), {
0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00
}, 0xE); // don't bail on network mode }, 0xE); // don't bail on network mode
if (auto loc = get_code_location_by_pattern(program, "39 04 5D ? ? ? 6E")) if (auto loc = get_code_location_by_pattern(program, "39 04 5D ? ? ? 71"))
{ {
patch_script(program, read_uint24_t(program->get_code_address(loc.value() + 3)), { patch_script(program, read_uint24_t(program->get_code_address(loc.value() + 3)), {
0x70, // PUSH_CONST_2 0 = mp, 2 = creator, 999 = singleplayer 0x73, // PUSH_CONST_2 0 = mp, 2 = creator, 999 = singleplayer
0x2E, 0x00, 0x01 // LEAVE 0 1 0x2E, 0x00, 0x01 // LEAVE 0 1
}, 5); // allow fast zoom in mp }, 5); // allow fast zoom in mp
} }

View File

@ -15,12 +15,12 @@ namespace big::session
{ {
inline void join_type(eSessionType session) inline void join_type(eSessionType session)
{ {
*script_global(2726795).as<int*>() = (session == eSessionType::SC_TV ? 1 : 0); // If SC TV Then Enable Spectator Mode *script_global(2695915).as<int*>() = (session == eSessionType::SC_TV ? 1 : 0); // If SC TV Then Enable Spectator Mode
if (session == eSessionType::LEAVE_ONLINE) if (session == eSessionType::LEAVE_ONLINE)
*script_global(1574589).at(2).as<int*>() = -1; *script_global(1574589).at(2).as<int*>() = -1;
else else
*script_global(1575015).as<int*>() = (int)session; *script_global(1575017).as<int*>() = (int)session;
*script_global(1574589).as<int*>() = 1; *script_global(1574589).as<int*>() = 1;
script::get_current()->yield(200ms); script::get_current()->yield(200ms);
@ -32,21 +32,22 @@ namespace big::session
"FOGGY", "OVERCAST", "RAIN", "THUNDER", "FOGGY", "OVERCAST", "RAIN", "THUNDER",
"CLEARING", "NEUTRAL", "SNOW", "BLIZZARD", "CLEARING", "NEUTRAL", "SNOW", "BLIZZARD",
"SNOWLIGHT", "XMAS", "HALLOWEEN" }; "SNOWLIGHT", "XMAS", "HALLOWEEN" };
inline void local_weather() inline void local_weather()
{ {
MISC::CLEAR_OVERRIDE_WEATHER(); MISC::CLEAR_OVERRIDE_WEATHER();
MISC::SET_OVERRIDE_WEATHER(weathers[g->session.local_weather]); MISC::SET_OVERRIDE_WEATHER(weathers[g->session.local_weather]);
*script_global(262145).at(4723).as<bool*>() = g->session.local_weather == 13; *script_global(262145).at(4752).as<bool*>() = g->session.local_weather == 13;
} }
inline void set_fm_event_index(int index) inline void set_fm_event_index(int index)
{ {
int idx = index / 32; int idx = index / 32;
int bit = index % 32; int bit = index % 32;
misc::set_bit(scr_globals::gsbd_fm_events.at(11).at(341).at(idx, 1).as<int*>(), bit); misc::set_bit(scr_globals::gsbd_fm_events.at(11).at(354).at(idx, 1).as<int*>(), bit);
misc::set_bit(scr_globals::gsbd_fm_events.at(11).at(348).at(idx, 1).as<int*>(), bit); misc::set_bit(scr_globals::gsbd_fm_events.at(11).at(347).at(idx, 1).as<int*>(), bit);
misc::set_bit(scr_globals::gpbd_fm_3.at(self::id, scr_globals::size::gpbd_fm_3).at(10).at(205).at(idx, 1).as<int*>(), bit); misc::set_bit(scr_globals::gpbd_fm_3.at(self::id, scr_globals::size::gpbd_fm_3).at(10).at(205).at(idx, 1).as<int*>(), bit);
} }
@ -54,8 +55,8 @@ namespace big::session
{ {
int idx = index / 32; int idx = index / 32;
int bit = index % 32; int bit = index % 32;
misc::clear_bit(scr_globals::gsbd_fm_events.at(11).at(341).at(idx, 1).as<int*>(), bit); misc::clear_bit(scr_globals::gsbd_fm_events.at(11).at(354).at(idx, 1).as<int*>(), bit);
misc::clear_bit(scr_globals::gsbd_fm_events.at(11).at(348).at(idx, 1).as<int*>(), bit); misc::clear_bit(scr_globals::gsbd_fm_events.at(11).at(347).at(idx, 1).as<int*>(), bit);
misc::clear_bit(scr_globals::gpbd_fm_3.at(self::id, scr_globals::size::gpbd_fm_3).at(10).at(205).at(idx, 1).as<int*>(), bit); misc::clear_bit(scr_globals::gpbd_fm_3.at(self::id, scr_globals::size::gpbd_fm_3).at(10).at(205).at(idx, 1).as<int*>(), bit);
} }
@ -141,18 +142,18 @@ namespace big::session
if (owner == -1) if (owner == -1)
owner = player->id(); owner = player->id();
*script_global(1946250).at(3607).as<int*>() = 0; *script_global(1950108).at(3684).as<int*>() = 0;
*script_global(1946250).at(3605).as<int*>() = 1; *script_global(1950108).at(3682).as<int*>() = 1;
*script_global(1946250).at(4703).as<int*>() = 1; *script_global(1950108).at(4780).as<int*>() = 1;
*script_global(1946250).at(3218).as<int*>() = 1; *script_global(1950108).at(3218).as<int*>() = 1; // this doesnt exists at all?
*script_global(1946250).at(3214).as<int*>() = 1; *script_global(1950108).at(3214).as<int*>() = 1; // ^
*script_global(1946250).at(3612).as<int*>() = 1; *script_global(1950108).at(3689).as<int*>() = 1;
// misc::set_bit(script_global(1946250).at(1).as<int*>(), 22); // misc::set_bit(script_global(1950108).at(1).as<int*>(), 22);
misc::set_bit(script_global(1946250).as<int*>(), 6); misc::set_bit(script_global(1950108).as<int*>(), 6);
misc::clear_bit(script_global(1946250).at(1).as<int*>(), 9); misc::clear_bit(script_global(1950108).at(1).as<int*>(), 9);
*script_global(1946250).at(3280).as<int*>() = owner; *script_global(1950108).at(3346).as<int*>() = owner;
*script_global(1946250).at(3606).as<int*>() = *scr_globals::globalplayer_bd.at(player->id(), scr_globals::size::globalplayer_bd).at(318).at(6).as<int*>(); *script_global(1950108).at(3683).as<int*>() = *scr_globals::globalplayer_bd.at(player->id(), scr_globals::size::globalplayer_bd).at(318).at(6).as<int*>();
} }
} }

View File

@ -191,8 +191,8 @@ namespace big::toxic
int64_t args[arg_count]{ int64_t args[arg_count]{
(int64_t)eRemoteEvent::KickFromInterior, (int64_t)eRemoteEvent::KickFromInterior,
(int64_t)self::id, (int64_t)self::id,
*scr_globals::globalplayer_bd.at(target->id(), scr_globals::size::globalplayer_bd).at(318).at(6).as<int64_t*>(), *scr_globals::globalplayer_bd.at(target->id(), scr_globals::size::globalplayer_bd).at(321).at(6).as<int64_t*>(),
*scr_globals::globalplayer_bd.at(target->id(), scr_globals::size::globalplayer_bd).at(318).at(7).as<int64_t*>(), *scr_globals::globalplayer_bd.at(target->id(), scr_globals::size::globalplayer_bd).at(321).at(7).as<int64_t*>(),
}; };
g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target->id()); g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target->id());

View File

@ -13,11 +13,6 @@
namespace big::vehicle namespace big::vehicle
{ {
inline void go_into_personal_vehicle()
{
*script_global(2671449).at(8).as<int*>() = 1;
}
inline float mps_to_speed(float mps, SpeedUnit speed_unit) inline float mps_to_speed(float mps, SpeedUnit speed_unit)
{ {
switch (speed_unit) switch (speed_unit)

View File

@ -250,6 +250,10 @@ namespace big
components::button("TP All To Custom Auto Shop", [] { g_player_service->iterate([](auto& plyr) { toxic::send_player_to_interior(plyr.second, 149); }); }); components::button("TP All To Custom Auto Shop", [] { g_player_service->iterate([](auto& plyr) { toxic::send_player_to_interior(plyr.second, 149); }); });
components::button("TP All To Agency", [] { g_player_service->iterate([](auto& plyr) { toxic::send_player_to_interior(plyr.second, 155); }); }); components::button("TP All To Agency", [] { g_player_service->iterate([](auto& plyr) { toxic::send_player_to_interior(plyr.second, 155); }); });
ImGui::SameLine();
components::button("TP All To Freakshop", [] { g_player_service->iterate([](auto& plyr) { toxic::send_player_to_interior(plyr.second, 160); }); });
ImGui::SameLine();
components::button("TP All To Multi-Floor Garage", [] { g_player_service->iterate([](auto& plyr) { toxic::send_player_to_interior(plyr.second, 161); }); });
components::sub_title("Event Starter"); components::sub_title("Event Starter");

View File

@ -106,6 +106,10 @@ namespace big
components::button("TP To Custom Auto Shop", [] { toxic::send_player_to_interior(g_player_service->get_selected(), 149); }); components::button("TP To Custom Auto Shop", [] { toxic::send_player_to_interior(g_player_service->get_selected(), 149); });
components::button("TP To Agency", [] { toxic::send_player_to_interior(g_player_service->get_selected(), 155); }); components::button("TP To Agency", [] { toxic::send_player_to_interior(g_player_service->get_selected(), 155); });
ImGui::SameLine();
components::button("TP To Freakshop", [] { toxic::send_player_to_interior(g_player_service->get_selected(), 160); });
ImGui::SameLine();
components::button("TP To Multi-Floor Garage", [] { toxic::send_player_to_interior(g_player_service->get_selected(), 161); });
components::button("Give All Weapons", [] { toxic::give_all_weapons(g_player_service->get_selected()); }); components::button("Give All Weapons", [] { toxic::give_all_weapons(g_player_service->get_selected()); });
ImGui::SameLine(); ImGui::SameLine();