init commit
This commit is contained in:
		
						commit
						5ac6f94118
					
				
							
								
								
									
										448
									
								
								AMBuildScript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										448
									
								
								AMBuildScript
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,448 @@ | ||||
| # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: | ||||
| import os, sys | ||||
| 
 | ||||
| # Simple extensions do not need to modify this file. | ||||
| 
 | ||||
| class SDK(object): | ||||
|   def __init__(self, sdk, ext, aDef, name, platform, dir): | ||||
|     self.folder = 'hl2sdk-' + dir | ||||
|     self.envvar = sdk | ||||
|     self.ext = ext | ||||
|     self.code = aDef | ||||
|     self.define = name | ||||
|     self.platform = platform | ||||
|     self.name = dir | ||||
|     self.path = None # Actual path | ||||
| 
 | ||||
| WinOnly = ['windows'] | ||||
| WinLinux = ['windows', 'linux'] | ||||
| WinLinuxMac = ['windows', 'linux', 'mac'] | ||||
| 
 | ||||
| PossibleSDKs = { | ||||
|   'episode1':  SDK('HL2SDK', '1.ep1', '1', 'EPISODEONE', WinLinux, 'episode1'), | ||||
|   'ep2':  SDK('HL2SDKOB', '2.ep2', '3', 'ORANGEBOX', WinLinux, 'orangebox'), | ||||
|   'css':  SDK('HL2SDKCSS', '2.css', '6', 'CSS', WinLinuxMac, 'css'), | ||||
|   'hl2dm':  SDK('HL2SDKHL2DM', '2.hl2dm', '7', 'HL2DM', WinLinuxMac, 'hl2dm'), | ||||
|   'dods': SDK('HL2SDKDODS', '2.dods', '8', 'DODS', WinLinuxMac, 'dods'), | ||||
|   'sdk2013': SDK('HL2SDK2013', '2.sdk2013', '9', 'SDK2013', WinLinuxMac, 'sdk2013'), | ||||
|   'tf2':  SDK('HL2SDKTF2', '2.tf2', '11', 'TF2', WinLinuxMac, 'tf2'), | ||||
|   'l4d':  SDK('HL2SDKL4D', '2.l4d', '12', 'LEFT4DEAD', WinLinuxMac, 'l4d'), | ||||
|   'nucleardawn': SDK('HL2SDKND', '2.nd', '13', 'NUCLEARDAWN', WinLinuxMac, 'nucleardawn'), | ||||
|   'l4d2': SDK('HL2SDKL4D2', '2.l4d2', '15', 'LEFT4DEAD2', WinLinuxMac, 'l4d2'), | ||||
|   'darkm':  SDK('HL2SDK-DARKM', '2.darkm', '2', 'DARKMESSIAH', WinOnly, 'darkm'), | ||||
|   'swarm':  SDK('HL2SDK-SWARM', '2.swarm', '16', 'ALIENSWARM', WinOnly, 'swarm'), | ||||
|   'bgt':  SDK('HL2SDK-BGT', '2.bgt', '4', 'BLOODYGOODTIME', WinOnly, 'bgt'), | ||||
|   'eye':  SDK('HL2SDK-EYE', '2.eye', '5', 'EYE', WinOnly, 'eye'), | ||||
|   'csgo': SDK('HL2SDKCSGO', '2.csgo', '21', 'CSGO', WinLinuxMac, 'csgo'), | ||||
|   'portal2':  SDK('HL2SDKPORTAL2', '2.portal2', '17', 'PORTAL2', [], 'portal2'), | ||||
|   'blade':  SDK('HL2SDKBLADE', '2.blade', '18', 'BLADE', WinLinux, 'blade'), | ||||
|   'insurgency':  SDK('HL2SDKINSURGENCY', '2.insurgency', '19', 'INSURGENCY', WinLinuxMac, 'insurgency'), | ||||
|   'contagion':  SDK('HL2SDKCONTAGION', '2.contagion', '14', 'CONTAGION', WinOnly, 'contagion'), | ||||
|   'bms':  SDK('HL2SDKBMS', '2.bms', '10', 'BMS', WinLinux, 'bms'), | ||||
|   'doi':  SDK('HL2SDKDOI', '2.doi', '20', 'DOI', WinLinuxMac, 'doi'), | ||||
| } | ||||
| 
 | ||||
| def ResolveEnvPath(env, folder): | ||||
|   if env in os.environ: | ||||
|     path = os.environ[env] | ||||
|     if os.path.isdir(path): | ||||
|       return path | ||||
|     return None | ||||
| 
 | ||||
|   head = os.getcwd() | ||||
|   oldhead = None | ||||
|   while head != None and head != oldhead: | ||||
|     path = os.path.join(head, folder) | ||||
|     if os.path.isdir(path): | ||||
|       return path | ||||
|     oldhead = head | ||||
|     head, tail = os.path.split(head) | ||||
| 
 | ||||
|   return None | ||||
| 
 | ||||
| def Normalize(path): | ||||
|   return os.path.abspath(os.path.normpath(path)) | ||||
| 
 | ||||
| class ExtensionConfig(object): | ||||
|   def __init__(self): | ||||
|     self.sdks = {} | ||||
|     self.binaries = [] | ||||
|     self.extensions = [] | ||||
|     self.generated_headers = None | ||||
|     self.mms_root = None | ||||
|     self.sm_root = None | ||||
| 
 | ||||
|   @property | ||||
|   def tag(self): | ||||
|     if builder.options.debug == '1': | ||||
|       return 'Debug' | ||||
|     return 'Release' | ||||
| 
 | ||||
|   def detectSDKs(self): | ||||
|     sdk_list = builder.options.sdks.split(',') | ||||
|     use_all = sdk_list[0] == 'all' | ||||
|     use_present = sdk_list[0] == 'present' | ||||
| 
 | ||||
|     for sdk_name in PossibleSDKs: | ||||
|       sdk = PossibleSDKs[sdk_name] | ||||
|       if builder.target_platform in sdk.platform: | ||||
|         if builder.options.hl2sdk_root: | ||||
|           sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder) | ||||
|         else: | ||||
|           sdk_path = ResolveEnvPath(sdk.envvar, sdk.folder) | ||||
|         if sdk_path is None or not os.path.isdir(sdk_path): | ||||
|           if use_all or sdk_name in sdk_list: | ||||
|             raise Exception('Could not find a valid path for {0}'.format(sdk.envvar)) | ||||
|           continue | ||||
|         if use_all or use_present or sdk_name in sdk_list: | ||||
|           sdk.path = Normalize(sdk_path) | ||||
|           self.sdks[sdk_name] = sdk | ||||
| 
 | ||||
|     if len(self.sdks) < 1: | ||||
|       raise Exception('At least one SDK must be available.') | ||||
| 
 | ||||
|     if builder.options.sm_path: | ||||
|       self.sm_root = builder.options.sm_path | ||||
|     else: | ||||
|       self.sm_root = ResolveEnvPath('SOURCEMOD18', 'sourcemod-1.8') | ||||
|       if not self.sm_root: | ||||
|         self.sm_root = ResolveEnvPath('SOURCEMOD', 'sourcemod') | ||||
|       if not self.sm_root: | ||||
|         self.sm_root = ResolveEnvPath('SOURCEMOD_DEV', 'sourcemod-central') | ||||
| 
 | ||||
|     if not self.sm_root or not os.path.isdir(self.sm_root): | ||||
|       raise Exception('Could not find a source copy of SourceMod') | ||||
|     self.sm_root = Normalize(self.sm_root) | ||||
| 
 | ||||
|     if builder.options.mms_path: | ||||
|       self.mms_root = builder.options.mms_path | ||||
|     else: | ||||
|       self.mms_root = ResolveEnvPath('MMSOURCE110', 'mmsource-1.10') | ||||
|       if not self.mms_root: | ||||
|         self.mms_root = ResolveEnvPath('MMSOURCE', 'metamod-source') | ||||
|       if not self.mms_root: | ||||
|         self.mms_root = ResolveEnvPath('MMSOURCE_DEV', 'mmsource-central') | ||||
| 
 | ||||
|     if not self.mms_root or not os.path.isdir(self.mms_root): | ||||
|       raise Exception('Could not find a source copy of Metamod:Source') | ||||
|     self.mms_root = Normalize(self.mms_root) | ||||
| 
 | ||||
|   def configure(self): | ||||
|     cxx = builder.DetectCompilers() | ||||
| 
 | ||||
|     if cxx.like('gcc'): | ||||
|       self.configure_gcc(cxx) | ||||
|     elif cxx.vendor == 'msvc': | ||||
|       self.configure_msvc(cxx) | ||||
| 
 | ||||
|     # Optimizaiton | ||||
|     if builder.options.opt == '1': | ||||
|       cxx.defines += ['NDEBUG'] | ||||
| 
 | ||||
|     # Debugging | ||||
|     if builder.options.debug == '1': | ||||
|       cxx.defines += ['DEBUG', '_DEBUG'] | ||||
| 
 | ||||
|     # Platform-specifics | ||||
|     if builder.target_platform == 'linux': | ||||
|       self.configure_linux(cxx) | ||||
|     elif builder.target_platform == 'mac': | ||||
|       self.configure_mac(cxx) | ||||
|     elif builder.target_platform == 'windows': | ||||
|       self.configure_windows(cxx) | ||||
| 
 | ||||
|     # Finish up. | ||||
|     cxx.includes += [ | ||||
|       os.path.join(self.sm_root, 'public'), | ||||
|     ] | ||||
| 
 | ||||
|   def configure_gcc(self, cxx): | ||||
|     cxx.defines += [ | ||||
|       'stricmp=strcasecmp', | ||||
|       '_stricmp=strcasecmp', | ||||
|       '_snprintf=snprintf', | ||||
|       '_vsnprintf=vsnprintf', | ||||
|       'HAVE_STDINT_H', | ||||
|       'GNUC', | ||||
|     ] | ||||
|     cxx.cflags += [ | ||||
|       '-pipe', | ||||
|       '-fno-strict-aliasing', | ||||
|       '-Wall', | ||||
|       '-Werror', | ||||
|       '-Wno-unused', | ||||
|       '-Wno-switch', | ||||
|       '-Wno-array-bounds', | ||||
|       '-msse', | ||||
|       '-m32', | ||||
|       '-fvisibility=hidden', | ||||
|     ] | ||||
|     cxx.cxxflags += [ | ||||
|       '-std=c++11', | ||||
|       '-fno-exceptions', | ||||
|       '-fno-threadsafe-statics', | ||||
|       '-Wno-non-virtual-dtor', | ||||
|       '-Wno-overloaded-virtual', | ||||
|       '-fvisibility-inlines-hidden', | ||||
|     ] | ||||
|     cxx.linkflags += ['-m32'] | ||||
| 
 | ||||
|     have_gcc = cxx.vendor == 'gcc' | ||||
|     have_clang = cxx.vendor == 'clang' | ||||
|     if cxx.version >= 'clang-3.6': | ||||
|       cxx.cxxflags += ['-Wno-inconsistent-missing-override'] | ||||
|     if have_clang or (cxx.version >= 'gcc-4.6'): | ||||
|       cxx.cflags += ['-Wno-narrowing'] | ||||
|     if have_clang or (cxx.version >= 'gcc-4.7'): | ||||
|       cxx.cxxflags += ['-Wno-delete-non-virtual-dtor'] | ||||
|     if cxx.version >= 'gcc-4.8': | ||||
|       cxx.cflags += ['-Wno-unused-result'] | ||||
| 
 | ||||
|     if have_clang: | ||||
|       cxx.cxxflags += ['-Wno-implicit-exception-spec-mismatch'] | ||||
|       if cxx.version >= 'apple-clang-5.1' or cxx.version >= 'clang-3.4': | ||||
|         cxx.cxxflags += ['-Wno-deprecated-register'] | ||||
|       else: | ||||
|         cxx.cxxflags += ['-Wno-deprecated'] | ||||
|       cxx.cflags += ['-Wno-sometimes-uninitialized'] | ||||
| 
 | ||||
|     if have_gcc: | ||||
|       cxx.cflags += ['-mfpmath=sse'] | ||||
| 
 | ||||
|     if builder.options.opt == '1': | ||||
|       cxx.cflags += ['-O3'] | ||||
| 
 | ||||
|   def configure_msvc(self, cxx): | ||||
|     if builder.options.debug == '1': | ||||
|       cxx.cflags += ['/MTd'] | ||||
|       cxx.linkflags += ['/NODEFAULTLIB:libcmt'] | ||||
|     else: | ||||
|       cxx.cflags += ['/MT'] | ||||
|     cxx.defines += [ | ||||
|       '_CRT_SECURE_NO_DEPRECATE', | ||||
|       '_CRT_SECURE_NO_WARNINGS', | ||||
|       '_CRT_NONSTDC_NO_DEPRECATE', | ||||
|       '_ITERATOR_DEBUG_LEVEL=0', | ||||
|     ] | ||||
|     cxx.cflags += [ | ||||
|       '/W3', | ||||
|     ] | ||||
|     cxx.cxxflags += [ | ||||
|       '/EHsc', | ||||
|       '/GR-', | ||||
|       '/TP', | ||||
|     ] | ||||
|     cxx.linkflags += [ | ||||
|       '/MACHINE:X86', | ||||
|       'kernel32.lib', | ||||
|       'user32.lib', | ||||
|       'gdi32.lib', | ||||
|       'winspool.lib', | ||||
|       'comdlg32.lib', | ||||
|       'advapi32.lib', | ||||
|       'shell32.lib', | ||||
|       'ole32.lib', | ||||
|       'oleaut32.lib', | ||||
|       'uuid.lib', | ||||
|       'odbc32.lib', | ||||
|       'odbccp32.lib', | ||||
|     ] | ||||
| 
 | ||||
|     if builder.options.opt == '1': | ||||
|       cxx.cflags += ['/Ox', '/Zo'] | ||||
|       cxx.linkflags += ['/OPT:ICF', '/OPT:REF'] | ||||
| 
 | ||||
|     if builder.options.debug == '1': | ||||
|       cxx.cflags += ['/Od', '/RTC1'] | ||||
| 
 | ||||
|     # This needs to be after our optimization flags which could otherwise disable it. | ||||
|     # Don't omit the frame pointer. | ||||
|     cxx.cflags += ['/Oy-'] | ||||
| 
 | ||||
|   def configure_linux(self, cxx): | ||||
|     cxx.defines += ['_LINUX', 'POSIX'] | ||||
|     cxx.linkflags += ['-Wl,--exclude-libs,ALL', '-lm'] | ||||
|     if cxx.vendor == 'gcc': | ||||
|       cxx.linkflags += ['-static-libgcc'] | ||||
|     elif cxx.vendor == 'clang': | ||||
|       cxx.linkflags += ['-lgcc_eh'] | ||||
| 
 | ||||
|   def configure_mac(self, cxx): | ||||
|     cxx.defines += ['OSX', '_OSX', 'POSIX'] | ||||
|     cxx.cflags += ['-mmacosx-version-min=10.5'] | ||||
|     cxx.linkflags += [ | ||||
|       '-mmacosx-version-min=10.5', | ||||
|       '-arch', 'i386', | ||||
|       '-lstdc++', | ||||
|       '-stdlib=libstdc++', | ||||
|     ] | ||||
|     cxx.cxxflags += ['-stdlib=libstdc++'] | ||||
| 
 | ||||
|   def configure_windows(self, cxx): | ||||
|     cxx.defines += ['WIN32', '_WINDOWS'] | ||||
| 	 | ||||
|   def ConfigureForExtension(self, context, compiler): | ||||
|     compiler.cxxincludes += [ | ||||
|       os.path.join(context.currentSourcePath), | ||||
|       os.path.join(context.currentSourcePath, 'sdk'), | ||||
|       os.path.join(self.sm_root, 'public'), | ||||
|       os.path.join(self.sm_root, 'public', 'extensions'), | ||||
|       os.path.join(self.sm_root, 'sourcepawn', 'include'), | ||||
|       os.path.join(self.sm_root, 'public', 'amtl', 'amtl'), | ||||
|       os.path.join(self.sm_root, 'public', 'amtl'), | ||||
|     ] | ||||
|     return compiler | ||||
| 
 | ||||
|   def ConfigureForHL2(self, binary, sdk): | ||||
|     compiler = binary.compiler | ||||
| 
 | ||||
|     if sdk.name == 'episode1': | ||||
|       mms_path = os.path.join(self.mms_root, 'core-legacy') | ||||
|     else: | ||||
|       mms_path = os.path.join(self.mms_root, 'core') | ||||
| 
 | ||||
|     compiler.cxxincludes += [ | ||||
|       os.path.join(mms_path), | ||||
|       os.path.join(mms_path, 'sourcehook'), | ||||
|     ] | ||||
| 
 | ||||
|     defines = ['SE_' + PossibleSDKs[i].define + '=' + PossibleSDKs[i].code for i in PossibleSDKs] | ||||
|     compiler.defines += defines | ||||
| 
 | ||||
|     paths = [ | ||||
|       ['public'], | ||||
|       ['public', 'engine'], | ||||
|       ['public', 'mathlib'], | ||||
|       ['public', 'vstdlib'], | ||||
|       ['public', 'tier0'], | ||||
|       ['public', 'tier1'] | ||||
|     ] | ||||
|     if sdk.name == 'episode1' or sdk.name == 'darkm': | ||||
|       paths.append(['public', 'dlls']) | ||||
|       paths.append(['game_shared']) | ||||
|     else: | ||||
|       paths.append(['public', 'game', 'server']) | ||||
|       paths.append(['public', 'toolframework']) | ||||
|       paths.append(['game', 'shared']) | ||||
|       paths.append(['common']) | ||||
| 
 | ||||
|     compiler.defines += ['SOURCE_ENGINE=' + sdk.code] | ||||
| 
 | ||||
|     if sdk.name in ['sdk2013', 'bms'] and compiler.like('gcc'): | ||||
|       # The 2013 SDK already has these in public/tier0/basetypes.h | ||||
|       compiler.defines.remove('stricmp=strcasecmp') | ||||
|       compiler.defines.remove('_stricmp=strcasecmp') | ||||
|       compiler.defines.remove('_snprintf=snprintf') | ||||
|       compiler.defines.remove('_vsnprintf=vsnprintf') | ||||
| 
 | ||||
|     if compiler.like('msvc'): | ||||
|       compiler.defines += ['COMPILER_MSVC', 'COMPILER_MSVC32'] | ||||
|     else: | ||||
|       compiler.defines += ['COMPILER_GCC'] | ||||
| 
 | ||||
|     # For everything after Swarm, this needs to be defined for entity networking | ||||
|     # to work properly with sendprop value changes. | ||||
|     if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: | ||||
|       compiler.defines += ['NETWORK_VARS_ENABLED'] | ||||
| 
 | ||||
|     if sdk.name in ['css', 'hl2dm', 'dods', 'sdk2013', 'bms', 'tf2', 'l4d', 'nucleardawn', 'l4d2']: | ||||
|       if builder.target_platform in ['linux', 'mac']: | ||||
|         compiler.defines += ['NO_HOOK_MALLOC', 'NO_MALLOC_OVERRIDE'] | ||||
| 
 | ||||
|     if sdk.name == 'csgo' and builder.target_platform == 'linux': | ||||
|       compiler.linkflags += ['-lstdc++'] | ||||
| 
 | ||||
|     for path in paths: | ||||
|       compiler.cxxincludes += [os.path.join(sdk.path, *path)] | ||||
| 
 | ||||
|     if builder.target_platform == 'linux': | ||||
|       if sdk.name == 'episode1': | ||||
|         lib_folder = os.path.join(sdk.path, 'linux_sdk') | ||||
|       elif sdk.name in ['sdk2013', 'bms']: | ||||
|         lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') | ||||
|       else: | ||||
|         lib_folder = os.path.join(sdk.path, 'lib', 'linux') | ||||
|     elif builder.target_platform == 'mac': | ||||
|       if sdk.name in ['sdk2013', 'bms']: | ||||
|         lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') | ||||
|       else: | ||||
|         lib_folder = os.path.join(sdk.path, 'lib', 'mac') | ||||
| 
 | ||||
|     if builder.target_platform in ['linux', 'mac']: | ||||
|       if sdk.name in ['sdk2013', 'bms']: | ||||
|         compiler.postlink += [ | ||||
|           compiler.Dep(os.path.join(lib_folder, 'tier1.a')), | ||||
|           compiler.Dep(os.path.join(lib_folder, 'mathlib.a')) | ||||
|         ] | ||||
|       else: | ||||
|         compiler.postlink += [ | ||||
|           compiler.Dep(os.path.join(lib_folder, 'tier1_i486.a')), | ||||
|           compiler.Dep(os.path.join(lib_folder, 'mathlib_i486.a')) | ||||
|         ] | ||||
| 
 | ||||
|       if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: | ||||
|         compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))] | ||||
| 
 | ||||
|     dynamic_libs = [] | ||||
|     if builder.target_platform == 'linux': | ||||
|       if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2', 'insurgency', 'doi']: | ||||
|         dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] | ||||
|       elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo']: | ||||
|         dynamic_libs = ['libtier0.so', 'libvstdlib.so'] | ||||
|       else: | ||||
|         dynamic_libs = ['tier0_i486.so', 'vstdlib_i486.so'] | ||||
|     elif builder.target_platform == 'mac': | ||||
|       compiler.linkflags.append('-liconv') | ||||
|       dynamic_libs = ['libtier0.dylib', 'libvstdlib.dylib'] | ||||
|     elif builder.target_platform == 'windows': | ||||
|       libs = ['tier0', 'tier1', 'vstdlib', 'mathlib'] | ||||
|       if sdk.name in ['swarm', 'blade', 'insurgency', 'doi', 'csgo']: | ||||
|         libs.append('interfaces') | ||||
|       for lib in libs: | ||||
|         lib_path = os.path.join(sdk.path, 'lib', 'public', lib) + '.lib' | ||||
|         compiler.linkflags.append(compiler.Dep(lib_path)) | ||||
| 
 | ||||
|     for library in dynamic_libs: | ||||
|       source_path = os.path.join(lib_folder, library) | ||||
|       output_path = os.path.join(binary.localFolder, library) | ||||
| 
 | ||||
|       def make_linker(source_path, output_path): | ||||
|         def link(context, binary): | ||||
|           cmd_node, (output,) = context.AddSymlink(source_path, output_path) | ||||
|           return output | ||||
|         return link | ||||
| 
 | ||||
|       linker = make_linker(source_path, output_path) | ||||
|       compiler.linkflags[0:0] = [compiler.Dep(library, linker)] | ||||
| 
 | ||||
|     return binary | ||||
| 
 | ||||
|   def HL2Library(self, context, name, sdk): | ||||
|     binary = context.compiler.Library(name) | ||||
|     self.ConfigureForExtension(context, binary.compiler) | ||||
|     return self.ConfigureForHL2(binary, sdk) | ||||
| 
 | ||||
|   def HL2Project(self, context, name): | ||||
|     project = context.compiler.LibraryProject(name) | ||||
|     self.ConfigureForExtension(context, project.compiler) | ||||
|     return project | ||||
| 
 | ||||
|   def HL2Config(self, project, name, sdk): | ||||
|     binary = project.Configure(name, '{0} - {1}'.format(self.tag, sdk.name)) | ||||
|     return self.ConfigureForHL2(binary, sdk) | ||||
| 
 | ||||
| Extension = ExtensionConfig() | ||||
| Extension.detectSDKs() | ||||
| Extension.configure() | ||||
| 
 | ||||
| # Add additional buildscripts here | ||||
| BuildScripts = [ | ||||
|   'AMBuilder', | ||||
| ] | ||||
| 
 | ||||
| if builder.backend == 'amb2': | ||||
|   BuildScripts += [ | ||||
|     'PackageScript', | ||||
|   ] | ||||
| 
 | ||||
| builder.RunBuildScripts(BuildScripts, { 'Extension': Extension}) | ||||
							
								
								
									
										31
									
								
								AMBuilder
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								AMBuilder
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: | ||||
| import os, sys | ||||
| 
 | ||||
| projectName = 'RevEmuAPI' | ||||
| 
 | ||||
| # smsdk_ext.cpp will be automatically added later | ||||
| sourceFiles = [ | ||||
|   'extension.cpp', | ||||
| ] | ||||
| 
 | ||||
| ############### | ||||
| # Make sure to edit PackageScript, which copies your files to their appropriate locations | ||||
| # Simple extensions do not need to modify past this point. | ||||
| 
 | ||||
| project = Extension.HL2Project(builder, projectName + '.ext') | ||||
| 
 | ||||
| if os.path.isfile(os.path.join(builder.currentSourcePath, 'sdk', 'smsdk_ext.cpp')): | ||||
|   # Use the copy included in the project | ||||
|   project.sources += [os.path.join('sdk', 'smsdk_ext.cpp')] | ||||
| else: | ||||
|   # Use the copy included with SM 1.6 and newer | ||||
|   project.sources += [os.path.join(Extension.sm_root, 'public', 'smsdk_ext.cpp')] | ||||
| 
 | ||||
| project.sources += sourceFiles | ||||
| 
 | ||||
| for sdk_name in Extension.sdks: | ||||
|   sdk = Extension.sdks[sdk_name] | ||||
| 
 | ||||
|   binary = Extension.HL2Config(project, projectName + '.ext', sdk) | ||||
| 
 | ||||
| Extension.extensions = builder.Add(project) | ||||
							
								
								
									
										233
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,233 @@ | ||||
| # (C)2004-2010 SourceMod Development Team
 | ||||
| # Makefile written by David "BAILOPAN" Anderson
 | ||||
| 
 | ||||
| ###########################################
 | ||||
| ### EDIT THESE PATHS FOR YOUR OWN SETUP ###
 | ||||
| ###########################################
 | ||||
| 
 | ||||
| SMSDK = ../.. | ||||
| HL2SDK_ORIG = ../../../hl2sdk | ||||
| HL2SDK_OB = ../../../hl2sdk-ob | ||||
| HL2SDK_CSS = ../../../hl2sdk-css | ||||
| HL2SDK_OB_VALVE = ../../../hl2sdk-ob-valve | ||||
| HL2SDK_L4D = ../../../hl2sdk-l4d | ||||
| HL2SDK_L4D2 = ../../../hl2sdk-l4d2 | ||||
| HL2SDK_CSGO = ../../../hl2sdk-csgo | ||||
| MMSOURCE19 = ../../../mmsource-1.9 | ||||
| 
 | ||||
| #####################################
 | ||||
| ### EDIT BELOW FOR OTHER PROJECTS ###
 | ||||
| #####################################
 | ||||
| 
 | ||||
| PROJECT = RevEmuAPI | ||||
| 
 | ||||
| #Uncomment for Metamod: Source enabled extension
 | ||||
| #USEMETA = true
 | ||||
| 
 | ||||
| OBJECTS = smsdk_ext.cpp extension.cpp | ||||
| 
 | ||||
| ##############################################
 | ||||
| ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ###
 | ||||
| ##############################################
 | ||||
| 
 | ||||
| C_OPT_FLAGS = -DNDEBUG -O3 -funroll-loops -pipe -fno-strict-aliasing | ||||
| C_DEBUG_FLAGS = -D_DEBUG -DDEBUG -g -ggdb3 | ||||
| C_GCC4_FLAGS = -fvisibility=hidden | ||||
| CPP_GCC4_FLAGS = -fvisibility-inlines-hidden | ||||
| CPP = gcc | ||||
| CPP_OSX = clang | ||||
| 
 | ||||
| ##########################
 | ||||
| ### SDK CONFIGURATIONS ###
 | ||||
| ##########################
 | ||||
| 
 | ||||
| override ENGSET = false | ||||
| 
 | ||||
| # Check for valid list of engines
 | ||||
| ifneq (,$(filter original orangebox orangeboxvalve css left4dead left4dead2 csgo,$(ENGINE))) | ||||
| 	override ENGSET = true | ||||
| endif | ||||
| 
 | ||||
| ifeq "$(ENGINE)" "original" | ||||
| 	HL2SDK = $(HL2SDK_ORIG) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=1 | ||||
| endif | ||||
| ifeq "$(ENGINE)" "orangebox" | ||||
| 	HL2SDK = $(HL2SDK_OB) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=3 | ||||
| endif | ||||
| ifeq "$(ENGINE)" "css" | ||||
| 	HL2SDK = $(HL2SDK_CSS) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=6 | ||||
| endif | ||||
| ifeq "$(ENGINE)" "orangeboxvalve" | ||||
| 	HL2SDK = $(HL2SDK_OB_VALVE) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=7 | ||||
| endif | ||||
| ifeq "$(ENGINE)" "left4dead" | ||||
| 	HL2SDK = $(HL2SDK_L4D) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=8 | ||||
| endif | ||||
| ifeq "$(ENGINE)" "left4dead2" | ||||
| 	HL2SDK = $(HL2SDK_L4D2) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=9 | ||||
| endif | ||||
| ifeq "$(ENGINE)" "csgo" | ||||
| 	HL2SDK = $(HL2SDK_CSGO) | ||||
| 	CFLAGS += -DSOURCE_ENGINE=12 | ||||
| endif | ||||
| 
 | ||||
| HL2PUB = $(HL2SDK)/public | ||||
| 
 | ||||
| ifeq "$(ENGINE)" "original" | ||||
| 	INCLUDE += -I$(HL2SDK)/public/dlls | ||||
| 	METAMOD = $(MMSOURCE19)/core-legacy | ||||
| else | ||||
| 	INCLUDE += -I$(HL2SDK)/public/game/server | ||||
| 	METAMOD = $(MMSOURCE19)/core | ||||
| endif | ||||
| 
 | ||||
| OS := $(shell uname -s) | ||||
| 
 | ||||
| ifeq "$(OS)" "Darwin" | ||||
| 	LIB_EXT = dylib | ||||
| 	HL2LIB = $(HL2SDK)/lib/mac | ||||
| else | ||||
| 	LIB_EXT = so | ||||
| 	ifeq "$(ENGINE)" "original" | ||||
| 		HL2LIB = $(HL2SDK)/linux_sdk | ||||
| 	else | ||||
| 		HL2LIB = $(HL2SDK)/lib/linux | ||||
| 	endif | ||||
| endif | ||||
| 
 | ||||
| # if ENGINE is original or OB
 | ||||
| ifneq (,$(filter original orangebox,$(ENGINE))) | ||||
| 	LIB_SUFFIX = _i486.$(LIB_EXT) | ||||
| else | ||||
| 	LIB_PREFIX = lib | ||||
| 	LIB_SUFFIX = .$(LIB_EXT) | ||||
| endif | ||||
| 
 | ||||
| INCLUDE += -I. -I.. -Isdk -I$(SMSDK)/public -I$(SMSDK)/sourcepawn/include | ||||
| 
 | ||||
| ifeq "$(USEMETA)" "true" | ||||
| 	LINK_HL2 = $(HL2LIB)/tier1_i486.a $(LIB_PREFIX)vstdlib$(LIB_SUFFIX) $(LIB_PREFIX)tier0$(LIB_SUFFIX) | ||||
| 	ifeq "$(ENGINE)" "csgo" | ||||
| 		LINK_HL2 += $(HL2LIB)/interfaces_i486.a | ||||
| 	endif | ||||
| 
 | ||||
| 	LINK += $(LINK_HL2) | ||||
| 
 | ||||
| 	INCLUDE += -I$(HL2PUB) -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 -I$(METAMOD) \
 | ||||
| 		-I$(METAMOD)/sourcehook | ||||
| 	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_PORTAL2=11 -DSE_CSGO=12 | ||||
| endif | ||||
| 
 | ||||
| LINK += -m32 -lm -ldl | ||||
| 
 | ||||
| CFLAGS += -DPOSIX -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp \
 | ||||
| 	-D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -DCOMPILER_GCC -Wall -Werror \
 | ||||
| 	-Wno-overloaded-virtual -Wno-switch -Wno-unused -msse -DSOURCEMOD_BUILD -DHAVE_STDINT_H -m32 | ||||
| CPPFLAGS += -Wno-non-virtual-dtor -fno-exceptions -fno-rtti -std=c++11 | ||||
| 
 | ||||
| ################################################
 | ||||
| ### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ###
 | ||||
| ################################################
 | ||||
| 
 | ||||
| BINARY = $(PROJECT).ext.$(LIB_EXT) | ||||
| 
 | ||||
| ifeq "$(DEBUG)" "true" | ||||
| 	BIN_DIR = Debug | ||||
| 	CFLAGS += $(C_DEBUG_FLAGS) | ||||
| else | ||||
| 	BIN_DIR = Release | ||||
| 	CFLAGS += $(C_OPT_FLAGS) | ||||
| endif | ||||
| 
 | ||||
| ifeq "$(USEMETA)" "true" | ||||
| 	BIN_DIR := $(BIN_DIR).$(ENGINE) | ||||
| endif | ||||
| 
 | ||||
| ifeq "$(OS)" "Darwin" | ||||
| 	CPP = $(CPP_OSX) | ||||
| 	LIB_EXT = dylib | ||||
| 	CFLAGS += -DOSX -D_OSX | ||||
| 	LINK += -dynamiclib -lstdc++ -mmacosx-version-min=10.5 | ||||
| else | ||||
| 	LIB_EXT = so | ||||
| 	CFLAGS += -D_LINUX | ||||
| 	LINK += -shared | ||||
| endif | ||||
| 
 | ||||
| IS_CLANG := $(shell $(CPP) --version | head -1 | grep clang > /dev/null && echo "1" || echo "0") | ||||
| 
 | ||||
| ifeq "$(IS_CLANG)" "1" | ||||
| 	CPP_MAJOR := $(shell $(CPP) --version | grep clang | sed "s/.*version \([0-9]\)*\.[0-9]*.*/\1/") | ||||
| 	CPP_MINOR := $(shell $(CPP) --version | grep clang | sed "s/.*version [0-9]*\.\([0-9]\)*.*/\1/") | ||||
| else | ||||
| 	CPP_MAJOR := $(shell $(CPP) -dumpversion >&1 | cut -b1) | ||||
| 	CPP_MINOR := $(shell $(CPP) -dumpversion >&1 | cut -b3) | ||||
| endif | ||||
| 
 | ||||
| # If not clang
 | ||||
| ifeq "$(IS_CLANG)" "0" | ||||
| 	CFLAGS += -mfpmath=sse | ||||
| endif | ||||
| 
 | ||||
| # Clang || GCC >= 4
 | ||||
| ifeq "$(shell expr $(IS_CLANG) \| $(CPP_MAJOR) \>= 4)" "1" | ||||
| 	CFLAGS += $(C_GCC4_FLAGS) | ||||
| 	CPPFLAGS += $(CPP_GCC4_FLAGS) | ||||
| endif | ||||
| 
 | ||||
| # Clang >= 3 || GCC >= 4.7
 | ||||
| ifeq "$(shell expr $(IS_CLANG) \& $(CPP_MAJOR) \>= 3 \| $(CPP_MAJOR) \>= 4 \& $(CPP_MINOR) \>= 7)" "1" | ||||
| 	CFLAGS += -Wno-delete-non-virtual-dtor | ||||
| endif | ||||
| 
 | ||||
| # OS is Linux and not using clang
 | ||||
| ifeq "$(shell expr $(OS) \= Linux \& $(IS_CLANG) \= 0)" "1" | ||||
| 	LINK += -static-libgcc | ||||
| endif | ||||
| 
 | ||||
| OBJ_BIN := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) | ||||
| 
 | ||||
| # This will break if we include other Makefiles, but is fine for now. It allows
 | ||||
| #  us to make a copy of this file that uses altered paths (ie. Makefile.mine)
 | ||||
| #  or other changes without mucking up the original.
 | ||||
| MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) | ||||
| 
 | ||||
| $(BIN_DIR)/%.o: %.cpp | ||||
| 	$(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< | ||||
| 
 | ||||
| all: check | ||||
| 	mkdir -p $(BIN_DIR) | ||||
| 	ln -sf ../smsdk_ext.cpp | ||||
| 	if [ "$(USEMETA)" = "true" ]; then \
 | ||||
| 		ln -sf $(HL2LIB)/$(LIB_PREFIX)vstdlib$(LIB_SUFFIX); \
 | ||||
| 		ln -sf $(HL2LIB)/$(LIB_PREFIX)tier0$(LIB_SUFFIX); \
 | ||||
| 	fi | ||||
| 	$(MAKE) -f $(MAKEFILE_NAME) extension | ||||
| 
 | ||||
| check: | ||||
| 	if [ "$(USEMETA)" = "true" ] && [ "$(ENGSET)" = "false" ]; then \
 | ||||
| 		echo "You must supply one of the following values for ENGINE:"; \
 | ||||
| 		echo "csgo, left4dead2, left4dead, css, orangeboxvalve, orangebox, or original"; \
 | ||||
| 		exit 1; \
 | ||||
| 	fi | ||||
| 
 | ||||
| extension: check $(OBJ_BIN) | ||||
| 	$(CPP) $(INCLUDE) $(OBJ_BIN) $(LINK) -o $(BIN_DIR)/$(BINARY) | ||||
| 
 | ||||
| debug: | ||||
| 	$(MAKE) -f $(MAKEFILE_NAME) all DEBUG=true | ||||
| 
 | ||||
| default: all | ||||
| 
 | ||||
| clean: check | ||||
| 	rm -rf $(BIN_DIR)/*.o | ||||
| 	rm -rf $(BIN_DIR)/$(BINARY) | ||||
| 
 | ||||
							
								
								
									
										52
									
								
								PackageScript
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								PackageScript
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| # vim: set ts=8 sts=2 sw=2 tw=99 et ft=python: | ||||
| import os | ||||
| 
 | ||||
| # This is where the files will be output to | ||||
| # package is the default | ||||
| builder.SetBuildFolder('package') | ||||
| 
 | ||||
| # Add any folders you need to this list | ||||
| folder_list = [ | ||||
|   'addons/sourcemod/extensions', | ||||
|   'addons/sourcemod/scripting/include', | ||||
|   #'addons/sourcemod/gamedata', | ||||
|   #'addons/sourcemod/configs', | ||||
| ] | ||||
| 
 | ||||
| # Create the distribution folder hierarchy. | ||||
| folder_map = {} | ||||
| for folder in folder_list: | ||||
|   norm_folder = os.path.normpath(folder) | ||||
|   folder_map[folder] = builder.AddFolder(norm_folder) | ||||
| 
 | ||||
| # Do all straight-up file copies from the source tree. | ||||
| def CopyFiles(src, dest, files): | ||||
|   if not dest: | ||||
|     dest = src | ||||
|   dest_entry = folder_map[dest] | ||||
|   for source_file in files: | ||||
|     source_path = os.path.join(builder.sourcePath, src, source_file) | ||||
|     builder.AddCopy(source_path, dest_entry) | ||||
| 
 | ||||
| # Include files | ||||
| CopyFiles('include', 'addons/sourcemod/scripting/include', | ||||
|   [ 'RevEmuAPI.inc', ] | ||||
| ) | ||||
| 
 | ||||
| # GameData files | ||||
| #CopyFiles('gamedata', 'addons/sourcemod/gamedata', | ||||
| #  [ 'myfile.txt', | ||||
| #  'file2.txt' | ||||
| #  ] | ||||
| #) | ||||
| 
 | ||||
| # Config Files | ||||
| #CopyFiles('configs', 'addons/sourcemod/configs', | ||||
| #  [ 'configfile.cfg', | ||||
| #  'otherconfig.cfg, | ||||
| #  ] | ||||
| #) | ||||
| 
 | ||||
| # Copy binaries. | ||||
| for cxx_task in Extension.extensions: | ||||
|   builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) | ||||
							
								
								
									
										23
									
								
								configure.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								configure.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| # vim: set sts=2 ts=8 sw=2 tw=99 et: | ||||
| import sys | ||||
| from ambuild2 import run | ||||
| 
 | ||||
| # Simple extensions do not need to modify this file. | ||||
| 
 | ||||
| builder = run.PrepareBuild(sourcePath = sys.path[0]) | ||||
| 
 | ||||
| builder.options.add_option('--hl2sdk-root', type=str, dest='hl2sdk_root', default=None, | ||||
| 		                   help='Root search folder for HL2SDKs') | ||||
| builder.options.add_option('--mms-path', type=str, dest='mms_path', default=None, | ||||
|                        help='Path to Metamod:Source') | ||||
| builder.options.add_option('--sm-path', type=str, dest='sm_path', default=None, | ||||
|                        help='Path to SourceMod') | ||||
| builder.options.add_option('--enable-debug', action='store_const', const='1', dest='debug', | ||||
|                        help='Enable debugging symbols') | ||||
| builder.options.add_option('--enable-optimize', action='store_const', const='1', dest='opt', | ||||
|                        help='Enable optimization') | ||||
| builder.options.add_option('-s', '--sdks', default='all', dest='sdks', | ||||
|                        help='Build against specified SDKs; valid args are "all", "present", or ' | ||||
|                             'comma-delimited list of engine names (default: %default)') | ||||
| 
 | ||||
| builder.Configure() | ||||
							
								
								
									
										166
									
								
								extension.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								extension.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,166 @@ | ||||
| /**
 | ||||
|  * vim: set ts=4 : | ||||
|  * ============================================================================= | ||||
|  * SourceMod RevEmuAPI Extension | ||||
|  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. | ||||
|  * ============================================================================= | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it under | ||||
|  * the terms of the GNU General Public License, version 3.0, as published by the | ||||
|  * Free Software Foundation. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but WITHOUT | ||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | ||||
|  * details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along with | ||||
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  * As a special exception, AlliedModders LLC gives you permission to link the | ||||
|  * code of this program (as well as its derivative works) to "Half-Life 2," the | ||||
|  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software | ||||
|  * by the Valve Corporation.  You must obey the GNU General Public License in | ||||
|  * all respects for all other code used.  Additionally, AlliedModders LLC grants | ||||
|  * this exception to all derivative works.  AlliedModders LLC defines further | ||||
|  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), | ||||
|  * or <http://www.sourcemod.net/license.php>.
 | ||||
|  * | ||||
|  * Version: $Id$ | ||||
|  */ | ||||
| 
 | ||||
| #include "extension.h" | ||||
| #include "revemu.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * @file extension.cpp | ||||
|  * @brief Implement extension code here. | ||||
|  */ | ||||
| 
 | ||||
| RevEmuAPI g_RevEmuAPI;		/**< Global singleton for extension's main interface */ | ||||
| 
 | ||||
| SMEXT_LINK(&g_RevEmuAPI); | ||||
| 
 | ||||
| pRev_BGetPlayerInfoByUserID Rev_BGetPlayerInfoByUserID; | ||||
| pRev_BGetPlayerInfoBySteamID Rev_BGetPlayerInfoBySteamID; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief | ||||
|  */ | ||||
| static cell_t IsPlayerSteam(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(params[1]); | ||||
| 	if (pPlayer == NULL) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Client index %d is invalid", params[1]); | ||||
| 	} | ||||
| 	else if (!pPlayer->IsConnected()) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Client %d is not connected", params[1]); | ||||
| 	} | ||||
| 	else if (pPlayer->IsFakeClient()) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Client %d is a bot", params[1]); | ||||
| 	} | ||||
| 
 | ||||
| 	PlayerInfo_t PlayerInfo; | ||||
| 	if (!Rev_BGetPlayerInfoBySteamID(pPlayer->GetSteamId64(), &PlayerInfo)) | ||||
| 	{ | ||||
| 		if (!Rev_BGetPlayerInfoByUserID(pPlayer->GetUserId(), &PlayerInfo)) | ||||
| 		{ | ||||
| 			PlayerInfo.m_ePlayerType = k_eUnknown; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return PlayerInfo.m_ePlayerType == k_eSteamLegitUser; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief | ||||
|  */ | ||||
| static cell_t GetPlayerType(IPluginContext *pContext, const cell_t *params) | ||||
| { | ||||
| 	IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(params[1]); | ||||
| 	if (pPlayer == NULL) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Client index %d is invalid", params[1]); | ||||
| 	} | ||||
| 	else if (!pPlayer->IsConnected()) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Client %d is not connected", params[1]); | ||||
| 	} | ||||
| 	else if (pPlayer->IsFakeClient()) | ||||
| 	{ | ||||
| 		return pContext->ThrowNativeError("Client %d is a bot", params[1]); | ||||
| 	} | ||||
| 
 | ||||
| 	PlayerInfo_t PlayerInfo; | ||||
| 	if (!Rev_BGetPlayerInfoBySteamID(pPlayer->GetSteamId64(), &PlayerInfo)) | ||||
| 	{ | ||||
| 		if (!Rev_BGetPlayerInfoByUserID(pPlayer->GetUserId(), &PlayerInfo)) | ||||
| 		{ | ||||
| 			PlayerInfo.m_ePlayerType = k_eUnknown; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return PlayerInfo.m_ePlayerType; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief | ||||
|  */ | ||||
| const sp_nativeinfo_t g_ExtensionNatives[] = | ||||
| { | ||||
| 	{ "RevEmu_IsPlayerSteam",	IsPlayerSteam }, | ||||
| 	{ "RevEmu_GetPlayerType",	GetPlayerType }, | ||||
| 	{ NULL,						NULL } | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief This is called after the initial loading sequence has been processed. | ||||
|  * | ||||
|  * @param error		Error message buffer. | ||||
|  * @param maxlength	Size of error message buffer. | ||||
|  * @param late		Whether or not the module was loaded after map load. | ||||
|  * @return			True to succeed loading, false to fail. | ||||
|  */ | ||||
| bool RevEmuAPI::SDK_OnLoad(char *error, size_t maxlength, bool late) | ||||
| { | ||||
| 	const char *pLibSteamClientPath = NULL; | ||||
| 
 | ||||
| 	#if defined POSIX | ||||
| 		pLibSteamClientPath = "./bin/steamclient.so"; | ||||
| 	#elif defined WIN32_LEAN_AND_MEAN | ||||
| 		pLibSteamClientPath = "./bin/steamclient.dll"; | ||||
| 	#endif | ||||
| 
 | ||||
| 	ILibrary *pLibSteamClient = libsys->OpenLibrary(pLibSteamClientPath, NULL, 0); | ||||
| 
 | ||||
| 	if (pLibSteamClient == NULL) | ||||
| 	{ | ||||
| 		snprintf(error, maxlength, "Unable to open library. '%s'", pLibSteamClientPath); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	Rev_BGetPlayerInfoByUserID = (pRev_BGetPlayerInfoByUserID)pLibSteamClient->GetSymbolAddress("Rev_BGetPlayerInfoByUserID"); | ||||
| 
 | ||||
| 	if (Rev_BGetPlayerInfoByUserID == NULL) | ||||
| 	{ | ||||
| 		snprintf(error, maxlength, "Unable to find emulator symbol. 'Rev_BGetPlayerInfoByUserID'"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	Rev_BGetPlayerInfoBySteamID = (pRev_BGetPlayerInfoBySteamID)pLibSteamClient->GetSymbolAddress("Rev_BGetPlayerInfoBySteamID"); | ||||
| 
 | ||||
| 	if (Rev_BGetPlayerInfoBySteamID == NULL) | ||||
| 	{ | ||||
| 		snprintf(error, maxlength, "Unable to find emulator symbol. 'Rev_BGetPlayerInfoBySteamID'"); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	sharesys->AddNatives(myself, g_ExtensionNatives); | ||||
| 	sharesys->RegisterLibrary(myself, "RevEmuAPI"); | ||||
| 
 | ||||
| 	pLibSteamClient->CloseLibrary(); | ||||
| 	return true; | ||||
| } | ||||
							
								
								
									
										119
									
								
								extension.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								extension.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| /**
 | ||||
|  * vim: set ts=4 : | ||||
|  * ============================================================================= | ||||
|  * SourceMod RevEmuAPI Extension | ||||
|  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. | ||||
|  * ============================================================================= | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it under | ||||
|  * the terms of the GNU General Public License, version 3.0, as published by the | ||||
|  * Free Software Foundation. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but WITHOUT | ||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | ||||
|  * details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along with | ||||
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  * As a special exception, AlliedModders LLC gives you permission to link the | ||||
|  * code of this program (as well as its derivative works) to "Half-Life 2," the | ||||
|  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software | ||||
|  * by the Valve Corporation.  You must obey the GNU General Public License in | ||||
|  * all respects for all other code used.  Additionally, AlliedModders LLC grants | ||||
|  * this exception to all derivative works.  AlliedModders LLC defines further | ||||
|  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), | ||||
|  * or <http://www.sourcemod.net/license.php>.
 | ||||
|  * | ||||
|  * Version: $Id$ | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ | ||||
| #define _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ | ||||
| 
 | ||||
| /**
 | ||||
|  * @file extension.h | ||||
|  * @brief RevEmuAPI extension code header. | ||||
|  */ | ||||
| 
 | ||||
| #include "smsdk_ext.h" | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief RevEmuAPI implementation of the SDK Extension. | ||||
|  * Note: Uncomment one of the pre-defined virtual functions in order to use it. | ||||
|  */ | ||||
| class RevEmuAPI : public SDKExtension | ||||
| { | ||||
| public: | ||||
| 	/**
 | ||||
| 	 * @brief This is called after the initial loading sequence has been processed. | ||||
| 	 * | ||||
| 	 * @param error		Error message buffer. | ||||
| 	 * @param maxlength	Size of error message buffer. | ||||
| 	 * @param late		Whether or not the module was loaded after map load. | ||||
| 	 * @return			True to succeed loading, false to fail. | ||||
| 	 */ | ||||
| 	virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late); | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * @brief This is called right before the extension is unloaded. | ||||
| 	 */ | ||||
| 	//virtual void SDK_OnUnload();
 | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * @brief This is called once all known extensions have been loaded. | ||||
| 	 * Note: It is is a good idea to add natives here, if any are provided. | ||||
| 	 */ | ||||
| 	//virtual void SDK_OnAllLoaded();
 | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * @brief Called when the pause state is changed. | ||||
| 	 */ | ||||
| 	//virtual void SDK_OnPauseChange(bool paused);
 | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * @brief this is called when Core wants to know if your extension is working. | ||||
| 	 * | ||||
| 	 * @param error		Error message buffer. | ||||
| 	 * @param maxlength	Size of error message buffer. | ||||
| 	 * @return			True if working, false otherwise. | ||||
| 	 */ | ||||
| 	//virtual bool QueryRunning(char *error, size_t maxlength);
 | ||||
| public: | ||||
| #if defined SMEXT_CONF_METAMOD | ||||
| 	/**
 | ||||
| 	 * @brief Called when Metamod is attached, before the extension version is called. | ||||
| 	 * | ||||
| 	 * @param error			Error buffer. | ||||
| 	 * @param maxlength		Maximum size of error buffer. | ||||
| 	 * @param late			Whether or not Metamod considers this a late load. | ||||
| 	 * @return				True to succeed, false to fail. | ||||
| 	 */ | ||||
| 	//virtual bool SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late);
 | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * @brief Called when Metamod is detaching, after the extension version is called. | ||||
| 	 * NOTE: By default this is blocked unless sent from SourceMod. | ||||
| 	 * | ||||
| 	 * @param error			Error buffer. | ||||
| 	 * @param maxlength		Maximum size of error buffer. | ||||
| 	 * @return				True to succeed, false to fail. | ||||
| 	 */ | ||||
| 	//virtual bool SDK_OnMetamodUnload(char *error, size_t maxlength);
 | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * @brief Called when Metamod's pause state is changing. | ||||
| 	 * NOTE: By default this is blocked unless sent from SourceMod. | ||||
| 	 * | ||||
| 	 * @param paused		Pause state being set. | ||||
| 	 * @param error			Error buffer. | ||||
| 	 * @param maxlength		Maximum size of error buffer. | ||||
| 	 * @return				True to succeed, false to fail. | ||||
| 	 */ | ||||
| 	//virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
 | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| #endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
 | ||||
							
								
								
									
										64
									
								
								include/RevEmuAPI.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								include/RevEmuAPI.inc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| #ifndef _RevEmuAPI_included
 | ||||
| #define _RevEmuAPI_included
 | ||||
| 
 | ||||
| enum RevEmu_UserType | ||||
| { | ||||
|     Unknown = -1, | ||||
| 	SteamLegitUser = 0, | ||||
|     SteamCrackedUser, | ||||
|     RevEmuUser, | ||||
|     RevEmuUserOld, | ||||
|     SettiSRCScanBot, | ||||
|     RevEmuUserV74, | ||||
|     RevEmuUserVeryOld, | ||||
|     UnknownUser, | ||||
|     Steam2Legit, | ||||
|     Steam2Cracked | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Check if clients usertype is legit. | ||||
|  * | ||||
|  * @param clients			The client index. | ||||
|  * | ||||
|  * @return 					True if valid, false otherwise. | ||||
|  * @error                   Invalid client index, not connected or fake client. | ||||
|  */ | ||||
| native bool RevEmu_IsPlayerSteam(int client); | ||||
| 
 | ||||
| /** | ||||
|  * Retrieve clients usertype. | ||||
|  * | ||||
|  * @param clients			The client index. | ||||
|  * | ||||
|  * @return 					The clients usertype. | ||||
|  * @error                   Invalid client index, not connected or fake client. | ||||
|  */ | ||||
| native RevEmu_UserType RevEmu_GetPlayerType(int client); | ||||
| 
 | ||||
| 
 | ||||
| public Extension __ext_RevEmuAPI = | ||||
| { | ||||
| 	name = "RevEmuAPI", | ||||
| 	file = "RevEmuAPI.ext", | ||||
| #if defined AUTOLOAD_EXTENSIONS
 | ||||
| 	autoload = 1, | ||||
| #else
 | ||||
| 	autoload = 0, | ||||
| #endif
 | ||||
| #if defined REQUIRE_EXTENSIONS
 | ||||
| 	required = 1, | ||||
| #else
 | ||||
| 	required = 0, | ||||
| #endif
 | ||||
| }; | ||||
| 
 | ||||
| #if !defined REQUIRE_EXTENSIONS
 | ||||
| public __ext_RevEmuAPI_SetNTVOptional() | ||||
| { | ||||
| 	MarkNativeAsOptional("RevEmu_IsPlayerSteam"); | ||||
| 	MarkNativeAsOptional("RevEmu_GetPlayerType"); | ||||
| } | ||||
| #endif
 | ||||
| 
 | ||||
| #endif //_RevEmuAPI_included
 | ||||
							
								
								
									
										35
									
								
								revemu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								revemu.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| #ifndef _INCLUDE_REVEMU_PROPER_H_ | ||||
| #define _INCLUDE_REVEMU_PROPER_H_ | ||||
| 
 | ||||
| typedef uint64_t CSteamID; | ||||
| 
 | ||||
| enum EUserType | ||||
| { | ||||
|     k_eUnknown = -1, | ||||
| 	k_eSteamLegitUser = 0, | ||||
|     k_eSteamCrackedUser, | ||||
|     k_eRevEmuUser, | ||||
|     k_eRevEmuUserOld, | ||||
|     k_eSettiSRCScanBot, | ||||
|     k_eRevEmuUserV74, | ||||
|     k_eRevEmuUserVeryOld, | ||||
|     k_eUnknownUser, | ||||
|     k_eSteam2Legit, | ||||
|     k_eSteam2Cracked | ||||
| }; | ||||
| 
 | ||||
| struct PlayerInfo_t | ||||
| { | ||||
| 	unsigned int m_unUserID; | ||||
| 	CSteamID m_steamIDPlayer; | ||||
| 	EUserType m_ePlayerType; | ||||
| 	unsigned int m_unIP; | ||||
| }; | ||||
| 
 | ||||
| typedef bool (*pRev_BGetPlayerInfoByUserID) ( unsigned int unUserID, PlayerInfo_t* pPlayerInfo ); | ||||
| typedef bool (*pRev_BGetPlayerInfoBySteamID) ( CSteamID steamID, PlayerInfo_t* pPlayerInfo ); | ||||
| 
 | ||||
| extern pRev_BGetPlayerInfoByUserID Rev_BGetPlayerInfoByUserID; | ||||
| extern pRev_BGetPlayerInfoBySteamID Rev_BGetPlayerInfoBySteamID; | ||||
| 
 | ||||
| #endif // _INCLUDE_REVEMU_PROPER_H_
 | ||||
							
								
								
									
										81
									
								
								smsdk_config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								smsdk_config.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | ||||
| /**
 | ||||
|  * vim: set ts=4 : | ||||
|  * ============================================================================= | ||||
|  * SourceMod RevEmuAPI Extension | ||||
|  * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved. | ||||
|  * ============================================================================= | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it under | ||||
|  * the terms of the GNU General Public License, version 3.0, as published by the | ||||
|  * Free Software Foundation. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but WITHOUT | ||||
|  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more | ||||
|  * details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along with | ||||
|  * this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  * | ||||
|  * As a special exception, AlliedModders LLC gives you permission to link the | ||||
|  * code of this program (as well as its derivative works) to "Half-Life 2," the | ||||
|  * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software | ||||
|  * by the Valve Corporation.  You must obey the GNU General Public License in | ||||
|  * all respects for all other code used.  Additionally, AlliedModders LLC grants | ||||
|  * this exception to all derivative works.  AlliedModders LLC defines further | ||||
|  * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), | ||||
|  * or <http://www.sourcemod.net/license.php>.
 | ||||
|  * | ||||
|  * Version: $Id$ | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ | ||||
| #define _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_ | ||||
| 
 | ||||
| /**
 | ||||
|  * @file smsdk_config.h | ||||
|  * @brief Contains macros for configuring basic extension information. | ||||
|  */ | ||||
| 
 | ||||
| /* Basic information exposed publicly */ | ||||
| #define SMEXT_CONF_NAME			"RevEmuAPI" | ||||
| #define SMEXT_CONF_DESCRIPTION	"Simple extention to reveal RevEmu information to sourcemod" | ||||
| #define SMEXT_CONF_VERSION		"1.0.0.0" | ||||
| #define SMEXT_CONF_AUTHOR		"UNLOZE" | ||||
| #define SMEXT_CONF_URL			"" | ||||
| #define SMEXT_CONF_LOGTAG		"RevEmuAPI" | ||||
| #define SMEXT_CONF_LICENSE		"GPL" | ||||
| #define SMEXT_CONF_DATESTRING	__DATE__ | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Exposes plugin's main interface. | ||||
|  */ | ||||
| #define SMEXT_LINK(name) SDKExtension *g_pExtensionIface = name; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Sets whether or not this plugin required Metamod. | ||||
|  * NOTE: Uncomment to enable, comment to disable. | ||||
|  */ | ||||
| //#define SMEXT_CONF_METAMOD
 | ||||
| 
 | ||||
| /** Enable interfaces you want to use here by uncommenting lines */ | ||||
| //#define SMEXT_ENABLE_FORWARDSYS
 | ||||
| //#define SMEXT_ENABLE_HANDLESYS
 | ||||
| #define SMEXT_ENABLE_PLAYERHELPERS | ||||
| //#define SMEXT_ENABLE_DBMANAGER
 | ||||
| //#define SMEXT_ENABLE_GAMECONF
 | ||||
| //#define SMEXT_ENABLE_MEMUTILS
 | ||||
| //#define SMEXT_ENABLE_GAMEHELPERS
 | ||||
| //#define SMEXT_ENABLE_TIMERSYS
 | ||||
| //#define SMEXT_ENABLE_THREADER
 | ||||
| #define SMEXT_ENABLE_LIBSYS | ||||
| //#define SMEXT_ENABLE_MENUS
 | ||||
| //#define SMEXT_ENABLE_ADTFACTORY
 | ||||
| //#define SMEXT_ENABLE_PLUGINSYS
 | ||||
| //#define SMEXT_ENABLE_ADMINSYS
 | ||||
| //#define SMEXT_ENABLE_TEXTPARSERS
 | ||||
| //#define SMEXT_ENABLE_USERMSGS
 | ||||
| //#define SMEXT_ENABLE_TRANSLATOR
 | ||||
| //#define SMEXT_ENABLE_ROOTCONSOLEMENU
 | ||||
| 
 | ||||
| #endif // _INCLUDE_SOURCEMOD_EXTENSION_CONFIG_H_
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user