From a7576ea7659ebe410827c5a23d0e7e6b27f7d036 Mon Sep 17 00:00:00 2001 From: fed <58637860+fedddddd@users.noreply.github.com> Date: Sat, 13 May 2023 19:50:00 +0200 Subject: [PATCH] Fix for pluto update --- .gitmodules | 6 +++ deps/gsc-tool | 1 + deps/premake/gsc-tool.lua | 62 ++++++++++++++++++++++++++++ deps/premake/zlib.lua | 39 ++++++++++++++++++ deps/zlib | 1 + generate.bat | 3 +- src/component/gsc.cpp | 50 +++++++++++----------- src/component/signatures.cpp | 14 +++---- src/game/scripting/functions.cpp | 71 ++++++-------------------------- src/game/symbols.hpp | 4 +- src/stdinc.hpp | 5 ++- 11 files changed, 159 insertions(+), 97 deletions(-) create mode 160000 deps/gsc-tool create mode 100644 deps/premake/gsc-tool.lua create mode 100644 deps/premake/zlib.lua create mode 160000 deps/zlib diff --git a/.gitmodules b/.gitmodules index 6d1be60..959bf20 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,9 @@ path = deps/json url = https://github.com/nlohmann/json.git branch = develop +[submodule "deps/gsc-tool"] + path = deps/gsc-tool + url = https://github.com/xensik/gsc-tool.git +[submodule "deps/zlib"] + path = deps/zlib + url = https://github.com/madler/zlib.git diff --git a/deps/gsc-tool b/deps/gsc-tool new file mode 160000 index 0000000..a8a62c2 --- /dev/null +++ b/deps/gsc-tool @@ -0,0 +1 @@ +Subproject commit a8a62c2667ca1c2643798a6c88e39a9e5a30df86 diff --git a/deps/premake/gsc-tool.lua b/deps/premake/gsc-tool.lua new file mode 100644 index 0000000..10f6135 --- /dev/null +++ b/deps/premake/gsc-tool.lua @@ -0,0 +1,62 @@ +gsc_tool = { + source = path.join(dependencies.basePath, "gsc-tool"), +} + +function gsc_tool.import() + links { "xsk-gsc-iw5-pc", "xsk-gsc-utils" } + gsc_tool.includes() +end + +function gsc_tool.includes() + includedirs { + path.join(gsc_tool.source, "include"), + } +end + +function gsc_tool.project() + project "xsk-gsc-utils" + kind "StaticLib" + language "C++" + + files { + path.join(gsc_tool.source, "include/xsk/utils/*.hpp"), + path.join(gsc_tool.source, "src/utils/*.cpp"), + } + + includedirs { + path.join(gsc_tool.source, "include"), + } + + zlib.includes() + + project "xsk-gsc-iw5-pc" + kind "StaticLib" + language "C++" + + filter "action:vs*" + buildoptions "/Zc:__cplusplus" + filter {} + + files { + path.join(gsc_tool.source, "include/xsk/stdinc.hpp"), + + path.join(gsc_tool.source, "include/xsk/gsc/engine/iw5_pc.hpp"), + path.join(gsc_tool.source, "src/gsc/engine/iw5_pc.cpp"), + + path.join(gsc_tool.source, "src/gsc/engine/iw5_pc_code.cpp"), + path.join(gsc_tool.source, "src/gsc/engine/iw5_pc_func.cpp"), + path.join(gsc_tool.source, "src/gsc/engine/iw5_pc_meth.cpp"), + path.join(gsc_tool.source, "src/gsc/engine/iw5_pc_token.cpp"), + + path.join(gsc_tool.source, "src/gsc/*.cpp"), + + path.join(gsc_tool.source, "src/gsc/common/*.cpp"), + path.join(gsc_tool.source, "include/xsk/gsc/common/*.hpp"), + } + + includedirs { + path.join(gsc_tool.source, "include"), + } +end + +table.insert(dependencies, gsc_tool) diff --git a/deps/premake/zlib.lua b/deps/premake/zlib.lua new file mode 100644 index 0000000..566a707 --- /dev/null +++ b/deps/premake/zlib.lua @@ -0,0 +1,39 @@ +zlib = { + source = path.join(dependencies.basePath, "zlib"), +} + +function zlib.import() + links { "zlib" } + zlib.includes() +end + +function zlib.includes() + includedirs { + zlib.source + } + + defines { + "ZLIB_CONST", + } +end + +function zlib.project() + project "zlib" + language "C" + + zlib.includes() + + files { + path.join(zlib.source, "*.h"), + path.join(zlib.source, "*.c"), + } + + defines { + "_CRT_SECURE_NO_DEPRECATE", + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, zlib) diff --git a/deps/zlib b/deps/zlib new file mode 160000 index 0000000..04f42ce --- /dev/null +++ b/deps/zlib @@ -0,0 +1 @@ +Subproject commit 04f42ceca40f73e2978b50e93806c2a18c1281fc diff --git a/generate.bat b/generate.bat index f3f1a6b..00c30e7 100644 --- a/generate.bat +++ b/generate.bat @@ -1,3 +1,4 @@ @echo off call git submodule update --init --recursive -tools\windows\premake5.exe vs2022 \ No newline at end of file +tools\windows\premake5.exe vs2022 +pause \ No newline at end of file diff --git a/src/component/gsc.cpp b/src/component/gsc.cpp index 0c375bd..38074fd 100644 --- a/src/component/gsc.cpp +++ b/src/component/gsc.cpp @@ -21,7 +21,7 @@ namespace gsc { std::string method_name(unsigned int id) { - const auto& map = *game::plutonium::method_map_rev; + const auto& map = (*game::plutonium::gsc_ctx)->meth_map(); for (const auto& function : map) { @@ -36,7 +36,7 @@ namespace gsc std::string function_name(unsigned int id) { - const auto& map = *game::plutonium::function_map_rev; + const auto& map = (*game::plutonium::gsc_ctx)->func_map(); for (const auto& function : map) { @@ -248,11 +248,16 @@ namespace gsc { void add(const std::string& name, const script_function& func) { - const auto index = function_map_start++; - - functions[index] = func; - const auto name_view = utils::memory::get_allocator()->duplicate_string(name); - (*game::plutonium::function_map_rev)[name_view] = index; + try + { + const auto index = function_map_start++; + functions[index] = func; + (*game::plutonium::gsc_ctx)->func_add(name, index); + } + catch (const std::exception& e) + { + printf("[iw5-gsc-utils] failed to add function \"%s\": %s\n", name.data(), e.what()); + } } } @@ -260,11 +265,16 @@ namespace gsc { void add(const std::string& name, const script_method& func) { - const auto index = method_map_start++; - - methods[index] = func; - const auto name_view = utils::memory::get_allocator()->duplicate_string(name); - (*game::plutonium::method_map_rev)[name_view] = index; + try + { + const auto index = method_map_start++; + methods[index] = func; + (*game::plutonium::gsc_ctx)->meth_add(name, index); + } + catch (const std::exception& e) + { + printf("[iw5-gsc-utils] failed to add method \"%s\": %s\n", name.data(), e.what()); + } } } @@ -274,25 +284,13 @@ namespace gsc const std::function& getter, const std::function& setter) { - uint16_t token_id{}; - auto& token_map = *game::plutonium::token_map_rev; - if (token_map.find(name) != token_map.end()) - { - token_id = token_map.at(name); - } - else - { - token_id = token_map_start++; - token_map.insert(std::make_pair(name, token_id)); - } - const auto offset = field_offset_start++; custom_fields[classnum][offset] = {name, getter, setter}; - post_load_callbacks.push_back([classnum, name, token_id, offset]() + post_load_callbacks.push_back([=]() { const auto name_str = game::SL_GetString(name.data(), 0); - game::Scr_AddClassField(classnum, name_str, token_id, offset); + game::Scr_AddClassField(classnum, name_str, game::SL_GetCanonicalString(name.data()), offset); }); } } diff --git a/src/component/signatures.cpp b/src/component/signatures.cpp index f02c2bc..8a90138 100644 --- a/src/component/signatures.cpp +++ b/src/component/signatures.cpp @@ -61,18 +61,16 @@ namespace signatures return find_string_ptr({bytes, 4}); } - bool process_maps() + bool process_gsc_ctx() { - const auto string_ref = find_string_ref("couldn't resolve builtin function id for name '%s'!"); + const auto string_ref = find_string_ref("in call to builtin %s"); if (!string_ref) { return false; } - - const auto map_ptr = *reinterpret_cast(string_ref - 0x2B); - game::plutonium::function_map_rev.set(map_ptr); - game::plutonium::method_map_rev.set(map_ptr + 0x20); - game::plutonium::token_map_rev.set(map_ptr + 0xBC); + + const auto gsc_ctx_ptr = *reinterpret_cast(string_ref - 0x8C); + game::plutonium::gsc_ctx.set(gsc_ctx_ptr); return true; } @@ -93,6 +91,6 @@ namespace signatures bool process() { load_function_tables(); - return process_printf() && process_maps(); + return process_printf() && process_gsc_ctx(); } } diff --git a/src/game/scripting/functions.cpp b/src/game/scripting/functions.cpp index 87e0dc2..fc23899 100644 --- a/src/game/scripting/functions.cpp +++ b/src/game/scripting/functions.cpp @@ -7,51 +7,20 @@ namespace scripting { namespace { - std::unordered_map lowercase_map( - const std::unordered_map& old_map) - { - std::unordered_map new_map{}; - for (auto& entry : old_map) - { - new_map[utils::string::to_lower(entry.first.data())] = entry.second; - } - - return new_map; - } - - const std::unordered_map& get_methods() - { - static auto methods = lowercase_map(*game::plutonium::method_map_rev); - return methods; - } - - const std::unordered_map& get_functions() - { - static auto function = lowercase_map(*game::plutonium::function_map_rev); - return function; - } - - int find_function_index(const std::string& name, const bool prefer_global) + int find_function_index(const std::string& name, [[maybe_unused]] const bool prefer_global) { const auto target = utils::string::to_lower(name); + auto const& first = (*game::plutonium::gsc_ctx)->func_map(); + auto const& second = (*game::plutonium::gsc_ctx)->meth_map(); - const auto& primary_map = prefer_global - ? get_functions() - : get_methods(); - const auto& secondary_map = !prefer_global - ? get_functions() - : get_methods(); - - auto function_entry = primary_map.find(target); - if (function_entry != primary_map.end()) + if (const auto itr = first.find(name); itr != first.end()) { - return function_entry->second; + return static_cast(itr->second); } - function_entry = secondary_map.find(target); - if (function_entry != secondary_map.end()) + if (const auto itr = second.find(name); itr != second.end()) { - return function_entry->second; + return static_cast(itr->second); } return -1; @@ -73,16 +42,7 @@ namespace scripting std::string find_token(unsigned int id) { - const auto& token_map = *game::plutonium::token_map_rev; - for (const auto& token : token_map) - { - if (token.second == id) - { - return token.first; - } - } - - return {}; + return (*game::plutonium::gsc_ctx)->token_name(id); } std::string find_file(unsigned int id) @@ -92,21 +52,16 @@ namespace scripting int find_token_id(const std::string& name) { - const auto& token_map = *game::plutonium::token_map_rev; - const auto result = token_map.find(name); - - if (result != token_map.end()) - { - return result->second; - } - - return -1; + return (*game::plutonium::gsc_ctx)->token_id(name); } script_function find_function(const std::string& name, const bool prefer_global) { const auto index = find_function_index(name, prefer_global); - if (index < 0) return nullptr; + if (index < 0) + { + return nullptr; + } return get_function_by_index(index); } diff --git a/src/game/symbols.hpp b/src/game/symbols.hpp index 1d14f44..ae52441 100644 --- a/src/game/symbols.hpp +++ b/src/game/symbols.hpp @@ -86,9 +86,7 @@ namespace game namespace plutonium { - WEAK symbol> function_map_rev{0}; - WEAK symbol> method_map_rev{0}; - WEAK symbol> token_map_rev{0}; + WEAK symbol> gsc_ctx{0}; WEAK symbol printf{0}; WEAK symbol function_table{0}; WEAK symbol method_table{0}; diff --git a/src/stdinc.hpp b/src/stdinc.hpp index 9457552..9ce4fd7 100644 --- a/src/stdinc.hpp +++ b/src/stdinc.hpp @@ -8,6 +8,8 @@ #pragma warning(disable: 4996) #pragma warning(disable: 26812) +#include + #define DLL_EXPORT extern "C" __declspec(dllexport) #define WIN32_LEAN_AND_MEAN #include @@ -37,6 +39,7 @@ using namespace std::literals; #include #include + #include "utils/memory.hpp" #include "utils/string.hpp" #include "utils/hook.hpp" @@ -46,4 +49,4 @@ using namespace std::literals; #include "utils/http.hpp" #include "game/structs.hpp" -#include "game/game.hpp" \ No newline at end of file +#include "game/game.hpp"