mirror of
https://github.com/JezuzLizard/T4SP-Server-Plugin.git
synced 2025-04-20 13:35:43 +00:00
yuge cleanup
This commit is contained in:
parent
599bc5664f
commit
e433a29005
@ -11,58 +11,27 @@
|
|||||||
namespace gsc
|
namespace gsc
|
||||||
{
|
{
|
||||||
std::unordered_map<std::string, game::BuiltinFunction> functions;
|
std::unordered_map<std::string, game::BuiltinFunction> functions;
|
||||||
|
|
||||||
std::unordered_map<std::string, game::BuiltinMethod> methods;
|
std::unordered_map<std::string, game::BuiltinMethod> methods;
|
||||||
|
|
||||||
|
utils::hook::detour scr_getmethod_hook;
|
||||||
|
void* scr_getfunction_stub_ret_loc;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
void* original_scr_get_gsc_funcs_jump_loc;
|
game::BuiltinFunction scr_getfunction_call(const char** pName, int* pType)
|
||||||
|
|
||||||
void* original_scr_get_method_funcs_call_loc;
|
|
||||||
|
|
||||||
game::BuiltinFunction find_function(const std::string& name)
|
|
||||||
{
|
{
|
||||||
auto itr = functions.find(name);
|
auto itr = functions.find(*pName);
|
||||||
|
|
||||||
if (itr == functions.end())
|
if (itr == functions.end())
|
||||||
{
|
{
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*pType = 0;
|
||||||
return itr->second;
|
return itr->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
game::BuiltinMethod find_method(const std::string& name)
|
game::BuiltinFunction __declspec(naked) scr_getfunction_stub()
|
||||||
{
|
|
||||||
auto itr = methods.find(name);
|
|
||||||
if (itr == methods.end())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return itr->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
game::BuiltinFunction scr_get_funcs_stub(const char** pName, int* type)
|
|
||||||
{
|
|
||||||
const auto func = find_function(*pName);
|
|
||||||
if (func)
|
|
||||||
{
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
game::BuiltinMethod scr_get_methods_stub(const char** pName, int* type)
|
|
||||||
{
|
|
||||||
const auto meth = find_method(*pName);
|
|
||||||
if (meth)
|
|
||||||
{
|
|
||||||
return meth;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void __declspec(naked) original_scr_get_gsc_funcs_hook()
|
|
||||||
{
|
{
|
||||||
__asm
|
__asm
|
||||||
{
|
{
|
||||||
@ -72,55 +41,62 @@ namespace gsc
|
|||||||
lea eax, [esp + 0x24 + 0x2C - 0x1C];
|
lea eax, [esp + 0x24 + 0x2C - 0x1C];
|
||||||
push eax;
|
push eax;
|
||||||
push edx;
|
push edx;
|
||||||
call scr_get_funcs_stub;
|
call scr_getfunction_call;
|
||||||
add esp, 8;
|
add esp, 8;
|
||||||
|
mov [esp + 0x20], eax;
|
||||||
mov[esp + 0x20], eax;
|
|
||||||
|
|
||||||
popad;
|
popad;
|
||||||
pop eax;
|
pop eax;
|
||||||
|
|
||||||
test eax, eax;
|
test eax, eax;
|
||||||
|
jnz just_ret;
|
||||||
|
|
||||||
jnz og;
|
// go do original code
|
||||||
|
push scr_getfunction_stub_ret_loc;
|
||||||
|
ret;
|
||||||
|
|
||||||
// pluto
|
just_ret:
|
||||||
push original_scr_get_gsc_funcs_jump_loc;
|
|
||||||
retn;
|
|
||||||
|
|
||||||
og:
|
|
||||||
// retn
|
|
||||||
add esp, 4;
|
add esp, 4;
|
||||||
push 0x682DC8;
|
push 0x682DC8;
|
||||||
retn;
|
ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __declspec(naked) original_scr_get_method_funcs_hook()
|
game::BuiltinMethod scr_getmethod_call(const char** pName, int* pType)
|
||||||
|
{
|
||||||
|
auto itr = methods.find(*pName);
|
||||||
|
|
||||||
|
if (itr == methods.end())
|
||||||
|
{
|
||||||
|
// call og
|
||||||
|
const auto og_addr = scr_getmethod_hook.get_original();
|
||||||
|
game::BuiltinMethod answer;
|
||||||
|
|
||||||
|
__asm
|
||||||
|
{
|
||||||
|
mov edi, pType;
|
||||||
|
mov esi, pName;
|
||||||
|
call og_addr;
|
||||||
|
mov answer, eax;
|
||||||
|
}
|
||||||
|
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pType = 0;
|
||||||
|
return itr->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
game::BuiltinMethod __declspec(naked) scr_getmethod_stub()
|
||||||
{
|
{
|
||||||
__asm
|
__asm
|
||||||
{
|
{
|
||||||
push eax;
|
|
||||||
pushad;
|
|
||||||
|
|
||||||
push edi;
|
push edi;
|
||||||
push esi;
|
push esi;
|
||||||
call scr_get_methods_stub;
|
call scr_getmethod_call;
|
||||||
add esp, 8;
|
add esp, 8;
|
||||||
mov[esp + 0x20], eax; // move answer into eax when pop happens
|
|
||||||
|
|
||||||
popad;
|
ret;
|
||||||
pop eax;
|
|
||||||
|
|
||||||
test eax, eax;
|
|
||||||
jz pluto_code;
|
|
||||||
|
|
||||||
retn;
|
|
||||||
|
|
||||||
pluto_code:
|
|
||||||
|
|
||||||
push original_scr_get_method_funcs_call_loc;
|
|
||||||
retn;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,10 +146,13 @@ namespace gsc
|
|||||||
public:
|
public:
|
||||||
void post_unpack() override
|
void post_unpack() override
|
||||||
{
|
{
|
||||||
original_scr_get_gsc_funcs_jump_loc = utils::hook::get_displacement_addr(0x682D99);
|
// custom gsc methods
|
||||||
original_scr_get_method_funcs_call_loc = utils::hook::get_displacement_addr(0x683043);
|
scr_getmethod_hook.create(utils::hook::get_displacement_addr(SELECT(0x0, 0x683043)), scr_getmethod_stub);
|
||||||
utils::hook::jump(0x682D99, original_scr_get_gsc_funcs_hook);
|
|
||||||
utils::hook::call(0x683043, original_scr_get_method_funcs_hook);
|
// custom gsc funcs
|
||||||
|
scr_getfunction_stub_ret_loc = utils::hook::get_displacement_addr(SELECT(0x0, 0x682D99));
|
||||||
|
utils::hook::jump(SELECT(0x0, 0x682D99), scr_getfunction_stub);
|
||||||
|
|
||||||
|
|
||||||
//Add support for codecallback_hudelemspawned GSC callback
|
//Add support for codecallback_hudelemspawned GSC callback
|
||||||
//utils::hook::call(0x4FA40B, hudelem_alloc_stub);
|
//utils::hook::call(0x4FA40B, hudelem_alloc_stub);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user