Add support for adding custom GSC funcs and meths.

This commit is contained in:
JezuzLizard 2023-03-24 15:31:13 -07:00
parent 74f6a66374
commit 6a8f8dbcbe

View File

@ -7,7 +7,9 @@
namespace gsc namespace gsc
{ {
std::unordered_map<unsigned int, std::pair<std::string, void*>> functions; std::unordered_map<std::string, game::BuiltinFunction> functions;
std::unordered_map<std::string, game::BuiltinMethod> methods;
namespace namespace
{ {
@ -15,32 +17,45 @@ namespace gsc
void* original_scr_get_method_funcs_call_loc; void* original_scr_get_method_funcs_call_loc;
void ebic_func() game::BuiltinFunction find_function(const std::string& name)
{ {
game::Com_PrintF(game::CON_CHANNEL_SERVER, "Oof \n"); auto itr = functions.find(name);
if (itr == functions.end())
{
return 0;
}
return itr->second;
} }
game::BuiltinFunction plutonium_scr_get_gsc_funcs_stub(const char** pName, int* type) game::BuiltinMethod find_method(const std::string& name)
{ {
//printf( "%s %d\n", * pName, * type); auto itr = methods.find(name);
/* if (itr == methods.end())
if (*pName == "isdefined"s)
{ {
return &ebic_func; 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; return 0;
} }
game::BuiltinMethod plutonium_scr_get_gsc_methods_stub(const char** pName, int* type) game::BuiltinMethod scr_get_methods_stub(const char** pName, int* type)
{ {
printf("%s %d\n", *pName, *type); const auto meth = find_method(*pName);
/* if (meth)
if (*pName == "isdefined"s)
{ {
return &ebic_func; return meth;
} }
*/
return 0; return 0;
} }
@ -54,7 +69,7 @@ namespace gsc
lea eax, [esp + 0x24 + 0x2C - 0x1C]; lea eax, [esp + 0x24 + 0x2C - 0x1C];
push eax; push eax;
push edx; push edx;
call plutonium_scr_get_gsc_funcs_stub; call scr_get_funcs_stub;
add esp, 8; add esp, 8;
mov[esp + 0x20], eax; mov[esp + 0x20], eax;
@ -87,7 +102,7 @@ namespace gsc
push edi; push edi;
push esi; push esi;
call plutonium_scr_get_gsc_methods_stub; call scr_get_methods_stub;
add esp, 8; add esp, 8;
mov[esp + 0x20], eax; // move answer into eax when pop happens mov[esp + 0x20], eax; // move answer into eax when pop happens
@ -107,25 +122,19 @@ namespace gsc
} }
} }
unsigned int find_function(const std::string& name)
{
for (const auto& function : functions)
{
if (function.second.first == name)
{
return function.first;
}
}
return 0;
}
namespace function namespace function
{ {
void add(const std::string& name, const void*& function) void add(const std::string& name, const game::BuiltinFunction function)
{ {
const auto id = functions.size() + 1; functions.insert_or_assign(name, function);
//functions[id] = std::make_pair(name, function); }
}
namespace method
{
void add(const std::string& name, const game::BuiltinMethod method)
{
methods.insert_or_assign(name, method);
} }
} }
@ -138,6 +147,18 @@ namespace gsc
original_scr_get_method_funcs_call_loc = utils::hook::get_displacement_addr(0x683043); original_scr_get_method_funcs_call_loc = utils::hook::get_displacement_addr(0x683043);
utils::hook::jump(0x682D99, original_scr_get_gsc_funcs_hook); utils::hook::jump(0x682D99, original_scr_get_gsc_funcs_hook);
utils::hook::call(0x683043, original_scr_get_method_funcs_hook); utils::hook::call(0x683043, original_scr_get_method_funcs_hook);
function::add("funny_func", []()
{
printf("How funny\n");
printf("You found the funny monkey funkey\n");
});
method::add("is_monkey", [](game::scr_entref_s ent)
{
printf("Monkey number %d\n", ent.entnum);
});
} }
private: private: