From f0cceb04ac36709db6743e0c29a1d270e575151e Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 20 Oct 2023 22:27:22 -0400 Subject: [PATCH 01/23] Build tweaks --- .github/workflows/ci.yml | 10 ++-------- .gitignore | 6 +++++- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72a668d..d092e40 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,14 +22,8 @@ jobs: include: - os: windows-2022 - os: ubuntu-latest - container: registry.gitlab.steamos.cloud/steamrt/sniper/platform + container: registry.gitlab.steamos.cloud/steamrt/sniper/sdk steps: - - name: Install apt packages - if: runner.os == 'Linux' - run: | - apt update - apt install -y git python3 python3-setuptools clang - - name: Checkout uses: actions/checkout@v4 with: @@ -65,7 +59,7 @@ jobs: shell: bash run: | mkdir build && cd build - python ../configure.py --enable-optimize --sdks cs2 + python ../configure.py --enable-optimize --symbol-files --sdks cs2 ambuild - name: Upload artifact diff --git a/.gitignore b/.gitignore index efe1261..2503ae8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,8 @@ msvc10/.vs msvc10/Release - CS GO Release.csgo libtier0.so -libvstdlib.so \ No newline at end of file +libvstdlib.so +build/ +winbuild/ +windowsbuild/ +linuxbuild/ \ No newline at end of file From 07d6e304dc3d60a3d7f21574167db131b583205a Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 13 Nov 2023 21:33:50 -0500 Subject: [PATCH 02/23] Update README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bbd8bfc..e704e26 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ A Counter-Strike 2 Metamod plugin that removes the max speed limitation from pla Ported from the [Movement Unlocker](https://forums.alliedmods.net/showthread.php?t=255298) SourceMod plugin for CS:GO. +Note this plugin is currently incompatible with the ZE build of CS2Fixes, as it also implements unlocked movement. Pick one or the other as you don't need both. + ## Installation - Install [Metamod](https://www.sourcemm.net/downloads.php?branch=dev) From 8d0b9773d16845ebcd13ce3c0d637a6c4c3ca8eb Mon Sep 17 00:00:00 2001 From: Vauff Date: Sat, 18 Nov 2023 16:35:32 -0500 Subject: [PATCH 03/23] Update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e704e26..fe61d7c 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ A Counter-Strike 2 Metamod plugin that removes the max speed limitation from pla Ported from the [Movement Unlocker](https://forums.alliedmods.net/showthread.php?t=255298) SourceMod plugin for CS:GO. -Note this plugin is currently incompatible with the ZE build of CS2Fixes, as it also implements unlocked movement. Pick one or the other as you don't need both. +Note this plugin is currently incompatible with CS2Fixes, as it also implements unlocked movement. Pick one or the other as you don't need both. ## Installation -- Install [Metamod](https://www.sourcemm.net/downloads.php?branch=dev) +- Install [Metamod](https://cs2.poggu.me/metamod/installation/) - Download the [latest release package](https://github.com/Source2ZE/MovementUnlocker/releases/latest) for your OS - Extract the package contents into `game/csgo` on your server \ No newline at end of file From ec6913115e89b7a87ffb26d3c127116fc8a2924a Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 29 Jan 2024 07:00:29 -0500 Subject: [PATCH 04/23] Add license headers --- MovementUnlocker.cpp | 19 +++++++++++++++++++ MovementUnlocker.h | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 99fa03d..d209b32 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -1,3 +1,22 @@ +/** + * ============================================================================= + * Movement Unlocker + * Copyright (C) 2024 Source2ZE + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + #include #include "MovementUnlocker.h" #include diff --git a/MovementUnlocker.h b/MovementUnlocker.h index ca5f335..e9c65ba 100644 --- a/MovementUnlocker.h +++ b/MovementUnlocker.h @@ -1,3 +1,22 @@ +/** + * ============================================================================= + * Movement Unlocker + * Copyright (C) 2024 Source2ZE + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + #ifndef _INCLUDE_MOVEMENT_UNLOCKER_H_ #define _INCLUDE_MOVEMENT_UNLOCKER_H_ From a152f5b1e072ea86faee6968936e2b4228260a6b Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 29 Jan 2024 08:08:48 -0500 Subject: [PATCH 05/23] Build script updates, move to manifest-based build --- .github/workflows/ci.yml | 21 +- .gitmodules | 3 + AMBuildScript | 409 ++++++++++----------------------------- AMBuilder | 33 ++-- configure.py | 2 + hl2sdk-manifests | 1 + 6 files changed, 122 insertions(+), 347 deletions(-) create mode 100644 .gitmodules create mode 160000 hl2sdk-manifests diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d092e40..847f1b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,14 +1,6 @@ name: CI -on: - push: - branches: - - main - tags: - - '*' - pull_request: - branches: - - main +on: [push, pull_request] jobs: build: @@ -28,6 +20,7 @@ jobs: uses: actions/checkout@v4 with: path: MovementUnlocker + submodules: recursive - name: Checkout Metamod uses: actions/checkout@v4 @@ -59,11 +52,11 @@ jobs: shell: bash run: | mkdir build && cd build - python ../configure.py --enable-optimize --symbol-files --sdks cs2 + python ../configure.py --enable-optimize --symbol-files --sdks cs2 --hl2sdk-manifests hl2sdk-manifests/ ambuild - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ runner.os }} path: MovementUnlocker/build/package @@ -76,7 +69,7 @@ jobs: steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 - name: Package run: | @@ -84,12 +77,12 @@ jobs: ls -Rall if [ -d "./Linux/" ]; then cd ./Linux/ - tar -czf ../${{ github.event.repository.name }}-${version}-linux.tar.gz addons + tar -czf ../${{ github.event.repository.name }}-${version}-linux.tar.gz * cd - fi if [ -d "./Windows/" ]; then cd ./Windows/ - zip -r ../${{ github.event.repository.name }}-${version}-windows.zip addons + zip -r ../${{ github.event.repository.name }}-${version}-windows.zip * cd - fi diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..fce44cc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "hl2sdk-manifests"] + path = hl2sdk-manifests + url = https://github.com/alliedmodders/hl2sdk-manifests.git diff --git a/AMBuildScript b/AMBuildScript index 39067a3..378303e 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -1,99 +1,26 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os, sys -additional_libs = [ - # Path should be relative either to hl2sdk folder or to build folder - #'path/to/lib/example.lib', -] +# Edit the functions below for the extra functionality, the return should be +# a list of path's to wanted locations +def additional_libs(context, binary, sdk): + return [ + # Path should be relative either to hl2sdk folder or to build folder + # 'path/to/lib/example.lib', + ] -additional_defines = [ - #'EXAMPLE_DEFINE=2' -] +def additional_defines(context, binary, sdk): + return [ + # 'EXAMPLE_DEFINE=2' + ] -additional_includes = [ - # Path should be absolute only! - #'D:/absolute/path/to/include/folder/' -] - -class SDK(object): - def __init__(self, sdk, ext, aDef, name, platform, dir): - self.folder = 'hl2sdk-' + dir - self.envvar = sdk - self.ext = ext - self.code = aDef - self.define = name - self.name = dir - self.path = None # Actual path - self.platformSpec = platform - - # By default, nothing supports x64. - if type(platform) is list: - self.platformSpec = {p: ['x86'] for p in platform} - else: - self.platformSpec = platform - - def shouldBuild(self, targets): - for cxx in targets: - if cxx.target.platform in self.platformSpec: - if cxx.target.arch in self.platformSpec[cxx.target.platform]: - return True - return False - -WinOnly = ['windows'] -WinLinux = ['windows', 'linux'] -WinLinuxMac = ['windows', 'linux', 'mac'] -CSGO = { - 'windows': ['x86'], - 'linux': ['x86', 'x86_64'], - 'mac': ['x86_64'] -} -Source2 = { - 'windows': ['x86_64'], - 'linux': ['x86_64'], -} -Insurgency = { - 'windows': ['x86', 'x86_64'], - 'linux': ['x86'], - 'mac': ['x86', 'x86_64'], -} -Blade = { - 'windows': ['x86', 'x86_64'], - 'linux': ['x86_64'] -} -Mock = { - 'windows': ['x86', 'x86_64'], - 'linux': ['x86', 'x86_64'], - 'mac': ['x86_64'] -} - -PossibleSDKs = { - 'episode1': SDK('HL2SDK', '2.ep1', '1', 'EPISODEONE', WinLinux, 'episode1'), - 'ep2': SDK('HL2SDKOB', '2.ep2', '3', 'ORANGEBOX', WinLinux, 'orangebox'), - 'css': SDK('HL2SDKCSS', '2.css', '6', 'CSS', WinLinuxMac, 'css'), - 'hl2dm': SDK('HL2SDKHL2DM', '2.hl2dm', '7', 'HL2DM', WinLinuxMac, 'hl2dm'), - 'dods': SDK('HL2SDKDODS', '2.dods', '8', 'DODS', WinLinuxMac, 'dods'), - 'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'), - 'tf2': SDK('HL2SDKTF2', '2.tf2', '12', 'TF2', WinLinuxMac, 'tf2'), - 'l4d': SDK('HL2SDKL4D', '2.l4d', '13', 'LEFT4DEAD', WinLinuxMac, 'l4d'), - 'nucleardawn': SDK('HL2SDKND', '2.nd', '14', 'NUCLEARDAWN', WinLinuxMac, 'nucleardawn'), - 'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '16', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'), - 'darkm': SDK('HL2SDK-DARKM', '2.darkm', '2', 'DARKMESSIAH', WinOnly, 'darkm'), - 'swarm': SDK('HL2SDK-SWARM', '2.swarm', '17', 'ALIENSWARM', WinOnly, 'swarm'), - 'bgt': SDK('HL2SDK-BGT', '2.bgt', '4', 'BLOODYGOODTIME', WinOnly, 'bgt'), - 'eye': SDK('HL2SDK-EYE', '2.eye', '5', 'EYE', WinOnly, 'eye'), - 'mcv': SDK('HL2SDKMCV', '2.mcv', '22', 'MCV', WinOnly, 'mcv'), - 'csgo': SDK('HL2SDKCSGO', '2.csgo', '23', 'CSGO', CSGO, 'csgo'), - 'portal2': SDK('HL2SDKPORTAL2', '2.portal2', '18', 'PORTAL2', [], 'portal2'), - 'blade': SDK('HL2SDKBLADE', '2.blade', '19', 'BLADE', Blade, 'blade'), - 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '20', 'INSURGENCY', Insurgency, 'insurgency'), - 'doi': SDK('HL2SDKDOI', '2.doi', '21', 'DOI', WinLinuxMac, 'doi'), - 'contagion': SDK('HL2SDKCONTAGION', '2.contagion', '15', 'CONTAGION', WinOnly, 'contagion'), - 'bms': SDK('HL2SDKBMS', '2.bms', '11', 'BMS', WinLinux, 'bms'), - 'mock': SDK('HL2SDK-MOCK', '2.mock', '999', 'MOCK', Mock, 'mock'), - 'pvkii': SDK('HL2SDKPVKII', '2.pvkii', '10', 'PVKII', WinLinux, 'pvkii'), - 'dota': SDK('HL2SDKDOTA', '2.dota', '24', 'DOTA', Source2, 'dota'), - 'cs2': SDK('HL2SDKCS2', '2.cs2', '25', 'CS2', Source2, 'cs2'), -} +def additional_includes(context, binary, sdk): + return [ + # Path should be absolute only! + # os.path.join(sdk['path'], 'game', 'server'), + # os.path.join(sdk['path'], 'public', 'entity2'), + # 'D:/absolute/path/to/include/folder/' + ] def ResolveEnvPath(env, folder): if env in os.environ: @@ -111,14 +38,44 @@ def ResolveEnvPath(env, folder): head, tail = os.path.split(head) return None -def Normalize(path): - return os.path.abspath(os.path.normpath(path)) +def ResolveMMSRoot(): + prenormalized_path = None + if builder.options.mms_path: + prenormalized_path = builder.options.mms_path + else: + prenormalized_path = ResolveEnvPath('MMSOURCE20', 'mmsource-2.0') + if not prenormalized_path: + prenormalized_path = ResolveEnvPath('MMSOURCE112', 'mmsource-1.12') + if not prenormalized_path: + prenormalized_path = ResolveEnvPath('MMSOURCE111', 'mmsource-1.11') + if not prenormalized_path: + prenormalized_path = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') + if not prenormalized_path: + prenormalized_path = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source') + if not prenormalized_path: + prenormalized_path = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') + if not prenormalized_path or not os.path.isdir(prenormalized_path): + raise Exception('Could not find a source copy of Metamod:Source') + + return os.path.abspath(os.path.normpath(prenormalized_path)) + +mms_root = ResolveMMSRoot() + +if not builder.options.hl2sdk_manifests: + raise Exception('Could not find a source copy of HL2SDK manifests') +hl2sdk_manifests = builder.options.hl2sdk_manifests + +SdkHelpers = builder.Eval(os.path.join(hl2sdk_manifests, 'SdkHelpers.ambuild'), { + 'Project': 'metamod' +}) class MMSPluginConfig(object): def __init__(self): + self.sdk_manifests = [] self.sdks = {} + self.sdk_targets = [] self.binaries = [] - self.mms_root = None + self.mms_root = mms_root self.all_targets = [] self.target_archs = set() @@ -135,8 +92,7 @@ class MMSPluginConfig(object): if builder.options.targets: target_archs = builder.options.targets.split(',') else: - target_archs = ['x86'] - target_archs.append('x86_64') + target_archs = ['x86_64'] for arch in target_archs: try: @@ -153,59 +109,25 @@ class MMSPluginConfig(object): if not self.all_targets: raise Exception('No suitable C/C++ compiler was found.') + def findSdkPath(self, sdk_name): + dir_name = 'hl2sdk-{}'.format(sdk_name) + if builder.options.hl2sdk_root: + sdk_path = os.path.join(builder.options.hl2sdk_root, dir_name) + if os.path.exists(sdk_path): + return sdk_path + return ResolveEnvPath('HL2SDK{}'.format(sdk_name.upper()), dir_name) + def detectSDKs(self): - sdk_list = builder.options.sdks.split(',') - use_all = sdk_list[0] == 'all' - use_present = sdk_list[0] == 'present' - if sdk_list[0] == '': - sdk_list = [] + sdk_list = [s for s in builder.options.sdks.split(',') if s] + SdkHelpers.find_sdk_path = self.findSdkPath + SdkHelpers.findSdks(builder, self.all_targets, sdk_list) - not_found = [] - for sdk_name in PossibleSDKs: - sdk = PossibleSDKs[sdk_name] - if sdk.shouldBuild(self.all_targets): - if builder.options.hl2sdk_root: - sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder) - if not os.path.exists(sdk_path): - sdk_path = None - else: - sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder) - if sdk_path is None: - if (use_all and sdk_name != 'mock') or sdk_name in sdk_list: - raise Exception('Could not find a valid path for {0}'.format(sdk.envvar)) - not_found.append(sdk_name) - continue - if use_all or use_present or sdk_name in sdk_list: - sdk.path = sdk_path - self.sdks[sdk_name] = sdk + self.sdks = SdkHelpers.sdks + self.sdk_manifests = SdkHelpers.sdk_manifests + self.sdk_targets = SdkHelpers.sdk_targets - if len(self.sdks) < 1 and len(sdk_list): - raise Exception('No SDKs were found, nothing to build.') - if len(self.sdks) > 1: raise Exception('Only one sdk at a time is supported, for multi-sdk approach use loader based solution.') - - if builder.options.mms_path: - self.mms_root = builder.options.mms_path - else: - self.mms_root = ResolveEnvPath('MMSOURCE20', 'mmsource-2.0') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE112', 'mmsource-1.12') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE111', 'mmsource-1.11') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'metamod-source') - if not self.mms_root: - self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') - if not self.mms_root or not os.path.isdir(self.mms_root): - raise Exception('Could not find a source copy of Metamod:Source') - self.mms_root = Normalize(self.mms_root) - - if use_present: - for sdk in not_found: - print('Warning: hl2sdk-{} was not found, and will not be included in build.'.format(sdk)) def configure(self): for cxx in self.all_targets: @@ -236,10 +158,7 @@ class MMSPluginConfig(object): '-fPIC', ] - if cxx.version == 'apple-clang-6.0' or cxx.version == 'clang-3.4': - cxx.cxxflags += ['-std=c++1y'] - else: - cxx.cxxflags += ['-std=c++14'] + cxx.cxxflags += ['-std=c++17'] if (cxx.version >= 'gcc-4.0') or cxx.family == 'clang': cxx.cflags += ['-fvisibility=hidden'] cxx.cxxflags += ['-fvisibility-inlines-hidden'] @@ -249,6 +168,7 @@ class MMSPluginConfig(object): '-fno-threadsafe-statics', '-Wno-non-virtual-dtor', '-Wno-overloaded-virtual', + '-Wno-register', ] if (cxx.version >= 'gcc-4.7' or cxx.family == 'clang'): cxx.cxxflags += ['-Wno-delete-non-virtual-dtor'] @@ -256,17 +176,17 @@ class MMSPluginConfig(object): cxx.cflags += ['-mfpmath=sse'] if cxx.family == 'clang': cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch'] - if cxx.version >= 'clang-3.9' or cxx.version >= 'apple-clang-10.0': + if cxx.version >= 'clang-3.9': cxx.cxxflags += ['-Wno-expansion-to-defined'] - if cxx.version >= 'clang-3.6' or cxx.version >= 'apple-clang-7.0': + if cxx.version >= 'clang-3.6': cxx.cxxflags += ['-Wno-inconsistent-missing-override'] - if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4': + if cxx.version >= 'clang-3.4': cxx.cxxflags += ['-Wno-deprecated-register'] else: cxx.cxxflags += ['-Wno-deprecated'] # Work around SDK warnings. - if cxx.version >= 'clang-10.0' or cxx.version >= 'apple-clang-12.0': + if cxx.version >= 'clang-10.0': cxx.cflags += [ '-Wno-implicit-int-float-conversion', '-Wno-tautological-overlap-compare', @@ -286,6 +206,7 @@ class MMSPluginConfig(object): cxx.cflags += [ '/W3', '/Zi', + '/std:c++17', ] cxx.cxxflags += ['/TP'] @@ -331,28 +252,12 @@ class MMSPluginConfig(object): # Platform-specifics if cxx.target.platform == 'linux': - cxx.defines += ['_LINUX', 'POSIX', '_FILE_OFFSET_BITS=64'] + cxx.defines += ['LINUX', '_LINUX', 'POSIX', '_FILE_OFFSET_BITS=64'] if cxx.family == 'gcc': cxx.linkflags += ['-static-libgcc'] elif cxx.family == 'clang': cxx.linkflags += ['-lgcc_eh'] - elif cxx.target.platform == 'mac': - cxx.defines += ['OSX', '_OSX', 'POSIX'] - - if cxx.version >= 'apple-clang-10.0': - cxx.cflags += ['-mmacosx-version-min=10.9', '-stdlib=libc++'] - cxx.linkflags += [ - '-mmacosx-version-min=10.9', - ] - else: - cxx.cflags += ['-mmacosx-version-min=10.5'] - cxx.linkflags += [ - '-mmacosx-version-min=10.5', - ] - - cxx.linkflags += [ - '-lc++', - ] + cxx.linkflags += ['-static-libstdc++'] elif cxx.target.platform == 'windows': cxx.defines += ['WIN32', '_WINDOWS'] @@ -362,157 +267,37 @@ class MMSPluginConfig(object): # Custom includes here cxx.includes += [ ] - def HL2Compiler(self, context, cxx, sdk): - compiler = cxx.clone() - mms_core_path = os.path.join(self.mms_root, 'core') - compiler.cxxincludes += [ - os.path.join(mms_core_path), - os.path.join(mms_core_path, 'sourcehook'), - os.path.join(context.currentSourcePath), - ] - - defines = ['SE_' + PossibleSDKs[i].define + '=' + PossibleSDKs[i].code for i in PossibleSDKs] - compiler.defines += defines - paths = [['public'], - ['public', 'engine'], - ['public', 'mathlib'], - ['public', 'vstdlib'], - ['public', 'tier0'], ['public', 'tier1']] - if sdk.name == 'episode1' or sdk.name == 'darkm': - paths.append(['public', 'dlls']) - paths.append(['game_shared']) - else: - paths.append(['public', 'game', 'server']) - paths.append(['game', 'shared']) - paths.append(['common']) - compiler.defines += ['SOURCE_ENGINE=' + sdk.code] - - if sdk.name in ['sdk2013', 'bms', 'pvkii'] and compiler.like('gcc'): - # The 2013 SDK already has these in public/tier0/basetypes.h - compiler.defines.remove('stricmp=strcasecmp') - compiler.defines.remove('_stricmp=strcasecmp') - compiler.defines.remove('_snprintf=snprintf') - compiler.defines.remove('_vsnprintf=vsnprintf') - - if compiler.family == 'msvc': - compiler.defines += ['COMPILER_MSVC'] - if compiler.target.arch == 'x86': - compiler.defines += ['COMPILER_MSVC32'] - elif compiler.target.arch == 'x86_64': - compiler.defines += ['COMPILER_MSVC64'] - - if compiler.version >= 1900: - compiler.linkflags += ['legacy_stdio_definitions.lib'] - else: - compiler.defines += ['COMPILER_GCC'] - - if compiler.target.arch == 'x86_64': - compiler.defines += ['X64BITS', 'PLATFORM_64BITS'] - - if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2', 'dota', 'cs2', 'pvkii']: - if compiler.target.platform in ['linux', 'mac']: - compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE'] - - if sdk.name in ['csgo', 'blade', 'pvkii'] and compiler.target.platform == 'linux': - compiler.linkflags += ['-lstdc++'] - - if sdk.name in ['dota', 'cs2']: - compiler.defines += ['META_IS_SOURCE2'] - - for path in paths: - compiler.cxxincludes += [os.path.join(sdk.path, *path)] - - compiler.linkflags += additional_libs - compiler.defines += additional_defines - compiler.cxxincludes += additional_includes - - return compiler - def Library(self, cxx, name): binary = cxx.Library(name) return binary - + def HL2Library(self, context, compiler, name, sdk): - compiler = self.HL2Compiler(context, compiler, sdk) - - if compiler.target.platform == 'linux': - if sdk.name == 'episode1': - lib_folder = os.path.join(sdk.path, 'linux_sdk') - elif sdk.name in ['sdk2013', 'bms', 'pvkii']: - lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') - elif compiler.target.arch == 'x86_64': - lib_folder = os.path.join(sdk.path, 'lib', 'linux64') - else: - lib_folder = os.path.join(sdk.path, 'lib', 'linux') - elif compiler.target.platform == 'mac': - if sdk.name in ['sdk2013', 'bms']: - lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') - elif compiler.target.arch == 'x86_64': - lib_folder = os.path.join(sdk.path, 'lib', 'osx64') - else: - lib_folder = os.path.join(sdk.path, 'lib', 'mac') - - if compiler.target.platform in ['linux', 'mac']: - if sdk.name in ['sdk2013', 'bms', 'pvkii'] or compiler.target.arch == 'x86_64': - tier1 = os.path.join(lib_folder, 'tier1.a') - else: - tier1 = os.path.join(lib_folder, 'tier1_i486.a') - if sdk.name == 'mock' and compiler.target.platform == 'linux': - compiler.linkflags += ['-Wl,-z,origin'] - compiler.postlink += [tier1] - - if sdk.name in ['blade', 'insurgency', 'doi', 'csgo', 'cs2', 'dota']: - if compiler.target.arch == 'x86_64': - compiler.postlink += [os.path.join(lib_folder, 'interfaces.a')] - else: - compiler.postlink += [os.path.join(lib_folder, 'interfaces_i486.a')] - - if sdk.name == 'bms': - compiler.postlink += [os.path.join(lib_folder, 'mathlib.a')] - binary = self.Library(compiler, name) - compiler = binary.compiler + mms_core_path = os.path.join(self.mms_root, 'core') + cxx = binary.compiler - dynamic_libs = [] - if compiler.target.platform == 'linux': - compiler.linkflags[0:0] = ['-lm'] - if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2', 'insurgency', 'doi']: - dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] - elif compiler.target.arch == 'x86_64' and sdk.name in ['csgo', 'mock']: - dynamic_libs = ['libtier0_client.so', 'libvstdlib_client.so'] - elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo', 'cs2', 'dota', 'pvkii']: - dynamic_libs = ['libtier0.so'] - if sdk.name not in ['dota', 'cs2']: - dynamic_libs += ['libvstdlib.so'] - else: - dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] - if sdk.name in ['csgo', 'blade']: - compiler.defines += ['_GLIBCXX_USE_CXX11_ABI=0'] - elif compiler.target.platform == 'mac': - binary.compiler.linkflags.append('-liconv') - dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] - elif compiler.target.platform == 'windows': - libs = ['tier0', 'tier1', 'mathlib'] - if sdk.name not in ['dota', 'cs2']: - libs += ['vstdlib'] - if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'mcv', 'csgo', 'cs2', 'dota']: - libs.append('interfaces') - for lib in libs: - if compiler.target.arch == 'x86': - lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' - elif compiler.target.arch == 'x86_64': - lib_path = os.path.join(sdk.path, 'lib', 'public', 'win64', lib) + '.lib' - binary.compiler.linkflags.append(lib_path) + cxx.cxxincludes += [ + os.path.join(context.currentSourcePath), + os.path.join(mms_core_path), + os.path.join(mms_core_path, 'sourcehook'), + ] - for library in dynamic_libs: - source_path = os.path.join(lib_folder, library) - output_path = os.path.join(binary.localFolder, library) + defines = [] + for other_sdk in self.sdk_manifests: + cxx.defines += ['SE_{}={}'.format(other_sdk['define'], other_sdk['code'])] - context.AddFolder(binary.localFolder) - output = context.AddSymlink(source_path, output_path) + if sdk['source2']: + cxx.defines += ['META_IS_SOURCE2'] + binary.sources += [ + os.path.join(sdk['path'], 'public', 'tier0', 'memoverride.cpp'), + os.path.join(sdk['path'], 'tier1', 'convar.cpp'), + ] - binary.compiler.weaklinkdeps += [output] - binary.compiler.linkflags[0:0] = [library] + SdkHelpers.configureCxx(context, binary, sdk) + + cxx.linkflags += additional_libs(context, binary, sdk) + cxx.defines += additional_defines(context, binary, sdk) + cxx.cxxincludes += additional_includes(context, binary, sdk) return binary diff --git a/AMBuilder b/AMBuilder index 7a61d87..4ec4a78 100644 --- a/AMBuilder +++ b/AMBuilder @@ -6,28 +6,19 @@ import os # which in the end would ruin the multi-platform (unix, win etc) loading by metamod as it won't be able to append platform specific extension # so just fall back to the single binary. # Multi-sdk solutions should be manually loaded with a custom plugin loader (examples being sourcemod, stripper:source) -for sdk_name in MMSPlugin.sdks: - for cxx in MMSPlugin.all_targets: - sdk = MMSPlugin.sdks[sdk_name] +for sdk_target in MMSPlugin.sdk_targets: + sdk = sdk_target.sdk + cxx = sdk_target.cxx - if not cxx.target.arch in sdk.platformSpec[cxx.target.platform]: - continue + binary = MMSPlugin.HL2Library(builder, cxx, MMSPlugin.plugin_name, sdk) - binary = MMSPlugin.HL2Library(builder, cxx, MMSPlugin.plugin_name, sdk) + binary.sources += [ + 'MovementUnlocker.cpp', + ] - binary.sources += [ - 'MovementUnlocker.cpp', - ] + binary.custom = [builder.tools.Protoc(protoc = sdk_target.protoc, sources = [ + os.path.join(sdk['path'], 'common', 'network_connection.proto'), + ])] - if sdk_name in ['dota', 'cs2']: - binary.sources += [ - os.path.join(sdk.path, 'tier1', 'convar.cpp'), - os.path.join(sdk.path, 'public', 'tier0', 'memoverride.cpp'), - ] - - if cxx.target.arch == 'x86': - binary.sources += ['sourcehook/sourcehook_hookmangen.cpp'] - nodes = builder.Add(binary) - MMSPlugin.binaries += [nodes] - - break + nodes = builder.Add(binary) + MMSPlugin.binaries += [nodes] diff --git a/configure.py b/configure.py index 2ca9277..0605213 100644 --- a/configure.py +++ b/configure.py @@ -25,6 +25,8 @@ parser.options.add_argument('-a', '--plugin-alias', type=str, dest='plugin_alias help='Plugin alias') parser.options.add_argument('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, help='Root search folder for HL2SDKs') +parser.options.add_argument('--hl2sdk-manifests', type=str, dest='hl2sdk_manifests', default=None, + help='HL2SDK manifests source tree folder') parser.options.add_argument('--mms_path', type=str, dest='mms_path', default=None, help='Metamod:Source source tree folder') parser.options.add_argument('--enable-debug', action='store_const', const='1', dest='debug', diff --git a/hl2sdk-manifests b/hl2sdk-manifests new file mode 160000 index 0000000..22f699a --- /dev/null +++ b/hl2sdk-manifests @@ -0,0 +1 @@ +Subproject commit 22f699a941093d9d68c1f647c7c545ec346d0ee3 From 3ae69d09652e9fdd465baaa5357cfbe331bd4df5 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 28 Feb 2024 23:20:38 -0500 Subject: [PATCH 06/23] Build tweaks --- .github/workflows/ci.yml | 2 +- AMBuildScript | 1 - configure.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 847f1b6..8e38a0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,7 @@ jobs: shell: bash run: | mkdir build && cd build - python ../configure.py --enable-optimize --symbol-files --sdks cs2 --hl2sdk-manifests hl2sdk-manifests/ + python ../configure.py --enable-optimize --symbol-files --sdks cs2 ambuild - name: Upload artifact diff --git a/AMBuildScript b/AMBuildScript index 378303e..77353ac 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -150,7 +150,6 @@ class MMSPluginConfig(object): '-pipe', '-fno-strict-aliasing', '-Wall', - '-Werror', '-Wno-uninitialized', '-Wno-unused', '-Wno-switch', diff --git a/configure.py b/configure.py index 0605213..bc7330e 100644 --- a/configure.py +++ b/configure.py @@ -25,7 +25,7 @@ parser.options.add_argument('-a', '--plugin-alias', type=str, dest='plugin_alias help='Plugin alias') parser.options.add_argument('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, help='Root search folder for HL2SDKs') -parser.options.add_argument('--hl2sdk-manifests', type=str, dest='hl2sdk_manifests', default=None, +parser.options.add_argument('--hl2sdk-manifests', type=str, dest='hl2sdk_manifests', default='hl2sdk-manifests/', help='HL2SDK manifests source tree folder') parser.options.add_argument('--mms_path', type=str, dest='mms_path', default=None, help='Metamod:Source source tree folder') From 5ff589cf87285218c5941e2987ec3aeefd3fd8da Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 28 Feb 2024 23:34:35 -0500 Subject: [PATCH 07/23] Update signature for 2024-02-28 CS2 update --- MovementUnlocker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index d209b32..e5d8add 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -33,8 +33,8 @@ const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x5 const char *pPatchPattern = "x?xxxxxxxxxxxxxxxxx"; int PatchLen = 1; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x30\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED"; -const char* pPatchPattern = "xx????xxxxxx????xxxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7D\x30\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED"; +const char* pPatchPattern = "xx????xxxxx????xxxx"; int PatchLen = 6; #endif @@ -151,7 +151,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.0"; + return "1.1"; } const char *MovementUnlocker::GetDate() From 07efcaab9bfe1af1b6b3f05b3abe8fd35319e73e Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 21 May 2024 19:04:51 -0400 Subject: [PATCH 08/23] Update Windows signature for 2024-04-02 CS2 update Long overdue --- MovementUnlocker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index e5d8add..eca02cc 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,8 +29,8 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x57\x3C\xF3\x0F\x10\x47\x44\x0F\x28\xCA\xF3\x0F\x59\xC0"; -const char *pPatchPattern = "x?xxxxxxxxxxxxxxxxx"; +const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x57\x2A\x0F\x28\x2A\xF3\x0F\x2A\x2A\x0F\x28\x2A"; +const char *pPatchPattern = "x?xxxx?xx?xx??xx?"; int PatchLen = 1; #elif __linux__ const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7D\x30\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED"; @@ -151,7 +151,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.1"; + return "1.2"; } const char *MovementUnlocker::GetDate() From 295c714e1afa3abd0dc1d744aecaba18c57bdb4c Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 5 Jun 2024 00:22:32 -0400 Subject: [PATCH 09/23] Update hl2sdk-manifests --- hl2sdk-manifests | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hl2sdk-manifests b/hl2sdk-manifests index 22f699a..a57b309 160000 --- a/hl2sdk-manifests +++ b/hl2sdk-manifests @@ -1 +1 @@ -Subproject commit 22f699a941093d9d68c1f647c7c545ec346d0ee3 +Subproject commit a57b3095a6fc31a98b13e2d73ebb668dac4f1300 From ffc1a43c2b7c9fed6ba53d04a8d4509d914181b2 Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 5 Jun 2024 00:39:00 -0400 Subject: [PATCH 10/23] Update Linux signature for 2024-06-04 CS2 update --- MovementUnlocker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index eca02cc..f5bd85d 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -33,8 +33,8 @@ const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x5 const char *pPatchPattern = "x?xxxx?xx?xx??xx?"; int PatchLen = 1; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7D\x30\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED"; -const char* pPatchPattern = "xx????xxxxx????xxxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED\x66\x0F\xD6\x85"; +const char* pPatchPattern = "xx????xxxx?x????xxxxxxxx"; int PatchLen = 6; #endif @@ -151,7 +151,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.2"; + return "1.3"; } const char *MovementUnlocker::GetDate() From d81722cf633446bb1c9cc1651db02536500ea13e Mon Sep 17 00:00:00 2001 From: Vauff Date: Sun, 6 Oct 2024 08:14:24 -0400 Subject: [PATCH 11/23] Update Windows signature for 2024-10-02 CS2 update --- MovementUnlocker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index f5bd85d..64be005 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,8 +29,8 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x57\x2A\x0F\x28\x2A\xF3\x0F\x2A\x2A\x0F\x28\x2A"; -const char *pPatchPattern = "x?xxxx?xx?xx??xx?"; +const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x4F\x2A\x41\x0F\x28\xC1\x0F\x28\xD1\xF3\x0F\x59\xC0"; +const char *pPatchPattern = "x?xxxx?xxxxxxxxxxx"; int PatchLen = 1; #elif __linux__ const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED\x66\x0F\xD6\x85"; @@ -151,7 +151,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.3"; + return "1.4"; } const char *MovementUnlocker::GetDate() From 3e7176fe75b6f03f0384288f1f5ec7d6bac05365 Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 1 Aug 2025 05:52:51 -0400 Subject: [PATCH 12/23] Update signatures for 2025-07-28 CS2 update --- MovementUnlocker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 64be005..666d1a9 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,12 +29,12 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x4F\x2A\x41\x0F\x28\xC1\x0F\x28\xD1\xF3\x0F\x59\xC0"; -const char *pPatchPattern = "x?xxxx?xxxxxxxxxxx"; +const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x4E\x2A\x41\x0F\x28\xD2\x0F\x28\xC1"; +const char *pPatchPattern = "x?xxxx?xxxxxxx"; int PatchLen = 1; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED\x66\x0F\xD6\x85"; -const char* pPatchPattern = "xx????xxxx?x????xxxxxxxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\x48\x85\xFF"; +const char* pPatchPattern = "xx????xxxx?xxx"; int PatchLen = 6; #endif @@ -151,7 +151,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.4"; + return "1.5"; } const char *MovementUnlocker::GetDate() From ce00eec29c0c8a6b88f308cf1cfe636cf9b5de8e Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 19 Sep 2025 01:40:49 -0400 Subject: [PATCH 13/23] Update patches for recent CS2 updates --- MovementUnlocker.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 666d1a9..90acbb3 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,12 +29,12 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x76\x2A\xF2\x0F\x10\x4E\x2A\x41\x0F\x28\xD2\x0F\x28\xC1"; -const char *pPatchPattern = "x?xxxx?xxxxxxx"; -int PatchLen = 1; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB8\x2A\x2A\x2A\xF3\x0F\x58\xD4"; +const char *pPatchPattern = "xxx???xxxx"; +int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\x48\x85\xFF"; -const char* pPatchPattern = "xx????xxxx?xxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x3D\x2A\x2A\x2A\x2A\xF3\x0F\x11\xBD"; +const char* pPatchPattern = "xx????xxxx????xxxx"; int PatchLen = 6; #endif @@ -113,7 +113,10 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); #ifdef _WIN32 - *(unsigned char*)(pPatchAddress) = ((unsigned char*)"\xEB")[0]; + const char* patchBytes[] = {"\xE9", "\xB9", "\x00", "\x00", "\x00", "\x90"}; + + for (int i = 0; i < PatchLen; i++) + *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; #elif __linux__ for (int i = 0; i < PatchLen; i++) *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)"\x90")[0]; @@ -151,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.5"; + return "1.6"; } const char *MovementUnlocker::GetDate() From b5807e27cfb4269c808a4a7ccdebd294a775c60d Mon Sep 17 00:00:00 2001 From: Vauff Date: Wed, 24 Sep 2025 00:05:15 -0400 Subject: [PATCH 14/23] Update patches for 2025-09-23 CS2 update --- MovementUnlocker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 90acbb3..f06c751 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,12 +29,12 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB8\x2A\x2A\x2A\xF3\x0F\x58\xD4"; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB7\x2A\x2A\x2A\xF3\x0F\x58\xD4"; const char *pPatchPattern = "xxx???xxxx"; int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x3D\x2A\x2A\x2A\x2A\xF3\x0F\x11\xBD"; -const char* pPatchPattern = "xx????xxxx????xxxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x35\x2A\x2A\x2A\x2A\xF3\x0F\x11\xB5\x2A\x2A\x2A\x2A\x48\x89\xDE"; +const char* pPatchPattern = "xx????xxxx????xxxx????xxx"; int PatchLen = 6; #endif @@ -113,7 +113,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); #ifdef _WIN32 - const char* patchBytes[] = {"\xE9", "\xB9", "\x00", "\x00", "\x00", "\x90"}; + const char* patchBytes[] = {"\xE9", "\xB8", "\x00", "\x00", "\x00", "\x90"}; for (int i = 0; i < PatchLen; i++) *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.6"; + return "1.7"; } const char *MovementUnlocker::GetDate() From 850d144232644a784aca9c74caf310b884f5b76e Mon Sep 17 00:00:00 2001 From: Vauff Date: Fri, 26 Sep 2025 22:32:51 -0400 Subject: [PATCH 15/23] Update Windows patch for 2025-09-25 CS2 update Co-authored-by: xen --- MovementUnlocker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index f06c751..3fdd83e 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,7 +29,7 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB7\x2A\x2A\x2A\xF3\x0F\x58\xD4"; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB0\x2A\x2A\x2A\xF3\x0F\x58\xD4"; const char *pPatchPattern = "xxx???xxxx"; int PatchLen = 6; #elif __linux__ @@ -113,7 +113,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); #ifdef _WIN32 - const char* patchBytes[] = {"\xE9", "\xB8", "\x00", "\x00", "\x00", "\x90"}; + const char* patchBytes[] = {"\xE9", "\xB1", "\x00", "\x00", "\x00", "\x90"}; for (int i = 0; i < PatchLen; i++) *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.7"; + return "1.8"; } const char *MovementUnlocker::GetDate() From 0193cd340a90bd1bb0e7b2ec836b835082f9dd06 Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 4 Nov 2025 23:00:21 -0500 Subject: [PATCH 16/23] Update patches for 2025-11-04 CS2 update --- MovementUnlocker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 3fdd83e..b25d820 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,11 +29,11 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB0\x2A\x2A\x2A\xF3\x0F\x58\xD4"; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB0\x2A\x2A\x2A\xF3\x0F\x58\xD3"; const char *pPatchPattern = "xxx???xxxx"; int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x35\x2A\x2A\x2A\x2A\xF3\x0F\x11\xB5\x2A\x2A\x2A\x2A\x48\x89\xDE"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x35\x2A\x2A\x2A\x2A\xF3\x0F\x11\xB5\x2A\x2A\x2A\x2A\x4C\x89\xEE"; const char* pPatchPattern = "xx????xxxx????xxxx????xxx"; int PatchLen = 6; #endif @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.8"; + return "1.9"; } const char *MovementUnlocker::GetDate() From a2673ddd75e1a3ef9c166c9da122e8a1dc54e823 Mon Sep 17 00:00:00 2001 From: Vauff Date: Sat, 24 Jan 2026 20:49:15 -0500 Subject: [PATCH 17/23] Update patches for 2026-01-21 CS2 update --- MovementUnlocker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index b25d820..f4eef7d 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,11 +29,11 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB0\x2A\x2A\x2A\xF3\x0F\x58\xD3"; -const char *pPatchPattern = "xxx???xxxx"; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xAF\x2A\x2A\x2A\x0F\x57\xC0\x0F\x2E\xC2"; +const char *pPatchPattern = "xxx???xxxxxx"; int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x35\x2A\x2A\x2A\x2A\xF3\x0F\x11\xB5\x2A\x2A\x2A\x2A\x4C\x89\xEE"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x3D\x2A\x2A\x2A\x2A\xF3\x0F\x11\xBD\x2A\x2A\x2A\x2A\x48\x89\xDE"; const char* pPatchPattern = "xx????xxxx????xxxx????xxx"; int PatchLen = 6; #endif @@ -113,7 +113,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); #ifdef _WIN32 - const char* patchBytes[] = {"\xE9", "\xB1", "\x00", "\x00", "\x00", "\x90"}; + const char* patchBytes[] = {"\xE9", "\xB0", "\x00", "\x00", "\x00", "\x90"}; for (int i = 0; i < PatchLen; i++) *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.9"; + return "1.10"; } const char *MovementUnlocker::GetDate() From 221a9de3b225fb80c4a08a629985bdbde151442f Mon Sep 17 00:00:00 2001 From: Vauff Date: Sat, 24 Jan 2026 20:59:27 -0500 Subject: [PATCH 18/23] Fix missing setuptools in Windows CI --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e38a0d..dfd6ba7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,11 @@ jobs: path: ambuild - name: Install AMBuild + shell: bash run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pip install setuptools + fi cd ambuild && python setup.py install && cd .. - name: Build From d08776f5cf9078e72b1eb84c0d87f50cb97c02dd Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 21 Apr 2026 17:11:36 -0400 Subject: [PATCH 19/23] Update patches for AnimGraph2 CS2 update --- MovementUnlocker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index f4eef7d..35d35da 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,12 +29,12 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xAF\x2A\x2A\x2A\x0F\x57\xC0\x0F\x2E\xC2"; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB0\x2A\x2A\x2A\x0F\x57\xC0\x0F\x2E\xC2"; const char *pPatchPattern = "xxx???xxxxxx"; int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x3D\x2A\x2A\x2A\x2A\xF3\x0F\x11\xBD\x2A\x2A\x2A\x2A\x48\x89\xDE"; -const char* pPatchPattern = "xx????xxxx????xxxx????xxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x35\x2A\x2A\x2A\x2A\xF3\x0F\x11\xB5"; +const char* pPatchPattern = "xx????xxxx????xxxx"; int PatchLen = 6; #endif @@ -113,7 +113,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); #ifdef _WIN32 - const char* patchBytes[] = {"\xE9", "\xB0", "\x00", "\x00", "\x00", "\x90"}; + const char* patchBytes[] = {"\xE9", "\xB1", "\x00", "\x00", "\x00", "\x90"}; for (int i = 0; i < PatchLen; i++) *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.10"; + return "1.11"; } const char *MovementUnlocker::GetDate() From a2a78ed01bbe70b41f833c8454e655e675b2b28a Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 18 May 2026 21:58:06 -0400 Subject: [PATCH 20/23] Update patches for 2026-05-18 CS2 update --- MovementUnlocker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 35d35da..9cb5e08 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -29,12 +29,12 @@ MovementUnlocker g_MovementUnlocker; #ifdef _WIN32 -const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xB0\x2A\x2A\x2A\x0F\x57\xC0\x0F\x2E\xC2"; +const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xAF\x2A\x2A\x2A\x0F\x57\xC0\x0F\x2E\xC2"; const char *pPatchPattern = "xxx???xxxxxx"; int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x35\x2A\x2A\x2A\x2A\xF3\x0F\x11\xB5"; -const char* pPatchPattern = "xx????xxxx????xxxx"; +const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x25\x2A\x2A\x2A\x2A\xF3\x0F\x11\xA5\x2A\x2A\x2A\x2A\x48\x89\xDE"; +const char* pPatchPattern = "xx????xxxx????xxxx????xxx"; int PatchLen = 6; #endif @@ -113,7 +113,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); #ifdef _WIN32 - const char* patchBytes[] = {"\xE9", "\xB1", "\x00", "\x00", "\x00", "\x90"}; + const char* patchBytes[] = {"\xE9", "\xB0", "\x00", "\x00", "\x00", "\x90"}; for (int i = 0; i < PatchLen; i++) *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.11"; + return "1.12"; } const char *MovementUnlocker::GetDate() From 6148f39ad305b1436eb4e5dd6b8bd2a78e6c6e08 Mon Sep 17 00:00:00 2001 From: Vauff Date: Mon, 17 Aug 2026 00:01:34 -0400 Subject: [PATCH 21/23] Migrate to build containers & start SteamRT4 builds --- .github/workflows/{ci.yml => build.yml} | 49 ++++++++++++++----------- hl2sdk-manifests | 2 +- 2 files changed, 29 insertions(+), 22 deletions(-) rename .github/workflows/{ci.yml => build.yml} (63%) diff --git a/.github/workflows/ci.yml b/.github/workflows/build.yml similarity index 63% rename from .github/workflows/ci.yml rename to .github/workflows/build.yml index dfd6ba7..9734978 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/build.yml @@ -4,26 +4,31 @@ on: [push, pull_request] jobs: build: - name: Build + name: ${{ matrix.name }} Build runs-on: ${{ matrix.os }} container: ${{ matrix.container }} strategy: fail-fast: false matrix: - os: [windows-2022, ubuntu-latest] include: - - os: windows-2022 + - os: windows-latest + name: Windows - os: ubuntu-latest - container: registry.gitlab.steamos.cloud/steamrt/sniper/sdk + name: SteamRT3 + container: ghcr.io/source2ze/build-containers:steamrt3 + - os: ubuntu-latest + name: SteamRT4 + container: ghcr.io/source2ze/build-containers:steamrt4 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: path: MovementUnlocker submodules: recursive + fetch-depth: 0 - name: Checkout Metamod - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: alliedmodders/metamod-source ref: master @@ -31,38 +36,35 @@ jobs: submodules: recursive - name: Checkout HL2SDK - uses: actions/checkout@v4 + uses: actions/checkout@v7 with: repository: alliedmodders/hl2sdk ref: cs2 path: hl2sdk-cs2 - name: Checkout AMBuild - uses: actions/checkout@v4 + if: matrix.os == 'windows-latest' + uses: actions/checkout@v7 with: repository: alliedmodders/ambuild path: ambuild - name: Install AMBuild - shell: bash - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - pip install setuptools - fi - cd ambuild && python setup.py install && cd .. + if: matrix.os == 'windows-latest' + run: pip install setuptools && cd ambuild && python setup.py install && cd .. - name: Build working-directory: MovementUnlocker shell: bash run: | mkdir build && cd build - python ../configure.py --enable-optimize --symbol-files --sdks cs2 + python ../configure.py --enable-optimize --sdks cs2 ambuild - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: - name: ${{ runner.os }} + name: ${{ matrix.name }} path: MovementUnlocker/build/package release: @@ -73,15 +75,20 @@ jobs: steps: - name: Download artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 - name: Package run: | version=`echo $GITHUB_REF | sed "s/refs\/tags\///"` ls -Rall - if [ -d "./Linux/" ]; then - cd ./Linux/ - tar -czf ../${{ github.event.repository.name }}-${version}-linux.tar.gz * + if [ -d "./SteamRT3/" ]; then + cd ./SteamRT3/ + tar -czf ../${{ github.event.repository.name }}-${version}-steamrt3.tar.gz * + cd - + fi + if [ -d "./SteamRT4/" ]; then + cd ./SteamRT4/ + tar -czf ../${{ github.event.repository.name }}-${version}-steamrt4.tar.gz * cd - fi if [ -d "./Windows/" ]; then diff --git a/hl2sdk-manifests b/hl2sdk-manifests index a57b309..20b3a01 160000 --- a/hl2sdk-manifests +++ b/hl2sdk-manifests @@ -1 +1 @@ -Subproject commit a57b3095a6fc31a98b13e2d73ebb668dac4f1300 +Subproject commit 20b3a014264b38908c4a5d4eb263ba2c488f3dc1 From b418365b5b8cb0cb68099fe0485e9f23c818b2e9 Mon Sep 17 00:00:00 2001 From: Vauff Date: Tue, 8 Sep 2026 17:02:27 -0400 Subject: [PATCH 22/23] Migrate to KHook --- AMBuildScript | 2 +- MovementUnlocker.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AMBuildScript b/AMBuildScript index 77353ac..cc5c402 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -278,7 +278,7 @@ class MMSPluginConfig(object): cxx.cxxincludes += [ os.path.join(context.currentSourcePath), os.path.join(mms_core_path), - os.path.join(mms_core_path, 'sourcehook'), + os.path.join(self.mms_root, 'third_party', 'khook', 'include'), ] defines = [] diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 9cb5e08..97d55be 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -19,7 +19,7 @@ #include #include "MovementUnlocker.h" -#include +#include "khook/memory.hpp" #ifdef _WIN32 #include #elif __linux__ @@ -110,7 +110,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl return false; } - SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_WRITE | SH_MEM_EXEC); + KHook::Memory::SetAccess((void*)pPatchAddress, PatchLen, KHook::Memory::READ | KHook::Memory::WRITE | KHook::Memory::EXECUTE); #ifdef _WIN32 const char* patchBytes[] = {"\xE9", "\xB0", "\x00", "\x00", "\x00", "\x90"}; @@ -122,7 +122,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)"\x90")[0]; #endif - SourceHook::SetMemAccess((void*)pPatchAddress, PatchLen, SH_MEM_READ | SH_MEM_EXEC); + KHook::Memory::SetAccess((void*)pPatchAddress, PatchLen, KHook::Memory::READ | KHook::Memory::EXECUTE); META_CONPRINTF( "[Movement Unlocker] Successfully patched Movement Unlocker!\n" ); return true; @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "1.12"; + return "2.0"; } const char *MovementUnlocker::GetDate() From 4ea3794248f961fd0fbdccf893c49f7c7436572d Mon Sep 17 00:00:00 2001 From: Vauff Date: Thu, 24 Sep 2026 13:16:53 -0400 Subject: [PATCH 23/23] Update Linux patch for 2026-09-22 CS2 update --- MovementUnlocker.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MovementUnlocker.cpp b/MovementUnlocker.cpp index 97d55be..2781173 100644 --- a/MovementUnlocker.cpp +++ b/MovementUnlocker.cpp @@ -33,9 +33,9 @@ const unsigned char *pPatchSignature = (unsigned char *)"\x0F\x86\xAF\x2A\x2A\x2 const char *pPatchPattern = "xxx???xxxxxx"; int PatchLen = 6; #elif __linux__ -const unsigned char * pPatchSignature = (unsigned char *)"\x0F\x87\x2A\x2A\x2A\x2A\xF3\x0F\x10\x25\x2A\x2A\x2A\x2A\xF3\x0F\x11\xA5\x2A\x2A\x2A\x2A\x48\x89\xDE"; -const char* pPatchPattern = "xx????xxxx????xxxx????xxx"; -int PatchLen = 6; +const unsigned char * pPatchSignature = (unsigned char *)"\x76\x2A\xF3\x0F\x51\xC0\xF3\x0F\x7E\xDB\x49\x8B\x06"; +const char* pPatchPattern = "x?xxxxxxxxxxx"; +int PatchLen = 1; #endif // From https://git.botox.bz/CSSZombieEscape/sm-ext-PhysHooks @@ -119,7 +119,7 @@ bool MovementUnlocker::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxl *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)patchBytes[i])[0]; #elif __linux__ for (int i = 0; i < PatchLen; i++) - *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)"\x90")[0]; + *(unsigned char*)(pPatchAddress + i) = ((unsigned char*)"\xEB")[0]; #endif KHook::Memory::SetAccess((void*)pPatchAddress, PatchLen, KHook::Memory::READ | KHook::Memory::EXECUTE); @@ -154,7 +154,7 @@ const char *MovementUnlocker::GetLicense() const char *MovementUnlocker::GetVersion() { - return "2.0"; + return "2.0.1"; } const char *MovementUnlocker::GetDate()