Fix script patches crashing game on unload (#590)

This commit is contained in:
maybegreat48 2022-11-12 21:02:50 +00:00 committed by GitHub
parent ade733e4a0
commit ddc70a76e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 26 additions and 8 deletions

View File

@ -5,14 +5,14 @@ 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 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 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 09 00 00 5D ? ? ? 56 ? ? 2E", 5, { 0x2E, 0x01, 0x00 }, nullptr }); // disable death when undermap/spectating
for (auto& entry : *g_pointers->m_script_program_table)
{
if (entry.m_program)
g_script_patcher_service.on_script_load(entry.m_program);
g_script_patcher_service->on_script_load(entry.m_program);
}
}
}

View File

@ -11,7 +11,7 @@ namespace big
{
g_fiber_pool->queue_job([]
{
g_script_patcher_service.update();
g_script_patcher_service->update();
});
}

View File

@ -7,7 +7,7 @@ namespace big
bool hooks::init_native_tables(rage::scrProgram* program)
{
bool ret = g_hooking->get_original<hooks::init_native_tables>()(program);
g_script_patcher_service.on_script_load(program);
g_script_patcher_service->on_script_load(program);
g_native_hooks->hook_program(program);
return ret;

View File

@ -9,7 +9,7 @@ namespace big
{
uint8_t** orig_bytecode = program->m_code_blocks;
if (auto bytecode = g_script_patcher_service.get_script_bytecode(program->m_name_hash))
if (auto bytecode = g_script_patcher_service->get_script_bytecode(program->m_name_hash); bytecode && g_running)
program->m_code_blocks = bytecode;
auto ret = g_hooking->get_original<hooks::script_vm>()(start_stack, scr_globals, program, ctx);

View File

@ -22,6 +22,7 @@
#include "services/notifications/notification_service.hpp"
#include "services/model_preview/model_preview_service.hpp"
#include "services/vehicle/handling_service.hpp"
#include "services/script_patcher/script_patcher_service.hpp"
BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
{
@ -84,6 +85,7 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
auto model_preview_service_instance = std::make_unique<model_preview_service>();
auto handling_service_instance = std::make_unique<handling_service>();
auto gui_service_instance = std::make_unique<gui_service>();
auto script_patcher_service_instance = std::make_unique<script_patcher_service>();
LOG(INFO) << "Registered service instances...";
g_script_mgr.add_script(std::make_unique<script>(&gui::script_func, "GUI", false));
@ -131,6 +133,8 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
thread_pool_instance.reset();
LOG(INFO) << "Thread pool uninitialized.";
script_patcher_service_instance.reset();
LOG(INFO) << "Script patcher service reset.";
gui_service_instance.reset();
LOG(INFO) << "Gui Service reset.";
gta_data_service_instance.reset();

View File

@ -34,6 +34,7 @@ namespace big
native_hooks::~native_hooks()
{
m_script_hooks.clear();
g_native_hooks = nullptr;
}

View File

@ -51,6 +51,16 @@ namespace big
p.update(data);
}
script_patcher_service::script_patcher_service()
{
g_script_patcher_service = this;
}
script_patcher_service::~script_patcher_service()
{
g_script_patcher_service = nullptr;
}
void script_patcher_service::add_patch(script_patch&& patch)
{
m_script_patches.push_back(std::move(patch));

View File

@ -16,11 +16,14 @@ namespace big
void update_all_patches_for_script(rage::joaat_t script);
public:
script_patcher_service();
~script_patcher_service();
void add_patch(script_patch&& patch);
void on_script_load(rage::scrProgram* program);
std::uint8_t** get_script_bytecode(rage::joaat_t script);
void update();
};
inline script_patcher_service g_script_patcher_service;
inline script_patcher_service* g_script_patcher_service;
}