Compare commits

..
513 changed files with 77744 additions and 179269 deletions
-2
View File
@@ -24,5 +24,3 @@
# Files generated by Windows Explorer # Files generated by Windows Explorer
(^|/)[dD]esktop\.ini$ (^|/)[dD]esktop\.ini$
(^|/)[tT]humbs\.db$ (^|/)[tT]humbs\.db$
syntax: glob
build/*
-6
View File
@@ -3,9 +3,3 @@ e6ef5ecdf8d75740ca2685a709bf321f8873bc3b sourcemod-1.1.0
e877885fac80be71822641f7a9122cebc9812521 sourcemod-1.1.1 e877885fac80be71822641f7a9122cebc9812521 sourcemod-1.1.1
b3ffa8a4511c4eadaf533fc790aa6b14f7f0c6ea sourcemod-1.1.2 b3ffa8a4511c4eadaf533fc790aa6b14f7f0c6ea sourcemod-1.1.2
3a73bbf60f34befa9b66be03fa5974b394bb3411 sourcemod-1.2.0 3a73bbf60f34befa9b66be03fa5974b394bb3411 sourcemod-1.2.0
78a1f1b1c6fa86fd7691c70ebf48a9fb3dfb3c11 sourcemod-1.5.0
5574bfe07731b7dba171c1300f6022319d2dbc89 sourcemod-1.5.1
238c41726d73d9f0d65005ff43c1ab86adb0e163 sourcemod-1.5.2
27bf76b007d2360a9cfc7af9e14d1c9a6bddcc64 sourcemod-1.5.3
27bf76b007d2360a9cfc7af9e14d1c9a6bddcc64 sourcemod-1.5.3
0000000000000000000000000000000000000000 sourcemod-1.5.3
+389 -481
View File
@@ -1,490 +1,398 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os, sys import os
import sys
from ambuild.command import SymlinkCommand
class SDK(object): class SM:
def __init__(self, sdk, ext, aDef, name, platform, dir): def __init__(self):
if dir == 'ep1': self.compiler = Cpp.Compiler()
folder = 'hl2sdk'
else:
folder = 'hl2sdk-' + dir
self.envvar = sdk
self.ext = ext
self.code = aDef
self.define = name
self.platform = platform
self.folder = folder # Default folder name.
self.name = dir
self.path = None # Actual path
WinOnly = ['windows'] #Build SDK info
WinLinux = ['windows', 'linux'] self.possibleSdks = { }
WinLinuxMac = ['windows', 'linux', 'mac'] self.possibleSdks['ep1'] = {'sdk': 'HL2SDK', 'ext': '1.ep1', 'def': '1',
'name': 'EPISODEONE', 'platform': ['windows', 'linux']}
self.possibleSdks['ep2'] = {'sdk': 'HL2SDKOB', 'ext': '2.ep2', 'def': '3',
'name': 'ORANGEBOX', 'platform': ['windows', 'linux']}
self.possibleSdks['ep2v'] = {'sdk': 'HL2SDKOBVALVE', 'ext': '2.ep2v', 'def': '6',
'name': 'ORANGEBOXVALVE', 'platform': ['windows', 'linux', 'darwin']}
self.possibleSdks['l4d'] = {'sdk': 'HL2SDKL4D', 'ext': '2.l4d', 'def': '7',
'name': 'LEFT4DEAD', 'platform': ['windows', 'linux', 'darwin']}
self.possibleSdks['l4d2'] = {'sdk': 'HL2SDKL4D2', 'ext': '2.l4d2', 'def': '8',
'name': 'LEFT4DEAD2', 'platform': ['windows', 'linux', 'darwin']}
self.possibleSdks['darkm'] = {'sdk': 'HL2SDK-DARKM', 'ext': '2.darkm', 'def': '2',
'name': 'DARKMESSIAH', 'platform': ['windows']}
self.possibleSdks['swarm'] = {'sdk': 'HL2SDK-SWARM', 'ext': '2.swarm', 'def': '9',
'name': 'ALIENSWARM', 'platform': ['windows']}
self.possibleSdks['bgt'] = {'sdk': 'HL2SDK-BGT', 'ext': '2.bgt', 'def': '4',
'name': 'BLOODYGOODTIME', 'platform': ['windows']}
self.possibleSdks['eye'] = {'sdk': 'HL2SDK-EYE', 'ext': '2.eye', 'def': '5',
'name': 'EYE', 'platform': ['windows']}
self.sdkInfo = { }
PossibleSDKs = { if AMBuild.mode == 'config':
'ep1': SDK('HL2SDK', '1.ep1', '1', 'EPISODEONE', WinLinux, 'ep1'), #Detect compilers
'ep2': SDK('HL2SDKOB', '2.ep2', '3', 'ORANGEBOX', WinLinux, 'ob'), self.compiler.DetectAll(AMBuild)
'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'),
'tf2': SDK('HL2SDKTF2', '2.tf2', '10', 'TF2', WinLinuxMac, 'tf2'),
'l4d': SDK('HL2SDKL4D', '2.l4d', '11', 'LEFT4DEAD', WinLinuxMac, 'l4d'),
'nd': SDK('HL2SDKND', '2.nd', '12', 'NUCLEARDAWN', WinLinuxMac, 'nd'),
'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '13', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'),
'darkm': SDK('HL2SDK-DARKM', '2.darkm', '2', 'DARKMESSIAH', WinOnly, 'darkm'),
'swarm': SDK('HL2SDK-SWARM', '2.swarm', '14', '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', '18', 'CSGO', WinLinuxMac, 'csgo'),
'portal2': SDK('HL2SDKPORTAL2', '2.portal2', '15', 'PORTAL2', [], 'portal2'),
# These engines are only supported on SourceMod 1.6. #Detect variables
# 'blade': SDK('HL2SDKBLADE', '2.blade', '16', 'BLADE', WinLinux, 'blade'), envvars = { 'MMSOURCE18': 'mmsource-1.8',
# 'dota': SDK('HL2SDKDOTA', '2.dota', '19', 'DOTA', WinOnly, 'dota'), 'HL2SDKOBVALVE': 'hl2sdk-ob-valve',
# 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '17', 'INSURGENCY', WinLinuxMac, 'insurgency'), 'HL2SDKL4D': 'hl2sdk-l4d',
# 'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, '2013'), 'HL2SDKL4D2': 'hl2sdk-l4d2',
'MYSQL5': 'mysql-5.0'
}
if AMBuild.target['platform'] != 'darwin':
envvars['HL2SDK'] = 'hl2sdk'
envvars['HL2SDKOB'] = 'hl2sdk-ob'
#Dark Messiah is Windows-only
if AMBuild.target['platform'] == 'windows':
envvars['HL2SDK-DARKM'] = 'hl2sdk-darkm'
envvars['HL2SDK-SWARM'] = 'hl2sdk-swarm'
envvars['HL2SDK-BGT'] = 'hl2sdk-bgt'
envvars['HL2SDK-EYE'] = 'hl2sdk-eye'
# Finds if a dict with `key` set to `value` is present on the dict of dicts `dictionary`
def findDictByKey(dictionary, key, value):
for index in dictionary:
elem = dictionary[index]
if elem[key] == value:
return (elem, index)
return None
for i in envvars:
if i in os.environ:
path = os.environ[i]
if not os.path.isdir(path):
raise Exception('Path for {0} was not found: {1}'.format(i, path))
elif i.startswith('HL2SDK'):
(info, sdk) = findDictByKey(self.possibleSdks, 'sdk', i)
self.sdkInfo[sdk] = info
else:
head = os.getcwd()
oldhead = None
while head != None and head != oldhead:
path = os.path.join(head, envvars[i])
if os.path.isdir(path):
break
oldhead = head
head, tail = os.path.split(head)
if i.startswith('HL2SDK'):
(info, sdk) = findDictByKey(self.possibleSdks, 'sdk', i)
self.sdkInfo[sdk] = info
elif head == None or head == oldhead:
raise Exception('Could not find a valid path for {0}'.format(i))
AMBuild.cache.CacheVariable(i, path)
if len(self.sdkInfo) < 1:
raise Exception('At least one SDK must be available.')
AMBuild.cache.CacheVariable('sdkInfo', self.sdkInfo)
#Set up defines
cxx = self.compiler.cxx
if isinstance(cxx, Cpp.CompatGCC):
if isinstance(cxx, Cpp.GCC):
self.vendor = 'gcc'
elif isinstance(cxx, Cpp.Clang):
self.vendor = 'clang'
self.compiler.AddToListVar('CDEFINES', 'stricmp=strcasecmp')
self.compiler.AddToListVar('CDEFINES', '_stricmp=strcasecmp')
self.compiler.AddToListVar('CDEFINES', '_snprintf=snprintf')
self.compiler.AddToListVar('CDEFINES', '_vsnprintf=vsnprintf')
self.compiler.AddToListVar('CFLAGS', '-pipe')
self.compiler.AddToListVar('CFLAGS', '-fno-strict-aliasing')
if (self.vendor == 'gcc' and cxx.majorVersion >= 4) or self.vendor == 'clang':
self.compiler.AddToListVar('CFLAGS', '-fvisibility=hidden')
self.compiler.AddToListVar('CXXFLAGS', '-fvisibility-inlines-hidden')
self.compiler.AddToListVar('CFLAGS', '-Wall')
self.compiler.AddToListVar('CFLAGS', '-Werror')
self.compiler.AddToListVar('CFLAGS', '-Wno-uninitialized')
self.compiler.AddToListVar('CFLAGS', '-Wno-unused')
self.compiler.AddToListVar('CFLAGS', '-Wno-switch')
self.compiler.AddToListVar('CFLAGS', '-msse')
self.compiler.AddToListVar('CFLAGS', '-m32')
self.compiler.AddToListVar('POSTLINKFLAGS', '-m32')
self.compiler.AddToListVar('CXXFLAGS', '-fno-exceptions')
self.compiler.AddToListVar('CXXFLAGS', '-fno-rtti')
self.compiler.AddToListVar('CXXFLAGS', '-fno-threadsafe-statics')
self.compiler.AddToListVar('CXXFLAGS', '-Wno-non-virtual-dtor')
self.compiler.AddToListVar('CXXFLAGS', '-Wno-overloaded-virtual')
self.compiler.AddToListVar('CDEFINES', 'HAVE_STDINT_H')
self.compiler.AddToListVar('CDEFINES', 'GNUC')
if self.vendor == 'gcc':
self.compiler.AddToListVar('CFLAGS', '-mfpmath=sse')
elif isinstance(cxx, Cpp.MSVC):
self.vendor = 'msvc'
if AMBuild.options.debug == '1':
self.compiler.AddToListVar('CFLAGS', '/MTd')
self.compiler.AddToListVar('POSTLINKFLAGS', '/NODEFAULTLIB:libcmt')
else:
self.compiler.AddToListVar('CFLAGS', '/MT')
self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_DEPRECATE')
self.compiler.AddToListVar('CDEFINES', '_CRT_SECURE_NO_WARNINGS')
self.compiler.AddToListVar('CDEFINES', '_CRT_NONSTDC_NO_DEPRECATE')
self.compiler.AddToListVar('CXXFLAGS', '/EHsc')
self.compiler.AddToListVar('CXXFLAGS', '/GR-')
self.compiler.AddToListVar('CFLAGS', '/W3')
self.compiler.AddToListVar('CFLAGS', '/nologo')
self.compiler.AddToListVar('CFLAGS', '/Zi')
self.compiler.AddToListVar('CXXFLAGS', '/TP')
self.compiler.AddToListVar('POSTLINKFLAGS', '/DEBUG')
self.compiler.AddToListVar('POSTLINKFLAGS', '/MACHINE:X86')
self.compiler.AddToListVar('POSTLINKFLAGS', '/SUBSYSTEM:WINDOWS')
self.compiler.AddToListVar('POSTLINKFLAGS', 'kernel32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'user32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'gdi32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'winspool.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'comdlg32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'advapi32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'shell32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'ole32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'oleaut32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'uuid.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'odbc32.lib')
self.compiler.AddToListVar('POSTLINKFLAGS', 'odbccp32.lib')
#Optimization
if AMBuild.options.opt == '1':
self.compiler.AddToListVar('CDEFINES', 'NDEBUG')
if self.vendor == 'gcc' or self.vendor == 'clang':
self.compiler.AddToListVar('CFLAGS', '-O3')
elif self.vendor == 'msvc':
self.compiler.AddToListVar('CFLAGS', '/Ox')
self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:ICF')
self.compiler.AddToListVar('POSTLINKFLAGS', '/OPT:REF')
#Debugging
if AMBuild.options.debug == '1':
self.compiler.AddToListVar('CDEFINES', 'DEBUG')
self.compiler.AddToListVar('CDEFINES', '_DEBUG')
if self.vendor == 'gcc' or self.vendor == 'clang':
self.compiler.AddToListVar('CFLAGS', '-g3')
elif self.vendor == 'msvc':
self.compiler.AddToListVar('CFLAGS', '/Od')
self.compiler.AddToListVar('CFLAGS', '/RTC1')
#Platform-specifics
if AMBuild.target['platform'] == 'linux':
self.compiler.AddToListVar('CDEFINES', '_LINUX')
if self.vendor == 'gcc':
self.compiler.AddToListVar('POSTLINKFLAGS', '-static-libgcc')
if self.vendor == 'clang':
self.compiler.AddToListVar('POSTLINKFLAGS', '-lgcc_eh')
elif AMBuild.target['platform'] == 'darwin':
self.compiler.AddToListVar('CFLAGS', ['-isysroot',
'/Developer/SDKs/MacOSX10.5.sdk'])
self.compiler.AddToListVar('POSTLINKFLAGS', '-mmacosx-version-min=10.5')
self.compiler.AddToListVar('POSTLINKFLAGS', ['-arch', 'i386'])
self.compiler.AddToListVar('POSTLINKFLAGS', '-lstdc++')
# For OS X dylib versioning
import re
productFile = open(os.path.join(AMBuild.sourceFolder, 'product.version'), 'r')
productContents = productFile.read()
productFile.close()
m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
if m == None:
self.version = '1.0.0'
else:
major, minor, release = m.groups()
self.version = '{0}.{1}.{2}'.format(major, minor, release)
AMBuild.cache.CacheVariable('version', self.version)
elif AMBuild.target['platform'] == 'windows':
self.compiler.AddToListVar('CDEFINES', 'WIN32')
self.compiler.AddToListVar('CDEFINES', '_WINDOWS')
#Finish up
self.compiler.AddToListVar('CDEFINES', 'SOURCEMOD_BUILD')
self.compiler.AddToListVar('CDEFINES', 'SM_GENERATED_BUILD')
self.compiler.AddToListVar('CINCLUDES',
os.path.join(AMBuild.outputFolder, 'includes'))
self.compiler.ToConfig(AMBuild, 'compiler')
AMBuild.cache.CacheVariable('vendor', self.vendor)
self.targetMap = { }
AMBuild.cache.CacheVariable('targetMap', self.targetMap)
else:
self.sdkInfo = AMBuild.cache['sdkInfo']
self.compiler.FromConfig(AMBuild, 'compiler')
self.targetMap = AMBuild.cache['targetMap']
if AMBuild.target['platform'] == 'windows':
self.compiler.AddToListVar('RCINCLUDES', os.path.join(AMBuild.sourceFolder, 'public'))
self.compiler.AddToListVar('RCINCLUDES',
os.path.join(AMBuild.outputFolder, 'includes'))
self.mmsPath = AMBuild.cache['MMSOURCE18']
def DefaultCompiler(self):
return self.compiler.Clone()
def JobMatters(self, jobname):
file = sys._getframe().f_code.co_filename
if AMBuild.mode == 'config':
self.targetMap[jobname] = file
return True
if len(AMBuild.args) == 0:
return True
if not jobname in AMBuild.args:
return False
def DefaultExtCompiler(self, path):
compiler = self.DefaultCompiler()
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path))
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, path, 'sdk'))
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public'))
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'extensions'))
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'sourcepawn'))
return compiler
def AutoVersion(self, folder, binary):
if AMBuild.target['platform'] == 'windows':
env = {'RCDEFINES': ['BINARY_NAME="' + binary.binaryFile + '"', 'SM_GENERATED_BUILD']}
binary.AddResourceFile(os.path.join(folder, 'version.rc' ), env)
elif AMBuild.target['platform'] == 'darwin' and isinstance(binary, Cpp.LibraryBuilder):
binary.compiler['POSTLINKFLAGS'].extend(['-compatibility_version', '1.0.0'])
binary.compiler['POSTLINKFLAGS'].extend(['-current_version', AMBuild.cache['version']])
else:
return
def PreSetupHL2Job(self, job, builder, sdk):
info = self.sdkInfo[sdk]
sdkPath = AMBuild.cache[info['sdk']]
if AMBuild.target['platform'] == 'linux':
if sdk == 'ep1':
staticLibs = os.path.join(sdkPath, 'linux_sdk')
else:
staticLibs = os.path.join(sdkPath, 'lib', 'linux')
workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
if sdk in ['ep2v', 'l4d', 'l4d2']:
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.so', 'libtier0.so']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
try:
os.lstat(link)
except:
job.AddCommand(SymlinkCommand(link, target))
else:
for i in ['tier1_i486.a', 'mathlib_i486.a', 'vstdlib_i486.so', 'tier0_i486.so']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
try:
os.lstat(link)
except:
job.AddCommand(SymlinkCommand(link, target))
elif AMBuild.target['platform'] == 'darwin':
staticLibs = os.path.join(sdkPath, 'lib', 'mac')
workFolder = os.path.join(AMBuild.outputFolder, job.workFolder)
for i in ['tier1_i486.a', 'mathlib_i486.a', 'libvstdlib.dylib', 'libtier0.dylib']:
link = os.path.join(workFolder, i)
target = os.path.join(staticLibs, i)
try:
os.lstat(link)
except:
job.AddCommand(SymlinkCommand(link, target))
elif AMBuild.target['platform'] == 'windows':
libs = ['tier0', 'tier1', 'vstdlib', 'mathlib']
if sdk == 'swarm':
libs.append('interfaces')
for lib in libs:
libPath = os.path.join(sdkPath, 'lib', 'public', lib) + '.lib'
builder.RebuildIfNewer(libPath)
builder['POSTLINKFLAGS'].append(libPath)
def PostSetupHL2Job(self, job, builder, sdk):
if AMBuild.target['platform'] in ['linux', 'darwin']:
builder.AddObjectFiles(['tier1_i486.a', 'mathlib_i486.a'])
def DefaultHL2Compiler(self, path, sdk, noLink = False, oldMms = '-legacy'):
compiler = self.DefaultExtCompiler(path)
mms = 'core'
if sdk == 'ep1':
mms += oldMms
compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms))
compiler['CXXINCLUDES'].append(os.path.join(self.mmsPath, mms, 'sourcehook'))
info = self.possibleSdks
compiler['CDEFINES'].extend(['SE_' + info[i]['name'] + '=' + info[i]['def'] for i in info])
paths = [['public'], ['public', 'engine'], ['public', 'mathlib'], ['public', 'vstdlib'],
['public', 'tier0'], ['public', 'tier1']]
if sdk == 'ep1' or sdk == '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'])
info = self.sdkInfo[sdk]
sdkPath = AMBuild.cache[info['sdk']]
compiler['CDEFINES'].append('SOURCE_ENGINE=' + info['def'])
if sdk == 'swarm' and AMBuild.target['platform'] == 'windows':
compiler['CDEFINES'].extend(['COMPILER_MSVC', 'COMPILER_MSVC32'])
if sdk == 'ep1':
if AMBuild.target['platform'] == 'linux':
staticLibs = os.path.join(sdkPath, 'linux_sdk')
else:
if AMBuild.target['platform'] == 'linux':
staticLibs = os.path.join(sdkPath, 'lib', 'linux')
elif AMBuild.target['platform'] == 'darwin':
staticLibs = os.path.join(sdkPath, 'lib', 'mac')
for i in paths:
compiler['CXXINCLUDES'].append(os.path.join(sdkPath, *i))
if not noLink:
if AMBuild.target['platform'] == 'linux':
compiler['POSTLINKFLAGS'][0:0] = ['-lm']
if sdk in ['ep2v', 'l4d', 'l4d2']:
compiler['POSTLINKFLAGS'][0:0] = ['libtier0.so']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.so']
else:
compiler['POSTLINKFLAGS'][0:0] = ['tier0_i486.so']
compiler['POSTLINKFLAGS'][0:0] = ['vstdlib_i486.so']
elif AMBuild.target['platform'] == 'darwin':
compiler['POSTLINKFLAGS'][0:0] = ['libtier0.dylib']
compiler['POSTLINKFLAGS'][0:0] = ['libvstdlib.dylib']
return compiler
sm = SM()
globals = {
'SM': sm
} }
def ResolveEnvPath(env, folder): AMBuild.Include(os.path.join('tools', 'buildbot', 'Versioning'), globals)
if env in os.environ:
path = os.environ[env]
if os.path.isdir(path):
return path
else:
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
class SMConfig(object): FileList = [
def __init__(self): ['loader', 'AMBuilder'],
self.sdks = {} ['core', 'AMBuilder'],
self.binaries = [] ['core', 'logic', 'AMBuilder'],
self.extensions = [] ['extensions', 'bintools', 'AMBuilder'],
self.generated_headers = None ['extensions', 'clientprefs', 'AMBuilder'],
self.mms_root = None ['extensions', 'cstrike', 'AMBuilder'],
self.mysql_root = None ['extensions', 'curl', 'AMBuilder'],
self.spcomp = None ['extensions', 'geoip', 'AMBuilder'],
self.smx_files = {} ['extensions', 'mysql', 'AMBuilder'],
self.versionlib = None ['extensions', 'sdktools', 'AMBuilder'],
['extensions', 'topmenus', 'AMBuilder'],
['extensions', 'updater', 'AMBuilder'],
['extensions', 'sqlite', 'AMBuilder'],
['extensions', 'regex', 'AMBuilder'],
['extensions', 'tf2', 'AMBuilder'],
['sourcepawn', 'jit', 'AMBuilder'],
['sourcepawn', 'compiler', 'AMBuilder'],
['plugins', 'AMBuilder'],
['tools', 'buildbot', 'PackageScript']
]
def detectProductVersion(self): for parts in FileList:
builder.AddConfigureFile('product.version') AMBuild.Include(os.path.join(*parts), globals)
# For OS X dylib versioning
import re
with open(os.path.join(builder.sourcePath, 'product.version'), 'r') as fp:
productContents = fp.read()
m = re.match('(\d+)\.(\d+)\.(\d+).*', productContents)
if m == None:
self.productVersion = '1.0.0'
else:
major, minor, release = m.groups()
self.productVersion = '{0}.{1}.{2}'.format(major, minor, 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:
sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder)
if sdk_path is None:
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 = sdk_path
self.sdks[sdk_name] = sdk
if len(self.sdks) < 1:
raise Exception('At least one SDK must be available.')
self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10')
if not self.mms_root:
self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central')
if not self.mms_root:
raise Exception('Could not find a source copy of Metamod:Source')
if builder.options.hasMySql:
for i in range(7):
self.mysql_root = ResolveEnvPath('MYSQL5', 'mysql-5.' + str(i))
if self.mysql_root:
break
if not self.mysql_root:
raise Exception('Could not find a path to MySQL!')
def configure(self):
builder.AddConfigureFile('pushbuild.txt')
cfg = builder.DetectCompilers()
cxx = cfg.cxx
if cxx.behavior == 'gcc':
cfg.defines += [
'stricmp=strcasecmp',
'_stricmp=strcasecmp',
'_snprintf=snprintf',
'_vsnprintf=vsnprintf',
'HAVE_STDINT_H',
'GNUC',
]
cfg.cflags += [
'-pipe',
'-fno-strict-aliasing',
'-Wall',
'-Werror',
'-Wno-uninitialized',
'-Wno-unused',
'-Wno-switch',
'-msse',
'-m32',
]
have_gcc = cxx.name == 'gcc'
have_clang = cxx.name == 'clang'
if have_clang or (have_gcc and cxx.majorVersion >= 4):
cfg.cflags += ['-fvisibility=hidden']
cfg.cxxflags += ['-fvisibility-inlines-hidden']
if have_clang or (have_gcc and cxx.minorVersion >= 6):
cfg.cflags += ['-Wno-narrowing']
if (have_gcc and cxx.minorVersion >= 7) or (have_clang and cxx.majorVersion >= 3):
cfg.cxxflags += ['-Wno-delete-non-virtual-dtor']
if have_gcc:
cfg.cflags += ['-Wno-parentheses']
elif have_clang:
cfg.cflags += ['-Wno-logical-op-parentheses']
cfg.linkflags += ['-m32']
cfg.cxxflags += [
'-fno-exceptions',
'-fno-threadsafe-statics',
'-Wno-non-virtual-dtor',
'-Wno-overloaded-virtual',
]
if have_gcc:
cfg.cflags += ['-mfpmath=sse']
elif cxx.name == 'msvc':
if builder.options.debug == '1':
cfg.cflags += ['/MTd']
cfg.linkflags += ['/NODEFAULTLIB:libcmt']
else:
cfg.cflags += ['/MT']
cfg.defines += [
'_CRT_SECURE_NO_DEPRECATE',
'_CRT_SECURE_NO_WARNINGS',
'_CRT_NONSTDC_NO_DEPRECATE',
'_ITERATOR_DEBUG_LEVEL=0',
]
cfg.cflags += [
'/W3',
]
cfg.cxxflags += [
'/EHsc',
'/GR-',
'/TP',
]
cfg.linkflags += [
'/MACHINE:X86',
'/SUBSYSTEM:WINDOWS',
'kernel32.lib',
'user32.lib',
'gdi32.lib',
'winspool.lib',
'comdlg32.lib',
'advapi32.lib',
'shell32.lib',
'ole32.lib',
'oleaut32.lib',
'uuid.lib',
'odbc32.lib',
'odbccp32.lib',
]
# Optimization
if builder.options.opt == '1':
cfg.defines += ['NDEBUG']
if cxx.behavior == 'gcc':
cfg.cflags += ['-O3']
elif cxx.behavior == 'msvc':
cfg.cflags += ['/Ox']
cfg.linkflags += ['/OPT:ICF', '/OPT:REF']
# Debugging
if builder.options.debug == '1':
cfg.defines += ['DEBUG', '_DEBUG']
if cxx.behavior == 'msvc':
cfg.cflags += ['/Od', '/RTC1']
if int(cxx.version) >= 1600:
cfg.cflags += ['/d2Zi+']
# This needs to be after our optimization flags which could otherwise disable it.
if cxx.name == 'msvc':
# Don't omit the frame pointer.
cfg.cflags += ['/Oy-']
# Platform-specifics
if builder.target_platform == 'linux':
cfg.defines += ['_LINUX', 'POSIX']
if cxx.name == 'gcc':
cfg.linkflags += ['-static-libgcc']
elif cxx.name == 'clang':
cfg.linkflags += ['-lgcc_eh']
elif builder.target_platform == 'mac':
cfg.defines += ['OSX', '_OSX', 'POSIX']
cfg.cflags += ['-mmacosx-version-min=10.5']
cfg.linkflags += [
'-mmacosx-version-min=10.5',
'-arch', 'i386',
'-lstdc++',
'-stdlib=libstdc++',
]
cfg.cxxflags += ['-stdlib=libstdc++']
elif builder.target_platform == 'windows':
cfg.defines += ['WIN32', '_WINDOWS']
# Finish up.
cfg.defines += [
'SOURCEMOD_BUILD',
'SM_GENERATED_BUILD',
'SM_USE_VERSIONLIB',
]
cfg.includes += [os.path.join(builder.buildPath, 'includes')]
cfg.includes += [os.path.join(builder.sourcePath, 'versionlib')]
def LibraryBuilder(self, compiler, name):
binary = compiler.Library(name)
if builder.target_platform == 'windows':
binary.sources += ['version.rc']
binary.compiler.rcdefines += [
'BINARY_NAME="{0}"'.format(binary.outputFile),
'SM_GENERATED_BUILD',
'RC_COMPILE',
]
elif builder.target_platform == 'mac':
binary.compiler.postlink += [
'-compatibility_version', '1.0.0',
'-current_version', self.productVersion
]
binary.compiler.linkflags += [self.versionlib]
binary.compiler.sourcedeps += SM.generated_headers
return binary
def ProgramBuilder(self, compiler, name):
binary = compiler.Program(name)
if builder.target_platform == 'windows':
binary.sources += ['version.rc']
binary.compiler.rcdefines += [
'BINARY_NAME="{0}"'.format(binary.outputFile),
'SM_GENERATED_BUILD',
'RC_COMPILE',
]
binary.compiler.linkflags += [self.versionlib]
binary.compiler.sourcedeps += SM.generated_headers
return binary
def Library(self, context, name):
compiler = context.compiler.clone()
return self.LibraryBuilder(compiler, name)
def Program(self, context, name):
compiler = context.compiler.clone()
return self.ProgramBuilder(compiler, name)
def ExtCompiler(self, context):
compiler = context.compiler.clone()
compiler.cxxincludes += [
os.path.join(context.currentSourcePath),
os.path.join(context.currentSourcePath, 'sdk'),
os.path.join(builder.sourcePath, 'public'),
os.path.join(builder.sourcePath, 'public', 'extensions'),
os.path.join(builder.sourcePath, 'public', 'sourcepawn'),
os.path.join(builder.sourcePath, 'public', 'amtl'),
]
return compiler
def HL2Compiler(self, context, sdk):
compiler = self.ExtCompiler(context)
if sdk.name == 'ep1':
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 == 'ep1' 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 == '2013' and compiler.cxx.behavior == '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 sdk.name in ['swarm', 'blade', 'insurgency', 'csgo', 'dota']:
if compiler.cc.behavior == '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', 'csgo', 'dota']:
compiler.defines += ['NETWORK_VARS_ENABLED']
if sdk.name in ['css', 'hl2dm', 'dods', '2013', 'tf2', 'l4d2']:
if builder.target_platform in ['linux', 'mac']:
compiler.defines += ['NO_MALLOC_OVERRIDE']
for path in paths:
compiler.cxxincludes += [os.path.join(sdk.path, *path)]
return compiler
def ExtLibrary(self, context, name):
compiler = self.ExtCompiler(context)
return self.LibraryBuilder(compiler, name)
def HL2Library(self, context, name, sdk):
compiler = self.HL2Compiler(context, sdk)
if builder.target_platform == 'linux':
if sdk.name == 'ep1':
lib_folder = os.path.join(sdk.path, 'linux_sdk')
elif sdk.name == '2013':
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 == '2013':
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 == '2013':
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', 'csgo', 'dota']:
compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))]
binary = self.LibraryBuilder(compiler, name)
dynamic_libs = []
if builder.target_platform == 'linux':
compiler.linkflags[0:0] = ['-lm']
if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', '2013', 'l4d2']:
dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so']
elif sdk.name in ['l4d', 'nd', 'blade', 'insurgency', 'csgo']:
dynamic_libs = ['libtier0.so', 'libvstdlib.so']
else:
dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so']
elif builder.target_platform == 'mac':
binary.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', 'csgo', 'dota']:
libs.append('interfaces')
for lib in libs:
lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib'
binary.compiler.linkflags.append(binary.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)
binary.compiler.linkflags[0:0] = [binary.Dep(library, linker)]
return binary
SM = SMConfig()
SM.detectProductVersion()
SM.detectSDKs()
SM.configure()
SM.generated_headers = builder.RunScript(
'tools/buildbot/Versioning',
{ 'SM': SM }
)
SM.versionlib = builder.RunScript(
'versionlib/AMBuilder',
{ 'SM': SM }
)
builder.RunBuildScripts(
[
'loader/AMBuilder',
'core/AMBuilder',
'core/logic/AMBuilder',
'extensions/bintools/AMBuilder',
'extensions/clientprefs/AMBuilder',
'extensions/curl/AMBuilder',
'extensions/cstrike/AMBuilder',
'extensions/geoip/AMBuilder',
'extensions/mysql/AMBuilder',
'extensions/regex/AMBuilder',
'extensions/sdkhooks/AMBuilder',
'extensions/sdktools/AMBuilder',
'extensions/sqlite/AMBuilder',
'extensions/tf2/AMBuilder',
'extensions/topmenus/AMBuilder',
'extensions/updater/AMBuilder',
'sourcepawn/compiler/AMBuilder',
'sourcepawn/jit/AMBuilder',
'plugins/AMBuilder',
'tools/buildbot/PackageScript',
],
{
'SM': SM
}
)
if builder.options.breakpad_dump:
builder.RunScript('tools/buildbot/BreakpadSymbols', { 'SM': SM })
-308
View File
@@ -1,313 +1,5 @@
SourceMod Changelog SourceMod Changelog
SourceMod 1.5.3 [2014-03-22]
URL: http://wiki.alliedmods.net/SourceMod_1.5.3_Release_Notes
User Changes:
- Updated support for CS:GO after multiple breaking game updates.
- Updated gamedata support for GoldenEye: Source (Peace-Maker).
- Fixed crash on SDKHooks extension load in Alien Swarm (bug 6059).
- Fixed memory leak from unmanaged forwards never being freed (bug 6025).
- Fixed possible crash when unloading the CStrike extension.
- Fixed crash in SDKHooks Reload post-hook (Peace-Maker).
- Fixed FakeClientCommandEx always leaking memory (bug 5678).
- Fixed extra entity networking occuring with SetEntProp natives on some games.
- Fixed being able to nominate same map multiple times (bug 5109).
- Fixed spurious FindEntityByClassname error being logged on some games and platforms.
- Fixed an Anti-Flood bypass exploit (bug 5394).
- Removed part of Addresses gamedata error handling which could cause false errors to be logged (bug 6044).
- Fixed mapchooser not resetting nominations count when clearing nominations list (bug 5359).
- Improved performances of client convar query handling (bug 6003).
Developer Changes:
- Added GiveAmmo native to SDKTools (bug 6039) (Peace-Maker).
- Added SQL_SetCharset native to (re)set charset even after reconnect (bug 5786) (Peace-Maker).
- Added support for entity references in SDKHooks natives (bug 6069).
- Added support for server passwords to DisplayAskConnectBox stock (bug 5984) (FlaminSarge).
- Renamed SortFunc2D parameters to match documentation (bug 6014) (Peace-Maker).
- Fixed param order in AddToTopMenu function doc (bug 6035) (Peace-Maker).
- Added |any| tag to WritePackCell and ReadPackCell native param/return values (bug 6001).
- Updated SDKHook_TakeDamage native for game updates.
- Added default infinite value for TF2_AddCondition duration.
- Added support for conditions >= 64 in TF2_OnConditionAdded/Removed (bug 5565, bug 5976) (FlaminSarge).
- Updated TFCond and TF customkill enum values (bug 6012) (FlaminSarge).
- Fixed regression causing incorrect return and inability to block in TF2_OnCalcIsAttackCritical forward.
- Fixed TE_* natives operating on incorrect data for some tempents (bug 6072).
- Fixed CS_AliasToWeaponID not returning a valid weaponID for cz75a.
- Fixed CS_GetWeaponPrice returning incorrect value for M4A1 in CS:GO (bug 6045).
- Increased max gamedata byte signature length.
- Ported SM build scripts to AMBuild2 (bug 5997).
----------------------------------------------------------
SourceMod 1.5.2 [2013-10-29]
URL: http://wiki.alliedmods.net/SourceMod_1.5.2_Release_Notes
User Changes:
- Updated gamedata support for TF2, CS:S, CS:GO, and HL2:DM.
- Fixed crash from regression in SDKTools SetClientListening hook refcounting (bug 5956) (KyleS).
- Fixed potential crash when having maps with format characters in name.
- Fixed some nextmap issues with long map names.
- SDKTools no longer requires gamedata for sm_dump_datamaps on TF2, CS:S, HL2:DM, and DoD:S (bug 5968).
Developer Changes:
- Updated TFCond and TF custom dmg enums.
- Updated TF2 critical hit detection logic in TF2_OnCalcIsAttackCritical to handle more cases, including when criticals are disabled (bug 5894).
- Fixed GetEngineVersion native returning a bad value when running on MM:S 1.9.x or earlier (bug 5697).
----------------------------------------------------------
SourceMod 1.5.1 [2013-09-10]
URL: http://wiki.alliedmods.net/SourceMod_1.5.1_Release_Notes
User Changes:
- Updated gamedata support for TF2.
- Added missing DispatchKeyValue gamedata for HL2 CTF (bug 5114) (peace-maker).
- Fixed translations not being loaded if identifier was not two or three characters (fixes Portuguese) (bug 5888).
- Fixed runoff voting occurring when receiving the exact number of required votes (bug 5890).
- Fixed reserve slot plugin hiding too many slots on Orangebox gamesif SourceTV and/or Replay are present (bug 5499).
- Fixed some crashes in TF2 and unexpected behavior in all games with SDKHook_TakeDamage due to uninitialized var.
- Fixed attempted triggers from gagged users displaying in chat (bug 5918).
- Fixed errors in Italian translation (Oktober).
- Added Norwegian translation (checkster).
Developer Changes:
- Added CS_UpdateClientModel native to CStrike extension for CS:S and CS:GO (bug 5905) (Drifter).
- Fixed setting weapon param in SDKHook_TakeDamage overwriting attacker instead of setting weapon (bug 5911) (KyleS)
----------------------------------------------------------
SourceMod 1.5.0 [2013-08-25]
URL: http://wiki.alliedmods.net/SourceMod_1.5.0_Release_Notes
User Changes:
- Added support for Counter-Strike: Global Offensive (bug 5299, bug 5579).
- Split CS:S, TF2, DoD:S, HL2:DM, and ND to separate binaries (bug 5370, bug 5813).
- Added support for runoff voting in mapchooser (bug 4218).
- Added option to require Steam validation before granting admin access (bug 4837) (VoiDeD).
- Added localization support for many more core and base plugin messages (bug 5120, bug 5146).
- Added the ability to override RegConsoleCommand-created commands (bug 5199).
- Added support for "fuzzy" (partial) map names in map-related natives and cmds for L4D and later (bug 5599).
- Updated Reserved Slots to use max humans as max count (bug 5444).
- Added support for custom maxitems on radio menus (bug 5371).
- Improved console config editing (bug 5470).
- Increased map name buffer sizes in mapchooser to better account for nested maps (bug 5609) (Peace-Maker).
- Fixed JIT conflicts with SELinux (bug 5581).
- Added logged error when PlayerRunCommand offset lookup fails (bug 5535) (GoD-Tony).
- Fixed double print when sending psay to self (bug 5649) (Peace-Maker).
- Fixed check against uninitialized string in extension loader (bug 5546) (KyleS).
- Fixed possible runtime errors in basetriggers for not-ingame clients (bug 5191) (Peace-Maker).
- Check all possible mapcycle paths on newer orangebox games (bug 5719).
- Fixed ReadMapList not seeing maps in all valve search paths (bug 5715) (VoiDeD).
- Fixed typo in too-many-params native error message (Peace-Maker).
- Fixed various issues in clientprefs (bug 5538) (KyleS).
- Removed debug printout from PerformGravity (bug 5679) (KyleS).
- Fixed broken translating in some plugins and natives (bug 5612) (KyleS).
- Fixed issues with COMMAND_FILTER_NO_BOTS and @bots multi-target.
- Fixed crash in SDKHooks when throwing bad ent type error on logical ent (KyleS).
Developer Changes:
- Added support for CS:GO to the CStrike extension (bug 5299) (Drifter).
- Added support for new protobuf usermessages used in newer games (bug 5579, bug 5588, bug 5590, bug 5633).
- Added latest SDKHooks version as first-party extension.
- Updated SQLite to version 3.7.15.1 (bug 5235).
- Added natives for changing team score and mvp stars on CSS/CSGO (bug 5295) (Drifter).
- Added global pre and post forwards for client chat (bug 5394) (KyleS).
- Added TF2_CanPlayerTeleport forward to the TF2 game extension (bug 5283) (VoiDeD).
- Added GetEntityAddress native (bug 5269) (ProdigySim).
- Added more parameters to PlayerRunCommand forward (bug 5346) (GoD-Tony).
- Added forwards to basecomm plugin (bug 5466) (Drifter).
- Added symbol lookup support to gamedata on Windows (bug 5511) (GoD-Tony).
- Exposed GetLanguageInfo in ITranslator interface (bug 5249) (VoiDeD).
- Increase maximum .sp line length to 4095 characters. (bug 5347) (theY4Kman).
- Improved netprop dump output (bug 5471).
- Added int64 typename to netprop dumps (bug 5655).
- Added GetMaxHumanPlayers native exposing IServerGameClients func (bug 5551).
- Added WeaponIDToAlias native to CStrike extension (bug 5460) (KyleS).
- Fixed OnLibraryAdded/Removed not being called in all plugins (bug 5431).
- Made thread worker processing limits configurable at runtime (bug 5326).
- Added support in TF2 ext for detection of player conds >= 64 (bug 5565).
- Updated button defines in entity_prop_stocks (bug 5564).
- Added GetPlayerResourceEntity to SDKTools to replace old, semi-broken TF2-only version (bug 5491).
- Exposed third parameter of TF2's AddCond in TF2_AddCondition (bug 5641) (FlaminSarge).
- Added GetSteamAccountID function to IPlayerHelpers and native for sp (bug 5548) (KyleS).
- Added ISDKHooks interface with entity listeners (bug 5602) (GoD-Tony).
- Added file upload support to webternet extension.
- Added more alternative names for TFClass_Heavy (bug 5338) (Afronanny).
- Throw error instead of crash when calling SetTeamScore between maps (bug 5718) (KyleS).
- Fixed clients not being marked as in kick queue in some cases (bug 5746) (SystematicMania).
- Made compile.sh set working dir to own dir (bug 5710) (KyleS).
- Added CS_IsValidWeaponID native and validity checks to other natives (bug 5566) (Drifter).
- Numerous code documentation fixups (bug 5720) (Tsunami).
- Fixed cmd listener callback return behavior to match func doc (bug 5882).
Internal Changes:
- Fixed handle misuse in clientprefs plugin (bug 5805) (KyleS).
- Removed call to getchar() in debug build of compiler (bug 5626) (KyleS).
- Fixed instability issues with cloned handles (bug 5245, bug 5240) (KyleS).
- Changed extension unload order to avoid exposing finalization window (bug 5556) (KyleS).
- Call OnPluginEnd before finalizer hooks have run (bug 4519).
- Fixed potential for reading out of library bounds in MemoryUtils::FindPattern.
- Fixed typo in TF2 ext asm.c causing accidental assignment instead of compare.
- Overhauled versioning information (bug 5453).
- Changed from RemoveEdict to using the Kill input for TF2_RemoveWeapon.
- Fixed accidental assignment in each of SDKTools and sp compiler (bug 5745) (KyleS).
- Fixed potential deadlock in HandleSystem::TryAndFreeSomeHandles (bug 5665) (KyleS).
----------------------------------------------------------
SourceMod 1.4.7 [2013-02-06]
URL: http://wiki.alliedmods.net/SourceMod_1.4.7_Release_Notes
User Changes:
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM).
- Updated gamedata for Left 4 Dead 2, Nuclear Dawn, No More Room in Hell, Zombie Panic Source, CSPromod, GoldenEye Source, Synergy, The Hidden, and PVKII.
- Added system to block malware or illegal plugins (bug 5289).
- Fixed a potential crash when a bad entity index is passed to certain functions (bug 5539) (KyleS).
- Added an error message for when auto plugin configs fail to be created due to write error (bug 5465) (Drifter).
- Fixed an issue where a malformed plugin could cause crashes (bug 5478).
Developer Changes:
- Added new values to the TFCond TF2 conditions enum (bug 5537) (FlaminSarge).
- Updated TFHoliday TF2 holidays enum (bug 5526) (Powerlord).
- Fixed regression in SourceMod 1.3.0 causing GetEntPropEnt, GetEntDataEnt2, and GameRules_GetPropEnt to possibly return stale (incorrect) entity indexes in place of -1.
- Added support for < 32-bit unsigned sign extension to GameRules_GetProp lookup (already in GetEntProp since SM 1.4.0).
- Fixed < 32-bit unsigned sign extension in GetEntProp not being applied for array prop elements (bug 5591).
- Fixed value size auto-detection in GetEntProp and GameRules_GetProp for ep2v's new SPROP_VARINT sendprops.
- Fixed Sort_Random sort type not including first value in array sorting functions (bug 4292) (Peace-Maker).
- Fixed GameRules_SetPropVector writing data to unexpected addresses instead of to the gamerules proxy entity (bug 5592) (ProdigySim).
- Fixed VoteMenuToAll stock adding bots to list (bug 5253 (VoiDeD).
----------------------------------------------------------
SourceMod 1.4.6 [2012-09-04]
URL: http://wiki.alliedmods.net/SourceMod_1.4.6_Release_Notes
User Changes:
- Fixed extraneous errors resulting from a bug in 1.4.5.
----------------------------------------------------------
SourceMod 1.4.5 [2012-09-03]
URL: http://wiki.alliedmods.net/SourceMod_1.4.5_Release_Notes
User Changes:
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Updated Nuclear Dawn, Dino D-Day, and Zombie Panic gamedata.
- Added compatibility for running on Metamod:Source 1.9.0.
- Fixed very minor memory leaks in CStrike extension (bug 5456) (KyleS).
- Fixed crash from plugins accessing netprops too early (bug 5297) (KyleS).
- Fixed crash from plugins trying to access nested datadesc members (bug 5446).
Developer Changes:
- Added new TF2 weapon and custom dmg defines.
- Added new TF2 TFHoliday value (bug 5436) (Powerlord).
- Fixed IClientListener::InterceptClientConnect not being able to properly block connections (bug 5461) (PimpinJuice).
- Fixed PrepSDKCall_SetSignature native not working with symbol names on L4D2 linux (bug 5440).
- Fixed resolution of GetProfilerTime native on non-Windows platforms.
-----------------------------
SourceMod 1.4.4 [2012-07-03]
URL: http://wiki.alliedmods.net/SourceMod_1.4.4_Release_Notes
User Changes:
- Updated support for latest Source 2009 engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Updated Nuclear Dawn gamedata.
- Fixed a crash that could occur when selecting an option on a clientprefs prefab menu (bug 5374).
Developer Changes:
- Added new TF2 weapon and custom dmg defines.
- Added new TF2 TFHoliday value (bug 5364) (Powerlord).
- Updated sample extension to properly fill ninvoke with INativeInvoker ptr (bug 5340) (Afronanny).
-----------------------------
SourceMod 1.4.3 [2012-06-09]
URL: http://wiki.alliedmods.net/SourceMod_1.4.3_Release_Notes
User Changes:
- Updated support for latest OrangeBox engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Made clientprefs attempt to reconnect to the database on map change (bug 4745).
- Log functions now respect sv_logecho (bug 5135).
- Fixed client console vote output (bug 5290, bug 5205) (FlaminSarge).
- Fixed error when reloading dependant plugins using aliased natives (bug 5302).
- Fixed intermittent crash when looking for an invalid signature (bug 5301).
- Fixed possible crash when reloading a plugin with an invalid binary (bug 5288).
- Exposed extensions list to clients (bug 5221) (VoiDeD).
- Fixed intermittent crashes in clientprefs (bug 4660).
- Fixed crash when passing an invalid entity reference to ReferenceToEntity (bug 5330).
- Fixed cstrike extension crash on shutdown (bug 5328).
- Lowered threading API think time to 20ms, making threaded MySQL queries complete faster (bug 4733).
Developer Changes:
- Fixed client serials not being unique on Windows (bug 5285).
- Fixed broken SourceTV detection on L4D1 (bug 5216).
- Fixed Float negation operator (bug 5292).
- Updated TF2 condition defines (bug 5259) (FlaminSarge).
- Adding missing SetMenuNoVoteButton native declaration (bug 4522) (GoD-Tony).
- Fixed erroneous const-qualification of name param of GetAdminUsername (bug 5267).
- Added GetGameTickCount native (bug 5209) (GoD-Tony).
-----------------------------
SourceMod 1.4.2 [2011-04-13]
URL: http://wiki.alliedmods.net/SourceMod_1.4.2_Release_Notes
User Changes:
- Updated support for latest OrangeBox engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Fixed regression in SourceMod 1.4.0 causing SM to cause load errors on The Ship (bug 5216).
- Fixed toggling and player lag issues with sm_drug command (bugs 5217, 5218) (FlaminSarge).
Developer Changes:
- Updated TF2-specific defines and enums (bug 5194).
- Fixed StoreToAddress always writing 32 bits and throwing an error (bug 5248) (ProdigySim).
- Fixed crash with StoreToAddress if memory wasn't writable (bug 5252) (Dr!fter).
- Fixed return value of VoteMenuToAll (bug 5254) (VoiDeD).
- Fixed bug in command lower-casing API guarantee
-----------------------------
SourceMod 1.4.1 [2011-12-07]
URL: http://wiki.alliedmods.net/SourceMod_1.4.1_Release_Notes
User Changes:
- Updated support for latest OrangeBox engine changes (CS:S, DoD:S, TF2, HL2DM, GMod).
- Added gamedata for Adrenaline Gamer 2 and No More Room in Hell.
- Fixed "not connected" error in reserve slots plugin (bug 5158) (ostrel).
- Fixed ff trigger output printing to all in triggerer's language (rather than viewer's language) (bug 5161).
- Fixed typo in one of basebans ban reasons (bug 5188).
- Fixed formatting error in Swedish "Vote Count" phrase (bug 5174).
Developer Changes:
- Fixed sp MaxClients not being updated on map changes after load (bug 5160).
- Removed GLIBC_2.7 dependency from spcomp.
- Increased buffer for sm_rcon command to fit larger responses (bug 5169).
- BaseComm now properly registers a library allowing it to be required by other plugins (bug 5156).
- Fixed TFHoliday enum values (bug 5155).
- Updated TF2_OnIsHolidayActive ret behavior to match doc (bug 5155).
- Added new TF2 deathflag and dmg custom defines (bug 5157).
----------------------------- -----------------------------
SourceMod 1.4.0 [2011-10-28] SourceMod 1.4.0 [2011-10-28]
-18
View File
@@ -107,22 +107,4 @@
* Currently this will log details about the gamedata updating process. * Currently this will log details about the gamedata updating process.
*/ */
"DebugSpew" "no" "DebugSpew" "no"
/**
* If set to yes, SourceMod will validate steamid auth strings with the Steam backend before giving out admin access.
* This can prevent malicious users from impersonating admins with stolen Steam apptickets.
* If Steam is down, admins will not be authenticated until Steam comes back up.
* This option increases the security of your server, but is still experimental.
*/
"SteamAuthstringValidation" "no"
/**
* Enables or disables whether SourceMod blocks known or potentially malicious plugins from loading.
* It is STRONGLY advised that this is left enabled, there have been cases in the past with plugins that
* allow anyone to delete files on the server, gain full rcon control, etc.
*
* "yes" - Block malware or illegal plugins from loading (default)
* "no" - Warn about malware or illegal plugins loading
*/
"BlockBadPlugins" "yes"
} }
+3 -21
View File
@@ -1,28 +1,10 @@
# vim: set ts=2 sw=2 tw=99 noet: # vim: set ts=2 sw=2 tw=99 noet:
import sys import sys
try: import ambuild.runner as runner
from ambuild2 import run
except:
try:
import ambuild
sys.stderr.write('It looks like you have AMBuild 1 installed, but this project uses AMBuild 2.\n')
sys.stderr.write('Upgrade to the latest version of AMBuild to continue.\n')
except:
sys.stderr.write('AMBuild must be installed to build this project.\n')
sys.stderr.write('http://www.alliedmods.net/ambuild\n')
sys.exit(1)
run = run.PrepareBuild(sourcePath=sys.path[0]) run = runner.Runner()
run.default_build_folder = 'obj-' + run.target_platform
run.options.add_option('--enable-debug', action='store_const', const='1', dest='debug', run.options.add_option('--enable-debug', action='store_const', const='1', dest='debug',
help='Enable debugging symbols') help='Enable debugging symbols')
run.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt', run.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt',
help='Enable optimization') help='Enable optimization')
run.options.add_option('--no-mysql', action='store_false', default=True, dest='hasMySql', run.Configure(sys.path[0])
help='Disable building MySQL extension')
run.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)')
run.options.add_option('--breakpad-dump', action='store_true', dest='breakpad_dump',
default=False, help='Dump and upload breakpad symbols')
run.Configure()
+72 -118
View File
@@ -1,124 +1,78 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os import os
for sdk_name in SM.sdks: for i in SM.sdkInfo:
sdk = SM.sdks[sdk_name] sdk = SM.sdkInfo[i]
binary_name = 'sourcemod.' + sdk.ext if AMBuild.target['platform'] not in sdk['platform']:
continue
binary = SM.HL2Library(builder, binary_name, sdk) name = 'sourcemod.' + sdk['ext']
compiler = binary.compiler
if sdk.name == 'csgo': compiler = SM.DefaultHL2Compiler('core', i)
# Protobuf 2.3 headers have some signed/unsigned compares. I believe that it's fixed in later versions, but Valve.
if compiler.cxx.behavior == 'gcc':
compiler.cflags += ['-Wno-sign-compare']
compiler.cxxincludes += [
os.path.join(sdk.path, 'common', 'protobuf-2.3.0', 'src'),
os.path.join(sdk.path, 'public', 'engine', 'protobuf'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf')
]
elif sdk.name == 'dota':
compiler.cxxincludes += [
os.path.join(sdk.path, 'common', 'protobuf-2.4.1', 'src'),
os.path.join(sdk.path, 'public', 'engine', 'protobuf'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'protobuf'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf')
]
if builder.target_platform == 'linux': extension = AMBuild.AddJob(name)
compiler.postlink += ['-lpthread', '-lrt'] binary = Cpp.LibraryBuilder(name, AMBuild, extension, compiler)
SM.PreSetupHL2Job(extension, binary, i)
if sdk.name == 'csgo' or sdk.name == 'dota': files = [
if builder.target_platform == 'linux': 'AdminCache.cpp',
lib_path = os.path.join(sdk.path, 'lib', 'linux32', 'release', 'libprotobuf.a') 'ExtensionSys.cpp',
elif builder.target_platform == 'mac': 'MenuStyle_Valve.cpp',
lib_path = os.path.join(sdk.path, 'lib', 'osx32', 'release', 'libprotobuf.a') 'logic_bridge.cpp',
elif builder.target_platform == 'windows': 'smn_entities.cpp',
if 'DEBUG' in compiler.defines: 'sm_stringutil.cpp',
lib_path = os.path.join(sdk.path, 'lib', 'win32', 'debug', 'vs2010', 'libprotobuf.lib') 'ADTFactory.cpp',
else: 'ForwardSys.cpp',
lib_path = os.path.join(sdk.path, 'lib', 'win32', 'release', 'vs2010', 'libprotobuf.lib') 'MenuVoting.cpp',
compiler.linkflags.insert(0, binary.Dep(lib_path)) 'smn_events.cpp',
'smn_menus.cpp',
binary.sources += [ 'sm_trie.cpp',
'AdminCache.cpp', 'CDataPack.cpp',
'MenuStyle_Valve.cpp', 'frame_hooks.cpp',
'logic_bridge.cpp', 'NativeInvoker.cpp',
'smn_entities.cpp', 'smn_fakenatives.cpp',
'sm_stringutil.cpp', 'smn_nextmap.cpp',
'MenuVoting.cpp', 'sourcemm_api.cpp',
'smn_events.cpp', 'ChatTriggers.cpp',
'smn_menus.cpp', 'NativeOwner.cpp',
'sm_trie.cpp', 'smn_filesystem.cpp',
'CDataPack.cpp', 'smn_player.cpp',
'frame_hooks.cpp', 'sourcemod.cpp',
'smn_nextmap.cpp', 'concmd_cleaner.cpp',
'sourcemm_api.cpp', 'HalfLife2.cpp',
'ChatTriggers.cpp', 'NextMap.cpp',
'smn_player.cpp', 'ConCmdManager.cpp',
'sourcemod.cpp', 'HandleSys.cpp',
'concmd_cleaner.cpp', 'ConVarManager.cpp',
'HalfLife2.cpp', 'LibrarySys.cpp',
'NextMap.cpp', 'PlayerManager.cpp',
'ConCmdManager.cpp', 'TimerSys.cpp',
'ConVarManager.cpp', 'CoreConfig.cpp',
'LibrarySys.cpp', 'Logger.cpp',
'PlayerManager.cpp', 'PluginInfoDatabase.cpp',
'TimerSys.cpp', 'smn_bitbuffer.cpp',
'CoreConfig.cpp', 'smn_halflife.cpp',
'Logger.cpp', 'PluginSys.cpp',
'smn_halflife.cpp', 'smn_console.cpp',
'smn_console.cpp', 'UserMessages.cpp',
'UserMessages.cpp', 'Database.cpp',
'MenuManager.cpp', 'MenuManager.cpp',
'smn_core.cpp', 'smn_core.cpp',
'smn_hudtext.cpp', 'smn_hudtext.cpp',
'smn_usermsgs.cpp', 'smn_usermsgs.cpp',
'MenuStyle_Base.cpp', 'DebugReporter.cpp',
'smn_keyvalues.cpp', 'MenuStyle_Base.cpp',
'smn_vector.cpp', 'ShareSys.cpp',
'EventManager.cpp', 'smn_database.cpp',
'MenuStyle_Radio.cpp', 'smn_keyvalues.cpp',
'sm_autonatives.cpp', 'smn_vector.cpp',
'sm_srvcmds.cpp', 'EventManager.cpp',
'ConsoleDetours.cpp', 'MenuStyle_Radio.cpp',
'NativeInvoker.cpp', 'sm_autonatives.cpp',
'smn_database.cpp', 'sm_srvcmds.cpp',
'ForwardSys.cpp', 'ConsoleDetours.cpp'
'Database.cpp', ]
'DebugReporter.cpp', binary.AddSourceFiles('core', files)
'ShareSys.cpp', SM.PostSetupHL2Job(extension, binary, i)
'PluginSys.cpp', SM.AutoVersion('core', binary)
'HandleSys.cpp', binary.SendToJob()
'NativeOwner.cpp',
'ExtensionSys.cpp',
'smn_fakenatives.cpp',
'smn_filesystem.cpp',
'ADTFactory.cpp',
'PluginInfoDatabase.cpp',
]
if sdk.name in ['csgo', 'dota']:
binary.sources += ['smn_protobuf.cpp']
else:
binary.sources += ['smn_bitbuffer.cpp']
if sdk.name == 'csgo':
binary.sources += [
os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'netmessages.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessages.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessage_helpers.cpp'),
]
elif sdk.name == 'dota':
binary.sources += [
os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'networkbasetypes.pb.cc'),
os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'netmessages.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'protobuf', 'ai_activity.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'protobuf', 'usermessages.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf', 'dota_commonmessages.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf', 'dota_usermessages.pb.cc'),
os.path.join(sdk.path, 'public', 'game', 'shared', 'dota', 'protobuf', 'dota_usermessage_helpers.cpp'),
]
SM.binaries += [builder.Add(binary)]
+49 -129
View File
@@ -59,17 +59,13 @@ ChatTriggers g_ChatTriggers;
bool g_bSupressSilentFails = false; bool g_bSupressSilentFails = false;
ChatTriggers::ChatTriggers() : m_pSayCmd(NULL), m_bWillProcessInPost(false), ChatTriggers::ChatTriggers() : m_pSayCmd(NULL), m_bWillProcessInPost(false),
m_ReplyTo(SM_REPLY_CONSOLE) m_bTriggerWasSilent(false), m_ReplyTo(SM_REPLY_CONSOLE)
{ {
m_PubTrigger = sm_strdup("!"); m_PubTrigger = sm_strdup("!");
m_PrivTrigger = sm_strdup("/"); m_PrivTrigger = sm_strdup("/");
m_PubTriggerSize = 1; m_PubTriggerSize = 1;
m_PrivTriggerSize = 1; m_PrivTriggerSize = 1;
m_bIsChatTrigger = false; m_bIsChatTrigger = false;
m_bPluginIgnored = false;
#if SOURCE_ENGINE == SE_EPISODEONE
m_bIsINS = false;
#endif
} }
ChatTriggers::~ChatTriggers() ChatTriggers::~ChatTriggers()
@@ -113,8 +109,6 @@ void ChatTriggers::OnSourceModAllInitialized()
{ {
m_pShouldFloodBlock = g_Forwards.CreateForward("OnClientFloodCheck", ET_Event, 1, NULL, Param_Cell); m_pShouldFloodBlock = g_Forwards.CreateForward("OnClientFloodCheck", ET_Event, 1, NULL, Param_Cell);
m_pDidFloodBlock = g_Forwards.CreateForward("OnClientFloodResult", ET_Event, 2, NULL, Param_Cell, Param_Cell); m_pDidFloodBlock = g_Forwards.CreateForward("OnClientFloodResult", ET_Event, 2, NULL, Param_Cell, Param_Cell);
m_pOnClientSayCmd = g_Forwards.CreateForward("OnClientSayCommand", ET_Event, 3, NULL, Param_Cell, Param_String, Param_String);
m_pOnClientSayCmd_Post = g_Forwards.CreateForward("OnClientSayCommand_Post", ET_Ignore, 3, NULL, Param_Cell, Param_String, Param_String);
} }
void ChatTriggers::OnSourceModAllInitialized_Post() void ChatTriggers::OnSourceModAllInitialized_Post()
@@ -137,62 +131,23 @@ void ChatTriggers::OnSourceModGameInitialized()
SH_ADD_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayTeamCmd, this, &ChatTriggers::OnSayCommand_Pre, false); SH_ADD_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayTeamCmd, this, &ChatTriggers::OnSayCommand_Pre, false);
SH_ADD_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayTeamCmd, this, &ChatTriggers::OnSayCommand_Post, true); SH_ADD_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayTeamCmd, this, &ChatTriggers::OnSayCommand_Post, true);
} }
#if SOURCE_ENGINE == SE_EPISODEONE
m_bIsINS = (strcmp(g_SourceMod.GetGameFolderName(), "insurgency") == 0);
if (m_bIsINS)
{
m_pSay2Cmd = FindCommand("say2");
if (m_pSay2Cmd)
{
SH_ADD_HOOK(ConCommand, Dispatch, m_pSay2Cmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Pre), false);
SH_ADD_HOOK(ConCommand, Dispatch, m_pSay2Cmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Post), true);
}
}
#elif SOURCE_ENGINE == SE_NUCLEARDAWN
m_pSaySquadCmd = FindCommand("say_squad");
if (m_pSaySquadCmd)
{
SH_ADD_HOOK(ConCommand, Dispatch, m_pSaySquadCmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Pre), false);
SH_ADD_HOOK(ConCommand, Dispatch, m_pSaySquadCmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Post), true);
}
#endif
} }
void ChatTriggers::OnSourceModShutdown() void ChatTriggers::OnSourceModShutdown()
{ {
if (m_pSayTeamCmd)
{
SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayTeamCmd, this, &ChatTriggers::OnSayCommand_Post, true);
SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayTeamCmd, this, &ChatTriggers::OnSayCommand_Pre, false);
}
if (m_pSayCmd) if (m_pSayCmd)
{ {
SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayCmd, this, &ChatTriggers::OnSayCommand_Post, true); SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayCmd, this, &ChatTriggers::OnSayCommand_Post, true);
SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayCmd, this, &ChatTriggers::OnSayCommand_Pre, false); SH_REMOVE_HOOK_MEMFUNC(ConCommand, Dispatch, m_pSayCmd, this, &ChatTriggers::OnSayCommand_Pre, false);
} }
if (m_pSayTeamCmd)
{
SH_REMOVE_HOOK(ConCommand, Dispatch, m_pSayTeamCmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Post), true);
SH_REMOVE_HOOK(ConCommand, Dispatch, m_pSayTeamCmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Pre), false);
}
#if SOURCE_ENGINE == SE_EPISODEONE
if (m_bIsINS && m_pSay2Cmd)
{
SH_REMOVE_HOOK(ConCommand, Dispatch, m_pSay2Cmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Pre), false);
SH_REMOVE_HOOK(ConCommand, Dispatch, m_pSay2Cmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Post), true);
}
#elif SOURCE_ENGINE == SE_NUCLEARDAWN
if (m_pSaySquadCmd)
{
SH_REMOVE_HOOK(ConCommand, Dispatch, m_pSaySquadCmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Pre), false);
SH_REMOVE_HOOK(ConCommand, Dispatch, m_pSaySquadCmd, SH_MEMBER(this, &ChatTriggers::OnSayCommand_Post), true);
}
#endif
g_Forwards.ReleaseForward(m_pShouldFloodBlock); g_Forwards.ReleaseForward(m_pShouldFloodBlock);
g_Forwards.ReleaseForward(m_pDidFloodBlock); g_Forwards.ReleaseForward(m_pDidFloodBlock);
g_Forwards.ReleaseForward(m_pOnClientSayCmd);
g_Forwards.ReleaseForward(m_pOnClientSayCmd_Post);
} }
#if SOURCE_ENGINE >= SE_ORANGEBOX #if SOURCE_ENGINE >= SE_ORANGEBOX
@@ -203,10 +158,24 @@ void ChatTriggers::OnSayCommand_Pre()
{ {
CCommand command; CCommand command;
#endif #endif
int client = g_ConCmds.GetCommandClient(); int client;
CPlayer *pPlayer;
client = g_ConCmds.GetCommandClient();
m_bIsChatTrigger = false; m_bIsChatTrigger = false;
m_bWasFloodedMessage = false; m_bWasFloodedMessage = false;
m_bPluginIgnored = false;
/* The server console cannot do this */
if (client == 0 || (pPlayer = g_Players.GetPlayerByIndex(client)) == NULL)
{
RETURN_META(MRES_IGNORED);
}
/* We guarantee the client is connected */
if (!pPlayer->IsConnected())
{
RETURN_META(MRES_IGNORED);
}
const char *args = command.ArgS(); const char *args = command.ArgS();
@@ -215,31 +184,6 @@ void ChatTriggers::OnSayCommand_Pre()
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
/* Save these off for post hook as the command data returned from the engine in older engine versions
* can be NULL, despite the data still being there and valid. */
m_Arg0Backup = command.Arg(0);
m_ArgSBackup = command.ArgS();
/* The server console cannot do this */
if (client == 0)
{
cell_t res = CallOnClientSayCommand(client);
if (res >= Pl_Handled)
{
m_bPluginIgnored = (res >= Pl_Stop);
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
/* We guarantee the client is connected */
if (!pPlayer || !pPlayer->IsConnected())
{
RETURN_META(MRES_IGNORED);
}
/* Check if we need to block this message from being sent */ /* Check if we need to block this message from being sent */
if (ClientIsFlooding(client)) if (ClientIsFlooding(client))
{ {
@@ -267,13 +211,6 @@ void ChatTriggers::OnSayCommand_Pre()
is_quoted = true; is_quoted = true;
} }
#if SOURCE_ENGINE == SE_EPISODEONE
if (m_bIsINS && strcmp(m_Arg0Backup, "say2") == 0 && strlen(args) >= 4)
{
args += 4;
}
#endif
bool is_trigger = false; bool is_trigger = false;
bool is_silent = false; bool is_silent = false;
@@ -290,28 +227,38 @@ void ChatTriggers::OnSayCommand_Pre()
args = &args[m_PrivTriggerSize]; args = &args[m_PrivTriggerSize];
} }
if (!is_trigger)
{
RETURN_META(MRES_IGNORED);
}
/** /**
* Test if this is actually a command! * Test if this is actually a command!
*/ */
if (is_trigger && PreProcessTrigger(PEntityOfEntIndex(client), args, is_quoted)) if (!PreProcessTrigger(PEntityOfEntIndex(client), args, is_quoted))
{ {
m_bIsChatTrigger = true; CPlayer *pPlayer;
if (is_silent
/** && g_bSupressSilentFails
* We'll execute it in post. && client != 0
*/ && (pPlayer = g_Players.GetPlayerByIndex(client)) != NULL
m_bWillProcessInPost = true; && pPlayer->GetAdminId() != INVALID_ADMIN_ID)
{
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
} }
cell_t res = CallOnClientSayCommand(client); m_bIsChatTrigger = true;
if (res >= Pl_Handled) /**
{ * We'll execute it in post.
m_bPluginIgnored = (res >= Pl_Stop); */
RETURN_META(MRES_SUPERCEDE); m_bWillProcessInPost = true;
} m_bTriggerWasSilent = is_silent;
if (is_silent && (m_bIsChatTrigger || (g_bSupressSilentFails && pPlayer->GetAdminId() != INVALID_ADMIN_ID))) /* If we're silent, block */
if (is_silent)
{ {
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
@@ -326,33 +273,19 @@ void ChatTriggers::OnSayCommand_Post(const CCommand &command)
void ChatTriggers::OnSayCommand_Post() void ChatTriggers::OnSayCommand_Post()
#endif #endif
{ {
int client = g_ConCmds.GetCommandClient(); m_bIsChatTrigger = false;
m_bWasFloodedMessage = false;
if (m_bWillProcessInPost) if (m_bWillProcessInPost)
{ {
/* Reset this for re-entrancy */ /* Reset this for re-entrancy */
m_bWillProcessInPost = false; m_bWillProcessInPost = false;
/* Execute the cached command */ /* Execute the cached command */
int client = g_ConCmds.GetCommandClient();
unsigned int old = SetReplyTo(SM_REPLY_CHAT); unsigned int old = SetReplyTo(SM_REPLY_CHAT);
serverpluginhelpers->ClientCommand(PEntityOfEntIndex(client), m_ToExecute); serverpluginhelpers->ClientCommand(PEntityOfEntIndex(client), m_ToExecute);
SetReplyTo(old); SetReplyTo(old);
} }
if (m_bPluginIgnored)
{
m_bPluginIgnored = false;
}
else if (!m_bWasFloodedMessage && !m_bIsChatTrigger && m_pOnClientSayCmd_Post->GetFunctionCount() != 0)
{
m_pOnClientSayCmd_Post->PushCell(client);
m_pOnClientSayCmd_Post->PushString(m_Arg0Backup);
m_pOnClientSayCmd_Post->PushString(m_ArgSBackup);
m_pOnClientSayCmd_Post->Execute(NULL);
}
m_bIsChatTrigger = false;
m_bWasFloodedMessage = false;
} }
bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args, bool is_quoted) bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args, bool is_quoted)
@@ -429,19 +362,6 @@ bool ChatTriggers::PreProcessTrigger(edict_t *pEdict, const char *args, bool is_
return true; return true;
} }
cell_t ChatTriggers::CallOnClientSayCommand(int client)
{
cell_t res = Pl_Continue;
if (!m_bIsChatTrigger && m_pOnClientSayCmd->GetFunctionCount() != 0)
{
m_pOnClientSayCmd->PushCell(client);
m_pOnClientSayCmd->PushString(m_Arg0Backup);
m_pOnClientSayCmd->PushString(m_ArgSBackup);
m_pOnClientSayCmd->Execute(&res);
}
return res;
}
unsigned int ChatTriggers::SetReplyTo(unsigned int reply) unsigned int ChatTriggers::SetReplyTo(unsigned int reply)
{ {
unsigned int old = m_ReplyTo; unsigned int old = m_ReplyTo;
+1 -14
View File
@@ -69,34 +69,21 @@ public:
private: private:
bool PreProcessTrigger(edict_t *pEdict, const char *args, bool is_quoted); bool PreProcessTrigger(edict_t *pEdict, const char *args, bool is_quoted);
bool ClientIsFlooding(int client); bool ClientIsFlooding(int client);
cell_t CallOnClientSayCommand(int client);
private: private:
ConCommand *m_pSayCmd; ConCommand *m_pSayCmd;
ConCommand *m_pSayTeamCmd; ConCommand *m_pSayTeamCmd;
#if SOURCE_ENGINE == SE_EPISODEONE
ConCommand *m_pSay2Cmd;
#elif SOURCE_ENGINE == SE_NUCLEARDAWN
ConCommand *m_pSaySquadCmd;
#endif
char *m_PubTrigger; char *m_PubTrigger;
size_t m_PubTriggerSize; size_t m_PubTriggerSize;
char *m_PrivTrigger; char *m_PrivTrigger;
size_t m_PrivTriggerSize; size_t m_PrivTriggerSize;
bool m_bWillProcessInPost; bool m_bWillProcessInPost;
bool m_bTriggerWasSilent;
bool m_bIsChatTrigger; bool m_bIsChatTrigger;
bool m_bWasFloodedMessage; bool m_bWasFloodedMessage;
bool m_bPluginIgnored;
unsigned int m_ReplyTo; unsigned int m_ReplyTo;
char m_ToExecute[300]; char m_ToExecute[300];
const char *m_Arg0Backup;
const char *m_ArgSBackup;
IForward *m_pShouldFloodBlock; IForward *m_pShouldFloodBlock;
IForward *m_pDidFloodBlock; IForward *m_pDidFloodBlock;
IForward *m_pOnClientSayCmd;
IForward *m_pOnClientSayCmd_Post;
#if SOURCE_ENGINE == SE_EPISODEONE
bool m_bIsINS;
#endif
}; };
extern ChatTriggers g_ChatTriggers; extern ChatTriggers g_ChatTriggers;
+48 -2
View File
@@ -559,6 +559,44 @@ bool ConCmdManager::CheckAccess(int client, const char *cmd, AdminCmdInfo *pAdmi
return false; return false;
} }
bool ConCmdManager::AddConsoleCommand(IPluginFunction *pFunction,
const char *name,
const char *description,
int flags)
{
ConCmdInfo *pInfo = AddOrFindCommand(name, description, flags);
if (!pInfo)
{
return false;
}
CmdHook *pHook = new CmdHook();
pHook->pf = pFunction;
if (description && description[0])
{
pHook->helptext.assign(description);
}
pInfo->conhooks.push_back(pHook);
/* Add to the plugin */
CmdList *pList;
IPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pFunction->GetParentContext()->GetContext());
if (!pPlugin->GetProperty("CommandList", (void **)&pList))
{
pList = new CmdList();
pPlugin->SetProperty("CommandList", pList);
}
PlCmdInfo info;
info.pInfo = pInfo;
info.type = Cmd_Console;
info.pHook = pHook;
AddToPlCmdList(pList, info);
return true;
}
bool ConCmdManager::AddAdminCommand(IPluginFunction *pFunction, bool ConCmdManager::AddAdminCommand(IPluginFunction *pFunction,
const char *name, const char *name,
const char *group, const char *group,
@@ -620,6 +658,7 @@ bool ConCmdManager::AddAdminCommand(IPluginFunction *pFunction,
/* Finally, add the hook */ /* Finally, add the hook */
pInfo->conhooks.push_back(pHook); pInfo->conhooks.push_back(pHook);
pInfo->admin = *(pHook->pAdmin); pInfo->admin = *(pHook->pAdmin);
pInfo->is_admin_set = true;
/* Now add to the plugin */ /* Now add to the plugin */
CmdList *pList; CmdList *pList;
@@ -764,6 +803,7 @@ void ConCmdManager::UpdateAdminCmdFlags(const char *cmd, OverrideType type, Flag
pInfo->admin = *(pHook->pAdmin); pInfo->admin = *(pHook->pAdmin);
} }
} }
pInfo->is_admin_set = true;
} }
else if (type == Override_CommandGroup) else if (type == Override_CommandGroup)
{ {
@@ -797,6 +837,7 @@ void ConCmdManager::UpdateAdminCmdFlags(const char *cmd, OverrideType type, Flag
} }
} }
} }
pInfo->is_admin_set = true;
} }
} }
@@ -864,7 +905,7 @@ bool ConCmdManager::LookForCommandAdminFlags(const char *cmd, FlagBits *pFlags)
*pFlags = pInfo->admin.eflags; *pFlags = pInfo->admin.eflags;
return true; return pInfo->is_admin_set;
} }
ConCmdInfo *ConCmdManager::AddOrFindCommand(const char *name, const char *description, int flags) ConCmdInfo *ConCmdManager::AddOrFindCommand(const char *name, const char *description, int flags)
@@ -901,6 +942,7 @@ ConCmdInfo *ConCmdManager::AddOrFindCommand(const char *name, const char *descri
} }
pInfo->pCmd = pCmd; pInfo->pCmd = pCmd;
pInfo->is_admin_set = false;
sm_trie_insert(m_pCmds, name, pInfo); sm_trie_insert(m_pCmds, name, pInfo);
AddToCmdList(pInfo); AddToCmdList(pInfo);
@@ -953,9 +995,13 @@ void ConCmdManager::OnRootConsoleCommand(const char *cmdname, const CCommand &co
{ {
type = "server"; type = "server";
} }
else if (cmd.type == Cmd_Console)
{
type = "console";
}
else if (cmd.type == Cmd_Admin) else if (cmd.type == Cmd_Admin)
{ {
type = (cmd.pInfo->admin.eflags == 0)?"console":"admin"; type = "admin";
} }
name = cmd.pInfo->pCmd->GetName(); name = cmd.pInfo->pCmd->GetName();
if (cmd.pHook->helptext.size()) if (cmd.pHook->helptext.size())
+3
View File
@@ -48,6 +48,7 @@ using namespace SourceHook;
enum CmdType enum CmdType
{ {
Cmd_Server, Cmd_Server,
Cmd_Console,
Cmd_Admin, Cmd_Admin,
}; };
@@ -88,6 +89,7 @@ struct ConCmdInfo
List<CmdHook *> srvhooks; /**< Hooks as a server command */ List<CmdHook *> srvhooks; /**< Hooks as a server command */
List<CmdHook *> conhooks; /**< Hooks as a console command */ List<CmdHook *> conhooks; /**< Hooks as a console command */
AdminCmdInfo admin; /**< Admin info, if any */ AdminCmdInfo admin; /**< Admin info, if any */
bool is_admin_set; /**< Whether or not admin info is set */
}; };
typedef List<ConCmdInfo *> ConCmdList; typedef List<ConCmdInfo *> ConCmdList;
@@ -117,6 +119,7 @@ public: //IConCommandTracker
void OnUnlinkConCommandBase(ConCommandBase *pBase, const char *name, bool is_read_safe); void OnUnlinkConCommandBase(ConCommandBase *pBase, const char *name, bool is_read_safe);
public: public:
bool AddServerCommand(IPluginFunction *pFunction, const char *name, const char *description, int flags); bool AddServerCommand(IPluginFunction *pFunction, const char *name, const char *description, int flags);
bool AddConsoleCommand(IPluginFunction *pFunction, const char *name, const char *description, int flags);
bool AddAdminCommand(IPluginFunction *pFunction, bool AddAdminCommand(IPluginFunction *pFunction,
const char *name, const char *name,
const char *group, const char *group,
+1 -21
View File
@@ -126,8 +126,6 @@ void ConVarManager::OnSourceModAllInitialized()
} }
#endif #endif
g_Players.AddClientListener(this);
SH_ADD_HOOK_STATICFUNC(ICvar, CallGlobalChangeCallbacks, icvar, OnConVarChanged, false); SH_ADD_HOOK_STATICFUNC(ICvar, CallGlobalChangeCallbacks, icvar, OnConVarChanged, false);
g_PluginSys.AddPluginsListener(this); g_PluginSys.AddPluginsListener(this);
@@ -193,8 +191,6 @@ void ConVarManager::OnSourceModShutdown()
} }
#endif #endif
g_Players.RemoveClientListener(this);
SH_REMOVE_HOOK_STATICFUNC(ICvar, CallGlobalChangeCallbacks, icvar, OnConVarChanged, false); SH_REMOVE_HOOK_STATICFUNC(ICvar, CallGlobalChangeCallbacks, icvar, OnConVarChanged, false);
/* Remove the 'convars' option from the 'sm' console command */ /* Remove the 'convars' option from the 'sm' console command */
@@ -311,22 +307,6 @@ void ConVarManager::OnPluginUnloaded(IPlugin *plugin)
} }
} }
void ConVarManager::OnClientDisconnected(int client)
{
/* Remove convar queries for this client that haven't returned results yet */
for (List<ConVarQuery>::iterator iter = m_ConVarQueries.begin(); iter != m_ConVarQueries.end();)
{
ConVarQuery &query = (*iter);
if (query.client == client)
{
iter = m_ConVarQueries.erase(iter);
continue;
}
++iter;
}
}
void ConVarManager::OnHandleDestroy(HandleType_t type, void *object) void ConVarManager::OnHandleDestroy(HandleType_t type, void *object)
{ {
} }
@@ -639,7 +619,7 @@ QueryCvarCookie_t ConVarManager::QueryClientConVar(edict_t *pPlayer, const char
return InvalidQueryCvarCookie; return InvalidQueryCvarCookie;
} }
ConVarQuery query = {cookie, pCallback, (cell_t)hndl, IndexOfEdict(pPlayer)}; ConVarQuery query = {cookie, pCallback, hndl};
m_ConVarQueries.push_back(query); m_ConVarQueries.push_back(query);
#endif #endif
+1 -7
View File
@@ -39,10 +39,8 @@
#include <IForwardSys.h> #include <IForwardSys.h>
#include <IHandleSys.h> #include <IHandleSys.h>
#include <IRootConsoleMenu.h> #include <IRootConsoleMenu.h>
#include <IPlayerHelpers.h>
#include <compat_wrappers.h> #include <compat_wrappers.h>
#include "concmd_cleaner.h" #include "concmd_cleaner.h"
#include "PlayerManager.h"
#if SOURCE_ENGINE == SE_DARKMESSIAH #if SOURCE_ENGINE == SE_DARKMESSIAH
class EQueryCvarValueStatus; class EQueryCvarValueStatus;
@@ -77,7 +75,6 @@ struct ConVarQuery
QueryCvarCookie_t cookie; /**< Cookie that identifies query */ QueryCvarCookie_t cookie; /**< Cookie that identifies query */
IPluginFunction *pCallback; /**< Function that will be called when query is finished */ IPluginFunction *pCallback; /**< Function that will be called when query is finished */
cell_t value; /**< Optional value passed to query function */ cell_t value; /**< Optional value passed to query function */
cell_t client; /**< Only used for cleaning up on client disconnection */
}; };
class ConVarManager : class ConVarManager :
@@ -85,8 +82,7 @@ class ConVarManager :
public IHandleTypeDispatch, public IHandleTypeDispatch,
public IPluginsListener, public IPluginsListener,
public IRootConsoleCommand, public IRootConsoleCommand,
public IConCommandTracker, public IConCommandTracker
public IClientListener
{ {
public: public:
ConVarManager(); ConVarManager();
@@ -105,8 +101,6 @@ public: //IRootConsoleCommand
void OnRootConsoleCommand(const char *cmdname, const CCommand &command); void OnRootConsoleCommand(const char *cmdname, const CCommand &command);
public: //IConCommandTracker public: //IConCommandTracker
void OnUnlinkConCommandBase(ConCommandBase *pBase, const char *name, bool is_read_safe); void OnUnlinkConCommandBase(ConCommandBase *pBase, const char *name, bool is_read_safe);
public: //IClientListener
void OnClientDisconnected(int client);
public: public:
/** /**
* Create a convar and return a handle to it. * Create a convar and return a handle to it.
+1 -6
View File
@@ -664,11 +664,6 @@ cell_t ConsoleDetours::InternalDispatch(int client, const CCommand& args)
char name[255]; char name[255];
const char *realname = args.Arg(0); const char *realname = args.Arg(0);
size_t len = strlen(realname); size_t len = strlen(realname);
// Disallow command strings that are too long, for now.
if (len >= sizeof(name) - 1)
return Pl_Continue;
for (size_t i = 0; i < len; i++) for (size_t i = 0; i < len; i++)
{ {
if (realname[i] >= 'A' && realname[i] <= 'Z') if (realname[i] >= 'A' && realname[i] <= 'Z')
@@ -688,7 +683,7 @@ cell_t ConsoleDetours::InternalDispatch(int client, const CCommand& args)
if (strcmp(name, "sm") == 0) if (strcmp(name, "sm") == 0)
result = Pl_Continue; result = Pl_Continue;
if (result >= Pl_Handled) if (result >= Pl_Stop)
return result; return result;
Listener **plistener = m_CmdLookup.retrieve(name); Listener **plistener = m_CmdLookup.retrieve(name);
+4 -22
View File
@@ -193,30 +193,17 @@ void CoreConfig::OnRootConsoleCommand(const char *cmdname, const CCommand &comma
if (res == ConfigResult_Reject) if (res == ConfigResult_Reject)
{ {
g_RootMenu.ConsolePrint("[SM] Could not set config option \"%s\" to \"%s\". (%s)", option, value, error); g_RootMenu.ConsolePrint("[SM] Could not set config option \"%s\" to \"%s\" (%s)", option, value, error);
} else if (res == ConfigResult_Ignore) { } else if (res == ConfigResult_Ignore) {
g_RootMenu.ConsolePrint("[SM] No such config option \"%s\" exists.", option); g_RootMenu.ConsolePrint("[SM] No such config option \"%s\" exists.", option);
} else { } else {
g_RootMenu.ConsolePrint("[SM] Config option \"%s\" successfully set to \"%s\".", option, value); g_RootMenu.ConsolePrint("Config option \"%s\" successfully set to \"%s.\"", option, value);
} }
return;
} else if (argcount >= 3) {
const char *option = command.Arg(2);
const char *value = GetCoreConfigValue(option);
if (value == NULL)
{
g_RootMenu.ConsolePrint("[SM] No such config option \"%s\" exists.", option);
} else {
g_RootMenu.ConsolePrint("[SM] Config option \"%s\" is set to \"%s\".", option, value);
}
return; return;
} }
g_RootMenu.ConsolePrint("[SM] Usage: sm config <option> [value]"); g_RootMenu.ConsolePrint("[SM] Usage: sm config <option> <value>");
} }
void CoreConfig::Initialize() void CoreConfig::Initialize()
@@ -408,7 +395,7 @@ bool SM_ExecuteConfig(CPlugin *pl, AutoConfig *cfg, bool can_create)
FILE *fp = fopen(file, "wt"); FILE *fp = fopen(file, "wt");
if (fp) if (fp)
{ {
fprintf(fp, "// This file was auto-generated by SourceMod (v%s)\n", SOURCEMOD_VERSION); fprintf(fp, "// This file was auto-generated by SourceMod (v%s)\n", SM_FULL_VERSION);
fprintf(fp, "// ConVars for plugin \"%s\"\n", pl->GetFilename()); fprintf(fp, "// ConVars for plugin \"%s\"\n", pl->GetFilename());
fprintf(fp, "\n\n"); fprintf(fp, "\n\n");
@@ -465,11 +452,6 @@ bool SM_ExecuteConfig(CPlugin *pl, AutoConfig *cfg, bool can_create)
can_create = false; can_create = false;
fclose(fp); fclose(fp);
} }
else
{
g_Logger.LogError("Failed to auto generate config for %s, make sure the directory has write permission.", pl->GetFilename());
return can_create;
}
} }
} }
+12 -138
View File
@@ -37,7 +37,6 @@
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include "sm_srvcmds.h" #include "sm_srvcmds.h"
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "PlayerManager.h"
CExtensionManager g_Extensions; CExtensionManager g_Extensions;
IdentityType_t g_ExtType; IdentityType_t g_ExtType;
@@ -66,8 +65,6 @@ CRemoteExtension::CRemoteExtension(IExtensionInterface *pAPI, const char *filena
#define GAMEFIX "2.l4d" #define GAMEFIX "2.l4d"
#elif SOURCE_ENGINE == SE_LEFT4DEAD2 #elif SOURCE_ENGINE == SE_LEFT4DEAD2
#define GAMEFIX "2.l4d2" #define GAMEFIX "2.l4d2"
#elif SOURCE_ENGINE == SE_NUCLEARDAWN
#define GAMEFIX "2.nd"
#elif SOURCE_ENGINE == SE_ALIENSWARM #elif SOURCE_ENGINE == SE_ALIENSWARM
#define GAMEFIX "2.swarm" #define GAMEFIX "2.swarm"
#elif SOURCE_ENGINE == SE_ORANGEBOX #elif SOURCE_ENGINE == SE_ORANGEBOX
@@ -76,20 +73,10 @@ CRemoteExtension::CRemoteExtension(IExtensionInterface *pAPI, const char *filena
#define GAMEFIX "2.bgt" #define GAMEFIX "2.bgt"
#elif SOURCE_ENGINE == SE_EYE #elif SOURCE_ENGINE == SE_EYE
#define GAMEFIX "2.eye" #define GAMEFIX "2.eye"
#elif SOURCE_ENGINE == SE_CSS #elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
#define GAMEFIX "2.css" #define GAMEFIX "2.ep2v"
#elif SOURCE_ENGINE == SE_HL2DM
#define GAMEFIX "2.hl2dm"
#elif SOURCE_ENGINE == SE_DODS
#define GAMEFIX "2.dods"
#elif SOURCE_ENGINE == SE_TF2
#define GAMEFIX "2.tf2"
#elif SOURCE_ENGINE == SE_DARKMESSIAH #elif SOURCE_ENGINE == SE_DARKMESSIAH
#define GAMEFIX "2.darkm" #define GAMEFIX "2.darkm"
#elif SOURCE_ENGINE == SE_PORTAL2
#define GAMEFIX "2.portal2"
#elif SOURCE_ENGINE == SE_CSGO
#define GAMEFIX "2.csgo"
#else #else
#define GAMEFIX "2.ep1" #define GAMEFIX "2.ep1"
#endif //(SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2) #endif //(SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
@@ -122,31 +109,6 @@ CLocalExtension::CLocalExtension(const char *filename)
goto found; goto found;
} }
#if SOURCE_ENGINE == SE_TF2 || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_HL2DM
/* COMPAT HACK: One-halfth, if ep2v, see if there is an engine specific build in the new place with old naming */
g_SourceMod.BuildPath(Path_SM,
path,
PLATFORM_MAX_PATH,
"extensions/%s.2.ep2v." PLATFORM_LIB_EXT,
filename);
if (g_LibSys.IsPathFile(path))
{
goto found;
}
#elif SOURCE_ENGINE == SE_NUCLEARDAWN
g_SourceMod.BuildPath(Path_SM,
path,
PLATFORM_MAX_PATH,
"extensions/%s.2.l4d2." PLATFORM_LIB_EXT,
filename);
if (g_LibSys.IsPathFile(path))
{
goto found;
}
#endif
/* First see if there is an engine specific build! */ /* First see if there is an engine specific build! */
g_SourceMod.BuildPath(Path_SM, g_SourceMod.BuildPath(Path_SM,
path, path,
@@ -154,10 +116,10 @@ CLocalExtension::CLocalExtension(const char *filename)
"extensions/auto." GAMEFIX "/%s." PLATFORM_LIB_EXT, "extensions/auto." GAMEFIX "/%s." PLATFORM_LIB_EXT,
filename); filename);
normal:
/* Try the "normal" version */ /* Try the "normal" version */
if (!g_LibSys.IsPathFile(path)) if (!g_LibSys.IsPathFile(path))
{ {
normal:
g_SourceMod.BuildPath(Path_SM, g_SourceMod.BuildPath(Path_SM,
path, path,
PLATFORM_MAX_PATH, PLATFORM_MAX_PATH,
@@ -836,13 +798,6 @@ bool CExtensionManager::UnloadExtension(IExtension *_pExt)
return false; return false;
} }
/* Tell it to unload */
if (pExt->IsLoaded())
{
IExtensionInterface *pAPI = pExt->GetAPI();
pAPI->OnExtensionUnload();
}
/* First remove us from internal lists */ /* First remove us from internal lists */
g_ShareSys.RemoveInterfaces(_pExt); g_ShareSys.RemoveInterfaces(_pExt);
m_Libs.remove(pExt); m_Libs.remove(pExt);
@@ -866,7 +821,7 @@ bool CExtensionManager::UnloadExtension(IExtension *_pExt)
s_iter != pExt->m_Libraries.end(); s_iter != pExt->m_Libraries.end();
s_iter++) s_iter++)
{ {
g_PluginSys.OnLibraryAction((*s_iter).c_str(), LibraryAction_Removed); g_PluginSys.OnLibraryAction((*s_iter).c_str(), false, true);
} }
/* Notify and/or unload all dependencies */ /* Notify and/or unload all dependencies */
@@ -937,6 +892,13 @@ bool CExtensionManager::UnloadExtension(IExtension *_pExt)
} }
} }
/* Tell it to unload */
if (pExt->IsLoaded())
{
IExtensionInterface *pAPI = pExt->GetAPI();
pAPI->OnExtensionUnload();
}
pExt->Unload(); pExt->Unload();
delete pExt; delete pExt;
@@ -1322,94 +1284,6 @@ void CExtensionManager::OnRootConsoleCommand(const char *cmdname, const CCommand
g_RootMenu.DrawGenericOption("unload", "Unload an extension"); g_RootMenu.DrawGenericOption("unload", "Unload an extension");
} }
void CExtensionManager::ListExtensionsToClient(CPlayer *player, const CCommand &args)
{
char buffer[256];
int numExtensions = m_Libs.size();
edict_t *edict = player->GetEdict();
unsigned int id = 0;
unsigned int start = 0;
if (!numExtensions)
{
ClientConsolePrint(edict, "[SM] No extensions found.");
return;
}
if (args.ArgC() > 2)
{
start = atoi(args.Arg(2));
}
CExtension *ext;
SourceHook::List<CExtension *>::iterator iter;
for (iter = m_Libs.begin();
iter != m_Libs.end();
iter++)
{
ext = (*iter);
char error[255];
if (!ext->IsRunning(error, sizeof(error)))
{
continue;
}
id++;
if (id < start)
{
continue;
}
if (id - start > 10)
{
break;
}
IExtensionInterface *api = ext->GetAPI();
const char *name = api->GetExtensionName();
const char *version = api->GetExtensionVerString();
const char *author = api->GetExtensionAuthor();
const char *description = api->GetExtensionDescription();
size_t len = UTIL_Format(buffer, sizeof(buffer), " \"%s\"", name);
if (version != NULL && IS_STR_FILLED(version))
{
len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " (%s)", version);
}
if (author != NULL && IS_STR_FILLED(author))
{
len += UTIL_Format(&buffer[len], sizeof(buffer)-len, " by %s", author);
}
if (description != NULL && IS_STR_FILLED(description))
{
len += UTIL_Format(&buffer[len], sizeof(buffer)-len, ": %s", description);
}
ClientConsolePrint(edict, "%s", buffer);
}
while (iter != m_Libs.end())
{
char error[255];
if ((*iter)->IsRunning(error, sizeof(error)))
{
break;
}
}
if (iter != m_Libs.end())
{
ClientConsolePrint(edict, "To see more, type \"sm exts %d\"", id);
}
}
CExtension *CExtensionManager::GetExtensionFromIdent(IdentityToken_t *ptr) CExtension *CExtensionManager::GetExtensionFromIdent(IdentityToken_t *ptr)
{ {
if (ptr->type == g_ExtType) if (ptr->type == g_ExtType)
@@ -1432,7 +1306,7 @@ void CExtensionManager::AddLibrary(IExtension *pSource, const char *library)
{ {
CExtension *pExt = (CExtension *)pSource; CExtension *pExt = (CExtension *)pSource;
pExt->AddLibrary(library); pExt->AddLibrary(library);
g_PluginSys.OnLibraryAction(library, LibraryAction_Added); g_PluginSys.OnLibraryAction(library, false, false);
} }
bool CExtensionManager::LibraryExists(const char *library) bool CExtensionManager::LibraryExists(const char *library)
-4
View File
@@ -45,8 +45,6 @@
#include "PluginSys.h" #include "PluginSys.h"
#include "NativeOwner.h" #include "NativeOwner.h"
class CPlayer;
using namespace SourceMod; using namespace SourceMod;
using namespace SourceHook; using namespace SourceHook;
@@ -177,8 +175,6 @@ public:
bool LibraryExists(const char *library); bool LibraryExists(const char *library);
void CallOnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax); void CallOnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax);
void AddRawDependency(IExtension *ext, IdentityToken_t *other, void *iface); void AddRawDependency(IExtension *ext, IdentityToken_t *other, void *iface);
public:
void ListExtensionsToClient(CPlayer *player, const CCommand &args);
public: public:
CExtension *GetExtensionFromIdent(IdentityToken_t *ptr); CExtension *GetExtensionFromIdent(IdentityToken_t *ptr);
void Shutdown(); void Shutdown();
-1
View File
@@ -193,7 +193,6 @@ void CForwardManager::ForwardFree(CForward *fwd)
m_FreeForwards.push(fwd); m_FreeForwards.push(fwd);
m_managed.remove(fwd); m_managed.remove(fwd);
m_unmanaged.remove(fwd);
} }
CForward *CForwardManager::ForwardMake() CForward *CForwardManager::ForwardMake()
+36 -336
View File
@@ -38,57 +38,14 @@
#include <IGameConfigs.h> #include <IGameConfigs.h>
#include <compat_wrappers.h> #include <compat_wrappers.h>
#include <Logger.h> #include <Logger.h>
#include "LibrarySys.h"
#include "logic_bridge.h" #include "logic_bridge.h"
#include <tier0/mem.h>
#if SOURCE_ENGINE == SE_CSGO
#include <cstrike15_usermessages.pb.h>
#endif
typedef ICommandLine *(*FakeGetCommandLine)();
#if defined _WIN32
#define TIER0_NAME "tier0.dll"
#define VSTDLIB_NAME "vstdlib.dll"
#elif defined __APPLE__
#define TIER0_NAME "libtier0.dylib"
#define VSTDLIB_NAME "libvstdlib.dylib"
#elif defined __linux__
#if SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_TF2 || SOURCE_ENGINE == SE_LEFT4DEAD2
#define TIER0_NAME "libtier0_srv.so"
#define VSTDLIB_NAME "libvstdlib_srv.so"
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
#define TIER0_NAME "libtier0.so"
#define VSTDLIB_NAME "libvstdlib.so"
#else
#define TIER0_NAME "tier0_i486.so"
#define VSTDLIB_NAME "vstdlib_i486.so"
#endif
#endif
CHalfLife2 g_HL2; CHalfLife2 g_HL2;
ConVar *sv_lan = NULL; ConVar *sv_lan = NULL;
static void *g_EntList = NULL; static void *g_EntList = NULL;
static void **g_pEntInfoList = NULL;
static int entInfoOffset = -1; static int entInfoOffset = -1;
static CEntInfo *EntInfoArray()
{
if (g_EntList != NULL)
{
return (CEntInfo *)((intp)g_EntList + entInfoOffset);
}
else if (g_pEntInfoList)
{
return *(CEntInfo **)g_pEntInfoList;
}
return NULL;
}
namespace SourceHook namespace SourceHook
{ {
template<> template<>
@@ -174,12 +131,6 @@ void CHalfLife2::OnSourceModAllInitialized()
} }
void CHalfLife2::OnSourceModAllInitialized_Post() void CHalfLife2::OnSourceModAllInitialized_Post()
{
InitLogicalEntData();
InitCommandLine();
}
void CHalfLife2::InitLogicalEntData()
{ {
char *addr = NULL; char *addr = NULL;
@@ -207,99 +158,42 @@ void CHalfLife2::InitLogicalEntData()
#endif #endif
} }
if (!g_EntList) if (!g_EntList)
{ {
if (g_pGameConf->GetMemSig("LevelShutdown", (void **) &addr) && addr) if (!g_pGameConf->GetMemSig("LevelShutdown", (void **)&addr))
{ {
int offset; g_Logger.LogError("Logical Entities not supported by this mod (LevelShutdown) - Reverting to networkable entities only");
if (!g_pGameConf->GetOffset("gEntList", &offset)) return;
{
g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only");
return;
}
g_EntList = *reinterpret_cast<void **>(addr + offset);
} }
}
// If we have g_EntList from either of the above methods, make sure we can get the offset from it to EntInfo as well if (!addr)
if (g_EntList && !g_pGameConf->GetOffset("EntInfo", &entInfoOffset)) {
{ g_Logger.LogError("Failed lookup of LevelShutdown - Reverting to networkable entities only");
g_Logger.LogError("Logical Entities not supported by this mod (EntInfo) - Reverting to networkable entities only"); return;
g_EntList = NULL; }
return;
}
// If we don't have g_EntList or have it but don't know where EntInfo is on it, use fallback. int offset;
if (!g_EntList || entInfoOffset == -1) if (!g_pGameConf->GetOffset("gEntList", &offset))
{ {
g_pGameConf->GetAddress("EntInfosPtr", (void **)&g_pEntInfoList); g_Logger.LogError("Logical Entities not supported by this mod (gEntList) - Reverting to networkable entities only");
return;
}
g_EntList = *reinterpret_cast<void **>(addr + offset);
} }
if (!g_EntList && !g_pEntInfoList) if (!g_EntList)
{ {
g_Logger.LogError("Failed lookup of gEntList - Reverting to networkable entities only"); g_Logger.LogError("Failed lookup of gEntList - Reverting to networkable entities only");
return; return;
} }
}
void CHalfLife2::InitCommandLine() if (!g_pGameConf->GetOffset("EntInfo", &entInfoOffset))
{
char path[PLATFORM_MAX_PATH];
char error[256];
g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "../bin/" TIER0_NAME);
if (!g_LibSys.IsPathFile(path))
{ {
g_Logger.LogError("Could not find path for: " TIER0_NAME); g_Logger.LogError("Logical Entities not supported by this mod (EntInfo) - Reverting to networkable entities only");
return; return;
} }
ILibrary *lib = g_LibSys.OpenLibrary(path, error, sizeof(error));
m_pGetCommandLine = lib->GetSymbolAddress("CommandLine_Tier0");
/* '_Tier0' dropped on Alien Swarm version */
if (m_pGetCommandLine == NULL)
{
m_pGetCommandLine = lib->GetSymbolAddress("CommandLine");
}
if (m_pGetCommandLine == NULL)
{
/* We probably have a Ship engine. */
lib->CloseLibrary();
g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "../bin/" VSTDLIB_NAME);
if (!g_LibSys.IsPathFile(path))
{
g_Logger.LogError("Could not find path for: " VSTDLIB_NAME);
return;
}
if ((lib = g_LibSys.OpenLibrary(path, error, sizeof(error))) == NULL)
{
g_Logger.LogError("Could not load %s: %s", path, error);
return;
}
m_pGetCommandLine = lib->GetSymbolAddress("CommandLine");
if (m_pGetCommandLine == NULL)
{
g_Logger.LogError("Could not locate any command line functionality");
}
lib->CloseLibrary();
}
}
ICommandLine *CHalfLife2::GetValveCommandLine()
{
if (!m_pGetCommandLine)
return NULL;
return ((FakeGetCommandLine)((FakeGetCommandLine *)m_pGetCommandLine))();
} }
#if !defined METAMOD_PLAPI_VERSION || PLAPI_VERSION < 11 #if !defined METAMOD_PLAPI_VERSION || PLAPI_VERSION < 11
@@ -351,13 +245,8 @@ bool UTIL_FindInSendTable(SendTable *pTable,
return false; return false;
} }
typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name, bool *isNested) typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name)
{ {
if (isNested)
{
*isNested = false;
}
while (pMap) while (pMap)
{ {
for (int i=0; i<pMap->dataNumFields; i++) for (int i=0; i<pMap->dataNumFields; i++)
@@ -372,21 +261,10 @@ typedescription_t *UTIL_FindInDataMap(datamap_t *pMap, const char *name, bool *i
} }
if (pMap->dataDesc[i].td) if (pMap->dataDesc[i].td)
{ {
if (isNested) typedescription_t *_td;
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name)) != NULL)
{ {
*isNested = (UTIL_FindInDataMap(pMap->dataDesc[i].td, name, NULL) != NULL); return _td;
if (*isNested)
{
return NULL;
} else {
continue;
}
} else { // Use the old behaviour, we dont want to spring this on extensions - even if they're doing bad things.
typedescription_t *_td;
if ((_td=UTIL_FindInDataMap(pMap->dataDesc[i].td, name, NULL)) != NULL)
{
return _td;
}
} }
} }
} }
@@ -479,11 +357,6 @@ SendProp *CHalfLife2::FindInSendTable(const char *classname, const char *offset)
} }
typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset) typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset)
{
return this->FindInDataMap(pMap, offset, NULL);
}
typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset, bool *isNested)
{ {
typedescription_t *td = NULL; typedescription_t *td = NULL;
DataMapTrie &val = m_Maps[pMap]; DataMapTrie &val = m_Maps[pMap];
@@ -494,7 +367,7 @@ typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset
} }
if (!sm_trie_retrieve(val.trie, offset, (void **)&td)) if (!sm_trie_retrieve(val.trie, offset, (void **)&td))
{ {
if ((td = UTIL_FindInDataMap(pMap, offset, isNested)) != NULL) if ((td = UTIL_FindInDataMap(pMap, offset)) != NULL)
{ {
sm_trie_insert(val.trie, offset, td); sm_trie_insert(val.trie, offset, td);
} }
@@ -526,9 +399,7 @@ void CHalfLife2::SetEdictStateChanged(edict_t *pEdict, unsigned short offset)
bool CHalfLife2::TextMsg(int client, int dest, const char *msg) bool CHalfLife2::TextMsg(int client, int dest, const char *msg)
{ {
#if SOURCE_ENGINE != SE_CSGO
bf_write *pBitBuf = NULL; bf_write *pBitBuf = NULL;
#endif
cell_t players[] = {client}; cell_t players[] = {client};
if (dest == HUD_PRINTTALK) if (dest == HUD_PRINTTALK)
@@ -541,18 +412,7 @@ bool CHalfLife2::TextMsg(int client, int dest, const char *msg)
char buffer[192]; char buffer[192];
UTIL_Format(buffer, sizeof(buffer), "%s\1\n", msg); UTIL_Format(buffer, sizeof(buffer), "%s\1\n", msg);
#if SOURCE_ENGINE == SE_CSGO if ((pBitBuf = g_UserMsgs.StartMessage(m_SayTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
CCSUsrMsg_SayText *pMsg;
if ((pMsg = (CCSUsrMsg_SayText *)g_UserMsgs.StartProtobufMessage(m_SayTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
{
return false;
}
pMsg->set_ent_idx(0);
pMsg->set_text(buffer);
pMsg->set_chat(false);
#else
if ((pBitBuf = g_UserMsgs.StartBitBufMessage(m_SayTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
{ {
return false; return false;
} }
@@ -560,7 +420,6 @@ bool CHalfLife2::TextMsg(int client, int dest, const char *msg)
pBitBuf->WriteByte(0); pBitBuf->WriteByte(0);
pBitBuf->WriteString(buffer); pBitBuf->WriteString(buffer);
pBitBuf->WriteByte(1); pBitBuf->WriteByte(1);
#endif
g_UserMsgs.EndMessage(); g_UserMsgs.EndMessage();
@@ -568,29 +427,13 @@ bool CHalfLife2::TextMsg(int client, int dest, const char *msg)
} }
} }
#if SOURCE_ENGINE == SE_CSGO if ((pBitBuf = g_UserMsgs.StartMessage(m_MsgTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
CCSUsrMsg_TextMsg *pMsg;
if ((pMsg = (CCSUsrMsg_TextMsg *)g_UserMsgs.StartProtobufMessage(m_MsgTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
{
return false;
}
// Client tries to read all 5 'params' and will crash if less
pMsg->set_msg_dst(dest);
pMsg->add_params(msg);
pMsg->add_params("");
pMsg->add_params("");
pMsg->add_params("");
pMsg->add_params("");
#else
if ((pBitBuf = g_UserMsgs.StartBitBufMessage(m_MsgTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
{ {
return false; return false;
} }
pBitBuf->WriteByte(dest); pBitBuf->WriteByte(dest);
pBitBuf->WriteString(msg); pBitBuf->WriteString(msg);
#endif
g_UserMsgs.EndMessage(); g_UserMsgs.EndMessage();
@@ -599,20 +442,10 @@ bool CHalfLife2::TextMsg(int client, int dest, const char *msg)
bool CHalfLife2::HintTextMsg(int client, const char *msg) bool CHalfLife2::HintTextMsg(int client, const char *msg)
{ {
bf_write *pBitBuf = NULL;
cell_t players[] = {client}; cell_t players[] = {client};
#if SOURCE_ENGINE == SE_CSGO if ((pBitBuf = g_UserMsgs.StartMessage(m_HinTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
CCSUsrMsg_HintText *pMsg;
if ((pMsg = (CCSUsrMsg_HintText *)g_UserMsgs.StartProtobufMessage(m_HinTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
{
return false;
}
pMsg->set_text(msg);
#else
bf_write *pBitBuf = NULL;
if ((pBitBuf = g_UserMsgs.StartBitBufMessage(m_HinTextMsg, players, 1, USERMSG_RELIABLE)) == NULL)
{ {
return false; return false;
} }
@@ -623,7 +456,6 @@ bool CHalfLife2::HintTextMsg(int client, const char *msg)
pBitBuf->WriteByte(1); pBitBuf->WriteByte(1);
} }
pBitBuf->WriteString(msg); pBitBuf->WriteString(msg);
#endif
g_UserMsgs.EndMessage(); g_UserMsgs.EndMessage();
return true; return true;
@@ -631,18 +463,9 @@ bool CHalfLife2::HintTextMsg(int client, const char *msg)
bool CHalfLife2::HintTextMsg(cell_t *players, int count, const char *msg) bool CHalfLife2::HintTextMsg(cell_t *players, int count, const char *msg)
{ {
#if SOURCE_ENGINE == SE_CSGO
CCSUsrMsg_HintText *pMsg;
if ((pMsg = (CCSUsrMsg_HintText *)g_UserMsgs.StartProtobufMessage(m_HinTextMsg, players, count, USERMSG_RELIABLE)) == NULL)
{
return false;
}
pMsg->set_text(msg);
#else
bf_write *pBitBuf = NULL; bf_write *pBitBuf = NULL;
if ((pBitBuf = g_UserMsgs.StartBitBufMessage(m_HinTextMsg, players, count, USERMSG_RELIABLE)) == NULL) if ((pBitBuf = g_UserMsgs.StartMessage(m_HinTextMsg, players, count, USERMSG_RELIABLE)) == NULL)
{ {
return false; return false;
} }
@@ -653,8 +476,6 @@ bool CHalfLife2::HintTextMsg(cell_t *players, int count, const char *msg)
pBitBuf->WriteByte(1); pBitBuf->WriteByte(1);
} }
pBitBuf->WriteString(msg); pBitBuf->WriteString(msg);
#endif
g_UserMsgs.EndMessage(); g_UserMsgs.EndMessage();
return true; return true;
@@ -662,23 +483,15 @@ bool CHalfLife2::HintTextMsg(cell_t *players, int count, const char *msg)
bool CHalfLife2::ShowVGUIMenu(int client, const char *name, KeyValues *data, bool show) bool CHalfLife2::ShowVGUIMenu(int client, const char *name, KeyValues *data, bool show)
{ {
bf_write *pBitBuf = NULL;
KeyValues *SubKey = NULL; KeyValues *SubKey = NULL;
int count = 0; int count = 0;
cell_t players[] = {client}; cell_t players[] = {client};
#if SOURCE_ENGINE == SE_CSGO if ((pBitBuf = g_UserMsgs.StartMessage(m_VGUIMenu, players, 1, USERMSG_RELIABLE)) == NULL)
CCSUsrMsg_VGUIMenu *pMsg;
if ((pMsg = (CCSUsrMsg_VGUIMenu *)g_UserMsgs.StartProtobufMessage(m_VGUIMenu, players, 1, USERMSG_RELIABLE)) == NULL)
{ {
return false; return false;
} }
#else
bf_write *pBitBuf = NULL;
if ((pBitBuf = g_UserMsgs.StartBitBufMessage(m_VGUIMenu, players, 1, USERMSG_RELIABLE)) == NULL)
{
return false;
}
#endif
if (data) if (data)
{ {
@@ -691,18 +504,6 @@ bool CHalfLife2::ShowVGUIMenu(int client, const char *name, KeyValues *data, boo
SubKey = data->GetFirstSubKey(); SubKey = data->GetFirstSubKey();
} }
#if SOURCE_ENGINE == SE_CSGO
pMsg->set_name(name);
pMsg->set_show(show);
while (SubKey)
{
CCSUsrMsg_VGUIMenu_Subkey *key = pMsg->add_subkeys();
key->set_name(SubKey->GetName());
key->set_str(SubKey->GetString());
SubKey = SubKey->GetNextKey();
}
#else
pBitBuf->WriteString(name); pBitBuf->WriteString(name);
pBitBuf->WriteByte((show) ? 1 : 0); pBitBuf->WriteByte((show) ? 1 : 0);
pBitBuf->WriteByte(count); pBitBuf->WriteByte(count);
@@ -712,8 +513,6 @@ bool CHalfLife2::ShowVGUIMenu(int client, const char *name, KeyValues *data, boo
pBitBuf->WriteString(SubKey->GetString()); pBitBuf->WriteString(SubKey->GetString());
SubKey = SubKey->GetNextKey(); SubKey = SubKey->GetNextKey();
} }
#endif
g_UserMsgs.EndMessage(); g_UserMsgs.EndMessage();
return true; return true;
@@ -751,7 +550,6 @@ void CHalfLife2::ProcessFakeCliCmdQueue()
} }
m_CmdQueue.pop(); m_CmdQueue.pop();
m_FreeCmds.push(pFake);
} }
} }
@@ -846,14 +644,6 @@ const char *CHalfLife2::CurrentCommandName()
void CHalfLife2::AddDelayedKick(int client, int userid, const char *msg) void CHalfLife2::AddDelayedKick(int client, int userid, const char *msg)
{ {
CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
if (!pPlayer || !pPlayer->IsConnected() || pPlayer->IsInKickQueue())
{
return;
}
pPlayer->MarkAsBeingKicked();
DelayedKickInfo kick; DelayedKickInfo kick;
kick.client = client; kick.client = client;
@@ -958,11 +748,6 @@ cell_t CHalfLife2::EntityToReference(CBaseEntity *pEntity)
CBaseEntity *CHalfLife2::ReferenceToEntity(cell_t entRef) CBaseEntity *CHalfLife2::ReferenceToEntity(cell_t entRef)
{ {
if ((unsigned)entRef == INVALID_EHANDLE_INDEX)
{
return NULL;
}
CEntInfo *pInfo = NULL; CEntInfo *pInfo = NULL;
if (entRef & (1<<31)) if (entRef & (1<<31))
@@ -972,7 +757,7 @@ CBaseEntity *CHalfLife2::ReferenceToEntity(cell_t entRef)
CBaseHandle hndl(hndlValue); CBaseHandle hndl(hndlValue);
pInfo = LookupEntity(hndl.GetEntryIndex()); pInfo = LookupEntity(hndl.GetEntryIndex());
if (!pInfo || pInfo->m_SerialNumber != hndl.GetSerialNumber()) if (pInfo->m_SerialNumber != hndl.GetSerialNumber())
{ {
return NULL; return NULL;
} }
@@ -1008,9 +793,7 @@ CEntInfo *CHalfLife2::LookupEntity(int entIndex)
return NULL; return NULL;
} }
CEntInfo *entInfos = EntInfoArray(); if (!g_EntList || entInfoOffset == -1)
if (!entInfos)
{ {
/* Attempt to use engine interface instead */ /* Attempt to use engine interface instead */
static CEntInfo tempInfo; static CEntInfo tempInfo;
@@ -1037,7 +820,8 @@ CEntInfo *CHalfLife2::LookupEntity(int entIndex)
return &tempInfo; return &tempInfo;
} }
return &entInfos[entIndex]; CEntInfo *pArray = (CEntInfo *)(((unsigned char *)g_EntList) + entInfoOffset);
return &pArray[entIndex];
} }
/** /**
@@ -1098,11 +882,6 @@ cell_t CHalfLife2::EntityToBCompatRef(CBaseEntity *pEntity)
IServerUnknown *pUnknown = (IServerUnknown *)pEntity; IServerUnknown *pUnknown = (IServerUnknown *)pEntity;
CBaseHandle hndl = pUnknown->GetRefEHandle(); CBaseHandle hndl = pUnknown->GetRefEHandle();
if (hndl == INVALID_EHANDLE_INDEX)
{
return INVALID_EHANDLE_INDEX;
}
if (hndl.GetEntryIndex() >= MAX_EDICTS) if (hndl.GetEntryIndex() >= MAX_EDICTS)
{ {
return (hndl.ToInt() | (1<<31)); return (hndl.ToInt() | (1<<31));
@@ -1141,82 +920,3 @@ int CHalfLife2::GetSendPropOffset(SendProp *prop)
return prop->GetOffset(); return prop->GetOffset();
} }
const char *CHalfLife2::GetEntityClassname(edict_t * pEdict)
{
if (pEdict == NULL || pEdict->IsFree())
{
return NULL;
}
IServerUnknown *pUnk = pEdict->GetUnknown();
if (pUnk == NULL)
{
return NULL;
}
CBaseEntity * pEntity = pUnk->GetBaseEntity();
if (pEntity == NULL)
{
return NULL;
}
return GetEntityClassname(pEntity);
}
const char *CHalfLife2::GetEntityClassname(CBaseEntity *pEntity)
{
static int offset = -1;
if (offset == -1)
{
datamap_t *pMap = GetDataMap(pEntity);
typedescription_t *pDesc = FindInDataMap(pMap, "m_iClassname");
offset = GetTypeDescOffs(pDesc);
}
return *(const char **)(((unsigned char *)pEntity) + offset);
}
#if SOURCE_ENGINE >= SE_LEFT4DEAD
static bool ResolveFuzzyMapName(const char *fuzzyName, char *outFullname, int size)
{
static ConCommand *pHelperCmd = g_pCVar->FindCommand("changelevel");
if (!pHelperCmd || !pHelperCmd->CanAutoComplete())
return false;
static size_t helperCmdLen = strlen(pHelperCmd->GetName());
CUtlVector<CUtlString> results;
pHelperCmd->AutoCompleteSuggest(fuzzyName, results);
if (results.Count() == 0)
return false;
// Results come back as you'd see in autocomplete. (ie. "changelevel fullmapnamehere"),
// so skip ahead to start of map path/name
// Like the engine, we're only going to deal with the first match.
strncopy(outFullname, &results[0][helperCmdLen + 1], size);
return true;
}
#endif
bool CHalfLife2::IsMapValid(const char *map)
{
if (!map || !map[0])
return false;
bool ret = engine->IsMapValid(map);
#if SOURCE_ENGINE >= SE_LEFT4DEAD
if (!ret)
{
static char szFuzzyName[PLATFORM_MAX_PATH];
if (ResolveFuzzyMapName(map, szFuzzyName, sizeof(szFuzzyName)))
{
ret = engine->IsMapValid(szFuzzyName);
}
}
#endif
return ret;
}
-18
View File
@@ -44,10 +44,6 @@
#include <server_class.h> #include <server_class.h>
#include <datamap.h> #include <datamap.h>
#include <ihandleentity.h> #include <ihandleentity.h>
#include <tier0/icommandline.h>
#if SOURCE_ENGINE >= SE_PORTAL2
#include <string_t.h>
#endif
class CCommand; class CCommand;
@@ -91,7 +87,6 @@ struct DelayedKickInfo
char buffer[384]; char buffer[384];
}; };
// copy from game/shared/entitylist_base.h
class CEntInfo class CEntInfo
{ {
public: public:
@@ -99,10 +94,6 @@ public:
int m_SerialNumber; int m_SerialNumber;
CEntInfo *m_pPrev; CEntInfo *m_pPrev;
CEntInfo *m_pNext; CEntInfo *m_pNext;
#if SOURCE_ENGINE >= SE_PORTAL2
string_t m_iName;
string_t m_iClassName;
#endif
}; };
class CHalfLife2 : class CHalfLife2 :
@@ -123,7 +114,6 @@ public: //IGameHelpers
datamap_t *GetDataMap(CBaseEntity *pEntity); datamap_t *GetDataMap(CBaseEntity *pEntity);
ServerClass *FindServerClass(const char *classname); ServerClass *FindServerClass(const char *classname);
typedescription_t *FindInDataMap(datamap_t *pMap, const char *offset); typedescription_t *FindInDataMap(datamap_t *pMap, const char *offset);
typedescription_t *FindInDataMap(datamap_t *pMap, const char *offset, bool *isNested);
void SetEdictStateChanged(edict_t *pEdict, unsigned short offset); void SetEdictStateChanged(edict_t *pEdict, unsigned short offset);
bool TextMsg(int client, int dest, const char *msg); bool TextMsg(int client, int dest, const char *msg);
bool HintTextMsg(int client, const char *msg); bool HintTextMsg(int client, const char *msg);
@@ -146,10 +136,6 @@ public: //IGameHelpers
cell_t EntityToBCompatRef(CBaseEntity *pEntity); cell_t EntityToBCompatRef(CBaseEntity *pEntity);
void *GetGlobalEntityList(); void *GetGlobalEntityList();
int GetSendPropOffset(SendProp *prop); int GetSendPropOffset(SendProp *prop);
ICommandLine *GetValveCommandLine();
const char *GetEntityClassname(edict_t *pEdict);
const char *GetEntityClassname(CBaseEntity *pEntity);
bool IsMapValid(const char *map);
public: public:
void AddToFakeCliCmdQueue(int client, int userid, const char *cmd); void AddToFakeCliCmdQueue(int client, int userid, const char *cmd);
void ProcessFakeCliCmdQueue(); void ProcessFakeCliCmdQueue();
@@ -165,9 +151,6 @@ public:
#endif #endif
private: private:
DataTableInfo *_FindServerClass(const char *classname); DataTableInfo *_FindServerClass(const char *classname);
private:
void InitLogicalEntData();
void InitCommandLine();
private: private:
Trie *m_pClasses; Trie *m_pClasses;
List<DataTableInfo *> m_Tables; List<DataTableInfo *> m_Tables;
@@ -180,7 +163,6 @@ private:
CStack<DelayedFakeCliCmd *> m_FreeCmds; CStack<DelayedFakeCliCmd *> m_FreeCmds;
CStack<CachedCommandInfo> m_CommandStack; CStack<CachedCommandInfo> m_CommandStack;
Queue<DelayedKickInfo> m_DelayedKicks; Queue<DelayedKickInfo> m_DelayedKicks;
void *m_pGetCommandLine;
}; };
extern CHalfLife2 g_HL2; extern CHalfLife2 g_HL2;
+38 -47
View File
@@ -579,7 +579,6 @@ HandleError HandleSystem::CloneHandle(QHandle *pHandle, unsigned int index, Hand
} }
pNewHandle->clone = index; pNewHandle->clone = index;
pNewHandle->object = NULL;
pHandle->refcount++; pHandle->refcount++;
*newhandle = new_handle; *newhandle = new_handle;
@@ -660,14 +659,6 @@ void HandleSystem::GetHandleUnchecked(Handle_t hndl, QHandle *& pHandle, unsigne
HandleError HandleSystem::FreeHandle(QHandle *pHandle, unsigned int index) HandleError HandleSystem::FreeHandle(QHandle *pHandle, unsigned int index)
{ {
if (pHandle->is_destroying)
{
/* Someone tried to free this recursively.
* We'll just ignore this safely.
*/
return HandleError_None;
}
QHandleType *pType = &m_Types[pHandle->type]; QHandleType *pType = &m_Types[pHandle->type];
if (pHandle->clone) if (pHandle->clone)
@@ -682,7 +673,6 @@ HandleError HandleSystem::FreeHandle(QHandle *pHandle, unsigned int index)
pMaster = &m_Handles[master]; pMaster = &m_Handles[master];
/* Release the clone now */ /* Release the clone now */
pHandle->is_destroying = true;
ReleasePrimHandle(index); ReleasePrimHandle(index);
/* Decrement the master's reference count */ /* Decrement the master's reference count */
@@ -691,27 +681,20 @@ HandleError HandleSystem::FreeHandle(QHandle *pHandle, unsigned int index)
/* Type should be the same but do this anyway... */ /* Type should be the same but do this anyway... */
pType = &m_Types[pMaster->type]; pType = &m_Types[pMaster->type];
pMaster->is_destroying = true; pMaster->is_destroying = true;
if (pMaster->object) pType->dispatch->OnHandleDestroy(pMaster->type, pMaster->object);
{
pType->dispatch->OnHandleDestroy(pMaster->type, pMaster->object);
}
ReleasePrimHandle(master); ReleasePrimHandle(master);
} }
} else if (pHandle->set == HandleSet_Identity) { } else if (pHandle->set == HandleSet_Identity) {
/* If we're an identity, skip all this stuff! /* If we're an identity, skip all this stuff!
* NOTE: SHARESYS DOES NOT CARE ABOUT THE DESTRUCTOR * NOTE: SHARESYS DOES NOT CARE ABOUT THE DESTRUCTOR
*/ */
pHandle->is_destroying = true;
ReleasePrimHandle(index); ReleasePrimHandle(index);
} else { } else {
/* Decrement, free if necessary */ /* Decrement, free if necessary */
if (--pHandle->refcount == 0) if (--pHandle->refcount == 0)
{ {
pHandle->is_destroying = true; pHandle->is_destroying = true;
if (pHandle->object) pType->dispatch->OnHandleDestroy(pHandle->type, pHandle->object);
{
pType->dispatch->OnHandleDestroy(pHandle->type, pHandle->object);
}
ReleasePrimHandle(index); ReleasePrimHandle(index);
} else { } else {
/* We must be cloned, so mark ourselves as freed */ /* We must be cloned, so mark ourselves as freed */
@@ -744,6 +727,14 @@ HandleError HandleSystem::FreeHandle(Handle_t handle, const HandleSecurity *pSec
return HandleError_Access; return HandleError_Access;
} }
if (pHandle->is_destroying)
{
/* Someone tried to free this recursively.
* We'll just ignore this safely.
*/
return HandleError_None;
}
return FreeHandle(pHandle, index); return FreeHandle(pHandle, index);
} }
@@ -802,9 +793,6 @@ void HandleSystem::UnlinkHandleFromOwner(QHandle *pHandle, unsigned int index)
assert(pHandle->owner == 0); assert(pHandle->owner == 0);
return; return;
} }
pHandle->owner = NULL;
/* Note that since 0 is an invalid handle, if any of these links are 0, /* Note that since 0 is an invalid handle, if any of these links are 0,
* the data can still be set. * the data can still be set.
*/ */
@@ -929,9 +917,29 @@ bool HandleSystem::RemoveType(HandleType_t type, IdentityToken_t *ident)
{ {
continue; continue;
} }
if (pHandle->clone)
FreeHandle(pHandle, i); {
/* Get parent */
QHandle *pOther = &m_Handles[pHandle->clone];
if (--pOther->refcount == 0)
{
/* Free! */
dispatch->OnHandleDestroy(type, pOther->object);
ReleasePrimHandle(pHandle->clone);
}
/* Unlink ourselves since we don't have a reference count */
ReleasePrimHandle(i);
} else {
/* If it's not a clone, we still have to check the reference count.
* Either way, we'll be destroyed eventually because the handle types do not change.
*/
if (--pHandle->refcount == 0)
{
/* Free! */
dispatch->OnHandleDestroy(type, pHandle->object);
ReleasePrimHandle(i);
}
}
if (pType->opened == 0) if (pType->opened == 0)
{ {
break; break;
@@ -985,11 +993,12 @@ bool HandleSystem::InitAccessDefaults(TypeAccess *pTypeAccess, HandleAccess *pHa
bool HandleSystem::TryAndFreeSomeHandles() bool HandleSystem::TryAndFreeSomeHandles()
{ {
IPluginIterator *pl_iter = g_PluginSys.GetPluginIterator();
IPlugin *highest_owner = NULL; IPlugin *highest_owner = NULL;
unsigned int highest_handle_count = 0; unsigned int highest_handle_count = 0;
/* Search all plugins */ /* Search all plugins */
for (IPluginIterator *pl_iter = g_PluginSys.GetPluginIterator(); pl_iter->MorePlugins(); pl_iter->NextPlugin()) while (pl_iter->MorePlugins())
{ {
IPlugin *plugin = pl_iter->GetPlugin(); IPlugin *plugin = pl_iter->GetPlugin();
IdentityToken_t *identity = plugin->GetIdentity(); IdentityToken_t *identity = plugin->GetIdentity();
@@ -1018,6 +1027,8 @@ bool HandleSystem::TryAndFreeSomeHandles()
highest_owner = plugin; highest_owner = plugin;
highest_handle_count = handle_count; highest_handle_count = handle_count;
} }
pl_iter->NextPlugin();
} }
if (highest_owner == NULL || highest_handle_count == 0) if (highest_owner == NULL || highest_handle_count == 0)
@@ -1084,32 +1095,12 @@ void HandleSystem::Dump(HANDLE_REPORTER rep)
const char *type = "ANON"; const char *type = "ANON";
QHandleType *pType = &m_Types[m_Handles[i].type]; QHandleType *pType = &m_Types[m_Handles[i].type];
unsigned int size = 0; unsigned int size = 0;
unsigned int parentIdx;
bool bresult;
if (pType->nameIdx != -1) if (pType->nameIdx != -1)
{ {
type = m_strtab->GetString(pType->nameIdx); type = m_strtab->GetString(pType->nameIdx);
} }
if ((parentIdx = m_Handles[i].clone) != 0)
{
if (m_Handles[parentIdx].refcount > 0)
{
size = 0;
bresult = true;
}
else
{
bresult = pType->dispatch->GetHandleApproxSize(m_Handles[parentIdx].type, m_Handles[parentIdx].object, &size);
}
}
else
{
bresult = pType->dispatch->GetHandleApproxSize(m_Handles[i].type, m_Handles[i].object, &size);
}
if (pType->dispatch->GetDispatchVersion() < HANDLESYS_MEMUSAGE_MIN_VERSION if (pType->dispatch->GetDispatchVersion() < HANDLESYS_MEMUSAGE_MIN_VERSION
|| !bresult) || !pType->dispatch->GetHandleApproxSize(m_Handles[i].type, m_Handles[i].object, &size))
{ {
rep("0x%08x\t%-20.20s\t%-20.20s\t%-10.10s", index, owner, type, "-1"); rep("0x%08x\t%-20.20s\t%-20.20s\t%-10.10s", index, owner, type, "-1");
} }
+3 -9
View File
@@ -149,7 +149,7 @@ void Logger::_NewMapFile()
} else { } else {
char date[32]; char date[32];
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime); strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
fprintf(fp, "L %s: SourceMod log file started (file \"L%02d%02d%03d.log\") (Version \"%s\")\n", date, curtime->tm_mon + 1, curtime->tm_mday, i, SOURCEMOD_VERSION); fprintf(fp, "L %s: SourceMod log file started (file \"L%02d%02d%03d.log\") (Version \"%s\")\n", date, curtime->tm_mon + 1, curtime->tm_mday, i, SM_FULL_VERSION);
fclose(fp); fclose(fp);
} }
} }
@@ -265,8 +265,6 @@ void Logger::LogToOpenFileEx(FILE *fp, const char *msg, va_list ap)
return; return;
} }
static ConVar *sv_logecho = icvar->FindVar("sv_logecho");
char buffer[3072]; char buffer[3072];
UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap); UTIL_FormatArgs(buffer, sizeof(buffer), msg, ap);
@@ -277,11 +275,7 @@ void Logger::LogToOpenFileEx(FILE *fp, const char *msg, va_list ap)
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime); strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
fprintf(fp, "L %s: %s\n", date, buffer); fprintf(fp, "L %s: %s\n", date, buffer);
g_SMAPI->ConPrintf("L %s: %s\n", date, buffer);
if (!sv_logecho || sv_logecho->GetBool())
{
g_SMAPI->ConPrintf("L %s: %s\n", date, buffer);
}
} }
void Logger::LogToFileOnlyEx(FILE *fp, const char *msg, va_list ap) void Logger::LogToFileOnlyEx(FILE *fp, const char *msg, va_list ap)
@@ -362,7 +356,7 @@ void Logger::LogMessage(const char *vafmt, ...)
char date[32]; char date[32];
m_DailyPrintHdr = false; m_DailyPrintHdr = false;
strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime); strftime(date, sizeof(date), "%m/%d/%Y - %H:%M:%S", curtime);
fprintf(fp, "L %s: SourceMod log file session started (file \"L%04d%02d%02d.log\") (Version \"%s\")\n", date, curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday, SOURCEMOD_VERSION); fprintf(fp, "L %s: SourceMod log file session started (file \"L%04d%02d%02d.log\") (Version \"%s\")\n", date, curtime->tm_year + 1900, curtime->tm_mon + 1, curtime->tm_mday, SM_FULL_VERSION);
} }
va_list ap; va_list ap;
va_start(ap, vafmt); va_start(ap, vafmt);
+14 -45
View File
@@ -4,11 +4,9 @@
SMSDK = .. SMSDK = ..
HL2SDK_ORIG = ../../hl2sdk HL2SDK_ORIG = ../../hl2sdk
HL2SDK_OB = ../../hl2sdk-ob HL2SDK_OB = ../../hl2sdk-ob
HL2SDK_CSS = ../../hl2sdk-css
HL2SDK_OB_VALVE = ../../hl2sdk-ob-valve HL2SDK_OB_VALVE = ../../hl2sdk-ob-valve
HL2SDK_L4D = ../../hl2sdk-l4d HL2SDK_L4D = ../../hl2sdk-l4d
HL2SDK_L4D2 = ../../hl2sdk-l4d2 HL2SDK_L4D2 = ../../hl2sdk-l4d2
HL2SDK_CSGO = ../../hl2sdk-csgo
MMSOURCE = ../../mmsource-central MMSOURCE = ../../mmsource-central
##################################### #####################################
@@ -24,8 +22,8 @@ OBJECTS = AdminCache.cpp CDataPack.cpp ConCmdManager.cpp ConVarManager.cpp CoreC
frame_hooks.cpp concmd_cleaner.cpp NextMap.cpp \ frame_hooks.cpp concmd_cleaner.cpp NextMap.cpp \
NativeOwner.cpp logic_bridge.cpp ConsoleDetours.cpp NativeOwner.cpp logic_bridge.cpp ConsoleDetours.cpp
OBJECTS += smn_bitbuffer.cpp smn_console.cpp smn_core.cpp \ OBJECTS += smn_bitbuffer.cpp smn_console.cpp smn_core.cpp \
smn_database.cpp smn_entities.cpp smn_events.cpp \ smn_entities.cpp smn_events.cpp smn_fakenatives.cpp \
smn_fakenatives.cpp smn_filesystem.cpp smn_halflife.cpp \ smn_filesystem.cpp smn_halflife.cpp \
smn_keyvalues.cpp smn_player.cpp \ smn_keyvalues.cpp smn_player.cpp \
smn_usermsgs.cpp smn_menus.cpp smn_vector.cpp \ smn_usermsgs.cpp smn_menus.cpp smn_vector.cpp \
smn_hudtext.cpp smn_nextmap.cpp smn_hudtext.cpp smn_nextmap.cpp
@@ -50,7 +48,7 @@ CPP = gcc
override ENGSET = false override ENGSET = false
ifneq (,$(filter original orangebox css orangeboxvalve left4dead left4dead2 csgo,$(ENGINE))) ifneq (,$(filter original orangebox orangeboxvalve left4dead left4dead2,$(ENGINE)))
override ENGSET = true override ENGSET = true
endif endif
@@ -70,26 +68,19 @@ ifeq "$(ENGINE)" "orangebox"
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.ep2.so BINARY = sourcemod.2.ep2.so
endif endif
ifeq "$(ENGINE)" "css" ifeq "$(ENGINE)" "orangeboxvalve"
HL2SDK = $(HL2SDK_CSS) HL2SDK = $(HL2SDK_OB_VALVE)
HL2LIB = $(HL2SDK)/lib/linux HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=6 CFLAGS += -DSOURCE_ENGINE=6
METAMOD = $(MMSOURCE)/core METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.css.so #-I$(HL2SDK)/common
endif
ifeq "$(ENGINE)" "orangeboxvalve"
HL2SDK = $(HL2SDK_OB_VALVE)
HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=7
METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.ep2v.so BINARY = sourcemod.2.ep2v.so
endif endif
ifeq "$(ENGINE)" "left4dead" ifeq "$(ENGINE)" "left4dead"
HL2SDK = $(HL2SDK_L4D) HL2SDK = $(HL2SDK_L4D)
HL2LIB = $(HL2SDK)/lib/linux HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=8 CFLAGS += -DSOURCE_ENGINE=7
METAMOD = $(MMSOURCE)/core METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.l4d.so BINARY = sourcemod.2.l4d.so
@@ -97,19 +88,11 @@ endif
ifeq "$(ENGINE)" "left4dead2" ifeq "$(ENGINE)" "left4dead2"
HL2SDK = $(HL2SDK_L4D2) HL2SDK = $(HL2SDK_L4D2)
HL2LIB = $(HL2SDK)/lib/linux HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=9 CFLAGS += -DSOURCE_ENGINE=8
METAMOD = $(MMSOURCE)/core METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.l4d2.so BINARY = sourcemod.2.l4d2.so
endif endif
ifeq "$(ENGINE)" "csgo"
HL2SDK = $(HL2SDK_CSGO)
HL2LIB = $(HL2SDK)/lib/linux
CFLAGS += -DSOURCE_ENGINE=12
METAMOD = $(MMSOURCE)/core
INCLUDE += -I$(HL2SDK)/public/game/server
BINARY = sourcemod.2.csgo.so
endif
HL2PUB = $(HL2SDK)/public HL2PUB = $(HL2SDK)/public
@@ -131,37 +114,23 @@ ifneq (,$(filter original orangebox left4dead,$(ENGINE)))
LIB_SUFFIX = _i486.$(LIB_EXT) LIB_SUFFIX = _i486.$(LIB_EXT)
else else
LIB_PREFIX = lib LIB_PREFIX = lib
ifneq (,$(filter orangeboxvalve css,$(ENGINE))) LIB_SUFFIX = .$(LIB_EXT)
ifneq "$(OS)" "Darwin"
LIB_SUFFIX = _srv.$(LIB_EXT)
else
LIB_SUFFIX = .$(LIB_EXT)
endif
else
LIB_SUFFIX = .$(LIB_EXT)
endif
endif endif
CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \ CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_BLOODYGOODTIME=4 -DSE_EYE=5 \
-DSE_CSS=6 -DSE_ORANGEBOXVALVE=7 -DSE_LEFT4DEAD=8 -DSE_LEFT4DEAD2=9 -DSE_ALIENSWARM=10 \ -DSE_ORANGEBOXVALVE=6 -DSE_LEFT4DEAD=7 -DSE_LEFT4DEAD2=8 -DSE_ALIENSWARM=9
-DSE_PORTAL2=11 -DSE_CSGO=12
LINK += $(HL2LIB)/tier1_i486.a $(HL2LIB)/mathlib_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) \ LINK += $(HL2LIB)/tier1_i486.a $(HL2LIB)/mathlib_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) \
$(LIB_PREFIX)tier0$(LIB_SUFFIX) -static-libgcc $(LIB_PREFIX)tier0$(LIB_SUFFIX) -static-libgcc
ifeq "$(ENGINE)" "csgo"
LINK += $(HL2LIB)/interfaces_i486.a
endif
INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \ INCLUDE += -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/mathlib -I$(HL2PUB)/vstdlib \
-I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) -I$(METAMOD)/sourcehook \ -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) -I$(METAMOD)/sourcehook \
-I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
CFLAGS += -D_LINUX -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \ CFLAGS += -D_LINUX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Werror \ -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Werror \
-Wno-uninitialized -Wno-unused -Wno-switch -mfpmath=sse -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H \ -Wno-uninitialized -mfpmath=sse -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -DSM_DEFAULT_THREADER -m32
-DSM_DEFAULT_THREADER -m32 -DCOMPILER_GCC CPPFLAGS += -Wno-non-virtual-dtor -fno-exceptions -fno-rtti
CPPFLAGS += -Wno-non-virtual-dtor -Wno-overloaded-virtual -fno-threadsafe-statics -fno-exceptions -fno-rtti
################################################ ################################################
### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### ### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ###
@@ -199,7 +168,7 @@ all: check
check: check:
if [ "$(ENGSET)" = "false" ]; then \ if [ "$(ENGSET)" = "false" ]; then \
echo "You must supply one of the following values for ENGINE:"; \ echo "You must supply one of the following values for ENGINE:"; \
echo "csgo, left4dead2, left4dead, orangeboxvalve, css, orangebox, or original"; \ echo "left4dead2, left4dead, orangeboxvalve, orangebox, or original"; \
exit 1; \ exit 1; \
fi fi
+1 -10
View File
@@ -322,24 +322,15 @@ void BaseMenuStyle::ClientPressedKey(int client, unsigned int key_press)
if (pCollideable) if (pCollideable)
{ {
const Vector & pos = pCollideable->GetCollisionOrigin(); const Vector & pos = pCollideable->GetCollisionOrigin();
enginesound->EmitSound(filter, enginesound->EmitSound(filter,
client, client,
CHAN_AUTO, CHAN_AUTO,
#if SOURCE_ENGINE >= SE_PORTAL2
sound,
-1,
#endif
sound, sound,
VOL_NORM, VOL_NORM,
ATTN_NORM, ATTN_NORM,
#if SOURCE_ENGINE >= SE_PORTAL2
0,
#endif
0, 0,
PITCH_NORM, PITCH_NORM,
#if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_TF2
0,
#endif
&pos); &pos);
} }
} }
+4 -64
View File
@@ -39,28 +39,12 @@
#endif #endif
#include "logic_bridge.h" #include "logic_bridge.h"
#ifdef USE_PROTOBUF_USERMESSAGES
#include <google/protobuf/descriptor.h>
#endif
#if SOURCE_ENGINE == SE_CSGO
#include <game/shared/csgo/protobuf/cstrike15_usermessages.pb.h>
#endif
extern const char *g_RadioNumTable[]; extern const char *g_RadioNumTable[];
CRadioStyle g_RadioMenuStyle; CRadioStyle g_RadioMenuStyle;
int g_ShowMenuId = -1; int g_ShowMenuId = -1;
bool g_bRadioInit = false; bool g_bRadioInit = false;
unsigned int g_RadioMenuTimeout = 0; unsigned int g_RadioMenuTimeout = 0;
// back, next, exit
#define MAX_PAGINATION_OPTIONS 3
#define MAX_MENUSLOT_KEYS 10
static unsigned int s_RadioMaxPageItems = MAX_MENUSLOT_KEYS;
CRadioStyle::CRadioStyle() CRadioStyle::CRadioStyle()
{ {
m_players = new CRadioMenuPlayer[256+1]; m_players = new CRadioMenuPlayer[256+1];
@@ -106,18 +90,6 @@ void CRadioStyle::OnSourceModLevelChange(const char *mapName)
g_RadioMenuTimeout = 0; g_RadioMenuTimeout = 0;
} }
const char *items = g_pGameConf->GetKeyValue("RadioMenuMaxPageItems");
if (items != NULL)
{
int value = atoi(items);
// Only override the mostly-safe default if it's a sane value
if (value > MAX_PAGINATION_OPTIONS && value <= MAX_MENUSLOT_KEYS)
{
s_RadioMaxPageItems = value;
}
}
g_Menus.AddStyle(this); g_Menus.AddStyle(this);
g_Menus.SetDefaultStyle(this); g_Menus.SetDefaultStyle(this);
@@ -163,22 +135,13 @@ static unsigned int g_last_holdtime = 0;
static unsigned int g_last_client_count = 0; static unsigned int g_last_client_count = 0;
static int g_last_clients[256]; static int g_last_clients[256];
#ifdef USE_PROTOBUF_USERMESSAGES
void CRadioStyle::OnUserMessage(int msg_id, protobuf::Message &msg, IRecipientFilter *pFilter)
#else
void CRadioStyle::OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter) void CRadioStyle::OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
#endif
{ {
int count = pFilter->GetRecipientCount(); int count = pFilter->GetRecipientCount();
#ifdef USE_PROTOBUF_USERMESSAGES
int c = ((CCSUsrMsg_ShowMenu &)msg).display_time();
#else
bf_read br(bf->GetBasePointer(), 3); bf_read br(bf->GetBasePointer(), 3);
br.ReadWord(); br.ReadWord();
int c = br.ReadChar(); int c = br.ReadChar();
#endif
g_last_holdtime = (c == -1) ? 0 : (unsigned)c; g_last_holdtime = (c == -1) ? 0 : (unsigned)c;
@@ -226,7 +189,7 @@ IBaseMenu *CRadioStyle::CreateMenu(IMenuHandler *pHandler, IdentityToken_t *pOwn
unsigned int CRadioStyle::GetMaxPageItems() unsigned int CRadioStyle::GetMaxPageItems()
{ {
return s_RadioMaxPageItems; return 10;
} }
const char *CRadioStyle::GetStyleName() const char *CRadioStyle::GetStyleName()
@@ -344,7 +307,7 @@ unsigned int CRadioDisplay::GetCurrentKey()
bool CRadioDisplay::SetCurrentKey(unsigned int key) bool CRadioDisplay::SetCurrentKey(unsigned int key)
{ {
if (key < m_NextPos || m_NextPos > s_RadioMaxPageItems) if (key < m_NextPos || m_NextPos > 10)
{ {
return false; return false;
} }
@@ -380,7 +343,7 @@ void CRadioDisplay::DrawTitle(const char *text, bool onlyIfEmpty/* =false */)
unsigned int CRadioDisplay::DrawItem(const ItemDrawInfo &item) unsigned int CRadioDisplay::DrawItem(const ItemDrawInfo &item)
{ {
if (m_NextPos > s_RadioMaxPageItems || !CanDrawItem(item.style)) if (m_NextPos > 10 || !CanDrawItem(item.style))
{ {
return 0; return 0;
} }
@@ -489,15 +452,6 @@ void CRadioMenuPlayer::Radio_Refresh()
time = menuHoldTime - (unsigned int)(gpGlobals->curtime - menuStartTime); time = menuHoldTime - (unsigned int)(gpGlobals->curtime - menuStartTime);
} }
#ifdef USE_PROTOBUF_USERMESSAGES
// If or when we need to support multiple games per engine with this, we can switch to reflection
// TODO: find what happens past 240 on CS:GO
CCSUsrMsg_ShowMenu *msg = (CCSUsrMsg_ShowMenu *)g_UserMsgs.StartProtobufMessage(g_ShowMenuId, players, 1, USERMSG_BLOCKHOOKS);
msg->set_bits_valid_slots(display_keys);
msg->set_display_time(time);
msg->set_menu_string(ptr);
g_UserMsgs.EndMessage();
#else
while (true) while (true)
{ {
if (len > 240) if (len > 240)
@@ -505,8 +459,7 @@ void CRadioMenuPlayer::Radio_Refresh()
save = ptr[240]; save = ptr[240];
ptr[240] = '\0'; ptr[240] = '\0';
} }
bf_write *buffer = g_UserMsgs.StartMessage(g_ShowMenuId, players, 1, USERMSG_BLOCKHOOKS);
bf_write *buffer = g_UserMsgs.StartBitBufMessage(g_ShowMenuId, players, 1, USERMSG_BLOCKHOOKS);
buffer->WriteWord(display_keys); buffer->WriteWord(display_keys);
buffer->WriteChar(time ? time : -1); buffer->WriteChar(time ? time : -1);
buffer->WriteByte( (len > 240) ? 1 : 0 ); buffer->WriteByte( (len > 240) ? 1 : 0 );
@@ -523,7 +476,6 @@ void CRadioMenuPlayer::Radio_Refresh()
break; break;
} }
} }
#endif
display_last_refresh = gpGlobals->curtime; display_last_refresh = gpGlobals->curtime;
} }
@@ -559,7 +511,6 @@ unsigned int CRadioDisplay::GetApproxMemUsage()
CRadioMenu::CRadioMenu(IMenuHandler *pHandler, IdentityToken_t *pOwner) : CRadioMenu::CRadioMenu(IMenuHandler *pHandler, IdentityToken_t *pOwner) :
CBaseMenu(pHandler, &g_RadioMenuStyle, pOwner) CBaseMenu(pHandler, &g_RadioMenuStyle, pOwner)
{ {
m_Pagination = s_RadioMaxPageItems - MAX_PAGINATION_OPTIONS;
} }
bool CRadioMenu::SetExtOption(MenuOption option, const void *valuePtr) bool CRadioMenu::SetExtOption(MenuOption option, const void *valuePtr)
@@ -600,17 +551,6 @@ bool CRadioMenu::DisplayAtItem(int client,
time); time);
} }
bool CRadioMenu::SetPagination(unsigned int itemsPerPage)
{
const unsigned int maxPerPage = s_RadioMaxPageItems - MAX_PAGINATION_OPTIONS;
if (itemsPerPage > maxPerPage)
{
return false;
}
return CBaseMenu::SetPagination(itemsPerPage);
}
void CRadioMenu::Cancel_Finally() void CRadioMenu::Cancel_Finally()
{ {
g_RadioMenuStyle.CancelMenu(this); g_RadioMenuStyle.CancelMenu(this);
+2 -11
View File
@@ -37,7 +37,7 @@
#include "MenuStyle_Base.h" #include "MenuStyle_Base.h"
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include <IPlayerHelpers.h> #include <IPlayerHelpers.h>
#include "UserMessages.h" #include <IUserMessages.h>
#include "sm_fastlink.h" #include "sm_fastlink.h"
#include <sh_stack.h> #include <sh_stack.h>
#include <compat_wrappers.h> #include <compat_wrappers.h>
@@ -65,11 +65,7 @@ private:
class CRadioStyle : class CRadioStyle :
public BaseMenuStyle, public BaseMenuStyle,
public SMGlobalClass, public SMGlobalClass,
#ifdef USE_PROTOBUF_USERMESSAGES public IUserMessageListener
public IProtobufUserMessageListener
#else
public IBitBufUserMessageListener
#endif
{ {
public: public:
CRadioStyle(); CRadioStyle();
@@ -88,11 +84,7 @@ public: //IMenuStyle
unsigned int GetMaxPageItems(); unsigned int GetMaxPageItems();
unsigned int GetApproxMemUsage(); unsigned int GetApproxMemUsage();
public: //IUserMessageListener public: //IUserMessageListener
#ifdef USE_PROTOBUF_USERMESSAGES
void OnUserMessage(int msg_id, protobuf::Message &msg, IRecipientFilter *pFilter);
#else
void OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter); void OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
#endif
void OnUserMessageSent(int msg_id); void OnUserMessageSent(int msg_id);
public: public:
bool IsSupported(); bool IsSupported();
@@ -150,7 +142,6 @@ public:
unsigned int time, unsigned int time,
unsigned int start_item, unsigned int start_item,
IMenuHandler *alt_handler/* =NULL */); IMenuHandler *alt_handler/* =NULL */);
bool SetPagination(unsigned int itemsPerPage);
void Cancel_Finally(); void Cancel_Finally();
unsigned int GetApproxMemUsage(); unsigned int GetApproxMemUsage();
}; };
+2 -2
View File
@@ -518,7 +518,7 @@ void VoteMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int ite
m_Votes[item]++; m_Votes[item]++;
m_NumVotes++; m_NumVotes++;
if (sm_vote_chat.GetBool() || sm_vote_console.GetBool() || sm_vote_client_console.GetBool()) if (sm_vote_chat.GetBool() || sm_vote_console.GetBool())
{ {
static char buffer[1024]; static char buffer[1024];
ItemDrawInfo dr; ItemDrawInfo dr;
@@ -560,7 +560,7 @@ void VoteMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int ite
if (sm_vote_client_console.GetBool()) if (sm_vote_client_console.GetBool())
{ {
ClientConsolePrint(pPlayer->GetEdict(), buffer); engine->ClientPrintf(pPlayer->GetEdict(), buffer);
} }
} }
} }
+5 -6
View File
@@ -31,7 +31,6 @@
#include "NextMap.h" #include "NextMap.h"
#include "Logger.h" #include "Logger.h"
#include "HalfLife2.h"
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include "sm_stringutil.h" #include "sm_stringutil.h"
#include "sourcehook.h" #include "sourcehook.h"
@@ -110,7 +109,7 @@ const char *NextMapManager::GetNextMap()
bool NextMapManager::SetNextMap(const char *map) bool NextMapManager::SetNextMap(const char *map)
{ {
if (!g_HL2.IsMapValid(map)) if (!engine->IsMapValid(map))
{ {
return false; return false;
} }
@@ -134,7 +133,7 @@ void NextMapManager::HookChangeLevel(const char *map, const char *unknown, const
const char *newmap = sm_nextmap.GetString(); const char *newmap = sm_nextmap.GetString();
if (newmap[0] == 0 || !g_HL2.IsMapValid(newmap)) if (newmap[0] == 0 || !engine->IsMapValid(newmap))
{ {
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
@@ -184,14 +183,14 @@ void NextMapManager::OnSourceModLevelChange( const char *mapName )
m_tempChangeInfo.m_mapName[0] ='\0'; m_tempChangeInfo.m_mapName[0] ='\0';
m_tempChangeInfo.m_changeReason[0] = '\0'; m_tempChangeInfo.m_changeReason[0] = '\0';
m_tempChangeInfo.startTime = time(NULL); m_tempChangeInfo.startTime = time(NULL);
UTIL_Format(lastMap, sizeof(lastMap), "%s", mapName); UTIL_Format(lastMap, sizeof(lastMap), mapName);
} }
void NextMapManager::ForceChangeLevel( const char *mapName, const char* changeReason ) void NextMapManager::ForceChangeLevel( const char *mapName, const char* changeReason )
{ {
/* Store the mapname and reason */ /* Store the mapname and reason */
UTIL_Format(m_tempChangeInfo.m_mapName, sizeof(m_tempChangeInfo.m_mapName), "%s", mapName); UTIL_Format(m_tempChangeInfo.m_mapName, sizeof(m_tempChangeInfo.m_mapName), mapName);
UTIL_Format(m_tempChangeInfo.m_changeReason, sizeof(m_tempChangeInfo.m_changeReason), "%s", changeReason); UTIL_Format(m_tempChangeInfo.m_changeReason, sizeof(m_tempChangeInfo.m_changeReason), changeReason);
/* Change level and skip our hook */ /* Change level and skip our hook */
g_forcedChange = true; g_forcedChange = true;
+1 -1
View File
@@ -53,7 +53,7 @@ struct MapChangeData
startTime = 0; startTime = 0;
} }
char m_mapName[PLATFORM_MAX_PATH]; char m_mapName[32];
char m_changeReason[100]; char m_changeReason[100];
time_t startTime; time_t startTime;
}; };
+27 -155
View File
@@ -44,6 +44,7 @@
#include "HalfLife2.h" #include "HalfLife2.h"
#include <inetchannel.h> #include <inetchannel.h>
#include <iclient.h> #include <iclient.h>
#include <tier0/icommandline.h>
#include <IGameConfigs.h> #include <IGameConfigs.h>
#include "ExtensionSys.h" #include "ExtensionSys.h"
#include <sourcemod_version.h> #include <sourcemod_version.h>
@@ -116,8 +117,6 @@ PlayerManager::PlayerManager()
m_SourceTVUserId = -1; m_SourceTVUserId = -1;
m_ReplayUserId = -1; m_ReplayUserId = -1;
m_bAuthstringValidation = false; // don't use steam auth by default... yet
m_UserIdLookUp = new int[USHRT_MAX+1]; m_UserIdLookUp = new int[USHRT_MAX+1];
memset(m_UserIdLookUp, 0, sizeof(int) * (USHRT_MAX+1)); memset(m_UserIdLookUp, 0, sizeof(int) * (USHRT_MAX+1));
} }
@@ -231,17 +230,6 @@ ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key,
return ConfigResult_Reject; return ConfigResult_Reject;
} }
return ConfigResult_Accept; return ConfigResult_Accept;
} else if (strcmp( key, "SteamAuthstringValidation" ) == 0) {
if (strcasecmp(value, "yes") == 0)
{
m_bAuthstringValidation = true;
} else if ( strcasecmp(value, "no") == 0) {
m_bAuthstringValidation = false;
} else {
UTIL_Format(error, maxlength, "Invalid value: must be \"yes\" or \"no\"");
return ConfigResult_Reject;
}
return ConfigResult_Accept;
} }
return ConfigResult_Ignore; return ConfigResult_Ignore;
} }
@@ -249,17 +237,16 @@ ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key,
void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax) void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
{ {
static ConVar *tv_enable = icvar->FindVar("tv_enable"); static ConVar *tv_enable = icvar->FindVar("tv_enable");
#if SOURCE_ENGINE == SE_TF2 #if SOURCE_ENGINE == SE_ORANGEBOXVALVE
static ConVar *replay_enable = icvar->FindVar("replay_enable"); static ConVar *replay_enable = icvar->FindVar("replay_enable");
#endif #endif
// clientMax will not necessarily be correct here (such as on late SourceTV enable) // clientMax will not necessarily be correct here (such as on late SourceTV enable)
m_maxClients = gpGlobals->maxClients; m_maxClients = gpGlobals->maxClients;
ICommandLine *commandLine = g_HL2.GetValveCommandLine(); m_bIsSourceTVActive = (tv_enable && tv_enable->GetBool() && CommandLine()->FindParm("-nohltv") == 0);
m_bIsSourceTVActive = (tv_enable && tv_enable->GetBool() && (!commandLine || commandLine->FindParm("-nohltv") == 0));
m_bIsReplayActive = false; m_bIsReplayActive = false;
#if SOURCE_ENGINE == SE_TF2 #if SOURCE_ENGINE == SE_ORANGEBOXVALVE
m_bIsReplayActive = (replay_enable && replay_enable->GetBool()); m_bIsReplayActive = (replay_enable && replay_enable->GetBool());
#endif #endif
m_PlayersSinceActive = 0; m_PlayersSinceActive = 0;
@@ -276,9 +263,9 @@ void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int cl
memset(m_AuthQueue, 0, sizeof(unsigned int) * (ABSOLUTE_PLAYER_LIMIT + 1)); memset(m_AuthQueue, 0, sizeof(unsigned int) * (ABSOLUTE_PLAYER_LIMIT + 1));
g_NumPlayersToAuth = &m_AuthQueue[0]; g_NumPlayersToAuth = &m_AuthQueue[0];
}
g_PluginSys.SyncMaxClients(m_maxClients); g_PluginSys.SyncMaxClients(m_maxClients);
}
g_OnMapStarted = true; g_OnMapStarted = true;
@@ -367,18 +354,11 @@ void PlayerManager::RunAuthChecks()
{ {
pPlayer = &m_Players[m_AuthQueue[i]]; pPlayer = &m_Players[m_AuthQueue[i]];
authstr = engine->GetPlayerNetworkIDString(pPlayer->m_pEdict); authstr = engine->GetPlayerNetworkIDString(pPlayer->m_pEdict);
pPlayer->SetAuthString(authstr);
if (!pPlayer->IsAuthStringValidated())
{
continue; // we're using steam auth, and steam doesn't know about this player yet so we can't do anything about them for now
}
if (authstr && authstr[0] != '\0' if (authstr && authstr[0] != '\0'
&& (strcmp(authstr, "STEAM_ID_PENDING") != 0)) && (strcmp(authstr, "STEAM_ID_PENDING") != 0))
{ {
/* Set authorization */ /* Set authorization */
pPlayer->Authorize(); pPlayer->Authorize(authstr);
/* Mark as removed from queue */ /* Mark as removed from queue */
unsigned int client = m_AuthQueue[i]; unsigned int client = m_AuthQueue[i];
@@ -471,7 +451,7 @@ bool PlayerManager::OnClientConnect(edict_t *pEntity, const char *pszName, const
pListener = (*iter); pListener = (*iter);
if (!pListener->InterceptClientConnect(client, reject, maxrejectlen)) if (!pListener->InterceptClientConnect(client, reject, maxrejectlen))
{ {
RETURN_META_VALUE(MRES_SUPERCEDE, false); return false;
} }
} }
@@ -553,8 +533,7 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
/* Run manual connection routines */ /* Run manual connection routines */
char error[255]; char error[255];
const char *authid = engine->GetPlayerNetworkIDString(pEntity); const char *authid = engine->GetPlayerNetworkIDString(pEntity);
pPlayer->SetAuthString(authid); pPlayer->Authorize(authid);
pPlayer->Authorize();
pPlayer->m_bFakeClient = true; pPlayer->m_bFakeClient = true;
/* /*
@@ -565,34 +544,15 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
* Checking playerinfo's IsHLTV and IsReplay would be better and less * Checking playerinfo's IsHLTV and IsReplay would be better and less
* error-prone but will always show false until later in the frame, * error-prone but will always show false until later in the frame,
* after PutInServer and Activate, and we want it now! * after PutInServer and Activate, and we want it now!
*
* These checks are hairy as hell due to differences between engines and games.
*
* Most engines use "Replay" and "SourceTV" as bot names for these when they're
* created. EP2V, CSS and Nuclear Dawn (but not L4D2) differ from this by now using
* replay_/tv_name directly when creating the bot(s). To complicate it slightly
* further, the cvar can be empty and the engine's fallback to "unnamed" will be used.
* We can maybe just rip out the name checks at some point and rely solely on whether
* they're enabled and the join order.
*/ */
// This doesn't actually get incremented until OnClientConnect. Fake it to check. // This doesn't actually get incremented until OnClientConnect. Fake it to check.
int newCount = m_PlayersSinceActive + 1; int newCount = m_PlayersSinceActive + 1;
int userId = engine->GetPlayerUserId(pEntity); int userId = engine->GetPlayerUserId(pEntity);
#if (SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_TF2 || SOURCE_ENGINE == SE_NUCLEARDAWN || SOURCE_ENGINE == SE_LEFT4DEAD2)
static ConVar *tv_name = icvar->FindVar("tv_name");
#endif
#if SOURCE_ENGINE == SE_TF2
static ConVar *replay_name = icvar->FindVar("replay_name");
#endif
#if SOURCE_ENGINE == SE_TF2 #if SOURCE_ENGINE == SE_ORANGEBOXVALVE
if (m_bIsReplayActive && newCount == 1 if (m_bIsReplayActive && newCount == 1
&& (m_ReplayUserId == userId && (m_ReplayUserId == userId || strcmp(playername, "Replay") == 0))
|| (replay_name && strcmp(playername, replay_name->GetString()) == 0) || (replay_name && replay_name->GetString()[0] == 0 && strcmp(playername, "unnamed") == 0)
)
)
{ {
pPlayer->m_bIsReplay = true; pPlayer->m_bIsReplay = true;
m_ReplayUserId = userId; m_ReplayUserId = userId;
@@ -602,15 +562,7 @@ void PlayerManager::OnClientPutInServer(edict_t *pEntity, const char *playername
if (m_bIsSourceTVActive if (m_bIsSourceTVActive
&& ((!m_bIsReplayActive && newCount == 1) && ((!m_bIsReplayActive && newCount == 1)
|| (m_bIsReplayActive && newCount == 2)) || (m_bIsReplayActive && newCount == 2))
&& (m_SourceTVUserId == userId && (m_SourceTVUserId == userId || strcmp(playername, "SourceTV") == 0)
#if SOURCE_ENGINE == SE_CSGO
|| strcmp(playername, "GOTV") == 0
#elif (SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_TF2 || SOURCE_ENGINE == SE_NUCLEARDAWN)
|| (tv_name && strcmp(playername, tv_name->GetString()) == 0) || (tv_name && tv_name->GetString()[0] == 0 && strcmp(playername, "unnamed") == 0)
#else
|| strcmp(playername, "SourceTV") == 0
#endif
)
) )
{ {
pPlayer->m_bIsSourceTV = true; pPlayer->m_bIsSourceTV = true;
@@ -793,30 +745,23 @@ void PlayerManager::OnClientCommand(edict_t *pEntity)
g_PluginSys.ListPluginsToClient(pPlayer, args); g_PluginSys.ListPluginsToClient(pPlayer, args);
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
else if (args.ArgC() > 1 && strcmp(args.Arg(1), "exts") == 0)
{
g_Extensions.ListExtensionsToClient(pPlayer, args);
RETURN_META(MRES_SUPERCEDE);
}
else if (args.ArgC() > 1 && strcmp(args.Arg(1), "credits") == 0) else if (args.ArgC() > 1 && strcmp(args.Arg(1), "credits") == 0)
{ {
ClientConsolePrint(pEntity,
"SourceMod would not be possible without:");
ClientConsolePrint(pEntity,
" David \"BAILOPAN\" Anderson, Matt \"pRED\" Woodrow");
ClientConsolePrint(pEntity,
" Scott \"DS\" Ehlert, Fyren");
ClientConsolePrint(pEntity,
" Nicholas \"psychonic\" Hastings, Asher \"asherkin\" Baker");
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
" Borja \"faluco\" Ferrer, Pavol \"PM OnoTo\" Marko"); "SourceMod would not be possible without:");
ClientConsolePrint(pEntity,
" David \"BAILOPAN\" Anderson, Borja \"faluco\" Ferrer");
ClientConsolePrint(pEntity,
" Scott \"DS\" Ehlert, Matt \"pRED\" Woodrow");
ClientConsolePrint(pEntity,
" Michael \"ferret\" McKoy, Pavol \"PM OnoTo\" Marko");
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
"SourceMod is open source under the GNU General Public License."); "SourceMod is open source under the GNU General Public License.");
RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
"SourceMod %s, by AlliedModders LLC", SOURCEMOD_VERSION); "SourceMod %s, by AlliedModders LLC", SM_FULL_VERSION);
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
"To see running plugins, type \"sm plugins\""); "To see running plugins, type \"sm plugins\"");
ClientConsolePrint(pEntity, ClientConsolePrint(pEntity,
@@ -909,19 +854,6 @@ void PlayerManager::OnClientSettingsChanged(edict_t *pEntity)
const char *new_name = info ? info->GetName() : engine->GetClientConVarValue(client, "name"); const char *new_name = info ? info->GetName() : engine->GetClientConVarValue(client, "name");
const char *old_name = pPlayer->m_Name.c_str(); const char *old_name = pPlayer->m_Name.c_str();
#if SOURCE_ENGINE >= SE_LEFT4DEAD
const char *networkid_force;
if ((networkid_force = engine->GetClientConVarValue(client, "networkid_force")) && networkid_force[0] != '\0')
{
unsigned int accountId = pPlayer->GetSteamAccountID();
g_Logger.LogMessage("\"%s<%d><STEAM_1:%d:%d><>\" has bad networkid (id \"%s\") (ip \"%s\")",
new_name, pPlayer->GetUserId(), accountId & 1, accountId >> 1, networkid_force, pPlayer->GetIPAddress());
pPlayer->Kick("NetworkID spoofing detected.");
RETURN_META(MRES_IGNORED);
}
#endif
if (strcmp(old_name, new_name) != 0) if (strcmp(old_name, new_name) != 0)
{ {
AdminId id = g_Admins.FindAdminByIdentity("name", new_name); AdminId id = g_Admins.FindAdminByIdentity("name", new_name);
@@ -929,9 +861,7 @@ void PlayerManager::OnClientSettingsChanged(edict_t *pEntity)
{ {
if (!CheckSetAdminName(client, pPlayer, id)) if (!CheckSetAdminName(client, pPlayer, id))
{ {
char kickMsg[128]; pPlayer->Kick("Your name is reserved by SourceMod; set your password to use it.");
logicore.CoreTranslate(kickMsg, sizeof(kickMsg), "%T", 2, NULL, "Name Reserved", &client);
pPlayer->Kick(kickMsg);
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
} else if ((id = g_Admins.FindAdminByIdentity("name", old_name)) != INVALID_ADMIN_ID) { } else if ((id = g_Admins.FindAdminByIdentity("name", old_name)) != INVALID_ADMIN_ID) {
@@ -1259,12 +1189,11 @@ void PlayerManager::ProcessCommandTarget(cmd_target_info_t *info)
{ {
continue; continue;
} }
if (!pTarget->IsConnected()) if (!pTarget->IsConnected() || !pTarget->IsAuthorized())
{ {
continue; continue;
} }
const char *authstr = pTarget->GetAuthString(false); // We want to make it easy for people to be kicked/banned, so don't require validation for command targets. if (strcmp(pTarget->GetAuthString(), new_pattern) == 0)
if (authstr && strcmp(authstr, new_pattern) == 0)
{ {
if ((info->reason = FilterCommandTarget(pAdmin, pTarget, info->flags)) if ((info->reason = FilterCommandTarget(pAdmin, pTarget, info->flags))
== COMMAND_TARGET_VALID) == COMMAND_TARGET_VALID)
@@ -1374,7 +1303,7 @@ void PlayerManager::ProcessCommandTarget(cmd_target_info_t *info)
if ((info->flags & COMMAND_FILTER_NO_BOTS) == COMMAND_FILTER_NO_BOTS) if ((info->flags & COMMAND_FILTER_NO_BOTS) == COMMAND_FILTER_NO_BOTS)
{ {
info->num_targets = 0; info->num_targets = 0;
info->reason = COMMAND_TARGET_NOT_HUMAN; info->reason = COMMAND_FILTER_NO_BOTS;
return; return;
} }
strncopy(info->target_name, "all bots", info->target_name_maxlength); strncopy(info->target_name, "all bots", info->target_name_maxlength);
@@ -1577,7 +1506,6 @@ CPlayer::CPlayer()
m_bIsSourceTV = false; m_bIsSourceTV = false;
m_bIsReplay = false; m_bIsReplay = false;
m_Serial.value = -1; m_Serial.value = -1;
m_SteamAccountID = 0;
} }
void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity) void CPlayer::Initialize(const char *name, const char *ip, edict_t *pEntity)
@@ -1623,20 +1551,15 @@ void CPlayer::Connect()
} }
} }
void CPlayer::SetAuthString(const char *steamid) void CPlayer::Authorize(const char *steamid)
{ {
if (m_IsAuthorized) if (m_IsAuthorized)
{ {
return; return;
} }
m_AuthID.assign(steamid);
}
// Ensure a valid AuthString is set before calling.
void CPlayer::Authorize()
{
m_IsAuthorized = true; m_IsAuthorized = true;
m_AuthID.assign(steamid);
} }
void CPlayer::Disconnect() void CPlayer::Disconnect()
@@ -1657,7 +1580,6 @@ void CPlayer::Disconnect()
m_bIsSourceTV = false; m_bIsSourceTV = false;
m_bIsReplay = false; m_bIsReplay = false;
m_Serial.value = -1; m_Serial.value = -1;
m_SteamAccountID = 0;
} }
void CPlayer::SetName(const char *name) void CPlayer::SetName(const char *name)
@@ -1680,45 +1602,11 @@ const char *CPlayer::GetIPAddress()
return m_Ip.c_str(); return m_Ip.c_str();
} }
const char *CPlayer::GetAuthString(bool validated) const char *CPlayer::GetAuthString()
{ {
if (validated && !IsAuthStringValidated())
{
return NULL;
}
return m_AuthID.c_str(); return m_AuthID.c_str();
} }
unsigned int CPlayer::GetSteamAccountID(bool validated)
{
if (IsFakeClient() || (validated && !IsAuthStringValidated()))
{
return 0;
}
if (m_SteamAccountID != 0)
{
return m_SteamAccountID;
}
#if SOURCE_ENGINE < SE_ORANGEBOX
const char * pAuth = GetAuthString();
/* STEAM_0:1:123123 | STEAM_ID_LAN | STEAM_ID_PENDING */
if (pAuth && (strlen(pAuth) > 10) && pAuth[8] != '_')
{
m_SteamAccountID = (atoi(&pAuth[8]) | (atoi(&pAuth[10]) << 1));
}
#else
unsigned long long *steamId = (unsigned long long *)engine->GetClientSteamID(m_pEdict);
if (steamId)
{
m_SteamAccountID = (*steamId & 0xFFFFFFFF);
}
#endif
return m_SteamAccountID;
}
edict_t *CPlayer::GetEdict() edict_t *CPlayer::GetEdict()
{ {
return m_pEdict; return m_pEdict;
@@ -1744,18 +1632,6 @@ bool CPlayer::IsAuthorized()
return m_IsAuthorized; return m_IsAuthorized;
} }
bool CPlayer::IsAuthStringValidated()
{
#if SOURCE_ENGINE >= SE_ORANGEBOX
if (g_Players.m_bAuthstringValidation && !g_HL2.IsLANServer())
{
return engine->IsClientFullyAuthenticated(m_pEdict);
}
#endif
return true;
}
IPlayerInfo *CPlayer::GetPlayerInfo() IPlayerInfo *CPlayer::GetPlayerInfo()
{ {
if (m_pEdict->GetUnknown()) if (m_pEdict->GetUnknown())
@@ -1830,11 +1706,7 @@ void CPlayer::Kick(const char *str)
else else
{ {
IClient *pClient = static_cast<IClient *>(pNetChan->GetMsgHandler()); IClient *pClient = static_cast<IClient *>(pNetChan->GetMsgHandler());
#if SOURCE_ENGINE == SE_CSGO
pClient->Disconnect(str);
#else
pClient->Disconnect("%s", str); pClient->Disconnect("%s", str);
#endif
} }
} }
+3 -8
View File
@@ -56,7 +56,7 @@ union serial_t
uint32_t value; uint32_t value;
struct struct
{ {
uint32_t index : 8; uint8_t index;
uint32_t serial : 24; uint32_t serial : 24;
} bits; } bits;
}; };
@@ -69,8 +69,7 @@ public:
public: public:
const char *GetName(); const char *GetName();
const char *GetIPAddress(); const char *GetIPAddress();
const char *GetAuthString(bool validated = true); const char *GetAuthString();
unsigned int GetSteamAccountID(bool validated = true);
edict_t *GetEdict(); edict_t *GetEdict();
bool IsInGame(); bool IsInGame();
bool WasCountedAsInGame(); bool WasCountedAsInGame();
@@ -100,11 +99,9 @@ private:
void Disconnect(); void Disconnect();
void SetName(const char *name); void SetName(const char *name);
void DumpAdmin(bool deleting); void DumpAdmin(bool deleting);
void SetAuthString(const char *auth); void Authorize(const char *auth);
void Authorize();
void Authorize_Post(); void Authorize_Post();
void DoPostConnectAuthorization(); void DoPostConnectAuthorization();
bool IsAuthStringValidated();
private: private:
bool m_IsConnected; bool m_IsConnected;
bool m_IsInGame; bool m_IsInGame;
@@ -127,7 +124,6 @@ private:
bool m_bIsSourceTV; bool m_bIsSourceTV;
bool m_bIsReplay; bool m_bIsReplay;
serial_t m_Serial; serial_t m_Serial;
unsigned int m_SteamAccountID;
}; };
class PlayerManager : class PlayerManager :
@@ -221,7 +217,6 @@ private:
unsigned int *m_AuthQueue; unsigned int *m_AuthQueue;
String m_PassInfoVar; String m_PassInfoVar;
bool m_QueryLang; bool m_QueryLang;
bool m_bAuthstringValidation; // are we validating admins with steam before authorizing?
bool m_bIsListenServer; bool m_bIsListenServer;
int m_ListenClient; int m_ListenClient;
bool m_bIsSourceTVActive; bool m_bIsSourceTVActive;
+91 -108
View File
@@ -501,14 +501,14 @@ void CPlugin::SetSilentlyFailed(bool sf)
m_bSilentlyFailed = sf; m_bSilentlyFailed = sf;
} }
void CPlugin::LibraryActions(LibraryAction action) void CPlugin::LibraryActions(bool dropping)
{ {
List<String>::iterator iter; List<String>::iterator iter;
for (iter = m_Libraries.begin(); for (iter = m_Libraries.begin();
iter != m_Libraries.end(); iter != m_Libraries.end();
iter++) iter++)
{ {
g_PluginSys.OnLibraryAction((*iter).c_str(), action); g_PluginSys.OnLibraryAction((*iter).c_str(), true, dropping);
} }
} }
@@ -523,7 +523,7 @@ bool CPlugin::SetPauseState(bool paused)
if (paused) if (paused)
{ {
LibraryActions(LibraryAction_Removed); LibraryActions(true);
} }
IPluginFunction *pFunction = m_pRuntime->GetFunctionByName("OnPluginPauseChange"); IPluginFunction *pFunction = m_pRuntime->GetFunctionByName("OnPluginPauseChange");
@@ -547,7 +547,7 @@ bool CPlugin::SetPauseState(bool paused)
if (!paused) if (!paused)
{ {
LibraryActions(LibraryAction_Added); LibraryActions(false);
} }
return true; return true;
@@ -789,8 +789,6 @@ CPluginManager::CPluginManager()
m_AllPluginsLoaded = false; m_AllPluginsLoaded = false;
m_MyIdent = NULL; m_MyIdent = NULL;
m_LoadingLocked = false; m_LoadingLocked = false;
m_bBlockBadPlugins = true;
} }
CPluginManager::~CPluginManager() CPluginManager::~CPluginManager()
@@ -1007,14 +1005,11 @@ LoadRes CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool de
pPlugin->m_pRuntime = g_pSourcePawn2->LoadPlugin(co, fullpath, &err); pPlugin->m_pRuntime = g_pSourcePawn2->LoadPlugin(co, fullpath, &err);
if (pPlugin->m_pRuntime == NULL) if (pPlugin->m_pRuntime == NULL)
{ {
if (error) UTIL_Format(error,
{ maxlength,
UTIL_Format(error, "Unable to load plugin (error %d: %s)",
maxlength, err,
"Unable to load plugin (error %d: %s)", g_pSourcePawn2->GetErrorString(err));
err,
g_pSourcePawn2->GetErrorString(err));
}
pPlugin->m_status = Plugin_BadLoad; pPlugin->m_status = Plugin_BadLoad;
} }
else else
@@ -1025,45 +1020,7 @@ LoadRes CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool de
} }
else else
{ {
if (error) UTIL_Format(error, maxlength, "%s", pPlugin->m_errormsg);
{
UTIL_Format(error, maxlength, "%s", pPlugin->m_errormsg);
}
}
}
}
if (pPlugin->GetStatus() == Plugin_Created)
{
unsigned char *pCodeHash = pPlugin->m_pRuntime->GetCodeHash();
char codeHashBuf[40];
UTIL_Format(codeHashBuf, 40, "plugin_");
for (int i = 0; i < 16; i++)
UTIL_Format(codeHashBuf + 7 + (i * 2), 3, "%02x", pCodeHash[i]);
const char *bulletinUrl = g_pGameConf->GetKeyValue(codeHashBuf);
if (bulletinUrl != NULL)
{
if (m_bBlockBadPlugins)
{
if (error)
{
if (bulletinUrl[0] != '\0')
{
UTIL_Format(error, maxlength, "Known malware detected and blocked. See %s for more info", bulletinUrl);
} else {
UTIL_Format(error, maxlength, "Possible malware or illegal plugin detected and blocked");
}
}
pPlugin->m_status = Plugin_BadLoad;
} else {
if (bulletinUrl[0] != '\0')
{
g_Logger.LogMessage("%s: Known malware detected. See %s for more info, blocking disabled in core.cfg", pPlugin->GetFilename(), bulletinUrl);
} else {
g_Logger.LogMessage("%s: Possible malware or illegal plugin detected, blocking disabled in core.cfg", pPlugin->GetFilename());
}
} }
} }
} }
@@ -1166,7 +1123,7 @@ void CPluginManager::LoadAutoPlugin(const char *plugin)
if ((res=_LoadPlugin(&pl, plugin, false, PluginType_MapUpdated, error, sizeof(error))) == LoadRes_Failure) if ((res=_LoadPlugin(&pl, plugin, false, PluginType_MapUpdated, error, sizeof(error))) == LoadRes_Failure)
{ {
g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s.", plugin, error); g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s", plugin, error);
pl->SetErrorState( pl->SetErrorState(
pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(), pl->GetStatus() <= Plugin_Created ? Plugin_BadLoad : pl->GetStatus(),
"%s", "%s",
@@ -1495,7 +1452,7 @@ bool CPluginManager::RunSecondPass(CPlugin *pPlugin, char *error, size_t maxleng
s_iter != pPlugin->m_Libraries.end(); s_iter != pPlugin->m_Libraries.end();
s_iter++) s_iter++)
{ {
OnLibraryAction((*s_iter).c_str(), LibraryAction_Added); OnLibraryAction((*s_iter).c_str(), true, false);
} }
/* :TODO: optimize? does this even matter? */ /* :TODO: optimize? does this even matter? */
@@ -1547,9 +1504,7 @@ void CPluginManager::TryRefreshDependencies(CPlugin *pPlugin)
{ {
break; break;
} }
if (native->status == SP_NATIVE_UNBOUND if (native->status == SP_NATIVE_UNBOUND && !(native->flags & SP_NTVFLAG_OPTIONAL))
&& native->name[0] != '@'
&& !(native->flags & SP_NTVFLAG_OPTIONAL))
{ {
pPlugin->SetErrorState(Plugin_Error, "Native not found: %s", native->name); pPlugin->SetErrorState(Plugin_Error, "Native not found: %s", native->name);
return; return;
@@ -1597,7 +1552,7 @@ bool CPluginManager::UnloadPlugin(IPlugin *plugin)
s_iter != pPlugin->m_Libraries.end(); s_iter != pPlugin->m_Libraries.end();
s_iter++) s_iter++)
{ {
OnLibraryAction((*s_iter).c_str(), LibraryAction_Removed); OnLibraryAction((*s_iter).c_str(), true, true);
} }
List<IPluginsListener *>::iterator iter; List<IPluginsListener *>::iterator iter;
@@ -1605,15 +1560,14 @@ bool CPluginManager::UnloadPlugin(IPlugin *plugin)
if (pPlugin->GetStatus() <= Plugin_Error) if (pPlugin->GetStatus() <= Plugin_Error)
{ {
/* Notify plugin */
pPlugin->Call_OnPluginEnd();
/* Notify listeners of unloading */ /* Notify listeners of unloading */
for (iter=m_listeners.begin(); iter!=m_listeners.end(); iter++) for (iter=m_listeners.begin(); iter!=m_listeners.end(); iter++)
{ {
pListener = (*iter); pListener = (*iter);
pListener->OnPluginUnloaded(pPlugin); pListener->OnPluginUnloaded(pPlugin);
} }
/* Notify plugin */
pPlugin->Call_OnPluginEnd();
} }
pPlugin->DropEverything(); pPlugin->DropEverything();
@@ -1914,9 +1868,6 @@ void CPluginManager::OnSourceModAllInitialized()
g_RootMenu.AddRootConsoleCommand("plugins", "Manage Plugins", this); g_RootMenu.AddRootConsoleCommand("plugins", "Manage Plugins", this);
g_ShareSys.AddInterface(NULL, this); g_ShareSys.AddInterface(NULL, this);
m_pOnLibraryAdded = g_Forwards.CreateForward("OnLibraryAdded", ET_Ignore, 1, NULL, Param_String);
m_pOnLibraryRemoved = g_Forwards.CreateForward("OnLibraryRemoved", ET_Ignore, 1, NULL, Param_String);
} }
void CPluginManager::OnSourceModShutdown() void CPluginManager::OnSourceModShutdown()
@@ -1928,30 +1879,6 @@ void CPluginManager::OnSourceModShutdown()
g_HandleSys.RemoveType(g_PluginType, m_MyIdent); g_HandleSys.RemoveType(g_PluginType, m_MyIdent);
g_ShareSys.DestroyIdentType(g_PluginIdent); g_ShareSys.DestroyIdentType(g_PluginIdent);
g_ShareSys.DestroyIdentity(m_MyIdent); g_ShareSys.DestroyIdentity(m_MyIdent);
g_Forwards.ReleaseForward(m_pOnLibraryAdded);
g_Forwards.ReleaseForward(m_pOnLibraryRemoved);
}
ConfigResult CPluginManager::OnSourceModConfigChanged(const char *key,
const char *value,
ConfigSource source,
char *error,
size_t maxlength)
{
if (strcmp(key, "BlockBadPlugins") == 0) {
if (strcasecmp(value, "yes") == 0)
{
m_bBlockBadPlugins = true;
} else if (strcasecmp(value, "no") == 0) {
m_bBlockBadPlugins = false;
} else {
UTIL_Format(error, maxlength, "Invalid value: must be \"yes\" or \"no\"");
return ConfigResult_Reject;
}
return ConfigResult_Accept;
}
return ConfigResult_Ignore;
} }
void CPluginManager::OnHandleDestroy(HandleType_t type, void *object) void CPluginManager::OnHandleDestroy(HandleType_t type, void *object)
@@ -2334,15 +2261,6 @@ void CPluginManager::OnRootConsoleCommand(const char *cmdname, const CCommand &c
{ {
g_RootMenu.ConsolePrint(" Timestamp: %s", pl->m_DateTime); g_RootMenu.ConsolePrint(" Timestamp: %s", pl->m_DateTime);
} }
unsigned char *pCodeHash = pl->m_pRuntime->GetCodeHash();
unsigned char *pDataHash = pl->m_pRuntime->GetDataHash();
char combinedHash[33];
for (int i = 0; i < 16; i++)
UTIL_Format(combinedHash + (i * 2), 3, "%02x", pCodeHash[i] ^ pDataHash[i]);
g_RootMenu.ConsolePrint(" Hash: %s", combinedHash);
} }
else else
{ {
@@ -2557,18 +2475,83 @@ CPlugin *CPluginManager::GetPluginFromIdentity(IdentityToken_t *pToken)
return (CPlugin *)(pToken->ptr); return (CPlugin *)(pToken->ptr);
} }
void CPluginManager::OnLibraryAction(const char *lib, LibraryAction action) void CPluginManager::OnLibraryAction(const char *lib, bool is_a_plugin, bool drop)
{ {
switch (action) List<CPlugin *>::iterator iter;
struct _pl
{ {
case LibraryAction_Removed: cell_t name;
m_pOnLibraryRemoved->PushString(lib); cell_t file;
m_pOnLibraryRemoved->Execute(NULL); cell_t required;
break; } *plc;
case LibraryAction_Added:
m_pOnLibraryAdded->PushString(lib); struct _ext
m_pOnLibraryAdded->Execute(NULL); {
break; cell_t name;
cell_t file;
cell_t autoload;
cell_t required;
} *ext;
const char *name = drop ? "OnLibraryRemoved" : "OnLibraryAdded";
for (iter=m_plugins.begin();
iter!=m_plugins.end();
iter++)
{
CPlugin *pl = (*iter);
if (pl->GetStatus() != Plugin_Running)
{
continue;
}
IPluginContext *pContext = pl->GetBaseContext();
IPluginFunction *pf = pContext->GetFunctionByName(name);
if (!pf)
{
continue;
}
uint32_t num_vars = pContext->GetPubVarsNum();
for (uint32_t i=0; i<num_vars; i++)
{
sp_pubvar_t *pubvar;
if (pContext->GetPubvarByIndex(i, &pubvar) != SP_ERROR_NONE)
{
continue;
}
if (is_a_plugin && strncmp(pubvar->name, "__pl_", 5) == 0)
{
plc = (_pl *)pubvar->offs;
if (plc->required)
{
continue;
}
char *str;
pContext->LocalToString(plc->name, &str);
if (strcmp(str, lib) != 0)
{
continue;
}
pf->PushString(lib);
pf->Execute(NULL);
}
else if (!is_a_plugin && strncmp(pubvar->name, "__ext_", 6) == 0)
{
ext = (_ext *)pubvar->offs;
if (ext->required)
{
continue;
}
char *str;
pContext->LocalToString(ext->name, &str);
if (strcmp(str, lib) != 0)
{
continue;
}
pf->PushString(lib);
pf->Execute(NULL);
}
}
} }
} }
+5 -20
View File
@@ -47,17 +47,16 @@
#include "sm_trie.h" #include "sm_trie.h"
#include "sourcemod.h" #include "sourcemod.h"
#include <IRootConsoleMenu.h> #include <IRootConsoleMenu.h>
#if SOURCE_ENGINE >= SE_ALIENSWARM #if SOURCE_ENGINE == SE_ALIENSWARM
#include "convar_sm_swarm.h" #include "convar_sm_swarm.h"
#elif SOURCE_ENGINE >= SE_LEFT4DEAD #elif (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
#include "convar_sm_l4d.h" #include "convar_sm_l4d.h"
#elif SOURCE_ENGINE >= SE_ORANGEBOX #elif (SOURCE_ENGINE == SE_ORANGEBOX) || (SOURCE_ENGINE == SE_BLOODYGOODTIME) || (SOURCE_ENGINE == SE_EYE) || (SOURCE_ENGINE == SE_ORANGEBOXVALVE)
#include "convar_sm_ob.h" #include "convar_sm_ob.h"
#else #else
#include "convar_sm.h" #include "convar_sm.h"
#endif #endif
#include "ITranslator.h" #include "ITranslator.h"
#include "IGameConfigs.h"
#include "NativeOwner.h" #include "NativeOwner.h"
#include "ShareSys.h" #include "ShareSys.h"
@@ -131,12 +130,6 @@ enum APLRes
APLRes_SilentFailure APLRes_SilentFailure
}; };
enum LibraryAction
{
LibraryAction_Removed,
LibraryAction_Added
};
struct AutoConfig struct AutoConfig
{ {
String autocfg; String autocfg;
@@ -256,7 +249,7 @@ public:
{ {
m_Libraries.push_back(name); m_Libraries.push_back(name);
} }
void LibraryActions(LibraryAction action); void LibraryActions(bool dropping);
void SyncMaxClients(int max_clients); void SyncMaxClients(int max_clients);
protected: protected:
bool UpdateInfo(); bool UpdateInfo();
@@ -333,7 +326,6 @@ public: //IPluginManager
public: //SMGlobalClass public: //SMGlobalClass
void OnSourceModAllInitialized(); void OnSourceModAllInitialized();
void OnSourceModShutdown(); void OnSourceModShutdown();
ConfigResult OnSourceModConfigChanged(const char *key, const char *value, ConfigSource source, char *error, size_t maxlength);
void OnSourceModMaxPlayersChanged(int newvalue); void OnSourceModMaxPlayersChanged(int newvalue);
public: //IHandleTypeDispatch public: //IHandleTypeDispatch
void OnHandleDestroy(HandleType_t type, void *object); void OnHandleDestroy(HandleType_t type, void *object);
@@ -409,7 +401,7 @@ public:
void Shutdown(); void Shutdown();
void OnLibraryAction(const char *lib, LibraryAction action); void OnLibraryAction(const char *lib, bool is_a_plugin, bool drop);
bool LibraryExists(const char *lib); bool LibraryExists(const char *lib);
@@ -478,13 +470,6 @@ private:
List<FakeNative *> m_Natives; List<FakeNative *> m_Natives;
bool m_LoadingLocked; bool m_LoadingLocked;
// Config
bool m_bBlockBadPlugins;
// Forwards
IForward *m_pOnLibraryAdded;
IForward *m_pOnLibraryRemoved;
}; };
extern CPluginManager g_PluginSys; extern CPluginManager g_PluginSys;
File diff suppressed because it is too large Load Diff
+32 -298
View File
@@ -32,32 +32,18 @@
#include "UserMessages.h" #include "UserMessages.h"
#include "sm_stringutil.h" #include "sm_stringutil.h"
#if SOURCE_ENGINE == SE_CSGO
#include <cstrike15_usermessage_helpers.h>
#endif
UserMessages g_UserMsgs; UserMessages g_UserMsgs;
#if SOURCE_ENGINE == SE_CSGO
SH_DECL_HOOK3_void(IVEngineServer, SendUserMessage, SH_NOATTRIB, 0, IRecipientFilter &, int, const protobuf::Message &);
#else
#if SOURCE_ENGINE >= SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
SH_DECL_HOOK3(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int, const char *); SH_DECL_HOOK3(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int, const char *);
#else #else
SH_DECL_HOOK2(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int); SH_DECL_HOOK2(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int);
#endif #endif
SH_DECL_HOOK0_void(IVEngineServer, MessageEnd, SH_NOATTRIB, 0); SH_DECL_HOOK0_void(IVEngineServer, MessageEnd, SH_NOATTRIB, 0);
#endif // ==SE_CSGO
UserMessages::UserMessages() UserMessages::UserMessages() : m_InterceptBuffer(m_pBase, 2500)
#ifndef USE_PROTOBUF_USERMESSAGES
: m_InterceptBuffer(m_pBase, 2500)
{ {
m_Names = sm_trie_create(); m_Names = sm_trie_create();
#else
: m_InterceptBuffer(NULL)
{
#endif
m_HookCount = 0; m_HookCount = 0;
m_InExec = false; m_InExec = false;
m_InHook = false; m_InHook = false;
@@ -67,9 +53,7 @@ UserMessages::UserMessages()
UserMessages::~UserMessages() UserMessages::~UserMessages()
{ {
#ifndef USE_PROTOBUF_USERMESSAGES
sm_trie_destroy(m_Names); sm_trie_destroy(m_Names);
#endif
CStack<ListenerInfo *>::iterator iter; CStack<ListenerInfo *>::iterator iter;
for (iter=m_FreeListeners.begin(); iter!=m_FreeListeners.end(); iter++) for (iter=m_FreeListeners.begin(); iter!=m_FreeListeners.end(); iter++)
@@ -81,10 +65,8 @@ UserMessages::~UserMessages()
void UserMessages::OnSourceModStartup(bool late) void UserMessages::OnSourceModStartup(bool late)
{ {
#ifndef USE_PROTOBUF_USERMESSAGES
/* -1 means SourceMM was unable to get the user message list */ /* -1 means SourceMM was unable to get the user message list */
m_FallbackSearch = (g_SMAPI->GetUserMessageCount() == -1); m_FallbackSearch = (g_SMAPI->GetUserMessageCount() == -1);
#endif
} }
void UserMessages::OnSourceModAllInitialized() void UserMessages::OnSourceModAllInitialized()
@@ -96,25 +78,16 @@ void UserMessages::OnSourceModAllShutdown()
{ {
if (m_HookCount) if (m_HookCount)
{ {
#if SOURCE_ENGINE == SE_CSGO
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, SendUserMessage, engine, this, &UserMessages::OnSendUserMessage_Pre, false);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, SendUserMessage, engine, this, &UserMessages::OnSendUserMessage_Post, true);
#else
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true);
#endif
} }
m_HookCount = 0; m_HookCount = 0;
} }
int UserMessages::GetMessageIndex(const char *msg) int UserMessages::GetMessageIndex(const char *msg)
{ {
#if SOURCE_ENGINE == SE_CSGO
// Can split this per engine and/or game later
return g_Cstrike15UsermessageHelpers.GetIndex(msg);
#else
int msgid; int msgid;
if (!sm_trie_retrieve(m_Names, msg, reinterpret_cast<void **>(&msgid))) if (!sm_trie_retrieve(m_Names, msg, reinterpret_cast<void **>(&msgid)))
@@ -145,19 +118,10 @@ int UserMessages::GetMessageIndex(const char *msg)
} }
return msgid; return msgid;
#endif
} }
bool UserMessages::GetMessageName(int msgid, char *buffer, size_t maxlength) const bool UserMessages::GetMessageName(int msgid, char *buffer, size_t maxlength) const
{ {
#if SOURCE_ENGINE == SE_CSGO
const char *pszName = g_Cstrike15UsermessageHelpers.GetName(msgid);
if (!pszName)
return false;
strncopy(buffer, pszName, maxlength);
return true;
#else
if (m_FallbackSearch) if (m_FallbackSearch)
{ {
int size; int size;
@@ -173,14 +137,10 @@ bool UserMessages::GetMessageName(int msgid, char *buffer, size_t maxlength) con
} }
return false; return false;
#endif
} }
bf_write *UserMessages::StartBitBufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags) bf_write *UserMessages::StartMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES
return NULL;
#else
bf_write *buffer; bf_write *buffer;
if (m_InExec || m_InHook) if (m_InExec || m_InHook)
@@ -222,75 +182,6 @@ bf_write *UserMessages::StartBitBufMessage(int msg_id, const cell_t players[], u
} }
return buffer; return buffer;
#endif // USE_PROTOBUF_USERMESSAGES
}
google::protobuf::Message *UserMessages::StartProtobufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags)
{
#ifndef USE_PROTOBUF_USERMESSAGES
return NULL;
#else
protobuf::Message *buffer;
if (m_InExec || m_InHook)
{
return NULL;
}
if (msg_id < 0 || msg_id >= 255)
{
return NULL;
}
m_CurId = msg_id;
m_CellRecFilter.Initialize(players, playersNum);
m_CurFlags = flags;
if (m_CurFlags & USERMSG_INITMSG)
{
m_CellRecFilter.SetToInit(true);
}
if (m_CurFlags & USERMSG_RELIABLE)
{
m_CellRecFilter.SetToReliable(true);
}
m_InExec = true;
if (m_CurFlags & USERMSG_BLOCKHOOKS)
{
// direct message creation, return buffer "from engine". keep track
m_FakeEngineBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_id)->New();
buffer = m_FakeEngineBuffer;
} else {
char messageName[32];
if (!GetMessageName(msg_id, messageName, sizeof(messageName)))
{
m_InExec = false;
return NULL;
}
protobuf::Message *msg = OnStartMessage_Pre(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, messageName);
switch (m_FakeMetaRes)
{
case MRES_IGNORED:
case MRES_HANDLED:
m_FakeEngineBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_id)->New();
buffer = m_FakeEngineBuffer;
break;
case MRES_OVERRIDE:
m_FakeEngineBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_id)->New();
// fallthrough
case MRES_SUPERCEDE:
buffer = msg;
break;
}
OnStartMessage_Post(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, messageName);
}
return buffer;
#endif // USE_PROTOBUF_USERMESSAGES
} }
bool UserMessages::EndMessage() bool UserMessages::EndMessage()
@@ -300,37 +191,12 @@ bool UserMessages::EndMessage()
return false; return false;
} }
#if SOURCE_ENGINE == SE_CSGO
if (m_CurFlags & USERMSG_BLOCKHOOKS)
{
ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(m_CellRecFilter), m_CurId, *m_FakeEngineBuffer);
delete m_FakeEngineBuffer;
m_FakeEngineBuffer = NULL;
} else {
OnMessageEnd_Pre();
switch (m_FakeMetaRes)
{
case MRES_IGNORED:
case MRES_HANDLED:
case MRES_OVERRIDE:
engine->SendUserMessage(static_cast<IRecipientFilter &>(m_CellRecFilter), m_CurId, *m_FakeEngineBuffer);
delete m_FakeEngineBuffer;
m_FakeEngineBuffer = NULL;
break;
//case MRES_SUPERCEDE:
}
OnMessageEnd_Post();
}
#else
if (m_CurFlags & USERMSG_BLOCKHOOKS) if (m_CurFlags & USERMSG_BLOCKHOOKS)
{ {
ENGINE_CALL(MessageEnd)(); ENGINE_CALL(MessageEnd)();
} else { } else {
engine->MessageEnd(); engine->MessageEnd();
} }
#endif // SE_CSGO
m_InExec = false; m_InExec = false;
m_CurFlags = 0; m_CurFlags = 0;
@@ -339,60 +205,31 @@ bool UserMessages::EndMessage()
return true; return true;
} }
UserMessageType UserMessages::GetUserMessageType() const
{
#ifdef USE_PROTOBUF_USERMESSAGES
return UM_Protobuf;
#else
return UM_BitBuf;
#endif
}
bool UserMessages::HookUserMessage2(int msg_id, bool UserMessages::HookUserMessage2(int msg_id,
IUserMessageListener *pListener, IUserMessageListener *pListener,
bool intercept) bool intercept)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES return InternalHook(msg_id, pListener, intercept, true);
return InternalHook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, true);
#else
return InternalHook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, true);
#endif
} }
bool UserMessages::UnhookUserMessage2(int msg_id, bool UserMessages::UnhookUserMessage2(int msg_id,
IUserMessageListener *pListener, IUserMessageListener *pListener,
bool intercept) bool intercept)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES return InternalUnhook(msg_id, pListener, intercept, true);
return InternalUnhook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, true);
#else
return InternalUnhook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, true);
#endif
} }
bool UserMessages::HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept) bool UserMessages::HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES return InternalHook(msg_id, pListener, intercept, false);
return InternalHook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, false);
#else
return InternalHook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, false);
#endif
} }
bool UserMessages::UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept) bool UserMessages::UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES return InternalUnhook(msg_id, pListener, intercept, false);
return InternalUnhook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, false);
#else
return InternalUnhook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, false);
#endif
} }
#ifdef USE_PROTOBUF_USERMESSAGES bool UserMessages::InternalHook(int msg_id, IUserMessageListener *pListener, bool intercept, bool isNew)
bool UserMessages::InternalHook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew)
#else
bool UserMessages::InternalHook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew)
#endif
{ {
if (msg_id < 0 || msg_id >= 255) if (msg_id < 0 || msg_id >= 255)
{ {
@@ -415,15 +252,10 @@ bool UserMessages::InternalHook(int msg_id, IBitBufUserMessageListener *pListene
if (!m_HookCount++) if (!m_HookCount++)
{ {
#if SOURCE_ENGINE == SE_CSGO
SH_ADD_HOOK_MEMFUNC(IVEngineServer, SendUserMessage, engine, this, &UserMessages::OnSendUserMessage_Pre, false);
SH_ADD_HOOK_MEMFUNC(IVEngineServer, SendUserMessage, engine, this, &UserMessages::OnSendUserMessage_Post, true);
#else
SH_ADD_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false); SH_ADD_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false);
SH_ADD_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true); SH_ADD_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true);
SH_ADD_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false); SH_ADD_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false);
SH_ADD_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true); SH_ADD_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true);
#endif
} }
if (intercept) if (intercept)
@@ -436,11 +268,7 @@ bool UserMessages::InternalHook(int msg_id, IBitBufUserMessageListener *pListene
return true; return true;
} }
#ifdef USE_PROTOBUF_USERMESSAGES bool UserMessages::InternalUnhook(int msg_id, IUserMessageListener *pListener, bool intercept, bool isNew)
bool UserMessages::InternalUnhook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew)
#else
bool UserMessages::InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew)
#endif
{ {
MsgList *pList; MsgList *pList;
MsgIter iter; MsgIter iter;
@@ -481,69 +309,14 @@ void UserMessages::_DecRefCounter()
{ {
if (--m_HookCount == 0) if (--m_HookCount == 0)
{ {
#if SOURCE_ENGINE == SE_CSGO
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, SendUserMessage, engine, this, &UserMessages::OnSendUserMessage_Pre, false);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, SendUserMessage, engine, this, &UserMessages::OnSendUserMessage_Post, true);
#else
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Pre, false);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, UserMessageBegin, engine, this, &UserMessages::OnStartMessage_Post, true);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Pre, false);
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true); SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, MessageEnd, engine, this, &UserMessages::OnMessageEnd_Post, true);
#endif
} }
} }
#if SOURCE_ENGINE == SE_CSGO #if SOURCE_ENGINE >= SE_LEFT4DEAD
void UserMessages::OnSendUserMessage_Pre(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg)
{
OnStartMessage_Pre(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
if (m_FakeMetaRes == MRES_SUPERCEDE)
{
int size = msg.ByteSize();
uint8 *data = (uint8 *)stackalloc(size);
msg.SerializePartialToArray(data, size);
m_InterceptBuffer->ParsePartialFromArray(data, size);
}
else
{
m_FakeEngineBuffer = &const_cast<protobuf::Message &>(msg);
}
OnStartMessage_Post(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
OnMessageEnd_Pre();
if (m_FakeMetaRes == MRES_SUPERCEDE)
RETURN_META(MRES_SUPERCEDE);
RETURN_META(MRES_IGNORED);
}
void UserMessages::OnSendUserMessage_Post(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg)
{
OnMessageEnd_Post();
RETURN_META(MRES_IGNORED);
}
#endif
#ifdef USE_PROTOBUF_USERMESSAGES
#define UM_RETURN_META_VALUE(res, val) \
m_FakeMetaRes = res; \
return val;
#define UM_RETURN_META(res) \
m_FakeMetaRes = res; \
return;
#else
#define UM_RETURN_META_VALUE(res, val) \
RETURN_META_VALUE(res, val)
#define UM_RETURN_META(res) \
RETURN_META(res)
#endif
#if SOURCE_ENGINE == SE_CSGO
protobuf::Message *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name) bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
#else #else
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type) bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type)
@@ -556,7 +329,7 @@ bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_typ
|| (m_InExec && (m_CurFlags & USERMSG_BLOCKHOOKS))) || (m_InExec && (m_CurFlags & USERMSG_BLOCKHOOKS)))
{ {
m_InHook = false; m_InHook = false;
UM_RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
m_CurId = msg_type; m_CurId = msg_type;
@@ -566,23 +339,14 @@ bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_typ
if (!is_intercept_empty) if (!is_intercept_empty)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES
if (m_InterceptBuffer)
delete m_InterceptBuffer;
m_InterceptBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_type)->New();
UM_RETURN_META_VALUE(MRES_SUPERCEDE, m_InterceptBuffer);
#else
m_InterceptBuffer.Reset(); m_InterceptBuffer.Reset();
UM_RETURN_META_VALUE(MRES_SUPERCEDE, &m_InterceptBuffer); RETURN_META_VALUE(MRES_SUPERCEDE, &m_InterceptBuffer);
#endif
} }
UM_RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
#if SOURCE_ENGINE == SE_CSGO #if SOURCE_ENGINE >= SE_LEFT4DEAD
protobuf::Message *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name) bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
#else #else
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type) bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type)
@@ -590,26 +354,19 @@ bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_ty
{ {
if (!m_InHook) if (!m_InHook)
{ {
UM_RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
#ifdef USE_PROTOBUF_USERMESSAGES
if (m_FakeMetaRes == MRES_SUPERCEDE)
m_OrigBuffer = m_InterceptBuffer;
else
m_OrigBuffer = m_FakeEngineBuffer;
#else
m_OrigBuffer = META_RESULT_ORIG_RET(bf_write *); m_OrigBuffer = META_RESULT_ORIG_RET(bf_write *);
#endif
UM_RETURN_META_VALUE(MRES_IGNORED, NULL); RETURN_META_VALUE(MRES_IGNORED, NULL);
} }
void UserMessages::OnMessageEnd_Post() void UserMessages::OnMessageEnd_Post()
{ {
if (!m_InHook) if (!m_InHook)
{ {
UM_RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
MsgList *pList; MsgList *pList;
@@ -677,7 +434,7 @@ void UserMessages::OnMessageEnd_Pre()
{ {
if (!m_InHook) if (!m_InHook)
{ {
UM_RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
MsgList *pList; MsgList *pList;
@@ -693,11 +450,7 @@ void UserMessages::OnMessageEnd_Pre()
{ {
pInfo = (*iter); pInfo = (*iter);
pInfo->IsHooked = true; pInfo->IsHooked = true;
#ifdef USE_PROTOBUF_USERMESSAGES
res = pInfo->Callback->InterceptUserMessage(m_CurId, m_InterceptBuffer, m_CurRecFilter);
#else
res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter); res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter);
#endif
intercepted = true; intercepted = true;
@@ -745,10 +498,8 @@ void UserMessages::OnMessageEnd_Pre()
if (!handled && intercepted) if (!handled && intercepted)
{ {
#if SOURCE_ENGINE == SE_CSGO
ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(*m_CurRecFilter), m_CurId, *m_InterceptBuffer);
#else
bf_write *engine_bfw; bf_write *engine_bfw;
#if SOURCE_ENGINE >= SE_LEFT4DEAD #if SOURCE_ENGINE >= SE_LEFT4DEAD
engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId)); engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId));
#else #else
@@ -757,46 +508,29 @@ void UserMessages::OnMessageEnd_Pre()
m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten()); m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten());
engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten()); engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten());
ENGINE_CALL(MessageEnd)(); ENGINE_CALL(MessageEnd)();
#endif // SE_CSGO
} }
pList = &m_msgHooks[m_CurId];
for (iter=pList->begin(); iter!=pList->end(); )
{ {
#if SOURCE_ENGINE == SE_CSGO pInfo = (*iter);
int size = m_OrigBuffer->ByteSize(); pInfo->IsHooked = true;
uint8 *data = (uint8 *)stackalloc(size); pInfo->Callback->OnUserMessage(m_CurId, m_OrigBuffer, m_CurRecFilter);
m_OrigBuffer->SerializePartialToArray(data, size);
protobuf::Message *pTempMsg = g_Cstrike15UsermessageHelpers.GetPrototype(m_CurId)->New();
pTempMsg->ParsePartialFromArray(data, size);
#else
bf_write *pTempMsg = m_OrigBuffer;
#endif
pList = &m_msgHooks[m_CurId]; if (pInfo->KillMe)
for (iter=pList->begin(); iter!=pList->end(); )
{ {
pInfo = (*iter); iter = pList->erase(iter);
pInfo->IsHooked = true; m_FreeListeners.push(pInfo);
pInfo->Callback->OnUserMessage(m_CurId, pTempMsg, m_CurRecFilter); _DecRefCounter();
continue;
if (pInfo->KillMe)
{
iter = pList->erase(iter);
m_FreeListeners.push(pInfo);
_DecRefCounter();
continue;
}
pInfo->IsHooked = false;
iter++;
} }
#if SOURCE_ENGINE == SE_CSGO pInfo->IsHooked = false;
delete pTempMsg; iter++;
#endif
} }
UM_RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED); RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED);
supercede: supercede:
m_BlockEndPost = true; m_BlockEndPost = true;
UM_RETURN_META(MRES_SUPERCEDE); RETURN_META(MRES_SUPERCEDE);
} }
+6 -51
View File
@@ -36,35 +36,16 @@
#include <IUserMessages.h> #include <IUserMessages.h>
#include "sourcemm_api.h" #include "sourcemm_api.h"
#include "sm_trie.h" #include "sm_trie.h"
#include "sm_stringutil.h"
#include "CellRecipientFilter.h" #include "CellRecipientFilter.h"
using namespace SourceHook; using namespace SourceHook;
using namespace SourceMod; using namespace SourceMod;
#if SOURCE_ENGINE == SE_CSGO
#define USE_PROTOBUF_USERMESSAGES
#endif
#ifdef USE_PROTOBUF_USERMESSAGES
#include <google/protobuf/message.h>
#include <google/protobuf/descriptor.h>
#include <netmessages.pb.h>
using namespace google;
#else
#include <bitbuf.h>
#endif
#define INVALID_MESSAGE_ID -1 #define INVALID_MESSAGE_ID -1
struct ListenerInfo struct ListenerInfo
{ {
#ifdef USE_PROTOBUF_USERMESSAGES IUserMessageListener *Callback;
IProtobufUserMessageListener *Callback;
#else
IBitBufUserMessageListener *Callback;
#endif
bool IsHooked; bool IsHooked;
bool KillMe; bool KillMe;
bool IsNew; bool IsNew;
@@ -89,8 +70,7 @@ public: //IUserMessages
bool GetMessageName(int msgid, char *buffer, size_t maxlength) const; bool GetMessageName(int msgid, char *buffer, size_t maxlength) const;
bool HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false); bool HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
bool UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false); bool UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept=false);
bf_write *StartBitBufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags); bf_write *StartMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags);
google::protobuf::Message *StartProtobufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags);
bool EndMessage(); bool EndMessage();
bool HookUserMessage2(int msg_id, bool HookUserMessage2(int msg_id,
IUserMessageListener *pListener, IUserMessageListener *pListener,
@@ -98,17 +78,8 @@ public: //IUserMessages
bool UnhookUserMessage2(int msg_id, bool UnhookUserMessage2(int msg_id,
IUserMessageListener *pListener, IUserMessageListener *pListener,
bool intercept=false); bool intercept=false);
UserMessageType GetUserMessageType() const;
public: public:
#if SOURCE_ENGINE == SE_CSGO #if SOURCE_ENGINE >= SE_LEFT4DEAD
void OnSendUserMessage_Pre(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg);
void OnSendUserMessage_Post(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg);
#endif
#if SOURCE_ENGINE == SE_CSGO
protobuf::Message *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name);
protobuf::Message *OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name);
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name); bf_write *OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name);
bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name); bf_write *OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name);
#else #else
@@ -118,40 +89,24 @@ public:
void OnMessageEnd_Pre(); void OnMessageEnd_Pre();
void OnMessageEnd_Post(); void OnMessageEnd_Post();
private: private:
#ifdef USE_PROTOBUF_USERMESSAGES bool InternalHook(int msg_id, IUserMessageListener *pListener, bool intercept, bool isNew);
bool InternalHook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew); bool InternalUnhook(int msg_id, IUserMessageListener *pListener, bool intercept, bool isNew);
bool InternalUnhook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew);
#else
bool InternalHook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew);
bool InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew);
#endif
void _DecRefCounter(); void _DecRefCounter();
private: private:
List<ListenerInfo *> m_msgHooks[255]; List<ListenerInfo *> m_msgHooks[255];
List<ListenerInfo *> m_msgIntercepts[255]; List<ListenerInfo *> m_msgIntercepts[255];
CStack<ListenerInfo *> m_FreeListeners; CStack<ListenerInfo *> m_FreeListeners;
IRecipientFilter *m_CurRecFilter;
#ifndef USE_PROTOBUF_USERMESSAGES
unsigned char m_pBase[2500]; unsigned char m_pBase[2500];
IRecipientFilter *m_CurRecFilter;
bf_write m_InterceptBuffer; bf_write m_InterceptBuffer;
bf_write *m_OrigBuffer; bf_write *m_OrigBuffer;
bf_read m_ReadBuffer; bf_read m_ReadBuffer;
#else
// The engine used to provide this. Now we track it.
protobuf::Message *m_OrigBuffer;
protobuf::Message *m_FakeEngineBuffer;
META_RES m_FakeMetaRes;
protobuf::Message *m_InterceptBuffer;
#endif
size_t m_HookCount; size_t m_HookCount;
bool m_InHook; bool m_InHook;
bool m_BlockEndPost; bool m_BlockEndPost;
#ifndef USE_PROTOBUF_USERMESSAGES
bool m_FallbackSearch; bool m_FallbackSearch;
Trie *m_Names; Trie *m_Names;
#endif
CellRecipientFilter m_CellRecFilter; CellRecipientFilter m_CellRecFilter;
bool m_InExec; bool m_InExec;
int m_CurFlags; int m_CurFlags;
+1 -1
View File
@@ -386,7 +386,7 @@ public:
virtual void SetValue( const char *value ); virtual void SetValue( const char *value );
virtual void SetValue( float value ); virtual void SetValue( float value );
virtual void SetValue( int value ); virtual void SetValue( int value );
#if SOURCE_ENGINE >= SE_NUCLEARDAWN #if SOURCE_ENGINE >= SE_LEFT4DEAD2
virtual void SetValue( Color value ); virtual void SetValue( Color value );
#endif #endif
+1 -11
View File
@@ -20,7 +20,7 @@
#include "tier1/iconvar.h" #include "tier1/iconvar.h"
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#include "tier1/utlstring.h" #include "tier1/utlstring.h"
#include "Color.h" #include "color.h"
#include "icvar.h" #include "icvar.h"
#ifdef _WIN32 #ifdef _WIN32
@@ -381,14 +381,8 @@ public:
FnChangeCallback_t GetChangeCallback( int slot ) const { return m_pParent->m_fnChangeCallbacks[ slot ]; } FnChangeCallback_t GetChangeCallback( int slot ) const { return m_pParent->m_fnChangeCallbacks[ slot ]; }
// Retrieve value // Retrieve value
#if SOURCE_ENGINE == SE_CSGO
virtual float GetFloat( void ) const;
virtual int GetInt( void ) const;
#else
FORCEINLINE_CVAR float GetFloat( void ) const; FORCEINLINE_CVAR float GetFloat( void ) const;
FORCEINLINE_CVAR int GetInt( void ) const; FORCEINLINE_CVAR int GetInt( void ) const;
#endif
FORCEINLINE_CVAR Color GetColor( void ) const; FORCEINLINE_CVAR Color GetColor( void ) const;
FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); }
FORCEINLINE_CVAR char const *GetString( void ) const; FORCEINLINE_CVAR char const *GetString( void ) const;
@@ -901,9 +895,7 @@ void ConVar_PrintDescription( const ConCommandBase *pVar );
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: Utility class to quickly allow ConCommands to call member methods // Purpose: Utility class to quickly allow ConCommands to call member methods
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#ifdef _WIN32
#pragma warning (disable : 4355 ) #pragma warning (disable : 4355 )
#endif
template< class T > template< class T >
class CConCommandMemberAccessor : public ConCommand, public ICommandCallback, public ICommandCompletionCallback class CConCommandMemberAccessor : public ConCommand, public ICommandCallback, public ICommandCompletionCallback
@@ -950,9 +942,7 @@ private:
FnMemberCommandCompletionCallback_t m_CompletionFunc; FnMemberCommandCompletionCallback_t m_CompletionFunc;
}; };
#ifdef _WIN32
#pragma warning ( default : 4355 ) #pragma warning ( default : 4355 )
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
+56 -56
View File
@@ -1,59 +1,59 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os import os
binary = SM.Library(builder, 'sourcemod.logic') compiler = SM.DefaultCompiler()
binary.compiler.cxxincludes += [ base = AMBuild.sourceFolder
os.path.join(builder.sourcePath, 'core', 'logic'), compiler['CXXINCLUDES'].append(os.path.join(SM.mmsPath, 'core', 'sourcehook'))
os.path.join(builder.sourcePath, 'public'), compiler['CXXINCLUDES'].append(os.path.join(base, 'core', 'logic'))
os.path.join(builder.sourcePath, 'public', 'sourcepawn'), compiler['CXXINCLUDES'].append(os.path.join(base, 'public'))
os.path.join(builder.sourcePath, 'public', 'amtl'), compiler['CXXINCLUDES'].append(os.path.join(base, 'public', 'sourcepawn'))
os.path.join(SM.mms_root, 'core', 'sourcehook') compiler['CDEFINES'].append('SM_DEFAULT_THREADER')
] compiler['CDEFINES'].append('SM_LOGIC')
binary.compiler.defines += [
'SM_DEFAULT_THREADER', if AMBuild.target['platform'] == 'linux':
'SM_LOGIC' compiler['POSTLINKFLAGS'].append('-lpthread')
] if AMBuild.target['platform'] == 'darwin':
compiler['POSTLINKFLAGS'].extend(['-framework', 'CoreServices'])
if builder.target_platform == 'linux':
binary.compiler.postlink += ['-lpthread', '-lrt'] extension = AMBuild.AddJob('sourcemod.logic')
elif builder.target_platform == 'mac': binary = Cpp.LibraryBuilder('sourcemod.logic', AMBuild, extension, compiler)
binary.compiler.cflags += ['-Wno-deprecated-declarations'] files = [
binary.compiler.postlink += ['-framework', 'CoreServices'] 'common_logic.cpp',
binary.sources += [ 'smn_adt_array.cpp',
'common_logic.cpp', 'smn_sorting.cpp',
'smn_adt_array.cpp', 'smn_maplists.cpp',
'smn_sorting.cpp', 'smn_adt_stack.cpp',
'smn_maplists.cpp', 'thread/ThreadWorker.cpp',
'smn_adt_stack.cpp', 'thread/BaseWorker.cpp',
'thread/ThreadWorker.cpp', 'ThreadSupport.cpp',
'thread/BaseWorker.cpp', 'smn_float.cpp',
'ThreadSupport.cpp', 'TextParsers.cpp',
'smn_float.cpp', 'smn_textparse.cpp',
'TextParsers.cpp', 'smn_adt_trie.cpp',
'smn_textparse.cpp', 'Profiler.cpp',
'smn_adt_trie.cpp', 'smn_functions.cpp',
'Profiler.cpp', 'smn_timers.cpp',
'smn_functions.cpp', 'smn_players.cpp',
'smn_timers.cpp', 'MemoryUtils.cpp',
'smn_players.cpp', 'smn_admin.cpp',
'MemoryUtils.cpp', 'smn_banning.cpp',
'smn_admin.cpp', 'stringutil.cpp',
'smn_banning.cpp', 'Translator.cpp',
'stringutil.cpp', 'PhraseCollection.cpp',
'Translator.cpp', 'smn_lang.cpp',
'PhraseCollection.cpp', 'smn_string.cpp',
'smn_lang.cpp', 'smn_handles.cpp',
'smn_string.cpp', 'smn_datapacks.cpp',
'smn_handles.cpp', 'smn_gameconfigs.cpp',
'smn_datapacks.cpp', 'GameConfigs.cpp',
'smn_gameconfigs.cpp', 'sm_crc32.cpp',
'GameConfigs.cpp', 'smn_profiler.cpp'
'sm_crc32.cpp', ]
'smn_profiler.cpp', if AMBuild.target['platform'] == 'windows':
] files.append('thread/WinThreads.cpp')
if builder.target_platform == 'windows': else:
binary.sources += ['thread/WinThreads.cpp'] files.append('thread/PosixThreads.cpp')
else: binary.AddSourceFiles('core/logic', files)
binary.sources += ['thread/PosixThreads.cpp'] SM.AutoVersion('core/logic', binary)
binary.SendToJob()
SM.binaries += [builder.Add(binary)]
+47 -85
View File
@@ -54,7 +54,6 @@ IGameConfig *g_pGameConf = NULL;
static char g_Game[256]; static char g_Game[256];
static char g_GameDesc[256] = {'!', '\0'}; static char g_GameDesc[256] = {'!', '\0'};
static char g_GameName[256] = {'$', '\0'}; static char g_GameName[256] = {'$', '\0'};
static const char *g_pParseEngine = NULL;
#define PSTATE_NONE 0 #define PSTATE_NONE 0
#define PSTATE_GAMES 1 #define PSTATE_GAMES 1
@@ -90,7 +89,7 @@ struct TempSigInfo
library[0] = '\0'; library[0] = '\0';
sig[0] = '\0'; sig[0] = '\0';
} }
char sig[1024]; char sig[512];
char library[64]; char library[64];
} s_TempSig; } s_TempSig;
unsigned int s_ServerBinCRC; unsigned int s_ServerBinCRC;
@@ -113,10 +112,10 @@ static bool DoesGameMatch(const char *value)
static bool DoesEngineMatch(const char *value) static bool DoesEngineMatch(const char *value)
{ {
return strcmp(value, g_pParseEngine) == 0; return strcmp(value, smcore.GetSourceEngineName()) == 0;
} }
CGameConfig::CGameConfig(const char *file, const char *engine) CGameConfig::CGameConfig(const char *file)
{ {
strncopy(m_File, file, sizeof(m_File)); strncopy(m_File, file, sizeof(m_File));
m_pAddresses = new KTrie<AddressConf>(); m_pAddresses = new KTrie<AddressConf>();
@@ -125,18 +124,6 @@ CGameConfig::CGameConfig(const char *file, const char *engine)
m_CustomLevel = 0; m_CustomLevel = 0;
m_CustomHandler = NULL; m_CustomHandler = NULL;
if (!engine)
m_pEngine = smcore.GetSourceEngineName();
else
m_pEngine = engine;
if (strcmp(m_pEngine, "css") == 0 || strcmp(m_pEngine, "dods") == 0 || strcmp(m_pEngine, "hl2dm") == 0 || strcmp(m_pEngine, "tf2") == 0)
this->SetBaseEngine("orangebox_valve");
else if (strcmp(m_pEngine, "nucleardawn") == 0)
this->SetBaseEngine("left4dead2");
else
this->SetBaseEngine(NULL);
} }
CGameConfig::~CGameConfig() CGameConfig::~CGameConfig()
@@ -538,16 +525,9 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
s_TempSig.library, s_TempSig.library,
m_CurFile); m_CurFile);
} else { } else {
#if defined PLATFORM_POSIX
if (s_TempSig.sig[0] == '@') if (s_TempSig.sig[0] == '@')
{ {
#if defined PLATFORM_WINDOWS
MEMORY_BASIC_INFORMATION mem;
if (VirtualQuery(addrInBase, &mem, sizeof(mem)))
final_addr = g_MemUtils.ResolveSymbol(mem.AllocationBase, &s_TempSig.sig[1]);
else
smcore.LogError("[SM] Unable to find library \"%s\" in memory (gameconf \"%s\")", s_TempSig.library, m_File);
#elif defined PLATFORM_POSIX
Dl_info info; Dl_info info;
/* GNU only: returns 0 on error, inconsistent! >:[ */ /* GNU only: returns 0 on error, inconsistent! >:[ */
if (dladdr(addrInBase, &info) != 0) if (dladdr(addrInBase, &info) != 0)
@@ -570,12 +550,12 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
s_TempSig.library, s_TempSig.library,
m_File); m_File);
} }
#endif
} }
if (final_addr) if (final_addr)
{ {
goto skip_find; goto skip_find;
} }
#endif
/* First, preprocess the signature */ /* First, preprocess the signature */
unsigned char real_sig[511]; unsigned char real_sig[511];
size_t real_bytes; size_t real_bytes;
@@ -592,7 +572,9 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states)
} }
} }
#if defined PLATFORM_POSIX
skip_find: skip_find:
#endif
m_Sigs.replace(m_offset, final_addr); m_Sigs.replace(m_offset, final_addr);
m_ParseState = PSTATE_GAMEDEFS_SIGNATURES; m_ParseState = PSTATE_GAMEDEFS_SIGNATURES;
@@ -607,11 +589,19 @@ skip_find:
{ {
m_ParseState = PSTATE_GAMEDEFS_ADDRESSES; m_ParseState = PSTATE_GAMEDEFS_ADDRESSES;
if (m_Address[0] != '\0' && m_AddressSignature[0] != '\0') if (m_Address[0] == '\0')
{ {
AddressConf addrConf(m_AddressSignature, sizeof(m_AddressSignature), m_AddressReadCount, m_AddressRead); smcore.LogError("[SM] Address sections must have names (gameconf \"%s\")", m_CurFile);
m_pAddresses->replace(m_Address, addrConf); break;
} }
if (m_AddressSignature[0] == '\0')
{
smcore.LogError("[SM] Address section for \"%s\" did not specify a signature (gameconf \"%s\")", m_Address, m_CurFile);
break;
}
AddressConf addrConf(m_AddressSignature, sizeof(m_AddressSignature), m_AddressReadCount, m_AddressRead);
m_pAddresses->replace(m_Address, addrConf);
break; break;
} }
@@ -777,29 +767,19 @@ bool CGameConfig::Reparse(char *error, size_t maxlength)
SMCStates state = {0, 0}; SMCStates state = {0, 0};
List<String> fileList; List<String> fileList;
master_reader.fileList = &fileList; master_reader.fileList = &fileList;
const char *pEngine[2] = { m_pBaseEngine, m_pEngine };
for (unsigned char iter = 0; iter < SM_ARRAYSIZE(pEngine); ++iter) err = textparsers->ParseSMCFile(path, &master_reader, &state, error, maxlength);
if (err != SMCError_Okay)
{ {
if (pEngine[iter] == NULL) const char *msg = textparsers->GetSMCErrorString(err);
{
continue;
}
this->SetParseEngine(pEngine[iter]); smcore.LogError("[SM] Error parsing master gameconf file \"%s\":", path);
err = textparsers->ParseSMCFile(path, &master_reader, &state, error, maxlength); smcore.LogError("[SM] Error %d on line %d, col %d: %s",
if (err != SMCError_Okay) err,
{ state.line,
const char *msg = textparsers->GetSMCErrorString(err); state.col,
msg ? msg : "Unknown error");
smcore.LogError("[SM] Error parsing master gameconf file \"%s\":", path); return false;
smcore.LogError("[SM] Error %d on line %d, col %d: %s",
err,
state.line,
state.col,
msg ? msg : "Unknown error");
return false;
}
} }
/* Go through each file we found and parse it. */ /* Go through each file we found and parse it. */
@@ -865,53 +845,35 @@ bool CGameConfig::EnterFile(const char *file, char *error, size_t maxlength)
m_IgnoreLevel = 0; m_IgnoreLevel = 0;
bShouldBeReadingDefault = true; bShouldBeReadingDefault = true;
m_ParseState = PSTATE_NONE; m_ParseState = PSTATE_NONE;
const char *pEngine[2] = { m_pBaseEngine, m_pEngine };
for (unsigned char iter = 0; iter < SM_ARRAYSIZE(pEngine); ++iter) if ((err=textparsers->ParseSMCFile(m_CurFile, this, &state, error, maxlength))
!= SMCError_Okay)
{ {
if (pEngine[iter] == NULL) const char *msg;
msg = textparsers->GetSMCErrorString(err);
smcore.LogError("[SM] Error parsing gameconfig file \"%s\":", m_CurFile);
smcore.LogError("[SM] Error %d on line %d, col %d: %s",
err,
state.line,
state.col,
msg ? msg : "Unknown error");
if (m_ParseState == PSTATE_GAMEDEFS_CUSTOM)
{ {
continue; //error occurred while parsing a custom section
m_CustomHandler->ReadSMC_ParseEnd(true, true);
m_CustomHandler = NULL;
m_CustomLevel = 0;
} }
this->SetParseEngine(pEngine[iter]); return false;
if ((err=textparsers->ParseSMCFile(m_CurFile, this, &state, error, maxlength))
!= SMCError_Okay)
{
const char *msg = textparsers->GetSMCErrorString(err);
smcore.LogError("[SM] Error parsing gameconfig file \"%s\":", m_CurFile);
smcore.LogError("[SM] Error %d on line %d, col %d: %s",
err,
state.line,
state.col,
msg ? msg : "Unknown error");
if (m_ParseState == PSTATE_GAMEDEFS_CUSTOM)
{
//error occurred while parsing a custom section
m_CustomHandler->ReadSMC_ParseEnd(true, true);
m_CustomHandler = NULL;
m_CustomLevel = 0;
}
return false;
}
} }
return true; return true;
} }
void CGameConfig::SetBaseEngine(const char *engine)
{
m_pBaseEngine = engine;
}
void CGameConfig::SetParseEngine(const char *engine)
{
g_pParseEngine = engine;
}
bool CGameConfig::GetOffset(const char *key, int *value) bool CGameConfig::GetOffset(const char *key, int *value)
{ {
int *pvalue; int *pvalue;
+1 -5
View File
@@ -50,13 +50,11 @@ class CGameConfig :
{ {
friend class GameConfigManager; friend class GameConfigManager;
public: public:
CGameConfig(const char *file, const char *engine = NULL); CGameConfig(const char *file);
~CGameConfig(); ~CGameConfig();
public: public:
bool Reparse(char *error, size_t maxlength); bool Reparse(char *error, size_t maxlength);
bool EnterFile(const char *file, char *error, size_t maxlength); bool EnterFile(const char *file, char *error, size_t maxlength);
void SetBaseEngine(const char *engine);
void SetParseEngine(const char *engine);
public: //ITextListener_SMC public: //ITextListener_SMC
SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name); SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name);
SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value); SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value);
@@ -113,8 +111,6 @@ private:
int m_AddressReadCount; int m_AddressReadCount;
int m_AddressRead[8]; int m_AddressRead[8];
KTrie<AddressConf> *m_pAddresses; KTrie<AddressConf> *m_pAddresses;
const char *m_pEngine;
const char *m_pBaseEngine;
}; };
class GameConfigManager : class GameConfigManager :
+1 -2
View File
@@ -40,8 +40,7 @@ OBJECTS = \
smn_datapacks.cpp \ smn_datapacks.cpp \
smn_gameconfigs.cpp \ smn_gameconfigs.cpp \
GameConfigs.cpp \ GameConfigs.cpp \
smn_players.cpp \ smn_players.cpp
smn_profiler.cpp
############################################## ##############################################
### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
+1 -1
View File
@@ -116,7 +116,7 @@ void *MemoryUtils::FindPattern(const void *libPtr, const char *pattern, size_t l
} }
ptr = reinterpret_cast<char *>(lib.baseAddress); ptr = reinterpret_cast<char *>(lib.baseAddress);
end = ptr + lib.memorySize - len; end = ptr + lib.memorySize;
while (ptr < end) while (ptr < end)
{ {
+16 -1
View File
@@ -479,6 +479,13 @@ SMCResult CPhraseFile::ReadSMC_KeyValue(const SMCStates *states, const char *key
} }
else else
{ {
size_t len = strlen(key);
if (len < 2 || len > 3)
{
ParseWarning("Ignoring translation to invalid language \"%s\" on line %d.", key, states->line);
return SMCResult_Continue;
}
unsigned int lang; unsigned int lang;
if (!m_pTranslator->GetLanguageByCode(key, &lang)) if (!m_pTranslator->GetLanguageByCode(key, &lang))
{ {
@@ -491,7 +498,7 @@ SMCResult CPhraseFile::ReadSMC_KeyValue(const SMCStates *states, const char *key
/* See how many bytes we need for this string, then allocate. /* See how many bytes we need for this string, then allocate.
* NOTE: THIS SHOULD GUARANTEE THAT WE DO NOT NEED TO NEED TO SIZE CHECK * NOTE: THIS SHOULD GUARANTEE THAT WE DO NOT NEED TO NEED TO SIZE CHECK
*/ */
size_t len = strlen(value) + pPhrase->fmt_bytes + 1; len = strlen(value) + pPhrase->fmt_bytes + 1;
char *out_buf; char *out_buf;
int out_idx; int out_idx;
@@ -914,6 +921,14 @@ SMCResult Translator::ReadSMC_LeavingSection(const SMCStates *states)
SMCResult Translator::ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value) SMCResult Translator::ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value)
{ {
size_t len = strlen(key);
if (len < 2 || len > 3)
{
smcore.LogError("[SM] Warning encountered parsing languages.cfg file.");
smcore.LogError("[SM] Invalid language code \"%s\" is being ignored.", key);
}
AddLanguage(key, value); AddLanguage(key, value);
return SMCResult_Continue; return SMCResult_Continue;
+1 -1
View File
@@ -119,6 +119,7 @@ public:
unsigned int FindOrAddPhraseFile(const char *phrase_file); unsigned int FindOrAddPhraseFile(const char *phrase_file);
BaseStringTable *GetStringTable(); BaseStringTable *GetStringTable();
unsigned int GetLanguageCount(); unsigned int GetLanguageCount();
bool GetLanguageInfo(unsigned int number, const char **code, const char **name);
bool GetLanguageByCode(const char *code, unsigned int *index); bool GetLanguageByCode(const char *code, unsigned int *index);
bool GetLanguageByName(const char *name, unsigned int *index); bool GetLanguageByName(const char *name, unsigned int *index);
CPhraseFile *GetFileByIndex(unsigned int index); CPhraseFile *GetFileByIndex(unsigned int index);
@@ -145,7 +146,6 @@ public: //ITranslator
unsigned int numparams, unsigned int numparams,
size_t *pOutLength, size_t *pOutLength,
const char **pFailPhrase); const char **pFailPhrase);
bool GetLanguageInfo(unsigned int number, const char **code, const char **name);
private: private:
bool AddLanguage(const char *langcode, const char *description); bool AddLanguage(const char *langcode, const char *description);
private: private:
+1 -1
View File
@@ -62,7 +62,7 @@ IGameHelpers *gamehelpers;
static void AddCorePhraseFile(const char *filename) static void AddCorePhraseFile(const char *filename)
{ {
g_pCorePhrases->AddPhraseFile(filename); g_pCorePhrases->AddPhraseFile("antiflood.phrases");
} }
static IGameConfig *GetCoreGameConfig() static IGameConfig *GetCoreGameConfig()
+1 -17
View File
@@ -42,7 +42,7 @@ using namespace SourceMod;
* Add 1 to the RHS of this expression to bump the intercom file * Add 1 to the RHS of this expression to bump the intercom file
* This is to prevent mismatching core/logic binaries * This is to prevent mismatching core/logic binaries
*/ */
#define SM_LOGIC_MAGIC (0x0F47C0DE - 18) #define SM_LOGIC_MAGIC (0x0F47C0DE - 17)
#if defined SM_LOGIC #if defined SM_LOGIC
class IVEngineServer class IVEngineServer
@@ -55,20 +55,6 @@ public:
virtual void ServerCommand(const char *cmd) = 0; virtual void ServerCommand(const char *cmd) = 0;
}; };
typedef int FileFindHandle_t;
#if defined SM_LOGIC
class IFileSystem
#else
class IFileSystem_Logic
#endif
{
public:
virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) = 0;
virtual const char *FindNext(FileFindHandle_t handle) = 0;
virtual void FindClose(FileFindHandle_t handle) = 0;
};
namespace SourceMod namespace SourceMod
{ {
class ISourceMod; class ISourceMod;
@@ -88,7 +74,6 @@ namespace SourceMod
} }
class IVEngineServer; class IVEngineServer;
class IFileSystem;
class ConVar; class ConVar;
struct ServerGlobals struct ServerGlobals
@@ -106,7 +91,6 @@ struct sm_core_t
ISourceMod *sm; ISourceMod *sm;
ILibrarySys *libsys; ILibrarySys *libsys;
IVEngineServer *engine; IVEngineServer *engine;
IFileSystem *filesystem;
IShareSys *sharesys; IShareSys *sharesys;
IRootConsole *rootmenu; IRootConsole *rootmenu;
IPluginManager *pluginsys; IPluginManager *pluginsys;
+5 -21
View File
@@ -43,13 +43,11 @@
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">sourcemod.logic</TargetName>
<TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">sourcemod.logic</TargetName>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;$(MMSOURCE19)\core\sourcehook;..\..\..\public;..\..\..\public\sourcepawn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;$(MMSOURCE18)\core\sourcehook;..\..\..\public;..\..\..\public\sourcepawn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_DEFAULT_THREADER;SM_LOGIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_DEFAULT_THREADER;SM_LOGIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild> <MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -62,7 +60,7 @@
<DebugInformationFormat>EditAndContinue</DebugInformationFormat> <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile> </ClCompile>
<Link> <Link>
<OutputFile>$(OutDir)$(TargetFileName)</OutputFile> <OutputFile>$(OutDir)sourcemod.logic.dll</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@@ -71,17 +69,11 @@
</DataExecutionPrevention> </DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
</Link> </Link>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\public</AdditionalIncludeDirectories>
</ResourceCompile>
<PostBuildEvent>
<Command>IF NOT "%SMOUTDIR%"=="" copy /Y "$(TargetDir)$(TargetFileName)" "%SMOUTDIR%\bin"</Command>
</PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>..;$(MMSOURCE19)\core\sourcehook;..\..\..\public;..\..\..\public\sourcepawn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..;$(MMSOURCE17)\core\sourcehook;..\..\..\public;..\..\..\public\sourcepawn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_LOGIC;SM_DEFAULT_THREADER;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JITX86_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SM_LOGIC;SM_DEFAULT_THREADER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet> <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
@@ -92,7 +84,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Link> <Link>
<OutputFile>$(OutDir)$(TargetFileName)</OutputFile> <OutputFile>$(OutDir)sourcemod.logic.dll</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMTD;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMTD;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@@ -103,12 +95,6 @@
</DataExecutionPrevention> </DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
</Link> </Link>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\public</AdditionalIncludeDirectories>
</ResourceCompile>
<PostBuildEvent>
<Command>IF NOT "%SMOUTDIR%"=="" copy /Y "$(TargetDir)$(TargetFileName)" "%SMOUTDIR%\bin"</Command>
</PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\common_logic.cpp" /> <ClCompile Include="..\common_logic.cpp" />
@@ -143,9 +129,6 @@
<ClCompile Include="..\thread\WinThreads.cpp" /> <ClCompile Include="..\thread\WinThreads.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\public\sm_platform.h" />
<ClInclude Include="..\..\..\public\sm_trie_tpl.h" />
<ClInclude Include="..\..\..\public\sourcemod_version.h" />
<ClInclude Include="..\AutoHandleRooter.h" /> <ClInclude Include="..\AutoHandleRooter.h" />
<ClInclude Include="..\CellArray.h" /> <ClInclude Include="..\CellArray.h" />
<ClInclude Include="..\common_logic.h" /> <ClInclude Include="..\common_logic.h" />
@@ -159,6 +142,7 @@
<ClInclude Include="..\sm_memtable.h" /> <ClInclude Include="..\sm_memtable.h" />
<ClInclude Include="..\sm_symtable.h" /> <ClInclude Include="..\sm_symtable.h" />
<ClInclude Include="..\stringutil.h" /> <ClInclude Include="..\stringutil.h" />
<ClInclude Include="..\svn_version.h" />
<ClInclude Include="..\TextParsers.h" /> <ClInclude Include="..\TextParsers.h" />
<ClInclude Include="..\ThreadSupport.h" /> <ClInclude Include="..\ThreadSupport.h" />
<ClInclude Include="..\thread\BaseWorker.h" /> <ClInclude Include="..\thread\BaseWorker.h" />
+3 -9
View File
@@ -131,6 +131,9 @@
<ClInclude Include="..\Profiler.h"> <ClInclude Include="..\Profiler.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\svn_version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\TextParsers.h"> <ClInclude Include="..\TextParsers.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -176,15 +179,6 @@
<ClInclude Include="..\Translator.h"> <ClInclude Include="..\Translator.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\..\public\sm_trie_tpl.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\public\sourcemod_version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\public\sm_platform.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\version.rc"> <ResourceCompile Include="..\version.rc">
+46 -71
View File
@@ -33,11 +33,9 @@
#include <sm_trie_tpl.h> #include <sm_trie_tpl.h>
#include "common_logic.h" #include "common_logic.h"
#include "CellArray.h" #include "CellArray.h"
#include <IGameHelpers.h>
#include <ILibrarySys.h> #include <ILibrarySys.h>
#include <ITextParsers.h> #include <ITextParsers.h>
#include <ISourceMod.h> #include <ISourceMod.h>
#include "stringutil.h"
using namespace SourceHook; using namespace SourceHook;
@@ -80,47 +78,6 @@ public:
{ {
DumpCache(NULL); DumpCache(NULL);
} }
void GetMapCycleFilePath(char *pBuffer, int maxlen)
{
const char *pEngineName = smcore.GetSourceEngineName();
const char *pMapCycleFileName = m_pMapCycleFile ? smcore.GetCvarString(m_pMapCycleFile) : "mapcycle.txt";
if (strcmp(pEngineName, "tf2") == 0 || strcmp(pEngineName, "css") == 0
|| strcmp(pEngineName, "dods") == 0 || strcmp(pEngineName, "hl2dm") == 0)
{
// These four games and Source SDK 2013 do a lookup in this order; so shall we.
g_pSM->BuildPath(Path_Game,
pBuffer,
maxlen,
"cfg/%s",
pMapCycleFileName);
if (!libsys->PathExists(pBuffer))
{
g_pSM->BuildPath(Path_Game,
pBuffer,
maxlen,
"%s",
pMapCycleFileName);
if (!libsys->PathExists(pBuffer))
{
g_pSM->BuildPath(Path_Game,
pBuffer,
maxlen,
"cfg/mapcycle_default.txt");
}
}
}
else
{
g_pSM->BuildPath(Path_Game,
pBuffer,
maxlen,
"%s",
pMapCycleFileName);
}
}
void AddOrUpdateDefault(const char *name, const char *file) void AddOrUpdateDefault(const char *name, const char *file)
{ {
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
@@ -197,9 +154,11 @@ public:
pDefList->bIsPath = true; pDefList->bIsPath = true;
smcore.strncopy(pDefList->name, "mapcyclefile", sizeof(pDefList->name)); smcore.strncopy(pDefList->name, "mapcyclefile", sizeof(pDefList->name));
g_pSM->BuildPath(Path_Game,
GetMapCycleFilePath(pDefList->path, sizeof(pDefList->path)); pDefList->path,
sizeof(pDefList->path),
"%s",
m_pMapCycleFile ? smcore.GetCvarString(m_pMapCycleFile) : "mapcycle.txt");
pDefList->last_modified_time = 0; pDefList->last_modified_time = 0;
pDefList->pArray = NULL; pDefList->pArray = NULL;
pDefList->serial = 0; pDefList->serial = 0;
@@ -389,39 +348,51 @@ public:
if ((success && pNewArray == NULL) if ((success && pNewArray == NULL)
|| (!success && ((flags & MAPLIST_FLAG_MAPSFOLDER) == MAPLIST_FLAG_MAPSFOLDER))) || (!success && ((flags & MAPLIST_FLAG_MAPSFOLDER) == MAPLIST_FLAG_MAPSFOLDER)))
{ {
char path[255];
IDirectory *pDir;
pNewArray = new CellArray(64); pNewArray = new CellArray(64);
free_new_array = true; free_new_array = true;
g_pSM->BuildPath(Path_Game, path, sizeof(path), "maps");
cell_t *blk; if ((pDir = libsys->OpenDirectory(path)) != NULL)
FileFindHandle_t findHandle;
const char *fileName = smcore.filesystem->FindFirstEx("maps/*.bsp", "GAME", &findHandle);
while (fileName)
{ {
char *ptr;
cell_t *blk;
char buffer[PLATFORM_MAX_PATH]; char buffer[PLATFORM_MAX_PATH];
UTIL_StripExtension(fileName, buffer, sizeof(buffer)); while (pDir->MoreFiles())
if (!engine->IsMapValid(buffer))
{ {
fileName = smcore.filesystem->FindNext(findHandle); if (!pDir->IsEntryFile()
continue; || strcmp(pDir->GetEntryName(), ".") == 0
|| strcmp(pDir->GetEntryName(), "..") == 0)
{
pDir->NextEntry();
continue;
}
smcore.strncopy(buffer, pDir->GetEntryName(), sizeof(buffer));
if ((ptr = strstr(buffer, ".bsp")) == NULL || ptr[4] != '\0')
{
pDir->NextEntry();
continue;
}
*ptr = '\0';
if (!engine->IsMapValid(buffer))
{
pDir->NextEntry();
continue;
}
if ((blk = pNewArray->push()) == NULL)
{
pDir->NextEntry();
continue;
}
smcore.strncopy((char *)blk, buffer, 255);
pDir->NextEntry();
} }
libsys->CloseDirectory(pDir);
if ((blk = pNewArray->push()) == NULL)
{
fileName = smcore.filesystem->FindNext(findHandle);
continue;
}
smcore.strncopy((char *)blk, buffer, 255);
fileName = smcore.filesystem->FindNext(findHandle);
} }
smcore.filesystem->FindClose(findHandle);
/* Remove the array if there were no items. */ /* Remove the array if there were no items. */
if (pNewArray->size() == 0) if (pNewArray->size() == 0)
{ {
@@ -514,7 +485,11 @@ private:
if (m_pMapCycleFile != NULL && strcmp(name, "mapcyclefile") == 0) if (m_pMapCycleFile != NULL && strcmp(name, "mapcyclefile") == 0)
{ {
char path[PLATFORM_MAX_PATH]; char path[PLATFORM_MAX_PATH];
GetMapCycleFilePath(path, sizeof(path)); g_pSM->BuildPath(Path_Game,
path,
sizeof(path),
"%s",
m_pMapCycleFile ? smcore.GetCvarString(m_pMapCycleFile) : "mapcycle.txt");
if (strcmp(path, pMapList->path) != 0) if (strcmp(path, pMapList->path) != 0)
{ {
@@ -549,7 +524,7 @@ private:
{ {
continue; continue;
} }
if (!gamehelpers->IsMapValid(ptr)) if (!engine->IsMapValid(ptr))
{ {
continue; continue;
} }
+1 -1
View File
@@ -179,7 +179,7 @@ static cell_t GetProfilerTime(IPluginContext *pContext, const cell_t *params)
#else #else
int64_t start_us = int64_t(prof->start.tv_sec) * 1000000 + prof->start.tv_usec; int64_t start_us = int64_t(prof->start.tv_sec) * 1000000 + prof->start.tv_usec;
int64_t stop_us = int64_t(prof->end.tv_sec) * 1000000 + prof->end.tv_usec; int64_t stop_us = int64_t(prof->end.tv_sec) * 1000000 + prof->end.tv_usec;
fTime = double(stop_us - start_us) / 1000000.0; fTime = double((stop_us - start_us) / 1000) / 1000.0;
#endif #endif
return sp_ftoc(fTime); return sp_ftoc(fTime);
+2 -2
View File
@@ -94,7 +94,7 @@ void sort_random(cell_t *array, cell_t size)
for (int i = size-1; i > 0; i--) for (int i = size-1; i > 0; i--)
{ {
int n = rand() % (i + 1); int n = (rand() % i) + 1;
if (array[i] != array[n]) if (array[i] != array[n])
{ {
@@ -435,7 +435,7 @@ void sort_adt_random(CellArray *cArray)
for (int i = arraysize-1; i > 0; i--) for (int i = arraysize-1; i > 0; i--)
{ {
int n = rand() % (i + 1); int n = (rand() % i) + 1;
cArray->swap(i, n); cArray->swap(i, n);
} }
-37
View File
@@ -35,11 +35,6 @@
#include <sm_platform.h> #include <sm_platform.h>
#include "stringutil.h" #include "stringutil.h"
// We're in logic so we don't have this from the SDK.
#ifndef MIN
#define MIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
#endif
const char *stristr(const char *str, const char *substr) const char *stristr(const char *str, const char *substr)
{ {
if (!*substr) if (!*substr)
@@ -308,35 +303,3 @@ size_t UTIL_DecodeHexString(unsigned char *buffer, size_t maxlength, const char
return written; return written;
} }
#define PATHSEPARATOR(c) ((c) == '\\' || (c) == '/')
void UTIL_StripExtension(const char *in, char *out, int outSize)
{
// Find the last dot. If it's followed by a dot or a slash, then it's part of a
// directory specifier like ../../somedir/./blah.
// scan backward for '.'
int end = strlen(in) - 1;
while (end > 0 && in[end] != '.' && !PATHSEPARATOR(in[end]))
{
--end;
}
if (end > 0 && !PATHSEPARATOR(in[end]) && end < outSize)
{
int nChars = MIN(end, outSize-1);
if (out != in)
{
memcpy(out, in, nChars);
}
out[nChars] = 0;
}
else
{
// nothing found
if (out != in)
{
strncopy(out, in, outSize);
}
}
}
-2
View File
@@ -40,7 +40,5 @@ char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t se
const char *replace, size_t replaceLen, bool caseSensitive = true); const char *replace, size_t replaceLen, bool caseSensitive = true);
size_t UTIL_DecodeHexString(unsigned char *buffer, size_t maxlength, const char *hexstr); size_t UTIL_DecodeHexString(unsigned char *buffer, size_t maxlength, const char *hexstr);
void UTIL_StripExtension(const char *in, char *out, int outSize);
#endif /* _INCLUDE_SOURCEMOD_COMMON_STRINGUTIL_H_ */ #endif /* _INCLUDE_SOURCEMOD_COMMON_STRINGUTIL_H_ */
+6 -1
View File
@@ -124,6 +124,11 @@ void BaseWorker::AddThreadToQueue(SWThreadHandle *pHandle)
m_ThreadQueue.push_back(pHandle); m_ThreadQueue.push_back(pHandle);
} }
unsigned int BaseWorker::GetMaxThreadsPerFrame()
{
return m_perFrame;
}
WorkerState BaseWorker::GetStatus(unsigned int *threads) WorkerState BaseWorker::GetStatus(unsigned int *threads)
{ {
if (threads) if (threads)
@@ -135,7 +140,7 @@ WorkerState BaseWorker::GetStatus(unsigned int *threads)
unsigned int BaseWorker::RunFrame() unsigned int BaseWorker::RunFrame()
{ {
unsigned int done = 0; unsigned int done = 0;
unsigned int max = m_perFrame; unsigned int max = GetMaxThreadsPerFrame();
SWThreadHandle *swt = NULL; SWThreadHandle *swt = NULL;
IThread *pThread = NULL; IThread *pThread = NULL;
+2 -2
View File
@@ -84,8 +84,6 @@ public: //IWorker
virtual unsigned int Flush(bool flush_cancel); virtual unsigned int Flush(bool flush_cancel);
//returns status and number of threads in queue //returns status and number of threads in queue
virtual WorkerState GetStatus(unsigned int *numThreads); virtual WorkerState GetStatus(unsigned int *numThreads);
virtual void SetMaxThreadsPerFrame(unsigned int threads);
virtual void SetThinkTimePerFrame(unsigned int thinktime) {}
public: //IThreadCreator public: //IThreadCreator
virtual void MakeThread(IThread *pThread); virtual void MakeThread(IThread *pThread);
virtual IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags); virtual IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags);
@@ -94,6 +92,8 @@ public: //IThreadCreator
public: //BaseWorker public: //BaseWorker
virtual void AddThreadToQueue(SWThreadHandle *pHandle); virtual void AddThreadToQueue(SWThreadHandle *pHandle);
virtual SWThreadHandle *PopThreadFromQueue(); virtual SWThreadHandle *PopThreadFromQueue();
virtual void SetMaxThreadsPerFrame(unsigned int threads);
virtual unsigned int GetMaxThreadsPerFrame();
protected: protected:
SourceHook::List<SWThreadHandle *> m_ThreadQueue; SourceHook::List<SWThreadHandle *> m_ThreadQueue;
unsigned int m_perFrame; unsigned int m_perFrame;
-5
View File
@@ -209,11 +209,6 @@ WorkerState ThreadWorker::GetStatus(unsigned int *threads)
return state; return state;
} }
void ThreadWorker::SetThinkTimePerFrame(unsigned int thinktime)
{
m_think_time = thinktime;
}
bool ThreadWorker::Start() bool ThreadWorker::Start()
{ {
if (m_state == Worker_Invalid) if (m_state == Worker_Invalid)
+1 -3
View File
@@ -34,7 +34,7 @@
#include "BaseWorker.h" #include "BaseWorker.h"
#define DEFAULT_THINK_TIME_MS 20 #define DEFAULT_THINK_TIME_MS 50
class ThreadWorker : public BaseWorker, public IThread class ThreadWorker : public BaseWorker, public IThread
{ {
@@ -53,8 +53,6 @@ public: //IWorker
virtual bool Stop(bool flush_cancel); virtual bool Stop(bool flush_cancel);
//returns status and number of threads in queue //returns status and number of threads in queue
virtual WorkerState GetStatus(unsigned int *numThreads); virtual WorkerState GetStatus(unsigned int *numThreads);
//virtual void SetMaxThreadsPerFrame(unsigned int threads);
virtual void SetThinkTimePerFrame(unsigned int thinktime);
public: //BaseWorker public: //BaseWorker
virtual void AddThreadToQueue(SWThreadHandle *pHandle); virtual void AddThreadToQueue(SWThreadHandle *pHandle);
virtual SWThreadHandle *PopThreadFromQueue(); virtual SWThreadHandle *PopThreadFromQueue();
+4 -4
View File
@@ -29,8 +29,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION SM_VERSION_FILE FILEVERSION SM_FILE_VERSION
PRODUCTVERSION SM_VERSION_FILE PRODUCTVERSION SM_FILE_VERSION
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@@ -47,12 +47,12 @@ BEGIN
BEGIN BEGIN
VALUE "Comments", "SourceMod" VALUE "Comments", "SourceMod"
VALUE "FileDescription", "SourceMod Core Logic" VALUE "FileDescription", "SourceMod Core Logic"
VALUE "FileVersion", SM_VERSION_STRING VALUE "FileVersion", SM_FULL_VERSION
VALUE "InternalName", "sourcemod" VALUE "InternalName", "sourcemod"
VALUE "LegalCopyright", "Copyright (c) 2004-2009, AlliedModders LLC" VALUE "LegalCopyright", "Copyright (c) 2004-2009, AlliedModders LLC"
VALUE "OriginalFilename", "sourcemod.logic.dll" VALUE "OriginalFilename", "sourcemod.logic.dll"
VALUE "ProductName", "SourceMod" VALUE "ProductName", "SourceMod"
VALUE "ProductVersion", SM_VERSION_STRING VALUE "ProductVersion", SM_FULL_VERSION
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
+3 -35
View File
@@ -90,25 +90,6 @@ public:
static VEngineServer_Logic logic_engine; static VEngineServer_Logic logic_engine;
class VFileSystem_Logic : public IFileSystem_Logic
{
public:
const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle)
{
return filesystem->FindFirstEx(pWildCard, pPathID, pHandle);
}
const char *FindNext(FileFindHandle_t handle)
{
return filesystem->FindNext(handle);
}
void FindClose(FileFindHandle_t handle)
{
filesystem->FindClose(handle);
}
};
static VFileSystem_Logic logic_filesystem;
static void add_natives(sp_nativeinfo_t *natives) static void add_natives(sp_nativeinfo_t *natives)
{ {
g_pCoreNatives->AddNatives(natives); g_pCoreNatives->AddNatives(natives);
@@ -178,32 +159,20 @@ static const char *get_source_engine_name()
return "bloodygoodtime"; return "bloodygoodtime";
#elif SOURCE_ENGINE == SE_EYE #elif SOURCE_ENGINE == SE_EYE
return "eye"; return "eye";
#elif SOURCE_ENGINE == SE_CSS #elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
return "css"; return "orangebox_valve";
#elif SOURCE_ENGINE == SE_HL2DM
return "hl2dm";
#elif SOURCE_ENGINE == SE_DODS
return "dods";
#elif SOURCE_ENGINE == SE_TF2
return "tf2";
#elif SOURCE_ENGINE == SE_LEFT4DEAD #elif SOURCE_ENGINE == SE_LEFT4DEAD
return "left4dead"; return "left4dead";
#elif SOURCE_ENGINE == SE_NUCLEARDAWN
return "nucleardawn";
#elif SOURCE_ENGINE == SE_LEFT4DEAD2 #elif SOURCE_ENGINE == SE_LEFT4DEAD2
return "left4dead2"; return "left4dead2";
#elif SOURCE_ENGINE == SE_ALIENSWARM #elif SOURCE_ENGINE == SE_ALIENSWARM
return "alienswarm"; return "alienswarm";
#elif SOURCE_ENGINE == SE_PORTAL2
return "portal2";
#elif SOURCE_ENGINE == SE_CSGO
return "csgo";
#endif #endif
} }
static bool symbols_are_hidden() static bool symbols_are_hidden()
{ {
#if (SOURCE_ENGINE == SE_CSS) || (SOURCE_ENGINE == SE_HL2DM) || (SOURCE_ENGINE == SE_DODS) || (SOURCE_ENGINE == SE_TF2) || (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_NUCLEARDAWN) || (SOURCE_ENGINE == SE_LEFT4DEAD2) || (SOURCE_ENGINE == SE_CSGO) #if (SOURCE_ENGINE == SE_ORANGEBOXVALVE) || (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
return true; return true;
#else #else
return false; return false;
@@ -225,7 +194,6 @@ static sm_core_t core_bridge =
&g_SourceMod, &g_SourceMod,
&g_LibSys, &g_LibSys,
reinterpret_cast<IVEngineServer*>(&logic_engine), reinterpret_cast<IVEngineServer*>(&logic_engine),
reinterpret_cast<IFileSystem*>(&logic_filesystem),
&g_ShareSys, &g_ShareSys,
&g_RootMenu, &g_RootMenu,
&g_PluginSys, &g_PluginSys,
-18
View File
@@ -5,8 +5,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sourcemod_mm", "sourcemod_m
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
CrazyDebug - Alien Swarm|Win32 = CrazyDebug - Alien Swarm|Win32
CrazyDebug - CS GO|Win32 = CrazyDebug - CS GO|Win32
CrazyDebug - Dark Messiah|Win32 = CrazyDebug - Dark Messiah|Win32 CrazyDebug - Dark Messiah|Win32 = CrazyDebug - Dark Messiah|Win32
CrazyDebug - Episode 1|Win32 = CrazyDebug - Episode 1|Win32 CrazyDebug - Episode 1|Win32 = CrazyDebug - Episode 1|Win32
CrazyDebug - Left 4 Dead 2|Win32 = CrazyDebug - Left 4 Dead 2|Win32 CrazyDebug - Left 4 Dead 2|Win32 = CrazyDebug - Left 4 Dead 2|Win32
@@ -14,8 +12,6 @@ Global
CrazyDebug - Old Metamod|Win32 = CrazyDebug - Old Metamod|Win32 CrazyDebug - Old Metamod|Win32 = CrazyDebug - Old Metamod|Win32
CrazyDebug - Orange Box Valve|Win32 = CrazyDebug - Orange Box Valve|Win32 CrazyDebug - Orange Box Valve|Win32 = CrazyDebug - Orange Box Valve|Win32
CrazyDebug - Orange Box|Win32 = CrazyDebug - Orange Box|Win32 CrazyDebug - Orange Box|Win32 = CrazyDebug - Orange Box|Win32
Debug - Alien Swarm|Win32 = Debug - Alien Swarm|Win32
Debug - CS GO|Win32 = Debug - CS GO|Win32
Debug - Dark Messiah|Win32 = Debug - Dark Messiah|Win32 Debug - Dark Messiah|Win32 = Debug - Dark Messiah|Win32
Debug - Episode 1|Win32 = Debug - Episode 1|Win32 Debug - Episode 1|Win32 = Debug - Episode 1|Win32
Debug - Left 4 Dead 2|Win32 = Debug - Left 4 Dead 2|Win32 Debug - Left 4 Dead 2|Win32 = Debug - Left 4 Dead 2|Win32
@@ -23,8 +19,6 @@ Global
Debug - Old Metamod|Win32 = Debug - Old Metamod|Win32 Debug - Old Metamod|Win32 = Debug - Old Metamod|Win32
Debug - Orange Box Valve|Win32 = Debug - Orange Box Valve|Win32 Debug - Orange Box Valve|Win32 = Debug - Orange Box Valve|Win32
Debug - Orange Box|Win32 = Debug - Orange Box|Win32 Debug - Orange Box|Win32 = Debug - Orange Box|Win32
Release - Alien Swarm|Win32 = Release - Alien Swarm|Win32
Release - CS GO|Win32 = Release - CS GO|Win32
Release - Dark Messiah|Win32 = Release - Dark Messiah|Win32 Release - Dark Messiah|Win32 = Release - Dark Messiah|Win32
Release - Episode 1|Win32 = Release - Episode 1|Win32 Release - Episode 1|Win32 = Release - Episode 1|Win32
Release - Left 4 Dead 2|Win32 = Release - Left 4 Dead 2|Win32 Release - Left 4 Dead 2|Win32 = Release - Left 4 Dead 2|Win32
@@ -34,10 +28,6 @@ Global
Release - Orange Box|Win32 = Release - Orange Box|Win32 Release - Orange Box|Win32 = Release - Orange Box|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Alien Swarm|Win32.ActiveCfg = CrazyDebug - Alien Swarm|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Alien Swarm|Win32.Build.0 = CrazyDebug - Alien Swarm|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - CS GO|Win32.ActiveCfg = CrazyDebug - CS GO|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - CS GO|Win32.Build.0 = CrazyDebug - CS GO|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.ActiveCfg = CrazyDebug - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.ActiveCfg = CrazyDebug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.Build.0 = CrazyDebug - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Dark Messiah|Win32.Build.0 = CrazyDebug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.ActiveCfg = CrazyDebug - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Episode 1|Win32.ActiveCfg = CrazyDebug - Episode 1|Win32
@@ -52,10 +42,6 @@ Global
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box Valve|Win32.Build.0 = CrazyDebug - Orange Box Valve|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box Valve|Win32.Build.0 = CrazyDebug - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box|Win32.ActiveCfg = CrazyDebug - Orange Box|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box|Win32.ActiveCfg = CrazyDebug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box|Win32.Build.0 = CrazyDebug - Orange Box|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.CrazyDebug - Orange Box|Win32.Build.0 = CrazyDebug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Alien Swarm|Win32.ActiveCfg = Debug - Alien Swarm|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Alien Swarm|Win32.Build.0 = Debug - Alien Swarm|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - CS GO|Win32.ActiveCfg = Debug - CS GO|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - CS GO|Win32.Build.0 = Debug - CS GO|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.ActiveCfg = Debug - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.ActiveCfg = Debug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.Build.0 = Debug - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Dark Messiah|Win32.Build.0 = Debug - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.ActiveCfg = Debug - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Episode 1|Win32.ActiveCfg = Debug - Episode 1|Win32
@@ -70,10 +56,6 @@ Global
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box Valve|Win32.Build.0 = Debug - Orange Box Valve|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box Valve|Win32.Build.0 = Debug - Orange Box Valve|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box|Win32.ActiveCfg = Debug - Orange Box|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box|Win32.ActiveCfg = Debug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box|Win32.Build.0 = Debug - Orange Box|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Debug - Orange Box|Win32.Build.0 = Debug - Orange Box|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Alien Swarm|Win32.ActiveCfg = Release - Alien Swarm|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Alien Swarm|Win32.Build.0 = Release - Alien Swarm|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - CS GO|Win32.ActiveCfg = Release - CS GO|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - CS GO|Win32.Build.0 = Release - CS GO|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.ActiveCfg = Release - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.ActiveCfg = Release - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.Build.0 = Release - Dark Messiah|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Dark Messiah|Win32.Build.0 = Release - Dark Messiah|Win32
{E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.ActiveCfg = Release - Episode 1|Win32 {E39527CD-7CAB-4420-97CC-DA1B93B260BC}.Release - Episode 1|Win32.ActiveCfg = Release - Episode 1|Win32
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+24 -50
View File
@@ -25,12 +25,6 @@
<UniqueIdentifier>{2A750240-7C10-455f-A900-B9A9D362356C}</UniqueIdentifier> <UniqueIdentifier>{2A750240-7C10-455f-A900-B9A9D362356C}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions> <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter> </Filter>
<Filter Include="HL2SDK\Protobuf">
<UniqueIdentifier>{28cf0347-3553-4d24-b9ad-476ba5197680}</UniqueIdentifier>
</Filter>
<Filter Include="HL2SDK\Protobuf\CSGO">
<UniqueIdentifier>{0e62c72e-57b1-40d2-9a94-059f535ce719}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\AdminCache.cpp"> <ClCompile Include="..\AdminCache.cpp">
@@ -204,18 +198,6 @@
<ClCompile Include="..\smn_vector.cpp"> <ClCompile Include="..\smn_vector.cpp">
<Filter>Natives</Filter> <Filter>Natives</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\..\..\hl2sdks\hl2sdk-csgo\public\game\shared\csgo\protobuf\cstrike15_usermessage_helpers.cpp">
<Filter>HL2SDK\Protobuf\CSGO</Filter>
</ClCompile>
<ClCompile Include="..\..\..\hl2sdks\hl2sdk-csgo\public\game\shared\csgo\protobuf\cstrike15_usermessages.pb.cc">
<Filter>HL2SDK\Protobuf\CSGO</Filter>
</ClCompile>
<ClCompile Include="..\..\..\hl2sdks\hl2sdk-csgo\public\engine\protobuf\netmessages.pb.cc">
<Filter>HL2SDK\Protobuf</Filter>
</ClCompile>
<ClCompile Include="..\smn_protobuf.cpp">
<Filter>Natives</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\AdminCache.h"> <ClInclude Include="..\AdminCache.h">
@@ -227,6 +209,9 @@
<ClInclude Include="..\CDataPack.h"> <ClInclude Include="..\CDataPack.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\CellArray.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CellRecipientFilter.h"> <ClInclude Include="..\CellRecipientFilter.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -272,6 +257,9 @@
<ClInclude Include="..\frame_hooks.h"> <ClInclude Include="..\frame_hooks.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\GameConfigs.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\HalfLife2.h"> <ClInclude Include="..\HalfLife2.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -287,6 +275,9 @@
<ClInclude Include="..\logic_bridge.h"> <ClInclude Include="..\logic_bridge.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\MemoryUtils.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\MenuManager.h"> <ClInclude Include="..\MenuManager.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -311,6 +302,9 @@
<ClInclude Include="..\NextMap.h"> <ClInclude Include="..\NextMap.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\PhraseCollection.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\PlayerManager.h"> <ClInclude Include="..\PlayerManager.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -335,6 +329,9 @@
<ClInclude Include="..\sm_memtable.h"> <ClInclude Include="..\sm_memtable.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\public\sm_platform.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_queue.h"> <ClInclude Include="..\sm_queue.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -347,12 +344,18 @@
<ClInclude Include="..\sm_stringutil.h"> <ClInclude Include="..\sm_stringutil.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\sm_symtable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sm_trie.h"> <ClInclude Include="..\sm_trie.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\public\sm_trie_tpl.h"> <ClInclude Include="..\..\public\sm_trie_tpl.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\sm_version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\smn_usermsgs.h"> <ClInclude Include="..\smn_usermsgs.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -365,6 +368,9 @@
<ClInclude Include="..\TimerSys.h"> <ClInclude Include="..\TimerSys.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\Translator.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\UserMessages.h"> <ClInclude Include="..\UserMessages.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -452,42 +458,10 @@
<ClInclude Include="..\convar_sm.h"> <ClInclude Include="..\convar_sm.h">
<Filter>HL2SDK</Filter> <Filter>HL2SDK</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\..\public\sm_platform.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\public\sourcemod_version.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\convar_sm_l4d.h">
<Filter>HL2SDK</Filter>
</ClInclude>
<ClInclude Include="..\convar_sm_ob.h">
<Filter>HL2SDK</Filter>
</ClInclude>
<ClInclude Include="..\convar_sm_swarm.h">
<Filter>HL2SDK</Filter>
</ClInclude>
<ClInclude Include="..\..\..\hl2sdks\hl2sdk-csgo\public\game\shared\csgo\protobuf\cstrike15_usermessage_helpers.h">
<Filter>HL2SDK\Protobuf\CSGO</Filter>
</ClInclude>
<ClInclude Include="..\..\..\hl2sdks\hl2sdk-csgo\public\game\shared\csgo\protobuf\cstrike15_usermessages.pb.h">
<Filter>HL2SDK\Protobuf\CSGO</Filter>
</ClInclude>
<ClInclude Include="..\..\..\hl2sdks\hl2sdk-csgo\public\engine\protobuf\netmessages.pb.h">
<Filter>HL2SDK\Protobuf</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\version.rc"> <ResourceCompile Include="..\version.rc">
<Filter>Resources</Filter> <Filter>Resources</Filter>
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Library Include="..\..\..\hl2sdks\hl2sdk-csgo\lib\win32\release\vs2010\libprotobuf.lib">
<Filter>HL2SDK\Protobuf</Filter>
</Library>
<Library Include="..\..\..\hl2sdks\hl2sdk-csgo\lib\win32\debug\vs2010\libprotobuf.lib">
<Filter>HL2SDK\Protobuf</Filter>
</Library>
</ItemGroup>
</Project> </Project>
+4 -5
View File
@@ -39,7 +39,7 @@
RootConsoleMenu g_RootMenu; RootConsoleMenu g_RootMenu;
ConVar sourcemod_version("sourcemod_version", SOURCEMOD_VERSION, FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY, "SourceMod Version"); ConVar sourcemod_version("sourcemod_version", SM_FULL_VERSION, FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY, "SourceMod Version");
RootConsoleMenu::RootConsoleMenu() RootConsoleMenu::RootConsoleMenu()
{ {
@@ -329,21 +329,20 @@ void RootConsoleMenu::OnRootConsoleCommand(const char *cmdname, const CCommand &
ConsolePrint(" Scott \"DS\" Ehlert"); ConsolePrint(" Scott \"DS\" Ehlert");
ConsolePrint(" Fyren"); ConsolePrint(" Fyren");
ConsolePrint(" Nicholas \"psychonic\" Hastings"); ConsolePrint(" Nicholas \"psychonic\" Hastings");
ConsolePrint(" Asher \"asherkin\" Baker");
ConsolePrint(" Borja \"faluco\" Ferrer"); ConsolePrint(" Borja \"faluco\" Ferrer");
ConsolePrint(" Pavol \"PM OnoTo\" Marko"); ConsolePrint(" Pavol \"PM OnoTo\" Marko");
ConsolePrint(" Special thanks to Liam, ferret, and Mani"); ConsolePrint(" Special thanks to asherkin, Liam, ferret, and Mani");
ConsolePrint(" Special thanks to Viper and SteamFriends"); ConsolePrint(" Special thanks to Viper and SteamFriends");
ConsolePrint(" http://www.sourcemod.net/"); ConsolePrint(" http://www.sourcemod.net/");
} }
else if (strcmp(cmdname, "version") == 0) else if (strcmp(cmdname, "version") == 0)
{ {
ConsolePrint(" SourceMod Version Information:"); ConsolePrint(" SourceMod Version Information:");
ConsolePrint(" SourceMod Version: %s", SOURCEMOD_VERSION); ConsolePrint(" SourceMod Version: %s", SM_FULL_VERSION);
ConsolePrint(" SourcePawn Engine: %s (build %s)", g_pSourcePawn2->GetEngineName(), g_pSourcePawn2->GetVersionString()); ConsolePrint(" SourcePawn Engine: %s (build %s)", g_pSourcePawn2->GetEngineName(), g_pSourcePawn2->GetVersionString());
ConsolePrint(" SourcePawn API: v1 = %d, v2 = %d", g_pSourcePawn->GetEngineAPIVersion(), g_pSourcePawn2->GetAPIVersion()); ConsolePrint(" SourcePawn API: v1 = %d, v2 = %d", g_pSourcePawn->GetEngineAPIVersion(), g_pSourcePawn2->GetAPIVersion());
ConsolePrint(" Compiled on: %s %s", __DATE__, __TIME__); ConsolePrint(" Compiled on: %s %s", __DATE__, __TIME__);
ConsolePrint(" Build ID: %s", SOURCEMOD_BUILD_ID); ConsolePrint(" Build ID: %s", SM_BUILD_UNIQUEID);
ConsolePrint(" http://www.sourcemod.net/"); ConsolePrint(" http://www.sourcemod.net/");
} }
} }
-7
View File
@@ -29,16 +29,11 @@
* Version: $Id$ * Version: $Id$
*/ */
#include "UserMessages.h"
#ifndef USE_PROTOBUF_USERMESSAGES
#include "sourcemod.h" #include "sourcemod.h"
#include "HandleSys.h" #include "HandleSys.h"
#include <bitbuf.h> #include <bitbuf.h>
#include <vector.h> #include <vector.h>
#include <HalfLife2.h> #include <HalfLife2.h>
#include "smn_usermsgs.h"
static cell_t smn_BfWriteBool(IPluginContext *pCtx, const cell_t *params) static cell_t smn_BfWriteBool(IPluginContext *pCtx, const cell_t *params)
{ {
@@ -718,5 +713,3 @@ REGISTER_NATIVES(bitbufnatives)
{"BfGetNumBytesLeft", smn_BfGetNumBytesLeft}, {"BfGetNumBytesLeft", smn_BfGetNumBytesLeft},
{NULL, NULL} {NULL, NULL}
}; };
#endif
+6 -29
View File
@@ -48,10 +48,6 @@
#include "ConsoleDetours.h" #include "ConsoleDetours.h"
#include "ConCommandBaseIterator.h" #include "ConCommandBaseIterator.h"
#if SOURCE_ENGINE == SE_CSGO
#include <netmessages.pb.h>
#endif
#if SOURCE_ENGINE >= SE_EYE #if SOURCE_ENGINE >= SE_EYE
#define NETMSG_BITS 6 #define NETMSG_BITS 6
#else #else
@@ -726,9 +722,7 @@ static cell_t sm_RegConsoleCmd(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Invalid function id (%X)", params[2]); return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
} }
CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext()); if (!g_ConCmds.AddConsoleCommand(pFunction, name, help, params[4]))
const char *group = pPlugin->GetFilename();
if (!g_ConCmds.AddAdminCommand(pFunction, name, group, 0, help, params[4]))
{ {
return pContext->ThrowNativeError("Command \"%s\" could not be created. A convar with the same name already exists.", name); return pContext->ThrowNativeError("Command \"%s\" could not be created. A convar with the same name already exists.", name);
} }
@@ -913,7 +907,7 @@ cell_t g_ServerCommandBufferLength;
bool g_ShouldCatchSpew = false; bool g_ShouldCatchSpew = false;
#if SOURCE_ENGINE < SE_NUCLEARDAWN #if SOURCE_ENGINE < SE_LEFT4DEAD2
SpewOutputFunc_t g_OriginalSpewOutputFunc = NULL; SpewOutputFunc_t g_OriginalSpewOutputFunc = NULL;
SpewRetval_t SourcemodSpewOutputFunc(SpewType_t spewType, tchar const *pMsg) SpewRetval_t SourcemodSpewOutputFunc(SpewType_t spewType, tchar const *pMsg)
@@ -952,7 +946,7 @@ CON_COMMAND(sm_conhook_start, "")
return; return;
} }
#if SOURCE_ENGINE < SE_NUCLEARDAWN #if SOURCE_ENGINE < SE_LEFT4DEAD2
g_OriginalSpewOutputFunc = GetSpewOutputFunc(); g_OriginalSpewOutputFunc = GetSpewOutputFunc();
SpewOutputFunc(SourcemodSpewOutputFunc); SpewOutputFunc(SourcemodSpewOutputFunc);
#else #else
@@ -973,7 +967,7 @@ CON_COMMAND(sm_conhook_stop, "")
return; return;
} }
#if SOURCE_ENGINE < SE_NUCLEARDAWN #if SOURCE_ENGINE < SE_LEFT4DEAD2
SpewOutputFunc(g_OriginalSpewOutputFunc); SpewOutputFunc(g_OriginalSpewOutputFunc);
#else #else
LoggingSystem_PopLoggingState(false); LoggingSystem_PopLoggingState(false);
@@ -1097,8 +1091,6 @@ static cell_t FakeClientCommand(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Client %d is not connected", params[1]); return pContext->ThrowNativeError("Client %d is not connected", params[1]);
} }
g_SourceMod.SetGlobalTarget(params[1]);
char buffer[256]; char buffer[256];
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
@@ -1126,8 +1118,6 @@ static cell_t FakeClientCommandEx(IPluginContext *pContext, const cell_t *params
return pContext->ThrowNativeError("Client %d is not connected", params[1]); return pContext->ThrowNativeError("Client %d is not connected", params[1]);
} }
g_SourceMod.SetGlobalTarget(params[1]);
char buffer[256]; char buffer[256];
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
@@ -1176,6 +1166,8 @@ static cell_t ReplyToCommand(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Client %d is not connected", params[1]); return pContext->ThrowNativeError("Client %d is not connected", params[1]);
} }
g_SourceMod.SetGlobalTarget(params[1]);
unsigned int replyto = g_ChatTriggers.GetReplyTo(); unsigned int replyto = g_ChatTriggers.GetReplyTo();
if (replyto == SM_REPLY_CONSOLE) if (replyto == SM_REPLY_CONSOLE)
{ {
@@ -1433,25 +1425,10 @@ static cell_t SendConVarValue(IPluginContext *pContext, const cell_t *params)
char data[256]; char data[256];
bf_write buffer(data, sizeof(data)); bf_write buffer(data, sizeof(data));
#if SOURCE_ENGINE == SE_CSGO
CNETMsg_SetConVar msg;
CMsg_CVars_CVar *cvar = msg.mutable_convars()->add_cvars();
cvar->set_name(pConVar->GetName());
cvar->set_value(value);
int msgsize = msg.ByteSize();
buffer.WriteVarInt32(net_SetConVar);
buffer.WriteVarInt32(msgsize);
msg.SerializeWithCachedSizesToArray( (uint8 *)( buffer.GetBasePointer() + buffer.GetNumBytesWritten() ) );
buffer.SeekToBit( ( buffer.GetNumBytesWritten() + msgsize ) * 8 );
#else
buffer.WriteUBitLong(NET_SETCONVAR, NETMSG_BITS); buffer.WriteUBitLong(NET_SETCONVAR, NETMSG_BITS);
buffer.WriteByte(1); buffer.WriteByte(1);
buffer.WriteString(pConVar->GetName()); buffer.WriteString(pConVar->GetName());
buffer.WriteString(value); buffer.WriteString(value);
#endif
CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]); CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]);
-7
View File
@@ -43,7 +43,6 @@
#include "Logger.h" #include "Logger.h"
#include "ExtensionSys.h" #include "ExtensionSys.h"
#include <sm_trie_tpl.h> #include <sm_trie_tpl.h>
#include <sh_memory.h>
#if defined PLATFORM_WINDOWS #if defined PLATFORM_WINDOWS
#include <windows.h> #include <windows.h>
@@ -730,17 +729,11 @@ static cell_t StoreToAddress(IPluginContext *pContext, const cell_t *params)
switch(size) switch(size)
{ {
case NumberType_Int8: case NumberType_Int8:
SourceHook::SetMemAccess(addr, sizeof(uint8_t), SH_MEM_READ|SH_MEM_WRITE|SH_MEM_EXEC);
*reinterpret_cast<uint8_t*>(addr) = data; *reinterpret_cast<uint8_t*>(addr) = data;
break;
case NumberType_Int16: case NumberType_Int16:
SourceHook::SetMemAccess(addr, sizeof(uint16_t), SH_MEM_READ|SH_MEM_WRITE|SH_MEM_EXEC);
*reinterpret_cast<uint16_t*>(addr) = data; *reinterpret_cast<uint16_t*>(addr) = data;
break;
case NumberType_Int32: case NumberType_Int32:
SourceHook::SetMemAccess(addr, sizeof(uint32_t), SH_MEM_READ|SH_MEM_WRITE|SH_MEM_EXEC);
*reinterpret_cast<uint32_t*>(addr) = data; *reinterpret_cast<uint32_t*>(addr) = data;
break;
default: default:
pContext->ThrowNativeError("Invalid number types %d", size); pContext->ThrowNativeError("Invalid number types %d", size);
} }
-18
View File
@@ -1407,23 +1407,6 @@ static cell_t SQL_ConnectCustom(IPluginContext *pContext, const cell_t *params)
return hndl; return hndl;
} }
static cell_t SQL_SetCharset(IPluginContext *pContext, const cell_t *params)
{
IDatabase *db = NULL;
HandleError err;
if ((err = g_DBMan.ReadHandle(params[1], DBHandle_Database, (void **)&db))
!= HandleError_None)
{
return pContext->ThrowNativeError("Invalid database Handle %x (error: %d)", params[1], err);
}
char *characterset;
pContext->LocalToString(params[2], &characterset);
return db->SetCharacterSet(characterset);
}
REGISTER_NATIVES(dbNatives) REGISTER_NATIVES(dbNatives)
{ {
{"SQL_BindParamInt", SQL_BindParamInt}, {"SQL_BindParamInt", SQL_BindParamInt},
@@ -1465,7 +1448,6 @@ REGISTER_NATIVES(dbNatives)
{"SQL_TQuery", SQL_TQuery}, {"SQL_TQuery", SQL_TQuery},
{"SQL_UnlockDatabase", SQL_UnlockDatabase}, {"SQL_UnlockDatabase", SQL_UnlockDatabase},
{"SQL_ConnectCustom", SQL_ConnectCustom}, {"SQL_ConnectCustom", SQL_ConnectCustom},
{"SQL_SetCharset", SQL_SetCharset},
{NULL, NULL}, {NULL, NULL},
}; };
+88 -82
View File
@@ -325,7 +325,7 @@ static cell_t GetEdictClassname(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Invalid edict (%d - %d)", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Invalid edict (%d - %d)", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
const char *cls = g_HL2.GetEntityClassname(pEdict); const char *cls = pEdict->GetClassName();
if (!cls || cls[0] == '\0') if (!cls || cls[0] == '\0')
{ {
@@ -620,12 +620,9 @@ static cell_t GetEntDataEnt2(IPluginContext *pContext, const cell_t *params)
} }
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset); CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle()) int ref = g_HL2.IndexToReference(hndl.GetEntryIndex());
return -1; return g_HL2.ReferenceToBCompatRef(ref);
return g_HL2.EntityToBCompatRef(pHandleEntity);
} }
/* THIS GUY IS DEPRECATED. */ /* THIS GUY IS DEPRECATED. */
@@ -815,13 +812,9 @@ static cell_t FindDataMapOffs(IPluginContext *pContext, const cell_t *params)
} }
pContext->LocalToString(params[2], &offset); pContext->LocalToString(params[2], &offset);
bool isNested = false; if ((td=g_HL2.FindInDataMap(pMap, offset)) == NULL)
if ((td=g_HL2.FindInDataMap(pMap, offset, &isNested)) == NULL)
{ {
if (isNested) return -1;
return pContext->ThrowNativeError("Property \"%s\" is not safe to access for entity %d", offset, params[1]);
else
return -1;
} }
if (params[0] == 4) if (params[0] == 4)
@@ -966,22 +959,12 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
{ \ { \
return pContext->ThrowNativeError("Could not retrieve datamap"); \ return pContext->ThrowNativeError("Could not retrieve datamap"); \
} \ } \
bool isNested = false; \ if ((td = g_HL2.FindInDataMap(pMap, prop)) == NULL) \
if ((td = g_HL2.FindInDataMap(pMap, prop, &isNested)) == NULL) \
{ \ { \
const char *class_name = g_HL2.GetEntityClassname(pEntity); \ return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
if (isNested) \ prop, \
{ \ params[1], \
return pContext->ThrowNativeError("Property \"%s\" not safe to access (entity %d/%s)", \ class_name); \
prop, \
params[1], \
((class_name) ? class_name : "")); \
} else { \
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
prop, \
params[1], \
((class_name) ? class_name : "")); \
} \
} }
#define CHECK_SET_PROP_DATA_OFFSET() \ #define CHECK_SET_PROP_DATA_OFFSET() \
@@ -997,7 +980,6 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
#define FIND_PROP_SEND(type, type_name) \ #define FIND_PROP_SEND(type, type_name) \
sm_sendprop_info_t info;\ sm_sendprop_info_t info;\
SendProp *pProp; \
IServerUnknown *pUnk = (IServerUnknown *)pEntity; \ IServerUnknown *pUnk = (IServerUnknown *)pEntity; \
IServerNetworkable *pNet = pUnk->GetNetworkable(); \ IServerNetworkable *pNet = pUnk->GetNetworkable(); \
if (!pNet) \ if (!pNet) \
@@ -1006,18 +988,16 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
} \ } \
if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info)) \ if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info)) \
{ \ { \
const char *class_name = g_HL2.GetEntityClassname(pEntity); \
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \ return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", \
prop, \ prop, \
params[1], \ params[1], \
((class_name) ? class_name : "")); \ class_name); \
} \ } \
\ \
offset = info.actual_offset; \ offset = info.actual_offset; \
pProp = info.prop; \ bit_count = info.prop->m_nBits; \
bit_count = pProp->m_nBits; \
\ \
switch (pProp->GetType()) \ switch (info.prop->GetType()) \
{ \ { \
case type: \ case type: \
{ \ { \
@@ -1031,6 +1011,7 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
} \ } \
case DPT_DataTable: \ case DPT_DataTable: \
{ \ { \
SendProp *pProp; \
FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \ FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name); \
\ \
offset += pProp->GetOffset(); \ offset += pProp->GetOffset(); \
@@ -1041,13 +1022,13 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
{ \ { \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \ return pContext->ThrowNativeError("SendProp %s type is not " type_name " (%d != %d)", \
prop, \ prop, \
pProp->GetType(), \ info.prop->GetType(), \
type); \ type); \
} \ } \
} \ } \
#define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \ #define FIND_PROP_SEND_IN_SENDTABLE(info, pProp, element, type, type_name) \
SendTable *pTable = pProp->GetDataTable(); \ SendTable *pTable = info.prop->GetDataTable(); \
if (!pTable) \ if (!pTable) \
{ \ { \
return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \ return pContext->ThrowNativeError("Error looking up DataTable for prop %s", \
@@ -1068,8 +1049,8 @@ static cell_t SetEntDataString(IPluginContext *pContext, const cell_t *params)
{ \ { \
return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \ return pContext->ThrowNativeError("SendProp %s type is not " type_name " ([%d,%d] != %d)", \
prop, \ prop, \
pProp->GetType(), \ info.prop->GetType(), \
pProp->m_nBits, \ info.prop->m_nBits, \
type); \ type); \
} }
@@ -1101,6 +1082,7 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
{ {
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
if (!IndexToAThings(params[1], &pEntity, &pEdict)) if (!IndexToAThings(params[1], &pEntity, &pEdict))
@@ -1108,6 +1090,11 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1132,11 +1119,10 @@ static cell_t GetEntPropArraySize(IPluginContext *pContext, const cell_t *params
} }
if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info)) if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info))
{ {
const char *class_name = g_HL2.GetEntityClassname(pEntity);
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)",
prop, prop,
params[1], params[1],
((class_name) ? class_name : "")); class_name);
} }
if (info.prop->GetType() != DPT_DataTable) if (info.prop->GetType() != DPT_DataTable)
@@ -1166,6 +1152,7 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
int offset; int offset;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int bit_count; int bit_count;
bool is_unsigned = false; bool is_unsigned = false;
@@ -1181,6 +1168,12 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
/* TODO: Find a way to lookup classname without having an edict - Is this a guaranteed prop? */
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1205,15 +1198,7 @@ static cell_t GetEntProp(IPluginContext *pContext, const cell_t *params)
case Prop_Send: case Prop_Send:
{ {
FIND_PROP_SEND(DPT_Int, "integer"); FIND_PROP_SEND(DPT_Int, "integer");
is_unsigned = ((pProp->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED); is_unsigned = ((info.prop->GetFlags() & SPROP_UNSIGNED) == SPROP_UNSIGNED);
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
#if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_TF2
if (pProp->GetFlags() & SPROP_VARINT)
{
bit_count = sizeof(int) * 8;
}
#endif
break; break;
} }
default: default:
@@ -1266,6 +1251,7 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
int offset; int offset;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int bit_count; int bit_count;
@@ -1280,6 +1266,11 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1304,14 +1295,6 @@ static cell_t SetEntProp(IPluginContext *pContext, const cell_t *params)
case Prop_Send: case Prop_Send:
{ {
FIND_PROP_SEND(DPT_Int, "integer"); FIND_PROP_SEND(DPT_Int, "integer");
// This isn't in CS:S yet, but will be, doesn't hurt to add now, and will save us a build later
#if SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_TF2
if (pProp->GetFlags() & SPROP_VARINT)
{
bit_count = sizeof(int) * 8;
}
#endif
break; break;
} }
default: default:
@@ -1356,6 +1339,7 @@ static cell_t GetEntPropFloat(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; int element = 0;
@@ -1369,6 +1353,11 @@ static cell_t GetEntPropFloat(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1415,6 +1404,7 @@ static cell_t SetEntPropFloat(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; int element = 0;
@@ -1428,6 +1418,11 @@ static cell_t SetEntPropFloat(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1479,6 +1474,7 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; int element = 0;
@@ -1492,6 +1488,11 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1526,12 +1527,9 @@ static cell_t GetEntPropEnt(IPluginContext *pContext, const cell_t *params)
} }
CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset); CBaseHandle &hndl = *(CBaseHandle *)((uint8_t *)pEntity + offset);
CBaseEntity *pHandleEntity = g_HL2.ReferenceToEntity(hndl.GetEntryIndex());
if (!pHandleEntity || hndl != reinterpret_cast<IHandleEntity *>(pHandleEntity)->GetRefEHandle()) int ref = g_HL2.IndexToReference(hndl.GetEntryIndex());
return -1; return g_HL2.ReferenceToBCompatRef(ref);
return g_HL2.EntityToBCompatRef(pHandleEntity);
} }
static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params) static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
@@ -1540,6 +1538,7 @@ static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; int element = 0;
@@ -1553,6 +1552,11 @@ static cell_t SetEntPropEnt(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1619,6 +1623,7 @@ static cell_t GetEntPropVector(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; int element = 0;
@@ -1632,6 +1637,11 @@ static cell_t GetEntPropVector(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1685,6 +1695,7 @@ static cell_t SetEntPropVector(IPluginContext *pContext, const cell_t *params)
char *prop; char *prop;
int offset; int offset;
int bit_count; int bit_count;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
int element = 0; int element = 0;
@@ -1698,6 +1709,11 @@ static cell_t SetEntPropVector(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
switch (params[2]) switch (params[2])
@@ -1755,6 +1771,7 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
CBaseEntity *pEntity; CBaseEntity *pEntity;
char *prop; char *prop;
int offset; int offset;
const char *class_name;
edict_t *pEdict; edict_t *pEdict;
bool bIsStringIndex; bool bIsStringIndex;
@@ -1769,6 +1786,11 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
} }
if (!pEdict || (class_name = pEdict->GetClassName()) == NULL)
{
class_name = "";
}
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
bIsStringIndex = false; bIsStringIndex = false;
@@ -1827,11 +1849,10 @@ static cell_t GetEntPropString(IPluginContext *pContext, const cell_t *params)
} }
if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info)) if (!g_HL2.FindSendPropInfo(pNet->GetServerClass()->GetName(), prop, &info))
{ {
const char *class_name = g_HL2.GetEntityClassname(pEntity);
return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)", return pContext->ThrowNativeError("Property \"%s\" not found (entity %d/%s)",
prop, prop,
params[1], params[1],
((class_name) ? class_name : "")); class_name);
} }
offset = info.actual_offset; offset = info.actual_offset;
@@ -1902,13 +1923,9 @@ static cell_t SetEntPropString(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Unable to retrieve GetDataDescMap offset"); return pContext->ThrowNativeError("Unable to retrieve GetDataDescMap offset");
} }
pContext->LocalToString(params[3], &prop); pContext->LocalToString(params[3], &prop);
bool isNested = false; if ((td=g_HL2.FindInDataMap(pMap, prop)) == NULL)
if ((td=g_HL2.FindInDataMap(pMap, prop, &isNested)) == NULL)
{ {
if (isNested) return pContext->ThrowNativeError("Property \"%s\" not found for entity %d", prop, params[1]);
return pContext->ThrowNativeError("Property \"%s\" is not safe to access for entity %d", prop, params[1]);
else
return pContext->ThrowNativeError("Property \"%s\" not found for entity %d", prop, params[1]);
} }
if (td->fieldType != FIELD_CHARACTER) if (td->fieldType != FIELD_CHARACTER)
{ {
@@ -2030,7 +2047,7 @@ static int32_t SDKEntFlagToSMEntFlag(int flag)
#if SOURCE_ENGINE == SE_ALIENSWARM #if SOURCE_ENGINE == SE_ALIENSWARM
case FL_FREEZING: case FL_FREEZING:
return ENTFLAG_FREEZING; return ENTFLAG_FREEZING;
#elif SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_TF2 #elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
case FL_EP2V_UNKNOWN: case FL_EP2V_UNKNOWN:
return ENTFLAG_EP2V_UNKNOWN1; return ENTFLAG_EP2V_UNKNOWN1;
#endif #endif
@@ -2108,7 +2125,7 @@ static int32_t SMEntFlagToSDKEntFlag(int32_t flag)
#if SOURCE_ENGINE == SE_ALIENSWARM #if SOURCE_ENGINE == SE_ALIENSWARM
case ENTFLAG_FREEZING: case ENTFLAG_FREEZING:
return FL_FREEZING; return FL_FREEZING;
#elif SOURCE_ENGINE == SE_HL2DM || SOURCE_ENGINE == SE_DODS || SOURCE_ENGINE == SE_CSS || SOURCE_ENGINE == SE_TF2 #elif SOURCE_ENGINE == SE_ORANGEBOXVALVE
case ENTFLAG_EP2V_UNKNOWN1: case ENTFLAG_EP2V_UNKNOWN1:
return FL_EP2V_UNKNOWN; return FL_EP2V_UNKNOWN;
#endif #endif
@@ -2209,16 +2226,6 @@ static cell_t SetEntityFlags(IPluginContext *pContext, const cell_t *params)
return 0; return 0;
} }
static cell_t GetEntityAddress(IPluginContext *pContext, const cell_t *params)
{
CBaseEntity * pEntity = GetEntity(params[1]);
if (!pEntity)
{
return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]);
}
return reinterpret_cast<cell_t>(pEntity);
}
REGISTER_NATIVES(entityNatives) REGISTER_NATIVES(entityNatives)
{ {
{"ChangeEdictState", ChangeEdictState}, {"ChangeEdictState", ChangeEdictState},
@@ -2261,6 +2268,5 @@ REGISTER_NATIVES(entityNatives)
{"SetEntPropFloat", SetEntPropFloat}, {"SetEntPropFloat", SetEntPropFloat},
{"SetEntPropString", SetEntPropString}, {"SetEntPropString", SetEntPropString},
{"SetEntPropVector", SetEntPropVector}, {"SetEntPropVector", SetEntPropVector},
{"GetEntityAddress", GetEntityAddress},
{NULL, NULL} {NULL, NULL}
}; };
+1 -1
View File
@@ -50,7 +50,7 @@ cell_t FakeNativeRouter(IPluginContext *pContext, const cell_t *params, void *pD
/* Check if too many parameters were passed */ /* Check if too many parameters were passed */
if (params[0] > SP_MAX_EXEC_PARAMS) if (params[0] > SP_MAX_EXEC_PARAMS)
{ {
return pContext->ThrowNativeError("Called native with too many parameters (%d>%d)", params[0], SP_MAX_EXEC_PARAMS); return pContext->ThrowNativeError("Called native with too many parameters (%d>%d)", params[9], SP_MAX_EXEC_PARAMS);
} }
/* Check if the native is paused */ /* Check if the native is paused */
+3 -41
View File
@@ -63,7 +63,7 @@ static cell_t IsMapValid(IPluginContext *pContext, const cell_t *params)
char *map; char *map;
pContext->LocalToString(params[1], &map); pContext->LocalToString(params[1], &map);
return g_HL2.IsMapValid(map); return engine->IsMapValid(map);
} }
static cell_t IsDedicatedServer(IPluginContext *pContext, const cell_t *params) static cell_t IsDedicatedServer(IPluginContext *pContext, const cell_t *params)
@@ -73,7 +73,7 @@ static cell_t IsDedicatedServer(IPluginContext *pContext, const cell_t *params)
static cell_t GetEngineTime(IPluginContext *pContext, const cell_t *params) static cell_t GetEngineTime(IPluginContext *pContext, const cell_t *params)
{ {
#if SOURCE_ENGINE >= SE_NUCLEARDAWN #if SOURCE_ENGINE >= SE_LEFT4DEAD2
float fTime = Plat_FloatTime(); float fTime = Plat_FloatTime();
#else #else
float fTime = engine->Time(); float fTime = engine->Time();
@@ -87,11 +87,6 @@ static cell_t GetGameTime(IPluginContext *pContext, const cell_t *params)
return sp_ftoc(gpGlobals->curtime); return sp_ftoc(gpGlobals->curtime);
} }
static cell_t GetGameTickCount(IPluginContext *pContext, const cell_t *params)
{
return gpGlobals->tickcount;
}
static cell_t CreateFakeClient(IPluginContext *pContext, const cell_t *params) static cell_t CreateFakeClient(IPluginContext *pContext, const cell_t *params)
{ {
if (!g_SourceMod.IsMapRunning()) if (!g_SourceMod.IsMapRunning())
@@ -473,24 +468,14 @@ static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
return 32; return 32;
case SOURCE_ENGINE_EYE: case SOURCE_ENGINE_EYE:
return 33; return 33;
case SOURCE_ENGINE_CSS: case SOURCE_ENGINE_ORANGEBOXVALVE:
return 34;
case SOURCE_ENGINE_ORANGEBOXVALVE_DEPRECATED:
case SOURCE_ENGINE_HL2DM:
case SOURCE_ENGINE_DODS:
case SOURCE_ENGINE_TF2:
return 35; return 35;
case SOURCE_ENGINE_LEFT4DEAD: case SOURCE_ENGINE_LEFT4DEAD:
return 40; return 40;
case SOURCE_ENGINE_NUCLEARDAWN:
case SOURCE_ENGINE_LEFT4DEAD2: case SOURCE_ENGINE_LEFT4DEAD2:
return 50; return 50;
case SOURCE_ENGINE_ALIENSWARM: case SOURCE_ENGINE_ALIENSWARM:
return 60; return 60;
case SOURCE_ENGINE_PORTAL2:
return 70;
case SOURCE_ENGINE_CSGO:
return 80;
# endif # endif
} }
#else #else
@@ -507,27 +492,6 @@ static cell_t GuessSDKVersion(IPluginContext *pContext, const cell_t *params)
return 0; return 0;
} }
static cell_t GetEngineVersion(IPluginContext *pContext, const cell_t *params)
{
int engineVer = g_SMAPI->GetSourceEngineBuild();
#if defined METAMOD_PLAPI_VERSION
if (engineVer == SOURCE_ENGINE_ORANGEBOXVALVE_DEPRECATED)
{
const char *gamedir = g_SourceMod.GetGameFolderName();
if (strcmp(gamedir, "tf") == 0)
return SOURCE_ENGINE_TF2;
else if (strcmp(gamedir, "cstrike") == 0)
return SOURCE_ENGINE_CSS;
else if (strcmp(gamedir, "dod") == 0)
return SOURCE_ENGINE_DODS;
else if (strcmp(gamedir, "hl2mp") == 0)
return SOURCE_ENGINE_HL2DM;
}
#endif
return engineVer;
}
static cell_t IndexToReference(IPluginContext *pContext, const cell_t *params) static cell_t IndexToReference(IPluginContext *pContext, const cell_t *params)
{ {
if (params[1] >= NUM_ENT_ENTRIES || params[1] < 0) if (params[1] >= NUM_ENT_ENTRIES || params[1] < 0)
@@ -556,7 +520,6 @@ REGISTER_NATIVES(halflifeNatives)
{"GetGameDescription", GetGameDescription}, {"GetGameDescription", GetGameDescription},
{"GetGameFolderName", GetGameFolderName}, {"GetGameFolderName", GetGameFolderName},
{"GetGameTime", GetGameTime}, {"GetGameTime", GetGameTime},
{"GetGameTickCount", GetGameTickCount},
{"GetRandomFloat", GetRandomFloat}, {"GetRandomFloat", GetRandomFloat},
{"GetRandomInt", GetRandomInt}, {"GetRandomInt", GetRandomInt},
{"IsDedicatedServer", IsDedicatedServer}, {"IsDedicatedServer", IsDedicatedServer},
@@ -579,7 +542,6 @@ REGISTER_NATIVES(halflifeNatives)
{"ShowVGUIPanel", ShowVGUIPanel}, {"ShowVGUIPanel", ShowVGUIPanel},
{"IsPlayerAlive", smn_IsPlayerAlive}, {"IsPlayerAlive", smn_IsPlayerAlive},
{"GuessSDKVersion", GuessSDKVersion}, {"GuessSDKVersion", GuessSDKVersion},
{"GetEngineVersion", GetEngineVersion},
{"EntIndexToEntRef", IndexToReference}, {"EntIndexToEntRef", IndexToReference},
{"EntRefToEntIndex", ReferenceToIndex}, {"EntRefToEntIndex", ReferenceToIndex},
{"MakeCompatEntRef", ReferenceToBCompatRef}, {"MakeCompatEntRef", ReferenceToBCompatRef},
+2 -36
View File
@@ -37,10 +37,6 @@
#include "HandleSys.h" #include "HandleSys.h"
#include "logic_bridge.h" #include "logic_bridge.h"
#if SOURCE_ENGINE == SE_CSGO
#include <game/shared/csgo/protobuf/cstrike15_usermessages.pb.h>
#endif
#define MAX_HUD_CHANNELS 6 #define MAX_HUD_CHANNELS 6
int g_HudMsgNum = -1; int g_HudMsgNum = -1;
@@ -312,39 +308,12 @@ static cell_t SetHudTextParamsEx(IPluginContext *pContext, const cell_t *params)
void UTIL_SendHudText(int client, const hud_text_parms &textparms, const char *pMessage) void UTIL_SendHudText(int client, const hud_text_parms &textparms, const char *pMessage)
{ {
bf_write *bf;
cell_t players[1]; cell_t players[1];
players[0] = client; players[0] = client;
#if SOURCE_ENGINE == SE_CSGO bf = g_UserMsgs.StartMessage(g_HudMsgNum, players, 1, 0);
// If or when we need to support multiple games per engine with this, we can switch to reflection
CCSUsrMsg_HudMsg *msg = (CCSUsrMsg_HudMsg *)g_UserMsgs.StartProtobufMessage(g_HudMsgNum, players, 1, 0);
msg->set_channel(textparms.channel & 0xFF);
CMsgVector2D *pos = msg->mutable_pos();
pos->set_x(textparms.x);
pos->set_y(textparms.y);
CMsgRGBA *color1 = msg->mutable_clr1();
color1->set_r(textparms.r1);
color1->set_g(textparms.g1);
color1->set_b(textparms.b1);
color1->set_a(textparms.a1);
CMsgRGBA *color2 = msg->mutable_clr2();
color2->set_r(textparms.r2);
color2->set_g(textparms.g2);
color2->set_b(textparms.b2);
color2->set_a(textparms.a2);
msg->set_effect(textparms.effect);
msg->set_fade_in_time(textparms.fadeinTime);
msg->set_fade_out_time(textparms.fadeoutTime);
msg->set_hold_time(textparms.holdTime);
msg->set_fx_time(textparms.fxTime);
msg->set_text(pMessage);
#else
bf_write *bf = g_UserMsgs.StartBitBufMessage(g_HudMsgNum, players, 1, 0);
bf->WriteByte(textparms.channel & 0xFF ); bf->WriteByte(textparms.channel & 0xFF );
bf->WriteFloat(textparms.x); bf->WriteFloat(textparms.x);
bf->WriteFloat(textparms.y); bf->WriteFloat(textparms.y);
@@ -362,7 +331,6 @@ void UTIL_SendHudText(int client, const hud_text_parms &textparms, const char *p
bf->WriteFloat(textparms.holdTime); bf->WriteFloat(textparms.holdTime);
bf->WriteFloat(textparms.fxTime); bf->WriteFloat(textparms.fxTime);
bf->WriteString(pMessage); bf->WriteString(pMessage);
#endif
g_UserMsgs.EndMessage(); g_UserMsgs.EndMessage();
} }
@@ -394,7 +362,6 @@ static cell_t ShowSyncHudText(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Client %d is not in-game", client); return pContext->ThrowNativeError("Client %d is not in-game", client);
} }
g_SourceMod.SetGlobalTarget(client);
g_SourceMod.FormatString(message_buffer, sizeof(message_buffer), pContext, params, 3); g_SourceMod.FormatString(message_buffer, sizeof(message_buffer), pContext, params, 3);
if (pContext->GetLastNativeError() != SP_ERROR_NONE) if (pContext->GetLastNativeError() != SP_ERROR_NONE)
{ {
@@ -467,7 +434,6 @@ static cell_t ShowHudText(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Client %d is not in-game", client); return pContext->ThrowNativeError("Client %d is not in-game", client);
} }
g_SourceMod.SetGlobalTarget(client);
g_SourceMod.FormatString(message_buffer, sizeof(message_buffer), pContext, params, 3); g_SourceMod.FormatString(message_buffer, sizeof(message_buffer), pContext, params, 3);
if (pContext->GetLastNativeError() != SP_ERROR_NONE) if (pContext->GetLastNativeError() != SP_ERROR_NONE)
{ {
+2
View File
@@ -844,6 +844,8 @@ static cell_t SetMenuTitle(IPluginContext *pContext, const cell_t *params)
return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err); return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
} }
g_SourceMod.SetGlobalTarget(SOURCEMOD_SERVER_LANGUAGE);
char buffer[1024]; char buffer[1024];
g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2); g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 2);
+3 -45
View File
@@ -66,22 +66,6 @@ static cell_t sm_GetMaxClients(IPluginContext *pCtx, const cell_t *params)
return g_Players.MaxClients(); return g_Players.MaxClients();
} }
static cell_t sm_GetMaxHumanPlayers(IPluginContext *pCtx, const cell_t *params)
{
int maxHumans = -1;
#if SOURCE_ENGINE >= SE_LEFT4DEAD
maxHumans = serverClients->GetMaxHumanPlayers();
#endif
if( maxHumans == -1 )
{
return g_Players.MaxClients();
}
return maxHumans;
}
static cell_t sm_GetClientName(IPluginContext *pCtx, const cell_t *params) static cell_t sm_GetClientName(IPluginContext *pCtx, const cell_t *params)
{ {
int index = params[1]; int index = params[1];
@@ -156,41 +140,16 @@ static cell_t sm_GetClientAuthStr(IPluginContext *pCtx, const cell_t *params)
return pCtx->ThrowNativeError("Client %d is not connected", index); return pCtx->ThrowNativeError("Client %d is not connected", index);
} }
bool validate = true; if (!pPlayer->IsAuthorized())
if (params[0] > 3)
{
validate = !!params[4];
}
const char *authstr = pPlayer->GetAuthString(validate);
if (!authstr || authstr[0] == '\0')
{ {
return 0; return 0;
} }
pCtx->StringToLocal(params[2], static_cast<size_t>(params[3]), authstr); pCtx->StringToLocal(params[2], static_cast<size_t>(params[3]), pPlayer->GetAuthString());
return 1; return 1;
} }
static cell_t sm_GetSteamAccountID(IPluginContext *pCtx, const cell_t *params)
{
int index = params[1];
if ((index < 1) || (index > g_Players.GetMaxClients()))
{
return pCtx->ThrowNativeError("Client index %d is invalid", index);
}
CPlayer *pPlayer = g_Players.GetPlayerByIndex(index);
if (!pPlayer->IsConnected())
{
return pCtx->ThrowNativeError("Client %d is not connected", index);
}
return pPlayer->GetSteamAccountID(!!params[2]);
}
static cell_t sm_IsClientConnected(IPluginContext *pCtx, const cell_t *params) static cell_t sm_IsClientConnected(IPluginContext *pCtx, const cell_t *params)
{ {
int index = params[1]; int index = params[1];
@@ -1400,6 +1359,7 @@ static cell_t KickClient(IPluginContext *pContext, const cell_t *params)
return 1; return 1;
} }
pPlayer->MarkAsBeingKicked();
g_HL2.AddDelayedKick(client, pPlayer->GetUserId(), buffer); g_HL2.AddDelayedKick(client, pPlayer->GetUserId(), buffer);
return 1; return 1;
@@ -1667,7 +1627,6 @@ REGISTER_NATIVES(playernatives)
{"CanUserTarget", CanUserTarget}, {"CanUserTarget", CanUserTarget},
{"ChangeClientTeam", ChangeClientTeam}, {"ChangeClientTeam", ChangeClientTeam},
{"GetClientAuthString", sm_GetClientAuthStr}, {"GetClientAuthString", sm_GetClientAuthStr},
{"GetSteamAccountID", sm_GetSteamAccountID},
{"GetClientCount", sm_GetClientCount}, {"GetClientCount", sm_GetClientCount},
{"GetClientInfo", sm_GetClientInfo}, {"GetClientInfo", sm_GetClientInfo},
{"GetClientIP", sm_GetClientIP}, {"GetClientIP", sm_GetClientIP},
@@ -1675,7 +1634,6 @@ REGISTER_NATIVES(playernatives)
{"GetClientTeam", GetClientTeam}, {"GetClientTeam", GetClientTeam},
{"GetClientUserId", GetClientUserId}, {"GetClientUserId", GetClientUserId},
{"GetMaxClients", sm_GetMaxClients}, {"GetMaxClients", sm_GetMaxClients},
{"GetMaxHumanPlayers", sm_GetMaxHumanPlayers},
{"GetUserAdmin", GetUserAdmin}, {"GetUserAdmin", GetUserAdmin},
{"GetUserFlagBits", GetUserFlagBits}, {"GetUserFlagBits", GetUserFlagBits},
{"IsClientAuthorized", sm_IsClientAuthorized}, {"IsClientAuthorized", sm_IsClientAuthorized},
File diff suppressed because it is too large Load Diff
+9 -91
View File
@@ -31,22 +31,15 @@
#include "HandleSys.h" #include "HandleSys.h"
#include "PluginSys.h" #include "PluginSys.h"
#include "UserMessages.h"
#include "PlayerManager.h" #include "PlayerManager.h"
#include "smn_usermsgs.h" #include "smn_usermsgs.h"
#ifdef USE_PROTOBUF_USERMESSAGES
#include "UserMessagePBHelpers.h"
#endif
HandleType_t g_ProtobufType = NO_HANDLE_TYPE;
HandleType_t g_WrBitBufType = NO_HANDLE_TYPE;
HandleType_t g_RdBitBufType = NO_HANDLE_TYPE;
HandleType_t g_WrBitBufType;
HandleType_t g_RdBitBufType;
Handle_t g_CurMsgHandle; Handle_t g_CurMsgHandle;
#ifndef USE_PROTOBUF_USERMESSAGES
Handle_t g_ReadBufHandle; Handle_t g_ReadBufHandle;
bf_read g_ReadBitBuf; bf_read g_ReadBitBuf;
#endif
int g_MsgPlayers[256]; int g_MsgPlayers[256];
bool g_IsMsgInExec = false; bool g_IsMsgInExec = false;
@@ -92,14 +85,10 @@ void UsrMessageNatives::OnSourceModAllInitialized()
g_HandleSys.InitAccessDefaults(NULL, &sec); g_HandleSys.InitAccessDefaults(NULL, &sec);
sec.access[HandleAccess_Delete] = HANDLE_RESTRICT_IDENTITY; sec.access[HandleAccess_Delete] = HANDLE_RESTRICT_IDENTITY;
#ifdef USE_PROTOBUF_USERMESSAGES
g_ProtobufType = g_HandleSys.CreateType("ProtobufUM", this, 0, NULL, NULL, g_pCoreIdent, NULL);
#else
g_WrBitBufType = g_HandleSys.CreateType("BitBufWriter", this, 0, NULL, NULL, g_pCoreIdent, NULL); g_WrBitBufType = g_HandleSys.CreateType("BitBufWriter", this, 0, NULL, NULL, g_pCoreIdent, NULL);
g_RdBitBufType = g_HandleSys.CreateType("BitBufReader", this, 0, NULL, &sec, g_pCoreIdent, NULL); g_RdBitBufType = g_HandleSys.CreateType("BitBufReader", this, 0, NULL, &sec, g_pCoreIdent, NULL);
g_ReadBufHandle = g_HandleSys.CreateHandle(g_RdBitBufType, &g_ReadBitBuf, NULL, g_pCoreIdent, NULL); g_ReadBufHandle = g_HandleSys.CreateHandle(g_RdBitBufType, &g_ReadBitBuf, NULL, g_pCoreIdent, NULL);
#endif
g_PluginSys.AddPluginsListener(this); g_PluginSys.AddPluginsListener(this);
} }
@@ -109,11 +98,6 @@ void UsrMessageNatives::OnSourceModShutdown()
HandleSecurity sec; HandleSecurity sec;
sec.pIdentity = g_pCoreIdent; sec.pIdentity = g_pCoreIdent;
#ifdef USE_PROTOBUF_USERMESSAGES
g_HandleSys.RemoveType(g_ProtobufType, g_pCoreIdent);
g_ProtobufType = 0;
#else
g_HandleSys.FreeHandle(g_ReadBufHandle, &sec); g_HandleSys.FreeHandle(g_ReadBufHandle, &sec);
g_HandleSys.RemoveType(g_WrBitBufType, g_pCoreIdent); g_HandleSys.RemoveType(g_WrBitBufType, g_pCoreIdent);
@@ -121,24 +105,15 @@ void UsrMessageNatives::OnSourceModShutdown()
g_WrBitBufType = 0; g_WrBitBufType = 0;
g_RdBitBufType = 0; g_RdBitBufType = 0;
#endif
} }
void UsrMessageNatives::OnHandleDestroy(HandleType_t type, void *object) void UsrMessageNatives::OnHandleDestroy(HandleType_t type, void *object)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES
delete (SMProtobufMessage *)object;
#endif
} }
bool UsrMessageNatives::GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize) bool UsrMessageNatives::GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
{ {
#ifdef USE_PROTOBUF_USERMESSAGES
// Different messages have different sizes, but this works as an approximate
*pSize = sizeof(protobuf::Message) + sizeof(SMProtobufMessage);
#else
*pSize = sizeof(bf_read); *pSize = sizeof(bf_read);
#endif
return true; return true;
} }
@@ -300,69 +275,37 @@ IPluginFunction *MsgListenerWrapper::GetNotifyFunction() const
return m_Notify; return m_Notify;
} }
#ifdef USE_PROTOBUF_USERMESSAGES
void MsgListenerWrapper::OnUserMessage(int msg_id, protobuf::Message *msg, IRecipientFilter *pFilter)
#else
void MsgListenerWrapper::OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter) void MsgListenerWrapper::OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
#endif
{ {
cell_t res; cell_t res;
Handle_t hndl;
size_t size = _FillInPlayers(g_MsgPlayers, pFilter); size_t size = _FillInPlayers(g_MsgPlayers, pFilter);
#ifdef USE_PROTOBUF_USERMESSAGES
hndl = g_HandleSys.CreateHandle(g_ProtobufType, new SMProtobufMessage(msg), NULL, g_pCoreIdent, NULL);
#else
g_ReadBitBuf.StartReading(bf->GetBasePointer(), bf->GetNumBytesWritten()); g_ReadBitBuf.StartReading(bf->GetBasePointer(), bf->GetNumBytesWritten());
hndl = g_ReadBufHandle;
#endif
m_Hook->PushCell(msg_id); m_Hook->PushCell(msg_id);
m_Hook->PushCell(hndl); m_Hook->PushCell(g_ReadBufHandle);
m_Hook->PushArray(g_MsgPlayers, size); m_Hook->PushArray(g_MsgPlayers, size);
m_Hook->PushCell(size); m_Hook->PushCell(size);
m_Hook->PushCell(pFilter->IsReliable()); m_Hook->PushCell(pFilter->IsReliable());
m_Hook->PushCell(pFilter->IsInitMessage()); m_Hook->PushCell(pFilter->IsInitMessage());
m_Hook->Execute(&res); m_Hook->Execute(&res);
#ifdef USE_PROTOBUF_USERMESSAGES
HandleSecurity sec;
sec.pIdentity = g_pCoreIdent;
g_HandleSys.FreeHandle(hndl, &sec);
#endif
} }
#ifdef USE_PROTOBUF_USERMESSAGES
ResultType MsgListenerWrapper::InterceptUserMessage(int msg_id, protobuf::Message *msg, IRecipientFilter *pFilter)
#else
ResultType MsgListenerWrapper::InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter) ResultType MsgListenerWrapper::InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
#endif
{ {
Handle_t hndl;
cell_t res = static_cast<cell_t>(Pl_Continue); cell_t res = static_cast<cell_t>(Pl_Continue);
size_t size = _FillInPlayers(g_MsgPlayers, pFilter); size_t size = _FillInPlayers(g_MsgPlayers, pFilter);
#ifdef USE_PROTOBUF_USERMESSAGES
hndl = g_HandleSys.CreateHandle(g_ProtobufType, new SMProtobufMessage(msg), NULL, g_pCoreIdent, NULL);
#else
g_ReadBitBuf.StartReading(bf->GetBasePointer(), bf->GetNumBytesWritten()); g_ReadBitBuf.StartReading(bf->GetBasePointer(), bf->GetNumBytesWritten());
hndl = g_ReadBufHandle;
#endif
m_Intercept->PushCell(msg_id); m_Intercept->PushCell(msg_id);
m_Intercept->PushCell(hndl); m_Intercept->PushCell(g_ReadBufHandle);
m_Intercept->PushArray(g_MsgPlayers, size); m_Intercept->PushArray(g_MsgPlayers, size);
m_Intercept->PushCell(size); m_Intercept->PushCell(size);
m_Intercept->PushCell(pFilter->IsReliable()); m_Intercept->PushCell(pFilter->IsReliable());
m_Intercept->PushCell(pFilter->IsInitMessage()); m_Intercept->PushCell(pFilter->IsInitMessage());
m_Intercept->Execute(&res); m_Intercept->Execute(&res);
#ifdef USE_PROTOBUF_USERMESSAGES
HandleSecurity sec;
sec.pIdentity = g_pCoreIdent;
g_HandleSys.FreeHandle(hndl, &sec);
#endif
return static_cast<ResultType>(res); return static_cast<ResultType>(res);
} }
@@ -387,11 +330,6 @@ void MsgListenerWrapper::OnPostUserMessage(int msg_id, bool sent)
static UsrMessageNatives s_UsrMessageNatives; static UsrMessageNatives s_UsrMessageNatives;
static cell_t smn_GetUserMessageType(IPluginContext *pCtx, const cell_t *params)
{
return g_UserMsgs.GetUserMessageType();
}
static cell_t smn_GetUserMessageId(IPluginContext *pCtx, const cell_t *params) static cell_t smn_GetUserMessageId(IPluginContext *pCtx, const cell_t *params)
{ {
char *msgname; char *msgname;
@@ -415,6 +353,7 @@ static cell_t smn_StartMessage(IPluginContext *pCtx, const cell_t *params)
cell_t *cl_array; cell_t *cl_array;
unsigned int numClients; unsigned int numClients;
int msgid; int msgid;
bf_write *pBitBuf;
int client; int client;
CPlayer *pPlayer = NULL; CPlayer *pPlayer = NULL;
@@ -448,24 +387,13 @@ static cell_t smn_StartMessage(IPluginContext *pCtx, const cell_t *params)
} }
} }
#ifdef USE_PROTOBUF_USERMESSAGES pBitBuf = g_UserMsgs.StartMessage(msgid, cl_array, numClients, params[4]);
protobuf::Message *msg = g_UserMsgs.StartProtobufMessage(msgid, cl_array, numClients, params[4]);
if (!msg)
{
return pCtx->ThrowNativeError("Unable to execute a new message while in hook");
}
g_CurMsgHandle = g_HandleSys.CreateHandle(g_ProtobufType, new SMProtobufMessage(msg), pCtx->GetIdentity(), g_pCoreIdent, NULL);
#else
bf_write *pBitBuf = g_UserMsgs.StartBitBufMessage(msgid, cl_array, numClients, params[4]);
if (!pBitBuf) if (!pBitBuf)
{ {
return pCtx->ThrowNativeError("Unable to execute a new message while in hook"); return pCtx->ThrowNativeError("Unable to execute a new message while in hook");
} }
g_CurMsgHandle = g_HandleSys.CreateHandle(g_WrBitBufType, pBitBuf, pCtx->GetIdentity(), g_pCoreIdent, NULL); g_CurMsgHandle = g_HandleSys.CreateHandle(g_WrBitBufType, pBitBuf, pCtx->GetIdentity(), g_pCoreIdent, NULL);
#endif
g_IsMsgInExec = true; g_IsMsgInExec = true;
return g_CurMsgHandle; return g_CurMsgHandle;
@@ -475,6 +403,7 @@ static cell_t smn_StartMessageEx(IPluginContext *pCtx, const cell_t *params)
{ {
cell_t *cl_array; cell_t *cl_array;
unsigned int numClients; unsigned int numClients;
bf_write *pBitBuf;
int client; int client;
CPlayer *pPlayer = NULL; CPlayer *pPlayer = NULL;
int msgid = params[1]; int msgid = params[1];
@@ -507,23 +436,13 @@ static cell_t smn_StartMessageEx(IPluginContext *pCtx, const cell_t *params)
} }
} }
#ifdef USE_PROTOBUF_USERMESSAGES pBitBuf = g_UserMsgs.StartMessage(msgid, cl_array, numClients, params[4]);
protobuf::Message *msg = g_UserMsgs.StartProtobufMessage(msgid, cl_array, numClients, params[4]);
if (!msg)
{
return pCtx->ThrowNativeError("Unable to execute a new message while in hook");
}
g_CurMsgHandle = g_HandleSys.CreateHandle(g_ProtobufType, new SMProtobufMessage(msg), pCtx->GetIdentity(), g_pCoreIdent, NULL);
#else
bf_write *pBitBuf = g_UserMsgs.StartBitBufMessage(msgid, cl_array, numClients, params[4]);
if (!pBitBuf) if (!pBitBuf)
{ {
return pCtx->ThrowNativeError("Unable to execute a new message while in hook"); return pCtx->ThrowNativeError("Unable to execute a new message while in hook");
} }
g_CurMsgHandle = g_HandleSys.CreateHandle(g_WrBitBufType, pBitBuf, pCtx->GetIdentity(), g_pCoreIdent, NULL); g_CurMsgHandle = g_HandleSys.CreateHandle(g_WrBitBufType, pBitBuf, pCtx->GetIdentity(), g_pCoreIdent, NULL);
#endif
g_IsMsgInExec = true; g_IsMsgInExec = true;
return g_CurMsgHandle; return g_CurMsgHandle;
@@ -615,7 +534,6 @@ static cell_t smn_UnhookUserMessage(IPluginContext *pCtx, const cell_t *params)
REGISTER_NATIVES(usrmsgnatives) REGISTER_NATIVES(usrmsgnatives)
{ {
{"GetUserMessageType", smn_GetUserMessageType},
{"GetUserMessageId", smn_GetUserMessageId}, {"GetUserMessageId", smn_GetUserMessageId},
{"GetUserMessageName", smn_GetUserMessageName}, {"GetUserMessageName", smn_GetUserMessageName},
{"StartMessage", smn_StartMessage}, {"StartMessage", smn_StartMessage},
+2 -16
View File
@@ -32,14 +32,9 @@
#ifndef _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_ #ifndef _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
#define _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_ #define _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
#include "UserMessages.h" extern int g_MsgPlayers[256];
class MsgListenerWrapper class MsgListenerWrapper : public IUserMessageListener
#ifdef USE_PROTOBUF_USERMESSAGES
: public IProtobufUserMessageListener
#else
: public IBitBufUserMessageListener
#endif
{ {
public: public:
void Initialize(int msgid, IPluginFunction *hook, IPluginFunction *notify, bool intercept); void Initialize(int msgid, IPluginFunction *hook, IPluginFunction *notify, bool intercept);
@@ -48,13 +43,8 @@ public:
IPluginFunction *GetHookedFunction() const; IPluginFunction *GetHookedFunction() const;
IPluginFunction *GetNotifyFunction() const; IPluginFunction *GetNotifyFunction() const;
public: //IUserMessageListener public: //IUserMessageListener
#ifdef USE_PROTOBUF_USERMESSAGES
void OnUserMessage(int msg_id, protobuf::Message *msg, IRecipientFilter *pFilter);
ResultType InterceptUserMessage(int msg_id, protobuf::Message *msg, IRecipientFilter *pFilter);
#else
void OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter); void OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
ResultType InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter); ResultType InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
#endif
void OnPostUserMessage(int msg_id, bool sent); void OnPostUserMessage(int msg_id, bool sent);
private: private:
size_t _FillInPlayers(int *pl_array, IRecipientFilter *pFilter); size_t _FillInPlayers(int *pl_array, IRecipientFilter *pFilter);
@@ -66,8 +56,4 @@ private:
int m_MsgId; int m_MsgId;
}; };
extern HandleType_t g_WrBitBufType;
extern HandleType_t g_RdBitBufType;
extern HandleType_t g_ProtobufType;
#endif //_INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_ #endif //_INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
+1 -3
View File
@@ -50,7 +50,6 @@ CallClass<IVEngineServer> *enginePatch = NULL;
CallClass<IServerGameDLL> *gamedllPatch = NULL; CallClass<IServerGameDLL> *gamedllPatch = NULL;
IPlayerInfoManager *playerinfo = NULL; IPlayerInfoManager *playerinfo = NULL;
IBaseFileSystem *basefilesystem = NULL; IBaseFileSystem *basefilesystem = NULL;
IFileSystem *filesystem = NULL;
IEngineSound *enginesound = NULL; IEngineSound *enginesound = NULL;
IServerPluginHelpers *serverpluginhelpers = NULL; IServerPluginHelpers *serverpluginhelpers = NULL;
IServerPluginCallbacks *vsp_interface = NULL; IServerPluginCallbacks *vsp_interface = NULL;
@@ -69,7 +68,6 @@ bool SourceMod_Core::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen
GET_V_IFACE_CURRENT(GetEngineFactory, gameevents, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2); GET_V_IFACE_CURRENT(GetEngineFactory, gameevents, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
GET_V_IFACE_CURRENT(GetEngineFactory, engrandom, IUniformRandomStream, VENGINE_SERVER_RANDOM_INTERFACE_VERSION); GET_V_IFACE_CURRENT(GetEngineFactory, engrandom, IUniformRandomStream, VENGINE_SERVER_RANDOM_INTERFACE_VERSION);
GET_V_IFACE_CURRENT(GetFileSystemFactory, basefilesystem, IBaseFileSystem, BASEFILESYSTEM_INTERFACE_VERSION); GET_V_IFACE_CURRENT(GetFileSystemFactory, basefilesystem, IBaseFileSystem, BASEFILESYSTEM_INTERFACE_VERSION);
GET_V_IFACE_CURRENT(GetFileSystemFactory, filesystem, IFileSystem, FILESYSTEM_INTERFACE_VERSION);
GET_V_IFACE_CURRENT(GetEngineFactory, enginesound, IEngineSound, IENGINESOUND_SERVER_INTERFACE_VERSION); GET_V_IFACE_CURRENT(GetEngineFactory, enginesound, IEngineSound, IENGINESOUND_SERVER_INTERFACE_VERSION);
GET_V_IFACE_CURRENT(GetEngineFactory, serverpluginhelpers, IServerPluginHelpers, INTERFACEVERSION_ISERVERPLUGINHELPERS); GET_V_IFACE_CURRENT(GetEngineFactory, serverpluginhelpers, IServerPluginHelpers, INTERFACEVERSION_ISERVERPLUGINHELPERS);
@@ -147,7 +145,7 @@ const char *SourceMod_Core::GetLicense()
const char *SourceMod_Core::GetVersion() const char *SourceMod_Core::GetVersion()
{ {
return SOURCEMOD_VERSION; return SM_FULL_VERSION;
} }
const char *SourceMod_Core::GetDate() const char *SourceMod_Core::GetDate()
+3 -4
View File
@@ -32,11 +32,11 @@
#ifndef _INCLUDE_SOURCEMOD_MM_API_H_ #ifndef _INCLUDE_SOURCEMOD_MM_API_H_
#define _INCLUDE_SOURCEMOD_MM_API_H_ #define _INCLUDE_SOURCEMOD_MM_API_H_
#if SOURCE_ENGINE >= SE_ALIENSWARM #if SOURCE_ENGINE == SE_ALIENSWARM
#include "convar_sm_swarm.h" #include "convar_sm_swarm.h"
#elif SOURCE_ENGINE >= SE_LEFT4DEAD #elif (SOURCE_ENGINE == SE_LEFT4DEAD) || (SOURCE_ENGINE == SE_LEFT4DEAD2)
#include "convar_sm_l4d.h" #include "convar_sm_l4d.h"
#elif SOURCE_ENGINE >= SE_ORANGEBOX #elif (SOURCE_ENGINE == SE_ORANGEBOX) || (SOURCE_ENGINE == SE_BLOODYGOODTIME) || (SOURCE_ENGINE == SE_EYE) || (SOURCE_ENGINE == SE_ORANGEBOXVALVE)
#include "convar_sm_ob.h" #include "convar_sm_ob.h"
#else #else
#include "convar_sm.h" #include "convar_sm.h"
@@ -99,7 +99,6 @@ extern SourceHook::CallClass<IServerGameDLL> *gamedllPatch;
extern IUniformRandomStream *engrandom; extern IUniformRandomStream *engrandom;
extern IPlayerInfoManager *playerinfo; extern IPlayerInfoManager *playerinfo;
extern IBaseFileSystem *basefilesystem; extern IBaseFileSystem *basefilesystem;
extern IFileSystem *filesystem;
extern IEngineSound *enginesound; extern IEngineSound *enginesound;
extern IServerPluginHelpers *serverpluginhelpers; extern IServerPluginHelpers *serverpluginhelpers;
extern IServerPluginCallbacks *vsp_interface; extern IServerPluginCallbacks *vsp_interface;
+2
View File
@@ -152,5 +152,7 @@ private:
extern bool g_Loaded; extern bool g_Loaded;
extern bool sm_show_debug_spew; extern bool sm_show_debug_spew;
extern SourceModBase g_SourceMod; extern SourceModBase g_SourceMod;
extern HandleType_t g_WrBitBufType; //:TODO: find a better place for this
extern HandleType_t g_RdBitBufType; //:TODO: find a better place for this
#endif //_INCLUDE_SOURCEMOD_GLOBALHEADER_H_ #endif //_INCLUDE_SOURCEMOD_GLOBALHEADER_H_
+4 -4
View File
@@ -29,8 +29,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION SM_VERSION_FILE FILEVERSION SM_FILE_VERSION
PRODUCTVERSION SM_VERSION_FILE PRODUCTVERSION SM_FILE_VERSION
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@@ -47,12 +47,12 @@ BEGIN
BEGIN BEGIN
VALUE "Comments", "SourceMod" VALUE "Comments", "SourceMod"
VALUE "FileDescription", "SourceMod Core" VALUE "FileDescription", "SourceMod Core"
VALUE "FileVersion", SM_VERSION_STRING VALUE "FileVersion", SM_FULL_VERSION
VALUE "InternalName", "sourcemod" VALUE "InternalName", "sourcemod"
VALUE "LegalCopyright", "Copyright (c) 2004-2008, AlliedModders LLC" VALUE "LegalCopyright", "Copyright (c) 2004-2008, AlliedModders LLC"
VALUE "OriginalFilename", BINARY_NAME VALUE "OriginalFilename", BINARY_NAME
VALUE "ProductName", "SourceMod" VALUE "ProductName", "SourceMod"
VALUE "ProductVersion", SM_VERSION_STRING VALUE "ProductVersion", SM_FULL_VERSION
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
+19 -18
View File
@@ -1,23 +1,24 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os import os
binary = SM.ExtLibrary(builder, 'bintools.ext') compiler = SM.DefaultExtCompiler('extensions/bintools')
binary.compiler.defines += ['HOOKING_ENABLED'] compiler['CDEFINES'].append('HOOKING_ENABLED')
binary.compiler.cxxincludes += [ compiler['CXXINCLUDES'].append(os.path.join(SM.mmsPath, 'core', 'sourcehook'))
os.path.join(SM.mms_root, 'core', 'sourcehook'), compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'jit'))
os.path.join(builder.sourcePath, 'public', 'jit'), compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'public', 'jit', 'x86'))
os.path.join(builder.sourcePath, 'public', 'jit', 'x86'),
]
binary.sources += [ extension = AMBuild.AddJob('bintools.ext')
'extension.cpp', binary = Cpp.LibraryBuilder('bintools.ext', AMBuild, extension, compiler)
'CallMaker.cpp', binary.AddSourceFiles('extensions/bintools', [
'CallWrapper.cpp', 'extension.cpp',
'HookWrapper.cpp', 'CallMaker.cpp',
'jit_call.cpp', 'CallWrapper.cpp',
'jit_hook.cpp', 'HookWrapper.cpp',
'sdk/smsdk_ext.cpp' 'jit_call.cpp',
] 'jit_hook.cpp',
'sdk/smsdk_ext.cpp'
])
SM.AutoVersion('extensions/bintools', binary)
binary.SendToJob()
SM.extensions += [builder.Add(binary)]
+2 -2
View File
@@ -61,11 +61,11 @@ bool BinTools::SDK_OnLoad(char *error, size_t maxlength, bool late)
const char *BinTools::GetExtensionVerString() const char *BinTools::GetExtensionVerString()
{ {
return SOURCEMOD_VERSION; return SM_FULL_VERSION;
} }
const char *BinTools::GetExtensionDateString() const char *BinTools::GetExtensionDateString()
{ {
return SOURCEMOD_BUILD_TIME; return SM_BUILD_TIMESTAMP;
} }
-56
View File
@@ -1,56 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bintools", "bintools.vcxproj", "{E38F65D9-74B2-4373-B46A-DBB76F579F98}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug - Dark Messiah|Win32 = Debug - Dark Messiah|Win32
Debug - Episode 1|Win32 = Debug - Episode 1|Win32
Debug - Left 4 Dead 2|Win32 = Debug - Left 4 Dead 2|Win32
Debug - Left 4 Dead|Win32 = Debug - Left 4 Dead|Win32
Debug - Old Metamod|Win32 = Debug - Old Metamod|Win32
Debug - Orange Box Valve|Win32 = Debug - Orange Box Valve|Win32
Debug - Orange Box|Win32 = Debug - Orange Box|Win32
Release - Dark Messiah|Win32 = Release - Dark Messiah|Win32
Release - Episode 1|Win32 = Release - Episode 1|Win32
Release - Left 4 Dead 2|Win32 = Release - Left 4 Dead 2|Win32
Release - Left 4 Dead|Win32 = Release - Left 4 Dead|Win32
Release - Old Metamod|Win32 = Release - Old Metamod|Win32
Release - Orange Box Valve|Win32 = Release - Orange Box Valve|Win32
Release - Orange Box|Win32 = Release - Orange Box|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Dark Messiah|Win32.ActiveCfg = Debug - Dark Messiah|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Dark Messiah|Win32.Build.0 = Debug - Dark Messiah|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Episode 1|Win32.ActiveCfg = Debug - Episode 1|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Episode 1|Win32.Build.0 = Debug - Episode 1|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Left 4 Dead 2|Win32.ActiveCfg = Debug - Left 4 Dead 2|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Left 4 Dead 2|Win32.Build.0 = Debug - Left 4 Dead 2|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Left 4 Dead|Win32.ActiveCfg = Debug - Left 4 Dead|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Left 4 Dead|Win32.Build.0 = Debug - Left 4 Dead|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Old Metamod|Win32.ActiveCfg = Debug - Old Metamod|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Old Metamod|Win32.Build.0 = Debug - Old Metamod|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Orange Box Valve|Win32.ActiveCfg = Debug - Orange Box Valve|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Orange Box Valve|Win32.Build.0 = Debug - Orange Box Valve|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Orange Box|Win32.ActiveCfg = Debug - Orange Box|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Debug - Orange Box|Win32.Build.0 = Debug - Orange Box|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Dark Messiah|Win32.ActiveCfg = Release - Dark Messiah|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Dark Messiah|Win32.Build.0 = Release - Dark Messiah|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Episode 1|Win32.ActiveCfg = Release - Episode 1|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Episode 1|Win32.Build.0 = Release - Episode 1|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Left 4 Dead 2|Win32.ActiveCfg = Release - Left 4 Dead 2|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Left 4 Dead 2|Win32.Build.0 = Release - Left 4 Dead 2|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Left 4 Dead|Win32.ActiveCfg = Release - Left 4 Dead|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Left 4 Dead|Win32.Build.0 = Release - Left 4 Dead|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Old Metamod|Win32.ActiveCfg = Release - Old Metamod|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Old Metamod|Win32.Build.0 = Release - Old Metamod|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Orange Box Valve|Win32.ActiveCfg = Release - Orange Box Valve|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Orange Box Valve|Win32.Build.0 = Release - Orange Box Valve|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Orange Box|Win32.ActiveCfg = Release - Orange Box|Win32
{E38F65D9-74B2-4373-B46A-DBB76F579F98}.Release - Orange Box|Win32.Build.0 = Release - Orange Box|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
-154
View File
@@ -1,154 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{E38F65D9-74B2-4373-B46A-DBB76F579F98}</ProjectGuid>
<RootNamespace>bintools</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetName>bintools.ext</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetName>bintools.ext</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalOptions>
</AdditionalOptions>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;..\sdk;..\..\..\public;..\..\..\public\jit;..\..\..\public\jit\x86;..\..\..\public\extensions;..\..\..\public\sourcepawn;$(MMSOURCE19)\core;$(MMSOURCE19)\core\sourcehook;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BINTOOLS_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SOURCEMOD_BUILD;ORANGEBOX_BUILD;HOOKING_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>BINARY_NAME="\"$(TargetFileName)\"";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<IgnoreStandardIncludePath>
</IgnoreStandardIncludePath>
<AdditionalIncludeDirectories>..\..\..\public</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetFileName)</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
<Command>IF NOT "%SMOUTDIR%"=="" copy /Y "$(TargetDir)$(TargetFileName)" "%SMOUTDIR%\extensions"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalOptions>
</AdditionalOptions>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>..;..\sdk;..\..\..\public;..\..\..\public\jit;..\..\..\public\jit\x86;..\..\..\public\extensions;..\..\..\public\sourcepawn;$(MMSOURCE19)\core;$(MMSOURCE19)\core\sourcehook;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BINTOOLS_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SOURCEMOD_BUILD;HOOKING_ENABLED;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>BINARY_NAME="\"$(TargetFileName)\"";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<IgnoreStandardIncludePath>
</IgnoreStandardIncludePath>
<AdditionalIncludeDirectories>..\..\..\public</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetFileName)</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMTD;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
<Command>IF NOT "%SMOUTDIR%"=="" copy /Y "$(TargetDir)$(TargetFileName)" "%SMOUTDIR%\extensions"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\extension.cpp" />
<ClCompile Include="..\CallMaker.cpp" />
<ClCompile Include="..\CallWrapper.cpp" />
<ClCompile Include="..\HookWrapper.cpp" />
<ClCompile Include="..\jit_call.cpp" />
<ClCompile Include="..\jit_hook.cpp" />
<ClCompile Include="..\sdk\smsdk_ext.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\extension.h" />
<ClInclude Include="..\..\..\public\extensions\IBinTools.h" />
<ClInclude Include="..\CallMaker.h" />
<ClInclude Include="..\CallWrapper.h" />
<ClInclude Include="..\HookWrapper.h" />
<ClInclude Include="..\jit_compile.h" />
<ClInclude Include="..\sdk\smsdk_config.h" />
<ClInclude Include="..\sdk\smsdk_ext.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -1,88 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{0318D835-E129-4fe0-9B9C-C810AC179F31}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{9021A2EF-600E-4028-AE3E-9DDA4C94264C}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{C06F7BFF-18EE-4994-8572-D6383011354B}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
<Filter Include="BinTools">
<UniqueIdentifier>{7BD12831-E179-4961-A3B0-BA9FCF311C7E}</UniqueIdentifier>
</Filter>
<Filter Include="BinTools\Header Files">
<UniqueIdentifier>{2B033553-ECC7-42cc-AD11-D1D985D8BC5A}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="BinTools\Source Files">
<UniqueIdentifier>{F70EA5AC-224C-448f-A72D-11C2D06208B3}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="SourceMod SDK">
<UniqueIdentifier>{6183251D-B1E4-4cc6-93B2-A0111B2115BA}</UniqueIdentifier>
</Filter>
<Filter Include="Interfaces">
<UniqueIdentifier>{7DE81EA3-99D9-4f34-823A-B314791F3514}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\extension.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\CallMaker.cpp">
<Filter>BinTools\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\CallWrapper.cpp">
<Filter>BinTools\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\HookWrapper.cpp">
<Filter>BinTools\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\jit_call.cpp">
<Filter>BinTools\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\jit_hook.cpp">
<Filter>BinTools\Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sdk\smsdk_ext.cpp">
<Filter>SourceMod SDK</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\extension.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\public\extensions\IBinTools.h">
<Filter>Resource Files</Filter>
</ClInclude>
<ClInclude Include="..\CallMaker.h">
<Filter>BinTools\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\CallWrapper.h">
<Filter>BinTools\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\HookWrapper.h">
<Filter>BinTools\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\jit_compile.h">
<Filter>BinTools\Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sdk\smsdk_config.h">
<Filter>SourceMod SDK</Filter>
</ClInclude>
<ClInclude Include="..\sdk\smsdk_ext.h">
<Filter>SourceMod SDK</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>
+4 -4
View File
@@ -29,8 +29,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION SM_VERSION_FILE FILEVERSION SM_FILE_VERSION
PRODUCTVERSION SM_VERSION_FILE PRODUCTVERSION SM_FILE_VERSION
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@@ -47,12 +47,12 @@ BEGIN
BEGIN BEGIN
VALUE "Comments", "BinTools Extension" VALUE "Comments", "BinTools Extension"
VALUE "FileDescription", "SourceMod BinTools Extension" VALUE "FileDescription", "SourceMod BinTools Extension"
VALUE "FileVersion", SM_VERSION_STRING VALUE "FileVersion", SM_FULL_VERSION
VALUE "InternalName", "SourceMod BinTools Extension" VALUE "InternalName", "SourceMod BinTools Extension"
VALUE "LegalCopyright", "Copyright (c) 2004-2008, AlliedModders LLC" VALUE "LegalCopyright", "Copyright (c) 2004-2008, AlliedModders LLC"
VALUE "OriginalFilename", BINARY_NAME VALUE "OriginalFilename", BINARY_NAME
VALUE "ProductName", "SourceMod BinTools Extension" VALUE "ProductName", "SourceMod BinTools Extension"
VALUE "ProductVersion", SM_VERSION_STRING VALUE "ProductVersion", SM_FULL_VERSION
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
+15 -15
View File
@@ -1,19 +1,19 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os import os
binary = SM.ExtLibrary(builder, 'clientprefs.ext') compiler = SM.DefaultExtCompiler('extensions/clientprefs')
binary.compiler.cxxincludes += [ compiler['CXXINCLUDES'].append(os.path.join(SM.mmsPath, 'core', 'sourcehook'))
os.path.join(SM.mms_root, 'core', 'sourcehook'),
]
binary.sources += [ extension = AMBuild.AddJob('clientprefs.ext')
'extension.cpp', binary = Cpp.LibraryBuilder('clientprefs.ext', AMBuild, extension, compiler)
'cookie.cpp', binary.AddSourceFiles('extensions/clientprefs', [
'menus.cpp', 'extension.cpp',
'natives.cpp', 'cookie.cpp',
'query.cpp', 'menus.cpp',
'sdk/smsdk_ext.cpp' 'natives.cpp',
] 'query.cpp',
'sdk/smsdk_ext.cpp'
SM.extensions += [builder.Add(binary)] ])
SM.AutoVersion('extensions/clientprefs', binary)
binary.SendToJob()
+29 -11
View File
@@ -215,35 +215,53 @@ void CookieManager::OnClientDisconnecting(int client)
SourceHook::List<CookieData *>::iterator _iter; SourceHook::List<CookieData *>::iterator _iter;
CookieData *current; CookieData *current;
IGamePlayer *player = playerhelpers->GetGamePlayer(client);
const char *pAuth = player ? player->GetAuthString() : NULL;
int dbId;
for (SourceHook::List<CookieData *>::iterator _iter = clientData[client].begin(); _iter != clientData[client].end(); _iter++) _iter = clientData[client].begin();
while (_iter != clientData[client].end())
{ {
current = (CookieData *)*_iter; current = (CookieData *)*_iter;
dbId = current->parent->dbid;
if (player == NULL || pAuth == NULL || !current->changed || dbId == -1) if (!current->changed)
{ {
current->parent->data[client] = NULL; current->parent->data[client] = NULL;
delete current; delete current;
_iter = clientData[client].erase(_iter);
continue; continue;
} }
/* Save this cookie to the database */
IGamePlayer *player = playerhelpers->GetGamePlayer(client);
if (player == NULL)
{
/* panic! */
return;
}
int dbId = current->parent->dbid;
if (dbId == -1)
{
/* Insert/Find Query must be still running or failed. */
return;
}
TQueryOp *op = new TQueryOp(Query_InsertData, client); TQueryOp *op = new TQueryOp(Query_InsertData, client);
strcpy(op->m_params.steamId, pAuth); strcpy(op->m_params.steamId, player->GetAuthString());
op->m_params.cookieId = dbId; op->m_params.cookieId = dbId;
op->m_params.data = current; op->m_params.data = current;
g_ClientPrefs.AddQueryToQueue(op); g_ClientPrefs.AddQueryToQueue(op);
current->parent->data[client] = NULL; current->parent->data[client] = NULL;
/* We don't delete here, it will be removed when the query is completed */
_iter = clientData[client].erase(_iter);
} }
clientData[client].clear();
} }
void CookieManager::ClientConnectCallback(int serial, IQuery *data) void CookieManager::ClientConnectCallback(int serial, IQuery *data)
@@ -378,7 +396,7 @@ void CookieManager::OnPluginDestroyed(IPlugin *plugin)
{ {
ItemDrawInfo draw; ItemDrawInfo draw;
const char *info = clientMenu->GetItemInfo(i, &draw); const char *info = clientMenu->GetItemInfo(i, &draw);
AutoMenuData *data = (AutoMenuData *)strtoul(info, NULL, 16); AutoMenuData *data = (AutoMenuData *)strtol(info, NULL, 16);
if (data->handler->forward != NULL) if (data->handler->forward != NULL)
{ {
+4 -28
View File
@@ -105,7 +105,6 @@ bool ClientPrefs::SDK_OnLoad(char *error, size_t maxlength, bool late)
sharesys->AddNatives(myself, g_ClientPrefNatives); sharesys->AddNatives(myself, g_ClientPrefNatives);
sharesys->RegisterLibrary(myself, "clientprefs"); sharesys->RegisterLibrary(myself, "clientprefs");
identity = sharesys->CreateIdentity(sharesys->CreateIdentType("ClientPrefs"), this);
g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell); g_CookieManager.cookieDataLoadedForward = forwards->CreateForward("OnClientCookiesCached", ET_Ignore, 1, NULL, Param_Cell);
g_CookieType = handlesys->CreateType("Cookie", g_CookieType = handlesys->CreateType("Cookie",
@@ -125,7 +124,7 @@ bool ClientPrefs::SDK_OnLoad(char *error, size_t maxlength, bool late)
NULL); NULL);
IMenuStyle *style = menus->GetDefaultStyle(); IMenuStyle *style = menus->GetDefaultStyle();
g_CookieManager.clientMenu = style->CreateMenu(&g_Handler, identity); g_CookieManager.clientMenu = style->CreateMenu(&g_Handler, NULL);
g_CookieManager.clientMenu->SetDefaultTitle("Client Settings:"); g_CookieManager.clientMenu->SetDefaultTitle("Client Settings:");
plsys->AddPluginsListener(&g_CookieManager); plsys->AddPluginsListener(&g_CookieManager);
@@ -192,12 +191,7 @@ void ClientPrefs::SDK_OnUnload()
forwards->ReleaseForward(g_CookieManager.cookieDataLoadedForward); forwards->ReleaseForward(g_CookieManager.cookieDataLoadedForward);
HandleSecurity sec = HandleSecurity(identity, identity); g_CookieManager.clientMenu->Destroy();
HandleError err = handlesys->FreeHandle(g_CookieManager.clientMenu->GetHandle(), &sec);
if (HandleError_None != err)
{
g_pSM->LogError(myself, "Error %d when attempting to free client menu handle", err);
}
phrases->Destroy(); phrases->Destroy();
@@ -208,19 +202,6 @@ void ClientPrefs::SDK_OnUnload()
cookieMutex->DestroyThis(); cookieMutex->DestroyThis();
} }
void ClientPrefs::OnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax)
{
if (Database == NULL && !databaseLoading)
{
g_pSM->LogMessage(myself, "Attempting to reconnect to database...");
databaseLoading = true;
TQueryOp *op = new TQueryOp(Query_Connect, 0);
dbi->AddToThreadQueue(op, PrioQueue_High);
}
}
void ClientPrefs::DatabaseConnect() void ClientPrefs::DatabaseConnect()
{ {
char error[256]; char error[256];
@@ -476,18 +457,13 @@ bool Translate(char *buffer,
return true; return true;
} }
IdentityToken_t *ClientPrefs::GetIdentity() const
{
return identity;
}
const char *ClientPrefs::GetExtensionVerString() const char *ClientPrefs::GetExtensionVerString()
{ {
return SOURCEMOD_VERSION; return SM_FULL_VERSION;
} }
const char *ClientPrefs::GetExtensionDateString() const char *ClientPrefs::GetExtensionDateString()
{ {
return SOURCEMOD_BUILD_TIME; return SM_BUILD_TIMESTAMP;
} }
-5
View File
@@ -87,8 +87,6 @@ public:
const char *GetExtensionVerString(); const char *GetExtensionVerString();
const char *GetExtensionDateString(); const char *GetExtensionDateString();
virtual void OnCoreMapStart(edict_t *pEdictList, int edictCount, int clientMax);
void DatabaseConnect(); void DatabaseConnect();
bool AddQueryToQueue(TQueryOp *query); bool AddQueryToQueue(TQueryOp *query);
@@ -140,8 +138,6 @@ public:
*/ */
//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength); //virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
#endif #endif
public:
IdentityToken_t *GetIdentity() const;
public: public:
IDBDriver *Driver; IDBDriver *Driver;
IDatabase *Database; IDatabase *Database;
@@ -154,7 +150,6 @@ public:
private: private:
SourceHook::List<TQueryOp *> cachedQueries; SourceHook::List<TQueryOp *> cachedQueries;
IMutex *queryMutex; IMutex *queryMutex;
IdentityToken_t *identity;
}; };
class CookieTypeHandler : public IHandleTypeDispatch class CookieTypeHandler : public IHandleTypeDispatch
+5 -10
View File
@@ -40,7 +40,7 @@ void ClientMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int i
const char *info = menu->GetItemInfo(item, &draw); const char *info = menu->GetItemInfo(item, &draw);
AutoMenuData *data = (AutoMenuData *)strtoul(info, NULL, 16); AutoMenuData *data = (AutoMenuData *)strtol(info, NULL, 16);
if (data->handler->forward != NULL) if (data->handler->forward != NULL)
{ {
@@ -57,7 +57,7 @@ void ClientMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int i
return; return;
} }
IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, g_ClientPrefs.GetIdentity()); IBaseMenu *submenu = menus->GetDefaultStyle()->CreateMenu(&g_AutoHandler, NULL);
char message[256]; char message[256];
@@ -94,7 +94,7 @@ unsigned int ClientMenuHandler::OnMenuDisplayItem(IBaseMenu *menu,
const char *info = menu->GetItemInfo(item, &draw); const char *info = menu->GetItemInfo(item, &draw);
AutoMenuData *data = (AutoMenuData *)strtoul(info, NULL, 16); AutoMenuData *data = (AutoMenuData *)strtol(info, NULL, 16);
if (data->handler->forward != NULL) if (data->handler->forward != NULL)
{ {
@@ -122,7 +122,7 @@ void AutoMenuHandler::OnMenuSelect(SourceMod::IBaseMenu *menu, int client, unsig
const char *info = menu->GetItemInfo(item, &draw); const char *info = menu->GetItemInfo(item, &draw);
AutoMenuData *data = (AutoMenuData *)strtoul(info, NULL, 16); AutoMenuData *data = (AutoMenuData *)strtol(info, NULL, 16);
switch (data->type) switch (data->type)
{ {
@@ -175,10 +175,5 @@ void AutoMenuHandler::OnMenuSelect(SourceMod::IBaseMenu *menu, int client, unsig
void AutoMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason) void AutoMenuHandler::OnMenuEnd(IBaseMenu *menu, MenuEndReason reason)
{ {
HandleSecurity sec = HandleSecurity(g_ClientPrefs.GetIdentity(), g_ClientPrefs.GetIdentity()); menu->Destroy(true);
HandleError err = handlesys->FreeHandle(menu->GetHandle(), &sec);
if (HandleError_None != err)
{
g_pSM->LogError(myself, "Error %d when attempting to free automenu handle", err);
}
} }
@@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "clientprefs", "clientprefs.vcxproj", "{B3E797CF-4E77-4C9D-B8A8-7589B6902206}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B3E797CF-4E77-4C9D-B8A8-7589B6902206}.Debug|Win32.ActiveCfg = Debug|Win32
{B3E797CF-4E77-4C9D-B8A8-7589B6902206}.Debug|Win32.Build.0 = Debug|Win32
{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
@@ -1,141 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B3E797CF-4E77-4C9D-B8A8-7589B6902206}</ProjectGuid>
<RootNamespace>clientprefs</RootNamespace>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetName>clientprefs.ext</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetName>clientprefs.ext</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..;..\sdk;..\..\..\public;..\..\..\public\sourcepawn;$(MMSOURCE19)\core\sourcehook;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;SDK_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SOURCEMOD_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>BINARY_NAME="\"$(TargetFileName)\"";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\public</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>$(OutDir)$(TargetFileName)</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
<Command>IF NOT "%SMOUTDIR%"=="" copy /Y "$(TargetDir)$(TargetFileName)" "%SMOUTDIR%\extensions\"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>..;..\sdk;..\..\..\public;..\..\..\public\sourcepawn;$(MMSOURCE19)\core\sourcehook;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;SDK_EXPORTS;_CRT_SECURE_NO_DEPRECATE;SOURCEMOD_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>BINARY_NAME="\"$(TargetFileName)\"";%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>..\..\..\public</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<OutputFile>$(OutDir)$(TargetFileName)</OutputFile>
<IgnoreSpecificDefaultLibraries>LIBC;LIBCD;LIBCMTD;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<DataExecutionPrevention>
</DataExecutionPrevention>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<PostBuildEvent>
<Command>IF NOT "%SMOUTDIR%"=="" copy /Y "$(TargetDir)$(TargetFileName)" "%SMOUTDIR%\extensions\"</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\cookie.cpp" />
<ClCompile Include="..\extension.cpp" />
<ClCompile Include="..\menus.cpp" />
<ClCompile Include="..\natives.cpp" />
<ClCompile Include="..\query.cpp" />
<ClCompile Include="..\sdk\smsdk_ext.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\cookie.h" />
<ClInclude Include="..\extension.h" />
<ClInclude Include="..\menus.h" />
<ClInclude Include="..\query.h" />
<ClInclude Include="..\sdk\smsdk_config.h" />
<ClInclude Include="..\sdk\smsdk_ext.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
</Filter>
<Filter Include="SourceMod SDK">
<UniqueIdentifier>{31958233-BB2D-4e41-A8F9-CE8A4684F436}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\cookie.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\extension.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\menus.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\natives.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\query.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\sdk\smsdk_ext.cpp">
<Filter>SourceMod SDK</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\cookie.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\extension.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\menus.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\query.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\sdk\smsdk_config.h">
<Filter>SourceMod SDK</Filter>
</ClInclude>
<ClInclude Include="..\sdk\smsdk_ext.h">
<Filter>SourceMod SDK</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\version.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>
+4 -4
View File
@@ -29,8 +29,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION SM_VERSION_FILE FILEVERSION SM_FILE_VERSION
PRODUCTVERSION SM_VERSION_FILE PRODUCTVERSION SM_FILE_VERSION
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@@ -47,12 +47,12 @@ BEGIN
BEGIN BEGIN
VALUE "Comments", "Client Preferences Extension" VALUE "Comments", "Client Preferences Extension"
VALUE "FileDescription", "SourceMod Client Preferences Extension" VALUE "FileDescription", "SourceMod Client Preferences Extension"
VALUE "FileVersion", SM_VERSION_STRING VALUE "FileVersion", SM_FULL_VERSION
VALUE "InternalName", "SourceMod Client Preferences Extension" VALUE "InternalName", "SourceMod Client Preferences Extension"
VALUE "LegalCopyright", "Copyright (c) 2004-2008, AlliedModders LLC" VALUE "LegalCopyright", "Copyright (c) 2004-2008, AlliedModders LLC"
VALUE "OriginalFilename", BINARY_NAME VALUE "OriginalFilename", BINARY_NAME
VALUE "ProductName", "SourceMod Client Preferences Extension" VALUE "ProductName", "SourceMod Client Preferences Extension"
VALUE "ProductVersion", SM_VERSION_STRING VALUE "ProductVersion", SM_FULL_VERSION
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
+23 -19
View File
@@ -1,21 +1,25 @@
# vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os import os
for sdk_name in ['css', 'csgo']: sdk = SM.sdkInfo['ep2v']
if sdk_name not in SM.sdks:
continue if AMBuild.target['platform'] in sdk['platform']:
sdk = SM.sdks[sdk_name] compiler = SM.DefaultHL2Compiler('extensions/cstrike', 'ep2v')
binary = SM.HL2Library(builder, 'game.cstrike.ext.' + sdk.ext, sdk) name = 'game.cstrike.ext.' + sdk['ext']
binary.sources += [ extension = AMBuild.AddJob(name)
'extension.cpp', binary = Cpp.LibraryBuilder(name, AMBuild, extension, compiler)
'natives.cpp', SM.PreSetupHL2Job(extension, binary, 'ep2v')
'RegNatives.cpp', binary.AddSourceFiles('extensions/cstrike', [
'timeleft.cpp', 'extension.cpp',
'forwards.cpp', 'natives.cpp',
'util_cstrike.cpp', 'RegNatives.cpp',
'sdk/smsdk_ext.cpp', 'timeleft.cpp',
'CDetour/detours.cpp', 'forwards.cpp',
'asm/asm.c' 'sdk/smsdk_ext.cpp',
] 'CDetour/detours.cpp',
SM.extensions += [builder.Add(binary)] 'asm/asm.c'
])
SM.PostSetupHL2Job(extension, binary, 'ep2v')
SM.AutoVersion('extensions/cstrike', binary)
binary.SendToJob()
@@ -34,9 +34,7 @@
#if defined PLATFORM_POSIX #if defined PLATFORM_POSIX
#include <sys/mman.h> #include <sys/mman.h>
#ifndef PAGE_SIZE
#define PAGE_SIZE 4096 #define PAGE_SIZE 4096
#endif
#define ALIGN(ar) ((long)ar & ~(PAGE_SIZE-1)) #define ALIGN(ar) ((long)ar & ~(PAGE_SIZE-1))
#define PAGE_EXECUTE_READWRITE PROT_READ|PROT_WRITE|PROT_EXEC #define PAGE_EXECUTE_READWRITE PROT_READ|PROT_WRITE|PROT_EXEC
#endif #endif
+10 -22
View File
@@ -4,12 +4,10 @@
SMSDK = ../.. SMSDK = ../..
HL2SDK_ORIG = ../../../hl2sdk HL2SDK_ORIG = ../../../hl2sdk
HL2SDK_OB = ../../../hl2sdk-ob HL2SDK_OB = ../../../hl2sdk-ob
HL2SDK_CSS = ../../../hl2sdk-css
HL2SDK_OB_VALVE = ../../../hl2sdk-ob-valve HL2SDK_OB_VALVE = ../../../hl2sdk-ob-valve
HL2SDK_L4D = ../../../hl2sdk-l4d HL2SDK_L4D = ../../../hl2sdk-l4d
HL2SDK_L4D2 = ../../../hl2sdk-l4d2 HL2SDK_L4D2 = ../../../hl2sdk-l4d2
HL2SDK_CSGO = ../../../hl2sdk-csgo MMSOURCE17 = ../../../mmsource-1.7
MMSOURCE19 = ../../../mmsource-1.9
##################################### #####################################
### EDIT BELOW FOR OTHER PROJECTS ### ### EDIT BELOW FOR OTHER PROJECTS ###
@@ -35,7 +33,7 @@ CPP = gcc
override ENGSET = false override ENGSET = false
# Check for valid list of engines # Check for valid list of engines
ifneq (,$(filter original orangebox css orangeboxvalve left4dead left4dead2,$(ENGINE))) ifneq (,$(filter original orangebox orangeboxvalve left4dead left4dead2,$(ENGINE)))
override ENGSET = true override ENGSET = true
endif endif
@@ -49,40 +47,30 @@ ifeq "$(ENGINE)" "orangebox"
CFLAGS += -DSOURCE_ENGINE=3 CFLAGS += -DSOURCE_ENGINE=3
GAMEFIX = 2.ep2 GAMEFIX = 2.ep2
endif endif
ifeq "$(ENGINE)" "css"
HL2SDK = $(HL2SDK_CSS)
CFLAGS += -DSOURCE_ENGINE=4
GAMEFIX = 2.css
endif
ifeq "$(ENGINE)" "orangeboxvalve" ifeq "$(ENGINE)" "orangeboxvalve"
HL2SDK = $(HL2SDK_OB_VALVE) HL2SDK = $(HL2SDK_OB_VALVE)
CFLAGS += -DSOURCE_ENGINE=5 CFLAGS += -DSOURCE_ENGINE=4
GAMEFIX = 2.ep2v GAMEFIX = 2.ep2v
endif endif
ifeq "$(ENGINE)" "left4dead" ifeq "$(ENGINE)" "left4dead"
HL2SDK = $(HL2SDK_L4D) HL2SDK = $(HL2SDK_L4D)
CFLAGS += -DSOURCE_ENGINE=6 CFLAGS += -DSOURCE_ENGINE=5
GAMEFIX = 2.l4d GAMEFIX = 2.l4d
endif endif
ifeq "$(ENGINE)" "left4dead2" ifeq "$(ENGINE)" "left4dead2"
HL2SDK = $(HL2SDK_L4D2) HL2SDK = $(HL2SDK_L4D2)
CFLAGS += -DSOURCE_ENGINE=7 CFLAGS += -DSOURCE_ENGINE=6
GAMEFIX = 2.l4d2 GAMEFIX = 2.l4d2
endif endif
ifeq "$(ENGINE)" "csgo"
HL2SDK = $(HL2SDK_CSGO)
CFLAGS += -DSOURCE_ENGINE=8
GAMEFIX = 2.csgo
endif
HL2PUB = $(HL2SDK)/public HL2PUB = $(HL2SDK)/public
ifeq "$(ENGINE)" "original" ifeq "$(ENGINE)" "original"
INCLUDE += -I$(HL2SDK)/public/dlls INCLUDE += -I$(HL2SDK)/public/dlls
METAMOD = $(MMSOURCE19)/core-legacy METAMOD = $(MMSOURCE17)/core-legacy
else else
INCLUDE += -I$(HL2SDK)/public/game/server INCLUDE += -I$(HL2SDK)/public/game/server
METAMOD = $(MMSOURCE19)/core METAMOD = $(MMSOURCE17)/core
endif endif
OS := $(shell uname -s) OS := $(shell uname -s)
@@ -115,8 +103,8 @@ ifeq "$(USEMETA)" "true"
INCLUDE += -I. -I.. -Isdk -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ INCLUDE += -I. -I.. -Isdk -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \
-I$(METAMOD) -I$(METAMOD)/sourcehook -I$(SMSDK)/public -I$(SMSDK)/public/extensions \ -I$(METAMOD) -I$(METAMOD)/sourcehook -I$(SMSDK)/public -I$(SMSDK)/public/extensions \
-I$(SMSDK)/public/sourcepawn -I$(SMSDK)/public/sourcepawn
CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_CSS=4 -DSE_ORANGEBOXVALVE=5 \ CFLAGS += -DSE_EPISODEONE=1 -DSE_DARKMESSIAH=2 -DSE_ORANGEBOX=3 -DSE_ORANGEBOXVALVE=4 \
-DSE_LEFT4DEAD=6 -DSE_LEFT4DEAD2=7 -DSE_CSGO=8 -DSE_LEFT4DEAD=5 -DSE_LEFT4DEAD2=6
else else
INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn
endif endif
@@ -180,7 +168,7 @@ all: check
check: check:
if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \ if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \
echo "You must supply one of the following values for ENGINE:"; \ echo "You must supply one of the following values for ENGINE:"; \
echo "left4dead2, left4dead, orangeboxvalve, css, orangebox, or original"; \ echo "left4dead2, left4dead, orangeboxvalve, orangebox, or original"; \
exit 1; \ exit 1; \
fi fi

Some files were not shown because too many files have changed in this diff Show More