UI scripting changes + cleanup
This commit is contained in:
parent
b0a1f5ca73
commit
134bcbae10
@ -14,7 +14,6 @@ namespace logger
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
utils::hook::detour com_error_hook;
|
utils::hook::detour com_error_hook;
|
||||||
utils::hook::detour nullsub_48_hook;
|
|
||||||
utils::hook::detour sub_32AEF0;
|
utils::hook::detour sub_32AEF0;
|
||||||
|
|
||||||
game::dvar_t* logger_dev = nullptr;
|
game::dvar_t* logger_dev = nullptr;
|
||||||
|
@ -508,17 +508,10 @@ namespace pathnodes
|
|||||||
|
|
||||||
void restore_code(const size_t ptr, char* data, const size_t size)
|
void restore_code(const size_t ptr, char* data, const size_t size)
|
||||||
{
|
{
|
||||||
const auto ptr_ = reinterpret_cast<char*>(ptr);
|
|
||||||
DWORD old_protect;
|
|
||||||
VirtualProtect(ptr_, size, PAGE_EXECUTE_READWRITE, &old_protect);
|
|
||||||
|
|
||||||
for (auto i = 0; i < size; i++)
|
for (auto i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
ptr_[i] = data[i];
|
utils::hook::set<char>(ptr + i, data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualProtect(ptr_, size, old_protect, &old_protect);
|
|
||||||
FlushInstructionCache(GetCurrentProcess(), ptr_, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore_functions()
|
void restore_functions()
|
||||||
|
@ -37,7 +37,8 @@ namespace ui_scripting
|
|||||||
const auto lui_updater = utils::nt::load_resource(LUI_UPDATER);
|
const auto lui_updater = utils::nt::load_resource(LUI_UPDATER);
|
||||||
const auto lua_json = utils::nt::load_resource(LUA_JSON);
|
const auto lua_json = utils::nt::load_resource(LUA_JSON);
|
||||||
|
|
||||||
std::unordered_map<game::hks::cclosure*, std::function<arguments(const function_arguments& args)>> converted_functions;
|
using converted_func_t = std::function<arguments(const function_arguments& args)>;
|
||||||
|
std::unordered_map<game::hks::cclosure*, converted_func_t> converted_functions;
|
||||||
|
|
||||||
utils::hook::detour hks_start_hook;
|
utils::hook::detour hks_start_hook;
|
||||||
utils::hook::detour hks_shutdown_hook;
|
utils::hook::detour hks_shutdown_hook;
|
||||||
@ -852,10 +853,10 @@ namespace ui_scripting
|
|||||||
return utils::hook::invoke<int>(0x1402D9410, state, compiler_options, reader, reader_data, chunk_name);
|
return utils::hook::invoke<int>(0x1402D9410, state, compiler_options, reader, reader_data, chunk_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string current_error;
|
|
||||||
int main_handler(game::hks::lua_State* state)
|
int main_handler(game::hks::lua_State* state)
|
||||||
{
|
{
|
||||||
bool error = false;
|
static std::string error_str;
|
||||||
|
auto error = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -866,15 +867,14 @@ namespace ui_scripting
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto closure = value.v.cClosure;
|
const auto closure = value.v.cClosure;
|
||||||
if (!converted_functions.contains(closure))
|
if (closure->m_numUpvalues < 1)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& function = converted_functions[closure];
|
const auto function = reinterpret_cast<converted_func_t*>(closure->m_upvalues->v.i64);
|
||||||
|
|
||||||
const auto args = get_return_values();
|
const auto args = get_return_values();
|
||||||
const auto results = function(args);
|
const auto results = function->operator()(args);
|
||||||
|
|
||||||
for (const auto& result : results)
|
for (const auto& result : results)
|
||||||
{
|
{
|
||||||
@ -885,13 +885,13 @@ namespace ui_scripting
|
|||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
current_error = e.what();
|
error_str = e.what();
|
||||||
error = true;
|
error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
game::hks::hksi_luaL_error(state, current_error.data());
|
game::hks::hksi_luaL_error(state, error_str.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -907,8 +907,23 @@ namespace ui_scripting
|
|||||||
game::hks::cclosure* convert_function(F f)
|
game::hks::cclosure* convert_function(F f)
|
||||||
{
|
{
|
||||||
const auto state = *game::hks::lua_state;
|
const auto state = *game::hks::lua_state;
|
||||||
const auto closure = game::hks::cclosure_Create(state, main_handler, 0, 0, 0);
|
const auto top = state->m_apistack.top;
|
||||||
converted_functions[closure] = wrap_function(f);
|
|
||||||
|
game::hks::HksObject func_ptr{};
|
||||||
|
func_ptr.t = game::hks::TUI64;
|
||||||
|
func_ptr.v.i64 = 0;
|
||||||
|
|
||||||
|
push_value(func_ptr);
|
||||||
|
const auto closure = game::hks::cclosure_Create(state, main_handler, 1, 0, 0);
|
||||||
|
state->m_apistack.top = top;
|
||||||
|
|
||||||
|
const auto function = wrap_function(f);
|
||||||
|
const auto [iterator, was_inserted] = converted_functions.insert(std::make_pair(closure, function));
|
||||||
|
const auto ptr = &iterator->second;
|
||||||
|
|
||||||
|
closure->m_upvalues[0].t = game::hks::TUI64;
|
||||||
|
closure->m_upvalues[0].v.i64 = reinterpret_cast<size_t>(ptr);
|
||||||
|
|
||||||
return closure;
|
return closure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user