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:
parent
bb405bb375
commit
795929f96c
@ -1,6 +1,6 @@
|
||||
{
|
||||
"game": {
|
||||
"online": "1.63",
|
||||
"build": "2699"
|
||||
"online": "1.64",
|
||||
"build": "2802"
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@ include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
gtav_classes
|
||||
GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git
|
||||
GIT_TAG 6fe1eefa9f24ec37727807bfe7a18a4dd2ef8621
|
||||
GIT_TAG 620948d00e390246f3f36b28595da80eb33b7d29
|
||||
GIT_PROGRESS TRUE
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
|
@ -14,7 +14,7 @@ namespace big
|
||||
while (g_running)
|
||||
{
|
||||
g->attempt_save();
|
||||
looped::system_disable_sigscanner();
|
||||
// looped::system_disable_sigscanner();
|
||||
looped::system_self_globals();
|
||||
looped::system_update_pointers();
|
||||
looped::system_desync_kick_protection();
|
||||
|
@ -82,7 +82,7 @@ namespace big
|
||||
"Spawn Into Personal Vehicle"
|
||||
};
|
||||
|
||||
auto transition_state = script_global(1574991);
|
||||
auto transition_state = script_global(1574993);
|
||||
eTransitionState last_state = eTransitionState::TRANSITION_STATE_EMPTY;
|
||||
void looped::hud_transition_state()
|
||||
{
|
||||
|
@ -57,10 +57,10 @@ namespace big
|
||||
|
||||
if (g->self.dance_mode && g->m_dance_thread->m_handler)
|
||||
{
|
||||
*script_global(1946244).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(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(295).at(7).as<int*>(), 2);
|
||||
*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(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(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(310).at(7).as<int*>(), 2);
|
||||
scr_functions::dance_loop.call(g->m_dance_thread, g->m_dance_program, {});
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,6 @@ namespace big
|
||||
{
|
||||
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...
|
||||
}
|
||||
}
|
@ -9,8 +9,8 @@ namespace big
|
||||
static bool state = false;
|
||||
static bool busy = false;
|
||||
|
||||
constexpr auto CARMOD_SHOP_STRUCT = 728; // struct<688> Local_
|
||||
constexpr auto CARMOD_SHOP_CUTSCENE = 2149; // "carmod_fam1" -- first boolean local below it
|
||||
constexpr auto CARMOD_SHOP_STRUCT = 730; // move_m@generic_idles@std -- one function below -- first local
|
||||
constexpr auto CARMOD_SHOP_CUTSCENE = 2208; // "carmod_fam1" -- first boolean local below it
|
||||
|
||||
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)
|
||||
{
|
||||
*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_STRUCT).at(11).as<int*>() = 4;
|
||||
|
@ -6,12 +6,12 @@ namespace big
|
||||
{
|
||||
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 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 08 00 00 5D ? ? ? 56 ? ? 6E", 5, { 0x2E, 0x01, 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"), "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 ? ? ? 71 57 ? ? 2C", 5, { 0x2E, 0x01, 0x00 }, &g->protections.script_host_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 ? ? ? 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("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
|
||||
|
||||
for (auto& entry : *g_pointers->m_script_program_table)
|
||||
|
@ -137,47 +137,43 @@ namespace big
|
||||
|
||||
enum class eRemoteEvent
|
||||
{
|
||||
Bounty = 1294995624, // (137, "FM_TXT_BNTY0", iVar1, PLAYER::GET_PLAYER_NAME(Var2.f_1), "", 5000, Var2.f_6);
|
||||
CeoBan = 1240068495, // mpply_vipgameplaydisabledtimer
|
||||
CeoKick = -1425016400, // BGDISMISSED
|
||||
CeoMoney = 547083265, // Goon_Paid_Large
|
||||
ClearWantedLevel = 1449852136,
|
||||
ForceMission = -283041276, // ), Var0.f_2, 1))
|
||||
ForceMission2 = -1908874529,
|
||||
GiveCollectible = -1178972880, // DLC_SUM20_HIDDEN_COLLECTIBLES xref
|
||||
GtaBanner = 145637109, // NETWORK::NETWORK_IS_SCRIPT_ACTIVE("BUSINESS_BATTLES", -1, true, 0) second one
|
||||
NetworkBail = 1674887089, // NETWORK::NETWORK_BAIL(16, 0, 0); xref func
|
||||
PersonalVehicleDestroyed = -1838276770, // PLYVEH_INS_DES1
|
||||
RemoteOffradar = -1973627888, // NETWORK::GET_TIME_DIFFERENCE(NETWORK::GET_NETWORK_TIME(), Var0.f_2)
|
||||
SendToCutscene = 2131601101, // (bVar3, bVar4, 125f, 1)
|
||||
SendToCayoPerico = 1361475530, // CELL_HI_INV
|
||||
Bounty = 1370461707, // (137, "FM_TXT_BNTY0", iVar1, PLAYER::GET_PLAYER_NAME(Var2.f_1), "", 5000, Var2.f_6);
|
||||
CeoBan = 316066012, // mpply_vipgameplaydisabledtimer
|
||||
CeoKick = -1831959078, // BGDISMISSED
|
||||
CeoMoney = 245065909, // Goon_Paid_Large
|
||||
ClearWantedLevel = 2080651008,
|
||||
ForceMission = 1858712297, // ), Var0.f_2, 1))
|
||||
ForceMission2 = -1578682814, // TICK_PH_INVA
|
||||
GiveCollectible = 697566862, // DLC_SUM20_HIDDEN_COLLECTIBLES xref
|
||||
GtaBanner = -795380017, // NETWORK::NETWORK_IS_SCRIPT_ACTIVE("BUSINESS_BATTLES", -1, true, 0) second one
|
||||
NetworkBail = 915462795, // NETWORK::NETWORK_BAIL(16, 0, 0); xref func
|
||||
PersonalVehicleDestroyed = -964882004, // PLYVEH_INS_DES1
|
||||
RemoteOffradar = -162943635, // NETWORK::GET_TIME_DIFFERENCE(NETWORK::GET_NETWORK_TIME(), Var0.f_2)
|
||||
SendToCutscene = 392606458, // (bVar3, bVar4, 125f, 1)
|
||||
SendToCayoPerico = -910497748, // CELL_HI_INV
|
||||
SendToLocation = 1214823473, // &Var222, 11);
|
||||
SHKick = 1037001637,
|
||||
SoundSpam = 1111927333, // CELL_APTINVYACHT
|
||||
Spectate = -2131157870, // SPEC_TCK1
|
||||
Teleport = -1390976345, // Mission_Pass_Notify
|
||||
TeleportToWarehouse = 2130458390, // CAM::FORCE_CINEMATIC_RENDERING_THIS_UPDATE(true) xref counter
|
||||
SoundSpam = -1891171016, // CELL_APTINVYACHT
|
||||
Spectate = -1903870031, // SPEC_TCK1
|
||||
Teleport = -168599209, // Mission_Pass_Notify
|
||||
TeleportToWarehouse = 434937615, // .f_4 == 50
|
||||
TransactionError = -768108950, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH
|
||||
VehicleKick = -714268990, // PIM_RFMOC
|
||||
Kick = 1674887089,
|
||||
ChangeMCRole = 656530441, // _PLAYSTATS_CHANGE_MC_ROLE
|
||||
DisableRecording = 867047895, // GET_FINAL_RENDERED_CAM_COORD
|
||||
MCTeleport = -555356783, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one)
|
||||
StartActivity = 1368055548, // (Var0.f_2, -1); first match
|
||||
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()
|
||||
VehicleKick = -852914485, // PIM_RFMOC
|
||||
MCTeleport = 879177392, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one)
|
||||
StartActivity = 243072129, // (Var0.f_2, -1); first match
|
||||
MarkPlayerAsBeast = -2001677186, // GB_BOSSBST xref == PLAYER... global (sadly doesn't actually turn people into the beast)
|
||||
KickFromInterior = 1454834612, // ENTITY::SET_ENTITY_HEALTH(PLAYER::PLAYER_PED_ID(), PED::GET_PED_MAX_HEALTH(PLAYER::PLAYER_PED_ID()), false)
|
||||
InteriorControl = 1268038438, // eventData.f_3 != _INVALID_PLAYER_INDEX_0()
|
||||
|
||||
Crash = 526822748, // SET_NO_LOADING_SCREEN, xref it
|
||||
Crash2 = 1348481963,
|
||||
Crash = -904555865, // SET_NO_LOADING_SCREEN, xref it
|
||||
Crash2 = 1775863255,
|
||||
|
||||
TSECommand = -1388926377, // CnCTG_IN_BF
|
||||
TSECommandRotateCam = -1762807505, // != 29) && f
|
||||
TSECommand = 113023613, // CnCTG_IN_BF
|
||||
TSECommandRotateCam = 0x69979fea /*joaat("pats_horse_right") in script*/, // != 29) && f
|
||||
|
||||
Notification = -1529596656,
|
||||
NotificationMoneyBanked = -849958015, // TICK_TC_BANK
|
||||
NotificationMoneyRemoved = -290070531, // TICK_TC_REMO
|
||||
NotificationMoneyStolen = -1640162684, // TICK_TC_STOL
|
||||
Notification = 548471420,
|
||||
NotificationMoneyBanked = -1032040118, // TICK_TC_BANK
|
||||
NotificationMoneyRemoved = -1197151915, // TICK_TC_REMO
|
||||
NotificationMoneyStolen = -28878294, // TICK_TC_STOL
|
||||
};
|
||||
|
||||
enum class eCollectibleType
|
||||
|
@ -5,33 +5,25 @@ namespace big::scr_globals
|
||||
{
|
||||
namespace size
|
||||
{
|
||||
constexpr int globalplayer_bd = 453;
|
||||
constexpr int gpbd_fm_3 = 599;
|
||||
constexpr int gpbd_fm_1 = 888;
|
||||
constexpr int globalplayer_bd = 466;
|
||||
constexpr int gpbd_fm_3 = 608;
|
||||
constexpr int gpbd_fm_1 = 862;
|
||||
}
|
||||
|
||||
namespace offset
|
||||
{
|
||||
namespace globalplayer_bd
|
||||
{
|
||||
constexpr int orbital_cannon_bitset = 416;
|
||||
}
|
||||
}
|
||||
static inline script_global gsbd(2648605);
|
||||
static inline script_global gsbd_fm(1835504);
|
||||
static inline script_global gsbd_kicking(1885209);
|
||||
static inline script_global gsbd_fm_events(1923597);
|
||||
static inline script_global gsbd_block_c(2652258);
|
||||
|
||||
static inline script_global gsbd(2680265);
|
||||
static inline script_global gsbd_fm(1835502);
|
||||
static inline script_global gsbd_kicking(1883751);
|
||||
static inline script_global gsbd_fm_events(1920255);
|
||||
static inline script_global gsbd_block_c(2683918);
|
||||
static inline script_global globalplayer_bd(2657589);
|
||||
static inline script_global gpbd_fm_3(1894573);
|
||||
static inline script_global gpbd_fm_1(1853910);
|
||||
|
||||
static inline script_global globalplayer_bd(2689235);
|
||||
static inline script_global gpbd_fm_3(1892703);
|
||||
static inline script_global gpbd_fm_1(1853348);
|
||||
static inline script_global launcher_global(2756257);
|
||||
|
||||
static inline script_global launcher_global(2779753);
|
||||
|
||||
static inline script_global sp(113386);
|
||||
static inline script_global mission_definition(91229);
|
||||
static inline script_global sp(113648);
|
||||
static inline script_global mission_definition(91469);
|
||||
|
||||
static inline script_global creator_job_metadata(4718592);
|
||||
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_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 mechanic_global = script_global(2815059);
|
||||
static inline script_global vehicle_global = script_global(1586468);
|
||||
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 am_hunt_the_beast
|
||||
{
|
||||
constexpr static auto broadcast_idx = 597;
|
||||
constexpr static auto broadcast_idx = 599;
|
||||
}
|
||||
}
|
12016
src/crossmap.cpp
12016
src/crossmap.cpp
File diff suppressed because it is too large
Load Diff
@ -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_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::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::constraint_attachment_crash>("CAC", g_pointers->m_constraint_attachment_crash);
|
||||
detour_hook_helper::add<hooks::invalid_decal>("IDC", g_pointers->m_invalid_decal_crash);
|
||||
|
@ -25,7 +25,6 @@ class ClonedTakeOffPedVariationInfo;
|
||||
|
||||
namespace rage
|
||||
{
|
||||
class rlMetric;
|
||||
class snSession;
|
||||
class JSONNode;
|
||||
class netArrayHandlerBase;
|
||||
@ -87,8 +86,6 @@ namespace big
|
||||
|
||||
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
|
||||
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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -141,14 +141,6 @@ namespace big
|
||||
return true;
|
||||
}
|
||||
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:
|
||||
if (g->protections.script_events.personal_vehicle_destroyed)
|
||||
{
|
||||
@ -275,7 +267,7 @@ namespace big
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case eRemoteEvent::SHKick:
|
||||
case eRemoteEvent::NetworkBail:
|
||||
if (g->protections.script_events.network_bail)
|
||||
{
|
||||
if (auto plyr = g_player_service->get_by_id(player->m_player_id))
|
||||
@ -339,7 +331,7 @@ namespace big
|
||||
}
|
||||
case eRemoteEvent::InteriorControl:
|
||||
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))
|
||||
session::add_infraction(plyr, Infraction::TRIED_KICK_PLAYER);
|
||||
|
@ -63,7 +63,7 @@ namespace memory
|
||||
|
||||
//Loop data
|
||||
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)
|
||||
{
|
||||
|
@ -51,8 +51,8 @@ namespace big
|
||||
void native_hook::hook_instance(rage::scrProgram* program, const std::unordered_map<rage::scrNativeHash, rage::scrNativeHandler>& native_replacements)
|
||||
{
|
||||
m_program = program;
|
||||
m_vmt_hook = std::make_unique<vmt_hook>(m_program, 3);
|
||||
m_vmt_hook->hook(0, &scrprogram_dtor);
|
||||
m_vmt_hook = std::make_unique<vmt_hook>(m_program, 9);
|
||||
m_vmt_hook->hook(6, &scrprogram_dtor);
|
||||
m_vmt_hook->enable();
|
||||
|
||||
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())
|
||||
{
|
||||
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.reset();
|
||||
it->second->m_handler_hook->disable();
|
||||
|
@ -15,7 +15,7 @@ namespace big
|
||||
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.");
|
||||
|
||||
*script_global(4535606).as<int*>() = 0;
|
||||
*script_global(4536673).as<int*>() = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -317,9 +317,9 @@ namespace big
|
||||
});
|
||||
|
||||
// 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
|
||||
@ -430,12 +430,6 @@ namespace big
|
||||
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
|
||||
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
|
||||
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>();
|
||||
});
|
||||
@ -618,7 +612,7 @@ namespace big
|
||||
});
|
||||
|
||||
// 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>*>();
|
||||
});
|
||||
@ -697,7 +691,7 @@ namespace big
|
||||
}
|
||||
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();
|
||||
|
||||
|
@ -123,8 +123,6 @@ namespace big
|
||||
PVOID m_get_network_event_data{};
|
||||
PVOID m_assign_physical_index{};
|
||||
|
||||
PVOID m_format_metric_for_sending;
|
||||
|
||||
Network** m_network;
|
||||
|
||||
functions::start_get_session_by_gamer_handle m_start_get_session_by_gamer_handle;
|
||||
|
@ -26,7 +26,7 @@ namespace big::kick
|
||||
const size_t arg_count = 3;
|
||||
int64_t args[arg_count] =
|
||||
{
|
||||
(int64_t)eRemoteEvent::Kick,
|
||||
(int64_t)eRemoteEvent::NetworkBail,
|
||||
(int64_t)self::id,
|
||||
*scr_globals::gpbd_fm_3.at(target->id(), scr_globals::size::gpbd_fm_3).at(510).as<int64_t*>()
|
||||
};
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
namespace big::mobile
|
||||
{
|
||||
inline auto player_global = script_global(2689235);
|
||||
inline auto player_global = script_global(2657589);
|
||||
|
||||
namespace util
|
||||
{
|
||||
@ -28,7 +28,7 @@ namespace big::mobile
|
||||
|
||||
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)
|
||||
{
|
||||
*scr_globals::globalplayer_bd.at(PLAYER::GET_PLAYER_INDEX(), scr_globals::size::globalplayer_bd).at(208).as<int*>() = toggle;
|
||||
*script_global(2703735).at(56).as<int*>() = NETWORK::GET_NETWORK_TIME() + 1;
|
||||
*scr_globals::globalplayer_bd.at(PLAYER::GET_PLAYER_INDEX(), scr_globals::size::globalplayer_bd).at(210).as<int*>() = toggle;
|
||||
*script_global(2672505).at(56).as<int*>() = NETWORK::GET_NETWORK_TIME() + 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,12 +45,12 @@ namespace big::mobile
|
||||
{
|
||||
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()
|
||||
{
|
||||
*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()
|
||||
{
|
||||
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)
|
||||
{
|
||||
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.");
|
||||
|
||||
if (g->clone_pv.spawn_inside && self::veh)
|
||||
@ -115,19 +115,19 @@ namespace big::mobile
|
||||
|
||||
script::get_current()->yield(100ms);
|
||||
|
||||
*scr_globals::mechanic_global.at(924).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(961).as<int*>() = 0; // required
|
||||
*scr_globals::mechanic_global.at(958).as<int*>() = veh_idx;
|
||||
*scr_globals::mechanic_global.at(936).as<int*>() = 1; // disable vehicle node distance check
|
||||
*scr_globals::mechanic_global.at(923).as<int*>() = 1; // tell freemode to spawn our vehicle
|
||||
*scr_globals::mechanic_global.at(982).as<int*>() = 0; // required
|
||||
*scr_globals::mechanic_global.at(979).as<int*>() = veh_idx;
|
||||
|
||||
script::get_current()->yield(100ms);
|
||||
|
||||
GtaThread* freemode_thread = gta_util::find_script_thread(RAGE_JOAAT("freemode"));
|
||||
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
|
||||
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)
|
||||
{
|
||||
|
@ -87,7 +87,7 @@ namespace big::scripts
|
||||
{
|
||||
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;
|
||||
break;
|
||||
@ -155,7 +155,7 @@ namespace big::scripts
|
||||
// 6) Actually get the script to start
|
||||
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
|
||||
*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;
|
||||
|
||||
launcher->m_context.m_state = rage::eThreadState::running;
|
||||
@ -234,18 +234,18 @@ incorrect:
|
||||
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"), {
|
||||
0x6F, // PUSH_CONST_1
|
||||
0x72, // PUSH_CONST_1
|
||||
0x00 // NOP
|
||||
}, 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
|
||||
}, 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)), {
|
||||
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
|
||||
}, 5); // allow fast zoom in mp
|
||||
}
|
||||
|
@ -15,12 +15,12 @@ namespace big::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)
|
||||
*script_global(1574589).at(2).as<int*>() = -1;
|
||||
else
|
||||
*script_global(1575015).as<int*>() = (int)session;
|
||||
*script_global(1575017).as<int*>() = (int)session;
|
||||
|
||||
*script_global(1574589).as<int*>() = 1;
|
||||
script::get_current()->yield(200ms);
|
||||
@ -32,21 +32,22 @@ namespace big::session
|
||||
"FOGGY", "OVERCAST", "RAIN", "THUNDER",
|
||||
"CLEARING", "NEUTRAL", "SNOW", "BLIZZARD",
|
||||
"SNOWLIGHT", "XMAS", "HALLOWEEN" };
|
||||
|
||||
inline void local_weather()
|
||||
{
|
||||
MISC::CLEAR_OVERRIDE_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)
|
||||
{
|
||||
int idx = 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(348).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(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);
|
||||
}
|
||||
|
||||
@ -54,8 +55,8 @@ namespace big::session
|
||||
{
|
||||
int idx = 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(348).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(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);
|
||||
}
|
||||
|
||||
@ -141,18 +142,18 @@ namespace big::session
|
||||
if (owner == -1)
|
||||
owner = player->id();
|
||||
|
||||
*script_global(1946250).at(3607).as<int*>() = 0;
|
||||
*script_global(1946250).at(3605).as<int*>() = 1;
|
||||
*script_global(1946250).at(4703).as<int*>() = 1;
|
||||
*script_global(1946250).at(3218).as<int*>() = 1;
|
||||
*script_global(1946250).at(3214).as<int*>() = 1;
|
||||
*script_global(1946250).at(3612).as<int*>() = 1;
|
||||
*script_global(1950108).at(3684).as<int*>() = 0;
|
||||
*script_global(1950108).at(3682).as<int*>() = 1;
|
||||
*script_global(1950108).at(4780).as<int*>() = 1;
|
||||
*script_global(1950108).at(3218).as<int*>() = 1; // this doesnt exists at all?
|
||||
*script_global(1950108).at(3214).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(1946250).as<int*>(), 6);
|
||||
misc::clear_bit(script_global(1946250).at(1).as<int*>(), 9);
|
||||
// misc::set_bit(script_global(1950108).at(1).as<int*>(), 22);
|
||||
misc::set_bit(script_global(1950108).as<int*>(), 6);
|
||||
misc::clear_bit(script_global(1950108).at(1).as<int*>(), 9);
|
||||
|
||||
*script_global(1946250).at(3280).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(3346).as<int*>() = owner;
|
||||
*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*>();
|
||||
}
|
||||
}
|
||||
|
@ -191,8 +191,8 @@ namespace big::toxic
|
||||
int64_t args[arg_count]{
|
||||
(int64_t)eRemoteEvent::KickFromInterior,
|
||||
(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(318).at(7).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(321).at(7).as<int64_t*>(),
|
||||
};
|
||||
|
||||
g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target->id());
|
||||
|
@ -13,11 +13,6 @@
|
||||
|
||||
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)
|
||||
{
|
||||
switch (speed_unit)
|
||||
|
@ -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 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");
|
||||
|
||||
|
@ -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 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()); });
|
||||
ImGui::SameLine();
|
||||
|
Reference in New Issue
Block a user