diff --git a/.gitignore b/.gitignore
index b8bd026..24a1b10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,28 +1,10 @@
-# Compiled Object files
-*.slo
-*.lo
-*.o
-*.obj
-
-# Precompiled Headers
-*.gch
-*.pch
-
-# Compiled Dynamic libraries
-*.so
-*.dylib
-*.dll
-
-# Fortran module files
-*.mod
-
-# Compiled Static libraries
-*.lai
-*.la
-*.a
-*.lib
-
-# Executables
-*.exe
-*.out
-*.app
+**/bin
+**/msvc/Debug
+**/msvc/Release
+**/msvc/*.sdf
+**/msvc/*.opensdf
+**/msvc/*.user
+**/msvc/*.suo
+**/msvc/*.aps
+**/msvc/ipch
+**/PublishPath.txt
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..13fb481
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,41 @@
+SOURCE_DIR = src/
+CPP = /opt/intel/bin/icpc
+
+BINARY = roundendblock_mm_i386.so
+BUILD_OBJ_DIR=Release/obj
+
+OBJECTS = $(SOURCE_DIR)main.cpp $(SOURCE_DIR)memory.cpp $(SOURCE_DIR)meta_api.cpp $(SOURCE_DIR)h_export.cpp
+
+CFLAGS = -mia32 -O3 -static-intel -fasm-blocks -no-intel-extensions\
+ -falign-functions=2 -funroll-loops -fno-rtti -fno-exceptions\
+ -fno-stack-protector -fno-builtin -shared -static-libgcc\
+ -Wno-unknown-pragmas -s -g0 -fvisibility=hidden -fvisibility-inlines-hidden\
+ -DNDEBUG
+
+LDFLAGS = -lm -ldl -lstdc++ -std=c++0x
+INCLUDE = -I$(SOURCE_DIR) -I. -I$(SOURCE_DIR)/sdk
+
+OBJ_LINUX := $(OBJECTS:$(SOURCE_DIR)/%.cpp=$(BUILD_OBJ_DIR)/%.o)
+
+$(BUILD_OBJ_DIR)/%.o : $(SOURCE_DIR)/%.cpp
+ $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $<
+
+default: all
+
+dirs:
+ mkdir -p Release
+ mkdir -p $(BUILD_OBJ_DIR)/src
+
+binary: $(OBJ_LINUX)
+ rm -f Release/*.*
+ $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LDFLAGS) -o Release/$(BINARY)
+
+all: dirs binary
+
+.PHONY: debug clean
+
+debug:
+ $(MAKE) all DEBUG=true
+
+clean:
+ rm -rf ./Release
diff --git a/msvc/PostBuild.bat b/msvc/PostBuild.bat
new file mode 100644
index 0000000..8583878
--- /dev/null
+++ b/msvc/PostBuild.bat
@@ -0,0 +1,39 @@
+@echo OFF
+::
+:: Post-build auto-deploy script
+:: Create and fill PublishPath.txt file with path to deployment folder
+:: I.e. PublishPath.txt should contain one line with a folder path
+:: Call it so:
+:: IF EXIST "$(ProjectDir)PostBuild.bat" (CALL "$(ProjectDir)PostBuild.bat" "$(TargetDir)" "$(TargetName)" "$(TargetExt)" "$(ProjectDir)")
+::
+
+SET targetDir=%~1
+SET targetName=%~2
+SET targetExt=%~3
+SET projectDir=%~4
+SET destination=
+
+IF NOT EXIST "%projectDir%\PublishPath.txt" (
+ ECHO No deployment path specified. Create PublishPath.txt near PostBuild.bat with paths on separate lines for auto deployment.
+ exit /B 0
+)
+
+FOR /f "tokens=* delims= usebackq" %%a IN ("%projectDir%\PublishPath.txt") DO (
+ ECHO Deploying to: %%a
+ IF NOT "%%a" == "" (
+ copy /Y "%targetDir%%targetName%%targetExt%" "%%a"
+ IF NOT ERRORLEVEL 1 (
+ IF EXIST "%targetDir%%targetName%.pdb" (
+ copy /Y "%targetDir%%targetName%.pdb" "%%a"
+ )
+ ) ELSE (
+ ECHO PostBuild.bat ^(27^) : warning : Can't copy '%targetName%%targetExt%' to deploy path '%%a'
+ )
+ )
+)
+
+IF "%%a" == "" (
+ ECHO No deployment path specified.
+)
+
+exit /B 0
\ No newline at end of file
diff --git a/msvc/roundendblock.def b/msvc/roundendblock.def
new file mode 100644
index 0000000..2996267
--- /dev/null
+++ b/msvc/roundendblock.def
@@ -0,0 +1,5 @@
+LIBRARY roundendblock_mm
+EXPORTS
+ GiveFnptrsToDll @1
+SECTIONS
+ .data READ WRITE
diff --git a/msvc/roundendblock.sln b/msvc/roundendblock.sln
new file mode 100644
index 0000000..a03ddf4
--- /dev/null
+++ b/msvc/roundendblock.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.21005.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "roundendblock", "roundendblock.vcxproj", "{9A72E8DC-7667-46C1-899D-1E8B939564D2}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Debug|Win32.Build.0 = Debug|Win32
+ {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Release|Win32.ActiveCfg = Release|Win32
+ {9A72E8DC-7667-46C1-899D-1E8B939564D2}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/msvc/roundendblock.vcxproj b/msvc/roundendblock.vcxproj
new file mode 100644
index 0000000..8b7ab04
--- /dev/null
+++ b/msvc/roundendblock.vcxproj
@@ -0,0 +1,169 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+
+ {9A72E8DC-7667-46C1-899D-1E8B939564D2}
+ Win32Proj
+ roundendblock
+
+
+
+ DynamicLibrary
+ true
+ v120_xp
+ MultiByte
+
+
+ DynamicLibrary
+ false
+ v120_xp
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ roundendblock_mm
+ true
+
+
+ false
+ roundendblock_mm
+ true
+
+
+
+ Use
+ Level3
+ Disabled
+ _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ $(SolutionDir)../src/;$(SolutionDir)../src/sdk;%(AdditionalIncludeDirectories)
+ precompiled.h
+ MultiThreadedDebug
+
+
+ Windows
+ true
+ psapi.lib;%(AdditionalDependencies)
+ roundendblock.def
+
+
+ IF EXIST "$(ProjectDir)PostBuild.bat" (CALL "$(ProjectDir)PostBuild.bat" "$(TargetDir)" "$(TargetName)" "$(TargetExt)" "$(ProjectDir)")
+REM IF EXIST "$(SolutionDir)obfuscate\$(Configuration)\obfuscate.exe" (CALL "$(SolutionDir)obfuscate\$(Configuration)\obfuscate.exe" "$(SolutionPath)" "cleanup")
+
+
+ Automatic deployment script
+
+
+ IF EXIST "$(ProjectDir)PreBuild.bat" (CALL "$(ProjectDir)PreBuild.bat" "$(ProjectDir)..\version\" "$(ProjectDir)..\")
+REM IF EXIST "$(SolutionDir)obfuscate\$(Configuration)\obfuscate.exe" (CALL "$(SolutionDir)obfuscate\$(Configuration)\obfuscate.exe" "$(SolutionPath)")
+ Setup version from Git revision
+
+
+ echo Empty Action
+ Force build to run Pre-Build event
+ subversion.always.run
+ subversion.always.run
+
+
+
+
+ Level3
+ Use
+ Full
+ true
+ true
+ _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ $(SolutionDir)../src/;$(SolutionDir)../src/sdk;%(AdditionalIncludeDirectories)
+ precompiled.h
+ MultiThreaded
+ AnySuitable
+ Speed
+ true
+ true
+ false
+ false
+ NotSet
+
+
+ None
+
+
+ Windows
+ false
+ true
+ true
+ psapi.lib;%(AdditionalDependencies)
+ roundendblock.def
+ $(OutDir)$(TargetName).pdb
+ $(OutDir)$(TargetName).lib
+ $(OutDir)$(TargetName)$(TargetExt)
+ $(IntDir)$(TargetName)$(TargetExt).intermediate.manifest
+ false
+
+
+ IF EXIST "$(ProjectDir)PostBuild.bat" (CALL "$(ProjectDir)PostBuild.bat" "$(TargetDir)" "$(TargetName)" "$(TargetExt)" "$(ProjectDir)")
+ Automatic deployment script
+
+
+ echo Empty Action
+
+
+ Force build to run Pre-Build event
+
+
+ subversion.always.run
+
+
+ subversion.always.run
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msvc/roundendblock.vcxproj.filters b/msvc/roundendblock.vcxproj.filters
new file mode 100644
index 0000000..f9c8a74
--- /dev/null
+++ b/msvc/roundendblock.vcxproj.filters
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+ {5c871c67-4e9c-4a4b-a300-78c5a1c7df95}
+
+
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+ sdk
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/h_export.cpp b/src/h_export.cpp
new file mode 100644
index 0000000..5c9ca56
--- /dev/null
+++ b/src/h_export.cpp
@@ -0,0 +1,40 @@
+// From SDK dlls/h_export.cpp:
+
+/***
+*
+* Copyright (c) 1999, 2000 Valve LLC. All rights reserved.
+*
+* This product contains software technology licensed from Id
+* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
+* All Rights Reserved.
+*
+* Use, distribution, and modification of this source code and/or resulting
+* object code is restricted to non-commercial enhancements to products from
+* Valve LLC. All other use, distribution, or modification is prohibited
+* without written permission from Valve LLC.
+*
+****/
+/*
+
+===== h_export.cpp ========================================================
+
+ Entity classes exported by Halflife.
+
+*/
+
+#include "precompiled.h"
+
+// From SDK dlls/h_export.cpp:
+
+//! Holds engine functionality callbacks
+enginefuncs_t g_engfuncs;
+globalvars_t *gpGlobals;
+
+// Receive engine function table from engine.
+// This appears to be the _first_ DLL routine called by the engine, so we
+// do some setup operations here.
+C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals)
+{
+ memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
+ gpGlobals = pGlobals;
+}
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..578f69f
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,81 @@
+#include "precompiled.h"
+
+extern mutil_funcs_t *gpMetaUtilFuncs;
+
+int OnMetaAttach(void)
+{
+ lib_t g_dllGameMod;
+
+ char *addr;
+ char patch[] = { '\x8B', '\x01', '\xC3' };
+
+ lib_load_info((void *)gpGamedllFuncs->dllapi_table->pfnSpawn, &g_dllGameMod);
+
+#ifdef _WIN32
+ const char pattern1[] = "\x83\x2A\x2A\x53\x55\x8B\x2A\x56\x33\x2A\x57\x8A";
+ const char pattern2[] = "\xE8\x2A\x2A\x2A\x2A\x8A\x2A\x2A\x83\x2A\x2A\x3C";
+
+ addr = lib_find_pattern(&g_dllGameMod, pattern1, sizeof(pattern1) - 1);
+#else
+ addr = lib_find_symbol(&g_dllGameMod, "CheckWinConditions__18CHalfLifeMultiplay");
+
+ if (!addr)
+ {
+ addr = lib_find_symbol(&g_dllGameMod, "_ZN18CHalfLifeMultiplay18CheckWinConditionsEv");
+ }
+#endif // _WIN32
+
+ if (!addr)
+ {
+ gpMetaUtilFuncs->pfnLogError(PLID, "can't find \"CheckWinConditions\"");
+ return 0;
+ }
+
+ if (!mem_patch(addr, '\xC3', 0))
+ {
+ return 0;
+ }
+
+#ifdef _WIN32
+ addr = lib_find_pattern(&g_dllGameMod, pattern2, sizeof(pattern2) - 1);
+#else
+ addr = lib_find_symbol(&g_dllGameMod, "HasRoundTimeExpired__18CHalfLifeMultiplay");
+
+ if(!addr)
+ {
+ addr = lib_find_symbol(&g_dllGameMod, "_ZN18CHalfLifeMultiplay19HasRoundTimeExpiredEv");
+ }
+#endif // _WIN32
+
+ if(!addr)
+ {
+ gpMetaUtilFuncs->pfnLogError(PLID, "can't find \"HasRoundTimeExpired\"");
+ return 0;
+ }
+
+#ifdef _WIN32
+ addr += 11;
+
+ if (!mem_patch(addr, '\x02', 1))
+ {
+ return 0;
+ }
+#else
+ if (*addr == '\x53')
+ {
+ if (!mem_patch(addr, '\xC3', 0))
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ if (!mem_memcpy(addr, patch, sizeof(patch)))
+ {
+ return 0;
+ }
+ }
+#endif // _WIN32
+
+ return 1;
+}
diff --git a/src/memory.cpp b/src/memory.cpp
new file mode 100644
index 0000000..c900ba9
--- /dev/null
+++ b/src/memory.cpp
@@ -0,0 +1,151 @@
+#include "precompiled.h"
+
+#ifdef _MSC_VER
+#pragma comment(lib, "psapi.lib")
+#endif // _MSC_VER
+
+#ifdef _WIN32
+bool lib_load_info(void *addr, lib_t *lib)
+{
+ MEMORY_BASIC_INFORMATION mem;
+ VirtualQuery(addr, &mem, sizeof(mem));
+
+ IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER*)mem.AllocationBase;
+ IMAGE_NT_HEADERS *pe = (IMAGE_NT_HEADERS*)((dword)dos + (dword)dos->e_lfanew);
+
+ if(pe->Signature != IMAGE_NT_SIGNATURE)
+ return false;
+
+ lib->base = (char *)mem.AllocationBase;
+ lib->size = (size_t)pe->OptionalHeader.SizeOfImage;
+ lib->handle = lib->base;
+
+ return true;
+}
+
+static inline bool mem_compare_c(const char *addr,const char *pattern,const char *pattern_end)
+{
+ const char *c;
+ for(c = pattern; c < pattern_end; ++c, ++addr)
+ {
+ if(*c == *addr || *c == '\x2A')
+ continue;
+
+ return false;
+ }
+
+ return true;
+}
+
+static char *mem_find_pattern(char *pos,int range,const char *pattern,int len)
+{
+ char *end;
+ const char *pattern_end;
+
+ pattern_end = pattern + len;
+
+ for(end = pos + range - len; pos < end; ++pos)
+ {
+ if(mem_compare_c(pos,pattern,pattern_end))
+ return pos;
+ }
+
+ return NULL;
+}
+
+char *lib_find_pattern(lib_t *lib, const char *pattern, int len)
+{
+ return mem_find_pattern(lib->base, lib->size, pattern, len);
+}
+
+#else // _WIN32
+
+char *lib_find_symbol(lib_t *lib, const char *symbol)
+{
+ return (char *)dlsym(lib->handle, symbol);
+}
+
+static ElfW(Addr) dlsize(void *base)
+{
+ int i;
+ ElfW(Ehdr) *ehdr;
+ ElfW(Phdr) *phdr;
+ ElfW(Addr) end;
+
+ ehdr = (ElfW(Ehdr)*)base;
+ phdr = (ElfW(Phdr)*)((ElfW(Addr))ehdr + ehdr->e_phoff);
+
+ for(i = 0; i < ehdr->e_phnum; ++i)
+ {
+ if(phdr[i].p_type == PT_LOAD)
+ end = phdr[i].p_vaddr + phdr[i].p_memsz;
+ }
+
+ return end;
+}
+
+bool lib_load_info(void *addr, lib_t *lib)
+{
+ Dl_info info;
+ if((!dladdr(addr, &info) && !info.dli_fbase) || !info.dli_fname)
+ return false;
+
+ lib->base = (char *)info.dli_fbase;
+ lib->size = (size_t)dlsize(info.dli_fbase);
+ lib->handle = (char *)dlopen(info.dli_fname, RTLD_NOW);
+
+ return true;
+}
+
+bool mem_memcpy(char *addr, const char *patch, int len)
+{
+ size_t size = sysconf(_SC_PAGESIZE);
+ void *alignedAddress = Align(addr);
+
+ if(Align(addr + len - 1) != alignedAddress)
+ size *= 2;
+
+ if(!mprotect(alignedAddress, size, (PROT_READ | PROT_WRITE | PROT_EXEC)))
+ {
+ memcpy(addr, patch, len);
+ return !mprotect(alignedAddress, size, (PROT_READ | PROT_EXEC));
+ }
+
+ return false;
+}
+
+#endif // _WIN32
+
+bool mem_patch(char *addr, unsigned char patch, int pos_byte, int len)
+{
+#ifdef _WIN32
+ static HANDLE process = 0;
+
+ DWORD OldProtection = 0;
+ DWORD NewProtection = PAGE_EXECUTE_READWRITE;
+
+ if(!process)
+ process = GetCurrentProcess();
+
+ FlushInstructionCache(process, addr, len);
+ if(VirtualProtect(addr, len, NewProtection, &OldProtection))
+ {
+ *(addr + pos_byte) = patch;
+ return VirtualProtect(addr, len, OldProtection, &NewProtection) != FALSE;
+ }
+#else
+ size_t size = sysconf(_SC_PAGESIZE);
+ void *alignedAddress = Align(addr);
+
+ if(Align(addr) != alignedAddress)
+ size *= 2;
+
+ if(!mprotect(alignedAddress, size, (PROT_READ | PROT_WRITE | PROT_EXEC)))
+ {
+ *(addr + pos_byte) = patch;
+ return !mprotect(alignedAddress, size, (PROT_READ | PROT_EXEC));
+ }
+#endif // _WIN32
+
+ return false;
+}
diff --git a/src/memory.h b/src/memory.h
new file mode 100644
index 0000000..1c8733c
--- /dev/null
+++ b/src/memory.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#ifdef _WIN32
+ #include
+ #include
+
+ #define PSAPI_VERSION 1
+#else
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+
+ #define Align(addr) ((void *)(((long)addr) & ~(sysconf(_SC_PAGESIZE) - 1)))
+#endif // _WIN32
+
+struct lib_t
+{
+ char *base;
+ char *handle;
+ size_t size;
+};
+
+#ifdef _WIN32
+ char *lib_find_pattern(lib_t *lib, const char *pattern, int len);
+#else
+ char *lib_find_symbol(lib_t *lib, const char *symbol);
+ bool mem_memcpy(char *addr, const char *patch, int len);
+#endif // _WIN32
+
+bool lib_load_info(void *addr, lib_t *lib);
+
+bool mem_patch(char *addr, unsigned char patch, int pos_byte, int len = 1);
diff --git a/src/meta_api.cpp b/src/meta_api.cpp
new file mode 100644
index 0000000..fc1c372
--- /dev/null
+++ b/src/meta_api.cpp
@@ -0,0 +1,120 @@
+// meta_api.cpp - minimal implementation of metamod's plugin interface
+
+// This is intended to illustrate the (more or less) bare minimum code
+// required for a valid metamod plugin, and is targeted at those who want
+// to port existing HL/SDK DLL code to run as a metamod plugin.
+
+/*
+ * Copyright (c) 2001-2003 Will Day
+ *
+ * This file is part of Metamod.
+ *
+ * Metamod is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * Metamod 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 Metamod; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * In addition, as a special exception, the author gives permission to
+ * link the code of this program with the Half-Life Game Engine ("HL
+ * Engine") and Modified Game Libraries ("MODs") developed by Valve,
+ * L.L.C ("Valve"). You must obey the GNU General Public License in all
+ * respects for all of the code used other than the HL Engine and MODs
+ * from Valve. If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version.
+ *
+ */
+
+#include "precompiled.h"
+
+// Must provide at least one of these..
+static META_FUNCTIONS gMetaFunctionTable =
+{
+ NULL, // pfnGetEntityAPI HL SDK; called before game DLL
+ NULL, // pfnGetEntityAPI_Post META; called after game DLL
+ NULL, // pfnGetEntityAPI2 HL SDK2; called before game DLL
+ NULL, // pfnGetEntityAPI2_Post META; called after game DLL
+ NULL, // pfnGetNewDLLFunctions HL SDK2; called before game DLL
+ NULL, // pfnGetNewDLLFunctions_Post META; called after game DLL
+ NULL, // pfnGetEngineFunctions META; called before HL engine
+ NULL, // pfnGetEngineFunctions_Post META; called after HL engine
+};
+
+// Description of plugin
+plugin_info_t Plugin_info =
+{
+ META_INTERFACE_VERSION, // ifvers
+ "RoundEndBlock", // name
+ "1.2", // version
+ __DATE__, // date
+ "s1lent", // author
+ "http://www.aghl.ru/", // url
+ "RoundEndBlock", // logtag, all caps please
+ PT_STARTUP, // (when) loadable
+ PT_NEVER, // (when) unloadable
+};
+
+// Global vars from metamod:
+meta_globals_t *gpMetaGlobals; // metamod globals
+gamedll_funcs_t *gpGamedllFuncs; // gameDLL function tables
+mutil_funcs_t *gpMetaUtilFuncs; // metamod utility functions
+
+// Metamod requesting info about this plugin:
+// ifvers (given) interface_version metamod is using
+// pPlugInfo (requested) struct with info about plugin
+// pMetaUtilFuncs (given) table of utility functions provided by metamod
+C_DLLEXPORT int Meta_Query(char * /*ifvers */, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs)
+{
+ // Give metamod our plugin_info struct
+ *pPlugInfo = &Plugin_info;
+ // Get metamod utility function table.
+ gpMetaUtilFuncs = pMetaUtilFuncs;
+ return(TRUE);
+}
+
+extern int OnMetaAttach(void);
+
+// Metamod attaching plugin to the server.
+// now (given) current phase, ie during map, during changelevel, or at startup
+// pFunctionTable (requested) table of function tables this plugin catches
+// pMGlobals (given) global vars from metamod
+// pGamedllFuncs (given) copy of function tables from game dll
+C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME /* now */, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs)
+{
+ if (!pMGlobals)
+ {
+ LOG_ERROR(PLID, "Meta_Attach called with null pMGlobals");
+ return FALSE;
+ }
+
+ gpMetaGlobals = pMGlobals;
+
+ if (!pFunctionTable)
+ {
+ LOG_ERROR(PLID, "Meta_Attach called with null pFunctionTable");
+ return FALSE;
+ }
+
+ memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS));
+ gpGamedllFuncs = pGamedllFuncs;
+
+ return OnMetaAttach();
+}
+
+// Metamod detaching plugin from the server.
+// now (given) current phase, ie during map, etc
+// reason (given) why detaching (refresh, console unload, forced unload, etc)
+C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME /* now */, PL_UNLOAD_REASON /* reason */)
+{
+ return(TRUE);
+}
diff --git a/src/precompiled.cpp b/src/precompiled.cpp
new file mode 100644
index 0000000..5f656a4
--- /dev/null
+++ b/src/precompiled.cpp
@@ -0,0 +1 @@
+#include "precompiled.h"
diff --git a/src/precompiled.h b/src/precompiled.h
new file mode 100644
index 0000000..2cb269c
--- /dev/null
+++ b/src/precompiled.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include
+
+#include
+#include
+
+#include "memory.h"
+
+#ifndef _WIN32
+
+#define TRUE 1
+#define FALSE 0
+
+#endif // _WIN32
+
+#undef DLLEXPORT
+
+#ifdef _WIN32
+ #define DLLEXPORT __declspec(dllexport)
+#else
+ #define DLLEXPORT __attribute__((visibility("default")))
+ #define WINAPI /* */
+#endif // _WIN32
+
+#define C_DLLEXPORT extern "C" DLLEXPORT
diff --git a/src/sdk/Sequence.h b/src/sdk/Sequence.h
new file mode 100644
index 0000000..8df553d
--- /dev/null
+++ b/src/sdk/Sequence.h
@@ -0,0 +1,201 @@
+//---------------------------------------------------------------------------
+//
+// S c r i p t e d S e q u e n c e s
+//
+//---------------------------------------------------------------------------
+#ifndef _INCLUDE_SEQUENCE_H_
+#define _INCLUDE_SEQUENCE_H_
+
+
+#ifndef _DEF_BYTE_
+typedef unsigned char byte;
+#endif
+
+//---------------------------------------------------------------------------
+// client_textmessage_t
+//---------------------------------------------------------------------------
+typedef struct client_textmessage_s
+{
+ int effect;
+ byte r1, g1, b1, a1; // 2 colors for effects
+ byte r2, g2, b2, a2;
+ float x;
+ float y;
+ float fadein;
+ float fadeout;
+ float holdtime;
+ float fxtime;
+ const char *pName;
+ const char *pMessage;
+} client_textmessage_t;
+
+
+//--------------------------------------------------------------------------
+// sequenceDefaultBits_e
+//
+// Enumerated list of possible modifiers for a command. This enumeration
+// is used in a bitarray controlling what modifiers are specified for a command.
+//---------------------------------------------------------------------------
+enum sequenceModifierBits
+{
+ SEQUENCE_MODIFIER_EFFECT_BIT = (1 << 1),
+ SEQUENCE_MODIFIER_POSITION_BIT = (1 << 2),
+ SEQUENCE_MODIFIER_COLOR_BIT = (1 << 3),
+ SEQUENCE_MODIFIER_COLOR2_BIT = (1 << 4),
+ SEQUENCE_MODIFIER_FADEIN_BIT = (1 << 5),
+ SEQUENCE_MODIFIER_FADEOUT_BIT = (1 << 6),
+ SEQUENCE_MODIFIER_HOLDTIME_BIT = (1 << 7),
+ SEQUENCE_MODIFIER_FXTIME_BIT = (1 << 8),
+ SEQUENCE_MODIFIER_SPEAKER_BIT = (1 << 9),
+ SEQUENCE_MODIFIER_LISTENER_BIT = (1 << 10),
+ SEQUENCE_MODIFIER_TEXTCHANNEL_BIT = (1 << 11),
+};
+typedef enum sequenceModifierBits sequenceModifierBits_e ;
+
+
+//---------------------------------------------------------------------------
+// sequenceCommandEnum_e
+//
+// Enumerated sequence command types.
+//---------------------------------------------------------------------------
+enum sequenceCommandEnum_
+{
+ SEQUENCE_COMMAND_ERROR = -1,
+ SEQUENCE_COMMAND_PAUSE = 0,
+ SEQUENCE_COMMAND_FIRETARGETS,
+ SEQUENCE_COMMAND_KILLTARGETS,
+ SEQUENCE_COMMAND_TEXT,
+ SEQUENCE_COMMAND_SOUND,
+ SEQUENCE_COMMAND_GOSUB,
+ SEQUENCE_COMMAND_SENTENCE,
+ SEQUENCE_COMMAND_REPEAT,
+ SEQUENCE_COMMAND_SETDEFAULTS,
+ SEQUENCE_COMMAND_MODIFIER,
+ SEQUENCE_COMMAND_POSTMODIFIER,
+ SEQUENCE_COMMAND_NOOP,
+
+ SEQUENCE_MODIFIER_EFFECT,
+ SEQUENCE_MODIFIER_POSITION,
+ SEQUENCE_MODIFIER_COLOR,
+ SEQUENCE_MODIFIER_COLOR2,
+ SEQUENCE_MODIFIER_FADEIN,
+ SEQUENCE_MODIFIER_FADEOUT,
+ SEQUENCE_MODIFIER_HOLDTIME,
+ SEQUENCE_MODIFIER_FXTIME,
+ SEQUENCE_MODIFIER_SPEAKER,
+ SEQUENCE_MODIFIER_LISTENER,
+ SEQUENCE_MODIFIER_TEXTCHANNEL,
+};
+typedef enum sequenceCommandEnum_ sequenceCommandEnum_e;
+
+
+//---------------------------------------------------------------------------
+// sequenceCommandType_e
+//
+// Typeerated sequence command types.
+//---------------------------------------------------------------------------
+enum sequenceCommandType_
+{
+ SEQUENCE_TYPE_COMMAND,
+ SEQUENCE_TYPE_MODIFIER,
+};
+typedef enum sequenceCommandType_ sequenceCommandType_e;
+
+
+//---------------------------------------------------------------------------
+// sequenceCommandMapping_s
+//
+// A mapping of a command enumerated-value to its name.
+//---------------------------------------------------------------------------
+typedef struct sequenceCommandMapping_ sequenceCommandMapping_s;
+struct sequenceCommandMapping_
+{
+ sequenceCommandEnum_e commandEnum;
+ const char* commandName;
+ sequenceCommandType_e commandType;
+};
+
+
+//---------------------------------------------------------------------------
+// sequenceCommandLine_s
+//
+// Structure representing a single command (usually 1 line) from a
+// .SEQ file entry.
+//---------------------------------------------------------------------------
+typedef struct sequenceCommandLine_ sequenceCommandLine_s;
+struct sequenceCommandLine_
+{
+ int commandType; // Specifies the type of command
+ client_textmessage_t clientMessage; // Text HUD message struct
+ char* speakerName; // Targetname of speaking entity
+ char* listenerName; // Targetname of entity being spoken to
+ char* soundFileName; // Name of sound file to play
+ char* sentenceName; // Name of sentences.txt to play
+ char* fireTargetNames; // List of targetnames to fire
+ char* killTargetNames; // List of targetnames to remove
+ float delay; // Seconds 'till next command
+ int repeatCount; // If nonzero, reset execution pointer to top of block (N times, -1 = infinite)
+ int textChannel; // Display channel on which text message is sent
+ int modifierBitField; // Bit field to specify what clientmessage fields are valid
+ sequenceCommandLine_s* nextCommandLine; // Next command (linked list)
+};
+
+
+//---------------------------------------------------------------------------
+// sequenceEntry_s
+//
+// Structure representing a single command (usually 1 line) from a
+// .SEQ file entry.
+//---------------------------------------------------------------------------
+typedef struct sequenceEntry_ sequenceEntry_s;
+struct sequenceEntry_
+{
+ char* fileName; // Name of sequence file without .SEQ extension
+ char* entryName; // Name of entry label in file
+ sequenceCommandLine_s* firstCommand; // Linked list of commands in entry
+ sequenceEntry_s* nextEntry; // Next loaded entry
+ qboolean isGlobal; // Is entry retained over level transitions?
+};
+
+
+
+//---------------------------------------------------------------------------
+// sentenceEntry_s
+// Structure representing a single sentence of a group from a .SEQ
+// file entry. Sentences are identical to entries in sentences.txt, but
+// can be unique per level and are loaded/unloaded with the level.
+//---------------------------------------------------------------------------
+typedef struct sentenceEntry_ sentenceEntry_s;
+struct sentenceEntry_
+{
+ char* data; // sentence data (ie "We have hostiles" )
+ sentenceEntry_s* nextEntry; // Next loaded entry
+ qboolean isGlobal; // Is entry retained over level transitions?
+ unsigned int index; // this entry's position in the file.
+};
+
+//--------------------------------------------------------------------------
+// sentenceGroupEntry_s
+// Structure representing a group of sentences found in a .SEQ file.
+// A sentence group is defined by all sentences with the same name, ignoring
+// the number at the end of the sentence name. Groups enable a sentence
+// to be picked at random across a group.
+//--------------------------------------------------------------------------
+typedef struct sentenceGroupEntry_ sentenceGroupEntry_s;
+struct sentenceGroupEntry_
+{
+ char* groupName; // name of the group (ie CT_ALERT )
+ unsigned int numSentences; // number of sentences in group
+ sentenceEntry_s* firstSentence; // head of linked list of sentences in group
+ sentenceGroupEntry_s* nextEntry; // next loaded group
+};
+
+//---------------------------------------------------------------------------
+// Function declarations
+//---------------------------------------------------------------------------
+sequenceEntry_s* SequenceGet( const char* fileName, const char* entryName );
+void Sequence_ParseFile( const char* fileName, qboolean isGlobal );
+void Sequence_OnLevelLoad( const char* mapName );
+sentenceEntry_s* SequencePickSentence( const char *groupName, int pickMethod, int *picked );
+
+#endif // _INCLUDE_SEQUENCE_H_
diff --git a/src/sdk/const.h b/src/sdk/const.h
new file mode 100644
index 0000000..9b3d25d
--- /dev/null
+++ b/src/sdk/const.h
@@ -0,0 +1,796 @@
+/***
+*
+* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
+*
+* This product contains software technology licensed from Id
+* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
+* All Rights Reserved.
+*
+* Use, distribution, and modification of this source code and/or resulting
+* object code is restricted to non-commercial enhancements to products from
+* Valve LLC. All other use, distribution, or modification is prohibited
+* without written permission from Valve LLC.
+*
+****/
+#ifndef CONST_H
+#define CONST_H
+//
+// Constants shared by the engine and dlls
+// This header file included by engine files and DLL files.
+// Most came from server.h
+
+// edict->flags
+#define FL_FLY (1<<0) // Changes the SV_Movestep() behavior to not need to be on ground
+#define FL_SWIM (1<<1) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)
+#define FL_CONVEYOR (1<<2)
+#define FL_CLIENT (1<<3)
+#define FL_INWATER (1<<4)
+#define FL_MONSTER (1<<5)
+#define FL_GODMODE (1<<6)
+#define FL_NOTARGET (1<<7)
+#define FL_SKIPLOCALHOST (1<<8) // Don't send entity to local host, it's predicting this entity itself
+#define FL_ONGROUND (1<<9) // At rest / on the ground
+#define FL_PARTIALGROUND (1<<10) // not all corners are valid
+#define FL_WATERJUMP (1<<11) // player jumping out of water
+#define FL_FROZEN (1<<12) // Player is frozen for 3rd person camera
+#define FL_FAKECLIENT (1<<13) // JAC: fake client, simulated server side; don't send network messages to them
+#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched
+#define FL_FLOAT (1<<15) // Apply floating force to this entity when in water
+#define FL_GRAPHED (1<<16) // worldgraph has this ent listed as something that blocks a connection
+
+// UNDONE: Do we need these?
+#define FL_IMMUNE_WATER (1<<17)
+#define FL_IMMUNE_SLIME (1<<18)
+#define FL_IMMUNE_LAVA (1<<19)
+
+#define FL_PROXY (1<<20) // This is a spectator proxy
+#define FL_ALWAYSTHINK (1<<21) // Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path)
+#define FL_BASEVELOCITY (1<<22) // Base velocity has been applied this frame (used to convert base velocity into momentum)
+#define FL_MONSTERCLIP (1<<23) // Only collide in with monsters who have FL_MONSTERCLIP set
+#define FL_ONTRAIN (1<<24) // Player is _controlling_ a train, so movement commands should be ignored on client during prediction.
+#define FL_WORLDBRUSH (1<<25) // Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something)
+#define FL_SPECTATOR (1<<26) // This client is a spectator, don't run touch functions, etc.
+#define FL_CUSTOMENTITY (1<<29) // This is a custom entity
+#define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time
+#define FL_DORMANT (1<<31) // Entity is dormant, no updates to client
+
+
+// Goes into globalvars_t.trace_flags
+#define FTRACE_SIMPLEBOX (1<<0) // Traceline with a simple box
+
+
+// walkmove modes
+#define WALKMOVE_NORMAL 0 // normal walkmove
+#define WALKMOVE_WORLDONLY 1 // doesn't hit ANY entities, no matter what the solid type
+#define WALKMOVE_CHECKONLY 2 // move, but don't touch triggers
+
+// edict->movetype values
+#define MOVETYPE_NONE 0 // never moves
+//#define MOVETYPE_ANGLENOCLIP 1
+//#define MOVETYPE_ANGLECLIP 2
+#define MOVETYPE_WALK 3 // Player only - moving on the ground
+#define MOVETYPE_STEP 4 // gravity, special edge handling -- monsters use this
+#define MOVETYPE_FLY 5 // No gravity, but still collides with stuff
+#define MOVETYPE_TOSS 6 // gravity/collisions
+#define MOVETYPE_PUSH 7 // no clip to world, push and crush
+#define MOVETYPE_NOCLIP 8 // No gravity, no collisions, still do velocity/avelocity
+#define MOVETYPE_FLYMISSILE 9 // extra size to monsters
+#define MOVETYPE_BOUNCE 10 // Just like Toss, but reflect velocity when contacting surfaces
+#define MOVETYPE_BOUNCEMISSILE 11 // bounce w/o gravity
+#define MOVETYPE_FOLLOW 12 // track movement of aiment
+#define MOVETYPE_PUSHSTEP 13 // BSP model that needs physics/world collisions (uses nearest hull for world collision)
+
+// edict->solid values
+// NOTE: Some movetypes will cause collisions independent of SOLID_NOT/SOLID_TRIGGER when the entity moves
+// SOLID only effects OTHER entities colliding with this one when they move - UGH!
+#define SOLID_NOT 0 // no interaction with other objects
+#define SOLID_TRIGGER 1 // touch on edge, but not blocking
+#define SOLID_BBOX 2 // touch on edge, block
+#define SOLID_SLIDEBOX 3 // touch on edge, but not an onground
+#define SOLID_BSP 4 // bsp clip, touch on edge, block
+
+// edict->deadflag values
+#define DEAD_NO 0 // alive
+#define DEAD_DYING 1 // playing death animation or still falling off of a ledge waiting to hit ground
+#define DEAD_DEAD 2 // dead. lying still.
+#define DEAD_RESPAWNABLE 3
+#define DEAD_DISCARDBODY 4
+
+#define DAMAGE_NO 0
+#define DAMAGE_YES 1
+#define DAMAGE_AIM 2
+
+// entity effects
+#define EF_BRIGHTFIELD 1 // swirling cloud of particles
+#define EF_MUZZLEFLASH 2 // single frame ELIGHT on entity attachment 0
+#define EF_BRIGHTLIGHT 4 // DLIGHT centered at entity origin
+#define EF_DIMLIGHT 8 // player flashlight
+#define EF_INVLIGHT 16 // get lighting from ceiling
+#define EF_NOINTERP 32 // don't interpolate the next frame
+#define EF_LIGHT 64 // rocket flare glow sprite
+#define EF_NODRAW 128 // don't draw entity
+#define EF_NIGHTVISION 256 // player nightvision
+#define EF_SNIPERLASER 512 // sniper laser effect
+#define EF_FIBERCAMERA 1024// fiber camera
+
+
+// entity flags
+#define EFLAG_SLERP 1 // do studio interpolation of this entity
+
+//
+// temp entity events
+//
+#define TE_BEAMPOINTS 0 // beam effect between two points
+// coord coord coord (start position)
+// coord coord coord (end position)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_BEAMENTPOINT 1 // beam effect between point and entity
+// short (start entity)
+// coord coord coord (end position)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_GUNSHOT 2 // particle effect plus ricochet sound
+// coord coord coord (position)
+
+#define TE_EXPLOSION 3 // additive sprite, 2 dynamic lights, flickering particles, explosion sound, move vertically 8 pps
+// coord coord coord (position)
+// short (sprite index)
+// byte (scale in 0.1's)
+// byte (framerate)
+// byte (flags)
+//
+// The Explosion effect has some flags to control performance/aesthetic features:
+#define TE_EXPLFLAG_NONE 0 // all flags clear makes default Half-Life explosion
+#define TE_EXPLFLAG_NOADDITIVE 1 // sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite)
+#define TE_EXPLFLAG_NODLIGHTS 2 // do not render dynamic lights
+#define TE_EXPLFLAG_NOSOUND 4 // do not play client explosion sound
+#define TE_EXPLFLAG_NOPARTICLES 8 // do not draw particles
+
+
+#define TE_TAREXPLOSION 4 // Quake1 "tarbaby" explosion with sound
+// coord coord coord (position)
+
+#define TE_SMOKE 5 // alphablend sprite, move vertically 30 pps
+// coord coord coord (position)
+// short (sprite index)
+// byte (scale in 0.1's)
+// byte (framerate)
+
+#define TE_TRACER 6 // tracer effect from point to point
+// coord, coord, coord (start)
+// coord, coord, coord (end)
+
+#define TE_LIGHTNING 7 // TE_BEAMPOINTS with simplified parameters
+// coord, coord, coord (start)
+// coord, coord, coord (end)
+// byte (life in 0.1's)
+// byte (width in 0.1's)
+// byte (amplitude in 0.01's)
+// short (sprite model index)
+
+#define TE_BEAMENTS 8
+// short (start entity)
+// short (end entity)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_SPARKS 9 // 8 random tracers with gravity, ricochet sprite
+// coord coord coord (position)
+
+#define TE_LAVASPLASH 10 // Quake1 lava splash
+// coord coord coord (position)
+
+#define TE_TELEPORT 11 // Quake1 teleport splash
+// coord coord coord (position)
+
+#define TE_EXPLOSION2 12 // Quake1 colormaped (base palette) particle explosion with sound
+// coord coord coord (position)
+// byte (starting color)
+// byte (num colors)
+
+#define TE_BSPDECAL 13 // Decal from the .BSP file
+// coord, coord, coord (x,y,z), decal position (center of texture in world)
+// short (texture index of precached decal texture name)
+// short (entity index)
+// [optional - only included if previous short is non-zero (not the world)] short (index of model of above entity)
+
+#define TE_IMPLOSION 14 // tracers moving toward a point
+// coord, coord, coord (position)
+// byte (radius)
+// byte (count)
+// byte (life in 0.1's)
+
+#define TE_SPRITETRAIL 15 // line of moving glow sprites with gravity, fadeout, and collisions
+// coord, coord, coord (start)
+// coord, coord, coord (end)
+// short (sprite index)
+// byte (count)
+// byte (life in 0.1's)
+// byte (scale in 0.1's)
+// byte (velocity along vector in 10's)
+// byte (randomness of velocity in 10's)
+
+#define TE_BEAM 16 // obsolete
+
+#define TE_SPRITE 17 // additive sprite, plays 1 cycle
+// coord, coord, coord (position)
+// short (sprite index)
+// byte (scale in 0.1's)
+// byte (brightness)
+
+#define TE_BEAMSPRITE 18 // A beam with a sprite at the end
+// coord, coord, coord (start position)
+// coord, coord, coord (end position)
+// short (beam sprite index)
+// short (end sprite index)
+
+#define TE_BEAMTORUS 19 // screen aligned beam ring, expands to max radius over lifetime
+// coord coord coord (center position)
+// coord coord coord (axis and radius)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_BEAMDISK 20 // disk that expands to max radius over lifetime
+// coord coord coord (center position)
+// coord coord coord (axis and radius)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_BEAMCYLINDER 21 // cylinder that expands to max radius over lifetime
+// coord coord coord (center position)
+// coord coord coord (axis and radius)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_BEAMFOLLOW 22 // create a line of decaying beam segments until entity stops moving
+// short (entity:attachment to follow)
+// short (sprite index)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte,byte,byte (color)
+// byte (brightness)
+
+#define TE_GLOWSPRITE 23
+// coord, coord, coord (pos) short (model index) byte (scale / 10)
+
+#define TE_BEAMRING 24 // connect a beam ring to two entities
+// short (start entity)
+// short (end entity)
+// short (sprite index)
+// byte (starting frame)
+// byte (frame rate in 0.1's)
+// byte (life in 0.1's)
+// byte (line width in 0.1's)
+// byte (noise amplitude in 0.01's)
+// byte,byte,byte (color)
+// byte (brightness)
+// byte (scroll speed in 0.1's)
+
+#define TE_STREAK_SPLASH 25 // oriented shower of tracers
+// coord coord coord (start position)
+// coord coord coord (direction vector)
+// byte (color)
+// short (count)
+// short (base speed)
+// short (ramdon velocity)
+
+#define TE_BEAMHOSE 26 // obsolete
+
+#define TE_DLIGHT 27 // dynamic light, effect world, minor entity effect
+// coord, coord, coord (pos)
+// byte (radius in 10's)
+// byte byte byte (color)
+// byte (brightness)
+// byte (life in 10's)
+// byte (decay rate in 10's)
+
+#define TE_ELIGHT 28 // point entity light, no world effect
+// short (entity:attachment to follow)
+// coord coord coord (initial position)
+// coord (radius)
+// byte byte byte (color)
+// byte (life in 0.1's)
+// coord (decay rate)
+
+#define TE_TEXTMESSAGE 29
+// short 1.2.13 x (-1 = center)
+// short 1.2.13 y (-1 = center)
+// byte Effect 0 = fade in/fade out
+ // 1 is flickery credits
+ // 2 is write out (training room)
+
+// 4 bytes r,g,b,a color1 (text color)
+// 4 bytes r,g,b,a color2 (effect color)
+// ushort 8.8 fadein time
+// ushort 8.8 fadeout time
+// ushort 8.8 hold time
+// optional ushort 8.8 fxtime (time the highlight lags behing the leading text in effect 2)
+// string text message (512 chars max sz string)
+#define TE_LINE 30
+// coord, coord, coord startpos
+// coord, coord, coord endpos
+// short life in 0.1 s
+// 3 bytes r, g, b
+
+#define TE_BOX 31
+// coord, coord, coord boxmins
+// coord, coord, coord boxmaxs
+// short life in 0.1 s
+// 3 bytes r, g, b
+
+#define TE_KILLBEAM 99 // kill all beams attached to entity
+// short (entity)
+
+#define TE_LARGEFUNNEL 100
+// coord coord coord (funnel position)
+// short (sprite index)
+// short (flags)
+
+#define TE_BLOODSTREAM 101 // particle spray
+// coord coord coord (start position)
+// coord coord coord (spray vector)
+// byte (color)
+// byte (speed)
+
+#define TE_SHOWLINE 102 // line of particles every 5 units, dies in 30 seconds
+// coord coord coord (start position)
+// coord coord coord (end position)
+
+#define TE_BLOOD 103 // particle spray
+// coord coord coord (start position)
+// coord coord coord (spray vector)
+// byte (color)
+// byte (speed)
+
+#define TE_DECAL 104 // Decal applied to a brush entity (not the world)
+// coord, coord, coord (x,y,z), decal position (center of texture in world)
+// byte (texture index of precached decal texture name)
+// short (entity index)
+
+#define TE_FIZZ 105 // create alpha sprites inside of entity, float upwards
+// short (entity)
+// short (sprite index)
+// byte (density)
+
+#define TE_MODEL 106 // create a moving model that bounces and makes a sound when it hits
+// coord, coord, coord (position)
+// coord, coord, coord (velocity)
+// angle (initial yaw)
+// short (model index)
+// byte (bounce sound type)
+// byte (life in 0.1's)
+
+#define TE_EXPLODEMODEL 107 // spherical shower of models, picks from set
+// coord, coord, coord (origin)
+// coord (velocity)
+// short (model index)
+// short (count)
+// byte (life in 0.1's)
+
+#define TE_BREAKMODEL 108 // box of models or sprites
+// coord, coord, coord (position)
+// coord, coord, coord (size)
+// coord, coord, coord (velocity)
+// byte (random velocity in 10's)
+// short (sprite or model index)
+// byte (count)
+// byte (life in 0.1 secs)
+// byte (flags)
+
+#define TE_GUNSHOTDECAL 109 // decal and ricochet sound
+// coord, coord, coord (position)
+// short (entity index???)
+// byte (decal???)
+
+#define TE_SPRITE_SPRAY 110 // spay of alpha sprites
+// coord, coord, coord (position)
+// coord, coord, coord (velocity)
+// short (sprite index)
+// byte (count)
+// byte (speed)
+// byte (noise)
+
+#define TE_ARMOR_RICOCHET 111 // quick spark sprite, client ricochet sound.
+// coord, coord, coord (position)
+// byte (scale in 0.1's)
+
+#define TE_PLAYERDECAL 112 // ???
+// byte (playerindex)
+// coord, coord, coord (position)
+// short (entity???)
+// byte (decal number???)
+// [optional] short (model index???)
+
+#define TE_BUBBLES 113 // create alpha sprites inside of box, float upwards
+// coord, coord, coord (min start position)
+// coord, coord, coord (max start position)
+// coord (float height)
+// short (model index)
+// byte (count)
+// coord (speed)
+
+#define TE_BUBBLETRAIL 114 // create alpha sprites along a line, float upwards
+// coord, coord, coord (min start position)
+// coord, coord, coord (max start position)
+// coord (float height)
+// short (model index)
+// byte (count)
+// coord (speed)
+
+#define TE_BLOODSPRITE 115 // spray of opaque sprite1's that fall, single sprite2 for 1..2 secs (this is a high-priority tent)
+// coord, coord, coord (position)
+// short (sprite1 index)
+// short (sprite2 index)
+// byte (color)
+// byte (scale)
+
+#define TE_WORLDDECAL 116 // Decal applied to the world brush
+// coord, coord, coord (x,y,z), decal position (center of texture in world)
+// byte (texture index of precached decal texture name)
+
+#define TE_WORLDDECALHIGH 117 // Decal (with texture index > 256) applied to world brush
+// coord, coord, coord (x,y,z), decal position (center of texture in world)
+// byte (texture index of precached decal texture name - 256)
+
+#define TE_DECALHIGH 118 // Same as TE_DECAL, but the texture index was greater than 256
+// coord, coord, coord (x,y,z), decal position (center of texture in world)
+// byte (texture index of precached decal texture name - 256)
+// short (entity index)
+
+#define TE_PROJECTILE 119 // Makes a projectile (like a nail) (this is a high-priority tent)
+// coord, coord, coord (position)
+// coord, coord, coord (velocity)
+// short (modelindex)
+// byte (life)
+// byte (owner) projectile won't collide with owner (if owner == 0, projectile will hit any client).
+
+#define TE_SPRAY 120 // Throws a shower of sprites or models
+// coord, coord, coord (position)
+// coord, coord, coord (direction)
+// short (modelindex)
+// byte (count)
+// byte (speed)
+// byte (noise)
+// byte (rendermode)
+
+#define TE_PLAYERSPRITES 121 // sprites emit from a player's bounding box (ONLY use for players!)
+// byte (playernum)
+// short (sprite modelindex)
+// byte (count)
+// byte (variance) (0 = no variance in size) (10 = 10% variance in size)
+
+#define TE_PARTICLEBURST 122 // very similar to lavasplash.
+// coord (origin)
+// short (radius)
+// byte (particle color)
+// byte (duration * 10) (will be randomized a bit)
+
+#define TE_FIREFIELD 123 // makes a field of fire.
+// coord (origin)
+// short (radius) (fire is made in a square around origin. -radius, -radius to radius, radius)
+// short (modelindex)
+// byte (count)
+// byte (flags)
+// byte (duration (in seconds) * 10) (will be randomized a bit)
+//
+// to keep network traffic low, this message has associated flags that fit into a byte:
+#define TEFIRE_FLAG_ALLFLOAT 1 // all sprites will drift upwards as they animate
+#define TEFIRE_FLAG_SOMEFLOAT 2 // some of the sprites will drift upwards. (50% chance)
+#define TEFIRE_FLAG_LOOP 4 // if set, sprite plays at 15 fps, otherwise plays at whatever rate stretches the animation over the sprite's duration.
+#define TEFIRE_FLAG_ALPHA 8 // if set, sprite is rendered alpha blended at 50% else, opaque
+#define TEFIRE_FLAG_PLANAR 16 // if set, all fire sprites have same initial Z instead of randomly filling a cube.
+#define TEFIRE_FLAG_ADDITIVE 32 // if set, sprite is rendered non-opaque with additive
+
+#define TE_PLAYERATTACHMENT 124 // attaches a TENT to a player (this is a high-priority tent)
+// byte (entity index of player)
+// coord (vertical offset) ( attachment origin.z = player origin.z + vertical offset )
+// short (model index)
+// short (life * 10 );
+
+#define TE_KILLPLAYERATTACHMENTS 125 // will expire all TENTS attached to a player.
+// byte (entity index of player)
+
+#define TE_MULTIGUNSHOT 126 // much more compact shotgun message
+// This message is used to make a client approximate a 'spray' of gunfire.
+// Any weapon that fires more than one bullet per frame and fires in a bit of a spread is
+// a good candidate for MULTIGUNSHOT use. (shotguns)
+//
+// NOTE: This effect makes the client do traces for each bullet, these client traces ignore
+// entities that have studio models.Traces are 4096 long.
+//
+// coord (origin)
+// coord (origin)
+// coord (origin)
+// coord (direction)
+// coord (direction)
+// coord (direction)
+// coord (x noise * 100)
+// coord (y noise * 100)
+// byte (count)
+// byte (bullethole decal texture index)
+
+#define TE_USERTRACER 127 // larger message than the standard tracer, but allows some customization.
+// coord (origin)
+// coord (origin)
+// coord (origin)
+// coord (velocity)
+// coord (velocity)
+// coord (velocity)
+// byte ( life * 10 )
+// byte ( color ) this is an index into an array of color vectors in the engine. (0 - )
+// byte ( length * 10 )
+
+
+
+#define MSG_BROADCAST 0 // unreliable to all
+#define MSG_ONE 1 // reliable to one (msg_entity)
+#define MSG_ALL 2 // reliable to all
+#define MSG_INIT 3 // write to the init string
+#define MSG_PVS 4 // Ents in PVS of org
+#define MSG_PAS 5 // Ents in PAS of org
+#define MSG_PVS_R 6 // Reliable to PVS
+#define MSG_PAS_R 7 // Reliable to PAS
+#define MSG_ONE_UNRELIABLE 8 // Send to one client, but don't put in reliable stream, put in unreliable datagram ( could be dropped )
+#define MSG_SPEC 9 // Sends to all spectator proxies
+
+// contents of a spot in the world
+#define CONTENTS_EMPTY -1
+#define CONTENTS_SOLID -2
+#define CONTENTS_WATER -3
+#define CONTENTS_SLIME -4
+#define CONTENTS_LAVA -5
+#define CONTENTS_SKY -6
+// These additional contents constants are defined in bspfile.h
+#define CONTENTS_ORIGIN -7 // removed at csg time
+#define CONTENTS_CLIP -8 // changed to contents_solid
+#define CONTENTS_CURRENT_0 -9
+#define CONTENTS_CURRENT_90 -10
+#define CONTENTS_CURRENT_180 -11
+#define CONTENTS_CURRENT_270 -12
+#define CONTENTS_CURRENT_UP -13
+#define CONTENTS_CURRENT_DOWN -14
+
+#define CONTENTS_TRANSLUCENT -15
+
+#define CONTENTS_LADDER -16
+
+#define CONTENT_FLYFIELD -17
+#define CONTENT_GRAVITY_FLYFIELD -18
+#define CONTENT_FOG -19
+
+#define CONTENT_EMPTY -1
+#define CONTENT_SOLID -2
+#define CONTENT_WATER -3
+#define CONTENT_SLIME -4
+#define CONTENT_LAVA -5
+#define CONTENT_SKY -6
+
+// channels
+#define CHAN_AUTO 0
+#define CHAN_WEAPON 1
+#define CHAN_VOICE 2
+#define CHAN_ITEM 3
+#define CHAN_BODY 4
+#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area
+#define CHAN_STATIC 6 // allocate channel from the static area
+#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network
+#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END).
+#define CHAN_BOT 501 // channel used for bot chatter.
+
+// attenuation values
+#define ATTN_NONE 0
+#define ATTN_NORM (float)0.8
+#define ATTN_IDLE (float)2
+#define ATTN_STATIC (float)1.25
+
+// pitch values
+#define PITCH_NORM 100 // non-pitch shifted
+#define PITCH_LOW 95 // other values are possible - 0-255, where 255 is very high
+#define PITCH_HIGH 120
+
+// volume values
+#define VOL_NORM 1.0
+
+// plats
+#define PLAT_LOW_TRIGGER 1
+
+// Trains
+#define SF_TRAIN_WAIT_RETRIGGER 1
+#define SF_TRAIN_START_ON 4 // Train is initially moving
+#define SF_TRAIN_PASSABLE 8 // Train is not solid -- used to make water trains
+
+// buttons
+#ifndef IN_BUTTONS_H
+//#include "in_buttons.h"
+#endif
+
+// Break Model Defines
+
+#define BREAK_TYPEMASK 0x4F
+#define BREAK_GLASS 0x01
+#define BREAK_METAL 0x02
+#define BREAK_FLESH 0x04
+#define BREAK_WOOD 0x08
+
+#define BREAK_SMOKE 0x10
+#define BREAK_TRANS 0x20
+#define BREAK_CONCRETE 0x40
+#define BREAK_2 0x80
+
+// Colliding temp entity sounds
+
+#define BOUNCE_GLASS BREAK_GLASS
+#define BOUNCE_METAL BREAK_METAL
+#define BOUNCE_FLESH BREAK_FLESH
+#define BOUNCE_WOOD BREAK_WOOD
+#define BOUNCE_SHRAP 0x10
+#define BOUNCE_SHELL 0x20
+#define BOUNCE_CONCRETE BREAK_CONCRETE
+#define BOUNCE_SHOTSHELL 0x80
+
+// Temp entity bounce sound types
+#define TE_BOUNCE_NULL 0
+#define TE_BOUNCE_SHELL 1
+#define TE_BOUNCE_SHOTSHELL 2
+
+// Rendering constants
+enum
+{
+ kRenderNormal, // src
+ kRenderTransColor, // c*a+dest*(1-a)
+ kRenderTransTexture, // src*a+dest*(1-a)
+ kRenderGlow, // src*a+dest -- No Z buffer checks
+ kRenderTransAlpha, // src*srca+dest*(1-srca)
+ kRenderTransAdd, // src*a+dest
+};
+
+enum
+{
+ kRenderFxNone = 0,
+ kRenderFxPulseSlow,
+ kRenderFxPulseFast,
+ kRenderFxPulseSlowWide,
+ kRenderFxPulseFastWide,
+ kRenderFxFadeSlow,
+ kRenderFxFadeFast,
+ kRenderFxSolidSlow,
+ kRenderFxSolidFast,
+ kRenderFxStrobeSlow,
+ kRenderFxStrobeFast,
+ kRenderFxStrobeFaster,
+ kRenderFxFlickerSlow,
+ kRenderFxFlickerFast,
+ kRenderFxNoDissipation,
+ kRenderFxDistort, // Distort/scale/translate flicker
+ kRenderFxHologram, // kRenderFxDistort + distance fade
+ kRenderFxDeadPlayer, // kRenderAmt is the player index
+ kRenderFxExplode, // Scale up really big!
+ kRenderFxGlowShell, // Glowing Shell
+ kRenderFxClampMinScale, // Keep this sprite from getting very small (SPRITES only!)
+ kRenderFxLightMultiplier, //CTM !!!CZERO added to tell the studiorender that the value in iuser2 is a lightmultiplier
+};
+
+typedef unsigned int uint32;
+typedef int int32;
+
+typedef unsigned int func_t;
+typedef unsigned int string_t;
+typedef unsigned int CRC32_t;
+
+#ifndef BYTE_DEFINED
+#define BYTE_DEFINED
+#ifndef small
+typedef unsigned char byte;
+#endif
+typedef unsigned short word;
+typedef unsigned long dword;
+#endif
+
+typedef void ( *xcommand_t )();
+
+#define _DEF_BYTE_
+
+#undef true
+#undef false
+
+#ifndef __cplusplus
+typedef int qboolean; // typedef enum { false, true } qboolean;
+#else
+typedef int qboolean;
+#endif
+
+typedef float vec_t;
+typedef vec_t vec3_t[3];
+
+typedef struct
+{
+ byte r, g, b;
+} color24;
+
+typedef struct
+{
+ unsigned r, g, b, a;
+} colorVec;
+
+#ifdef _WIN32
+#pragma pack(push,2)
+#endif
+
+typedef struct
+{
+ unsigned short r, g, b, a;
+} PackedColorVec;
+
+#ifdef _WIN32
+#pragma pack(pop)
+#endif
+typedef struct link_s
+{
+ struct link_s *prev, *next;
+} link_t;
+
+typedef struct plane_s
+{
+ vec3_t normal;
+ float dist;
+} plane_t;
+
+typedef struct trace_s
+{
+ qboolean allsolid; // if true, plane is not valid
+ qboolean startsolid; // if true, the initial point was in a solid area
+ qboolean inopen, inwater;
+ float fraction; // time completed, 1.0 = didn't hit anything
+ vec3_t endpos; // final position
+ plane_t plane; // surface normal at impact
+ struct edict_s* pHit; // entity the surface is on
+ int hitgroup; // 0 == generic, non zero is specific body part
+} trace_t;
+
+#endif
+
diff --git a/src/sdk/custom.h b/src/sdk/custom.h
new file mode 100644
index 0000000..51432ee
--- /dev/null
+++ b/src/sdk/custom.h
@@ -0,0 +1,101 @@
+/***
+*
+* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
+*
+* This product contains software technology licensed from Id
+* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
+* All Rights Reserved.
+*
+* Use, distribution, and modification of this source code and/or resulting
+* object code is restricted to non-commercial enhancements to products from
+* Valve LLC. All other use, distribution, or modification is prohibited
+* without written permission from Valve LLC.
+*
+****/
+// Customization.h
+
+#ifndef CUSTOM_H
+#define CUSTOM_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "const.h"
+
+#define MAX_QPATH 64 // Must match value in quakedefs.h
+
+/////////////////
+// Customization
+// passed to pfnPlayerCustomization
+// For automatic downloading.
+typedef enum
+{
+ t_sound = 0,
+ t_skin,
+ t_model,
+ t_decal,
+ t_generic,
+ t_eventscript,
+ t_world, // Fake type for world, is really t_model
+} resourcetype_t;
+
+
+typedef struct
+{
+ int size;
+} _resourceinfo_t;
+
+typedef struct resourceinfo_s
+{
+ _resourceinfo_t info[ 8 ];
+} resourceinfo_t;
+
+#define RES_FATALIFMISSING (1<<0) // Disconnect if we can't get this file.
+#define RES_WASMISSING (1<<1) // Do we have the file locally, did we get it ok?
+#define RES_CUSTOM (1<<2) // Is this resource one that corresponds to another player's customization
+ // or is it a server startup resource.
+#define RES_REQUESTED (1<<3) // Already requested a download of this one
+#define RES_PRECACHED (1<<4) // Already precached
+#define RES_ALWAYS (1<<5) // download always even if available on client
+#define RES_CHECKFILE (1<<7) // check file on client
+
+typedef struct resource_s
+{
+ char szFileName[MAX_QPATH]; // File name to download/precache.
+ resourcetype_t type; // t_sound, t_skin, t_model, t_decal.
+ int nIndex; // For t_decals
+ int nDownloadSize; // Size in Bytes if this must be downloaded.
+ unsigned char ucFlags;
+
+// For handling client to client resource propagation
+ unsigned char rgucMD5_hash[16]; // To determine if we already have it.
+ unsigned char playernum; // Which player index this resource is associated with, if it's a custom resource.
+
+ unsigned char rguc_reserved[ 32 ]; // For future expansion
+ struct resource_s *pNext; // Next in chain.
+ struct resource_s *pPrev;
+} resource_t;
+
+typedef struct customization_s
+{
+ qboolean bInUse; // Is this customization in use;
+ resource_t resource; // The resource_t for this customization
+ qboolean bTranslated; // Has the raw data been translated into a useable format?
+ // (e.g., raw decal .wad make into texture_t *)
+ int nUserData1; // Customization specific data
+ int nUserData2; // Customization specific data
+ void *pInfo; // Buffer that holds the data structure that references the data (e.g., the cachewad_t)
+ void *pBuffer; // Buffer that holds the data for the customization (the raw .wad data)
+ struct customization_s *pNext; // Next in chain
+} customization_t;
+
+#define FCUST_FROMHPAK ( 1<<0 )
+#define FCUST_WIPEDATA ( 1<<1 )
+#define FCUST_IGNOREINIT ( 1<<2 )
+
+void COM_ClearCustomizationList( struct customization_s *pHead, qboolean bCleanDecals);
+qboolean COM_CreateCustomization( struct customization_s *pListHead, struct resource_s *pResource, int playernumber, int flags,
+ struct customization_s **pCustomization, int *nLumps );
+int COM_SizeofResourceList ( struct resource_s *pList, struct resourceinfo_s *ri );
+
+#endif // CUSTOM_H
diff --git a/src/sdk/cvardef.h b/src/sdk/cvardef.h
new file mode 100644
index 0000000..16044ab
--- /dev/null
+++ b/src/sdk/cvardef.h
@@ -0,0 +1,37 @@
+/***
+*
+* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
+*
+* This product contains software technology licensed from Id
+* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
+* All Rights Reserved.
+*
+* Use, distribution, and modification of this source code and/or resulting
+* object code is restricted to non-commercial enhancements to products from
+* Valve LLC. All other use, distribution, or modification is prohibited
+* without written permission from Valve LLC.
+*
+****/
+#ifndef CVARDEF_H
+#define CVARDEF_H
+
+#define FCVAR_ARCHIVE (1<<0) // set to cause it to be saved to vars.rc
+#define FCVAR_USERINFO (1<<1) // changes the client's info string
+#define FCVAR_SERVER (1<<2) // notifies players when changed
+#define FCVAR_EXTDLL (1<<3) // defined by external DLL
+#define FCVAR_CLIENTDLL (1<<4) // defined by the client dll
+#define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value
+#define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server.
+#define FCVAR_PRINTABLEONLY (1<<7) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
+#define FCVAR_UNLOGGED (1<<8) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
+#define FCVAR_NOEXTRAWHITEPACE (1<<9) // strip trailing/leading white space from this cvar
+
+typedef struct cvar_s
+{
+ char *name;
+ char *string;
+ int flags;
+ float value;
+ struct cvar_s *next;
+} cvar_t;
+#endif
diff --git a/src/sdk/edict.h b/src/sdk/edict.h
new file mode 100644
index 0000000..7bcd03d
--- /dev/null
+++ b/src/sdk/edict.h
@@ -0,0 +1,37 @@
+//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#if !defined EDICT_H
+#define EDICT_H
+#ifdef _WIN32
+#pragma once
+#endif
+#define MAX_ENT_LEAFS 48
+
+#include "const.h"
+#include "progdefs.h"
+
+typedef struct edict_s
+{
+ qboolean free;
+ int serialnumber;
+ link_t area; // linked to a division node or leaf
+
+ int headnode; // -1 to use normal leaf check
+ int num_leafs;
+ short leafnums[MAX_ENT_LEAFS];
+
+ float freetime; // sv.time when the object was freed
+
+ void* pvPrivateData; // Alloced and freed by engine, used by DLLs
+
+ entvars_t v; // C exported fields from progs
+
+ // other fields from progs come immediately after
+} edict_t;
+
+#endif
diff --git a/src/sdk/eiface.h b/src/sdk/eiface.h
new file mode 100644
index 0000000..9d532ae
--- /dev/null
+++ b/src/sdk/eiface.h
@@ -0,0 +1,500 @@
+/***
+*
+* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
+*
+* This product contains software technology licensed from Id
+* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
+* All Rights Reserved.
+*
+* Use, distribution, and modification of this source code and/or resulting
+* object code is restricted to non-commercial enhancements to products from
+* Valve LLC. All other use, distribution, or modification is prohibited
+* without written permission from Valve LLC.
+*
+****/
+#ifndef EIFACE_H
+#define EIFACE_H
+
+#include
+#include "const.h"
+#include "edict.h"
+#include "custom.h"
+#include "cvardef.h"
+#include "Sequence.h"
+#include "progdefs.h"
+
+//
+// Defines entity interface between engine and DLLs.
+// This header file included by engine files and DLL files.
+//
+// Before including this header, DLLs must:
+// include progdefs.h
+// This is conveniently done for them in extdll.h
+//
+
+/*
+#ifdef _WIN32
+#define DLLEXPORT __stdcall
+#else
+#define DLLEXPORT __attribute__ ((visibility("default")))
+#endif
+*/
+
+extern globalvars_t* gpGlobals;
+
+typedef enum
+{
+ at_notice,
+ at_console, // same as at_notice, but forces a ConPrintf, not a message box
+ at_aiconsole, // same as at_console, but only shown if developer level is 2!
+ at_warning,
+ at_error,
+ at_logged // Server print to console ( only in multiplayer games ).
+} ALERT_TYPE;
+
+// 4-22-98 JOHN: added for use in pfnClientPrintf
+typedef enum
+{
+ print_console,
+ print_center,
+ print_chat,
+} PRINT_TYPE;
+
+// For integrity checking of content on clients
+typedef enum
+{
+ force_exactfile, // File on client must exactly match server's file
+ force_model_samebounds, // For model files only, the geometry must fit in the same bbox
+ force_model_specifybounds, // For model files only, the geometry must fit in the specified bbox
+ force_model_specifybounds_if_avail, // For Steam model files only, the geometry must fit in the specified bbox (if the file is available)
+} FORCE_TYPE;
+
+// Returned by TraceLine
+typedef struct TraceResult
+{
+ int fAllSolid; // if true, plane is not valid
+ int fStartSolid; // if true, the initial point was in a solid area
+ int fInOpen;
+ int fInWater;
+ float flFraction; // time completed, 1.0 = didn't hit anything
+ vec3_t vecEndPos; // final position
+ float flPlaneDist;
+ vec3_t vecPlaneNormal; // surface normal at impact
+ edict_t* pHit; // entity the surface is on
+ int iHitgroup; // 0 == generic, non zero is specific body part
+} TraceResult;
+
+// CD audio status
+typedef struct
+{
+ int fPlaying;// is sound playing right now?
+ int fWasPlaying;// if not, CD is paused if WasPlaying is true.
+ int fInitialized;
+ int fEnabled;
+ int fPlayLooping;
+ float cdvolume;
+ //BYTE remap[100];
+ int fCDRom;
+ int fPlayTrack;
+} CDStatus;
+
+// Engine hands this to DLLs for functionality callbacks
+typedef struct enginefuncs_s
+{
+ int (*pfnPrecacheModel) (char* s);
+ int (*pfnPrecacheSound) (char* s);
+ void (*pfnSetModel) (edict_t *e, const char *m);
+ int (*pfnModelIndex) (const char *m);
+ int (*pfnModelFrames) (int modelIndex);
+ void (*pfnSetSize) (edict_t *e, const float *rgflMin, const float *rgflMax);
+ void (*pfnChangeLevel) (char* s1, char* s2);
+ void (*pfnGetSpawnParms) (edict_t *ent);
+ void (*pfnSaveSpawnParms) (edict_t *ent);
+ float (*pfnVecToYaw) (const float *rgflVector);
+ void (*pfnVecToAngles) (const float *rgflVectorIn, float *rgflVectorOut);
+ void (*pfnMoveToOrigin) (edict_t *ent, const float *pflGoal, float dist, int iMoveType);
+ void (*pfnChangeYaw) (edict_t* ent);
+ void (*pfnChangePitch) (edict_t* ent);
+ edict_t* (*pfnFindEntityByString) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue);
+ int (*pfnGetEntityIllum) (edict_t* pEnt);
+ edict_t* (*pfnFindEntityInSphere) (edict_t *pEdictStartSearchAfter, const float *org, float rad);
+ edict_t* (*pfnFindClientInPVS) (edict_t *pEdict);
+ edict_t* (*pfnEntitiesInPVS) (edict_t *pplayer);
+ void (*pfnMakeVectors) (const float *rgflVector);
+ void (*pfnAngleVectors) (const float *rgflVector, float *forward, float *right, float *up);
+ edict_t* (*pfnCreateEntity) (void);
+ void (*pfnRemoveEntity) (edict_t* e);
+ edict_t* (*pfnCreateNamedEntity) (int className);
+ void (*pfnMakeStatic) (edict_t *ent);
+ int (*pfnEntIsOnFloor) (edict_t *e);
+ int (*pfnDropToFloor) (edict_t* e);
+ int (*pfnWalkMove) (edict_t *ent, float yaw, float dist, int iMode);
+ void (*pfnSetOrigin) (edict_t *e, const float *rgflOrigin);
+ void (*pfnEmitSound) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch);
+ void (*pfnEmitAmbientSound) (edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch);
+ void (*pfnTraceLine) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
+ void (*pfnTraceToss) (edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr);
+ int (*pfnTraceMonsterHull) (edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
+ void (*pfnTraceHull) (const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr);
+ void (*pfnTraceModel) (const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr);
+ const char *(*pfnTraceTexture) (edict_t *pTextureEntity, const float *v1, const float *v2 );
+ void (*pfnTraceSphere) (const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr);
+ void (*pfnGetAimVector) (edict_t* ent, float speed, float *rgflReturn);
+ void (*pfnServerCommand) (char* str);
+ void (*pfnServerExecute) (void);
+ void (*pfnClientCommand) (edict_t* pEdict, char* szFmt, ...);
+ void (*pfnParticleEffect) (const float *org, const float *dir, float color, float count);
+ void (*pfnLightStyle) (int style, char* val);
+ int (*pfnDecalIndex) (const char *name);
+ int (*pfnPointContents) (const float *rgflVector);
+ void (*pfnMessageBegin) (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
+ void (*pfnMessageEnd) (void);
+ void (*pfnWriteByte) (int iValue);
+ void (*pfnWriteChar) (int iValue);
+ void (*pfnWriteShort) (int iValue);
+ void (*pfnWriteLong) (int iValue);
+ void (*pfnWriteAngle) (float flValue);
+ void (*pfnWriteCoord) (float flValue);
+ void (*pfnWriteString) (const char *sz);
+ void (*pfnWriteEntity) (int iValue);
+ void (*pfnCVarRegister) (cvar_t *pCvar);
+ float (*pfnCVarGetFloat) (const char *szVarName);
+ const char* (*pfnCVarGetString) (const char *szVarName);
+ void (*pfnCVarSetFloat) (const char *szVarName, float flValue);
+ void (*pfnCVarSetString) (const char *szVarName, const char *szValue);
+ void (*pfnAlertMessage) (ALERT_TYPE atype, char *szFmt, ...);
+ void (*pfnEngineFprintf) (void *pfile, char *szFmt, ...);
+ void* (*pfnPvAllocEntPrivateData) (edict_t *pEdict, int32 cb);
+ void* (*pfnPvEntPrivateData) (edict_t *pEdict);
+ void (*pfnFreeEntPrivateData) (edict_t *pEdict);
+ const char* (*pfnSzFromIndex) (int iString);
+ int (*pfnAllocString) (const char *szValue);
+ struct entvars_s* (*pfnGetVarsOfEnt) (edict_t *pEdict);
+ edict_t* (*pfnPEntityOfEntOffset) (int iEntOffset);
+ int (*pfnEntOffsetOfPEntity) (const edict_t *pEdict);
+ int (*pfnIndexOfEdict) (const edict_t *pEdict);
+ edict_t* (*pfnPEntityOfEntIndex) (int iEntIndex);
+ edict_t* (*pfnFindEntityByVars) (struct entvars_s* pvars);
+ void* (*pfnGetModelPtr) (edict_t* pEdict);
+ int (*pfnRegUserMsg) (const char *pszName, int iSize);
+ void (*pfnAnimationAutomove) (const edict_t* pEdict, float flTime);
+ void (*pfnGetBonePosition) (const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles );
+ uint32 (*pfnFunctionFromName) ( const char *pName );
+ const char *(*pfnNameForFunction) ( uint32 function );
+ void (*pfnClientPrintf) ( edict_t* pEdict, PRINT_TYPE ptype, const char *szMsg ); // JOHN: engine callbacks so game DLL can print messages to individual clients
+ void (*pfnServerPrint) ( const char *szMsg );
+ const char *(*pfnCmd_Args) ( void ); // these 3 added
+ const char *(*pfnCmd_Argv) ( int argc ); // so game DLL can easily
+ int (*pfnCmd_Argc) ( void ); // access client 'cmd' strings
+ void (*pfnGetAttachment) (const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles );
+ void (*pfnCRC32_Init) (CRC32_t *pulCRC);
+ void (*pfnCRC32_ProcessBuffer) (CRC32_t *pulCRC, void *p, int len);
+ void (*pfnCRC32_ProcessByte) (CRC32_t *pulCRC, unsigned char ch);
+ CRC32_t (*pfnCRC32_Final) (CRC32_t pulCRC);
+ int32 (*pfnRandomLong) (int32 lLow, int32 lHigh);
+ float (*pfnRandomFloat) (float flLow, float flHigh);
+ void (*pfnSetView) (const edict_t *pClient, const edict_t *pViewent );
+ float (*pfnTime) ( void );
+ void (*pfnCrosshairAngle) (const edict_t *pClient, float pitch, float yaw);
+ byte * (*pfnLoadFileForMe) (char *filename, int *pLength);
+ void (*pfnFreeFile) (void *buffer);
+ void (*pfnEndSection) (const char *pszSectionName); // trigger_endsection
+ int (*pfnCompareFileTime) (char *filename1, char *filename2, int *iCompare);
+ void (*pfnGetGameDir) (char *szGetGameDir);
+ void (*pfnCvar_RegisterVariable) (cvar_t *variable);
+ void (*pfnFadeClientVolume) (const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds);
+ void (*pfnSetClientMaxspeed) (const edict_t *pEdict, float fNewMaxspeed);
+ edict_t * (*pfnCreateFakeClient) (const char *netname); // returns NULL if fake client can't be created
+ void (*pfnRunPlayerMove) (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec );
+ int (*pfnNumberOfEntities) (void);
+ char* (*pfnGetInfoKeyBuffer) (edict_t *e); // passing in NULL gets the serverinfo
+ char* (*pfnInfoKeyValue) (char *infobuffer, char *key);
+ void (*pfnSetKeyValue) (char *infobuffer, char *key, char *value);
+ void (*pfnSetClientKeyValue) (int clientIndex, char *infobuffer, char *key, char *value);
+ int (*pfnIsMapValid) (char *filename);
+ void (*pfnStaticDecal) ( const float *origin, int decalIndex, int entityIndex, int modelIndex );
+ int (*pfnPrecacheGeneric) (char* s);
+ int (*pfnGetPlayerUserId) (edict_t *e ); // returns the server assigned userid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients
+ void (*pfnBuildSoundMsg) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
+ int (*pfnIsDedicatedServer) (void);// is this a dedicated server?
+ cvar_t *(*pfnCVarGetPointer) (const char *szVarName);
+ unsigned int (*pfnGetPlayerWONId) (edict_t *e); // returns the server assigned WONid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients
+
+ // YWB 8/1/99 TFF Physics additions
+ void (*pfnInfo_RemoveKey) ( char *s, const char *key );
+ const char *(*pfnGetPhysicsKeyValue) ( const edict_t *pClient, const char *key );
+ void (*pfnSetPhysicsKeyValue) ( const edict_t *pClient, const char *key, const char *value );
+ const char *(*pfnGetPhysicsInfoString) ( const edict_t *pClient );
+ unsigned short (*pfnPrecacheEvent) ( int type, const char*psz );
+ void (*pfnPlaybackEvent) ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );
+
+ unsigned char *(*pfnSetFatPVS) ( float *org );
+ unsigned char *(*pfnSetFatPAS) ( float *org );
+
+ int (*pfnCheckVisibility ) ( const edict_t *entity, unsigned char *pset );
+
+ void (*pfnDeltaSetField) ( struct delta_s *pFields, const char *fieldname );
+ void (*pfnDeltaUnsetField) ( struct delta_s *pFields, const char *fieldname );
+ void (*pfnDeltaAddEncoder) ( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) );
+ int (*pfnGetCurrentPlayer) ( void );
+ int (*pfnCanSkipPlayer) ( const edict_t *player );
+ int (*pfnDeltaFindField) ( struct delta_s *pFields, const char *fieldname );
+ void (*pfnDeltaSetFieldByIndex) ( struct delta_s *pFields, int fieldNumber );
+ void (*pfnDeltaUnsetFieldByIndex)( struct delta_s *pFields, int fieldNumber );
+
+ void (*pfnSetGroupMask) ( int mask, int op );
+
+ int (*pfnCreateInstancedBaseline) ( int classname, struct entity_state_s *baseline );
+ void (*pfnCvar_DirectSet) ( struct cvar_s *var, char *value );
+
+ // Forces the client and server to be running with the same version of the specified file
+ // ( e.g., a player model ).
+ // Calling this has no effect in single player
+ void (*pfnForceUnmodified) ( FORCE_TYPE type, float *mins, float *maxs, const char *filename );
+
+ void (*pfnGetPlayerStats) ( const edict_t *pClient, int *ping, int *packet_loss );
+
+ void (*pfnAddServerCommand) ( char *cmd_name, void (*function) (void) );
+
+ // For voice communications, set which clients hear eachother.
+ // NOTE: these functions take player entity indices (starting at 1).
+ qboolean (*pfnVoice_GetClientListening)(int iReceiver, int iSender);
+ qboolean (*pfnVoice_SetClientListening)(int iReceiver, int iSender, qboolean bListen);
+
+ const char *(*pfnGetPlayerAuthId) ( edict_t *e );
+
+ // PSV: Added for CZ training map
+// const char *(*pfnKeyNameForBinding) ( const char* pBinding );
+
+ sequenceEntry_s* (*pfnSequenceGet) ( const char* fileName, const char* entryName );
+ sentenceEntry_s* (*pfnSequencePickSentence) ( const char* groupName, int pickMethod, int *picked );
+
+ // LH: Give access to filesize via filesystem
+ int (*pfnGetFileSize) ( char *filename );
+
+ unsigned int (*pfnGetApproxWavePlayLen) (const char *filepath);
+ // MDC: Added for CZ career-mode
+ int (*pfnIsCareerMatch) ( void );
+
+ // BGC: return the number of characters of the localized string referenced by using "label"
+ int (*pfnGetLocalizedStringLength)(const char *label);
+
+ // BGC: added to facilitate persistent storage of tutor message decay values for
+ // different career game profiles. Also needs to persist regardless of mp.dll being
+ // destroyed and recreated.
+ void (*pfnRegisterTutorMessageShown)(int mid);
+ int (*pfnGetTimesTutorMessageShown)(int mid);
+ void (*ProcessTutorMessageDecayBuffer)(int *buffer, int bufferLength);
+ void (*ConstructTutorMessageDecayBuffer)(int *buffer, int bufferLength);
+ void (*ResetTutorMessageDecayData)( void );
+
+ void (*pfnQueryClientCvarValue)( const edict_t *player, const char *cvarName );
+ void (*pfnQueryClientCvarValue2)( const edict_t *player, const char *cvarName, int requestID );
+ int (*pfnCheckParm)( const char *pchCmdLineToken, char **ppnext );
+} enginefuncs_t;
+
+extern enginefuncs_t g_engfuncs;
+
+// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138
+
+// Passed to pfnKeyValue
+typedef struct KeyValueData_s
+{
+ char *szClassName; // in: entity classname
+ char *szKeyName; // in: name of key
+ char *szValue; // in: value of key
+ int32 fHandled; // out: DLL sets to true if key-value pair was understood
+} KeyValueData;
+
+
+typedef struct
+{
+ char mapName[ 32 ];
+ char landmarkName[ 32 ];
+ edict_t *pentLandmark;
+ vec3_t vecLandmarkOrigin;
+} LEVELLIST;
+#define MAX_LEVEL_CONNECTIONS 16 // These are encoded in the lower 16bits of ENTITYTABLE->flags
+
+typedef struct
+{
+ int id; // Ordinal ID of this entity (used for entity <--> pointer conversions)
+ edict_t *pent; // Pointer to the in-game entity
+
+ int location; // Offset from the base data of this entity
+ int size; // Byte size of this entity's data
+ int flags; // This could be a short -- bit mask of transitions that this entity is in the PVS of
+ string_t classname; // entity class name
+
+} ENTITYTABLE;
+
+#define FENTTABLE_PLAYER 0x80000000
+#define FENTTABLE_REMOVED 0x40000000
+#define FENTTABLE_MOVEABLE 0x20000000
+#define FENTTABLE_GLOBAL 0x10000000
+
+typedef enum _fieldtypes
+{
+ FIELD_FLOAT = 0, // Any floating point value
+ FIELD_STRING, // A string ID (return from ALLOC_STRING)
+ FIELD_ENTITY, // An entity offset (EOFFSET)
+ FIELD_CLASSPTR, // CBaseEntity *
+ FIELD_EHANDLE, // Entity handle
+ FIELD_EVARS, // EVARS *
+ FIELD_EDICT, // edict_t *, or edict_t * (same thing)
+ FIELD_VECTOR, // Any vector
+ FIELD_POSITION_VECTOR, // A world coordinate (these are fixed up across level transitions automagically)
+ FIELD_POINTER, // Arbitrary data pointer... to be removed, use an array of FIELD_CHARACTER
+ FIELD_INTEGER, // Any integer or enum
+ FIELD_FUNCTION, // A class function pointer (Think, Use, etc)
+ FIELD_BOOLEAN, // boolean, implemented as an int, I may use this as a hint for compression
+ FIELD_SHORT, // 2 byte integer
+ FIELD_CHARACTER, // a byte
+ FIELD_TIME, // a floating point time (these are fixed up automatically too!)
+ FIELD_MODELNAME, // Engine string that is a model name (needs precache)
+ FIELD_SOUNDNAME, // Engine string that is a sound name (needs precache)
+
+ FIELD_TYPECOUNT, // MUST BE LAST
+} FIELDTYPE;
+
+#if !defined(offsetof) && !defined(GNUC)
+#define offsetof(s,m) (size_t)&(((s *)0)->m)
+#endif
+
+#define _FIELD(type,name,fieldtype,count,flags) { fieldtype, #name, offsetof(type, name), count, flags }
+#define DEFINE_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, 0)
+#define DEFINE_ARRAY(type,name,fieldtype,count) _FIELD(type, name, fieldtype, count, 0)
+#define DEFINE_ENTITY_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, 0 )
+#define DEFINE_ENTITY_GLOBAL_FIELD(name,fieldtype) _FIELD(entvars_t, name, fieldtype, 1, FTYPEDESC_GLOBAL )
+#define DEFINE_GLOBAL_FIELD(type,name,fieldtype) _FIELD(type, name, fieldtype, 1, FTYPEDESC_GLOBAL )
+
+
+#define FTYPEDESC_GLOBAL 0x0001 // This field is masked for global entity save/restore
+
+typedef struct
+{
+ FIELDTYPE fieldType;
+ char *fieldName;
+ int fieldOffset;
+ short fieldSize;
+ short flags;
+} TYPEDESCRIPTION;
+
+typedef struct SAVERESTOREDATA SAVERESTOREDATA;
+
+//#ifndef ARRAYSIZE
+//#define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0]))
+//#endif
+
+typedef struct DLL_FUNCTIONS
+{
+ // Initialize/shutdown the game (one-time call after loading of game .dll )
+ void (*pfnGameInit) ( void );
+ int (*pfnSpawn) ( edict_t *pent );
+ void (*pfnThink) ( edict_t *pent );
+ void (*pfnUse) ( edict_t *pentUsed, edict_t *pentOther );
+ void (*pfnTouch) ( edict_t *pentTouched, edict_t *pentOther );
+ void (*pfnBlocked) ( edict_t *pentBlocked, edict_t *pentOther );
+ void (*pfnKeyValue) ( edict_t *pentKeyvalue, KeyValueData *pkvd );
+ void (*pfnSave) ( edict_t *pent, SAVERESTOREDATA *pSaveData );
+ int (*pfnRestore) ( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity );
+ void (*pfnSetAbsBox) ( edict_t *pent );
+
+ void (*pfnSaveWriteFields) ( SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int );
+ void (*pfnSaveReadFields) ( SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int );
+
+ void (*pfnSaveGlobalState) ( SAVERESTOREDATA * );
+ void (*pfnRestoreGlobalState) ( SAVERESTOREDATA * );
+ void (*pfnResetGlobalState) ( void );
+
+ qboolean (*pfnClientConnect) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] );
+
+ void (*pfnClientDisconnect) ( edict_t *pEntity );
+ void (*pfnClientKill) ( edict_t *pEntity );
+ void (*pfnClientPutInServer) ( edict_t *pEntity );
+ void (*pfnClientCommand) ( edict_t *pEntity );
+ void (*pfnClientUserInfoChanged)( edict_t *pEntity, char *infobuffer );
+
+ void (*pfnServerActivate) ( edict_t *pEdictList, int edictCount, int clientMax );
+ void (*pfnServerDeactivate) ( void );
+
+ void (*pfnPlayerPreThink) ( edict_t *pEntity );
+ void (*pfnPlayerPostThink) ( edict_t *pEntity );
+
+ void (*pfnStartFrame) ( void );
+ void (*pfnParmsNewLevel) ( void );
+ void (*pfnParmsChangeLevel) ( void );
+
+ // Returns string describing current .dll. E.g., TeamFotrress 2, Half-Life
+ const char *(*pfnGetGameDescription)( void );
+
+ // Notify dll about a player customization.
+ void (*pfnPlayerCustomization) ( edict_t *pEntity, customization_t *pCustom );
+
+ // Spectator funcs
+ void (*pfnSpectatorConnect) ( edict_t *pEntity );
+ void (*pfnSpectatorDisconnect) ( edict_t *pEntity );
+ void (*pfnSpectatorThink) ( edict_t *pEntity );
+
+ // Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint.
+ void (*pfnSys_Error) ( const char *error_string );
+
+ void (*pfnPM_Move) ( struct playermove_s *ppmove, qboolean server );
+ void (*pfnPM_Init) ( struct playermove_s *ppmove );
+ char (*pfnPM_FindTextureType)( char *name );
+ void (*pfnSetupVisibility)( struct edict_s *pViewEntity, struct edict_s *pClient, unsigned char **pvs, unsigned char **pas );
+ void (*pfnUpdateClientData) ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd );
+ int (*pfnAddToFullPack)( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet );
+ void (*pfnCreateBaseline) ( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs );
+ void (*pfnRegisterEncoders) ( void );
+ int (*pfnGetWeaponData) ( struct edict_s *player, struct weapon_data_s *info );
+
+ void (*pfnCmdStart) ( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed );
+ void (*pfnCmdEnd) ( const edict_t *player );
+
+ // Return 1 if the packet is valid. Set response_buffer_size if you want to send a response packet. Incoming, it holds the max
+ // size of the response_buffer, so you must zero it out if you choose not to respond.
+ int (*pfnConnectionlessPacket ) ( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size );
+
+ // Enumerates player hulls. Returns 0 if the hull number doesn't exist, 1 otherwise
+ int (*pfnGetHullBounds) ( int hullnumber, float *mins, float *maxs );
+
+ // Create baselines for certain "unplaced" items.
+ void (*pfnCreateInstancedBaselines) ( void );
+
+ // One of the pfnForceUnmodified files failed the consistency check for the specified player
+ // Return 0 to allow the client to continue, 1 to force immediate disconnection ( with an optional disconnect message of up to 256 characters )
+ int (*pfnInconsistentFile)( const struct edict_s *player, const char *filename, char *disconnect_message );
+
+ // The game .dll should return 1 if lag compensation should be allowed ( could also just set
+ // the sv_unlag cvar.
+ // Most games right now should return 0, until client-side weapon prediction code is written
+ // and tested for them.
+ int (*pfnAllowLagCompensation)( void );
+} DLL_FUNCTIONS;
+
+extern DLL_FUNCTIONS gEntityInterface;
+
+// Current version.
+#define NEW_DLL_FUNCTIONS_VERSION 1
+
+typedef struct NEW_DLL_FUNCTIONS
+{
+ // Called right before the object's memory is freed.
+ // Calls its destructor.
+ void (*pfnOnFreeEntPrivateData)(edict_t *pEnt);
+ void (*pfnGameShutdown)(void);
+ int (*pfnShouldCollide)( edict_t *pentTouched, edict_t *pentOther );
+ void (*pfnCvarValue)( const edict_t *pEnt, const char *value );
+ void (*pfnCvarValue2)( const edict_t *pEnt, int requestID, const char *cvarName, const char *value );
+} NEW_DLL_FUNCTIONS;
+
+typedef int (*NEW_DLL_FUNCTIONS_FN)( NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion );
+
+// Pointers will be null if the game DLL doesn't support this API.
+extern NEW_DLL_FUNCTIONS gNewDLLFunctions;
+
+typedef int (*APIFUNCTION)( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion );
+typedef int (*APIFUNCTION2)( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion );
+
+#endif // EIFACE_H
diff --git a/src/sdk/meta_api.h b/src/sdk/meta_api.h
new file mode 100644
index 0000000..4a16dea
--- /dev/null
+++ b/src/sdk/meta_api.h
@@ -0,0 +1,130 @@
+// vi: set ts=4 sw=4 :
+// vim: set tw=75 :
+
+// meta_api.h - description of metamod's DLL interface
+
+/*
+ * Copyright (c) 2001-2003 Will Day
+ *
+ * This file is part of Metamod.
+ *
+ * Metamod is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * Metamod 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 Metamod; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * In addition, as a special exception, the author gives permission to
+ * link the code of this program with the Half-Life Game Engine ("HL
+ * Engine") and Modified Game Libraries ("MODs") developed by Valve,
+ * L.L.C ("Valve"). You must obey the GNU General Public License in all
+ * respects for all of the code used other than the HL Engine and MODs
+ * from Valve. If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version.
+ *
+ */
+
+#ifndef META_API_H
+#define META_API_H
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 869 )
+#endif
+
+//#include "dllapi.h" // GETENTITYAPI_FN, etc
+//#include "engine_api.h" // GET_ENGINE_FUNCTIONS_FN, etc
+#include "plinfo.h" // plugin_info_t, etc
+#include "mutil.h" // mutil_funcs_t, etc
+//#include "osdep.h" // DLLEXPORT, etc
+
+// Version consists of "major:minor", two separate integer numbers.
+// Version 1 original
+// Version 2 added plugin_info_t **pinfo
+// Version 3 init split into query and attach, added detach
+// Version 4 added (PLUG_LOADTIME now) to attach
+// Version 5 changed mm ifvers int* to string, moved pl ifvers to info
+// Version 5:1 added link support for entity "adminmod_timer" (adminmod)
+// Version 5:2 added gamedll_funcs to meta_attach() [v1.0-rc2]
+// Version 5:3 added mutil_funcs to meta_query() [v1.05]
+// Version 5:4 added centersay utility functions [v1.06]
+// Version 5:5 added Meta_Init to plugin API [v1.08]
+// Version 5:6 added CallGameEntity utility function [v1.09]
+// Version 5:7 added GetUserMsgID, GetUserMsgName util funcs [v1.11]
+// Version 5:8 added GetPluginPath [v1.11]
+// Version 5:9 added GetGameInfo [v1.14]
+// Version 5:10 added GINFO_REALDLL_FULLPATH for GetGameInfo [v1.17]
+// Version 5:11 added plugin loading and unloading API [v1.18]
+// Version 5:12 added util code for checking player query status [v1.18]
+// Version 5:13 added cvarquery2 support and api for calling hook tables [v1.19]
+#define META_INTERFACE_VERSION "5:13"
+
+#ifdef UNFINISHED
+// Version 5:99 added event hook utility functions [v.???]
+#define META_INTERFACE_VERSION "5:99"
+#endif /* UNFINISHED */
+
+// Flags returned by a plugin's api function.
+// NOTE: order is crucial, as greater/less comparisons are made.
+typedef enum {
+ MRES_UNSET = 0,
+ MRES_IGNORED, // plugin didn't take any action
+ MRES_HANDLED, // plugin did something, but real function should still be called
+ MRES_OVERRIDE, // call real function, but use my return value
+ MRES_SUPERCEDE, // skip real function; use my return value
+} META_RES;
+
+// Variables provided to plugins.
+typedef struct meta_globals_s {
+ META_RES mres; // writable; plugin's return flag
+ META_RES prev_mres; // readable; return flag of the previous plugin called
+ META_RES status; // readable; "highest" return flag so far
+ void *orig_ret; // readable; return value from "real" function
+ void *override_ret; // readable; return value from overriding/superceding plugin
+} meta_globals_t;
+
+extern meta_globals_t *gpMetaGlobals;
+#define SET_META_RESULT(result) gpMetaGlobals->mres=result
+#define RETURN_META(result) gpMetaGlobals->mres=result; return
+#define RETURN_META_VALUE(result, value) gpMetaGlobals->mres=result; return(value)
+#define META_RESULT_STATUS gpMetaGlobals->status
+#define META_RESULT_PREVIOUS gpMetaGlobals->prev_mres
+#define META_RESULT_ORIG_RET(type) *(type *)gpMetaGlobals->orig_ret
+#define META_RESULT_OVERRIDE_RET(type) *(type *)gpMetaGlobals->override_ret
+
+// Table of getapi functions, retrieved from each plugin.
+typedef struct {
+ void* pfnGetEntityAPI;
+ void* pfnGetEntityAPI_Post;
+ void* pfnGetEntityAPI2;
+ void* pfnGetEntityAPI2_Post;
+ void* pfnGetNewDLLFunctions;
+ void* pfnGetNewDLLFunctions_Post;
+ void* pfnGetEngineFunctions;
+ void* pfnGetEngineFunctions_Post;
+} META_FUNCTIONS;
+
+// Declared in plugin; referenced in macros.
+extern mutil_funcs_t* mUtil;
+
+struct DLL_FUNCTIONS;
+struct NEW_DLL_FUNCTIONS;
+
+typedef struct gamedll_funcs_s
+{
+ DLL_FUNCTIONS* dllapi_table;
+ NEW_DLL_FUNCTIONS* newapi_table;
+} gamedll_funcs_t;
+
+extern gamedll_funcs_t* gpGamedllFuncs;
+
+#endif /* META_API_H */
diff --git a/src/sdk/mutil.h b/src/sdk/mutil.h
new file mode 100644
index 0000000..69d1738
--- /dev/null
+++ b/src/sdk/mutil.h
@@ -0,0 +1,61 @@
+// vi: set ts=4 sw=4 :
+// vim: set tw=75 :
+
+// mutil.h - prototypes for utility functions to provide to plugins
+
+/*
+ * Copyright (c) 2001-2003 Will Day
+ *
+ * This file is part of Metamod.
+ *
+ * Metamod is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * Metamod 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 Metamod; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * In addition, as a special exception, the author gives permission to
+ * link the code of this program with the Half-Life Game Engine ("HL
+ * Engine") and Modified Game Libraries ("MODs") developed by Valve,
+ * L.L.C ("Valve"). You must obey the GNU General Public License in all
+ * respects for all of the code used other than the HL Engine and MODs
+ * from Valve. If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version.
+ *
+ */
+
+#ifndef MUTIL_H
+#define MUTIL_H
+
+// Meta Utility Function table type.
+typedef struct meta_util_funcs_s {
+ void (*pfnLogConsole) (plid_t plid, const char *fmt, ...);
+ void (*pfnLogMessage) (plid_t plid, const char *fmt, ...);
+ void (*pfnLogError) (plid_t plid, const char *fmt, ...);
+ void (*pfnLogDeveloper) (plid_t plid, const char *fmt, ...);
+ void (*pfnCenterSay) (plid_t plid, const char *fmt, ...);
+ void* pfnCenterSayParms;
+ void* pfnCenterSayVarargs;
+ int (*pfnCallGameEntity) (plid_t plid, const char *entStr, struct entvars_s *pev);
+ int (*pfnGetUserMsgID) (plid_t plid, const char* msgname, int* size);
+ const char* (*pfnGetUserMsgName) (plid_t plid, int msgid, int* size);
+ const char* (*pfnGetPluginPath) (plid_t plid);
+} mutil_funcs_t;
+
+// Convenience macros for MetaUtil functions
+#define LOG_CONSOLE (*gpMetaUtilFuncs->pfnLogConsole)
+#define LOG_MESSAGE (*gpMetaUtilFuncs->pfnLogMessage)
+#define LOG_ERROR (*gpMetaUtilFuncs->pfnLogError)
+#define LOG_DEVELOPER (*gpMetaUtilFuncs->pfnLogDeveloper)
+
+#endif /* MUTIL_H */
diff --git a/src/sdk/plinfo.h b/src/sdk/plinfo.h
new file mode 100644
index 0000000..40303ab
--- /dev/null
+++ b/src/sdk/plinfo.h
@@ -0,0 +1,82 @@
+// vi: set ts=4 sw=4 :
+// vim: set tw=75 :
+
+// plinfo.h - typedefs for plugin info structure
+
+/*
+ * Copyright (c) 2001-2003 Will Day
+ *
+ * This file is part of Metamod.
+ *
+ * Metamod is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * Metamod 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 Metamod; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * In addition, as a special exception, the author gives permission to
+ * link the code of this program with the Half-Life Game Engine ("HL
+ * Engine") and Modified Game Libraries ("MODs") developed by Valve,
+ * L.L.C ("Valve"). You must obey the GNU General Public License in all
+ * respects for all of the code used other than the HL Engine and MODs
+ * from Valve. If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version.
+ *
+ */
+
+#ifndef PLINFO_H
+#define PLINFO_H
+
+// Flags for plugin to indicate when it can be be loaded/unloaded.
+// NOTE: order is crucial, as greater/less comparisons are made.
+typedef enum {
+ PT_NEVER = 0,
+ PT_STARTUP, // should only be loaded/unloaded at initial hlds execution
+ PT_CHANGELEVEL, // can be loaded/unloaded between maps
+ PT_ANYTIME, // can be loaded/unloaded at any time
+ PT_ANYPAUSE, // can be loaded/unloaded at any time, and can be "paused" during a map
+} PLUG_LOADTIME;
+
+// Flags to indicate why the plugin is being unloaded.
+typedef enum {
+ PNL_NULL = 0,
+ PNL_INI_DELETED, // was deleted from plugins.ini
+ PNL_FILE_NEWER, // file on disk is newer than last load
+ PNL_COMMAND, // requested by server/console command
+ PNL_CMD_FORCED, // forced by server/console command
+ PNL_DELAYED, // delayed from previous request; can't tell origin
+//only used for 'real_reason' on MPlugin::unload()
+ PNL_PLUGIN, // requested by plugin function call
+ PNL_PLG_FORCED, // forced by plugin function call
+ PNL_RELOAD, // forced unload by reload()
+} PL_UNLOAD_REASON;
+
+// Information plugin provides about itself.
+typedef struct {
+ char *ifvers; // meta_interface version
+ char *name; // full name of plugin
+ char *version; // version
+ char *date; // date
+ char *author; // author name/email
+ char *url; // URL
+ char *logtag; // log message prefix (unused right now)
+ PLUG_LOADTIME loadable; // when loadable
+ PLUG_LOADTIME unloadable; // when unloadable
+} plugin_info_t;
+extern plugin_info_t Plugin_info;
+
+// Plugin identifier, passed to all Meta Utility Functions.
+typedef plugin_info_t* plid_t;
+#define PLID &Plugin_info
+
+#endif /* PLINFO_H */
diff --git a/src/sdk/progdefs.h b/src/sdk/progdefs.h
new file mode 100644
index 0000000..ccf0c45
--- /dev/null
+++ b/src/sdk/progdefs.h
@@ -0,0 +1,224 @@
+/***
+*
+* Copyright (c) 1996-2002, Valve LLC. All rights reserved.
+*
+* This product contains software technology licensed from Id
+* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
+* All Rights Reserved.
+*
+* Use, distribution, and modification of this source code and/or resulting
+* object code is restricted to non-commercial enhancements to products from
+* Valve LLC. All other use, distribution, or modification is prohibited
+* without written permission from Valve LLC.
+*
+****/
+#ifndef PROGDEFS_H
+#define PROGDEFS_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+typedef struct globalvars_s
+{
+ float time;
+ float frametime;
+ float force_retouch;
+ string_t mapname;
+ string_t startspot;
+ float deathmatch;
+ float coop;
+ float teamplay;
+ float serverflags;
+ float found_secrets;
+ vec3_t v_forward;
+ vec3_t v_up;
+ vec3_t v_right;
+ float trace_allsolid;
+ float trace_startsolid;
+ float trace_fraction;
+ vec3_t trace_endpos;
+ vec3_t trace_plane_normal;
+ float trace_plane_dist;
+ struct edict_s *trace_ent;
+ float trace_inopen;
+ float trace_inwater;
+ int trace_hitgroup;
+ int trace_flags;
+ int msg_entity;
+ int cdAudioTrack;
+ int maxClients;
+ int maxEntities;
+ const char *pStringBase;
+
+ void *pSaveData;
+ vec3_t vecLandmarkOffset;
+} globalvars_t;
+
+
+typedef struct entvars_s
+{
+ string_t classname;
+ string_t globalname;
+
+ vec3_t origin;
+ vec3_t oldorigin;
+ vec3_t velocity;
+ vec3_t basevelocity;
+ vec3_t clbasevelocity; // Base velocity that was passed in to server physics so
+ // client can predict conveyors correctly. Server zeroes it, so we need to store here, too.
+ vec3_t movedir;
+
+ vec3_t angles; // Model angles
+ vec3_t avelocity; // angle velocity (degrees per second)
+ vec3_t punchangle; // auto-decaying view angle adjustment
+ vec3_t v_angle; // Viewing angle (player only)
+
+ // For parametric entities
+ vec3_t endpos;
+ vec3_t startpos;
+ float impacttime;
+ float starttime;
+
+ int fixangle; // 0:nothing, 1:force view angles, 2:add avelocity
+ float idealpitch;
+ float pitch_speed;
+ float ideal_yaw;
+ float yaw_speed;
+
+ int modelindex;
+ string_t model;
+
+ int viewmodel; // player's viewmodel
+ int weaponmodel; // what other players see
+
+ vec3_t absmin; // BB max translated to world coord
+ vec3_t absmax; // BB max translated to world coord
+ vec3_t mins; // local BB min
+ vec3_t maxs; // local BB max
+ vec3_t size; // maxs - mins
+
+ float ltime;
+ float nextthink;
+
+ int movetype;
+ int solid;
+
+ int skin;
+ int body; // sub-model selection for studiomodels
+ int effects;
+
+ float gravity; // % of "normal" gravity
+ float friction; // inverse elasticity of MOVETYPE_BOUNCE
+
+ int light_level;
+
+ int sequence; // animation sequence
+ int gaitsequence; // movement animation sequence for player (0 for none)
+ float frame; // % playback position in animation sequences (0..255)
+ float animtime; // world time when frame was set
+ float framerate; // animation playback rate (-8x to 8x)
+ byte controller[4]; // bone controller setting (0..255)
+ byte blending[2]; // blending amount between sub-sequences (0..255)
+
+ float scale; // sprite rendering scale (0..255)
+
+ int rendermode;
+ float renderamt;
+ vec3_t rendercolor;
+ int renderfx;
+
+ float health;
+ float frags;
+ int weapons; // bit mask for available weapons
+ float takedamage;
+
+ int deadflag;
+ vec3_t view_ofs; // eye position
+
+ int button;
+ int impulse;
+
+ struct edict_s *chain; // Entity pointer when linked into a linked list
+ struct edict_s *dmg_inflictor;
+ struct edict_s *enemy;
+ struct edict_s *aiment; // entity pointer when MOVETYPE_FOLLOW
+ struct edict_s *owner;
+ struct edict_s *groundentity;
+
+ int spawnflags;
+ int flags;
+
+ int colormap; // lowbyte topcolor, highbyte bottomcolor
+ int team;
+
+ float max_health;
+ float teleport_time;
+ float armortype;
+ float armorvalue;
+ int waterlevel;
+ int watertype;
+
+ string_t target;
+ string_t targetname;
+ string_t netname;
+ string_t message;
+
+ float dmg_take;
+ float dmg_save;
+ float dmg;
+ float dmgtime;
+
+ string_t noise;
+ string_t noise1;
+ string_t noise2;
+ string_t noise3;
+
+ float speed;
+ float air_finished;
+ float pain_finished;
+ float radsuit_finished;
+
+ struct edict_s *pContainingEntity;
+
+ int playerclass;
+ float maxspeed;
+
+ float fov;
+ int weaponanim;
+
+ int pushmsec;
+
+ int bInDuck;
+ int flTimeStepSound;
+ int flSwimTime;
+ int flDuckTime;
+ int iStepLeft;
+ float flFallVelocity;
+
+ int gamestate;
+
+ int oldbuttons;
+
+ int groupinfo;
+
+ // For mods
+ int iuser1;
+ int iuser2;
+ int iuser3;
+ int iuser4;
+ float fuser1;
+ float fuser2;
+ float fuser3;
+ float fuser4;
+ vec3_t vuser1;
+ vec3_t vuser2;
+ vec3_t vuser3;
+ vec3_t vuser4;
+ struct edict_s *euser1;
+ struct edict_s *euser2;
+ struct edict_s *euser3;
+ struct edict_s *euser4;
+} entvars_t;
+
+
+#endif // PROGDEFS_H