diff --git a/.github/workflows/create_release.yaml b/.github/workflows/create_release.yaml new file mode 100644 index 0000000..9dd06f3 --- /dev/null +++ b/.github/workflows/create_release.yaml @@ -0,0 +1,48 @@ +name: Create Release + +on: + workflow_dispatch: + inputs: + version: + description: 'Release version number' + required: true + +jobs: + build: + runs-on: windows-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: setup-msbuild + uses: microsoft/setup-msbuild@v1.1 + + - run: msbuild ${{ github.event.repository.name }}.sln -t:rebuild -verbosity:diag -property:Configuration=Release -property:Platform=x64 + - run: cp x64\Release\${{ github.event.repository.name }}.asi ./${{ github.event.repository.name }}.asi + + - uses: robinraju/release-downloader@v1.8 + with: + repository: "ThirteenAG/Ultimate-ASI-Loader" + latest: true + fileName: "Ultimate-ASI-Loader_x64.zip" + - run: unzip Ultimate-ASI-Loader_x64.zip -d .\ + - run: C:\msys64\usr\bin\wget.exe -O .\UltimateASILoader_LICENSE.md https://raw.githubusercontent.com/ThirteenAG/Ultimate-ASI-Loader/master/license + - run: cp .\dinput8.dll .\wininet.dll + - run: mv .\dinput8.dll .\winhttp.dll + - run: cp .\README.md .\${{ github.event.repository.name }}_README.md + - run: 7z a -tzip ${{ github.event.repository.name }}_${{ github.event.inputs.version }}.zip wininet.dll winhttp.dll UltimateASILoader_LICENSE.md ${{ github.event.repository.name }}.asi ${{ github.event.repository.name }}_README.md ${{ github.event.repository.name }}.ini + - run: 7z a ${{ github.event.repository.name }}_${{ github.event.inputs.version }}.zip assets\ + + - uses: ncipollo/release-action@v1 + with: + artifacts: "${{ github.event.repository.name }}_${{ github.event.inputs.version }}.zip" + token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.event.inputs.version }} + name: "${{ github.event.inputs.version }}" + draft: true + generateReleaseNotes: true + artifactErrorsFailBuild: true + diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml new file mode 100644 index 0000000..c37cc67 --- /dev/null +++ b/.github/workflows/msbuild.yml @@ -0,0 +1,28 @@ +name: CI Builds + +on: + push: + branches: [ "master", "main" ] + pull_request: + branches: [ "master", "main" ] + +permissions: + contents: read + +jobs: + build: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: setup-msbuild + uses: microsoft/setup-msbuild@v1.1 + + - run: msbuild ${{ github.event.repository.name }}.sln -t:rebuild -verbosity:diag -property:Configuration=Release -property:Platform=x64 + - run: cp x64\Release\${{ github.event.repository.name }}.asi ./${{ github.event.repository.name }}.asi + - run: cp .\README.md .\${{ github.event.repository.name }}_README.md + - run: 7z a -tzip ${{ github.event.repository.name }}-run-${{ github.run_number }} ${{ github.event.repository.name }}.ini ${{ github.event.repository.name }}_README.md ${{ github.event.repository.name }}.asi + - run: 7z a ${{ github.event.repository.name }}-run-${{ github.run_number }} assets\ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d30549d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "external/minhook"] + path = external/minhook + url = https://github.com/TsudaKageyu/minhook +[submodule "external/mINI"] + path = external/mINI + url = https://github.com/metayeti/mINI diff --git a/MGS3CrouchWalk.ini b/MGS3CrouchWalk.ini new file mode 100644 index 0000000..ee9da97 --- /dev/null +++ b/MGS3CrouchWalk.ini @@ -0,0 +1,5 @@ +[Settings] +CamoIndexModifier = 1.0 +CamoIndexValue = -10 +CrouchWalkSpeed = 5.5 +CrouchStalkSpeed = 3.0 \ No newline at end of file diff --git a/MGS3CrouchWalk.sln b/MGS3CrouchWalk.sln index 27a16d3..d9dbd8c 100644 --- a/MGS3CrouchWalk.sln +++ b/MGS3CrouchWalk.sln @@ -4,6 +4,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 17.7.34031.279 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MGS3CrouchWalk", "MGS3CrouchWalk\MGS3CrouchWalk.vcxproj", "{FE4A0B03-4DC5-4685-8D43-05F8C481C981}" + ProjectSection(ProjectDependencies) = postProject + {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "external\minhook\build\VC17\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +26,14 @@ Global {FE4A0B03-4DC5-4685-8D43-05F8C481C981}.Release|x64.Build.0 = Release|x64 {FE4A0B03-4DC5-4685-8D43-05F8C481C981}.Release|x86.ActiveCfg = Release|Win32 {FE4A0B03-4DC5-4685-8D43-05F8C481C981}.Release|x86.Build.0 = Release|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.ActiveCfg = Debug|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.Build.0 = Debug|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.ActiveCfg = Release|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj b/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj index 345ca69..2f21e15 100644 --- a/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj +++ b/MGS3CrouchWalk/MGS3CrouchWalk.vcxproj @@ -72,9 +72,13 @@ .asi + ..\external\mINI\src\mini;..\external\minhook\include;$(ExternalIncludePath) .asi + ..\external\mINI\src\mini;..\external\minhook\include;$(ExternalIncludePath) + + @@ -119,12 +123,13 @@ NotUsing pch.h stdcpplatest + true Windows true false - $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)\libMinHook.lib; + $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib @@ -140,6 +145,7 @@ MaxSpeed false stdcpplatest + true Windows @@ -147,7 +153,7 @@ true true false - $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)\libMinHook.lib;Shlwapi.lib + $(CoreLibraryDependencies);%(AdditionalDependencies);$(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;Shlwapi.lib diff --git a/MGS3CrouchWalk/MinHook.h b/MGS3CrouchWalk/MinHook.h deleted file mode 100644 index d0509eb..0000000 --- a/MGS3CrouchWalk/MinHook.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) -#error MinHook supports only x86 and x64 systems. -#endif - -#include - - // MinHook Error Codes. -typedef enum MH_STATUS -{ - // Unknown error. Should not be returned. - MH_UNKNOWN = -1, - - // Successful. - MH_OK = 0, - - // MinHook is already initialized. - MH_ERROR_ALREADY_INITIALIZED, - - // MinHook is not initialized yet, or already uninitialized. - MH_ERROR_NOT_INITIALIZED, - - // The hook for the specified target function is already created. - MH_ERROR_ALREADY_CREATED, - - // The hook for the specified target function is not created yet. - MH_ERROR_NOT_CREATED, - - // The hook for the specified target function is already enabled. - MH_ERROR_ENABLED, - - // The hook for the specified target function is not enabled yet, or already - // disabled. - MH_ERROR_DISABLED, - - // The specified pointer is invalid. It points the address of non-allocated - // and/or non-executable region. - MH_ERROR_NOT_EXECUTABLE, - - // The specified target function cannot be hooked. - MH_ERROR_UNSUPPORTED_FUNCTION, - - // Failed to allocate memory. - MH_ERROR_MEMORY_ALLOC, - - // Failed to change the memory protection. - MH_ERROR_MEMORY_PROTECT, - - // The specified module is not loaded. - MH_ERROR_MODULE_NOT_FOUND, - - // The specified function is not found. - MH_ERROR_FUNCTION_NOT_FOUND -} -MH_STATUS; - -// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, -// MH_QueueEnableHook or MH_QueueDisableHook. -#define MH_ALL_HOOKS NULL - -#ifdef __cplusplus -extern "C" { -#endif - - // Initialize the MinHook library. You must call this function EXACTLY ONCE - // at the beginning of your program. - MH_STATUS WINAPI MH_Initialize(VOID); - - // Uninitialize the MinHook library. You must call this function EXACTLY - // ONCE at the end of your program. - MH_STATUS WINAPI MH_Uninitialize(VOID); - - // Creates a Hook for the specified target function, in disabled state. - // Parameters: - // pTarget [in] A pointer to the target function, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID* ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApi( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID* ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - // ppTarget [out] A pointer to the target function, which will be used - // with other functions. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApiEx( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID* ppOriginal, LPVOID* ppTarget); - - // Removes an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); - - // Enables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // enabled in one go. - MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); - - // Disables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // disabled in one go. - MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); - - // Queues to enable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be enabled. - MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); - - // Queues to disable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be disabled. - MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); - - // Applies all queued changes in one go. - MH_STATUS WINAPI MH_ApplyQueued(VOID); - - // Translates the MH_STATUS to its name as a string. - const char* WINAPI MH_StatusToString(MH_STATUS status); - -#ifdef __cplusplus -} -#endif - diff --git a/MGS3CrouchWalk/dllmain.cpp b/MGS3CrouchWalk/dllmain.cpp index 0ead760..3437c72 100644 --- a/MGS3CrouchWalk/dllmain.cpp +++ b/MGS3CrouchWalk/dllmain.cpp @@ -1,3 +1,6 @@ +#include +#include +#include #include #include "Memory.h" #include "MinHook.h" @@ -201,8 +204,42 @@ void InstallHooks() void ReadConfig() { - mINI::INIFile file("MGS3CrouchWalk.ini"); - file.read(Config); + WCHAR exePath[MAX_PATH] = { 0 }; + GetModuleFileNameW(GameModule, exePath, MAX_PATH); + std::filesystem::path pModPath = std::filesystem::path(exePath).remove_filename(); + bool bFoundOnce = false; + std::array paths = { "", "plugins", "scripts", "update" }; + for (const auto& path : paths) + { + auto filePath = pModPath / path / "MGS3CrouchWalk.asi"; + if (std::filesystem::exists(filePath)) + { + if (bFoundOnce) //multiple versions found + { + AllocConsole(); + FILE* dummy; + freopen_s(&dummy, "CONOUT$", "w", stdout); + std::string errorMessage = "DUPLICATE FILE ERROR: Duplicate MGS3CrouchWalk.asi installations found! Please make sure to delete any old versions!\n"; + errorMessage.append("DUPLICATE FILE ERROR - Installation 1: ").append((pModPath / "MGS3CrouchWalk.asi").string()).append("\n"); + errorMessage.append("DUPLICATE FILE ERROR - Installation 2: ").append(filePath.string()); + std::cout << errorMessage << std::endl; + return FreeLibraryAndExitThread(GameModule, 1); + } + bFoundOnce = true; + pModPath = filePath.parent_path(); + } + } + mINI::INIFile iniFile((pModPath / "MGS3CrouchWalk.ini").string()); + if (!iniFile.read(Config)) + { + AllocConsole(); + FILE* dummy; + freopen_s(&dummy, "CONOUT$", "w", stdout); + std::cout << "MGS3CrouchWalk Error: Could not find MGS3CrouchWalk.ini in " << pModPath << std::endl; + std::cout << "MGS3CrouchWalk Error: Please make sure the config file is in the same folder as MGS3CrouchWalk.asi." << std::endl; + return FreeLibraryAndExitThread(GameModule, 1); + } + CamoIndexModifier = std::stof(Config["Settings"]["CamoIndexModifier"]); CamoIndexValue = std::stoi(Config["Settings"]["CamoIndexValue"]) * 10; CrouchWalkSpeed = std::stof(Config["Settings"]["CrouchWalkSpeed"]); diff --git a/MGS3CrouchWalk/ini.h b/MGS3CrouchWalk/ini.h deleted file mode 100644 index 1adc2fb..0000000 --- a/MGS3CrouchWalk/ini.h +++ /dev/null @@ -1,789 +0,0 @@ -/* - * The MIT License (MIT) - * Copyright (c) 2018 Danijel Durakovic - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - - /////////////////////////////////////////////////////////////////////////////// - // - // /mINI/ v0.9.14 - // An INI file reader and writer for the modern age. - // - /////////////////////////////////////////////////////////////////////////////// - // - // A tiny utility library for manipulating INI files with a straightforward - // API and a minimal footprint. It conforms to the (somewhat) standard INI - // format - sections and keys are case insensitive and all leading and - // trailing whitespace is ignored. Comments are lines that begin with a - // semicolon. Trailing comments are allowed on section lines. - // - // Files are read on demand, upon which data is kept in memory and the file - // is closed. This utility supports lazy writing, which only writes changes - // and updates to a file and preserves custom formatting and comments. A lazy - // write invoked by a write() call will read the output file, find what - // changes have been made and update the file accordingly. If you only need to - // generate files, use generate() instead. Section and key order is preserved - // on read, write and insert. - // - /////////////////////////////////////////////////////////////////////////////// - // - // /* BASIC USAGE EXAMPLE: */ - // - // /* read from file */ - // mINI::INIFile file("myfile.ini"); - // mINI::INIStructure ini; - // file.read(ini); - // - // /* read value; gets a reference to actual value in the structure. - // if key or section don't exist, a new empty value will be created */ - // std::string& value = ini["section"]["key"]; - // - // /* read value safely; gets a copy of value in the structure. - // does not alter the structure */ - // std::string value = ini.get("section").get("key"); - // - // /* set or update values */ - // ini["section"]["key"] = "value"; - // - // /* set multiple values */ - // ini["section2"].set({ - // {"key1", "value1"}, - // {"key2", "value2"} - // }); - // - // /* write updates back to file, preserving comments and formatting */ - // file.write(ini); - // - // /* or generate a file (overwrites the original) */ - // file.generate(ini); - // - /////////////////////////////////////////////////////////////////////////////// - // - // Long live the INI file!!! - // - /////////////////////////////////////////////////////////////////////////////// - -#ifndef MINI_INI_H_ -#define MINI_INI_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mINI -{ - namespace INIStringUtil - { - const char* const whitespaceDelimiters = " \t\n\r\f\v"; - inline void trim(std::string& str) - { - str.erase(str.find_last_not_of(whitespaceDelimiters) + 1); - str.erase(0, str.find_first_not_of(whitespaceDelimiters)); - } -#ifndef MINI_CASE_SENSITIVE - inline void toLower(std::string& str) - { - std::transform(str.begin(), str.end(), str.begin(), [](const char c) { - return static_cast(std::tolower(c)); - }); - } -#endif - inline void replace(std::string& str, std::string const& a, std::string const& b) - { - if (!a.empty()) - { - std::size_t pos = 0; - while ((pos = str.find(a, pos)) != std::string::npos) - { - str.replace(pos, a.size(), b); - pos += b.size(); - } - } - } -#ifdef _WIN32 - const char* const endl = "\r\n"; -#else - const char* const endl = "\n"; -#endif - } - - template - class INIMap - { - private: - using T_DataIndexMap = std::unordered_map; - using T_DataItem = std::pair; - using T_DataContainer = std::vector; - using T_MultiArgs = typename std::vector>; - - T_DataIndexMap dataIndexMap; - T_DataContainer data; - - inline std::size_t setEmpty(std::string& key) - { - std::size_t index = data.size(); - dataIndexMap[key] = index; - data.emplace_back(key, T()); - return index; - } - - public: - using const_iterator = typename T_DataContainer::const_iterator; - - INIMap() { } - - INIMap(INIMap const& other) - { - std::size_t data_size = other.data.size(); - for (std::size_t i = 0; i < data_size; ++i) - { - auto const& key = other.data[i].first; - auto const& obj = other.data[i].second; - data.emplace_back(key, obj); - } - dataIndexMap = T_DataIndexMap(other.dataIndexMap); - } - - T& operator[](std::string key) - { - INIStringUtil::trim(key); -#ifndef MINI_CASE_SENSITIVE - INIStringUtil::toLower(key); -#endif - auto it = dataIndexMap.find(key); - bool hasIt = (it != dataIndexMap.end()); - std::size_t index = (hasIt) ? it->second : setEmpty(key); - return data[index].second; - } - T get(std::string key) const - { - INIStringUtil::trim(key); -#ifndef MINI_CASE_SENSITIVE - INIStringUtil::toLower(key); -#endif - auto it = dataIndexMap.find(key); - if (it == dataIndexMap.end()) - { - return T(); - } - return T(data[it->second].second); - } - bool has(std::string key) const - { - INIStringUtil::trim(key); -#ifndef MINI_CASE_SENSITIVE - INIStringUtil::toLower(key); -#endif - return (dataIndexMap.count(key) == 1); - } - void set(std::string key, T obj) - { - INIStringUtil::trim(key); -#ifndef MINI_CASE_SENSITIVE - INIStringUtil::toLower(key); -#endif - auto it = dataIndexMap.find(key); - if (it != dataIndexMap.end()) - { - data[it->second].second = obj; - } - else - { - dataIndexMap[key] = data.size(); - data.emplace_back(key, obj); - } - } - void set(T_MultiArgs const& multiArgs) - { - for (auto const& it : multiArgs) - { - auto const& key = it.first; - auto const& obj = it.second; - set(key, obj); - } - } - bool remove(std::string key) - { - INIStringUtil::trim(key); -#ifndef MINI_CASE_SENSITIVE - INIStringUtil::toLower(key); -#endif - auto it = dataIndexMap.find(key); - if (it != dataIndexMap.end()) - { - std::size_t index = it->second; - data.erase(data.begin() + index); - dataIndexMap.erase(it); - for (auto& it2 : dataIndexMap) - { - auto& vi = it2.second; - if (vi > index) - { - vi--; - } - } - return true; - } - return false; - } - void clear() - { - data.clear(); - dataIndexMap.clear(); - } - std::size_t size() const - { - return data.size(); - } - const_iterator begin() const { return data.begin(); } - const_iterator end() const { return data.end(); } - }; - - using INIStructure = INIMap>; - - namespace INIParser - { - using T_ParseValues = std::pair; - - enum class PDataType : char - { - PDATA_NONE, - PDATA_COMMENT, - PDATA_SECTION, - PDATA_KEYVALUE, - PDATA_UNKNOWN - }; - - inline PDataType parseLine(std::string line, T_ParseValues& parseData) - { - parseData.first.clear(); - parseData.second.clear(); - INIStringUtil::trim(line); - if (line.empty()) - { - return PDataType::PDATA_NONE; - } - char firstCharacter = line[0]; - if (firstCharacter == ';') - { - return PDataType::PDATA_COMMENT; - } - if (firstCharacter == '[') - { - auto commentAt = line.find_first_of(';'); - if (commentAt != std::string::npos) - { - line = line.substr(0, commentAt); - } - auto closingBracketAt = line.find_last_of(']'); - if (closingBracketAt != std::string::npos) - { - auto section = line.substr(1, closingBracketAt - 1); - INIStringUtil::trim(section); - parseData.first = section; - return PDataType::PDATA_SECTION; - } - } - auto lineNorm = line; - INIStringUtil::replace(lineNorm, "\\=", " "); - auto equalsAt = lineNorm.find_first_of('='); - if (equalsAt != std::string::npos) - { - auto key = line.substr(0, equalsAt); - INIStringUtil::trim(key); - INIStringUtil::replace(key, "\\=", "="); - auto value = line.substr(equalsAt + 1); - INIStringUtil::trim(value); - parseData.first = key; - parseData.second = value; - return PDataType::PDATA_KEYVALUE; - } - return PDataType::PDATA_UNKNOWN; - } - } - - class INIReader - { - public: - using T_LineData = std::vector; - using T_LineDataPtr = std::shared_ptr; - - bool isBOM = false; - - private: - std::ifstream fileReadStream; - T_LineDataPtr lineData; - - T_LineData readFile() - { - fileReadStream.seekg(0, std::ios::end); - const std::size_t fileSize = static_cast(fileReadStream.tellg()); - fileReadStream.seekg(0, std::ios::beg); - if (fileSize >= 3) { - const char header[3] = { - static_cast(fileReadStream.get()), - static_cast(fileReadStream.get()), - static_cast(fileReadStream.get()) - }; - isBOM = ( - header[0] == static_cast(0xEF) && - header[1] == static_cast(0xBB) && - header[2] == static_cast(0xBF) - ); - } - else { - isBOM = false; - } - std::string fileContents; - fileContents.resize(fileSize); - fileReadStream.seekg(isBOM ? 3 : 0, std::ios::beg); - fileReadStream.read(&fileContents[0], fileSize); - fileReadStream.close(); - T_LineData output; - if (fileSize == 0) - { - return output; - } - std::string buffer; - buffer.reserve(50); - for (std::size_t i = 0; i < fileSize; ++i) - { - char& c = fileContents[i]; - if (c == '\n') - { - output.emplace_back(buffer); - buffer.clear(); - continue; - } - if (c != '\0' && c != '\r') - { - buffer += c; - } - } - output.emplace_back(buffer); - return output; - } - - public: - INIReader(std::string const& filename, bool keepLineData = false) - { - fileReadStream.open(filename, std::ios::in | std::ios::binary); - if (keepLineData) - { - lineData = std::make_shared(); - } - } - ~INIReader() { } - - bool operator>>(INIStructure& data) - { - if (!fileReadStream.is_open()) - { - return false; - } - T_LineData fileLines = readFile(); - std::string section; - bool inSection = false; - INIParser::T_ParseValues parseData; - for (auto const& line : fileLines) - { - auto parseResult = INIParser::parseLine(line, parseData); - if (parseResult == INIParser::PDataType::PDATA_SECTION) - { - inSection = true; - data[section = parseData.first]; - } - else if (inSection && parseResult == INIParser::PDataType::PDATA_KEYVALUE) - { - auto const& key = parseData.first; - auto const& value = parseData.second; - data[section][key] = value; - } - if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN) - { - if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection) - { - continue; - } - lineData->emplace_back(line); - } - } - return true; - } - T_LineDataPtr getLines() - { - return lineData; - } - }; - - class INIGenerator - { - private: - std::ofstream fileWriteStream; - - public: - bool prettyPrint = false; - - INIGenerator(std::string const& filename) - { - fileWriteStream.open(filename, std::ios::out | std::ios::binary); - } - ~INIGenerator() { } - - bool operator<<(INIStructure const& data) - { - if (!fileWriteStream.is_open()) - { - return false; - } - if (!data.size()) - { - return true; - } - auto it = data.begin(); - for (;;) - { - auto const& section = it->first; - auto const& collection = it->second; - fileWriteStream - << "[" - << section - << "]"; - if (collection.size()) - { - fileWriteStream << INIStringUtil::endl; - auto it2 = collection.begin(); - for (;;) - { - auto key = it2->first; - INIStringUtil::replace(key, "=", "\\="); - auto value = it2->second; - INIStringUtil::trim(value); - fileWriteStream - << key - << ((prettyPrint) ? " = " : "=") - << value; - if (++it2 == collection.end()) - { - break; - } - fileWriteStream << INIStringUtil::endl; - } - } - if (++it == data.end()) - { - break; - } - fileWriteStream << INIStringUtil::endl; - if (prettyPrint) - { - fileWriteStream << INIStringUtil::endl; - } - } - return true; - } - }; - - class INIWriter - { - private: - using T_LineData = std::vector; - using T_LineDataPtr = std::shared_ptr; - - std::string filename; - - T_LineData getLazyOutput(T_LineDataPtr const& lineData, INIStructure& data, INIStructure& original) - { - T_LineData output; - INIParser::T_ParseValues parseData; - std::string sectionCurrent; - bool parsingSection = false; - bool continueToNextSection = false; - bool discardNextEmpty = false; - bool writeNewKeys = false; - std::size_t lastKeyLine = 0; - for (auto line = lineData->begin(); line != lineData->end(); ++line) - { - if (!writeNewKeys) - { - auto parseResult = INIParser::parseLine(*line, parseData); - if (parseResult == INIParser::PDataType::PDATA_SECTION) - { - if (parsingSection) - { - writeNewKeys = true; - parsingSection = false; - --line; - continue; - } - sectionCurrent = parseData.first; - if (data.has(sectionCurrent)) - { - parsingSection = true; - continueToNextSection = false; - discardNextEmpty = false; - output.emplace_back(*line); - lastKeyLine = output.size(); - } - else - { - continueToNextSection = true; - discardNextEmpty = true; - continue; - } - } - else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE) - { - if (continueToNextSection) - { - continue; - } - if (data.has(sectionCurrent)) - { - auto& collection = data[sectionCurrent]; - auto const& key = parseData.first; - auto const& value = parseData.second; - if (collection.has(key)) - { - auto outputValue = collection[key]; - if (value == outputValue) - { - output.emplace_back(*line); - } - else - { - INIStringUtil::trim(outputValue); - auto lineNorm = *line; - INIStringUtil::replace(lineNorm, "\\=", " "); - auto equalsAt = lineNorm.find_first_of('='); - auto valueAt = lineNorm.find_first_not_of( - INIStringUtil::whitespaceDelimiters, - equalsAt + 1 - ); - std::string outputLine = line->substr(0, valueAt); - if (prettyPrint && equalsAt + 1 == valueAt) - { - outputLine += " "; - } - outputLine += outputValue; - output.emplace_back(outputLine); - } - lastKeyLine = output.size(); - } - } - } - else - { - if (discardNextEmpty && line->empty()) - { - discardNextEmpty = false; - } - else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN) - { - output.emplace_back(*line); - } - } - } - if (writeNewKeys || std::next(line) == lineData->end()) - { - T_LineData linesToAdd; - if (data.has(sectionCurrent) && original.has(sectionCurrent)) - { - auto const& collection = data[sectionCurrent]; - auto const& collectionOriginal = original[sectionCurrent]; - for (auto const& it : collection) - { - auto key = it.first; - if (collectionOriginal.has(key)) - { - continue; - } - auto value = it.second; - INIStringUtil::replace(key, "=", "\\="); - INIStringUtil::trim(value); - linesToAdd.emplace_back( - key + ((prettyPrint) ? " = " : "=") + value - ); - } - } - if (!linesToAdd.empty()) - { - output.insert( - output.begin() + lastKeyLine, - linesToAdd.begin(), - linesToAdd.end() - ); - } - if (writeNewKeys) - { - writeNewKeys = false; - --line; - } - } - } - for (auto const& it : data) - { - auto const& section = it.first; - if (original.has(section)) - { - continue; - } - if (prettyPrint && output.size() > 0 && !output.back().empty()) - { - output.emplace_back(); - } - output.emplace_back("[" + section + "]"); - auto const& collection = it.second; - for (auto const& it2 : collection) - { - auto key = it2.first; - auto value = it2.second; - INIStringUtil::replace(key, "=", "\\="); - INIStringUtil::trim(value); - output.emplace_back( - key + ((prettyPrint) ? " = " : "=") + value - ); - } - } - return output; - } - - public: - bool prettyPrint = false; - - INIWriter(std::string const& filename) - : filename(filename) - { - } - ~INIWriter() { } - - bool operator<<(INIStructure& data) - { - struct stat buf; - bool fileExists = (stat(filename.c_str(), &buf) == 0); - if (!fileExists) - { - INIGenerator generator(filename); - generator.prettyPrint = prettyPrint; - return generator << data; - } - INIStructure originalData; - T_LineDataPtr lineData; - bool readSuccess = false; - bool fileIsBOM = false; - { - INIReader reader(filename, true); - if ((readSuccess = reader >> originalData)) - { - lineData = reader.getLines(); - fileIsBOM = reader.isBOM; - } - } - if (!readSuccess) - { - return false; - } - T_LineData output = getLazyOutput(lineData, data, originalData); - std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary); - if (fileWriteStream.is_open()) - { - if (fileIsBOM) { - const char utf8_BOM[3] = { - static_cast(0xEF), - static_cast(0xBB), - static_cast(0xBF) - }; - fileWriteStream.write(utf8_BOM, 3); - } - if (output.size()) - { - auto line = output.begin(); - for (;;) - { - fileWriteStream << *line; - if (++line == output.end()) - { - break; - } - fileWriteStream << INIStringUtil::endl; - } - } - return true; - } - return false; - } - }; - - class INIFile - { - private: - std::string filename; - - public: - INIFile(std::string const& filename) - : filename(filename) - { } - - ~INIFile() { } - - bool read(INIStructure& data) const - { - if (data.size()) - { - data.clear(); - } - if (filename.empty()) - { - return false; - } - INIReader reader(filename); - return reader >> data; - } - bool generate(INIStructure const& data, bool pretty = false) const - { - if (filename.empty()) - { - return false; - } - INIGenerator generator(filename); - generator.prettyPrint = pretty; - return generator << data; - } - bool write(INIStructure& data, bool pretty = false) const - { - if (filename.empty()) - { - return false; - } - INIWriter writer(filename); - writer.prettyPrint = pretty; - return writer << data; - } - }; -} - -#endif // MINI_INI_H_ diff --git a/README.md b/README.md index e61ed73..4e96078 100644 --- a/README.md +++ b/README.md @@ -12,5 +12,12 @@ A plugin that aims to bring crouch walking to Metal Gear Solid 3: Master Collect - The camo index is dynamically adjusted while crouch walking. - Seamlessly integrated into the game engine as a genuine feature, without displacing any existing functionality. +## Installation +- Extract the contents of the release zip into the game folder.
(e.g. "**steamapps\common\MGS3**"). + +### Steam Deck/Linux Additional Instructions +🚩**You do not need to do this if you are using Windows!** +- Open up the game properties of MGS3 in Steam and add `WINEDLLOVERRIDES="wininet,winhttp=n,b" %command%` to the launch options. + ## Credits - Zoft for mtar research and porting the 3DS animations over to the Master Collection diff --git a/assets/mtar/fr/00023291.mtar b/assets/mtar/fr/00023291.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/fr/00023291.mtar differ diff --git a/assets/mtar/fr/00025bb7.mtar b/assets/mtar/fr/00025bb7.mtar new file mode 100644 index 0000000..75f6810 Binary files /dev/null and b/assets/mtar/fr/00025bb7.mtar differ diff --git a/assets/mtar/fr/0002614b.mtar b/assets/mtar/fr/0002614b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/0002614b.mtar differ diff --git a/assets/mtar/fr/00027945.mtar b/assets/mtar/fr/00027945.mtar new file mode 100644 index 0000000..9f6291e Binary files /dev/null and b/assets/mtar/fr/00027945.mtar differ diff --git a/assets/mtar/fr/00027ef8.mtar b/assets/mtar/fr/00027ef8.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/fr/00027ef8.mtar differ diff --git a/assets/mtar/fr/00201199.mtar b/assets/mtar/fr/00201199.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/fr/00201199.mtar differ diff --git a/assets/mtar/fr/00215251.mtar b/assets/mtar/fr/00215251.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/00215251.mtar differ diff --git a/assets/mtar/fr/0046e2cb.mtar b/assets/mtar/fr/0046e2cb.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/fr/0046e2cb.mtar differ diff --git a/assets/mtar/fr/00482b59.mtar b/assets/mtar/fr/00482b59.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/fr/00482b59.mtar differ diff --git a/assets/mtar/fr/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/fr/00482b59_slot_weapons-pipogun.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/fr/00482b59_slot_weapons-pipogun.mtar differ diff --git a/assets/mtar/fr/0048e32b.mtar b/assets/mtar/fr/0048e32b.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/fr/0048e32b.mtar differ diff --git a/assets/mtar/fr/004963a5.mtar b/assets/mtar/fr/004963a5.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/fr/004963a5.mtar differ diff --git a/assets/mtar/fr/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/fr/004963a5_slot_weapons-coltgave_custom.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/fr/004963a5_slot_weapons-coltgave_custom.mtar differ diff --git a/assets/mtar/fr/004c4af2.mtar b/assets/mtar/fr/004c4af2.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/fr/004c4af2.mtar differ diff --git a/assets/mtar/fr/0051525f.mtar b/assets/mtar/fr/0051525f.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/0051525f.mtar differ diff --git a/assets/mtar/fr/005ea57b.mtar b/assets/mtar/fr/005ea57b.mtar new file mode 100644 index 0000000..e7db73e Binary files /dev/null and b/assets/mtar/fr/005ea57b.mtar differ diff --git a/assets/mtar/fr/006891cc.mtar b/assets/mtar/fr/006891cc.mtar new file mode 100644 index 0000000..4205c3c Binary files /dev/null and b/assets/mtar/fr/006891cc.mtar differ diff --git a/assets/mtar/fr/006bc12e.mtar b/assets/mtar/fr/006bc12e.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/fr/006bc12e.mtar differ diff --git a/assets/mtar/fr/006bc12e_slot_weapons-knife.mtar b/assets/mtar/fr/006bc12e_slot_weapons-knife.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/fr/006bc12e_slot_weapons-knife.mtar differ diff --git a/assets/mtar/fr/006c745a.mtar b/assets/mtar/fr/006c745a.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/fr/006c745a.mtar differ diff --git a/assets/mtar/fr/00914f09.mtar b/assets/mtar/fr/00914f09.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/00914f09.mtar differ diff --git a/assets/mtar/fr/00ad99ca.mtar b/assets/mtar/fr/00ad99ca.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/fr/00ad99ca.mtar differ diff --git a/assets/mtar/fr/00bad929.mtar b/assets/mtar/fr/00bad929.mtar new file mode 100644 index 0000000..0c5eef2 Binary files /dev/null and b/assets/mtar/fr/00bad929.mtar differ diff --git a/assets/mtar/fr/00c8b59b.mtar b/assets/mtar/fr/00c8b59b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/00c8b59b.mtar differ diff --git a/assets/mtar/fr/00ccbff6.mtar b/assets/mtar/fr/00ccbff6.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/fr/00ccbff6.mtar differ diff --git a/assets/mtar/fr/00d14e46.mtar b/assets/mtar/fr/00d14e46.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/00d14e46.mtar differ diff --git a/assets/mtar/fr/00d791ea.mtar b/assets/mtar/fr/00d791ea.mtar new file mode 100644 index 0000000..8d2fc6e Binary files /dev/null and b/assets/mtar/fr/00d791ea.mtar differ diff --git a/assets/mtar/fr/00f8e660.mtar b/assets/mtar/fr/00f8e660.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/fr/00f8e660.mtar differ diff --git a/assets/mtar/fr/00fc64d1.mtar b/assets/mtar/fr/00fc64d1.mtar new file mode 100644 index 0000000..e975cb7 Binary files /dev/null and b/assets/mtar/fr/00fc64d1.mtar differ diff --git a/assets/mtar/gr/00023291.mtar b/assets/mtar/gr/00023291.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/gr/00023291.mtar differ diff --git a/assets/mtar/gr/00025bb7.mtar b/assets/mtar/gr/00025bb7.mtar new file mode 100644 index 0000000..75f6810 Binary files /dev/null and b/assets/mtar/gr/00025bb7.mtar differ diff --git a/assets/mtar/gr/0002614b.mtar b/assets/mtar/gr/0002614b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/0002614b.mtar differ diff --git a/assets/mtar/gr/00027945.mtar b/assets/mtar/gr/00027945.mtar new file mode 100644 index 0000000..9f6291e Binary files /dev/null and b/assets/mtar/gr/00027945.mtar differ diff --git a/assets/mtar/gr/00027ef8.mtar b/assets/mtar/gr/00027ef8.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/gr/00027ef8.mtar differ diff --git a/assets/mtar/gr/00201199.mtar b/assets/mtar/gr/00201199.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/gr/00201199.mtar differ diff --git a/assets/mtar/gr/00215251.mtar b/assets/mtar/gr/00215251.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/00215251.mtar differ diff --git a/assets/mtar/gr/0046e2cb.mtar b/assets/mtar/gr/0046e2cb.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/gr/0046e2cb.mtar differ diff --git a/assets/mtar/gr/00482b59.mtar b/assets/mtar/gr/00482b59.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/gr/00482b59.mtar differ diff --git a/assets/mtar/gr/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/gr/00482b59_slot_weapons-pipogun.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/gr/00482b59_slot_weapons-pipogun.mtar differ diff --git a/assets/mtar/gr/0048e32b.mtar b/assets/mtar/gr/0048e32b.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/gr/0048e32b.mtar differ diff --git a/assets/mtar/gr/004963a5.mtar b/assets/mtar/gr/004963a5.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/gr/004963a5.mtar differ diff --git a/assets/mtar/gr/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/gr/004963a5_slot_weapons-coltgave_custom.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/gr/004963a5_slot_weapons-coltgave_custom.mtar differ diff --git a/assets/mtar/gr/004c4af2.mtar b/assets/mtar/gr/004c4af2.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/gr/004c4af2.mtar differ diff --git a/assets/mtar/gr/0051525f.mtar b/assets/mtar/gr/0051525f.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/0051525f.mtar differ diff --git a/assets/mtar/gr/005ea57b.mtar b/assets/mtar/gr/005ea57b.mtar new file mode 100644 index 0000000..e7db73e Binary files /dev/null and b/assets/mtar/gr/005ea57b.mtar differ diff --git a/assets/mtar/gr/006891cc.mtar b/assets/mtar/gr/006891cc.mtar new file mode 100644 index 0000000..4205c3c Binary files /dev/null and b/assets/mtar/gr/006891cc.mtar differ diff --git a/assets/mtar/gr/006bc12e.mtar b/assets/mtar/gr/006bc12e.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/gr/006bc12e.mtar differ diff --git a/assets/mtar/gr/006bc12e_slot_weapons-knife.mtar b/assets/mtar/gr/006bc12e_slot_weapons-knife.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/gr/006bc12e_slot_weapons-knife.mtar differ diff --git a/assets/mtar/gr/006c745a.mtar b/assets/mtar/gr/006c745a.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/gr/006c745a.mtar differ diff --git a/assets/mtar/gr/00914f09.mtar b/assets/mtar/gr/00914f09.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/00914f09.mtar differ diff --git a/assets/mtar/gr/00ad99ca.mtar b/assets/mtar/gr/00ad99ca.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/gr/00ad99ca.mtar differ diff --git a/assets/mtar/gr/00bad929.mtar b/assets/mtar/gr/00bad929.mtar new file mode 100644 index 0000000..0c5eef2 Binary files /dev/null and b/assets/mtar/gr/00bad929.mtar differ diff --git a/assets/mtar/gr/00c8b59b.mtar b/assets/mtar/gr/00c8b59b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/00c8b59b.mtar differ diff --git a/assets/mtar/gr/00ccbff6.mtar b/assets/mtar/gr/00ccbff6.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/gr/00ccbff6.mtar differ diff --git a/assets/mtar/gr/00d14e46.mtar b/assets/mtar/gr/00d14e46.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/00d14e46.mtar differ diff --git a/assets/mtar/gr/00d791ea.mtar b/assets/mtar/gr/00d791ea.mtar new file mode 100644 index 0000000..8d2fc6e Binary files /dev/null and b/assets/mtar/gr/00d791ea.mtar differ diff --git a/assets/mtar/gr/00f8e660.mtar b/assets/mtar/gr/00f8e660.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/gr/00f8e660.mtar differ diff --git a/assets/mtar/gr/00fc64d1.mtar b/assets/mtar/gr/00fc64d1.mtar new file mode 100644 index 0000000..e975cb7 Binary files /dev/null and b/assets/mtar/gr/00fc64d1.mtar differ diff --git a/assets/mtar/it/00023291.mtar b/assets/mtar/it/00023291.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/it/00023291.mtar differ diff --git a/assets/mtar/it/00025bb7.mtar b/assets/mtar/it/00025bb7.mtar new file mode 100644 index 0000000..75f6810 Binary files /dev/null and b/assets/mtar/it/00025bb7.mtar differ diff --git a/assets/mtar/it/0002614b.mtar b/assets/mtar/it/0002614b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/0002614b.mtar differ diff --git a/assets/mtar/it/00027945.mtar b/assets/mtar/it/00027945.mtar new file mode 100644 index 0000000..9f6291e Binary files /dev/null and b/assets/mtar/it/00027945.mtar differ diff --git a/assets/mtar/it/00027ef8.mtar b/assets/mtar/it/00027ef8.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/it/00027ef8.mtar differ diff --git a/assets/mtar/it/00201199.mtar b/assets/mtar/it/00201199.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/it/00201199.mtar differ diff --git a/assets/mtar/it/00215251.mtar b/assets/mtar/it/00215251.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/00215251.mtar differ diff --git a/assets/mtar/it/0046e2cb.mtar b/assets/mtar/it/0046e2cb.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/it/0046e2cb.mtar differ diff --git a/assets/mtar/it/00482b59.mtar b/assets/mtar/it/00482b59.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/it/00482b59.mtar differ diff --git a/assets/mtar/it/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/it/00482b59_slot_weapons-pipogun.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/it/00482b59_slot_weapons-pipogun.mtar differ diff --git a/assets/mtar/it/0048e32b.mtar b/assets/mtar/it/0048e32b.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/it/0048e32b.mtar differ diff --git a/assets/mtar/it/004963a5.mtar b/assets/mtar/it/004963a5.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/it/004963a5.mtar differ diff --git a/assets/mtar/it/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/it/004963a5_slot_weapons-coltgave_custom.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/it/004963a5_slot_weapons-coltgave_custom.mtar differ diff --git a/assets/mtar/it/004c4af2.mtar b/assets/mtar/it/004c4af2.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/it/004c4af2.mtar differ diff --git a/assets/mtar/it/0051525f.mtar b/assets/mtar/it/0051525f.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/0051525f.mtar differ diff --git a/assets/mtar/it/005ea57b.mtar b/assets/mtar/it/005ea57b.mtar new file mode 100644 index 0000000..e7db73e Binary files /dev/null and b/assets/mtar/it/005ea57b.mtar differ diff --git a/assets/mtar/it/006891cc.mtar b/assets/mtar/it/006891cc.mtar new file mode 100644 index 0000000..4205c3c Binary files /dev/null and b/assets/mtar/it/006891cc.mtar differ diff --git a/assets/mtar/it/006bc12e.mtar b/assets/mtar/it/006bc12e.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/it/006bc12e.mtar differ diff --git a/assets/mtar/it/006bc12e_slot_weapons-knife.mtar b/assets/mtar/it/006bc12e_slot_weapons-knife.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/it/006bc12e_slot_weapons-knife.mtar differ diff --git a/assets/mtar/it/006c745a.mtar b/assets/mtar/it/006c745a.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/it/006c745a.mtar differ diff --git a/assets/mtar/it/00914f09.mtar b/assets/mtar/it/00914f09.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/00914f09.mtar differ diff --git a/assets/mtar/it/00ad99ca.mtar b/assets/mtar/it/00ad99ca.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/it/00ad99ca.mtar differ diff --git a/assets/mtar/it/00bad929.mtar b/assets/mtar/it/00bad929.mtar new file mode 100644 index 0000000..0c5eef2 Binary files /dev/null and b/assets/mtar/it/00bad929.mtar differ diff --git a/assets/mtar/it/00c8b59b.mtar b/assets/mtar/it/00c8b59b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/00c8b59b.mtar differ diff --git a/assets/mtar/it/00ccbff6.mtar b/assets/mtar/it/00ccbff6.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/it/00ccbff6.mtar differ diff --git a/assets/mtar/it/00d14e46.mtar b/assets/mtar/it/00d14e46.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/00d14e46.mtar differ diff --git a/assets/mtar/it/00d791ea.mtar b/assets/mtar/it/00d791ea.mtar new file mode 100644 index 0000000..8d2fc6e Binary files /dev/null and b/assets/mtar/it/00d791ea.mtar differ diff --git a/assets/mtar/it/00f8e660.mtar b/assets/mtar/it/00f8e660.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/it/00f8e660.mtar differ diff --git a/assets/mtar/it/00fc64d1.mtar b/assets/mtar/it/00fc64d1.mtar new file mode 100644 index 0000000..e975cb7 Binary files /dev/null and b/assets/mtar/it/00fc64d1.mtar differ diff --git a/assets/mtar/jp/00023291.mtar b/assets/mtar/jp/00023291.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/jp/00023291.mtar differ diff --git a/assets/mtar/jp/00025bb7.mtar b/assets/mtar/jp/00025bb7.mtar new file mode 100644 index 0000000..75f6810 Binary files /dev/null and b/assets/mtar/jp/00025bb7.mtar differ diff --git a/assets/mtar/jp/0002614b.mtar b/assets/mtar/jp/0002614b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/0002614b.mtar differ diff --git a/assets/mtar/jp/00027945.mtar b/assets/mtar/jp/00027945.mtar new file mode 100644 index 0000000..9f6291e Binary files /dev/null and b/assets/mtar/jp/00027945.mtar differ diff --git a/assets/mtar/jp/00027ef8.mtar b/assets/mtar/jp/00027ef8.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/jp/00027ef8.mtar differ diff --git a/assets/mtar/jp/00201199.mtar b/assets/mtar/jp/00201199.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/jp/00201199.mtar differ diff --git a/assets/mtar/jp/00215251.mtar b/assets/mtar/jp/00215251.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/00215251.mtar differ diff --git a/assets/mtar/jp/0046e2cb.mtar b/assets/mtar/jp/0046e2cb.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/jp/0046e2cb.mtar differ diff --git a/assets/mtar/jp/00482b59.mtar b/assets/mtar/jp/00482b59.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/jp/00482b59.mtar differ diff --git a/assets/mtar/jp/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/jp/00482b59_slot_weapons-pipogun.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/jp/00482b59_slot_weapons-pipogun.mtar differ diff --git a/assets/mtar/jp/0048e32b.mtar b/assets/mtar/jp/0048e32b.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/jp/0048e32b.mtar differ diff --git a/assets/mtar/jp/004963a5.mtar b/assets/mtar/jp/004963a5.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/jp/004963a5.mtar differ diff --git a/assets/mtar/jp/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/jp/004963a5_slot_weapons-coltgave_custom.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/jp/004963a5_slot_weapons-coltgave_custom.mtar differ diff --git a/assets/mtar/jp/004c4af2.mtar b/assets/mtar/jp/004c4af2.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/jp/004c4af2.mtar differ diff --git a/assets/mtar/jp/0051525f.mtar b/assets/mtar/jp/0051525f.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/0051525f.mtar differ diff --git a/assets/mtar/jp/005ea57b.mtar b/assets/mtar/jp/005ea57b.mtar new file mode 100644 index 0000000..e7db73e Binary files /dev/null and b/assets/mtar/jp/005ea57b.mtar differ diff --git a/assets/mtar/jp/006891cc.mtar b/assets/mtar/jp/006891cc.mtar new file mode 100644 index 0000000..4205c3c Binary files /dev/null and b/assets/mtar/jp/006891cc.mtar differ diff --git a/assets/mtar/jp/006bc12e.mtar b/assets/mtar/jp/006bc12e.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/jp/006bc12e.mtar differ diff --git a/assets/mtar/jp/006bc12e_slot_weapons-knife.mtar b/assets/mtar/jp/006bc12e_slot_weapons-knife.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/jp/006bc12e_slot_weapons-knife.mtar differ diff --git a/assets/mtar/jp/006c745a.mtar b/assets/mtar/jp/006c745a.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/jp/006c745a.mtar differ diff --git a/assets/mtar/jp/00914f09.mtar b/assets/mtar/jp/00914f09.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/00914f09.mtar differ diff --git a/assets/mtar/jp/00ad99ca.mtar b/assets/mtar/jp/00ad99ca.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/jp/00ad99ca.mtar differ diff --git a/assets/mtar/jp/00bad929.mtar b/assets/mtar/jp/00bad929.mtar new file mode 100644 index 0000000..0c5eef2 Binary files /dev/null and b/assets/mtar/jp/00bad929.mtar differ diff --git a/assets/mtar/jp/00c8b59b.mtar b/assets/mtar/jp/00c8b59b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/00c8b59b.mtar differ diff --git a/assets/mtar/jp/00ccbff6.mtar b/assets/mtar/jp/00ccbff6.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/jp/00ccbff6.mtar differ diff --git a/assets/mtar/jp/00d14e46.mtar b/assets/mtar/jp/00d14e46.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/00d14e46.mtar differ diff --git a/assets/mtar/jp/00d791ea.mtar b/assets/mtar/jp/00d791ea.mtar new file mode 100644 index 0000000..8d2fc6e Binary files /dev/null and b/assets/mtar/jp/00d791ea.mtar differ diff --git a/assets/mtar/jp/00f8e660.mtar b/assets/mtar/jp/00f8e660.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/jp/00f8e660.mtar differ diff --git a/assets/mtar/jp/00fc64d1.mtar b/assets/mtar/jp/00fc64d1.mtar new file mode 100644 index 0000000..e975cb7 Binary files /dev/null and b/assets/mtar/jp/00fc64d1.mtar differ diff --git a/assets/mtar/sp/00023291.mtar b/assets/mtar/sp/00023291.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/sp/00023291.mtar differ diff --git a/assets/mtar/sp/00025bb7.mtar b/assets/mtar/sp/00025bb7.mtar new file mode 100644 index 0000000..75f6810 Binary files /dev/null and b/assets/mtar/sp/00025bb7.mtar differ diff --git a/assets/mtar/sp/0002614b.mtar b/assets/mtar/sp/0002614b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/0002614b.mtar differ diff --git a/assets/mtar/sp/00027945.mtar b/assets/mtar/sp/00027945.mtar new file mode 100644 index 0000000..9f6291e Binary files /dev/null and b/assets/mtar/sp/00027945.mtar differ diff --git a/assets/mtar/sp/00027ef8.mtar b/assets/mtar/sp/00027ef8.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/sp/00027ef8.mtar differ diff --git a/assets/mtar/sp/00201199.mtar b/assets/mtar/sp/00201199.mtar new file mode 100644 index 0000000..35f51a3 Binary files /dev/null and b/assets/mtar/sp/00201199.mtar differ diff --git a/assets/mtar/sp/00215251.mtar b/assets/mtar/sp/00215251.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/00215251.mtar differ diff --git a/assets/mtar/sp/0046e2cb.mtar b/assets/mtar/sp/0046e2cb.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/sp/0046e2cb.mtar differ diff --git a/assets/mtar/sp/00482b59.mtar b/assets/mtar/sp/00482b59.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/sp/00482b59.mtar differ diff --git a/assets/mtar/sp/00482b59_slot_weapons-pipogun.mtar b/assets/mtar/sp/00482b59_slot_weapons-pipogun.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/sp/00482b59_slot_weapons-pipogun.mtar differ diff --git a/assets/mtar/sp/0048e32b.mtar b/assets/mtar/sp/0048e32b.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/sp/0048e32b.mtar differ diff --git a/assets/mtar/sp/004963a5.mtar b/assets/mtar/sp/004963a5.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/sp/004963a5.mtar differ diff --git a/assets/mtar/sp/004963a5_slot_weapons-coltgave_custom.mtar b/assets/mtar/sp/004963a5_slot_weapons-coltgave_custom.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/sp/004963a5_slot_weapons-coltgave_custom.mtar differ diff --git a/assets/mtar/sp/004c4af2.mtar b/assets/mtar/sp/004c4af2.mtar new file mode 100644 index 0000000..f6dd513 Binary files /dev/null and b/assets/mtar/sp/004c4af2.mtar differ diff --git a/assets/mtar/sp/0051525f.mtar b/assets/mtar/sp/0051525f.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/0051525f.mtar differ diff --git a/assets/mtar/sp/005ea57b.mtar b/assets/mtar/sp/005ea57b.mtar new file mode 100644 index 0000000..e7db73e Binary files /dev/null and b/assets/mtar/sp/005ea57b.mtar differ diff --git a/assets/mtar/sp/006891cc.mtar b/assets/mtar/sp/006891cc.mtar new file mode 100644 index 0000000..4205c3c Binary files /dev/null and b/assets/mtar/sp/006891cc.mtar differ diff --git a/assets/mtar/sp/006bc12e.mtar b/assets/mtar/sp/006bc12e.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/sp/006bc12e.mtar differ diff --git a/assets/mtar/sp/006bc12e_slot_weapons-knife.mtar b/assets/mtar/sp/006bc12e_slot_weapons-knife.mtar new file mode 100644 index 0000000..cd31cdc Binary files /dev/null and b/assets/mtar/sp/006bc12e_slot_weapons-knife.mtar differ diff --git a/assets/mtar/sp/006c745a.mtar b/assets/mtar/sp/006c745a.mtar new file mode 100644 index 0000000..8c2802d Binary files /dev/null and b/assets/mtar/sp/006c745a.mtar differ diff --git a/assets/mtar/sp/00914f09.mtar b/assets/mtar/sp/00914f09.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/00914f09.mtar differ diff --git a/assets/mtar/sp/00ad99ca.mtar b/assets/mtar/sp/00ad99ca.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/sp/00ad99ca.mtar differ diff --git a/assets/mtar/sp/00bad929.mtar b/assets/mtar/sp/00bad929.mtar new file mode 100644 index 0000000..0c5eef2 Binary files /dev/null and b/assets/mtar/sp/00bad929.mtar differ diff --git a/assets/mtar/sp/00c8b59b.mtar b/assets/mtar/sp/00c8b59b.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/00c8b59b.mtar differ diff --git a/assets/mtar/sp/00ccbff6.mtar b/assets/mtar/sp/00ccbff6.mtar new file mode 100644 index 0000000..51cda84 Binary files /dev/null and b/assets/mtar/sp/00ccbff6.mtar differ diff --git a/assets/mtar/sp/00d14e46.mtar b/assets/mtar/sp/00d14e46.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/00d14e46.mtar differ diff --git a/assets/mtar/sp/00d791ea.mtar b/assets/mtar/sp/00d791ea.mtar new file mode 100644 index 0000000..8d2fc6e Binary files /dev/null and b/assets/mtar/sp/00d791ea.mtar differ diff --git a/assets/mtar/sp/00f8e660.mtar b/assets/mtar/sp/00f8e660.mtar new file mode 100644 index 0000000..5224502 Binary files /dev/null and b/assets/mtar/sp/00f8e660.mtar differ diff --git a/assets/mtar/sp/00fc64d1.mtar b/assets/mtar/sp/00fc64d1.mtar new file mode 100644 index 0000000..e975cb7 Binary files /dev/null and b/assets/mtar/sp/00fc64d1.mtar differ diff --git a/assets/mtar/us/006891cc.mtar b/assets/mtar/us/006891cc.mtar new file mode 100644 index 0000000..4205c3c Binary files /dev/null and b/assets/mtar/us/006891cc.mtar differ diff --git a/external/mINI b/external/mINI new file mode 160000 index 0000000..52b66e9 --- /dev/null +++ b/external/mINI @@ -0,0 +1 @@ +Subproject commit 52b66e987cb56171dc91d96115cdf094b6e4d7a0 diff --git a/external/minhook b/external/minhook new file mode 160000 index 0000000..565968b --- /dev/null +++ b/external/minhook @@ -0,0 +1 @@ +Subproject commit 565968b28583221751cc2810e09ea621745fc3a3 diff --git a/libMinHook.lib b/libMinHook.lib deleted file mode 100644 index 45dd2a0..0000000 Binary files a/libMinHook.lib and /dev/null differ