commit 768b4593be2d478789aa33fd45dd6d33ba52bce2 Author: Kyle Date: Tue Aug 11 10:19:32 2020 +0800 Release 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