From 83ffa1c324a15a1fda86b6b4a67e3f301884f33b Mon Sep 17 00:00:00 2001 From: ineed bots Date: Sat, 3 Aug 2024 14:41:16 -0600 Subject: [PATCH] remove scheduler hooks (use plugin sdk) --- src/codsrc/clientscript/cscr_vm.cpp | 8 - src/component/fileio.cpp | 7 +- src/component/gsc.cpp | 2 +- src/component/scheduler.cpp | 259 +--------------------------- src/component/scheduler.hpp | 25 +-- 5 files changed, 5 insertions(+), 296 deletions(-) diff --git a/src/codsrc/clientscript/cscr_vm.cpp b/src/codsrc/clientscript/cscr_vm.cpp index 034302a..510ce71 100644 --- a/src/codsrc/clientscript/cscr_vm.cpp +++ b/src/codsrc/clientscript/cscr_vm.cpp @@ -4702,10 +4702,6 @@ namespace codsrc // Decomp Status: Tested, Completed void Scr_InitSystem(game::scriptInstance_t inst) { - // our additions - scheduler::exec_pre_scr_init_funcs(inst); - // - assert(!game::gScrVarPub[inst].timeArrayId); //assert(!game::gScrVarPub[inst].ext_threadcount); @@ -4731,10 +4727,6 @@ namespace codsrc assert(!game::gScrVarPub[inst].freeEntList); game::g_script_error_level[inst] = -1; - - // our additions - scheduler::exec_post_scr_init_funcs(inst); - // } //Restored function diff --git a/src/component/fileio.cpp b/src/component/fileio.cpp index f107aca..cbdbec3 100644 --- a/src/component/fileio.cpp +++ b/src/component/fileio.cpp @@ -146,13 +146,8 @@ namespace fileio void add_file_io() { - scheduler::on_pre_scr_init_system([]([[maybe_unused]] game::scriptInstance_t inst) + scheduler::on_scr_execute([]() { - if (inst != game::SCRIPTINSTANCE_SERVER) - { - return; - } - close_all_scr_fh(); }); diff --git a/src/component/gsc.cpp b/src/component/gsc.cpp index 3b67bc1..ca1a2ce 100644 --- a/src/component/gsc.cpp +++ b/src/component/gsc.cpp @@ -1,5 +1,5 @@ #include -#include "loader/component_loader.hpp" + #include "gsc.hpp" namespace gsc diff --git a/src/component/scheduler.cpp b/src/component/scheduler.cpp index 27270fc..fba20a8 100644 --- a/src/component/scheduler.cpp +++ b/src/component/scheduler.cpp @@ -1,266 +1,11 @@ #include -#include "loader/component_loader.hpp" #include "scheduler.hpp" -#include -#include - namespace scheduler { - namespace + void on_scr_execute(const std::function& callback) { - struct task - { - std::function handler{}; - std::chrono::milliseconds interval{}; - std::chrono::high_resolution_clock::time_point last_call{}; - }; - - using task_list = std::vector; - - class task_pipeline - { - public: - void add(task&& task) - { - new_callbacks_.access([&task](task_list& tasks) - { - tasks.emplace_back(std::move(task)); - }); - } - - void execute() - { - callbacks_.access([&](task_list& tasks) - { - this->merge_callbacks(); - - for (auto i = tasks.begin(); i != tasks.end();) - { - const auto now = std::chrono::high_resolution_clock::now(); - const auto diff = now - i->last_call; - - if (diff < i->interval) - { - ++i; - continue; - } - - i->last_call = now; - - const auto res = i->handler(); - if (res == cond_end) - { - i = tasks.erase(i); - } - else - { - ++i; - } - } - }); - } - - private: - utils::concurrency::container new_callbacks_; - utils::concurrency::container callbacks_; - - void merge_callbacks() - { - callbacks_.access([&](task_list& tasks) - { - new_callbacks_.access([&](task_list& new_tasks) - { - tasks.insert(tasks.end(), std::move_iterator(new_tasks.begin()), std::move_iterator(new_tasks.end())); - new_tasks = {}; - }); - }); - } - }; - - std::thread thread; - task_pipeline pipelines[pipeline::count]; - - void execute(const pipeline type) - { - assert(type >= 0 && type < pipeline::count); - pipelines[type].execute(); - } - - void execute_server() - { - execute(pipeline::server); - } - - void execute_main() - { - execute(pipeline::main); - } - - utils::hook::detour com_init_hook; - utils::hook::detour gscr_postloadscripts_hook; - - std::vector> post_init_funcs; - bool com_inited = false; - - void on_post_init_hook() - { - if (com_inited) - { - return; - } - com_inited = true; - for (const auto& func : post_init_funcs) - { - func(); - } - - post_init_funcs.clear(); - } - - void com_init_stub() - { - com_init_hook.invoke(); - on_post_init_hook(); - } - - std::vector> pre_scr_init_funcs; - std::vector> post_scr_init_funcs; - - utils::hook::detour pre_scr_init_system_hook; - utils::hook::detour post_scr_init_system_hook; - - void* pre_scr_init_system_original; - void* post_scr_init_system_original; - - NAKED void pre_scr_init_system_stub() - { - __asm - { - pushad; - push eax; - call exec_pre_scr_init_funcs; - add esp, 4; - popad; - - push pre_scr_init_system_original; - ret; - } - } - - NAKED void post_scr_init_system_stub() - { - __asm - { - pushad; - push eax; - call exec_post_scr_init_funcs; - add esp, 4; - popad; - - push post_scr_init_system_original; - ret; - } - } + plugin::get()->get_interface()->callbacks()->on_scripts_execute((plutonium::sdk::v1::interfaces::callbacks::on_scripts_execute_callback)&callback); } - - void schedule(const std::function& callback, const pipeline type, - const std::chrono::milliseconds delay) - { - assert(type >= 0 && type < pipeline::count); - - task task; - task.handler = callback; - task.interval = delay; - task.last_call = std::chrono::high_resolution_clock::now(); - - pipelines[type].add(std::move(task)); - } - - void loop(const std::function& callback, const pipeline type, - const std::chrono::milliseconds delay) - { - schedule([callback]() - { - callback(); - return cond_continue; - }, type, delay); - } - - void once(const std::function& callback, const pipeline type, - const std::chrono::milliseconds delay) - { - schedule([callback]() - { - callback(); - return cond_end; - }, type, delay); - } - - void on_init(const std::function& callback) - { - if (com_inited) - { - once(callback, pipeline::main); - } - else - { - post_init_funcs.push_back(callback); - } - } - - void on_pre_scr_init_system(const std::function& callback) - { - pre_scr_init_funcs.push_back(callback); - } - - void on_post_scr_init_system(const std::function& callback) - { - post_scr_init_funcs.push_back(callback); - } - - void exec_pre_scr_init_funcs(game::scriptInstance_t inst) - { - for (const auto& func : pre_scr_init_funcs) - { - func(inst); - } - } - - void exec_post_scr_init_funcs(game::scriptInstance_t inst) - { - for (const auto& func : post_scr_init_funcs) - { - func(inst); - } - } - - class component final : public component_interface - { - public: - void post_unpack() override - { - thread = std::thread([]() - { - while (true) - { - execute(pipeline::async); - std::this_thread::sleep_for(10ms); - } - }); - - com_init_hook.create(SELECT(0x0, 0x59D710), com_init_stub); - utils::hook::call(SELECT(0x0, 0x503B5D), execute_server); - utils::hook::call(SELECT(0x0, 0x59DCFD), execute_main); - - // for when we dont use decomp - pre_scr_init_system_hook.create(0x699865, pre_scr_init_system_stub); - pre_scr_init_system_original = pre_scr_init_system_hook.get_original(); - post_scr_init_system_hook.create(0x699924, post_scr_init_system_stub); - post_scr_init_system_original = post_scr_init_system_hook.get_original(); - } - }; } - -REGISTER_COMPONENT(scheduler::component) diff --git a/src/component/scheduler.hpp b/src/component/scheduler.hpp index 7dd5f41..1e72957 100644 --- a/src/component/scheduler.hpp +++ b/src/component/scheduler.hpp @@ -2,28 +2,5 @@ namespace scheduler { - enum pipeline - { - server, - async, - main, - count, - }; - - static const bool cond_continue = false; - static const bool cond_end = true; - - void schedule(const std::function& callback, pipeline type = pipeline::main, - std::chrono::milliseconds delay = 0ms); - void loop(const std::function& callback, pipeline type = pipeline::main, - std::chrono::milliseconds delay = 0ms); - void once(const std::function& callback, pipeline type = pipeline::main, - std::chrono::milliseconds delay = 0ms); - - void on_init(const std::function& callback); - - void on_pre_scr_init_system(const std::function& callback); - void on_post_scr_init_system(const std::function& callback); - void exec_pre_scr_init_funcs(game::scriptInstance_t inst); - void exec_post_scr_init_funcs(game::scriptInstance_t inst); + void on_scr_execute(const std::function& callback); }