From 1121b44857ea51c21643541fbdd0eeeb0ab3e6d8 Mon Sep 17 00:00:00 2001 From: Josh Wright Date: Fri, 9 Oct 2026 11:02:20 -0400 Subject: [PATCH] Organize scripts and add TWS plugins with HTTP timeouts Vendor pinned T5 and T6 plugin sources under the new plugins layout. Add native HTTP deadlines, status and timing diagnostics, telemetry integration, and build/test tooling. --- README.md | 75 +- t5/plugins/README.md | 78 + t5/plugins/tws-t5-gsc-utils/.gitattributes | 2 + .../tws-t5-gsc-utils/.github/dependabot.yml | 7 + .../.github/workflows/build.yml | 80 + t5/plugins/tws-t5-gsc-utils/.gitignore | 165 ++ t5/plugins/tws-t5-gsc-utils/README.md | 295 ++++ .../tws-t5-gsc-utils/deps/premake/asmjit.lua | 34 + .../tws-t5-gsc-utils/deps/premake/curl.lua | 73 + .../tws-t5-gsc-utils/deps/premake/gsl.lua | 19 + .../tws-t5-gsc-utils/deps/premake/json.lua | 19 + .../deps/premake/libtomcrypt.lua | 61 + .../deps/premake/libtommath.lua | 52 + .../tws-t5-gsc-utils/deps/premake/minhook.lua | 31 + .../tws-t5-gsc-utils/deps/premake/minizip.lua | 43 + .../tws-t5-gsc-utils/deps/premake/mysql.lua | 52 + .../deps/premake/plutonium-sdk.lua | 18 + .../tws-t5-gsc-utils/deps/premake/sqlpp11.lua | 26 + .../tws-t5-gsc-utils/deps/premake/zlib.lua | 39 + t5/plugins/tws-t5-gsc-utils/generate.bat | 3 + t5/plugins/tws-t5-gsc-utils/premake5.lua | 105 ++ .../src/component/command.cpp | 352 ++++ .../src/component/command.hpp | 48 + .../src/component/exception.cpp | 147 ++ .../tws-t5-gsc-utils/src/component/gsc.cpp | 277 +++ .../tws-t5-gsc-utils/src/component/gsc.hpp | 128 ++ .../tws-t5-gsc-utils/src/component/http.cpp | 287 +++ .../tws-t5-gsc-utils/src/component/int64.cpp | 119 ++ .../tws-t5-gsc-utils/src/component/io.cpp | 75 + .../tws-t5-gsc-utils/src/component/json.cpp | 281 +++ .../tws-t5-gsc-utils/src/component/json.hpp | 6 + .../tws-t5-gsc-utils/src/component/mysql.cpp | 545 ++++++ .../tws-t5-gsc-utils/src/component/mysql.hpp | 58 + .../src/component/scheduler.cpp | 175 ++ .../src/component/scheduler.hpp | 25 + .../src/component/scripting.cpp | 78 + .../src/component/scripting.hpp | 19 + .../tws-t5-gsc-utils/src/component/string.cpp | 218 +++ .../src/component/user_info.cpp | 136 ++ t5/plugins/tws-t5-gsc-utils/src/dllmain.cpp | 78 + .../src/exception/minidump.cpp | 94 + .../src/exception/minidump.hpp | 6 + t5/plugins/tws-t5-gsc-utils/src/game/game.cpp | 123 ++ t5/plugins/tws-t5-gsc-utils/src/game/game.hpp | 75 + .../src/game/scripting/array.cpp | 418 +++++ .../src/game/scripting/array.hpp | 107 ++ .../src/game/scripting/container_iterator.hpp | 99 ++ .../src/game/scripting/entity.cpp | 120 ++ .../src/game/scripting/entity.hpp | 47 + .../src/game/scripting/event.hpp | 13 + .../src/game/scripting/execution.cpp | 154 ++ .../src/game/scripting/execution.hpp | 22 + .../src/game/scripting/function.cpp | 42 + .../src/game/scripting/function.hpp | 48 + .../src/game/scripting/object.cpp | 326 ++++ .../src/game/scripting/object.hpp | 53 + .../src/game/scripting/safe_execution.cpp | 67 + .../src/game/scripting/safe_execution.hpp | 14 + .../src/game/scripting/script_value.cpp | 491 ++++++ .../src/game/scripting/script_value.hpp | 399 +++++ .../src/game/scripting/stack_isolation.cpp | 27 + .../src/game/scripting/stack_isolation.hpp | 25 + .../src/game/scripting/thread.cpp | 67 + .../src/game/scripting/thread.hpp | 32 + .../src/game/scripting/variable_value.cpp | 68 + .../src/game/scripting/variable_value.hpp | 27 + .../src/game/scripting/vector.cpp | 85 + .../src/game/scripting/vector.hpp | 31 + .../tws-t5-gsc-utils/src/game/structs.hpp | 857 +++++++++ .../tws-t5-gsc-utils/src/game/symbols.hpp | 148 ++ .../src/loader/component_interface.hpp | 35 + .../src/loader/component_loader.cpp | 72 + .../src/loader/component_loader.hpp | 59 + t5/plugins/tws-t5-gsc-utils/src/plugin.cpp | 75 + t5/plugins/tws-t5-gsc-utils/src/plugin.hpp | 30 + t5/plugins/tws-t5-gsc-utils/src/resource.hpp | 3 + t5/plugins/tws-t5-gsc-utils/src/resource.rc | 3 + t5/plugins/tws-t5-gsc-utils/src/stdinc.cpp | 24 + t5/plugins/tws-t5-gsc-utils/src/stdinc.hpp | 60 + .../src/utils/binary_resource.cpp | 76 + .../src/utils/binary_resource.hpp | 20 + .../src/utils/compression.cpp | 170 ++ .../src/utils/compression.hpp | 28 + .../src/utils/concurrency.hpp | 46 + .../src/utils/cryptography.cpp | 691 ++++++++ .../src/utils/cryptography.hpp | 151 ++ .../tws-t5-gsc-utils/src/utils/flags.cpp | 54 + .../tws-t5-gsc-utils/src/utils/flags.hpp | 6 + .../tws-t5-gsc-utils/src/utils/hook.cpp | 208 +++ .../tws-t5-gsc-utils/src/utils/hook.hpp | 146 ++ .../tws-t5-gsc-utils/src/utils/http.cpp | 112 ++ .../tws-t5-gsc-utils/src/utils/http.hpp | 34 + .../src/utils/info_string.cpp | 67 + .../src/utils/info_string.hpp | 25 + t5/plugins/tws-t5-gsc-utils/src/utils/io.cpp | 135 ++ t5/plugins/tws-t5-gsc-utils/src/utils/io.hpp | 22 + .../tws-t5-gsc-utils/src/utils/memory.cpp | 109 ++ .../tws-t5-gsc-utils/src/utils/memory.hpp | 75 + t5/plugins/tws-t5-gsc-utils/src/utils/nt.cpp | 250 +++ t5/plugins/tws-t5-gsc-utils/src/utils/nt.hpp | 112 ++ .../tws-t5-gsc-utils/src/utils/string.cpp | 157 ++ .../tws-t5-gsc-utils/src/utils/string.hpp | 101 ++ .../tws-t5-gsc-utils/src/utils/thread.cpp | 89 + .../tws-t5-gsc-utils/src/utils/thread.hpp | 19 + .../src/utils/thread_pool.cpp | 96 + .../src/utils/thread_pool.hpp | 60 + .../tws-t5-gsc-utils/tools/premake5.exe | Bin 0 -> 1568256 bytes t5/plugins/tws-t5-gsc-utils/upstream.json | 61 + t5/{ => scripts}/NOTES.md | 0 t5/{ => scripts}/README.md | 38 +- t5/{ => scripts}/tws_t5_afk.gsc | 0 t5/{ => scripts}/tws_t5_common.gsc | 0 t5/{ => scripts}/tws_t5_hud.gsc | 0 t5/{ => scripts}/tws_t5_join.gsc | 0 t5/{ => scripts}/tws_t5_leaderboard.gsc | 0 t5/{ => scripts}/tws_t5_lock.gsc | 0 t5/{ => scripts}/tws_t5_telemetry.gsc | 53 +- t6/plugins/README.md | 78 + .../tws-t6-gsc-utils/.github/dependabot.yml | 7 + .../.github/workflows/build.yml | 80 + t6/plugins/tws-t6-gsc-utils/.gitignore | 165 ++ t6/plugins/tws-t6-gsc-utils/README.md | 841 +++++++++ .../tws-t6-gsc-utils/deps/premake/asmjit.lua | 34 + .../tws-t6-gsc-utils/deps/premake/curl.lua | 73 + .../tws-t6-gsc-utils/deps/premake/gsl.lua | 19 + .../tws-t6-gsc-utils/deps/premake/json.lua | 19 + .../deps/premake/libtomcrypt.lua | 61 + .../deps/premake/libtommath.lua | 52 + .../tws-t6-gsc-utils/deps/premake/minhook.lua | 31 + .../tws-t6-gsc-utils/deps/premake/minizip.lua | 43 + .../tws-t6-gsc-utils/deps/premake/mysql.lua | 52 + .../deps/premake/plutonium-sdk.lua | 18 + .../tws-t6-gsc-utils/deps/premake/sqlpp11.lua | 26 + .../tws-t6-gsc-utils/deps/premake/zlib.lua | 39 + t6/plugins/tws-t6-gsc-utils/generate.bat | 4 + t6/plugins/tws-t6-gsc-utils/premake5.lua | 104 ++ .../tws-t6-gsc-utils/src/component/chat.cpp | 348 ++++ .../src/component/clients.cpp | 120 ++ .../src/component/command.cpp | 334 ++++ .../src/component/command.hpp | 51 + .../src/component/config_strings.cpp | 151 ++ .../src/component/cryptography.cpp | 135 ++ .../src/component/exception.cpp | 145 ++ .../tws-t6-gsc-utils/src/component/gsc.cpp | 585 +++++++ .../tws-t6-gsc-utils/src/component/gsc.hpp | 171 ++ .../tws-t6-gsc-utils/src/component/http.cpp | 287 +++ .../tws-t6-gsc-utils/src/component/int64.cpp | 119 ++ .../tws-t6-gsc-utils/src/component/io.cpp | 133 ++ .../tws-t6-gsc-utils/src/component/io.hpp | 6 + .../tws-t6-gsc-utils/src/component/json.cpp | 319 ++++ .../tws-t6-gsc-utils/src/component/json.hpp | 6 + .../src/component/logfile.cpp | 49 + .../src/component/logfile.hpp | 6 + .../tws-t6-gsc-utils/src/component/mysql.cpp | 545 ++++++ .../tws-t6-gsc-utils/src/component/mysql.hpp | 58 + .../src/component/network.cpp | 210 +++ .../src/component/notifies.cpp | 211 +++ .../src/component/patches.cpp | 72 + .../src/component/scheduler.cpp | 185 ++ .../src/component/scheduler.hpp | 26 + .../src/component/scripting.cpp | 283 +++ .../src/component/scripting.hpp | 22 + .../tws-t6-gsc-utils/src/component/string.cpp | 201 +++ .../src/component/turrets.cpp | 418 +++++ t6/plugins/tws-t6-gsc-utils/src/dllmain.cpp | 78 + .../src/exception/minidump.cpp | 94 + .../src/exception/minidump.hpp | 6 + t6/plugins/tws-t6-gsc-utils/src/game/game.cpp | 85 + t6/plugins/tws-t6-gsc-utils/src/game/game.hpp | 71 + .../src/game/scripting/array.cpp | 354 ++++ .../src/game/scripting/array.hpp | 110 ++ .../src/game/scripting/container_iterator.hpp | 99 ++ .../src/game/scripting/entity.cpp | 123 ++ .../src/game/scripting/entity.hpp | 49 + .../src/game/scripting/event.hpp | 13 + .../src/game/scripting/execution.cpp | 210 +++ .../src/game/scripting/execution.hpp | 39 + .../src/game/scripting/function.cpp | 41 + .../src/game/scripting/function.hpp | 36 + .../src/game/scripting/object.cpp | 270 +++ .../src/game/scripting/object.hpp | 95 + .../src/game/scripting/safe_execution.cpp | 67 + .../src/game/scripting/safe_execution.hpp | 14 + .../src/game/scripting/script_value.cpp | 478 +++++ .../src/game/scripting/script_value.hpp | 393 +++++ .../src/game/scripting/stack_isolation.cpp | 27 + .../src/game/scripting/stack_isolation.hpp | 25 + .../src/game/scripting/thread.cpp | 141 ++ .../src/game/scripting/thread.hpp | 32 + .../src/game/scripting/variable_value.cpp | 68 + .../src/game/scripting/variable_value.hpp | 27 + .../src/game/scripting/vector.cpp | 85 + .../src/game/scripting/vector.hpp | 31 + .../tws-t6-gsc-utils/src/game/structs.hpp | 1540 +++++++++++++++++ .../tws-t6-gsc-utils/src/game/symbols.hpp | 137 ++ .../src/loader/component_interface.hpp | 35 + .../src/loader/component_loader.cpp | 72 + .../src/loader/component_loader.hpp | 61 + t6/plugins/tws-t6-gsc-utils/src/plugin.cpp | 79 + t6/plugins/tws-t6-gsc-utils/src/plugin.hpp | 30 + t6/plugins/tws-t6-gsc-utils/src/resource.hpp | 3 + t6/plugins/tws-t6-gsc-utils/src/resource.rc | 3 + t6/plugins/tws-t6-gsc-utils/src/stdinc.cpp | 25 + t6/plugins/tws-t6-gsc-utils/src/stdinc.hpp | 63 + .../src/utils/binary_resource.cpp | 76 + .../src/utils/binary_resource.hpp | 20 + .../src/utils/compression.cpp | 170 ++ .../src/utils/compression.hpp | 28 + .../src/utils/concurrency.hpp | 46 + .../src/utils/cryptography.cpp | 686 ++++++++ .../src/utils/cryptography.hpp | 151 ++ .../src/utils/file_watcher.cpp | 160 ++ .../src/utils/file_watcher.hpp | 45 + .../tws-t6-gsc-utils/src/utils/flags.cpp | 54 + .../tws-t6-gsc-utils/src/utils/flags.hpp | 6 + .../tws-t6-gsc-utils/src/utils/hook.cpp | 247 +++ .../tws-t6-gsc-utils/src/utils/hook.hpp | 177 ++ .../tws-t6-gsc-utils/src/utils/http.cpp | 112 ++ .../tws-t6-gsc-utils/src/utils/http.hpp | 34 + .../src/utils/info_string.cpp | 67 + .../src/utils/info_string.hpp | 25 + t6/plugins/tws-t6-gsc-utils/src/utils/io.cpp | 136 ++ t6/plugins/tws-t6-gsc-utils/src/utils/io.hpp | 22 + .../tws-t6-gsc-utils/src/utils/memory.cpp | 109 ++ .../tws-t6-gsc-utils/src/utils/memory.hpp | 75 + t6/plugins/tws-t6-gsc-utils/src/utils/nt.cpp | 250 +++ t6/plugins/tws-t6-gsc-utils/src/utils/nt.hpp | 112 ++ .../tws-t6-gsc-utils/src/utils/string.cpp | 181 ++ .../tws-t6-gsc-utils/src/utils/string.hpp | 105 ++ .../tws-t6-gsc-utils/src/utils/thread.cpp | 89 + .../tws-t6-gsc-utils/src/utils/thread.hpp | 19 + .../src/utils/thread_pool.cpp | 96 + .../src/utils/thread_pool.hpp | 60 + .../tws-t6-gsc-utils/tools/premake5.exe | Bin 0 -> 1568256 bytes t6/plugins/tws-t6-gsc-utils/upstream.json | 61 + t6/{ => scripts}/NOTES.md | 5 +- t6/{ => scripts}/README.md | 21 +- t6/{ => scripts}/tools/check.ps1 | 0 t6/{ => scripts}/tws_t6_afk.gsc | 0 t6/{ => scripts}/tws_t6_common.gsc | 0 t6/{ => scripts}/tws_t6_hud.gsc | 0 t6/{ => scripts}/tws_t6_join.gsc | 0 t6/{ => scripts}/tws_t6_leaderboard.gsc | 0 t6/{ => scripts}/tws_t6_lock.gsc | 0 t6/{ => scripts}/tws_t6_telemetry.gsc | 55 +- tools/build_plugins.ps1 | 26 + tools/check_leaderboard.mjs | 8 +- tools/fetch_plugin_deps.py | 49 + tools/test_plugin_component.py | 21 + tools/test_plugin_http.py | 105 ++ tools/tests/http_component_cases.cpp | 94 + tools/tests/http_component_stub.hpp | 121 ++ tools/tests/http_probe.cpp | 26 + 253 files changed, 28028 insertions(+), 59 deletions(-) create mode 100644 t5/plugins/README.md create mode 100644 t5/plugins/tws-t5-gsc-utils/.gitattributes create mode 100644 t5/plugins/tws-t5-gsc-utils/.github/dependabot.yml create mode 100644 t5/plugins/tws-t5-gsc-utils/.github/workflows/build.yml create mode 100644 t5/plugins/tws-t5-gsc-utils/.gitignore create mode 100644 t5/plugins/tws-t5-gsc-utils/README.md create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/asmjit.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/curl.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/gsl.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/json.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/libtomcrypt.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/libtommath.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/minhook.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/minizip.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/mysql.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/plutonium-sdk.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/sqlpp11.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/deps/premake/zlib.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/generate.bat create mode 100644 t5/plugins/tws-t5-gsc-utils/premake5.lua create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/command.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/command.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/exception.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/gsc.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/gsc.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/http.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/int64.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/io.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/json.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/json.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/mysql.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/mysql.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/scheduler.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/scheduler.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/scripting.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/scripting.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/string.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/component/user_info.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/dllmain.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/exception/minidump.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/exception/minidump.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/game.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/game.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/container_iterator.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/event.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/structs.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/game/symbols.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/loader/component_interface.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/plugin.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/plugin.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/resource.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/resource.rc create mode 100644 t5/plugins/tws-t5-gsc-utils/src/stdinc.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/stdinc.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/compression.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/compression.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/concurrency.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/flags.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/flags.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/hook.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/hook.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/http.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/http.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/info_string.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/info_string.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/io.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/io.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/memory.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/memory.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/nt.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/nt.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/string.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/string.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/thread.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/thread.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.cpp create mode 100644 t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.hpp create mode 100644 t5/plugins/tws-t5-gsc-utils/tools/premake5.exe create mode 100644 t5/plugins/tws-t5-gsc-utils/upstream.json rename t5/{ => scripts}/NOTES.md (100%) rename t5/{ => scripts}/README.md (93%) rename t5/{ => scripts}/tws_t5_afk.gsc (100%) rename t5/{ => scripts}/tws_t5_common.gsc (100%) rename t5/{ => scripts}/tws_t5_hud.gsc (100%) rename t5/{ => scripts}/tws_t5_join.gsc (100%) rename t5/{ => scripts}/tws_t5_leaderboard.gsc (100%) rename t5/{ => scripts}/tws_t5_lock.gsc (100%) rename t5/{ => scripts}/tws_t5_telemetry.gsc (86%) create mode 100644 t6/plugins/README.md create mode 100644 t6/plugins/tws-t6-gsc-utils/.github/dependabot.yml create mode 100644 t6/plugins/tws-t6-gsc-utils/.github/workflows/build.yml create mode 100644 t6/plugins/tws-t6-gsc-utils/.gitignore create mode 100644 t6/plugins/tws-t6-gsc-utils/README.md create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/asmjit.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/curl.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/gsl.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/json.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/libtomcrypt.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/libtommath.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/minhook.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/minizip.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/mysql.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/plutonium-sdk.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/sqlpp11.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/deps/premake/zlib.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/generate.bat create mode 100644 t6/plugins/tws-t6-gsc-utils/premake5.lua create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/chat.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/clients.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/command.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/command.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/config_strings.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/cryptography.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/exception.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/gsc.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/gsc.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/http.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/int64.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/io.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/io.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/json.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/json.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/logfile.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/logfile.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/mysql.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/mysql.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/network.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/notifies.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/patches.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/scheduler.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/scheduler.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/scripting.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/scripting.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/string.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/component/turrets.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/dllmain.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/exception/minidump.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/exception/minidump.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/game.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/game.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/container_iterator.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/event.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/structs.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/game/symbols.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/loader/component_interface.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/plugin.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/plugin.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/resource.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/resource.rc create mode 100644 t6/plugins/tws-t6-gsc-utils/src/stdinc.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/stdinc.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/compression.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/compression.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/concurrency.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/flags.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/flags.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/hook.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/hook.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/http.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/http.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/info_string.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/info_string.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/io.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/io.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/memory.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/memory.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/nt.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/nt.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/string.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/string.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/thread.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/thread.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.cpp create mode 100644 t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.hpp create mode 100644 t6/plugins/tws-t6-gsc-utils/tools/premake5.exe create mode 100644 t6/plugins/tws-t6-gsc-utils/upstream.json rename t6/{ => scripts}/NOTES.md (97%) rename t6/{ => scripts}/README.md (90%) rename t6/{ => scripts}/tools/check.ps1 (100%) rename t6/{ => scripts}/tws_t6_afk.gsc (100%) rename t6/{ => scripts}/tws_t6_common.gsc (100%) rename t6/{ => scripts}/tws_t6_hud.gsc (100%) rename t6/{ => scripts}/tws_t6_join.gsc (100%) rename t6/{ => scripts}/tws_t6_leaderboard.gsc (100%) rename t6/{ => scripts}/tws_t6_lock.gsc (100%) rename t6/{ => scripts}/tws_t6_telemetry.gsc (86%) create mode 100644 tools/build_plugins.ps1 create mode 100644 tools/fetch_plugin_deps.py create mode 100644 tools/test_plugin_component.py create mode 100644 tools/test_plugin_http.py create mode 100644 tools/tests/http_component_cases.cpp create mode 100644 tools/tests/http_component_stub.hpp create mode 100644 tools/tests/http_probe.cpp diff --git a/README.md b/README.md index 1dbc38e..b214218 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,54 @@ # tws-zombies-scripts -Combined working repo for the TWS Plutonium Zombies GSC scripts across two games. +Combined working repo for the TWS Plutonium Zombies scripts and native plugins across two games. ## Layout -- [t5/](t5/) — Plutonium **T5** (Call of Duty: Black Ops 1) Zombies scripts. Most-developed baseline. See [t5/README.md](t5/README.md) and [t5/NOTES.md](t5/NOTES.md). -- [t6/](t6/) — Plutonium **T6** (Call of Duty: Black Ops 2) Zombies scripts. Ported from T5; at parity on common, HUD, AFK, lock, telemetry, join and leaderboard. See [t6/README.md](t6/README.md), [t6/NOTES.md](t6/NOTES.md), and [t6/tools/check.ps1](t6/tools/check.ps1). +- [t5/scripts/](t5/scripts/) — T5 GSC modules, [README](t5/scripts/README.md), and [notes](t5/scripts/NOTES.md). +- [t5/plugins/](t5/plugins/) — `tws-t5-gsc-utils`, based on [alicealys/t5-gsc-utils](https://github.com/alicealys/t5-gsc-utils), with TWS HTTP changes. +- [t6/scripts/](t6/scripts/) — T6 GSC modules, [README](t6/scripts/README.md), [notes](t6/scripts/NOTES.md), and compiler checks. +- [t6/plugins/](t6/plugins/) — `tws-t6-gsc-utils`, based on [alicealys/t6-gsc-utils](https://github.com/alicealys/t6-gsc-utils), with the same HTTP changes. + +The scripts still deploy to the game's existing `storage/t5/scripts/sp/` or +`storage/t6/scripts/zm/` directories; the new source layout does not change GSC namespaces. + +## Building plugins + +Plugin source is vendored as regular tracked files so local modifications travel +with this repository. Each plugin's `upstream.json` records its upstream revision +and exact Git dependency revisions. Dependencies and build outputs are ignored. +The dependency loader replaces upstream's submodule setup; nested upstream +`.github` files are retained for reference and do not run as this repo's CI. + +Use Windows with Visual Studio 2022 C++ build tools, a Windows SDK, Git, and +Python 3.9+. From a Developer PowerShell with `msbuild` on PATH, at the repository root: + +```powershell +.\tools\build_plugins.ps1 -Game all -Configuration Release +``` + +This restores pinned dependencies, generates both projects, and builds x86 DLLs. +Upstream's Premake setup also downloads its MySQL client dependency on first use. +Outputs are `t5/plugins/tws-t5-gsc-utils/build/bin/Release/tws-t5-gsc-utils.dll` and +`t6/plugins/tws-t6-gsc-utils/build/bin/Release/tws-t6-gsc-utils.dll`. +Remove the old `t5-gsc-utils.dll` or `t6-gsc-utils.dll` before installing the +corresponding `tws-` DLL in `Plutonium/plugins/`; load only one version per game. +**Restart the server process**; +restarting only the map cannot load an updated plugin. + +Use `python tools/fetch_plugin_deps.py all --check` to verify dependency revisions +without fetching. Use `python3 tools/test_plugin_http.py` on macOS/Linux with a +C++20 compiler and libcurl development files to compile the real HTTP utilities +and test local stalled connections, response deadlines, status reporting and recovery. +These portable tests do not build the Windows DLLs or exercise Plutonium's VM. +Run `python3 tools/test_plugin_component.py` to compile the completion/option +handling against host engine shims with address and undefined-behavior sanitizers. + +Both plugins now default to a 5-second connection timeout and 15-second total +transfer timeout. Request options can override these with positive millisecond +values. Telemetry explicitly sets those limits and logs native HTTP status and +timings. See the [T5](t5/plugins/README.md) and [T6](t6/plugins/README.md) plugin notes. +Requests are still sent once, in order, with no retries or event timestamp changes. ## Parity @@ -15,13 +58,13 @@ Modules currently in each tree: | Module | T5 | T6 | |------------|-------------------------------|---------------------------------| -| common | `t5/tws_t5_common.gsc` | `t6/tws_t6_common.gsc` | -| hud | `t5/tws_t5_hud.gsc` | `t6/tws_t6_hud.gsc` | -| afk | `t5/tws_t5_afk.gsc` | `t6/tws_t6_afk.gsc` | -| lock | `t5/tws_t5_lock.gsc` | `t6/tws_t6_lock.gsc` | -| telemetry | `t5/tws_t5_telemetry.gsc` | `t6/tws_t6_telemetry.gsc` — queued `game_start` / `heartbeat` / `round_change` / `game_end` matching T5 | -| join | `t5/tws_t5_join.gsc` | `t6/tws_t6_join.gsc` | -| leaderboard | `t5/tws_t5_leaderboard.gsc` | `t6/tws_t6_leaderboard.gsc` | +| common | `t5/scripts/tws_t5_common.gsc` | `t6/scripts/tws_t6_common.gsc` | +| hud | `t5/scripts/tws_t5_hud.gsc` | `t6/scripts/tws_t6_hud.gsc` | +| afk | `t5/scripts/tws_t5_afk.gsc` | `t6/scripts/tws_t6_afk.gsc` | +| lock | `t5/scripts/tws_t5_lock.gsc` | `t6/scripts/tws_t6_lock.gsc` | +| telemetry | `t5/scripts/tws_t5_telemetry.gsc` | `t6/scripts/tws_t6_telemetry.gsc` — queued `game_start` / `heartbeat` / `round_change` / `game_end` matching T5 | +| join | `t5/scripts/tws_t5_join.gsc` | `t6/scripts/tws_t6_join.gsc` | +| leaderboard | `t5/scripts/tws_t5_leaderboard.gsc` | `t6/scripts/tws_t6_leaderboard.gsc` | ## Map record announcements @@ -71,12 +114,14 @@ Partial page results never replace the cache. The API has no pagination snapshot token: changed totals/record rounds reject the refresh, but concurrent renames can still move entries between pages. Refreshes deduplicate GUIDs. -Requests have a 15-second GSC wait limit. The plugins cannot cancel a native -request, so a stalled request prevents new leaderboard requests until it finishes; +Requests have a 15-second GSC wait limit. The TWS plugins also enforce native +5-second connection and 15-second transfer limits. The leaderboard waits for native +completion before starting another request; player threads never wait directly on HTTP. Responses at the plugins' 20 KiB truncation boundary are rejected. The complete JSON grammar, UTF-8, string escapes and response shape are checked before consuming data. These guards also reject -HTML/error bodies; the plugins do not expose HTTP status or response headers. +HTML/error bodies. Leaderboard still uses body validation; the new native HTTP +status diagnostics are consumed by telemetry. Run the portable data/structure checks with `node tools/check_leaderboard.mjs`. They execute the scripts' data helpers with engine-value shims, not a game VM. @@ -126,7 +171,7 @@ not prove API acceptance; inspect the API response or ingestion records. ## Validating T6 ```powershell -powershell -File t6/tools/check.ps1 +powershell -File t6/scripts/tools/check.ps1 -CompilerPath C:\path\to\gsc-tool.exe ``` -Requires `gsc-tool` 1.4.10 (T6 PC) on PATH. +Requires PowerShell and `gsc-tool` (T6 PC). diff --git a/t5/plugins/README.md b/t5/plugins/README.md new file mode 100644 index 0000000..706f6b3 --- /dev/null +++ b/t5/plugins/README.md @@ -0,0 +1,78 @@ +# tws-t5-gsc-utils + +Source: [alicealys/t5-gsc-utils](https://github.com/alicealys/t5-gsc-utils). +The baseline commit and dependency revisions are in [tws-t5-gsc-utils/upstream.json](tws-t5-gsc-utils/upstream.json). +Source is tracked here directly; dependency checkouts are restored from that +manifest and ignored. Follow the [build instructions](../../README.md#building-plugins). +Upstream API documentation is in [tws-t5-gsc-utils/README.md](tws-t5-gsc-utils/README.md). + +## HTTP deadlines and diagnostics + +All native HTTP requests default to `connect_timeout_ms = 5000` and +`timeout_ms = 15000`. The latter includes connection setup; the shorter limit +wins during connection. Both can be overridden in the existing options array +with positive integer milliseconds. Zero, negative and non-integer overrides +are rejected before a request is created. Neither retries nor redirects are +added. TLS certificate verification remains enabled. + +These are libcurl transfer deadlines, starting when a worker begins the request. +Time waiting for a worker or the game thread to deliver completion is measured +separately. A native timeout releases the request and emits `done` with +`success = false`, a transport error, and diagnostics. Each request is sent once. +The telemetry sender then logs the failed event and advances its ordered queue. +A timeout does not prove the API did not already accept the event. + +The existing completion values remain in the same positions. An optional fourth +value adds diagnostics: + +```c +request waittill("done", response, success, error, diagnostics); +``` + +`success` continues to mean transport success, including completed HTTP 4xx/5xx +responses. Existing scripts that read only the first three values still work. +An updated reporter on an old plugin logs that diagnostics and native deadlines +are unverified; deploy the matching DLL to enable the fix. + +| Field | Meaning | +| --- | --- | +| `http_status` | HTTP response code; `0` if none was received | +| `curl_code` | libcurl result; `0` is transport success, `28` is timeout | +| `dns_ms` | Time to finish name resolution | +| `connect_ms` | Time to establish TCP | +| `tls_ms` | Time to finish TLS; `0` if no TLS handshake completed | +| `first_byte_ms` | Time to first response byte; `0` if none arrived | +| `total_ms` | Total native transfer duration | +| `worker_queue_ms` | Time waiting for the plugin worker pool | +| `notify_ms` | Time from native completion to notifying GSC | +| `connect_timeout_ms`, `timeout_ms` | Effective native deadlines | + +Curl milestone times are cumulative from transfer start, not durations to add +together. Diagnostics are provided for failures as well as successful transfers; +an unfinished milestone can be zero. No request headers, tokens or URLs are +included in diagnostics. Responses retain the existing 20 KiB truncation behavior. + +Telemetry logs the status and timings for each completion at log level 1. +Non-2xx responses log at level 0 with a bounded response preview. Health counters +keep transport `completed`/`failed` and track `http_rejected` separately; an HTTP +rejection is a completed transport. Producers, queue ordering and payloads are +unchanged. Heartbeats are not coalesced, failed reports are not retried, and API +receipt timestamps remain the existing behavior. + +## Validation and rollout + +Run `python3 tools/test_plugin_http.py` from the repository root for portable +native HTTP tests. Build the x86 DLL on Windows, then on a test game server check: + +1. Updated telemetry reports HTTP status and all timing fields on normal requests. +2. An endpoint that accepts a connection but does not reply produces a native + timeout near 15 seconds, followed by the next queued request. +3. HTTP 401/429/500 responses increment `http_rejected` without blocking the queue; + transport errors increment `failed` instead. +4. Leaderboard and older three-value HTTP consumers still receive completion. +5. After a full server-process restart, verify all four telemetry event types in + Electric Cherry. A successful transport alone is not API acceptance. + +The localhost tests compile the actual HTTP utility against the host libcurl. +They do not validate Windows linking, its Schannel backend or game VM notification +handling. Those checks require the Windows build and a running Plutonium server. diff --git a/t5/plugins/tws-t5-gsc-utils/.gitattributes b/t5/plugins/tws-t5-gsc-utils/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/t5/plugins/tws-t5-gsc-utils/.github/dependabot.yml b/t5/plugins/tws-t5-gsc-utils/.github/dependabot.yml new file mode 100644 index 0000000..f1cef93 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: gitsubmodule + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/.github/workflows/build.yml b/t5/plugins/tws-t5-gsc-utils/.github/workflows/build.yml new file mode 100644 index 0000000..74d50b8 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/.github/workflows/build.yml @@ -0,0 +1,80 @@ +name: Build + +on: + push: + branches: + - "*" + pull_request: + branches: + - "*" + types: [opened, synchronize, reopened] +concurrency: + group: ${{ github.ref }} + cancel-in-progress: false +jobs: + build: + name: Build binaries + runs-on: windows-2022 + strategy: + matrix: + configuration: + - Debug + - Release + steps: + - name: Check out files + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + lfs: false + + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v2 + + - name: Generate project files + run: tools/premake5 vs2022 + + - name: Set up problem matching + uses: ammaraskar/msvc-problem-matcher@master + + - name: Build ${{matrix.configuration}} binaries + run: msbuild /m /v:minimal /p:Configuration=${{matrix.configuration}} /p:PlatformTarget=x86 build/tws-t5-gsc-utils.sln + + - name: Upload ${{matrix.configuration}} binaries + uses: actions/upload-artifact@v4 + with: + name: ${{matrix.configuration}} binaries + path: | + build/bin/${{matrix.configuration}}/tws-t5-gsc-utils.dll + deploy: + name: Deploy artifacts + needs: build + runs-on: ubuntu-latest + if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop') + steps: + - name: Setup main environment + if: github.ref == 'refs/heads/main' + run: echo "ALICE_MASTER_PATH=${{ secrets.ALICE_MASTER_SSH_PATH }}" >> $GITHUB_ENV + + - name: Download Release binaries + uses: actions/download-artifact@v4 + with: + name: Release binaries + + - name: Install SSH key + uses: shimataro/ssh-key-action@v2.7.0 + with: + key: ${{ secrets.ALICE_MASTER_SSH_PRIVATE_KEY }} + known_hosts: 'just-a-placeholder-so-we-dont-get-errors' + + - name: Add known hosts + run: ssh-keyscan -H ${{ secrets.ALICE_MASTER_SSH_ADDRESS }} >> ~/.ssh/known_hosts + + - name: Remove old data files + run: ssh ${{ secrets.ALICE_MASTER_SSH_USER }}@${{ secrets.ALICE_MASTER_SSH_ADDRESS }} rm -rf ${{ env.ALICE_MASTER_PATH }}/t5-gsc-utils/* + + - name: Upload binary + run: rsync -avz tws-t5-gsc-utils.dll ${{ secrets.ALICE_MASTER_SSH_USER }}@${{ secrets.ALICE_MASTER_SSH_ADDRESS }}:${{ env.ALICE_MASTER_PATH }}/t5-gsc-utils/ + + - name: Publish changes + run: ssh ${{ secrets.ALICE_MASTER_SSH_USER }}@${{ secrets.ALICE_MASTER_SSH_ADDRESS }} ${{ secrets.ALICE_MASTER_SSH_CHANGE_PUBLISH_COMMAND }} diff --git a/t5/plugins/tws-t5-gsc-utils/.gitignore b/t5/plugins/tws-t5-gsc-utils/.gitignore new file mode 100644 index 0000000..161cbeb --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/.gitignore @@ -0,0 +1,165 @@ +### Windows + +version.hpp + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Shortcuts +*.lnk + +### OSX + +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Visual Studio + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +build + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +### IDA +*.id0 +*.id1 +*.id2 +*.nam +*.til + +### Custom user files +# User scripts +user*.bat +*.code-workspace + +deps/mysql + +# Dependencies restored from upstream.json by tools/fetch_plugin_deps.py +/deps/GSL/ +/deps/asmjit/ +/deps/curl/ +/deps/date/ +/deps/json/ +/deps/libtomcrypt/ +/deps/libtommath/ +/deps/minhook/ +/deps/plutonium-sdk/ +/deps/sqlpp11/ +/deps/zlib/ diff --git a/t5/plugins/tws-t5-gsc-utils/README.md b/t5/plugins/tws-t5-gsc-utils/README.md new file mode 100644 index 0000000..37f765e --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/README.md @@ -0,0 +1,295 @@ +# tws-t5-gsc-utils +This is the TWS-maintained source snapshot. For the local HTTP timeout and +diagnostics changes, builds and installation, use the [TWS plugin notes](../README.md). +The upstream binary download below does not include these local changes. + +T5 version of [t6-gsc-utils](https://github.com/alicealys/t6-gsc-utils). +If you wish for any feature to be added please create an [issue](https://github.com/alicealys/t5-gsc-utils/issues/new). + +# Installation +* Download the latest version [t5-gsc-utils.dll](https://github.alicent.cat/t5-gsc-utils/t5-gsc-utils.dll) +* Copy it to `Plutonium/plugins/` + +# Features + +* Easily add almost any C++ function into GSC: + + C++ + ```c++ + { + gsc::function::add("myfunc", [](int a, const std::string& b) + { + printf("%i %s\n", a, b.data()); + }); + } + ``` + + GSC + ```gsc + init() + { + myFunc(1, "hello world"); + } + ``` + +* Non-primitive GSC types such as **arrays** and **structs** (soon) are also supported and can be implicitly converted to STL containers: + + C++ + ```c++ + { + gsc::function::add("sort", [](std::vector vec) + { + std::sort(vec.begin(), vec.end()); + return vec; + }); + } + ``` + + GSC + ```gsc + init() + { + arr = []; + arr[arr.size] = 10; + arr[arr.size] = 5; + arr[arr.size] = 3; + arr[arr.size] = 2; + arr[arr.size] = 9; + + for (i = 0; i < arr.size; i++) + { + print(arr[i]); + } + + print(""); + + arr = sort(arr); + + for (i = 0; i < arr.size; i++) + { + print(arr[i]); + } + } + ``` + + More examples can be found [here](https://github.com/alicealys/t5-gsc-utils/tree/main/src/component) + +# Functions & Methods + +A list of all the functions and methods that are added by this plugin. + +## IO + * `fileExists(path)`: Returns true if the file exists. + * `writeFile(path, data[, append])`: Creates a file if it doesn't exist and writes/appends text to it. + * `appendFile(path, data)`: Creates a file if it doesn't exist and appends text to it. + * `readFile(path)`: Reads a file. + * `fileSize(path)`: Returns file size in bytes. + * `createDirectory(path)`: Creates a directory. + * `directoryExists(path)`: Returns true if the directory exists. + * `directoryIsEmpty(path)`: Returns true if the directory is empty. + * `listFiles(path)`: Returns the list of files in the directory as an array. + * `copyFolder(source, target)`, `copyDirectory(source, target)`: Copies a folder. + * `removeDirectory(path[, recursive])`: Removes a directory and optionally all its contents. +## Command + * `executeCommand(command)`, `command::execute(command)`: Executes a console command. + + ```gsc + fast_restart() + { + executeCommand("fast_restart"); + } + ``` + * `addCommand(name, callback)`, `command::add(name, callback)`: Adds a console command. + + ```gsc + init() + { + addCommand("test_cmd", ::test_cmd); + } + + test_cmd(args) + { + assert(args[0] == "test_cmd"); + print("Hello world", args.size); + } + ``` + * `addClientCommand(name, callback)`, `command::add_sv(name, callback)`: Adds a client command (can be executed by players through the console). + + ```gsc + init() + { + command::add_sv("suicide", ::sv_cmd_suicide); + } + + sv_cmd_suicide(args) + { + self suicide(); + } + ``` + * `self tell(message)`: Prints a message to a player's chat. + * `say(message)`: Prints a message to all players' chat. + + ```gsc + init() + { + level thread on_player_connected(); + } + + on_player_connected() + { + while (true) + { + level waittill("connected", player); + say(string::format("%s connected!", player.name)); + player tell(string::format("Hello %s!", player.name)); + } + } + ``` + * `sendServerCommand(client_num, reliable, text)`: Executes SV_GameSendServerCommand. +## String + * `va(fmt, ...)`, `formatString(fmt, ...)`, `sprintf(fmt, ...)` + `string::va(fmt, ...)`, `string::format(fmt, ...)`: Formats a string: + + ```gsc + init() + { + print(va("hello %i %f %s", 1, 1.2, "world")); + } + ``` + * `printf(fmt, ...)`: Formats and prints a string: + + ```gsc + init() + { + printf("hello %i %f %s", 1, 1.2, "world"); + } + ``` + * `tolower(string)`, `string::to_lower(string)`: Converts the string to lowercase. + * `toupper(string)`, `string::to_upper(string)`: Converts the string to uppercase. + * `string::is_numeric(string)`: Return true if the string contains only numbers. + * `string::starts_with(string, start)`: Returns true if the string starts with the specified substring. + * `string::ends_with(string, end)`: Returns true if the string ends with the specified substring. + * `string::replace(string, what, with)`: Replaces the specified substring with another string. + * `string::regex_replace(string, expr, with)`: Replaces the matching substring with another string. + * `string::regex_match(string, expr)`: Determines if a regex matches the entire string and returns the matches as an array. + * `string::regex_search(string, expr)`: Determines if a regex matches part of the string. + ```gsc + init() + { + assert(string::to_upper("hello") == "HELLO"); + assert(string::to_lower("HELLO") == "hello"); + assert(string::is_numeric("12345")); + assert(string::starts_with("hello world", "hello")); + assert(string::ends_with("hello world", "world")); + assert(string::replace("hello", "e", "o") == "hollo"); + assert(string::regex_replace("hello", "h|e|l|o", "a") == "aaaaa"); + assert(string::regex_match("hello", "^hello$").size == 1); + assert(string::regex_search("hello", "e|o")); + } + ``` +## Misc + * `array(...)`: Creates an array from a list of arguments: + + ```gsc + init() + { + arr = array(1, 2, 3, 4); + } + ``` + * `type(value)`, `typeof(value)`: + + ```gsc + init() + { + assert(type("hello") == "string"); + assert(type(array()) == "array"); + } + ``` +## MySQL + +You can access a mysql database using the following functions: + +* `mysql::set_config(config)`: Must be called before calling other mysql functions, config should be a struct of this kind: + + ```gsc + init() + { + config = spawnstruct(); + config.host = "localhost"; + config.user = "root"; + config.password = "password"; + config.port = 3306; + config.database = "database_name"; + mysql::set_config(config); + } + ``` +* `mysql::query(query)`: Executes an sql statement, returns a query object: + + ```gsc + init() + { + // call mysql::set_config + + query = mysql::query("select * from `players` where guid=1"); + query waittill("done", result); + if (result.size > 0) + { + print("player name " + result[0]["name"]); + } + } + ``` +* `mysql::prepared_statement(query: string, params...)`: Executes a prepared statement, params can be a list of arguments or an array: + + ```gsc + init() + { + // call mysql::set_config + + // use variadic args for the parameters + { + query = mysql::prepared_statement("insert into `players` (`guid`, `name`) values (?, ?)", 123, "foo"); + query waittill("done", result, affected_rows, error); + } + + // use an array for the parameters + { + params = array(123, "foo"); + query = mysql::prepared_statement("insert into `players` (`guid`, `name`) values (?, ?)", params); + query waittill("done", result, affected_rows, error); + } + } + ``` +## Int64 +These int64 functions allow you to use int64 values within GSC, which normally only supports 32 bit integers. +This is useful if you store int64 values in a file or a database and need to access them from GSC. +The values are stored as strings but all the functions below can take either a string or int for an int64 argument. +`int64` represents a value that is either a `string` or an `int`. +* `int64::op(a: int64, op: string, b: int64): int64|bool`: Performs an operation between 2 int64 values (stored as strings) + ```gsc + { + result = int64::op("2583528945238953952", "+", "12039152933205235"); + assert(result == "2595568098172159187"); + + result = int64::op("5834258295282538925", ">", 1); + assert(result == true); + } + ``` + List of supported operators: + * `+` + * `-` + * `*` + * `/` + * `&` + * `^` + * `|` + * `~` + * `%` + * `>>` + * `<<` + * `++` + * `--` +* `int64::is_int(value: int64): bool`: Returns true if an int64 value fits within an int32 value. +* `int64::to_int(value: int64): int`: Converts an int64 value to an int32 value. +* `int64::min(a: int64, b: int64): int64`: Returns the minimum between 2 int64 values. +* `int64::max(a: int64, b: int64): int64`: Returns the maximum between 2 int64 values. + diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/asmjit.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/asmjit.lua new file mode 100644 index 0000000..ee93259 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/asmjit.lua @@ -0,0 +1,34 @@ +asmjit = { + source = path.join(dependencies.basePath, "asmjit"), +} + +function asmjit.import() + links { "asmjit" } + asmjit.includes() +end + +function asmjit.includes() + includedirs { + path.join(asmjit.source, "src") + } + + defines { + "ASMJIT_STATIC" + } +end + +function asmjit.project() + project "asmjit" + language "C++" + + asmjit.includes() + + files { + path.join(asmjit.source, "src/**.cpp"), + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, asmjit) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/curl.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/curl.lua new file mode 100644 index 0000000..3d36749 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/curl.lua @@ -0,0 +1,73 @@ +curl = { + source = path.join(dependencies.basePath, "curl"), +} + +function curl.import() + links { "curl" } + + filter "toolset:msc*" + links { "Crypt32.lib" } + filter {} + + curl.includes() +end + +function curl.includes() +filter "toolset:msc*" + includedirs { + path.join(curl.source, "include"), + } + + defines { + "CURL_STRICTER", + "CURL_STATICLIB", + "CURL_DISABLE_LDAP", + } +filter {} +end + +function curl.project() + if not os.istarget("windows") then + return + end + + project "curl" + language "C" + + curl.includes() + + includedirs { + path.join(curl.source, "lib"), + } + + files { + path.join(curl.source, "lib/**.c"), + path.join(curl.source, "lib/**.h"), + } + + defines { + "BUILDING_LIBCURL", + } + + filter "toolset:msc*" + + defines { + "USE_SCHANNEL", + "USE_WINDOWS_SSPI", + "USE_THREADS_WIN32", + } + + filter "toolset:not msc*" + + defines { + "USE_GNUTLS", + "USE_THREADS_POSIX", + } + + filter {} + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, curl) \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/gsl.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/gsl.lua new file mode 100644 index 0000000..7a2daf6 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/gsl.lua @@ -0,0 +1,19 @@ +gsl = { + source = path.join(dependencies.basePath, "GSL"), +} + +function gsl.import() + gsl.includes() +end + +function gsl.includes() + includedirs { + path.join(gsl.source, "include") + } +end + +function gsl.project() + +end + +table.insert(dependencies, gsl) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/json.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/json.lua new file mode 100644 index 0000000..e5eb493 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/json.lua @@ -0,0 +1,19 @@ +json = { + source = path.join(dependencies.basePath, "json"), +} + +function json.import() + json.includes() +end + +function json.includes() + includedirs { + path.join(json.source, "single_include/*") + } +end + +function json.project() + +end + +table.insert(dependencies, json) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/libtomcrypt.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/libtomcrypt.lua new file mode 100644 index 0000000..6c6f28d --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/libtomcrypt.lua @@ -0,0 +1,61 @@ +libtomcrypt = { + source = path.join(dependencies.basePath, "libtomcrypt"), +} + +function libtomcrypt.import() + links { + "libtomcrypt" + } + + libtomcrypt.includes() +end + +function libtomcrypt.includes() + includedirs { + path.join(libtomcrypt.source, "src/headers") + } + + defines { + "LTC_NO_FAST", + "LTC_NO_PROTOTYPES", + "LTC_NO_RSA_BLINDING", + } +end + +function libtomcrypt.project() + project "libtomcrypt" + language "C" + + libtomcrypt.includes() + libtommath.import() + + files { + path.join(libtomcrypt.source, "src/**.c"), + } + + removefiles { + path.join(libtomcrypt.source, "src/**/*tab.c"), + path.join(libtomcrypt.source, "src/encauth/ocb3/**.c"), + } + + defines { + "_CRT_SECURE_NO_WARNINGS", + "LTC_SOURCE", + "_LIB", + "USE_LTM" + } + + removedefines { + "_DLL", + "_USRDLL" + } + + linkoptions { + "-IGNORE:4221" + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, libtomcrypt) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/libtommath.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/libtommath.lua new file mode 100644 index 0000000..ab4cdde --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/libtommath.lua @@ -0,0 +1,52 @@ +libtommath = { + source = path.join(dependencies.basePath, "libtommath"), +} + +function libtommath.import() + links { + "libtommath" + } + + libtommath.includes() +end + +function libtommath.includes() + includedirs { + libtommath.source + } + + defines { + "LTM_DESC", + "__STDC_IEC_559__", + "MP_NO_DEV_URANDOM", + } +end + +function libtommath.project() + project "libtommath" + language "C" + + libtommath.includes() + + files { + path.join(libtommath.source, "*.c"), + } + + defines { + "_LIB" + } + + removedefines { + "_DLL", + "_USRDLL" + } + + linkoptions { + "-IGNORE:4221" + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, libtommath) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/minhook.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/minhook.lua new file mode 100644 index 0000000..396d4d3 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/minhook.lua @@ -0,0 +1,31 @@ +minhook = { + source = path.join(dependencies.basePath, "minhook"), +} + +function minhook.import() + links { "minhook" } + minhook.includes() +end + +function minhook.includes() + includedirs { + path.join(minhook.source, "include") + } +end + +function minhook.project() + project "minhook" + language "C" + + minhook.includes() + + files { + path.join(minhook.source, "src/**.h"), + path.join(minhook.source, "src/**.c"), + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, minhook) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/minizip.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/minizip.lua new file mode 100644 index 0000000..4a5754b --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/minizip.lua @@ -0,0 +1,43 @@ +minizip = { + source = path.join(dependencies.basePath, "zlib/contrib/minizip"), +} + +function minizip.import() + links { "minizip" } + zlib.import() + minizip.includes() +end + +function minizip.includes() + includedirs { + minizip.source + } + + zlib.includes() +end + +function minizip.project() + project "minizip" + language "C" + + minizip.includes() + + files { + path.join(minizip.source, "*.h"), + path.join(minizip.source, "*.c"), + } + + removefiles { + path.join(minizip.source, "miniunz.c"), + path.join(minizip.source, "minizip.c"), + } + + defines { + "_CRT_SECURE_NO_DEPRECATE", + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, minizip) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/mysql.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/mysql.lua new file mode 100644 index 0000000..a35778f --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/mysql.lua @@ -0,0 +1,52 @@ +if (os.host() ~= "windows") then + error("automatic mysql installation is not supported on your os") +end + +mysql = { + source = path.join(dependencies.basePath, "mysql"), + version = "5.7.43", + download = "https://cdn.alicent.cat/mysql-5.7.43-win32.zip", +} + +function mysql.install() + local hfile = io.open(string.format("%s/include/mysql.h", mysql.source), "r") + if (hfile) then + return + end + + os.execute(string.format("mkdir \"%s\" 2> nul", mysql.source)) + + local folder = path.join(mysql.source, "mysql-5.7.43-win32") + local archive = path.join(mysql.source, "mysql-5.7.43-win32.zip") + + print("Downloading MYSQL") + os.execute(string.format("curl \"%s\" -L -o \"%s\"", mysql.download, archive)) + + os.execute(string.format("powershell -command \"Expand-Archive -Force \\\"%s\\\" \\\"%s\\\"\"", archive, mysql.source)) + os.execute(string.format("powershell -command \"mv \\\"%s/*\\\" \\\"%s\\\"\"", folder, mysql.source)) + os.execute(string.format("powershell -command \"rm \\\"%s\\\"\"", archive)) + os.execute(string.format("rmdir \"%s\"", folder)) +end + +function mysql.import() + mysql.install() + mysql.includes() +end + +function mysql.includes() + includedirs { + path.join(mysql.source, "include"), + } +end + +function mysql.project() + project "mysql" + language "C" + + mysql.includes() + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, mysql) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/plutonium-sdk.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/plutonium-sdk.lua new file mode 100644 index 0000000..22d8ab7 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/plutonium-sdk.lua @@ -0,0 +1,18 @@ +plutonium_sdk = { + source = path.join(dependencies.basePath, "plutonium-sdk"), +} + +function plutonium_sdk.import() + plutonium_sdk.includes() +end + +function plutonium_sdk.includes() + includedirs { + plutonium_sdk.source, + } +end + +function plutonium_sdk.project() +end + +table.insert(dependencies, plutonium_sdk) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/sqlpp11.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/sqlpp11.lua new file mode 100644 index 0000000..1f96b16 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/deps/premake/sqlpp11.lua @@ -0,0 +1,26 @@ +sqlpp11 = { + source = path.join(dependencies.basePath, "sqlpp11"), +} + +function sqlpp11.import() + sqlpp11.includes() +end + +function sqlpp11.includes() + includedirs { + path.join(sqlpp11.source, "include"), + path.join(dependencies.basePath, "date/include"), + } +end + +function sqlpp11.project() + project "sqlpp11" + language "C++" + + sqlpp11.includes() + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, sqlpp11) diff --git a/t5/plugins/tws-t5-gsc-utils/deps/premake/zlib.lua b/t5/plugins/tws-t5-gsc-utils/deps/premake/zlib.lua new file mode 100644 index 0000000..566a707 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/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/t5/plugins/tws-t5-gsc-utils/generate.bat b/t5/plugins/tws-t5-gsc-utils/generate.bat new file mode 100644 index 0000000..951520e --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/generate.bat @@ -0,0 +1,3 @@ +@echo off +call git submodule update --init --recursive +tools\premake5.exe vs2022 \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/premake5.lua b/t5/plugins/tws-t5-gsc-utils/premake5.lua new file mode 100644 index 0000000..ee99510 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/premake5.lua @@ -0,0 +1,105 @@ +dependencies = { + basePath = "./deps" +} + +function dependencies.load() + dir = path.join(dependencies.basePath, "premake/*.lua") + deps = os.matchfiles(dir) + + for i, dep in pairs(deps) do + dep = dep:gsub(".lua", "") + require(dep) + end +end + +function dependencies.imports() + for i, proj in pairs(dependencies) do + if type(i) == 'number' then + proj.import() + end + end +end + +function dependencies.projects() + for i, proj in pairs(dependencies) do + if type(i) == 'number' then + proj.project() + end + end +end + +dependencies.load() + +workspace "tws-t5-gsc-utils" + location "./build" + objdir "%{wks.location}/obj/%{cfg.buildcfg}" + targetdir "%{wks.location}/bin/%{cfg.buildcfg}" + targetname "%{prj.name}" + + configurations { "Debug", "Release", } + + language "C++" + cppdialect "C++20" + + architecture "x86" + + systemversion "latest" + symbols "On" + staticruntime "On" + editandcontinue "Off" + warnings "Extra" + characterset "ASCII" + + flags + { + "NoIncrementalLink", + "MultiProcessorCompile", + } + + filter "configurations:Release" + optimize "Full" + defines { "NDEBUG" } + filter {} + + filter "configurations:Debug" + optimize "Debug" + defines { "DEBUG", "_DEBUG" } + filter {} + + startproject "tws-t5-gsc-utils" + + project "tws-t5-gsc-utils" + kind "SharedLib" + language "C++" + + files + { + "./src/**.h", + "./src/**.hpp", + "./src/**.cpp", + "./src/**.rc", + } + + includedirs + { + "%{prj.location}/src", + "./src", + "./deps/mysql/include" + } + + libdirs {"./deps/mysql/lib"} + + resincludedirs + { + "$(ProjectDir)src" + } + + linkoptions {"/DELAYLOAD:libmysql.dll"} + + pchheader "stdinc.hpp" + pchsource "src/stdinc.cpp" + + dependencies.imports() + + group "Dependencies" + dependencies.projects() \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/command.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/command.cpp new file mode 100644 index 0000000..bec33ed --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/command.cpp @@ -0,0 +1,352 @@ +#include "stdinc.hpp" +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "command.hpp" +#include "gsc.hpp" +#include "scripting.hpp" +#include "scheduler.hpp" + +#include +#include +#include + +namespace command +{ + namespace + { + std::unordered_map> handlers; + std::unordered_map> handlers_sv; + + std::vector script_commands; + std::vector script_sv_commands; + utils::memory::allocator allocator; + + utils::hook::detour client_command_hook; + + std::vector chat_callbacks; + + game::CmdArgs* get_cmd_args() + { + return static_cast(game::Sys_GetValue(4)); + } + + void main_handler() + { + params params = {}; + + const auto command = utils::string::to_lower(params[0]); + + if (handlers.find(command) != handlers.end()) + { + handlers[command](params); + } + } + + bool can_add_callback = true; + bool handle_chat_command(const int client_num, const params_sv& params) + { + const auto _0 = gsl::finally([] + { + can_add_callback = true; + }); + can_add_callback = false; + + auto hide = false; + const scripting::entity player = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, client_num, 0, 0); + + const auto command = utils::string::to_lower(params[0]); + const auto message = params.join(1).substr(1); + + for (const auto& callback : chat_callbacks) + { + const auto res = callback(player, {message, command == "say_team"}); + if (res.is() && !res.as()) + { + hide = true; + } + } + + return hide; + } + + void client_command_stub(const int client_num) + { + params_sv params = {}; + if (params.size() < 1) + { + client_command_hook.invoke(client_num); + return; + } + + const auto command = utils::string::to_lower(params[0]); + if (params.size() > 1 && (command == "say" || command == "say_team") && + handle_chat_command(client_num, params)) + { + return; + } + + if (handlers_sv.find(command) != handlers_sv.end()) + { + handlers_sv[command](client_num, params); + } + + client_command_hook.invoke(client_num); + } + + void add_script_command(const std::string& name, const std::function& callback) + { + script_commands.push_back(name); + const auto name_ = allocator.duplicate_string(name); + add(name_, callback); + } + + void add_script_sv_command(const std::string& name, const std::function& callback) + { + script_sv_commands.push_back(name); + add_sv(name, callback); + } + + void clear() + { + for (const auto& name : script_commands) + { + handlers.erase(name); + game::Cmd_RemoveCommand(name.data()); + } + + for (const auto& name : script_sv_commands) + { + handlers_sv.erase(name); + } + + allocator.clear(); + script_commands.clear(); + script_sv_commands.clear(); + chat_callbacks.clear(); + } + } + + params::params() + : nesting_(get_cmd_args()->nesting) + { + } + + int params::size() const + { + const auto cmd_args = get_cmd_args(); + return cmd_args->argc[cmd_args->nesting]; + } + + const char* params::get(int index) const + { + if (index >= this->size()) + { + return ""; + } + + const auto cmd_args = get_cmd_args(); + return cmd_args->argv[this->nesting_][index]; + } + + std::string params::join(int index) const + { + std::string result = {}; + + for (auto i = index; i < this->size(); i++) + { + if (i > index) + { + result.append(" "); + } + + result.append(this->get(i)); + } + + return result; + } + + std::vector params::get_all() const + { + std::vector params_; + for (auto i = 0; i < this->size(); i++) + { + params_.push_back(this->get(i)); + } + return params_; + } + + params_sv::params_sv() + : nesting_(game::sv_cmd_args->nesting) + { + } + + int params_sv::size() const + { + return game::sv_cmd_args->argc[this->nesting_]; + } + + const char* params_sv::get(const int index) const + { + if (index >= this->size()) + { + return ""; + } + + return game::sv_cmd_args->argv[this->nesting_][index]; + } + + std::string params_sv::join(const int index) const + { + std::string result = {}; + + for (auto i = index; i < this->size(); i++) + { + if (i > index) + { + result.append(" "); + } + + result.append(this->get(i)); + } + + return result; + } + + std::vector params_sv::get_all() const + { + std::vector params_; + for (auto i = 0; i < this->size(); i++) + { + params_.push_back(this->get(i)); + } + return params_; + } + + void add_raw(const char* name, void (*callback)()) + { + game::Cmd_AddCommandInternal(name, callback, utils::memory::get_allocator()->allocate()); + } + + void add(const char* name, std::function callback) + { + const auto command = utils::string::to_lower(name); + + if (handlers.find(command) == handlers.end()) + { + add_raw(name, main_handler); + } + + handlers[command] = callback; + } + + void add_sv(const std::string& name, std::function callback) + { + const auto command = utils::string::to_lower(name); + if (handlers_sv.find(command) == handlers_sv.end()) + { + handlers_sv[command] = std::move(callback); + } + } + + void execute(std::string command, const bool sync) + { + command += "\n"; + + if (sync) + { + game::Cmd_ExecuteSingleCommand(0, 0, command.data()); + } + else + { + game::Cbuf_AddText(0, command.data()); + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown(clear); + + client_command_hook.create(SELECT_VALUE(0x4AF770, 0x63DB70), client_command_stub); + + gsc::function::add_multiple([](const std::string& command) + { + execute(command, false); + }, "executecommand", "command::execute"); + + gsc::function::add_multiple([](const std::string& name, const scripting::function& function) + { + command::add_script_command(name, [function](const command::params& params) + { + const auto params_ = params.get_all(); + scheduler::once([=]() + { + scripting::array array; + + for (auto i = 0; i < params.size(); i++) + { + array.emplace_back(params[i]); + } + + function({array}); + }); + }); + }, "addcommand", "command::add"); + + gsc::function::add_multiple([](const std::string& name, const scripting::function& function) + { + command::add_script_sv_command(name, [function](const int client_num, const command::params_sv& params) + { + const auto params_ = params.get_all(); + scheduler::once([=]() + { + const scripting::entity player = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, client_num, 0, 0); + + scripting::array array; + + for (auto i = 0; i < params.size(); i++) + { + array.emplace_back(params[i]); + } + + function(player, {array}); + }, scheduler::pipeline::server); + }); + }, "addclientcommand", "command::add_sv"); + + gsc::method::add("tell", [](const scripting::entity& player, const std::string& msg) + { + const auto entref = player.get_entity_reference(); + if (entref.classnum) + { + throw std::runtime_error("Not a player entity"); + } + + game::SV_GameSendServerCommand(entref.entnum, 0, utils::string::va("h \"%s\"", msg.data())); + }); + + gsc::function::add("say", [](const std::string& msg) + { + game::SV_GameSendServerCommand(-1, 0, utils::string::va("h \"%s\"", msg.data())); + }); + + gsc::function::add("sendservercommand", game::SV_GameSendServerCommand.get()); + + gsc::function::add_multiple([](const scripting::function& callback) + { + if (!can_add_callback) + { + throw std::runtime_error("Cannot add a callback in this context"); + } + + chat_callbacks.push_back(callback); + }, "onplayersay", "command::on_player_say"); + } + }; +} + +REGISTER_COMPONENT(command::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/command.hpp b/t5/plugins/tws-t5-gsc-utils/src/component/command.hpp new file mode 100644 index 0000000..0602bb9 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/command.hpp @@ -0,0 +1,48 @@ +#pragma once + +namespace command +{ + class params + { + public: + params(); + + int size() const; + const char* get(int index) const; + std::string join(int index) const; + std::vector get_all() const; + + const char* operator[](const int index) const + { + return this->get(index); + } + + private: + int nesting_; + }; + + class params_sv + { + public: + params_sv(); + + int size() const; + const char* get(int index) const; + std::string join(int index) const; + std::vector get_all() const; + + const char* operator[](const int index) const + { + return this->get(index); + } + + private: + int nesting_; + }; + + void add_raw(const char* name, void (*callback)()); + void add(const char* name, std::function callback); + void add_sv(const std::string& name, std::function callback); + + void execute(std::string command, const bool sync = false); +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/exception.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/exception.cpp new file mode 100644 index 0000000..3f9930e --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/exception.cpp @@ -0,0 +1,147 @@ +#include +#include "loader/component_loader.hpp" +#include "game/game.hpp" + +#include "scheduler.hpp" + +#include "gsc.hpp" +#include "json.hpp" +#include "scripting.hpp" +#include "game/scripting/execution.hpp" + +#include +#include +#include +#include +#include + +#include + +namespace exception +{ + namespace + { + thread_local struct + { + DWORD code = 0; + PVOID address = nullptr; + } exception_data; + + void show_mouse_cursor() + { + while (ShowCursor(TRUE) < 0); + } + + void display_error_dialog() + { + std::string error_str = utils::string::va("Fatal error (0x%08X) at 0x%p.\n" + "A minidump has been written.\n\n", + exception_data.code, exception_data.address); + + error_str += "Make sure to update your graphics card drivers and install operating system updates!"; + + utils::thread::suspend_other_threads(); + show_mouse_cursor(); + MessageBoxA(nullptr, error_str.data(), "Plutonium T5 ERROR", MB_ICONERROR); + TerminateProcess(GetCurrentProcess(), exception_data.code); + } + + void reset_state() + { + display_error_dialog(); + } + + size_t get_reset_state_stub() + { + static auto* stub = utils::hook::assemble([](utils::hook::assembler& a) + { + a.sub(esp, 0x10); + a.or_(esp, 0x8); + a.jmp(reset_state); + }); + + return reinterpret_cast(stub); + } + + std::string generate_crash_info(const LPEXCEPTION_POINTERS exceptioninfo) + { + std::string info{}; + const auto line = [&info](const std::string& text) + { + info.append(text); + info.append("\r\n"); + }; + + line("Plutonium T5 Crash Dump"); + line(""); + line("Timestamp: "s + utils::string::get_timestamp()); + line(utils::string::va("Exception: 0x%08X", exceptioninfo->ExceptionRecord->ExceptionCode)); + line(utils::string::va("Address: 0x%lX", exceptioninfo->ExceptionRecord->ExceptionAddress)); + +#pragma warning(push) +#pragma warning(disable: 4996) + OSVERSIONINFOEXA version_info; + ZeroMemory(&version_info, sizeof(version_info)); + version_info.dwOSVersionInfoSize = sizeof(version_info); + GetVersionExA(reinterpret_cast(&version_info)); +#pragma warning(pop) + + line(utils::string::va("OS Version: %u.%u", version_info.dwMajorVersion, version_info.dwMinorVersion)); + + return info; + } + + void write_minidump(const LPEXCEPTION_POINTERS exceptioninfo) + { + const std::string crash_name = utils::string::va("minidumps/plutonium-t5-crash-%s.zip", + utils::string::get_timestamp().data()); + + utils::compression::zip::archive zip_file{}; + zip_file.add("crash.dmp", create_minidump(exceptioninfo)); + zip_file.add("info.txt", generate_crash_info(exceptioninfo)); + zip_file.write(crash_name, "Plutonium T5 Crash Dump"); + } + + bool is_harmless_error(const LPEXCEPTION_POINTERS exceptioninfo) + { + const auto code = exceptioninfo->ExceptionRecord->ExceptionCode; + return code == STATUS_INTEGER_OVERFLOW || code == STATUS_FLOAT_OVERFLOW || code == STATUS_SINGLE_STEP; + } + + LONG WINAPI exception_filter(const LPEXCEPTION_POINTERS exceptioninfo) + { + if (is_harmless_error(exceptioninfo)) + { + return EXCEPTION_CONTINUE_EXECUTION; + } + + write_minidump(exceptioninfo); + + exception_data.code = exceptioninfo->ExceptionRecord->ExceptionCode; + exception_data.address = exceptioninfo->ExceptionRecord->ExceptionAddress; + exceptioninfo->ContextRecord->Eip = get_reset_state_stub(); + + return EXCEPTION_CONTINUE_EXECUTION; + } + + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI set_unhandled_exception_filter_stub(LPTOP_LEVEL_EXCEPTION_FILTER) + { + // Don't register anything here... + return &exception_filter; + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { +//#ifdef DEBUG + SetUnhandledExceptionFilter(exception_filter); + utils::hook::jump(reinterpret_cast(&SetUnhandledExceptionFilter), set_unhandled_exception_filter_stub); +//#endif + } + }; +} + +REGISTER_COMPONENT(exception::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/gsc.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/gsc.cpp new file mode 100644 index 0000000..7bb94d8 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/gsc.cpp @@ -0,0 +1,277 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/structs.hpp" +#include "game/game.hpp" + +#include "gsc.hpp" + +#include +#include +#include + +namespace gsc +{ + std::unordered_map functions; + std::unordered_map methods; + + std::unordered_map function_wraps; + std::unordered_map method_wraps; + + namespace + { + utils::hook::detour get_function_hook; + utils::hook::detour get_method_hook; + + std::vector get_arguments() + { + std::vector args; + + for (auto i = 0; static_cast(i) < game::scr_VmPub->outparamcount; i++) + { + const auto value = game::scr_VmPub->top[-i]; + args.push_back(value); + } + + return args; + } + + void return_value(const scripting::script_value& value) + { + if (game::scr_VmPub->outparamcount) + { + game::Scr_ClearOutParams(game::SCRIPTINSTANCE_SERVER); + } + + scripting::push_value(value); + } + + script_function get_function_stub(const char** name, int* type) + { + const auto iter = function_wraps.find(*name); + if (iter != function_wraps.end()) + { + return reinterpret_cast(iter->second); + } + + return get_function_hook.invoke(name, type); + } + + script_function get_method_stub(const char** name, int* type) + { + const auto iter = method_wraps.find(*name); + if (iter != method_wraps.end()) + { + return reinterpret_cast(iter->second); + } + + return get_method_hook.invoke(name, type); + } + + void print(int, const char* fmt, ...) + { + char buffer[2048]; + + va_list ap; + va_start(ap, fmt); + + vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, fmt, ap); + + va_end(ap); + + printf("%s", buffer); + } + + utils::hook::detour scr_settings_hook; + void scr_settings_stub(int /*developer*/, int developer_script, int /*abort_on_error*/, int inst) + { + scr_settings_hook.invoke(developer_script, developer_script, 0, inst); + } + + utils::hook::detour scr_get_builtin_hook; + unsigned int scr_get_builtin_stub(int inst, game::sval_u func_name) + { + const auto type = *reinterpret_cast(func_name.block); + if (type != 28) + { + return scr_get_builtin_hook.invoke(inst, func_name); + } + + const auto func_namea = *reinterpret_cast(reinterpret_cast(func_name.block) + 4); + const auto typea = *reinterpret_cast(func_namea); + if (typea != 20) + { + return scr_get_builtin_hook.invoke(inst, func_name); + } + + const auto func_nameb = *reinterpret_cast(reinterpret_cast(func_namea) + 4); + const auto typeb = *reinterpret_cast(func_nameb); + + if (typeb == 23) // script::function type call + { + const auto namespace_ = game::SL_ConvertToString( + *reinterpret_cast(reinterpret_cast(func_nameb) + 4), game::SCRIPTINSTANCE_SERVER); + const auto name = game::SL_ConvertToString( + *reinterpret_cast(reinterpret_cast(func_nameb) + 8), game::SCRIPTINSTANCE_SERVER); + + const auto full_name = utils::string::va("%s::%s", namespace_, name); + if (functions.find(full_name) != functions.end()) + { + return game::SL_GetString(full_name, 0, game::SCRIPTINSTANCE_SERVER); + } + } + + return scr_get_builtin_hook.invoke(inst, func_name); + } + + // Scr_NotifyId doesn't exist, Scr_NotifyNum_Internal calls FindVariableId to get the variable id from entnum, classnum & clientNum + // to not have to recreate Scr_NotifyId we simply make FindVariableId return `entnum` (which in this case will be the id) if `clientNum` == -1 + std::size_t find_variable_id_stub_plutonium = 0; + unsigned int find_variable_id_stub(int inst, int entnum, unsigned int classnum, int client_num) + { + if (client_num == -1) + { + return entnum; + } + + return utils::hook::invoke(find_variable_id_stub_plutonium, inst, entnum, classnum, client_num); + } + } + + void call_function(const function_t& function) + { + const auto args = get_arguments(); + + try + { + const auto value = function(args); + return_value(value); + } + catch (const std::exception& e) + { + game::Scr_Error(game::SCRIPTINSTANCE_SERVER, e.what(), false); + } + } + + void call_method(const function_t& method, const game::scr_entref_t entref) + { + const auto args = get_arguments(); + + try + { + const scripting::entity entity = game::Scr_GetEntityId( + game::SCRIPTINSTANCE_SERVER, entref.entnum, entref.classnum, 0); + + std::vector args_{}; + args_.push_back(entity); + for (const auto& arg : args) + { + args_.push_back(arg); + } + + const auto value = method(args_); + return_value(value); + } + catch (const std::exception& e) + { + game::Scr_Error(game::SCRIPTINSTANCE_SERVER, e.what(), false); + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + // Don't com_error on gsc errors + utils::hook::nop(SELECT_VALUE(0x5A17E1, 0x4D9BB1), 5); + utils::hook::jump(SELECT_VALUE(0x5DFC40, 0x568B90), print); + + scr_settings_hook.create(SELECT_VALUE(0x4CEEA0, 0x55D010), scr_settings_stub); + + get_function_hook.create(utils::hook::extract(SELECT_VALUE(0x8A02FB, 0x8DE11B) + 1), get_function_stub); + get_method_hook.create(utils::hook::extract(SELECT_VALUE(0x8A052E, 0x8DE34E) + 1), get_method_stub); + + scr_get_builtin_hook.create(SELECT_VALUE(0x4ACAC0, 0x411490), scr_get_builtin_stub); + + // \n******* script runtime error *******\n%s\n + utils::hook::set(SELECT_VALUE(0x9FC5C0 + 40, 0xAABA68 + 40), '\n'); + utils::hook::set(SELECT_VALUE(0x9FC5C0 + 41, 0xAABA68 + 41), '\0'); + + find_variable_id_stub_plutonium = utils::hook::extract(SELECT_VALUE(0x41D2B5, 0x416325) + 1); + utils::hook::call(SELECT_VALUE(0x41D2B5, 0x416325), find_variable_id_stub); + + gsc::function::add("array", [](const scripting::variadic_args& va) + { + scripting::array array{}; + + for (const auto& arg : va) + { + array.emplace_back(arg); + } + + return array; + }); + + gsc::function::add_multiple([](const scripting::script_value& value) + { + return value.type_name(); + }, "typeof", "type"); + + gsc::function::add("debug::get_var_count", []() + { + auto count = 0; + + if (game::environment::is_sp()) + { + for (auto i = 1; i < 0x5FFE; i++) + { + const auto var = game::scr_VarGlob->variableList_mp[i]; + count += var.w.status != 0; + } + } + else + { + for (auto i = 1; i < 0x7FFE; i++) + { + const auto var = game::scr_VarGlob->variableList_mp[i]; + count += var.w.status != 0; + } + } + + return count; + }); + + gsc::function::add("toint", [](const std::string& str, const scripting::variadic_args& va) + { + auto radix = 10; + if (!va.empty()) + { + radix = va[0]; + } + + return static_cast(std::strtoull(str.data(), nullptr, radix)); + }); + + gsc::function::add("os::date", [](const scripting::variadic_args& va) + { + std::string format = "%Y-%m-%dT%H:%M:%S%z"; + if (!va.empty()) + { + format = va[0].as(); + } + + tm ltime{}; + char timestamp[MAX_PATH] = {0}; + const auto time = _time64(nullptr); + + _localtime64_s(<ime, &time); + std::strftime(timestamp, sizeof(timestamp) - 1, format.data(), <ime); + + return std::string(timestamp); + }); + } + }; +} + +REGISTER_COMPONENT(gsc::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/gsc.hpp b/t5/plugins/tws-t5-gsc-utils/src/component/gsc.hpp new file mode 100644 index 0000000..04f35c1 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/gsc.hpp @@ -0,0 +1,128 @@ +#pragma once +#include "game/scripting/array.hpp" +#include "game/scripting/execution.hpp" + +#if _HAS_CXX20 +namespace gsc +{ + using function_t = std::function; + using script_function = void(*)(game::scr_entref_t); + + extern std::unordered_map functions; + extern std::unordered_map methods; + + extern std::unordered_map function_wraps; + extern std::unordered_map method_wraps; + + // auto = []{} forces template reevaluation + + template + auto wrap_function(const std::function& f, std::index_sequence) + { + return [f]([[maybe_unused]] const scripting::function_arguments& args) + { + f(args[I]...); + return scripting::script_value{}; + }; + } + + template + auto wrap_function(const std::function& f, std::index_sequence) + { + return [f]([[maybe_unused]] const scripting::function_arguments& args) + { + return f(args[I]...); + }; + } + + template + auto wrap_function(const std::function& f, std::index_sequence) + { + return [f]([[maybe_unused]] const scripting::function_arguments& args) + { + return scripting::script_value{f(args[I]...)}; + }; + } + + template + auto wrap_function(const std::function& f) + { + return wrap_function(f, std::index_sequence_for{}); + } + + template + auto wrap_function(F f) + { + return wrap_function(std::function(f)); + } + + void call_function(const function_t& function); + void call_method(const function_t& method, const game::scr_entref_t entref); + + namespace function + { + template + void add_internal(const std::string& name, F function) + { + static auto called = false; + assert(!called); + called = true; + + const auto lower = utils::string::to_lower(name); + static const auto [iterator, was_inserted] = functions.insert(std::make_pair(lower, function)); + static const auto& function_ptr = iterator->second; + + function_wraps[lower] = []() + { + call_function(function_ptr); + }; + } + + template + void add(const std::string& name, F f) + { + add_internal(name, wrap_function(f)); + } + + template + void add_multiple(F f, Args&& ...names) + { + (add(names, f), ...); + } + } + + namespace method + { + template + void add_internal(const std::string& name, F function) + { + static auto called = false; + assert(!called); + called = true; + + const auto lower = utils::string::to_lower(name); + static const auto [iterator, was_inserted] = functions.insert(std::make_pair(lower, function)); + static const auto& function_ptr = iterator->second; + + method_wraps[lower] = [](game::scr_entref_t entref) + { + call_method(function_ptr, entref); + }; + } + + template + void add(const std::string& name, F f) + { + add_internal(name, wrap_function(f)); + } + + template + void add_multiple(F f, Args&& ...names) + { + (add(names, f), ...); + } + } +} +#else +#error pre c++20 is not supported +#endif diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/http.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/http.cpp new file mode 100644 index 0000000..cf91384 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/http.cpp @@ -0,0 +1,287 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/structs.hpp" +#include "game/game.hpp" + +#include "gsc.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include + +namespace http +{ + namespace + { + constexpr const auto max_result_size = 0x5000u; + + struct http_request_params_t + { + std::string method; + std::string url; + std::string fields; + utils::http::headers headers; + utils::http::timeouts limits; + }; + + struct http_request_t + { + http_request_params_t params; + scripting::object handle; + std::optional result; + std::chrono::steady_clock::time_point queued_at = std::chrono::steady_clock::now(); + std::chrono::steady_clock::time_point started_at; + std::chrono::steady_clock::time_point finished_at; + std::atomic_bool completed{false}; + }; + + std::vector> requests; + + double elapsed_ms(const std::chrono::steady_clock::time_point start, + const std::chrono::steady_clock::time_point end) + { + return std::chrono::duration(end - start).count(); + } + + void notify_request_result(std::shared_ptr& request) + { + const auto handle_id = request->handle.get_entity_id(); + const utils::http::result missing; + const auto& result = request->result ? *request->result : missing; + scripting::array diagnostics; + diagnostics["http_status"] = static_cast(result.status); + diagnostics["curl_code"] = static_cast(result.code); + diagnostics["dns_ms"] = result.dns_ms; + diagnostics["connect_ms"] = result.connect_ms; + diagnostics["tls_ms"] = result.tls_ms; + diagnostics["first_byte_ms"] = result.first_byte_ms; + diagnostics["total_ms"] = result.total_ms; + diagnostics["worker_queue_ms"] = elapsed_ms(request->queued_at, request->started_at); + diagnostics["notify_ms"] = elapsed_ms(request->finished_at, std::chrono::steady_clock::now()); + diagnostics["connect_timeout_ms"] = static_cast(request->params.limits.connect_timeout_ms); + diagnostics["timeout_ms"] = static_cast(request->params.limits.timeout_ms); + + if (!request->result.has_value()) + { + scripting::notify(handle_id, "done", {{}, false, "unknown error", diagnostics}); + return; + } + + const auto error = curl_easy_strerror(result.code); + + if (result.code != CURLE_OK) + { + scripting::notify(handle_id, "done", {{}, false, error, diagnostics}); + return; + } + + auto& buffer = request->result->buffer; + if (buffer.size() >= max_result_size) + { + printf("^3WARNING: http result size bigger than %i bytes (%i), truncating!", max_result_size, + static_cast(buffer.size())); + buffer.resize(max_result_size); + } + + // Keep the original three values; older waiters ignore the fourth. + // HTTP 4xx/5xx are completed transfers, not transport failures. + scripting::notify(handle_id, "done", {buffer, true, {}, diagnostics}); + } + + void check_requests() + { + std::vector> ready; + for (auto i = requests.begin(); i != requests.end(); ) + { + auto& request = *i; + if (!request->completed) + { + ++i; + continue; + } + else + { + ready.emplace_back(request); + i = requests.erase(i); + } + } + // A resumed script may enqueue another request. Do not hold an iterator + // into requests while notifying the VM. + for (auto& request : ready) + notify_request_result(request); + } + + scripting::object create_request(const http_request_params_t& params) + { + const auto request = std::make_shared(); + requests.emplace_back(request); + + request->params = params; + scheduler::thread_pool.push([request] + { + request->started_at = std::chrono::steady_clock::now(); + try + { + request->result = utils::http::get_data( + request->params.url, + request->params.fields, + request->params.headers, + request->params.method, + request->params.limits); + } + catch (...) + { + // Exceptions must also release GSC waiters through the done event. + request->result = std::nullopt; + } + request->finished_at = std::chrono::steady_clock::now(); + request->completed = true; + }); + + return request->handle; + } + + template + void push_request(T&& r) + { + const auto request = std::make_shared(std::forward(r)); + requests.emplace_back(request); + } + + void wait_and_clear_requests() + { + for (auto& task : requests) + { + while (!task->completed) + { + std::this_thread::sleep_for(10ms); + } + } + + requests.clear(); + } + + long timeout_option(const scripting::array& options, const char* name, const long fallback) + { + const auto value = options[name]; + if (value.get_raw().type == game::SCRIPT_NONE) + return fallback; + if (!value.is() || value.as() <= 0) + throw std::runtime_error(std::string(name) + " must be a positive integer in milliseconds"); + return value.as(); + } + + void parse_request_options(http_request_params_t& params, const scripting::array& options) + { + params.limits.connect_timeout_ms = timeout_option(options, "connect_timeout_ms", params.limits.connect_timeout_ms); + params.limits.timeout_ms = timeout_option(options, "timeout_ms", params.limits.timeout_ms); + const auto fields = options["parameters"]; + const auto body = options["body"]; + const auto headers = options["headers"]; + const auto method = options["method"]; + + if (method.is()) + { + params.method = method.as(); + } + + if (fields.is()) + { + const auto fields_ = fields.as(); + const auto keys = fields_.get_keys(); + + for (const auto& key : keys) + { + if (!key.is()) + { + continue; + } + + const auto key_ = key.as(); + const auto value = fields_[key].to_string(); + params.fields += key_ + "=" + value + "&"; + } + + } + else if (body.is()) + { + params.fields = body.as(); + } + + if (headers.is()) + { + const auto headers_arr = headers.as(); + const auto keys = headers_arr.get_keys(); + + for (const auto& key : keys) + { + if (!key.is()) + { + continue; + } + + const auto key_str = key.as(); + const auto value = headers_arr[key].to_string(); + + params.headers[key_str] = value; + } + } + } + } + + class component final : public component_interface + { + public: + void on_shutdown([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown(wait_and_clear_requests); + } + + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scheduler::loop(check_requests, scheduler::server); + scripting::on_shutdown(wait_and_clear_requests); + + gsc::function::add_multiple([](const std::string& url) + { + http_request_params_t params{}; + params.url = url; + return create_request(params); + }, "http::get", "httpget", "curl"); + + gsc::function::add("http::request", [](const std::string& url, const scripting::variadic_args& va) + { + http_request_params_t params{}; + params.url = url; + + if (va.size() > 0) + { + const auto options = va[0].as(); + parse_request_options(params, options); + } + + return create_request(params); + }); + + gsc::function::add_multiple([](const std::string& url, const scripting::variadic_args& va) + { + http_request_params_t params{}; + params.url = url; + params.method = "POST"; + + if (va.size() > 0) + { + const auto options = va[0].as(); + parse_request_options(params, options); + } + + return create_request(params); + }, "httppost", "http::post"); + } + }; +} + +REGISTER_COMPONENT(http::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/int64.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/int64.cpp new file mode 100644 index 0000000..dcf21dc --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/int64.cpp @@ -0,0 +1,119 @@ +#include +#include "loader/component_loader.hpp" + +#include "gsc.hpp" + +#include +#include + +#define INT64_OPERATION(expr) \ + [](const std::int64_t a, [[maybe_unused]] const std::int64_t b) \ + { \ + return expr; \ + } \ + +namespace int64 +{ + namespace + { + std::int64_t get_int64_arg(const scripting::variadic_args& args, const size_t index, bool optional) + { + if (optional && index >= static_cast(args.size())) + { + return 0; + } + + if (args[index].is()) + { + return static_cast(args[index].as()); + } + + if (args[index].is()) + { + return std::strtoll(args[index].as(), nullptr, 0); + } + + throw std::runtime_error(std::format("parameter {} does not have type 'string' or 'int'", index)); + } + + std::unordered_map> operations = + { + {"+", INT64_OPERATION(a + b)}, + {"-", INT64_OPERATION(a - b)}, + {"*", INT64_OPERATION(a * b)}, + {"/", INT64_OPERATION(a / b)}, + {"&", INT64_OPERATION(a & b)}, + {"^", INT64_OPERATION(a ^ b)}, + {"|", INT64_OPERATION(a | b)}, + {"~", INT64_OPERATION(~a)}, + {"%", INT64_OPERATION(a % b)}, + {">>", INT64_OPERATION(a >> b)}, + {"<<", INT64_OPERATION(a << b)}, + {"++", INT64_OPERATION(a + 1)}, + {"--", INT64_OPERATION(a - 1)}, + }; + + std::unordered_map> comparisons = + { + {">", INT64_OPERATION(a > b)}, + {">=", INT64_OPERATION(a >= b)}, + {"==", INT64_OPERATION(a == b)}, + {"!=", INT64_OPERATION(a != b)}, + {"<=", INT64_OPERATION(a <= b)}, + {"<", INT64_OPERATION(a < b)}, + }; + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + auto value = get_int64_arg(args, 0, false); + return value <= std::numeric_limits::max() && value >= std::numeric_limits::min(); + }, "int64_is_int", "int64::is_int"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + return static_cast(get_int64_arg(args, 0, false)); + }, "int64_to_int", "int64::to_int"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) -> scripting::script_value + { + auto a = get_int64_arg(args, 0, false); + const auto op = args[1].as(); + auto b = get_int64_arg(args, 2, true); + + if (const auto iter = operations.find(op); iter != operations.end()) + { + return std::to_string(iter->second(a, b)); + } + + if (const auto iter = comparisons.find(op); iter != comparisons.end()) + { + return iter->second(a, b); + } + + throw std::runtime_error("invalid int64 operation"); + }, "int64_op", "int64::op"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + const auto a = get_int64_arg(args, 0, false); + const auto b = get_int64_arg(args, 1, false); + return std::to_string(std::min(a, b)); + }, "int64_min", "int64::min"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + const auto a = get_int64_arg(args, 0, false); + const auto b = get_int64_arg(args, 1, false); + return std::to_string(std::max(a, b)); + }, "int64_max", "int64::max"); + } + }; +} + +REGISTER_COMPONENT(int64::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/io.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/io.cpp new file mode 100644 index 0000000..6e357a5 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/io.cpp @@ -0,0 +1,75 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/structs.hpp" +#include "game/game.hpp" + +#include "gsc.hpp" + +#include + +namespace io +{ + class component final : public component_interface + { + public: + void on_after_dvar_init([[maybe_unused]] plugin::plugin* plugin) override + { + const auto fs_homepath = game::Dvar_FindVar("fs_homepath"); + if (fs_homepath == nullptr) + { + return; + } + + std::filesystem::current_path(fs_homepath->current.string); + printf("working directory: %s", fs_homepath->current.string); + } + + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple([](const std::string& file, const std::string& data, + const scripting::variadic_args& va) + { + auto append = false; + + if (va.size() > 0) + { + append = va[0]; + } + + return utils::io::write_file(file, data, append); + }, "writefile", "io::write_file"); + + gsc::function::add_multiple([](const std::string& file, const std::string& data) + { + return utils::io::write_file(file, data, true); + }, "appendfile", "io::append_file"); + + gsc::function::add_multiple(utils::io::file_exists, "fileexists", "io::file_exists"); + gsc::function::add_multiple(utils::io::move_file, "movefile", "io::move_file"); + gsc::function::add_multiple(utils::io::file_size, "filesize", "io::file_size"); + gsc::function::add_multiple(utils::io::create_directory, "createdirectory", "io::create_directory"); + gsc::function::add_multiple(utils::io::directory_exists, "directoryexists", "io::directory_exists"); + gsc::function::add_multiple(utils::io::directory_is_empty, "directoryisempty", "io::directory_is_empty"); + gsc::function::add_multiple(utils::io::list_files, "listfiles", "io::list_files"); + gsc::function::add_multiple(utils::io::remove_file, "removefile", "io::remove_file"); + + gsc::function::add_multiple([](const std::filesystem::path& src, const scripting::variadic_args& va) + { + bool recursive = false; + if (va.size() > 0) + { + recursive = va[0]; + } + + utils::io::remove_directory(src, recursive); + }, "removedirectory", "io::remove_directory"); + + gsc::function::add_multiple(utils::io::copy_folder, "copyfolder", "io::copy_folder"); + gsc::function::add_multiple(utils::io::copy_folder, "copydirectory", "io::copy_directory"); + gsc::function::add_multiple(static_cast(utils::io::read_file), "readfile", "io::read_file"); + } + }; +} + +REGISTER_COMPONENT(io::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/json.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/json.cpp new file mode 100644 index 0000000..4aceafc --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/json.cpp @@ -0,0 +1,281 @@ +#include +#include "loader/component_loader.hpp" + +#include "scheduler.hpp" + +#include "game/scripting/event.hpp" +#include "game/scripting/execution.hpp" +#include "game/scripting/array.hpp" + +#include "gsc.hpp" +#include "json.hpp" +#include "scripting.hpp" + +#include + +namespace json +{ + namespace + { + std::unordered_set dumped_objects; + + nlohmann::json gsc_to_json(scripting::script_value value, bool print_id); + + nlohmann::json array_to_json(const scripting::array& array, bool print_id) + { + nlohmann::json obj; + + auto string_indexed = -1; + const auto keys = array.get_keys(); + for (auto i = 0u; i < keys.size(); i++) + { + const auto is_int = keys[i].is(); + const auto is_string = keys[i].is(); + + if (string_indexed == -1) + { + string_indexed = is_string; + } + + if (!string_indexed && is_int) + { + const auto index = keys[i].as(); + obj[index] = gsc_to_json(array[index], print_id); + } + else if (string_indexed && is_string) + { + const auto key = keys[i].as(); + obj.emplace(key, gsc_to_json(array[key], print_id)); + } + } + + return obj; + } + + nlohmann::json object_to_json(const scripting::object& object, bool print_id) + { + const auto id = object.get_entity_id(); + if (dumped_objects.find(id) != dumped_objects.end()) + { + return utils::string::va("[struct reference %i]", id); + } + + dumped_objects.insert(id); + nlohmann::json obj; + + if (print_id) + { + obj["__id"] = id; + } + + const auto keys = object.get_keys(); + for (const auto& key : keys) + { + if (key == "__id") + { + continue; + } + + obj.emplace(key, gsc_to_json(object[key], print_id)); + } + + return obj; + } + + nlohmann::json vector_to_array(const float* value) + { + nlohmann::json obj; + obj.push_back(value[0]); + obj.push_back(value[1]); + obj.push_back(value[2]); + + return obj; + } + + nlohmann::json gsc_to_json(scripting::script_value value, bool print_id) + { + const auto& variable = value.get_raw(); + + if (value.is()) + { + return value.as(); + } + + if (value.is()) + { + return value.as(); + } + + if (value.is()) + { + return value.as(); + } + + if (value.is()) + { + return vector_to_array(variable.u.vectorValue); + } + + if (value.is()) + { + return object_to_json(variable.u.uintValue, print_id); + } + + if (value.is()) + { + return array_to_json(variable.u.uintValue, print_id); + } + + if (value.is()) + { + return object_to_json(variable.u.uintValue, print_id); + } + + if (variable.type == game::SCRIPT_NONE) + { + return {}; + } + + if (value.is()) + { + return "[function]"; + } + + if (variable.type == game::SCRIPT_CODEPOS) + { + return "[codepos]"; + } + + if (variable.type == game::SCRIPT_END) + { + return "[precodepos]"; + } + + return utils::string::va("[%s]", value.type_name().data()); + } + + scripting::script_value json_to_gsc(nlohmann::json obj) + { + const auto type = obj.type(); + + switch (type) + { + case (nlohmann::detail::value_t::number_integer): + case (nlohmann::detail::value_t::number_unsigned): + return obj.get(); + case (nlohmann::detail::value_t::number_float): + return obj.get(); + case (nlohmann::detail::value_t::string): + return obj.get(); + case (nlohmann::detail::value_t::array): + { + scripting::array array; + + for (const auto& [key, value] : obj.items()) + { + array.emplace_back(json_to_gsc(value)); + } + + return array.get_raw(); + } + case (nlohmann::detail::value_t::object): + { + scripting::array array; + + for (const auto& [key, value] : obj.items()) + { + array[key] = json_to_gsc(value); + } + + return array.get_raw(); + } + } + + return {}; + } + } + + std::string gsc_to_string(const scripting::script_value& value) + { + dumped_objects = {}; + return gsc_to_json(value, false).dump(); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple([](const scripting::variadic_args& va) + { + scripting::array array; + + for (auto i = 0u; i < va.size(); i += 2) + { + if (i >= va.size() - 1) + { + continue; + } + + const auto key = va[i].as(); + array[key] = va[i + 1]; + } + + return array; + }, "createmap", "json::create_map"); + + gsc::function::add_multiple([](const std::string json) + { + const auto obj = nlohmann::json::parse(json); + return json_to_gsc(obj); + }, "jsonparse", "json::parse"); + + gsc::function::add_multiple([](const scripting::script_value& value, + const scripting::variadic_args& va) + { + auto indent = -1; + auto print_id = false; + + if (va.size() > 0) + { + indent = va[0].as(); + } + + if (va.size() > 1) + { + print_id = va[1].as(); + } + + dumped_objects = {}; + return gsc_to_json(value, print_id).dump(indent).substr(0, 0x5000); + }, "jsonserialize", "json::serialize"); + + gsc::function::add_multiple([](std::string file, const scripting::script_value value, + const scripting::variadic_args& va) + { + auto indent = -1; + auto print_id = false; + + if (!file.ends_with(".json")) + { + file.append(".json"); + } + + if (va.size() > 0) + { + indent = va[0].as(); + } + + if (va.size() > 1) + { + print_id = va[1].as(); + } + + dumped_objects = {}; + return utils::io::write_file(file, gsc_to_json(value, print_id).dump(indent)); + }, "jsondump", "json::dump"); + } + }; +} + +REGISTER_COMPONENT(json::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/json.hpp b/t5/plugins/tws-t5-gsc-utils/src/component/json.hpp new file mode 100644 index 0000000..2c07f88 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/json.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace json +{ + std::string gsc_to_string(const scripting::script_value& _value); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/mysql.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/mysql.cpp new file mode 100644 index 0000000..1648669 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/mysql.cpp @@ -0,0 +1,545 @@ +#include +#include "loader/component_loader.hpp" + +#include "mysql.hpp" +#include "component/gsc.hpp" +#include "component/scheduler.hpp" +#include "component/scripting.hpp" + +#include + +namespace mysql +{ + namespace + { + struct mysql_result_t + { + MYSQL_RES* result; + MYSQL_STMT* stmt; + uint64_t affected_rows; + std::string error; + }; + + struct task_t + { + scripting::object handle; + mysql_result_t result{}; + std::atomic_bool completed; + }; + + std::vector> tasks; + std::array connection_pool; + + scripting::script_value field_to_value(const MYSQL_FIELD* field, const std::string& row) + { + switch (field->type) + { + case enum_field_types::MYSQL_TYPE_INT24: + case enum_field_types::MYSQL_TYPE_LONG: + case enum_field_types::MYSQL_TYPE_SHORT: + return std::atoi(row.data()); + case enum_field_types::MYSQL_TYPE_LONGLONG: + return row; + case enum_field_types::MYSQL_TYPE_FLOAT: + case enum_field_types::MYSQL_TYPE_DOUBLE: + return static_cast(std::atof(row.data())); + } + + return row; + } + + scripting::script_value bind_to_value(const MYSQL_BIND* bind) + { + switch (bind->buffer_type) + { + case enum_field_types::MYSQL_TYPE_INT24: + case enum_field_types::MYSQL_TYPE_LONG: + case enum_field_types::MYSQL_TYPE_SHORT: + return *reinterpret_cast(bind->buffer); + case enum_field_types::MYSQL_TYPE_LONGLONG: + return std::to_string(*reinterpret_cast(bind->buffer)); + case enum_field_types::MYSQL_TYPE_FLOAT: + return *reinterpret_cast(bind->buffer); + case enum_field_types::MYSQL_TYPE_DOUBLE: + return static_cast(*reinterpret_cast(bind->buffer)); + case enum_field_types::MYSQL_TYPE_STRING: + return std::string{reinterpret_cast(bind->buffer), bind->buffer_length}; + } + + return {}; + } + + scripting::array generate_result(MYSQL_STMT* stmt) + { + if (stmt == nullptr) + { + return {}; + } + + utils::memory::allocator allocator; + + scripting::array result_arr; + + const auto meta = mysql_stmt_result_metadata(stmt); + if (meta == nullptr) + { + return {}; + } + + const auto column_count = mysql_num_fields(meta); + const auto fields = mysql_fetch_fields(meta); + + const auto is_null = allocator.allocate_array(column_count); + const auto errors = allocator.allocate_array(column_count); + const auto real_lengths = allocator.allocate_array(column_count); + const auto binds = allocator.allocate_array(column_count); + + for (auto i = 0u; i < column_count; i++) + { + binds[i].length = &real_lengths[i]; + binds[i].is_null = &is_null[i]; + binds[i].error = &errors[i]; + } + + if (mysql_stmt_bind_result(stmt, binds) != 0 || + mysql_stmt_store_result(stmt) != 0) + { + return {}; + } + + while (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA) + { + for (auto i = 0u; i < column_count; i++) + { + switch (fields[i].type) + { + case enum_field_types::MYSQL_TYPE_INT24: + case enum_field_types::MYSQL_TYPE_LONG: + case enum_field_types::MYSQL_TYPE_SHORT: + { + binds[i].buffer_type = MYSQL_TYPE_LONG; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(int); + break; + }; + case enum_field_types::MYSQL_TYPE_LONGLONG: + { + binds[i].buffer_type = MYSQL_TYPE_LONGLONG; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(std::int64_t); + break; + }; + case enum_field_types::MYSQL_TYPE_FLOAT: + binds[i].buffer_type = MYSQL_TYPE_FLOAT; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(float); + break; + case enum_field_types::MYSQL_TYPE_DOUBLE: + { + binds[i].buffer_type = MYSQL_TYPE_DOUBLE; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(double); + break; + } + default: + binds[i].buffer_type = MYSQL_TYPE_STRING; + binds[i].buffer = allocator.allocate_array(real_lengths[i]); + binds[i].buffer_length = real_lengths[i]; + break; + } + + mysql_stmt_fetch_column(stmt, &binds[i], i, 0); + } + + scripting::array row_arr; + + for (auto i = 0u; i < column_count; i++) + { + const auto field = &fields[i]; + const std::string field_name = {field->name, field->name_length}; + row_arr[field_name] = bind_to_value(&binds[i]); + } + + result_arr.emplace_back(row_arr); + } + + mysql_free_result(meta); + + return result_arr; + } + + scripting::array generate_result(MYSQL_RES* result) + { + if (result == nullptr) + { + return {}; + } + + scripting::array result_arr; + + const auto num_rows = mysql_num_rows(result); + const auto num_fields = mysql_num_fields(result); + const auto fields = mysql_fetch_fields(result); + + for (auto i = 0u; i < num_rows; i++) + { + scripting::array row_arr; + + const auto row = mysql_fetch_row(result); + const auto lengths = mysql_fetch_lengths(result); + + for (auto f = 0u; f < num_fields; f++) + { + const auto field = &fields[f]; + + const std::string field_str = {field->name, field->name_length}; + const std::string row_str = {row[f], lengths[f]}; + const auto value = field_to_value(field, row_str); + + row_arr[field_str] = value; + } + + result_arr.emplace_back(row_arr); + } + + return result_arr; + } + + template + scripting::object create_mysql_query(F&& cb) + { + auto task = std::make_shared(); + tasks.emplace_back(task); + + scheduler::thread_pool.push([=] + { + try + { + mysql::access([&](database_t& db) + { + task->result = cb(db); + task->completed = true; + }); + } + catch (const std::exception& e) + { + printf("^1MySQL ERROR: %s\n", e.what()); + task->completed = true; + } + }); + + return task->handle; + } + + void wait_and_clear_tasks() + { + for (auto& task : tasks) + { + while (!task->completed) + { + std::this_thread::sleep_for(10ms); + } + } + + tasks.clear(); + } + + void notify_task_result(std::shared_ptr& task) + { + const auto result = task->result.result + ? generate_result(task->result.result) + : generate_result(task->result.stmt); + + const auto rows = static_cast(task->result.affected_rows); + scripting::notify(task->handle.get_entity_id(), "done", {result, rows, task->result.error}); + + if (task->result.result != nullptr) + { + mysql_free_result(task->result.result); + task->result.result = nullptr; + } + + if (task->result.stmt != nullptr) + { + mysql_stmt_close(task->result.stmt); + task->result.stmt = nullptr; + } + } + + void check_tasks() + { + for (auto i = tasks.begin(); i != tasks.end(); ) + { + auto& task = *i; + if (!task->completed) + { + ++i; + continue; + } + else + { + notify_task_result(task); + i = tasks.erase(i); + } + } + } + + template + MYSQL_BIND* bind_statement_args(const T& args, std::size_t& bind_count) + { + bind_count = args.size(); + const auto binds = utils::memory::allocate_array(bind_count); + + for (auto i = 0u; i < args.size(); i++) + { + const auto& arg = args[i]; + const auto& raw_value = arg.get_raw(); + + switch (raw_value.type) + { + case game::SCRIPT_FLOAT: + { + binds[i].buffer = utils::memory::allocate(); + binds[i].buffer_type = MYSQL_TYPE_FLOAT; + *reinterpret_cast(binds[i].buffer) = raw_value.u.floatValue; + break; + } + case game::SCRIPT_INTEGER: + { + binds[i].buffer = utils::memory::allocate(); + binds[i].buffer_type = MYSQL_TYPE_LONG; + *reinterpret_cast(binds[i].buffer) = raw_value.u.intValue; + break; + } + case game::SCRIPT_STRING: + { + const auto str = arg.as(); + const auto str_copy = utils::memory::duplicate_string(str); + binds[i].buffer = str_copy; + binds[i].buffer_length = str.size(); + binds[i].buffer_type = MYSQL_TYPE_STRING; + break; + } + default: + { + binds[i].buffer_type = MYSQL_TYPE_NULL; + break; + } + } + } + + return binds; + } + + void cleanup_connections() + { + for (auto& connection : connection_pool) + { + connection.cleanup(); + } + } + + void free_statement_binds(MYSQL_BIND* binds, const std::size_t bind_count) + { + if (binds == nullptr) + { + return; + } + + for (auto i = 0u; i < bind_count; i++) + { + utils::memory::free(binds[i].buffer); + } + + utils::memory::free(binds); + } + } + + utils::concurrency::container& get_config() + { + static utils::concurrency::container config; + static auto initialized = false; + + if (!initialized) + { + config.access([&](sql::connection_config& cfg) + { + cfg.user = "root"; + cfg.password = "root"; + cfg.host = "localhost"; + cfg.port = 3306; + cfg.database = "default"; + }); + + initialized = true; + } + return config; + } + + void connection::check() + { + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - this->start_; + + if (this->db.get() == nullptr || !this->db->ping_server() || diff >= connection_timeout) + { + get_config().access([&](sql::connection_config& cfg) + { + this->db = std::make_unique(cfg); + this->start_ = now; + }); + } + + this->last_access_ = now; + } + + void connection::cleanup() + { + std::unique_lock lock(this->mutex, std::try_to_lock); + if (!lock.owns_lock()) + { + return; + } + + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - this->last_access_; + if (diff >= connection_timeout) + { + this->db.reset(); + } + } + + connection* get_connection(std::unique_lock& lock) + { + static thread_local connection* last_connection{}; + if (last_connection != nullptr) + { + lock = std::unique_lock(last_connection->mutex, std::try_to_lock); + if (lock.owns_lock()) + { + return last_connection; + } + } + + for (auto i = 0u; i < connection_pool.size(); i++) + { + auto connection = &connection_pool[i]; + if (connection == last_connection) + { + continue; + } + + lock = std::unique_lock(connection->mutex, std::try_to_lock); + if (!lock.owns_lock()) + { + continue; + } + + last_connection = connection; + return connection; + } + + return nullptr; + } + + class component final : public component_interface + { + public: + void on_shutdown([[maybe_unused]] plugin::plugin* plugin) override + { + wait_and_clear_tasks(); + } + + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown(wait_and_clear_tasks); + scheduler::loop(cleanup_connections, scheduler::async, 60s); + scheduler::loop(check_tasks, scheduler::server); + + gsc::function::add("mysql::set_config", [](const scripting::object& config) + { + get_config().access([&](sql::connection_config& cfg) + { + cfg.host = config["host"].as(); + cfg.user = config["user"].as(); + cfg.password = config["password"].as(); + cfg.port = config["port"].as(); + cfg.database = config["database"].as(); + }); + }); + + gsc::function::add_multiple([](const std::string& query) + { + return create_mysql_query([=](database_t& db) + { + const auto handle = db->get_handle(); + + mysql_result_t result{}; + if (mysql_query(handle, query.data()) != 0) + { + result.error = mysql_error(handle); + return result; + } + + result.result = mysql_store_result(handle); + result.affected_rows = mysql_affected_rows(handle); + + return result; + }); + }, "mysql::query", "mysql::execute"); + + gsc::function::add("mysql::prepared_statement", [](const std::string& query, const scripting::variadic_args& values) + { + MYSQL_BIND* binds = nullptr; + auto bind_count = 0u; + + try + { + if (values.size() > 0 && values[0].is()) + { + binds = bind_statement_args(values[0].as(), bind_count); + } + else + { + binds = bind_statement_args(values, bind_count); + } + + const auto handle = create_mysql_query([binds, bind_count, query](database_t& db) + { + const auto _0 = gsl::finally([=] + { + free_statement_binds(binds, bind_count); + }); + + mysql_result_t result{}; + + const auto handle = db->get_handle(); + const auto stmt = mysql_stmt_init(handle); + + if (mysql_stmt_prepare(stmt, query.data(), query.size()) != 0 || + (binds != nullptr && mysql_stmt_bind_param(stmt, binds) != 0) || + mysql_stmt_execute(stmt) != 0) + { + result.error = mysql_stmt_error(stmt); + return result; + } + + result.stmt = stmt; + result.affected_rows = mysql_stmt_affected_rows(stmt); + + return result; + }); + + return handle; + } + catch (const std::exception& e) + { + free_statement_binds(binds, bind_count); + throw e; + } + }); + } + }; +} + +REGISTER_COMPONENT(mysql::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/mysql.hpp b/t5/plugins/tws-t5-gsc-utils/src/component/mysql.hpp new file mode 100644 index 0000000..bd88662 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/mysql.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include + +#pragma warning(push) +#pragma warning(disable: 4127) +#pragma warning(disable: 4267) +#pragma warning(disable: 4018) +#pragma warning(disable: 4996) +#pragma warning(disable: 4244) +#include +#include +#pragma warning(pop) + +namespace sql = sqlpp::mysql; + +namespace mysql +{ + constexpr auto max_connections = 100; + constexpr auto connection_timeout = 200s; + + using database_mutex_t = std::recursive_mutex; + using database_t = std::unique_ptr; + + utils::concurrency::container& get_config(); + + class connection + { + public: + connection() = default; + void check(); + void cleanup(); + + database_t db; + database_mutex_t mutex; + + private: + std::chrono::high_resolution_clock::time_point start_; + std::chrono::high_resolution_clock::time_point last_access_; + + }; + + connection* get_connection(std::unique_lock& lock); + + template + T access(F&& accessor) + { + std::unique_lock lock; + auto conn = get_connection(lock); + if (conn == nullptr) + { + throw std::runtime_error("out of connections"); + } + + conn->check(); + return accessor(conn->db); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/scheduler.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/scheduler.cpp new file mode 100644 index 0000000..2d85400 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/scheduler.cpp @@ -0,0 +1,175 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "scheduler.hpp" + +#include +#include + +namespace scheduler +{ + utils::thread_pool thread_pool; + + namespace + { + utils::hook::detour server_frame_hook; + bool kill_thread = false; + + struct task + { + std::function handler{}; + std::chrono::milliseconds interval{}; + std::chrono::high_resolution_clock::time_point last_call{}; + }; + + using task_list = std::vector; + + class task_pipeline + { + public: + void add(task&& task) + { + new_callbacks_.access([&task](task_list& tasks) + { + tasks.emplace_back(std::move(task)); + }); + } + + void execute() + { + callbacks_.access([&](task_list& tasks) + { + this->merge_callbacks(); + + for (auto i = tasks.begin(); i != tasks.end();) + { + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - i->last_call; + + if (diff < i->interval) + { + ++i; + continue; + } + + i->last_call = now; + + const auto res = i->handler(); + if (res == cond_end) + { + i = tasks.erase(i); + } + else + { + ++i; + } + } + }); + } + + private: + utils::concurrency::container new_callbacks_; + utils::concurrency::container callbacks_; + + void merge_callbacks() + { + callbacks_.access([&](task_list& tasks) + { + new_callbacks_.access([&](task_list& new_tasks) + { + tasks.insert(tasks.end(), std::move_iterator(new_tasks.begin()), std::move_iterator(new_tasks.end())); + new_tasks = {}; + }); + }); + } + }; + + std::thread thread; + task_pipeline pipelines[pipeline::count]; + + void execute(const pipeline type) + { + assert(type >= 0 && type < pipeline::count); + pipelines[type].execute(); + } + + void execute_server() + { + execute(pipeline::server); + } + + void server_frame_stub() + { + execute(pipeline::server); + server_frame_hook.invoke(); + } + } + + void schedule(const std::function& callback, const pipeline type, + const std::chrono::milliseconds delay) + { + assert(type >= 0 && type < pipeline::count); + + task task; + task.handler = callback; + task.interval = delay; + task.last_call = std::chrono::high_resolution_clock::now(); + + pipelines[type].add(std::move(task)); + } + + void loop(const std::function& callback, const pipeline type, + const std::chrono::milliseconds delay) + { + schedule([callback]() + { + callback(); + return cond_continue; + }, type, delay); + } + + void once(const std::function& callback, const pipeline type, + const std::chrono::milliseconds delay) + { + schedule([callback]() + { + callback(); + return cond_end; + }, type, delay); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + thread_pool.initialize(8); + thread_pool.start(); + + thread = std::thread([]() + { + while (!kill_thread) + { + execute(pipeline::async); + std::this_thread::sleep_for(10ms); + } + }); + + server_frame_hook.create(SELECT_VALUE(0x43E340, 0x46B680), server_frame_stub); + } + + void on_shutdown([[maybe_unused]] plugin::plugin* plugin) override + { + thread_pool.stop(); + kill_thread = true; + + if (thread.joinable()) + { + thread.join(); + } + } + }; +} + +REGISTER_COMPONENT(scheduler::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/scheduler.hpp b/t5/plugins/tws-t5-gsc-utils/src/component/scheduler.hpp new file mode 100644 index 0000000..46ccef1 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/scheduler.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace scheduler +{ + enum pipeline + { + server, + async, + count, + }; + + static const bool cond_continue = false; + static const bool cond_end = true; + + void schedule(const std::function& callback, pipeline type = pipeline::server, + std::chrono::milliseconds delay = 0ms); + void loop(const std::function& callback, pipeline type = pipeline::server, + std::chrono::milliseconds delay = 0ms); + void once(const std::function& callback, pipeline type = pipeline::server, + std::chrono::milliseconds delay = 0ms); + + extern utils::thread_pool thread_pool; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/scripting.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/scripting.cpp new file mode 100644 index 0000000..3c133bd --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/scripting.cpp @@ -0,0 +1,78 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "game/scripting/event.hpp" +#include "game/scripting/execution.hpp" + +#include "scripting.hpp" +#include "scheduler.hpp" + +#include +#include + +namespace scripting +{ + std::unordered_map> fields_table; + + std::unordered_map method_map; + std::unordered_map function_map; + + std::unordered_map> script_function_table; + std::unordered_map>> script_function_table_sort; + std::unordered_map> script_function_table_rev; + + std::unordered_map canonical_string_table; + + namespace + { + utils::hook::detour g_shutdown_game_hook; + utils::hook::detour sl_get_canonical_string_hook; + + std::vector> shutdown_callbacks; + void g_shutdown_game_stub(const int free_scripts) + { + if (free_scripts) + { + canonical_string_table.clear(); + } + + for (const auto& callback : shutdown_callbacks) + { + callback(); + } + + return g_shutdown_game_hook.invoke(free_scripts); + } + + unsigned int sl_transfer_canonical_string_stub(game::scriptInstance_t inst, unsigned int string_value) + { + const auto result = sl_get_canonical_string_hook.invoke(inst, string_value); + const auto str = game::SL_ConvertToString(string_value, inst); + if (str) + { + canonical_string_table[result] = game::SL_ConvertToString(string_value, inst); + } + + return result; + } + } + + void on_shutdown(const std::function& callback) + { + shutdown_callbacks.push_back(callback); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + g_shutdown_game_hook.create(SELECT_VALUE(0x607700, 0x540950), g_shutdown_game_stub); + sl_get_canonical_string_hook.create(SELECT_VALUE(0x5F3F40, 0x622530), sl_transfer_canonical_string_stub); + } + }; +} + +REGISTER_COMPONENT(scripting::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/scripting.hpp b/t5/plugins/tws-t5-gsc-utils/src/component/scripting.hpp new file mode 100644 index 0000000..57d3868 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/scripting.hpp @@ -0,0 +1,19 @@ +#pragma once + +namespace scripting +{ + extern std::unordered_map> fields_table; + + extern std::unordered_map> script_function_table; + extern std::unordered_map>> script_function_table_sort; + extern std::unordered_map> script_function_table_rev; + + extern std::unordered_map method_map; + extern std::unordered_map function_map; + + extern std::unordered_map canonical_string_table; + + using script_function = void(*)(game::scr_entref_t); + + void on_shutdown(const std::function& callback); +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/string.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/string.cpp new file mode 100644 index 0000000..16dc912 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/string.cpp @@ -0,0 +1,218 @@ +#include +#include "loader/component_loader.hpp" + +#include "gsc.hpp" + +// lua/lstrlib.c +#define MAX_FORMAT 32 +#define L_FMTFLAGSF "-+#0 " +#define L_FMTFLAGSX "-#0" +#define L_FMTFLAGSI "-+0 " +#define L_FMTFLAGSU "-0" +#define L_FMTFLAGSC "-" + +namespace string +{ + namespace + { + // lua/lstrlib.c + const char* getformat(const char* strfrmt, char* form) + { + const auto len = std::strspn(strfrmt, L_FMTFLAGSF "123456789.") + 1; + if (len >= MAX_FORMAT - 10) + { + throw std::runtime_error("invalid format (too long)"); + } + + *(form++) = '%'; + std::memcpy(form, strfrmt, len * sizeof(char)); + *(form + len) = '\0'; + return strfrmt + len - 1; + } + + // lua/lstrlib.c + const char* get_2_digits(const char* s) + { + if (isdigit(static_cast(*s))) + { + s++; + if (isdigit(static_cast(*s))) + { + s++; + } + } + + return s; + } + + // lua/lstrlib.c + void check_format(const char* form, const char* flags, int precision) + { + const char* spec = form + 1; + spec += std::strspn(spec, flags); + if (*spec != '0') + { + spec = get_2_digits(spec); + if (*spec == '.' && precision) + { + spec++; + spec = get_2_digits(spec); + } + } + if (!std::isalpha(static_cast(*spec))) + { + throw std::runtime_error(utils::string::va("invalid conversion specification: '%s'", form)); + } + } + + // partially lua/lstrlib.c + std::string format_string(const std::string& fmt, const scripting::variadic_args& va) + { + std::string buffer{}; + size_t va_index{}; + const char* strfrmt = fmt.data(); + const char* strfrmt_end = strfrmt + fmt.size(); + + while (strfrmt < strfrmt_end) + { + if (*strfrmt != '%') + { + buffer.push_back(*strfrmt++); + } + else if (*++strfrmt == '%') + { + buffer.push_back(*strfrmt++); + } + else + { + char form[MAX_FORMAT]{}; + const char* flags = ""; + strfrmt = getformat(strfrmt, form); + + switch (*strfrmt++) + { + case 'd': + case 'i': + flags = L_FMTFLAGSI; + goto intcase; + case 'u': + case 'p': + flags = L_FMTFLAGSU; + goto intcase; + case 'o': + case 'x': + case 'X': + flags = L_FMTFLAGSX; + intcase: + { + check_format(form, flags, 1); + const auto value = va[va_index].as(); + buffer.append(utils::string::va(form, value)); + va_index++; + break; + } + case 'f': + case 'F': + case 'e': + case 'E': + case 'g': + case 'G': + { + check_format(form, L_FMTFLAGSF, 1); + const auto value = va[va_index].as(); + buffer.append(utils::string::va(form, value)); + va_index++; + break; + } + case 'c': + { + const auto value = va[va_index].as(); + check_format(form, L_FMTFLAGSC, 0); + buffer.append(utils::string::va(form, static_cast(value))); + va_index++; + break; + } + case 's': + { + const auto str = va[va_index].as(); + buffer.append(str); + va_index++; + break; + } + default: + { + throw std::runtime_error(utils::string::va("invalid conversion '%s' to 'format'", form)); + } + } + } + } + + return buffer; + } + } + + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple(format_string, "va", "string::va", + "formatstring", "string::format", "sprintf"); + + gsc::function::add("printf", [](const std::string& fmt, const scripting::variadic_args& va) + { + printf("%s", format_string(fmt, va).data()); + }); + + gsc::function::add("print", [](const scripting::variadic_args& va) + { + std::string buffer{}; + + for (const auto& arg : va) + { + buffer.append(utils::string::va("%s\t", arg.to_string().data())); + } + + printf("%s\n", buffer.data()); + }); + + gsc::function::add_multiple(utils::string::to_upper, "toupper", "string::to_upper"); + gsc::function::add_multiple(utils::string::to_lower, "tolower", "string::to_lower"); + + gsc::function::add("string::is_numeric", utils::string::is_numeric); + gsc::function::add("string::starts_with", utils::string::starts_with); + gsc::function::add("string::ends_with", utils::string::ends_with); + gsc::function::add("string::replace", utils::string::replace); + + gsc::function::add("string::regex_replace", [](const std::string& str, const std::regex& expr, + const std::string& with) + { + return std::regex_replace(str, expr, with); + }); + + gsc::function::add("string::regex_match", [](const std::string& str, const std::regex& expr) + { + scripting::array array_match{}; + std::smatch match{}; + + if (std::regex_match(str, match, std::regex(expr))) + { + for (const auto& s : match) + { + array_match.emplace_back((s.str())); + } + } + + return array_match; + }); + + gsc::function::add("string::regex_search", [](const std::string& str, const std::regex& expr) + { + return std::regex_search(str, expr); + }); + } + }; +} + +REGISTER_COMPONENT(string::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/component/user_info.cpp b/t5/plugins/tws-t5-gsc-utils/src/component/user_info.cpp new file mode 100644 index 0000000..bc78896 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/component/user_info.cpp @@ -0,0 +1,136 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "gsc.hpp" + +#include +#include + +namespace user_info +{ + namespace + { + using user_info_map = std::unordered_map; + std::array user_info_overrides; + + utils::hook::detour scr_shutdown_system_hook; + + void clear_client_overrides(unsigned int client_num) + { + user_info_overrides[client_num].clear(); + } + + void clear_all_overrides() + { + for (auto& entry : user_info_overrides) + { + entry.clear(); + } + } + + void scr_shutdown_system_stub(const game::scriptInstance_t inst, const unsigned char sys, const int b_complete) + { + clear_all_overrides(); + scr_shutdown_system_hook.invoke(inst, sys, b_complete); + } + + void sv_get_user_info_stub(const int index, char* buffer, const int buffer_size) + { + game::SV_GetUserinfo(index, buffer, buffer_size); + + utils::info_string map(buffer); + + for (const auto& [key, val] : user_info_overrides[index]) + { + if (val.empty()) + { + map.remove(key); + } + else + { + map.set(key, val); + } + } + + const auto user_info = map.build(); + strncpy_s(buffer, buffer_size, user_info.data(), _TRUNCATE); + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + utils::hook::call(SELECT_VALUE(0x5D38EB, 0x4A75E2), sv_get_user_info_stub); + utils::hook::call(SELECT_VALUE(0x67FFE9, 0x548DB0), sv_get_user_info_stub); + + plugin->get_interface()->callbacks()->on_player_connect(clear_client_overrides); + plugin->get_interface()->callbacks()->on_player_disconnect(clear_client_overrides); + + scr_shutdown_system_hook.create(SELECT_VALUE(0x596D40, 0x540780), scr_shutdown_system_stub); + + gsc::method::add_multiple([](const scripting::entity& player, const std::string& name) -> void + { + const auto entref = player.get_entity_reference(); + if (entref.classnum) + { + throw std::runtime_error("Not a player entity"); + } + + if (name.empty()) + { + throw std::runtime_error("set_name: Illegal parameter!"); + } + + user_info_overrides[entref.entnum]["name"] = name; + game::ClientUserinfoChanged(entref.entnum); + }, "user_info::set_name", "set_name"); + + gsc::method::add_multiple([](const scripting::entity& player) -> void + { + const auto entref = player.get_entity_reference(); + if (entref.classnum) + { + throw std::runtime_error("Not a player entity"); + } + + user_info_overrides[entref.entnum].erase("name"); + game::ClientUserinfoChanged(entref.entnum); + }, "user_info::reset_name", "reset_name"); + + gsc::method::add_multiple([](const scripting::entity& player, const std::string& tag) -> void + { + const auto entref = player.get_entity_reference(); + if (entref.classnum) + { + throw std::runtime_error("Not a player entity"); + } + + if (tag.empty()) + { + throw std::runtime_error("set_clantag: Illegal parameter!"); + } + + user_info_overrides[entref.entnum]["clanAbbrev"] = tag; + game::ClientUserinfoChanged(entref.entnum); + }, "user_info::set_clantag", "set_clantag"); + + gsc::method::add_multiple([](const scripting::entity& player) -> void + { + const auto entref = player.get_entity_reference(); + if (entref.classnum) + { + throw std::runtime_error("Not a player entity"); + } + + user_info_overrides[entref.entnum].erase("clanAbbrev"); + game::ClientUserinfoChanged(entref.entnum); + }, "user_info::reset_clantag", "reset_clantag"); + } + }; +} + +REGISTER_COMPONENT(user_info::component) diff --git a/t5/plugins/tws-t5-gsc-utils/src/dllmain.cpp b/t5/plugins/tws-t5-gsc-utils/src/dllmain.cpp new file mode 100644 index 0000000..6906b91 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/dllmain.cpp @@ -0,0 +1,78 @@ +#include +#include "loader/component_loader.hpp" + +#include "plugin.hpp" + +#include "game/game.hpp" + +#include +#include +#include +#include +#include + +namespace +{ + utils::hook::detour load_library_hook; + + std::string extract_resource(const std::string& name, const int resource) + { + const auto data = utils::nt::load_resource(resource); + const auto path = std::filesystem::current_path() / "tmp" / name; + const auto path_str = path.generic_string(); + + if (!utils::io::write_file(path_str, data)) + { + const auto current = utils::io::read_file(path_str); + const auto hash_current = utils::cryptography::md5::compute(current); + const auto hash_target = utils::cryptography::md5::compute(data); + if (hash_target != hash_current) + { + throw std::runtime_error("failed to extract libmysql.dll!"); + } + } + + return path_str; + } + + HMODULE __stdcall load_library_stub(LPCSTR lib_name, HANDLE file, DWORD flags) + { + if (lib_name == "libmysql.dll"s) + { + const auto path = extract_resource(lib_name, LIBMYSQL_DLL); + const auto handle = load_library_hook.invoke_pascal(path.data(), file, flags); + + if (handle != nullptr) + { + return handle; + } + else + { + throw std::runtime_error(std::format("failed to load libmysql.dll: {}", GetLastError())); + } + } + + return load_library_hook.invoke_pascal(lib_name, file, flags); + } +} + +PLUTONIUM_API plutonium::sdk::plugin* PLUTONIUM_CALLBACK on_initialize() +{ + return plugin::get(); +} + +BOOL APIENTRY DllMain(HMODULE module, DWORD ul_reason_for_call, LPVOID /*reserved*/) +{ + if (ul_reason_for_call == DLL_PROCESS_ATTACH) + { + utils::nt::library::set_current_handle(module); + load_library_hook.create(LoadLibraryExA, load_library_stub); + } + + if (ul_reason_for_call == DLL_PROCESS_DETACH) + { + component_loader::on_shutdown(); + } + + return TRUE; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/exception/minidump.cpp b/t5/plugins/tws-t5-gsc-utils/src/exception/minidump.cpp new file mode 100644 index 0000000..9160d96 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/exception/minidump.cpp @@ -0,0 +1,94 @@ +#include +#include "minidump.hpp" + +#include +#pragma comment(lib, "dbghelp.lib") + +#include + +namespace exception +{ + namespace + { + constexpr MINIDUMP_TYPE get_minidump_type() + { + const auto type = MiniDumpIgnoreInaccessibleMemory // + | MiniDumpWithHandleData // + | MiniDumpScanMemory // + | MiniDumpWithProcessThreadData // + | MiniDumpWithFullMemoryInfo // + | MiniDumpWithThreadInfo // + | MiniDumpWithUnloadedModules; + + return static_cast(type); + } + + std::string get_temp_filename() + { + char filename[MAX_PATH] = {0}; + char pathname[MAX_PATH] = {0}; + + GetTempPathA(sizeof(pathname), pathname); + GetTempFileNameA(pathname, "Plutonium T6 -", 0, filename); + return filename; + } + + HANDLE write_dump_to_temp_file(const LPEXCEPTION_POINTERS exceptioninfo) + { + MINIDUMP_EXCEPTION_INFORMATION minidump_exception_info = {GetCurrentThreadId(), exceptioninfo, FALSE}; + + auto* const file_handle = CreateFileA(get_temp_filename().data(), GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_ALWAYS, + FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, + nullptr); + + if (!MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file_handle, get_minidump_type(), + &minidump_exception_info, + nullptr, + nullptr)) + { + MessageBoxA(nullptr, "There was an error creating the minidump! Hit OK to close the program.", + "Minidump Error", MB_OK | MB_ICONERROR); + TerminateProcess(GetCurrentProcess(), 123); + } + + return file_handle; + } + + std::string read_file(HANDLE file_handle) + { + FlushFileBuffers(file_handle); + SetFilePointer(file_handle, 0, nullptr, FILE_BEGIN); + + std::string buffer{}; + + DWORD bytes_read = 0; + char temp_bytes[0x2000]; + + do + { + if (!ReadFile(file_handle, temp_bytes, sizeof(temp_bytes), &bytes_read, nullptr)) + { + return {}; + } + + buffer.append(temp_bytes, bytes_read); + } + while (bytes_read == sizeof(temp_bytes)); + + return buffer; + } + } + + std::string create_minidump(const LPEXCEPTION_POINTERS exceptioninfo) + { + auto* const file_handle = write_dump_to_temp_file(exceptioninfo); + + const auto _ = gsl::finally([file_handle]() + { + CloseHandle(file_handle); + }); + + return read_file(file_handle); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/exception/minidump.hpp b/t5/plugins/tws-t5-gsc-utils/src/exception/minidump.hpp new file mode 100644 index 0000000..9378639 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/exception/minidump.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace exception +{ + std::string create_minidump(LPEXCEPTION_POINTERS exceptioninfo); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/game.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/game.cpp new file mode 100644 index 0000000..aab471a --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/game.cpp @@ -0,0 +1,123 @@ +#include +#include "game.hpp" + +#include + +namespace game +{ + gamemode current = *reinterpret_cast(0x401337) == 0x281488C0 + ? gamemode::multiplayer + : gamemode::singleplayer; + + namespace environment + { + bool is_mp() + { + return current == gamemode::multiplayer; + } + + bool is_sp() + { + return current == gamemode::singleplayer; + } + } + + void SV_GetServerinfo(char* buffer, int bufferSize) + { + if (bufferSize < 1) + { + Com_Error(ERR_DROP, "\x15SV_GetServerinfo: bufferSize == %i", bufferSize); + } + + I_strncpyz(buffer, Dvar_InfoString(0, 4), bufferSize); + } + + void AddRefToValue(scriptInstance_t inst, const VariableValue* value) + { + AddRefToValue_(inst, value->type, value->u); + } + + void RemoveRefToValue(scriptInstance_t inst, const int type, VariableUnion value) + { + if (game::environment::is_mp()) + { + mp::RemoveRefToValue(inst, type, value); + } + else + { + game::VariableValue var{}; + var.type = type; + var.u = value; + + sp::RemoveRefToValue(inst, &var); + } + } + + unsigned int GetObjectType(scriptInstance_t, unsigned int id) + { + if (game::environment::is_sp()) + { + return game::scr_VarGlob->variableList_sp[id + 1].w.type & 0x1F; + } + else + { + return game::scr_VarGlob->variableList_mp[id + 1].w.type & 0x1F; + } + } + + unsigned int AllocVariable(scriptInstance_t inst) + { + static const auto func = utils::hook::assemble([](utils::hook::assembler& a) + { + a.mov(eax, 0); + a.call(SELECT_VALUE(0, 0x8E49A0)); + a.ret(); + }); + + return utils::hook::invoke(func, inst); + } + + void Scr_NotifyId(scriptInstance_t inst, int /*client_num*/, unsigned int id, + unsigned int string_value, unsigned int paramcount) + { + game::Scr_NotifyNum_Internal(inst, -1, id, 0, string_value, paramcount); + } + + VariableValue Scr_GetArrayIndexValue(scriptInstance_t, unsigned int name) + { + VariableValue value{}; + + if (name >= 0x10000) + { + if (name >= 0x17FFE) + { + value.type = 6; + value.u.intValue = name - 0x800000; + } + else + { + value.type = 1; + value.u.intValue = name - 0x10000; + } + } + else + { + value.type = 2; + value.u.intValue = name; + } + + return value; + } + + unsigned int Scr_GetSelf(scriptInstance_t, unsigned int threadId) + { + if (game::environment::is_sp()) + { + return game::scr_VarGlob->variableList_sp[threadId + 1].u.o.size; + } + else + { + return game::scr_VarGlob->variableList_mp[threadId + 1].u.o.u.self; + } + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/game.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/game.hpp new file mode 100644 index 0000000..a25a180 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/game.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "structs.hpp" + +#define SELECT_VALUE(sp, mp) (game::environment::is_sp() ? (sp) : (mp)) + +namespace game +{ + enum gamemode + { + none, + multiplayer, + singleplayer + }; + + extern gamemode current; + + namespace environment + { + bool is_mp(); + bool is_sp(); + } + + template + class symbol + { + public: + symbol(const size_t sp_address, const size_t mp_address) + : sp_object_(reinterpret_cast(sp_address)) + , mp_object_(reinterpret_cast(mp_address)) + { + } + + T* get() const + { + if (environment::is_mp()) + { + return mp_object_; + } + + return sp_object_; + } + + operator T* () const + { + return this->get(); + } + + T* operator->() const + { + return this->get(); + } + + private: + T* sp_object_; + T* mp_object_; + }; + + void SV_GetServerinfo(char* buffer, int bufferSize); + + void AddRefToValue(scriptInstance_t inst, const VariableValue* value); + void RemoveRefToValue(scriptInstance_t inst, const int type, VariableUnion value); + + unsigned int GetObjectType(scriptInstance_t, unsigned int id); + + unsigned int AllocVariable(scriptInstance_t inst); + + VariableValue Scr_GetArrayIndexValue(scriptInstance_t inst, unsigned int name); + unsigned int Scr_GetSelf(scriptInstance_t inst, unsigned int threadId); + + void Scr_NotifyId(scriptInstance_t inst, int client_num, unsigned int id, + unsigned int string_value, unsigned int paramcount); +} + +#include "symbols.hpp" diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.cpp new file mode 100644 index 0000000..d076c6b --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.cpp @@ -0,0 +1,418 @@ +#include +#include "array.hpp" +#include "execution.hpp" + +namespace scripting +{ + namespace + { + std::vector get_keys_sp(unsigned int id) + { + std::vector result; + + auto current = game::scr_VarGlob->variableList_sp[id + 1].nextSibling; + + while (current) + { + const auto var = &game::scr_VarGlob->variableList_sp[current + 0x6000]; + const auto key_value = game::Scr_GetArrayIndexValue(game::SCRIPTINSTANCE_SERVER, var->w.status >> 8); + result.push_back(key_value); + + const auto next_sibling = game::scr_VarGlob->variableList_sp[current + 0x6000].nextSibling; + if (!next_sibling) + { + break; + } + + current = static_cast(game::scr_VarGlob->variableList_sp[next_sibling + 0x6000].id); + } + + return result; + } + + std::vector get_keys_mp(unsigned int id) + { + std::vector result; + + auto current = game::scr_VarGlob->variableList_mp[id + 1].nextSibling; + + while (current) + { + const auto var = &game::scr_VarGlob->variableList_mp[current + 0x8000]; + const auto key_value = game::Scr_GetArrayIndexValue(game::SCRIPTINSTANCE_SERVER, var->w.status >> 8); + result.push_back(key_value); + + const auto next_sibling = game::scr_VarGlob->variableList_mp[current + 0x8000].nextSibling; + if (!next_sibling) + { + break; + } + + current = game::scr_VarGlob->variableList_mp[next_sibling + 0x8000].hash.id; + } + + return result; + } + } + + array_value::array_value(const array* array, const script_value& key) + : array_(array) + , key_(key) + { + const auto value = this->array_->get(key); + this->script_value::operator=(value); + } + + void array_value::operator=(const script_value& value) + { + this->array_->set(this->key_, value); + this->script_value::operator=(value); + } + + array::array(const std::uint32_t id) + : id_(id) + { + this->add(); + } + + array::array(const array& other) + { + this->operator=(other); + } + + array::array(array&& other) noexcept + { + this->id_ = other.id_; + other.id_ = 0; + } + + array::array() + { + this->id_ = game::Scr_AllocArray(game::SCRIPTINSTANCE_SERVER); + } + + array::~array() + { + this->release(); + } + + array& array::operator=(const array& other) + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + this->add(); + } + + return *this; + } + + array& array::operator=(array&& other) noexcept + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + other.id_ = 0; + } + + return *this; + } + + void array::add() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + } + } + + void array::release() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + } + } + + std::vector array::get_keys() const + { + return SELECT_VALUE(get_keys_sp, get_keys_mp)(this->id_); + } + + std::uint32_t array::size() const + { + return static_cast(game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, this->id_)); + } + + std::uint32_t array::push_back(const script_value& value) const + { + this->set(this->size(), value); + return this->size(); + } + + void array::erase(const std::uint32_t index) const + { + const auto variable_id = game::FindArrayVariable(game::SCRIPTINSTANCE_SERVER, this->id_, index); + if (variable_id) + { + game::RemoveVariableValue(game::SCRIPTINSTANCE_SERVER, this->id_, variable_id); + } + } + + void array::erase(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0, game::SCRIPTINSTANCE_SERVER); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + if (variable_id) + { + game::RemoveVariableValue(game::SCRIPTINSTANCE_SERVER, this->id_, variable_id); + } + } + + script_value array::get(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0, game::SCRIPTINSTANCE_SERVER); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return {}; + } + + game::VariableValue variable_{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + return variable_; + } + + void array::erase(const script_value& key) const + { + if (key.is()) + { + return this->erase(key.as()); + } + + if (key.is()) + { + return this->erase(key.as()); + } + } + + void array::erase(const array_iterator& iter) const + { + this->erase(iter->first); + } + + script_value array::get(const unsigned int index) const + { + const auto variable_id = game::FindArrayVariable(game::SCRIPTINSTANCE_SERVER, this->id_, index); + + if (!variable_id) + { + return {}; + } + + game::VariableValue variable_{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + return variable_; + } + + script_value array::get(const script_value& key) const + { + if (key.is()) + { + return this->get(key.as()); + } + + if (key.is()) + { + return this->get(key.as()); + } + + throw std::runtime_error(std::format("invalid key type '{}'", key.type_name())); + } + + void array::set(const std::string& key, const script_value& value) const + { + const auto& value_ = value.get_raw(); + const auto variable_id = this->get_value_id(key); + + if (!variable_id) + { + return; + } + + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); + } + + void array::set(const std::uint32_t index, const script_value& value) const + { + const auto& value_ = value.get_raw(); + const auto variable_id = this->get_value_id(index); + + if (!variable_id) + { + return; + } + + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); + } + + void array::set(const script_value& key, const script_value& value) const + { + if (key.is()) + { + return this->set(key.as(), value); + } + + if (key.is()) + { + return this->set(key.as(), value); + } + + throw std::runtime_error(std::format("invalid key type '{}'", key.type_name())); + } + + std::uint32_t array::get_entity_id() const + { + return this->id_; + } + + std::uint32_t array::get_value_id(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0, game::SCRIPTINSTANCE_SERVER); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return game::GetNewVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + } + + return variable_id; + } + + std::uint32_t array::get_value_id(const std::uint32_t index) const + { + const auto variable_id = game::FindArrayVariable(game::SCRIPTINSTANCE_SERVER, this->id_, index); + if (!variable_id) + { + return game::GetNewArrayVariable(game::SCRIPTINSTANCE_SERVER, this->id_, index); + } + + return variable_id; + } + + entity array::get_raw() const + { + return entity(this->id_); + } + + array_value array::operator[](const script_value& key) const + { + return array_value(this, key); + } + + array_iterator array::begin() const + { + const auto keys = this->get_keys(); + return array_iterator(this, keys, 0); + } + + array_iterator array::end() const + { + return array_iterator(this); + } + + array_iterator array::find(const script_value& key) const + { + const auto keys = this->get_keys(); + for (auto i = 0u; i < keys.size(); i++) + { + if (keys[i] == key) + { + return array_iterator(this, keys, i); + } + } + + return array_iterator(this); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.hpp new file mode 100644 index 0000000..dab9522 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/array.hpp @@ -0,0 +1,107 @@ +#pragma once + +#include "script_value.hpp" +#include "container_iterator.hpp" + +namespace scripting +{ + class array_value : public script_value + { + public: + array_value(const array* array, const script_value& key); + void operator=(const script_value& value); + + template + T as() const + { + try + { + return script_value::as(); + } + catch (const std::exception& e) + { + throw std::runtime_error(std::format("array value '{}' {}", this->key_.to_string(), e.what())); + } + } + + private: + script_value key_; + const array* array_; + + }; + + template + class array_iterator_base : public IteratorType + { + public: + array_iterator_base(const array* container) + : IteratorType(container) + { + } + + array_iterator_base(const array* container, const std::vector& keys, const std::int64_t key_index) + : IteratorType(container, keys, key_index) + { + } + }; + + using array_iterator = array_iterator_base>; + + class array final + { + public: + array(); + array(const std::uint32_t id); + + array(const array& other); + array(array&& other) noexcept; + + ~array(); + + array& operator=(const array& other); + array& operator=(array&& other) noexcept; + + std::vector get_keys() const; + std::uint32_t size() const; + + std::uint32_t push_back(const script_value& value) const; + + template + void emplace_back(Args&&... args) + { + this->push_back(std::forward(args)...); + } + + void erase(const std::uint32_t index) const; + void erase(const std::string& key) const; + void erase(const script_value& key) const; + void erase(const array_iterator& iter) const; + + script_value get(const script_value&) const; + script_value get(const std::string&) const; + script_value get(const std::uint32_t) const; + + void set(const script_value&, const script_value&) const; + void set(const std::string&, const script_value&) const; + void set(const std::uint32_t, const script_value&) const; + + std::uint32_t get_entity_id() const; + + std::uint32_t get_value_id(const std::string&) const; + std::uint32_t get_value_id(const std::uint32_t) const; + + entity get_raw() const; + + array_value operator[](const script_value& key) const; + + array_iterator begin() const; + array_iterator end() const; + array_iterator find(const script_value& key) const; + + private: + void add() const; + void release() const; + + std::uint32_t id_{}; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/container_iterator.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/container_iterator.hpp new file mode 100644 index 0000000..3278177 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/container_iterator.hpp @@ -0,0 +1,99 @@ +#pragma once + +#include "script_value.hpp" + +namespace scripting +{ + template + class container_iterator + { + public: + static constexpr std::int64_t container_iterator_end_key = -1; + + container_iterator(const ContainerType* container) + : container_(container) + , key_index_(container_iterator_end_key) + { + } + + container_iterator(const ContainerType* container, const std::vector& keys, const std::int64_t key_index) + : container_(container) + , keys_(keys) + , key_index_(key_index) + { + this->update_pair(); + } + + std::pair& operator*() + { + return this->pair_.value(); + } + + std::pair* operator->() + { + return &this->pair_.value(); + } + + const std::pair& operator*() const + { + return this->pair_.value(); + } + + const std::pair* operator->() const + { + return &this->pair_.value(); + } + + container_iterator& operator++() + { + if (this->key_index_ == container_iterator_end_key) + { + return *this; + } + + const auto size = this->keys_.size(); + if (this->key_index_ + 1 >= size) + { + this->key_index_ = container_iterator_end_key; + return *this; + } + + this->key_index_++; + this->update_pair(); + + return *this; + } + + container_iterator operator++(int) + { + const auto pre = *this; + this->operator++(); + return pre; + } + + friend bool operator==(const container_iterator& a, const container_iterator& b) + { + return a.container_ == b.container_ && a.key_index_ == b.key_index_; + }; + + friend bool operator!=(const container_iterator& a, const container_iterator& b) + { + return a.container_ != b.container_ || a.key_index_ != b.key_index_; + }; + + private: + void update_pair() + { + const auto index = static_cast(this->key_index_); + const auto& key = this->keys_[index]; + const auto value = this->container_->operator[](key); + this->pair_.emplace(std::make_pair(key, value)); + } + + const ContainerType* container_; + std::int64_t key_index_; + std::vector keys_; + std::optional> pair_; + + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.cpp new file mode 100644 index 0000000..d7ebd6d --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.cpp @@ -0,0 +1,120 @@ +#include +#include "entity.hpp" +#include "script_value.hpp" +#include "execution.hpp" + +namespace scripting +{ + entity::entity() + : entity(0) + { + } + + entity::entity(const entity& other) : entity(other.entity_id_) + { + } + + entity::entity(entity&& other) noexcept + { + this->entity_id_ = other.entity_id_; + other.entity_id_ = 0; + } + + entity::entity(const unsigned int entity_id) + : entity_id_(entity_id) + { + this->add(); + } + + entity::~entity() + { + this->release(); + } + + entity& entity::operator=(const entity& other) + { + if (&other != this) + { + this->release(); + this->entity_id_ = other.entity_id_; + this->add(); + } + + return *this; + } + + entity& entity::operator=(entity&& other) noexcept + { + if (&other != this) + { + this->release(); + this->entity_id_ = other.entity_id_; + other.entity_id_ = 0; + } + + return *this; + } + + unsigned int entity::get_entity_id() const + { + return this->entity_id_; + } + + game::scr_entref_t entity::get_entity_reference() const + { + if (!this->entity_id_) + { + const auto not_null = static_cast(~0ui16); + return game::scr_entref_t{not_null, not_null}; + } + + game::scr_entref_t entref{}; + game::Scr_GetEntityIdRef(&entref, game::SCRIPTINSTANCE_SERVER, this->get_entity_id()); + return entref; + } + + bool entity::operator==(const entity& other) const noexcept + { + return this->get_entity_id() == other.get_entity_id(); + } + + bool entity::operator!=(const entity& other) const noexcept + { + return !this->operator==(other); + } + + void entity::add() const + { + if (this->entity_id_) + { + game::VariableValue value; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = this->entity_id_; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + } + } + + void entity::release() const + { + if (this->entity_id_) + { + game::VariableValue value; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = this->entity_id_; + + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + } + } + + void entity::set(const std::string& field, const script_value& value) const + { + set_entity_field(*this, field, value); + } + + template <> + script_value entity::get(const std::string& field) const + { + return get_entity_field(*this, field); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.hpp new file mode 100644 index 0000000..22382fa --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/entity.hpp @@ -0,0 +1,47 @@ +#pragma once +#include "game/game.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class entity final + { + public: + entity(); + entity(unsigned int entity_id); + + entity(const entity& other); + entity(entity&& other) noexcept; + + ~entity(); + + entity& operator=(const entity& other); + entity& operator=(entity&& other) noexcept; + + void set(const std::string& field, const script_value& value) const; + + template + T get(const std::string& field) const; + + unsigned int get_entity_id() const; + game::scr_entref_t get_entity_reference() const; + + bool operator ==(const entity& other) const noexcept; + bool operator !=(const entity& other) const noexcept; + + private: + unsigned int entity_id_; + + void add() const; + void release() const; + }; + + template <> + script_value entity::get(const std::string& field) const; + + template + T entity::get(const std::string& field) const + { + return this->get(field).as(); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/event.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/event.hpp new file mode 100644 index 0000000..bc1d53e --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/event.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "script_value.hpp" +#include "entity.hpp" + +namespace scripting +{ + struct event + { + std::string name; + entity entity{}; + std::vector arguments; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.cpp new file mode 100644 index 0000000..cd885d1 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.cpp @@ -0,0 +1,154 @@ +#include +#include "execution.hpp" +#include "safe_execution.hpp" +#include "stack_isolation.hpp" + +#include "component/scripting.hpp" + +namespace scripting +{ + namespace + { + game::VariableValue* allocate_argument() + { + game::VariableValue* value_ptr = ++game::scr_VmPub->top; + ++game::scr_VmPub->inparamcount; + return value_ptr; + } + + script_value get_return_value() + { + if (game::scr_VmPub->inparamcount == 0) + { + return {}; + } + + game::Scr_ClearOutParams(game::SCRIPTINSTANCE_SERVER); + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + return script_value(game::scr_VmPub->top[1 - game::scr_VmPub->outparamcount]); + } + + int get_field_id(const int classnum, const std::string& field) + { + if (scripting::fields_table[classnum].find(field) != scripting::fields_table[classnum].end()) + { + return scripting::fields_table[classnum][field]; + } + + return -1; + } + } + + void push_value(const script_value& value) + { + auto* value_ptr = allocate_argument(); + *value_ptr = value.get_raw(); + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, value_ptr); + } + + void notify(const entity& entity, const std::string& event, const std::vector& arguments) + { + stack_isolation _; + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + const auto event_id = game::SL_GetString(event.data(), 0, game::SCRIPTINSTANCE_SERVER); + game::Scr_NotifyId(game::SCRIPTINSTANCE_SERVER, 0, entity.get_entity_id(), event_id, game::scr_VmPub->inparamcount); + } + + script_value exec_ent_thread(const entity& entity, const char* pos, const std::vector& arguments) + { + const auto id = entity.get_entity_id(); + + stack_isolation _; + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + game::VariableValue value{}; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = id; + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + + const auto local_id = game::AllocThread(game::SCRIPTINSTANCE_SERVER, id); + const auto result = game::VM_Execute(game::SCRIPTINSTANCE_SERVER, local_id, pos, arguments.size()); + game::RemoveRefToObject(game::SCRIPTINSTANCE_SERVER, result); + + return get_return_value(); + } + + script_value get_custom_field(const entity& entity, const std::string& field) + { + const object object = entity.get_entity_id(); + return object.get(field); + } + + void set_custom_field(const entity& entity, const std::string& field, const script_value& value) + { + const object object = entity.get_entity_id(); + object.set(field, value); + } + + void set_entity_field(const entity& entity, const std::string& field, const script_value& value) + { + const auto entref = entity.get_entity_reference(); + const int id = get_field_id(entref.classnum, field); + + if (id != -1) + { + stack_isolation _; + push_value(value); + + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + if (!safe_execution::set_entity_field(entref, id)) + { + throw std::runtime_error("Failed to set value for field '" + field + "'"); + } + } + else + { + set_custom_field(entity, field, value); + } + } + + script_value get_entity_field(const entity& entity, const std::string& field) + { + const auto entref = entity.get_entity_reference(); + const auto id = get_field_id(entref.classnum, field); + + if (id != -1) + { + stack_isolation _; + + game::VariableValue value{}; + if (!safe_execution::get_entity_field(entref, id, &value)) + { + throw std::runtime_error("Failed to get value for field '" + field + "'"); + } + + const auto __ = gsl::finally([&value]() + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + }); + + return value; + } + else + { + return get_custom_field(entity, field); + } + } + + unsigned int make_object() + { + return 0; + } +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.hpp new file mode 100644 index 0000000..c4b2c3c --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/execution.hpp @@ -0,0 +1,22 @@ +#pragma once +#include "game/game.hpp" +#include "entity.hpp" +#include "array.hpp" +#include "object.hpp" +#include "function.hpp" +#include "thread.hpp" +#include "script_value.hpp" + +namespace scripting +{ + void push_value(const script_value& value); + + script_value exec_ent_thread(const entity& entity, const char* pos, const std::vector& arguments); + + void set_entity_field(const entity& entity, const std::string& field, const script_value& value); + script_value get_entity_field(const entity& entity, const std::string& field); + + void notify(const entity& entity, const std::string& event, const std::vector& arguments); + + unsigned int make_object(); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.cpp new file mode 100644 index 0000000..5f511ac --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.cpp @@ -0,0 +1,42 @@ +#include +#include "function.hpp" +#include "execution.hpp" +#include "../../component/scripting.hpp" + +namespace scripting +{ + function::function(const char* pos) + : pos_(pos) + { + } + + script_value function::get_raw() const + { + game::VariableValue value; + value.type = game::SCRIPT_FUNCTION; + value.u.codePosValue = this->pos_; + + return value; + } + + const char* function::get_pos() const + { + return this->pos_; + } + + std::string function::get_name() const + { + if (scripting::script_function_table_rev.find(this->pos_) != scripting::script_function_table_rev.end()) + { + const auto& func = scripting::script_function_table_rev[this->pos_]; + return utils::string::va("%s::%s", func.first.data(), func.second.data()); + } + + return "unknown function"; + } + + script_value function::call(const entity& self, const arguments& arguments) const + { + return exec_ent_thread(self, this->pos_, arguments); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.hpp new file mode 100644 index 0000000..b0eb4f8 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/function.hpp @@ -0,0 +1,48 @@ +#pragma once +#include "entity.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class function + { + public: + function(const char*); + + script_value get_raw() const; + const char* get_pos() const; + std::string get_name() const; + + script_value call(const entity& self, const arguments& arguments) const; + + script_value operator()(const entity& self, const arguments& arguments) const + { + return this->call(self, arguments); + } + + script_value operator()(const arguments& arguments) const + { + return this->call(*game::levelEntityId, arguments); + } + + script_value operator()() const + { + return this->call(*game::levelEntityId, {}); + } + + template + arguments operator()(T... arguments) const + { + return this->call(*game::levelEntityId, {arguments...}); + } + + template + arguments operator()(const entity& self, T... arguments) const + { + return this->call(self, {arguments...}); + } + + private: + const char* pos_; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.cpp new file mode 100644 index 0000000..df7acd5 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.cpp @@ -0,0 +1,326 @@ +#include +#include "object.hpp" +#include "execution.hpp" + +#include "../../component/scripting.hpp" + +namespace scripting +{ + namespace + { + std::string get_string(unsigned int canonical_string) + { + if (canonical_string_table.find(canonical_string) != canonical_string_table.end()) + { + return canonical_string_table[canonical_string]; + } + + return ""; + } + + unsigned int get_canonical_string(const std::string& str) + { + for (const auto& value : canonical_string_table) + { + if (value.second == str) + { + return value.first; + } + } + + return game::SL_GetCanonicalString(game::SCRIPTINSTANCE_SERVER, str.data()); + } + + std::vector get_keys_sp(unsigned int id) + { + std::vector result; + + auto current = game::scr_VarGlob->variableList_sp[id + 1].nextSibling; + + while (current) + { + const auto var = &game::scr_VarGlob->variableList_sp[current + 0x6000]; + const auto key_value = get_string(var->w.status >> 8); + result.push_back(key_value); + + const auto next_sibling = game::scr_VarGlob->variableList_sp[current + 0x6000].nextSibling; + if (!next_sibling) + { + break; + } + + current = static_cast(game::scr_VarGlob->variableList_sp[next_sibling + 0x6000].id); + } + + return result; + } + + std::vector get_keys_mp(unsigned int id) + { + std::vector result; + + auto current = game::scr_VarGlob->variableList_mp[id + 1].nextSibling; + + while (current) + { + const auto var = &game::scr_VarGlob->variableList_mp[current + 0x8000]; + const auto key_value = get_string(var->w.status >> 8); + result.push_back(key_value); + + const auto next_sibling = game::scr_VarGlob->variableList_mp[current + 0x8000].nextSibling; + if (!next_sibling) + { + break; + } + + current = game::scr_VarGlob->variableList_mp[next_sibling + 0x8000].hash.id; + } + + return result; + } + } + + object_value::object_value(unsigned int parent_id, unsigned int id) + : id_(id) + , parent_id_(parent_id) + { + if (!this->id_) + { + return; + } + + game::VariableValue variable_{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[this->id_ + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[this->id_ + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + this->value_ = variable_; + } + + void object_value::operator=(const script_value& value) + { + if (!this->id_) + { + return; + } + + const auto& value_0 = value.get_raw(); + + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[this->id_ + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_0.type; + variable->u.u = value_0.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[this->id_ + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_0.type; + variable->u.u = value_0.u; + } + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_0); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); + + this->value_ = value_0; + } + + object::object(const unsigned int id) + : id_(id) + { + this->add(); + } + + object::object(const object& other) + { + this->operator=(other); + } + + object::object(object&& other) noexcept + { + this->id_ = other.id_; + other.id_ = 0; + } + + object::object() + { + this->id_ = game::AllocObject(game::SCRIPTINSTANCE_SERVER); + } + + object::~object() + { + this->release(); + } + + object& object::operator=(const object& other) + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + this->add(); + } + + return *this; + } + + object& object::operator=(object&& other) noexcept + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + other.id_ = 0; + } + + return *this; + } + + void object::add() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + } + } + + void object::release() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + } + } + + std::vector object::get_keys() const + { + return SELECT_VALUE(get_keys_sp, get_keys_mp)(this->id_); + } + + unsigned int object::size() const + { + return game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, this->id_); + } + + void object::erase(const std::string& /*key*/) const + { + /*const auto string_value = game::SL_GetCanonicalString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + if (variable_id) + { + game::RemoveVariableValue(game::SCRIPTINSTANCE_SERVER, this->id_, variable_id); + }*/ + } + + script_value object::get(const std::string& key) const + { + const auto string_value = get_canonical_string(key); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return {}; + } + + game::VariableValue variable_{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + variable_.type = variable->w.type & 0x1F; + variable_.u = variable->u.u; + } + + return variable_; + } + + void object::set(const std::string& key, const script_value& value) const + { + const auto& value_ = value.get_raw(); + const auto variable_id = this->get_value_id(key); + + if (!variable_id) + { + return; + } + + game::VariableValue previous{}; + + if (game::environment::is_sp()) + { + const auto variable = &game::scr_VarGlob->variableList_sp[variable_id + 0x6000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + else + { + const auto variable = &game::scr_VarGlob->variableList_mp[variable_id + 0x8000]; + previous.type = variable->w.type & 0x1F; + previous.u = variable->u.u; + + variable->w.type |= value_.type; + variable->u.u = value_.u; + } + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, previous.type, previous.u); + } + + unsigned int object::get_entity_id() const + { + return this->id_; + } + + unsigned int object::get_value_id(const std::string& key) const + { + const auto string_value = get_canonical_string(key); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return game::GetNewVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + } + + return variable_id; + } + + entity object::get_raw() const + { + return entity(this->id_); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.hpp new file mode 100644 index 0000000..974444f --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/object.hpp @@ -0,0 +1,53 @@ +#pragma once +#include "script_value.hpp" + +namespace scripting +{ + class object_value : public script_value + { + public: + object_value(unsigned int, unsigned int); + void operator=(const script_value&); + private: + unsigned int id_; + unsigned int parent_id_; + }; + + class object final + { + public: + object(); + object(const unsigned int); + + object(const object& other); + object(object&& other) noexcept; + + ~object(); + + object& operator=(const object& other); + object& operator=(object&& other) noexcept; + + std::vector get_keys() const; + unsigned int size() const; + void erase(const std::string&) const; + + script_value get(const std::string&) const; + void set(const std::string&, const script_value&) const; + + unsigned int get_entity_id() const; + unsigned int get_value_id(const std::string&) const; + + entity get_raw() const; + + object_value operator[](const std::string& key) const + { + return {this->id_, this->get_value_id(key)}; + } + + private: + void add() const; + void release() const; + + unsigned int id_{}; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.cpp new file mode 100644 index 0000000..c7805b4 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.cpp @@ -0,0 +1,67 @@ +#include +#include "safe_execution.hpp" + +#pragma warning(push) +#pragma warning(disable: 4611) + +namespace scripting::safe_execution +{ + bool execute_with_seh(const script_function function, const game::scr_entref_t& entref) + { + __try + { + function(entref); + return true; + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + return false; + } + } + + bool call(const script_function function, const game::scr_entref_t& entref) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0)) + { + *game::g_script_error_level -= 1; + return false; + } + + const auto result = execute_with_seh(function, entref); + *game::g_script_error_level -= 1; + return result; + } + + bool set_entity_field(const game::scr_entref_t& entref, const int offset) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0)) + { + *game::g_script_error_level -= 1; + return false; + } + + game::Scr_SetObjectField(entref.classnum, entref.entnum, offset); + + *game::g_script_error_level -= 1; + return true; + } + + bool get_entity_field(const game::scr_entref_t& entref, const int offset, game::VariableValue* value) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0)) + { + value->type = game::SCRIPT_NONE; + value->u.intValue = 0; + *game::g_script_error_level -= 1; + return false; + } + + *value = game::GetEntityFieldValue(game::SCRIPTINSTANCE_SERVER, entref.classnum, entref.entnum, 0, offset); + + *game::g_script_error_level -= 1; + return true; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.hpp new file mode 100644 index 0000000..7091973 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/safe_execution.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting::safe_execution +{ + using script_function = void(*)(game::scr_entref_t); + + bool execute_with_seh(const script_function function, const game::scr_entref_t& entref); + + bool call(script_function function, const game::scr_entref_t& entref); + + bool set_entity_field(const game::scr_entref_t& entref, int offset); + bool get_entity_field(const game::scr_entref_t& entref, int offset, game::VariableValue* value); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.cpp new file mode 100644 index 0000000..3f6e403 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.cpp @@ -0,0 +1,491 @@ +#include +#include "script_value.hpp" +#include "entity.hpp" +#include "array.hpp" +#include "function.hpp" +#include "object.hpp" + +namespace scripting +{ + /*********************************************** + * Constructors + **********************************************/ + + script_value::script_value(const game::VariableValue& value) + : value_(value) + { + } + + script_value::script_value(void* value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.intValue = reinterpret_cast(value); + + this->value_ = variable; + } + + script_value::script_value(const int value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.intValue = value; + + this->value_ = variable; + } + + script_value::script_value(const unsigned int value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.uintValue = value; + + this->value_ = variable; + } + + script_value::script_value(const bool value) + : script_value(static_cast(value)) + { + } + + script_value::script_value(const float value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_FLOAT; + variable.u.floatValue = value; + + this->value_ = variable; + } + + script_value::script_value(const double value) + : script_value(static_cast(value)) + { + } + + script_value::script_value(const char* value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_STRING; + variable.u.stringValue = game::SL_GetString(value, 0, game::SCRIPTINSTANCE_SERVER); + + const auto _ = gsl::finally([&variable]() + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable.type, variable.u); + }); + + this->value_ = variable; + } + + script_value::script_value(const std::string& value) + : script_value(value.data()) + { + } + + script_value::script_value(const entity& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const array& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const object& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const function& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_FUNCTION; + variable.u.codePosValue = value.get_pos(); + + this->value_ = variable; + } + + script_value::script_value(const vector& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_VECTOR; + variable.u.vectorValue = game::Scr_AllocVector(game::SCRIPTINSTANCE_SERVER, value); + + const auto _ = gsl::finally([&variable]() + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable.type, variable.u); + }); + + this->value_ = variable; + } + + /*********************************************** + * Integer + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_INTEGER; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + int script_value::get() const + { + return this->get_raw().u.intValue; + } + + template <> + unsigned int script_value::get() const + { + return this->get_raw().u.uintValue; + } + + template <> + bool script_value::get() const + { + return this->get_raw().u.uintValue != 0; + } + + template <> + unsigned short script_value::get() const + { + return static_cast(this->get_raw().u.uintValue); + } + + template <> + short script_value::get() const + { + return static_cast(this->get_raw().u.intValue); + } + + template <> + char script_value::get() const + { + return static_cast(this->get_raw().u.intValue); + } + + /*********************************************** + * Float + **********************************************/ + + template <> + bool script_value::is() const + { + const auto type = this->get_raw().type; + return type == game::SCRIPT_FLOAT || type == game::SCRIPT_INTEGER; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + float script_value::get() const + { + const auto type = this->get_raw().type; + if (type == game::SCRIPT_INTEGER) + { + return static_cast(this->get_raw().u.intValue); + } + + return this->get_raw().u.floatValue; + } + + template <> + double script_value::get() const + { + const auto type = this->get_raw().type; + if (type == game::SCRIPT_INTEGER) + { + return static_cast(this->get_raw().u.intValue); + } + + return static_cast(this->get_raw().u.floatValue); + } + + /*********************************************** + * String + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_STRING + || this->get_raw().type == game::SCRIPT_ISTRING; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + const char* script_value::get() const + { + return game::SL_ConvertToString(static_cast(this->get_raw().u.stringValue), + game::SCRIPTINSTANCE_SERVER); + } + + template <> + std::string script_value::get() const + { + return this->get(); + } + + /*********************************************** + * Entity + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_OBJECT; + } + + template <> + entity script_value::get() const + { + return entity(this->get_raw().u.pointerValue); + } + + /*********************************************** + * Array + **********************************************/ + + template <> + bool script_value::is() const + { + if (this->get_raw().type != game::SCRIPT_OBJECT) + { + return false; + } + + const auto id = this->get_raw().u.uintValue; + const auto type = game::GetObjectType(game::SCRIPTINSTANCE_SERVER, id); + + return type == game::SCRIPT_ARRAY; + } + + template <> + array script_value::get() const + { + return array(this->get_raw().u.uintValue); + } + + /*********************************************** + * Struct + **********************************************/ + + template <> + bool script_value::is() const + { + if (this->get_raw().type != game::SCRIPT_OBJECT) + { + return false; + } + + const auto id = this->get_raw().u.uintValue; + const auto type = game::GetObjectType(game::SCRIPTINSTANCE_SERVER, id); + + return type == game::SCRIPT_STRUCT || type == game::SCRIPT_ENTITY; + } + + template <> + object script_value::get() const + { + return object(this->get_raw().u.uintValue); + } + + /*********************************************** + * Function + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_FUNCTION; + } + + template <> + function script_value::get() const + { + return function(this->get_raw().u.codePosValue); + } + + + /*********************************************** + * Vector + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_VECTOR; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + vector script_value::get() const + { + return this->get_raw().u.vectorValue; + } + + /*********************************************** + * + **********************************************/ + + template <> + bool script_value::is() const + { + return true; + } + + template <> + script_value script_value::get() const + { + return this; + } + + const game::VariableValue& script_value::get_raw() const + { + return this->value_.get(); + } + + std::string script_value::to_string() const + { + if (this->is()) + { + return utils::string::va("%i", this->as()); + } + + if (this->is()) + { + return utils::string::va("%f", this->as()); + } + + if (this->is()) + { + return this->as(); + } + + if (this->is()) + { + const auto vec = this->as(); + return utils::string::va("(%g, %g, %g)", + vec.get_x(), + vec.get_y(), + vec.get_z() + ); + } + + if (this->is()) + { + const auto func = this->as(); + const auto& name = func.get_name(); + return utils::string::va("[[ %s ]]", name.data()); + } + + return this->type_name(); + } + + function_argument::function_argument(const arguments& args, const script_value& value, const size_t index, const bool exists) + : script_value(value) + , values_(args) + , index_(index) + , exists_(exists) + { + + } + + function_arguments::function_arguments(const arguments& values) + : values_(values) + { + } + + variadic_args::variadic_args(const size_t begin) + : std::vector({}) + , begin_(begin) + { + } + + function_argument variadic_args::operator[](size_t index) const + { + if (index >= this->size()) + { + throw std::runtime_error(utils::string::va("parameter %d does not exist", this->begin_ + index)); + } + + return std::vector::operator[](index); + } + + function_argument function_arguments::operator[](const size_t index) const + { + if (index >= values_.size()) + { + return {values_, {}, index, false}; + } + + return {values_, values_[index], index, true}; + } + + arguments function_arguments::get_raw() const + { + return this->values_; + } + + size_t function_arguments::size() const + { + return this->values_.size(); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.hpp new file mode 100644 index 0000000..af6331d --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/script_value.hpp @@ -0,0 +1,399 @@ +#pragma once +#include "game/game.hpp" +#include "variable_value.hpp" +#include "vector.hpp" + +#include + +namespace scripting +{ + class entity; + class array; + class object; + class function; + class script_value; + + namespace + { + std::unordered_map typenames = + { + {0, "undefined"}, + {1, "object"}, + {2, "string"}, + {3, "localized string"}, + {4, "vector"}, + {5, "float"}, + {6, "int"}, + {7, "codepos"}, + {8, "precodepos"}, + {9, "function"}, + {10, "stack"}, + {11, "animation"}, + {12, "developer codepos"}, + {13, "thread"}, + {14, "thread"}, + {15, "thread"}, + {16, "thread"}, + {17, "struct"}, + {18, "removed entity"}, + {19, "entity"}, + {20, "array"}, + {21, "removed thread"}, + }; + + std::string get_typename(const game::VariableValue& value) + { + auto type_ = 0; + if (value.type == game::SCRIPT_OBJECT) + { + type_ = game::GetObjectType(game::SCRIPTINSTANCE_SERVER, value.u.uintValue); + } + else + { + type_ = value.type; + } + + if (typenames.find(type_) != typenames.end()) + { + return typenames[type_]; + } + + return "unknown"; + } + + template + std::string get_c_typename() + { + auto& info = typeid(T); + + if (info == typeid(std::string)) + { + return "string"; + } + + if (info == typeid(const char*)) + { + return "string"; + } + + if (info == typeid(entity)) + { + return "entity"; + } + + if (info == typeid(array)) + { + return "array"; + } + + if (info == typeid(object)) + { + return "struct"; + } + + if (info == typeid(function)) + { + return "function"; + } + + if (info == typeid(vector)) + { + return "vector"; + } + + return info.name(); + } + } + + using arguments = std::vector; + + class script_value + { + public: + script_value() = default; + script_value(const game::VariableValue& value); + + script_value(void* value); + + script_value(int value); + script_value(unsigned int value); + script_value(bool value); + + script_value(float value); + script_value(double value); + + script_value(const char* value); + script_value(const std::string& value); + + script_value(const entity& value); + script_value(const array& value); + script_value(const object& value); + + script_value(const function& value); + + script_value(const vector& value); + + private: + template + T get() const + { + if constexpr (std::is_pointer::value) + { + if (this->is()) + { + return reinterpret_cast(this->as()); + } + } + + if constexpr (std::is_constructible::value) + { + if (this->is()) + { + return T(this->as()); + } + } + + throw std::runtime_error("Invalid type"); + } + public: + +#define ADD_TYPE(type) \ + template <> \ + bool is() const; \ +private: \ + template <> \ + type get<>() const; \ +public: \ + + template + bool is() const + { + if constexpr (std::is_pointer::value) + { + if (this->is()) + { + return true; + } + } + + if (std::is_constructible::value && this->is()) + { + return true; + } + + return false; + } + + ADD_TYPE(bool) + ADD_TYPE(int) + ADD_TYPE(unsigned int) + ADD_TYPE(unsigned short) + ADD_TYPE(float) + ADD_TYPE(float*) + ADD_TYPE(double) + ADD_TYPE(const char*) + ADD_TYPE(std::string) + + ADD_TYPE(vector) + ADD_TYPE(array) + ADD_TYPE(object) + ADD_TYPE(function) + ADD_TYPE(entity) + ADD_TYPE(script_value) + + template + T as() const + { + if (!this->is()) + { + const auto type = get_typename(this->get_raw()); + const auto c_type = get_c_typename(); + throw std::runtime_error(utils::string::va("has type '%s' but should be '%s'", type.data(), c_type.data())); + } + + return get(); + } + + template + T as_or(const T& default_value) const + { + if (!this->is()) + { + return default_value; + } + + return get(); + } + + std::string type_name() const + { + return get_typename(this->get_raw()); + } + + template class C, class T, typename ArrayType = array> + script_value(const C>& container) + { + ArrayType array_{}; + + for (const auto& value : container) + { + array_.emplace_back(value); + } + + game::VariableValue value{}; + value.type = game::SCRIPT_OBJECT; + value.u.pointerValue = array_.get_entity_id(); + + this->value_ = value; + } + + template + arguments operator()(T... arguments) const + { + return this->as().call({arguments...}); + } + + std::string to_string() const; + + friend bool operator==(const script_value& a, const script_value& b) + { + const auto& value_raw_a = a.get_raw(); + const auto& value_raw_b = b.get_raw(); + + return value_raw_a.type != value_raw_b.type && value_raw_a.u.uintValue == value_raw_b.u.uintValue; + } + + const game::VariableValue& get_raw() const; + + variable_value value_{}; + + }; + + class function_argument; + + class variadic_args : public std::vector + { + public: + variadic_args(const size_t begin); + + function_argument operator[](size_t index) const; + private: + size_t begin_; + }; + + class function_argument : public script_value + { + public: + function_argument(const arguments& args, const script_value& value, const size_t index, const bool exists); + + template + T as() const + { + if (!this->exists_) + { + throw std::runtime_error(utils::string::va("parameter %d does not exist", this->index_)); + } + + try + { + return script_value::as(); + } + catch (const std::exception& e) + { + throw std::runtime_error(utils::string::va("parameter %d %s", + this->index_, e.what())); + } + } + + template + T* as_ptr() const + { + const auto value = script_value::as(); + + if (value == nullptr) + { + throw std::runtime_error("is null"); + } + + return reinterpret_cast(value); + } + + template <> + variadic_args as() const + { + variadic_args args{this->index_}; + + for (auto i = this->index_; i < this->values_.size(); i++) + { + args.emplace_back(this->values_, this->values_[i], i, true); + } + + return args; + } + + operator variadic_args() const + { + return this->as(); + } + + template class C, class T, class ArrayType = array> + operator C>() const + { + const auto container_type = get_c_typename>>(); + if (!script_value::is()) + { + const auto type = get_typename(this->get_raw()); + + throw std::runtime_error(utils::string::va("has type '%s' but should be '%s'", + type.data(), + container_type.data() + )); + } + + C> container{}; + const auto array = script_value::as(); + for (auto i = 0u; i < array.size(); i++) + { + try + { + container.emplace_back(array.get(i).as()); + } + catch (const std::exception& e) + { + throw std::runtime_error(utils::string::va("element %d of parameter %d of type '%s' %s", + i, this->index_, container_type.data(), e.what())); + } + } + + return container; + } + + template + operator T() const + { + return this->as(); + } + + private: + arguments values_{}; + size_t index_{}; + bool exists_{}; + + }; + + class function_arguments + { + public: + function_arguments(const arguments& values); + + function_argument operator[](const size_t index) const; + + arguments get_raw() const; + + size_t size() const; + + private: + arguments values_{}; + + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.cpp new file mode 100644 index 0000000..ee72c5c --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.cpp @@ -0,0 +1,27 @@ +#include +#include "stack_isolation.hpp" + +namespace scripting +{ + stack_isolation::stack_isolation() + { + this->in_param_count_ = game::scr_VmPub->inparamcount; + this->out_param_count_ = game::scr_VmPub->outparamcount; + this->top_ = game::scr_VmPub->top; + this->max_stack_ = game::scr_VmPub->maxstack; + + game::scr_VmPub->top = this->stack_; + game::scr_VmPub->maxstack = &this->stack_[ARRAYSIZE(this->stack_) - 1]; + game::scr_VmPub->inparamcount = 0; + game::scr_VmPub->outparamcount = 0; + } + + stack_isolation::~stack_isolation() + { + game::Scr_ClearOutParams(game::SCRIPTINSTANCE_SERVER); + game::scr_VmPub->inparamcount = this->in_param_count_; + game::scr_VmPub->outparamcount = this->out_param_count_; + game::scr_VmPub->top = this->top_; + game::scr_VmPub->maxstack = this->max_stack_; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.hpp new file mode 100644 index 0000000..8dffd4b --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/stack_isolation.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class stack_isolation final + { + public: + stack_isolation(); + ~stack_isolation(); + + stack_isolation(stack_isolation&&) = delete; + stack_isolation(const stack_isolation&) = delete; + stack_isolation& operator=(stack_isolation&&) = delete; + stack_isolation& operator=(const stack_isolation&) = delete; + + private: + game::VariableValue stack_[512]{}; + + game::VariableValue* max_stack_; + game::VariableValue* top_; + unsigned int in_param_count_; + unsigned int out_param_count_; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.cpp new file mode 100644 index 0000000..975002e --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.cpp @@ -0,0 +1,67 @@ +#include +#include "thread.hpp" +#include "execution.hpp" +#include "../../component/scripting.hpp" + +namespace scripting +{ + thread::thread(unsigned int id) + : id_(id) + , type_(game::GetObjectType(game::SCRIPTINSTANCE_SERVER, id)) + { + } + + script_value thread::get_raw() const + { + game::VariableValue value; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = this->id_; + + return value; + } + + unsigned int thread::get_entity_id() const + { + return this->id_; + } + + unsigned int thread::get_type() const + { + return this->type_; + } + + unsigned int thread::get_wait_time() const + { + return 0; + } + + unsigned int thread::get_notify_name_id() const + { + return 0; + } + + unsigned int thread::get_self() const + { + return game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, this->id_); + } + + std::string thread::get_notify_name() const + { + return game::SL_ConvertToString(this->get_notify_name_id(), game::SCRIPTINSTANCE_SERVER); + } + + const char* thread::get_pos() const + { + return 0; + } + + const char* thread::get_start_pos() const + { + return 0; + } + + void thread::kill() const + { + + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.hpp new file mode 100644 index 0000000..29d8476 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/thread.hpp @@ -0,0 +1,32 @@ +#pragma once +#include "entity.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class thread + { + public: + thread(unsigned int); + + script_value get_raw() const; + + unsigned int get_entity_id() const; + unsigned int get_type() const; + + unsigned int get_self() const; + unsigned int get_wait_time() const; + unsigned int get_notify_name_id() const; + std::string get_notify_name() const; + + const char* get_pos() const; + const char* get_start_pos() const; + + void kill() const; + + private: + unsigned int id_{}; + unsigned int type_{}; + + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.cpp new file mode 100644 index 0000000..cdd5e9b --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.cpp @@ -0,0 +1,68 @@ +#include +#include "variable_value.hpp" + +namespace scripting +{ + variable_value::variable_value(const game::VariableValue& value) + { + this->assign(value); + } + + variable_value::variable_value(const variable_value& other) noexcept + { + this->operator=(other); + } + + variable_value::variable_value(variable_value&& other) noexcept + { + this->operator=(std::move(other)); + } + + variable_value& variable_value::operator=(const variable_value& other) noexcept + { + if (this != &other) + { + this->release(); + this->assign(other.value_); + } + + return *this; + } + + variable_value& variable_value::operator=(variable_value&& other) noexcept + { + if (this != &other) + { + this->release(); + this->value_ = other.value_; + other.value_.type = game::SCRIPT_NONE; + } + + return *this; + } + + variable_value::~variable_value() + { + this->release(); + } + + const game::VariableValue& variable_value::get() const + { + return this->value_; + } + + void variable_value::assign(const game::VariableValue& value) + { + this->value_ = value; + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &this->value_); + } + + void variable_value::release() + { + if (this->value_.type != game::SCRIPT_NONE) + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, this->value_.type, this->value_.u); + this->value_.type = game::SCRIPT_NONE; + } + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.hpp new file mode 100644 index 0000000..7a96261 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/variable_value.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class variable_value + { + public: + variable_value() = default; + variable_value(const game::VariableValue& value); + variable_value(const variable_value& other) noexcept; + variable_value(variable_value&& other) noexcept; + + variable_value& operator=(const variable_value& other) noexcept; + variable_value& operator=(variable_value&& other) noexcept; + + ~variable_value(); + + const game::VariableValue& get() const; + + private: + void assign(const game::VariableValue& value); + void release(); + + game::VariableValue value_{{0}, game::SCRIPT_NONE}; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.cpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.cpp new file mode 100644 index 0000000..143e29a --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.cpp @@ -0,0 +1,85 @@ +#include +#include "vector.hpp" + +namespace scripting +{ + vector::vector(const float* value) + { + for (auto i = 0; i < 3; ++i) + { + this->value_[i] = value[i]; + } + } + + vector::vector(const game::vec3_t& value) + : vector(&value[0]) + { + } + + vector::vector(const float x, const float y, const float z) + { + this->value_[0] = x; + this->value_[1] = y; + this->value_[2] = z; + } + + vector::operator game::vec3_t& () + { + return this->value_; + } + + vector::operator const game::vec3_t& () const + { + return this->value_; + } + + game::vec_t& vector::operator[](const size_t i) + { + if (i >= 3) + { + throw std::runtime_error("Out of bounds."); + } + + return this->value_[i]; + } + + const game::vec_t& vector::operator[](const size_t i) const + { + if (i >= 3) + { + throw std::runtime_error("Out of bounds."); + } + + return this->value_[i]; + } + + float vector::get_x() const + { + return this->operator[](0); + } + + float vector::get_y() const + { + return this->operator[](1); + } + + float vector::get_z() const + { + return this->operator[](2); + } + + void vector::set_x(const float value) + { + this->operator[](0) = value; + } + + void vector::set_y(const float value) + { + this->operator[](1) = value; + } + + void vector::set_z(const float value) + { + this->operator[](2) = value; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.hpp new file mode 100644 index 0000000..0bb1595 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/scripting/vector.hpp @@ -0,0 +1,31 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class vector final + { + public: + vector() = default; + vector(const float* value); + vector(const game::vec3_t& value); + vector(float x, float y, float z); + + operator game::vec3_t& (); + operator const game::vec3_t& () const; + + game::vec_t& operator[](size_t i); + const game::vec_t& operator[](size_t i) const; + + float get_x() const; + float get_y() const; + float get_z() const; + + void set_x(float value); + void set_y(float value); + void set_z(float value); + + private: + game::vec3_t value_{ 0 }; + }; +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/structs.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/structs.hpp new file mode 100644 index 0000000..672b45c --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/structs.hpp @@ -0,0 +1,857 @@ +#pragma once + +namespace game +{ + typedef float vec_t; + typedef vec_t vec2_t[2]; + typedef vec_t vec3_t[3]; + typedef vec_t vec4_t[4]; + + enum scriptInstance_t + { + SCRIPTINSTANCE_SERVER, + SCRIPTINSTANCE_CLIENT, + }; + + struct scr_entref_t + { + unsigned short entnum; + unsigned short classnum; + int client; + }; + + struct BuiltinMethodDef + { + const char* actionString; + unsigned int constId; + int min_args; + int max_args; + void(__cdecl* actionFunc)(scr_entref_t); + int type; + }; + + struct BuiltinFunctionDef + { + const char* actionString; + unsigned int constId; + int min_args; + int max_args; + void(__cdecl* actionFunc)(); + int type; + }; + + enum scriptType_e + { + SCRIPT_NONE = 0, + SCRIPT_OBJECT = 1, + SCRIPT_STRING = 2, + SCRIPT_ISTRING = 3, + SCRIPT_VECTOR = 4, + SCRIPT_FLOAT = 5, + SCRIPT_INTEGER = 6, + SCRIPT_CODEPOS = 7, + SCRIPT_END = 8, + SCRIPT_FUNCTION = 9, + SCRIPT_THREAD = 13, + SCRIPT_NOTIFY_THREAD = 14, + SCRIPT_TIME_THREAD = 15, + SCRIPT_STRUCT = 17, + SCRIPT_ENTITY = 19, + SCRIPT_ARRAY = 20, + SCRIPT_FREE = 0x17, + }; + + struct VariableStackBuffer + { + const char* pos; + unsigned __int16 size; + unsigned __int16 bufLen; + unsigned __int16 localId; + char time; + char buf[1]; + }; + + union VariableUnion + { + int intValue; + unsigned int uintValue; + float floatValue; + unsigned int stringValue; + const float* vectorValue; + const char* codePosValue; + unsigned int pointerValue; + VariableStackBuffer* stackValue; + unsigned int entityOffset; + }; + + struct VariableValue + { + VariableUnion u; + int type; + }; + + struct function_stack_t + { + char* pos; + VariableValue* top; + unsigned int localId; + unsigned int localVarCount; + VariableValue* startTop; + }; + + struct function_frame_t + { + function_stack_t fs; + }; + + struct scrVmPub_t + { + unsigned int* localVars; + VariableValue* maxstack; + int function_count; + function_frame_t* function_frame; + VariableValue* top; + bool abort_on_error; + bool terminal_error; + bool block_execution; + unsigned int inparamcount; + unsigned int outparamcount; + function_frame_t function_frame_start[32]; + VariableValue stack[2048]; + void(__cdecl* notifyListeners[1])(unsigned int, unsigned int); + }; + + static_assert(offsetof(scrVmPub_t, top) == 16); + static_assert(offsetof(scrVmPub_t, inparamcount) == 24); + + struct scrVarPub_t + { + const char* fieldBuffer; + unsigned __int16 canonicalStrCount; + bool developer; + bool developer_script; + bool evaluate; + const char* error_message; + int error_index; + unsigned int time; + unsigned int timeArrayId; + unsigned int pauseArrayId; + unsigned int levelId; + unsigned int gameId; + unsigned int animId; + unsigned int freeEntList; + unsigned int tempVariable; + bool bInited; + unsigned __int16 savecount; + unsigned int checksum; + unsigned int entId; + unsigned int entFieldName; + void* programHunkUser; + const char* programBuffer; + const char* endScriptBuffer; + unsigned __int16* saveIdMap; + unsigned __int16* saveIdMapRev; + unsigned int numScriptThreads; + unsigned int numScriptValues; + unsigned int numScriptObjects; + const char* varUsagePos; + int ext_threadcount; + int totalObjectRefCount; + volatile int totalVectorRefCount; + }; + + union Variable_u + { + unsigned int prev; + unsigned int prevSibling; + }; + + struct Variable + { + unsigned int id; + Variable_u u; + }; + + union ObjectInfo_u + { + unsigned __int16 entnum; + unsigned __int16 size; + unsigned int nextEntId; + unsigned int self; + }; + + struct ObjectInfo + { + unsigned __int16 refCount; + ObjectInfo_u u; + }; + + union VariableValueInternal_u + { + unsigned int next; + VariableUnion u; + ObjectInfo o; + }; + + union VariableValueInternal_w + { + unsigned int status; + unsigned int type; + unsigned int name; + unsigned int classnum; + unsigned int notifyName; + unsigned int waitTime; + unsigned int parentLocalId; + }; + + union VariableValueInternal_v + { + unsigned int next; + unsigned int index; + }; + + enum fsMode_t + { + FS_READ = 0x0, + FS_WRITE = 0x1, + FS_APPEND = 0x2, + FS_APPEND_SYNC = 0x3, + }; + + enum errorParm_t + { + ERR_FATAL = 0x0, + ERR_DROP = 0x1, + ERR_SERVERDISCONNECT = 0x2, + ERR_DISCONNECT = 0x3, + ERR_SCRIPT = 0x4, + ERR_SCRIPT_DROP = 0x5, + ERR_LOCALIZATION = 0x6, + }; + + enum conChannel_t + { + CON_CHANNEL_DONT_FILTER = 0x0, + CON_CHANNEL_ERROR = 0x1, + CON_CHANNEL_GAMENOTIFY = 0x2, + CON_CHANNEL_BOLDGAME = 0x3, + CON_CHANNEL_SUBTITLE = 0x4, + CON_CHANNEL_OBITUARY = 0x5, + CON_CHANNEL_LOGFILEONLY = 0x6, + CON_CHANNEL_CONSOLEONLY = 0x7, + CON_CHANNEL_GFX = 0x8, + CON_CHANNEL_SOUND = 0x9, + CON_CHANNEL_FILES = 0xA, + CON_CHANNEL_DEVGUI = 0xB, + CON_CHANNEL_PROFILE = 0xC, + CON_CHANNEL_UI = 0xD, + CON_CHANNEL_CLIENT = 0xE, + CON_CHANNEL_SERVER = 0xF, + CON_CHANNEL_SYSTEM = 0x10, + CON_CHANNEL_PLAYERWEAP = 0x11, + CON_CHANNEL_AI = 0x12, + CON_CHANNEL_ANIM = 0x13, + CON_CHANNEL_PHYS = 0x14, + CON_CHANNEL_FX = 0x15, + CON_CHANNEL_LEADERBOARDS = 0x16, + CON_CHANNEL_LIVE = 0x17, + CON_CHANNEL_PARSERSCRIPT = 0x18, + CON_CHANNEL_SCRIPT = 0x19, + CON_CHANNEL_SPAWNSYSTEM = 0x1A, + CON_CHANNEL_COOPINFO = 0x1B, + CON_CHANNEL_SERVERDEMO = 0x1C, + CON_CHANNEL_DDL = 0x1D, + CON_CHANNEL_NETWORK = 0x1E, + CON_CHANNEL_SCHEDULER = 0x1F, + CON_FIRST_DEBUG_CHANNEL = 0x1F, + CON_CHANNEL_TASK = 0x20, + CON_CHANNEL_SPU = 0x21, + + CON_BUILTIN_CHANNEL_COUNT = 0x22, + }; + + namespace sp + { + struct ObjectInfo + { + unsigned __int16 refCount; + unsigned __int16 size; + }; + + union VariableValueInternal_u + { + VariableUnion u; + ObjectInfo o; + }; + + struct VariableValueInternal + { + unsigned int id; + VariableValueInternal_u u; + VariableValueInternal_w w; + char __pad1[2]; + unsigned __int16 nextSibling; + }; + + static_assert(sizeof(VariableValueInternal) == 16); + static_assert(offsetof(VariableValueInternal, nextSibling) == 14); + static_assert(offsetof(VariableValueInternal, u) == 4); + static_assert(offsetof(VariableValueInternal, w) == 8); + } + + namespace mp + { + struct VariableValueInternal + { + Variable hash; + VariableValueInternal_u u; + VariableValueInternal_w w; + VariableValueInternal_v v; + unsigned int nextSibling; + }; + } + + union scrVarGlob_t + { + sp::VariableValueInternal* variableList_sp; + mp::VariableValueInternal* variableList_mp; + }; + + struct scr_classStruct_t + { + unsigned __int16 id; + unsigned __int16 entArrayId; + char charId; + const char* name; + }; + + enum gclientFlag + { + NOCLIP = 1 << 0, + UFO = 1 << 1, + }; + + enum entityFlag + { + FL_GODMODE = 1 << 0, + FL_DEMI_GODMODE = 1 << 1, + FL_NOTARGET = 1 << 2, + FL_SUPPORTS_LINKTO = 1 << 12, + }; // TODO: Finish + + struct gclient_s + { + char __pad0[0x18]; + int eflags; + char __pad1[0x5668]; + int flags; + }; + + struct gentity_s + { + int number; + char __pad0[0x150]; + gclient_s* client; // 340 + char __pad1[0x30]; + int flags; // 392 + char __pad2[0x190]; + }; + + static_assert(sizeof(gentity_s) == 0x31C); + + enum clientState_t + { + CS_FREE, + CS_ZOMBIE, + CS_RECONNECTING, + CS_CONNECTED, + CS_CLIENTLOADING, + CS_ACTIVE, + }; + + enum netsrc_t + { + NS_CLIENT1 = 0x0, + NS_CLIENT2 = 0x1, + NS_CLIENT3 = 0x2, + NS_CLIENT4 = 0x3, + NS_SERVER = 0x4, + NS_PACKET = 0x5, + NS_NULL = -1, + }; + + enum netadrtype_t + { + NA_BOT = 0x0, + NA_BAD = 0x1, + NA_LOOPBACK = 0x2, + NA_BROADCAST = 0x3, + NA_IP = 0x4, + }; + + struct netadr_t + { + union + { + unsigned char ip[4]; + unsigned int inaddr; + }; + unsigned __int16 port; + netadrtype_t type; + netsrc_t localNetID; + unsigned __int16 serverID; + }; + + static_assert(sizeof(netadr_t) == 0x14); + + struct netProfileInfo_t + { + unsigned char __pad0[0x5E0]; + }; + + struct netchan_t + { + int outgoingSequence; + netsrc_t sock; + int dropped; + int incomingSequence; + netadr_t remoteAddress; + int qport; + int fragmentSequence; + int fragmentLength; + unsigned char* fragmentBuffer; + int fragmentBufferSize; + int unsentFragments; + int unsentOnLoan; + int unsentFragmentStart; + int unsentLength; + unsigned char* unsentBuffer; + int unsentBufferSize; + int reliable_fragments; + unsigned char fragment_send_count[128]; + unsigned int fragment_ack[4]; + int lowest_send_count; + netProfileInfo_t prof; + }; + + static_assert(sizeof(netchan_t) == 0x6C8); + + struct PredictedVehicleDef + { + bool fullPhysics; + vec3_t origin; + vec3_t angles; + vec3_t tVel; + vec3_t aVel; + int serverTime; + }; + + static_assert(sizeof(PredictedVehicleDef) == 0x38); + + struct clientHeader_t + { + clientState_t state; + int sendAsActive; + int deltaMessage; + int rateDelayed; + int hasAckedBaselineData; + int hugeSnapshotSent; + netchan_t netchan; + vec3_t predictedOrigin; + int predictedOriginServerTime; + int migrationState; + PredictedVehicleDef predictedVehicle; + }; + + static_assert(sizeof(clientHeader_t) == 0x72C); + + struct client_s + { + clientHeader_t header; + const char* dropReason; + char userinfo[1024]; + unsigned char __pad0[0x3F75C]; + int bIsTestClient; + unsigned char __pad1[0xDEF0]; + }; + + static_assert(sizeof(client_s) == 0x4E180); + + struct cmd_function_t + { + cmd_function_t* next; + const char* name; + const char* autoCompleteDir; + const char* autoCompleteExt; + void(__cdecl* function)(); + int flags; + }; + + struct CmdArgs + { + int nesting; + int localClientNum[8]; + int controllerIndex[8]; + void* itemDef[8]; + int argshift[8]; + int argc[8]; + const char** argv[8]; + char textPool[8192]; + const char* argvPool[512]; + int usedTextPool[8]; + int totalUsedArgvPool; + int totalUsedTextPool; + }; + + enum dvarType_t + { + DVAR_TYPE_INVALID = 0x0, + DVAR_TYPE_BOOL = 0x1, + DVAR_TYPE_FLOAT = 0x2, + DVAR_TYPE_FLOAT_2 = 0x3, + DVAR_TYPE_FLOAT_3 = 0x4, + DVAR_TYPE_FLOAT_4 = 0x5, + DVAR_TYPE_INT = 0x6, + DVAR_TYPE_ENUM = 0x7, + DVAR_TYPE_STRING = 0x8, + DVAR_TYPE_COLOR = 0x9, + DVAR_TYPE_INT64 = 0xA, + DVAR_TYPE_LINEAR_COLOR_RGB = 0xB, + DVAR_TYPE_COLOR_XYZ = 0xC, + DVAR_TYPE_COUNT = 0xD, + }; + + union DvarValue + { + bool enabled; + int integer; + unsigned int unsignedInt; + __int64 integer64; + unsigned __int64 unsignedInt64; + float value; + vec4_t vector; + const char* string; + char color[4]; + }; + + struct $A37BA207B3DDD6345C554D4661813EDD + { + int stringCount; + const char* const* strings; + }; + + struct $9CA192F9DB66A3CB7E01DE78A0DEA53D + { + int min; + int max; + }; + + struct $251C2428A496074035CACA7AAF3D55BD + { + float min; + float max; + }; + + struct DvarLimits_integer64 + { + __int64 min; + __int64 max; + }; + + union DvarLimits + { + $A37BA207B3DDD6345C554D4661813EDD enumeration; + $9CA192F9DB66A3CB7E01DE78A0DEA53D integer; + $251C2428A496074035CACA7AAF3D55BD value; + $251C2428A496074035CACA7AAF3D55BD vector; + DvarLimits_integer64 integer64; + }; + + struct dvar_t + { + const char* name; + const char* description; + int hash; + unsigned int flags; + dvarType_t type; + bool modified; + bool loadedFromSaveGame; + DvarValue current; + DvarValue latched; + DvarValue saved; + DvarValue reset; + DvarLimits domain; + dvar_t* hashNext; + }; + + static_assert(offsetof(dvar_t, hashNext) == 104); + static_assert(offsetof(dvar_t, current) == 24); + + struct GSC_OBJ + { + char magic[8]; + unsigned int source_crc; + unsigned int include_offset; + unsigned int animtree_offset; + unsigned int cseg_offset; + unsigned int stringtablefixup_offset; + unsigned int exports_offset; + unsigned int imports_offset; + unsigned int fixup_offset; + unsigned int profile_offset; + unsigned int cseg_size; + unsigned __int16 name; + unsigned __int16 stringtablefixup_count; + unsigned __int16 exports_count; + unsigned __int16 imports_count; + unsigned __int16 fixup_count; + unsigned __int16 profile_count; + char include_count; + char animtree_count; + char flags; + }; + + struct GSC_EXPORT_ITEM + { + unsigned int checksum; + unsigned int address; + unsigned __int16 name; + char param_count; + char flags; + }; + + // gsc-tool + enum class opcode : std::uint8_t + { + OP_End = 0x0, + OP_Return = 0x1, + OP_GetUndefined = 0x2, + OP_GetZero = 0x3, + OP_GetByte = 0x4, + OP_GetNegByte = 0x5, + OP_GetUnsignedShort = 0x6, + OP_GetNegUnsignedShort = 0x7, + OP_GetInteger = 0x8, + OP_GetFloat = 0x9, + OP_GetString = 0xA, + OP_GetIString = 0xB, + OP_GetVector = 0xC, + OP_GetLevelObject = 0xD, + OP_GetAnimObject = 0xE, + OP_GetSelf = 0xF, + OP_GetLevel = 0x10, + OP_GetGame = 0x11, + OP_GetAnim = 0x12, + OP_GetAnimation = 0x13, + OP_GetGameRef = 0x14, + OP_GetFunction = 0x15, + OP_CreateLocalVariable = 0x16, + OP_SafeCreateLocalVariables = 0x17, + OP_RemoveLocalVariables = 0x18, + OP_EvalLocalVariableCached = 0x19, + OP_EvalArray = 0x1A, + OP_EvalLocalArrayRefCached = 0x1B, + OP_EvalArrayRef = 0x1C, + OP_ClearArray = 0x1D, + OP_EmptyArray = 0x1E, + OP_GetSelfObject = 0x1F, + OP_EvalFieldVariable = 0x20, + OP_EvalFieldVariableRef = 0x21, + OP_ClearFieldVariable = 0x22, + OP_SafeSetVariableFieldCached = 0x23, + OP_SafeSetWaittillVariableFieldCached = 0x24, + OP_ClearParams = 0x25, + OP_CheckClearParams = 0x26, + OP_EvalLocalVariableRefCached = 0x27, + OP_SetVariableField = 0x28, + OP_CallBuiltin = 0x29, + OP_CallBuiltinMethod = 0x2A, + OP_Wait = 0x2B, + OP_WaitTillFrameEnd = 0x2C, + OP_PreScriptCall = 0x2D, + OP_ScriptFunctionCall = 0x2E, + OP_ScriptFunctionCallPointer = 0x2F, + OP_ScriptMethodCall = 0x30, + OP_ScriptMethodCallPointer = 0x31, + OP_ScriptThreadCall = 0x32, + OP_ScriptThreadCallPointer = 0x33, + OP_ScriptMethodThreadCall = 0x34, + OP_ScriptMethodThreadCallPointer = 0x35, + OP_DecTop = 0x36, + OP_CastFieldObject = 0x37, + OP_CastBool = 0x38, + OP_BoolNot = 0x39, + OP_BoolComplement = 0x3A, + OP_JumpOnFalse = 0x3B, + OP_JumpOnTrue = 0x3C, + OP_JumpOnFalseExpr = 0x3D, + OP_JumpOnTrueExpr = 0x3E, + OP_Jump = 0x3F, + OP_JumpBack = 0x40, + OP_Inc = 0x41, + OP_Dec = 0x42, + OP_Bit_Or = 0x43, + OP_Bit_Xor = 0x44, + OP_Bit_And = 0x45, + OP_Equal = 0x46, + OP_NotEqual = 0x47, + OP_LessThan = 0x48, + OP_GreaterThan = 0x49, + OP_LessThanOrEqualTo = 0x4A, + OP_GreaterThanOrEqualTo = 0x4B, + OP_ShiftLeft = 0x4C, + OP_ShiftRight = 0x4D, + OP_Plus = 0x4E, + OP_Minus = 0x4F, + OP_Multiply = 0x50, + OP_Divide = 0x51, + OP_Modulus = 0x52, + OP_SizeOf = 0x53, + OP_WaitTillMatch = 0x54, + OP_WaitTill = 0x55, + OP_Notify = 0x56, + OP_EndOn = 0x57, + OP_VoidCodePos = 0x58, + OP_Switch = 0x59, + OP_EndSwitch = 0x5A, + OP_Vector = 0x5B, + OP_GetHash = 0x5C, + OP_RealWait = 0x5D, + OP_VectorConstant = 0x5E, + OP_IsDefined = 0x5F, + OP_VectorScale = 0x60, + OP_AnglesToUp = 0x61, + OP_AnglesToRight = 0x62, + OP_AnglesToForward = 0x63, + OP_AngleClamp180 = 0x64, + OP_VectorToAngles = 0x65, + OP_Abs = 0x66, + OP_GetTime = 0x67, + OP_GetDvar = 0x68, + OP_GetDvarInt = 0x69, + OP_GetDvarFloat = 0x6A, + OP_GetDvarVector = 0x6B, + OP_GetDvarColorRed = 0x6C, + OP_GetDvarColorGreen = 0x6D, + OP_GetDvarColorBlue = 0x6E, + OP_GetDvarColorAlpha = 0x6F, + OP_FirstArrayKey = 0x70, + OP_NextArrayKey = 0x71, + OP_ProfileStart = 0x72, + OP_ProfileStop = 0x73, + OP_SafeDecTop = 0x74, + OP_Nop = 0x75, + OP_Abort = 0x76, + OP_Object = 0x77, + OP_ThreadObject = 0x78, + OP_EvalLocalVariable = 0x79, + OP_EvalLocalVariableRef = 0x7A, + OP_DevblockBegin = 0x7B, + OP_DevblockEnd = 0x7C, + OP_Breakpoint = 0x7D, + OP_Count = 0x7E, + }; + + enum XAssetType + { + ASSET_TYPE_XMODELPIECES = 0x0, + ASSET_TYPE_PHYSPRESET = 0x1, + ASSET_TYPE_PHYSCONSTRAINTS = 0x2, + ASSET_TYPE_DESTRUCTIBLEDEF = 0x3, + ASSET_TYPE_XANIMPARTS = 0x4, + ASSET_TYPE_XMODEL = 0x5, + ASSET_TYPE_MATERIAL = 0x6, + ASSET_TYPE_TECHNIQUE_SET = 0x7, + ASSET_TYPE_IMAGE = 0x8, + ASSET_TYPE_SOUND = 0x9, + ASSET_TYPE_SOUND_PATCH = 0xA, + ASSET_TYPE_CLIPMAP = 0xB, + ASSET_TYPE_CLIPMAP_PVS = 0xC, + ASSET_TYPE_COMWORLD = 0xD, + ASSET_TYPE_GAMEWORLD_SP = 0xE, + ASSET_TYPE_GAMEWORLD_MP = 0xF, + ASSET_TYPE_MAP_ENTS = 0x10, + ASSET_TYPE_GFXWORLD = 0x11, + ASSET_TYPE_LIGHT_DEF = 0x12, + ASSET_TYPE_UI_MAP = 0x13, + ASSET_TYPE_FONT = 0x14, + ASSET_TYPE_FONTICON = 0x15, + ASSET_TYPE_MENULIST = 0x16, + ASSET_TYPE_MENU = 0x17, + ASSET_TYPE_LOCALIZE_ENTRY = 0x18, + ASSET_TYPE_WEAPON = 0x19, + ASSET_TYPE_WEAPONDEF = 0x1A, + ASSET_TYPE_WEAPON_VARIANT = 0x1B, + ASSET_TYPE_WEAPON_FULL = 0x1C, + ASSET_TYPE_ATTACHMENT = 0x1D, + ASSET_TYPE_ATTACHMENT_UNIQUE = 0x1E, + ASSET_TYPE_WEAPON_CAMO = 0x1F, + ASSET_TYPE_SNDDRIVER_GLOBALS = 0x20, + ASSET_TYPE_FX = 0x21, + ASSET_TYPE_IMPACT_FX = 0x22, + ASSET_TYPE_AITYPE = 0x23, + ASSET_TYPE_MPTYPE = 0x24, + ASSET_TYPE_MPBODY = 0x25, + ASSET_TYPE_MPHEAD = 0x26, + ASSET_TYPE_CHARACTER = 0x27, + ASSET_TYPE_XMODELALIAS = 0x28, + ASSET_TYPE_RAWFILE = 0x29, + ASSET_TYPE_STRINGTABLE = 0x2A, + ASSET_TYPE_LEADERBOARD = 0x2B, + ASSET_TYPE_XGLOBALS = 0x2C, + ASSET_TYPE_DDL = 0x2D, + ASSET_TYPE_GLASSES = 0x2E, + ASSET_TYPE_EMBLEMSET = 0x2F, + ASSET_TYPE_SCRIPTPARSETREE = 0x30, + ASSET_TYPE_KEYVALUEPAIRS = 0x31, + ASSET_TYPE_VEHICLEDEF = 0x32, + ASSET_TYPE_MEMORYBLOCK = 0x33, + ASSET_TYPE_ADDON_MAP_ENTS = 0x34, + ASSET_TYPE_TRACER = 0x35, + ASSET_TYPE_SKINNEDVERTS = 0x36, + ASSET_TYPE_QDB = 0x37, + ASSET_TYPE_SLUG = 0x38, + ASSET_TYPE_FOOTSTEP_TABLE = 0x39, + ASSET_TYPE_FOOTSTEPFX_TABLE = 0x3A, + ASSET_TYPE_ZBARRIER = 0x3B, + ASSET_TYPE_COUNT = 0x3C, + ASSET_TYPE_STRING = 0x3C, + ASSET_TYPE_ASSETLIST = 0x3D, + ASSET_TYPE_REPORT = 0x3E, + ASSET_TYPE_DEPEND = 0x3F, + ASSET_TYPE_FULL_COUNT = 0x40, + }; + + struct ScriptParseTree + { + const char* name; + int len; + GSC_OBJ* obj; + }; + + struct objFileInfo_t + { + GSC_OBJ* activeVersion; + char __pad[0x24]; + }; + + union XAssetHeader + { + ScriptParseTree* scriptParseTree; + }; + + union sval_u + { + unsigned __int8 type; + unsigned int stringValue; + unsigned int idValue; + float floatValue; + int intValue; + sval_u* node; + unsigned int sourcePosValue; + const char* codePosValue; + const char* debugString; + void* block; + }; + +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/game/symbols.hpp b/t5/plugins/tws-t5-gsc-utils/src/game/symbols.hpp new file mode 100644 index 0000000..822083c --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/game/symbols.hpp @@ -0,0 +1,148 @@ +#pragma once + +#define WEAK __declspec(selectany) + +namespace game +{ + // Functions + + WEAK symbol BG_StringHashValue{0x0, 0x0}; + + WEAK symbol G_LogPrintf{0x69EA30, 0x5CD250}; + + WEAK symbol Cbuf_InsertText{0x0, 0x0}; + WEAK symbol Cbuf_AddText{0x49B930, 0x56EF70}; + WEAK symbol Cmd_ExecuteSingleCommand{0x619D00, 0x50B470}; + WEAK symbol Cmd_AddCommandInternal{0x661400, 0x6AD580}; + WEAK symbol Cmd_Argv{0x0, 0x0}; + WEAK symbol Cmd_RemoveCommand{0x5F1A90, 0x527EA0}; + + WEAK symbol Com_Error{0x651D90, 0x627380}; + WEAK symbol Com_Printf{0x43BF30, 0x4126C0}; + WEAK symbol Com_Printf_NoFilter{0x566BC0, 0x64C260}; + WEAK symbol Com_PrintWarning{0x51CE50, 0x54B6A0}; + + WEAK symbol Dvar_FindVar{0x5AE810, 0x512F70}; + WEAK symbol Dvar_GetInt{0x0, 0x0}; + WEAK symbol Dvar_RegisterInt{0x0, 0x0}; + WEAK symbol Dvar_InfoString{0x613060, 0x54A8B0}; + + WEAK symbol DB_FindXAssetHeader{0x0, 0x0}; + + WEAK symbol I_CleanStr{0x0, 0x0}; + WEAK symbol I_strncpyz{0x5D4D60, 0x5A7140}; + + WEAK symbol Player_GetMethod{0x0, 0x0}; + WEAK symbol Scr_GetCommonFunction{0x0, 0x0}; + WEAK symbol Scr_GetMethod{0x0, 0x0}; + + WEAK symbol Scr_AddEntity{0x0, 0x0}; + WEAK symbol Scr_AddFloat{0x0, 0x0}; + WEAK symbol Scr_AddInt{0x0, 0x0}; + WEAK symbol Scr_AddString{0x0, 0x0}; + WEAK symbol Scr_AddVector{0x0, 0x0}; + WEAK symbol Scr_AddObject{0x0, 0x0}; + + WEAK symbol Scr_ClearOutParams{0x654D10, 0x588680}; + + WEAK symbol AllocObject{0x603400, 0x6970B0}; + WEAK symbol AllocThread{0x69E140, 0x43CA60}; + WEAK symbol RemoveRefToObject{0x5517B0, 0x698FA0}; + WEAK symbol RemoveRefToVector{0x0, 0x0}; + WEAK symbol AddRefToValue_{0x53FD50, 0x6706B0}; + + namespace mp + { + WEAK symbol RemoveRefToValue{0x0, 0x4249C0}; + } + + namespace sp + { + WEAK symbol RemoveRefToValue{0x556830, 0x0}; + } + + WEAK symbol RemoveVariableValue{0x0, 0x0}; + + WEAK symbol FindVariable{0x476720, 0x5DF7E0}; + WEAK symbol FindArrayVariable{0x62F8E0, 0x509230}; + WEAK symbol GetVariable{0x0, 0x0}; + WEAK symbol GetNewVariable{0x674820, 0x5B3750}; + WEAK symbol GetNewArrayVariable{0x689C60, 0x468BC0}; + + WEAK symbol Scr_SetObjectField{0x0, 0x0}; + WEAK symbol GetEntityFieldValue{0x0, 0x0}; + + WEAK symbol Scr_Notify{0x0, 0x0}; + WEAK symbol Scr_NotifyNum_Internal{0x41D270, 0x4162E0}; + WEAK symbol Scr_NotifyNum{0x0, 0x0}; + + WEAK symbol SL_GetString{0x463130, 0x4B1770}; + WEAK symbol SL_ConvertToString{0x687530, 0x624C70}; + WEAK symbol SL_GetCanonicalString{0x4FB120, 0x68D860}; + + WEAK symbol Scr_GetNumParam{0x0, 0x0}; + WEAK symbol Scr_GetEntity{0x0, 0x0}; + WEAK symbol Scr_GetFloat{0x0, 0x0}; + WEAK symbol Scr_GetInt{0x0, 0x0}; + WEAK symbol Scr_GetString{0x0, 0x0}; + WEAK symbol Scr_GetVector{0x0, 0x0}; + WEAK symbol Scr_AllocVector{0x41B400, 0x4C4440}; + WEAK symbol Scr_GetFunctionHandle{0x0, 0x0}; + WEAK symbol Scr_AddClassField{0x0, 0x0}; + WEAK symbol Scr_GetEntityId{0x4B7050, 0x6A07D0}; + WEAK symbol GetStartLocalId{0x0, 0x0}; + WEAK symbol Scr_TerminateRunningThread{0x0, 0x0}; + WEAK symbol Scr_Error{0x4B5940, 0x6245E0}; + WEAK symbol Scr_ParamError{0x0, 0x0}; + WEAK symbol Scr_ObjectError{0x0, 0x0}; + WEAK symbol Scr_GetEntityIdRef{0x433B60, 0x6A53C0}; + WEAK symbol Scr_AllocArray{0x438800, 0x5B8400}; + + WEAK symbol GetPlayerEntity{0x0, 0x0}; + + WEAK symbol VM_Execute{0x8ACE60, 0x8EADE0}; + + WEAK symbol SV_GetUserinfo{0x50DCD0, 0x6916A0}; + WEAK symbol SV_GameDropClient{0x0, 0x0}; + WEAK symbol SV_IsTestClient{0x0, 0x0}; + WEAK symbol SV_GameSendServerCommand{0x543CF0, 0x6B8730}; + + WEAK symbol ClientDisconnect{0x4F4000, 0x66FA00}; + WEAK symbol ClientUserinfoChanged{0x67FFC0, 0x548D80}; + + WEAK symbol Sys_GetValue{0x67D4F0, 0x529EB0}; + WEAK symbol Sys_Milliseconds{0x0, 0x0}; + + WEAK symbol FS_FOpenFileByMode{0x4DD530, 0x40C790}; + WEAK symbol FS_FCloseFile{0x46CAA0, 0x533020}; + + WEAK symbol longjmp{0x96B980, 0x9D05C4}; + WEAK symbol _setjmp{0x969EAC, 0x9CED5C}; + + // Variables + + WEAK symbol g_script_error_level{0x32D1E18, 0x3DD4A18}; + WEAK symbol g_script_error{0x32D0D98, 0x3DD3998}; + + WEAK symbol scr_VmPub{0x32C8738, 0x3DCB338}; + WEAK symbol scr_VarGlob{0x32C8580, 0x3DCB180}; + WEAK symbol scr_VarPub{0x32C8680, 0x3DCB280}; + WEAK symbol scr_starttime{0x0, 0x0}; + WEAK symbol fs{0x0, 0x0}; + + WEAK symbol sv_configstrings{0x0, 0x0}; + + WEAK symbol g_classMap{0x0, 0x0}; + + WEAK symbol g_entities{0x0, 0x0}; + WEAK symbol levelEntityId{0x32C86A0, 0x3DCB2A0}; + + WEAK symbol svs_clients{0x0, 0x0}; + + WEAK symbol sv_cmd_args{0x243D208, 0x355BD88}; + + WEAK symbol logFile{0x1C0417C, 0x3443838}; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/loader/component_interface.hpp b/t5/plugins/tws-t5-gsc-utils/src/loader/component_interface.hpp new file mode 100644 index 0000000..2f5b7c6 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/loader/component_interface.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "../plugin.hpp" + +class component_interface +{ +public: + virtual ~component_interface() + { + } + + virtual void on_startup([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_dvar_init([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_after_dvar_init([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_game_init([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_shutdown([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual bool is_supported() + { + return true; + } +}; diff --git a/t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.cpp b/t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.cpp new file mode 100644 index 0000000..0b4c7ce --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.cpp @@ -0,0 +1,72 @@ +#include +#include "component_loader.hpp" + +void component_loader::register_component(const std::string& name, std::unique_ptr&& component_) +{ + get_components().push_back(std::make_pair(name, std::move(component_))); +} + +#define ON_CALLBACK(__name__) \ + void component_loader::__name__() \ + { \ + static auto handled = false; \ + if (handled) \ + { \ + return; \ + } \ + \ + handled = true; \ + \ + for (const auto& component_ : get_components()) \ + { \ + try \ + { \ + component_.second->__name__(plugin::get()); \ + } \ + catch (const std::exception& e) \ + { \ + printf("error executing component \"%s\" callback \"%s\": %s\n", component_.first.data(), #__name__, e.what()); \ + } \ + } \ + } \ + +ON_CALLBACK(on_startup); +ON_CALLBACK(on_dvar_init); +ON_CALLBACK(on_after_dvar_init); +ON_CALLBACK(on_shutdown); + +void component_loader::clean() +{ + auto& components = get_components(); + for (auto i = components.begin(); i != components.end();) + { + if (!(*i).second->is_supported()) + { + (*i).second->on_shutdown(plugin::get()); + i = components.erase(i); + } + else + { + ++i; + } + } +} + +void component_loader::trigger_premature_shutdown() +{ + throw premature_shutdown_trigger(); +} + +std::vector>>& component_loader::get_components() +{ + using component_vector = std::vector>>; + using component_vector_container = std::unique_ptr>; + + static component_vector_container components(new component_vector, [](component_vector* component_vector) + { + on_shutdown(); + delete component_vector; + }); + + return *components; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.hpp b/t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.hpp new file mode 100644 index 0000000..0444283 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/loader/component_loader.hpp @@ -0,0 +1,59 @@ +#pragma once +#include "component_interface.hpp" + +class component_loader final +{ +public: + class premature_shutdown_trigger final : public std::exception + { + [[nodiscard]] const char* what() const noexcept override + { + return "Premature shutdown requested"; + } + }; + + template + class installer final + { + static_assert(std::is_base_of::value, "component has invalid base class"); + + public: + installer(const std::string& name) + { + register_component(name, std::make_unique()); + } + }; + + template + static T* get() + { + for (const auto& component_ : get_components()) + { + if (typeid(*component_.get()) == typeid(T)) + { + return reinterpret_cast(component_.get()); + } + } + + return nullptr; + } + + static void register_component(const std::string& name, std::unique_ptr&& component); + + static void on_startup(); + static void on_dvar_init(); + static void on_after_dvar_init(); + static void on_shutdown(); + static void clean(); + + static void trigger_premature_shutdown(); + +private: + static std::vector>>& get_components(); +}; + +#define REGISTER_COMPONENT(name) \ +namespace \ +{ \ + static component_loader::installer __component(#name); \ +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/plugin.cpp b/t5/plugins/tws-t5-gsc-utils/src/plugin.cpp new file mode 100644 index 0000000..d320578 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/plugin.cpp @@ -0,0 +1,75 @@ +#include +#include "loader/component_loader.hpp" + +#include "plugin.hpp" + +#include +#include + +namespace plugin +{ + namespace + { + void printf_stub(const char* fmt, ...) + { + char buffer[0x2000] = {}; + + va_list ap; + va_start(ap, fmt); + + vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, fmt, ap); + + va_end(ap); + + const auto trimmed = utils::string::trim(buffer); + get()->get_interface()->logging()->info(trimmed); + } + } + + std::uint32_t plugin::plugin_version() + { + return 1; + } + + const char* plugin::plugin_name() + { + return "tws-t5-gsc-utils"; + } + + bool plugin::is_game_supported([[maybe_unused]] plutonium::sdk::game game) + { + return game == plutonium::sdk::game::t5; + } + + void plugin::on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) + { + this->interface_ = interface_ptr; + this->game_ = game; + utils::hook::jump(reinterpret_cast(&printf), printf_stub); + + component_loader::on_startup(); + interface_ptr->callbacks()->on_dvar_init(&component_loader::on_dvar_init); + interface_ptr->callbacks()->on_after_dvar_init(&component_loader::on_after_dvar_init); + } + + void plugin::on_shutdown() + { + component_loader::on_shutdown(); + } + + plutonium::sdk::iinterface* plugin::get_interface() + { + return this->interface_; + } + + plutonium::sdk::game plugin::get_game() + { + return this->game_; + } + + plugin* get() + { + static plugin instance; + return &instance; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/plugin.hpp b/t5/plugins/tws-t5-gsc-utils/src/plugin.hpp new file mode 100644 index 0000000..3d18d09 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/plugin.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +namespace plugin +{ + class plugin : public plutonium::sdk::plugin + { + public: + ~plugin() = default; + + std::uint32_t plugin_version() override; + const char* plugin_name() override; + + bool is_game_supported([[maybe_unused]] plutonium::sdk::game game) override; + + void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override; + void on_shutdown() override; + + plutonium::sdk::iinterface* get_interface(); + plutonium::sdk::game get_game(); + + private: + plutonium::sdk::iinterface* interface_{}; + plutonium::sdk::game game_{}; + + }; + + plugin* get(); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/resource.hpp b/t5/plugins/tws-t5-gsc-utils/src/resource.hpp new file mode 100644 index 0000000..beabe45 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/resource.hpp @@ -0,0 +1,3 @@ +#pragma once + +#define LIBMYSQL_DLL 100 diff --git a/t5/plugins/tws-t5-gsc-utils/src/resource.rc b/t5/plugins/tws-t5-gsc-utils/src/resource.rc new file mode 100644 index 0000000..335da49 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/resource.rc @@ -0,0 +1,3 @@ +#include "resource.hpp" + +LIBMYSQL_DLL RCDATA "../../deps/mysql/lib/libmysql.dll" diff --git a/t5/plugins/tws-t5-gsc-utils/src/stdinc.cpp b/t5/plugins/tws-t5-gsc-utils/src/stdinc.cpp new file mode 100644 index 0000000..49e54fa --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/stdinc.cpp @@ -0,0 +1,24 @@ +#include + +extern "C" +{ + int s_read_arc4random(void*, size_t) + { + return -1; + } + + int s_read_getrandom(void*, size_t) + { + return -1; + } + + int s_read_urandom(void*, size_t) + { + return -1; + } + + int s_read_ltm_rng(void*, size_t) + { + return -1; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/stdinc.hpp b/t5/plugins/tws-t5-gsc-utils/src/stdinc.hpp new file mode 100644 index 0000000..7d898a4 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/stdinc.hpp @@ -0,0 +1,60 @@ +#pragma once + +#pragma warning(disable: 6011) +#pragma warning(disable: 6054) +#pragma warning(disable: 6387) +#pragma warning(disable: 26451) +#pragma warning(disable: 26812) +#pragma warning(disable: 28182) + +#define DLL_EXPORT extern "C" __declspec(dllexport) +#define WIN32_LEAN_AND_MEAN +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#include +#include + +#include + +#include +#include + +#pragma comment(lib, "ntdll.lib") +#pragma comment(lib, "ws2_32.lib") +#pragma comment(lib, "urlmon.lib" ) +#pragma comment(lib, "iphlpapi.lib") +#pragma comment(lib, "Crypt32.lib") +#pragma comment(lib, "libmysql.lib") +#pragma comment(lib, "delayimp.lib") + +#include "resource.hpp" + +using namespace std::literals; \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.cpp new file mode 100644 index 0000000..4eb5e6c --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.cpp @@ -0,0 +1,76 @@ +#include +#include "binary_resource.hpp" + +#include +#include "nt.hpp" +#include "io.hpp" + +namespace utils +{ + namespace + { + std::string get_temp_folder() + { + char path[MAX_PATH] = {0}; + if (!GetTempPathA(sizeof(path), path)) + { + throw std::runtime_error("Unable to get temp path"); + } + + return path; + } + + std::string write_exitisting_temp_file(const std::string& file, const std::string& data, + const bool fatal_if_overwrite_fails) + { + const auto temp = get_temp_folder(); + auto file_path = temp + file; + + std::string current_data; + if (!io::read_file(file_path, ¤t_data)) + { + if (!io::write_file(file_path, data)) + { + throw std::runtime_error("Failed to write file: " + file_path); + } + + return file_path; + } + + if (current_data == data || io::write_file(file_path, data) || !fatal_if_overwrite_fails) + { + return file_path; + } + + throw std::runtime_error( + "Temporary file was already written, but differs. It can't be overwritten as it's still in use: " + + file_path); + } + } + + binary_resource::binary_resource(const int id, std::string file) + : filename_(std::move(file)) + { + this->resource_ = nt::load_resource(id); + + if (this->resource_.empty()) + { + throw std::runtime_error("Unable to load resource: " + std::to_string(id)); + } + } + + std::string binary_resource::get_extracted_file(const bool fatal_if_overwrite_fails) + { + if (this->path_.empty()) + { + this->path_ = write_exitisting_temp_file(this->filename_, this->resource_, fatal_if_overwrite_fails); + } + + return this->path_; + } + + const std::string& binary_resource::get_data() const + { + return this->resource_; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.hpp new file mode 100644 index 0000000..da19af1 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/binary_resource.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +namespace utils +{ + class binary_resource + { + public: + binary_resource(int id, std::string file); + + std::string get_extracted_file(bool fatal_if_overwrite_fails = false); + const std::string& get_data() const; + + private: + std::string resource_; + std::string filename_; + std::string path_; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/compression.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/compression.cpp new file mode 100644 index 0000000..3a6b9e2 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/compression.cpp @@ -0,0 +1,170 @@ +#include +#include "memory.hpp" +#include "compression.hpp" + +#include +#include + +#include + +#include "io.hpp" + +namespace utils::compression +{ + namespace zlib + { + namespace + { + class zlib_stream + { + public: + zlib_stream() + { + memset(&stream_, 0, sizeof(stream_)); + valid_ = inflateInit(&stream_) == Z_OK; + } + + zlib_stream(zlib_stream&&) = delete; + zlib_stream(const zlib_stream&) = delete; + zlib_stream& operator=(zlib_stream&&) = delete; + zlib_stream& operator=(const zlib_stream&) = delete; + + ~zlib_stream() + { + if (valid_) + { + inflateEnd(&stream_); + } + } + + z_stream& get() + { + return stream_; // + } + + bool is_valid() const + { + return valid_; + } + + private: + bool valid_{false}; + z_stream stream_{}; + }; + } + + std::string decompress(const std::string& data) + { + std::string buffer{}; + zlib_stream stream_container{}; + if (!stream_container.is_valid()) + { + return {}; + } + + int ret{}; + size_t offset = 0; + static thread_local uint8_t dest[CHUNK] = {0}; + auto& stream = stream_container.get(); + + do + { + const auto input_size = std::min(sizeof(dest), data.size() - offset); + stream.avail_in = static_cast(input_size); + stream.next_in = reinterpret_cast(data.data()) + offset; + offset += stream.avail_in; + + do + { + stream.avail_out = sizeof(dest); + stream.next_out = dest; + + ret = inflate(&stream, Z_NO_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) + { + return {}; + } + + buffer.insert(buffer.end(), dest, dest + sizeof(dest) - stream.avail_out); + } + while (stream.avail_out == 0); + } + while (ret != Z_STREAM_END); + + return buffer; + } + + std::string compress(const std::string& data) + { + std::string result{}; + auto length = compressBound(static_cast(data.size())); + result.resize(length); + + if (compress2(reinterpret_cast(result.data()), &length, + reinterpret_cast(data.data()), static_cast(data.size()), + Z_BEST_COMPRESSION) != Z_OK) + { + return {}; + } + + result.resize(length); + return result; + } + } + + namespace zip + { + namespace + { + bool add_file(zipFile& zip_file, const std::string& filename, const std::string& data) + { + const auto zip_64 = data.size() > 0xffffffff ? 1 : 0; + if (ZIP_OK != zipOpenNewFileInZip64(zip_file, filename.data(), nullptr, nullptr, 0, nullptr, 0, nullptr, + Z_DEFLATED, Z_BEST_COMPRESSION, zip_64)) + { + return false; + } + + const auto _ = gsl::finally([&zip_file]() + { + zipCloseFileInZip(zip_file); + }); + + return ZIP_OK == zipWriteInFileInZip(zip_file, data.data(), static_cast(data.size())); + } + } + + void archive::add(std::string filename, std::string data) + { + this->files_[std::move(filename)] = std::move(data); + } + + bool archive::write(const std::string& filename, const std::string& comment) + { + // Hack to create the directory :3 + io::write_file(filename, {}); + io::remove_file(filename); + + auto* zip_file = zipOpen64(filename.data(), 0); + if (!zip_file) + { + return false; + } + + const auto _ = gsl::finally([&zip_file, &comment]() + { + zipClose(zip_file, comment.empty() ? nullptr : comment.data()); + }); + + for (const auto& file : this->files_) + { + if (!add_file(zip_file, file.first, file.second)) + { + return false; + } + } + + return true; + } + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/compression.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/compression.hpp new file mode 100644 index 0000000..dfe36ad --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/compression.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +#define CHUNK 16384u + +namespace utils::compression +{ + namespace zlib + { + std::string compress(const std::string& data); + std::string decompress(const std::string& data); + } + + namespace zip + { + class archive + { + public: + void add(std::string filename, std::string data); + bool write(const std::string& filename, const std::string& comment = {}); + + private: + std::unordered_map files_; + }; + } +}; diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/concurrency.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/concurrency.hpp new file mode 100644 index 0000000..05c5d3a --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/concurrency.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include + +namespace utils::concurrency +{ + template + class container + { + public: + template + R access(F&& accessor) const + { + std::lock_guard _{mutex_}; + return accessor(object_); + } + + template + R access(F&& accessor) + { + std::lock_guard _{mutex_}; + return accessor(object_); + } + + template + R access_with_lock(F&& accessor) const + { + std::unique_lock lock{mutex_}; + return accessor(object_, lock); + } + + template + R access_with_lock(F&& accessor) + { + std::unique_lock lock{mutex_}; + return accessor(object_, lock); + } + + T& get_raw() { return object_; } + const T& get_raw() const { return object_; } + + private: + mutable MutexType mutex_{}; + T object_{}; + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.cpp new file mode 100644 index 0000000..3d32ca2 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.cpp @@ -0,0 +1,691 @@ +#include + +#include "cryptography.hpp" +#include "nt.hpp" +#include + +#undef max +using namespace std::string_literals; + +/// http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-55010/Source/libtomcrypt/doc/libTomCryptDoc.pdf + +#pragma warning(push) +#pragma warning(disable: 4996) + +namespace utils::cryptography +{ + namespace + { + struct __ + { + __() + { + ltc_mp = ltm_desc; + + register_cipher(&aes_desc); + register_cipher(&des3_desc); + + register_prng(&sprng_desc); + register_prng(&fortuna_desc); + register_prng(&yarrow_desc); + + register_hash(&sha1_desc); + register_hash(&sha256_desc); + register_hash(&sha512_desc); + } + } ___; + + [[maybe_unused]] const char* cs(const uint8_t* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] char* cs(uint8_t* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] const uint8_t* cs(const char* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] uint8_t* cs(char* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] unsigned long ul(const size_t value) + { + return static_cast(value); + } + + class prng + { + public: + prng(const ltc_prng_descriptor& descriptor, const bool autoseed = true) + : state_(std::make_unique()) + , descriptor_(descriptor) + { + this->id_ = register_prng(&descriptor); + if (this->id_ == -1) + { + throw std::runtime_error("PRNG "s + this->descriptor_.name + " could not be registered!"); + } + + if (autoseed) + { + this->auto_seed(); + } + else + { + this->descriptor_.start(this->state_.get()); + } + } + + ~prng() + { + this->descriptor_.done(this->state_.get()); + } + + prng_state* get_state() const + { + this->descriptor_.ready(this->state_.get()); + return this->state_.get(); + } + + int get_id() const + { + return this->id_; + } + + void add_entropy(const void* data, const size_t length) const + { + this->descriptor_.add_entropy(static_cast(data), ul(length), this->state_.get()); + } + + void read(void* data, const size_t length) const + { + this->descriptor_.read(static_cast(data), ul(length), this->get_state()); + } + + private: + int id_; + std::unique_ptr state_; + const ltc_prng_descriptor& descriptor_; + + void auto_seed() const + { + rng_make_prng(128, this->id_, this->state_.get(), nullptr); + + int i[4]; // uninitialized data + auto* i_ptr = &i; + this->add_entropy(reinterpret_cast(&i), sizeof(i)); + this->add_entropy(reinterpret_cast(&i_ptr), sizeof(i_ptr)); + + auto t = time(nullptr); + this->add_entropy(reinterpret_cast(&t), sizeof(t)); + } + }; + + const prng prng_(fortuna_desc); + } + + ecc::key::key() + { + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + + ecc::key::~key() + { + this->free(); + } + + ecc::key::key(key&& obj) noexcept + : key() + { + this->operator=(std::move(obj)); + } + + ecc::key::key(const key& obj) + : key() + { + this->operator=(obj); + } + + ecc::key& ecc::key::operator=(key&& obj) noexcept + { + if (this != &obj) + { + std::memmove(&this->key_storage_, &obj.key_storage_, sizeof(this->key_storage_)); + ZeroMemory(&obj.key_storage_, sizeof(obj.key_storage_)); + } + + return *this; + } + + ecc::key& ecc::key::operator=(const key& obj) + { + if (this != &obj && obj.is_valid()) + { + this->deserialize(obj.serialize(obj.key_storage_.type)); + } + + return *this; + } + + bool ecc::key::is_valid() const + { + return (!memory::is_set(&this->key_storage_, 0, sizeof(this->key_storage_))); + } + + ecc_key& ecc::key::get() + { + return this->key_storage_; + } + + const ecc_key& ecc::key::get() const + { + return this->key_storage_; + } + + std::string ecc::key::get_public_key() const + { + uint8_t buffer[512] = {0}; + unsigned long length = sizeof(buffer); + + if (ecc_ansi_x963_export(&this->key_storage_, buffer, &length) == CRYPT_OK) + { + return std::string(cs(buffer), length); + } + + return {}; + } + + void ecc::key::set(const std::string& pub_key_buffer) + { + this->free(); + + if (ecc_ansi_x963_import(cs(pub_key_buffer.data()), + ul(pub_key_buffer.size()), + &this->key_storage_) != CRYPT_OK) + { + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + } + + void ecc::key::deserialize(const std::string& key) + { + this->free(); + + if (ecc_import(cs(key.data()), ul(key.size()), + &this->key_storage_) != CRYPT_OK + ) + { + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + } + + std::string ecc::key::serialize(const int type) const + { + uint8_t buffer[4096] = {0}; + unsigned long length = sizeof(buffer); + + if (ecc_export(buffer, &length, type, &this->key_storage_) == CRYPT_OK) + { + return std::string(cs(buffer), length); + } + + return ""; + } + + void ecc::key::free() + { + if (this->is_valid()) + { + ecc_free(&this->key_storage_); + } + + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + + bool ecc::key::operator==(key& key) const + { + return (this->is_valid() && key.is_valid() && this->serialize(PK_PUBLIC) == key.serialize(PK_PUBLIC)); + } + + uint64_t ecc::key::get_hash() const + { + const auto hash = sha1::compute(this->get_public_key()); + if (hash.size() >= 8) + { + return *reinterpret_cast(hash.data()); + } + + return 0; + } + + ecc::key ecc::generate_key(const int bits) + { + key key; + ecc_make_key(prng_.get_state(), prng_.get_id(), bits / 8, &key.get()); + + return key; + } + + ecc::key ecc::generate_key(const int bits, const std::string& entropy) + { + key key{}; + const prng yarrow(yarrow_desc, false); + yarrow.add_entropy(entropy.data(), entropy.size()); + + ecc_make_key(yarrow.get_state(), yarrow.get_id(), bits / 8, &key.get()); + + return key; + } + + std::string ecc::sign_message(const key& key, const std::string& message) + { + if (!key.is_valid()) return ""; + + uint8_t buffer[512]; + unsigned long length = sizeof(buffer); + + ecc_sign_hash(cs(message.data()), ul(message.size()), buffer, &length, prng_.get_state(), prng_.get_id(), + &key.get()); + + return std::string(cs(buffer), length); + } + + bool ecc::verify_message(const key& key, const std::string& message, const std::string& signature) + { + if (!key.is_valid()) return false; + + auto result = 0; + return (ecc_verify_hash(cs(signature.data()), + ul(signature.size()), + cs(message.data()), + ul(message.size()), &result, + &key.get()) == CRYPT_OK && result != 0); + } + + bool ecc::encrypt(const key& key, std::string& data) + { + std::string out_data{}; + out_data.resize(std::max(ul(data.size() * 3), ul(0x100))); + + auto out_len = ul(out_data.size()); + auto crypt = [&]() + { + return ecc_encrypt_key(cs(data.data()), ul(data.size()), cs(out_data.data()), &out_len, + prng_.get_state(), prng_.get_id(), find_hash("sha512"), &key.get()); + }; + + auto res = crypt(); + + if (res == CRYPT_BUFFER_OVERFLOW) + { + out_data.resize(out_len); + res = crypt(); + } + + if (res != CRYPT_OK) + { + return false; + } + + out_data.resize(out_len); + data = std::move(out_data); + return true; + } + + bool ecc::decrypt(const key& key, std::string& data) + { + std::string out_data{}; + out_data.resize(std::max(ul(data.size() * 3), ul(0x100))); + + auto out_len = ul(out_data.size()); + auto crypt = [&]() + { + return ecc_decrypt_key(cs(data.data()), ul(data.size()), cs(out_data.data()), &out_len, &key.get()); + }; + + auto res = crypt(); + + if (res == CRYPT_BUFFER_OVERFLOW) + { + out_data.resize(out_len); + res = crypt(); + } + + if (res != CRYPT_OK) + { + return false; + } + + out_data.resize(out_len); + data = std::move(out_data); + return true; + } + + std::string rsa::encrypt(const std::string& data, const std::string& hash, const std::string& key) + { + rsa_key new_key; + rsa_import(cs(key.data()), ul(key.size()), &new_key); + const auto _ = gsl::finally([&]() + { + rsa_free(&new_key); + }); + + + std::string out_data{}; + out_data.resize(std::max(ul(data.size() * 3), ul(0x100))); + + auto out_len = ul(out_data.size()); + auto crypt = [&]() + { + return rsa_encrypt_key_ex(cs(data.data()), ul(data.size()), cs(out_data.data()), &out_len, cs(hash.data()), + ul(hash.size()), prng_.get_state(), prng_.get_id(), find_hash("sha512"), LTC_PKCS_1_V1_5, &new_key); + }; + + auto res = crypt(); + + if (res == CRYPT_BUFFER_OVERFLOW) + { + out_data.resize(out_len); + res = crypt(); + } + + if (res == CRYPT_OK) + { + out_data.resize(out_len); + return out_data; + } + + return {}; + } + + std::string des3::encrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string enc_data; + enc_data.resize(data.size()); + + symmetric_CBC cbc; + const auto des3 = find_cipher("3des"); + + cbc_start(des3, cs(iv.data()), cs(key.data()), static_cast(key.size()), 0, &cbc); + cbc_encrypt(cs(data.data()), cs(enc_data.data()), ul(data.size()), &cbc); + cbc_done(&cbc); + + return enc_data; + } + + std::string des3::decrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string dec_data; + dec_data.resize(data.size()); + + symmetric_CBC cbc; + const auto des3 = find_cipher("3des"); + + cbc_start(des3, cs(iv.data()), cs(key.data()), static_cast(key.size()), 0, &cbc); + cbc_decrypt(cs(data.data()), cs(dec_data.data()), ul(data.size()), &cbc); + cbc_done(&cbc); + + return dec_data; + } + + std::string tiger::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string tiger::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[24] = {0}; + + hash_state state; + tiger_init(&state); + tiger_process(&state, data, ul(length)); + tiger_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + std::string aes::encrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string aligned_data = data; + const auto mod = aligned_data.size() % 16; + if (mod != 0) + { + aligned_data.resize(aligned_data.size() + (16 - mod)); + } + + std::string enc_data; + enc_data.resize(aligned_data.size()); + + symmetric_CBC cbc; + const auto aes = find_cipher("aes"); + + cbc_start(aes, cs(iv.data()), cs(key.data()), + static_cast(key.size()), 0, &cbc); + cbc_encrypt(cs(aligned_data.data()), + cs(enc_data.data()), + ul(aligned_data.size()), &cbc); + cbc_done(&cbc); + + return enc_data; + } + + std::string aes::decrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string dec_data; + dec_data.resize(data.size()); + + symmetric_CBC cbc; + const auto aes = find_cipher("aes"); + + cbc_start(aes, cs(iv.data()), cs(key.data()), + static_cast(key.size()), 0, &cbc); + cbc_decrypt(cs(data.data()), + cs(dec_data.data()), + ul(data.size()), &cbc); + cbc_done(&cbc); + + return dec_data; + } + + std::string hmac_sha1::compute(const std::string& data, const std::string& key) + { + std::string buffer; + buffer.resize(20); + + hmac_state state; + hmac_init(&state, find_hash("sha1"), cs(key.data()), ul(key.size())); + hmac_process(&state, cs(data.data()), static_cast(data.size())); + + auto out_len = ul(buffer.size()); + hmac_done(&state, cs(buffer.data()), &out_len); + + buffer.resize(out_len); + return buffer; + } + + std::string sha1::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string sha1::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[20] = {0}; + + hash_state state; + sha1_init(&state); + sha1_process(&state, data, ul(length)); + sha1_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + std::string sha256::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string sha256::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[32] = {0}; + + hash_state state; + sha256_init(&state); + sha256_process(&state, data, ul(length)); + sha256_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + std::string sha512::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string sha512::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[64] = {0}; + + hash_state state; + sha512_init(&state); + sha512_process(&state, data, ul(length)); + sha512_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + namespace md5 + { + std::string compute(const std::string& data, bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string compute(const uint8_t* data, size_t length, bool hex) + { + uint8_t buffer[16] = {0}; + + hash_state state; + md5_init(&state); + md5_process(&state, data, ul(length)); + md5_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + } + + std::string base64::encode(const uint8_t* data, const size_t len) + { + std::string result; + result.resize((len + 2) * 2); + + auto out_len = ul(result.size()); + if (base64_encode(data, ul(len), result.data(), &out_len) != CRYPT_OK) + { + return {}; + } + + result.resize(out_len); + return result; + } + + std::string base64::encode(const std::string& data) + { + return base64::encode(cs(data.data()), static_cast(data.size())); + } + + std::string base64::decode(const std::string& data) + { + std::string result; + result.resize((data.size() + 2) * 2); + + auto out_len = ul(result.size()); + if (base64_decode(data.data(), ul(data.size()), cs(result.data()), &out_len) != CRYPT_OK) + { + return {}; + } + + result.resize(out_len); + return result; + } + + unsigned int jenkins_one_at_a_time::compute(const std::string& data) + { + return compute(data.data(), data.size()); + } + + unsigned int jenkins_one_at_a_time::compute(const char* key, const size_t len) + { + unsigned int hash, i; + for (hash = i = 0; i < len; ++i) + { + hash += key[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; + } + + uint32_t random::get_integer() + { + uint32_t result; + random::get_data(&result, sizeof(result)); + return result; + } + + uint32_t random::get_integer(const std::uint32_t min, const std::uint32_t max) + { + const auto range = max - min + 1; + const auto value = random::get_integer(); + return value % range + min; + } + + std::string random::get_challenge() + { + std::string result; + result.resize(sizeof(uint32_t)); + random::get_data(result.data(), result.size()); + return string::dump_hex(result, ""); + } + + void random::get_data(void* data, const size_t size) + { + prng_.read(data, size); + } + + std::string random::get_data(const size_t size) + { + std::string data; + data.resize(size); + random::get_data(data.data(), size); + return data; + } +} + +#pragma warning(pop) diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.hpp new file mode 100644 index 0000000..01409a7 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/cryptography.hpp @@ -0,0 +1,151 @@ +#pragma once + +#include +#include +#include "string.hpp" + +namespace utils::cryptography +{ + namespace ecc + { + class key final + { + public: + key(); + ~key(); + + key(key&& obj) noexcept; + key(const key& obj); + key& operator=(key&& obj) noexcept; + key& operator=(const key& obj); + + bool is_valid() const; + + ecc_key& get(); + const ecc_key& get() const; + + std::string get_public_key() const; + + void set(const std::string& pub_key_buffer); + + void deserialize(const std::string& key); + + std::string serialize(int type = PK_PRIVATE) const; + + void free(); + + bool operator==(key& key) const; + + uint64_t get_hash() const; + + private: + ecc_key key_storage_{}; + }; + + key generate_key(int bits); + key generate_key(int bits, const std::string& entropy); + std::string sign_message(const key& key, const std::string& message); + bool verify_message(const key& key, const std::string& message, const std::string& signature); + + bool encrypt(const key& key, std::string& data); + bool decrypt(const key& key, std::string& data); + } + + namespace rsa + { + std::string encrypt(const std::string& data, const std::string& hash, const std::string& key); + std::string decrypt(const std::string& data, const std::string& hash, const std::string& key); + } + + namespace des3 + { + std::string encrypt(const std::string& data, const std::string& iv, const std::string& key); + std::string decrypt(const std::string& data, const std::string& iv, const std::string& key); + } + + namespace tiger + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace aes + { + std::string encrypt(const std::string& data, const std::string& iv, const std::string& key); + std::string decrypt(const std::string& data, const std::string& iv, const std::string& key); + } + + namespace hmac_sha1 + { + std::string compute(const std::string& data, const std::string& key); + } + + namespace sha1 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace sha256 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace sha512 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace md5 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace argon2 + { + template + std::string compute(const std::string& data, bool hex = false) + { + std::uint8_t buffer[HashLen]{}; + std::uint8_t salt[SaltLen]{}; + + argon2i_hash_raw(TCost, MCost, Threads, data.data(), data.size(), salt, SaltLen, buffer, HashLen); + + const auto str = std::string{reinterpret_cast(buffer), HashLen}; + if (hex) + { + return string::dump_hex(str, "", false); + } + else + { + return str; + } + } + } + + namespace base64 + { + std::string encode(const uint8_t* data, size_t len); + std::string encode(const std::string& data); + std::string decode(const std::string& data); + } + + namespace jenkins_one_at_a_time + { + unsigned int compute(const std::string& data); + unsigned int compute(const char* key, size_t len); + }; + + namespace random + { + uint32_t get_integer(); + uint32_t get_integer(const std::uint32_t min, const std::uint32_t max); + std::string get_challenge(); + void get_data(void* data, size_t size); + std::string get_data(const size_t size); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/flags.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/flags.cpp new file mode 100644 index 0000000..9d467f4 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/flags.cpp @@ -0,0 +1,54 @@ +#include + +#include "flags.hpp" +#include "string.hpp" + +#include + +namespace utils::flags +{ + void parse_flags(std::vector& flags) + { + int num_args; + auto* const argv = CommandLineToArgvW(GetCommandLineW(), &num_args); + + flags.clear(); + + if (argv) + { + for (auto i = 0; i < num_args; ++i) + { + std::wstring wide_flag(argv[i]); + if (wide_flag[0] == L'-') + { + wide_flag.erase(wide_flag.begin()); + flags.emplace_back(string::convert(wide_flag)); + } + } + + LocalFree(argv); + } + } + + bool has_flag(const std::string& flag) + { + static auto parsed = false; + static std::vector enabled_flags; + + if (!parsed) + { + parse_flags(enabled_flags); + parsed = true; + } + + for (const auto& entry : enabled_flags) + { + if (string::to_lower(entry) == string::to_lower(flag)) + { + return true; + } + } + + return false; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/flags.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/flags.hpp new file mode 100644 index 0000000..7f09cae --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/flags.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace utils::flags +{ + bool has_flag(const std::string& flag); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/hook.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/hook.cpp new file mode 100644 index 0000000..22c57c0 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/hook.cpp @@ -0,0 +1,208 @@ +#include +#include "hook.hpp" +#include "string.hpp" +// iw6x-client + +namespace utils::hook +{ + namespace + { + [[maybe_unused]] class _ + { + public: + _() + { + if (MH_Initialize() != MH_OK) + { + throw std::runtime_error("Failed to initialize MinHook"); + } + } + + ~_() + { + MH_Uninitialize(); + } + } __; + } + + asmjit::Error assembler::call(void* target) + { + return Assembler::call(size_t(target)); + } + + asmjit::Error assembler::jmp(void* target) + { + return Assembler::jmp(size_t(target)); + } + + detour::detour(const size_t place, void* target) : detour(reinterpret_cast(place), target) + { + } + + detour::detour(void* place, void* target) + { + this->create(place, target); + } + + detour::~detour() + { + this->clear(); + } + + void detour::enable() const + { + MH_EnableHook(this->place_); + } + + void detour::disable() const + { + MH_DisableHook(this->place_); + } + + void detour::create(void* place, void* target) + { + this->clear(); + this->place_ = place; + + if (MH_CreateHook(this->place_, target, &this->original_) != MH_OK) + { + throw std::runtime_error(string::va("Unable to create hook at location: %p", this->place_)); + } + + this->enable(); + } + + void detour::create(const size_t place, void* target) + { + this->create(reinterpret_cast(place), target); + } + + void detour::clear() + { + if (this->place_) + { + MH_RemoveHook(this->place_); + } + + this->place_ = nullptr; + this->original_ = nullptr; + } + + void* detour::get_original() const + { + return this->original_; + } + + void nop(void* place, const size_t length) + { + DWORD old_protect{}; + VirtualProtect(place, length, PAGE_EXECUTE_READWRITE, &old_protect); + + std::memset(place, 0x90, length); + + VirtualProtect(place, length, old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), place, length); + } + + void nop(const size_t place, const size_t length) + { + nop(reinterpret_cast(place), length); + } + + void copy(void* place, const void* data, const size_t length) + { + DWORD old_protect{}; + VirtualProtect(place, length, PAGE_EXECUTE_READWRITE, &old_protect); + + std::memmove(place, data, length); + + VirtualProtect(place, length, old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), place, length); + } + + void copy(const size_t place, const void* data, const size_t length) + { + copy(reinterpret_cast(place), data, length); + } + + bool is_relatively_far(const void* pointer, const void* data, int offset) + { + const int64_t diff = size_t(data) - (size_t(pointer) + offset); + const auto small_diff = int32_t(diff); + return diff != int64_t(small_diff); + } + + void call(void* pointer, void* data) + { + if (is_relatively_far(pointer, data)) + { + throw std::runtime_error("Too far away to create 32bit relative branch"); + } + + auto* patch_pointer = PBYTE(pointer); + set(patch_pointer, 0xE8); + set(patch_pointer + 1, int32_t(size_t(data) - (size_t(pointer) + 5))); + } + + void call(const size_t pointer, void* data) + { + return call(reinterpret_cast(pointer), data); + } + + void call(const size_t pointer, const size_t data) + { + return call(pointer, reinterpret_cast(data)); + } + + void set(std::uintptr_t address, std::vector&& bytes) + { + DWORD oldProtect = 0; + + auto* place = reinterpret_cast(address); + VirtualProtect(place, bytes.size(), PAGE_EXECUTE_READWRITE, &oldProtect); + memcpy(place, bytes.data(), bytes.size()); + VirtualProtect(place, bytes.size(), oldProtect, &oldProtect); + FlushInstructionCache(GetCurrentProcess(), place, bytes.size()); + } + + void set(std::uintptr_t address, void* buffer, size_t size) + { + DWORD oldProtect = 0; + + auto* place = reinterpret_cast(address); + VirtualProtect(place, size, PAGE_EXECUTE_READWRITE, &oldProtect); + memcpy(place, buffer, size); + VirtualProtect(place, size, oldProtect, &oldProtect); + FlushInstructionCache(GetCurrentProcess(), place, size); + } + + void jump(std::uintptr_t address, void* destination) + { + if (!address) return; + + std::uint8_t* bytes = new std::uint8_t[5]; + *bytes = 0xE9; + *reinterpret_cast(bytes + 1) = CalculateRelativeJMPAddress(address, destination); + + set(address, bytes, 5); + + delete[] bytes; + } + + void* assemble(const std::function& asm_function) + { + static asmjit::JitRuntime runtime; + + asmjit::CodeHolder code; + code.init(runtime.environment()); + + assembler a(&code); + + asm_function(a); + + void* result = nullptr; + runtime.add(&result, &code); + + return result; + } +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/hook.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/hook.hpp new file mode 100644 index 0000000..9e34126 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/hook.hpp @@ -0,0 +1,146 @@ +#pragma once + +#define CalculateRelativeJMPAddress(X, Y) (((std::uintptr_t)Y - (std::uintptr_t)X) - 5) + +#include +#include + +using namespace asmjit::x86; + +namespace utils::hook +{ + class assembler : public Assembler + { + public: + using Assembler::Assembler; + using Assembler::call; + using Assembler::jmp; + + asmjit::Error call(void* target); + asmjit::Error jmp(void* target); + }; + + class detour + { + public: + detour() = default; + detour(void* place, void* target); + detour(size_t place, void* target); + ~detour(); + + detour(detour&& other) noexcept + { + this->operator=(std::move(other)); + } + + detour& operator= (detour&& other) noexcept + { + if (this != &other) + { + this->~detour(); + + this->place_ = other.place_; + this->original_ = other.original_; + + other.place_ = nullptr; + other.original_ = nullptr; + } + + return *this; + } + + detour(const detour&) = delete; + detour& operator= (const detour&) = delete; + + void enable() const; + void disable() const; + + void create(void* place, void* target); + void create(size_t place, void* target); + void clear(); + + template + T* get() const + { + return static_cast(this->get_original()); + } + + template + T invoke(Args... args) + { + return static_cast(this->get_original())(args...); + } + + template + T invoke_pascal(Args... args) + { + return static_cast(this->get_original())(args...); + } + + [[nodiscard]] void* get_original() const; + + private: + void* place_{}; + void* original_{}; + }; + + void nop(void* place, size_t length); + void nop(size_t place, size_t length); + + void copy(void* place, const void* data, size_t length); + void copy(size_t place, const void* data, size_t length); + + bool is_relatively_far(const void* pointer, const void* data, int offset = 5); + + void call(void* pointer, void* data); + void call(size_t pointer, void* data); + void call(size_t pointer, size_t data); + + void jump(std::uintptr_t address, void* destination); + + void* assemble(const std::function& asm_function); + + template + T extract(void* address) + { + const auto data = static_cast(address); + const auto offset = *reinterpret_cast(data); + return reinterpret_cast(data + offset + 4); + } + + template + T extract(const size_t address) + { + return extract(reinterpret_cast(address)); + } + + template + static void set(void* place, T value) + { + DWORD old_protect; + VirtualProtect(place, sizeof(T), PAGE_EXECUTE_READWRITE, &old_protect); + + *static_cast(place) = value; + + VirtualProtect(place, sizeof(T), old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), place, sizeof(T)); + } + + template + static void set(const size_t place, T value) + { + return set(reinterpret_cast(place), value); + } + + template + static T invoke(size_t func, Args... args) + { + return reinterpret_cast(func)(args...); + } + + template + static T invoke(void* func, Args... args) + { + return static_cast(func)(args...); + } +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/http.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/http.cpp new file mode 100644 index 0000000..42f8269 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/http.cpp @@ -0,0 +1,112 @@ +#ifdef _WIN32 +#include +#endif +#include "http.hpp" + +#include +#include + +#ifdef _WIN32 +#pragma comment(lib, "ws2_32.lib") +#endif + +namespace utils::http +{ + namespace + { + size_t write_callback(void* contents, const size_t size, const size_t nmemb, void* userp) noexcept + { + const auto buffer = static_cast(userp); + const auto total_size = size * nmemb; + try + { + buffer->append(static_cast(contents), total_size); + } + catch (...) + { + return 0; // Never unwind a C++ exception through libcurl. + } + return total_size; + } + + double timing_ms(CURL* curl, const CURLINFO info) + { + double seconds = 0; + curl_easy_getinfo(curl, info, &seconds); + return seconds * 1000.0; + } + } + + std::optional get_data(const std::string& url, const std::string& fields, + const headers& headers, const std::string& method, const timeouts& limits) + { + result response; + if (limits.connect_timeout_ms <= 0 || limits.timeout_ms <= 0) + { + response.code = CURLE_BAD_FUNCTION_ARGUMENT; + return response; + } + const std::unique_ptr handle(curl_easy_init(), curl_easy_cleanup); + const auto curl = handle.get(); + if (!curl) + { + return {}; + } + + std::unique_ptr header_list(nullptr, curl_slist_free_all); + + for (const auto& header : headers) + { + auto data = header.first + ": " + header.second; + const auto appended = curl_slist_append(header_list.get(), data.data()); + if (!appended) + { + response.code = CURLE_OUT_OF_MEMORY; + return response; + } + header_list.release(); + header_list.reset(appended); + } + + std::string buffer{}; + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list.get()); + curl_easy_setopt(curl, CURLOPT_URL, url.data()); + // Real native deadlines: a script-side wait limit cannot stop this transfer. + auto code = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, limits.connect_timeout_ms); + if (code == CURLE_OK) + code = curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, limits.timeout_ms); + if (code != CURLE_OK) + { + response.code = code; + return response; + } + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); + + if (!fields.empty()) + { + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fields.data()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast(fields.size())); + } + + if (!method.empty()) + { + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method.data()); + } + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); + + response.code = curl_easy_perform(curl); + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response.status); + response.dns_ms = timing_ms(curl, CURLINFO_NAMELOOKUP_TIME); + response.connect_ms = timing_ms(curl, CURLINFO_CONNECT_TIME); + response.tls_ms = timing_ms(curl, CURLINFO_APPCONNECT_TIME); + response.first_byte_ms = timing_ms(curl, CURLINFO_STARTTRANSFER_TIME); + response.total_ms = timing_ms(curl, CURLINFO_TOTAL_TIME); + if (response.code == CURLE_OK) + response.buffer = std::move(buffer); + return response; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/http.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/http.hpp new file mode 100644 index 0000000..c7d91f1 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/http.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +#include + +namespace utils::http +{ + struct result + { + CURLcode code = CURLE_FAILED_INIT; + std::string buffer; + long status = 0; + // Cumulative milliseconds from the start of curl_easy_perform. + double dns_ms = 0; + double connect_ms = 0; + double tls_ms = 0; + double first_byte_ms = 0; + double total_ms = 0; + }; + + struct timeouts + { + long connect_timeout_ms = 5000; + long timeout_ms = 15000; + }; + + using headers = std::unordered_map; + + std::optional get_data(const std::string& url, const std::string& fields = {}, + const headers& headers = {}, const std::string& method = {}, const timeouts& limits = {}); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/info_string.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/info_string.cpp new file mode 100644 index 0000000..836ef07 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/info_string.cpp @@ -0,0 +1,67 @@ +#include + +#include "info_string.hpp" +#include "string.hpp" + +namespace utils +{ + info_string::info_string(const std::string& buffer) + { + this->parse(buffer); + } + + void info_string::set(const std::string& key, const std::string& value) + { + this->key_value_pairs_[key] = value; + } + + void info_string::remove(const std::string& key) + { + this->key_value_pairs_.erase(key); + } + + std::string info_string::get(const std::string& key) const + { + const auto value = this->key_value_pairs_.find(key); + if (value != this->key_value_pairs_.end()) + { + return value->second; + } + + return {}; + } + + void info_string::parse(std::string buffer) + { + if (buffer[0] == '\\') + { + buffer = buffer.substr(1); + } + + const auto key_values = string::split(buffer, '\\'); + for (size_t i = 0; !key_values.empty() && i < (key_values.size() - 1); i += 2) + { + const auto& key = key_values[i]; + const auto& value = key_values[i + 1]; + + if (!this->key_value_pairs_.contains(key)) + { + this->key_value_pairs_[key] = value; + } + } + } + + std::string info_string::build() const + { + std::string info_string; + for (const auto& [key, val] : this->key_value_pairs_) + { + info_string.append("\\"); + info_string.append(key); + info_string.append("\\"); + info_string.append(val); + } + + return info_string; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/info_string.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/info_string.hpp new file mode 100644 index 0000000..c1f09dd --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/info_string.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +namespace utils +{ + class info_string + { + public: + info_string() = default; + info_string(const std::string& buffer); + + void set(const std::string& key, const std::string& value); + void remove(const std::string& key); + + [[nodiscard]] std::string get(const std::string& key) const; + [[nodiscard]] std::string build() const; + + private: + std::unordered_map key_value_pairs_{}; + + void parse(std::string buffer); + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/io.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/io.cpp new file mode 100644 index 0000000..f16a9a6 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/io.cpp @@ -0,0 +1,135 @@ +#include +#include +#include "io.hpp" + +namespace utils::io +{ + bool remove_file(const std::string& file) + { + return DeleteFileA(file.data()) == TRUE; + } + + bool move_file(const std::string& src, const std::string& target) + { + return MoveFileA(src.data(), target.data()) == TRUE; + } + + bool file_exists(const std::string& file) + { + return std::ifstream(file).good(); + } + + bool write_file(const std::string& file, const std::string& data, const bool append) + { + const auto pos = file.find_last_of("/\\"); + if (pos != std::string::npos) + { + create_directory(file.substr(0, pos)); + } + + std::ofstream stream( + file, std::ios::binary | std::ofstream::out | (append ? std::ofstream::app : 0)); + + if (stream.is_open()) + { + stream.write(data.data(), data.size()); + stream.close(); + return true; + } + + return false; + } + + std::string read_file(const std::string& file) + { + std::string data; + read_file(file, &data); + return data; + } + + bool read_file(const std::string& file, std::string* data) + { + if (!data) return false; + data->clear(); + + if (file_exists(file)) + { + std::ifstream stream(file, std::ios::binary); + if (!stream.is_open()) return false; + + stream.seekg(0, std::ios::end); + const std::streamsize size = stream.tellg(); + stream.seekg(0, std::ios::beg); + + if (size > -1) + { + data->resize(static_cast(size)); + stream.read(const_cast(data->data()), size); + stream.close(); + return true; + } + } + + return false; + } + + size_t file_size(const std::string& file) + { + if (file_exists(file)) + { + std::ifstream stream(file, std::ios::binary); + + if (stream.good()) + { + stream.seekg(0, std::ios::end); + return static_cast(stream.tellg()); + } + } + + return 0; + } + + bool create_directory(const std::string& directory) + { + return std::filesystem::create_directories(directory); + } + + bool directory_exists(const std::string& directory) + { + return std::filesystem::is_directory(directory); + } + + bool directory_is_empty(const std::string& directory) + { + return std::filesystem::is_empty(directory); + } + + std::vector list_files(const std::string& directory) + { + std::vector files; + + for (auto& file : std::filesystem::directory_iterator(directory)) + { + files.push_back(file.path().generic_string()); + } + + return files; + } + + void copy_folder(const std::filesystem::path& src, const std::filesystem::path& target) + { + std::filesystem::copy(src, target, std::filesystem::copy_options::overwrite_existing | std::filesystem::copy_options::recursive); + } + + size_t remove_directory(const std::filesystem::path& src, bool recursive) + { + if (recursive) + { + return static_cast(std::filesystem::remove_all(src)); + } + else + { + return static_cast(std::filesystem::remove(src)); + } + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/io.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/io.hpp new file mode 100644 index 0000000..cdee176 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/io.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include + +namespace utils::io +{ + bool remove_file(const std::string& file); + bool move_file(const std::string& src, const std::string& target); + 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); + std::string read_file(const std::string& file); + size_t file_size(const std::string& file); + bool create_directory(const std::string& directory); + bool directory_exists(const std::string& directory); + bool directory_is_empty(const std::string& directory); + std::vector list_files(const std::string& directory); + void copy_folder(const std::filesystem::path& src, const std::filesystem::path& target); + size_t remove_directory(const std::filesystem::path& src, bool recursive = false); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/memory.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/memory.cpp new file mode 100644 index 0000000..3809feb --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/memory.cpp @@ -0,0 +1,109 @@ +#include +#include "memory.hpp" + +namespace utils +{ + memory::allocator memory::mem_allocator_; + + memory::allocator::~allocator() + { + this->clear(); + } + + void memory::allocator::clear() + { + std::lock_guard _(this->mutex_); + + for (auto& data : this->pool_) + { + memory::free(data); + } + + this->pool_.clear(); + } + + void memory::allocator::free(void* data) + { + std::lock_guard _(this->mutex_); + + const auto j = std::find(this->pool_.begin(), this->pool_.end(), data); + if (j != this->pool_.end()) + { + memory::free(data); + this->pool_.erase(j); + } + } + + void memory::allocator::free(const void* data) + { + this->free(const_cast(data)); + } + + void* memory::allocator::allocate(const size_t length) + { + std::lock_guard _(this->mutex_); + + const auto data = memory::allocate(length); + this->pool_.push_back(data); + return data; + } + + bool memory::allocator::empty() const + { + return this->pool_.empty(); + } + + char* memory::allocator::duplicate_string(const std::string& string) + { + std::lock_guard _(this->mutex_); + + const auto data = memory::duplicate_string(string); + this->pool_.push_back(data); + return data; + } + + void* memory::allocate(const size_t length) + { + return calloc(length, 1); + } + + char* memory::duplicate_string(const std::string& string) + { + const auto new_string = allocate_array(string.size() + 1); + std::memcpy(new_string, string.data(), string.size()); + return new_string; + } + + void memory::free(void* data) + { + if (data) + { + ::free(data); + } + } + + void memory::free(const void* data) + { + free(const_cast(data)); + } + + bool memory::is_set(const void* mem, const char chr, const size_t length) + { + const auto mem_arr = static_cast(mem); + + for (size_t i = 0; i < length; ++i) + { + if (mem_arr[i] != chr) + { + return false; + } + } + + return true; + } + + memory::allocator* memory::get_allocator() + { + return &memory::mem_allocator_; + } +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/memory.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/memory.hpp new file mode 100644 index 0000000..6d6a8b5 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/memory.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +namespace utils +{ + class memory final + { + public: + class allocator final + { + public: + ~allocator(); + + void clear(); + + void free(void* data); + + void free(const void* data); + + void* allocate(size_t length); + + template + inline T* allocate() + { + return this->allocate_array(1); + } + + template + inline T* allocate_array(const size_t count = 1) + { + return static_cast(this->allocate(count * sizeof(T))); + } + + bool empty() const; + + char* duplicate_string(const std::string& string); + + private: + std::mutex mutex_; + std::vector pool_; + }; + + static void* allocate(size_t length); + + template + static inline T* allocate() + { + return allocate_array(1); + } + + template + static inline T* allocate_array(const size_t count = 1) + { + return static_cast(allocate(count * sizeof(T))); + } + + static char* duplicate_string(const std::string& string); + + static void free(void* data); + static void free(const void* data); + + static bool is_set(const void* mem, char chr, size_t length); + + static bool is_bad_read_ptr(const void* ptr); + static bool is_bad_code_ptr(const void* ptr); + static bool is_rdata_ptr(void* ptr); + + static allocator* get_allocator(); + + private: + static allocator mem_allocator_; + }; +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/nt.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/nt.cpp new file mode 100644 index 0000000..ebcd6b8 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/nt.cpp @@ -0,0 +1,250 @@ +#include +#include "nt.hpp" +#include "string.hpp" + +namespace utils::nt +{ + HMODULE library::current_handle_; + + library library::load(const std::string& name) + { + return library(LoadLibraryA(name.data())); + } + + library library::load(const std::filesystem::path& path) + { + return library::load(path.generic_string()); + } + + library library::get_by_address(void* address) + { + HMODULE handle = nullptr; + GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, static_cast(address), &handle); + return library(handle); + } + + void library::set_current_handle(HMODULE handle) + { + current_handle_ = handle; + } + + HMODULE library::get_current_handle() + { + return current_handle_; + } + + library::library() + { + this->module_ = GetModuleHandleA(nullptr); + } + + library::library(const std::string& name) + { + this->module_ = GetModuleHandleA(name.data()); + } + + library::library(const HMODULE handle) + { + this->module_ = handle; + } + + bool library::operator==(const library& obj) const + { + return this->module_ == obj.module_; + } + + library::operator bool() const + { + return this->is_valid(); + } + + library::operator HMODULE() const + { + return this->get_handle(); + } + + PIMAGE_NT_HEADERS library::get_nt_headers() const + { + if (!this->is_valid()) return nullptr; + return reinterpret_cast(this->get_ptr() + this->get_dos_header()->e_lfanew); + } + + PIMAGE_DOS_HEADER library::get_dos_header() const + { + return reinterpret_cast(this->get_ptr()); + } + + PIMAGE_OPTIONAL_HEADER library::get_optional_header() const + { + if (!this->is_valid()) return nullptr; + return &this->get_nt_headers()->OptionalHeader; + } + + std::vector library::get_section_headers() const + { + std::vector headers; + + auto nt_headers = this->get_nt_headers(); + auto section = IMAGE_FIRST_SECTION(nt_headers); + + for (uint16_t i = 0; i < nt_headers->FileHeader.NumberOfSections; ++i, ++section) + { + if (section) headers.push_back(section); + else OutputDebugStringA("There was an invalid section :O"); + } + + return headers; + } + + std::uint8_t* library::get_ptr() const + { + return reinterpret_cast(this->module_); + } + + void library::unprotect() const + { + if (!this->is_valid()) return; + + DWORD protection; + VirtualProtect(this->get_ptr(), this->get_optional_header()->SizeOfImage, PAGE_EXECUTE_READWRITE, + &protection); + } + + size_t library::get_relative_entry_point() const + { + if (!this->is_valid()) return 0; + return this->get_nt_headers()->OptionalHeader.AddressOfEntryPoint; + } + + void* library::get_entry_point() const + { + if (!this->is_valid()) return nullptr; + return this->get_ptr() + this->get_relative_entry_point(); + } + + bool library::is_valid() const + { + return this->module_ != nullptr && this->get_dos_header()->e_magic == IMAGE_DOS_SIGNATURE; + } + + std::string library::get_name() const + { + if (!this->is_valid()) return ""; + + auto path = this->get_path(); + const auto pos = path.find_last_of("/\\"); + if (pos == std::string::npos) return path; + + return path.substr(pos + 1); + } + + std::string library::get_path() const + { + if (!this->is_valid()) return ""; + + char name[MAX_PATH] = {0}; + GetModuleFileNameA(this->module_, name, sizeof name); + + return name; + } + + std::string library::get_folder() const + { + if (!this->is_valid()) return ""; + + const auto path = std::filesystem::path(this->get_path()); + return path.parent_path().generic_string(); + } + + void library::free() + { + if (this->is_valid()) + { + FreeLibrary(this->module_); + this->module_ = nullptr; + } + } + + HMODULE library::get_handle() const + { + return this->module_; + } + + void** library::get_iat_entry(const std::string& module_name, const std::string& proc_name) const + { + if (!this->is_valid()) return nullptr; + + const library other_module(module_name); + if (!other_module.is_valid()) return nullptr; + + auto* const target_function = other_module.get_proc(proc_name); + if (!target_function) return nullptr; + + auto* header = this->get_optional_header(); + if (!header) return nullptr; + + auto* import_descriptor = reinterpret_cast(this->get_ptr() + header->DataDirectory + [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); + + while (import_descriptor->Name) + { + if (!_stricmp(reinterpret_cast(this->get_ptr() + import_descriptor->Name), module_name.data())) + { + auto* original_thunk_data = reinterpret_cast(import_descriptor-> + OriginalFirstThunk + this->get_ptr()); + auto* thunk_data = reinterpret_cast(import_descriptor->FirstThunk + this-> + get_ptr()); + + while (original_thunk_data->u1.AddressOfData) + { + const size_t ordinal_number = original_thunk_data->u1.AddressOfData & 0xFFFFFFF; + + if (ordinal_number > 0xFFFF) continue; + + if (GetProcAddress(other_module.module_, reinterpret_cast(ordinal_number)) == + target_function) + { + return reinterpret_cast(&thunk_data->u1.Function); + } + + ++original_thunk_data; + ++thunk_data; + } + + //break; + } + + ++import_descriptor; + } + + return nullptr; + } + + void raise_hard_exception() + { + int data = false; + const library ntdll("ntdll.dll"); + ntdll.invoke_pascal("RtlAdjustPrivilege", 19, true, false, &data); + ntdll.invoke_pascal("NtRaiseHardError", 0xC000007B, 0, nullptr, nullptr, 6, &data); + } + + std::string load_resource(const int id) + { + const auto self_handle = library::get_current_handle(); + const auto res = FindResource(self_handle, MAKEINTRESOURCE(id), RT_RCDATA); + if (res == nullptr) + { + return {}; + } + + const auto handle = LoadResource(self_handle, res); + if (handle == nullptr) + { + return {}; + } + + const auto str = LPSTR(LockResource(handle)); + const auto size = SizeofResource(self_handle, res); + return std::string{str, size}; + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/nt.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/nt.hpp new file mode 100644 index 0000000..4ba32c7 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/nt.hpp @@ -0,0 +1,112 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN +#include + +// min and max is required by gdi, therefore NOMINMAX won't work +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#include +#include +#include + +namespace utils::nt +{ + class library final + { + public: + static library load(const std::string& name); + static library load(const std::filesystem::path& path); + static library get_by_address(void* address); + + static void set_current_handle(HMODULE handle); + static HMODULE get_current_handle(); + + library(); + explicit library(const std::string& name); + explicit library(HMODULE handle); + + library(const library& a) : module_(a.module_) + { + } + + bool operator!=(const library& obj) const { return !(*this == obj); }; + bool operator==(const library& obj) const; + + operator bool() const; + operator HMODULE() const; + + void unprotect() const; + void* get_entry_point() const; + size_t get_relative_entry_point() const; + + bool is_valid() const; + std::string get_name() const; + std::string get_path() const; + std::string get_folder() const; + std::uint8_t* get_ptr() const; + void free(); + + HMODULE get_handle() const; + + template + T get_proc(const std::string& process) const + { + if (!this->is_valid()) T{}; + return reinterpret_cast(GetProcAddress(this->module_, process.data())); + } + + template + std::function get(const std::string& process) const + { + if (!this->is_valid()) return std::function(); + return static_cast(this->get_proc(process)); + } + + template + T invoke(const std::string& process, Args ... args) const + { + auto method = this->get(process); + if (method) return method(args...); + return T(); + } + + template + T invoke_pascal(const std::string& process, Args ... args) const + { + auto method = this->get(process); + if (method) return method(args...); + return T(); + } + + template + T invoke_this(const std::string& process, void* this_ptr, Args ... args) const + { + auto method = this->get(this_ptr, process); + if (method) return method(args...); + return T(); + } + + std::vector get_section_headers() const; + + PIMAGE_NT_HEADERS get_nt_headers() const; + PIMAGE_DOS_HEADER get_dos_header() const; + PIMAGE_OPTIONAL_HEADER get_optional_header() const; + + void** get_iat_entry(const std::string& module_name, const std::string& proc_name) const; + + private: + HMODULE module_; + static HMODULE current_handle_; + + }; + + __declspec(noreturn) void raise_hard_exception(); + std::string load_resource(int id); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/string.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/string.cpp new file mode 100644 index 0000000..b75990d --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/string.cpp @@ -0,0 +1,157 @@ +#include +#include "string.hpp" +#include +#include +#include + +namespace utils::string +{ + const char* va(const char* fmt, ...) + { + static thread_local va_provider<8, 256> provider; + + va_list ap; + va_start(ap, fmt); + + const char* result = provider.get(fmt, ap); + + va_end(ap); + return result; + } + + std::vector split(const std::string& s, const char delim) + { + std::stringstream ss(s); + std::string item; + std::vector elems; + + while (std::getline(ss, item, delim)) + { + elems.push_back(item); // elems.push_back(std::move(item)); // if C++11 (based on comment from @mchiasson) + } + + return elems; + } + + std::string to_lower(std::string text) + { + std::transform(text.begin(), text.end(), text.begin(), [](const unsigned char input) + { + return static_cast(tolower(input)); + }); + + return text; + } + + std::string to_upper(std::string text) + { + std::transform(text.begin(), text.end(), text.begin(), [](const unsigned char input) + { + return static_cast(toupper(input)); + }); + + return text; + } + + bool starts_with(const std::string& text, const std::string& substring) + { + return text.find(substring) == 0; + } + + bool ends_with(const std::string& text, const std::string& substring) + { + if (substring.size() > text.size()) return false; + return std::equal(substring.rbegin(), substring.rend(), text.rbegin()); + } + + bool is_numeric(const std::string& text) + { + return std::to_string(atoi(text.data())) == text; + } + + std::string dump_hex(const std::string& data, const std::string& separator) + { + std::string result; + + for (unsigned int i = 0; i < data.size(); ++i) + { + if (i > 0) + { + result.append(separator); + } + + result.append(va("%02X", data[i] & 0xFF)); + } + + return result; + } + + std::string replace(std::string str, const std::string& from, const std::string& to) + { + if (from.empty()) + { + return str; + } + + size_t start_pos = 0; + while ((start_pos = str.find(from, start_pos)) != std::string::npos) + { + str.replace(start_pos, from.length(), to); + start_pos += to.length(); + } + + return str; + } + + std::string convert(const std::wstring& wstr) + { + std::string result; + result.reserve(wstr.size()); + + for (const auto& chr : wstr) + { + result.push_back(static_cast(chr)); + } + + return result; + } + + std::wstring convert(const std::string& str) + { + std::wstring result; + result.reserve(str.size()); + + for (const auto& chr : str) + { + result.push_back(static_cast(chr)); + } + + return result; + } + + std::string get_timestamp() + { + tm ltime{}; + char timestamp[MAX_PATH] = { 0 }; + const auto time = _time64(nullptr); + + _localtime64_s(<ime, &time); + strftime(timestamp, sizeof(timestamp) - 1, "%Y-%m-%d-%H-%M-%S", <ime); + + return timestamp; + } + + std::string trim(const std::string& str, const std::string& whitespace) + { + const auto first = str.find_first_not_of(whitespace); + if (first == std::string::npos) + { + return {}; + } + + const auto last = str.find_last_not_of(whitespace); + const auto range = last - first + 1; + + return str.substr(first, range); + } +} \ No newline at end of file diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/string.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/string.hpp new file mode 100644 index 0000000..d0cb4dc --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/string.hpp @@ -0,0 +1,101 @@ +#pragma once +#include "memory.hpp" +#include + +#ifndef ARRAYSIZE +template +size_t ARRAYSIZE(Type(&)[n]) { return n; } +#endif + +namespace utils::string +{ + template + class va_provider final + { + public: + static_assert(Buffers != 0 && MinBufferSize != 0, "Buffers and MinBufferSize mustn't be 0"); + + va_provider() : current_buffer_(0) + { + } + + char* get(const char* format, const va_list ap) + { + ++this->current_buffer_ %= ARRAYSIZE(this->string_pool_); + auto entry = &this->string_pool_[this->current_buffer_]; + + if (!entry->size || !entry->buffer) + { + throw std::runtime_error("String pool not initialized"); + } + + while (true) + { + const int res = vsnprintf_s(entry->buffer, entry->size, _TRUNCATE, format, ap); + if (res > 0) break; // Success + if (res == 0) return nullptr; // Error + + entry->double_size(); + } + + return entry->buffer; + } + + private: + class entry final + { + public: + explicit entry(const size_t _size = MinBufferSize) : size(_size), buffer(nullptr) + { + if (this->size < MinBufferSize) this->size = MinBufferSize; + this->allocate(); + } + + ~entry() + { + if (this->buffer) memory::get_allocator()->free(this->buffer); + this->size = 0; + this->buffer = nullptr; + } + + void allocate() + { + if (this->buffer) memory::get_allocator()->free(this->buffer); + this->buffer = memory::get_allocator()->allocate_array(this->size + 1); + } + + void double_size() + { + this->size *= 2; + this->allocate(); + } + + size_t size; + char* buffer; + }; + + size_t current_buffer_; + entry string_pool_[Buffers]; + }; + + const char* va(const char* fmt, ...); + + std::vector split(const std::string& s, char delim); + + std::string to_lower(std::string text); + std::string to_upper(std::string text); + bool starts_with(const std::string& text, const std::string& substring); + bool ends_with(const std::string& text, const std::string& substring); + bool is_numeric(const std::string& text); + + std::string dump_hex(const std::string& data, const std::string& separator = " "); + + std::string replace(std::string str, const std::string& from, const std::string& to); + + std::string convert(const std::wstring& wstr); + std::wstring convert(const std::string& str); + + std::string get_timestamp(); + + std::string trim(const std::string& str, const std::string& whitespace = " \t\n\r\f\v"); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/thread.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/thread.cpp new file mode 100644 index 0000000..1c20ff5 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/thread.cpp @@ -0,0 +1,89 @@ +#include +#include "thread.hpp" +#include "string.hpp" + +#include + +#include + +namespace utils::thread +{ + std::vector get_thread_ids() + { + auto* const h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, GetCurrentProcessId()); + if (h == INVALID_HANDLE_VALUE) + { + return {}; + } + + const auto _ = gsl::finally([h]() + { + CloseHandle(h); + }); + + THREADENTRY32 entry{}; + entry.dwSize = sizeof(entry); + if (!Thread32First(h, &entry)) + { + return {}; + } + + std::vector ids{}; + + do + { + const auto check_size = entry.dwSize < FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + + sizeof(entry.th32OwnerProcessID); + entry.dwSize = sizeof(entry); + + if (check_size && entry.th32OwnerProcessID == GetCurrentProcessId()) + { + ids.emplace_back(entry.th32ThreadID); + } + } + while (Thread32Next(h, &entry)); + + return ids; + } + + void for_each_thread(const std::function& callback) + { + const auto ids = get_thread_ids(); + + for (const auto& id : ids) + { + auto* const thread = OpenThread(THREAD_ALL_ACCESS, FALSE, id); + if (thread != nullptr) + { + const auto _ = gsl::finally([thread]() + { + CloseHandle(thread); + }); + + callback(thread); + } + } + } + + void suspend_other_threads() + { + for_each_thread([](const HANDLE thread) + { + if (GetThreadId(thread) != GetCurrentThreadId()) + { + SuspendThread(thread); + } + }); + } + + void resume_other_threads() + { + for_each_thread([](const HANDLE thread) + { + if (GetThreadId(thread) != GetCurrentThreadId()) + { + ResumeThread(thread); + } + }); + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/thread.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/thread.hpp new file mode 100644 index 0000000..4d67c1a --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/thread.hpp @@ -0,0 +1,19 @@ +#pragma once +#include + +namespace utils::thread +{ + template + std::thread create_named_thread(const std::string& name, Args&&... args) + { + auto t = std::thread(std::forward(args)...); + set_name(t, name); + return t; + } + + std::vector get_thread_ids(); + void for_each_thread(const std::function& callback); + + void suspend_other_threads(); + void resume_other_threads(); +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.cpp b/t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.cpp new file mode 100644 index 0000000..092c89b --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.cpp @@ -0,0 +1,96 @@ +#include + +#include "thread_pool.hpp" + +namespace utils +{ + thread_pool::worker::worker() + { + } + + void thread_pool::worker::start(thread_pool& pool) + { + this->thread_ = std::thread([&] + { + this->loop(pool); + }); + } + + void thread_pool::worker::stop() + { + if (this->thread_.joinable()) + { + this->thread_.join(); + } + } + + void thread_pool::worker::loop(thread_pool& pool) + { + while (!pool.stopped_) + { + pool.run_job(); + } + } + + thread_pool::job_ptr thread_pool::pop_job() + { + thread_pool::job_ptr job = std::move(this->queue_.front()); + this->queue_.pop_front(); + return job; + } + + void thread_pool::run_job() + { + std::unique_lock lock(this->mutex_); + + this->event_.wait(lock, [&]() + { + return !this->queue_.empty() || this->stopped_; + }); + + if (this->stopped_ || this->queue_.empty()) + { + return; + } + + auto job = this->pop_job(); + lock.unlock(); + job->operator()(); + } + + thread_pool::thread_pool(const std::size_t num_workers) + { + this->initialize(num_workers); + } + + void thread_pool::initialize(const std::size_t num_workers) + { + for (auto i = 0u; i < num_workers; i++) + { + this->workers_.emplace_back(std::make_unique()); + } + } + + void thread_pool::start() + { + for (auto& worker : this->workers_) + { + worker->start(*this); + } + } + + void thread_pool::update() + { + + } + + void thread_pool::stop() + { + this->stopped_ = true; + this->event_.notify_all(); + for (auto& worker : this->workers_) + { + worker->stop(); + } + } +} diff --git a/t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.hpp b/t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.hpp new file mode 100644 index 0000000..9b9bcb2 --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/src/utils/thread_pool.hpp @@ -0,0 +1,60 @@ +#pragma once + +namespace utils +{ + class thread_pool + { + public: + using job = std::function; + using job_ptr = std::unique_ptr; + + friend class worker; + class worker + { + public: + worker(); + + friend class thread_pool; + + void start(thread_pool& pool); + void stop(); + void loop(thread_pool& pool); + + private: + std::thread thread_; + + }; + + thread_pool() = default; + thread_pool(const std::size_t num_workers); + void initialize(const std::size_t num_workers); + + void start(); + void update(); + void stop(); + + template + void push(F&& job) + { + if (this->stopped_) + { + return; + } + + std::lock_guard lock(this->mutex_); + this->queue_.emplace_back(std::make_unique(std::forward(job))); + this->event_.notify_one(); + } + + private: + thread_pool::job_ptr pop_job(); + void run_job(); + + std::mutex mutex_; + std::atomic_bool stopped_; + std::deque queue_; + std::condition_variable event_; + std::deque> workers_; + + }; +} diff --git a/t5/plugins/tws-t5-gsc-utils/tools/premake5.exe b/t5/plugins/tws-t5-gsc-utils/tools/premake5.exe new file mode 100644 index 0000000000000000000000000000000000000000..1a637aa93c942a9268937d8732abf463ebe8bddc GIT binary patch literal 1568256 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 z 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≈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 literal 0 HcmV?d00001 diff --git a/t5/plugins/tws-t5-gsc-utils/upstream.json b/t5/plugins/tws-t5-gsc-utils/upstream.json new file mode 100644 index 0000000..170baba --- /dev/null +++ b/t5/plugins/tws-t5-gsc-utils/upstream.json @@ -0,0 +1,61 @@ +{ + "repository": "https://github.com/alicealys/t5-gsc-utils", + "commit": "8a87903b88ccd78071905785ac37794fcaeae79b", + "dependencies": [ + { + "path": "deps/GSL", + "url": "https://github.com/microsoft/GSL.git", + "commit": "d9fc52e20e32fcc804502480a781120b210afd41" + }, + { + "path": "deps/asmjit", + "url": "https://github.com/asmjit/asmjit.git", + "commit": "33a31f04e83845d15effbb9ca27a8f117205baf8" + }, + { + "path": "deps/curl", + "url": "https://github.com/curl/curl.git", + "commit": "ab885eccd6c82a949e21cfab9af778c0fd44d0ae" + }, + { + "path": "deps/date", + "url": "https://github.com/HowardHinnant/date", + "commit": "e32a0d809c3d3c4797826825dc2d0b287281e3b2" + }, + { + "path": "deps/json", + "url": "https://github.com/nlohmann/json.git", + "commit": "b6d00d18974358ab1d55dcc3379d0ee3052deb4e" + }, + { + "path": "deps/libtomcrypt", + "url": "https://github.com/libtom/libtomcrypt.git", + "commit": "a8ed78c2ca8a7dcb50ad789702ac0586125544f0" + }, + { + "path": "deps/libtommath", + "url": "https://github.com/libtom/libtommath.git", + "commit": "ae40a87a920099a7d9d00979570e0c8d917a1fd7" + }, + { + "path": "deps/minhook", + "url": "https://github.com/TsudaKageyu/minhook.git", + "commit": "4a455528f61b5a375b1f9d44e7d296d47f18bb18" + }, + { + "path": "deps/plutonium-sdk", + "url": "https://github.com/plutoniummod/plutonium-sdk.git", + "commit": "17e9a0a4d5e1133b50f879e3db07e97d1bf92e10" + }, + { + "path": "deps/sqlpp11", + "url": "https://github.com/rbock/sqlpp11.git", + "commit": "1806fe4dd89c9fba3a21341c76e6947fb2b5d6df" + }, + { + "path": "deps/zlib", + "url": "https://github.com/madler/zlib.git", + "commit": "21767c654d31d2dccdde4330529775c6c5fd5389" + } + ] +} diff --git a/t5/NOTES.md b/t5/scripts/NOTES.md similarity index 100% rename from t5/NOTES.md rename to t5/scripts/NOTES.md diff --git a/t5/README.md b/t5/scripts/README.md similarity index 93% rename from t5/README.md rename to t5/scripts/README.md index f5f25e2..d5954c1 100644 --- a/t5/README.md +++ b/t5/scripts/README.md @@ -43,7 +43,7 @@ the enable dvar does not bypass native linking dependencies. Records are read from the public Electric Cherry API with no credentials and work independently of telemetry and HUD. Spectator newcomers receive the same private announcement as playable joins. T5 matches its engine map to -the API's map list. [Shared configuration, caching and validation](../README.md#map-record-announcements) +the API's map list. [Shared configuration, caching and validation](../../README.md#map-record-announcements) apply to both games. ## Player commands @@ -303,10 +303,10 @@ and [spawn entry point](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/ ## tws_t5_telemetry.gsc -Uses `t5-gsc-utils` HTTP/JSON components to POST directly to Electric Cherry's +Uses `tws-t5-gsc-utils` HTTP/JSON components to POST directly to Electric Cherry's `/api/telemetry`. Install alongside `tws_t5_common.gsc` in `storage/t5/scripts/sp/`. No HUD dependency. Reports run whether or not a beta is active. -Follow the shared [authentication setup](../README.md#telemetry-authentication-t5-and-t6) +Follow the shared [authentication setup](../../README.md#telemetry-authentication-t5-and-t6) to configure the service before upgrading. The reporter token is embedded in `level.telemetry_token`; it must match the service's `EC_TELEMETRY_TOKEN`. Short embedded tokens and non-HTTPS URLs disable reporting at init. @@ -375,11 +375,14 @@ worker, and already queued heartbeats drain before `game_end`. There is no discovery, beta token, session ID, sequence field, custom event, external helper, or separate beta acknowledgement. Delivery is best effort: no retries or persistence across map reloads, and no cross-game exactly-once -guarantee. A pending request delays later reports; the current plugin has no -request timeout option. A map reload can discard queued reports. +guarantee. The [TWS plugin build](../plugins/README.md) enforces a 5-second +connection and 15-second total transfer timeout. A timed-out report is logged +and skipped so later reports can proceed. A map reload can discard queued reports. -Transport failures log to the server console. The plugin does not expose -HTTP status codes, so its success flag does not establish API acceptance. +Transport failures and non-2xx HTTP responses log to the server console. The TWS +plugin exposes HTTP status and cumulative DNS/TCP/TLS/first-byte/total timings, +plus worker-queue and completion-notification delays. Transport success alone +does not establish API acceptance. Verify acceptance at Electric Cherry: success is HTTP 200 with `ok: true` and telemetry containing `receivedAt`; invalid payloads return 400 and non-JSON content types return 415. @@ -388,14 +391,15 @@ non-JSON content types return 415. Default logging includes initialization, match start/end, each request's event/round and local ID, queue wait and request duration in milliseconds, -transport failures/recovery, and the final queue drain. IDs reset on map +transport failures/recovery, HTTP rejection/status/timings, and the final queue drain. IDs reset on map load and only appear in logs; payloads are unchanged. Every log includes the server, map, and game time in milliseconds. An independent watchdog prints health every 30 seconds, even before match start and while HTTP is pending or the game-end queue is draining. It shows the sender stage, current snapshot capture, pending queue size (excluding -the in-flight request), total queued, completed transports, failures, and +the in-flight request), total queued, completed transports, transport failures, +HTTP rejections, and time since the last completion (`-1` means none). Warnings remain enabled at log level `0`: @@ -420,12 +424,14 @@ Missing request handles and reported transport failures are counted and skipped so the sender can continue with the next event. Empty responses produce a warning. Arbitrary response bodies are not parsed as JSON, because malformed/proxy responses must not break the sender. The watchdog -does not cancel or retry stuck requests: the current plugin offers neither -timeout nor cancellation through GSC, and starting another request could -reorder events or accumulate native workers. A stall remains blocked until -the plugin completes it; these logs identify that condition, not fix it. +does not launch overlapping requests or retry failed events. Native timeouts +release stalled transfers. A request still pending after 30 seconds warrants +checking the installed plugin version, worker-queue delay and completion delivery. +If diagnostics are absent, the reporter warns that native deadlines are unverified; +install the TWS plugin build and restart the server process. -Requires a plugin build containing +Native deadlines and completion diagnostics require the [TWS plugin build](../plugins/README.md). +The upstream baseline contains [`http::request`](https://github.com/alicealys/t5-gsc-utils/blob/main/src/component/http.cpp) and [`jsonSerialize`](https://github.com/alicealys/t5-gsc-utils/blob/main/src/component/json.cpp). Disabling the dvar does not remove that compile-time dependency; remove the @@ -458,7 +464,9 @@ and [score tracking](https://github.com/plutoniummod/t5-scripts/blob/main/ZM/Com server and confirm the API rejection is visible in the response even though transport completes. Also check an empty or HTML response. 7. Point a test server at an endpoint that accepts a connection but does - not reply. Verify recurring `HTTP stalled` warnings and increasing + not reply. With the TWS plugin, verify a native timeout near 15 seconds and + continued queue consumption. With an older plugin, expect recurring + `HTTP stalled` warnings and increasing pending counts while gameplay continues, including after game over. Release the delayed reply and verify the queue resumes in order and the watchdog stops after the final drain. Test a refused connection diff --git a/t5/tws_t5_afk.gsc b/t5/scripts/tws_t5_afk.gsc similarity index 100% rename from t5/tws_t5_afk.gsc rename to t5/scripts/tws_t5_afk.gsc diff --git a/t5/tws_t5_common.gsc b/t5/scripts/tws_t5_common.gsc similarity index 100% rename from t5/tws_t5_common.gsc rename to t5/scripts/tws_t5_common.gsc diff --git a/t5/tws_t5_hud.gsc b/t5/scripts/tws_t5_hud.gsc similarity index 100% rename from t5/tws_t5_hud.gsc rename to t5/scripts/tws_t5_hud.gsc diff --git a/t5/tws_t5_join.gsc b/t5/scripts/tws_t5_join.gsc similarity index 100% rename from t5/tws_t5_join.gsc rename to t5/scripts/tws_t5_join.gsc diff --git a/t5/tws_t5_leaderboard.gsc b/t5/scripts/tws_t5_leaderboard.gsc similarity index 100% rename from t5/tws_t5_leaderboard.gsc rename to t5/scripts/tws_t5_leaderboard.gsc diff --git a/t5/tws_t5_lock.gsc b/t5/scripts/tws_t5_lock.gsc similarity index 100% rename from t5/tws_t5_lock.gsc rename to t5/scripts/tws_t5_lock.gsc diff --git a/t5/tws_t5_telemetry.gsc b/t5/scripts/tws_t5_telemetry.gsc similarity index 86% rename from t5/tws_t5_telemetry.gsc rename to t5/scripts/tws_t5_telemetry.gsc index aec6db5..4129d53 100644 --- a/t5/tws_t5_telemetry.gsc +++ b/t5/scripts/tws_t5_telemetry.gsc @@ -1,4 +1,4 @@ -/* tws_t5_telemetry.gsc - Electric Cherry game reports via t5-gsc-utils. */ +/* tws_t5_telemetry.gsc - Electric Cherry game reports via tws-t5-gsc-utils. */ #include maps\_utility; #include common_scripts\utility; @@ -55,6 +55,8 @@ init() level.telemetry_sequence = 0; level.telemetry_completed = 0; level.telemetry_failed = 0; + level.telemetry_http_rejected = 0; + level.telemetry_missing_diagnostics_warned = false; level.telemetry_failure_streak = 0; level.telemetry_last_completed = -1; level.telemetry_last_capture = getTime(); @@ -294,6 +296,8 @@ telemetry_send(entry) options["method"] = "POST"; options["headers"] = headers; options["body"] = entry["body"]; + options["connect_timeout_ms"] = 5000; + options["timeout_ms"] = 15000; request = http::request(level.telemetry_url, options); if (!isDefined(request)) @@ -305,9 +309,15 @@ telemetry_send(entry) } level.telemetry_sender_state = "waiting_http"; - request waittill("done", response, success, error); + request waittill("done", response, success, error, diagnostics); elapsed = getTime() - level.telemetry_request_started; level.telemetry_last_completed = getTime(); + timing = telemetry_http_diagnostics(diagnostics); + if (!isDefined(diagnostics) && !level.telemetry_missing_diagnostics_warned) + { + level.telemetry_missing_diagnostics_warned = true; + telemetry_log(0, "WARNING: plugin returned no HTTP diagnostics; native timeouts are unverified. Install the TWS plugin build and restart the server process"); + } // The plugin's success flag reports transport completion, not HTTP status. // No automatic retry: the receiver may already have accepted the event. @@ -315,7 +325,7 @@ telemetry_send(entry) { if (!isDefined(error)) error = "unknown transport error"; - telemetry_transport_failed(label + " elapsed_ms=" + elapsed + " error=" + telemetry_preview(error)); + telemetry_transport_failed(label + " elapsed_ms=" + elapsed + timing + " error=" + telemetry_preview(error)); } else { @@ -323,7 +333,18 @@ telemetry_send(entry) if (level.telemetry_failure_streak > 0) telemetry_log(0, "Transport recovered after " + level.telemetry_failure_streak + " failures; " + label); level.telemetry_failure_streak = 0; - telemetry_log(1, "Transport completed " + label + " elapsed_ms=" + elapsed + " (API acceptance unverified)"); + if (isDefined(diagnostics) && isDefined(diagnostics["http_status"])) + { + if (diagnostics["http_status"] < 200 || diagnostics["http_status"] >= 300) + { + level.telemetry_http_rejected++; + telemetry_log(0, "ERROR: HTTP rejected " + label + " elapsed_ms=" + elapsed + timing + " body=" + telemetry_preview(response)); + } + else + telemetry_log(1, "HTTP completed " + label + " elapsed_ms=" + elapsed + timing); + } + else + telemetry_log(1, "Transport completed " + label + " elapsed_ms=" + elapsed + timing + " (API acceptance unverified)"); if (!isDefined(response) || response == "") telemetry_log(0, "WARNING: empty API response for " + label); else @@ -334,6 +355,24 @@ telemetry_send(entry) level.telemetry_sender_state = "idle"; } +// The native plugin appends diagnostics while preserving the old done arguments. +// Curl timings are cumulative milestones, measured in real milliseconds. +telemetry_http_diagnostics(diagnostics) +{ + if (!isDefined(diagnostics)) + return " diagnostics=unavailable"; + + keys = strTok("http_status,curl_code,dns_ms,connect_ms,tls_ms,first_byte_ms,total_ms,worker_queue_ms,notify_ms,connect_timeout_ms,timeout_ms", ","); + detail = ""; + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + if (isDefined(diagnostics[key])) + detail += " " + key + "=" + int(diagnostics[key]); + } + return detail; +} + telemetry_transport_failed(detail) { level.telemetry_failed++; @@ -383,7 +422,7 @@ telemetry_preview(value) } // Independent of producers and the HTTP wait; survives game over until drain. -// The plugin cannot cancel requests. Warn without opening overlapping POSTs +// Native requests have deadlines. Warn without opening overlapping POSTs // that could arrive out of order or exhaust its native worker pool. telemetry_watchdog() { @@ -400,7 +439,7 @@ telemetry_watchdog() telemetry_log(1, "Health started=" + level.telemetry_started + " ended=" + level.telemetry_ended + " sender=" + level.telemetry_sender_state + " capturing=" + level.telemetry_capture_event + " pending=" + pending + " queued_total=" + level.telemetry_sequence + - " completed=" + level.telemetry_completed + " failed=" + level.telemetry_failed + + " completed=" + level.telemetry_completed + " failed=" + level.telemetry_failed + " http_rejected=" + level.telemetry_http_rejected + " last_done_ms_ago=" + completion_age); if (isDefined(level.telemetry_inflight)) @@ -409,7 +448,7 @@ telemetry_watchdog() if (age >= 30000) telemetry_log(0, "WARNING: HTTP stalled " + telemetry_event_label(level.telemetry_inflight) + " elapsed_ms=" + age + " pending=" + pending + " stage=" + level.telemetry_sender_state + - "; waiting for plugin completion (no cancellation API)"); + "; native deadline exceeded; check plugin version, worker queue and completion delivery"); } else if (pending > 0) { diff --git a/t6/plugins/README.md b/t6/plugins/README.md new file mode 100644 index 0000000..91e68c4 --- /dev/null +++ b/t6/plugins/README.md @@ -0,0 +1,78 @@ +# tws-t6-gsc-utils + +Source: [alicealys/t6-gsc-utils](https://github.com/alicealys/t6-gsc-utils). +The baseline commit and dependency revisions are in [tws-t6-gsc-utils/upstream.json](tws-t6-gsc-utils/upstream.json). +Source is tracked here directly; dependency checkouts are restored from that +manifest and ignored. Follow the [build instructions](../../README.md#building-plugins). +Upstream API documentation is in [tws-t6-gsc-utils/README.md](tws-t6-gsc-utils/README.md). + +## HTTP deadlines and diagnostics + +All native HTTP requests default to `connect_timeout_ms = 5000` and +`timeout_ms = 15000`. The latter includes connection setup; the shorter limit +wins during connection. Both can be overridden in the existing options array +with positive integer milliseconds. Zero, negative and non-integer overrides +are rejected before a request is created. Neither retries nor redirects are +added. TLS certificate verification remains enabled. + +These are libcurl transfer deadlines, starting when a worker begins the request. +Time waiting for a worker or the game thread to deliver completion is measured +separately. A native timeout releases the request and emits `done` with +`success = false`, a transport error, and diagnostics. Each request is sent once. +The telemetry sender then logs the failed event and advances its ordered queue. +A timeout does not prove the API did not already accept the event. + +The existing completion values remain in the same positions. An optional fourth +value adds diagnostics: + +```c +request waittill("done", response, success, error, diagnostics); +``` + +`success` continues to mean transport success, including completed HTTP 4xx/5xx +responses. Existing scripts that read only the first three values still work. +An updated reporter on an old plugin logs that diagnostics and native deadlines +are unverified; deploy the matching DLL to enable the fix. + +| Field | Meaning | +| --- | --- | +| `http_status` | HTTP response code; `0` if none was received | +| `curl_code` | libcurl result; `0` is transport success, `28` is timeout | +| `dns_ms` | Time to finish name resolution | +| `connect_ms` | Time to establish TCP | +| `tls_ms` | Time to finish TLS; `0` if no TLS handshake completed | +| `first_byte_ms` | Time to first response byte; `0` if none arrived | +| `total_ms` | Total native transfer duration | +| `worker_queue_ms` | Time waiting for the plugin worker pool | +| `notify_ms` | Time from native completion to notifying GSC | +| `connect_timeout_ms`, `timeout_ms` | Effective native deadlines | + +Curl milestone times are cumulative from transfer start, not durations to add +together. Diagnostics are provided for failures as well as successful transfers; +an unfinished milestone can be zero. No request headers, tokens or URLs are +included in diagnostics. Responses retain the existing 20 KiB truncation behavior. + +Telemetry logs the status and timings for each completion at log level 1. +Non-2xx responses log at level 0 with a bounded response preview. Health counters +keep transport `completed`/`failed` and track `http_rejected` separately; an HTTP +rejection is a completed transport. Producers, queue ordering and payloads are +unchanged. Heartbeats are not coalesced, failed reports are not retried, and API +receipt timestamps remain the existing behavior. + +## Validation and rollout + +Run `python3 tools/test_plugin_http.py` from the repository root for portable +native HTTP tests. Build the x86 DLL on Windows, then on a test game server check: + +1. Updated telemetry reports HTTP status and all timing fields on normal requests. +2. An endpoint that accepts a connection but does not reply produces a native + timeout near 15 seconds, followed by the next queued request. +3. HTTP 401/429/500 responses increment `http_rejected` without blocking the queue; + transport errors increment `failed` instead. +4. Leaderboard and older three-value HTTP consumers still receive completion. +5. After a full server-process restart, verify all four telemetry event types in + Electric Cherry. A successful transport alone is not API acceptance. + +The localhost tests compile the actual HTTP utility against the host libcurl. +They do not validate Windows linking, its Schannel backend or game VM notification +handling. Those checks require the Windows build and a running Plutonium server. diff --git a/t6/plugins/tws-t6-gsc-utils/.github/dependabot.yml b/t6/plugins/tws-t6-gsc-utils/.github/dependabot.yml new file mode 100644 index 0000000..f1cef93 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: gitsubmodule + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/.github/workflows/build.yml b/t6/plugins/tws-t6-gsc-utils/.github/workflows/build.yml new file mode 100644 index 0000000..c6a26b1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/.github/workflows/build.yml @@ -0,0 +1,80 @@ +name: Build + +on: + push: + branches: + - "*" + pull_request: + branches: + - "*" + types: [opened, synchronize, reopened] +concurrency: + group: ${{ github.ref }} + cancel-in-progress: false +jobs: + build: + name: Build binaries + runs-on: windows-2022 + strategy: + matrix: + configuration: + - Debug + - Release + steps: + - name: Check out files + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + lfs: false + + - name: Add msbuild to PATH + uses: microsoft/setup-msbuild@v2 + + - name: Generate project files + run: tools/premake5 vs2022 + + - name: Set up problem matching + uses: ammaraskar/msvc-problem-matcher@master + + - name: Build ${{matrix.configuration}} binaries + run: msbuild /m /v:minimal /p:Configuration=${{matrix.configuration}} /p:PlatformTarget=x86 build/tws-t6-gsc-utils.sln + + - name: Upload ${{matrix.configuration}} binaries + uses: actions/upload-artifact@v4 + with: + name: ${{matrix.configuration}} binaries + path: | + build/bin/${{matrix.configuration}}/tws-t6-gsc-utils.dll + deploy: + name: Deploy artifacts + needs: build + runs-on: ubuntu-latest + if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop') + steps: + - name: Setup main environment + if: github.ref == 'refs/heads/main' + run: echo "ALICE_MASTER_PATH=${{ secrets.ALICE_MASTER_SSH_PATH }}" >> $GITHUB_ENV + + - name: Download Release binaries + uses: actions/download-artifact@v4 + with: + name: Release binaries + + - name: Install SSH key + uses: shimataro/ssh-key-action@v2.7.0 + with: + key: ${{ secrets.ALICE_MASTER_SSH_PRIVATE_KEY }} + known_hosts: 'just-a-placeholder-so-we-dont-get-errors' + + - name: Add known hosts + run: ssh-keyscan -H ${{ secrets.ALICE_MASTER_SSH_ADDRESS }} >> ~/.ssh/known_hosts + + - name: Remove old data files + run: ssh ${{ secrets.ALICE_MASTER_SSH_USER }}@${{ secrets.ALICE_MASTER_SSH_ADDRESS }} rm -rf ${{ env.ALICE_MASTER_PATH }}/t6-gsc-utils/* + + - name: Upload binary + run: rsync -avz tws-t6-gsc-utils.dll ${{ secrets.ALICE_MASTER_SSH_USER }}@${{ secrets.ALICE_MASTER_SSH_ADDRESS }}:${{ env.ALICE_MASTER_PATH }}/t6-gsc-utils/ + + - name: Publish changes + run: ssh ${{ secrets.ALICE_MASTER_SSH_USER }}@${{ secrets.ALICE_MASTER_SSH_ADDRESS }} ${{ secrets.ALICE_MASTER_SSH_CHANGE_PUBLISH_COMMAND }} diff --git a/t6/plugins/tws-t6-gsc-utils/.gitignore b/t6/plugins/tws-t6-gsc-utils/.gitignore new file mode 100644 index 0000000..161cbeb --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/.gitignore @@ -0,0 +1,165 @@ +### Windows + +version.hpp + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Shortcuts +*.lnk + +### OSX + +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Visual Studio + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +build + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +### IDA +*.id0 +*.id1 +*.id2 +*.nam +*.til + +### Custom user files +# User scripts +user*.bat +*.code-workspace + +deps/mysql + +# Dependencies restored from upstream.json by tools/fetch_plugin_deps.py +/deps/GSL/ +/deps/asmjit/ +/deps/curl/ +/deps/date/ +/deps/json/ +/deps/libtomcrypt/ +/deps/libtommath/ +/deps/minhook/ +/deps/plutonium-sdk/ +/deps/sqlpp11/ +/deps/zlib/ diff --git a/t6/plugins/tws-t6-gsc-utils/README.md b/t6/plugins/tws-t6-gsc-utils/README.md new file mode 100644 index 0000000..8a1a7e1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/README.md @@ -0,0 +1,841 @@ +# tws-t6-gsc-utils +This is the TWS-maintained source snapshot. For the local HTTP timeout and +diagnostics changes, builds and installation, use the [TWS plugin notes](../README.md). +The upstream binary download below does not include these local changes. + +T6 version of [iw5-gsc-utils](https://github.com/alicealys/iw5-gsc-utils). +If you wish for any feature to be added please create an [issue](https://github.com/alicealys/t6-gsc-utils/issues/new). + +# Installation +* Download the latest version [t6-gsc-utils.dll](https://github.alicent.cat/t6-gsc-utils/t6-gsc-utils.dll) +* Copy it to `Plutonium/plugins/` + +# Features + +## Bitwise operators +The T6 GSC compiler is missing support for bitwise operators (or, xor, and, ...), instead you can use the corresponding functions: +```c +init() +{ + flags = 0; + flags = or(flags, 1); // flags |= 1; + flags = and(flags, not(1)); // flags &= ~1; + flags = xor(flags, 1); // flags ^= 1; + + if (and(flags, 1)) // flags & 1 + { + // [...] + } +} +``` + +## Misc +* `arrayRemoveKey(array, key)`: Removes an array element by its (string) key. + + ```c + init() + { + array = []; + array["foo"] = 1; + arrayRemoveKey(array, "foo"); + } + ``` +* `structGet(struct, key)`: Equivalent to `struct.field_name`. + + ```c + init() + { + object = spawnStruct(); + object.foo = 1; + print(structGet(object, "foo")); + } + ``` +* `structSet(struct, key, value)`: Equivalent to `struct.field_name = value`. + + ```c + init() + { + object = spawnStruct(); + structSet(object, "foo", 1); + print(structGet(object, "foo")); + } + ``` +* `structRemove(struct, key)`: Removes an element from a struct. + + ```c + init() + { + object = spawnStruct(); + object.foo = 1; + structRemove(object, "foo"); + } + ``` +* `getStructKeys(struct)`: Returns an array containing all the struct's keys. + + ```c + init() + { + object = spawnStruct(); + object.foo = 1; + object.bar = 2; + + keys = getStructKeys(object); + + for (i = 0; i < keys.size; i++) + { + print(keys[i], structGet(object, keys[i])); + } + } + ``` +* `isFunctionPtr(value)`: Returns true if value is a function. + + ```c + init() + { + assert(isFunctionPtr(::func) == true); + assert(isFunctionPtr("func") == false); + } + + func() + { + print("Hello world"); + } + ``` +* `isEntity(value)`: Returns true if value is an entity (ex. player, script_model, hudelem) + + ```c + init() + { + model = spawn("script_model", (0, 0, 0)); + array = []; + + assert(isEntity(model) == true); + assert(isEntity(array) == false); + } + ``` +* `isStruct(value)`: Return true if value is a struct. + + ```c + init() + { + object = spawnStruct(); + array = []; + + assert(isStruct(object) == true); + assert(isStruct(array) == false); + } + ``` +* `typeof(value)`: Returns the name of a value's type. + + ```c + init() + { + foo = 1; + bar = "hello world"; + baz = []; + + assert(typeof(foo) == "int"); + assert(typeof(bar) == "string"); + assert(typeof(baz) == "array"); + } + ``` +* `entity set(field, value)`: Sets an entity's field. + + ```c + init() + { + ent = spawn("script_origin", (0, 0, 0)); + ent set("origin", (100, 100, 100)); + } + ``` +* `entity get(field)`: Gets an entity's field. + + ```c + init() + { + ent = spawn("script_origin", (0, 0, 0)); + print(ent get("origin")); + } + ``` + +## Entity fields +* `flags`: Get/Set a player's entity flags. + + ```c + onPlayerSpawned() + { + while (true) + { + self waittill("spawned_player"); + self.flags = xor(self.flags, 1); // FL_GODMODE + } + } + ``` + + Enum of all flags: + + ```c + { + FL_GODMODE = 0x1, + FL_DEMI_GODMODE = 0x2, + FL_NOTARGET = 0x4, + FL_NO_KNOCKBACK = 0x8, + FL_DROPPED_ITEM = 0x10, + FL_NO_BOTS = 0x20, + FL_NO_HUMANS = 0x40, + FL_TOGGLE = 0x80, + FL_SOFTACTIVATE = 0x100, + FL_LOW_PRIORITY_USEABLE = 0x200, + FL_NO_TACTICAL_INSERTION = 0x400, + FL_DYNAMICPATH = 0x800, + FL_SUPPORTS_LINKTO = 0x1000, + FL_NO_AUTO_ANIM_UPDATE = 0x2000, + FL_GRENADE_TOUCH_DAMAGE = 0x4000, + FL_GRENADE_MARTYRDOM = 0x8000, + FL_MISSILE_DESTABILIZED = 0x10000, + FL_STABLE_MISSILES = 0x20000, + FL_REPEAT_ANIM_UPDATE = 0x40000, + FL_VEHICLE_TARGET = 0x80000, + FL_GROUND_ENT = 0x100000, + FL_CURSOR_HINT = 0x200000, + FL_USE_TURRET = 0x400000, + FL_MISSILE_ATTRACTOR = 0x800000, + FL_TARGET = 0x1000000, + FL_WEAPON_BEING_GRABBED = 0x2000000, + FL_OBSTACLE = 0x4000000, + FL_DODGE_LEFT = 0x8000000, + FL_DODGE_RIGHT = 0x10000000, + FL_BADPLACE_VOLUME = 0x20000000, + FL_AUTO_BLOCKPATHS = 0x40000000, + FL_MOVER_SLIDE = 0x80000000, + }; + ``` +* `clientflags`: Get/Set a player's client flags. + + ```c + onPlayerSpawned() + { + while (true) + { + self waittill("spawned_player"); + self.clientflags = xor(self.clientflags, 1); // NOCLIP + } + } + ``` + +## Entity Methods +* `entity noclip()`: Toggles Noclip. +* `entity ufo()`: Toggles Ufo. +* `entity god()`: Toggles God mode. +* `entity demigod()`: Toggles Demigod mode. +* `entity notarget()`: Toggles Notarget. + +## Command +* `executeCommand(command)`: Executes a console command. + + ```c + fast_restart() + { + executeCommand("fast_restart"); + } + ``` +* `addCommand(name, callback)`: Adds a console command. + + ```c + init() + { + addCommand("test_cmd", ::test_cmd); + } + + test_cmd(args) + { + assert(args[0] == "test_cmd"); + print("Hello world", args.size); + } + ``` + +## Chat +* `entity setname(name)`: Sets a player's name. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + player setName("hello world"); + } + } + ``` +* `entity rename(name)`: Same as `setname`. +* `entity resetName()`: Resets a player's name to the original. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + player setName("hello world"); + player resetName(); + } + } + ``` +* `entity setClantag(clantag)`: Sets a player's clantag. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + player setClantag("hello world"); + } + } + ``` +* `entity resetClantag()`: Resets a player's clantag to the original. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + player setClantag("hello world"); + player resetClantag(); + } + } + ``` +* `say(message)`: Sends a chat message to all players. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + say(player.name + " connected!"); + } + } + ``` +* `entity tell(message)`: Sends a chat message to a player. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + player tell("Welcome back " + player.name + "!"); + } + } + ``` +* `sendServerCommand(clientnum, cmd)`: Executes SV_GameSendServerCommand. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + sendServerCommand(-1, "j \"Hello world\""); // -1 -> all clients + } + } + ``` + +* `entity sendServerCommand(cmd)`: Executes SV_GameSendServerCommand on a specified client. + + ```c + onPlayerConnected() + { + while (true) + { + level waittill("connected", player); + player sendServerCommand("j \"Hello world\""); + } + } + ``` +* `chat::register_callback(callback[, sync])`: Registers a chat callback. + * `callback: function(text: string, mode: int)`: the GSC function that will be executed, `self` is the player that sent the message. + * `sync: bool (default: false)`: whether the callback should be executed immediately or in the next frame, setting it to true allows you to hide the message by making the callback return true. + **WARNING**: Using certain GSC function in the callback when `sync` is true can cause crashes (example: any function that causes damage), so only set it to true when you really need it. + ```gsc + init() + { + chat::register_callback(::chat_callback); + } + + chat_callback(text, mode) + { + self tell(string::format("You said %s", text)); + } + ``` + +* `chat::register_command(name, callback[, hide_message[, sync])`: Regisers a chat command. + * `name`: can be either a string or an array of strings. + * `callback: function(args: array)`: the GSC function that will be executed, `self` is the player that sent the message. + * `hide_message: bool (default: false)`: specifies whether the message sent by the player should be hidden from the chat. + * `sync: bool (default: false)`: as described in `chat::register_callback` + + ```gsc + init() + { + chat::register_command("!hello", ::cmd_hello, true); + } + + cmd_hello(args) + { + assert(string::to_lower(args[0]) == "!hello"); + self tell("world"); + } + ``` +* `chat::disable_command(name)`: Disables a chat command. +* `chat::enable_command(name)`: Enables a chat command. + +# IO +The basepath for all IO functions is `Plutonium/storage/t6` + + * `fileExists(path)`: Returns true if the file exists. + * `writeFile(path, data[, append])`: Creates a file if it doesn't exist and writes/appends text to it. + * `readFile(path)`: Reads a file. + * `fileSize(path)`: Returns file size in bytes. + * `createDirectory(path)`: Creates a directory. + * `directoryExists(path)`: Returns true if the directory exists. + * `directoryIsEmpty(path)`: Returns true if the directory is empty. + * `listFiles(path)`: Returns the list of files in the directory as an array. + * `copyFolder(source, target)`: Copies a folder. + * `jsonPrint(...)`: Prints values as json. + * `httpGet(url)`: Creates a GET HTTP request- + + ```c + init() + { + req = httpGet("https://example.com"); + req waittill("done", result); + print(result); + } + ``` + * `httpPost(url, data, headers)`: Creates a [POST HTTP request](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) -> + + ```c + headers = []; + headers["Content-Type"] = "application/json"; + + data = []; + data["test_key"] = "test_value"; + + req = httpPost("https://example.com", jsonSerialize(data, 0), headers); + req waittill("done", result); + print(result); + ``` +# JSON + +* `jsonSerialize(variable[, indent])`: Converts GSC variables (such as arrays) into JSON: + + ```c + init() + { + array = []; + array[0] = 1; + array[1] = 2; + json = jsonSerialize(array, 4); + + print(json); + + /* + [ + 2, + 1 + ] + */ + } + ``` + + This function can also be useful to reveal contents of existing arrays such as `game`: + ```c + init() + { + print(jsonSerialize(game["allies_model"], 4)); + + /* + { + "ASSAULT": "[function]", + "GHILLIE": "[function]", + "JUGGERNAUT": "[function]", + "LMG": "[function]", + "RIOT": "[function]", + "SHOTGUN": "[function]", + "SMG": "[function]", + "SNIPER": "[function]" + } + */ + + print(jsonSerialize(game["music"], 4)); + + /* + { + "defeat_allies": "UK_defeat_music", + "defeat_axis": "IC_defeat_music", + "losing_allies": "UK_losing_music", + "losing_axis": "IC_losing_music", + "losing_time": "mp_time_running_out_losing", + "nuke_music": "nuke_music", + "spawn_allies": "UK_spawn_music", + "spawn_axis": "IC_spawn_music", + "suspense": [ + "mp_suspense_06", + "mp_suspense_05", + "mp_suspense_04", + "mp_suspense_03", + "mp_suspense_02", + "mp_suspense_01" + ], + "victory_allies": "UK_victory_music", + "victory_axis": "IC_victory_music", + "winning_allies": "UK_winning_music", + "winning_axis": "IC_winning_music" + } + */ + } + ``` +* `jsonParse(json)`: Converts JSON into a GSC variable: + + ```c + init() + { + array = jsonParse("[1,2,3,4]"); + print(array[0] + " " + array[1] + " " + array[2] + " " + array[3]); + + /* + 1 2 3 4 + */ + } + ``` +* `createMap(...)`: Creates a string-indexed array: + + ```c + init() + { + array = map("first", 1, "second", 2); + print(jsonSerialize(array, 4)); + /* + { + "first": 1, + "second": 2 + } + */ + } + ``` +* `jsonDump(file, value[, indent])`: Dumps a json value to a file. + + ```c + init() + { + jsonDump("level.txt", level, 4); + } + ``` + +# Debugging +* `crash()`: Crashes the server. +* `breakpoint(message)`: Pauses the server's execution and shows a message box with the passed message and call stack. +* `assert(condition)`: Throws an error if condition is false. + +None of these functions will do anything unless `developer_script` is set to `1`, so make sure to set it before attempting to use them. + +Additionally, running the server with the `--gsc-debug` flag will set a custom crash handler to the server which will dump the GSC VM stack trace (along with local variables) to a text file (called `gsc_vm_dump.txt`) along with the regular minidump. These dumps will be saved to `Plutonium/storage/t6/minidumps`. + +# Threads +* `killThread(function[, owner])`: Kills a running/wait/waittill thread based on the function it's executing and optionally even the thread owner object/entity. + + ```c + /* + This will kill the execution of "test_thread" after 5 seconds. + */ + + init() + { + level thread test_thread(); + level thread test_kill_thread(); + } + + test_kill_thread() + { + wait 5; + killThread(::test_thread, level); + } + + test_thread() + { + while (true) + { + wait 1; + print("Hello world"); + } + } + ``` +* `killAllThreads(function[, owner])`: Same as `killThread` but kills all matching threads. + +# Bots + +Custom bot names and clantags can be set by creating a file in `Plutonium/storage/t6/bots.txt` +This feature is now supported by Plutonium and you should refer to the official forum for assistance. + +* `dropAllBots()`: Kick all test clients from the lobby. + +# GameLog + +Remove the clan tag from the name of a player from the game log. This fixes IW4M erroneously thining the full name of a player is made of the clan tag plus the name instead of just the name. +This also patches the behaviour of the .name getter function for players for GSC scripts. In short, this only affects GSC and the game log. + +* `sv_display_clan_tag`: This dvar toggles the patch + +# MySQL + +You can access a mysql database using the following functions: + +* `mysql::set_config(config)`: Must be called before calling other mysql functions, config should be a struct of this kind: + + ```gsc + init() + { + config = spawnstruct(); + config.host = "localhost"; + config.user = "root"; + config.password = "password"; + config.port = 3306; + config.database = "database_name"; + mysql::set_config(config); + } + ``` +* `mysql::query(query)`: Executes an sql statement, returns a query object: + + ```gsc + init() + { + // call mysql::set_config + + query = mysql::execute("select * from `players` where guid=1"); + query waittill("done", result); + if (result.size > 0) + { + print("player name " + result[0]["name"]); + } + } + ``` +* `mysql::prepared_statement(query: string, params...)`: Executes a prepared statement, params can be a list of arguments or an array: + + ```gsc + init() + { + // call mysql::set_config + + // use variadic args for the parameters + { + query = mysql::prepared_statement("insert into `players` (`guid`, `name`) values (?, ?)", 123, "foo"); + query waittill("done", result, affected_rows, error); + } + + // use an array for the parameters + { + params = array(123, "foo"); + query = mysql::prepared_statement("insert into `players` (`guid`, `name`) values (?, ?)", params); + query waittill("done", result, affected_rows, error); + } + } + ``` + +# Hud Elements +* `hudelem::set_text(text: string)`: Sets the text of a hud element by reserving a config string and modifying its value. + This function can be used to prevent the "G_FindConfigstringIndex: overflow (%d): " error. + ```gsc + { + // ... + elem = newhudelement(); + elem.x = 100; + elem.y = 100; + elem.font = "objective"; + elem.fontscale = 1; + i = 0; + while (true) + { + elem hudelem::set_text(string::format("frame %i", i++)); + wait 0.05; + } + } + ``` + +## Int64 +These int64 functions allow you to use int64 values within GSC, which normally only supports 32 bit integers. +This is useful if you store int64 values in a file or a database and need to access them from GSC. +The values are stored as strings but all the functions below can take either a string or int for an int64 argument. +`int64` represents a value that is either a `string` or an `int`. +* `int64::op(a: int64, op: string, b: int64): int64|bool`: Performs an operation between 2 int64 values (stored as strings) + ```gsc + { + result = int64::op("2583528945238953952", "+", "12039152933205235"); + assert(result == "2595568098172159187"); + + result = int64::op("5834258295282538925", ">", 1); + assert(result == true); + } + ``` + List of supported operators: + * `+` + * `-` + * `*` + * `/` + * `&` + * `^` + * `|` + * `~` + * `%` + * `>>` + * `<<` + * `++` + * `--` +* `int64::is_int(value: int64): bool`: Returns true if an int64 value fits within an int32 value. +* `int64::to_int(value: int64): int`: Converts an int64 value to an int32 value. +* `int64::min(a: int64, b: int64): int64`: Returns the minimum between 2 int64 values. +* `int64::max(a: int64, b: int64): int64`: Returns the maximum between 2 int64 values. + +## Function list +* `dropallbots` +* `say` +* `sendservercommand` +* `onplayersay` +* `chat::register_callback` +* `chat::register_command` +* `chat::disable_command` +* `chat::enable_command` +* `executecommand` +* `command::execute` +* `addcommand` +* `command::add` +* `addclientcommand` +* `command::add_sv` +* `crash` +* `breakpoint` +* `assert` +* `assertmsg` +* `throw` +* `killthread` +* `killallthreads` +* `getvarusage` +* `getchildvarusage` +* `getusagestats` +* `removeconfigstring` +* `replaceconfigstring` +* `getcurrentthread` +* `printcallstack` +* `getcallstack` +* `getfunctionargcount` +* `arrayremovekey` +* `xor` +* `not` +* `and` +* `or` +* `structget` +* `structset` +* `structremove` +* `getstructkeys` +* `isfunctionptr` +* `isentity` +* `isstruct` +* `typeof` +* `worldget` +* `worldset` +* `http::get` +* `httpget` +* `curl` +* `http::request` +* `httppost` +* `int64_is_int` +* `int64::is_int` +* `int64_to_int` +* `int64::to_int` +* `int64_op` +* `int64::op` +* `int64_min` +* `int64::min` +* `int64_max` +* `int64::max` +* `hashstring` +* `writefile` +* `io::write_file` +* `appendfile` +* `io::append_file` +* `fileexists` +* `io::file_exists` +* `movefile` +* `io::move_file` +* `filesize` +* `io::file_size` +* `createdirectory` +* `io::create_directory` +* `directoryexists` +* `io::directory_exists` +* `directoryisempty` +* `io::directory_is_empty` +* `listfiles` +* `io::list_files` +* `removefile` +* `io::remove_file` +* `removedirectory` +* `io::remove_directory` +* `copyfolder` +* `io::copy_folder` +* `copydirectory` +* `io::copy_directory` +* `readfile` +* `io::read_file` +* `createmap` +* `json::create_map` +* `jsonparse` +* `json::parse` +* `jsonserialize` +* `json::serialize` +* `jsondump` +* `json::dump` +* `jsonprint` +* `json::print` +* `mysql::set_config` +* `mysql::query` +* `mysql::prepared_statement` +* `createnotifygroup` +* `va` +* `string::va` +* `formatstring` +* `string::format` +* `sprintf` +* `printf` +* `print` +* `toupper` +* `string::to_upper` +* `tolower` +* `string::to_lower` +* `string::is_numeric` +* `string::starts_with` +* `string::ends_with` +* `string::replace` +* `string::regex_replace` +* `string::regex_match` +* `string::regex_search` +* `dumpturret` +## Method list +* `rename` +* `setname` +* `resetname` +* `resetclantag` +* `setclantag` +* `tell` +* `sendservercommand` +* `hudelem::set_text` +* `get` +* `set` +* `noclip` +* `ufo` +* `god` +* `demigod` +* `notarget` +* `setturretfield` +* `getturretfield` diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/asmjit.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/asmjit.lua new file mode 100644 index 0000000..ee93259 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/asmjit.lua @@ -0,0 +1,34 @@ +asmjit = { + source = path.join(dependencies.basePath, "asmjit"), +} + +function asmjit.import() + links { "asmjit" } + asmjit.includes() +end + +function asmjit.includes() + includedirs { + path.join(asmjit.source, "src") + } + + defines { + "ASMJIT_STATIC" + } +end + +function asmjit.project() + project "asmjit" + language "C++" + + asmjit.includes() + + files { + path.join(asmjit.source, "src/**.cpp"), + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, asmjit) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/curl.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/curl.lua new file mode 100644 index 0000000..3d36749 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/curl.lua @@ -0,0 +1,73 @@ +curl = { + source = path.join(dependencies.basePath, "curl"), +} + +function curl.import() + links { "curl" } + + filter "toolset:msc*" + links { "Crypt32.lib" } + filter {} + + curl.includes() +end + +function curl.includes() +filter "toolset:msc*" + includedirs { + path.join(curl.source, "include"), + } + + defines { + "CURL_STRICTER", + "CURL_STATICLIB", + "CURL_DISABLE_LDAP", + } +filter {} +end + +function curl.project() + if not os.istarget("windows") then + return + end + + project "curl" + language "C" + + curl.includes() + + includedirs { + path.join(curl.source, "lib"), + } + + files { + path.join(curl.source, "lib/**.c"), + path.join(curl.source, "lib/**.h"), + } + + defines { + "BUILDING_LIBCURL", + } + + filter "toolset:msc*" + + defines { + "USE_SCHANNEL", + "USE_WINDOWS_SSPI", + "USE_THREADS_WIN32", + } + + filter "toolset:not msc*" + + defines { + "USE_GNUTLS", + "USE_THREADS_POSIX", + } + + filter {} + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, curl) \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/gsl.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/gsl.lua new file mode 100644 index 0000000..7a2daf6 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/gsl.lua @@ -0,0 +1,19 @@ +gsl = { + source = path.join(dependencies.basePath, "GSL"), +} + +function gsl.import() + gsl.includes() +end + +function gsl.includes() + includedirs { + path.join(gsl.source, "include") + } +end + +function gsl.project() + +end + +table.insert(dependencies, gsl) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/json.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/json.lua new file mode 100644 index 0000000..e5eb493 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/json.lua @@ -0,0 +1,19 @@ +json = { + source = path.join(dependencies.basePath, "json"), +} + +function json.import() + json.includes() +end + +function json.includes() + includedirs { + path.join(json.source, "single_include/*") + } +end + +function json.project() + +end + +table.insert(dependencies, json) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/libtomcrypt.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/libtomcrypt.lua new file mode 100644 index 0000000..6c6f28d --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/libtomcrypt.lua @@ -0,0 +1,61 @@ +libtomcrypt = { + source = path.join(dependencies.basePath, "libtomcrypt"), +} + +function libtomcrypt.import() + links { + "libtomcrypt" + } + + libtomcrypt.includes() +end + +function libtomcrypt.includes() + includedirs { + path.join(libtomcrypt.source, "src/headers") + } + + defines { + "LTC_NO_FAST", + "LTC_NO_PROTOTYPES", + "LTC_NO_RSA_BLINDING", + } +end + +function libtomcrypt.project() + project "libtomcrypt" + language "C" + + libtomcrypt.includes() + libtommath.import() + + files { + path.join(libtomcrypt.source, "src/**.c"), + } + + removefiles { + path.join(libtomcrypt.source, "src/**/*tab.c"), + path.join(libtomcrypt.source, "src/encauth/ocb3/**.c"), + } + + defines { + "_CRT_SECURE_NO_WARNINGS", + "LTC_SOURCE", + "_LIB", + "USE_LTM" + } + + removedefines { + "_DLL", + "_USRDLL" + } + + linkoptions { + "-IGNORE:4221" + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, libtomcrypt) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/libtommath.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/libtommath.lua new file mode 100644 index 0000000..ab4cdde --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/libtommath.lua @@ -0,0 +1,52 @@ +libtommath = { + source = path.join(dependencies.basePath, "libtommath"), +} + +function libtommath.import() + links { + "libtommath" + } + + libtommath.includes() +end + +function libtommath.includes() + includedirs { + libtommath.source + } + + defines { + "LTM_DESC", + "__STDC_IEC_559__", + "MP_NO_DEV_URANDOM", + } +end + +function libtommath.project() + project "libtommath" + language "C" + + libtommath.includes() + + files { + path.join(libtommath.source, "*.c"), + } + + defines { + "_LIB" + } + + removedefines { + "_DLL", + "_USRDLL" + } + + linkoptions { + "-IGNORE:4221" + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, libtommath) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/minhook.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/minhook.lua new file mode 100644 index 0000000..396d4d3 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/minhook.lua @@ -0,0 +1,31 @@ +minhook = { + source = path.join(dependencies.basePath, "minhook"), +} + +function minhook.import() + links { "minhook" } + minhook.includes() +end + +function minhook.includes() + includedirs { + path.join(minhook.source, "include") + } +end + +function minhook.project() + project "minhook" + language "C" + + minhook.includes() + + files { + path.join(minhook.source, "src/**.h"), + path.join(minhook.source, "src/**.c"), + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, minhook) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/minizip.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/minizip.lua new file mode 100644 index 0000000..4a5754b --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/minizip.lua @@ -0,0 +1,43 @@ +minizip = { + source = path.join(dependencies.basePath, "zlib/contrib/minizip"), +} + +function minizip.import() + links { "minizip" } + zlib.import() + minizip.includes() +end + +function minizip.includes() + includedirs { + minizip.source + } + + zlib.includes() +end + +function minizip.project() + project "minizip" + language "C" + + minizip.includes() + + files { + path.join(minizip.source, "*.h"), + path.join(minizip.source, "*.c"), + } + + removefiles { + path.join(minizip.source, "miniunz.c"), + path.join(minizip.source, "minizip.c"), + } + + defines { + "_CRT_SECURE_NO_DEPRECATE", + } + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, minizip) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/mysql.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/mysql.lua new file mode 100644 index 0000000..a35778f --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/mysql.lua @@ -0,0 +1,52 @@ +if (os.host() ~= "windows") then + error("automatic mysql installation is not supported on your os") +end + +mysql = { + source = path.join(dependencies.basePath, "mysql"), + version = "5.7.43", + download = "https://cdn.alicent.cat/mysql-5.7.43-win32.zip", +} + +function mysql.install() + local hfile = io.open(string.format("%s/include/mysql.h", mysql.source), "r") + if (hfile) then + return + end + + os.execute(string.format("mkdir \"%s\" 2> nul", mysql.source)) + + local folder = path.join(mysql.source, "mysql-5.7.43-win32") + local archive = path.join(mysql.source, "mysql-5.7.43-win32.zip") + + print("Downloading MYSQL") + os.execute(string.format("curl \"%s\" -L -o \"%s\"", mysql.download, archive)) + + os.execute(string.format("powershell -command \"Expand-Archive -Force \\\"%s\\\" \\\"%s\\\"\"", archive, mysql.source)) + os.execute(string.format("powershell -command \"mv \\\"%s/*\\\" \\\"%s\\\"\"", folder, mysql.source)) + os.execute(string.format("powershell -command \"rm \\\"%s\\\"\"", archive)) + os.execute(string.format("rmdir \"%s\"", folder)) +end + +function mysql.import() + mysql.install() + mysql.includes() +end + +function mysql.includes() + includedirs { + path.join(mysql.source, "include"), + } +end + +function mysql.project() + project "mysql" + language "C" + + mysql.includes() + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, mysql) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/plutonium-sdk.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/plutonium-sdk.lua new file mode 100644 index 0000000..22d8ab7 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/plutonium-sdk.lua @@ -0,0 +1,18 @@ +plutonium_sdk = { + source = path.join(dependencies.basePath, "plutonium-sdk"), +} + +function plutonium_sdk.import() + plutonium_sdk.includes() +end + +function plutonium_sdk.includes() + includedirs { + plutonium_sdk.source, + } +end + +function plutonium_sdk.project() +end + +table.insert(dependencies, plutonium_sdk) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/sqlpp11.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/sqlpp11.lua new file mode 100644 index 0000000..1f96b16 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/deps/premake/sqlpp11.lua @@ -0,0 +1,26 @@ +sqlpp11 = { + source = path.join(dependencies.basePath, "sqlpp11"), +} + +function sqlpp11.import() + sqlpp11.includes() +end + +function sqlpp11.includes() + includedirs { + path.join(sqlpp11.source, "include"), + path.join(dependencies.basePath, "date/include"), + } +end + +function sqlpp11.project() + project "sqlpp11" + language "C++" + + sqlpp11.includes() + + warnings "Off" + kind "StaticLib" +end + +table.insert(dependencies, sqlpp11) diff --git a/t6/plugins/tws-t6-gsc-utils/deps/premake/zlib.lua b/t6/plugins/tws-t6-gsc-utils/deps/premake/zlib.lua new file mode 100644 index 0000000..566a707 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/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/t6/plugins/tws-t6-gsc-utils/generate.bat b/t6/plugins/tws-t6-gsc-utils/generate.bat new file mode 100644 index 0000000..2bad27b --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/generate.bat @@ -0,0 +1,4 @@ +@echo off +echo Updating submodules... +call git submodule update --init --recursive +call tools\premake5 %* vs2022 diff --git a/t6/plugins/tws-t6-gsc-utils/premake5.lua b/t6/plugins/tws-t6-gsc-utils/premake5.lua new file mode 100644 index 0000000..90b36b4 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/premake5.lua @@ -0,0 +1,104 @@ +dependencies = { + basePath = "./deps" +} + +function dependencies.load() + dir = path.join(dependencies.basePath, "premake/*.lua") + deps = os.matchfiles(dir) + + for i, dep in pairs(deps) do + dep = dep:gsub(".lua", "") + require(dep) + end +end + +function dependencies.imports() + for i, proj in pairs(dependencies) do + if type(i) == 'number' then + proj.import() + end + end +end + +function dependencies.projects() + for i, proj in pairs(dependencies) do + if type(i) == 'number' then + proj.project() + end + end +end + +dependencies.load() + +workspace "tws-t6-gsc-utils" + location "./build" + objdir "%{wks.location}/obj/%{cfg.buildcfg}" + targetdir "%{wks.location}/bin/%{cfg.buildcfg}" + targetname "%{prj.name}" + + configurations { "Debug", "Release", } + + language "C++" + cppdialect "C++20" + + architecture "x86" + + systemversion "latest" + symbols "On" + staticruntime "On" + editandcontinue "Off" + warnings "Extra" + characterset "ASCII" + + flags + { + "NoIncrementalLink", + "MultiProcessorCompile", + } + + filter "configurations:Release" + optimize "Full" + defines { "NDEBUG" } + filter {} + + filter "configurations:Debug" + optimize "Debug" + defines { "DEBUG", "_DEBUG" } + filter {} + + startproject "tws-t6-gsc-utils" + project "tws-t6-gsc-utils" + kind "SharedLib" + language "C++" + + files + { + "./src/**.h", + "./src/**.hpp", + "./src/**.cpp", + "./src/**.rc", + } + + includedirs + { + "%{prj.location}/src", + "./src", + "./deps/mysql/include" + } + + libdirs {"./deps/mysql/lib"} + + resincludedirs + { + "$(ProjectDir)src" + } + + linkoptions {"/DELAYLOAD:libmysql.dll"} + + pchheader "stdinc.hpp" + pchsource "src/stdinc.cpp" + + dependencies.imports() + + group "Dependencies" + dependencies.projects() \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/chat.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/chat.cpp new file mode 100644 index 0000000..deb8ed8 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/chat.cpp @@ -0,0 +1,348 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "gsc.hpp" +#include "scripting.hpp" +#include "scheduler.hpp" + +#include +#include +#include + +namespace chat +{ + namespace + { + struct chat_command_t + { + scripting::function callback; + bool hide_message; + bool enabled; + bool sync; + }; + + struct chat_callback_t + { + scripting::function callback; + bool sync; + }; + + using userinfo_map = std::unordered_map; + + utils::hook::detour sv_get_user_info_hook; + utils::hook::detour client_connect_hook; + utils::hook::detour g_say_hook; + + std::array userinfo_overrides; + std::unordered_map chat_commands; + std::vector chat_callbacks; + + void sv_get_user_info_stub(int index, char* buffer, int buffer_size) + { + sv_get_user_info_hook.invoke(index, buffer, buffer_size); + + utils::info_string map(buffer); + + for (const auto& [key, val] : userinfo_overrides[index]) + { + if (val.empty()) + { + map.remove(key); + } + else + { + map.set(key, val); + } + } + + const auto userinfo = map.build(); + strncpy_s(buffer, 1024, userinfo.data(), _TRUNCATE); + } + + void clear_client_overrides(unsigned int client) + { + userinfo_overrides[client].clear(); + } + + bool handle_chat_command(game::gentity_s* ent, const std::string& text) + { + const auto trimmed = utils::string::trim(text); + const auto args = utils::string::split(trimmed, ' '); + if (args.size() <= 0) + { + return false; + } + + const auto name = utils::string::to_lower(args[0]); + const auto iter = chat_commands.find(name); + if (iter == chat_commands.end()) + { + return false; + } + + if (!iter->second.enabled) + { + return false; + } + + if (iter->second.sync) + { + const auto entity_id = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, ent->number, 0, 0); + const auto result = iter->second.callback(entity_id, {args}); + + if (result.is()) + { + return result.as(); + } + } + else + { + scheduler::once([=] + { + const auto entity_id = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, ent->number, 0, 0); + iter->second.callback(entity_id, {args}); + }, scheduler::server); + } + + return iter->second.hide_message; + } + + bool handle_chat_callback(game::gentity_s* ent, const std::string& text, const int mode) + { + auto hidden = false; + + for (const auto& chat_callback : chat_callbacks) + { + if (chat_callback.sync) + { + const auto entity_id = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, ent->number, 0, 0); + const auto result = chat_callback.callback(entity_id, {text, mode}); + + if (result.is()) + { + hidden = hidden || result.as(); + } + } + else + { + scheduler::once([=] + { + const auto entity_id = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, ent->number, 0, 0); + chat_callback.callback(entity_id, {text, mode}); + }, scheduler::server); + } + } + + return hidden; + } + + void g_say_stub(game::gentity_s* ent, game::gentity_s* target, int mode, const char* text) + { + auto hidden = false; + hidden = hidden || handle_chat_command(ent, text); + hidden = hidden || handle_chat_callback(ent, text, mode); + + if (!hidden) + { + g_say_hook.invoke(ent, target, mode, text); + } + } + + void client_clean_name(const char* in, char* out, int out_size) + { + utils::hook::invoke(SELECT(0x424F00, 0x655010), out, in, out_size); // I_strncpyz + } + + __declspec(naked) void client_clean_name_stub() + { + __asm + { + pushad + + push [esp + 0x20 + 0x4] // outSize + push edx // out + push ecx // in + call client_clean_name + add esp, 0xC + + popad + ret + } + } + + game::scr_entref_t check_entity(const scripting::entity& entity) + { + const auto ent = entity.get_entity_reference(); + if (ent.classnum != 0) + { + throw std::runtime_error("invalid entity"); + } + + if (game::g_entities[ent.entnum].client == nullptr) + { + throw std::runtime_error("not a player entity"); + } + + return ent; + } + + template + void enable_chat_command(const std::string& name) + { + const auto lower = utils::string::to_lower(name); + const auto iter = chat_commands.find(lower); + if (iter == chat_commands.end()) + { + return; + } + + iter->second.enabled = value; + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + const auto plutonium_g_say_stub = utils::hook::extract(SELECT(0x6A7A40, 0x493DF0) + 1); + g_say_hook.create(plutonium_g_say_stub, g_say_stub); + sv_get_user_info_hook.create(SELECT(0x68BB90, 0x4C10F0), sv_get_user_info_stub); + + plugin->get_interface()->callbacks()->on_player_connect(clear_client_overrides); + plugin->get_interface()->callbacks()->on_player_disconnect(clear_client_overrides); + + utils::hook::call(SELECT(0x4ED764, 0x427E84), client_clean_name_stub); + utils::hook::call(SELECT(0x4ED79F, 0x427EBF), client_clean_name_stub); + + scripting::on_shutdown([]() + { + for (auto& entry : userinfo_overrides) + { + entry.clear(); + } + + chat_callbacks.clear(); + chat_commands.clear(); + }); + + gsc::method::add("rename", [](const scripting::entity& entity, const std::string& name) + { + const auto ent = check_entity(entity); + userinfo_overrides[ent.entnum]["name"] = name; + game::ClientUserInfoChanged(ent.entnum); + }); + + gsc::method::add("setname", [](const scripting::entity& entity, const std::string& name) + { + const auto ent = check_entity(entity); + userinfo_overrides[ent.entnum]["name"] = name; + game::ClientUserInfoChanged(ent.entnum); + }); + + gsc::method::add("resetname", [](const scripting::entity& entity) + { + const auto ent = check_entity(entity); + userinfo_overrides[ent.entnum].erase("name"); + game::ClientUserInfoChanged(ent.entnum); + }); + + gsc::method::add("resetclantag", [](const scripting::entity& entity) + { + const auto ent = check_entity(entity); + userinfo_overrides[ent.entnum].erase("clantag"); + userinfo_overrides[ent.entnum].erase("clanAbbrev"); + userinfo_overrides[ent.entnum].erase("clanAbbrevEV"); + game::ClientUserInfoChanged(ent.entnum); + }); + + gsc::method::add("setclantag", [](const scripting::entity& entity, const std::string& name) + { + const auto ent = check_entity(entity); + userinfo_overrides[ent.entnum]["clantag"] = name; + userinfo_overrides[ent.entnum]["clanAbbrev"] = name; + userinfo_overrides[ent.entnum]["clanAbbrevEV"] = "1"; + game::ClientUserInfoChanged(ent.entnum); + }); + + gsc::method::add("tell", [](const scripting::entity& entity, const std::string& msg) + { + const auto ent = check_entity(entity); + game::SV_GameSendServerCommand(ent.entnum, 0, utils::string::va("j \"%s\"", msg.data())); + }); + + gsc::function::add("say", [](const std::string& msg) + { + game::SV_GameSendServerCommand(-1, 0, utils::string::va("j \"%s\"", msg.data())); + }); + + gsc::function::add("sendservercommand", [](const int client, const std::string& cmd) + { + game::SV_GameSendServerCommand(client, 0, cmd.data()); + }); + + gsc::method::add("sendservercommand", [](const scripting::entity& entity, const std::string& cmd) + { + const auto ent = check_entity(entity); + game::SV_GameSendServerCommand(ent.entnum, 0, cmd.data()); + }); + + gsc::function::add_multiple([](const scripting::function& callback, const scripting::variadic_args& va) + { + chat_callback_t chat_callback{}; + chat_callback.sync = false; + chat_callback.callback = callback; + + if (va.size() >= 1) + { + chat_callback.sync = va[0].as(); + } + + chat_callbacks.emplace_back(chat_callback); + }, "onplayersay", "chat::register_callback"); + + gsc::function::add("chat::register_command", [](const scripting::function_argument& names_or_name, + const scripting::function& callback, const scripting::variadic_args& va) + { + chat_command_t command{}; + command.hide_message = true; + command.sync = false; + command.callback = callback; + command.enabled = true; + + if (va.size() >= 1) + { + command.hide_message = va[0].as(); + } + + if (va.size() >= 2) + { + command.sync = va[1].as(); + } + + if (names_or_name.is()) + { + const std::vector names = names_or_name; + for (const auto& name : names) + { + const auto lower = utils::string::to_lower(name); + chat_commands.insert(std::make_pair(lower, command)); + } + } + else + { + const auto name = names_or_name.as(); + const auto lower = utils::string::to_lower(name); + chat_commands.insert(std::make_pair(lower, command)); + } + }); + + gsc::function::add("chat::disable_command", enable_chat_command); + gsc::function::add("chat::enable_command", enable_chat_command); + } + }; +} + +REGISTER_COMPONENT(chat::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/clients.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/clients.cpp new file mode 100644 index 0000000..98f2a71 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/clients.cpp @@ -0,0 +1,120 @@ +#include +#include "loader/component_loader.hpp" + +#include "gsc.hpp" + +namespace clients +{ + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add("dropallbots", [] + { + const auto* dvar = game::Dvar_FindVar("com_maxclients"); + const auto client_count = game::Dvar_GetInt(dvar); + + for (auto i = 0; i < client_count; ++i) + { + if (game::SV_IsTestClient(i)) + { + game::SV_GameDropClient(i, "GAME_DROPPEDFORINACTIVITY"); + } + } + }); + + gsc::method::add("noclip", [](const scripting::entity& entity) + { + const auto entref = entity.get_entity_reference(); + const auto* ent = game::GetPlayerEntity(entref); + + if (ent->client->flags & game::gclientFlag::NOCLIP) + { + ent->client->flags &= ~game::gclientFlag::NOCLIP; + } + else + { + ent->client->flags |= game::gclientFlag::NOCLIP; + } + + game::SV_GameSendServerCommand(entref.entnum, 0, utils::string::va("%c \"%s\"", 0x4F, + (ent->client->flags & game::gclientFlag::NOCLIP) ? "GAME_NOCLIPON" : "GAME_NOCLIPOFF")); + }); + + gsc::method::add("ufo", [](const scripting::entity& entity) + { + const auto entref = entity.get_entity_reference(); + const auto* ent = game::GetPlayerEntity(entref); + + if (ent->client->flags & game::gclientFlag::UFO) + { + ent->client->flags &= ~game::gclientFlag::UFO; + } + else + { + ent->client->flags |= game::gclientFlag::UFO; + } + + game::SV_GameSendServerCommand(entref.entnum, 0, utils::string::va("%c \"%s\"", 0x4F, + (ent->client->flags & game::gclientFlag::UFO) ? "GAME_UFOON" : "GAME_UFOOFF")); + }); + + gsc::method::add("god", [](const scripting::entity& entity) + { + const auto entref = entity.get_entity_reference(); + auto* ent = game::GetEntity(entref); + + if (ent->flags & game::entityFlag::FL_GODMODE) + { + ent->flags &= ~game::entityFlag::FL_GODMODE; + } + else + { + ent->flags |= game::entityFlag::FL_GODMODE; + } + + game::SV_GameSendServerCommand(entref.entnum, 0, utils::string::va("%c \"%s\"", 0x4F, + (ent->flags & game::entityFlag::FL_GODMODE) ? "GAME_GODMODE_ON" : "GAME_GODMODE_OFF")); + }); + + gsc::method::add("demigod", [](const scripting::entity& entity) + { + const auto entref = entity.get_entity_reference(); + auto* ent = game::GetEntity(entref); + + if (ent->flags & game::entityFlag::FL_DEMI_GODMODE) + { + ent->flags &= ~game::entityFlag::FL_DEMI_GODMODE; + } + else + { + ent->flags |= game::entityFlag::FL_DEMI_GODMODE; + } + + game::SV_GameSendServerCommand(entref.entnum, 0, utils::string::va("%c \"%s\"", 0x4F, + (ent->flags & game::entityFlag::FL_DEMI_GODMODE) ? "GAME_DEMI_GODMODE_ON" : "GAME_DEMI_GODMODE_OFF")); + }); + + gsc::method::add("notarget", [](const scripting::entity& entity) + { + const auto entref = entity.get_entity_reference(); + auto* ent = game::GetEntity(entref); + + if (ent->flags & game::entityFlag::FL_NOTARGET) + { + ent->flags &= ~game::entityFlag::FL_NOTARGET; + } + else + { + ent->flags |= game::entityFlag::FL_NOTARGET; + } + + game::SV_GameSendServerCommand(entref.entnum, 0, utils::string::va("%c \"%s\"", 0x4F, + (ent->flags & game::entityFlag::FL_NOTARGET) ? "GAME_NOTARGETON" : "GAME_NOTARGETOFF")); + }); + } + }; +} + +REGISTER_COMPONENT(clients::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/command.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/command.cpp new file mode 100644 index 0000000..accfe30 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/command.cpp @@ -0,0 +1,334 @@ +#include "stdinc.hpp" +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "command.hpp" +#include "gsc.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include + +namespace command +{ + std::unordered_map> handlers; + std::unordered_map> handlers_sv; + + std::vector script_commands; + std::vector script_sv_commands; + utils::memory::allocator allocator; + + utils::hook::detour client_command_hook; + + game::CmdArgs* get_cmd_args() + { + return static_cast(game::Sys_GetValue(4)); + } + + void main_handler() + { + params params = {}; + + const auto command = utils::string::to_lower(params[0]); + + if (handlers.find(command) != handlers.end()) + { + handlers[command](params); + } + } + + params::params() + : nesting_(get_cmd_args()->nesting) + { + } + + int params::size() const + { + const auto cmd_args = get_cmd_args(); + return cmd_args->argc[this->nesting_]; + } + + const char* params::get(int index) const + { + if (index >= this->size()) + { + return ""; + } + + const auto cmd_args = get_cmd_args(); + return cmd_args->argv[this->nesting_][index]; + } + + std::string params::join(int index) const + { + std::string result = {}; + + for (int i = index; i < this->size(); i++) + { + if (i > index) + { + result.append(" "); + } + + result.append(this->get(i)); + } + + return result; + } + + params_sv::params_sv() + : nesting_(game::sv_cmd_args->nesting) + { + } + + int params_sv::size() const + { + return game::sv_cmd_args->argc[this->nesting_]; + } + + const char* params_sv::get(const int index) const + { + if (index >= this->size()) + { + return ""; + } + + return game::sv_cmd_args->argv[this->nesting_][index]; + } + + std::string params_sv::join(const int index) const + { + std::string result = {}; + + for (auto i = index; i < this->size(); i++) + { + if (i > index) + { + result.append(" "); + } + + result.append(this->get(i)); + } + + return result; + } + + std::vector params_sv::get_all() const + { + std::vector params; + + for (auto i = 0; i < this->size(); i++) + { + params.emplace_back(this->get(i)); + } + + return params; + } + + void add_raw(const char* name, void (*callback)()) + { + game::Cmd_AddCommandInternal(name, callback, utils::memory::get_allocator()->allocate()); + } + + void add(const char* name, const std::function& callback) + { + const auto command = utils::string::to_lower(name); + + if (handlers.find(command) == handlers.end()) + { + add_raw(name, main_handler); + } + + handlers[command] = callback; + } + + void add_sv(const std::string& name, const std::function& callback) + { + const auto command = utils::string::to_lower(name); + if (handlers_sv.find(command) == handlers_sv.end()) + { + handlers_sv[command] = callback; + } + } + + void add_script_command(const std::string& name, const std::function& callback) + { + script_commands.push_back(name); + add(allocator.duplicate_string(name), callback); + } + + void add_script_sv_command(const std::string& name, const std::function& callback) + { + script_sv_commands.push_back(name); + add_sv(name, callback); + } + + void clear_script_commands() + { + for (const auto& name : script_commands) + { + handlers.erase(name); + game::Cmd_RemoveCommand(name.data()); + } + + for (const auto& name : script_sv_commands) + { + handlers_sv.erase(name); + } + + allocator.clear(); + script_commands.clear(); + script_sv_commands.clear(); + } + + void execute(std::string command, const bool sync) + { + command += "\n"; + + if (sync) + { + game::Cmd_ExecuteSingleCommand(0, 0, command.data()); + } + else + { + game::Cbuf_AddText(0, command.data()); + } + } + + void client_command_stub(const int client_num) + { + params_sv params = {}; + + const auto command = utils::string::to_lower(params[0]); + if (handlers_sv.find(command) != handlers_sv.end()) + { + handlers_sv[command](client_num, params); + return; + } + + client_command_hook.invoke(client_num); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown(clear_script_commands); + + client_command_hook.create(SELECT(0x47E590, 0x4490C0), client_command_stub); + + add("notifylevel", [](const params& params) + { + if (params.size() < 2) + { + printf("Usage: notifylevel [...]\n"); + return; + } + + if (!*game::levelEntityId) + { + printf("Level not loaded\n"); + return; + } + + const auto argc = params.size(); + + for (auto i = argc - 1; i > 1; i--) + { + const auto arg = params[i]; + scripting::push_value(arg); + } + + const auto name = game::SL_GetString(params[1], 0); + game::Scr_NotifyId(game::SCRIPTINSTANCE_SERVER, 0, *game::levelEntityId, name, argc - 2); + }); + + add("notifynum", [](const params& params) + { + if (params.size() < 3) + { + printf("Usage: notifynum [...]\n"); + return; + } + + if (!*game::levelEntityId) + { + printf("Level not loaded\n"); + return; + } + + const auto client = atoi(params[1]); + const auto sv_maxclients = game::Dvar_FindVar("sv_maxclients")->current.integer; + + if (client < 0 || client >= sv_maxclients) + { + return; + } + + if (game::g_entities[client].client == nullptr) + { + return; + } + + const auto argc = params.size(); + + for (auto i = argc - 1; i > 2; i--) + { + const auto arg = params[i]; + scripting::push_value(arg); + } + + const auto name = game::SL_GetString(params[2], 0); + game::Scr_NotifyNum(client, 0, name, argc - 3); + }); + + gsc::function::add_multiple([](const std::string& cmd) + { + execute(cmd); + }, "executecommand", "command::execute"); + + gsc::function::add_multiple([](const std::string& name, const scripting::function& function) + { + add_script_command(name, [function](const params& params) + { + scripting::array array; + + for (auto i = 0; i < params.size(); i++) + { + array.emplace_back(params[i]); + } + + function({array.get_raw()}); + }); + }, "addcommand", "command::add"); + + gsc::function::add_multiple([](const std::string& name, const scripting::function& function) + { + add_script_sv_command(name, [function](const int client_num, const params_sv& params) + { + const auto params_ = params.get_all(); + scheduler::once([=]() + { + const scripting::entity player = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, client_num, 0, 0); + + scripting::array array; + + for (auto i = 0; i < params.size(); i++) + { + array.emplace_back(params[i]); + } + + function(player, {array}); + }, scheduler::pipeline::server); + }); + }, "addclientcommand", "command::add_sv"); + + } + }; +} + +REGISTER_COMPONENT(command::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/command.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/command.hpp new file mode 100644 index 0000000..ff2f9b3 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/command.hpp @@ -0,0 +1,51 @@ +#pragma once + +namespace command +{ + class params + { + public: + params(); + + [[nodiscard]] int size() const; + [[nodiscard]] const char* get(int index) const; + [[nodiscard]] std::string join(int index) const; + + [[nodiscard]] const char* operator[](const int index) const + { + return this->get(index); + } + + private: + int nesting_; + }; + + class params_sv + { + public: + params_sv(); + + [[nodiscard]] int size() const; + [[nodiscard]] const char* get(int index) const; + [[nodiscard]] std::string join(int index) const; + [[nodiscard]] std::vector get_all() const; + + [[nodiscard]] const char* operator[](const int index) const + { + return this->get(index); + } + + private: + int nesting_; + }; + + void add_raw(const char* name, void (*callback)()); + void add(const char* name, const std::function& callback); + + void add_sv(const std::string& name, const std::function& callback); + + void add_script_command(const std::string& name, const std::function& callback); + void clear_script_commands(); + + void execute(std::string command, bool sync = false); +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/config_strings.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/config_strings.cpp new file mode 100644 index 0000000..eaf58cf --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/config_strings.cpp @@ -0,0 +1,151 @@ +#include +#include "loader/component_loader.hpp" + +#include "gsc.hpp" +#include "scripting.hpp" + +#include + +namespace config_strings +{ + namespace + { + std::unordered_set reserved_config_strings; + std::unordered_map hudelem_config_strings; + + bool is_string_reserved(const std::uint32_t offset) + { + return reserved_config_strings.contains(offset); + } + + std::uint32_t get_config_string() + { + auto index = -1; + const auto scr_const_ = *reinterpret_cast(SELECT(0x24E5588, 0x24B7188)); + for (auto i = 1; i < 512; i++) + { + const auto string_value = game::sv_configstrings[i + 488]; + if (string_value == scr_const_ && !is_string_reserved(i)) + { + index = i; + break; + } + } + + if (index == -1) + { + throw std::runtime_error("out of config strings"); + } + + reserved_config_strings.insert(index); + + return index; + } + + utils::hook::detour scr_free_hud_elem_hook; + void scr_free_hud_elem_stub(game::game_hudelem_s* hud) + { + const auto _0 = gsl::finally([&] + { + scr_free_hud_elem_hook.invoke(hud); + }); + + const auto iter = hudelem_config_strings.find(hud); + if (iter == hudelem_config_strings.end()) + { + return; + } + + game::SV_SetConfigString(iter->second + 488, 0); + reserved_config_strings.erase(iter->second); + hudelem_config_strings.erase(iter); + } + + void g_localized_string_index_stub_1(utils::hook::assembler& a) + { + const auto not_reserved = a.newLabel(); + + a.add(esp, 4); + + a.pushad(); + a.push(esi); + a.call(is_string_reserved); + a.cmp(al, 0); + a.jz(not_reserved); + + a.pop(esi); + a.popad(); + a.jmp(SELECT(0x6D657E, 0x467D6E)); + + a.bind(not_reserved); + a.pop(esi); + a.popad(); + + a.cmp(eax, ecx); + a.jmp(SELECT(0x6D6578, 0x467D68)); + } + + void g_localized_string_index_stub_2(utils::hook::assembler& a) + { + const auto not_reserved = a.newLabel(); + + a.add(esp, 4); + + a.pushad(); + a.push(esi); + a.call(is_string_reserved); + a.cmp(al, 0); + a.jz(not_reserved); + + a.pop(esi); + a.popad(); + a.jmp(SELECT(0x6D6638, 0x467E2E)); + + a.bind(not_reserved); + a.pop(esi); + a.popad(); + + a.cmp(eax, ecx); + a.jmp(SELECT(0x6D663E, 0x467E28)); + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + utils::hook::jump(SELECT(0x6D6573, 0x467D63), utils::hook::assemble(g_localized_string_index_stub_1)); + utils::hook::jump(SELECT(0x6D6633, 0x467E23), utils::hook::assemble(g_localized_string_index_stub_2)); + scr_free_hud_elem_hook.create(SELECT(0x56E800, 0x6186A0), scr_free_hud_elem_stub); + + scripting::on_shutdown([&] + { + reserved_config_strings.clear(); + hudelem_config_strings.clear(); + }); + + gsc::method::add("hudelem::set_text", [](const scripting::entity& entity, const std::string& text) + { + const auto ent = entity.get_entity_reference(); + const auto hudelem = &game::g_hudelems[ent.entnum]; + const auto iter = hudelem_config_strings.find(hudelem); + + if (iter == hudelem_config_strings.end()) + { + const auto index = get_config_string(); + hudelem->elem.text = static_cast(index); + hudelem_config_strings.insert(std::make_pair(hudelem, index)); + } + else + { + hudelem->elem.text = static_cast(iter->second); + } + + game::SV_SetConfigString(hudelem->elem.text + 488, text.data()); + }); + } + }; +} + +REGISTER_COMPONENT(config_strings::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/cryptography.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/cryptography.cpp new file mode 100644 index 0000000..3631db2 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/cryptography.cpp @@ -0,0 +1,135 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "gsc.hpp" +#include "io.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include +#include + +namespace cryptography +{ + namespace + { + std::vector keys; + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown([] + { + keys.clear(); + }); + + gsc::function::add("ecc::generate_key", [](int bits) + { + const auto key = utils::cryptography::ecc::generate_key(bits); + keys.emplace_back(key); + return keys.size() - 1; + }); + + gsc::function::add("ecc::create_key_from_public_key", [](const std::string& data) + { + utils::cryptography::ecc::key key; + key.set(utils::string::hex_to_bin(data)); + keys.emplace_back(key); + return keys.size() - 1; + }); + + gsc::function::add("ecc::encrypt", [](const std::uint32_t key_index, const std::string& data) + { + if (key_index < 0 || key_index >= keys.size()) + { + throw std::runtime_error("invalid key"); + } + + const auto& key = keys.at(key_index); + std::string encrypted = data; + if (!utils::cryptography::ecc::encrypt(key, encrypted)) + { + throw std::runtime_error("failed to encrypt"); + } + + return utils::string::bin_to_hex(encrypted); + }); + + gsc::function::add("ecc::decrypt", [](const std::uint32_t key_index, const std::string& data) + { + if (key_index < 0 || key_index >= keys.size()) + { + throw std::runtime_error("invalid key"); + } + + const auto& key = keys.at(key_index); + std::string decrypted = utils::string::hex_to_bin(data); + if (!utils::cryptography::ecc::decrypt(key, decrypted)) + { + throw std::runtime_error("failed to decrypt"); + } + + return decrypted; + }); + + gsc::function::add("ecc::import_key", [](const std::string& data) + { + utils::cryptography::ecc::key key; + key.deserialize(utils::string::hex_to_bin(data)); + keys.emplace_back(key); + return keys.size() - 1; + }); + + gsc::function::add("ecc::export_public_key", [](const std::uint32_t key_index) + { + if (key_index < 0 || key_index >= keys.size()) + { + throw std::runtime_error("invalid key"); + } + + const auto& key = keys.at(key_index); + return utils::string::bin_to_hex(key.serialize(PK_PUBLIC)); + }); + + gsc::function::add("ecc::export_private_key", [](const std::uint32_t key_index) + { + if (key_index < 0 || key_index >= keys.size()) + { + throw std::runtime_error("invalid key"); + } + + const auto& key = keys.at(key_index); + return utils::string::bin_to_hex(key.serialize(PK_PRIVATE)); + }); + + gsc::function::add("aes::encrypt", [](const std::string& data, const std::string& iv, const std::string& key) + { + return utils::string::bin_to_hex(utils::cryptography::aes::encrypt(data, + utils::string::hex_to_bin(iv), + utils::string::hex_to_bin(key)) + ); + }); + + gsc::function::add("aes::decrypt", [](const std::string& data, const std::string& iv, const std::string& key) + { + return utils::cryptography::aes::decrypt(utils::string::hex_to_bin(data), + utils::string::hex_to_bin(iv), + utils::string::hex_to_bin(key)); + }); + + gsc::function::add("cryptography::random_bytes", [](const int len) + { + return utils::string::bin_to_hex(utils::cryptography::random::get_data(len)); + }); + } + }; +} + +REGISTER_COMPONENT(cryptography::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/exception.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/exception.cpp new file mode 100644 index 0000000..cdcc65f --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/exception.cpp @@ -0,0 +1,145 @@ +#include +#include "loader/component_loader.hpp" +#include "game/game.hpp" + +#include "scheduler.hpp" + +#include "gsc.hpp" +#include "json.hpp" +#include "scripting.hpp" +#include "game/scripting/execution.hpp" + +#include +#include +#include +#include +#include + +#include + +namespace exception +{ + namespace + { + thread_local struct + { + DWORD code = 0; + PVOID address = nullptr; + } exception_data; + + void show_mouse_cursor() + { + while (ShowCursor(TRUE) < 0); + } + + void display_error_dialog() + { + std::string error_str = utils::string::va("Fatal error (0x%08X) at 0x%p.\n" + "A minidump has been written.\n\n", + exception_data.code, exception_data.address); + + error_str += "Make sure to update your graphics card drivers and install operating system updates!"; + + utils::thread::suspend_other_threads(); + show_mouse_cursor(); + MessageBoxA(nullptr, error_str.data(), "Plutonium T6 ERROR", MB_ICONERROR); + TerminateProcess(GetCurrentProcess(), exception_data.code); + } + + void reset_state() + { + display_error_dialog(); + } + + size_t get_reset_state_stub() + { + static auto* stub = utils::hook::assemble([](utils::hook::assembler& a) + { + a.sub(esp, 0x10); + a.or_(esp, 0x8); + a.jmp(reset_state); + }); + + return reinterpret_cast(stub); + } + + std::string generate_crash_info(const LPEXCEPTION_POINTERS exceptioninfo) + { + std::string info{}; + const auto line = [&info](const std::string& text) + { + info.append(text); + info.append("\r\n"); + }; + + line("Plutonium T6 Crash Dump"); + line(""); + line("Timestamp: "s + utils::string::get_timestamp()); + line(utils::string::va("Exception: 0x%08X", exceptioninfo->ExceptionRecord->ExceptionCode)); + line(utils::string::va("Address: 0x%lX", exceptioninfo->ExceptionRecord->ExceptionAddress)); + +#pragma warning(push) +#pragma warning(disable: 4996) + OSVERSIONINFOEXA version_info; + ZeroMemory(&version_info, sizeof(version_info)); + version_info.dwOSVersionInfoSize = sizeof(version_info); + GetVersionExA(reinterpret_cast(&version_info)); +#pragma warning(pop) + + line(utils::string::va("OS Version: %u.%u", version_info.dwMajorVersion, version_info.dwMinorVersion)); + + return info; + } + + void write_minidump(const LPEXCEPTION_POINTERS exceptioninfo) + { + const std::string crash_name = utils::string::va("minidumps/plutonium-t6-crash-%s.zip", + utils::string::get_timestamp().data()); + + utils::compression::zip::archive zip_file{}; + zip_file.add("crash.dmp", create_minidump(exceptioninfo)); + zip_file.add("info.txt", generate_crash_info(exceptioninfo)); + zip_file.write(crash_name, "Plutonium T6 Crash Dump"); + } + + bool is_harmless_error(const LPEXCEPTION_POINTERS exceptioninfo) + { + const auto code = exceptioninfo->ExceptionRecord->ExceptionCode; + return code == STATUS_INTEGER_OVERFLOW || code == STATUS_FLOAT_OVERFLOW || code == STATUS_SINGLE_STEP; + } + + LONG WINAPI exception_filter(const LPEXCEPTION_POINTERS exceptioninfo) + { + if (is_harmless_error(exceptioninfo)) + { + return EXCEPTION_CONTINUE_EXECUTION; + } + + write_minidump(exceptioninfo); + + exception_data.code = exceptioninfo->ExceptionRecord->ExceptionCode; + exception_data.address = exceptioninfo->ExceptionRecord->ExceptionAddress; + exceptioninfo->ContextRecord->Eip = get_reset_state_stub(); + + return EXCEPTION_CONTINUE_EXECUTION; + } + + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI set_unhandled_exception_filter_stub(LPTOP_LEVEL_EXCEPTION_FILTER) + { + // Don't register anything here... + return &exception_filter; + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + SetUnhandledExceptionFilter(exception_filter); + utils::hook::jump(reinterpret_cast(&SetUnhandledExceptionFilter), set_unhandled_exception_filter_stub); + } + }; +} + +REGISTER_COMPONENT(exception::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/gsc.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/gsc.cpp new file mode 100644 index 0000000..06ff7de --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/gsc.cpp @@ -0,0 +1,585 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/structs.hpp" +#include "game/game.hpp" + +#include "gsc.hpp" +#include "json.hpp" + +#include "scheduler.hpp" +#include "scripting.hpp" +#include "command.hpp" + +#include +#include + +namespace gsc +{ + std::unordered_map functions; + std::unordered_map methods; + + std::unordered_map function_wraps; + std::unordered_map method_wraps; + + namespace + { + utils::hook::detour player_get_method_hook; + utils::hook::detour scr_get_common_function_hook; + utils::hook::detour scr_error_internal_hook; + utils::hook::detour scr_post_load_scripts_hook; + + auto field_offset_start = 0xA000; + std::unordered_map custom_fields[class_count]; + + std::string current_namespace; + + std::unordered_map world; + + std::string get_full_name(const std::string& name) + { + if (current_namespace.empty()) + { + return name; + } + + return std::format("{}::{}", current_namespace, name); + } + + void* find_function(const std::string& name) + { + const auto full_name = get_full_name(name); + const auto iter = function_wraps.find(full_name); + if (iter == function_wraps.end()) + { + return nullptr; + } + + return iter->second; + } + + void* find_method(const std::string& name) + { + const auto full_name = get_full_name(name); + const auto iter = method_wraps.find(full_name); + if (iter == method_wraps.end()) + { + return nullptr; + } + + return iter->second; + } + + builtin_function scr_get_common_function(const char** name, int* type, int* min_args, int* max_args) + { + const auto func = reinterpret_cast(find_function(*name)); + + if (func == nullptr) + { + return scr_get_common_function_hook.invoke(name, type, min_args, max_args); + } + + *type = 1; + *min_args = 0; + *max_args = 512; + + return func; + } + + builtin_method player_get_method(const char** name, int* min_args, int* max_args) + { + const auto method = reinterpret_cast(find_method(*name)); + + if (method == nullptr) + { + return player_get_method_hook.invoke(name, min_args, max_args); + } + + *min_args = 0; + *max_args = 512; + + return method; + } + + const gsc::entity_field_t* find_field(unsigned int classnum, unsigned int offset) + { + const auto& class_map = custom_fields[classnum]; + const auto field_iter = class_map.find(offset); + if (field_iter == class_map.end()) + { + return nullptr; + } + + return &field_iter->second; + } + + utils::hook::detour scr_get_object_field_hook; + void scr_get_object_field_stub(unsigned int classnum, int entnum, unsigned int offset) + { + const auto field = find_field(classnum, offset); + if (field == nullptr) + { + return scr_get_object_field_hook.invoke(classnum, entnum, offset); + } + + try + { + const auto result = field->getter(entnum); + return_value(result); + } + catch (const std::exception& e) + { + printf("******* script runtime error *******\n"); + printf("while getting field \"%s\": %s\n", field->name.data(), e.what()); + printf("************************************\n"); + } + } + + utils::hook::detour scr_set_object_field_hook; + int scr_set_object_field_stub(unsigned int classnum, int entnum, unsigned int offset) + { + const auto field = find_field(classnum, offset); + if (field == nullptr) + { + return scr_set_object_field_hook.invoke(classnum, entnum, offset); + } + + const auto args = get_arguments(); + + try + { + field->setter(entnum, args[0]); + } + catch (const std::exception& e) + { + printf("******* script runtime error *******\n"); + printf("while setting field \"%s\": %s\n", field->name.data(), e.what()); + printf("************************************\n"); + } + + return 1; + } + + void scr_post_load_scripts_stub() + { + for (auto i = 0; i < class_id_t::class_count; i++) + { + const auto& class_map = custom_fields[i]; + for (const auto& [offset, field] : class_map) + { + game::Scr_AddClassField(game::SCRIPTINSTANCE_SERVER, i, field.name.data(), offset); + } + } + + return scr_post_load_scripts_hook.invoke(); + } + + __declspec(naked) void scr_error_internal_stub_1_mp() + { + __asm + { + mov eax, 0 + mov edx, eax + imul edx, 0x54 + + push 0x8F3F65 + retn + } + } + + __declspec(naked) void scr_error_internal_stub_1_zm() + { + __asm + { + mov eax, 0 + mov edx, eax + imul edx, 0x54 + + push 0x8F2CC5 + retn + } + } + + void gsc_obj_resolve_stub_1(game::GSC_OBJ* obj, game::GSC_IMPORT_ITEM* item) + { + const auto name = &obj->magic[item->name]; + current_namespace = &obj->magic[item->name_space]; + + if (current_namespace[0] == 0) + { + return; + } + + const auto is_function = find_function(name); + const auto is_method = !is_function && find_method(name); + + if (is_function || is_method) + { + item->name_space += static_cast(current_namespace.size()); + } + } + + __declspec(naked) void gsc_obj_resolve_stub_mp() + { + __asm + { + pushad + push edi + push esi + call gsc_obj_resolve_stub_1 + pop esi + pop edi + popad + + movzx eax, byte ptr[edi + 7] + and eax, 0xF + dec eax + + push 0x6CD7F1 + ret + } + } + + __declspec(naked) void gsc_obj_resolve_stub_zm() + { + __asm + { + pushad + push edi + push esi + call gsc_obj_resolve_stub_1 + pop esi + pop edi + popad + + movzx eax, byte ptr[edi + 7] + and eax, 0xF + dec eax + + push 0x4F0441 + ret + } + } + } + + void call_function(const function_t& function, const std::string& name) + { + const auto args = get_arguments(); + + try + { + const auto value = function(args); + return_value(value); + } + catch (const std::exception& e) + { + printf("******* script runtime error *******\n"); + printf("in call to builtin function \"%s\": %s\n", name.data(), e.what()); + printf("************************************\n"); + } + } + + void call_method(const function_t& method, const std::string& name, const game::scr_entref_t entref) + { + const auto args = get_arguments(); + + try + { + const scripting::entity entity = game::Scr_GetEntityId( + game::SCRIPTINSTANCE_SERVER, entref.entnum, entref.classnum, 0); + + std::vector next_args{}; + next_args.push_back(entity); + for (const auto& arg : args) + { + next_args.push_back(arg); + } + + const auto value = method(next_args); + return_value(value); + } + catch (const std::exception& e) + { + printf("******* script runtime error *******\n"); + printf("in call to builtin method \"%s\": %s\n", name.data(), e.what()); + printf("************************************\n"); + } + } + + namespace field + { + void add(const class_id_t classnum, const std::string& name, const field_getter_t getter, const field_setter_t& setter) + { + const auto offset = field_offset_start++; + auto& class_map = custom_fields[classnum]; + + entity_field_t field{}; + field.name = name; + field.getter = getter; + field.setter = setter; + class_map.insert(std::make_pair(offset, field)); + } + } + + void return_value(const scripting::script_value& value) + { + if (game::scr_VmPub->outparamcount) + { + game::Scr_ClearOutParams(game::SCRIPTINSTANCE_SERVER); + } + + scripting::push_value(value); + } + + std::vector get_arguments() + { + std::vector args; + + for (auto i = 0; static_cast(i) < game::scr_VmPub->outparamcount; i++) + { + const auto value = game::scr_VmPub->top[-i]; + args.push_back(value); + } + + return args; + } + + std::string find_builtin_name(void* function) + { + for (auto i = scripting::function_map.begin(); i != scripting::function_map.end(); ++i) + { + if (i->second.actionFunc == function) + { + return i->second.actionString; + } + } + + for (auto i = function_wraps.begin(); i != function_wraps.end(); ++i) + { + if (i->second == function) + { + return i->first; + } + } + + return {}; + } + + std::string find_builtin_method_name(void* function) + { + for (auto i = scripting::method_map.begin(); i != scripting::method_map.end(); ++i) + { + if (i->second.actionFunc == function) + { + return i->second.actionString; + } + } + + for (auto i = method_wraps.begin(); i != method_wraps.end(); ++i) + { + if (i->second == function) + { + return i->first; + } + } + + return {}; + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + utils::hook::jump(SELECT(0x6CD7E9, 0x4F0439), SELECT(gsc_obj_resolve_stub_mp, gsc_obj_resolve_stub_zm)); + + scr_get_common_function_hook.create(SELECT(0x4B57B0, 0x4AD040), scr_get_common_function); + player_get_method_hook.create(SELECT(0x432480, 0x6F2DB0), player_get_method); + + scr_get_object_field_hook.create(SELECT(0x573160, 0x4224E0), scr_get_object_field_stub); + scr_set_object_field_hook.create(SELECT(0x5B9820, 0x43F2A0), scr_set_object_field_stub); + scr_post_load_scripts_hook.create(SELECT(0x6B75B0, 0x492440), scr_post_load_scripts_stub); + + utils::hook::jump(SELECT(0x8F3F60, 0x8F2CC0), SELECT(scr_error_internal_stub_1_mp, scr_error_internal_stub_1_zm)); + + field::add(class_id_t::class_entity, "eflags", + [](unsigned int entnum) -> scripting::script_value + { + const auto entity = &game::g_entities[entnum]; + return entity->flags; + }, + [](unsigned int entnum, const scripting::script_value& value) + { + const auto entity = &game::g_entities[entnum]; + entity->flags = value.as(); + } + ); + + field::add(class_id_t::class_entity, "eflags2", + [](unsigned int entnum) -> scripting::script_value + { + const auto entity = &game::g_entities[entnum]; + return entity->eFlags2; + }, + [](unsigned int entnum, const scripting::script_value& value) + { + const auto entity = &game::g_entities[entnum]; + entity->eFlags2 = value.as(); + } + ); + + field::add(class_id_t::class_entity, "clientflags", + [](unsigned int entnum) -> scripting::script_value + { + const auto entity = &game::g_entities[entnum]; + return entity->client->flags; + }, + [](unsigned int entnum, const scripting::script_value& value) + { + const auto entity = &game::g_entities[entnum]; + entity->client->flags = value.as(); + } + ); + + field::add(class_id_t::class_entity, "address", + [](unsigned int entnum) -> scripting::script_value + { + if (entnum >= 18) + { + throw std::runtime_error("not a player entity"); + } + + const auto clients = *game::svs_clients; + const auto client = &clients[entnum]; + const auto address = client->header.netchan.remoteAddress.ip; + + const std::string address_str = utils::string::va("%i.%i.%i.%i", + address[0], + address[1], + address[2], + address[3] + ); + + return address_str; + }, + [](unsigned int, const scripting::script_value&) + { + throw std::runtime_error("cannot set address"); + } + ); + + function::add("getfunctionargcount", [](const scripting::function& function) + { + const auto pos = function.get_pos(); + if (*pos != 0x17) // OP_SafeCreateLocalVariables + { + return 0; + } + + return static_cast(pos[1]); + }); + + function::add("arrayremovekey", [](const scripting::array& array, const std::string& key) + { + array.erase(key); + }); + + function::add("xor", [](const int a, const int b) + { + return a ^ b; + }); + + function::add("not", [](const int a) + { + return ~a; + }); + + function::add("and", [](const int a, const int b) + { + return a & b; + }); + + function::add("or", [](const int a, const int b) + { + return a | b; + }); + + function::add("structget", [](const scripting::object& obj, const std::string& key) + { + return obj[key]; + }); + + function::add("structset", [](const scripting::object& obj, const std::string& key, + const scripting::script_value& value) + { + obj[key] = value; + }); + + function::add("struct::get", [](const scripting::object& obj, const std::string& key) + { + return obj[key]; + }); + + function::add("struct::set", [](const scripting::object& obj, const std::string& key, + const scripting::script_value& value) + { + obj[key] = value; + }); + + function::add("structremove", [](const scripting::object& obj, const std::string& key) + { + obj.erase(key); + }); + + function::add("getstructkeys", [](const scripting::object& obj) + { + return obj.get_keys(); + }); + + function::add("isfunctionptr", [](const scripting::script_value& value) + { + return value.is(); + }); + + function::add("isentity", [](const scripting::script_value& value) + { + const auto& raw = value.get_raw(); + const auto type = game::scr_VarGlob->objectVariableValue[raw.u.uintValue].w.type & 0x7F; + return raw.type == game::SCRIPT_OBJECT && type == game::SCRIPT_ENTITY; + }); + + function::add("isstruct", [](const scripting::script_value& value) + { + return value.is(); + }); + + function::add("typeof", [](const scripting::script_value& value) + { + return value.type_name(); + }); + + method::add("get", [](const scripting::entity& entity, const std::string& field) + { + return entity.get(field); + }); + + method::add("set", [](const scripting::entity& entity, const std::string& field, + const scripting::script_value& value) + { + entity.set(field, value); + }); + + function::add("worldget", [](const std::string& key) + { + return world[key]; + }); + + function::add("worldset", [](const std::string& key, const scripting::script_value& value) + { + world[key] = value; + }); + } + }; +} + +REGISTER_COMPONENT(gsc::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/gsc.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/gsc.hpp new file mode 100644 index 0000000..3d4b848 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/gsc.hpp @@ -0,0 +1,171 @@ +#pragma once + +#include "game/scripting/array.hpp" +#include "game/scripting/execution.hpp" +#include "../plugin.hpp" + +#if _HAS_CXX20 +namespace gsc +{ + using function_t = std::function; + using script_function = void(*)(game::scr_entref_t); + + extern std::unordered_map functions; + extern std::unordered_map methods; + + extern std::unordered_map function_wraps; + extern std::unordered_map method_wraps; + + // auto = []{} forces template reevaluation + + template + auto wrap_function(const std::function& f, std::index_sequence) + { + return [f]([[maybe_unused]] const scripting::function_arguments& args) + { + f(args[I]...); + return scripting::script_value{}; + }; + } + + template + auto wrap_function(const std::function& f, std::index_sequence) + { + return [f]([[maybe_unused]] const scripting::function_arguments& args) + { + return f(args[I]...); + }; + } + + template + auto wrap_function(const std::function& f, std::index_sequence) + { + return [f]([[maybe_unused]] const scripting::function_arguments& args) + { + return scripting::script_value{f(args[I]...)}; + }; + } + + template + auto wrap_function(const std::function& f) + { + return wrap_function(f, std::index_sequence_for{}); + } + + template + auto wrap_function(F f) + { + return wrap_function(std::function(f)); + } + + enum class_id_t + { + class_entity, + class_hudelem, + class_pathnode, + class_node, + class_count + }; + + using field_getter_t = std::function; + using field_setter_t = std::function; + + struct entity_field_t + { + std::string name; + field_getter_t getter; + field_setter_t setter; + }; + + void return_value(const scripting::script_value& value); + std::vector get_arguments(); + + using builtin_function = void(*)(); + using builtin_method = void(*)(game::scr_entref_t); + + std::string find_builtin_name(void* function); + std::string find_builtin_method_name(void* function); + + void call_function(const function_t& function, const std::string& name); + void call_method(const function_t& method, const std::string& name, const game::scr_entref_t entref); + + namespace function + { + template + void add_internal(const std::string& name, F function) + { + static auto called = false; + assert(!called); + called = true; + +#ifdef DEBUG + printf("[function] %s\n", name.data()); +#endif + + static const auto lower = utils::string::to_lower(name); + static const auto [iterator, was_inserted] = functions.insert(std::make_pair(lower, function)); + static const auto& function_ptr = iterator->second; + + function_wraps[lower] = []() + { + call_function(function_ptr, lower); + }; + } + + template + void add(const std::string& name, F f) + { + add_internal(name, wrap_function(f)); + } + + template + void add_multiple(F f, Args&& ...names) + { + (add(names, f), ...); + } + } + + namespace method + { + template + void add_internal(const std::string& name, F function) + { + static auto called = false; + assert(!called); + called = true; + +#ifdef DEBUG + printf("[method] %s\n", name.data()); +#endif + + static const auto lower = utils::string::to_lower(name); + static const auto [iterator, was_inserted] = functions.insert(std::make_pair(lower, function)); + static const auto& function_ptr = iterator->second; + + method_wraps[lower] = [](game::scr_entref_t entref) + { + call_method(function_ptr, lower, entref); + }; + } + + template + void add(const std::string& name, F f) + { + add_internal(name, wrap_function(f)); + } + + template + void add_multiple(F f, Args&& ...names) + { + (add(names, f), ...); + } + } + + namespace field + { + void add(const class_id_t classnum, const std::string& name, const field_getter_t getter, const field_setter_t& setter); + } +} +#else +#error pre c++20 is not supported +#endif diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/http.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/http.cpp new file mode 100644 index 0000000..cf91384 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/http.cpp @@ -0,0 +1,287 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/structs.hpp" +#include "game/game.hpp" + +#include "gsc.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include + +namespace http +{ + namespace + { + constexpr const auto max_result_size = 0x5000u; + + struct http_request_params_t + { + std::string method; + std::string url; + std::string fields; + utils::http::headers headers; + utils::http::timeouts limits; + }; + + struct http_request_t + { + http_request_params_t params; + scripting::object handle; + std::optional result; + std::chrono::steady_clock::time_point queued_at = std::chrono::steady_clock::now(); + std::chrono::steady_clock::time_point started_at; + std::chrono::steady_clock::time_point finished_at; + std::atomic_bool completed{false}; + }; + + std::vector> requests; + + double elapsed_ms(const std::chrono::steady_clock::time_point start, + const std::chrono::steady_clock::time_point end) + { + return std::chrono::duration(end - start).count(); + } + + void notify_request_result(std::shared_ptr& request) + { + const auto handle_id = request->handle.get_entity_id(); + const utils::http::result missing; + const auto& result = request->result ? *request->result : missing; + scripting::array diagnostics; + diagnostics["http_status"] = static_cast(result.status); + diagnostics["curl_code"] = static_cast(result.code); + diagnostics["dns_ms"] = result.dns_ms; + diagnostics["connect_ms"] = result.connect_ms; + diagnostics["tls_ms"] = result.tls_ms; + diagnostics["first_byte_ms"] = result.first_byte_ms; + diagnostics["total_ms"] = result.total_ms; + diagnostics["worker_queue_ms"] = elapsed_ms(request->queued_at, request->started_at); + diagnostics["notify_ms"] = elapsed_ms(request->finished_at, std::chrono::steady_clock::now()); + diagnostics["connect_timeout_ms"] = static_cast(request->params.limits.connect_timeout_ms); + diagnostics["timeout_ms"] = static_cast(request->params.limits.timeout_ms); + + if (!request->result.has_value()) + { + scripting::notify(handle_id, "done", {{}, false, "unknown error", diagnostics}); + return; + } + + const auto error = curl_easy_strerror(result.code); + + if (result.code != CURLE_OK) + { + scripting::notify(handle_id, "done", {{}, false, error, diagnostics}); + return; + } + + auto& buffer = request->result->buffer; + if (buffer.size() >= max_result_size) + { + printf("^3WARNING: http result size bigger than %i bytes (%i), truncating!", max_result_size, + static_cast(buffer.size())); + buffer.resize(max_result_size); + } + + // Keep the original three values; older waiters ignore the fourth. + // HTTP 4xx/5xx are completed transfers, not transport failures. + scripting::notify(handle_id, "done", {buffer, true, {}, diagnostics}); + } + + void check_requests() + { + std::vector> ready; + for (auto i = requests.begin(); i != requests.end(); ) + { + auto& request = *i; + if (!request->completed) + { + ++i; + continue; + } + else + { + ready.emplace_back(request); + i = requests.erase(i); + } + } + // A resumed script may enqueue another request. Do not hold an iterator + // into requests while notifying the VM. + for (auto& request : ready) + notify_request_result(request); + } + + scripting::object create_request(const http_request_params_t& params) + { + const auto request = std::make_shared(); + requests.emplace_back(request); + + request->params = params; + scheduler::thread_pool.push([request] + { + request->started_at = std::chrono::steady_clock::now(); + try + { + request->result = utils::http::get_data( + request->params.url, + request->params.fields, + request->params.headers, + request->params.method, + request->params.limits); + } + catch (...) + { + // Exceptions must also release GSC waiters through the done event. + request->result = std::nullopt; + } + request->finished_at = std::chrono::steady_clock::now(); + request->completed = true; + }); + + return request->handle; + } + + template + void push_request(T&& r) + { + const auto request = std::make_shared(std::forward(r)); + requests.emplace_back(request); + } + + void wait_and_clear_requests() + { + for (auto& task : requests) + { + while (!task->completed) + { + std::this_thread::sleep_for(10ms); + } + } + + requests.clear(); + } + + long timeout_option(const scripting::array& options, const char* name, const long fallback) + { + const auto value = options[name]; + if (value.get_raw().type == game::SCRIPT_NONE) + return fallback; + if (!value.is() || value.as() <= 0) + throw std::runtime_error(std::string(name) + " must be a positive integer in milliseconds"); + return value.as(); + } + + void parse_request_options(http_request_params_t& params, const scripting::array& options) + { + params.limits.connect_timeout_ms = timeout_option(options, "connect_timeout_ms", params.limits.connect_timeout_ms); + params.limits.timeout_ms = timeout_option(options, "timeout_ms", params.limits.timeout_ms); + const auto fields = options["parameters"]; + const auto body = options["body"]; + const auto headers = options["headers"]; + const auto method = options["method"]; + + if (method.is()) + { + params.method = method.as(); + } + + if (fields.is()) + { + const auto fields_ = fields.as(); + const auto keys = fields_.get_keys(); + + for (const auto& key : keys) + { + if (!key.is()) + { + continue; + } + + const auto key_ = key.as(); + const auto value = fields_[key].to_string(); + params.fields += key_ + "=" + value + "&"; + } + + } + else if (body.is()) + { + params.fields = body.as(); + } + + if (headers.is()) + { + const auto headers_arr = headers.as(); + const auto keys = headers_arr.get_keys(); + + for (const auto& key : keys) + { + if (!key.is()) + { + continue; + } + + const auto key_str = key.as(); + const auto value = headers_arr[key].to_string(); + + params.headers[key_str] = value; + } + } + } + } + + class component final : public component_interface + { + public: + void on_shutdown([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown(wait_and_clear_requests); + } + + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scheduler::loop(check_requests, scheduler::server); + scripting::on_shutdown(wait_and_clear_requests); + + gsc::function::add_multiple([](const std::string& url) + { + http_request_params_t params{}; + params.url = url; + return create_request(params); + }, "http::get", "httpget", "curl"); + + gsc::function::add("http::request", [](const std::string& url, const scripting::variadic_args& va) + { + http_request_params_t params{}; + params.url = url; + + if (va.size() > 0) + { + const auto options = va[0].as(); + parse_request_options(params, options); + } + + return create_request(params); + }); + + gsc::function::add_multiple([](const std::string& url, const scripting::variadic_args& va) + { + http_request_params_t params{}; + params.url = url; + params.method = "POST"; + + if (va.size() > 0) + { + const auto options = va[0].as(); + parse_request_options(params, options); + } + + return create_request(params); + }, "httppost", "http::post"); + } + }; +} + +REGISTER_COMPONENT(http::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/int64.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/int64.cpp new file mode 100644 index 0000000..dcf21dc --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/int64.cpp @@ -0,0 +1,119 @@ +#include +#include "loader/component_loader.hpp" + +#include "gsc.hpp" + +#include +#include + +#define INT64_OPERATION(expr) \ + [](const std::int64_t a, [[maybe_unused]] const std::int64_t b) \ + { \ + return expr; \ + } \ + +namespace int64 +{ + namespace + { + std::int64_t get_int64_arg(const scripting::variadic_args& args, const size_t index, bool optional) + { + if (optional && index >= static_cast(args.size())) + { + return 0; + } + + if (args[index].is()) + { + return static_cast(args[index].as()); + } + + if (args[index].is()) + { + return std::strtoll(args[index].as(), nullptr, 0); + } + + throw std::runtime_error(std::format("parameter {} does not have type 'string' or 'int'", index)); + } + + std::unordered_map> operations = + { + {"+", INT64_OPERATION(a + b)}, + {"-", INT64_OPERATION(a - b)}, + {"*", INT64_OPERATION(a * b)}, + {"/", INT64_OPERATION(a / b)}, + {"&", INT64_OPERATION(a & b)}, + {"^", INT64_OPERATION(a ^ b)}, + {"|", INT64_OPERATION(a | b)}, + {"~", INT64_OPERATION(~a)}, + {"%", INT64_OPERATION(a % b)}, + {">>", INT64_OPERATION(a >> b)}, + {"<<", INT64_OPERATION(a << b)}, + {"++", INT64_OPERATION(a + 1)}, + {"--", INT64_OPERATION(a - 1)}, + }; + + std::unordered_map> comparisons = + { + {">", INT64_OPERATION(a > b)}, + {">=", INT64_OPERATION(a >= b)}, + {"==", INT64_OPERATION(a == b)}, + {"!=", INT64_OPERATION(a != b)}, + {"<=", INT64_OPERATION(a <= b)}, + {"<", INT64_OPERATION(a < b)}, + }; + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + auto value = get_int64_arg(args, 0, false); + return value <= std::numeric_limits::max() && value >= std::numeric_limits::min(); + }, "int64_is_int", "int64::is_int"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + return static_cast(get_int64_arg(args, 0, false)); + }, "int64_to_int", "int64::to_int"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) -> scripting::script_value + { + auto a = get_int64_arg(args, 0, false); + const auto op = args[1].as(); + auto b = get_int64_arg(args, 2, true); + + if (const auto iter = operations.find(op); iter != operations.end()) + { + return std::to_string(iter->second(a, b)); + } + + if (const auto iter = comparisons.find(op); iter != comparisons.end()) + { + return iter->second(a, b); + } + + throw std::runtime_error("invalid int64 operation"); + }, "int64_op", "int64::op"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + const auto a = get_int64_arg(args, 0, false); + const auto b = get_int64_arg(args, 1, false); + return std::to_string(std::min(a, b)); + }, "int64_min", "int64::min"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + const auto a = get_int64_arg(args, 0, false); + const auto b = get_int64_arg(args, 1, false); + return std::to_string(std::max(a, b)); + }, "int64_max", "int64::max"); + } + }; +} + +REGISTER_COMPONENT(int64::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/io.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/io.cpp new file mode 100644 index 0000000..91c756e --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/io.cpp @@ -0,0 +1,133 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "gsc.hpp" +#include "io.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include +#include +#include + +namespace io +{ + namespace + { + struct watched_file + { + std::unique_ptr watcher; + scripting::object handle; + }; + + std::vector watched_files; + + void poll_files() + { + for (auto& file : watched_files) + { + std::string data; + if (file.watcher->run(1ms, &data, true)) + { + scripting::notify(file.handle.get_entity_id(), "data", {data}); + } + } + } + } + + class component final : public component_interface + { + public: + void on_after_dvar_init([[maybe_unused]] plugin::plugin* plugin) override + { + const auto fs_homepath = game::Dvar_FindVar("fs_homepath"); + if (fs_homepath == nullptr) + { + return; + } + + std::filesystem::current_path(fs_homepath->current.string); + printf("working directory: %s", fs_homepath->current.string); + } + + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add("hashstring", [](const char* str) + { + return game::BG_StringHashValue(str); + }); + + gsc::function::add_multiple([](const std::string& file, const std::string& data, + const scripting::variadic_args& va) + { + auto append = false; + + if (va.size() > 0) + { + append = va[0]; + } + + return utils::io::write_file(file, data, append); + }, "writefile", "io::write_file"); + + gsc::function::add_multiple([](const std::string& file, const std::string& data) + { + return utils::io::write_file(file, data, true); + }, "appendfile", "io::append_file"); + + gsc::function::add_multiple(utils::io::file_exists, "fileexists", "io::file_exists"); + gsc::function::add_multiple(utils::io::move_file, "movefile", "io::move_file"); + gsc::function::add_multiple(utils::io::file_size, "filesize", "io::file_size"); + gsc::function::add_multiple(utils::io::create_directory, "createdirectory", "io::create_directory"); + gsc::function::add_multiple(utils::io::directory_exists, "directoryexists", "io::directory_exists"); + gsc::function::add_multiple(utils::io::directory_is_empty, "directoryisempty", "io::directory_is_empty"); + gsc::function::add_multiple(utils::io::list_files, "listfiles", "io::list_files"); + gsc::function::add_multiple(utils::io::remove_file, "removefile", "io::remove_file"); + + gsc::function::add_multiple([](const std::string& directory, const scripting::variadic_args& va) + { + auto recursive = false; + if (va.size() > 0) + { + recursive = va[0]; + } + + utils::io::remove_directory(directory, recursive); + }, "removedirectory", "io::remove_directory"); + + gsc::function::add_multiple(utils::io::copy_folder, "copyfolder", "io::copy_folder"); + gsc::function::add_multiple(utils::io::copy_folder, "copydirectory", "io::copy_directory"); + gsc::function::add_multiple(static_cast(utils::io::read_file), "readfile", "io::read_file"); + + if (utils::flags::has_flag("experimental-utils")) + { + scheduler::loop(poll_files, scheduler::server_packet_loop); + + scripting::on_shutdown([]() + { + watched_files.clear(); + }); + + gsc::function::add("io::watch_file", [](const std::string& file) + { + scripting::object handle; + + auto watcher = std::make_unique(file); + watcher->init(); + watched_file watched_file{}; + watched_file.watcher = std::move(watcher); + watched_file.handle = handle; + watched_files.emplace_back(std::move(watched_file)); + + return handle; + }); + } + } + }; +} + +REGISTER_COMPONENT(io::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/io.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/io.hpp new file mode 100644 index 0000000..cf90d51 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/io.hpp @@ -0,0 +1,6 @@ +#include + +namespace io +{ + +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/json.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/json.cpp new file mode 100644 index 0000000..83ddda6 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/json.cpp @@ -0,0 +1,319 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/scripting/event.hpp" +#include "game/scripting/execution.hpp" +#include "game/scripting/array.hpp" + +#include "gsc.hpp" +#include "json.hpp" +#include "scripting.hpp" + +#include + +namespace json +{ + namespace + { + constexpr const auto max_str_len = 0x5000u; + + struct dump_context_t + { + std::unordered_set visited_objects; + }; + + nlohmann::json gsc_to_json(const scripting::script_value& value, bool print_id, dump_context_t& ctx); + + nlohmann::json array_to_json(const scripting::array& array, bool print_id, dump_context_t& ctx) + { + if (array.size() == 0) + { + return nlohmann::json::array(); + } + + nlohmann::json obj; + + auto string_indexed = -1; + const auto keys = array.get_keys(); + + for (const auto& key : keys) + { + const auto is_int = key.is(); + const auto is_string = key.is(); + + if (string_indexed == -1) + { + string_indexed = is_string; + } + + if (!string_indexed && is_int) + { + const auto index = key.as(); + obj[index] = gsc_to_json(array[index], print_id, ctx); + } + else if (string_indexed && is_string) + { + const auto key_str = key.as(); + obj.emplace(key_str, gsc_to_json(array[key_str], print_id, ctx)); + } + } + + return obj; + } + + nlohmann::json object_to_json(const scripting::object& object, bool print_id, dump_context_t& ctx) + { + const auto id = object.get_entity_id(); + if (ctx.visited_objects.find(id) != ctx.visited_objects.end()) + { + return utils::string::va("[struct reference %i]", id); + } + + ctx.visited_objects.insert(id); + auto obj = nlohmann::json::object(); + + if (print_id) + { + obj["__id"] = id; + } + + const auto keys = object.get_keys(); + for (const auto& key : keys) + { + if (key == "__id") + { + continue; + } + + obj.emplace(key, gsc_to_json(object[key], print_id, ctx)); + } + + return obj; + } + + nlohmann::json vector_to_array(const float* value) + { + nlohmann::json obj; + obj.push_back(value[0]); + obj.push_back(value[1]); + obj.push_back(value[2]); + return obj; + } + + nlohmann::json gsc_to_json(const scripting::script_value& value, bool print_id, dump_context_t& ctx) + { + const auto& variable = value.get_raw(); + + if (value.is()) + { + return value.as(); + } + + if (value.is()) + { + return value.as(); + } + + if (value.is()) + { + return value.as(); + } + + if (value.is()) + { + return vector_to_array(variable.u.vectorValue); + } + + if (value.is()) + { + return object_to_json(variable.u.uintValue, print_id, ctx); + } + + if (value.is()) + { + return array_to_json(variable.u.uintValue, print_id, ctx); + } + + if (value.is()) + { + return object_to_json(variable.u.uintValue, print_id, ctx); + } + + if (value.is()) + { + const auto function = value.as(); + return utils::string::va("[[ %s ]]", function.get_name().data()); + } + + if (variable.type == game::SCRIPT_NONE) + { + return {}; + } + + if (variable.type == game::SCRIPT_CODEPOS) + { + const auto function = scripting::find_function(variable.u.codePosValue); + return utils::string::va("[codepos: %s]", function.data()); + } + + if (variable.type == game::SCRIPT_END) + { + const auto function = scripting::find_function(variable.u.codePosValue); + return utils::string::va("[precodepos: %s]", function.data()); + } + + return utils::string::va("[%s]", value.type_name().data()); + } + + scripting::script_value json_to_gsc(nlohmann::json obj) + { + const auto type = obj.type(); + + switch (type) + { + case (nlohmann::detail::value_t::boolean): + return obj.get(); + case (nlohmann::detail::value_t::number_integer): + case (nlohmann::detail::value_t::number_unsigned): + return obj.get(); + case (nlohmann::detail::value_t::number_float): + return obj.get(); + case (nlohmann::detail::value_t::string): + return obj.get(); + case (nlohmann::detail::value_t::array): + { + scripting::array array; + + for (const auto& [key, value] : obj.items()) + { + array.emplace_back(json_to_gsc(value)); + } + + return array.get_raw(); + } + case (nlohmann::detail::value_t::object): + { + scripting::array array; + + for (const auto& [key, value] : obj.items()) + { + array[key] = json_to_gsc(value); + } + + return array.get_raw(); + } + } + + return {}; + } + } + + std::string gsc_to_string(const scripting::script_value& value) + { + dump_context_t ctx; + return gsc_to_json(value, false, ctx).dump(); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + scripting::array array; + + for (auto i = 0u; i < args.size(); i += 2) + { + if (i >= args.size() - 1) + { + continue; + } + + const auto key = args[i].as(); + array[key] = args[i + 1]; + } + + return array; + }, "createmap", "json::create_map"); + + gsc::function::add_multiple([](const std::string& json) + { + const auto obj = nlohmann::json::parse(json); + return json_to_gsc(obj); + }, "jsonparse", "json::parse"); + + gsc::function::add_multiple([](const scripting::script_value& value, const scripting::variadic_args& args) + { + auto indent = -1; + auto print_id = false; + + if (args.size() > 0) + { + indent = args[0].as(); + } + + if (args.size() > 1) + { + print_id = args[1].as(); + } + + dump_context_t ctx; + const auto json = gsc_to_json(value, print_id, ctx); + auto dump = json.dump(indent); + + if (dump.size() > max_str_len) + { + printf("^3WARNING: json dump longer than %i bytes, truncating!", max_str_len); + dump.resize(max_str_len); + } + + return dump; + }, "jsonserialize", "json::serialize"); + + gsc::function::add_multiple([](const std::string& file, const scripting::script_value& value, const scripting::variadic_args& va) + { + std::string file_name = file; + + auto indent = -1; + auto print_id = false; + + if (!file_name.ends_with(".json")) + { + file_name.append(".json"); + } + + if (va.size() > 0) + { + indent = va[0].as(); + } + + if (va.size() > 1) + { + print_id = va[1].as(); + } + + dump_context_t ctx; + const auto json = gsc_to_json(value, print_id, ctx); + const auto dump = json.dump(indent); + + return utils::io::write_file(file_name, dump); + }, "jsondump", "json::dump"); + + gsc::function::add_multiple([](const scripting::variadic_args& args) + { + std::string buffer; + + for (const auto& arg : args) + { + buffer.append(gsc_to_string(arg)); + buffer.append("\t"); + } + + printf("%s\n", buffer.data()); + }, "jsonprint", "json::print"); + } + }; +} + +REGISTER_COMPONENT(json::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/json.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/json.hpp new file mode 100644 index 0000000..30a2c69 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/json.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace json +{ + std::string gsc_to_string(const scripting::script_value& value); +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/logfile.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/logfile.cpp new file mode 100644 index 0000000..8c18e6d --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/logfile.cpp @@ -0,0 +1,49 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include +#include +#include +#include +#include + +namespace logfile +{ + namespace + { + std::string filename; + std::mutex mutex; + + bool is_logging_enabled() + { + static const auto is_enabled = utils::flags::has_flag("log"); + return is_enabled; + } + } + + void log_hook(const std::string& buffer) + { + if (!is_logging_enabled()) + { + return; + } + + std::lock_guard _(mutex); + utils::io::write_file(filename, buffer, true); + } + + class component final : public component_interface + { + public: + void on_after_dvar_init([[maybe_unused]] plugin::plugin* plugin) override + { + utils::io::create_directory("logs"); + filename = utils::string::va("logs/console-%s.log", + utils::string::get_timestamp().data()); + } + }; +} + +REGISTER_COMPONENT(logfile::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/logfile.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/logfile.hpp new file mode 100644 index 0000000..1d01017 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/logfile.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace logfile +{ + void log_hook(const std::string& buffer); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/mysql.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/mysql.cpp new file mode 100644 index 0000000..1648669 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/mysql.cpp @@ -0,0 +1,545 @@ +#include +#include "loader/component_loader.hpp" + +#include "mysql.hpp" +#include "component/gsc.hpp" +#include "component/scheduler.hpp" +#include "component/scripting.hpp" + +#include + +namespace mysql +{ + namespace + { + struct mysql_result_t + { + MYSQL_RES* result; + MYSQL_STMT* stmt; + uint64_t affected_rows; + std::string error; + }; + + struct task_t + { + scripting::object handle; + mysql_result_t result{}; + std::atomic_bool completed; + }; + + std::vector> tasks; + std::array connection_pool; + + scripting::script_value field_to_value(const MYSQL_FIELD* field, const std::string& row) + { + switch (field->type) + { + case enum_field_types::MYSQL_TYPE_INT24: + case enum_field_types::MYSQL_TYPE_LONG: + case enum_field_types::MYSQL_TYPE_SHORT: + return std::atoi(row.data()); + case enum_field_types::MYSQL_TYPE_LONGLONG: + return row; + case enum_field_types::MYSQL_TYPE_FLOAT: + case enum_field_types::MYSQL_TYPE_DOUBLE: + return static_cast(std::atof(row.data())); + } + + return row; + } + + scripting::script_value bind_to_value(const MYSQL_BIND* bind) + { + switch (bind->buffer_type) + { + case enum_field_types::MYSQL_TYPE_INT24: + case enum_field_types::MYSQL_TYPE_LONG: + case enum_field_types::MYSQL_TYPE_SHORT: + return *reinterpret_cast(bind->buffer); + case enum_field_types::MYSQL_TYPE_LONGLONG: + return std::to_string(*reinterpret_cast(bind->buffer)); + case enum_field_types::MYSQL_TYPE_FLOAT: + return *reinterpret_cast(bind->buffer); + case enum_field_types::MYSQL_TYPE_DOUBLE: + return static_cast(*reinterpret_cast(bind->buffer)); + case enum_field_types::MYSQL_TYPE_STRING: + return std::string{reinterpret_cast(bind->buffer), bind->buffer_length}; + } + + return {}; + } + + scripting::array generate_result(MYSQL_STMT* stmt) + { + if (stmt == nullptr) + { + return {}; + } + + utils::memory::allocator allocator; + + scripting::array result_arr; + + const auto meta = mysql_stmt_result_metadata(stmt); + if (meta == nullptr) + { + return {}; + } + + const auto column_count = mysql_num_fields(meta); + const auto fields = mysql_fetch_fields(meta); + + const auto is_null = allocator.allocate_array(column_count); + const auto errors = allocator.allocate_array(column_count); + const auto real_lengths = allocator.allocate_array(column_count); + const auto binds = allocator.allocate_array(column_count); + + for (auto i = 0u; i < column_count; i++) + { + binds[i].length = &real_lengths[i]; + binds[i].is_null = &is_null[i]; + binds[i].error = &errors[i]; + } + + if (mysql_stmt_bind_result(stmt, binds) != 0 || + mysql_stmt_store_result(stmt) != 0) + { + return {}; + } + + while (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA) + { + for (auto i = 0u; i < column_count; i++) + { + switch (fields[i].type) + { + case enum_field_types::MYSQL_TYPE_INT24: + case enum_field_types::MYSQL_TYPE_LONG: + case enum_field_types::MYSQL_TYPE_SHORT: + { + binds[i].buffer_type = MYSQL_TYPE_LONG; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(int); + break; + }; + case enum_field_types::MYSQL_TYPE_LONGLONG: + { + binds[i].buffer_type = MYSQL_TYPE_LONGLONG; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(std::int64_t); + break; + }; + case enum_field_types::MYSQL_TYPE_FLOAT: + binds[i].buffer_type = MYSQL_TYPE_FLOAT; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(float); + break; + case enum_field_types::MYSQL_TYPE_DOUBLE: + { + binds[i].buffer_type = MYSQL_TYPE_DOUBLE; + binds[i].buffer = allocator.allocate(); + binds[i].buffer_length = sizeof(double); + break; + } + default: + binds[i].buffer_type = MYSQL_TYPE_STRING; + binds[i].buffer = allocator.allocate_array(real_lengths[i]); + binds[i].buffer_length = real_lengths[i]; + break; + } + + mysql_stmt_fetch_column(stmt, &binds[i], i, 0); + } + + scripting::array row_arr; + + for (auto i = 0u; i < column_count; i++) + { + const auto field = &fields[i]; + const std::string field_name = {field->name, field->name_length}; + row_arr[field_name] = bind_to_value(&binds[i]); + } + + result_arr.emplace_back(row_arr); + } + + mysql_free_result(meta); + + return result_arr; + } + + scripting::array generate_result(MYSQL_RES* result) + { + if (result == nullptr) + { + return {}; + } + + scripting::array result_arr; + + const auto num_rows = mysql_num_rows(result); + const auto num_fields = mysql_num_fields(result); + const auto fields = mysql_fetch_fields(result); + + for (auto i = 0u; i < num_rows; i++) + { + scripting::array row_arr; + + const auto row = mysql_fetch_row(result); + const auto lengths = mysql_fetch_lengths(result); + + for (auto f = 0u; f < num_fields; f++) + { + const auto field = &fields[f]; + + const std::string field_str = {field->name, field->name_length}; + const std::string row_str = {row[f], lengths[f]}; + const auto value = field_to_value(field, row_str); + + row_arr[field_str] = value; + } + + result_arr.emplace_back(row_arr); + } + + return result_arr; + } + + template + scripting::object create_mysql_query(F&& cb) + { + auto task = std::make_shared(); + tasks.emplace_back(task); + + scheduler::thread_pool.push([=] + { + try + { + mysql::access([&](database_t& db) + { + task->result = cb(db); + task->completed = true; + }); + } + catch (const std::exception& e) + { + printf("^1MySQL ERROR: %s\n", e.what()); + task->completed = true; + } + }); + + return task->handle; + } + + void wait_and_clear_tasks() + { + for (auto& task : tasks) + { + while (!task->completed) + { + std::this_thread::sleep_for(10ms); + } + } + + tasks.clear(); + } + + void notify_task_result(std::shared_ptr& task) + { + const auto result = task->result.result + ? generate_result(task->result.result) + : generate_result(task->result.stmt); + + const auto rows = static_cast(task->result.affected_rows); + scripting::notify(task->handle.get_entity_id(), "done", {result, rows, task->result.error}); + + if (task->result.result != nullptr) + { + mysql_free_result(task->result.result); + task->result.result = nullptr; + } + + if (task->result.stmt != nullptr) + { + mysql_stmt_close(task->result.stmt); + task->result.stmt = nullptr; + } + } + + void check_tasks() + { + for (auto i = tasks.begin(); i != tasks.end(); ) + { + auto& task = *i; + if (!task->completed) + { + ++i; + continue; + } + else + { + notify_task_result(task); + i = tasks.erase(i); + } + } + } + + template + MYSQL_BIND* bind_statement_args(const T& args, std::size_t& bind_count) + { + bind_count = args.size(); + const auto binds = utils::memory::allocate_array(bind_count); + + for (auto i = 0u; i < args.size(); i++) + { + const auto& arg = args[i]; + const auto& raw_value = arg.get_raw(); + + switch (raw_value.type) + { + case game::SCRIPT_FLOAT: + { + binds[i].buffer = utils::memory::allocate(); + binds[i].buffer_type = MYSQL_TYPE_FLOAT; + *reinterpret_cast(binds[i].buffer) = raw_value.u.floatValue; + break; + } + case game::SCRIPT_INTEGER: + { + binds[i].buffer = utils::memory::allocate(); + binds[i].buffer_type = MYSQL_TYPE_LONG; + *reinterpret_cast(binds[i].buffer) = raw_value.u.intValue; + break; + } + case game::SCRIPT_STRING: + { + const auto str = arg.as(); + const auto str_copy = utils::memory::duplicate_string(str); + binds[i].buffer = str_copy; + binds[i].buffer_length = str.size(); + binds[i].buffer_type = MYSQL_TYPE_STRING; + break; + } + default: + { + binds[i].buffer_type = MYSQL_TYPE_NULL; + break; + } + } + } + + return binds; + } + + void cleanup_connections() + { + for (auto& connection : connection_pool) + { + connection.cleanup(); + } + } + + void free_statement_binds(MYSQL_BIND* binds, const std::size_t bind_count) + { + if (binds == nullptr) + { + return; + } + + for (auto i = 0u; i < bind_count; i++) + { + utils::memory::free(binds[i].buffer); + } + + utils::memory::free(binds); + } + } + + utils::concurrency::container& get_config() + { + static utils::concurrency::container config; + static auto initialized = false; + + if (!initialized) + { + config.access([&](sql::connection_config& cfg) + { + cfg.user = "root"; + cfg.password = "root"; + cfg.host = "localhost"; + cfg.port = 3306; + cfg.database = "default"; + }); + + initialized = true; + } + return config; + } + + void connection::check() + { + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - this->start_; + + if (this->db.get() == nullptr || !this->db->ping_server() || diff >= connection_timeout) + { + get_config().access([&](sql::connection_config& cfg) + { + this->db = std::make_unique(cfg); + this->start_ = now; + }); + } + + this->last_access_ = now; + } + + void connection::cleanup() + { + std::unique_lock lock(this->mutex, std::try_to_lock); + if (!lock.owns_lock()) + { + return; + } + + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - this->last_access_; + if (diff >= connection_timeout) + { + this->db.reset(); + } + } + + connection* get_connection(std::unique_lock& lock) + { + static thread_local connection* last_connection{}; + if (last_connection != nullptr) + { + lock = std::unique_lock(last_connection->mutex, std::try_to_lock); + if (lock.owns_lock()) + { + return last_connection; + } + } + + for (auto i = 0u; i < connection_pool.size(); i++) + { + auto connection = &connection_pool[i]; + if (connection == last_connection) + { + continue; + } + + lock = std::unique_lock(connection->mutex, std::try_to_lock); + if (!lock.owns_lock()) + { + continue; + } + + last_connection = connection; + return connection; + } + + return nullptr; + } + + class component final : public component_interface + { + public: + void on_shutdown([[maybe_unused]] plugin::plugin* plugin) override + { + wait_and_clear_tasks(); + } + + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + scripting::on_shutdown(wait_and_clear_tasks); + scheduler::loop(cleanup_connections, scheduler::async, 60s); + scheduler::loop(check_tasks, scheduler::server); + + gsc::function::add("mysql::set_config", [](const scripting::object& config) + { + get_config().access([&](sql::connection_config& cfg) + { + cfg.host = config["host"].as(); + cfg.user = config["user"].as(); + cfg.password = config["password"].as(); + cfg.port = config["port"].as(); + cfg.database = config["database"].as(); + }); + }); + + gsc::function::add_multiple([](const std::string& query) + { + return create_mysql_query([=](database_t& db) + { + const auto handle = db->get_handle(); + + mysql_result_t result{}; + if (mysql_query(handle, query.data()) != 0) + { + result.error = mysql_error(handle); + return result; + } + + result.result = mysql_store_result(handle); + result.affected_rows = mysql_affected_rows(handle); + + return result; + }); + }, "mysql::query", "mysql::execute"); + + gsc::function::add("mysql::prepared_statement", [](const std::string& query, const scripting::variadic_args& values) + { + MYSQL_BIND* binds = nullptr; + auto bind_count = 0u; + + try + { + if (values.size() > 0 && values[0].is()) + { + binds = bind_statement_args(values[0].as(), bind_count); + } + else + { + binds = bind_statement_args(values, bind_count); + } + + const auto handle = create_mysql_query([binds, bind_count, query](database_t& db) + { + const auto _0 = gsl::finally([=] + { + free_statement_binds(binds, bind_count); + }); + + mysql_result_t result{}; + + const auto handle = db->get_handle(); + const auto stmt = mysql_stmt_init(handle); + + if (mysql_stmt_prepare(stmt, query.data(), query.size()) != 0 || + (binds != nullptr && mysql_stmt_bind_param(stmt, binds) != 0) || + mysql_stmt_execute(stmt) != 0) + { + result.error = mysql_stmt_error(stmt); + return result; + } + + result.stmt = stmt; + result.affected_rows = mysql_stmt_affected_rows(stmt); + + return result; + }); + + return handle; + } + catch (const std::exception& e) + { + free_statement_binds(binds, bind_count); + throw e; + } + }); + } + }; +} + +REGISTER_COMPONENT(mysql::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/mysql.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/mysql.hpp new file mode 100644 index 0000000..bd88662 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/mysql.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include + +#pragma warning(push) +#pragma warning(disable: 4127) +#pragma warning(disable: 4267) +#pragma warning(disable: 4018) +#pragma warning(disable: 4996) +#pragma warning(disable: 4244) +#include +#include +#pragma warning(pop) + +namespace sql = sqlpp::mysql; + +namespace mysql +{ + constexpr auto max_connections = 100; + constexpr auto connection_timeout = 200s; + + using database_mutex_t = std::recursive_mutex; + using database_t = std::unique_ptr; + + utils::concurrency::container& get_config(); + + class connection + { + public: + connection() = default; + void check(); + void cleanup(); + + database_t db; + database_mutex_t mutex; + + private: + std::chrono::high_resolution_clock::time_point start_; + std::chrono::high_resolution_clock::time_point last_access_; + + }; + + connection* get_connection(std::unique_lock& lock); + + template + T access(F&& accessor) + { + std::unique_lock lock; + auto conn = get_connection(lock); + if (conn == nullptr) + { + throw std::runtime_error("out of connections"); + } + + conn->check(); + return accessor(conn->db); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/network.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/network.cpp new file mode 100644 index 0000000..08c035d --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/network.cpp @@ -0,0 +1,210 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "gsc.hpp" +#include "io.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include + +namespace network +{ + namespace + { + struct socket_t + { + SOCKET socket; + scripting::object handle; + }; + + std::vector connected_sockets; + std::unordered_map handle_to_socket; + + void poll_sockets() + { + for (const auto& inst : connected_sockets) + { + std::string data; + data.reserve(0x1000); + + auto result = 0; + do + { + char buffer[0x1000]{}; + result = recv(inst.socket, buffer, sizeof(buffer), 0); + if (result != -1 && result != 0) + { + data.append(buffer); + } + } while (result != -1 && result != 0); + + if (data.size() == 0) + { + continue; + } + + auto start_index = 0; + scripting::array chunks; + + for (auto i = 0u; i < data.size(); i++) + { + const auto is_eof = data[i] == EOF; + const auto is_end = i == data.size() - 1; + if (is_eof || is_end) + { + const auto chunk = data.substr(start_index, i - start_index); + chunks.emplace_back(chunk); + start_index = i + 1; + } + } + + scripting::notify(inst.handle.get_entity_id(), "data", {chunks.get_raw()}); + } + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + if (!utils::flags::has_flag("experimental-utils")) + { + return; + } + + scripting::on_shutdown([] + { + for (const auto& inst : connected_sockets) + { + closesocket(inst.socket); + } + + connected_sockets.clear(); + handle_to_socket.clear(); + }); + + scheduler::loop(poll_sockets, scheduler::server_packet_loop); + + gsc::function::add("network::connect", [](const std::string& type, const std::string& address, const int port) + -> scripting::script_value + { + static std::unordered_map socket_types = + { + {"tcp", SOCK_STREAM}, + {"udp", SOCK_DGRAM}, + }; + + const auto type_lower = utils::string::to_lower(type); + const auto type_id = socket_types.find(type_lower); + if (type_id == socket_types.end()) + { + throw std::runtime_error("invalid socket type"); + } + + const auto sock = socket(AF_INET, type_id->second, 0); + + u_long mode = 1; + if (ioctlsocket(sock, FIONBIO, &mode) == SOCKET_ERROR) + { + closesocket(sock); + return {}; + } + + int flag = 1; + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int)); + + SOCKADDR_IN sin{}; + sin.sin_family = AF_INET; + sin.sin_port = htons(static_cast(port)); + inet_pton(AF_INET, address.data(), &sin.sin_addr); + + if (connect(sock, reinterpret_cast(&sin), sizeof(sin)) == SOCKET_ERROR) + { + const auto error = WSAGetLastError(); + if (error != WSAEWOULDBLOCK && error != WSAEINPROGRESS) + { + closesocket(sock); + return {}; + } + } + + scripting::object handle; + + socket_t socket_ref{}; + socket_ref.socket = sock; + socket_ref.handle = handle; + + const auto handle_id = handle.get_entity_id(); + handle_to_socket[handle_id] = sock; + + connected_sockets.emplace_back(std::move(socket_ref)); + + return handle; + }); + + gsc::function::add("network::send", [](const scripting::object& handle, std::string data) + { + const auto handle_id = handle.get_entity_id(); + const auto iter = handle_to_socket.find(handle_id); + if (iter == handle_to_socket.end()) + { + return -1; + } + + const auto sock = iter->second; + data += EOF; + return send(sock, data.data(), data.size(), 0); + }); + + gsc::function::add("network::close", [](const scripting::object& handle) + { + const auto handle_id = handle.get_entity_id(); + const auto iter = handle_to_socket.find(handle_id); + if (iter == handle_to_socket.end()) + { + return; + } + + closesocket(iter->second); + handle_to_socket.erase(iter); + + for (auto i = connected_sockets.begin(), end = connected_sockets.end(); i != end; ++i) + { + if (i->handle.get_entity_id() == handle_id) + { + connected_sockets.erase(i); + break; + } + } + }); + + gsc::function::add("network::is_connected", [](const scripting::object& handle) + { + const auto handle_id = handle.get_entity_id(); + const auto iter = handle_to_socket.find(handle_id); + if (iter == handle_to_socket.end()) + { + return (int)0; + } + + char code{}; + int size = sizeof(code); + getsockopt(iter->second, SOL_SOCKET, SO_ERROR, &code, &size); + return static_cast(code); + }); + + gsc::function::add("network::get_last_error", []() + { + return WSAGetLastError(); + }); + } + }; +} + +REGISTER_COMPONENT(network::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/notifies.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/notifies.cpp new file mode 100644 index 0000000..a9ddaac --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/notifies.cpp @@ -0,0 +1,211 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/scripting/stack_isolation.hpp" +#include "gsc.hpp" +#include "scheduler.hpp" +#include "scripting.hpp" + +#include +#include +#include + +namespace notifies +{ + namespace + { + struct notify_group + { + unsigned int owner_id; + unsigned int notify_target; + unsigned int main_notify; + std::unordered_set sub_notifies; + }; + + using notify_groups_t = std::vector; + + bool in_notify_queue; + notify_groups_t notify_groups_queue; + + utils::hook::detour vm_notify_hook; + + void push_sl_string(unsigned int value) + { + game::VariableValue var{}; + var.type = game::SCRIPT_STRING; + var.u.stringValue = value; + scripting::push_value(var); + } + + void vm_notify_stub(game::scriptInstance_t inst, unsigned int notify_list_owner_id, + unsigned int string_value, game::VariableValue* top) + { + vm_notify_hook.invoke(inst, notify_list_owner_id, string_value, top); + + if (in_notify_queue) + { + return; + } + + const auto disconnect_str = *reinterpret_cast(0x24B71CE); + + in_notify_queue = true; + const auto _0 = gsl::finally([] + { + in_notify_queue = false; + }); + + std::unordered_map> notified; + + for (auto i = notify_groups_queue.begin(); i != notify_groups_queue.end(); ) + { + if (i->owner_id == notify_list_owner_id) + { + const auto should_notify = i->sub_notifies.find(string_value) != i->sub_notifies.end(); + const auto should_delete = string_value == disconnect_str || notified[i->notify_target].contains(i->main_notify); + const auto object_type = game::scr_VarGlob->objectVariableValue[i->notify_target].w.type; + + if (object_type != game::SCRIPT_FREE && should_notify) + { + scripting::stack_isolation _1; + push_sl_string(string_value); + game::Scr_NotifyId(inst, 0, i->notify_target, i->main_notify, 1); + notified[i->notify_target].insert(i->main_notify); + } + + if (should_notify || should_delete) + { + i = notify_groups_queue.erase(i); + continue; + } + } + + ++i; + } + } + + void clear_notify_group(unsigned int id) + { + for (auto i = notify_groups_queue.begin(); i != notify_groups_queue.end(); ) + { + if (i->owner_id == id) + { + i = notify_groups_queue.erase(i); + } + else + { + ++i; + } + } + } + + void free_variable_stub_1(utils::hook::assembler& a) + { + a.pushad(); + a.push(ebx); + a.call(clear_notify_group); + a.pop(ebx); + a.popad(); + + a.movzx(ecx, word_ptr(edi, 2)); + a.xor_(edx, edx); + a.jmp(0x550EA5); + } + + void free_variable_stub_2(utils::hook::assembler& a) + { + a.pushad(); + a.push(edi); + a.call(clear_notify_group); + a.pop(edi); + a.popad(); + + a.mov(word_ptr(esi, 2), di); + a.pop(edi); + a.jmp(0x415EA2); + } + + void* client_connect_stub(int client_num, int script_pers_id) + { + const scripting::entity player = game::Scr_GetEntityId(game::SCRIPTINSTANCE_SERVER, client_num, 0, 0); + scripting::notify(*game::levelEntityId, "direct_connect", {player}); + return utils::hook::invoke(0x41BE10, client_num, script_pers_id); + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + if (!game::environment::t6zm()) + { + return; + } + + vm_notify_hook.create(0x8F3620, vm_notify_stub); + + utils::hook::jump(0x550E9F, utils::hook::assemble(free_variable_stub_1)); + utils::hook::jump(0x415E9D, utils::hook::assemble(free_variable_stub_2)); + + utils::hook::call(0x501F0F, client_connect_stub); + + scripting::on_shutdown([] + { + notify_groups_queue.clear(); + }); + + gsc::function::add("createnotifygroup", [](const scripting::variadic_args& args) + -> scripting::script_value + { + std::unordered_set notifies; + + const auto& entity = args[0].get_raw(); + if (entity.type != game::SCRIPT_OBJECT) + { + throw std::runtime_error("argument 1 must be a script object"); + } + + const auto& entity_target = args[1].get_raw(); + if (entity_target.type != game::SCRIPT_OBJECT) + { + throw std::runtime_error("argument 1 must be a script object"); + } + + const auto main_notify_str = args[2].as(); + const auto main_notify = game::SL_GetString(main_notify_str.data(), 0); + + for (auto i = 3u; i < args.size(); i++) + { + const auto& arg = args[i]; + if (arg.is()) + { + const auto arr = arg.as(); + for (const auto& [key, value] : arr) + { + const auto str = value.as(); + notifies.insert(game::SL_GetString(str.data(), 0)); + } + } + else if (arg.is()) + { + const auto str = arg.as(); + notifies.insert(game::SL_GetString(str.data(), 0)); + } + } + + if (notifies.size() <= 0) + { + throw std::runtime_error("must pass atleast 1 notify"); + } + + notify_groups_queue.emplace_back(entity.u.uintValue, entity_target.u.uintValue, + main_notify, notifies); + + return {}; + }); + } + }; +} + +REGISTER_COMPONENT(notifies::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/patches.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/patches.cpp new file mode 100644 index 0000000..f59c5e3 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/patches.cpp @@ -0,0 +1,72 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "game/scripting/safe_execution.hpp" +#include "component/gsc.hpp" + +#include +#include + +namespace patches +{ + namespace + { + const game::dvar_t* sv_display_clan_tag; + + char* cs_display_name_stub(const void* client_state, int type) + { + if (!sv_display_clan_tag->current.enabled) + { + type = 1; + } + + return utils::hook::invoke(SELECT(0x59AE90, 0x563AD0), client_state, type); + } + + void* bg_get_client_field_stub(int a1, const char* a2) + { + const auto result = utils::hook::invoke(0x5B4220, a1, a2); + if (!result) + { + const auto err = utils::string::va("no client field named %s found", a2); + game::Scr_Error(game::SCRIPTINSTANCE_SERVER, err, false); + } + + return result; + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + patch(); + + if (game::environment::t6zm()) + { + patch_zm(); + } + } + + void patch() + { + sv_display_clan_tag = game::Dvar_RegisterBool("sv_display_clan_tag", false, 0, "Display the clan tag in the game log"); + utils::hook::call(SELECT(0x820F1C, 0x81F91C), cs_display_name_stub); + } + + void patch_zm() + { + // Fix some common crashes, not necessary because of `patch()` but just to be sure + + // sets an always null pointer :/ + utils::hook::nop(0x6FF36E, 0x2); + + // related to custom perks and tombstone/electric chair on motd and possibly other contexts + utils::hook::call(0x85842A, bg_get_client_field_stub); + } + }; +} + +REGISTER_COMPONENT(patches::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/scheduler.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/scheduler.cpp new file mode 100644 index 0000000..cbcf76c --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/scheduler.cpp @@ -0,0 +1,185 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" +#include "scheduler.hpp" + +#include +#include + +namespace scheduler +{ + utils::thread_pool thread_pool; + + namespace + { + struct task + { + std::function handler{}; + std::chrono::milliseconds interval{}; + std::chrono::high_resolution_clock::time_point last_call{}; + }; + + using task_list = std::vector; + + utils::hook::detour com_server_packet_event_hook; + + class task_pipeline + { + public: + void add(task&& task) + { + new_callbacks_.access([&task](task_list& tasks) + { + tasks.emplace_back(std::move(task)); + }); + } + + void execute() + { + callbacks_.access([&](task_list& tasks) + { + this->merge_callbacks(); + + for (auto i = tasks.begin(); i != tasks.end();) + { + const auto now = std::chrono::high_resolution_clock::now(); + const auto diff = now - i->last_call; + + if (diff < i->interval) + { + ++i; + continue; + } + + i->last_call = now; + + const auto res = i->handler(); + if (res == cond_end) + { + i = tasks.erase(i); + } + else + { + ++i; + } + } + }); + } + + private: + utils::concurrency::container new_callbacks_; + utils::concurrency::container callbacks_; + + void merge_callbacks() + { + callbacks_.access([&](task_list& tasks) + { + new_callbacks_.access([&](task_list& new_tasks) + { + tasks.insert(tasks.end(), std::move_iterator(new_tasks.begin()), std::move_iterator(new_tasks.end())); + new_tasks = {}; + }); + }); + } + }; + + std::thread thread; + std::atomic_bool killed = false; + task_pipeline pipelines[pipeline::count]; + + void execute(const pipeline type) + { + assert(type >= 0 && type < pipeline::count); + pipelines[type].execute(); + } + + void execute_server() + { + execute(pipeline::server); + } + + void server_frame_stub(utils::hook::assembler& a) + { + a.pushad(); + a.call(execute_server); + a.popad(); + + a.jmp(SELECT(0x49E910, 0x5001A0)); + } + + void com_server_packet_event_stub() + { + execute(pipeline::server_packet_loop); + com_server_packet_event_hook.invoke(); + } + } + + void schedule(const std::function& callback, const pipeline type, + const std::chrono::milliseconds delay) + { + assert(type >= 0 && type < pipeline::count); + + task task; + task.handler = callback; + task.interval = delay; + task.last_call = std::chrono::high_resolution_clock::now(); + + pipelines[type].add(std::move(task)); + } + + void loop(const std::function& callback, const pipeline type, + const std::chrono::milliseconds delay) + { + schedule([callback]() + { + callback(); + return cond_continue; + }, type, delay); + } + + void once(const std::function& callback, const pipeline type, + const std::chrono::milliseconds delay) + { + schedule([callback]() + { + callback(); + return cond_end; + }, type, delay); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + thread_pool.initialize(8); + thread_pool.start(); + + thread = std::thread([]() + { + while (!killed) + { + execute(pipeline::async); + std::this_thread::sleep_for(10ms); + } + }); + + utils::hook::jump(SELECT(0x4A59F7, 0x6AA2F7), utils::hook::assemble(server_frame_stub)); + com_server_packet_event_hook.create(SELECT(0x42F850, 0x549300), com_server_packet_event_stub); + } + + void on_shutdown([[maybe_unused]] plugin::plugin* plugin) override + { + thread_pool.stop(); + killed = true; + + if (thread.joinable()) + { + thread.join(); + } + } + }; +} + +REGISTER_COMPONENT(scheduler::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/scheduler.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/scheduler.hpp new file mode 100644 index 0000000..6a8dffc --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/scheduler.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace scheduler +{ + enum pipeline + { + server, + server_packet_loop, + async, + count, + }; + + static const bool cond_continue = false; + static const bool cond_end = true; + + void schedule(const std::function& callback, pipeline type = pipeline::server, + std::chrono::milliseconds delay = 0ms); + void loop(const std::function& callback, pipeline type = pipeline::server, + std::chrono::milliseconds delay = 0ms); + void once(const std::function& callback, pipeline type = pipeline::server, + std::chrono::milliseconds delay = 0ms); + + extern utils::thread_pool thread_pool; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/scripting.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/scripting.cpp new file mode 100644 index 0000000..c7abd87 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/scripting.cpp @@ -0,0 +1,283 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "game/scripting/event.hpp" +#include "game/scripting/execution.hpp" + +#include "scripting.hpp" +#include "scheduler.hpp" + +#include +#include + +namespace scripting +{ + std::unordered_map> fields_table; + + std::unordered_map method_map; + std::unordered_map function_map; + + std::unordered_map> script_function_table; + std::unordered_map>> script_function_table_sort; + + namespace + { + utils::hook::detour scr_add_class_field_hook; + utils::hook::detour g_shutdown_game_hook; + + void scr_add_class_field_stub(game::scriptInstance_t inst, unsigned int classnum, char const* name, unsigned int offset) + { + if (fields_table[classnum].find(name) == fields_table[classnum].end()) + { + fields_table[classnum][name] = offset; + } + + scr_add_class_field_hook.invoke(inst, classnum, name, offset); + } + + game::BuiltinMethodDef get_method(const std::string& name) + { + game::BuiltinMethodDef method{}; + + auto pName = name.data(); + int arg = 0; + + const auto func = game::Scr_GetMethod(&pName, &arg, &arg, &arg); + + if (func) + { + method.actionFunc = reinterpret_cast(func); + method.actionString = pName; + } + + return method; + } + + void load_functions() + { + for (auto i = 0; i < 278; i++) + { + const auto method = game::player_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 22; i++) + { + const auto method = game::scriptEnt_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 114; i++) + { + const auto method = game::scriptVehicle_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 29; i++) + { + const auto method = game::hudElem_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 29; i++) + { + const auto method = game::helicopter_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 109; i++) + { + const auto method = game::actor_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 95; i++) + { + const auto method = game::builtInCommon_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 286; i++) + { + const auto method = game::builtIn_methods[i]; + method_map[method.actionString] = method; + } + + for (auto i = 0; i < 334; i++) + { + const auto function = game::functions[i]; + function_map[function.actionString] = function; + } + + for (auto i = 0; i < 220; i++) + { + const auto function = game::common_functions[i]; + function_map[function.actionString] = function; + } + + method_map["notifyonplayercommand"] = get_method("notifyonplayercommand"); + } + + utils::hook::detour scr_load_script_hook; + + void extract_obj_functions(game::GSC_OBJ* obj) + { + const auto exported = reinterpret_cast(&obj->magic[obj->exports_offset]); + const auto count = obj->exports_count; + auto iter = &obj->magic[obj->exports_offset + 8]; + + std::string filename = &obj->magic[obj->name]; + if (filename.ends_with(".gsc")) + { + filename = filename.substr(0, filename.size() - 4); + } + + std::string original = filename; + auto filename_count = 0; + while (script_function_table.find(filename) != script_function_table.end()) + { + filename = utils::string::va("%s_%i", original.data(), filename_count++); + } + + for (auto i = 0; i < count; i++) + { + const auto index = *reinterpret_cast(iter); + const auto function = &obj->magic[index]; + const auto address = reinterpret_cast(reinterpret_cast(obj) + exported[i].address); + + script_function_table[filename][function] = address; + script_function_table_sort[filename].push_back({function, address}); + + if (i == count - 1) + { + script_function_table[filename]["$end"] = &obj->magic[obj->fixup_offset]; + script_function_table_sort[filename].push_back({"$end", &obj->magic[obj->fixup_offset]}); + } + + iter += 12; + } + } + + utils::hook::detour scr_post_load_scripts_hook; + unsigned int post_load_scripts_stub(unsigned int inst) + { + script_function_table.clear(); + script_function_table_sort.clear(); + + const auto script_count = *reinterpret_cast(SELECT(0x2DB9F18, 0x2D8A218)); + const auto scripts = reinterpret_cast(SELECT(0x2DA2FE8, 0x2D732E8)); + + for (auto i = 0u; i < script_count; i++) + { + const auto obj = scripts[i].activeVersion; + extract_obj_functions(obj); + } + + return scr_post_load_scripts_hook.invoke(inst); + } + + std::vector> shutdown_callbacks; + void g_shutdown_game_stub(const int free_scripts) + { + for (const auto& callback : shutdown_callbacks) + { + callback(); + } + + return g_shutdown_game_hook.invoke(free_scripts); + } + } + + script_function find_function_ptr(const std::string& _name) + { + const auto name = utils::string::to_lower(_name); + + if (function_map.find(name) != function_map.end()) + { + const auto func = function_map[name].actionFunc; + return reinterpret_cast(func); + } + + if (method_map.find(name) != method_map.end()) + { + const auto func = method_map[name].actionFunc; + return reinterpret_cast(func); + } + + return nullptr; + } + + std::string find_function(const char* pos) + { + for (const auto& file : script_function_table_sort) + { + for (auto i = file.second.begin(); i != file.second.end() && std::next(i) != file.second.end(); ++i) + { + const auto next = std::next(i); + if (pos >= i->second && pos < next->second) + { + return utils::string::va("%s::%s", file.first.data(), i->first.data()); + } + } + } + + return "unknown function"; + } + + std::optional> find_function_pair(const char* pos) + { + for (const auto& file : script_function_table_sort) + { + for (auto i = file.second.begin(); i != file.second.end() && std::next(i) != file.second.end(); ++i) + { + const auto next = std::next(i); + if (pos >= i->second && pos < next->second) + { + return {{file.first, i->first}}; + } + } + } + + return {}; + } + + const char* find_function_start(const char* pos) + { + for (const auto& file : script_function_table_sort) + { + for (auto i = file.second.begin(); i != file.second.end() && std::next(i) != file.second.end(); ++i) + { + const auto next = std::next(i); + if (pos >= i->second && pos < next->second) + { + return i->second; + } + } + } + + return nullptr; + } + + void on_shutdown(const std::function& callback) + { + shutdown_callbacks.push_back(callback); + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + g_shutdown_game_hook.create(SELECT(0x60DCF0, 0x688A40), g_shutdown_game_stub); + + scr_add_class_field_hook.create(SELECT(0x6B7620, 0x438AD0), scr_add_class_field_stub); + scr_post_load_scripts_hook.create(SELECT(0x642EB0, 0x425F80), post_load_scripts_stub); + + load_functions(); + } + }; +} + +REGISTER_COMPONENT(scripting::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/scripting.hpp b/t6/plugins/tws-t6-gsc-utils/src/component/scripting.hpp new file mode 100644 index 0000000..8c616aa --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/scripting.hpp @@ -0,0 +1,22 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + extern std::unordered_map> fields_table; + + extern std::unordered_map> script_function_table; + extern std::unordered_map>> script_function_table_sort; + + extern std::unordered_map method_map; + extern std::unordered_map function_map; + + using script_function = void(*)(game::scr_entref_t); + + script_function find_function_ptr(const std::string& name); + std::string find_function(const char* pos); + const char* find_function_start(const char* pos); + std::optional> find_function_pair(const char* pos); + + void on_shutdown(const std::function& callback); +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/string.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/string.cpp new file mode 100644 index 0000000..c1f7aad --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/string.cpp @@ -0,0 +1,201 @@ +#include +#include "loader/component_loader.hpp" + +#include "gsc.hpp" + +// lua/lstrlib.c +#define MAX_FORMAT 32 +#define L_FMTFLAGSF "-+#0 " +#define L_FMTFLAGSX "-#0" +#define L_FMTFLAGSI "-+0 " +#define L_FMTFLAGSU "-0" +#define L_FMTFLAGSC "-" + +namespace string +{ + namespace + { + // lua/lstrlib.c + const char* getformat(const char* strfrmt, char* form) + { + const auto len = std::strspn(strfrmt, L_FMTFLAGSF "123456789.") + 1; + if (len >= MAX_FORMAT - 10) + { + throw std::runtime_error("invalid format (too long)"); + } + + *(form++) = '%'; + std::memcpy(form, strfrmt, len * sizeof(char)); + *(form + len) = '\0'; + return strfrmt + len - 1; + } + + // lua/lstrlib.c + const char* get_2_digits(const char* s) + { + if (isdigit(static_cast(*s))) + { + s++; + if (isdigit(static_cast(*s))) + { + s++; + } + } + + return s; + } + + // lua/lstrlib.c + void check_format(const char* form, const char* flags, int precision) + { + const char* spec = form + 1; + spec += std::strspn(spec, flags); + if (*spec != '0') + { + spec = get_2_digits(spec); + if (*spec == '.' && precision) + { + spec++; + spec = get_2_digits(spec); + } + } + if (!std::isalpha(static_cast(*spec))) + { + throw std::runtime_error(utils::string::va("invalid conversion specification: '%s'", form)); + } + } + + // partially lua/lstrlib.c + std::string format_string(const std::string& fmt, const scripting::variadic_args& va) + { + std::string buffer{}; + size_t va_index{}; + const char* strfrmt = fmt.data(); + const char* strfrmt_end = strfrmt + fmt.size(); + + while (strfrmt < strfrmt_end) + { + if (*strfrmt != '%') + { + buffer.push_back(*strfrmt++); + } + else if (*++strfrmt == '%') + { + buffer.push_back(*strfrmt++); + } + else + { + char form[MAX_FORMAT]{}; + const char* flags = ""; + strfrmt = getformat(strfrmt, form); + + switch (*strfrmt++) + { + case 'd': + case 'i': + flags = L_FMTFLAGSI; + goto intcase; + case 'u': + case 'p': + flags = L_FMTFLAGSU; + goto intcase; + case 'o': + case 'x': + case 'X': + flags = L_FMTFLAGSX; + intcase: + { + check_format(form, flags, 1); + const auto value = va[va_index].as(); + buffer.append(utils::string::va(form, value)); + va_index++; + break; + } + case 'f': + case 'F': + case 'e': + case 'E': + case 'g': + case 'G': + { + check_format(form, L_FMTFLAGSF, 1); + const auto value = va[va_index].as(); + buffer.append(utils::string::va(form, value)); + va_index++; + break; + } + case 'c': + { + const auto value = va[va_index].as(); + check_format(form, L_FMTFLAGSC, 0); + buffer.append(utils::string::va(form, static_cast(value))); + va_index++; + break; + } + case 's': + { + const auto str = va[va_index].as(); + buffer.append(str); + va_index++; + break; + } + default: + { + throw std::runtime_error(utils::string::va("invalid conversion '%s' to 'format'", form)); + } + } + } + } + + return buffer; + } + } + + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + gsc::function::add_multiple(format_string, "va", "string::va", + "formatstring", "string::format", "sprintf"); + + gsc::function::add_multiple(utils::string::to_upper, "toupper", "string::to_upper"); + gsc::function::add_multiple(utils::string::to_lower, "tolower", "string::to_lower"); + + gsc::function::add("string::is_numeric", utils::string::is_numeric); + gsc::function::add("string::starts_with", utils::string::starts_with); + gsc::function::add("string::ends_with", utils::string::ends_with); + gsc::function::add("string::replace", utils::string::replace); + + gsc::function::add("string::regex_replace", [](const std::string& str, const std::regex& expr, + const std::string& with) + { + return std::regex_replace(str, expr, with); + }); + + gsc::function::add("string::regex_match", [](const std::string& str, const std::regex& expr) + { + scripting::array array_match{}; + std::smatch match{}; + + if (std::regex_match(str, match, std::regex(expr))) + { + for (const auto& s : match) + { + array_match.emplace_back((s.str())); + } + } + + return array_match; + }); + + gsc::function::add("string::regex_search", [](const std::string& str, const std::regex& expr) + { + return std::regex_search(str, expr); + }); + } + }; +} + +REGISTER_COMPONENT(string::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/component/turrets.cpp b/t6/plugins/tws-t6-gsc-utils/src/component/turrets.cpp new file mode 100644 index 0000000..b48315d --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/component/turrets.cpp @@ -0,0 +1,418 @@ +#include +#include "loader/component_loader.hpp" +#include "game/game.hpp" + +#include "gsc.hpp" +#include "game/structs.hpp" +#include "game/game.hpp" + +#include +#include + +#define TURRET_DUMP_FIELD(__field__) \ + data[#__field__] = turret->__field__; \ + +#define TURRET_ADD_FIELD_INTERNAL(__name__, __getter__, __setter__) \ + {utils::string::to_lower(#__name__), turret_field{offsetof(game::TurretInfo, __name__), __getter__, __setter__}} \ + +#define TURRET_ADD_FIELD_GETTER(__name__, __getter__) \ + TURRET_ADD_FIELD_INTERNAL(__name__, __getter__, get_default_setter(dummy_info.__name__, #__name__, offsetof(game::TurretInfo, __name__))) \ + +#define TURRET_ADD_FIELD_SETTER(__name__, __setter__) \ + TURRET_ADD_FIELD_INTERNAL(__name__, get_default_getter(dummy_info.__name__, offsetof(game::TurretInfo, __name__)), __setter__) \ + +#define TURRET_ADD_FIELD(__name__) \ + TURRET_ADD_FIELD_INTERNAL(__name__, get_default_getter(dummy_info.__name__, offsetof(game::TurretInfo, __name__)), get_default_setter(dummy_info.__name__, #__name__, offsetof(game::TurretInfo, __name__))) \ + +#define NEW_MAX_TURRETS 255 + +namespace turret +{ + namespace + { + game::TurretInfo turret_info_store_relocated[NEW_MAX_TURRETS]; + + game::TurretInfo dummy_info{}; + + using getter_t = std::function; + using setter_t = std::function; + + struct turret_field + { + std::size_t offset; + getter_t getter; + setter_t setter; + }; + + template + getter_t get_default_getter([[maybe_unused]] T, const size_t offset) + { + return [=](game::TurretInfo* info) + { + return *reinterpret_cast(reinterpret_cast(info) + offset); + }; + } + + template + typename std::enable_if::value, setter_t>::type + get_default_setter([[maybe_unused]] T, const std::string& name, const size_t offset) + { + return [=](game::TurretInfo* info, const scripting::function_argument& value) + { + if (!value.is()) + { + const auto type_name = value.type_name(); + throw std::runtime_error(utils::string::va("type '%s' is not valid for field '%s'", type_name.data(), name.data())); + } + + const auto vec = value.as(); + const auto val = reinterpret_cast(reinterpret_cast(info) + offset); + val[0] = vec.get_x(); + val[1] = vec.get_y(); + val[2] = vec.get_z(); + }; + } + + template + typename std::enable_if::value, setter_t>::type + get_default_setter([[maybe_unused]] T, const std::string& name, const size_t offset) + { + return [=](game::TurretInfo* info, const scripting::function_argument& value) + { + if (!value.is()) + { + const auto type_name = value.type_name(); + throw std::runtime_error(utils::string::va("type '%s' is not valid for field '%s'", type_name.data(), name.data())); + } + + *reinterpret_cast(reinterpret_cast(info) + offset) = value.as(); + }; + } + + scripting::script_value turret_get_team(game::TurretInfo* info) + { + return utils::hook::invoke(0x4D7A30, info->eTeam); + } + + void turret_set_team(game::TurretInfo* info, const scripting::function_argument& value) + { + const auto str = value.as(); + const auto team_names = reinterpret_cast(0xD39970); + for (auto i = 0; i < game::TEAM_NUM_TEAMS; i++) + { + if (team_names[i] == str) + { + info->eTeam = static_cast(i); + return; + } + } + + throw std::runtime_error(utils::string::va("invalid team '%s'", str.data())); + } + + std::unordered_map turret_fields = + { + TURRET_ADD_FIELD(inuse), + TURRET_ADD_FIELD(state), + TURRET_ADD_FIELD(flags), + TURRET_ADD_FIELD(fireTime), + TURRET_ADD_FIELD(manualTarget.infoIndex), + TURRET_ADD_FIELD(manualTarget.number), + TURRET_ADD_FIELD(target.infoIndex), + TURRET_ADD_FIELD(target.number), + TURRET_ADD_FIELD(targetPos), + TURRET_ADD_FIELD(targetTime), + TURRET_ADD_FIELD(missOffsetNormalized), + TURRET_ADD_FIELD(arcmin[0]), + TURRET_ADD_FIELD(arcmin[1]), + TURRET_ADD_FIELD(arcmax[0]), + TURRET_ADD_FIELD(arcmax[1]), + TURRET_ADD_FIELD(initialYawmin), + TURRET_ADD_FIELD(initialYawmax), + TURRET_ADD_FIELD(forwardAngleDot), + TURRET_ADD_FIELD(dropPitch), + TURRET_ADD_FIELD(scanningPitch), + TURRET_ADD_FIELD(convergenceTime[0]), + TURRET_ADD_FIELD(convergenceTime[1]), + TURRET_ADD_FIELD(suppressTime), + TURRET_ADD_FIELD(maxRangeSquared), + TURRET_ADD_FIELD(detachSentient.infoIndex), + TURRET_ADD_FIELD(detachSentient.number), + TURRET_ADD_FIELD(stance), + TURRET_ADD_FIELD(prevStance), + TURRET_ADD_FIELD(fireSndDelay), + TURRET_ADD_FIELD(accuracy), + TURRET_ADD_FIELD(userOrigin), + TURRET_ADD_FIELD(prevSentTarget), + TURRET_ADD_FIELD(aiSpread), + TURRET_ADD_FIELD(playerSpread), + TURRET_ADD_FIELD_INTERNAL(eTeam, turret_get_team, turret_set_team), + TURRET_ADD_FIELD(heatVal), + TURRET_ADD_FIELD(overheating), + TURRET_ADD_FIELD(fireBarrel), + TURRET_ADD_FIELD(scanSpeed), + TURRET_ADD_FIELD(scanDecelYaw), + TURRET_ADD_FIELD(scanPauseTime), + TURRET_ADD_FIELD(originError), + TURRET_ADD_FIELD(anglesError), + TURRET_ADD_FIELD(pitchCap), + TURRET_ADD_FIELD(triggerDown), + TURRET_ADD_FIELD(fireSnd), + TURRET_ADD_FIELD(fireSndPlayer), + TURRET_ADD_FIELD(startFireSnd), + TURRET_ADD_FIELD(startFireSndPlayer), + TURRET_ADD_FIELD(loopFireEnd), + TURRET_ADD_FIELD(loopFireEndPlayer), + TURRET_ADD_FIELD(rotateLoopSnd), + TURRET_ADD_FIELD(rotateLoopSndPlayer), + TURRET_ADD_FIELD(rotateStopSnd), + TURRET_ADD_FIELD(rotateStopSndPlayer), + TURRET_ADD_FIELD(sndIsFiring), + TURRET_ADD_FIELD(targetOffset), + TURRET_ADD_FIELD(onTargetAngle), + TURRET_ADD_FIELD(previousAngles), + TURRET_ADD_FIELD(previousAngles), + }; + + utils::hook::detour bg_get_weapon_def_hook; + game::WeaponDef* bg_get_weapon_def_stub(const unsigned int weapon) + { + auto asset = bg_get_weapon_def_hook.invoke(weapon); + + if (asset->maxTurnSpeed[0] == 0.f && asset->maxTurnSpeed[1] == 0.f) + { + asset->maxTurnSpeed[0] = 360.f; + asset->maxTurnSpeed[1] = 360.f; + asset->minTurnSpeed[0] = 1.f; + asset->minTurnSpeed[1] = 1.f; + } + + return asset; + } + + void g_init_turrets_stub() + { + for (int i = 0; i < NEW_MAX_TURRETS; ++i) + { + turret_info_store_relocated[i].inuse = 0; + } + + // level.turrets = turret_info_store_relocated; + utils::hook::set(0x233CAB8, turret_info_store_relocated); + } + + auto turret_index = 0; + const auto turret_index_ptr = &turret_index; + + game::TurretInfo* g_spawn_turret_relocate() + { + turret_index = 0; + game::TurretInfo* turret_info{}; + + for (auto i = 0; i < NEW_MAX_TURRETS; ++i) + { + turret_info = &turret_info_store_relocated[i]; + if (!turret_info->inuse) + { + break; + } + + turret_index++; + } + + return turret_info; + } + + void __declspec(naked) g_spawn_turret_stub() + { + __asm + { + push esi; + pushad; + call g_spawn_turret_relocate; + mov[esp + 0x20], eax; + popad; + pop esi; + mov ecx, [turret_index_ptr]; + push 0x60AE90; + retn; + } + } + + game::gentity_s* g_spawn_turret_static_entity_stub(int /*unk1*/) + { + return utils::hook::invoke(0x54FCC0); + } + + void reallocate_turrets() + { + // Modify G_InitTurrets to initialize more tuurets + utils::hook::jump(0x61E850, g_init_turrets_stub); + // Modify G_SpawnTurret to check for a larger amount of turretInfoStore + utils::hook::jump(0x60AE3B, g_spawn_turret_stub); + // Modify G_SpawnturetStaticEntity to call G_Spawn instead + utils::hook::jump(0x6E1B00, g_spawn_turret_static_entity_stub); + // Patch G_SpawnTurret com_error to happen at a higher limit (255) + utils::hook::set(0x60AE92, NEW_MAX_TURRETS); + + // Patch level.num_gentities to min of 78 to not preallocate turret slots + utils::hook::set(0x67EEA2 + 6, 78); + // Patch SV_LocateGameData arg so sv.num_entities is the same as the above + utils::hook::set(0x67EE9F + 1, 78); + // G_FreeEntity remove turrets from slot calculations + utils::hook::set(0x6658E7 + 2, 78); + } + } + + class component final : public component_interface + { + public: + void on_startup([[maybe_unused]] plugin::plugin* plugin) override + { + if (!game::environment::t6zm()) + { + return; + } + + gsc::method::add("setturretfield", [](const scripting::entity& entity, const std::string& field, const scripting::variadic_args& args) + { + const auto ent = entity.get_entity_reference(); + if (ent.classnum != 0) + { + throw std::runtime_error("Invalid entity"); + } + + const auto turret = game::g_entities[ent.entnum].pTurretInfo; + if (turret == nullptr) + { + throw std::runtime_error("Not a valid turret entity"); + } + const auto field_name = utils::string::to_lower(field); + const auto itr = turret_fields.find(field_name); + + if (itr == turret_fields.end()) + { + throw std::runtime_error(utils::string::va("Invalid field %s", field_name.data())); + } + + itr->second.setter(turret, args[0]); + }); + + gsc::method::add("getturretfield", [](const scripting::entity& entity, const std::string& field) + { + const auto ent = entity.get_entity_reference(); + if (ent.classnum != 0) + { + throw std::runtime_error("Invalid entity"); + } + + const auto turret = game::g_entities[ent.entnum].pTurretInfo; + if (turret == nullptr) + { + throw std::runtime_error("Not a valid turret entity"); + } + + const auto field_name = utils::string::to_lower(field); + const auto itr = turret_fields.find(field_name); + + if (itr == turret_fields.end()) + { + throw std::runtime_error(utils::string::va("Invalid field %s", field_name.data())); + } + + return itr->second.getter(turret); + }); + + gsc::function::add("dumpturret", [](const scripting::entity& entity, const std::string& name) + { + const auto ent = entity.get_entity_reference(); + if (ent.classnum != 0) + { + throw std::runtime_error("Invalid entity"); + } + + const auto turret = game::g_entities[ent.entnum].pTurretInfo; + if (turret == nullptr) + { + throw std::runtime_error("Not a valid turret entity"); + } + + nlohmann::ordered_json data; + + TURRET_DUMP_FIELD(inuse); + TURRET_DUMP_FIELD(state); + TURRET_DUMP_FIELD(flags); + TURRET_DUMP_FIELD(fireTime); + data["manualTarget"]["infoIndex"] = turret->manualTarget.infoIndex; + data["manualTarget"]["number"] = turret->manualTarget.number; + data["target"]["infoIndex"] = turret->target.infoIndex; + data["target"]["number"] = turret->target.number; + TURRET_DUMP_FIELD(targetPos); + TURRET_DUMP_FIELD(targetTime); + TURRET_DUMP_FIELD(missOffsetNormalized); + TURRET_DUMP_FIELD(arcmin); + TURRET_DUMP_FIELD(arcmax); + TURRET_DUMP_FIELD(initialYawmin); + TURRET_DUMP_FIELD(initialYawmax); + TURRET_DUMP_FIELD(forwardAngleDot); + TURRET_DUMP_FIELD(dropPitch); + TURRET_DUMP_FIELD(scanningPitch); + TURRET_DUMP_FIELD(convergenceTime); + TURRET_DUMP_FIELD(suppressTime); + TURRET_DUMP_FIELD(maxRangeSquared); + data["detachSentient"]["infoIndex"] = turret->detachSentient.infoIndex; + data["detachSentient"]["number"] = turret->detachSentient.number; + TURRET_DUMP_FIELD(stance); + TURRET_DUMP_FIELD(prevStance); + TURRET_DUMP_FIELD(fireSndDelay); + TURRET_DUMP_FIELD(accuracy); + TURRET_DUMP_FIELD(userOrigin); + TURRET_DUMP_FIELD(prevSentTarget); + TURRET_DUMP_FIELD(aiSpread); + TURRET_DUMP_FIELD(playerSpread); + TURRET_DUMP_FIELD(eTeam); + TURRET_DUMP_FIELD(heatVal); + TURRET_DUMP_FIELD(overheating); + TURRET_DUMP_FIELD(fireBarrel); + TURRET_DUMP_FIELD(scanSpeed); + TURRET_DUMP_FIELD(scanDecelYaw); + TURRET_DUMP_FIELD(scanPauseTime); + TURRET_DUMP_FIELD(originError); + TURRET_DUMP_FIELD(anglesError); + TURRET_DUMP_FIELD(pitchCap); + TURRET_DUMP_FIELD(triggerDown); + TURRET_DUMP_FIELD(fireSnd); + TURRET_DUMP_FIELD(fireSndPlayer); + TURRET_DUMP_FIELD(startFireSnd); + TURRET_DUMP_FIELD(startFireSndPlayer); + TURRET_DUMP_FIELD(loopFireEnd); + TURRET_DUMP_FIELD(loopFireEndPlayer); + TURRET_DUMP_FIELD(rotateLoopSnd); + TURRET_DUMP_FIELD(rotateLoopSndPlayer); + TURRET_DUMP_FIELD(rotateStopSnd); + TURRET_DUMP_FIELD(rotateStopSndPlayer); + TURRET_DUMP_FIELD(sndIsFiring); + TURRET_DUMP_FIELD(targetOffset); + TURRET_DUMP_FIELD(onTargetAngle); + TURRET_DUMP_FIELD(turretRotateState); + TURRET_DUMP_FIELD(previousAngles); + + const std::string buffer = data.dump(4); + const std::string turret_entity_path = utils::string::va("entity_dumps/turrets/%s.json", name.data()); + + return utils::io::write_file(turret_entity_path, buffer, false); + }); + + // Check for whether a weapon can be spawned as a turret + utils::hook::nop(0x60AF4E, 5); + + // Don't use weapon def value for turrets turnspeed + bg_get_weapon_def_hook.create(0x5906B0, bg_get_weapon_def_stub); + + // Reallocate turrets to NEW_MAX_TURRETS + reallocate_turrets(); + } + }; +} + +REGISTER_COMPONENT(turret::component) diff --git a/t6/plugins/tws-t6-gsc-utils/src/dllmain.cpp b/t6/plugins/tws-t6-gsc-utils/src/dllmain.cpp new file mode 100644 index 0000000..e7c8b87 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/dllmain.cpp @@ -0,0 +1,78 @@ +#include +#include "loader/component_loader.hpp" + +#include "game/game.hpp" + +#include "plugin.hpp" + +#include +#include +#include +#include +#include + +namespace +{ + utils::hook::detour load_library_hook; + + std::string extract_resource(const std::string& name, const int resource) + { + const auto data = utils::nt::load_resource(resource); + const auto path = std::filesystem::current_path() / "tmp" / name; + const auto path_str = path.generic_string(); + + if (!utils::io::write_file(path_str, data)) + { + const auto current = utils::io::read_file(path_str); + const auto hash_current = utils::cryptography::md5::compute(current); + const auto hash_target = utils::cryptography::md5::compute(data); + if (hash_target != hash_current) + { + throw std::runtime_error("failed to extract libmysql.dll!"); + } + } + + return path_str; + } + + HMODULE __stdcall load_library_stub(LPCSTR lib_name, HANDLE file, DWORD flags) + { + if (lib_name == "libmysql.dll"s) + { + const auto path = extract_resource(lib_name, LIBMYSQL_DLL); + const auto handle = load_library_hook.invoke_pascal(path.data(), file, flags); + + if (handle != nullptr) + { + return handle; + } + else + { + throw std::runtime_error(std::format("failed to load libmysql.dll: {}", GetLastError())); + } + } + + return load_library_hook.invoke_pascal(lib_name, file, flags); + } +} + +PLUTONIUM_API plutonium::sdk::plugin* PLUTONIUM_CALLBACK on_initialize() +{ + return plugin::get(); +} + +BOOL APIENTRY DllMain(HMODULE module, DWORD ul_reason_for_call, LPVOID /*reserved*/) +{ + if (ul_reason_for_call == DLL_PROCESS_ATTACH) + { + utils::nt::library::set_current_handle(module); + load_library_hook.create(LoadLibraryExA, load_library_stub); + } + + if (ul_reason_for_call == DLL_PROCESS_DETACH) + { + component_loader::on_shutdown(); + } + + return TRUE; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/exception/minidump.cpp b/t6/plugins/tws-t6-gsc-utils/src/exception/minidump.cpp new file mode 100644 index 0000000..9160d96 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/exception/minidump.cpp @@ -0,0 +1,94 @@ +#include +#include "minidump.hpp" + +#include +#pragma comment(lib, "dbghelp.lib") + +#include + +namespace exception +{ + namespace + { + constexpr MINIDUMP_TYPE get_minidump_type() + { + const auto type = MiniDumpIgnoreInaccessibleMemory // + | MiniDumpWithHandleData // + | MiniDumpScanMemory // + | MiniDumpWithProcessThreadData // + | MiniDumpWithFullMemoryInfo // + | MiniDumpWithThreadInfo // + | MiniDumpWithUnloadedModules; + + return static_cast(type); + } + + std::string get_temp_filename() + { + char filename[MAX_PATH] = {0}; + char pathname[MAX_PATH] = {0}; + + GetTempPathA(sizeof(pathname), pathname); + GetTempFileNameA(pathname, "Plutonium T6 -", 0, filename); + return filename; + } + + HANDLE write_dump_to_temp_file(const LPEXCEPTION_POINTERS exceptioninfo) + { + MINIDUMP_EXCEPTION_INFORMATION minidump_exception_info = {GetCurrentThreadId(), exceptioninfo, FALSE}; + + auto* const file_handle = CreateFileA(get_temp_filename().data(), GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_ALWAYS, + FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, + nullptr); + + if (!MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file_handle, get_minidump_type(), + &minidump_exception_info, + nullptr, + nullptr)) + { + MessageBoxA(nullptr, "There was an error creating the minidump! Hit OK to close the program.", + "Minidump Error", MB_OK | MB_ICONERROR); + TerminateProcess(GetCurrentProcess(), 123); + } + + return file_handle; + } + + std::string read_file(HANDLE file_handle) + { + FlushFileBuffers(file_handle); + SetFilePointer(file_handle, 0, nullptr, FILE_BEGIN); + + std::string buffer{}; + + DWORD bytes_read = 0; + char temp_bytes[0x2000]; + + do + { + if (!ReadFile(file_handle, temp_bytes, sizeof(temp_bytes), &bytes_read, nullptr)) + { + return {}; + } + + buffer.append(temp_bytes, bytes_read); + } + while (bytes_read == sizeof(temp_bytes)); + + return buffer; + } + } + + std::string create_minidump(const LPEXCEPTION_POINTERS exceptioninfo) + { + auto* const file_handle = write_dump_to_temp_file(exceptioninfo); + + const auto _ = gsl::finally([file_handle]() + { + CloseHandle(file_handle); + }); + + return read_file(file_handle); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/exception/minidump.hpp b/t6/plugins/tws-t6-gsc-utils/src/exception/minidump.hpp new file mode 100644 index 0000000..9378639 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/exception/minidump.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace exception +{ + std::string create_minidump(LPEXCEPTION_POINTERS exceptioninfo); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/game.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/game.cpp new file mode 100644 index 0000000..ab9cf81 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/game.cpp @@ -0,0 +1,85 @@ +#include +#include "game.hpp" + +#include + +namespace game +{ + gamemode current = reinterpret_cast(0xC2F028) == "multiplayer"s + ? gamemode::multiplayer + : gamemode::zombies; + + namespace environment + { + bool t6mp() + { + return current == gamemode::multiplayer; + } + + bool t6zm() + { + return current == gamemode::zombies; + } + } + + gentity_s* GetEntity(scr_entref_t entref) + { + if (entref.classnum != 0) + { + game::Scr_ObjectError(SCRIPTINSTANCE_SERVER, "Not an entity"); + return nullptr; + } + + assert(entref.entnum < (1 << 10)); + + return &game::g_entities[entref.entnum]; + } + + scr_entref_t Scr_GetEntityIdRef(unsigned int ent_id) + { + scr_entref_t entref{}; + + const auto v2 = &game::scr_VarGlob->objectVariableValue[ent_id]; + + entref.entnum = v2->u.f.next; + entref.classnum = gsl::narrow_cast(v2->w.classnum >> 8); + + return entref; + } + + void Scr_TerminateWaitThread(scriptInstance_t inst, unsigned int local_id, unsigned int start_local_id) + { + static const auto func = utils::hook::assemble([](utils::hook::assembler& a) + { + a.pushad(); + a.mov(esi, dword_ptr(esp, 0x24)); + a.push(dword_ptr(esp, 0x28)); + a.push(dword_ptr(esp, 0x2C)); + a.call(SELECT(0x8F4620, 0x8F3380)); + a.add(esp, 0x8); + a.popad(); + + a.ret(); + }); + + utils::hook::invoke(func, inst, local_id, start_local_id); + } + + void Scr_TerminateWaittillThread(scriptInstance_t inst, unsigned int local_id, unsigned int start_local_id) + { + static const auto func = utils::hook::assemble([](utils::hook::assembler& a) + { + a.pushad(); + a.mov(esi, dword_ptr(esp, 0x24)); + a.mov(edi, dword_ptr(esp, 0x28)); + a.push(dword_ptr(esp, 0x2C)); + a.call(SELECT(0x8F4750, 0x8F34B0)); + a.add(esp, 0x4); + a.popad(); + + a.ret(); + }); + + utils::hook::invoke(func, inst, local_id, start_local_id); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/game.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/game.hpp new file mode 100644 index 0000000..2e9d4dc --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/game.hpp @@ -0,0 +1,71 @@ +#pragma once + +#include "structs.hpp" + +#define SELECT(mp, zm) (game::environment::t6mp() ? mp : zm) + +namespace game +{ + enum gamemode + { + none, + multiplayer, + zombies + }; + + extern gamemode current; + + namespace environment + { + bool t6mp(); + bool t6zm(); + } + + template + class symbol + { + public: + symbol(const size_t t6mp, const size_t t6zm) + : t6mp_(reinterpret_cast(t6mp)) + , t6zm_(reinterpret_cast(t6zm)) + { + } + + T* get() const + { + if (environment::t6mp()) + { + return t6mp_; + } + + return t6zm_; + } + + void set(const size_t ptr) + { + this->t6mp_ = reinterpret_cast(ptr); + this->t6zm_ = reinterpret_cast(ptr); + } + + operator T* () const + { + return this->get(); + } + + T* operator->() const + { + return this->get(); + } + + private: + T* t6mp_; + T* t6zm_; + }; + + gentity_s* GetEntity(scr_entref_t entref); + scr_entref_t Scr_GetEntityIdRef(unsigned int entId); + void Scr_TerminateWaitThread(scriptInstance_t inst, unsigned int localId, unsigned int startLocalId); + void Scr_TerminateWaittillThread(scriptInstance_t inst, unsigned int localId, unsigned int startLocalId); +} + +#include "symbols.hpp" diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.cpp new file mode 100644 index 0000000..2df03e1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.cpp @@ -0,0 +1,354 @@ +#include + +#include "array.hpp" +#include "execution.hpp" + +namespace scripting +{ + array_value::array_value(const array* array, const script_value& key) + : array_(array) + , key_(key) + { + const auto value = this->array_->get(key); + this->script_value::operator=(value); + } + + void array_value::operator=(const script_value& value) + { + this->array_->set(this->key_, value); + this->script_value::operator=(value); + } + + array::array(const std::uint32_t id) + : id_(id) + { + this->add(); + } + + array::array(const array& other) + { + this->operator=(other); + } + + array::array(array&& other) noexcept + { + this->id_ = other.id_; + other.id_ = 0; + } + + array::array() + { + this->id_ = make_array(); + } + + array::~array() + { + this->release(); + } + + array& array::operator=(const array& other) + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + this->add(); + } + + return *this; + } + + array& array::operator=(array&& other) noexcept + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + other.id_ = 0; + } + + return *this; + } + + void array::add() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + } + } + + void array::release() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + } + } + + std::vector array::get_keys() const + { + std::vector result; + + auto current = game::scr_VarGlob->objectVariableChildren[this->id_].firstChild; + + while (current) + { + const auto var = game::scr_VarGlob->childVariableValue[current]; + + if (var.type == game::SCRIPT_NONE) + { + current = var.nextSibling; + continue; + } + + const auto string_value = static_cast(var.name_lo) + (var.k.keys.name_hi << 8); + const auto* str = game::SL_ConvertToString(string_value); + + script_value key; + if (string_value < 0x40000 && str) + { + key = str; + } + else + { + key = (string_value - 0x800000) & 0xFFFFFF; + } + + result.push_back(key); + + current = var.nextSibling; + } + + return result; + } + + std::uint32_t array::size() const + { + return game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, this->id_); + } + + std::uint32_t array::push_back(const script_value& value) const + { + this->set(this->size(), value); + return this->size(); + } + + void array::erase(const std::uint32_t index) const + { + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, (index - 0x800000) & 0xFFFFFF); + if (variable_id) + { + game::RemoveVariableValue(game::SCRIPTINSTANCE_SERVER, this->id_, variable_id); + } + } + + void array::erase(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + if (variable_id) + { + game::RemoveVariableValue(game::SCRIPTINSTANCE_SERVER, this->id_, variable_id); + } + } + + void array::erase(const script_value& key) const + { + if (key.is()) + { + return this->erase(key.as()); + } + + if (key.is()) + { + return this->erase(key.as()); + } + } + + void array::erase(const array_iterator& iter) const + { + this->erase(iter->first); + } + + script_value array::get(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return {}; + } + + const auto value = game::scr_VarGlob->childVariableValue[variable_id]; + game::VariableValue variable{}; + variable.u = value.u.u; + variable.type = static_cast(value.type); + + return variable; + } + + script_value array::get(const std::uint32_t index) const + { + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, (index - 0x800000) & 0xFFFFFF); + + if (!variable_id) + { + return {}; + } + + const auto value = game::scr_VarGlob->childVariableValue[variable_id]; + game::VariableValue variable{}; + variable.u = value.u.u; + variable.type = static_cast(value.type); + + return variable; + } + + script_value array::get(const script_value& key) const + { + if (key.is()) + { + return this->get(key.as()); + } + + if (key.is()) + { + return this->get(key.as()); + } + + throw std::runtime_error(std::format("invalid key type '{}'", key.type_name())); + } + + void array::set(const std::string& key, const script_value& value) const + { + const auto variable_id = this->get_value_id(key); + + if (!variable_id) + { + return; + } + + const auto& value_raw = value.get_raw(); + const auto variable = &game::scr_VarGlob->childVariableValue[variable_id]; + game::VariableValue variable_value{}; + variable_value.type = variable->type; + variable_value.u = variable->u.u; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_raw); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable_value.type, variable_value.u); + + variable->type = gsl::narrow_cast(value_raw.type); + variable->u.u = value_raw.u; + } + + void array::set(const std::uint32_t index, const script_value& value) const + { + const auto variable_id = this->get_value_id(index); + + if (!variable_id) + { + return; + } + + const auto& value_raw = value.get_raw(); + const auto variable = &game::scr_VarGlob->childVariableValue[variable_id]; + game::VariableValue variable_value{}; + variable_value.type = variable->type; + variable_value.u = variable->u.u; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_raw); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable_value.type, variable_value.u); + + variable->type = gsl::narrow_cast(value_raw.type); + variable->u.u = value_raw.u; + } + + void array::set(const script_value& key, const script_value& value) const + { + if (key.is()) + { + return this->set(key.as(), value); + } + + if (key.is()) + { + return this->set(key.as(), value); + } + + throw std::runtime_error(std::format("invalid key type '{}'", key.type_name())); + } + + std::uint32_t array::get_entity_id() const + { + return this->id_; + } + + std::uint32_t array::get_value_id(const std::string& key) const + { + const auto string_value = game::SL_GetString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return game::GetNewVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + } + + return variable_id; + } + + std::uint32_t array::get_value_id(const std::uint32_t index) const + { + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, (index - 0x800000) & 0xFFFFFF); + if (!variable_id) + { + return game::GetNewArrayVariable(game::SCRIPTINSTANCE_SERVER, this->id_, index); + } + + return variable_id; + } + + entity array::get_raw() const + { + return entity(this->id_); + } + + array_value array::operator[](const script_value& key) const + { + return array_value(this, key); + } + + array_iterator array::begin() const + { + const auto keys = this->get_keys(); + return array_iterator(this, keys, 0); + } + + array_iterator array::end() const + { + return array_iterator(this); + } + + array_iterator array::find(const script_value& key) const + { + const auto keys = this->get_keys(); + for (auto i = 0u; i < keys.size(); i++) + { + if (keys[i] == key) + { + return array_iterator(this, keys, i); + } + } + + return array_iterator(this); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.hpp new file mode 100644 index 0000000..3428aff --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/array.hpp @@ -0,0 +1,110 @@ +#pragma once + +#include "script_value.hpp" +#include "container_iterator.hpp" + +namespace scripting +{ + class array; + + class array_value : public script_value + { + public: + array_value(const array* array, const script_value& key); + void operator=(const script_value& value); + + template + T as() const + { + try + { + return script_value::as(); + } + catch (const std::exception& e) + { + throw std::runtime_error(std::format("array value '{}' {}", this->key_.to_string(), e.what())); + } + } + + private: + script_value key_; + const array* array_; + + }; + + template + class array_iterator_base : public IteratorType + { + public: + array_iterator_base(const array* container) + : IteratorType(container) + { + } + + array_iterator_base(const array* container, const std::vector& keys, const std::int64_t key_index) + : IteratorType(container, keys, key_index) + { + } + }; + + using array_iterator = array_iterator_base>; + + class array final + { + public: + array(); + array(const std::uint32_t id); + + array(const array& other); + array(array&& other) noexcept; + + ~array(); + + array& operator=(const array& other); + array& operator=(array&& other) noexcept; + + std::vector get_keys() const; + std::uint32_t size() const; + + std::uint32_t push_back(const script_value& value) const; + + template + void emplace_back(Args&&... args) + { + this->push_back(std::forward(args)...); + } + + void erase(const std::uint32_t index) const; + void erase(const std::string& key) const; + void erase(const script_value& key) const; + void erase(const array_iterator& iter) const; + + script_value get(const script_value&) const; + script_value get(const std::string&) const; + script_value get(const std::uint32_t) const; + + void set(const script_value&, const script_value&) const; + void set(const std::string&, const script_value&) const; + void set(const std::uint32_t, const script_value&) const; + + std::uint32_t get_entity_id() const; + + std::uint32_t get_value_id(const std::string&) const; + std::uint32_t get_value_id(std::uint32_t) const; + + entity get_raw() const; + + array_value operator[](const script_value& key) const; + + array_iterator begin() const; + array_iterator end() const; + array_iterator find(const script_value& key) const; + + private: + void add() const; + void release() const; + + std::uint32_t id_{}; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/container_iterator.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/container_iterator.hpp new file mode 100644 index 0000000..3278177 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/container_iterator.hpp @@ -0,0 +1,99 @@ +#pragma once + +#include "script_value.hpp" + +namespace scripting +{ + template + class container_iterator + { + public: + static constexpr std::int64_t container_iterator_end_key = -1; + + container_iterator(const ContainerType* container) + : container_(container) + , key_index_(container_iterator_end_key) + { + } + + container_iterator(const ContainerType* container, const std::vector& keys, const std::int64_t key_index) + : container_(container) + , keys_(keys) + , key_index_(key_index) + { + this->update_pair(); + } + + std::pair& operator*() + { + return this->pair_.value(); + } + + std::pair* operator->() + { + return &this->pair_.value(); + } + + const std::pair& operator*() const + { + return this->pair_.value(); + } + + const std::pair* operator->() const + { + return &this->pair_.value(); + } + + container_iterator& operator++() + { + if (this->key_index_ == container_iterator_end_key) + { + return *this; + } + + const auto size = this->keys_.size(); + if (this->key_index_ + 1 >= size) + { + this->key_index_ = container_iterator_end_key; + return *this; + } + + this->key_index_++; + this->update_pair(); + + return *this; + } + + container_iterator operator++(int) + { + const auto pre = *this; + this->operator++(); + return pre; + } + + friend bool operator==(const container_iterator& a, const container_iterator& b) + { + return a.container_ == b.container_ && a.key_index_ == b.key_index_; + }; + + friend bool operator!=(const container_iterator& a, const container_iterator& b) + { + return a.container_ != b.container_ || a.key_index_ != b.key_index_; + }; + + private: + void update_pair() + { + const auto index = static_cast(this->key_index_); + const auto& key = this->keys_[index]; + const auto value = this->container_->operator[](key); + this->pair_.emplace(std::make_pair(key, value)); + } + + const ContainerType* container_; + std::int64_t key_index_; + std::vector keys_; + std::optional> pair_; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.cpp new file mode 100644 index 0000000..c8edd81 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.cpp @@ -0,0 +1,123 @@ +#include +#include "entity.hpp" +#include "script_value.hpp" +#include "execution.hpp" + +namespace scripting +{ + entity::entity() + : entity(0) + { + } + + entity::entity(const entity& other) : entity(other.entity_id_) + { + } + + entity::entity(entity&& other) noexcept + { + this->entity_id_ = other.entity_id_; + other.entity_id_ = 0; + } + + entity::entity(const unsigned int entity_id) + : entity_id_(entity_id) + { + this->add(); + } + + entity::~entity() + { + this->release(); + } + + entity& entity::operator=(const entity& other) + { + if (&other != this) + { + this->release(); + this->entity_id_ = other.entity_id_; + this->add(); + } + + return *this; + } + + entity& entity::operator=(entity&& other) noexcept + { + if (&other != this) + { + this->release(); + this->entity_id_ = other.entity_id_; + other.entity_id_ = 0; + } + + return *this; + } + + unsigned int entity::get_entity_id() const + { + return this->entity_id_; + } + + game::scr_entref_t entity::get_entity_reference() const + { + if (!this->entity_id_) + { + const auto not_null = static_cast(~0ui16); + return game::scr_entref_t{not_null, not_null}; + } + + return game::Scr_GetEntityIdRef(this->get_entity_id()); + } + + bool entity::operator==(const entity& other) const noexcept + { + return this->get_entity_id() == other.get_entity_id(); + } + + bool entity::operator!=(const entity& other) const noexcept + { + return !this->operator==(other); + } + + void entity::add() const + { + if (this->entity_id_) + { + game::VariableValue value; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = this->entity_id_; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + } + } + + void entity::release() const + { + if (this->entity_id_) + { + game::VariableValue value; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = this->entity_id_; + + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + } + } + + void entity::set(const std::string& field, const script_value& value) const + { + set_entity_field(*this, field, value); + } + + template <> + script_value entity::get(const std::string& field) const + { + return get_entity_field(*this, field); + } + + script_value entity::call(const std::string& name, const std::vector& arguments) const + { + return call_function(name, *this, arguments); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.hpp new file mode 100644 index 0000000..76fd66c --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/entity.hpp @@ -0,0 +1,49 @@ +#pragma once +#include "game/game.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class entity final + { + public: + entity(); + entity(unsigned int entity_id); + + entity(const entity& other); + entity(entity&& other) noexcept; + + ~entity(); + + entity& operator=(const entity& other); + entity& operator=(entity&& other) noexcept; + + void set(const std::string& field, const script_value& value) const; + + template + T get(const std::string& field) const; + + script_value call(const std::string& name, const std::vector& arguments = {}) const; + + unsigned int get_entity_id() const; + game::scr_entref_t get_entity_reference() const; + + bool operator ==(const entity& other) const noexcept; + bool operator !=(const entity& other) const noexcept; + + private: + unsigned int entity_id_; + + void add() const; + void release() const; + }; + + template <> + script_value entity::get(const std::string& field) const; + + template + T entity::get(const std::string& field) const + { + return this->get(field).as(); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/event.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/event.hpp new file mode 100644 index 0000000..bc1d53e --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/event.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "script_value.hpp" +#include "entity.hpp" + +namespace scripting +{ + struct event + { + std::string name; + entity entity{}; + std::vector arguments; + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.cpp new file mode 100644 index 0000000..5476f68 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.cpp @@ -0,0 +1,210 @@ +#include +#include "execution.hpp" +#include "safe_execution.hpp" +#include "stack_isolation.hpp" + +#include "component/scripting.hpp" + +namespace scripting +{ + namespace + { + game::VariableValue* allocate_argument() + { + game::VariableValue* value_ptr = ++game::scr_VmPub->top; + ++game::scr_VmPub->inparamcount; + return value_ptr; + } + + script_value get_return_value() + { + if (game::scr_VmPub->inparamcount == 0) + { + return {}; + } + + game::Scr_ClearOutParams(game::SCRIPTINSTANCE_SERVER); + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + return script_value(game::scr_VmPub->top[1 - game::scr_VmPub->outparamcount]); + } + + int get_field_id(const int classnum, const std::string& field) + { + if (scripting::fields_table[classnum].find(field) != scripting::fields_table[classnum].end()) + { + return scripting::fields_table[classnum][field]; + } + + return -1; + } + } + + void push_value(const script_value& value) + { + auto* value_ptr = allocate_argument(); + *value_ptr = value.get_raw(); + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, value_ptr); + } + + void notify(const entity& entity, const std::string& event, const std::vector& arguments) + { + stack_isolation _; + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + const auto event_id = game::SL_GetString(event.data(), 0); + game::Scr_NotifyId(game::SCRIPTINSTANCE_SERVER, 0, entity.get_entity_id(), event_id, game::scr_VmPub->inparamcount); + } + + script_value call_function(const std::string& name, const entity& entity, + const std::vector& arguments) + { + const auto entref = entity.get_entity_reference(); + const auto function = find_function_ptr(name); + if (!function) + { + throw std::runtime_error("Unknown function '" + name + "'"); + } + + stack_isolation _; + + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + if (!safe_execution::call(function, entref)) + { + const auto error = reinterpret_cast(SELECT(0x2E27C70, 0x2DF7F70)); + throw std::runtime_error(error); + } + + return get_return_value(); + } + + script_value call_function(const std::string& name, const std::vector& arguments) + { + return call_function(name, entity(), arguments); + } + + template <> + script_value call(const std::string& name, const std::vector& arguments) + { + return call_function(name, arguments); + } + + script_value exec_ent_thread(const entity& entity, const char* pos, const std::vector& arguments) + { + const auto id = entity.get_entity_id(); + + stack_isolation _; + for (auto i = arguments.rbegin(); i != arguments.rend(); ++i) + { + push_value(*i); + } + + game::VariableValue value{}; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = id; + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + + const auto local_id = game::AllocThread(game::SCRIPTINSTANCE_SERVER, id); + const auto result = game::VM_Execute(game::SCRIPTINSTANCE_SERVER, local_id, pos, arguments.size()); + game::RemoveRefToObject(game::SCRIPTINSTANCE_SERVER, result); + + return get_return_value(); + } + + script_value get_custom_field(const entity& entity, const std::string& field) + { + const object object = entity.get_entity_id(); + return object.get(field); + } + + void set_custom_field(const entity& entity, const std::string& field, const script_value& value) + { + const object object = entity.get_entity_id(); + object.set(field, value); + } + + void set_entity_field(const entity& entity, const std::string& field, const script_value& value) + { + const auto entref = entity.get_entity_reference(); + const int id = get_field_id(entref.classnum, field); + + if (id != -1) + { + stack_isolation _; + push_value(value); + + game::scr_VmPub->outparamcount = game::scr_VmPub->inparamcount; + game::scr_VmPub->inparamcount = 0; + + if (!safe_execution::set_entity_field(entref, id)) + { + throw std::runtime_error("Failed to set value for field '" + field + "'"); + } + } + else + { + set_custom_field(entity, field, value); + } + } + + script_value get_entity_field(const entity& entity, const std::string& field) + { + const auto entref = entity.get_entity_reference(); + const auto id = get_field_id(entref.classnum, field); + + if (id != -1) + { + stack_isolation _; + + game::VariableValue value{}; + if (!safe_execution::get_entity_field(entref, id, &value)) + { + throw std::runtime_error("Failed to get value for field '" + field + "'"); + } + + const auto __ = gsl::finally([&value]() + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + }); + + return value; + } + else + { + return get_custom_field(entity, field); + } + } + + unsigned int make_array() + { + unsigned int index = 0; + const auto variable = game::AllocVariable(game::SCRIPTINSTANCE_SERVER, &index); + variable->w.type = game::SCRIPT_ARRAY; + variable->u.f.prev = 0; + variable->u.f.next = 0; + + return index; + } + + unsigned int make_object() + { + unsigned int index = 0; + const auto variable = game::AllocVariable(game::SCRIPTINSTANCE_SERVER, &index); + variable->w.type = game::SCRIPT_STRUCT; + variable->u.f.prev = 0; + + return index; + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.hpp new file mode 100644 index 0000000..a5f8bd5 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/execution.hpp @@ -0,0 +1,39 @@ +#pragma once +#include "game/game.hpp" +#include "entity.hpp" +#include "array.hpp" +#include "object.hpp" +#include "function.hpp" +#include "thread.hpp" +#include "script_value.hpp" + +namespace scripting +{ + void push_value(const script_value& value); + + script_value call_function(const std::string& name, const std::vector& arguments); + script_value call_function(const std::string& name, const entity& entity, + const std::vector& arguments); + + template + T call(const std::string& name, const std::vector& arguments = {}); + + template <> + script_value call(const std::string& name, const std::vector& arguments); + + template + T call(const std::string& name, const std::vector& arguments) + { + return call(name, arguments).as(); + } + + script_value exec_ent_thread(const entity& entity, const char* pos, const std::vector& arguments); + + void set_entity_field(const entity& entity, const std::string& field, const script_value& value); + script_value get_entity_field(const entity& entity, const std::string& field); + + void notify(const entity& entity, const std::string& event, const std::vector& arguments); + + unsigned int make_array(); + unsigned int make_object(); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.cpp new file mode 100644 index 0000000..d07f46a --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.cpp @@ -0,0 +1,41 @@ +#include +#include "function.hpp" +#include "execution.hpp" +#include "../../component/scripting.hpp" + +namespace scripting +{ + function::function(const char* pos) + : pos_(pos) + { + } + + script_value function::get_raw() const + { + game::VariableValue value; + value.type = game::SCRIPT_FUNCTION; + value.u.codePosValue = this->pos_; + + return value; + } + + const char* function::get_pos() const + { + return this->pos_; + } + + std::string function::get_name() const + { + return scripting::find_function(this->pos_); + } + + script_value function::call(const entity& self, std::vector arguments) const + { + if (this->pos_ == 0) + { + throw std::runtime_error("function pos not set"); + } + + return exec_ent_thread(self, this->pos_, arguments); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.hpp new file mode 100644 index 0000000..487d475 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/function.hpp @@ -0,0 +1,36 @@ +#pragma once +#include "entity.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class function + { + public: + function() = default; + function(const char*); + + script_value get_raw() const; + const char* get_pos() const; + std::string get_name() const; + + script_value call(const entity& self, std::vector arguments) const; + + script_value operator()(const entity& self, std::vector arguments) const + { + return this->call(self, arguments); + } + + script_value operator()(std::vector arguments) const + { + return this->call(*game::levelEntityId, arguments); + } + + script_value operator()() const + { + return this->call(*game::levelEntityId, {}); + } + private: + const char* pos_; + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.cpp new file mode 100644 index 0000000..8003f80 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.cpp @@ -0,0 +1,270 @@ +#include + +#include "object.hpp" +#include "execution.hpp" + +namespace scripting +{ + object_value::object_value(const object* object, const std::string& key) + : object_(object) + , key_(key) + { + const auto value = this->object_->get(key); + this->script_value::operator=(value); + } + + void object_value::operator=(const script_value& value) + { + this->object_->set(this->key_, value); + this->script_value::operator=(value); + } + + object::object(const std::uint32_t id) + : id_(id) + { + this->add(); + } + + object::object(const object& other) + { + this->operator=(other); + } + + object::object(object&& other) noexcept + { + this->id_ = other.id_; + other.id_ = 0; + } + + object::object() + { + this->id_ = make_object(); + } + + object::~object() + { + this->release(); + } + + object& object::operator=(const object& other) + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + this->add(); + } + + return *this; + } + + object& object::operator=(object&& other) noexcept + { + if (&other != this) + { + this->release(); + this->id_ = other.id_; + other.id_ = 0; + } + + return *this; + } + + void object::add() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value); + } + } + + void object::release() const + { + if (this->id_) + { + game::VariableValue value{}; + value.u.uintValue = this->id_; + value.type = game::SCRIPT_OBJECT; + + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, value.type, value.u); + } + } + + void object::iterate_keys(const std::function& callback) const + { + auto current = game::scr_VarGlob->objectVariableChildren[this->id_].firstChild; + + while (current) + { + const auto var = game::scr_VarGlob->childVariableValue[current]; + const auto string_id = static_cast(var.name_lo) + (var.k.keys.name_hi << 8); + + // pluto has this table relocated + static const auto max_string_id = *reinterpret_cast(SELECT(0x6927A1 + 2, 0x51A9A1 + 2)); + if (string_id < max_string_id) + { + static const auto address = *reinterpret_cast(SELECT(0x635D7E + 3, 0x5466C5 + 3)); + const auto string = reinterpret_cast(address)[string_id]; + if (string != nullptr && callback(string)) + { + return; + } + } + + current = var.nextSibling; + } + } + + std::vector object::get_keys() const + { + std::vector result; + iterate_keys([&](const std::string& key) + { + result.emplace_back(key); + return false; + }); + + return result; + } + + std::optional object::get_next_key(const std::string& current) const + { + auto is_next = false; + std::optional next; + + iterate_keys([&](const std::string& key) + { + if (is_next) + { + next.emplace(key); + return true; + } + + if (key == current) + { + is_next = true; + } + + return false; + }); + + return next; + } + + std::uint32_t object::size() const + { + return game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, this->id_); + } + + void object::erase(const std::string& key) const + { + const auto string_value = game::SL_GetCanonicalString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + if (variable_id) + { + game::RemoveVariableValue(game::SCRIPTINSTANCE_SERVER, this->id_, variable_id); + } + } + + void object::erase(const object_iterator& iter) const + { + this->erase(iter->first); + } + + script_value object::get(const std::string& key) const + { + const auto string_value = game::SL_GetCanonicalString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return {}; + } + + const auto value = game::scr_VarGlob->childVariableValue[variable_id]; + game::VariableValue variable{}; + variable.u = value.u.u; + variable.type = static_cast(value.type); + + return variable; + } + + void object::set(const std::string& key, const script_value& value) const + { + const auto& value_raw = value.get_raw(); + const auto variable_id = this->get_value_id(key); + + if (!variable_id) + { + return; + } + + const auto variable = &game::scr_VarGlob->childVariableValue[variable_id]; + game::VariableValue variable_{}; + variable_.type = variable->type; + variable_.u = variable->u.u; + + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &value_raw); + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable_.type, variable_.u); + + variable->type = gsl::narrow_cast(value_raw.type); + variable->u.u = value_raw.u; + } + + std::uint32_t object::get_entity_id() const + { + return this->id_; + } + + std::uint32_t object::get_value_id(const std::string& key) const + { + const auto string_value = game::SL_GetCanonicalString(key.data(), 0); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + + if (!variable_id) + { + return game::GetNewVariable(game::SCRIPTINSTANCE_SERVER, this->id_, string_value); + } + + return variable_id; + } + + entity object::get_raw() const + { + return entity(this->id_); + } + + object_value object::operator[](const std::string& key) const + { + return object_value(this, key); + } + + object_iterator object::begin() const + { + const auto keys = this->get_keys(); + return object_iterator(this, keys, 0); + } + + object_iterator object::end() const + { + return object_iterator(this); + } + + object_iterator object::find(const std::string& key) const + { + const auto keys = this->get_keys(); + for (auto i = 0u; i < keys.size(); i++) + { + if (keys[i] == key) + { + return object_iterator(this, keys, i); + } + } + + return object_iterator(this); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.hpp new file mode 100644 index 0000000..c695d18 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/object.hpp @@ -0,0 +1,95 @@ +#pragma once + +#include "script_value.hpp" +#include "container_iterator.hpp" + +namespace scripting +{ + class object; + + class object_value : public script_value + { + public: + object_value(const object* object, const std::string& key); + void operator=(const script_value& value); + + template + T as() const + { + try + { + return script_value::as(); + } + catch (const std::exception& e) + { + throw std::runtime_error(std::format("object field '{}' {}", this->key_, e.what())); + } + } + + private: + const object* object_; + std::string key_; + + }; + + template + class object_iterator_base : public IteratorType + { + public: + object_iterator_base(const object* container) + : IteratorType(container) + { + } + + object_iterator_base(const object* container, const std::vector& keys, const std::int64_t key_index) + : IteratorType(container, keys, key_index) + { + } + }; + + using object_iterator = object_iterator_base>; + + class object final + { + public: + object(); + object(const std::uint32_t id); + + object(const object& other); + object(object&& other) noexcept; + + ~object(); + + object& operator=(const object& other); + object& operator=(object&& other) noexcept; + + void iterate_keys(const std::function& callback) const; + std::vector get_keys() const; + std::optional get_next_key(const std::string& current) const; + + std::uint32_t size() const; + void erase(const std::string& key) const; + void erase(const object_iterator& iter) const; + + script_value get(const std::string&) const; + void set(const std::string&, const script_value&) const; + + std::uint32_t get_entity_id() const; + std::uint32_t get_value_id(const std::string&) const; + + entity get_raw() const; + + object_value operator[](const std::string& key) const; + + object_iterator begin() const; + object_iterator end() const; + object_iterator find(const std::string& key) const; + + private: + void add() const; + void release() const; + + std::uint32_t id_{}; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.cpp new file mode 100644 index 0000000..8dfe4bd --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.cpp @@ -0,0 +1,67 @@ +#include +#include "safe_execution.hpp" + +#pragma warning(push) +#pragma warning(disable: 4611) + +namespace scripting::safe_execution +{ + bool execute_with_seh(const script_function function, const game::scr_entref_t& entref) + { + __try + { + function(entref); + return true; + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + return false; + } + } + + bool call(const script_function function, const game::scr_entref_t& entref) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0, 0, 0)) + { + *game::g_script_error_level -= 1; + return false; + } + + const auto result = execute_with_seh(function, entref); + *game::g_script_error_level -= 1; + return result; + } + + bool set_entity_field(const game::scr_entref_t& entref, const int offset) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0, 0, 0)) + { + *game::g_script_error_level -= 1; + return false; + } + + game::Scr_SetObjectField(entref.classnum, entref.entnum, offset); + + *game::g_script_error_level -= 1; + return true; + } + + bool get_entity_field(const game::scr_entref_t& entref, const int offset, game::VariableValue* value) + { + *game::g_script_error_level += 1; + if (game::_setjmp(&game::g_script_error[*game::g_script_error_level], 0, 0, 0)) + { + value->type = game::SCRIPT_NONE; + value->u.intValue = 0; + *game::g_script_error_level -= 1; + return false; + } + + *value = game::GetEntityFieldValue(game::SCRIPTINSTANCE_SERVER, entref.classnum, entref.entnum, 0, offset); + + *game::g_script_error_level -= 1; + return true; + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.hpp new file mode 100644 index 0000000..7091973 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/safe_execution.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting::safe_execution +{ + using script_function = void(*)(game::scr_entref_t); + + bool execute_with_seh(const script_function function, const game::scr_entref_t& entref); + + bool call(script_function function, const game::scr_entref_t& entref); + + bool set_entity_field(const game::scr_entref_t& entref, int offset); + bool get_entity_field(const game::scr_entref_t& entref, int offset, game::VariableValue* value); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.cpp new file mode 100644 index 0000000..2364d73 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.cpp @@ -0,0 +1,478 @@ +#include +#include "script_value.hpp" +#include "entity.hpp" +#include "array.hpp" +#include "function.hpp" +#include "object.hpp" + +namespace scripting +{ + /*********************************************** + * Constructors + **********************************************/ + + script_value::script_value(const game::VariableValue& value) + : value_(value) + { + } + + script_value::script_value(void* value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.intValue = reinterpret_cast(value); + + this->value_ = variable; + } + + script_value::script_value(const int value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.intValue = value; + + this->value_ = variable; + } + + script_value::script_value(const unsigned int value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_INTEGER; + variable.u.uintValue = value; + + this->value_ = variable; + } + + script_value::script_value(const bool value) + : script_value(static_cast(value)) + { + } + + script_value::script_value(const float value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_FLOAT; + variable.u.floatValue = value; + + this->value_ = variable; + } + + script_value::script_value(const double value) + : script_value(static_cast(value)) + { + } + + script_value::script_value(const char* value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_STRING; + variable.u.stringValue = game::SL_GetString(value, 0); + + const auto _ = gsl::finally([&variable]() + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable.type, variable.u); + }); + + this->value_ = variable; + } + + script_value::script_value(const std::string& value) + : script_value(value.data()) + { + } + + script_value::script_value(const entity& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const array& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const object& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_OBJECT; + variable.u.pointerValue = value.get_entity_id(); + + this->value_ = variable; + } + + script_value::script_value(const function& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_FUNCTION; + variable.u.codePosValue = value.get_pos(); + + this->value_ = variable; + } + + script_value::script_value(const vector& value) + { + game::VariableValue variable{}; + variable.type = game::SCRIPT_VECTOR; + variable.u.vectorValue = game::Scr_AllocVector(game::SCRIPTINSTANCE_SERVER, value); + + const auto _ = gsl::finally([&variable]() + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, variable.type, variable.u); + }); + + this->value_ = variable; + } + + /*********************************************** + * Integer + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_INTEGER; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + int script_value::get() const + { + return this->get_raw().u.intValue; + } + + template <> + unsigned int script_value::get() const + { + return this->get_raw().u.uintValue; + } + + template <> + bool script_value::get() const + { + return this->get_raw().u.uintValue != 0; + } + + template <> + unsigned short script_value::get() const + { + return static_cast(this->get_raw().u.uintValue); + } + + template <> + short script_value::get() const + { + return static_cast(this->get_raw().u.intValue); + } + + template <> + char script_value::get() const + { + return static_cast(this->get_raw().u.intValue); + } + + /*********************************************** + * Float + **********************************************/ + + template <> + bool script_value::is() const + { + const auto type = this->get_raw().type; + return type == game::SCRIPT_FLOAT || type == game::SCRIPT_INTEGER; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + float script_value::get() const + { + const auto type = this->get_raw().type; + if (type == game::SCRIPT_INTEGER) + { + return static_cast(this->get_raw().u.intValue); + } + + return this->get_raw().u.floatValue; + } + + template <> + double script_value::get() const + { + const auto type = this->get_raw().type; + if (type == game::SCRIPT_INTEGER) + { + return static_cast(this->get_raw().u.intValue); + } + + return static_cast(this->get_raw().u.floatValue); + } + + /*********************************************** + * String + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_STRING + || this->get_raw().type == game::SCRIPT_ISTRING; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + const char* script_value::get() const + { + return game::SL_ConvertToString(static_cast(this->get_raw().u.stringValue)); + } + + template <> + std::string script_value::get() const + { + return this->get(); + } + + /*********************************************** + * Entity + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_OBJECT; + } + + template <> + entity script_value::get() const + { + return entity(this->get_raw().u.pointerValue); + } + + /*********************************************** + * Array + **********************************************/ + + template <> + bool script_value::is() const + { + if (this->get_raw().type != game::SCRIPT_OBJECT) + { + return false; + } + + const auto id = this->get_raw().u.uintValue; + const auto type = game::scr_VarGlob->objectVariableValue[id].w.type & 0x7F; + + return type == game::SCRIPT_ARRAY; + } + + template <> + array script_value::get() const + { + return array(this->get_raw().u.uintValue); + } + + /*********************************************** + * Struct + **********************************************/ + + template <> + bool script_value::is() const + { + if (this->get_raw().type != game::SCRIPT_OBJECT) + { + return false; + } + + const auto id = this->get_raw().u.uintValue; + const auto type = game::scr_VarGlob->objectVariableValue[id].w.type & 0x7F; + + return type == game::SCRIPT_STRUCT || type == game::SCRIPT_ENTITY; + } + + template <> + object script_value::get() const + { + return object(this->get_raw().u.uintValue); + } + + /*********************************************** + * Function + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_FUNCTION; + } + + template <> + function script_value::get() const + { + return function(this->get_raw().u.codePosValue); + } + + + /*********************************************** + * Vector + **********************************************/ + + template <> + bool script_value::is() const + { + return this->get_raw().type == game::SCRIPT_VECTOR; + } + + template <> + bool script_value::is() const + { + return this->is(); + } + + template <> + vector script_value::get() const + { + return this->get_raw().u.vectorValue; + } + + /*********************************************** + * + **********************************************/ + + const game::VariableValue& script_value::get_raw() const + { + return this->value_.get(); + } + + std::string script_value::to_string() const + { + if (this->is()) + { + return utils::string::va("%i", this->as()); + } + + if (this->is()) + { + return utils::string::va("%f", this->as()); + } + + if (this->is()) + { + return this->as(); + } + + if (this->is()) + { + const auto vec = this->as(); + return utils::string::va("(%g, %g, %g)", + vec.get_x(), + vec.get_y(), + vec.get_z() + ); + } + + if (this->is()) + { + const auto func = this->as(); + const auto& name = func.get_name(); + return utils::string::va("[[ %s ]]", name.data()); + } + + return this->type_name(); + } + + function_argument::function_argument(const arguments& args, const script_value& value, const size_t index, const bool exists) + : script_value(value) + , values_(args) + , index_(index) + , exists_(exists) + { + + } + + function_arguments::function_arguments(const arguments& values) + : values_(values) + { + } + + variadic_args::variadic_args(const size_t begin) + : std::vector({}) + , begin_(begin) + { + } + + function_argument variadic_args::operator[](size_t index) const + { + if (index >= this->size()) + { + throw std::runtime_error(utils::string::va("parameter %d does not exist", this->begin_ + index)); + } + + return std::vector::operator[](index); + } + + function_argument function_arguments::operator[](const size_t index) const + { + if (index >= values_.size()) + { + return {values_, {}, index, false}; + } + + return {values_, values_[index], index, true}; + } + + arguments function_arguments::get_raw() const + { + return this->values_; + } + + size_t function_arguments::size() const + { + return this->values_.size(); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.hpp new file mode 100644 index 0000000..93719d8 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/script_value.hpp @@ -0,0 +1,393 @@ +#pragma once +#include "game/game.hpp" +#include "variable_value.hpp" +#include "vector.hpp" + +#include + +namespace scripting +{ + class entity; + class array; + class object; + class function; + class script_value; + + namespace + { + std::unordered_map typenames = + { + {0, "undefined"}, + {1, "object"}, + {2, "string"}, + {3, "localized string"}, + {4, "vector"}, + {5, "hash"}, + {6, "float"}, + {7, "int"}, + {8, "codepos"}, + {9, "precodepos"}, + {10, "function"}, + {11, "stack"}, + {12, "animation"}, + {13, "developer codepos"}, + {14, "thread"}, + {15, "thread"}, + {16, "thread"}, + {17, "thread"}, + {18, "struct"}, + {19, "removed entity"}, + {20, "entity"}, + {21, "array"}, + {22, "removed thread"}, + {23, ""}, + {24, "thread list"}, + {25, "ent list"}, + }; + + std::string get_typename(const game::VariableValue& value) + { + if (value.type == game::SCRIPT_OBJECT) + { + const auto type = game::scr_VarGlob->objectVariableValue[value.u.uintValue].w.type & 0x7F; + return typenames[type]; + } + else + { + return typenames[value.type]; + } + } + + template + std::string get_c_typename() + { + auto& info = typeid(T); + + if (info == typeid(std::string)) + { + return "string"; + } + + if (info == typeid(const char*)) + { + return "string"; + } + + if (info == typeid(entity)) + { + return "entity"; + } + + if (info == typeid(array)) + { + return "array"; + } + + if (info == typeid(object)) + { + return "struct"; + } + + if (info == typeid(function)) + { + return "function"; + } + + if (info == typeid(vector)) + { + return "vector"; + } + + return info.name(); + } + } + + using arguments = std::vector; + + class script_value + { + public: + script_value() = default; + script_value(const game::VariableValue& value); + + script_value(void* value); + + script_value(int value); + script_value(unsigned int value); + script_value(bool value); + + script_value(float value); + script_value(double value); + + script_value(const char* value); + script_value(const std::string& value); + + script_value(const entity& value); + script_value(const array& value); + script_value(const object& value); + + script_value(const function& value); + + script_value(const vector& value); + + private: + template + T get() const + { + if constexpr (std::is_pointer::value) + { + if (this->is()) + { + return reinterpret_cast(this->as()); + } + } + + if constexpr (std::is_constructible::value) + { + if (this->is()) + { + return T(this->as()); + } + } + + throw std::runtime_error("Invalid type"); + } + public: + +#define ADD_TYPE(type) \ + template <> \ + bool is() const; \ +private: \ + template <> \ + type get<>() const; \ +public: \ + + template + bool is() const + { + if (std::is_pointer::value && this->is()) + { + return true; + } + + if (std::is_constructible::value && this->is()) + { + return true; + } + + return false; + } + + ADD_TYPE(bool) + ADD_TYPE(int) + ADD_TYPE(unsigned int) + ADD_TYPE(unsigned short) + ADD_TYPE(float) + ADD_TYPE(float*) + ADD_TYPE(double) + ADD_TYPE(const char*) + ADD_TYPE(std::string) + + ADD_TYPE(vector) + ADD_TYPE(array) + ADD_TYPE(object) + ADD_TYPE(function) + ADD_TYPE(entity) + ADD_TYPE(script_value) + + template + T as() const + { + if (!this->is()) + { + const auto type = get_typename(this->get_raw()); + const auto c_type = get_c_typename(); + throw std::runtime_error(utils::string::va("has type '%s' but should be '%s'", type.data(), c_type.data())); + } + + return get(); + } + + template + T as_or(const T& default_value) const + { + if (!this->is()) + { + return default_value; + } + + return get(); + } + + std::string type_name() const + { + return get_typename(this->get_raw()); + } + + template class C, class T, typename ArrayType = array> + script_value(const C>& container) + { + ArrayType array_{}; + + for (const auto& value : container) + { + array_.emplace_back(value); + } + + game::VariableValue value{}; + value.type = game::SCRIPT_OBJECT; + value.u.pointerValue = array_.get_entity_id(); + + this->value_ = value; + } + + template + arguments operator()(T... arguments) const + { + return this->as().call({arguments...}); + } + + std::string to_string() const; + + friend bool operator==(const script_value& a, const script_value& b) + { + const auto& value_raw_a = a.get_raw(); + const auto& value_raw_b = b.get_raw(); + + return value_raw_a.type != value_raw_b.type && value_raw_a.u.uintValue == value_raw_b.u.uintValue; + } + + const game::VariableValue& get_raw() const; + + variable_value value_{}; + + }; + + class function_argument; + + class variadic_args : public std::vector + { + public: + variadic_args(const size_t begin); + + function_argument operator[](size_t index) const; + private: + size_t begin_; + }; + + class function_argument : public script_value + { + public: + function_argument(const arguments& args, const script_value& value, const size_t index, const bool exists); + + template + T as() const + { + if (!this->exists_) + { + throw std::runtime_error(utils::string::va("parameter %d does not exist", this->index_)); + } + + try + { + return script_value::as(); + } + catch (const std::exception& e) + { + throw std::runtime_error(utils::string::va("parameter %d %s", + this->index_, e.what())); + } + } + + template + T* as_ptr() const + { + const auto value = script_value::as(); + + if (value == nullptr) + { + throw std::runtime_error("is null"); + } + + return reinterpret_cast(value); + } + + template <> + variadic_args as() const + { + variadic_args args{this->index_}; + + for (auto i = this->index_; i < this->values_.size(); i++) + { + args.emplace_back(this->values_, this->values_[i], i, true); + } + + return args; + } + + operator variadic_args() const + { + return this->as(); + } + + template class C, class T, class ArrayType = array> + operator C>() const + { + const auto container_type = get_c_typename>>(); + if (!script_value::is()) + { + const auto type = get_typename(this->get_raw()); + + throw std::runtime_error(utils::string::va("has type '%s' but should be '%s'", + type.data(), + container_type.data() + )); + } + + C> container{}; + const auto array = script_value::as(); + for (auto i = 0u; i < array.size(); i++) + { + try + { + container.emplace_back(array.get(i).as()); + } + catch (const std::exception& e) + { + throw std::runtime_error(utils::string::va("element %d of parameter %d of type '%s' %s", + i, this->index_, container_type.data(), e.what())); + } + } + + return container; + } + + template + operator T() const + { + return this->as(); + } + + private: + arguments values_{}; + size_t index_{}; + bool exists_{}; + + }; + + class function_arguments + { + public: + function_arguments(const arguments& values); + + function_argument operator[](const size_t index) const; + + arguments get_raw() const; + + size_t size() const; + + private: + arguments values_{}; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.cpp new file mode 100644 index 0000000..ee72c5c --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.cpp @@ -0,0 +1,27 @@ +#include +#include "stack_isolation.hpp" + +namespace scripting +{ + stack_isolation::stack_isolation() + { + this->in_param_count_ = game::scr_VmPub->inparamcount; + this->out_param_count_ = game::scr_VmPub->outparamcount; + this->top_ = game::scr_VmPub->top; + this->max_stack_ = game::scr_VmPub->maxstack; + + game::scr_VmPub->top = this->stack_; + game::scr_VmPub->maxstack = &this->stack_[ARRAYSIZE(this->stack_) - 1]; + game::scr_VmPub->inparamcount = 0; + game::scr_VmPub->outparamcount = 0; + } + + stack_isolation::~stack_isolation() + { + game::Scr_ClearOutParams(game::SCRIPTINSTANCE_SERVER); + game::scr_VmPub->inparamcount = this->in_param_count_; + game::scr_VmPub->outparamcount = this->out_param_count_; + game::scr_VmPub->top = this->top_; + game::scr_VmPub->maxstack = this->max_stack_; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.hpp new file mode 100644 index 0000000..8dffd4b --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/stack_isolation.hpp @@ -0,0 +1,25 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class stack_isolation final + { + public: + stack_isolation(); + ~stack_isolation(); + + stack_isolation(stack_isolation&&) = delete; + stack_isolation(const stack_isolation&) = delete; + stack_isolation& operator=(stack_isolation&&) = delete; + stack_isolation& operator=(const stack_isolation&) = delete; + + private: + game::VariableValue stack_[512]{}; + + game::VariableValue* max_stack_; + game::VariableValue* top_; + unsigned int in_param_count_; + unsigned int out_param_count_; + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.cpp new file mode 100644 index 0000000..27d8327 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.cpp @@ -0,0 +1,141 @@ +#include +#include "thread.hpp" +#include "execution.hpp" +#include "../../component/scripting.hpp" + +namespace scripting +{ + thread::thread(unsigned int id) + : id_(id) + , type_(game::scr_VarGlob->objectVariableValue[id].w.type & 0x7F) + { + } + + script_value thread::get_raw() const + { + game::VariableValue value; + value.type = game::SCRIPT_OBJECT; + value.u.uintValue = this->id_; + + return value; + } + + unsigned int thread::get_entity_id() const + { + return this->id_; + } + + unsigned int thread::get_type() const + { + return this->type_; + } + + unsigned int thread::get_wait_time() const + { + return game::scr_VarGlob->objectVariableValue[this->id_].w.waitTime >> 8; + } + + unsigned int thread::get_notify_name_id() const + { + return game::scr_VarGlob->objectVariableValue[this->id_].w.notifyName >> 8; + } + + unsigned int thread::get_self() const + { + return game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, this->id_); + } + + std::string thread::get_notify_name() const + { + return game::SL_ConvertToString(this->get_notify_name_id()); + } + + const char* thread::get_pos() const + { + const auto start_local_id = game::GetStartLocalId(game::SCRIPTINSTANCE_SERVER, this->id_); + + if (this->type_ == game::SCRIPT_THREAD) + { + for (auto frame = game::scr_VmPub->function_frame; frame != game::scr_VmPub->function_frame_start; --frame) + { + if (frame->fs.localId == this->id_) + { + return frame->fs.pos; + } + } + } + + unsigned int stack_id = 0; + + if (this->type_ == game::SCRIPT_TIME_THREAD) + { + const auto waittime = this->get_wait_time(); + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, game::scr_VarPub->timeArrayId, waittime); + const auto object_id = game::scr_VarGlob->childVariableValue[variable_id].u.f.prev; + + stack_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, object_id, start_local_id + 0x10000); + } + + if (this->type_ == game::SCRIPT_NOTIFY_THREAD) + { + const auto notify_name = this->get_notify_name_id(); + + if (!notify_name) + { + stack_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, start_local_id, 0x16001); + } + else + { + const auto self = game::Scr_GetSelf(game::SCRIPTINSTANCE_SERVER, start_local_id); + + const auto variable_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, game::scr_VarPub->pauseArrayId, self + 0x10000); + const auto object_id = game::scr_VarGlob->childVariableValue[variable_id].u.f.prev; + + const auto variable_id2 = game::FindVariable(game::SCRIPTINSTANCE_SERVER, object_id, start_local_id + 0x10000); + const auto variable = &game::scr_VarGlob->childVariableValue[variable_id2]; + + const auto variable_id3 = game::FindVariable(game::SCRIPTINSTANCE_SERVER, variable->u.u.uintValue, 0x18000); + const auto object_id2 = game::scr_VarGlob->childVariableValue[variable_id3].u.f.prev; + + const auto variable_id4 = game::FindVariable(game::SCRIPTINSTANCE_SERVER, object_id2, notify_name); + const auto object_id3 = game::scr_VarGlob->childVariableValue[variable_id4].u.f.prev; + + stack_id = game::FindVariable(game::SCRIPTINSTANCE_SERVER, object_id3, start_local_id + 0x10000); + } + } + + const auto stack = &game::scr_VarGlob->childVariableValue[stack_id]; + if (stack && stack->type == 11) + { + return stack->u.u.stackValue->pos; + } + + return 0; + } + + const char* thread::get_start_pos() const + { + const auto current = this->get_pos(); + return scripting::find_function_start(current); + } + + void thread::kill() const + { + const auto start_local_id = game::GetStartLocalId(game::SCRIPTINSTANCE_SERVER, this->id_); + + if (this->type_ == game::SCRIPT_THREAD) + { + game::Scr_TerminateRunningThread(game::SCRIPTINSTANCE_SERVER, this->id_); + } + + if (this->type_ == game::SCRIPT_TIME_THREAD) + { + game::Scr_TerminateWaitThread(game::SCRIPTINSTANCE_SERVER, this->id_, start_local_id); + } + + if (this->type_ == game::SCRIPT_NOTIFY_THREAD) + { + game::Scr_TerminateWaittillThread(game::SCRIPTINSTANCE_SERVER, this->id_, start_local_id); + } + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.hpp new file mode 100644 index 0000000..29d8476 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/thread.hpp @@ -0,0 +1,32 @@ +#pragma once +#include "entity.hpp" +#include "script_value.hpp" + +namespace scripting +{ + class thread + { + public: + thread(unsigned int); + + script_value get_raw() const; + + unsigned int get_entity_id() const; + unsigned int get_type() const; + + unsigned int get_self() const; + unsigned int get_wait_time() const; + unsigned int get_notify_name_id() const; + std::string get_notify_name() const; + + const char* get_pos() const; + const char* get_start_pos() const; + + void kill() const; + + private: + unsigned int id_{}; + unsigned int type_{}; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.cpp new file mode 100644 index 0000000..cdd5e9b --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.cpp @@ -0,0 +1,68 @@ +#include +#include "variable_value.hpp" + +namespace scripting +{ + variable_value::variable_value(const game::VariableValue& value) + { + this->assign(value); + } + + variable_value::variable_value(const variable_value& other) noexcept + { + this->operator=(other); + } + + variable_value::variable_value(variable_value&& other) noexcept + { + this->operator=(std::move(other)); + } + + variable_value& variable_value::operator=(const variable_value& other) noexcept + { + if (this != &other) + { + this->release(); + this->assign(other.value_); + } + + return *this; + } + + variable_value& variable_value::operator=(variable_value&& other) noexcept + { + if (this != &other) + { + this->release(); + this->value_ = other.value_; + other.value_.type = game::SCRIPT_NONE; + } + + return *this; + } + + variable_value::~variable_value() + { + this->release(); + } + + const game::VariableValue& variable_value::get() const + { + return this->value_; + } + + void variable_value::assign(const game::VariableValue& value) + { + this->value_ = value; + game::AddRefToValue(game::SCRIPTINSTANCE_SERVER, &this->value_); + } + + void variable_value::release() + { + if (this->value_.type != game::SCRIPT_NONE) + { + game::RemoveRefToValue(game::SCRIPTINSTANCE_SERVER, this->value_.type, this->value_.u); + this->value_.type = game::SCRIPT_NONE; + } + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.hpp new file mode 100644 index 0000000..7a96261 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/variable_value.hpp @@ -0,0 +1,27 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class variable_value + { + public: + variable_value() = default; + variable_value(const game::VariableValue& value); + variable_value(const variable_value& other) noexcept; + variable_value(variable_value&& other) noexcept; + + variable_value& operator=(const variable_value& other) noexcept; + variable_value& operator=(variable_value&& other) noexcept; + + ~variable_value(); + + const game::VariableValue& get() const; + + private: + void assign(const game::VariableValue& value); + void release(); + + game::VariableValue value_{{0}, game::SCRIPT_NONE}; + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.cpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.cpp new file mode 100644 index 0000000..143e29a --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.cpp @@ -0,0 +1,85 @@ +#include +#include "vector.hpp" + +namespace scripting +{ + vector::vector(const float* value) + { + for (auto i = 0; i < 3; ++i) + { + this->value_[i] = value[i]; + } + } + + vector::vector(const game::vec3_t& value) + : vector(&value[0]) + { + } + + vector::vector(const float x, const float y, const float z) + { + this->value_[0] = x; + this->value_[1] = y; + this->value_[2] = z; + } + + vector::operator game::vec3_t& () + { + return this->value_; + } + + vector::operator const game::vec3_t& () const + { + return this->value_; + } + + game::vec_t& vector::operator[](const size_t i) + { + if (i >= 3) + { + throw std::runtime_error("Out of bounds."); + } + + return this->value_[i]; + } + + const game::vec_t& vector::operator[](const size_t i) const + { + if (i >= 3) + { + throw std::runtime_error("Out of bounds."); + } + + return this->value_[i]; + } + + float vector::get_x() const + { + return this->operator[](0); + } + + float vector::get_y() const + { + return this->operator[](1); + } + + float vector::get_z() const + { + return this->operator[](2); + } + + void vector::set_x(const float value) + { + this->operator[](0) = value; + } + + void vector::set_y(const float value) + { + this->operator[](1) = value; + } + + void vector::set_z(const float value) + { + this->operator[](2) = value; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.hpp new file mode 100644 index 0000000..0bb1595 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/scripting/vector.hpp @@ -0,0 +1,31 @@ +#pragma once +#include "game/game.hpp" + +namespace scripting +{ + class vector final + { + public: + vector() = default; + vector(const float* value); + vector(const game::vec3_t& value); + vector(float x, float y, float z); + + operator game::vec3_t& (); + operator const game::vec3_t& () const; + + game::vec_t& operator[](size_t i); + const game::vec_t& operator[](size_t i) const; + + float get_x() const; + float get_y() const; + float get_z() const; + + void set_x(float value); + void set_y(float value); + void set_z(float value); + + private: + game::vec3_t value_{ 0 }; + }; +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/structs.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/structs.hpp new file mode 100644 index 0000000..1cae888 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/structs.hpp @@ -0,0 +1,1540 @@ +#pragma once + +namespace game +{ + typedef float vec_t; + typedef vec_t vec2_t[2]; + typedef vec_t vec3_t[3]; + typedef vec_t vec4_t[4]; + + enum scriptInstance_t + { + SCRIPTINSTANCE_SERVER, + SCRIPTINSTANCE_CLIENT, + }; + + struct scr_entref_t + { + unsigned short entnum; + unsigned short classnum; + int client; + }; + + struct BuiltinMethodDef + { + const char* actionString; + unsigned int constId; + int min_args; + int max_args; + void(__cdecl* actionFunc)(scr_entref_t); + int type; + }; + + struct BuiltinFunctionDef + { + const char* actionString; + unsigned int constId; + int min_args; + int max_args; + void(__cdecl* actionFunc)(); + int type; + }; + + enum scriptType_e + { + SCRIPT_NONE = 0, + SCRIPT_OBJECT = 1, + SCRIPT_STRING = 2, + SCRIPT_ISTRING = 3, + SCRIPT_VECTOR = 4, + SCRIPT_FLOAT = 6, + SCRIPT_INTEGER = 7, + SCRIPT_CODEPOS = 8, + SCRIPT_END = 9, + SCRIPT_FUNCTION = 10, + SCRIPT_THREAD = 0xE, + SCRIPT_NOTIFY_THREAD = 0xF, + SCRIPT_TIME_THREAD = 0x10, + SCRIPT_STRUCT = 18, + SCRIPT_ENTITY = 20, + SCRIPT_ARRAY = 21, + SCRIPT_FREE = 0x17, + }; + + struct VariableStackBuffer + { + const char* pos; + unsigned __int16 size; + unsigned __int16 bufLen; + unsigned __int16 localId; + char time; + char buf[1]; + }; + + union VariableUnion + { + int intValue; + unsigned int uintValue; + float floatValue; + unsigned int stringValue; + const float* vectorValue; + const char* codePosValue; + unsigned int pointerValue; + VariableStackBuffer* stackValue; + unsigned int entityOffset; + }; + + struct VariableValue + { + int type; + VariableUnion u; + }; + + struct function_stack_t + { + char* pos; + VariableValue* top; + unsigned int localId; + unsigned int localVarCount; + VariableValue* startTop; + }; + + struct function_frame_t + { + function_stack_t fs; + }; + + struct scrVmPub_t + { + unsigned int* localVars; + VariableValue* maxstack; + int function_count; + function_frame_t* function_frame; + VariableValue* top; + bool abort_on_error; + bool terminal_error; + bool block_execution; + unsigned int inparamcount; + unsigned int outparamcount; + function_frame_t function_frame_start[32]; + VariableValue stack[2048]; + void(__cdecl* notifyListeners[1])(unsigned int, unsigned int); + }; + + struct scrVarPub_t + { + const char* fieldBuffer; + bool developer; + bool developer_script; + bool evaluate; + const char* error_message; + int error_index; + unsigned int time; + unsigned int timeArrayId; + unsigned int pauseArrayId; + unsigned int levelId; + unsigned int gameId; + unsigned int animId; + unsigned int freeEntList; + unsigned int tempVariable; + bool bInited; + unsigned __int16 savecount; + unsigned int checksum; + unsigned int entId; + unsigned int entFieldName; + void* programHunkUser; + char* programBuffer; + char* endScriptBuffer; + unsigned __int16* saveIdMap; + unsigned __int16* saveIdMapRev; + unsigned int numScriptThreads; + unsigned int numScriptValues; + unsigned int numScriptObjects; + char* varUsagePos; + int ext_threadcount; + int totalObjectRefCount; + volatile int totalVectorRefCount; + int allocationCount; + }; + + struct ObjectVariableChildren + { + unsigned int firstChild; + unsigned int lastChild; + }; + + struct ObjectVariableValue_u_f + { + unsigned __int16 prev; + unsigned __int16 next; + }; + + union ObjectVariableValue_u_o_u + { + unsigned __int16 size; + unsigned __int16 entnum; + unsigned __int16 nextEntId; + unsigned __int16 self; + }; + + struct ObjectVariableValue_u_o + { + unsigned __int16 refCount; + ObjectVariableValue_u_o_u u; + }; + + union ObjectVariableValue_w + { + unsigned int type; + unsigned int classnum; + unsigned int notifyName; + unsigned int waitTime; + unsigned int parentLocalId; + }; + + struct ChildVariableValue_u_f + { + unsigned __int16 prev; + unsigned __int16 next; + }; + + union ChildVariableValue_u + { + ChildVariableValue_u_f f; + VariableUnion u; + }; + + struct ChildBucketMatchKeys_keys + { + unsigned __int16 name_hi; + unsigned __int16 parentId; + }; + + union ChildBucketMatchKeys + { + ChildBucketMatchKeys_keys keys; + unsigned int match; + }; + + struct ChildVariableValue + { + ChildVariableValue_u u; + unsigned int next; + char pad[4]; + char type; + char name_lo; + char _pad[2]; + ChildBucketMatchKeys k; + unsigned int nextSibling; + unsigned int prevSibling; + }; + + union ObjectVariableValue_u + { + ObjectVariableValue_u_f f; + ObjectVariableValue_u_o o; + }; + + struct ObjectVariableValue + { + ObjectVariableValue_u u; + ObjectVariableValue_w w; + }; + + struct scrVarGlob_t + { + ObjectVariableValue* objectVariableValue; + char __pad0[0x7C]; + ObjectVariableChildren* objectVariableChildren; + char __pad1[0x7C]; + unsigned __int16* childVariableBucket; + char __pad2[0x7C]; + ChildVariableValue* childVariableValue; + }; + + struct scr_classStruct_t + { + unsigned __int16 id; + unsigned __int16 entArrayId; + char charId; + const char* name; + }; + + enum gclientFlag + { + NOCLIP = 1 << 0, + UFO = 1 << 1, + }; + + enum entityFlag + { + FL_GODMODE = 1 << 0, + FL_DEMI_GODMODE = 1 << 1, + FL_NOTARGET = 1 << 2, + FL_SUPPORTS_LINKTO = 1 << 12, + }; // TODO: Finish + + struct gclient_s + { + char __pad0[0x18]; + int eflags; + char __pad1[0x5668]; + int flags; + }; + + struct EntHandle + { + unsigned __int16 number; + unsigned __int16 infoIndex; + }; + + /* 2885 */ + struct SentientHandle + { + unsigned __int16 number; + unsigned __int16 infoIndex; + }; + + /* 46 */ + enum team_t : __int32 + { + TEAM_FREE = 0x0, + TEAM_BAD = 0x0, + TEAM_ALLIES = 0x1, + TEAM_AXIS = 0x2, + TEAM_THREE = 0x3, + TEAM_FOUR = 0x4, + TEAM_FIVE = 0x5, + TEAM_SIX = 0x6, + TEAM_SEVEN = 0x7, + TEAM_EIGHT = 0x8, + TEAM_NUM_PLAYING_TEAMS = 0x9, + TEAM_SPECTATOR = 0x9, + TEAM_NUM_TEAMS = 0xA, + TEAM_LOCALPLAYERS = 0xB, + TEAM_FIRST_PLAYING_TEAM = 0x1, + TEAM_LAST_PLAYING_TEAM = 0x8, + }; + + /* 343 */ + enum TurretRotateState : __int32 + { + TURRET_ROTATE_STOPPED = 0x0, + TURRET_ROTATE_STOPPING = 0x1, + TURRET_ROTATE_MOVING = 0x2, + }; + + struct TurretInfo + { + bool inuse; + int state; + int flags; + int fireTime; + EntHandle manualTarget; + EntHandle target; + vec3_t targetPos; + int targetTime; + vec3_t missOffsetNormalized; + float arcmin[2]; + float arcmax[2]; + float initialYawmin; + float initialYawmax; + float forwardAngleDot; + float dropPitch; + float scanningPitch; + int convergenceTime[2]; + int suppressTime; + float maxRangeSquared; + SentientHandle detachSentient; + int stance; + int prevStance; + int fireSndDelay; + float accuracy; + vec3_t userOrigin; + int prevSentTarget; + float aiSpread; + float playerSpread; + team_t eTeam; + float heatVal; + bool overheating; + int fireBarrel; + float scanSpeed; + float scanDecelYaw; + int scanPauseTime; + vec3_t originError; + vec3_t anglesError; + float pitchCap; + int triggerDown; + unsigned int fireSnd; + unsigned int fireSndPlayer; + unsigned int startFireSnd; + unsigned int startFireSndPlayer; + unsigned int loopFireEnd; + unsigned int loopFireEndPlayer; + unsigned int rotateLoopSnd; + unsigned int rotateLoopSndPlayer; + unsigned int rotateStopSnd; + unsigned int rotateStopSndPlayer; + int sndIsFiring; + vec3_t targetOffset; + float onTargetAngle; + TurretRotateState turretRotateState; + vec3_t previousAngles; + }; + + struct gentity_s + { + int number; + char __pad0[4]; + int eFlags2; + char __pad1[328]; + gclient_s* client; // 340 + char __pad2[0x4]; + char __pad3[0x4]; + TurretInfo* pTurretInfo; + char __pad4[0x24]; + int flags; // 392 + char __pad5[0x190]; + }; + + static_assert(sizeof(gentity_s) == 0x31C); + + enum entity_class + { + CLASS_NUM_ENTITY = 0x0, + CLASS_NUM_HUDELEM = 0x1, + CLASS_NUM_PATHNODE = 0x2, + CLASS_NUM_VEHICLENODE = 0x3, + CLASS_NUM_DYNENTITY = 0x4, + CLASS_NUM_MENUELEM = 0x5, + CLASS_NUM_COUNT = 0x6, + }; + + union hudelem_color_t + { + int rgba; + }; + + struct hudelem_s + { + float x; + float y; + float z; + float fontScale; + float fromFontScale; + int fontScaleStartTime; + hudelem_color_t color; + hudelem_color_t fromColor; + int fadeStartTime; + int scaleStartTime; + float fromX; + float fromY; + int moveStartTime; + int time; + int duration; + float value; + float sort; + hudelem_color_t glowColor; + int fxBirthTime; + unsigned int flags; + __int16 targetEntNum; + __int16 fontScaleTime; + __int16 fadeTime; + __int16 label; + __int16 width; + __int16 height; + __int16 fromWidth; + __int16 fromHeight; + __int16 scaleTime; + __int16 moveTime; + __int16 text; + unsigned __int16 fxLetterTime; + unsigned __int16 fxDecayStartTime; + unsigned __int16 fxDecayDuration; + unsigned __int16 fxRedactDecayStartTime; + unsigned __int16 fxRedactDecayDuration; + char type; + char font; + char alignOrg; + char alignScreen; + char materialIndex; + char offscreenMaterialIdx; + char fromAlignOrg; + char fromAlignScreen; + char soundID; + char ui3dWindow; + }; + + struct game_hudelem_s + { + hudelem_s elem; + int clientNum; + int team; + int archived; + }; + + enum clientState_t + { + CS_FREE, + CS_ZOMBIE, + CS_RECONNECTING, + CS_CONNECTED, + CS_CLIENTLOADING, + CS_ACTIVE, + }; + + enum netsrc_t + { + NS_CLIENT1 = 0x0, + NS_CLIENT2 = 0x1, + NS_CLIENT3 = 0x2, + NS_CLIENT4 = 0x3, + NS_SERVER = 0x4, + NS_PACKET = 0x5, + NS_NULL = -1, + }; + + enum netadrtype_t + { + NA_BOT = 0x0, + NA_BAD = 0x1, + NA_LOOPBACK = 0x2, + NA_BROADCAST = 0x3, + NA_IP = 0x4, + }; + + struct netadr_t + { + union + { + unsigned char ip[4]; + unsigned int inaddr; + }; + unsigned __int16 port; + netadrtype_t type; + netsrc_t localNetID; + unsigned __int16 serverID; + }; + + static_assert(sizeof(netadr_t) == 0x14); + + struct netProfileInfo_t + { + unsigned char __pad0[0x5E0]; + }; + + struct netchan_t + { + int outgoingSequence; + netsrc_t sock; + int dropped; + int incomingSequence; + netadr_t remoteAddress; + int qport; + int fragmentSequence; + int fragmentLength; + unsigned char* fragmentBuffer; + int fragmentBufferSize; + int unsentFragments; + int unsentOnLoan; + int unsentFragmentStart; + int unsentLength; + unsigned char* unsentBuffer; + int unsentBufferSize; + int reliable_fragments; + unsigned char fragment_send_count[128]; + unsigned int fragment_ack[4]; + int lowest_send_count; + netProfileInfo_t prof; + }; + + static_assert(sizeof(netchan_t) == 0x6C8); + + struct PredictedVehicleDef + { + bool fullPhysics; + vec3_t origin; + vec3_t angles; + vec3_t tVel; + vec3_t aVel; + int serverTime; + }; + + static_assert(sizeof(PredictedVehicleDef) == 0x38); + + struct clientHeader_t + { + clientState_t state; + int sendAsActive; + int deltaMessage; + int rateDelayed; + int hasAckedBaselineData; + int hugeSnapshotSent; + netchan_t netchan; + vec3_t predictedOrigin; + int predictedOriginServerTime; + int migrationState; + PredictedVehicleDef predictedVehicle; + }; + + static_assert(sizeof(clientHeader_t) == 0x72C); + + struct client_s + { + clientHeader_t header; + const char* dropReason; + char userinfo[1024]; + unsigned char __pad0[0x3F75C]; + int bIsTestClient; + unsigned char __pad1[0xDEF0]; + }; + + static_assert(offsetof(client_s, header.netchan) == 24); + static_assert(offsetof(netchan_t, remoteAddress) == 16); + + static_assert(sizeof(client_s) == 0x4E180); + + struct cmd_function_t + { + cmd_function_t* next; + const char* name; + const char* autoCompleteDir; + const char* autoCompleteExt; + void(__cdecl* function)(); + int flags; + }; + + struct CmdArgs + { + int nesting; + int localClientNum[8]; + int controllerIndex[8]; + void* itemDef[8]; + int argshift[8]; + int argc[8]; + const char** argv[8]; + char textPool[8192]; + const char* argvPool[512]; + int usedTextPool[8]; + int totalUsedArgvPool; + int totalUsedTextPool; + }; + + enum dvarType_t + { + DVAR_TYPE_INVALID = 0x0, + DVAR_TYPE_BOOL = 0x1, + DVAR_TYPE_FLOAT = 0x2, + DVAR_TYPE_FLOAT_2 = 0x3, + DVAR_TYPE_FLOAT_3 = 0x4, + DVAR_TYPE_FLOAT_4 = 0x5, + DVAR_TYPE_INT = 0x6, + DVAR_TYPE_ENUM = 0x7, + DVAR_TYPE_STRING = 0x8, + DVAR_TYPE_COLOR = 0x9, + DVAR_TYPE_INT64 = 0xA, + DVAR_TYPE_LINEAR_COLOR_RGB = 0xB, + DVAR_TYPE_COLOR_XYZ = 0xC, + DVAR_TYPE_COUNT = 0xD, + }; + + union DvarValue + { + bool enabled; + int integer; + unsigned int unsignedInt; + __int64 integer64; + unsigned __int64 unsignedInt64; + float value; + vec4_t vector; + const char* string; + char color[4]; + }; + + struct $A37BA207B3DDD6345C554D4661813EDD + { + int stringCount; + const char* const* strings; + }; + + struct $9CA192F9DB66A3CB7E01DE78A0DEA53D + { + int min; + int max; + }; + + struct $251C2428A496074035CACA7AAF3D55BD + { + float min; + float max; + }; + + union DvarLimits + { + $A37BA207B3DDD6345C554D4661813EDD enumeration; + $9CA192F9DB66A3CB7E01DE78A0DEA53D integer; + $251C2428A496074035CACA7AAF3D55BD value; + $251C2428A496074035CACA7AAF3D55BD vector; + }; + + struct dvar_t + { + const char* name; + const char* description; + int hash; + unsigned int flags; + dvarType_t type; + bool modified; + DvarValue current; + DvarValue latched; + DvarValue reset; + DvarLimits domain; + dvar_t* hashNext; + }; + + struct GSC_OBJ + { + char magic[8]; + unsigned int source_crc; + unsigned int include_offset; + unsigned int animtree_offset; + unsigned int cseg_offset; + unsigned int stringtablefixup_offset; + unsigned int exports_offset; + unsigned int imports_offset; + unsigned int fixup_offset; + unsigned int profile_offset; + unsigned int cseg_size; + unsigned __int16 name; + unsigned __int16 stringtablefixup_count; + unsigned __int16 exports_count; + unsigned __int16 imports_count; + unsigned __int16 fixup_count; + unsigned __int16 profile_count; + char include_count; + char animtree_count; + char flags; + }; + + struct GSC_EXPORT_ITEM + { + unsigned int checksum; + unsigned int address; + unsigned __int16 name; + char param_count; + char flags; + }; + + struct GSC_IMPORT_ITEM + { + unsigned __int16 name; + unsigned __int16 name_space; + unsigned __int16 num_address; + char param_count; + char flags; + }; + + // gsc-tool + enum class opcode : std::uint8_t + { + OP_End = 0x0, + OP_Return = 0x1, + OP_GetUndefined = 0x2, + OP_GetZero = 0x3, + OP_GetByte = 0x4, + OP_GetNegByte = 0x5, + OP_GetUnsignedShort = 0x6, + OP_GetNegUnsignedShort = 0x7, + OP_GetInteger = 0x8, + OP_GetFloat = 0x9, + OP_GetString = 0xA, + OP_GetIString = 0xB, + OP_GetVector = 0xC, + OP_GetLevelObject = 0xD, + OP_GetAnimObject = 0xE, + OP_GetSelf = 0xF, + OP_GetLevel = 0x10, + OP_GetGame = 0x11, + OP_GetAnim = 0x12, + OP_GetAnimation = 0x13, + OP_GetGameRef = 0x14, + OP_GetFunction = 0x15, + OP_CreateLocalVariable = 0x16, + OP_SafeCreateLocalVariables = 0x17, + OP_RemoveLocalVariables = 0x18, + OP_EvalLocalVariableCached = 0x19, + OP_EvalArray = 0x1A, + OP_EvalLocalArrayRefCached = 0x1B, + OP_EvalArrayRef = 0x1C, + OP_ClearArray = 0x1D, + OP_EmptyArray = 0x1E, + OP_GetSelfObject = 0x1F, + OP_EvalFieldVariable = 0x20, + OP_EvalFieldVariableRef = 0x21, + OP_ClearFieldVariable = 0x22, + OP_SafeSetVariableFieldCached = 0x23, + OP_SafeSetWaittillVariableFieldCached = 0x24, + OP_ClearParams = 0x25, + OP_CheckClearParams = 0x26, + OP_EvalLocalVariableRefCached = 0x27, + OP_SetVariableField = 0x28, + OP_CallBuiltin = 0x29, + OP_CallBuiltinMethod = 0x2A, + OP_Wait = 0x2B, + OP_WaitTillFrameEnd = 0x2C, + OP_PreScriptCall = 0x2D, + OP_ScriptFunctionCall = 0x2E, + OP_ScriptFunctionCallPointer = 0x2F, + OP_ScriptMethodCall = 0x30, + OP_ScriptMethodCallPointer = 0x31, + OP_ScriptThreadCall = 0x32, + OP_ScriptThreadCallPointer = 0x33, + OP_ScriptMethodThreadCall = 0x34, + OP_ScriptMethodThreadCallPointer = 0x35, + OP_DecTop = 0x36, + OP_CastFieldObject = 0x37, + OP_CastBool = 0x38, + OP_BoolNot = 0x39, + OP_BoolComplement = 0x3A, + OP_JumpOnFalse = 0x3B, + OP_JumpOnTrue = 0x3C, + OP_JumpOnFalseExpr = 0x3D, + OP_JumpOnTrueExpr = 0x3E, + OP_Jump = 0x3F, + OP_JumpBack = 0x40, + OP_Inc = 0x41, + OP_Dec = 0x42, + OP_Bit_Or = 0x43, + OP_Bit_Xor = 0x44, + OP_Bit_And = 0x45, + OP_Equal = 0x46, + OP_NotEqual = 0x47, + OP_LessThan = 0x48, + OP_GreaterThan = 0x49, + OP_LessThanOrEqualTo = 0x4A, + OP_GreaterThanOrEqualTo = 0x4B, + OP_ShiftLeft = 0x4C, + OP_ShiftRight = 0x4D, + OP_Plus = 0x4E, + OP_Minus = 0x4F, + OP_Multiply = 0x50, + OP_Divide = 0x51, + OP_Modulus = 0x52, + OP_SizeOf = 0x53, + OP_WaitTillMatch = 0x54, + OP_WaitTill = 0x55, + OP_Notify = 0x56, + OP_EndOn = 0x57, + OP_VoidCodePos = 0x58, + OP_Switch = 0x59, + OP_EndSwitch = 0x5A, + OP_Vector = 0x5B, + OP_GetHash = 0x5C, + OP_RealWait = 0x5D, + OP_VectorConstant = 0x5E, + OP_IsDefined = 0x5F, + OP_VectorScale = 0x60, + OP_AnglesToUp = 0x61, + OP_AnglesToRight = 0x62, + OP_AnglesToForward = 0x63, + OP_AngleClamp180 = 0x64, + OP_VectorToAngles = 0x65, + OP_Abs = 0x66, + OP_GetTime = 0x67, + OP_GetDvar = 0x68, + OP_GetDvarInt = 0x69, + OP_GetDvarFloat = 0x6A, + OP_GetDvarVector = 0x6B, + OP_GetDvarColorRed = 0x6C, + OP_GetDvarColorGreen = 0x6D, + OP_GetDvarColorBlue = 0x6E, + OP_GetDvarColorAlpha = 0x6F, + OP_FirstArrayKey = 0x70, + OP_NextArrayKey = 0x71, + OP_ProfileStart = 0x72, + OP_ProfileStop = 0x73, + OP_SafeDecTop = 0x74, + OP_Nop = 0x75, + OP_Abort = 0x76, + OP_Object = 0x77, + OP_ThreadObject = 0x78, + OP_EvalLocalVariable = 0x79, + OP_EvalLocalVariableRef = 0x7A, + OP_DevblockBegin = 0x7B, + OP_DevblockEnd = 0x7C, + OP_Breakpoint = 0x7D, + OP_Count = 0x7E, + }; + + enum XAssetType + { + ASSET_TYPE_XMODELPIECES = 0x0, + ASSET_TYPE_PHYSPRESET = 0x1, + ASSET_TYPE_PHYSCONSTRAINTS = 0x2, + ASSET_TYPE_DESTRUCTIBLEDEF = 0x3, + ASSET_TYPE_XANIMPARTS = 0x4, + ASSET_TYPE_XMODEL = 0x5, + ASSET_TYPE_MATERIAL = 0x6, + ASSET_TYPE_TECHNIQUE_SET = 0x7, + ASSET_TYPE_IMAGE = 0x8, + ASSET_TYPE_SOUND = 0x9, + ASSET_TYPE_SOUND_PATCH = 0xA, + ASSET_TYPE_CLIPMAP = 0xB, + ASSET_TYPE_CLIPMAP_PVS = 0xC, + ASSET_TYPE_COMWORLD = 0xD, + ASSET_TYPE_GAMEWORLD_SP = 0xE, + ASSET_TYPE_GAMEWORLD_MP = 0xF, + ASSET_TYPE_MAP_ENTS = 0x10, + ASSET_TYPE_GFXWORLD = 0x11, + ASSET_TYPE_LIGHT_DEF = 0x12, + ASSET_TYPE_UI_MAP = 0x13, + ASSET_TYPE_FONT = 0x14, + ASSET_TYPE_FONTICON = 0x15, + ASSET_TYPE_MENULIST = 0x16, + ASSET_TYPE_MENU = 0x17, + ASSET_TYPE_LOCALIZE_ENTRY = 0x18, + ASSET_TYPE_WEAPON = 0x19, + ASSET_TYPE_WEAPONDEF = 0x1A, + ASSET_TYPE_WEAPON_VARIANT = 0x1B, + ASSET_TYPE_WEAPON_FULL = 0x1C, + ASSET_TYPE_ATTACHMENT = 0x1D, + ASSET_TYPE_ATTACHMENT_UNIQUE = 0x1E, + ASSET_TYPE_WEAPON_CAMO = 0x1F, + ASSET_TYPE_SNDDRIVER_GLOBALS = 0x20, + ASSET_TYPE_FX = 0x21, + ASSET_TYPE_IMPACT_FX = 0x22, + ASSET_TYPE_AITYPE = 0x23, + ASSET_TYPE_MPTYPE = 0x24, + ASSET_TYPE_MPBODY = 0x25, + ASSET_TYPE_MPHEAD = 0x26, + ASSET_TYPE_CHARACTER = 0x27, + ASSET_TYPE_XMODELALIAS = 0x28, + ASSET_TYPE_RAWFILE = 0x29, + ASSET_TYPE_STRINGTABLE = 0x2A, + ASSET_TYPE_LEADERBOARD = 0x2B, + ASSET_TYPE_XGLOBALS = 0x2C, + ASSET_TYPE_DDL = 0x2D, + ASSET_TYPE_GLASSES = 0x2E, + ASSET_TYPE_EMBLEMSET = 0x2F, + ASSET_TYPE_SCRIPTPARSETREE = 0x30, + ASSET_TYPE_KEYVALUEPAIRS = 0x31, + ASSET_TYPE_VEHICLEDEF = 0x32, + ASSET_TYPE_MEMORYBLOCK = 0x33, + ASSET_TYPE_ADDON_MAP_ENTS = 0x34, + ASSET_TYPE_TRACER = 0x35, + ASSET_TYPE_SKINNEDVERTS = 0x36, + ASSET_TYPE_QDB = 0x37, + ASSET_TYPE_SLUG = 0x38, + ASSET_TYPE_FOOTSTEP_TABLE = 0x39, + ASSET_TYPE_FOOTSTEPFX_TABLE = 0x3A, + ASSET_TYPE_ZBARRIER = 0x3B, + ASSET_TYPE_COUNT = 0x3C, + ASSET_TYPE_STRING = 0x3C, + ASSET_TYPE_ASSETLIST = 0x3D, + ASSET_TYPE_REPORT = 0x3E, + ASSET_TYPE_DEPEND = 0x3F, + ASSET_TYPE_FULL_COUNT = 0x40, + }; + + struct ScriptParseTree + { + const char* name; + int len; + GSC_OBJ* obj; + }; + + struct objFileInfo_t + { + GSC_OBJ* activeVersion; + char __pad[0x24]; + }; + + union XAssetHeader + { + ScriptParseTree* scriptParseTree; + }; + + struct WeaponDef + { + const char* szOverlayName; + void** gunXModel; + void* handXModel; + const char* szModeName; + unsigned __int16* notetrackSoundMapKeys; + unsigned __int16* notetrackSoundMapValues; + int playerAnimType; + int weapType; + int weapClass; + int penetrateType; + int impactType; + int inventoryType; + int fireType; + int clipType; + int barrelType; + int itemIndex; + const char* parentWeaponName; + int iJamFireTime; + int overheatWeapon; + float overheatRate; + float cooldownRate; + float overheatEndVal; + bool coolWhileFiring; + bool fuelTankWeapon; + int iTankLifeTime; + int offhandClass; + int offhandSlot; + int stance; + const void* viewFlashEffect; + const void* worldFlashEffect; + const void* barrelCooldownEffect; + int barrelCooldownMinCount; + vec3_t vViewFlashOffset; + vec3_t vWorldFlashOffset; + const char* pickupSound; + const char* pickupSoundPlayer; + const char* ammoPickupSound; + const char* ammoPickupSoundPlayer; + const char* projectileSound; + const char* pullbackSound; + const char* pullbackSoundPlayer; + const char* fireSound; + const char* fireSoundPlayer; + const char* fireLoopSound; + const char* fireLoopSoundPlayer; + const char* fireLoopEndSound; + const char* fireLoopEndSoundPlayer; + const char* fireStartSound; + const char* fireStopSound; + const char* fireKillcamSound; + const char* fireStartSoundPlayer; + const char* fireStopSoundPlayer; + const char* fireKillcamSoundPlayer; + const char* fireLastSound; + const char* fireLastSoundPlayer; + const char* emptyFireSound; + const char* emptyFireSoundPlayer; + const char* crackSound; + const char* whizbySound; + const char* meleeSwipeSound; + const char* meleeSwipeSoundPlayer; + const char* meleeHitSound; + const char* meleeMissSound; + const char* rechamberSound; + const char* rechamberSoundPlayer; + const char* reloadSound; + const char* reloadSoundPlayer; + const char* reloadEmptySound; + const char* reloadEmptySoundPlayer; + const char* reloadStartSound; + const char* reloadStartSoundPlayer; + const char* reloadEndSound; + const char* reloadEndSoundPlayer; + const char* rotateLoopSound; + const char* rotateLoopSoundPlayer; + const char* rotateStopSound; + const char* rotateStopSoundPlayer; + const char* deploySound; + const char* deploySoundPlayer; + const char* finishDeploySound; + const char* finishDeploySoundPlayer; + const char* breakdownSound; + const char* breakdownSoundPlayer; + const char* finishBreakdownSound; + const char* finishBreakdownSoundPlayer; + const char* detonateSound; + const char* detonateSoundPlayer; + const char* nightVisionWearSound; + const char* nightVisionWearSoundPlayer; + const char* nightVisionRemoveSound; + const char* nightVisionRemoveSoundPlayer; + const char* altSwitchSound; + const char* altSwitchSoundPlayer; + const char* raiseSound; + const char* raiseSoundPlayer; + const char* firstRaiseSound; + const char* firstRaiseSoundPlayer; + const char* adsRaiseSoundPlayer; + const char* adsLowerSoundPlayer; + const char* putawaySound; + const char* putawaySoundPlayer; + const char* overheatSound; + const char* overheatSoundPlayer; + const char* adsZoomSound; + const char* shellCasing; + const char* shellCasingPlayer; + const char** bounceSound; + const char* standMountedWeapdef; + const char* crouchMountedWeapdef; + const char* proneMountedWeapdef; + int standMountedIndex; + int crouchMountedIndex; + int proneMountedIndex; + const void* viewShellEjectEffect; + const void* worldShellEjectEffect; + const void* viewLastShotEjectEffect; + const void* worldLastShotEjectEffect; + vec3_t vViewShellEjectOffset; + vec3_t vWorldShellEjectOffset; + vec3_t vViewShellEjectRotation; + vec3_t vWorldShellEjectRotation; + void* reticleCenter; + void* reticleSide; + int iReticleCenterSize; + int iReticleSideSize; + int iReticleMinOfs; + int activeReticleType; + vec3_t vStandMove; + vec3_t vStandRot; + vec3_t vDuckedOfs; + vec3_t vDuckedMove; + vec3_t vDuckedSprintOfs; + vec3_t vDuckedSprintRot; + vec2_t vDuckedSprintBob; + float fDuckedSprintCycleScale; + vec3_t vSprintOfs; + vec3_t vSprintRot; + vec2_t vSprintBob; + float fSprintCycleScale; + vec3_t vLowReadyOfs; + vec3_t vLowReadyRot; + vec3_t vRideOfs; + vec3_t vRideRot; + vec3_t vDtpOfs; + vec3_t vDtpRot; + vec2_t vDtpBob; + float fDtpCycleScale; + vec3_t vMantleOfs; + vec3_t vMantleRot; + vec3_t vSlideOfs; + vec3_t vSlideRot; + vec3_t vDuckedRot; + vec3_t vProneOfs; + vec3_t vProneMove; + vec3_t vProneRot; + vec3_t vStrafeMove; + vec3_t vStrafeRot; + float fPosMoveRate; + float fPosProneMoveRate; + float fStandMoveMinSpeed; + float fDuckedMoveMinSpeed; + float fProneMoveMinSpeed; + float fPosRotRate; + float fPosProneRotRate; + float fStandRotMinSpeed; + float fDuckedRotMinSpeed; + float fProneRotMinSpeed; + void** worldModel; + void* worldClipModel; + void* rocketModel; + void* mountedModel; + void* additionalMeleeModel; + void* fireTypeIcon; + void* hudIcon; + int hudIconRatio; + void* indicatorIcon; + int indicatorIconRatio; + void* ammoCounterIcon; + int ammoCounterIconRatio; + int ammoCounterClip; + int iStartAmmo; + int iMaxAmmo; + int shotCount; + const char* szSharedAmmoCapName; + int iSharedAmmoCapIndex; + int iSharedAmmoCap; + bool unlimitedAmmo; + bool ammoCountClipRelative; + int damage[6]; + float damageRange[6]; + int minPlayerDamage; + float damageDuration; + float damageInterval; + int playerDamage; + int iMeleeDamage; + int iDamageType; + unsigned __int16 explosionTag; + int iFireDelay; + int iMeleeDelay; + int meleeChargeDelay; + int iDetonateDelay; + int iSpinUpTime; + int iSpinDownTime; + float spinRate; + const char* spinLoopSound; + const char* spinLoopSoundPlayer; + const char* startSpinSound; + const char* startSpinSoundPlayer; + const char* stopSpinSound; + const char* stopSpinSoundPlayer; + bool applySpinPitch; + int iFireTime; + int iLastFireTime; + int iRechamberTime; + int iRechamberBoltTime; + int iHoldFireTime; + int iDetonateTime; + int iMeleeTime; + int iBurstDelayTime; + int meleeChargeTime; + int iReloadTimeRight; + int iReloadTimeLeft; + int reloadShowRocketTime; + int iReloadEmptyTimeLeft; + int iReloadAddTime; + int iReloadEmptyAddTime; + int iReloadQuickAddTime; + int iReloadQuickEmptyAddTime; + int iReloadStartTime; + int iReloadStartAddTime; + int iReloadEndTime; + int iDropTime; + int iRaiseTime; + int iAltDropTime; + int quickDropTime; + int quickRaiseTime; + int iFirstRaiseTime; + int iEmptyRaiseTime; + int iEmptyDropTime; + int sprintInTime; + int sprintLoopTime; + int sprintOutTime; + int lowReadyInTime; + int lowReadyLoopTime; + int lowReadyOutTime; + int contFireInTime; + int contFireLoopTime; + int contFireOutTime; + int dtpInTime; + int dtpLoopTime; + int dtpOutTime; + int crawlInTime; + int crawlForwardTime; + int crawlBackTime; + int crawlRightTime; + int crawlLeftTime; + int crawlOutFireTime; + int crawlOutTime; + int slideInTime; + int deployTime; + int breakdownTime; + int iFlourishTime; + int nightVisionWearTime; + int nightVisionWearTimeFadeOutEnd; + int nightVisionWearTimePowerUp; + int nightVisionRemoveTime; + int nightVisionRemoveTimePowerDown; + int nightVisionRemoveTimeFadeInStart; + int fuseTime; + int aiFuseTime; + int lockOnRadius; + int lockOnSpeed; + bool requireLockonToFire; + bool noAdsWhenMagEmpty; + bool avoidDropCleanup; + unsigned int stackFire; + float stackFireSpread; + float stackFireAccuracyDecay; + const char* stackSound; + float autoAimRange; + float aimAssistRange; + bool mountableWeapon; + float aimPadding; + float enemyCrosshairRange; + bool crosshairColorChange; + float moveSpeedScale; + float adsMoveSpeedScale; + float sprintDurationScale; + int overlayReticle; + int overlayInterface; + float overlayWidth; + float overlayHeight; + float fAdsBobFactor; + float fAdsViewBobMult; + bool bHoldBreathToSteady; + float fHipSpreadStandMin; + float fHipSpreadDuckedMin; + float fHipSpreadProneMin; + float hipSpreadStandMax; + float hipSpreadDuckedMax; + float hipSpreadProneMax; + float fHipSpreadDecayRate; + float fHipSpreadFireAdd; + float fHipSpreadTurnAdd; + float fHipSpreadMoveAdd; + float fHipSpreadDuckedDecay; + float fHipSpreadProneDecay; + float fHipReticleSidePos; + float fAdsIdleAmount; + float fHipIdleAmount; + float adsIdleSpeed; + float hipIdleSpeed; + float fIdleCrouchFactor; + float fIdleProneFactor; + float fGunMaxPitch; + float fGunMaxYaw; + float swayMaxAngle; + float swayLerpSpeed; + float swayPitchScale; + float swayYawScale; + float swayHorizScale; + float swayVertScale; + float swayShellShockScale; + float adsSwayMaxAngle; + float adsSwayLerpSpeed; + float adsSwayPitchScale; + float adsSwayYawScale; + bool sharedAmmo; + bool bRifleBullet; + bool armorPiercing; + bool bAirburstWeapon; + bool bBoltAction; + bool bUseAltTagFlash; + bool bUseAntiLagRewind; + bool bIsCarriedKillstreakWeapon; + bool aimDownSight; + bool bRechamberWhileAds; + bool bReloadWhileAds; + float adsViewErrorMin; + float adsViewErrorMax; + bool bCookOffHold; + bool bClipOnly; + bool bCanUseInVehicle; + bool bNoDropsOrRaises; + bool adsFireOnly; + bool cancelAutoHolsterWhenEmpty; + bool suppressAmmoReserveDisplay; + bool laserSight; + bool laserSightDuringNightvision; + bool bHideThirdPerson; + bool bHasBayonet; + bool bDualWield; + bool bExplodeOnGround; + bool bThrowBack; + bool bRetrievable; + bool bDieOnRespawn; + bool bNoThirdPersonDropsOrRaises; + bool bContinuousFire; + bool bNoPing; + bool bForceBounce; + bool bUseDroppedModelAsStowed; + bool bNoQuickDropWhenEmpty; + bool bKeepCrosshairWhenADS; + bool bUseOnlyAltWeaoponHideTagsInAltMode; + bool bAltWeaponAdsOnly; + bool bAltWeaponDisableSwitching; + void* killIcon; + int killIconRatio; + bool flipKillIcon; + bool bNoPartialReload; + bool bSegmentedReload; + bool bNoADSAutoReload; + int iReloadAmmoAdd; + int iReloadStartAdd; + const char* szSpawnedGrenadeWeaponName; + const char* szDualWieldWeaponName; + unsigned int dualWieldWeaponIndex; + int iDropAmmoMin; + int iDropAmmoMax; + int iDropClipAmmoMin; + int iDropClipAmmoMax; + int iShotsBeforeRechamber; + bool blocksProne; + bool bShowIndicator; + int isRollingGrenade; + int useBallisticPrediction; + int isValuable; + int isTacticalInsertion; + bool isReviveWeapon; + bool bUseRigidBodyOnVehicle; + int iExplosionRadius; + int iExplosionRadiusMin; + int iIndicatorRadius; + int iExplosionInnerDamage; + int iExplosionOuterDamage; + float damageConeAngle; + int iProjectileSpeed; + int iProjectileSpeedUp; + int iProjectileSpeedRelativeUp; + int iProjectileSpeedForward; + float fProjectileTakeParentVelocity; + int iProjectileActivateDist; + float projLifetime; + float timeToAccelerate; + float projectileCurvature; + void* projectileModel; + int projExplosion; + const void* projExplosionEffect; + bool projExplosionEffectForceNormalUp; + const void* projExplosionEffect2; + bool projExplosionEffect2ForceNormalUp; + const void* projExplosionEffect3; + bool projExplosionEffect3ForceNormalUp; + const void* projExplosionEffect4; + bool projExplosionEffect4ForceNormalUp; + const void* projExplosionEffect5; + bool projExplosionEffect5ForceNormalUp; + const void* projDudEffect; + const char* projExplosionSound; + const char* projDudSound; + const char* mortarShellSound; + const char* tankShellSound; + bool bProjImpactExplode; + bool bProjSentientImpactExplode; + bool bProjExplodeWhenStationary; + bool bBulletImpactExplode; + int stickiness; + int rotateType; + bool plantable; + bool hasDetonator; + bool timedDetonation; + bool bNoCrumpleMissile; + bool rotate; + bool bKeepRolling; + bool holdButtonToThrow; + bool offhandHoldIsCancelable; + bool freezeMovementWhenFiring; + float lowAmmoWarningThreshold; + bool bDisallowAtMatchStart; + float meleeChargeRange; + bool bUseAsMelee; + bool isCameraSensor; + bool isAcousticSensor; + bool isLaserSensor; + bool isHoldUseGrenade; + float* parallelBounce; + float* perpendicularBounce; + const void* projTrailEffect; + vec3_t vProjectileColor; + int guidedMissileType; + float maxSteeringAccel; + int projIgnitionDelay; + const void* projIgnitionEffect; + const char* projIgnitionSound; + float fAdsAimPitch; + float fAdsCrosshairInFrac; + float fAdsCrosshairOutFrac; + int adsGunKickReducedKickBullets; + float adsGunKickReducedKickPercent; + float fAdsGunKickPitchMin; + float fAdsGunKickPitchMax; + float fAdsGunKickYawMin; + float fAdsGunKickYawMax; + float fAdsGunKickAccel; + float fAdsGunKickSpeedMax; + float fAdsGunKickSpeedDecay; + float fAdsGunKickStaticDecay; + float fAdsViewKickPitchMin; + float fAdsViewKickPitchMax; + float fAdsViewKickMinMagnitude; + float fAdsViewKickYawMin; + float fAdsViewKickYawMax; + float fAdsRecoilReductionRate; + float fAdsRecoilReductionLimit; + float fAdsRecoilReturnRate; + float fAdsViewScatterMin; + float fAdsViewScatterMax; + float fAdsSpread; + int hipGunKickReducedKickBullets; + float hipGunKickReducedKickPercent; + float fHipGunKickPitchMin; + float fHipGunKickPitchMax; + float fHipGunKickYawMin; + float fHipGunKickYawMax; + float fHipGunKickAccel; + float fHipGunKickSpeedMax; + float fHipGunKickSpeedDecay; + float fHipGunKickStaticDecay; + float fHipViewKickPitchMin; + float fHipViewKickPitchMax; + float fHipViewKickMinMagnitude; + float fHipViewKickYawMin; + float fHipViewKickYawMax; + float fHipViewScatterMin; + float fHipViewScatterMax; + float fAdsViewKickCenterDuckedScale; + float fAdsViewKickCenterProneScale; + float fAntiQuickScopeTime; + float fAntiQuickScopeScale; + float fAntiQuickScopeSpreadMultiplier; + float fAntiQuickScopeSpreadMax; + float fAntiQuickScopeSwayFactor; + float fightDist; + float maxDist; + const char* accuracyGraphName[2]; + vec2_t* accuracyGraphKnots[2]; + vec2_t* originalAccuracyGraphKnots[2]; + int accuracyGraphKnotCount[2]; + int originalAccuracyGraphKnotCount[2]; + int iPositionReloadTransTime; + float leftArc; + float rightArc; + float topArc; + float bottomArc; + float accuracy; + float aiSpread; + float playerSpread; + float minTurnSpeed[2]; + float maxTurnSpeed[2]; + float pitchConvergenceTime; + float yawConvergenceTime; + float suppressTime; + float maxRange; + float fAnimHorRotateInc; + float fPlayerPositionDist; + const char* szUseHintString; + const char* dropHintString; + int iUseHintStringIndex; + int dropHintStringIndex; + float horizViewJitter; + float vertViewJitter; + float cameraShakeScale; + int cameraShakeDuration; + int cameraShakeRadius; + float explosionCameraShakeScale; + int explosionCameraShakeDuration; + int explosionCameraShakeRadius; + const char* szScript; + float destabilizationRateTime; + float destabilizationCurvatureMax; + int destabilizeDistance; + float* locationDamageMultipliers; + const char* fireRumble; + const char* meleeImpactRumble; + const char* reloadRumble; + const char* explosionRumble; + void* tracerType; + void* enemyTracerType; + float adsDofStart; + float adsDofEnd; + float hipDofStart; + float hipDofEnd; + float scanSpeed; + float scanAccel; + int scanPauseTime; + const char* flameTableFirstPerson; + const char* flameTableThirdPerson; + void* flameTableFirstPersonPtr; + void* flameTableThirdPersonPtr; + const void* tagFx_preparationEffect; + const void* tagFlash_preparationEffect; + bool doGibbing; + float maxGibDistance; + float altScopeADSTransInTime; + float altScopeADSTransOutTime; + int iIntroFireTime; + int iIntroFireLength; + const void* meleeSwipeEffect; + const void* meleeImpactEffect; + const void* meleeImpactNoBloodEffect; + const char* throwBackType; + void* weaponCamo; + float customFloat0; + float customFloat1; + float customFloat2; + int customBool0; + int customBool1; + int customBool2; + }; + + static_assert(sizeof(WeaponDef) == 2448); +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/game/symbols.hpp b/t6/plugins/tws-t6-gsc-utils/src/game/symbols.hpp new file mode 100644 index 0000000..8adb330 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/game/symbols.hpp @@ -0,0 +1,137 @@ +#pragma once + +#define WEAK __declspec(selectany) + +namespace game +{ + // Functions + + WEAK symbol BG_StringHashValue{0x6BB660, 0x612780}; + + WEAK symbol Cbuf_InsertText{0x4A5FF0, 0x702E40}; + WEAK symbol Cbuf_AddText{0x5C6F10, 0x6B9D20}; + WEAK symbol Cmd_ExecuteSingleCommand{0x6B9C10, 0x43B8D0}; + WEAK symbol Cmd_AddCommandInternal{0x5B3070, 0x4DC2A0}; + WEAK symbol Cmd_Argv{0x5608F0, 0x6B3D40}; + WEAK symbol Cmd_RemoveCommand{0x6033D0, 0x65EB30}; + + WEAK symbol ClientUserInfoChanged{0x4ED6A0, 0x427DC0}; + + WEAK symbol Dvar_FindVar{0x563A70, 0x673C80}; + WEAK symbol Dvar_GetInt{0x44DFC0, 0x6909F0}; + WEAK symbol Dvar_RegisterInt{0x5F24E0, 0x5A3D70}; + WEAK symbol Dvar_RegisterBool{0x4E0170, 0x5FBCC0}; + + WEAK symbol DB_FindXAssetHeader{0x6F9030, 0x43F460}; + + WEAK symbol I_CleanStr{0x44F2B0, 0x483F40}; + + WEAK symbol Player_GetMethod{0x432480, 0x6F2DB0}; + WEAK symbol Scr_GetCommonFunction{0x691110, 0x4EB070}; + WEAK symbol Scr_GetMethod{0x59D090, 0x486120}; + + WEAK symbol Scr_AddEntity{0x4C20F0, 0x5D8F80}; + WEAK symbol Scr_AddFloat{0x579130, 0x503480}; + WEAK symbol Scr_AddInt{0x57AFF0, 0x643A40}; + WEAK symbol Scr_AddString{0x4F1650, 0x6A7A70}; + WEAK symbol Scr_AddVector{0x4C1A40, 0x4FAB00}; + WEAK symbol Scr_AddObject{0x539B50, 0x584DF0}; + + WEAK symbol Scr_ClearOutParams{0x591410, 0x627540}; + + WEAK symbol AllocObject{0x6FB1B0, 0x6FE9D0}; + WEAK symbol AllocVariable{0x8F3150, 0x8F1EB0}; + WEAK symbol AllocThread{0x49FDF0, 0x482C40}; + WEAK symbol RemoveRefToObject{0x6FB1B0, 0x550DC0}; + WEAK symbol RemoveRefToVector{0x50C580, 0x432600}; + WEAK symbol AddRefToValue{0x488FA0, 0x4E5060}; + WEAK symbol RemoveRefToValue{0x55E820, 0x42E7D0}; + WEAK symbol RemoveVariableValue{0x56A820, 0x6CC320}; + + WEAK symbol FindVariable{0x6EB1B0, 0x5FE180}; + WEAK symbol GetVariable{0, 0x5CD170}; + WEAK symbol GetNewVariable{0x5AD920, 0x5C18A0}; + WEAK symbol GetNewArrayVariable{0x5D80C0, 0x42C260}; + + WEAK symbol Scr_SetObjectField{0x5B9820, 0x43F2A0}; + WEAK symbol GetEntityFieldValue{0x693130, 0x6DD0E0}; + + WEAK symbol Scr_Notify{0x644AB0, 0x495420}; + WEAK symbol Scr_NotifyId{0x4FDC10, 0x4BC0D0}; + WEAK symbol Scr_NotifyNum{0x578690, 0x664770}; + + WEAK symbol SL_GetString{0x602C40, 0x4601E0}; + WEAK symbol SL_ConvertToString{0x422D10, 0x532230}; + WEAK symbol SL_GetCanonicalString{0x692740, 0x546640}; + + WEAK symbol Scr_GetNumParam{0x42E990, 0x680EA0}; + WEAK symbol Scr_GetEntity{0x48F250, 0x489100}; + WEAK symbol Scr_GetFloat{0x633400, 0x625EE0}; + WEAK symbol Scr_GetInt{0x45D840, 0x49A060}; + WEAK symbol Scr_GetString{0x67C6A0, 0x488110}; + WEAK symbol Scr_GetVector{0x4CBCC0, 0x4BB100}; + WEAK symbol Scr_AllocVector{0x510D30, 0x44D8C0}; + WEAK symbol Scr_GetSelf{0x4682C0, 0x6C4E60}; + WEAK symbol Scr_GetFunctionHandle{0x416D30, 0x53E5A0}; + WEAK symbol Scr_AddClassField{0x6B7620, 0x438AD0}; + WEAK symbol Scr_GetEntityId{0x5765B0, 0x488430}; + WEAK symbol GetStartLocalId{0x402760, 0x5D6CD0}; + WEAK symbol Scr_TerminateRunningThread{0x8F45A0, 0x8F3300}; + WEAK symbol Scr_Error{0x403AE0, 0x5E81C0}; + WEAK symbol Scr_ParamError{0x415A30, 0x617CA0}; + WEAK symbol Scr_ObjectError{0x561660, 0x6B67E0}; + WEAK symbol Scr_TerminalError{0x698C50, 0x410440}; + + WEAK symbol GetPlayerEntity{0x48B760, 0x4BF6F0}; + + WEAK symbol VM_Execute{0x8F9550, 0x8F82B0}; + + WEAK symbol SV_GameDropClient{0x6D2980, 0x677690}; + WEAK symbol SV_IsTestClient{0x4E64B0, 0x42C300}; + WEAK symbol SV_GameSendServerCommand{0x45D7D0, 0x40D450}; + WEAK symbol SV_SetConfigString{0x6EAA00, 0x673E40}; + + WEAK symbol Sys_GetValue{0x5EFBA0, 0x59A740}; + WEAK symbol Sys_Milliseconds{0x57EC40, 0x6F4C00}; + + WEAK symbol longjmp{0xA78870, 0xA71AD0}; + WEAK symbol _setjmp{0xA77B10, 0xA70D70}; + + // Variables + + WEAK symbol sv_cmd_args{0x255DD48, 0x252F8C8}; + + WEAK symbol g_script_error_level{0x2E23BC8, 0x2DF3EC8}; + WEAK symbol g_script_error{0x2E22B48, 0x2DF2E48}; + + WEAK symbol scr_VmPub{0x2E1A5D0, 0x2DEA8D0}; + WEAK symbol scr_VarGlob{0x2E1A100, 0x2DEA400}; + WEAK symbol scr_VarPub{0x2E1A500, 0x2DEA800}; + WEAK symbol scr_starttime{0x2E23C48, 0x2DF3F48}; + WEAK symbol fs{0x2E23C08, 0x2DF3F08}; + + WEAK symbol sv_configstrings{0x28E67AC, 0x28B70AC}; + + WEAK symbol g_classMap{0xD6FFE0, 0xD64E60}; + + WEAK symbol common_functions{0xC75160, 0xC6ACC8}; + WEAK symbol functions{0xD4DD28, 0xD42BC8}; + + WEAK symbol player_methods{0xC726A8, 0xC68218}; + WEAK symbol scriptEnt_methods{0xC76F18, 0xC6CA90}; + WEAK symbol scriptVehicle_methods{0xC77538, 0xC6D0B0}; + WEAK symbol hudElem_methods{0xC74580, 0xC6A0E8}; + WEAK symbol helicopter_methods{0xC74E98, 0xC6AA00}; + WEAK symbol actor_methods{0xC871A0, 0xC7CC70}; + WEAK symbol builtInCommon_methods{0xC76600, 0xC6C168}; + WEAK symbol builtIn_methods{0xD4FC78, 0xD44B18}; + + WEAK symbol g_entities{0x21EF7C0, 0x21C13C0}; + WEAK symbol levelEntityId{0x2E1A51C, 0x2DEA81C}; + + WEAK symbol svs_clients{0x291C0C0, 0x28EC9C0}; + + WEAK symbol g_hudelems{0x21C5140, 0x2196D40}; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/loader/component_interface.hpp b/t6/plugins/tws-t6-gsc-utils/src/loader/component_interface.hpp new file mode 100644 index 0000000..2f5b7c6 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/loader/component_interface.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "../plugin.hpp" + +class component_interface +{ +public: + virtual ~component_interface() + { + } + + virtual void on_startup([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_dvar_init([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_after_dvar_init([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_game_init([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual void on_shutdown([[maybe_unused]] plugin::plugin* plugin) + { + } + + virtual bool is_supported() + { + return true; + } +}; diff --git a/t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.cpp b/t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.cpp new file mode 100644 index 0000000..ad4f5b9 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.cpp @@ -0,0 +1,72 @@ +#include +#include "component_loader.hpp" + +void component_loader::register_component(const std::string& name, std::unique_ptr&& component_) +{ + get_components().push_back(std::make_pair(name, std::move(component_))); +} + +#define ON_CALLBACK(__name__) \ + void component_loader::__name__() \ + { \ + static auto handled = false; \ + if (handled) \ + { \ + return; \ + } \ + \ + handled = true; \ + \ + for (const auto& component_ : get_components()) \ + { \ + try \ + { \ + component_.second->__name__(plugin::get()); \ + } \ + catch (const std::exception& e) \ + { \ + printf("error executing component \"%s\" callback \"%s\": %s\n", component_.first.data(), #__name__, e.what()); \ + } \ + } \ + } \ + +ON_CALLBACK(on_startup); +ON_CALLBACK(on_dvar_init); +ON_CALLBACK(on_after_dvar_init); +ON_CALLBACK(on_shutdown); + +void component_loader::clean() +{ + auto& components = get_components(); + for (auto i = components.begin(); i != components.end();) + { + if (!(*i).second->is_supported()) + { + (*i).second->on_shutdown(plugin::get()); + i = components.erase(i); + } + else + { + ++i; + } + } +} + +void component_loader::trigger_premature_shutdown() +{ + throw premature_shutdown_trigger(); +} + +std::vector>>& component_loader::get_components() +{ + using component_vector = std::vector>>; + using component_vector_container = std::unique_ptr>; + + static component_vector_container components(new component_vector, [](component_vector* component_vector) + { + on_shutdown(); + delete component_vector; + }); + + return *components; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.hpp b/t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.hpp new file mode 100644 index 0000000..6d6f73f --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/loader/component_loader.hpp @@ -0,0 +1,61 @@ +#pragma once +#include "component_interface.hpp" + +class component_loader final +{ +public: + class premature_shutdown_trigger final : public std::exception + { + [[nodiscard]] const char* what() const noexcept override + { + return "Premature shutdown requested"; + } + }; + + template + class installer final + { + static_assert(std::is_base_of::value, "component has invalid base class"); + + public: + installer(const std::string& name) + { + register_component(name, std::make_unique()); + } + }; + + template + static T* get() + { + for (const auto& component_ : get_components()) + { + if (typeid(*component_.get()) == typeid(T)) + { + return reinterpret_cast(component_.get()); + } + } + + return nullptr; + } + + static void register_component(const std::string& name, std::unique_ptr&& component); + + static void on_startup(); + static void on_dvar_init(); + static void on_after_dvar_init(); + static void on_shutdown(); + static void clean(); + + static void* load_import(const std::string& library, const std::string& function); + + static void trigger_premature_shutdown(); + +private: + static std::vector>>& get_components(); +}; + +#define REGISTER_COMPONENT(name) \ +namespace \ +{ \ + static component_loader::installer __component(#name); \ +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/plugin.cpp b/t6/plugins/tws-t6-gsc-utils/src/plugin.cpp new file mode 100644 index 0000000..57a035e --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/plugin.cpp @@ -0,0 +1,79 @@ +#include +#include "loader/component_loader.hpp" + +#include "component/logfile.hpp" + +#include "plugin.hpp" + +#include +#include + +namespace plugin +{ + namespace + { + void printf_stub(const char* fmt, ...) + { + char buffer[0x2000] = {}; + + va_list ap; + va_start(ap, fmt); + + vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, fmt, ap); + + va_end(ap); + + logfile::log_hook(buffer); + + const auto trimmed = utils::string::trim(buffer); + get()->get_interface()->logging()->info(trimmed); + } + } + + std::uint32_t plugin::plugin_version() + { + return 1; + } + + const char* plugin::plugin_name() + { + return "tws-t6-gsc-utils"; + } + + bool plugin::is_game_supported([[maybe_unused]] plutonium::sdk::game game) + { + return game == plutonium::sdk::game::t6; + } + + void plugin::on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) + { + this->interface_ = interface_ptr; + this->game_ = game; + utils::hook::jump(reinterpret_cast(&printf), printf_stub); + + component_loader::on_startup(); + interface_ptr->callbacks()->on_dvar_init(&component_loader::on_dvar_init); + interface_ptr->callbacks()->on_after_dvar_init(&component_loader::on_after_dvar_init); + } + + void plugin::on_shutdown() + { + component_loader::on_shutdown(); + } + + plutonium::sdk::iinterface* plugin::get_interface() + { + return this->interface_; + } + + plutonium::sdk::game plugin::get_game() + { + return this->game_; + } + + plugin* get() + { + static plugin instance; + return &instance; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/plugin.hpp b/t6/plugins/tws-t6-gsc-utils/src/plugin.hpp new file mode 100644 index 0000000..3d18d09 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/plugin.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +namespace plugin +{ + class plugin : public plutonium::sdk::plugin + { + public: + ~plugin() = default; + + std::uint32_t plugin_version() override; + const char* plugin_name() override; + + bool is_game_supported([[maybe_unused]] plutonium::sdk::game game) override; + + void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override; + void on_shutdown() override; + + plutonium::sdk::iinterface* get_interface(); + plutonium::sdk::game get_game(); + + private: + plutonium::sdk::iinterface* interface_{}; + plutonium::sdk::game game_{}; + + }; + + plugin* get(); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/resource.hpp b/t6/plugins/tws-t6-gsc-utils/src/resource.hpp new file mode 100644 index 0000000..beabe45 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/resource.hpp @@ -0,0 +1,3 @@ +#pragma once + +#define LIBMYSQL_DLL 100 diff --git a/t6/plugins/tws-t6-gsc-utils/src/resource.rc b/t6/plugins/tws-t6-gsc-utils/src/resource.rc new file mode 100644 index 0000000..335da49 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/resource.rc @@ -0,0 +1,3 @@ +#include "resource.hpp" + +LIBMYSQL_DLL RCDATA "../../deps/mysql/lib/libmysql.dll" diff --git a/t6/plugins/tws-t6-gsc-utils/src/stdinc.cpp b/t6/plugins/tws-t6-gsc-utils/src/stdinc.cpp new file mode 100644 index 0000000..f7991bd --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/stdinc.cpp @@ -0,0 +1,25 @@ +#include + +extern "C" +{ + int s_read_arc4random(void*, size_t) + { + return -1; + } + + int s_read_getrandom(void*, size_t) + { + return -1; + } + + int s_read_urandom(void*, size_t) + { + return -1; + } + + int s_read_ltm_rng(void*, size_t) + { + return -1; + } +} + diff --git a/t6/plugins/tws-t6-gsc-utils/src/stdinc.hpp b/t6/plugins/tws-t6-gsc-utils/src/stdinc.hpp new file mode 100644 index 0000000..1c7c340 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/stdinc.hpp @@ -0,0 +1,63 @@ +#pragma once + +#pragma warning(disable: 6011) +#pragma warning(disable: 6054) +#pragma warning(disable: 6387) +#pragma warning(disable: 26451) +#pragma warning(disable: 26812) +#pragma warning(disable: 28182) + +#define DLL_EXPORT extern "C" __declspec(dllexport) +#define WIN32_LEAN_AND_MEAN +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#include +#include + +#include + +#include +#include + +#pragma comment(lib, "ntdll.lib") +#pragma comment(lib, "ws2_32.lib") +#pragma comment(lib, "urlmon.lib" ) +#pragma comment(lib, "iphlpapi.lib") +#pragma comment(lib, "Crypt32.lib") +#pragma comment(lib, "libmysql.lib") +#pragma comment(lib, "delayimp.lib") + +#include "resource.hpp" + +using namespace std::literals; diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.cpp new file mode 100644 index 0000000..4eb5e6c --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.cpp @@ -0,0 +1,76 @@ +#include +#include "binary_resource.hpp" + +#include +#include "nt.hpp" +#include "io.hpp" + +namespace utils +{ + namespace + { + std::string get_temp_folder() + { + char path[MAX_PATH] = {0}; + if (!GetTempPathA(sizeof(path), path)) + { + throw std::runtime_error("Unable to get temp path"); + } + + return path; + } + + std::string write_exitisting_temp_file(const std::string& file, const std::string& data, + const bool fatal_if_overwrite_fails) + { + const auto temp = get_temp_folder(); + auto file_path = temp + file; + + std::string current_data; + if (!io::read_file(file_path, ¤t_data)) + { + if (!io::write_file(file_path, data)) + { + throw std::runtime_error("Failed to write file: " + file_path); + } + + return file_path; + } + + if (current_data == data || io::write_file(file_path, data) || !fatal_if_overwrite_fails) + { + return file_path; + } + + throw std::runtime_error( + "Temporary file was already written, but differs. It can't be overwritten as it's still in use: " + + file_path); + } + } + + binary_resource::binary_resource(const int id, std::string file) + : filename_(std::move(file)) + { + this->resource_ = nt::load_resource(id); + + if (this->resource_.empty()) + { + throw std::runtime_error("Unable to load resource: " + std::to_string(id)); + } + } + + std::string binary_resource::get_extracted_file(const bool fatal_if_overwrite_fails) + { + if (this->path_.empty()) + { + this->path_ = write_exitisting_temp_file(this->filename_, this->resource_, fatal_if_overwrite_fails); + } + + return this->path_; + } + + const std::string& binary_resource::get_data() const + { + return this->resource_; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.hpp new file mode 100644 index 0000000..da19af1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/binary_resource.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +namespace utils +{ + class binary_resource + { + public: + binary_resource(int id, std::string file); + + std::string get_extracted_file(bool fatal_if_overwrite_fails = false); + const std::string& get_data() const; + + private: + std::string resource_; + std::string filename_; + std::string path_; + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/compression.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/compression.cpp new file mode 100644 index 0000000..3a6b9e2 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/compression.cpp @@ -0,0 +1,170 @@ +#include +#include "memory.hpp" +#include "compression.hpp" + +#include +#include + +#include + +#include "io.hpp" + +namespace utils::compression +{ + namespace zlib + { + namespace + { + class zlib_stream + { + public: + zlib_stream() + { + memset(&stream_, 0, sizeof(stream_)); + valid_ = inflateInit(&stream_) == Z_OK; + } + + zlib_stream(zlib_stream&&) = delete; + zlib_stream(const zlib_stream&) = delete; + zlib_stream& operator=(zlib_stream&&) = delete; + zlib_stream& operator=(const zlib_stream&) = delete; + + ~zlib_stream() + { + if (valid_) + { + inflateEnd(&stream_); + } + } + + z_stream& get() + { + return stream_; // + } + + bool is_valid() const + { + return valid_; + } + + private: + bool valid_{false}; + z_stream stream_{}; + }; + } + + std::string decompress(const std::string& data) + { + std::string buffer{}; + zlib_stream stream_container{}; + if (!stream_container.is_valid()) + { + return {}; + } + + int ret{}; + size_t offset = 0; + static thread_local uint8_t dest[CHUNK] = {0}; + auto& stream = stream_container.get(); + + do + { + const auto input_size = std::min(sizeof(dest), data.size() - offset); + stream.avail_in = static_cast(input_size); + stream.next_in = reinterpret_cast(data.data()) + offset; + offset += stream.avail_in; + + do + { + stream.avail_out = sizeof(dest); + stream.next_out = dest; + + ret = inflate(&stream, Z_NO_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) + { + return {}; + } + + buffer.insert(buffer.end(), dest, dest + sizeof(dest) - stream.avail_out); + } + while (stream.avail_out == 0); + } + while (ret != Z_STREAM_END); + + return buffer; + } + + std::string compress(const std::string& data) + { + std::string result{}; + auto length = compressBound(static_cast(data.size())); + result.resize(length); + + if (compress2(reinterpret_cast(result.data()), &length, + reinterpret_cast(data.data()), static_cast(data.size()), + Z_BEST_COMPRESSION) != Z_OK) + { + return {}; + } + + result.resize(length); + return result; + } + } + + namespace zip + { + namespace + { + bool add_file(zipFile& zip_file, const std::string& filename, const std::string& data) + { + const auto zip_64 = data.size() > 0xffffffff ? 1 : 0; + if (ZIP_OK != zipOpenNewFileInZip64(zip_file, filename.data(), nullptr, nullptr, 0, nullptr, 0, nullptr, + Z_DEFLATED, Z_BEST_COMPRESSION, zip_64)) + { + return false; + } + + const auto _ = gsl::finally([&zip_file]() + { + zipCloseFileInZip(zip_file); + }); + + return ZIP_OK == zipWriteInFileInZip(zip_file, data.data(), static_cast(data.size())); + } + } + + void archive::add(std::string filename, std::string data) + { + this->files_[std::move(filename)] = std::move(data); + } + + bool archive::write(const std::string& filename, const std::string& comment) + { + // Hack to create the directory :3 + io::write_file(filename, {}); + io::remove_file(filename); + + auto* zip_file = zipOpen64(filename.data(), 0); + if (!zip_file) + { + return false; + } + + const auto _ = gsl::finally([&zip_file, &comment]() + { + zipClose(zip_file, comment.empty() ? nullptr : comment.data()); + }); + + for (const auto& file : this->files_) + { + if (!add_file(zip_file, file.first, file.second)) + { + return false; + } + } + + return true; + } + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/compression.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/compression.hpp new file mode 100644 index 0000000..dfe36ad --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/compression.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +#define CHUNK 16384u + +namespace utils::compression +{ + namespace zlib + { + std::string compress(const std::string& data); + std::string decompress(const std::string& data); + } + + namespace zip + { + class archive + { + public: + void add(std::string filename, std::string data); + bool write(const std::string& filename, const std::string& comment = {}); + + private: + std::unordered_map files_; + }; + } +}; diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/concurrency.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/concurrency.hpp new file mode 100644 index 0000000..05c5d3a --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/concurrency.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include + +namespace utils::concurrency +{ + template + class container + { + public: + template + R access(F&& accessor) const + { + std::lock_guard _{mutex_}; + return accessor(object_); + } + + template + R access(F&& accessor) + { + std::lock_guard _{mutex_}; + return accessor(object_); + } + + template + R access_with_lock(F&& accessor) const + { + std::unique_lock lock{mutex_}; + return accessor(object_, lock); + } + + template + R access_with_lock(F&& accessor) + { + std::unique_lock lock{mutex_}; + return accessor(object_, lock); + } + + T& get_raw() { return object_; } + const T& get_raw() const { return object_; } + + private: + mutable MutexType mutex_{}; + T object_{}; + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.cpp new file mode 100644 index 0000000..debac67 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.cpp @@ -0,0 +1,686 @@ +#include + +#include "cryptography.hpp" +#include "nt.hpp" +#include + +#undef max +using namespace std::string_literals; + +/// http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-55010/Source/libtomcrypt/doc/libTomCryptDoc.pdf + +namespace utils::cryptography +{ + namespace + { + struct __ + { + __() + { + ltc_mp = ltm_desc; + + register_cipher(&aes_desc); + register_cipher(&des3_desc); + + register_prng(&sprng_desc); + register_prng(&fortuna_desc); + register_prng(&yarrow_desc); + + register_hash(&sha1_desc); + register_hash(&sha256_desc); + register_hash(&sha512_desc); + } + } ___; + + [[maybe_unused]] const char* cs(const uint8_t* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] char* cs(uint8_t* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] const uint8_t* cs(const char* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] uint8_t* cs(char* data) + { + return reinterpret_cast(data); + } + + [[maybe_unused]] unsigned long ul(const size_t value) + { + return static_cast(value); + } + + class prng + { + public: + prng(const ltc_prng_descriptor& descriptor, const bool autoseed = true) + : state_(std::make_unique()) + , descriptor_(descriptor) + { + this->id_ = register_prng(&descriptor); + if (this->id_ == -1) + { + throw std::runtime_error("PRNG "s + this->descriptor_.name + " could not be registered!"); + } + + if (autoseed) + { + this->auto_seed(); + } + else + { + this->descriptor_.start(this->state_.get()); + } + } + + ~prng() + { + this->descriptor_.done(this->state_.get()); + } + + prng_state* get_state() const + { + this->descriptor_.ready(this->state_.get()); + return this->state_.get(); + } + + int get_id() const + { + return this->id_; + } + + void add_entropy(const void* data, const size_t length) const + { + this->descriptor_.add_entropy(static_cast(data), ul(length), this->state_.get()); + } + + void read(void* data, const size_t length) const + { + this->descriptor_.read(static_cast(data), ul(length), this->get_state()); + } + + private: + int id_; + std::unique_ptr state_; + const ltc_prng_descriptor& descriptor_; + + void auto_seed() const + { + rng_make_prng(128, this->id_, this->state_.get(), nullptr); + + int i[4]; // uninitialized data + auto* i_ptr = &i; + this->add_entropy(reinterpret_cast(&i), sizeof(i)); + this->add_entropy(reinterpret_cast(&i_ptr), sizeof(i_ptr)); + + auto t = time(nullptr); + this->add_entropy(reinterpret_cast(&t), sizeof(t)); + } + }; + + const prng prng_(fortuna_desc); + } + + ecc::key::key() + { + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + + ecc::key::~key() + { + this->free(); + } + + ecc::key::key(key&& obj) noexcept + : key() + { + this->operator=(std::move(obj)); + } + + ecc::key::key(const key& obj) + : key() + { + this->operator=(obj); + } + + ecc::key& ecc::key::operator=(key&& obj) noexcept + { + if (this != &obj) + { + std::memmove(&this->key_storage_, &obj.key_storage_, sizeof(this->key_storage_)); + ZeroMemory(&obj.key_storage_, sizeof(obj.key_storage_)); + } + + return *this; + } + + ecc::key& ecc::key::operator=(const key& obj) + { + if (this != &obj && obj.is_valid()) + { + this->deserialize(obj.serialize(obj.key_storage_.type)); + } + + return *this; + } + + bool ecc::key::is_valid() const + { + return (!memory::is_set(&this->key_storage_, 0, sizeof(this->key_storage_))); + } + + ecc_key& ecc::key::get() + { + return this->key_storage_; + } + + const ecc_key& ecc::key::get() const + { + return this->key_storage_; + } + + std::string ecc::key::get_public_key() const + { + uint8_t buffer[512] = {0}; + unsigned long length = sizeof(buffer); + + if (ecc_ansi_x963_export(&this->key_storage_, buffer, &length) == CRYPT_OK) + { + return std::string(cs(buffer), length); + } + + return {}; + } + + void ecc::key::set(const std::string& pub_key_buffer) + { + this->free(); + + if (ecc_ansi_x963_import(cs(pub_key_buffer.data()), + ul(pub_key_buffer.size()), + &this->key_storage_) != CRYPT_OK) + { + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + } + + void ecc::key::deserialize(const std::string& key) + { + this->free(); + + if (ecc_import(cs(key.data()), ul(key.size()), + &this->key_storage_) != CRYPT_OK + ) + { + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + } + + std::string ecc::key::serialize(const int type) const + { + uint8_t buffer[4096] = {0}; + unsigned long length = sizeof(buffer); + + if (ecc_export(buffer, &length, type, &this->key_storage_) == CRYPT_OK) + { + return std::string(cs(buffer), length); + } + + return ""; + } + + void ecc::key::free() + { + if (this->is_valid()) + { + ecc_free(&this->key_storage_); + } + + ZeroMemory(&this->key_storage_, sizeof(this->key_storage_)); + } + + bool ecc::key::operator==(key& key) const + { + return (this->is_valid() && key.is_valid() && this->serialize(PK_PUBLIC) == key.serialize(PK_PUBLIC)); + } + + uint64_t ecc::key::get_hash() const + { + const auto hash = sha1::compute(this->get_public_key()); + if (hash.size() >= 8) + { + return *reinterpret_cast(hash.data()); + } + + return 0; + } + + ecc::key ecc::generate_key(const int bits) + { + key key; + ecc_make_key(prng_.get_state(), prng_.get_id(), bits / 8, &key.get()); + + return key; + } + + ecc::key ecc::generate_key(const int bits, const std::string& entropy) + { + key key{}; + const prng yarrow(yarrow_desc, false); + yarrow.add_entropy(entropy.data(), entropy.size()); + + ecc_make_key(yarrow.get_state(), yarrow.get_id(), bits / 8, &key.get()); + + return key; + } + + std::string ecc::sign_message(const key& key, const std::string& message) + { + if (!key.is_valid()) return ""; + + uint8_t buffer[512]; + unsigned long length = sizeof(buffer); + + ecc_sign_hash(cs(message.data()), ul(message.size()), buffer, &length, prng_.get_state(), prng_.get_id(), + &key.get()); + + return std::string(cs(buffer), length); + } + + bool ecc::verify_message(const key& key, const std::string& message, const std::string& signature) + { + if (!key.is_valid()) return false; + + auto result = 0; + return (ecc_verify_hash(cs(signature.data()), + ul(signature.size()), + cs(message.data()), + ul(message.size()), &result, + &key.get()) == CRYPT_OK && result != 0); + } + + bool ecc::encrypt(const key& key, std::string& data) + { + std::string out_data{}; + out_data.resize(std::max(ul(data.size() * 3), ul(0x100))); + + auto out_len = ul(out_data.size()); + auto crypt = [&]() + { + return ecc_encrypt_key(cs(data.data()), ul(data.size()), cs(out_data.data()), &out_len, + prng_.get_state(), prng_.get_id(), find_hash("sha512"), &key.get()); + }; + + auto res = crypt(); + + if (res == CRYPT_BUFFER_OVERFLOW) + { + out_data.resize(out_len); + res = crypt(); + } + + if (res != CRYPT_OK) + { + return false; + } + + out_data.resize(out_len); + data = std::move(out_data); + return true; + } + + bool ecc::decrypt(const key& key, std::string& data) + { + std::string out_data{}; + out_data.resize(std::max(ul(data.size() * 3), ul(0x100))); + + auto out_len = ul(out_data.size()); + auto crypt = [&]() + { + return ecc_decrypt_key(cs(data.data()), ul(data.size()), cs(out_data.data()), &out_len, &key.get()); + }; + + auto res = crypt(); + + if (res == CRYPT_BUFFER_OVERFLOW) + { + out_data.resize(out_len); + res = crypt(); + } + + if (res != CRYPT_OK) + { + return false; + } + + out_data.resize(out_len); + data = std::move(out_data); + return true; + } + + std::string rsa::encrypt(const std::string& data, const std::string& hash, const std::string& key) + { + rsa_key new_key; + rsa_import(cs(key.data()), ul(key.size()), &new_key); + const auto _ = gsl::finally([&]() + { + rsa_free(&new_key); + }); + + + std::string out_data{}; + out_data.resize(std::max(ul(data.size() * 3), ul(0x100))); + + auto out_len = ul(out_data.size()); + auto crypt = [&]() + { + return rsa_encrypt_key(cs(data.data()), ul(data.size()), cs(out_data.data()), &out_len, cs(hash.data()), + ul(hash.size()), prng_.get_state(), prng_.get_id(), find_hash("sha512"), &new_key); + }; + + auto res = crypt(); + + if (res == CRYPT_BUFFER_OVERFLOW) + { + out_data.resize(out_len); + res = crypt(); + } + + if (res == CRYPT_OK) + { + out_data.resize(out_len); + return out_data; + } + + return {}; + } + + std::string des3::encrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string enc_data; + enc_data.resize(data.size()); + + symmetric_CBC cbc; + const auto des3 = find_cipher("3des"); + + cbc_start(des3, cs(iv.data()), cs(key.data()), static_cast(key.size()), 0, &cbc); + cbc_encrypt(cs(data.data()), cs(enc_data.data()), ul(data.size()), &cbc); + cbc_done(&cbc); + + return enc_data; + } + + std::string des3::decrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string dec_data; + dec_data.resize(data.size()); + + symmetric_CBC cbc; + const auto des3 = find_cipher("3des"); + + cbc_start(des3, cs(iv.data()), cs(key.data()), static_cast(key.size()), 0, &cbc); + cbc_decrypt(cs(data.data()), cs(dec_data.data()), ul(data.size()), &cbc); + cbc_done(&cbc); + + return dec_data; + } + + std::string tiger::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string tiger::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[24] = {0}; + + hash_state state; + tiger_init(&state); + tiger_process(&state, data, ul(length)); + tiger_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + std::string aes::encrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string aligned_data = data; + const auto mod = aligned_data.size() % 16; + if (mod != 0) + { + aligned_data.resize(aligned_data.size() + (16 - mod)); + } + + std::string enc_data; + enc_data.resize(aligned_data.size()); + + symmetric_CBC cbc; + const auto aes = find_cipher("aes"); + + cbc_start(aes, cs(iv.data()), cs(key.data()), + static_cast(key.size()), 0, &cbc); + cbc_encrypt(cs(aligned_data.data()), + cs(enc_data.data()), + ul(aligned_data.size()), &cbc); + cbc_done(&cbc); + + return enc_data; + } + + std::string aes::decrypt(const std::string& data, const std::string& iv, const std::string& key) + { + std::string dec_data; + dec_data.resize(data.size()); + + symmetric_CBC cbc; + const auto aes = find_cipher("aes"); + + cbc_start(aes, cs(iv.data()), cs(key.data()), + static_cast(key.size()), 0, &cbc); + cbc_decrypt(cs(data.data()), + cs(dec_data.data()), + ul(data.size()), &cbc); + cbc_done(&cbc); + + return dec_data; + } + + std::string hmac_sha1::compute(const std::string& data, const std::string& key) + { + std::string buffer; + buffer.resize(20); + + hmac_state state; + hmac_init(&state, find_hash("sha1"), cs(key.data()), ul(key.size())); + hmac_process(&state, cs(data.data()), static_cast(data.size())); + + auto out_len = ul(buffer.size()); + hmac_done(&state, cs(buffer.data()), &out_len); + + buffer.resize(out_len); + return buffer; + } + + std::string sha1::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string sha1::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[20] = {0}; + + hash_state state; + sha1_init(&state); + sha1_process(&state, data, ul(length)); + sha1_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + std::string sha256::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string sha256::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[32] = {0}; + + hash_state state; + sha256_init(&state); + sha256_process(&state, data, ul(length)); + sha256_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + std::string sha512::compute(const std::string& data, const bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string sha512::compute(const uint8_t* data, const size_t length, const bool hex) + { + uint8_t buffer[64] = {0}; + + hash_state state; + sha512_init(&state); + sha512_process(&state, data, ul(length)); + sha512_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + + namespace md5 + { + std::string compute(const std::string& data, bool hex) + { + return compute(cs(data.data()), data.size(), hex); + } + + std::string compute(const uint8_t* data, size_t length, bool hex) + { + uint8_t buffer[16] = {0}; + + hash_state state; + md5_init(&state); + md5_process(&state, data, ul(length)); + md5_done(&state, buffer); + + std::string hash(cs(buffer), sizeof(buffer)); + if (!hex) return hash; + + return string::dump_hex(hash, ""); + } + } + + std::string base64::encode(const uint8_t* data, const size_t len) + { + std::string result; + result.resize((len + 2) * 2); + + auto out_len = ul(result.size()); + if (base64_encode(data, ul(len), result.data(), &out_len) != CRYPT_OK) + { + return {}; + } + + result.resize(out_len); + return result; + } + + std::string base64::encode(const std::string& data) + { + return base64::encode(cs(data.data()), static_cast(data.size())); + } + + std::string base64::decode(const std::string& data) + { + std::string result; + result.resize((data.size() + 2) * 2); + + auto out_len = ul(result.size()); + if (base64_decode(data.data(), ul(data.size()), cs(result.data()), &out_len) != CRYPT_OK) + { + return {}; + } + + result.resize(out_len); + return result; + } + + unsigned int jenkins_one_at_a_time::compute(const std::string& data) + { + return compute(data.data(), data.size()); + } + + unsigned int jenkins_one_at_a_time::compute(const char* key, const size_t len) + { + unsigned int hash, i; + for (hash = i = 0; i < len; ++i) + { + hash += key[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; + } + + uint32_t random::get_integer() + { + uint32_t result; + random::get_data(&result, sizeof(result)); + return result; + } + + uint32_t random::get_integer(const std::uint32_t min, const std::uint32_t max) + { + const auto range = max - min + 1; + const auto value = random::get_integer(); + return value % range + min; + } + + std::string random::get_challenge() + { + std::string result; + result.resize(sizeof(uint32_t)); + random::get_data(result.data(), result.size()); + return string::dump_hex(result, ""); + } + + void random::get_data(void* data, const size_t size) + { + prng_.read(data, size); + } + + std::string random::get_data(const size_t size) + { + std::string data; + data.resize(size); + random::get_data(data.data(), size); + return data; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.hpp new file mode 100644 index 0000000..01409a7 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/cryptography.hpp @@ -0,0 +1,151 @@ +#pragma once + +#include +#include +#include "string.hpp" + +namespace utils::cryptography +{ + namespace ecc + { + class key final + { + public: + key(); + ~key(); + + key(key&& obj) noexcept; + key(const key& obj); + key& operator=(key&& obj) noexcept; + key& operator=(const key& obj); + + bool is_valid() const; + + ecc_key& get(); + const ecc_key& get() const; + + std::string get_public_key() const; + + void set(const std::string& pub_key_buffer); + + void deserialize(const std::string& key); + + std::string serialize(int type = PK_PRIVATE) const; + + void free(); + + bool operator==(key& key) const; + + uint64_t get_hash() const; + + private: + ecc_key key_storage_{}; + }; + + key generate_key(int bits); + key generate_key(int bits, const std::string& entropy); + std::string sign_message(const key& key, const std::string& message); + bool verify_message(const key& key, const std::string& message, const std::string& signature); + + bool encrypt(const key& key, std::string& data); + bool decrypt(const key& key, std::string& data); + } + + namespace rsa + { + std::string encrypt(const std::string& data, const std::string& hash, const std::string& key); + std::string decrypt(const std::string& data, const std::string& hash, const std::string& key); + } + + namespace des3 + { + std::string encrypt(const std::string& data, const std::string& iv, const std::string& key); + std::string decrypt(const std::string& data, const std::string& iv, const std::string& key); + } + + namespace tiger + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace aes + { + std::string encrypt(const std::string& data, const std::string& iv, const std::string& key); + std::string decrypt(const std::string& data, const std::string& iv, const std::string& key); + } + + namespace hmac_sha1 + { + std::string compute(const std::string& data, const std::string& key); + } + + namespace sha1 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace sha256 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace sha512 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace md5 + { + std::string compute(const std::string& data, bool hex = false); + std::string compute(const uint8_t* data, size_t length, bool hex = false); + } + + namespace argon2 + { + template + std::string compute(const std::string& data, bool hex = false) + { + std::uint8_t buffer[HashLen]{}; + std::uint8_t salt[SaltLen]{}; + + argon2i_hash_raw(TCost, MCost, Threads, data.data(), data.size(), salt, SaltLen, buffer, HashLen); + + const auto str = std::string{reinterpret_cast(buffer), HashLen}; + if (hex) + { + return string::dump_hex(str, "", false); + } + else + { + return str; + } + } + } + + namespace base64 + { + std::string encode(const uint8_t* data, size_t len); + std::string encode(const std::string& data); + std::string decode(const std::string& data); + } + + namespace jenkins_one_at_a_time + { + unsigned int compute(const std::string& data); + unsigned int compute(const char* key, size_t len); + }; + + namespace random + { + uint32_t get_integer(); + uint32_t get_integer(const std::uint32_t min, const std::uint32_t max); + std::string get_challenge(); + void get_data(void* data, size_t size); + std::string get_data(const size_t size); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.cpp new file mode 100644 index 0000000..47eb4a0 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.cpp @@ -0,0 +1,160 @@ +#include +#include + +#include "string.hpp" +#include "file_watcher.hpp" + +namespace utils::io +{ + file_watcher::file_watcher(const std::string& path) + { + this->path_ = path; + const auto pos = this->path_.find_last_of("/\\"); + if (pos != std::string::npos) + { + this->filename_ = path.substr(pos + 1); + } + else + { + this->filename_ = path; + } + } + + file_watcher::~file_watcher() + { +#ifdef WIN32 + const auto close = [](HANDLE handle) + { + if (handle != NULL && handle != INVALID_HANDLE_VALUE) + { + CloseHandle(handle); + } + }; + + close(this->handle_); + close(this->event_handle_); + close(this->stop_handle_); +#endif + } + + bool file_watcher::init() + { +#ifdef WIN32 + std::string folder{}; + const auto pos = this->path_.find_last_of("/\\"); + if (pos != std::string::npos) + { + folder = this->path_.substr(0, pos); + } + + this->handle_ = CreateFile( + folder.data(), + FILE_LIST_DIRECTORY, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, + NULL + ); + this->event_handle_ = CreateEvent(NULL, TRUE, FALSE, NULL); + this->stop_handle_ = CreateEvent(NULL, TRUE, FALSE, NULL); + + const auto is_valid = [](HANDLE handle) + { + return handle != NULL && handle != INVALID_HANDLE_VALUE; + }; + + if (!is_valid(this->event_handle_) || + !is_valid(this->handle_ ) || + !is_valid(this->stop_handle_)) + { + return false; + } + + this->stream_ = std::ifstream{this->path_, std::ios::binary}; + this->stream_.seekg(0, std::ios::end); + this->current_pos_ = static_cast(this->stream_.tellg()); + + return true; +#endif + } + + bool file_watcher::run(int wait_time, std::string* data, bool force_check) + { +#ifdef WIN32 + this->stop_ = false; + + char buffer[0x1000] = {0}; + OVERLAPPED overlapped = {}; + overlapped.hEvent = this->event_handle_; + + ReadDirectoryChangesW(this->handle_, buffer, sizeof(buffer), + FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, NULL, &overlapped, NULL); + + HANDLE handles[2] = + { + this->event_handle_, + this->stop_handle_ + }; + + WaitForMultipleObjects(2, handles, FALSE, wait_time); + if (this->stop_) + { + return false; + } + + const auto info = reinterpret_cast(buffer); + const auto filename = utils::string::convert(info->FileName); + + if (!force_check && (filename != this->filename_ || (info->Action & FILE_GENERIC_WRITE) == 0)) + { + return false; + } + + this->stream_.seekg(0, std::ios::end); + const auto new_size = static_cast(this->stream_.tellg()); + + if (new_size < this->current_pos_) + { + this->current_pos_ = new_size; + return false; + } + + const auto bytes_written = new_size - this->current_pos_; + if (bytes_written == 0) + { + return false; + } + + this->stream_.seekg(-1 * static_cast(bytes_written), std::ios::cur); + this->current_pos_ += bytes_written; + + data->resize(bytes_written); + this->stream_.read(const_cast(data->data()), bytes_written); + return true; +#endif + } + + bool file_watcher::run_blocking(std::string* data, bool force_check) + { +#ifdef WIN32 + return this->run(INFINITE, data, force_check); +#endif + } + + bool file_watcher::run(const std::chrono::high_resolution_clock::duration& wait_time, std::string* data, bool force_check) + { +#ifdef WIN32 + const auto msec = static_cast(std::chrono::duration_cast(wait_time).count()); + return this->run(msec, data, force_check); +#endif + } + + void file_watcher::stop() + { + this->stop_ = true; +#ifdef WIN32 + SetEvent(this->stop_handle_); +#endif + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.hpp new file mode 100644 index 0000000..86dd2ca --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/file_watcher.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +namespace utils::io +{ + class file_watcher + { + public: + file_watcher(const std::string& path); + + file_watcher(file_watcher&&) noexcept = delete; + file_watcher& operator=(file_watcher&&) noexcept = delete; + + file_watcher(const file_watcher&) = delete; + file_watcher& operator=(const file_watcher&) = delete; + + ~file_watcher(); + + bool init(); + bool run(int wait_time, std::string* data, bool force_check); + bool run(const std::chrono::high_resolution_clock::duration& wait_time, + std::string* data, bool force_check = false); + bool run_blocking(std::string* data, bool force_check = false); + void stop(); + + private: + std::string path_{}; + std::string filename_{}; + + std::ifstream stream_{}; + size_t current_pos_{}; + +#ifdef WIN32 + HANDLE handle_{}; + HANDLE event_handle_{}; + HANDLE stop_handle_{}; +#endif + + bool stop_{}; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/flags.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/flags.cpp new file mode 100644 index 0000000..9d467f4 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/flags.cpp @@ -0,0 +1,54 @@ +#include + +#include "flags.hpp" +#include "string.hpp" + +#include + +namespace utils::flags +{ + void parse_flags(std::vector& flags) + { + int num_args; + auto* const argv = CommandLineToArgvW(GetCommandLineW(), &num_args); + + flags.clear(); + + if (argv) + { + for (auto i = 0; i < num_args; ++i) + { + std::wstring wide_flag(argv[i]); + if (wide_flag[0] == L'-') + { + wide_flag.erase(wide_flag.begin()); + flags.emplace_back(string::convert(wide_flag)); + } + } + + LocalFree(argv); + } + } + + bool has_flag(const std::string& flag) + { + static auto parsed = false; + static std::vector enabled_flags; + + if (!parsed) + { + parse_flags(enabled_flags); + parsed = true; + } + + for (const auto& entry : enabled_flags) + { + if (string::to_lower(entry) == string::to_lower(flag)) + { + return true; + } + } + + return false; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/flags.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/flags.hpp new file mode 100644 index 0000000..7f09cae --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/flags.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace utils::flags +{ + bool has_flag(const std::string& flag); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/hook.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/hook.cpp new file mode 100644 index 0000000..7248bec --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/hook.cpp @@ -0,0 +1,247 @@ +#include +#include "hook.hpp" +#include "string.hpp" +// iw6x-client + +namespace utils::hook +{ + void signature::process() + { + if (this->signatures_.empty()) return; + + const auto start = static_cast(this->start_); + + const unsigned int sig_count = this->signatures_.size(); + const auto containers = this->signatures_.data(); + + for (size_t i = 0; i < this->length_; ++i) + { + const auto address = start + i; + + for (unsigned int k = 0; k < sig_count; ++k) + { + const auto container = &containers[k]; + + unsigned int j; + for (j = 0; j < static_cast(container->mask.size()); ++j) + { + if (container->mask[j] != '?' && container->signature[j] != address[j]) + { + break; + } + } + + if (j == container->mask.size()) + { + container->callback(address); + } + } + } + } + + void signature::add(const container& container) + { + signatures_.push_back(container); + } + + namespace + { + [[maybe_unused]] class _ + { + public: + _() + { + if (MH_Initialize() != MH_OK) + { + throw std::runtime_error("Failed to initialize MinHook"); + } + } + + ~_() + { + MH_Uninitialize(); + } + } __; + } + + asmjit::Error assembler::call(void* target) + { + return Assembler::call(size_t(target)); + } + + asmjit::Error assembler::jmp(void* target) + { + return Assembler::jmp(size_t(target)); + } + + detour::detour(const size_t place, void* target) : detour(reinterpret_cast(place), target) + { + } + + detour::detour(void* place, void* target) + { + this->create(place, target); + } + + detour::~detour() + { + this->clear(); + } + + void detour::enable() const + { + MH_EnableHook(this->place_); + } + + void detour::disable() const + { + MH_DisableHook(this->place_); + } + + void detour::create(void* place, void* target) + { + this->clear(); + this->place_ = place; + + if (MH_CreateHook(this->place_, target, &this->original_) != MH_OK) + { + throw std::runtime_error(string::va("Unable to create hook at location: %p", this->place_)); + } + + this->enable(); + } + + void detour::create(const size_t place, void* target) + { + this->create(reinterpret_cast(place), target); + } + + void detour::clear() + { + if (this->place_) + { + MH_RemoveHook(this->place_); + } + + this->place_ = nullptr; + this->original_ = nullptr; + } + + void* detour::get_original() const + { + return this->original_; + } + + void nop(void* place, const size_t length) + { + DWORD old_protect{}; + VirtualProtect(place, length, PAGE_EXECUTE_READWRITE, &old_protect); + + std::memset(place, 0x90, length); + + VirtualProtect(place, length, old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), place, length); + } + + void nop(const size_t place, const size_t length) + { + nop(reinterpret_cast(place), length); + } + + void copy(void* place, const void* data, const size_t length) + { + DWORD old_protect{}; + VirtualProtect(place, length, PAGE_EXECUTE_READWRITE, &old_protect); + + std::memmove(place, data, length); + + VirtualProtect(place, length, old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), place, length); + } + + void copy(const size_t place, const void* data, const size_t length) + { + copy(reinterpret_cast(place), data, length); + } + + bool is_relatively_far(const void* pointer, const void* data, int offset) + { + const int64_t diff = size_t(data) - (size_t(pointer) + offset); + const auto small_diff = int32_t(diff); + return diff != int64_t(small_diff); + } + + void call(void* pointer, void* data) + { + if (is_relatively_far(pointer, data)) + { + throw std::runtime_error("Too far away to create 32bit relative branch"); + } + + auto* patch_pointer = PBYTE(pointer); + set(patch_pointer, 0xE8); + set(patch_pointer + 1, int32_t(size_t(data) - (size_t(pointer) + 5))); + } + + void call(const size_t pointer, void* data) + { + return call(reinterpret_cast(pointer), data); + } + + void call(const size_t pointer, const size_t data) + { + return call(pointer, reinterpret_cast(data)); + } + + void set(std::uintptr_t address, std::vector&& bytes) + { + DWORD oldProtect = 0; + + auto* place = reinterpret_cast(address); + VirtualProtect(place, bytes.size(), PAGE_EXECUTE_READWRITE, &oldProtect); + memcpy(place, bytes.data(), bytes.size()); + VirtualProtect(place, bytes.size(), oldProtect, &oldProtect); + FlushInstructionCache(GetCurrentProcess(), place, bytes.size()); + } + + void set(std::uintptr_t address, void* buffer, size_t size) + { + DWORD oldProtect = 0; + + auto* place = reinterpret_cast(address); + VirtualProtect(place, size, PAGE_EXECUTE_READWRITE, &oldProtect); + memcpy(place, buffer, size); + VirtualProtect(place, size, oldProtect, &oldProtect); + FlushInstructionCache(GetCurrentProcess(), place, size); + } + + void jump(std::uintptr_t address, void* destination) + { + if (!address) return; + + std::uint8_t* bytes = new std::uint8_t[5]; + *bytes = 0xE9; + *reinterpret_cast(bytes + 1) = CalculateRelativeJMPAddress(address, destination); + + set(address, bytes, 5); + + delete[] bytes; + } + + void* assemble(const std::function& asm_function) + { + static asmjit::JitRuntime runtime; + + asmjit::CodeHolder code; + code.init(runtime.environment()); + + assembler a(&code); + + asm_function(a); + + void* result = nullptr; + runtime.add(&result, &code); + + return result; + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/hook.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/hook.hpp new file mode 100644 index 0000000..436bdc0 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/hook.hpp @@ -0,0 +1,177 @@ +#pragma once + +#define CalculateRelativeJMPAddress(X, Y) (((std::uintptr_t)Y - (std::uintptr_t)X) - 5) + +#include +#include + +using namespace asmjit::x86; + +namespace utils::hook +{ + class signature final + { + public: + struct container final + { + std::string signature; + std::string mask; + std::function callback; + }; + + signature(void* start, const size_t length) : start_(start), length_(length) + { + } + + signature(const DWORD start, const size_t length) : signature(reinterpret_cast(start), length) + { + } + + signature() : signature(0x400000, 0x800000) + { + } + + void process(); + void add(const container& container); + + private: + void* start_; + size_t length_; + std::vector signatures_; + }; + + class assembler : public Assembler + { + public: + using Assembler::Assembler; + using Assembler::call; + using Assembler::jmp; + + asmjit::Error call(void* target); + asmjit::Error jmp(void* target); + }; + + class detour + { + public: + detour() = default; + detour(void* place, void* target); + detour(size_t place, void* target); + ~detour(); + + detour(detour&& other) noexcept + { + this->operator=(std::move(other)); + } + + detour& operator= (detour&& other) noexcept + { + if (this != &other) + { + this->~detour(); + + this->place_ = other.place_; + this->original_ = other.original_; + + other.place_ = nullptr; + other.original_ = nullptr; + } + + return *this; + } + + detour(const detour&) = delete; + detour& operator= (const detour&) = delete; + + void enable() const; + void disable() const; + + void create(void* place, void* target); + void create(size_t place, void* target); + void clear(); + + template + T* get() const + { + return static_cast(this->get_original()); + } + + template + T invoke(Args... args) + { + return static_cast(this->get_original())(args...); + } + + template + T invoke_pascal(Args... args) + { + return static_cast(this->get_original())(args...); + } + + [[nodiscard]] void* get_original() const; + + private: + void* place_{}; + void* original_{}; + }; + + void nop(void* place, size_t length); + void nop(size_t place, size_t length); + + void copy(void* place, const void* data, size_t length); + void copy(size_t place, const void* data, size_t length); + + bool is_relatively_far(const void* pointer, const void* data, int offset = 5); + + void call(void* pointer, void* data); + void call(size_t pointer, void* data); + void call(size_t pointer, size_t data); + + void jump(std::uintptr_t address, void* destination); + + void* assemble(const std::function& asm_function); + + template + T extract(void* address) + { + const auto data = static_cast(address); + const auto offset = *reinterpret_cast(data); + return reinterpret_cast(data + offset + 4); + } + + template + T extract(const size_t address) + { + return extract(reinterpret_cast(address)); + } + + template + static void set(void* place, T value) + { + DWORD old_protect; + VirtualProtect(place, sizeof(T), PAGE_EXECUTE_READWRITE, &old_protect); + + *static_cast(place) = value; + + VirtualProtect(place, sizeof(T), old_protect, &old_protect); + FlushInstructionCache(GetCurrentProcess(), place, sizeof(T)); + } + + template + static void set(const size_t place, T value) + { + return set(reinterpret_cast(place), value); + } + + template + static T invoke(size_t func, Args... args) + { + return reinterpret_cast(func)(args...); + } + + template + static T invoke(void* func, Args... args) + { + return static_cast(func)(args...); + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/http.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/http.cpp new file mode 100644 index 0000000..42f8269 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/http.cpp @@ -0,0 +1,112 @@ +#ifdef _WIN32 +#include +#endif +#include "http.hpp" + +#include +#include + +#ifdef _WIN32 +#pragma comment(lib, "ws2_32.lib") +#endif + +namespace utils::http +{ + namespace + { + size_t write_callback(void* contents, const size_t size, const size_t nmemb, void* userp) noexcept + { + const auto buffer = static_cast(userp); + const auto total_size = size * nmemb; + try + { + buffer->append(static_cast(contents), total_size); + } + catch (...) + { + return 0; // Never unwind a C++ exception through libcurl. + } + return total_size; + } + + double timing_ms(CURL* curl, const CURLINFO info) + { + double seconds = 0; + curl_easy_getinfo(curl, info, &seconds); + return seconds * 1000.0; + } + } + + std::optional get_data(const std::string& url, const std::string& fields, + const headers& headers, const std::string& method, const timeouts& limits) + { + result response; + if (limits.connect_timeout_ms <= 0 || limits.timeout_ms <= 0) + { + response.code = CURLE_BAD_FUNCTION_ARGUMENT; + return response; + } + const std::unique_ptr handle(curl_easy_init(), curl_easy_cleanup); + const auto curl = handle.get(); + if (!curl) + { + return {}; + } + + std::unique_ptr header_list(nullptr, curl_slist_free_all); + + for (const auto& header : headers) + { + auto data = header.first + ": " + header.second; + const auto appended = curl_slist_append(header_list.get(), data.data()); + if (!appended) + { + response.code = CURLE_OUT_OF_MEMORY; + return response; + } + header_list.release(); + header_list.reset(appended); + } + + std::string buffer{}; + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list.get()); + curl_easy_setopt(curl, CURLOPT_URL, url.data()); + // Real native deadlines: a script-side wait limit cannot stop this transfer. + auto code = curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, limits.connect_timeout_ms); + if (code == CURLE_OK) + code = curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, limits.timeout_ms); + if (code != CURLE_OK) + { + response.code = code; + return response; + } + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); + + if (!fields.empty()) + { + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fields.data()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast(fields.size())); + } + + if (!method.empty()) + { + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, method.data()); + } + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); + + response.code = curl_easy_perform(curl); + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response.status); + response.dns_ms = timing_ms(curl, CURLINFO_NAMELOOKUP_TIME); + response.connect_ms = timing_ms(curl, CURLINFO_CONNECT_TIME); + response.tls_ms = timing_ms(curl, CURLINFO_APPCONNECT_TIME); + response.first_byte_ms = timing_ms(curl, CURLINFO_STARTTRANSFER_TIME); + response.total_ms = timing_ms(curl, CURLINFO_TOTAL_TIME); + if (response.code == CURLE_OK) + response.buffer = std::move(buffer); + return response; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/http.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/http.hpp new file mode 100644 index 0000000..c7d91f1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/http.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include +#include +#include + +#include + +namespace utils::http +{ + struct result + { + CURLcode code = CURLE_FAILED_INIT; + std::string buffer; + long status = 0; + // Cumulative milliseconds from the start of curl_easy_perform. + double dns_ms = 0; + double connect_ms = 0; + double tls_ms = 0; + double first_byte_ms = 0; + double total_ms = 0; + }; + + struct timeouts + { + long connect_timeout_ms = 5000; + long timeout_ms = 15000; + }; + + using headers = std::unordered_map; + + std::optional get_data(const std::string& url, const std::string& fields = {}, + const headers& headers = {}, const std::string& method = {}, const timeouts& limits = {}); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/info_string.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/info_string.cpp new file mode 100644 index 0000000..836ef07 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/info_string.cpp @@ -0,0 +1,67 @@ +#include + +#include "info_string.hpp" +#include "string.hpp" + +namespace utils +{ + info_string::info_string(const std::string& buffer) + { + this->parse(buffer); + } + + void info_string::set(const std::string& key, const std::string& value) + { + this->key_value_pairs_[key] = value; + } + + void info_string::remove(const std::string& key) + { + this->key_value_pairs_.erase(key); + } + + std::string info_string::get(const std::string& key) const + { + const auto value = this->key_value_pairs_.find(key); + if (value != this->key_value_pairs_.end()) + { + return value->second; + } + + return {}; + } + + void info_string::parse(std::string buffer) + { + if (buffer[0] == '\\') + { + buffer = buffer.substr(1); + } + + const auto key_values = string::split(buffer, '\\'); + for (size_t i = 0; !key_values.empty() && i < (key_values.size() - 1); i += 2) + { + const auto& key = key_values[i]; + const auto& value = key_values[i + 1]; + + if (!this->key_value_pairs_.contains(key)) + { + this->key_value_pairs_[key] = value; + } + } + } + + std::string info_string::build() const + { + std::string info_string; + for (const auto& [key, val] : this->key_value_pairs_) + { + info_string.append("\\"); + info_string.append(key); + info_string.append("\\"); + info_string.append(val); + } + + return info_string; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/info_string.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/info_string.hpp new file mode 100644 index 0000000..c1f09dd --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/info_string.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +namespace utils +{ + class info_string + { + public: + info_string() = default; + info_string(const std::string& buffer); + + void set(const std::string& key, const std::string& value); + void remove(const std::string& key); + + [[nodiscard]] std::string get(const std::string& key) const; + [[nodiscard]] std::string build() const; + + private: + std::unordered_map key_value_pairs_{}; + + void parse(std::string buffer); + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/io.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/io.cpp new file mode 100644 index 0000000..ff034b1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/io.cpp @@ -0,0 +1,136 @@ +#include +#include +#include "io.hpp" + +namespace utils::io +{ + bool remove_file(const std::string& file) + { + return DeleteFileA(file.data()) == TRUE; + } + + bool move_file(const std::string& src, const std::string& target) + { + return MoveFileA(src.data(), target.data()) == TRUE; + } + + bool file_exists(const std::string& file) + { + return std::ifstream(file).good(); + } + + bool write_file(const std::string& file, const std::string& data, const bool append) + { + const auto pos = file.find_last_of("/\\"); + if (pos != std::string::npos) + { + create_directory(file.substr(0, pos)); + } + + std::ofstream stream( + file, std::ios::binary | std::ofstream::out | (append ? std::ofstream::app : 0)); + + if (stream.is_open()) + { + stream.write(data.data(), data.size()); + stream.close(); + return true; + } + + return false; + } + + std::string read_file(const std::string& file) + { + std::string data; + read_file(file, &data); + return data; + } + + bool read_file(const std::string& file, std::string* data) + { + if (!data) return false; + data->clear(); + + if (file_exists(file)) + { + std::ifstream stream(file, std::ios::binary); + if (!stream.is_open()) return false; + + stream.seekg(0, std::ios::end); + const std::streamsize size = stream.tellg(); + stream.seekg(0, std::ios::beg); + + if (size > -1) + { + data->resize(static_cast(size)); + stream.read(const_cast(data->data()), size); + stream.close(); + return true; + } + } + + return false; + } + + size_t file_size(const std::string& file) + { + if (file_exists(file)) + { + std::ifstream stream(file, std::ios::binary); + + if (stream.good()) + { + stream.seekg(0, std::ios::end); + return static_cast(stream.tellg()); + } + } + + return 0; + } + + bool create_directory(const std::string& directory) + { + return std::filesystem::create_directories(directory); + } + + bool directory_exists(const std::string& directory) + { + return std::filesystem::is_directory(directory); + } + + bool directory_is_empty(const std::string& directory) + { + return std::filesystem::is_empty(directory); + } + + bool remove_directory(const std::string& directory, const bool recursive) + { + std::error_code ec; + + if (recursive) + { + std::uintmax_t n{ std::filesystem::remove_all(directory, ec) }; + return (n && (n != static_cast(-1))); // Why did they make it this way? + } + + return std::filesystem::remove(directory, ec); + } + + std::vector list_files(const std::string& directory) + { + std::vector files; + + for (auto& file : std::filesystem::directory_iterator(directory)) + { + files.push_back(file.path().generic_string()); + } + + return files; + } + + void copy_folder(const std::filesystem::path& src, const std::filesystem::path& target) + { + std::filesystem::copy(src, target, std::filesystem::copy_options::overwrite_existing | std::filesystem::copy_options::recursive); + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/io.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/io.hpp new file mode 100644 index 0000000..fcabd94 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/io.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include + +namespace utils::io +{ + bool remove_file(const std::string& file); + bool move_file(const std::string& src, const std::string& target); + 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); + std::string read_file(const std::string& file); + size_t file_size(const std::string& file); + bool create_directory(const std::string& directory); + bool directory_exists(const std::string& directory); + bool directory_is_empty(const std::string& directory); + bool remove_directory(const std::string& directory, bool recursive = false); + std::vector list_files(const std::string& directory); + void copy_folder(const std::filesystem::path& src, const std::filesystem::path& target); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/memory.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/memory.cpp new file mode 100644 index 0000000..3809feb --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/memory.cpp @@ -0,0 +1,109 @@ +#include +#include "memory.hpp" + +namespace utils +{ + memory::allocator memory::mem_allocator_; + + memory::allocator::~allocator() + { + this->clear(); + } + + void memory::allocator::clear() + { + std::lock_guard _(this->mutex_); + + for (auto& data : this->pool_) + { + memory::free(data); + } + + this->pool_.clear(); + } + + void memory::allocator::free(void* data) + { + std::lock_guard _(this->mutex_); + + const auto j = std::find(this->pool_.begin(), this->pool_.end(), data); + if (j != this->pool_.end()) + { + memory::free(data); + this->pool_.erase(j); + } + } + + void memory::allocator::free(const void* data) + { + this->free(const_cast(data)); + } + + void* memory::allocator::allocate(const size_t length) + { + std::lock_guard _(this->mutex_); + + const auto data = memory::allocate(length); + this->pool_.push_back(data); + return data; + } + + bool memory::allocator::empty() const + { + return this->pool_.empty(); + } + + char* memory::allocator::duplicate_string(const std::string& string) + { + std::lock_guard _(this->mutex_); + + const auto data = memory::duplicate_string(string); + this->pool_.push_back(data); + return data; + } + + void* memory::allocate(const size_t length) + { + return calloc(length, 1); + } + + char* memory::duplicate_string(const std::string& string) + { + const auto new_string = allocate_array(string.size() + 1); + std::memcpy(new_string, string.data(), string.size()); + return new_string; + } + + void memory::free(void* data) + { + if (data) + { + ::free(data); + } + } + + void memory::free(const void* data) + { + free(const_cast(data)); + } + + bool memory::is_set(const void* mem, const char chr, const size_t length) + { + const auto mem_arr = static_cast(mem); + + for (size_t i = 0; i < length; ++i) + { + if (mem_arr[i] != chr) + { + return false; + } + } + + return true; + } + + memory::allocator* memory::get_allocator() + { + return &memory::mem_allocator_; + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/memory.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/memory.hpp new file mode 100644 index 0000000..6d6a8b5 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/memory.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +namespace utils +{ + class memory final + { + public: + class allocator final + { + public: + ~allocator(); + + void clear(); + + void free(void* data); + + void free(const void* data); + + void* allocate(size_t length); + + template + inline T* allocate() + { + return this->allocate_array(1); + } + + template + inline T* allocate_array(const size_t count = 1) + { + return static_cast(this->allocate(count * sizeof(T))); + } + + bool empty() const; + + char* duplicate_string(const std::string& string); + + private: + std::mutex mutex_; + std::vector pool_; + }; + + static void* allocate(size_t length); + + template + static inline T* allocate() + { + return allocate_array(1); + } + + template + static inline T* allocate_array(const size_t count = 1) + { + return static_cast(allocate(count * sizeof(T))); + } + + static char* duplicate_string(const std::string& string); + + static void free(void* data); + static void free(const void* data); + + static bool is_set(const void* mem, char chr, size_t length); + + static bool is_bad_read_ptr(const void* ptr); + static bool is_bad_code_ptr(const void* ptr); + static bool is_rdata_ptr(void* ptr); + + static allocator* get_allocator(); + + private: + static allocator mem_allocator_; + }; +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/nt.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/nt.cpp new file mode 100644 index 0000000..ebcd6b8 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/nt.cpp @@ -0,0 +1,250 @@ +#include +#include "nt.hpp" +#include "string.hpp" + +namespace utils::nt +{ + HMODULE library::current_handle_; + + library library::load(const std::string& name) + { + return library(LoadLibraryA(name.data())); + } + + library library::load(const std::filesystem::path& path) + { + return library::load(path.generic_string()); + } + + library library::get_by_address(void* address) + { + HMODULE handle = nullptr; + GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, static_cast(address), &handle); + return library(handle); + } + + void library::set_current_handle(HMODULE handle) + { + current_handle_ = handle; + } + + HMODULE library::get_current_handle() + { + return current_handle_; + } + + library::library() + { + this->module_ = GetModuleHandleA(nullptr); + } + + library::library(const std::string& name) + { + this->module_ = GetModuleHandleA(name.data()); + } + + library::library(const HMODULE handle) + { + this->module_ = handle; + } + + bool library::operator==(const library& obj) const + { + return this->module_ == obj.module_; + } + + library::operator bool() const + { + return this->is_valid(); + } + + library::operator HMODULE() const + { + return this->get_handle(); + } + + PIMAGE_NT_HEADERS library::get_nt_headers() const + { + if (!this->is_valid()) return nullptr; + return reinterpret_cast(this->get_ptr() + this->get_dos_header()->e_lfanew); + } + + PIMAGE_DOS_HEADER library::get_dos_header() const + { + return reinterpret_cast(this->get_ptr()); + } + + PIMAGE_OPTIONAL_HEADER library::get_optional_header() const + { + if (!this->is_valid()) return nullptr; + return &this->get_nt_headers()->OptionalHeader; + } + + std::vector library::get_section_headers() const + { + std::vector headers; + + auto nt_headers = this->get_nt_headers(); + auto section = IMAGE_FIRST_SECTION(nt_headers); + + for (uint16_t i = 0; i < nt_headers->FileHeader.NumberOfSections; ++i, ++section) + { + if (section) headers.push_back(section); + else OutputDebugStringA("There was an invalid section :O"); + } + + return headers; + } + + std::uint8_t* library::get_ptr() const + { + return reinterpret_cast(this->module_); + } + + void library::unprotect() const + { + if (!this->is_valid()) return; + + DWORD protection; + VirtualProtect(this->get_ptr(), this->get_optional_header()->SizeOfImage, PAGE_EXECUTE_READWRITE, + &protection); + } + + size_t library::get_relative_entry_point() const + { + if (!this->is_valid()) return 0; + return this->get_nt_headers()->OptionalHeader.AddressOfEntryPoint; + } + + void* library::get_entry_point() const + { + if (!this->is_valid()) return nullptr; + return this->get_ptr() + this->get_relative_entry_point(); + } + + bool library::is_valid() const + { + return this->module_ != nullptr && this->get_dos_header()->e_magic == IMAGE_DOS_SIGNATURE; + } + + std::string library::get_name() const + { + if (!this->is_valid()) return ""; + + auto path = this->get_path(); + const auto pos = path.find_last_of("/\\"); + if (pos == std::string::npos) return path; + + return path.substr(pos + 1); + } + + std::string library::get_path() const + { + if (!this->is_valid()) return ""; + + char name[MAX_PATH] = {0}; + GetModuleFileNameA(this->module_, name, sizeof name); + + return name; + } + + std::string library::get_folder() const + { + if (!this->is_valid()) return ""; + + const auto path = std::filesystem::path(this->get_path()); + return path.parent_path().generic_string(); + } + + void library::free() + { + if (this->is_valid()) + { + FreeLibrary(this->module_); + this->module_ = nullptr; + } + } + + HMODULE library::get_handle() const + { + return this->module_; + } + + void** library::get_iat_entry(const std::string& module_name, const std::string& proc_name) const + { + if (!this->is_valid()) return nullptr; + + const library other_module(module_name); + if (!other_module.is_valid()) return nullptr; + + auto* const target_function = other_module.get_proc(proc_name); + if (!target_function) return nullptr; + + auto* header = this->get_optional_header(); + if (!header) return nullptr; + + auto* import_descriptor = reinterpret_cast(this->get_ptr() + header->DataDirectory + [IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); + + while (import_descriptor->Name) + { + if (!_stricmp(reinterpret_cast(this->get_ptr() + import_descriptor->Name), module_name.data())) + { + auto* original_thunk_data = reinterpret_cast(import_descriptor-> + OriginalFirstThunk + this->get_ptr()); + auto* thunk_data = reinterpret_cast(import_descriptor->FirstThunk + this-> + get_ptr()); + + while (original_thunk_data->u1.AddressOfData) + { + const size_t ordinal_number = original_thunk_data->u1.AddressOfData & 0xFFFFFFF; + + if (ordinal_number > 0xFFFF) continue; + + if (GetProcAddress(other_module.module_, reinterpret_cast(ordinal_number)) == + target_function) + { + return reinterpret_cast(&thunk_data->u1.Function); + } + + ++original_thunk_data; + ++thunk_data; + } + + //break; + } + + ++import_descriptor; + } + + return nullptr; + } + + void raise_hard_exception() + { + int data = false; + const library ntdll("ntdll.dll"); + ntdll.invoke_pascal("RtlAdjustPrivilege", 19, true, false, &data); + ntdll.invoke_pascal("NtRaiseHardError", 0xC000007B, 0, nullptr, nullptr, 6, &data); + } + + std::string load_resource(const int id) + { + const auto self_handle = library::get_current_handle(); + const auto res = FindResource(self_handle, MAKEINTRESOURCE(id), RT_RCDATA); + if (res == nullptr) + { + return {}; + } + + const auto handle = LoadResource(self_handle, res); + if (handle == nullptr) + { + return {}; + } + + const auto str = LPSTR(LockResource(handle)); + const auto size = SizeofResource(self_handle, res); + return std::string{str, size}; + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/nt.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/nt.hpp new file mode 100644 index 0000000..4ba32c7 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/nt.hpp @@ -0,0 +1,112 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN +#include + +// min and max is required by gdi, therefore NOMINMAX won't work +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#include +#include +#include + +namespace utils::nt +{ + class library final + { + public: + static library load(const std::string& name); + static library load(const std::filesystem::path& path); + static library get_by_address(void* address); + + static void set_current_handle(HMODULE handle); + static HMODULE get_current_handle(); + + library(); + explicit library(const std::string& name); + explicit library(HMODULE handle); + + library(const library& a) : module_(a.module_) + { + } + + bool operator!=(const library& obj) const { return !(*this == obj); }; + bool operator==(const library& obj) const; + + operator bool() const; + operator HMODULE() const; + + void unprotect() const; + void* get_entry_point() const; + size_t get_relative_entry_point() const; + + bool is_valid() const; + std::string get_name() const; + std::string get_path() const; + std::string get_folder() const; + std::uint8_t* get_ptr() const; + void free(); + + HMODULE get_handle() const; + + template + T get_proc(const std::string& process) const + { + if (!this->is_valid()) T{}; + return reinterpret_cast(GetProcAddress(this->module_, process.data())); + } + + template + std::function get(const std::string& process) const + { + if (!this->is_valid()) return std::function(); + return static_cast(this->get_proc(process)); + } + + template + T invoke(const std::string& process, Args ... args) const + { + auto method = this->get(process); + if (method) return method(args...); + return T(); + } + + template + T invoke_pascal(const std::string& process, Args ... args) const + { + auto method = this->get(process); + if (method) return method(args...); + return T(); + } + + template + T invoke_this(const std::string& process, void* this_ptr, Args ... args) const + { + auto method = this->get(this_ptr, process); + if (method) return method(args...); + return T(); + } + + std::vector get_section_headers() const; + + PIMAGE_NT_HEADERS get_nt_headers() const; + PIMAGE_DOS_HEADER get_dos_header() const; + PIMAGE_OPTIONAL_HEADER get_optional_header() const; + + void** get_iat_entry(const std::string& module_name, const std::string& proc_name) const; + + private: + HMODULE module_; + static HMODULE current_handle_; + + }; + + __declspec(noreturn) void raise_hard_exception(); + std::string load_resource(int id); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/string.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/string.cpp new file mode 100644 index 0000000..876fb64 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/string.cpp @@ -0,0 +1,181 @@ +#include +#include "string.hpp" +#include +#include +#include + +namespace utils::string +{ + const char* va(const char* fmt, ...) + { + static thread_local va_provider<8, 256> provider; + + va_list ap; + va_start(ap, fmt); + + const char* result = provider.get(fmt, ap); + + va_end(ap); + return result; + } + + std::vector split(const std::string& s, const char delim) + { + std::stringstream ss(s); + std::string item; + std::vector elems; + + while (std::getline(ss, item, delim)) + { + elems.push_back(item); // elems.push_back(std::move(item)); // if C++11 (based on comment from @mchiasson) + } + + return elems; + } + + std::string to_lower(std::string text) + { + std::transform(text.begin(), text.end(), text.begin(), [](const unsigned char input) + { + return static_cast(tolower(input)); + }); + + return text; + } + + std::string to_upper(std::string text) + { + std::transform(text.begin(), text.end(), text.begin(), [](const unsigned char input) + { + return static_cast(toupper(input)); + }); + + return text; + } + + bool starts_with(const std::string& text, const std::string& substring) + { + return text.find(substring) == 0; + } + + bool ends_with(const std::string& text, const std::string& substring) + { + if (substring.size() > text.size()) return false; + return std::equal(substring.rbegin(), substring.rend(), text.rbegin()); + } + + bool is_numeric(const std::string& text) + { + return !text.empty() && std::find_if(text.begin(), + text.end(), + [](unsigned char input) + { + return !std::isdigit(input); + }) == text.end(); + } + + std::string dump_hex(const std::string& data, const std::string& separator) + { + std::string result; + + for (unsigned int i = 0; i < data.size(); ++i) + { + if (i > 0) + { + result.append(separator); + } + + result.append(va("%02X", data[i] & 0xFF)); + } + + return result; + } + + std::string bin_to_hex(const std::string& data) + { + return dump_hex(data, ""); + } + + std::string hex_to_bin(const std::string& data) + { + std::string result; + + for (auto i = 0u; i < data.size(); i += 2) + { + const auto byte = data.substr(i, 2); + const auto value = static_cast(std::strtol(byte.data(), nullptr, 0x10)); + result += value; + } + + return result; + } + + std::string convert(const std::wstring& wstr) + { + std::string result; + result.reserve(wstr.size()); + + for (const auto& chr : wstr) + { + result.push_back(static_cast(chr)); + } + + return result; + } + + std::wstring convert(const std::string& str) + { + std::wstring result; + result.reserve(str.size()); + + for (const auto& chr : str) + { + result.push_back(static_cast(chr)); + } + + return result; + } + + std::string replace(std::string str, const std::string& from, const std::string& to) + { + if (from.empty()) + { + return str; + } + + size_t start_pos = 0; + while ((start_pos = str.find(from, start_pos)) != std::string::npos) + { + str.replace(start_pos, from.length(), to); + start_pos += to.length(); + } + + return str; + } + + std::string get_timestamp() + { + tm ltime{}; + char timestamp[MAX_PATH] = { 0 }; + const auto time = _time64(nullptr); + + _localtime64_s(<ime, &time); + strftime(timestamp, sizeof(timestamp) - 1, "%Y-%m-%d-%H-%M-%S", <ime); + + return timestamp; + } + + std::string trim(const std::string& str, const std::string& whitespace) + { + const auto first = str.find_first_not_of(whitespace); + if (first == std::string::npos) + { + return {}; + } + + const auto last = str.find_last_not_of(whitespace); + const auto range = last - first + 1; + + return str.substr(first, range); + } +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/string.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/string.hpp new file mode 100644 index 0000000..4d5b382 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/string.hpp @@ -0,0 +1,105 @@ +#pragma once +#include "memory.hpp" +#include + +#ifndef ARRAYSIZE +template +size_t ARRAYSIZE(Type(&)[n]) { return n; } +#endif + +namespace utils::string +{ + template + class va_provider final + { + public: + static_assert(Buffers != 0 && MinBufferSize != 0, "Buffers and MinBufferSize mustn't be 0"); + + va_provider() : current_buffer_(0) + { + } + + char* get(const char* format, const va_list ap) + { + ++this->current_buffer_ %= ARRAYSIZE(this->string_pool_); + auto entry = &this->string_pool_[this->current_buffer_]; + + if (!entry->size || !entry->buffer) + { + throw std::runtime_error("String pool not initialized"); + } + + while (true) + { + const int res = vsnprintf_s(entry->buffer, entry->size, _TRUNCATE, format, ap); + if (res > 0) break; // Success + if (res == 0) return nullptr; // Error + + entry->double_size(); + } + + return entry->buffer; + } + + private: + class entry final + { + public: + explicit entry(const size_t _size = MinBufferSize) : size(_size), buffer(nullptr) + { + if (this->size < MinBufferSize) this->size = MinBufferSize; + this->allocate(); + } + + ~entry() + { + if (this->buffer) memory::get_allocator()->free(this->buffer); + this->size = 0; + this->buffer = nullptr; + } + + void allocate() + { + if (this->buffer) memory::get_allocator()->free(this->buffer); + this->buffer = memory::get_allocator()->allocate_array(this->size + 1); + } + + void double_size() + { + this->size *= 2; + this->allocate(); + } + + size_t size; + char* buffer; + }; + + size_t current_buffer_; + entry string_pool_[Buffers]; + }; + + const char* va(const char* fmt, ...); + + std::vector split(const std::string& s, char delim); + + std::string to_lower(std::string text); + std::string to_upper(std::string text); + bool starts_with(const std::string& text, const std::string& substring); + bool ends_with(const std::string& text, const std::string& substring); + bool is_numeric(const std::string& text); + + std::string dump_hex(const std::string& data, const std::string& separator = " "); + std::string bin_to_hex(const std::string& data); + std::string hex_to_bin(const std::string& data); + + void strip(const char* in, char* out, int max); + + std::string convert(const std::wstring& wstr); + std::wstring convert(const std::string& str); + + std::string replace(std::string str, const std::string& from, const std::string& to); + + std::string get_timestamp(); + + std::string trim(const std::string& str, const std::string& whitespace = " \t\n\r\f\v"); +} \ No newline at end of file diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/thread.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/thread.cpp new file mode 100644 index 0000000..1c20ff5 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/thread.cpp @@ -0,0 +1,89 @@ +#include +#include "thread.hpp" +#include "string.hpp" + +#include + +#include + +namespace utils::thread +{ + std::vector get_thread_ids() + { + auto* const h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, GetCurrentProcessId()); + if (h == INVALID_HANDLE_VALUE) + { + return {}; + } + + const auto _ = gsl::finally([h]() + { + CloseHandle(h); + }); + + THREADENTRY32 entry{}; + entry.dwSize = sizeof(entry); + if (!Thread32First(h, &entry)) + { + return {}; + } + + std::vector ids{}; + + do + { + const auto check_size = entry.dwSize < FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + + sizeof(entry.th32OwnerProcessID); + entry.dwSize = sizeof(entry); + + if (check_size && entry.th32OwnerProcessID == GetCurrentProcessId()) + { + ids.emplace_back(entry.th32ThreadID); + } + } + while (Thread32Next(h, &entry)); + + return ids; + } + + void for_each_thread(const std::function& callback) + { + const auto ids = get_thread_ids(); + + for (const auto& id : ids) + { + auto* const thread = OpenThread(THREAD_ALL_ACCESS, FALSE, id); + if (thread != nullptr) + { + const auto _ = gsl::finally([thread]() + { + CloseHandle(thread); + }); + + callback(thread); + } + } + } + + void suspend_other_threads() + { + for_each_thread([](const HANDLE thread) + { + if (GetThreadId(thread) != GetCurrentThreadId()) + { + SuspendThread(thread); + } + }); + } + + void resume_other_threads() + { + for_each_thread([](const HANDLE thread) + { + if (GetThreadId(thread) != GetCurrentThreadId()) + { + ResumeThread(thread); + } + }); + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/thread.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/thread.hpp new file mode 100644 index 0000000..4d67c1a --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/thread.hpp @@ -0,0 +1,19 @@ +#pragma once +#include + +namespace utils::thread +{ + template + std::thread create_named_thread(const std::string& name, Args&&... args) + { + auto t = std::thread(std::forward(args)...); + set_name(t, name); + return t; + } + + std::vector get_thread_ids(); + void for_each_thread(const std::function& callback); + + void suspend_other_threads(); + void resume_other_threads(); +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.cpp b/t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.cpp new file mode 100644 index 0000000..092c89b --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.cpp @@ -0,0 +1,96 @@ +#include + +#include "thread_pool.hpp" + +namespace utils +{ + thread_pool::worker::worker() + { + } + + void thread_pool::worker::start(thread_pool& pool) + { + this->thread_ = std::thread([&] + { + this->loop(pool); + }); + } + + void thread_pool::worker::stop() + { + if (this->thread_.joinable()) + { + this->thread_.join(); + } + } + + void thread_pool::worker::loop(thread_pool& pool) + { + while (!pool.stopped_) + { + pool.run_job(); + } + } + + thread_pool::job_ptr thread_pool::pop_job() + { + thread_pool::job_ptr job = std::move(this->queue_.front()); + this->queue_.pop_front(); + return job; + } + + void thread_pool::run_job() + { + std::unique_lock lock(this->mutex_); + + this->event_.wait(lock, [&]() + { + return !this->queue_.empty() || this->stopped_; + }); + + if (this->stopped_ || this->queue_.empty()) + { + return; + } + + auto job = this->pop_job(); + lock.unlock(); + job->operator()(); + } + + thread_pool::thread_pool(const std::size_t num_workers) + { + this->initialize(num_workers); + } + + void thread_pool::initialize(const std::size_t num_workers) + { + for (auto i = 0u; i < num_workers; i++) + { + this->workers_.emplace_back(std::make_unique()); + } + } + + void thread_pool::start() + { + for (auto& worker : this->workers_) + { + worker->start(*this); + } + } + + void thread_pool::update() + { + + } + + void thread_pool::stop() + { + this->stopped_ = true; + this->event_.notify_all(); + for (auto& worker : this->workers_) + { + worker->stop(); + } + } +} diff --git a/t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.hpp b/t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.hpp new file mode 100644 index 0000000..9b9bcb2 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/src/utils/thread_pool.hpp @@ -0,0 +1,60 @@ +#pragma once + +namespace utils +{ + class thread_pool + { + public: + using job = std::function; + using job_ptr = std::unique_ptr; + + friend class worker; + class worker + { + public: + worker(); + + friend class thread_pool; + + void start(thread_pool& pool); + void stop(); + void loop(thread_pool& pool); + + private: + std::thread thread_; + + }; + + thread_pool() = default; + thread_pool(const std::size_t num_workers); + void initialize(const std::size_t num_workers); + + void start(); + void update(); + void stop(); + + template + void push(F&& job) + { + if (this->stopped_) + { + return; + } + + std::lock_guard lock(this->mutex_); + this->queue_.emplace_back(std::make_unique(std::forward(job))); + this->event_.notify_one(); + } + + private: + thread_pool::job_ptr pop_job(); + void run_job(); + + std::mutex mutex_; + std::atomic_bool stopped_; + std::deque queue_; + std::condition_variable event_; + std::deque> workers_; + + }; +} diff --git a/t6/plugins/tws-t6-gsc-utils/tools/premake5.exe b/t6/plugins/tws-t6-gsc-utils/tools/premake5.exe new file mode 100644 index 0000000000000000000000000000000000000000..1a637aa93c942a9268937d8732abf463ebe8bddc GIT binary patch literal 1568256 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 z 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≈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 literal 0 HcmV?d00001 diff --git a/t6/plugins/tws-t6-gsc-utils/upstream.json b/t6/plugins/tws-t6-gsc-utils/upstream.json new file mode 100644 index 0000000..d8010e1 --- /dev/null +++ b/t6/plugins/tws-t6-gsc-utils/upstream.json @@ -0,0 +1,61 @@ +{ + "repository": "https://github.com/alicealys/t6-gsc-utils", + "commit": "57cd74db04ca646a74fe684307d90a80498df40f", + "dependencies": [ + { + "path": "deps/GSL", + "url": "https://github.com/microsoft/GSL.git", + "commit": "e64c97fc2cfc11992098bb38eda932de275e3f4d" + }, + { + "path": "deps/asmjit", + "url": "https://github.com/asmjit/asmjit.git", + "commit": "7e64eabca49c1a4d2cbfb06e4b9d3987bce7f7b3" + }, + { + "path": "deps/curl", + "url": "https://github.com/curl/curl.git", + "commit": "d2d48f21f3b0d4e4f7a77f73f95b30900d809ec8" + }, + { + "path": "deps/date", + "url": "https://github.com/HowardHinnant/date", + "commit": "cc4685a21e4a4fdae707ad1233c61bbaff241f93" + }, + { + "path": "deps/json", + "url": "https://github.com/nlohmann/json.git", + "commit": "58d6aa58316a84fc770bdd0409934cdfdf0697dc" + }, + { + "path": "deps/libtomcrypt", + "url": "https://github.com/libtom/libtomcrypt.git", + "commit": "f7e6519fae1e11ff5ff9d36c84101a673002133b" + }, + { + "path": "deps/libtommath", + "url": "https://github.com/libtom/libtommath.git", + "commit": "138309cfdc78978d5b86fc21f4d424a86c51e1eb" + }, + { + "path": "deps/minhook", + "url": "https://github.com/TsudaKageyu/minhook.git", + "commit": "0f25a2449b3cf878bcbdbf91b693c38149ecf029" + }, + { + "path": "deps/plutonium-sdk", + "url": "https://github.com/plutoniummod/plutonium-sdk.git", + "commit": "17e9a0a4d5e1133b50f879e3db07e97d1bf92e10" + }, + { + "path": "deps/sqlpp11", + "url": "https://github.com/rbock/sqlpp11.git", + "commit": "6cc2067ef5fd91612f31509384e78d36c74c7657" + }, + { + "path": "deps/zlib", + "url": "https://github.com/madler/zlib.git", + "commit": "21767c654d31d2dccdde4330529775c6c5fd5389" + } + ] +} diff --git a/t6/NOTES.md b/t6/scripts/NOTES.md similarity index 97% rename from t6/NOTES.md rename to t6/scripts/NOTES.md index 1e18bdf..323334c 100644 --- a/t6/NOTES.md +++ b/t6/scripts/NOTES.md @@ -39,7 +39,7 @@ death/laststand/intermission until active play. Other mods controlling the same invulnerability or weapon flags can still conflict and need live testing. The existing optional T5 dvars remain. Leaderboard adds the three settings -documented in the [shared README](../README.md#map-record-announcements). +documented in the [shared README](../../README.md#map-record-announcements). `common_config()` and `ensure_config()` are original T5 in-memory HUD helpers, not an external configuration system. @@ -98,7 +98,8 @@ The T5 and T6 implementations are not runtime-verified equivalents. In particula [T6 plugin v3.0.4](https://github.com/alicealys/t6-gsc-utils/blob/v3.0.4/src/component/http.cpp) expects `httpPost(url, body, headers)` and notifies only the response body; v3.1.1 expects `httpPost(url, options)` and also provides success/error values. -The current script targets v3.1.1. Switching the function name does not establish +The current script targets the [TWS build](../plugins/README.md) based on v3.1.1, +which appends diagnostics and enforces native HTTP deadlines. Switching the function name does not establish compatibility with an unknown installed DLL. Console markers identify `main`, `init`, round serialization, HTTP invocation, diff --git a/t6/README.md b/t6/scripts/README.md similarity index 90% rename from t6/README.md rename to t6/scripts/README.md index b9cfa87..07e192d 100644 --- a/t6/README.md +++ b/t6/scripts/README.md @@ -10,19 +10,19 @@ separate token config or database setup is required. | `tws_t6_hud.gsc` | Match/round timers, name, zombie count and health bar | Common | | `tws_t6_afk.gsc` | `.afk` / `.back`, protection, movement and weapon blocking | Common | | `tws_t6_lock.gsc` | Lock at round 20; clear password on game over | Common, HUD | -| `tws_t6_telemetry.gsc` | Async queued game reports (game_start/heartbeat/round_change/game_end) | t6-gsc-utils | +| `tws_t6_telemetry.gsc` | Async queued game reports (game_start/heartbeat/round_change/game_end) | tws-t6-gsc-utils | | `tws_t6_join.gsc` | `.join` chat command lets a spectator newcomer enter mid-match once | Common | -| `tws_t6_leaderboard.gsc` | Private map high-round record and every tied holder on connection | Common, t6-gsc-utils | +| `tws_t6_leaderboard.gsc` | Private map high-round record and every tied holder on connection | Common, tws-t6-gsc-utils | ## Install 1. Copy all seven `tws_t6_*.gsc` files into `Plutonium/storage/t6/scripts/zm/`. Update common along with leaderboard. -2. For telemetry or leaderboard, install [t6-gsc-utils v3.1.1](https://github.com/alicealys/t6-gsc-utils/releases/tag/v3.1.1) +2. For telemetry or leaderboard, install the [tws-t6-gsc-utils build](../plugins/README.md), based on upstream v3.1.1, in `Plutonium/plugins/` and restart the server process. The other five scripts do not require that plugin. 3. Ensure the API service's `EC_TELEMETRY_TOKEN` matches the token embedded in - the reporter; see [authentication setup](../README.md#telemetry-authentication-t5-and-t6). + the reporter; see [authentication setup](../../README.md#telemetry-authentication-t5-and-t6). 4. Restart the map to load script updates. If upgrading from the earlier leaderboard filename, **remove @@ -55,7 +55,7 @@ catalogue. An unknown mode/location is logged instead of guessing from the engin map. Use `tws_leaderboard_map_key` for a custom registered selection if needed. The plugin must expose `httpPost` (with the GET method override), `jsonParse`, -`typeof` and `formatString`. [Shared configuration, caching and validation](../README.md#map-record-announcements) +`typeof` and `formatString`. [Shared configuration, caching and validation](../../README.md#map-record-announcements) apply to both versions. All T6 script filenames use the `tws_t6_` prefix. ## Chat commands @@ -105,7 +105,7 @@ override when upgrading. The reporter token lives in `level.telemetry_token`. ## Round telemetry -Telemetry runs directly in GSC using t6-gsc-utils. Configure the exact Electric +Telemetry runs directly in GSC using tws-t6-gsc-utils. Configure the exact Electric Cherry registry name and full endpoint in your existing server configuration: ```cfg @@ -115,7 +115,7 @@ set tws_telemetry_url "https://ec.thewrightserver.net/api/telemetry" The script embeds the reporter token in `level.telemetry_token`; it must match the API service's `EC_TELEMETRY_TOKEN` environment variable. Follow the shared -[authentication setup](../README.md#telemetry-authentication-t5-and-t6). Every +[authentication setup](../../README.md#telemetry-authentication-t5-and-t6). Every request includes `Authorization: Bearer ` and `Content-Type: application/json`. Token rotation requires updating and redeploying both reporter scripts. Token and endpoint changes require a map restart. @@ -140,7 +140,12 @@ are reported as `0`. `score` is the player's current spendable `player.score`. Delivery is asynchronous with a sequenced FIFO queue and one in-flight request. The queue survives the game-end signal so the final snapshot drains. There is no automatic retry: the receiver may already have accepted the event. Transport -success reports the HTTP call finished, not that the API accepted it. Increase +success reports the HTTP call finished, not that the API accepted it. The TWS +plugin enforces 5-second connection and 15-second transfer deadlines, then +releases a timed-out request so the sender can advance. Telemetry logs HTTP +status and native timing diagnostics; non-2xx responses increment `http_rejected` +separately from transport failures. Older plugins trigger a warning that native +deadlines are unverified. Increase `tws_telemetry_log_level` to `2` for per-event capture/queue/response logging; set to `0` to silence non-error output. diff --git a/t6/tools/check.ps1 b/t6/scripts/tools/check.ps1 similarity index 100% rename from t6/tools/check.ps1 rename to t6/scripts/tools/check.ps1 diff --git a/t6/tws_t6_afk.gsc b/t6/scripts/tws_t6_afk.gsc similarity index 100% rename from t6/tws_t6_afk.gsc rename to t6/scripts/tws_t6_afk.gsc diff --git a/t6/tws_t6_common.gsc b/t6/scripts/tws_t6_common.gsc similarity index 100% rename from t6/tws_t6_common.gsc rename to t6/scripts/tws_t6_common.gsc diff --git a/t6/tws_t6_hud.gsc b/t6/scripts/tws_t6_hud.gsc similarity index 100% rename from t6/tws_t6_hud.gsc rename to t6/scripts/tws_t6_hud.gsc diff --git a/t6/tws_t6_join.gsc b/t6/scripts/tws_t6_join.gsc similarity index 100% rename from t6/tws_t6_join.gsc rename to t6/scripts/tws_t6_join.gsc diff --git a/t6/tws_t6_leaderboard.gsc b/t6/scripts/tws_t6_leaderboard.gsc similarity index 100% rename from t6/tws_t6_leaderboard.gsc rename to t6/scripts/tws_t6_leaderboard.gsc diff --git a/t6/tws_t6_lock.gsc b/t6/scripts/tws_t6_lock.gsc similarity index 100% rename from t6/tws_t6_lock.gsc rename to t6/scripts/tws_t6_lock.gsc diff --git a/t6/tws_t6_telemetry.gsc b/t6/scripts/tws_t6_telemetry.gsc similarity index 86% rename from t6/tws_t6_telemetry.gsc rename to t6/scripts/tws_t6_telemetry.gsc index 8c0dc69..30c1fb4 100644 --- a/t6/tws_t6_telemetry.gsc +++ b/t6/scripts/tws_t6_telemetry.gsc @@ -1,4 +1,4 @@ -/* tws_t6_telemetry.gsc - Zombies game reports via t6-gsc-utils v3.1.1. */ +/* tws_t6_telemetry.gsc - Zombies game reports via tws-t6-gsc-utils. */ #include maps\mp\_utility; #include common_scripts\utility; @@ -6,7 +6,7 @@ // Plutonium probes both entry points; runtime setup belongs in init. main() { - println("[tws_t6_telemetry] main reached (HTTP API target: t6-gsc-utils v3.1.1)"); + println("[tws_t6_telemetry] main reached (HTTP API target: tws-t6-gsc-utils with deadlines/diagnostics)"); } init() @@ -60,6 +60,8 @@ init() level.telemetry_sequence = 0; level.telemetry_completed = 0; level.telemetry_failed = 0; + level.telemetry_http_rejected = 0; + level.telemetry_missing_diagnostics_warned = false; level.telemetry_failure_streak = 0; level.telemetry_last_completed = -1; level.telemetry_last_capture = getTime(); @@ -310,6 +312,8 @@ telemetry_send(entry) options["method"] = "POST"; options["headers"] = headers; options["body"] = entry["body"]; + options["connect_timeout_ms"] = 5000; + options["timeout_ms"] = 15000; request = httpPost(level.telemetry_url, options); if (!isDefined(request)) @@ -321,9 +325,15 @@ telemetry_send(entry) } level.telemetry_sender_state = "waiting_http"; - request waittill("done", response, success, error); + request waittill("done", response, success, error, diagnostics); elapsed = getTime() - level.telemetry_request_started; level.telemetry_last_completed = getTime(); + timing = telemetry_http_diagnostics(diagnostics); + if (!isDefined(diagnostics) && !level.telemetry_missing_diagnostics_warned) + { + level.telemetry_missing_diagnostics_warned = true; + telemetry_log(0, "WARNING: plugin returned no HTTP diagnostics; native timeouts are unverified. Install the TWS plugin build and restart the server process"); + } // The plugin's success flag reports transport completion, not HTTP status. // No automatic retry: the receiver may already have accepted the event. @@ -331,7 +341,7 @@ telemetry_send(entry) { if (!isDefined(error)) error = "unknown transport error"; - telemetry_transport_failed(label + " elapsed_ms=" + elapsed + " error=" + telemetry_preview(error)); + telemetry_transport_failed(label + " elapsed_ms=" + elapsed + timing + " error=" + telemetry_preview(error)); } else { @@ -339,7 +349,18 @@ telemetry_send(entry) if (level.telemetry_failure_streak > 0) telemetry_log(0, "Transport recovered after " + level.telemetry_failure_streak + " failures; " + label); level.telemetry_failure_streak = 0; - telemetry_log(1, "Transport completed " + label + " elapsed_ms=" + elapsed + " (API acceptance unverified)"); + if (isDefined(diagnostics) && isDefined(diagnostics["http_status"])) + { + if (diagnostics["http_status"] < 200 || diagnostics["http_status"] >= 300) + { + level.telemetry_http_rejected++; + telemetry_log(0, "ERROR: HTTP rejected " + label + " elapsed_ms=" + elapsed + timing + " body=" + telemetry_preview(response)); + } + else + telemetry_log(1, "HTTP completed " + label + " elapsed_ms=" + elapsed + timing); + } + else + telemetry_log(1, "Transport completed " + label + " elapsed_ms=" + elapsed + timing + " (API acceptance unverified)"); if (!isDefined(response) || response == "") telemetry_log(0, "WARNING: empty API response for " + label); else @@ -350,6 +371,24 @@ telemetry_send(entry) level.telemetry_sender_state = "idle"; } +// The native plugin appends diagnostics while preserving the old done arguments. +// Curl timings are cumulative milestones, measured in real milliseconds. +telemetry_http_diagnostics(diagnostics) +{ + if (!isDefined(diagnostics)) + return " diagnostics=unavailable"; + + keys = strTok("http_status,curl_code,dns_ms,connect_ms,tls_ms,first_byte_ms,total_ms,worker_queue_ms,notify_ms,connect_timeout_ms,timeout_ms", ","); + detail = ""; + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + if (isDefined(diagnostics[key])) + detail += " " + key + "=" + int(diagnostics[key]); + } + return detail; +} + telemetry_transport_failed(detail) { level.telemetry_failed++; @@ -399,7 +438,7 @@ telemetry_preview(value) } // Independent of producers and the HTTP wait; survives game over until drain. -// The plugin cannot cancel requests. Warn without opening overlapping POSTs +// Native requests have deadlines. Warn without opening overlapping POSTs // that could arrive out of order or exhaust its native worker pool. telemetry_watchdog() { @@ -416,7 +455,7 @@ telemetry_watchdog() telemetry_log(1, "Health started=" + level.telemetry_started + " ended=" + level.telemetry_ended + " sender=" + level.telemetry_sender_state + " capturing=" + level.telemetry_capture_event + " pending=" + pending + " queued_total=" + level.telemetry_sequence + - " completed=" + level.telemetry_completed + " failed=" + level.telemetry_failed + + " completed=" + level.telemetry_completed + " failed=" + level.telemetry_failed + " http_rejected=" + level.telemetry_http_rejected + " last_done_ms_ago=" + completion_age); if (isDefined(level.telemetry_inflight)) @@ -425,7 +464,7 @@ telemetry_watchdog() if (age >= 30000) telemetry_log(0, "WARNING: HTTP stalled " + telemetry_event_label(level.telemetry_inflight) + " elapsed_ms=" + age + " pending=" + pending + " stage=" + level.telemetry_sender_state + - "; waiting for plugin completion (no cancellation API)"); + "; native deadline exceeded; check plugin version, worker queue and completion delivery"); } else if (pending > 0) { diff --git a/tools/build_plugins.ps1 b/tools/build_plugins.ps1 new file mode 100644 index 0000000..e9361f4 --- /dev/null +++ b/tools/build_plugins.ps1 @@ -0,0 +1,26 @@ +param( + [ValidateSet('t5', 't6', 'all')] + [string]$Game = 'all', + [ValidateSet('Debug', 'Release')] + [string]$Configuration = 'Release' +) +$ErrorActionPreference = 'Stop' +$repo = Split-Path -Parent $PSScriptRoot +$games = if ($Game -eq 'all') { @('t5', 't6') } else { @($Game) } +foreach ($current in $games) { + & python (Join-Path $PSScriptRoot 'fetch_plugin_deps.py') $current + if ($LASTEXITCODE -ne 0) { throw "Dependency restore failed for $current" } + $plugin = Join-Path $repo "$current/plugins/tws-$current-gsc-utils" + Push-Location $plugin + try { + & .\tools\premake5.exe vs2022 + if ($LASTEXITCODE -ne 0) { throw "Project generation failed for $current" } + & msbuild /m /v:minimal "/p:Configuration=$Configuration" /p:PlatformTarget=x86 "build/tws-$current-gsc-utils.sln" + if ($LASTEXITCODE -ne 0) { throw "Build failed for $current" } + $binary = Join-Path $plugin "build/bin/$Configuration/tws-$current-gsc-utils.dll" + if (!(Test-Path -LiteralPath $binary)) { throw "Missing output: $binary" } + Write-Output "Built $binary" + } finally { + Pop-Location + } +} diff --git a/tools/check_leaderboard.mjs b/tools/check_leaderboard.mjs index 002479c..06ca141 100644 --- a/tools/check_leaderboard.mjs +++ b/tools/check_leaderboard.mjs @@ -42,7 +42,7 @@ function functions(source) { } function engine(game) { - const source = readFileSync(new URL(`${game}/tws_${game}_leaderboard.gsc`, root), 'utf8'); + const source = readFileSync(new URL(`${game}/scripts/tws_${game}_leaderboard.gsc`, root), 'utf8'); const all = functions(source); const excluded = new Set(['lb_worker', 'lb_welcome', 'lb_get', 'lb_collect', 'lb_log', 'lb_show_hud', 'lb_hud_help_visible', 'lb_hud_end_game', 'lb_hud_destroy', 'lb_chat_listener', 'lb_request', 'lb_hud_disconnect']); const table = []; @@ -90,7 +90,7 @@ for (const game of ['t5', 't6']) { const { context: c, source, all, dvars, responses, queries } = engine(game); const option = mapOption(game); check(`${game} exactly one connect listener across modules`, () => { - const common = readFileSync(new URL(`${game}/tws_${game}_common.gsc`, root), 'utf8'); + const common = readFileSync(new URL(`${game}/scripts/tws_${game}_common.gsc`, root), 'utf8'); assert.equal((common.match(/waittill\("connected"/g) ?? []).length, 1); assert(!source.includes('waittill("connected"')); assert(!all.get('lb_welcome').includes('spawned_player')); @@ -227,8 +227,8 @@ for (const game of ['t5', 't6']) { assert.equal(responses.length, 0, `${game} unused responses`); } check('paired data helpers stay identical', () => { - const t5 = functions(readFileSync(new URL('t5/tws_t5_leaderboard.gsc', root), 'utf8')); - const t6 = functions(readFileSync(new URL('t6/tws_t6_leaderboard.gsc', root), 'utf8')); + const t5 = functions(readFileSync(new URL('t5/scripts/tws_t5_leaderboard.gsc', root), 'utf8')); + const t6 = functions(readFileSync(new URL('t6/scripts/tws_t6_leaderboard.gsc', root), 'utf8')); for (const [name, fn] of t5) { if (!['lb_selection', 'lb_welcome', 'lb_get', 'lb_log'].includes(name)) { const normalized = t6.get(name).replaceAll('scripts\\zm\\tws_t6_common::', 'scripts\\sp\\tws_t5_common::'); diff --git a/tools/fetch_plugin_deps.py b/tools/fetch_plugin_deps.py new file mode 100644 index 0000000..4655140 --- /dev/null +++ b/tools/fetch_plugin_deps.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +"""Restore the exact upstream dependency revisions for the vendored plugins.""" +import argparse +import json +from pathlib import Path +import subprocess + +ROOT = Path(__file__).resolve().parents[1] + + +def git(directory, *args, capture=False): + return subprocess.check_output(["git", "-C", str(directory), *args], text=True).strip() if capture else subprocess.check_call(["git", "-C", str(directory), *args]) + + +def restore(game, check_only): + plugin = ROOT / game / "plugins" / f"tws-{game}-gsc-utils" + lock = json.loads((plugin / "upstream.json").read_text()) + for dependency in lock["dependencies"]: + target = plugin / dependency["path"] + if not target.resolve().is_relative_to(plugin.resolve()): + raise RuntimeError(f"Dependency path leaves the plugin: {target}") + if not (target / ".git").exists(): + if check_only: + raise RuntimeError(f"Missing dependency: {target}") + if target.exists() and any(target.iterdir()): + raise RuntimeError(f"Refusing to replace nonempty directory: {target}") + target.mkdir(parents=True, exist_ok=True) + git(target, "init", "--quiet") + git(target, "remote", "add", "origin", dependency["url"]) + if git(target, "remote", "get-url", "origin", capture=True) != dependency["url"]: + raise RuntimeError(f"Unexpected dependency remote: {target}") + if git(target, "status", "--porcelain", capture=True): + raise RuntimeError(f"Dependency has local changes: {target}") + current = subprocess.run(["git", "-C", str(target), "rev-parse", "--verify", "HEAD"], capture_output=True, text=True) + if current.stdout.strip() != dependency["commit"]: + if check_only: + raise RuntimeError(f"Wrong dependency revision: {target}") + git(target, "fetch", "--depth", "1", "origin", dependency["commit"]) + git(target, "checkout", "--quiet", "--detach", dependency["commit"]) + print(f"OK {game}/{dependency['path']} {dependency['commit']}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("game", choices=["t5", "t6", "all"]) + parser.add_argument("--check", action="store_true", help="Verify existing checkouts without fetching or changing them") + args = parser.parse_args() + for game in ("t5", "t6") if args.game == "all" else (args.game,): + restore(game, args.check) diff --git a/tools/test_plugin_component.py b/tools/test_plugin_component.py new file mode 100644 index 0000000..51019e7 --- /dev/null +++ b/tools/test_plugin_component.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +"""Compile actual HTTP component logic using host shims for engine interfaces.""" +import os +from pathlib import Path +import re +import subprocess +import tempfile + +ROOT = Path(__file__).resolve().parents[1] +with tempfile.TemporaryDirectory(prefix="tws-http-component-") as temp: + for game in ("t5", "t6"): + plugin = ROOT / game / "plugins" / f"tws-{game}-gsc-utils" / "src" + # Only includes are substituted; compile the entire component unchanged. + component = re.sub(r'^#include[^\n]*\n', '', (plugin / "component/http.cpp").read_text(), flags=re.MULTILINE) + source = Path(temp) / f"{game}.cpp" + source.write_text('#include "http_component_stub.hpp"\n' + component + (ROOT / "tools/tests/http_component_cases.cpp").read_text()) + executable = Path(temp) / game + subprocess.run([os.environ.get("CXX", "c++"), "-std=c++20", "-Wall", "-Wextra", "-Werror", "-fsanitize=address,undefined", + "-I", str(plugin / "utils"), "-I", str(ROOT / "tools/tests"), str(source), "-lcurl", "-o", str(executable)], check=True) + print(game, flush=True) + subprocess.run([str(executable)], check=True) diff --git a/tools/test_plugin_http.py b/tools/test_plugin_http.py new file mode 100644 index 0000000..abbff91 --- /dev/null +++ b/tools/test_plugin_http.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +"""Compile both real HTTP utilities and exercise native deadlines on loopback.""" +import http.server +import json +import os +from pathlib import Path +import socketserver +import subprocess +import tempfile +import threading +import time + +ROOT = Path(__file__).resolve().parents[1] + + +class Handler(http.server.BaseHTTPRequestHandler): + def log_message(self, *_): + pass + + def do_POST(self): + body = self.rfile.read(int(self.headers.get("Content-Length", 0))) + assert body == b'{"event":"heartbeat"}' + assert self.headers.get("Content-Type") == "application/json" + assert self.headers.get("Authorization") == "Bearer test-only" + if self.path == "/stall": + time.sleep(2) + return + if self.path == "/partial": + self.send_response(200) + self.send_header("Content-Length", "100") + self.end_headers() + self.wfile.write(b"{") + self.wfile.flush() + time.sleep(2) + return + if self.path == "/slow": + time.sleep(0.1) + status = int(self.path[1:]) if self.path[1:].isdigit() else 200 + payload = b'{"ok":true}' if status == 200 else b'{"ok":false}' + self.send_response(status) + self.send_header("Content-Length", str(len(payload))) + self.end_headers() + self.wfile.write(payload) + + +class StallTLS(socketserver.BaseRequestHandler): + def handle(self): + # Accept TCP but never finish TLS: the connection deadline must fire. + time.sleep(6) + + +class Server(socketserver.ThreadingTCPServer): + daemon_threads = True + + +def main(): + with Server(("127.0.0.1", 0), Handler) as http, Server(("127.0.0.1", 0), StallTLS) as tls, tempfile.TemporaryDirectory(prefix="tws-http-tests-") as temp: + for server in (http, tls): + threading.Thread(target=server.serve_forever, daemon=True).start() + try: + for game in ("t5", "t6"): + source = ROOT / game / "plugins" / f"tws-{game}-gsc-utils" / "src" / "utils" + executable = Path(temp) / game + subprocess.run([os.environ.get("CXX", "c++"), "-std=c++20", "-Wall", "-Wextra", "-Werror", "-I", str(source), + str(ROOT / "tools/tests/http_probe.cpp"), str(source / "http.cpp"), "-lcurl", "-o", str(executable)], check=True) + base = f"http://127.0.0.1:{http.server_address[1]}" + env = {**os.environ, "NO_PROXY": "*", "no_proxy": "*"} + + def probe(path, connect="1000", total="1000"): + url = path if "://" in path else base + path + completed = subprocess.run([str(executable), url, connect, total], env=env, capture_output=True, text=True, check=True, timeout=8) + return json.loads(completed.stdout) + + normal = probe("/200", "-", "-") + assert normal["curl_code"] == 0 and normal["http_status"] == 200 and normal["body_size"] == 11, normal + assert 0 <= normal["dns_ms"] <= normal["connect_ms"] <= normal["first_byte_ms"] <= normal["total_ms"], normal + for status in (401, 429, 500): + rejected = probe(f"/{status}") + assert rejected["curl_code"] == 0 and rejected["http_status"] == status and rejected["body_size"] == 12, rejected + for path, status in (("/stall", 0), ("/partial", 200)): + timed_out = probe(path, total="200") + assert timed_out["curl_code"] == 28 and timed_out["http_status"] == status, timed_out + assert 150 <= timed_out["total_ms"] < 1500 and timed_out["wall_ms"] < 1500, timed_out + assert timed_out["body_size"] == 0, timed_out + if status: assert timed_out["first_byte_ms"] > 0, timed_out + assert probe("/200")["curl_code"] == 0 # The next request completes after the stall. + slow = probe("/slow") + assert slow["curl_code"] == 0 and slow["first_byte_ms"] >= 90, slow + tls_url = f"https://127.0.0.1:{tls.server_address[1]}/" + stalled_connect = probe(tls_url, connect="150", total="1000") + assert stalled_connect["curl_code"] == 28 and 100 <= stalled_connect["total_ms"] < 800, stalled_connect + # Total timeout must also bound connection setup when it is shorter. + total_connect = probe(tls_url, connect="1000", total="150") + assert total_connect["curl_code"] == 28 and 100 <= total_connect["total_ms"] < 800, total_connect + for connect, total in (("0", "100"), ("100", "0"), ("-1", "100")): + invalid = probe("/200", connect, total) + assert invalid["curl_code"] == 43 and invalid["http_status"] == 0, invalid + print(f"PASS {game}: POST body/headers, HTTP errors, stalled/partial responses, recovery, TLS/connect and total deadlines, invalid limits", flush=True) + finally: + http.shutdown() + tls.shutdown() + + +if __name__ == "__main__": + main() diff --git a/tools/tests/http_component_cases.cpp b/tools/tests/http_component_cases.cpp new file mode 100644 index 0000000..7cf6ce0 --- /dev/null +++ b/tools/tests/http_component_cases.cpp @@ -0,0 +1,94 @@ +int main() +{ + using namespace scripting; + http::http_request_params_t params{}; + array options; + http::parse_request_options(params, options); + assert(params.limits.connect_timeout_ms == 5000 && params.limits.timeout_ms == 15000); + options["connect_timeout_ms"] = 120; + options["timeout_ms"] = 450; + options["method"] = "POST"; + options["body"] = "snapshot"; + array headers; + headers["Authorization"] = "Bearer test-only"; + options["headers"] = headers; + http::parse_request_options(params, options); + assert(params.limits.connect_timeout_ms == 120 && params.limits.timeout_ms == 450); + assert(params.method == "POST" && params.fields == "snapshot" && params.headers.at("Authorization") == "Bearer test-only"); + for (const auto* key : {"connect_timeout_ms", "timeout_ms"}) + { + for (script_value value : {script_value(0), script_value(-1), script_value(1.5), script_value("150")}) + { + array bad; + bad[key] = value; + bool rejected = false; + try { http::parse_request_options(params, bad); } + catch (const std::runtime_error&) { rejected = true; } + assert(rejected); + } + } + http::parse_request_options(params, options); + auto send = [&]() + { + notifications.clear(); + http::create_request(params); + http::check_requests(); + assert(notifications.empty()); // Incomplete work never notifies early. + scheduler::thread_pool.run(); + http::check_requests(); + assert(notifications.size() == 1 && notifications.front().size() == 4); + assert(utils::http::observed_limits.connect_timeout_ms == 120 && utils::http::observed_limits.timeout_ms == 450); + auto diagnostics = notifications.front()[3].as(); + assert(diagnostics["worker_queue_ms"].as() >= 0 && diagnostics["notify_ms"].as() >= 0); + assert(diagnostics["connect_timeout_ms"].as() == 120 && diagnostics["timeout_ms"].as() == 450); + assert(diagnostics.data->size() == 11); + http::check_requests(); + assert(notifications.size() == 1); // Exactly one completion. + return diagnostics; + }; + utils::http::result successful; + successful.code = CURLE_OK; + successful.status = 200; + successful.buffer = "accepted"; + successful.dns_ms = 1; + successful.connect_ms = 2; + successful.tls_ms = 3; + successful.first_byte_ms = 4; + successful.total_ms = 5; + utils::http::next_result = successful; + auto diagnostics = send(); + assert(notifications.front()[0].as() == "accepted" && notifications.front()[1].as()); + assert(notifications.front()[2].get_raw().type == game::SCRIPT_NONE); + assert(diagnostics["http_status"].as() == 200 && diagnostics["curl_code"].as() == 0); + assert(diagnostics["dns_ms"].as() == 1 && diagnostics["connect_ms"].as() == 2); + assert(diagnostics["tls_ms"].as() == 3 && diagnostics["first_byte_ms"].as() == 4 && diagnostics["total_ms"].as() == 5); + utils::http::next_result->status = 500; + assert(send()["http_status"].as() == 500 && notifications.front()[1].as()); + utils::http::next_result->code = CURLE_OPERATION_TIMEDOUT; + assert(send()["curl_code"].as() == 28 && !notifications.front()[1].as()); + assert(notifications.front()[0].get_raw().type == game::SCRIPT_NONE && notifications.front()[2].is()); + utils::http::next_result = std::nullopt; + send(); + assert(!notifications.front()[1].as()); + utils::http::throw_from_transfer = true; + send(); + assert(!notifications.front()[1].as()); + utils::http::throw_from_transfer = false; + utils::http::next_result = successful; + utils::http::next_result->buffer = std::string(0x5001, 'x'); + send(); + assert(notifications.front()[0].as().size() == 0x5000); + // A resumed waiter can enqueue enough work to reallocate the pending vector. + utils::http::next_result = successful; + notifications.clear(); + http::create_request(params); + scheduler::thread_pool.run(); + after_notify = [&]() { for (int i = 0; i < 100; ++i) http::create_request(params); }; + http::check_requests(); + after_notify = {}; + assert(http::requests.size() == 100 && notifications.size() == 1); + scheduler::thread_pool.run(); + http::check_requests(); + assert(http::requests.empty() && notifications.size() == 101); + puts("\nPASS component: option validation, metadata, compatible argument order, single completion on failures/exceptions, reentrant queue"); +} diff --git a/tools/tests/http_component_stub.hpp b/tools/tests/http_component_stub.hpp new file mode 100644 index 0000000..543d97d --- /dev/null +++ b/tools/tests/http_component_stub.hpp @@ -0,0 +1,121 @@ +// Minimal host interfaces for compiling the real component without the game VM. +#pragma once +#include "http.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std::chrono_literals; + +namespace game { constexpr int SCRIPT_NONE = 0; } +namespace plugin { class plugin {}; } +class component_interface +{ +public: + virtual ~component_interface() = default; + virtual void on_startup(plugin::plugin*) {} + virtual void on_shutdown(plugin::plugin*) {} +}; +#define REGISTER_COMPONENT(...) + +namespace scripting +{ + class array; + class script_value; + using fields = std::map; + class script_value + { + public: + std::variant> data; + script_value() = default; + script_value(int v) : data(v) {} + script_value(bool v) : data(v) {} + script_value(double v) : data(v) {} + script_value(const char* v) : data(std::string(v)) {} + script_value(std::string v) : data(std::move(v)) {} + script_value(const array& v); + template bool is() const { return std::holds_alternative(data); } + template T as() const { return std::get(data); } + struct raw { int type; }; + raw get_raw() const { return {static_cast(data.index())}; } + std::string to_string() const { return as(); } + }; + class array + { + public: + std::shared_ptr data = std::make_shared(); + script_value& operator[](const script_value& key) const { return (*data)[key.as()]; } + std::vector get_keys() const + { + std::vector keys; + for (const auto& [key, value] : *data) keys.emplace_back(key); + return keys; + } + }; + inline script_value::script_value(const array& v) : data(v.data) {} + template <> inline bool script_value::is() const { return std::holds_alternative>(data); } + template <> inline array script_value::as() const + { + array result; + result.data = std::get>(data); + return result; + } + using variadic_args = std::vector; + class object + { + inline static unsigned next_id = 1; + unsigned id = next_id++; + public: + unsigned get_entity_id() const { return id; } + }; + inline std::vector> notifications; + inline std::function after_notify; + inline void notify(unsigned, const std::string& event, const std::vector& args) + { + assert(event == "done"); + notifications.push_back(args); + if (after_notify) after_notify(); + } + inline void on_shutdown(const std::function&) {} +} +namespace scheduler +{ + struct pool + { + std::vector> tasks; + void push(std::function f) { tasks.push_back(std::move(f)); } + void run() + { + auto work = std::move(tasks); + tasks.clear(); + for (auto& task : work) task(); + } + }; + inline pool thread_pool; + constexpr int server = 0; + inline void loop(const std::function&, int) {} +} +namespace gsc::function +{ + template void add(const char*, F) {} + template void add_multiple(F, Names...) {} +} +namespace utils::http +{ + inline bool throw_from_transfer = false; + inline std::optional next_result = result{}; + inline timeouts observed_limits; + inline std::optional get_data(const std::string&, const std::string&, const headers&, const std::string&, const timeouts& limits) + { + observed_limits = limits; + if (throw_from_transfer) throw std::runtime_error("simulated worker error"); + return next_result; + } +} diff --git a/tools/tests/http_probe.cpp b/tools/tests/http_probe.cpp new file mode 100644 index 0000000..3217d3f --- /dev/null +++ b/tools/tests/http_probe.cpp @@ -0,0 +1,26 @@ +#include "http.hpp" + +#include +#include +#include + +int main(int argc, char** argv) +{ + if (argc != 4 || curl_global_init(CURL_GLOBAL_DEFAULT) != CURLE_OK) + return 2; + utils::http::timeouts limits; + // A dash exercises the defaults compiled into the actual plugin source. + if (std::string(argv[2]) != "-") limits.connect_timeout_ms = std::stol(argv[2]); + if (std::string(argv[3]) != "-") limits.timeout_ms = std::stol(argv[3]); + const auto started = std::chrono::steady_clock::now(); + const auto result = utils::http::get_data(argv[1], "{\"event\":\"heartbeat\"}", + {{"Content-Type", "application/json"}, {"Authorization", "Bearer test-only"}}, "POST", limits); + const auto wall_ms = std::chrono::duration(std::chrono::steady_clock::now() - started).count(); + if (!result) return 3; + std::cout << "{\"curl_code\":" << result->code << ",\"http_status\":" << result->status + << ",\"dns_ms\":" << result->dns_ms << ",\"connect_ms\":" << result->connect_ms + << ",\"tls_ms\":" << result->tls_ms << ",\"first_byte_ms\":" << result->first_byte_ms + << ",\"total_ms\":" << result->total_ms << ",\"wall_ms\":" << wall_ms + << ",\"body_size\":" << result->buffer.size() << "}\n"; + curl_global_cleanup(); +}