From 24b3a9369e2328f558a64018ddae27f23a242ac1 Mon Sep 17 00:00:00 2001 From: fed <58637860+fedddddd@users.noreply.github.com> Date: Mon, 27 Feb 2023 01:18:50 +0100 Subject: [PATCH] Fixes for pluto update --- src/component/gsc.cpp | 10 ++++++---- src/component/signatures.cpp | 27 +++++++++++++++++++++------ src/game/scripting/functions.cpp | 25 ++++++++----------------- src/game/symbols.hpp | 6 +++--- src/utils/io.cpp | 6 ++++++ src/utils/io.hpp | 1 + 6 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/component/gsc.cpp b/src/component/gsc.cpp index 6632eea..0c375bd 100644 --- a/src/component/gsc.cpp +++ b/src/component/gsc.cpp @@ -27,7 +27,7 @@ namespace gsc { if (function.second == id) { - return function.first; + return function.first.data(); } } @@ -42,7 +42,7 @@ namespace gsc { if (function.second == id) { - return function.first; + return function.first.data(); } } @@ -251,7 +251,8 @@ namespace gsc const auto index = function_map_start++; functions[index] = func; - (*game::plutonium::function_map_rev)[name] = index; + const auto name_view = utils::memory::get_allocator()->duplicate_string(name); + (*game::plutonium::function_map_rev)[name_view] = index; } } @@ -262,7 +263,8 @@ namespace gsc const auto index = method_map_start++; methods[index] = func; - (*game::plutonium::method_map_rev)[name] = index; + const auto name_view = utils::memory::get_allocator()->duplicate_string(name); + (*game::plutonium::method_map_rev)[name_view] = index; } } diff --git a/src/component/signatures.cpp b/src/component/signatures.cpp index 88ec491..68c3c5f 100644 --- a/src/component/signatures.cpp +++ b/src/component/signatures.cpp @@ -52,23 +52,35 @@ namespace signatures { char bytes[4] = {0}; const auto string_ptr = find_string_ptr(string); - memcpy(bytes, &string_ptr, sizeof(bytes)); + if (!string_ptr) + { + return 0; + } + + std::memcpy(bytes, &string_ptr, sizeof(bytes)); return find_string_ptr({bytes, 4}); } bool process_maps() { - const auto string_ref = find_string_ref("Couldn't resolve builtin function id for name '%s'!"); + const auto string_ref = find_string_ref("couldn't resolve builtin function id for name '%s'!"); if (!string_ref) { return false; } - const auto map_ptr = *reinterpret_cast(string_ref - 0x3A); + const auto map_ptr = *reinterpret_cast(string_ref - 0x2B); game::plutonium::function_map_rev.set(map_ptr); + printf("%p\n", map_ptr); + + + auto& map = *game::plutonium::function_map_rev; + for (const auto& [k, v] : map) + { + printf("%s %i\n", k.data(), v); + } game::plutonium::method_map_rev.set(map_ptr + 0x20); - game::plutonium::file_map_rev.set(map_ptr + 0x40); - game::plutonium::token_map_rev.set(map_ptr + 0x60); + game::plutonium::token_map_rev.set(map_ptr + 0xBC); return true; } @@ -82,12 +94,15 @@ namespace signatures const auto offset = *reinterpret_cast(string_ref + 5); game::plutonium::printf.set(string_ref + 4 + 5 + offset); + utils::hook::jump(reinterpret_cast(&printf), game::plutonium::printf); + return true; } bool process() { load_function_tables(); - return process_printf() && process_maps(); + process_printf(); + return process_maps(); } } diff --git a/src/game/scripting/functions.cpp b/src/game/scripting/functions.cpp index 6c3552c..3ccc5a8 100644 --- a/src/game/scripting/functions.cpp +++ b/src/game/scripting/functions.cpp @@ -8,12 +8,12 @@ namespace scripting namespace { std::unordered_map lowercase_map( - const std::unordered_map& old_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)] = entry.second; + new_map[utils::string::to_lower(entry.first.data())] = entry.second; } return new_map; @@ -71,20 +71,6 @@ namespace scripting } } - std::string find_file(unsigned int id) - { - const auto& file_map = *game::plutonium::file_map_rev; - for (const auto& file : file_map) - { - if (file.second == id) - { - return file.first; - } - } - - return {}; - } - std::string find_token(unsigned int id) { const auto& token_map = *game::plutonium::token_map_rev; @@ -92,13 +78,18 @@ namespace scripting { if (token.second == id) { - return token.first; + return token.first.data(); } } return {}; } + std::string find_file(unsigned int id) + { + return find_token(id); + } + int find_token_id(const std::string& name) { const auto& token_map = *game::plutonium::token_map_rev; diff --git a/src/game/symbols.hpp b/src/game/symbols.hpp index ab23010..5b6aaba 100644 --- a/src/game/symbols.hpp +++ b/src/game/symbols.hpp @@ -86,10 +86,10 @@ namespace game namespace plutonium { - WEAK symbol> function_map_rev{0}; - WEAK symbol> method_map_rev{0}; - WEAK symbol> file_map_rev{0}; + WEAK symbol> function_map_rev{0}; + WEAK symbol> method_map_rev{0}; WEAK symbol> token_map_rev{0}; + WEAK symbol> token_map{0}; WEAK symbol printf{0}; WEAK symbol function_table{0}; WEAK symbol method_table{0}; diff --git a/src/utils/io.cpp b/src/utils/io.cpp index 99da803..4254bb1 100644 --- a/src/utils/io.cpp +++ b/src/utils/io.cpp @@ -1,8 +1,14 @@ #include #include +#include "io.hpp" namespace utils::io { + bool remove_file(const std::string& file) + { + return DeleteFileA(file.data()) == TRUE; + } + bool file_exists(const std::string& file) { return std::ifstream(file).good(); diff --git a/src/utils/io.hpp b/src/utils/io.hpp index e82a416..29d6912 100644 --- a/src/utils/io.hpp +++ b/src/utils/io.hpp @@ -6,6 +6,7 @@ namespace utils::io { + bool remove_file(const std::string& file); bool file_exists(const std::string& file); bool write_file(const std::string& file, const std::string& data, bool append = false); bool read_file(const std::string& file, std::string* data);