From 768b4593be2d478789aa33fd45dd6d33ba52bce2 Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 11 Aug 2020 10:19:32 +0800 Subject: [PATCH] Release --- .gitattributes | 2 + .gitignore | 330 ++++++++++++++++++ .travis.yml | 55 +++ AMBuildScript | 448 +++++++++++++++++++++++++ AMBuilder | 31 ++ PackageScript | 52 +++ TransmitManager.inc | 27 ++ build.bat | 22 ++ build.sh | 19 ++ configure.py | 23 ++ extension.cpp | 355 ++++++++++++++++++++ extension.h | 34 ++ msvc15/TransmitManager.sln | 19 ++ msvc15/TransmitManager.vcxproj | 79 +++++ msvc15/TransmitManager.vcxproj.filters | 39 +++ smsdk_config.h | 36 ++ 16 files changed, 1571 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 AMBuildScript create mode 100644 AMBuilder create mode 100644 PackageScript create mode 100644 TransmitManager.inc create mode 100644 build.bat create mode 100644 build.sh create mode 100644 configure.py create mode 100644 extension.cpp create mode 100644 extension.h create mode 100644 msvc15/TransmitManager.sln create mode 100644 msvc15/TransmitManager.vcxproj create mode 100644 msvc15/TransmitManager.vcxproj.filters create mode 100644 smsdk_config.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3e759b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,330 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6f83a66 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,55 @@ +language: cpp +branches: + only: + - master + except: + - /^(?i:release)-.*$/ +env: + global: + - DEPS_DIR=${HOME}/deps + - BRANCH=1.10-dev +before_install: +- git clone https://github.com/alliedmodders/ambuild ${DEPS_DIR}/ambuild +jobs: + include: + - name: Linux + dist: xenial + python: 3 + before_script: + - sudo apt-get install -y gcc-multilib g++-multilib binutils python3-setuptools + - | + pushd ${DEPS_DIR}/ambuild + sudo python3 setup.py install + popd + - chmod +x build.sh + script: + - "./build.sh" + - name: Windows + os: windows + python: 3.8 + env: + - PATH=/c/Python38:/c/Python38/Scripts:${PATH} + before_script: + - choco install -y visualstudio2019buildtools python3 --package-parameters "--add + Microsoft.VisualStudio.Component.VC.Tools.x86.x64"; + - | + pushd ${DEPS_DIR}/ambuild + python setup.py install + popd + script: + - "./build.bat" +before_deploy: + - git config --local user.name "Kxnrl" + - git config --local user.email "kyle@kxnrl.com" + - export TRAVIS_TAG=release-$TRAVIS_BUILD_NUMBER + - git tag $TRAVIS_TAG +deploy: + provider: releases + api_key: $token + file: + - build/package/addons/sourcemod/extensions/kxnrl.hooks.ext.2.csgo.dll + - build/package/addons/sourcemod/extensions/kxnrl.hooks.ext.2.csgo.so + - build/package/addons/sourcemod/scripting/include/TransmitManager.inc + on: + repo: Kxnrl/sm-ext-TransmitManager + skip_cleanup: 'true' diff --git a/AMBuildScript b/AMBuildScript new file mode 100644 index 0000000..291cce9 --- /dev/null +++ b/AMBuildScript @@ -0,0 +1,448 @@ +# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: +import os, sys + +# Simple extensions do not need to modify this file. + +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.platform = platform + self.name = dir + self.path = None # Actual path + +WinOnly = ['windows'] +WinLinux = ['windows', 'linux'] +WinLinuxMac = ['windows', 'linux', 'mac'] + +PossibleSDKs = { + 'episode1': SDK('HL2SDK', '1.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', '11', 'TF2', WinLinuxMac, 'tf2'), + 'l4d': SDK('HL2SDKL4D', '2.l4d', '12', 'LEFT4DEAD', WinLinuxMac, 'l4d'), + 'nucleardawn': SDK('HL2SDKND', '2.nd', '13', 'NUCLEARDAWN', WinLinuxMac, 'nucleardawn'), + 'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '15', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'), + 'darkm': SDK('HL2SDK-DARKM', '2.darkm', '2', 'DARKMESSIAH', WinOnly, 'darkm'), + 'swarm': SDK('HL2SDK-SWARM', '2.swarm', '16', 'ALIENSWARM', WinOnly, 'swarm'), + 'bgt': SDK('HL2SDK-BGT', '2.bgt', '4', 'BLOODYGOODTIME', WinOnly, 'bgt'), + 'eye': SDK('HL2SDK-EYE', '2.eye', '5', 'EYE', WinOnly, 'eye'), + 'csgo': SDK('HL2SDKCSGO', '2.csgo', '21', 'CSGO', WinLinuxMac, 'csgo'), + 'portal2': SDK('HL2SDKPORTAL2', '2.portal2', '17', 'PORTAL2', [], 'portal2'), + 'blade': SDK('HL2SDKBLADE', '2.blade', '18', 'BLADE', WinLinux, 'blade'), + 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '19', 'INSURGENCY', WinLinuxMac, 'insurgency'), + 'contagion': SDK('HL2SDKCONTAGION', '2.contagion', '14', 'CONTAGION', WinOnly, 'contagion'), + 'bms': SDK('HL2SDKBMS', '2.bms', '10', 'BMS', WinLinux, 'bms'), + 'doi': SDK('HL2SDKDOI', '2.doi', '20', 'DOI', WinLinuxMac, 'doi'), +} + +def ResolveEnvPath(env, folder): + if env in os.environ: + path = os.environ[env] + if os.path.isdir(path): + return path + return None + + head = os.getcwd() + oldhead = None + while head != None and head != oldhead: + path = os.path.join(head, folder) + if os.path.isdir(path): + return path + oldhead = head + head, tail = os.path.split(head) + + return None + +def Normalize(path): + return os.path.abspath(os.path.normpath(path)) + +class ExtensionConfig(object): + def __init__(self): + self.sdks = {} + self.binaries = [] + self.extensions = [] + self.generated_headers = None + self.mms_root = None + self.sm_root = None + + @property + def tag(self): + if builder.options.debug == '1': + return 'Debug' + return 'Release' + + def detectSDKs(self): + sdk_list = builder.options.sdks.split(',') + use_all = sdk_list[0] == 'all' + use_present = sdk_list[0] == 'present' + + for sdk_name in PossibleSDKs: + sdk = PossibleSDKs[sdk_name] + if builder.target_platform in sdk.platform: + if builder.options.hl2sdk_root: + sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder) + else: + sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder) + if sdk_path is None or not os.path.isdir(sdk_path): + if use_all or sdk_name in sdk_list: + raise Exception('Could not find a valid path for {0}'.format(sdk.envvar)) + continue + if use_all or use_present or sdk_name in sdk_list: + sdk.path = Normalize(sdk_path) + self.sdks[sdk_name] = sdk + + if len(self.sdks) < 1: + raise Exception('At least one SDK must be available.') + + if builder.options.sm_path: + self.sm_root = builder.options.sm_path + else: + self.sm_root = ResolveEnvPath('SOURCEMOD18', 'sourcemod-1.8') + if not self.sm_root: + self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod') + if not self.sm_root: + self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod-central') + + if not self.sm_root or not os.path.isdir(self.sm_root): + raise Exception('Could not find a source copy of SourceMod') + self.sm_root = Normalize(self.sm_root) + + if builder.options.mms_path: + self.mms_root = builder.options.mms_path + else: + self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') + if not self.mms_root: + self.mms_root = ResolveEnvPath('MMSOURCE', '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) + + def configure(self): + cxx = builder.DetectCompilers() + + if cxx.like('gcc'): + self.configure_gcc(cxx) + elif cxx.vendor == 'msvc': + self.configure_msvc(cxx) + + # Optimizaiton + if builder.options.opt == '1': + cxx.defines += ['NDEBUG'] + + # Debugging + if builder.options.debug == '1': + cxx.defines += ['DEBUG', '_DEBUG'] + + # Platform-specifics + if builder.target_platform == 'linux': + self.configure_linux(cxx) + elif builder.target_platform == 'mac': + self.configure_mac(cxx) + elif builder.target_platform == 'windows': + self.configure_windows(cxx) + + # Finish up. + cxx.includes += [ + os.path.join(self.sm_root, 'public'), + ] + + def configure_gcc(self, cxx): + cxx.defines += [ + 'stricmp=strcasecmp', + '_stricmp=strcasecmp', + '_snprintf=snprintf', + '_vsnprintf=vsnprintf', + 'HAVE_STDINT_H', + 'GNUC', + ] + cxx.cflags += [ + '-pipe', + '-fno-strict-aliasing', + '-Wall', + '-Werror', + '-Wno-unused', + '-Wno-switch', + '-Wno-array-bounds', + '-msse', + '-m32', + '-fvisibility=hidden', + ] + cxx.cxxflags += [ + '-std=c++11', + '-fno-exceptions', + '-fno-threadsafe-statics', + '-Wno-non-virtual-dtor', + '-Wno-overloaded-virtual', + '-fvisibility-inlines-hidden', + ] + cxx.linkflags += ['-m32'] + + have_gcc = cxx.vendor == 'gcc' + have_clang = cxx.vendor == 'clang' + if cxx.version >= 'clang-3.6': + cxx.cxxflags += ['-Wno-inconsistent-missing-override'] + if have_clang or (cxx.version >= 'gcc-4.6'): + cxx.cflags += ['-Wno-narrowing'] + if have_clang or (cxx.version >= 'gcc-4.7'): + cxx.cxxflags += ['-Wno-delete-non-virtual-dtor'] + if cxx.version >= 'gcc-4.8': + cxx.cflags += ['-Wno-unused-result'] + + if have_clang: + cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch'] + if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4': + cxx.cxxflags += ['-Wno-deprecated-register'] + else: + cxx.cxxflags += ['-Wno-deprecated'] + cxx.cflags += ['-Wno-sometimes-uninitialized'] + + if have_gcc: + cxx.cflags += ['-mfpmath=sse'] + + if builder.options.opt == '1': + cxx.cflags += ['-O3'] + + def configure_msvc(self, cxx): + if builder.options.debug == '1': + cxx.cflags += ['/MTd'] + cxx.linkflags += ['/NODEFAULTLIB:libcmt'] + else: + cxx.cflags += ['/MT'] + cxx.defines += [ + '_CRT_SECURE_NO_DEPRECATE', + '_CRT_SECURE_NO_WARNINGS', + '_CRT_NONSTDC_NO_DEPRECATE', + '_ITERATOR_DEBUG_LEVEL=0', + ] + cxx.cflags += [ + '/W3', + ] + cxx.cxxflags += [ + '/EHsc', + '/GR-', + '/TP', + ] + cxx.linkflags += [ + '/MACHINE:X86', + 'kernel32.lib', + 'user32.lib', + 'gdi32.lib', + 'winspool.lib', + 'comdlg32.lib', + 'advapi32.lib', + 'shell32.lib', + 'ole32.lib', + 'oleaut32.lib', + 'uuid.lib', + 'odbc32.lib', + 'odbccp32.lib', + ] + + if builder.options.opt == '1': + cxx.cflags += ['/Ox', '/Zo'] + cxx.linkflags += ['/OPT:ICF', '/OPT:REF'] + + if builder.options.debug == '1': + cxx.cflags += ['/Od', '/RTC1'] + + # This needs to be after our optimization flags which could otherwise disable it. + # Don't omit the frame pointer. + cxx.cflags += ['/Oy-'] + + def configure_linux(self, cxx): + cxx.defines += ['_LINUX', 'POSIX'] + cxx.linkflags += ['-Wl,--exclude-libs,ALL', '-lm'] + if cxx.vendor == 'gcc': + cxx.linkflags += ['-static-libgcc'] + elif cxx.vendor == 'clang': + cxx.linkflags += ['-lgcc_eh'] + + def configure_mac(self, cxx): + cxx.defines += ['OSX', '_OSX', 'POSIX'] + cxx.cflags += ['-mmacosx-version-min=10.5'] + cxx.linkflags += [ + '-mmacosx-version-min=10.5', + '-arch', 'i386', + '-lstdc++', + '-stdlib=libstdc++', + ] + cxx.cxxflags += ['-stdlib=libstdc++'] + + def configure_windows(self, cxx): + cxx.defines += ['WIN32', '_WINDOWS'] + + def ConfigureForExtension(self, context, compiler): + compiler.cxxincludes += [ + os.path.join(context.currentSourcePath), + os.path.join(context.currentSourcePath, 'sdk'), + os.path.join(self.sm_root, 'public'), + os.path.join(self.sm_root, 'public', 'extensions'), + os.path.join(self.sm_root, 'sourcepawn', 'include'), + os.path.join(self.sm_root, 'public', 'amtl', 'amtl'), + os.path.join(self.sm_root, 'public', 'amtl'), + ] + return compiler + + def ConfigureForHL2(self, binary, sdk): + compiler = binary.compiler + + if sdk.name == 'episode1': + mms_path = os.path.join(self.mms_root, 'core-legacy') + else: + mms_path = os.path.join(self.mms_root, 'core') + + compiler.cxxincludes += [ + os.path.join(mms_path), + os.path.join(mms_path, 'sourcehook'), + ] + + 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(['public', 'toolframework']) + paths.append(['game', 'shared']) + paths.append(['common']) + + compiler.defines += ['SOURCE_ENGINE=' + sdk.code] + + if sdk.name in ['sdk2013', 'bms'] 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.like('msvc'): + compiler.defines += ['COMPILER_MSVC', 'COMPILER_MSVC32'] + else: + compiler.defines += ['COMPILER_GCC'] + + # For everything after Swarm, this needs to be defined for entity networking + # to work properly with sendprop value changes. + if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: + compiler.defines += ['NETWORK_VARS_ENABLED'] + + if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2']: + if builder.target_platform in ['linux', 'mac']: + compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE'] + + if sdk.name == 'csgo' and builder.target_platform == 'linux': + compiler.linkflags += ['-lstdc++'] + + for path in paths: + compiler.cxxincludes += [os.path.join(sdk.path, *path)] + + if builder.target_platform == 'linux': + if sdk.name == 'episode1': + lib_folder = os.path.join(sdk.path, 'linux_sdk') + elif sdk.name in ['sdk2013', 'bms']: + lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') + else: + lib_folder = os.path.join(sdk.path, 'lib', 'linux') + elif builder.target_platform == 'mac': + if sdk.name in ['sdk2013', 'bms']: + lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') + else: + lib_folder = os.path.join(sdk.path, 'lib', 'mac') + + if builder.target_platform in ['linux', 'mac']: + if sdk.name in ['sdk2013', 'bms']: + compiler.postlink += [ + compiler.Dep(os.path.join(lib_folder, 'tier1.a')), + compiler.Dep(os.path.join(lib_folder, 'mathlib.a')) + ] + else: + compiler.postlink += [ + compiler.Dep(os.path.join(lib_folder, 'tier1_i486.a')), + compiler.Dep(os.path.join(lib_folder, 'mathlib_i486.a')) + ] + + if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))] + + dynamic_libs = [] + if builder.target_platform == 'linux': + if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2', 'insurgency', 'doi']: + dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] + elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo']: + dynamic_libs = ['libtier0.so', 'libvstdlib.so'] + else: + dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] + elif builder.target_platform == 'mac': + compiler.linkflags.append('-liconv') + dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] + elif builder.target_platform == 'windows': + libs = ['tier0', 'tier1', 'vstdlib', 'mathlib'] + if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'csgo']: + libs.append('interfaces') + for lib in libs: + lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' + compiler.linkflags.append(compiler.Dep(lib_path)) + + for library in dynamic_libs: + source_path = os.path.join(lib_folder, library) + output_path = os.path.join(binary.localFolder, library) + + def make_linker(source_path, output_path): + def link(context, binary): + cmd_node, (output,) = context.AddSymlink(source_path, output_path) + return output + return link + + linker = make_linker(source_path, output_path) + compiler.linkflags[0:0] = [compiler.Dep(library, linker)] + + return binary + + def HL2Library(self, context, name, sdk): + binary = context.compiler.Library(name) + self.ConfigureForExtension(context, binary.compiler) + return self.ConfigureForHL2(binary, sdk) + + def HL2Project(self, context, name): + project = context.compiler.LibraryProject(name) + self.ConfigureForExtension(context, project.compiler) + return project + + def HL2Config(self, project, name, sdk): + binary = project.Configure(name, '{0} - {1}'.format(self.tag, sdk.name)) + return self.ConfigureForHL2(binary, sdk) + +Extension = ExtensionConfig() +Extension.detectSDKs() +Extension.configure() + +# Add additional buildscripts here +BuildScripts = [ + 'AMBuilder', +] + +if builder.backend == 'amb2': + BuildScripts += [ + 'PackageScript', + ] + +builder.RunBuildScripts(BuildScripts, { 'Extension': Extension}) diff --git a/AMBuilder b/AMBuilder new file mode 100644 index 0000000..cfe1843 --- /dev/null +++ b/AMBuilder @@ -0,0 +1,31 @@ +# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: +import os, sys + +projectName = 'TransmitManager' + +# smsdk_ext.cpp will be automatically added later +sourceFiles = [ + 'extension.cpp', +] + +############### +# Make sure to edit PackageScript, which copies your files to their appropriate locations +# Simple extensions do not need to modify past this point. + +project = Extension.HL2Project(builder, projectName + '.ext') + +if os.path.isfile(os.path.join(builder.currentSourcePath, 'sdk', 'smsdk_ext.cpp')): + # Use the copy included in the project + project.sources += [os.path.join('sdk', 'smsdk_ext.cpp')] +else: + # Use the copy included with SM 1.6 and newer + project.sources += [os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp')] + +project.sources += sourceFiles + +for sdk_name in Extension.sdks: + sdk = Extension.sdks[sdk_name] + + binary = Extension.HL2Config(project, projectName + '.ext.' + sdk.ext, sdk) + +Extension.extensions = builder.Add(project) diff --git a/PackageScript b/PackageScript new file mode 100644 index 0000000..055b88d --- /dev/null +++ b/PackageScript @@ -0,0 +1,52 @@ +# vim: set ts=8 sts=2 sw=2 tw=99 et ft=python: +import os + +# This is where the files will be output to +# package is the default +builder.SetBuildFolder('package') + +# Add any folders you need to this list +folder_list = [ + 'addons/sourcemod/extensions', + 'addons/sourcemod/scripting/include', + #'addons/sourcemod/gamedata', + #'addons/sourcemod/configs', +] + +# Create the distribution folder hierarchy. +folder_map = {} +for folder in folder_list: + norm_folder = os.path.normpath(folder) + folder_map[folder] = builder.AddFolder(norm_folder) + +# Do all straight-up file copies from the source tree. +def CopyFiles(src, dest, files): + if not dest: + dest = src + dest_entry = folder_map[dest] + for source_file in files: + source_path = os.path.join(builder.sourcePath, src, source_file) + builder.AddCopy(source_path, dest_entry) + +# Include files +CopyFiles('include', 'addons/sourcemod/scripting/include', + [ 'TransmitManager.inc' ] +) + +# GameData files +#CopyFiles('gamedata', 'addons/sourcemod/gamedata', +# [ 'myfile.txt', +# 'file2.txt' +# ] +#) + +# Config Files +#CopyFiles('configs', 'addons/sourcemod/configs', +# [ 'configfile.cfg', +# 'otherconfig.cfg, +# ] +#) + +# Copy binaries. +for cxx_task in Extension.extensions: + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) diff --git a/TransmitManager.inc b/TransmitManager.inc new file mode 100644 index 0000000..e76ba79 --- /dev/null +++ b/TransmitManager.inc @@ -0,0 +1,27 @@ +#if defined _TransmitManager_included + #endinput +#endif +#define _TransmitManager_included + +native void TransmitManager_AddEntityHooks(int entity); +native bool TransmitManager_SetEntityOwner(int entity, int target); +native bool TransmitManager_SetEntityState(int entity, int client, bool can); + +/** + * _________________Do not edit below this line!_______________________ + */ +public Extension __ext_movement = +{ + name = "TransmitManager", + file = "TransmitManager.ext", +#if defined AUTOLOAD_EXTENSIONS + autoload = 1, +#else + autoload = 0, +#endif +#if defined REQUIRE_EXTENSIONS + required = 1, +#else + required = 0, +#endif +}; diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..7c868b6 --- /dev/null +++ b/build.bat @@ -0,0 +1,22 @@ +set EXT_DIR="%cd%" +set VCVARSALL="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" + +if "%VSCMD_VER%"=="" ( + set MAKE= + set CC= + set CXX= + call %VCVARSALL% x86 +) + +git clone https://github.com/alliedmodders/metamod-source --branch "%BRANCH%" --single-branch "%EXT_DIR%/mmsource-%BRANCH%" +git clone https://github.com/alliedmodders/hl2sdk --branch csgo --single-branch "%EXT_DIR%/hl2sdk-csgo" +git clone https://github.com/alliedmodders/sourcemod --recursive --branch "%BRANCH%" --single-branch "%EXT_DIR%/sourcemod-%BRANCH%" + +mkdir "%EXT_DIR%/build" +pushd "%EXT_DIR%/build" +python "%EXT_DIR%/configure.py" --enable-optimize --mms-path "%EXT_DIR%/mmsource-%BRANCH%" --sm-path "%EXT_DIR%/sourcemod-%BRANCH%" --hl2sdk-root "%EXT_DIR%" -s csgo || goto error +ambuild || goto error +popd + +:error +exit /b %errorlevel% \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..0379ed1 --- /dev/null +++ b/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e + +EXT_DIR=$(pwd) + +git clone https://github.com/alliedmodders/metamod-source --branch "$BRANCH" --single-branch "$EXT_DIR/mmsource-$BRANCH" +git clone https://github.com/alliedmodders/hl2sdk --branch csgo --single-branch "$EXT_DIR/hl2sdk-csgo" +git clone https://github.com/alliedmodders/sourcemod --recursive --branch "$BRANCH" --single-branch "$EXT_DIR/sourcemod-$BRANCH" + +mkdir -p "$EXT_DIR/build" +pushd "$EXT_DIR/build" +python3 "$EXT_DIR/configure.py" --enable-optimize --mms-path "$EXT_DIR/mmsource-$BRANCH" --sm-path "$EXT_DIR/sourcemod-$BRANCH" --hl2sdk-root "$EXT_DIR" -s csgo +ambuild + +# might be optional +strip package/addons/sourcemod/extensions/TransmitManager.ext.2.csgo.so + +popd \ No newline at end of file diff --git a/configure.py b/configure.py new file mode 100644 index 0000000..57910e8 --- /dev/null +++ b/configure.py @@ -0,0 +1,23 @@ +# vim: set sts=2 ts=8 sw=2 tw=99 et: +import sys +from ambuild2 import run + +# Simple extensions do not need to modify this file. + +builder = run.PrepareBuild(sourcePath = sys.path[0]) + +builder.options.add_option('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, + help='Root search folder for HL2SDKs') +builder.options.add_option('--mms-path', type=str, dest='mms_path', default=None, + help='Path to Metamod:Source') +builder.options.add_option('--sm-path', type=str, dest='sm_path', default=None, + help='Path to SourceMod') +builder.options.add_option('--enable-debug', action='store_const', const='1', dest='debug', + help='Enable debugging symbols') +builder.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt', + help='Enable optimization') +builder.options.add_option('-s', '--sdks', default='all', dest='sdks', + help='Build against specified SDKs; valid args are "all", "present", or ' + 'comma-delimited list of engine names (default: %default)') + +builder.Configure() diff --git a/extension.cpp b/extension.cpp new file mode 100644 index 0000000..14e8b2e --- /dev/null +++ b/extension.cpp @@ -0,0 +1,355 @@ +#include "extension.h" + +constexpr auto MAX_EDICT = 2048; + +TransmitManager g_TransmitManager; +SMEXT_LINK(&g_TransmitManager); + +IGameConfig* g_pGameConf = nullptr; +ISDKHooks* g_pSDKHooks = nullptr; +extern sp_nativeinfo_t g_Natives[]; + +SH_DECL_MANUALHOOK2_void(SetTransmit, 0, 0, 0, CCheckTransmitInfo*, bool); + +struct HookingEntity +{ + HookingEntity(CBaseEntity *pEntity) + { + bRemoveFlags = false; + iOwnerEntity = -1; + iEntityIndex = gamehelpers->EntityToBCompatRef(pEntity); + SourceHookId = SH_ADD_MANUALHOOK(SetTransmit, pEntity, SH_MEMBER(&g_TransmitManager, &TransmitManager::Hook_SetTransmit), false); + + for (auto i = 1; i < SM_MAXPLAYERS; i++) + { + // can see by default + bCanTransmit[i] = true; + } + + auto *pName = gamehelpers->GetEntityClassname(pEntity); + if (pName != nullptr && (V_strcmp(pName, "info_particle_system") == 0 || V_strcmp(pName, "light_dynamic") == 0)) + { + bRemoveFlags = true; + + auto *edict = gamehelpers->EdictOfIndex(iEntityIndex); + if (edict) + { + auto flags = edict->m_fStateFlags; + edict->m_fStateFlags = flags & (~FL_EDICT_ALWAYS); + } + } + } + + ~HookingEntity() + { + if (SourceHookId) + { + SH_REMOVE_HOOK_ID(SourceHookId); + SourceHookId = 0; + } + } + + bool CanSee(int client) + { + if (iEntityIndex == client || iOwnerEntity == client) + { + // self or children + return true; + } + + return bCanTransmit[client]; + } + + void SetSee(int client, bool can) + { + bCanTransmit[client] = can; + } + + int GetOwner() + { + return iOwnerEntity; + } + + void SetOwner(int owner) + { + iOwnerEntity = owner; + } + + bool ShouldRemove() + { + return bRemoveFlags; + } + +private: + int SourceHookId; + int iEntityIndex; + bool bCanTransmit[SM_MAXPLAYERS]; + int iOwnerEntity; + bool bRemoveFlags; +}; + +HookingEntity* g_Hooked[MAX_EDICT]; + +void TransmitManager::Hook_SetTransmit(CCheckTransmitInfo* pInfo, bool bAlways) +{ + auto *bcref = META_IFACEPTR(CBaseEntity); + auto entity = gamehelpers->EntityToBCompatRef(bcref); + auto *edict = gamehelpers->EdictOfIndex(entity); + auto client = gamehelpers->IndexOfEdict(pInfo->m_pClientEnt); + + if (entity > MAX_EDICT || entity < 1 || client == entity || !edict || edict->IsFree()) + { + RETURN_META(MRES_IGNORED); + } + + if (g_Hooked[entity]->ShouldRemove()) + { + auto flags = edict->m_fStateFlags; + if (flags & FL_EDICT_ALWAYS) + { + edict->m_fStateFlags = (flags ^ FL_EDICT_ALWAYS); + } + } + + auto owner = g_Hooked[entity]->GetOwner(); + if (owner == client) + { + // don't block children + RETURN_META(MRES_IGNORED); + } + + if (!g_Hooked[entity]->CanSee(client)) + { + // blocked + RETURN_META(MRES_SUPERCEDE); + } + + if (owner > 0 && !g_Hooked[owner]->CanSee(client)) + { + // blocked + RETURN_META(MRES_SUPERCEDE); + } + + //META_CONPRINTF("Hook_SetTransmit-> %d | %d | %d | %s\n", entity, owner, client, g_Hooked[entity]->CanSee(client) ? "true" : "false"); + + RETURN_META(MRES_IGNORED); +} + +bool TransmitManager::SDK_OnLoad(char *error, size_t maxlen, bool late) +{ + sharesys->AddDependency(myself, "sdkhooks.ext", true, true); + if (!sharesys->RequestInterface(SMINTERFACE_SDKHOOKS_NAME, SMINTERFACE_SDKHOOKS_VERSION, myself, reinterpret_cast(&g_pSDKHooks))) { + smutils->Format(error, maxlen, "Cannot get SDKHooks Interface"); + return false; + } + + if (!gameconfs->LoadGameConfigFile("sdkhooks.games", &g_pGameConf, error, maxlen)) { + smutils->Format(error, maxlen, "Failed to load SDKHooks gamedata."); + return false; + } + + int offset = -1; + if (!g_pGameConf->GetOffset("SetTransmit", &offset)) { + smutils->Format(error, maxlen, "Failed to load 'SetTransmit' offset."); + return false; + } + SH_MANUALHOOK_RECONFIGURE(SetTransmit, offset, 0, 0); + + playerhelpers->AddClientListener(this); + g_pSDKHooks->AddEntityListener(this); + + g_pShareSys->AddNatives(myself, g_Natives); + g_pShareSys->RegisterLibrary(myself, "TransmitManager"); + + // base + g_Hooked[0] = nullptr; + + return true; +} + +void TransmitManager::SDK_OnUnload() +{ + playerhelpers->RemoveClientListener(this); + g_pSDKHooks->RemoveEntityListener(this); + + for (auto i = 0; i < MAX_EDICT; i++) + { + if (g_Hooked[i] != nullptr) + { + delete g_Hooked[i]; + } + } +} + +void TransmitManager::OnEntityDestroyed(CBaseEntity* pEntity) +{ + auto entRef = gamehelpers->EntityToReference(pEntity); + auto entity = gamehelpers->ReferenceToIndex(entRef); + + if ((unsigned)entity == INVALID_EHANDLE_INDEX || (entity > 0 && entity <= playerhelpers->GetMaxClients())) + { + // This can be -1 for player entity before any players have connected + return; + } + + if (!IsEntityIndexInRange(entity)) + { + // out-of-range + return; + } + + UnhookEntity(pEntity); +} + +void TransmitManager::OnClientPutInServer(int client) +{ + auto*edict = gamehelpers->EdictOfIndex(client); + if (!edict || edict->IsFree()) + { + return; + } + auto*player = playerhelpers->GetGamePlayer(edict); + if (!player) + { + return; + } + auto*unk = edict->GetUnknown(); + if (!unk) + { + return; + } + + auto*pEntity = unk->GetBaseEntity(); + + for (auto i = 1; i < MAX_EDICT; i++) + { + if (g_Hooked[i] == nullptr) + { + //not being hook + continue; + } + + g_Hooked[i]->SetSee(client, true); + } + + // hooking self + HookEntity(pEntity); +} + +void TransmitManager::OnClientDisconnecting(int client) +{ + auto* edict = gamehelpers->EdictOfIndex(client); + if (!edict || edict->IsFree()) + { + return; + } + auto* player = playerhelpers->GetGamePlayer(edict); + if (!player || !player->IsInGame()) + { + return; + } + auto* unk = edict->GetUnknown(); + if (!unk) + { + return; + } + + UnhookEntity(unk->GetBaseEntity()); +} + +void TransmitManager::HookEntity(CBaseEntity* pEntity) +{ + auto index = gamehelpers->EntityToBCompatRef(pEntity); + if (g_Hooked[index] != nullptr) + { + smutils->LogError(myself, "Entity Hook listener [%d] is not nullptr. Try to remove.", index); + delete g_Hooked[index]; + } + + g_Hooked[index] = new HookingEntity(pEntity); +} + +void TransmitManager::UnhookEntity(CBaseEntity* pEntity) +{ + auto index = gamehelpers->EntityToBCompatRef(pEntity); + if (g_Hooked[index] == nullptr) + { + smutils->LogError(myself, "Entity Hook listener %d is nullptr. Skipped.", index); + return; + } + + delete g_Hooked[index]; + g_Hooked[index] = nullptr; +} + +static cell_t Native_SetEntityOwner(IPluginContext* pContext, const cell_t* params) +{ + if (!(params[1] >= 1 && params[1] < MAX_EDICT)) + { + // out-of-range + return pContext->ThrowNativeError("Entity %d is out-of-range.", params[1]); + } + + if (!(params[2] >= 1 && params[2] < MAX_EDICT)) + { + // out-of-range + return pContext->ThrowNativeError("Owner %d is out-of-range.", params[2]); + } + + if (g_Hooked[params[1]] != nullptr) + { + g_Hooked[params[1]]->SetOwner(params[2]); + return true; + } + + return pContext->ThrowNativeError("Entity %d is not being hook.", params[1]); +} + +static cell_t Native_SetEntityState(IPluginContext* pContext, const cell_t* params) +{ + if (!(params[1] >= 1 && params[1] < MAX_EDICT)) + { + // out-of-range + return pContext->ThrowNativeError("Entity %d is out-of-range.", params[1]); + } + + auto *pPlayer = playerhelpers->GetGamePlayer(params[2]); + if (!pPlayer || !pPlayer->IsInGame()) + { + return pContext->ThrowNativeError("Client %d is invalid.", params[2]); + } + + if (g_Hooked[params[1]] != nullptr) + { + g_Hooked[params[1]]->SetSee(params[2], params[3]); + return true; + } + + return pContext->ThrowNativeError("Entity %d is not being hook.", params[1]); +} + +static cell_t Native_AddEntityHooks(IPluginContext* pContext, const cell_t* params) +{ + if (!(params[1] >= 1 && params[1] < MAX_EDICT)) + { + // out-of-range + return pContext->ThrowNativeError("Entity %d is out-of-range.", params[1]); + } + + auto *pEntity = gamehelpers->ReferenceToEntity(params[1]); + if (!pEntity) + { + // nuull + return pContext->ThrowNativeError("Entity %d is invalid.", params[1]); + } + + g_TransmitManager.HookEntity(pEntity); +} + +sp_nativeinfo_t g_Natives[] = +{ + {"TransmitManager_AddEntityHooks", Native_AddEntityHooks}, + {"TransmitManager_SetEntityOwner", Native_SetEntityOwner}, + {"TransmitManager_SetEntityState", Native_SetEntityState}, + {nullptr, nullptr}, +}; \ No newline at end of file diff --git a/extension.h b/extension.h new file mode 100644 index 0000000..b7f31bf --- /dev/null +++ b/extension.h @@ -0,0 +1,34 @@ +#ifndef _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ +#define _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ + +#include "smsdk_ext.h" + +#include + +class TransmitManager : public SDKExtension, public ISMEntityListener, public IClientListener +{ + +public: + virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late); + virtual void SDK_OnUnload(); + +public: + virtual void OnEntityDestroyed(CBaseEntity* pEntity); + +public: + virtual void OnClientPutInServer(int client); + virtual void OnClientDisconnecting(int client); + +public: + void Hook_SetTransmit(CCheckTransmitInfo* pInfo, bool bAlways); + +private: + inline bool IsEntityIndexInRange(int i) { return i >= 1 && i < 2048; } + +public: + void HookEntity(CBaseEntity* pEntity); + void UnhookEntity(CBaseEntity* pEntity); + +}; + +#endif diff --git a/msvc15/TransmitManager.sln b/msvc15/TransmitManager.sln new file mode 100644 index 0000000..2af2d9f --- /dev/null +++ b/msvc15/TransmitManager.sln @@ -0,0 +1,19 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26403.7 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TransmitManager", "TransmitManager.vcxproj", "{B3E797CF-4E77-4C9D-B8A8-7589B6902206}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B3E797CF-4E77-4C9D-B8A8-7589B6902206}.Release|Win32.ActiveCfg = Release|Win32 + {B3E797CF-4E77-4C9D-B8A8-7589B6902206}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/msvc15/TransmitManager.vcxproj b/msvc15/TransmitManager.vcxproj new file mode 100644 index 0000000..fc6283a --- /dev/null +++ b/msvc15/TransmitManager.vcxproj @@ -0,0 +1,79 @@ + + + + + Release + Win32 + + + + {B3E797CF-4E77-4C9D-B8A8-7589B6902206} + TransmitManager + Win32Proj + 7.0 + TransmitManager + + + + DynamicLibrary + MultiByte + true + v141_xp + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + false + AllRules.ruleset + + + TransmitManager.ext.2.csgo + + + + Speed + ..;$(METAMOD)\core;$(METAMOD)\core\sourcehook;$(SOURCEMOD)\core;$(SOURCEMOD)\public;$(SOURCEMOD)\public\amtl\amtl;$(SOURCEMOD)\public\amtl;$(SOURCEMOD)\sourcepawn\include;$(SOURCEMOD)\public\extensions;$(HL2SDK-CSGO)\game\shared;$(HL2SDK-CSGO)\public;$(HL2SDK-CSGO)\public\tier0;$(HL2SDK-CSGO)\public\tier1;$(HL2SDK-CSGO)\public\engine;$(HL2SDK-CSGO)\public\vstdlib;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;SDK_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SOURCEMOD_BUILD;_CRT_NONSTDC_NO_DEPRECATE;SOURCE_ENGINE=12;COMPILER_MSVC;COMPILER_MSVC32;%(PreprocessorDefinitions) + MultiThreaded + NotSet + false + + + Level3 + ProgramDatabase + /MP /D SE_EPISODEONE=1 /D SE_DARKMESSIAH=2 /D SE_ORANGEBOX=3 /D SE_BLOODYGOODTIME=4 /D SE_EYE=5 /D SE_CSS=6 /D SE_ORANGEBOXVALVE=7 /D SE_LEFT4DEAD=8 /D SE_LEFT4DEAD2=9 /D SE_ALIENSWARM=10 /D SE_PORTAL2=11 /D SE_CSGO=12 + + + + + false + Windows + true + true + false + + + MachineX86 + tier0.lib;tier1.lib;vstdlib.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;interfaces.lib;legacy_stdio_definitions.lib;%(AdditionalDependencies) + $(HL2SDK-CSGO)\lib\public + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/msvc15/TransmitManager.vcxproj.filters b/msvc15/TransmitManager.vcxproj.filters new file mode 100644 index 0000000..014bd71 --- /dev/null +++ b/msvc15/TransmitManager.vcxproj.filters @@ -0,0 +1,39 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {31958233-BB2D-4e41-A8F9-CE8A4684F436} + + + + + Source Files + + + SourceMod SDK + + + + + Header Files + + + SourceMod SDK + + + SourceMod SDK + + + \ No newline at end of file diff --git a/smsdk_config.h b/smsdk_config.h new file mode 100644 index 0000000..b91bc18 --- /dev/null +++ b/smsdk_config.h @@ -0,0 +1,36 @@ +#ifndef _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ +#define _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ + +#define SMEXT_CONF_NAME "Transmit Manager" +#define SMEXT_CONF_DESCRIPTION "" +#define SMEXT_CONF_VERSION "1.0.0" +#define SMEXT_CONF_AUTHOR "Kyle \"Kxnrl\" Frankiss" +#define SMEXT_CONF_URL "https://www.kxnrl.com" +#define SMEXT_CONF_LOGTAG "TransmitManager" +#define SMEXT_CONF_LICENSE "GPL" +#define SMEXT_CONF_DATESTRING __DATE__ + +#define SMEXT_LINK(name) SDKExtension *g_pExtensionIface = name; + +#define SMEXT_CONF_METAMOD + +//#define SMEXT_ENABLE_FORWARDSYS +//#define SMEXT_ENABLE_HANDLESYS +#define SMEXT_ENABLE_PLAYERHELPERS +//#define SMEXT_ENABLE_DBMANAGER +#define SMEXT_ENABLE_GAMECONF +//#define SMEXT_ENABLE_MEMUTILS +#define SMEXT_ENABLE_GAMEHELPERS +//#define SMEXT_ENABLE_TIMERSYS +//#define SMEXT_ENABLE_THREADER +//#define SMEXT_ENABLE_LIBSYS +//#define SMEXT_ENABLE_MENUS +//#define SMEXT_ENABLE_ADTFACTORY +//#define SMEXT_ENABLE_PLUGINSYS +//#define SMEXT_ENABLE_ADMINSYS +//#define SMEXT_ENABLE_TEXTPARSERS +//#define SMEXT_ENABLE_USERMSGS +//#define SMEXT_ENABLE_TRANSLATOR +//#define SMEXT_ENABLE_ROOTCONSOLEMENU + +#endif