From 5c8880394240482b4b303f56a1864706747e950a Mon Sep 17 00:00:00 2001 From: Twilight Suzuka Date: Tue, 14 Mar 2006 02:54:24 +0000 Subject: [PATCH] New update! 3.1 is liiiive! Error handling: Array now has sufficiently advanced error handling to remove most, if not all, disable_checks. Extention: With the metaprogramming techniques, new types can be added easily. Speed: With the new changes I've made to Judy, the Array module has far exceeded the speed of any traditional datatype --- dlls/arrayx/Array.cpp | 35 + dlls/arrayx/Array.dsp | 237 ++ dlls/arrayx/Array.dsw | 29 + dlls/arrayx/Array.ncb | Bin 0 -> 230400 bytes dlls/arrayx/Array.opt | Bin 0 -> 48640 bytes dlls/arrayx/Array.plg | 96 + dlls/arrayx/BinTrieNativeFunctions.h | 79 + dlls/arrayx/BinTrieNatives.cpp | 57 + dlls/arrayx/CArray.cpp | 87 + dlls/arrayx/CArray.h | 73 + dlls/arrayx/CBaseList.h | 35 + dlls/arrayx/CBaseMap.h | 28 + dlls/arrayx/CBinTrie.cpp | 76 + dlls/arrayx/CBinTrie.h | 52 + dlls/arrayx/CHashtable.h | 81 + dlls/arrayx/CKeytable.cpp | 66 + dlls/arrayx/CKeytable.h | 65 + dlls/arrayx/Capsule.cpp | 261 +++ dlls/arrayx/Capsule.h | 64 + dlls/arrayx/ComboArray.h | 79 + dlls/arrayx/ComboTable.h | 67 + dlls/arrayx/GenericNatives.h | 844 +++++++ dlls/arrayx/Judy.h | 742 +++++++ dlls/arrayx/Judy.lib | Bin 0 -> 256910 bytes dlls/arrayx/JudyEx.h | 50 + dlls/arrayx/JudyExtra.cpp | 225 ++ dlls/arrayx/JudyExtra.h | 20 + dlls/arrayx/JudyIncludes.h | 43 + dlls/arrayx/JudyVar.h | 70 + dlls/arrayx/JudyVec.h | 20 + dlls/arrayx/ListNativeFunctions.h | 114 + dlls/arrayx/ListNatives.cpp | 43 + dlls/arrayx/MapNativeFunctions.h | 94 + dlls/arrayx/MapNatives.cpp | 54 + dlls/arrayx/NativeIncludes.h | 130 ++ dlls/arrayx/amxxmodule.cpp | 3078 ++++++++++++++++++++++++++ dlls/arrayx/amxxmodule.h | 2241 +++++++++++++++++++ dlls/arrayx/moduleconfig.h | 463 ++++ dlls/arrayx/osdefs.h | 60 + 39 files changed, 9858 insertions(+) create mode 100644 dlls/arrayx/Array.cpp create mode 100644 dlls/arrayx/Array.dsp create mode 100644 dlls/arrayx/Array.dsw create mode 100644 dlls/arrayx/Array.ncb create mode 100644 dlls/arrayx/Array.opt create mode 100644 dlls/arrayx/Array.plg create mode 100644 dlls/arrayx/BinTrieNativeFunctions.h create mode 100644 dlls/arrayx/BinTrieNatives.cpp create mode 100644 dlls/arrayx/CArray.cpp create mode 100644 dlls/arrayx/CArray.h create mode 100644 dlls/arrayx/CBaseList.h create mode 100644 dlls/arrayx/CBaseMap.h create mode 100644 dlls/arrayx/CBinTrie.cpp create mode 100644 dlls/arrayx/CBinTrie.h create mode 100644 dlls/arrayx/CHashtable.h create mode 100644 dlls/arrayx/CKeytable.cpp create mode 100644 dlls/arrayx/CKeytable.h create mode 100644 dlls/arrayx/Capsule.cpp create mode 100644 dlls/arrayx/Capsule.h create mode 100644 dlls/arrayx/ComboArray.h create mode 100644 dlls/arrayx/ComboTable.h create mode 100644 dlls/arrayx/GenericNatives.h create mode 100644 dlls/arrayx/Judy.h create mode 100644 dlls/arrayx/Judy.lib create mode 100644 dlls/arrayx/JudyEx.h create mode 100644 dlls/arrayx/JudyExtra.cpp create mode 100644 dlls/arrayx/JudyExtra.h create mode 100644 dlls/arrayx/JudyIncludes.h create mode 100644 dlls/arrayx/JudyVar.h create mode 100644 dlls/arrayx/JudyVec.h create mode 100644 dlls/arrayx/ListNativeFunctions.h create mode 100644 dlls/arrayx/ListNatives.cpp create mode 100644 dlls/arrayx/MapNativeFunctions.h create mode 100644 dlls/arrayx/MapNatives.cpp create mode 100644 dlls/arrayx/NativeIncludes.h create mode 100644 dlls/arrayx/amxxmodule.cpp create mode 100644 dlls/arrayx/amxxmodule.h create mode 100644 dlls/arrayx/moduleconfig.h create mode 100644 dlls/arrayx/osdefs.h diff --git a/dlls/arrayx/Array.cpp b/dlls/arrayx/Array.cpp new file mode 100644 index 00000000..50d83f1e --- /dev/null +++ b/dlls/arrayx/Array.cpp @@ -0,0 +1,35 @@ +#include "amxxmodule.h" +#include "ComboArray.h" + +extern AMX_NATIVE_INFO bintrie_exports[]; +extern AMX_NATIVE_INFO bintrie_usage_exports[]; +extern ComboArray MasterTrie; + +extern AMX_NATIVE_INFO list_exports[]; +extern AMX_NATIVE_INFO list_creation_exports[]; +extern ComboArray MasterList; + +extern AMX_NATIVE_INFO map_exports[]; +extern AMX_NATIVE_INFO map_creation_exports[]; +extern ComboArray MasterMap; + + +void OnAmxxAttach( void ) +{ + MF_AddNatives(bintrie_exports); + MF_AddNatives(bintrie_usage_exports); + + MF_AddNatives(list_exports); + MF_AddNatives(list_creation_exports); + + MF_AddNatives(map_exports); + MF_AddNatives(map_creation_exports); + +} + +void OnAmxxDetach( void ) +{ + MasterTrie.Clear(); + MasterList.Clear(); + MasterMap.Clear(); +} \ No newline at end of file diff --git a/dlls/arrayx/Array.dsp b/dlls/arrayx/Array.dsp new file mode 100644 index 00000000..177627f0 --- /dev/null +++ b/dlls/arrayx/Array.dsp @@ -0,0 +1,237 @@ +# Microsoft Developer Studio Project File - Name="Array" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=Array - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Array.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Array.mak" CFG="Array - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Array - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "Array - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Array - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 + +!ELSEIF "$(CFG)" == "Array - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Array - Win32 Release" +# Name "Array - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\Array.cpp +# End Source File +# Begin Source File + +SOURCE=.\BinTrieNatives.cpp +# End Source File +# Begin Source File + +SOURCE=.\Capsule.cpp +# End Source File +# Begin Source File + +SOURCE=.\CArray.cpp +# End Source File +# Begin Source File + +SOURCE=.\CBinTrie.cpp +# End Source File +# Begin Source File + +SOURCE=.\CKeytable.cpp +# End Source File +# Begin Source File + +SOURCE=.\JudyExtra.cpp +# End Source File +# Begin Source File + +SOURCE=.\ListNatives.cpp +# End Source File +# Begin Source File + +SOURCE=.\MapNatives.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\BinTrieNativeFunctions.h +# End Source File +# Begin Source File + +SOURCE=.\Capsule.h +# End Source File +# Begin Source File + +SOURCE=.\CArray.h +# End Source File +# Begin Source File + +SOURCE=.\CBaseList.h +# End Source File +# Begin Source File + +SOURCE=.\CBaseMap.h +# End Source File +# Begin Source File + +SOURCE=.\CBinTrie.h +# End Source File +# Begin Source File + +SOURCE=.\CHashtable.h +# End Source File +# Begin Source File + +SOURCE=.\CKeytable.h +# End Source File +# Begin Source File + +SOURCE=.\ComboArray.h +# End Source File +# Begin Source File + +SOURCE=.\ComboTable.h +# End Source File +# Begin Source File + +SOURCE=.\GenericNatives.h +# End Source File +# Begin Source File + +SOURCE=.\JudyIncludes.h +# End Source File +# Begin Source File + +SOURCE=.\MapNativeFunctions.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\amxxmodule.cpp +# End Source File +# Begin Source File + +SOURCE=.\amxxmodule.h +# End Source File +# Begin Source File + +SOURCE=.\Judy.h +# End Source File +# Begin Source File + +SOURCE=.\JudyEx.h +# End Source File +# Begin Source File + +SOURCE=.\JudyExtra.h +# End Source File +# Begin Source File + +SOURCE=.\JudyVar.h +# End Source File +# Begin Source File + +SOURCE=.\JudyVec.h +# End Source File +# Begin Source File + +SOURCE=.\ListNativeFunctions.h +# End Source File +# Begin Source File + +SOURCE=.\moduleconfig.h +# End Source File +# Begin Source File + +SOURCE=.\NativeIncludes.h +# End Source File +# Begin Source File + +SOURCE=.\osdefs.h +# End Source File +# Begin Source File + +SOURCE=.\Judy.lib +# End Source File +# End Group +# End Target +# End Project diff --git a/dlls/arrayx/Array.dsw b/dlls/arrayx/Array.dsw new file mode 100644 index 00000000..b670e501 --- /dev/null +++ b/dlls/arrayx/Array.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Array"=".\Array.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/dlls/arrayx/Array.ncb b/dlls/arrayx/Array.ncb new file mode 100644 index 0000000000000000000000000000000000000000..fc670dbf0e910f94f273ca8f0aa76b872d412214 GIT binary patch literal 230400 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 C;Mjox literal 0 HcmV?d00001 diff --git a/dlls/arrayx/Array.opt b/dlls/arrayx/Array.opt new file mode 100644 index 0000000000000000000000000000000000000000..8fd4bb9850d15fd0642e250d1569a69eee0d55d6 GIT binary patch literal 48640 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 literal 0 HcmV?d00001 diff --git a/dlls/arrayx/Array.plg b/dlls/arrayx/Array.plg new file mode 100644 index 00000000..e854a47d --- /dev/null +++ b/dlls/arrayx/Array.plg @@ -0,0 +1,96 @@ + + +
+

Build Log

+

+--------------------Configuration: Array - Win32 Release-------------------- +

+

Command Lines

+Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPC49.tmp" with contents +[ +/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ARRAY_EXPORTS" /FR"Release/" /Fp"Release/Array.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\Array.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\BinTrieNatives.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\Capsule.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\CArray.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\CBinTrie.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\CKeytable.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\ListNatives.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\MapNatives.cpp" +"C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\amxxmodule.cpp" +] +Creating command line "cl.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPC49.tmp" +Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPC4A.tmp" with contents +[ +kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"Release/Array.pdb" /machine:I386 /out:"Release/Array.dll" /implib:"Release/Array.lib" +".\Release\Array.obj" +".\Release\BinTrieNatives.obj" +".\Release\Capsule.obj" +".\Release\CArray.obj" +".\Release\CBinTrie.obj" +".\Release\CKeytable.obj" +".\Release\JudyExtra.obj" +".\Release\ListNatives.obj" +".\Release\MapNatives.obj" +".\Release\amxxmodule.obj" +".\Judy.lib" +] +Creating command line "link.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPC4A.tmp" +

Output Window

+Compiling... +Array.cpp +BinTrieNatives.cpp +Capsule.cpp +CArray.cpp +CBinTrie.cpp +CKeytable.cpp +JudyExtra.cpp +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(8) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(15) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(40) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(75) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(80) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(83) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(103) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(107) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(110) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(133) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(147) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(152) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(155) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(170) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(178) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(186) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(189) : warning C4101: 'e' : unreferenced local variable +C:\Documents and Settings\Edward\Desktop\module\Judy Test\Array\JudyExtra.cpp(217) : warning C4101: 'e' : unreferenced local variable +ListNatives.cpp +MapNatives.cpp +amxxmodule.cpp +Linking... + Creating library Release/Array.lib and object Release/Array.exp +LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library +Creating temporary file "C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPC4E.tmp" with contents +[ +/nologo /o"Release/Array.bsc" +".\Release\Array.sbr" +".\Release\BinTrieNatives.sbr" +".\Release\Capsule.sbr" +".\Release\CArray.sbr" +".\Release\CBinTrie.sbr" +".\Release\CKeytable.sbr" +".\Release\JudyExtra.sbr" +".\Release\ListNatives.sbr" +".\Release\MapNatives.sbr" +".\Release\amxxmodule.sbr"] +Creating command line "bscmake.exe @C:\DOCUME~1\Edward\LOCALS~1\Temp\RSPC4E.tmp" +Creating browse info file... +

Output Window

+ + + +

Results

+Array.dll - 0 error(s), 19 warning(s) +
+ + diff --git a/dlls/arrayx/BinTrieNativeFunctions.h b/dlls/arrayx/BinTrieNativeFunctions.h new file mode 100644 index 00000000..03beacea --- /dev/null +++ b/dlls/arrayx/BinTrieNativeFunctions.h @@ -0,0 +1,79 @@ +#ifndef _bintrie_NATIVE_FUNC_INC_H +#define _bintrie_NATIVE_FUNC_INC_H + +#define JUDY_GLUE_FUNC( x , y ) x ## y + +#define JUDY_GLUE_STR( x, y ) #x#y + +#define JUDY_MASTER_EDIT_FUNCTIONS +#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( bintrie , _clear ) +#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( bintrie , _clear ) + +#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( bintrie , _delete ) +#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( bintrie , _delete ) + +#define JUDY_MASTER_IO_FUNCTIONS + +#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( bintrie , _save ) +#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( bintrie , _save ) +#define JUDY_SAVE_FUNC(bin,file) JudySaveBinTrie(bin , file ) + +#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( bintrie , _load ) +#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( bintrie , _load ) +#define JUDY_LOAD_FUNC(bin, file) JudyLoadBinTrie(bin , file ) + +#define JUDY_MASTER_AMOUNT_FUNCTIONS +#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _count ) +#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( bintrie , _count ) + +#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _bycount ) +#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _bycount ) + +#define JUDY_SLAVE_AMOUNT_FUNCTIONS + +#define JUDY_SLAVE_COUNT_FUNC JUDY_GLUE_FUNC( bintrie , _size ) +#define JUDY_SLAVE_COUNT_STR JUDY_GLUE_STR ( bintrie , _size ) + +#define JUDY_SLAVE_BYCOUNT_FUNC JUDY_GLUE_FUNC( bintrie , _get_nth ) +#define JUDY_SLAVE_BYCOUNT_STR JUDY_GLUE_STR ( bintrie , _get_nth ) + +#define JUDY_SLAVE_EDIT_FUNCTIONS + +#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( bintrie , _memory ) +#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( bintrie , _memory ) + +#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( bintrie , _isfilled ) +#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( bintrie , _isfilled ) + +#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _isempty ) +#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( bintrie , _isempty ) + +#define JUDY_SLAVE_REMOVE_FUNC JUDY_GLUE_FUNC( bintrie , _remove ) +#define JUDY_SLAVE_REMOVE_STR JUDY_GLUE_STR ( bintrie , _remove ) + +#define JUDY_SLAVE_SEARCH_FUNCTIONS +#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( bintrie , _first ) +#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( bintrie , _last ) + +#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( bintrie , _first ) +#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( bintrie , _last ) + +#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( bintrie , _next ) +#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( bintrie , _prev ) + +#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( bintrie , _next ) +#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( bintrie , _prev ) + +#define JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS +#define JUDY_SLAVE_FIRSTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _firstempty ) +#define JUDY_SLAVE_LASTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _lastempty ) + +#define JUDY_SLAVE_FIRSTEMPTY_STR JUDY_GLUE_STR ( bintrie , _firstempty ) +#define JUDY_SLAVE_LASTEMPTY_STR JUDY_GLUE_STR ( bintrie , _lastempty ) + +#define JUDY_SLAVE_NEXTEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _nextempty ) +#define JUDY_SLAVE_PREVEMPTY_FUNC JUDY_GLUE_FUNC( bintrie , _prevempty ) + +#define JUDY_SLAVE_NEXTEMPTY_STR JUDY_GLUE_STR ( bintrie , _nextempty ) +#define JUDY_SLAVE_PREVEMPTY_STR JUDY_GLUE_STR ( bintrie , _prevempty ) +#endif \ No newline at end of file diff --git a/dlls/arrayx/BinTrieNatives.cpp b/dlls/arrayx/BinTrieNatives.cpp new file mode 100644 index 00000000..8224dd49 --- /dev/null +++ b/dlls/arrayx/BinTrieNatives.cpp @@ -0,0 +1,57 @@ +#include "CBinTrie.h" + +#define KEY_TYPE cell +#define DYNAMIC_UNIT_TYPE BinTrie +#define STORAGE_TYPE cell +#define MASTER_NAME MasterTrie +#define EXPORT_NAME bintrie_exports + +#define SEARCH_ERROR_OFFSET 0 + +#define GET_KEY(params, num) params[num] +#define SET_KEY(stuff, parameter) stuff + +#include "BinTrieNativeFunctions.h" +#include "NativeIncludes.h" + +static cell AMX_NATIVE_CALL bintrie_create(AMX *amx,cell *params) +{ + DTYPE* Unit; + M_ITYPE Index = params[1]; + + JUDY_CREATE_INDEX(MNAME,Unit,BinTrie,Index); + return Index; +} + +static cell AMX_NATIVE_CALL bintrie_set(AMX *amx,cell *params) +{ + DTYPE* Unit = NULL; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + bool Value = (params[3] != NULL); + + try { return Unit->Set(Indice, Value ); } + JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Set Function "); +} + +static cell AMX_NATIVE_CALL bintrie_get(AMX *amx,cell *params) +{ + DTYPE* Unit = NULL; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + + try { return Unit->Get(Indice ); } + JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Get Function "); +} + + +AMX_NATIVE_INFO bintrie_usage_exports[] = +{ + { "bintrie_create", bintrie_create }, + { "bintrie_set", bintrie_set }, + { "bintrie_get", bintrie_get }, + + { NULL, NULL } +}; \ No newline at end of file diff --git a/dlls/arrayx/CArray.cpp b/dlls/arrayx/CArray.cpp new file mode 100644 index 00000000..2285e4d3 --- /dev/null +++ b/dlls/arrayx/CArray.cpp @@ -0,0 +1,87 @@ +#include "CArray.h" + +void Array::ThrowSearchError(char* type) +{ + char value[50]; + sprintf(value,"Function attempted to search %s: Judy returned NULL value", type); + + throw JudyEx(value,false); +} + +void Array::ThrowIndexError( cell index, bool disable_check ) +{ + if(disable_check == true) return; + + char error[50]; + sprintf(error,"Index %i is not set.",index); + + throw JudyEx(error,true); +} + +cell Array::First( cell Start) +{ + PPvoid_t success = JudyLFirst(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:First"); + + return Start; +} + +cell Array::FirstEmpty( cell Start) +{ + cell success = JudyLFirstEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:FirstEmpty"); + return Start; +} + +cell Array::Next( cell Start) +{ + PPvoid_t success = JudyLNext(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Next"); + + return Start; +} + +cell Array::NextEmpty( cell Start) +{ + cell success = JudyLNextEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:NextEmpty"); + return Start; +} + +cell Array::Prev( cell Start) +{ + PPvoid_t success = JudyLPrev(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Prev"); + + return Start; +} + +cell Array::PrevEmpty( cell Start) +{ + cell success = JudyLPrevEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:PrevEmpty"); + return Start; +} + +cell Array::Last( cell Start) +{ + PPvoid_t success = JudyLLast(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Last"); + + return Start; +} + +cell Array::LastEmpty( cell Start) +{ + cell success = JudyLLastEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:LastEmpty"); + return Start; +} + +cell Array::ByCount(cell n, cell Start) +{ + PPvoid_t success = JudyLByCount(Table, n, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Nth"); + + return Start; +} \ No newline at end of file diff --git a/dlls/arrayx/CArray.h b/dlls/arrayx/CArray.h new file mode 100644 index 00000000..8af5881c --- /dev/null +++ b/dlls/arrayx/CArray.h @@ -0,0 +1,73 @@ +#ifndef _ARRAYCLASS_H +#define _ARRAYCLASS_H + +#include "JudyIncludes.h" +#include "CBaseList.h" +#include "JudyExtra.h" +//#include + +class Array: public CBaseList +{ +private: + Pvoid_t Table; + + void ThrowIndexError( cell index, bool disable_check = false ); + void ThrowSearchError(char* msg); + +public: + Array() { Table = NULL; } + ~Array() { Clear(); } + + Word_t Clear() { JudyClearList(this); return JudyLFreeArray(&Table, PJE0); } + Word_t MemoryUsed() { return JudyLMemUsed(Table); } + + int Delete(cell Key) { delete Get(Key,true); return JudyLDel(&Table, Key, PJE0 ); } + + void Set(cell Index, Pvoid_t value, bool disable_check) + { + PPvoid_t PValue = JudyLIns(&Table, Index,PJE0); + *PValue = value; + } + + Pvoid_t Get(cell Index, bool disable_check = false) + { + PPvoid_t PValue = JudyLGet(Table, Index, PJE0); + if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; } + + return *PValue; + } + + template + void Set(cell Index, Type value) + { + PPvoid_t PValue = JudyLIns(&Table, Index,PJE0); + *PValue = reinterpret_cast(value); + } + + template + Type Get(cell Index, Type example, bool disable_check = false) + { + PPvoid_t PValue = JudyLGet(Table, Index, PJE0); + if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; } + + return (Type)(*PValue); + } + + cell First(cell Start = 0); + cell Next(cell Start = 0); + cell Prev(cell Start = -1); + cell Last(cell Start = -1); + + cell FirstEmpty(cell Start = 0); + cell NextEmpty(cell Start = 0); + cell PrevEmpty(cell Start = -1); + cell LastEmpty(cell Start = -1); + + cell ByCount(cell n, cell Start = 0); + cell Count(cell Start = 0, cell Stop = -1) { return JudyLCount(Table, Start, Stop, PJE0); } + + bool IsFilled(cell Index) { return ( (Get(Index, true ) != NULL) ? true : false); } + bool IsEmpty(cell Index) { return ( (Get(Index, true ) == NULL) ? true : false); } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/CBaseList.h b/dlls/arrayx/CBaseList.h new file mode 100644 index 00000000..a9ce4646 --- /dev/null +++ b/dlls/arrayx/CBaseList.h @@ -0,0 +1,35 @@ +#ifndef _BASE_ARRAYCLASS_H +#define _BASE_ARRAYCLASS_H + +#include "JudyIncludes.h" + +class CBaseList +{ +public: + virtual Word_t Clear() =0; + virtual Word_t MemoryUsed() =0; + + virtual int Delete(cell Key) =0; + + virtual void Set(cell Index, Pvoid_t value, bool disable_check = false) =0; + + virtual Pvoid_t Get(cell Index, bool disable_check = false) =0; + + virtual cell First(cell Start = 0) =0; + virtual cell Next(cell Start = 0) =0; + virtual cell Prev(cell Start = -1) =0; + virtual cell Last(cell Start = -1) =0; + + virtual cell FirstEmpty(cell Start = 0) =0; + virtual cell NextEmpty(cell Start = 0) =0; + virtual cell PrevEmpty(cell Start = -1) =0; + virtual cell LastEmpty(cell Start = -1) =0; + + virtual cell ByCount(cell n, cell Start = 0) =0; + virtual cell Count(cell Start = 0, cell Stop = -1) =0; + + virtual bool IsFilled(cell Index) =0; + virtual bool IsEmpty(cell Index) =0; +}; + +#endif diff --git a/dlls/arrayx/CBaseMap.h b/dlls/arrayx/CBaseMap.h new file mode 100644 index 00000000..ef0b6a5c --- /dev/null +++ b/dlls/arrayx/CBaseMap.h @@ -0,0 +1,28 @@ +#ifndef _BASE_MAPCLASS_H +#define _BASE_MAPCLASS_H + +#include "JudyIncludes.h" + +class CBaseMap +{ +public: + virtual Word_t Clear() =0; + virtual Word_t MemoryUsed() =0; + + virtual int Delete(char* Key) =0; + + virtual void Set(char* Index, Pvoid_t value, bool disable_check = false) =0; + + virtual Pvoid_t Get(char* Index, bool disable_check = false) =0; + + virtual char* First(char* Start = "") =0; + virtual char* Next(char* Start) =0; + virtual char* Prev(char* Start) =0; + virtual char* Last(char* Start) =0; + + virtual bool IsFilled(char* Index) =0; + virtual bool IsEmpty(char* Index) =0; +}; + +#endif + diff --git a/dlls/arrayx/CBinTrie.cpp b/dlls/arrayx/CBinTrie.cpp new file mode 100644 index 00000000..33e712c8 --- /dev/null +++ b/dlls/arrayx/CBinTrie.cpp @@ -0,0 +1,76 @@ +#include "CBinTrie.h" + +void BinTrie::ThrowSearchError(char* type) +{ + char value[50]; + sprintf(value,"Function attempted to search %s: Judy returned NULL value", type); + + throw JudyEx (value,false); +} + +cell BinTrie::First( cell Start) +{ + cell success = Judy1First(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:First"); + return Start; +} + +cell BinTrie::FirstEmpty( cell Start) +{ + cell success = Judy1FirstEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:FirstEmpty"); + return Start; +} + +cell BinTrie::Next( cell Start) +{ + cell success = Judy1Next(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Next"); + + return Start; +} + +cell BinTrie::NextEmpty( cell Start) +{ + cell success = Judy1NextEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:NextEmpty"); + return Start; +} + +cell BinTrie::Prev( cell Start) +{ + cell success = Judy1Prev(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Prev"); + + return Start; +} + +cell BinTrie::PrevEmpty( cell Start) +{ + cell success = Judy1PrevEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:PrevEmpty"); + return Start; +} + +cell BinTrie::Last( cell Start) +{ + cell success = Judy1Last(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Last"); + + return Start; +} + +cell BinTrie::LastEmpty( cell Start) +{ + cell success = Judy1LastEmpty(Table, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:LastEmpty"); + return Start; +} + +cell BinTrie::ByCount(cell n, cell Start) +{ + cell success = Judy1ByCount(Table, n, reinterpret_cast(&Start), PJE0); + if (success == NULL) ThrowSearchError("Type:Nth"); + + return Start; +} \ No newline at end of file diff --git a/dlls/arrayx/CBinTrie.h b/dlls/arrayx/CBinTrie.h new file mode 100644 index 00000000..a1d9e3fc --- /dev/null +++ b/dlls/arrayx/CBinTrie.h @@ -0,0 +1,52 @@ +#ifndef _BINTRIECLASS_H +#define _BINTRIECLASS_H + +#include "JudyIncludes.h" +//#include + +class BinTrie +{ +private: + Pvoid_t Table; + + void ThrowSearchError(char* msg); + +public: + BinTrie() { Table = NULL; } + ~BinTrie() { Judy1FreeArray(&Table, PJE0); } + + Word_t Clear() { return Judy1FreeArray(&Table, PJE0); } + Word_t MemoryUsed() { return Judy1MemUsed(Table); } + + cell Delete(cell Key) { return Judy1Unset(&Table, Key, PJE0 ); } + + cell Set(cell Index, bool val) + { + if(val == false) return Delete(Index); + else return Judy1Set(&Table, Index,PJE0); + } + + cell Get(cell Index) + { + cell PValue = Judy1Test(Table, Index, PJE0); + return PValue; + } + + cell First(cell Start = 0); + cell Next(cell Start = 0); + cell Prev(cell Start = -1); + cell Last(cell Start = -1); + + cell FirstEmpty(cell Start = 0); + cell NextEmpty(cell Start = 0); + cell PrevEmpty(cell Start = -1); + cell LastEmpty(cell Start = -1); + + cell ByCount(cell n, cell Start); + cell Count(cell Start = 0, cell Stop = -1) { return Judy1Count(Table, Start, Stop, PJE0); } + + bool IsFilled(cell Index) { return ( (Get(Index )) ? true : false); } + bool IsEmpty(cell Index) { return ( (Get(Index )) ? true : false); } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/CHashtable.h b/dlls/arrayx/CHashtable.h new file mode 100644 index 00000000..5fee0a39 --- /dev/null +++ b/dlls/arrayx/CHashtable.h @@ -0,0 +1,81 @@ +#ifndef _HASHCLASS_INCLUDED +#define _HASHCLASS_INCLUDED + +#include "JudyIncludes.h" +#include "CBaseMap.h" +//#include + +class Hashtable: public CBaseMap +{ +private: + Pvoid_t Table; + +public: + Hashtable() { Table = NULL; } + ~Hashtable() { Clear(); } + + Word_t Clear() { return JudyHSFreeArray(&Table, PJE0); } + Word_t MemoryUsed() { return JudyLMemUsed(Table); } + + int Delete(char* Key) { delete Get(Key,true); return JudyHSDel(&Table, Key, strlen(Key), PJE0 ); } + + void Set(char* Index, Pvoid_t value, bool disable_check) + { + int Len = strlen(Index) + 1; + PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0); + *PValue = value; + } + + Pvoid_t Get(char* Index, bool disable_check = false) + { + PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1); + if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; } + + return *PValue; + } + + template + void Set(char* Index, Type value) + { + int Len = strlen(Index) + 1; + PPvoid_t PValue = JudyHSIns(&Table, Index, Len, PJE0); + *PValue = reinterpret_cast(value); + } + + template + Type Get(char* Index, Type example, bool disable_check = false) + { + PPvoid_t PValue = JudyHSGet(Table, Index, strlen(Index)+1); + if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; } + + return (Type)(*PValue); + } + + char* First( char* Start = "") { ThrowSearchError(); return (char*)NULL; } + char* Next( char* Start = "") { ThrowSearchError(); return (char*)NULL; } + char* Prev( char* Start) { ThrowSearchError(); return (char*)NULL; } + char* Last( char* Start) { ThrowSearchError(); return (char*)NULL; } + + bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false);} + bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false);} + +protected: + void ThrowIndexError( char* index, bool disable_check = false ) + { + if(disable_check == true) return; + + char value[100]; + sprintf(value,"Function attempted to read non existant index %s", index ); + + throw JudyEx(value, true); + } + void ThrowSearchError( void ) + { + char value[50]; + sprintf(value,"Function attempted to search HashTable!: Invalid action!"); + + throw JudyEx(value,true); + } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/CKeytable.cpp b/dlls/arrayx/CKeytable.cpp new file mode 100644 index 00000000..43f70c17 --- /dev/null +++ b/dlls/arrayx/CKeytable.cpp @@ -0,0 +1,66 @@ +#include "CKeytable.h" + +void Keytable::ThrowIndexError( char* index, bool disable_check = false ) +{ + if(disable_check == true) return; + + char error[50]; + sprintf(error,"Index %s is not set.",index); + + throw JudyEx(error,true); +} + +void Keytable::ThrowSearchError(char* type) +{ + char value[50]; + sprintf(value,"Function attempted to search %s: Judy returned NULL value", type); + + throw JudyEx(value,false); +} + +char* Keytable::First( char* Start) +{ + PPvoid_t index = JudySLFirst(Table, Start, PJE0); + if (index == NULL) + { + sprintf(Start,"dne"); + ThrowSearchError("Type:First"); + } + + return Start; +} + +char* Keytable::Next( char* Start) +{ + PPvoid_t index = JudySLNext(Table, Start, PJE0); + if (index == NULL) + { + sprintf(Start,"dne"); + ThrowSearchError("Type:Next"); + } + return Start; +} + +char* Keytable::Prev( char* Start) +{ + PPvoid_t index = JudySLPrev(Table, Start, PJE0); + if (index == NULL) + { + sprintf(Start,"dne"); + ThrowSearchError("Type:Prev"); + } + + return Start; +} + +char* Keytable::Last( char* Start) +{ + PPvoid_t index = JudySLLast(Table, Start, PJE0); + if (index == NULL) + { + sprintf(Start,"dne"); + ThrowSearchError("Type:Last"); + } + + return Start; +} \ No newline at end of file diff --git a/dlls/arrayx/CKeytable.h b/dlls/arrayx/CKeytable.h new file mode 100644 index 00000000..ba649561 --- /dev/null +++ b/dlls/arrayx/CKeytable.h @@ -0,0 +1,65 @@ +#ifndef _KEYCLASS_INCLUDED +#define _KEYCLASS_INCLUDED + +#include "JudyIncludes.h" +#include "CBaseMap.h" +#include "JudyExtra.h" +//#include + +class Keytable: public CBaseMap +{ +private: + Pvoid_t Table; + + void ThrowSearchError(char* type); + void ThrowIndexError( char* index, bool disable_check); + +public: + Keytable() { Table = NULL; } + ~Keytable() { Clear(); } + + Word_t Clear() { JudyClearMap(this); return JudySLFreeArray(&Table, PJE0); } + Word_t MemoryUsed() { return JudyLMemUsed(Table); } + + int Delete(char* Key) { delete Get(Key,true); return JudySLDel(&Table, Key, PJE0 ); } + + void Set(char* Index, Pvoid_t value, bool disable_check) + { + PPvoid_t PValue = JudySLIns(&Table, Index,PJE0); + *PValue = value; + } + + Pvoid_t Get(char* Index, bool disable_check = false) + { + PPvoid_t PValue = JudySLGet(Table, Index, PJE0); + if(PValue == NULL) { ThrowIndexError(Index, disable_check); return NULL; } + + return *PValue; + } + + template + void Set(char* Index, Type value) + { + PPvoid_t PValue = JudySLIns(&Table, Index,PJE0); + *PValue = reinterpret_cast(value); + } + + template + Type Get(char* Index, Type example, bool disable_check = false) + { + PPvoid_t PValue = JudySLGet(Table, Index, PJE0); + if(PValue == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; } + + return (Type)*PValue; + } + + char* First(char* Start = ""); + char* Next(char* Start = ""); + char* Prev(char* Start = ""); + char* Last(char* Start = ""); + + bool IsFilled(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false); } + bool IsEmpty(char* Index) { return ( (Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false); } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/Capsule.cpp b/dlls/arrayx/Capsule.cpp new file mode 100644 index 00000000..c58eff52 --- /dev/null +++ b/dlls/arrayx/Capsule.cpp @@ -0,0 +1,261 @@ +#include "Capsule.h" + +const char* capsule_types[] = +{ + "-NO VALUE-", + "BOOLEAN", + "INTEGER", + "FLOAT", + "VECTOR", + "STRING" +}; + +void Capsule::ThrowTypeError(cell get_type) +{ + char ValStr[15]; + GetAsStr(ValStr); + + char value[100]; + sprintf(value,"Function attempted to read NON-%s value, actual type is: %s, actual value is: %s", capsule_types[get_type], capsule_types[type], ValStr ); + + throw JudyEx(value, true); +} + +bool Capsule::CheckEmpty(bool clear) +{ + bool empty = ( data == NULL ); + + if(empty != true && clear == true) Clear(); + return empty; +} + +void Capsule::Clear() +{ + //This function intelligently creates a pointer x, + //which will be of correct type and then deletes it. + + switch (type) + { + case capsule_type_flo: + { + REAL *real_val = reinterpret_cast(data); + delete real_val; + + break; + } + case capsule_type_vec: + { + JudyVec *vector_val = reinterpret_cast(data); + delete vector_val; + + break; + } + case capsule_type_str: + { + char *char_val = reinterpret_cast(data); + delete char_val; + + break; + } + } + + data = NULL; //Null the address as well. (Used for ints too.) +} + +bool Capsule::GetBool( void ) +{ + if (type != capsule_type_bool) ThrowTypeError(capsule_type_bool); + + return reinterpret_cast(data); +} + +void Capsule::SetBool(bool Value) +{ + CheckEmpty(true); + type = capsule_type_bool; + data = reinterpret_cast(Value); +}; + +cell Capsule::GetInt( void ) +{ + if (type != capsule_type_int) ThrowTypeError(capsule_type_int); + + return reinterpret_cast(data); +} + +void Capsule::SetInt(cell Value) +{ + CheckEmpty(true); + type = capsule_type_int; + data = reinterpret_cast(Value); +}; + +REAL Capsule::GetFlo( void ) +{ + if (type != capsule_type_flo) ThrowTypeError(capsule_type_flo); + + return *reinterpret_cast(data); +} + +void Capsule::SetFlo(REAL Value) +{ + CheckEmpty(true); + type = capsule_type_flo; + data = new REAL(Value); +}; + +const JudyVec* Capsule::GetVec( void ) +{ + if (type != capsule_type_vec) ThrowTypeError(capsule_type_vec); + + return reinterpret_cast(data); +} + +void Capsule::SetVec(JudyVec* Value) +{ + CheckEmpty(true); + type = capsule_type_vec; + data = reinterpret_cast(Value); +} + +const char* Capsule::GetStr( void ) +{ + if (type != capsule_type_str) ThrowTypeError(capsule_type_str); + + return reinterpret_cast(data); +} + +void Capsule::SetStr(char* Value) +{ + CheckEmpty(true); + type = capsule_type_str; + + char *string_val = new char[strlen(Value)+1]; + strcpy(string_val,Value); + + data = reinterpret_cast(string_val); +} + +void Capsule::GetAsStr(char* value) +{ + switch (type) + { + case capsule_type_bool: + sprintf(value, "%i",(cell)GetBool()); + break; + case capsule_type_int: + sprintf(value, "%d", GetInt() ); + break; + case capsule_type_flo: + sprintf(value, "%f", GetFlo() ); + break; + case capsule_type_vec: + sprintf(value, "{%f,%f,%f}", GetVec()->first, GetVec()->second, GetVec()->third); + break; + case capsule_type_str: + sprintf(value, "\"%s\"", GetStr() ); + break; + default: + sprintf(value, "-NO VALUE-"); + } +} + +void Capsule::Save(FILE* capsuleDB) +{ + fwrite(&type,sizeof(char),1,capsuleDB); + + switch(type) + { + case capsule_type_none: { break; } + case capsule_type_bool: { bool var = GetBool(); fwrite(&var, sizeof(bool), 1, capsuleDB); break; } + case capsule_type_int: { cell var = GetInt(); fwrite(&var, sizeof(cell), 1, capsuleDB); break; } + case capsule_type_flo: { fwrite(reinterpret_cast(GetData()), sizeof(REAL), 1, capsuleDB); break; } + case capsule_type_str: + { + const char* str = GetStr(); + size_t len = strlen(str); + fwrite(&len,sizeof(size_t), 1, capsuleDB); + fwrite(&str, sizeof(char), len, capsuleDB); + + break; + } + case capsule_type_vec: + { + const JudyVec* buffer = GetVec(); + fwrite(buffer, sizeof(JudyVec), 1, capsuleDB); + + break; + } + default: + { + char value[20]; + sprintf(value,"Invalid type found!"); + + throw JudyEx(value, true); + break; + } + }; +} + +void Capsule::Load(FILE* capsuleDB) +{ + fread(&type, sizeof(char), 1, capsuleDB); + + switch(type) + { + case capsule_type_none: { CheckEmpty(true); break; } + case capsule_type_bool: + { + bool value = false; + fread(&value, sizeof(bool), 1, capsuleDB); + SetBool(value); + + break; + } + case capsule_type_int: + { + cell value = NULL; + fread(&value, sizeof(cell), 1, capsuleDB); + SetInt(value); + + break; + } + case capsule_type_flo: + { + REAL value = NULL; + fread(&value, sizeof(REAL), 1, capsuleDB); + SetFlo(value); + + break; + } + case capsule_type_str: + { + size_t length; + fread(&length, sizeof(size_t), 1, capsuleDB); + + char* value = new char[length+1]; + fgets(value, length+1, capsuleDB); + + SetStr(value); + delete(value); + + break; + } + case capsule_type_vec: + { + JudyVec* value = new JudyVec(NULL,NULL,NULL); + fread(value, sizeof(JudyVec), 1, capsuleDB); + + SetVec(value); + + break; + } + default: + { + char value[20]; + sprintf(value,"Invalid type found: %i",(int)type); + + throw JudyEx(value, true); + } + }; +} \ No newline at end of file diff --git a/dlls/arrayx/Capsule.h b/dlls/arrayx/Capsule.h new file mode 100644 index 00000000..9241ab9b --- /dev/null +++ b/dlls/arrayx/Capsule.h @@ -0,0 +1,64 @@ +#ifndef _JUDYCAP_INCLUDED +#define _JUDYCAP_INCLUDED + +#include "JudyIncludes.h" + +enum +{ + capsule_type_none, + capsule_type_bool, + capsule_type_int, + capsule_type_flo, + capsule_type_vec, + capsule_type_str +}; + +extern const char* capsule_types[]; + +class Capsule +{ +private: + Pvoid_t data; + char type; + +protected: + void Clear( void ); + void ThrowTypeError(cell get_type); + +public: + Capsule() { data = NULL; type = capsule_type_none;} + ~Capsule() { Clear(); } + + Capsule(bool set) { SetBool(set); } + Capsule(cell set) { SetInt(set); } + Capsule(REAL set) { SetFlo(set); } + Capsule(JudyVec* set) { SetVec(set); } + Capsule(char* set) { SetStr(set); } + + bool GetBool( void ); + void SetBool(bool set); + + cell GetInt( void ); + void SetInt(cell set); + + REAL GetFlo( void ); + void SetFlo(REAL set); + + const JudyVec* GetVec( void ); + void SetVec(JudyVec* set); + + const char* GetStr( void ); + void SetStr(char* set); + + void GetAsStr(char* value); + + void Load(FILE* db); + void Save(FILE* db); + + bool CheckEmpty(bool clear); + + Pvoid_t GetData( void ) { return data; } + char GetType( void ) { return type; } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/ComboArray.h b/dlls/arrayx/ComboArray.h new file mode 100644 index 00000000..60cb9d4e --- /dev/null +++ b/dlls/arrayx/ComboArray.h @@ -0,0 +1,79 @@ +#ifndef _COMBOARRAY_INCLUDED +#define _COMBOARRAY_INCLUDED + +#include "CBinTrie.h" +#include "CArray.h" +#include "CBaseList.h" + +class ComboArray: public CBaseList +{ +private: + BinTrie MasterBin; + Array MasterArray; + +public: + ComboArray() {} + ~ComboArray() { Clear(); } + + Word_t Clear() { return (MasterBin.Clear() + MasterArray.Clear() ); } + Word_t MemoryUsed() { return (MasterBin.MemoryUsed() + MasterArray.MemoryUsed() ); } + + int Delete(cell Key) { return (MasterBin.Delete(Key) + MasterArray.Delete(Key) ); } + + void Set(cell Index, Pvoid_t value, bool disable_check) + { + MasterBin.Set(Index, true); + MasterArray.Set(Index, value, disable_check); + } + + Pvoid_t Get(cell Index, bool disable_check = false) + { + if(MasterBin.Get(Index) == NULL) { ThrowIndexError(Index, disable_check); return NULL; } + + return MasterArray.Get(Index); + } + + template + void Set(cell Index, Type value) + { + MasterBin.Set(Index, true); + MasterArray.Set(Index, value); + } + + template + Type Get(cell Index, Type example, bool disable_check = false) + { + if(MasterBin.Get(Index) == NULL) { ThrowIndexError(Index, disable_check); return (Type)NULL; } + + return MasterArray.Get(Index,example); + } + + cell First(cell Start = 0) { return MasterBin.First(Start); } + cell Next(cell Start = 0) { return MasterBin.Next(Start); } + cell Prev(cell Start = -1) { return MasterBin.Prev(Start); } + cell Last(cell Start = -1) { return MasterBin.Last(Start); } + + cell FirstEmpty(cell Start = 0) { return MasterBin.FirstEmpty(Start); } + cell NextEmpty(cell Start = 0) { return MasterBin.NextEmpty(Start); } + cell PrevEmpty(cell Start = -1) { return MasterBin.PrevEmpty(Start); } + cell LastEmpty(cell Start = -1) { return MasterBin.LastEmpty(Start); } + + cell ByCount(cell n, cell Start = 0) { return MasterBin.ByCount(n, Start); } + cell Count(cell Start = 0, cell Stop = -1) { return MasterBin.Count(Start, Stop); } + + bool IsFilled(cell Index) { return ( (MasterBin.Get(Index) != NULL) ? true : false); } + bool IsEmpty(cell Index) { return ( (MasterBin.Get(Index) == NULL) ? true : false); } + +protected: + void ThrowIndexError(cell Index, bool disable_check = false) + { + if(disable_check == true) return; + + char error[50]; + sprintf(error,"Index %i is not set.",Index); + + throw JudyEx(error,true); + } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/ComboTable.h b/dlls/arrayx/ComboTable.h new file mode 100644 index 00000000..286953bd --- /dev/null +++ b/dlls/arrayx/ComboTable.h @@ -0,0 +1,67 @@ +#ifndef _COMBOTABLE_INCLUDED +#define _COMBOTABLE_INCLUDED + +#include "CKeytable.h" +#include "CHashtable.h" +#include "CBaseMap.h" + +class ComboTable: public CBaseMap +{ +private: + Keytable MasterKey; + Hashtable MasterHash; + +public: + ComboTable() { } + ~ComboTable() { Clear(); } + + Word_t Clear() { return (MasterKey.Clear() + MasterHash.Clear() ); } + Word_t MemoryUsed() { return (MasterKey.MemoryUsed() + MasterHash.MemoryUsed() ); } + + int Delete(char* Key) { return (MasterKey.Delete(Key) + MasterHash.Delete(Key) ); } + + bool IsFilled(char* Index) { return ( (MasterHash.Get(Index,(PPvoid_t)(NULL), true ) != NULL) ? true : false);} + bool IsEmpty(char* Index) { return ( (MasterHash.Get(Index,(PPvoid_t)(NULL), true ) == NULL) ? true : false);} + + void Set(char* Index, Pvoid_t value, bool disable_check) + { + MasterHash.Set(Index, value); + MasterKey.Set(Index, value); + } + + Pvoid_t Get(char* Index, bool disable_check = false) + { + return MasterHash.Get(Index, disable_check); + } + + template + void Set(char* Index, Type value) + { + MasterHash.Set(Index, value); + MasterKey.Set(Index, value); + } + + template + Type Get(char* Index, Type example, bool disable_check = false) + { + return MasterHash.Get(Index, example, disable_check); + } + + char* First( char* Start = "") { return MasterKey.First(Start);} + char* Next( char* Start = "") { return MasterKey.Next(Start);} + char* Prev( char* Start = "") { return MasterKey.Prev(Start); } + char* Last( char* Start = "") { return MasterKey.Last(Start);} + +protected: + void ThrowIndexError( char* index, bool disable_check = false ) + { + if(disable_check == true) return; + + char value[100]; + sprintf(value,"Function attempted to read non existant index %s", index ); + + throw JudyEx(value, true); + } +}; + +#endif diff --git a/dlls/arrayx/GenericNatives.h b/dlls/arrayx/GenericNatives.h new file mode 100644 index 00000000..e3be96c8 --- /dev/null +++ b/dlls/arrayx/GenericNatives.h @@ -0,0 +1,844 @@ +#ifndef _GENERIC_INC_H +#define _GENERIC_INC_H + +// Master table +ComboArray MNAME; + +///* MASTER FUNCTIONS */// + +///* Start Master Edit Funcs */// +#ifdef JUDY_MASTER_EDIT_FUNCTIONS + + #ifdef JUDY_MASTER_DELETE_FUNC + + // generic_delete(id) + static cell AMX_NATIVE_CALL JUDY_MASTER_DELETE_FUNC(AMX *amx,cell *params) + { + try { return MNAME.Delete( params[1] ); } + JUDY_ERROR_CATCH("Judy Error: (No error possible) - Delete function "); + } + + #else + + #error Must Have Delete func: JUDY_MASTER_DELETE_FUNC not defined! + + #endif + + #ifdef JUDY_MASTER_CLEAR_FUNC + + // generic_clear(id) + static cell AMX_NATIVE_CALL JUDY_MASTER_CLEAR_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1] ); + + try { return Unit->Clear(); } + JUDY_ERROR_CATCH("Judy Error: (Search error likely) - Clear function "); + } + + #else + + #error Must Have Clear func: JUDY_MASTER_CLEAR_FUNC not defined! + + #endif + +///* End Master Edit Funcs */// +#endif + +///* Start Master IO Funcs */// +#ifdef JUDY_MASTER_IO_FUNCTIONS + + #ifdef JUDY_MASTER_SAVE_FUNC + + // generic_save(id,file[]) + static cell AMX_NATIVE_CALL JUDY_MASTER_SAVE_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + return JUDY_SAVE_FUNC(Unit, JUDY_BUILD_PATH(amx,params[2]) ); + } + + #else + + #error Must Have Save func: JUDY_MASTER_SAVE_FUNC not defined properly! + + #endif + + #ifdef JUDY_MASTER_LOAD_FUNC + + // generic_load(file[],id) + static cell AMX_NATIVE_CALL JUDY_MASTER_LOAD_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[2]); + + return JUDY_LOAD_FUNC(Unit, JUDY_BUILD_PATH(amx,params[1]) ); + } + + #else + + #error Must Have Load func: JUDY_MASTER_LOAD_FUNC not defined! + + #endif + +///* End Master IO Funcs */// +#endif + +///* Start Master Amount Funcs */// +#ifdef JUDY_MASTER_AMOUNT_FUNCTIONS + + #ifdef JUDY_MASTER_COUNT_FUNC + + // generic_count(start = 0, stop = -1) + static cell AMX_NATIVE_CALL JUDY_MASTER_COUNT_FUNC(AMX *amx,cell *params) + { + try { return MNAME.Count(params[1],params[2] ); } + JUDY_ERROR_CATCH("Judy Error: (Search error likely) - Count Function "); + } + + #else + + #error Must Have Count func: JUDY_MASTER_COUNT_FUNC not defined! + + #endif + + #ifdef JUDY_MASTER_BYCOUNT_FUNC + + // generic_bycount(nth, start = -1) + static cell AMX_NATIVE_CALL JUDY_MASTER_BYCOUNT_FUNC(AMX *amx,cell *params) + { + try { return MNAME.ByCount(params[1],params[2] ); } + JUDY_ERROR_CATCH("Judy Error: (Search error likely) - ByCount Function "); + } + + #else + + #error Must Have ByCount func: JUDY_MASTER_BYCOUNT_FUNC not defined! + + #endif + +///* End Master Amount Funcs */// +#endif + +///* SLAVE FUNCTIONS */// + +///* Start Slave Amount Funcs */// +#ifdef JUDY_SLAVE_AMOUNT_FUNCTIONS + + #ifdef JUDY_SLAVE_COUNT_FUNC + + // generic_size(id, start = 0, stop = -1) + static cell AMX_NATIVE_CALL JUDY_SLAVE_COUNT_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + try { return Unit->Count(JUDY_GET_KEY(params,2),JUDY_GET_KEY(params, 3) ); } + JUDY_ERROR_CATCH("Judy Error: (Search error likely) - Slave Count Function "); + } + + #else + + #error Must Have Count func: JUDY_SLAVE_COUNT_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_BYCOUNT_FUNC + + // generic_get_nth(id, nth, start = -1) + static cell AMX_NATIVE_CALL JUDY_SLAVE_BYCOUNT_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + try { return Unit->ByCount(JUDY_GET_KEY(params,2),JUDY_GET_KEY(params, 3) ); } + JUDY_ERROR_CATCH("Judy Error: (Search error likely) - Slave ByCount Function "); + } + + #else + + #error Must Have ByCount func: JUDY_SLAVE_BYCOUNT_FUNC not defined! + + #endif + +///* End Slave Amount Funcs */// +#endif + +///* Start Slave Edit Funcs */// +#ifdef JUDY_SLAVE_EDIT_FUNCTIONS + + #ifdef JUDY_SLAVE_MEMORY_FUNC + + // generic_memory(id) + static cell AMX_NATIVE_CALL JUDY_SLAVE_MEMORY_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + try { return Unit->MemoryUsed(); } + JUDY_ERROR_CATCH("Judy Error: (Search error likely) - Slave ByCount Function "); + } + + #else + + #error Must Have Memory func: JUDY_SLAVE_MEMORY_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_ISFILLED_FUNC + + // generic_isfilled(id, index) + static cell AMX_NATIVE_CALL JUDY_SLAVE_ISFILLED_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + try { return Unit->IsFilled(JUDY_GET_KEY(params,2) ); } + JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave IsFilled Function "); + } + + #else + + #error Must Have IsFilled func: JUDY_SLAVE_ISFILLED_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_ISEMPTY_FUNC + + // generic_isempty(id, index) + static cell AMX_NATIVE_CALL JUDY_SLAVE_ISEMPTY_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + try { return Unit->IsEmpty(JUDY_GET_KEY(params,2) ); } + JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave IsEmpty Function "); + } + + #else + + #error Must Have IsEmpty func: JUDY_SLAVE_ISEMPTY_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_REMOVE_FUNC + + // generic_remove(id, index) + static cell AMX_NATIVE_CALL JUDY_SLAVE_REMOVE_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + try { return Unit->Delete(JUDY_GET_KEY(params,2) ); } + JUDY_ERROR_CATCH("Judy Error: (No error possible) - Slave Delete Function "); + } + + #else + + #error Must Have Delete func: JUDY_SLAVE_DELETE_FUNC not defined! + + #endif +///* End Required Slave Edit Funcs */// + +///* Start Slave Bool Funcs */// +#ifdef JUDY_SLAVE_EDIT_BOOL + + #ifdef JUDY_SLAVE_SET_BOOL_FUNC + // generic_set_bool(id, index, Bool:val) + static cell AMX_NATIVE_CALL JUDY_SLAVE_SET_BOOL_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + bool Value = (params[3] != NULL); + + Storage = reinterpret_cast( Unit->Get(Indice, true ) ); + + if(Storage == NULL) Storage = new STYPE(Value); + else Storage->SetBool(Value); + + JUDY_SET_INDEX_P(Unit,Storage,Indice); + } + + #else + + #error Must Have Set func: JUDY_SLAVE_SET_BOOL_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_GET_BOOL_FUNC + + // Bool:generic_get_bool(id, index, disable_check = 0) + static cell AMX_NATIVE_CALL JUDY_SLAVE_GET_BOOL_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + bool disable_check = (params[3] != NULL); + + try { Storage = reinterpret_cast( Unit->Get(Indice, disable_check ) ); } + JUDY_ERROR_CATCH("Judy Error: (Retrieve unset value) - Slave Get Function "); + + if(Storage == NULL) return 0; + + return Storage->GetBool(); + } + + #else + + #error Must Have Get func: JUDY_SLAVE_GET_BOOL_FUNC not defined! + + #endif + +///* End Slave Bool Funcs */// +#endif + +///* Start Slave Int Funcs */// +#ifdef JUDY_SLAVE_EDIT_INT + + #ifdef JUDY_SLAVE_SET_INT_FUNC + + // generic_set_bool(id, index, val) + static cell AMX_NATIVE_CALL JUDY_SLAVE_SET_INT_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell Value = params[3]; + + Storage = reinterpret_cast( Unit->Get(Indice, true ) ); + + if(Storage == NULL) Storage = new STYPE(Value); + else Storage->SetInt(Value); + + JUDY_SET_INDEX_P(Unit,Storage,Indice); + } + + #else + + #error Must Have Set func: JUDY_SLAVE_SET_INT_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_GET_INT_FUNC + + // generic_get_int(id, index, disable_check = 0) + static cell AMX_NATIVE_CALL JUDY_SLAVE_GET_INT_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + bool disable_check = (params[3] != NULL); + + try { Storage = reinterpret_cast( Unit->Get(Indice, disable_check ) ); } + JUDY_ERROR_CATCH("Judy Error: (Retrieve unset value) - Slave Get Function "); + + if(Storage == NULL) return 0; + + return Storage->GetInt(); + } + + #else + + #error Must Have Get func: JUDY_SLAVE_GET_INT_FUNC not defined! + + #endif + +///* End Slave Int Funcs */// +#endif + +///* Start Slave Float Funcs */// +#ifdef JUDY_SLAVE_EDIT_FLO + + #ifdef JUDY_SLAVE_SET_FLO_FUNC + + // generic_set_float(id, index, Float:val) + static cell AMX_NATIVE_CALL JUDY_SLAVE_SET_FLO_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + REAL Value = amx_ctof(params[3]); + + Storage = reinterpret_cast( Unit->Get(Indice, true ) ); + + if(Storage == NULL) Storage = new STYPE(Value); + else Storage->SetFlo(Value); + + JUDY_SET_INDEX_P(Unit,Storage,Indice); + } + + #else + + #error Must Have Set func: JUDY_SLAVE_SET_FLO_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_GET_FLO_FUNC + + // Float:generic_get_float(id, index, disable_check = 0) + static cell AMX_NATIVE_CALL JUDY_SLAVE_GET_FLO_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + bool disable_check = (params[3] != NULL); + + try { Storage = reinterpret_cast( Unit->Get(Indice, disable_check ) ); } + JUDY_ERROR_CATCH("Judy Error: (Retrieve unset value) - Slave Get Function "); + + if(Storage == NULL) return 0; + + return amx_ftoc(Storage->GetFlo() ); + } + + #else + + #error Must Have Get func: JUDY_SLAVE_GET_FLO_FUNC not defined! + + #endif + +///* End Slave Float Funcs */// +#endif + +///* Start Slave String Funcs */// +#ifdef JUDY_SLAVE_EDIT_STR + + #ifdef JUDY_SLAVE_SET_STR_FUNC + + // generic_set_string(id, index, val[]) + static cell AMX_NATIVE_CALL JUDY_SLAVE_SET_STR_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + char* Value = MF_GetAmxString(amx,params[3],3,NULL); + + Storage = reinterpret_cast( Unit->Get(Indice, true ) ); + + if(Storage == NULL) Storage = new STYPE(Value); + else Storage->SetStr(Value); + + JUDY_SET_INDEX_P(Unit,Storage,Indice); + } + + #else + + #error Must Have Set func: JUDY_SLAVE_SET_STR_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_GET_STR_FUNC + + // generic_get_string(id, index, val[], len, disable_check = 0) + static cell AMX_NATIVE_CALL JUDY_SLAVE_GET_STR_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + bool disable_check = (params[5] != NULL); + + try { Storage = reinterpret_cast( Unit->Get(Indice, disable_check ) ); } + JUDY_ERROR_CATCH("Judy Error: (Retrieve unset value) - Slave Get Function "); + + if(Storage == NULL) return 0; + + return MF_SetAmxString(amx,params[3], Storage->GetStr(), params[4] ); + } + + #else + + #error Must Have Get func: JUDY_SLAVE_GET_STR_FUNC not defined! + + #endif + +///* End Slave String Funcs */// +#endif + +///* Start Slave Vector Funcs */// +#ifdef JUDY_SLAVE_EDIT_VEC + + #ifdef JUDY_SLAVE_SET_VEC_FUNC + + // generic_set_vec(id, index, Float:val[3]) + static cell AMX_NATIVE_CALL JUDY_SLAVE_SET_VEC_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + + cell *input_vec = MF_GetAmxAddr(amx, params[3]); + JudyVec *Value = new JudyVec( + amx_ctof(input_vec[0]), + amx_ctof(input_vec[1]), + amx_ctof(input_vec[2]) + ); + + Storage = reinterpret_cast( Unit->Get(Indice, true ) ); + + if(Storage == NULL) Storage = new STYPE(Value); + else Storage->SetVec(Value); + + JUDY_SET_INDEX_P(Unit,Storage,Indice); + } + + #else + + #error Must Have Set func: JUDY_SLAVE_SET_VEC_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_GET_FLO_FUNC + + // generic_get_vec(id,index,Float:vec[3], disable_check = 0) + static cell AMX_NATIVE_CALL JUDY_SLAVE_GET_VEC_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + STYPE* Storage; + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell *vAmx = MF_GetAmxAddr(amx, params[3]); + bool disable_check = (params[4] != NULL); + + try { Storage = reinterpret_cast( Unit->Get(Indice, disable_check ) ); } + JUDY_ERROR_CATCH("Judy Error: (Retrieve unset value) - Slave Get Function "); + + if(Storage == NULL) + { + vAmx[0] = amx_ftoc(0); + vAmx[1] = amx_ftoc(0); + vAmx[2] = amx_ftoc(0); + return 0; + } + + JudyVec* Vec = const_cast( Storage->GetVec() ); + + REAL One, Two, Three; + Vec->Get(One, Two, Three); + + vAmx[0] = amx_ftoc(One); + vAmx[1] = amx_ftoc(Two); + vAmx[2] = amx_ftoc(Three); + + return 1; + } + + #else + + #error Must Have Get func: JUDY_SLAVE_GET_VEC_FUNC not defined! + + #endif + +///* End Slave VEC Funcs */// +#endif + +///* End Slave Edit Funcs */// +#endif + +///* Start Slave Search Funcs +#ifdef JUDY_SLAVE_SEARCH_FUNCTIONS + + #ifdef JUDY_SLAVE_FIRST_FUNC + // generic_first(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_FIRST_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->First(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_FIRST_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_NEXT_FUNC + // generic_next(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_NEXT_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + JUDY_GET_INDEX(MNAME,Unit, params[1]); + + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->Next(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_NEXT_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_PREV_FUNC + // generic_prev(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_PREV_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->Prev(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_PREV_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_LAST_FUNC + // generic_first(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_LAST_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->Last(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_LAST_FUNC not defined! + + #endif + +///* End Slave Search Funcs */// +#endif + + +///* Start Slave Empty Search Funcs +#ifdef JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS + + #ifdef JUDY_SLAVE_FIRSTEMPTY_FUNC + // generic_firstempty(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_FIRSTEMPTY_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->FirstEmpty(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_FIRSTEMPTY_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_NEXTEMPTY_FUNC + // generic_next(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_NEXTEMPTY_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->NextEmpty(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_NEXTEMPTY_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_PREVEMPTY_FUNC + // generic_prev(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_PREVEMPTY_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->PrevEmpty(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function", *success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_PREVEMPTY_FUNC not defined! + + #endif + + #ifdef JUDY_SLAVE_LASTEMPTY_FUNC + // generic_first(id, index,...) + static cell AMX_NATIVE_CALL JUDY_SLAVE_LASTEMPTY_FUNC(AMX *amx,cell *params) + { + DTYPE* Unit = NULL; + + + JUDY_GET_INDEX(MNAME,Unit, params[1]); + ITYPE Indice = JUDY_GET_KEY(params,2); + cell* success = MF_GetAmxAddr(amx, params[3 + SE_OFFSET]); + + *success = 1; + try { return JUDY_SET_KEY(Unit->LastEmpty(Indice),3); } + JUDY_SEARCH_ERROR_CATCH("Judy Error (Search failed) - Slave Search Function",*success); + } + + #else + + #error Must Have Search func: JUDY_SLAVE_LASTEMPTY_FUNC not defined! + + #endif + +///* End Slave Search Empty Funcs */// +#endif + +AMX_NATIVE_INFO EXPORT_NAME[] = +{ + +#ifdef JUDY_MASTER_EDIT_FUNCTIONS + + { JUDY_MASTER_CLEAR_STR , JUDY_MASTER_CLEAR_FUNC }, + { JUDY_MASTER_DELETE_STR , JUDY_MASTER_DELETE_FUNC }, + +#endif + +#ifdef JUDY_MASTER_IO_FUNCTIONS + + { JUDY_MASTER_SAVE_STR , JUDY_MASTER_SAVE_FUNC }, + { JUDY_MASTER_LOAD_STR , JUDY_MASTER_LOAD_FUNC }, + +#endif + +#ifdef JUDY_MASTER_AMOUNT_FUNCTIONS + + { JUDY_MASTER_COUNT_STR , JUDY_MASTER_COUNT_FUNC }, + { JUDY_MASTER_BYCOUNT_STR , JUDY_MASTER_BYCOUNT_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_AMOUNT_FUNCTIONS + + { JUDY_SLAVE_COUNT_STR , JUDY_SLAVE_COUNT_FUNC }, + { JUDY_SLAVE_BYCOUNT_STR , JUDY_SLAVE_BYCOUNT_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_EDIT_FUNCTIONS + + { JUDY_SLAVE_MEMORY_STR , JUDY_SLAVE_MEMORY_FUNC }, + { JUDY_SLAVE_ISFILLED_STR , JUDY_SLAVE_ISFILLED_FUNC }, + { JUDY_SLAVE_ISEMPTY_STR , JUDY_SLAVE_ISEMPTY_FUNC }, + { JUDY_SLAVE_REMOVE_STR , JUDY_SLAVE_REMOVE_FUNC }, + +#ifdef JUDY_SLAVE_EDIT_BOOL + + { JUDY_SLAVE_GET_BOOL_STR , JUDY_SLAVE_GET_BOOL_FUNC }, + { JUDY_SLAVE_SET_BOOL_STR , JUDY_SLAVE_SET_BOOL_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_EDIT_INT + + { JUDY_SLAVE_GET_INT_STR , JUDY_SLAVE_GET_INT_FUNC }, + { JUDY_SLAVE_SET_INT_STR , JUDY_SLAVE_SET_INT_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_EDIT_FLO + + { JUDY_SLAVE_GET_FLO_STR , JUDY_SLAVE_GET_FLO_FUNC }, + { JUDY_SLAVE_SET_FLO_STR , JUDY_SLAVE_SET_FLO_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_EDIT_STR + + { JUDY_SLAVE_GET_STR_STR , JUDY_SLAVE_GET_STR_FUNC }, + { JUDY_SLAVE_SET_STR_STR , JUDY_SLAVE_SET_STR_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_EDIT_VEC + + { JUDY_SLAVE_GET_VEC_STR , JUDY_SLAVE_GET_VEC_FUNC }, + { JUDY_SLAVE_SET_VEC_STR , JUDY_SLAVE_SET_VEC_FUNC }, + +#endif + +// End all edit functions +#endif + +#ifdef JUDY_SLAVE_SEARCH_FUNCTIONS + + { JUDY_SLAVE_FIRST_STR , JUDY_SLAVE_FIRST_FUNC }, + { JUDY_SLAVE_LAST_STR , JUDY_SLAVE_LAST_FUNC }, + + { JUDY_SLAVE_NEXT_STR , JUDY_SLAVE_NEXT_FUNC }, + { JUDY_SLAVE_PREV_STR , JUDY_SLAVE_PREV_FUNC }, + +#endif + +#ifdef JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS + + { JUDY_SLAVE_FIRSTEMPTY_STR , JUDY_SLAVE_FIRSTEMPTY_FUNC }, + { JUDY_SLAVE_LASTEMPTY_STR , JUDY_SLAVE_LASTEMPTY_FUNC }, + + { JUDY_SLAVE_NEXTEMPTY_STR , JUDY_SLAVE_NEXTEMPTY_FUNC }, + { JUDY_SLAVE_PREVEMPTY_STR , JUDY_SLAVE_PREVEMPTY_FUNC }, + +#endif + + { NULL, NULL } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/Judy.h b/dlls/arrayx/Judy.h new file mode 100644 index 00000000..7f495a72 --- /dev/null +++ b/dlls/arrayx/Judy.h @@ -0,0 +1,742 @@ +#ifndef _JUDY_INCLUDED +#define _JUDY_INCLUDED +// _________________ +// +// Copyright (C) 2000 - 2002 Hewlett-Packard Company +// +// This program is free software; you can redistribute it and/or modify it +// under the term of the GNU Lesser General Public License as published by the +// Free Software Foundation; either version 2 of the License, or (at your +// option) any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License +// for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// _________________ + +// @(#) $Revision$ $Source$ +// +// HEADER FILE FOR EXPORTED FEATURES IN JUDY LIBRARY, libJudy.* +// +// See the manual entries for details. +// +// Note: This header file uses old-style comments on #-directive lines and +// avoids "()" on macro names in comments for compatibility with older cc -Aa +// and some tools on some platforms. + + +// PLATFORM-SPECIFIC + +#ifdef JU_WIN /* =============================================== */ + +typedef __int8 int8_t; +//typedef __int16 int16_t; +//typedef __int32 int32_t; +typedef __int64 int64_t; + +typedef char uint8_t; +//typedef unsigned __int16 uint16_t; +//typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; + +#else /* ================ ! JU_WIN ============================= */ + +// ISO C99: 7.8 Format conversion of integer types +#include /* if this FAILS, try #include */ + +// ISO C99: 7.18 Integer types uint*_t +#include + +#endif /* ================ ! JU_WIN ============================= */ + +// ISO C99 Standard: 7.20 General utilities +#include + +// ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types +#include + +#ifdef __cplusplus /* support use by C++ code */ +extern "C" { +#endif + + +// **************************************************************************** +// DECLARE SOME BASE TYPES IN CASE THEY ARE MISSING: +// +// These base types include "const" where appropriate, but only where of +// interest to the caller. For example, a caller cares that a variable passed +// by reference will not be modified, such as, "const void * Pindex", but not +// that the called function internally does not modify the pointer itself, such +// as, "void * const Pindex". +// +// Note that its OK to pass a Pvoid_t to a Pcvoid_t; the latter is the same, +// only constant. Callers need to do this so they can also pass & Pvoid_t to +// PPvoid_t (non-constant). + +#ifndef _PCVOID_T +#define _PCVOID_T +typedef const void * Pcvoid_t; +#endif + +#ifndef _PVOID_T +#define _PVOID_T +typedef void * Pvoid_t; +typedef void ** PPvoid_t; +#endif + +#ifndef _WORD_T +#define _WORD_T +typedef unsigned int Word_t, * PWord_t; // expect 32-bit or 64-bit words. +#endif + +#ifndef NULL +#define NULL 0 +#endif + + +// **************************************************************************** +// SUPPORT FOR ERROR HANDLING: +// +// Judy error numbers: +// +// Note: These are an enum so theres a related typedef, but the numbers are +// spelled out so you can map a number back to its name. + +typedef enum // uint8_t -- but C does not support this type of enum. +{ + +// Note: JU_ERRNO_NONE and JU_ERRNO_FULL are not real errors. They specify +// conditions which are otherwise impossible return values from 32-bit +// Judy1Count, which has 2^32 + 1 valid returns (0..2^32) plus one error +// return. These pseudo-errors support the return values that cannot otherwise +// be unambiguously represented in a 32-bit word, and will never occur on a +// 64-bit system. + + JU_ERRNO_NONE = 0, + JU_ERRNO_FULL = 1, + JU_ERRNO_NFMAX = JU_ERRNO_FULL, + +// JU_ERRNO_NOMEM comes from malloc(3C) when Judy cannot obtain needed memory. +// The system errno value is also set to ENOMEM. This error can be recoverable +// if the calling application frees other memory. +// +// TBD: Currently there is no guarantee the Judy array has no memory leaks +// upon JU_ERRNO_NOMEM. + + JU_ERRNO_NOMEM = 2, + +// Problems with parameters from the calling program: +// +// JU_ERRNO_NULLPPARRAY means PPArray was null; perhaps PArray was passed where +// &PArray was intended. Similarly, JU_ERRNO_NULLPINDEX means PIndex was null; +// perhaps &Index was intended. Also, JU_ERRNO_NONNULLPARRAY, +// JU_ERRNO_NULLPVALUE, and JU_ERRNO_UNSORTED, all added later (hence with +// higher numbers), mean: A non-null array was passed in where a null pointer +// was required; PValue was null; and unsorted indexes were detected. + + JU_ERRNO_NULLPPARRAY = 3, // see above. + JU_ERRNO_NONNULLPARRAY = 10, // see above. + JU_ERRNO_NULLPINDEX = 4, // see above. + JU_ERRNO_NULLPVALUE = 11, // see above. + JU_ERRNO_NOTJUDY1 = 5, // PArray is not to a Judy1 array. + JU_ERRNO_NOTJUDYL = 6, // PArray is not to a JudyL array. + JU_ERRNO_NOTJUDYSL = 7, // PArray is not to a JudySL array. + JU_ERRNO_UNSORTED = 12, // see above. + +// Errors below this point are not recoverable; further tries to access the +// Judy array might result in EFAULT and a core dump: +// +// JU_ERRNO_OVERRUN occurs when Judy detects, upon reallocation, that a block +// of memory in its own freelist was modified since being freed. + + JU_ERRNO_OVERRUN = 8, + +// JU_ERRNO_CORRUPT occurs when Judy detects an impossible value in a Judy data +// structure: +// +// Note: The Judy data structure contains some redundant elements that support +// this type of checking. + + JU_ERRNO_CORRUPT = 9 + +// Warning: At least some C or C++ compilers do not tolerate a trailing comma +// above here. At least we know of one case, in aCC; see JAGad58928. + +} JU_Errno_t; + + +// Judy errno structure: +// +// WARNING: For compatibility with possible future changes, the fields of this +// struct should not be referenced directly. Instead use the macros supplied +// below. + +// This structure should be declared on the stack in a threaded process. + +typedef struct J_UDY_ERROR_STRUCT +{ + JU_Errno_t je_Errno; // one of the enums above. + int je_ErrID; // often an internal source line number. + Word_t je_reserved[4]; // for future backward compatibility. + +} JError_t, * PJError_t; + + +// Related macros: +// +// Fields from error struct: + +#define JU_ERRNO(PJError) ((PJError)->je_Errno) +#define JU_ERRID(PJError) ((PJError)->je_ErrID) + +// For checking return values from various Judy functions: +// +// Note: Define JERR as -1, not as the seemingly more portable (Word_t) +// (~0UL), to avoid a compiler "overflow in implicit constant conversion" +// warning. + +#define JERR (-1) /* functions returning int or Word_t */ +#define PJERR ((Pvoid_t) (~0UL)) /* mainly for use here, see below */ +#define PPJERR ((PPvoid_t) (~0UL)) /* functions that return PPvoid_t */ + +// Convenience macro for when detailed error information (PJError_t) is not +// desired by the caller; a purposely short name: + +#define PJE0 ((PJError_t) NULL) + + +// **************************************************************************** +// JUDY FUNCTIONS: +// +// P_JE is a shorthand for use below: + +#define P_JE PJError_t PJError + +// **************************************************************************** +// JUDY1 FUNCTIONS: + +extern int j__udy1Test( Pvoid_t Pjpm, Word_t Index); +extern int Judy1Test( Pcvoid_t PArray, Word_t Index, P_JE); +extern int Judy1Set( PPvoid_t PPArray, Word_t Index, P_JE); +extern int Judy1SetArray( PPvoid_t PPArray, Word_t Count, + const Word_t * const PIndex, + P_JE); +extern int Judy1Unset( PPvoid_t PPArray, Word_t Index, P_JE); +extern Word_t Judy1Count( Pcvoid_t PArray, Word_t Index1, + Word_t Index2, P_JE); +extern int Judy1ByCount( Pcvoid_t PArray, Word_t Count, + Word_t * PIndex, P_JE); +extern Word_t Judy1FreeArray( PPvoid_t PPArray, P_JE); +extern Word_t Judy1MemUsed( Pcvoid_t PArray); +extern Word_t Judy1MemActive( Pcvoid_t PArray); +extern int Judy1First( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int Judy1Next( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int j__udy1Next( Pvoid_t Pjpm, Word_t * PIndex); +extern int Judy1Last( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int Judy1Prev( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int Judy1FirstEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int Judy1NextEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int Judy1LastEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int Judy1PrevEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); + +extern PPvoid_t j__udyLGet( Pvoid_t Pjpm, Word_t Index); +extern PPvoid_t JudyLGet( Pcvoid_t PArray, Word_t Index, P_JE); +extern PPvoid_t JudyLIns( PPvoid_t PPArray, Word_t Index, P_JE); +extern int JudyLInsArray( PPvoid_t PPArray, Word_t Count, + const Word_t * const PIndex, + const Word_t * const PValue, + +// **************************************************************************** +// JUDYL FUNCTIONS: + P_JE); +extern int JudyLDel( PPvoid_t PPArray, Word_t Index, P_JE); +extern Word_t JudyLCount( Pcvoid_t PArray, Word_t Index1, + Word_t Index2, P_JE); +extern PPvoid_t JudyLByCount( Pcvoid_t PArray, Word_t Count, + Word_t * PIndex, P_JE); +extern Word_t JudyLFreeArray( PPvoid_t PPArray, P_JE); +extern Word_t JudyLMemUsed( Pcvoid_t PArray); +extern Word_t JudyLMemActive( Pcvoid_t PArray); +extern PPvoid_t JudyLFirst( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern PPvoid_t JudyLNext( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern PPvoid_t j__udyLNext( Pvoid_t Pjpm, Word_t * PIndex); +extern PPvoid_t JudyLLast( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern PPvoid_t JudyLPrev( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int JudyLFirstEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int JudyLNextEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int JudyLLastEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); +extern int JudyLPrevEmpty( Pcvoid_t PArray, Word_t * PIndex, P_JE); + +// **************************************************************************** +// JUDYSL FUNCTIONS: + +extern PPvoid_t JudySLGet( Pcvoid_t, const uint8_t * Index, P_JE); +extern PPvoid_t JudySLIns( PPvoid_t, const uint8_t * Index, P_JE); +extern int JudySLDel( PPvoid_t, const uint8_t * Index, P_JE); +extern Word_t JudySLFreeArray( PPvoid_t, P_JE); +extern PPvoid_t JudySLFirst( Pcvoid_t, uint8_t * Index, P_JE); +extern PPvoid_t JudySLNext( Pcvoid_t, uint8_t * Index, P_JE); +extern PPvoid_t JudySLLast( Pcvoid_t, uint8_t * Index, P_JE); +extern PPvoid_t JudySLPrev( Pcvoid_t, uint8_t * Index, P_JE); + +// **************************************************************************** +// JUDYHSL FUNCTIONS: + +extern PPvoid_t JudyHSGet( Pcvoid_t, void *, Word_t); +extern PPvoid_t JudyHSIns( PPvoid_t, void *, Word_t, P_JE); +extern int JudyHSDel( PPvoid_t, void *, Word_t, P_JE); +extern Word_t JudyHSFreeArray( PPvoid_t, P_JE); + +extern const char *Judy1MallocSizes; +extern const char *JudyLMallocSizes; + +// **************************************************************************** +// JUDY memory interface to malloc() FUNCTIONS: + +extern Word_t JudyMalloc(Word_t); // words reqd => words allocd. +extern Word_t JudyMallocVirtual(Word_t); // words reqd => words allocd. +extern void JudyFree(Pvoid_t, Word_t); // free, size in words. +extern void JudyFreeVirtual(Pvoid_t, Word_t); // free, size in words. + +#define JLAP_INVALID 0x1 /* flag to mark pointer "not a Judy array" */ + +// **************************************************************************** +// MACRO EQUIVALENTS FOR JUDY FUNCTIONS: +// +// The following macros, such as J1T, are shorthands for calling Judy functions +// with parameter address-of and detailed error checking included. Since they +// are macros, the error checking code is replicated each time the macro is +// used, but it runs fast in the normal case of no error. +// +// If the caller does not like the way the default JUDYERROR macro handles +// errors (such as an exit(1) call when out of memory), they may define their +// own before the "#include ". A routine such as HandleJudyError +// could do checking on specific error numbers and print a different message +// dependent on the error. The following is one example: +// +// Note: the back-slashes are removed because some compilers will not accept +// them in comments. +// +// void HandleJudyError(uint8_t *, int, uint8_t *, int, int); +// #define JUDYERROR(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID) +// { +// HandleJudyError(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID); +// } +// +// The routine HandleJudyError could do checking on specific error numbers and +// print a different message dependent on the error. +// +// The macro receives five parameters that are: +// +// 1. CallerFile: Source filename where a Judy call returned a serious error. +// 2. CallerLine: Line number in that source file. +// 3. JudyFunc: Name of Judy function reporting the error. +// 4. JudyErrno: One of the JU_ERRNO* values enumerated above. +// 5. JudyErrID: The je_ErrID field described above. + +#ifndef JUDYERROR_NOTEST +#ifndef JUDYERROR /* supply a default error macro */ +#include + +#define JUDYERROR(CallerFile, CallerLine, JudyFunc, JudyErrno, JudyErrID) \ + { \ + (void) fprintf(stderr, "File '%s', line %d: %s(), " \ + "JU_ERRNO_* == %d, ID == %d\n", \ + CallerFile, CallerLine, \ + JudyFunc, JudyErrno, JudyErrID); \ + exit(1); \ + } + +#endif /* JUDYERROR */ +#endif /* JUDYERROR_NOTEST */ + +// If the JUDYERROR macro is not desired at all, then the following eliminates +// it. However, the return code from each Judy function (that is, the first +// parameter of each macro) must be checked by the caller to assure that an +// error did not occur. +// +// Example: +// +// #define JUDYERROR_NOTEST 1 +// #include +// +// or use this cc option at compile time: +// +// cc -DJUDYERROR_NOTEST ... +// +// Example code: +// +// J1S(Rc, PArray, Index); +// if (Rc == JERR) goto ...error +// +// or: +// +// JLI(PValue, PArray, Index); +// if (PValue == PJERR) goto ...error + + +// Internal shorthand macros for writing the J1S, etc. macros: + +#ifdef JUDYERROR_NOTEST /* ============================================ */ + +// "Judy Set Error": + +#define J_SE(FuncName,Errno) ((void) 0) + +// Note: In each J_*() case below, the digit is the number of key parameters +// to the Judy*() call. Just assign the Func result to the callers Rc value +// without a cast because none is required, and this keeps the API simpler. +// However, a family of different J_*() macros is needed to support the +// different numbers of key parameters (0,1,2) and the Func return type. +// +// In the names below, "I" = integer result; "P" = pointer result. Note, the +// Funcs for J_*P() return PPvoid_t, but cast this to a Pvoid_t for flexible, +// error-free assignment, and then compare to PJERR. + +#define J_0I(Rc,PArray,Func,FuncName) \ + { (Rc) = Func(PArray, PJE0); } + +#define J_1I(Rc,PArray,Index,Func,FuncName) \ + { (Rc) = Func(PArray, Index, PJE0); } + +#define J_1P(PV,PArray,Index,Func,FuncName) \ + { (PV) = (Pvoid_t) Func(PArray, Index, PJE0); } + +#define J_2I(Rc,PArray,Index,Arg2,Func,FuncName) \ + { (Rc) = Func(PArray, Index, Arg2, PJE0); } + +#define J_2C(Rc,PArray,Index1,Index2,Func,FuncName) \ + { (Rc) = Func(PArray, Index1, Index2, PJE0); } + +#define J_2P(PV,PArray,Index,Arg2,Func,FuncName) \ + { (PV) = (Pvoid_t) Func(PArray, Index, Arg2, PJE0); } + +// Variations for Judy*Set/InsArray functions: + +#define J_2AI(Rc,PArray,Count,PIndex,Func,FuncName) \ + { (Rc) = Func(PArray, Count, PIndex, PJE0); } +#define J_3AI(Rc,PArray,Count,PIndex,PValue,Func,FuncName) \ + { (Rc) = Func(PArray, Count, PIndex, PValue, PJE0); } + +#else /* ================ ! JUDYERROR_NOTEST ============================= */ + +#define J_E(FuncName,PJE) \ + JUDYERROR(__FILE__, __LINE__, FuncName, JU_ERRNO(PJE), JU_ERRID(PJE)) + +#define J_SE(FuncName,Errno) \ + { \ + JError_t J_Error; \ + JU_ERRNO(&J_Error) = (Errno); \ + JU_ERRID(&J_Error) = __LINE__; \ + J_E(FuncName, &J_Error); \ + } + +// Note: In each J_*() case below, the digit is the number of key parameters +// to the Judy*() call. Just assign the Func result to the callers Rc value +// without a cast because none is required, and this keeps the API simpler. +// However, a family of different J_*() macros is needed to support the +// different numbers of key parameters (0,1,2) and the Func return type. +// +// In the names below, "I" = integer result; "P" = pointer result. Note, the +// Funcs for J_*P() return PPvoid_t, but cast this to a Pvoid_t for flexible, +// error-free assignment, and then compare to PJERR. + +#define J_0I(Rc,PArray,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((Rc) = Func(PArray, &J_Error)) == JERR) \ + J_E(FuncName, &J_Error); \ + } + +#define J_1I(Rc,PArray,Index,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((Rc) = Func(PArray, Index, &J_Error)) == JERR) \ + J_E(FuncName, &J_Error); \ + } + +#define J_1P(Rc,PArray,Index,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((Rc) = (Pvoid_t) Func(PArray, Index, &J_Error)) == PJERR) \ + J_E(FuncName, &J_Error); \ + } + +#define J_2I(Rc,PArray,Index,Arg2,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((Rc) = Func(PArray, Index, Arg2, &J_Error)) == JERR) \ + J_E(FuncName, &J_Error); \ + } + +// Variation for Judy*Count functions, which return 0, not JERR, for error (and +// also for other non-error cases): +// +// Note: JU_ERRNO_NFMAX should only apply to 32-bit Judy1, but this header +// file lacks the necessary ifdefs to make it go away otherwise, so always +// check against it. + +#define J_2C(Rc,PArray,Index1,Index2,Func,FuncName) \ + { \ + JError_t J_Error; \ + if ((((Rc) = Func(PArray, Index1, Index2, &J_Error)) == 0) \ + && (JU_ERRNO(&J_Error) > JU_ERRNO_NFMAX)) \ + { \ + J_E(FuncName, &J_Error); \ + } \ + } + +#define J_2P(PV,PArray,Index,Arg2,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((PV) = (Pvoid_t) Func(PArray, Index, Arg2, &J_Error)) \ + == PJERR) J_E(FuncName, &J_Error); \ + } + +// Variations for Judy*Set/InsArray functions: + +#define J_2AI(Rc,PArray,Count,PIndex,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((Rc) = Func(PArray, Count, PIndex, &J_Error)) == JERR) \ + J_E(FuncName, &J_Error); \ + } + +#define J_3AI(Rc,PArray,Count,PIndex,PValue,Func,FuncName) \ + { \ + JError_t J_Error; \ + if (((Rc) = Func(PArray, Count, PIndex, PValue, &J_Error)) \ + == JERR) J_E(FuncName, &J_Error); \ + } + +#endif /* ================ ! JUDYERROR_NOTEST ============================= */ + +// Some of the macros are special cases that use inlined shortcuts for speed +// with root-level leaves: + +// This is a slower version with current processors, but in the future... +#ifdef notdef +#define J1T(Rc,PArray,Index) \ +{ \ + PWord_t P_L = (PWord_t)(PArray); \ + (Rc) = 0; \ + if (P_L) /* cannot be a NULL pointer */ \ + { \ + if (P_L[0] < 31) /* is a LeafL */ \ + { \ + Word_t _pop1 = P_L[0] + 1; \ + PWord_t P_LE = P_L + _pop1; \ + Word_t _index = 0; \ + int ii = 0; \ + P_L++; \ + while (_pop1 > 4) \ + { \ + _pop1 /=2; \ + _index = P_L[_pop1]; \ + if ((Index) > _index) P_L += _pop1 + 1; \ + } \ + while (P_L <= P_LE) \ + { \ + ii++; \ + _index = P_L[0]; \ + if (_index >= (Index)) break; \ + P_L++; \ + } \ + if (_index == (Index)) (Rc) = 1; \ + } \ + else \ + { \ + (Rc) = j__udy1Test((Pvoid_t)P_L, (Index)); \ + } \ + } \ +} +#endif // notdef + +#define J1T(Rc,PArray,Index) \ +{ \ + PWord_t P_L = (PWord_t)(PArray); \ + (Rc) = 0; \ + if (P_L) /* cannot be a NULL pointer */ \ + { \ + if (P_L[0] < 31) /* is a LeafL */ \ + { \ + Word_t _pop1 = P_L[0] + 1; \ + Word_t _EIndex = P_L[_pop1]; \ + if (_pop1 >= 16) \ + { \ + if ((Index) > P_L[_pop1/2]) P_L += _pop1/2; \ + } \ + if ((Index) <= _EIndex) \ + { \ + while((Index) > *(++P_L)); \ + if (*P_L == (Index)) (Rc) = 1; \ + } \ + } \ + else \ + { \ + (Rc) = j__udy1Test((Pvoid_t)P_L, Index); \ + } \ + } \ +} + +#define J1S( Rc, PArray, Index) \ + J_1I(Rc, (&(PArray)), Index, Judy1Set, "Judy1Set") +#define J1SA(Rc, PArray, Count, PIndex) \ + J_2AI(Rc,(&(PArray)), Count, PIndex, Judy1SetArray, "Judy1SetArray") +#define J1U( Rc, PArray, Index) \ + J_1I(Rc, (&(PArray)), Index, Judy1Unset, "Judy1Unset") +#define J1F( Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1First, "Judy1First") +#define J1N( Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1Next, "Judy1Next") +#define J1L( Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1Last, "Judy1Last") +#define J1P( Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1Prev, "Judy1Prev") +#define J1FE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1FirstEmpty, "Judy1FirstEmpty") +#define J1NE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1NextEmpty, "Judy1NextEmpty") +#define J1LE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1LastEmpty, "Judy1LastEmpty") +#define J1PE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), Judy1PrevEmpty, "Judy1PrevEmpty") +#define J1C( Rc, PArray, Index1, Index2) \ + J_2C(Rc, PArray, Index1, Index2, Judy1Count, "Judy1Count") +#define J1BC(Rc, PArray, Count, Index) \ + J_2I(Rc, PArray, Count, &(Index), Judy1ByCount, "Judy1ByCount") +#define J1FA(Rc, PArray) \ + J_0I(Rc, (&(PArray)), Judy1FreeArray, "Judy1FreeArray") +#define J1MU(Rc, PArray) \ + (Rc) = Judy1MemUsed(PArray) + +#define JLG(PV,PArray,Index) \ +{ \ + extern const uint8_t j__L_LeafWOffset[]; \ + PWord_t P_L = (PWord_t)(PArray); \ + (PV) = (Pvoid_t) NULL; \ + if (P_L) /* cannot be a NULL pointer */ \ + { \ + if (P_L[0] < 31) /* is a LeafL */ \ + { \ + Word_t _pop1 = P_L[0] + 1; \ + Word_t _EIndex = P_L[_pop1]; \ + Word_t _off = j__L_LeafWOffset[_pop1] - 1; \ + if (_pop1 >= 16) \ + { \ + if ((Index) > P_L[_pop1/2]) P_L += _pop1/2; \ + } \ + if ((Index) <= _EIndex) \ + { \ + while((Index) > *(++P_L)); \ + if (*P_L == (Index)) (PV) = (Pvoid_t)(P_L+_off);\ + } \ + } \ + else \ + { \ + (PV) = (Pvoid_t)j__udyLGet((Pvoid_t)P_L, Index); \ + } \ + } \ +} + +#define JLI( PV, PArray, Index) \ + J_1P(PV, (&(PArray)), Index, JudyLIns, "JudyLIns") + +#define JLIA(Rc, PArray, Count, PIndex, PValue) \ + J_3AI(Rc,(&(PArray)), Count, PIndex, PValue, JudyLInsArray, \ + "JudyLInsArray") +#define JLD( Rc, PArray, Index) \ + J_1I(Rc, (&(PArray)), Index, JudyLDel, "JudyLDel") + +#define JLF( PV, PArray, Index) \ + J_1P(PV, PArray, &(Index), JudyLFirst, "JudyLFirst") + +#define JLN(PV,PArray,Index) \ +{ \ + extern const uint8_t j__L_LeafWOffset[]; \ + PWord_t P_L = (PWord_t) (PArray); \ + \ + (PV) = (Pvoid_t) NULL; \ + \ + if (P_L) /* cannot be a NULL pointer */ \ + { \ + if (P_L[0] < 31) /* is a LeafL */ \ + { \ + Word_t _pop1 = P_L[0] + 1; \ + Word_t _off = j__L_LeafWOffset[_pop1] -1; \ + if ((Index) < P_L[_pop1]) \ + { \ + while(1) \ + { \ + if ((Index) < *(++P_L)) \ + { \ + (Index) = *P_L; \ + (PV) = (Pvoid_t) (P_L + _off); \ + break; \ + } \ + } \ + } \ + } \ + else \ + { \ + (PV) = (Pvoid_t)JudyLNext((Pvoid_t) PArray, &(Index), PJE0); \ + } \ + } \ +} + +#define JLL( PV, PArray, Index) \ + J_1P(PV, PArray, &(Index), JudyLLast, "JudyLLast") +#define JLP( PV, PArray, Index) \ + J_1P(PV, PArray, &(Index), JudyLPrev, "JudyLPrev") +#define JLFE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), JudyLFirstEmpty, "JudyLFirstEmpty") +#define JLNE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), JudyLNextEmpty, "JudyLNextEmpty") +#define JLLE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), JudyLLastEmpty, "JudyLLastEmpty") +#define JLPE(Rc, PArray, Index) \ + J_1I(Rc, PArray, &(Index), JudyLPrevEmpty, "JudyLPrevEmpty") +#define JLC( Rc, PArray, Index1, Index2) \ + J_2C(Rc, PArray, Index1, Index2, JudyLCount, "JudyLCount") +#define JLBC(PV, PArray, Count, Index) \ + J_2P(PV, PArray, Count, &(Index), JudyLByCount, "JudyLByCount") +#define JLFA(Rc, PArray) \ + J_0I(Rc, (&(PArray)), JudyLFreeArray, "JudyLFreeArray") +#define JLMU(Rc, PArray) \ + (Rc) = JudyLMemUsed(PArray) + +#define JHSI(PV, PArray, PIndex, Count) \ + J_2P(PV, (&(PArray)), PIndex, Count, JudyHSIns, "JudyHSIns") +#define JHSG(PV, PArray, PIndex, Count) \ + (PV) = (Pvoid_t) JudyHSGet(PArray, PIndex, Count) +#define JHSD(Rc, PArray, PIndex, Count) \ + J_2I(Rc, (&(PArray)), PIndex, Count, JudyHSDel, "JudyHSDel") +#define JHSFA(Rc, PArray) \ + J_0I(Rc, (&(PArray)), JudyHSFreeArray, "JudyHSFreeArray") + +#define JSLG( PV, PArray, Index) \ + J_1P( PV, PArray, Index, JudySLGet, "JudySLGet") +#define JSLI( PV, PArray, Index) \ + J_1P( PV, (&(PArray)), Index, JudySLIns, "JudySLIns") +#define JSLD( Rc, PArray, Index) \ + J_1I( Rc, (&(PArray)), Index, JudySLDel, "JudySLDel") +#define JSLF( PV, PArray, Index) \ + J_1P( PV, PArray, Index, JudySLFirst, "JudySLFirst") +#define JSLN( PV, PArray, Index) \ + J_1P( PV, PArray, Index, JudySLNext, "JudySLNext") +#define JSLL( PV, PArray, Index) \ + J_1P( PV, PArray, Index, JudySLLast, "JudySLLast") +#define JSLP( PV, PArray, Index) \ + J_1P( PV, PArray, Index, JudySLPrev, "JudySLPrev") +#define JSLFA(Rc, PArray) \ + J_0I( Rc, (&(PArray)), JudySLFreeArray, "JudySLFreeArray") + +#ifdef __cplusplus +} +#endif +#endif /* ! _JUDY_INCLUDED */ diff --git a/dlls/arrayx/Judy.lib b/dlls/arrayx/Judy.lib new file mode 100644 index 0000000000000000000000000000000000000000..77a8964d7e95f1a4cc55b9893053ad20e674965c GIT binary patch literal 256910 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�Z$UvnZM;;o@sjBd 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 Imp + +class JudyEx +{ +private: + char* ex_message; + bool fatal; + +public: + + JudyEx() { ex_message = NULL; fatal = true; } + JudyEx(char* set, bool isfatal) + { + ex_message = new char[strlen(set) + 1]; + strcpy(ex_message, set); + + fatal = isfatal; + } + + JudyEx(const JudyEx ©) + { + ex_message = new char[strlen(copy.ex_message) + 1]; + strcpy(ex_message, copy.ex_message); + + fatal = copy.fatal; + } + + ~JudyEx() { delete ex_message; } + + void Destroy() { delete ex_message; } + + void SetIsFatal(bool isfatal) { fatal = isfatal; } + bool IsFatal( void ) { return fatal; } + + char* SetErrorMessage(char* set) + { + ex_message = new char[strlen(set) + 1]; + strcpy(ex_message, set); + } + + char* ErrorMessage( void ) + { + return ex_message; + } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/JudyExtra.cpp b/dlls/arrayx/JudyExtra.cpp new file mode 100644 index 00000000..0655c1b9 --- /dev/null +++ b/dlls/arrayx/JudyExtra.cpp @@ -0,0 +1,225 @@ +#include "JudyExtra.h" + +bool JudyClearBinTrie(BinTrie* trie) +{ + Word_t trie_iten = 0; + + try { trie_iten = trie->First(); } + catch(JudyEx& e) { return false; } + + while( true ) + { + trie->Delete(trie_iten); + + try { trie_iten = trie->Next(trie_iten); } + catch(JudyEx& e) { break; } + } + return true; +}; + +bool JudySaveBinTrie(BinTrie* trie, char* file) +{ + Word_t trie_iten = 0; + + try { trie_iten = trie->First(); } + catch(JudyEx e) { return false; } + + FILE *trieDB = fopen(file,"wb"); + if (!trieDB) return false; + + bool value = false; + + while( true ) + { + fwrite(&trie_iten, sizeof(Word_t), 1, trieDB); + + value = (trie->Get(trie_iten) != NULL); + fwrite(&value, sizeof(bool), 1, trieDB); + + try { trie_iten = trie->Next(trie_iten); } + catch(JudyEx& e) { break; } + } + + fclose(trieDB); + return true; +}; + +bool JudyLoadBinTrie(BinTrie* trie, char* file) +{ + FILE *trieDB = fopen(file, "ab+"); + if (!trieDB) return false; + + Word_t trie_iten = 0; + + bool value = false; + + while(!feof(trieDB)) + { + fread(&trie_iten, sizeof(Word_t), 1, trieDB); + if (feof(trieDB) || ferror(trieDB)) break; + + fread(&value, sizeof(bool), 1, trieDB); + + trie->Set(trie_iten,value); + } + + fclose(trieDB); + return true; +} + +bool JudyClearList(CBaseList* list) +{ + Word_t list_iten = 0; + + try { list_iten = list->First(); } + catch(JudyEx& e) { return false; } + + while( true ) + { + try { list->Delete(list_iten); } + catch(JudyEx& e) { break; } + + try { list_iten = list->Next(list_iten); } + catch(JudyEx& e) { break; } + } + return true; +}; + +bool JudySaveList(CBaseList* list, char* file) +{ + Capsule* Storage = NULL; + Word_t list_iten = 0; + bool no_error = true; + + try { list_iten = list->First(); } + catch(JudyEx e) { return false; } + + FILE* listDB = fopen(file,"wb"); + if (!listDB) return false; + + while( true ) + { + try { Storage = reinterpret_cast(list->Get(list_iten) ); } + catch(JudyEx& e) { no_error = false; break; } + + fwrite(&list_iten, sizeof(Word_t), 1, listDB); + try { Storage->Save(listDB); } + catch(JudyEx& e) { no_error = false; break; } + + try { list_iten = list->Next(list_iten); } + catch(JudyEx& e) { break; } + } + + fclose(listDB); + return no_error; +}; + +bool JudyLoadList(CBaseList* list, char* file) +{ + FILE *listDB = fopen(file, "ab+"); + if (!listDB) return false; + + Capsule* Storage = NULL; + Word_t list_iten = 0; + bool no_error = true; + + while(!feof(listDB)) + { + fread(&list_iten, sizeof(Word_t), 1, listDB); + if (feof(listDB) || ferror(listDB)) break; + + Storage = new Capsule; + try { Storage->Load(listDB); } + catch(JudyEx& e) { no_error = false; break; } + + list->Set(list_iten,Storage); + } + + fclose(listDB); + return no_error; +} + +bool JudyClearMap(CBaseMap* map) +{ + char* map_iten = NULL; + + try { map_iten = map->First(); } + catch(JudyEx& e) { return false; } + + while( true ) + { + try { map->Delete(map_iten); } + catch(JudyEx& e) { return false; } + + try { map_iten = map->Next(map_iten); } + catch(JudyEx& e) { break; } + } + + return true; +}; + + +bool JudySaveMap(CBaseMap* map, char* file) +{ + Capsule* Storage = NULL; + char* map_iten = NULL; + size_t key_len = 0; + bool no_error = true; + + try { map_iten = map->First(); } + catch(JudyEx& e) { return false; } + + FILE *mapDB = fopen(file,"wb"); + if (!mapDB) return false; + + while( true ) + { + try { Storage = reinterpret_cast(map->Get(map_iten) ); } + catch(JudyEx& e) { return false; } + + key_len = strlen(map_iten); + + fwrite(&key_len, sizeof(size_t), 1, mapDB); + fwrite(&map_iten, sizeof(char), strlen(map_iten), mapDB); + + try { Storage->Save(mapDB); } + catch(JudyEx& e) { no_error = false; break; } + + try { map_iten = map->Next(map_iten); } + catch(JudyEx& e) { break; } + } + + fclose(mapDB); + return no_error; +}; + +bool JudyLoadMap(CBaseMap* map, char* file) +{ + FILE *mapDB = fopen(file, "ab+"); + if (!mapDB) return false; + + Capsule* Storage = NULL; + char* map_iten = NULL; + size_t key_len = 0; + bool no_error = true; + + while(!feof(mapDB)) + { + fread(&key_len,sizeof(size_t),1,mapDB); + + map_iten = new char[key_len+1]; + fgets(map_iten, key_len+1, mapDB); + + if (feof(mapDB) || ferror(mapDB)) break; + + Storage = new Capsule; + try { Storage->Load(mapDB); } + catch(JudyEx& e) { no_error = false; break; } + + map->Set(map_iten,Storage); + delete map_iten; + } + + fclose(mapDB); + return no_error; +} \ No newline at end of file diff --git a/dlls/arrayx/JudyExtra.h b/dlls/arrayx/JudyExtra.h new file mode 100644 index 00000000..8400ca77 --- /dev/null +++ b/dlls/arrayx/JudyExtra.h @@ -0,0 +1,20 @@ +#ifndef _JUDYARRAY_SHARED_INCLUDED +#define _JUDYARRAY_SHARED_INCLUDED + +#include "CBinTrie.h" +#include "CBaseList.h" +#include "CBaseMap.h" + +extern bool JudyClearBinTrie(BinTrie* trie); +extern bool JudySaveBinTrie(BinTrie* trie, char* file); +extern bool JudyLoadBinTrie(BinTrie* trie, char* file); + +extern bool JudyClearList(CBaseList* list); +extern bool JudySaveList(CBaseList* list, char* file); +extern bool JudyLoadList(CBaseList* list, char* file); + +extern bool JudyClearMap(CBaseMap* map); +extern bool JudySaveMap(CBaseMap* array, char* file); +extern bool JudyLoadMap(CBaseMap* array, char* file); + +#endif \ No newline at end of file diff --git a/dlls/arrayx/JudyIncludes.h b/dlls/arrayx/JudyIncludes.h new file mode 100644 index 00000000..5d4b009e --- /dev/null +++ b/dlls/arrayx/JudyIncludes.h @@ -0,0 +1,43 @@ +#ifndef _JUDYINC_INCLUDED +#define _JUDYINC_INCLUDED + +#include "osdefs.h" +//#include + +#ifndef __linux__ +#define JU_WIN +#endif + +#ifdef __WIN32__ +#define JU_WIN +#endif + +#define JUDYERROR_NOTEST 1 +#include "Judy.h" + +#ifdef __GNUC__ +#include +#include +#include +#endif + +#ifdef __linux__ +#include +#else +#define WINDOWS_LEAN_AND_MEAN +#include +#include +#endif + +#include +#include + +#include "amxxmodule.h" + +#include "JudyVar.h" +#include "JudyVec.h" +#include "JudyEx.h" + +#include "Capsule.h" + +#endif diff --git a/dlls/arrayx/JudyVar.h b/dlls/arrayx/JudyVar.h new file mode 100644 index 00000000..a05a2113 --- /dev/null +++ b/dlls/arrayx/JudyVar.h @@ -0,0 +1,70 @@ +#ifndef _JUDYVAR_H +#define _JUDYVAR_H + +#if defined HAVE_STDINT_H + //#include +#else + #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined HAVE_INTTYPES_H + #include + #else + #include + #endif + #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L + /* The ISO C99 defines the int16_t and int_32t types. If the compiler got + * here, these types are probably undefined. + */ + #if defined __MACH__ + #include + typedef unsigned short int uint16_t; + typedef unsigned long int uint32_t; + #elif defined __FreeBSD__ + #include + #else + typedef short int int16_t; + typedef unsigned short int uint16_t; + #if defined SN_TARGET_PS2 + typedef int int32_t; + typedef unsigned int uint32_t; + #else + typedef long int int32_t; + typedef unsigned long int uint32_t; + #endif + #if defined __WIN32__ || defined _WIN32 || defined WIN32 + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; + #define HAVE_I64 + #elif defined __GNUC__ + typedef long long int64_t; + typedef unsigned long long uint64_t; + #define HAVE_I64 + #endif + #endif + #endif +#endif + +#if defined _LP64 || defined WIN64 || defined _WIN64 + #if !defined __64BIT__ + #define __64BIT__ + #endif +#endif + +#if !defined PAWN_CELL_SIZE + #define PAWN_CELL_SIZE 32 /* by default, use 32-bit cells */ +#endif +#if PAWN_CELL_SIZE==16 + typedef uint16_t ucell; + typedef int16_t cell; +#elif PAWN_CELL_SIZE==32 + typedef uint32_t ucell; + typedef int32_t cell; +#define REAL float +#elif PAWN_CELL_SIZE==64 + typedef uint64_t ucell; + typedef int64_t cell; +#define REAL double +#else + #error Unsupported cell size (PAWN_CELL_SIZE) +#endif + +#endif \ No newline at end of file diff --git a/dlls/arrayx/JudyVec.h b/dlls/arrayx/JudyVec.h new file mode 100644 index 00000000..07511682 --- /dev/null +++ b/dlls/arrayx/JudyVec.h @@ -0,0 +1,20 @@ +#ifndef _JUDYVEC_INCLUDED +#define _JUDYVEC_INCLUDED + +#include "JudyIncludes.h" + +class JudyVec +{ +public: + REAL first; + REAL second; + REAL third; + + JudyVec(REAL one, REAL two, REAL three) { Set(one, two, three); } + ~JudyVec() {} + + void Get(REAL& one, REAL& two, REAL& three) { one = first; two = second; three = third; } + void Set(REAL one, REAL two, REAL three) { first = one; second = two; third = three; } +}; + +#endif \ No newline at end of file diff --git a/dlls/arrayx/ListNativeFunctions.h b/dlls/arrayx/ListNativeFunctions.h new file mode 100644 index 00000000..90289463 --- /dev/null +++ b/dlls/arrayx/ListNativeFunctions.h @@ -0,0 +1,114 @@ +#ifndef _LIST_NATIVE_FUNC_INC_H +#define _LIST_NATIVE_FUNC_INC_H + +#define JUDY_GLUE_FUNC( x , y ) x ## y + +#define JUDY_GLUE_STR( x, y ) #x#y + +#define JUDY_MASTER_EDIT_FUNCTIONS +#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( list , _clear ) +#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( list , _clear ) + +#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( list , _delete ) +#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( list , _delete ) + +#define JUDY_MASTER_IO_FUNCTIONS + +#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( list , _save ) +#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( list , _save ) +#define JUDY_SAVE_FUNC(list, file) JudySaveList ( list , file ) + +#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( list , _load ) +#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( list , _load ) +#define JUDY_LOAD_FUNC(list, file) JudyLoadList ( list , file ) + +#define JUDY_MASTER_AMOUNT_FUNCTIONS +#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( list , _count ) +#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( list , _count ) + +#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( list , _bycount ) +#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( list , _bycount ) + +#define JUDY_SLAVE_AMOUNT_FUNCTIONS + +#define JUDY_SLAVE_COUNT_FUNC JUDY_GLUE_FUNC( list , _size ) +#define JUDY_SLAVE_COUNT_STR JUDY_GLUE_STR ( list , _size ) + +#define JUDY_SLAVE_BYCOUNT_FUNC JUDY_GLUE_FUNC( list , _get_nth ) +#define JUDY_SLAVE_BYCOUNT_STR JUDY_GLUE_STR ( list , _get_nth ) + +#define JUDY_SLAVE_EDIT_FUNCTIONS + +#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( list , _memory ) +#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( list , _memory ) + +#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( list , _isfilled ) +#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( list , _isfilled ) + +#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( list , _isempty ) +#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( list , _isempty ) + +#define JUDY_SLAVE_REMOVE_FUNC JUDY_GLUE_FUNC( list , _remove ) +#define JUDY_SLAVE_REMOVE_STR JUDY_GLUE_STR ( list , _remove ) + +#define JUDY_SLAVE_EDIT_BOOL +#define JUDY_SLAVE_GET_BOOL_FUNC JUDY_GLUE_FUNC( list , _get_bool ) +#define JUDY_SLAVE_SET_BOOL_FUNC JUDY_GLUE_FUNC( list , _set_bool ) + +#define JUDY_SLAVE_GET_BOOL_STR JUDY_GLUE_STR ( list , _get_bool ) +#define JUDY_SLAVE_SET_BOOL_STR JUDY_GLUE_STR ( list , _set_bool ) + +#define JUDY_SLAVE_EDIT_INT +#define JUDY_SLAVE_GET_INT_FUNC JUDY_GLUE_FUNC( list , _get_int ) +#define JUDY_SLAVE_SET_INT_FUNC JUDY_GLUE_FUNC( list , _set_int ) + +#define JUDY_SLAVE_GET_INT_STR JUDY_GLUE_STR ( list , _get_int ) +#define JUDY_SLAVE_SET_INT_STR JUDY_GLUE_STR ( list , _set_int ) + +#define JUDY_SLAVE_EDIT_FLO +#define JUDY_SLAVE_GET_FLO_FUNC JUDY_GLUE_FUNC( list , _get_float ) +#define JUDY_SLAVE_SET_FLO_FUNC JUDY_GLUE_FUNC( list , _set_float ) + +#define JUDY_SLAVE_GET_FLO_STR JUDY_GLUE_STR ( list , _get_float ) +#define JUDY_SLAVE_SET_FLO_STR JUDY_GLUE_STR ( list , _set_float ) + +#define JUDY_SLAVE_EDIT_STR +#define JUDY_SLAVE_GET_STR_FUNC JUDY_GLUE_FUNC( list , _get_string ) +#define JUDY_SLAVE_SET_STR_FUNC JUDY_GLUE_FUNC( list , _set_string ) + +#define JUDY_SLAVE_GET_STR_STR JUDY_GLUE_STR ( list , _get_string ) +#define JUDY_SLAVE_SET_STR_STR JUDY_GLUE_STR ( list , _set_string ) + +#define JUDY_SLAVE_EDIT_VEC +#define JUDY_SLAVE_GET_VEC_FUNC JUDY_GLUE_FUNC( list , _get_vector ) +#define JUDY_SLAVE_SET_VEC_FUNC JUDY_GLUE_FUNC( list , _set_vector ) + +#define JUDY_SLAVE_GET_VEC_STR JUDY_GLUE_STR ( list , _get_vector ) +#define JUDY_SLAVE_SET_VEC_STR JUDY_GLUE_STR ( list , _set_vector ) + +#define JUDY_SLAVE_SEARCH_FUNCTIONS +#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( list , _first ) +#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( list , _last ) + +#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( list , _first ) +#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( list , _last ) + +#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( list , _next ) +#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( list , _prev ) + +#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( list , _next ) +#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( list , _prev ) + +#define JUDY_SLAVE_SEARCH_EMPTY_FUNCTIONS +#define JUDY_SLAVE_FIRSTEMPTY_FUNC JUDY_GLUE_FUNC( list , _firstempty ) +#define JUDY_SLAVE_LASTEMPTY_FUNC JUDY_GLUE_FUNC( list , _lastempty ) + +#define JUDY_SLAVE_FIRSTEMPTY_STR JUDY_GLUE_STR ( list , _firstempty ) +#define JUDY_SLAVE_LASTEMPTY_STR JUDY_GLUE_STR ( list , _lastempty ) + +#define JUDY_SLAVE_NEXTEMPTY_FUNC JUDY_GLUE_FUNC( list , _nextempty ) +#define JUDY_SLAVE_PREVEMPTY_FUNC JUDY_GLUE_FUNC( list , _prevempty ) + +#define JUDY_SLAVE_NEXTEMPTY_STR JUDY_GLUE_STR ( list , _nextempty ) +#define JUDY_SLAVE_PREVEMPTY_STR JUDY_GLUE_STR ( list , _prevempty ) +#endif \ No newline at end of file diff --git a/dlls/arrayx/ListNatives.cpp b/dlls/arrayx/ListNatives.cpp new file mode 100644 index 00000000..8e50be6d --- /dev/null +++ b/dlls/arrayx/ListNatives.cpp @@ -0,0 +1,43 @@ +#include "CBaseList.h" +#include "CArray.h" +#include "ComboArray.h" + +#define KEY_TYPE cell +#define DYNAMIC_UNIT_TYPE CBaseList +#define STORAGE_TYPE Capsule +#define MASTER_NAME MasterList +#define EXPORT_NAME list_exports + +#define SEARCH_ERROR_OFFSET 0 + +#define GET_KEY(params, num) params[num] +#define SET_KEY(stuff, parameter) stuff + +#include "ListNativeFunctions.h" +#include "NativeIncludes.h" + +static cell AMX_NATIVE_CALL array_create(AMX *amx,cell *params) +{ + DTYPE* Unit; + M_ITYPE Index = params[1]; + + JUDY_CREATE_INDEX(MNAME,Unit,Array,Index); + return Index; +} + +static cell AMX_NATIVE_CALL comboarray_create(AMX *amx,cell *params) +{ + DTYPE* Unit; + M_ITYPE Index = params[1]; + + JUDY_CREATE_INDEX(MNAME,Unit,ComboArray,Index); + return Index; +} + +AMX_NATIVE_INFO list_creation_exports[] = +{ + { "array_create", array_create }, + { "comboarray_create", comboarray_create }, + + { NULL, NULL } +}; \ No newline at end of file diff --git a/dlls/arrayx/MapNativeFunctions.h b/dlls/arrayx/MapNativeFunctions.h new file mode 100644 index 00000000..fdd28bdd --- /dev/null +++ b/dlls/arrayx/MapNativeFunctions.h @@ -0,0 +1,94 @@ +#ifndef _MAP_NATIVE_FUNC_INC_H +#define _MAP_NATIVE_FUNC_INC_H + +#define JUDY_GLUE_FUNC( x , y ) x ## y + +#define JUDY_GLUE_STR( x, y ) #x#y + +#define JUDY_MASTER_EDIT_FUNCTIONS +#define JUDY_MASTER_CLEAR_FUNC JUDY_GLUE_FUNC( map , _clear ) +#define JUDY_MASTER_CLEAR_STR JUDY_GLUE_STR ( map , _clear ) + +#define JUDY_MASTER_DELETE_FUNC JUDY_GLUE_FUNC( map , _delete ) +#define JUDY_MASTER_DELETE_STR JUDY_GLUE_STR ( map , _delete ) + +#define JUDY_MASTER_IO_FUNCTIONS + +#define JUDY_MASTER_SAVE_FUNC JUDY_GLUE_FUNC( map , _save ) +#define JUDY_MASTER_SAVE_STR JUDY_GLUE_STR ( map , _save ) +#define JUDY_SAVE_FUNC(map, file) JudySaveMap ( map , file ) + +#define JUDY_MASTER_LOAD_FUNC JUDY_GLUE_FUNC( map , _load ) +#define JUDY_MASTER_LOAD_STR JUDY_GLUE_STR ( map , _load ) +#define JUDY_LOAD_FUNC(map, file) JudyLoadMap ( map , file ) + +#define JUDY_MASTER_AMOUNT_FUNCTIONS +#define JUDY_MASTER_COUNT_FUNC JUDY_GLUE_FUNC( map , _count ) +#define JUDY_MASTER_COUNT_STR JUDY_GLUE_STR ( map , _count ) + +#define JUDY_MASTER_BYCOUNT_FUNC JUDY_GLUE_FUNC( map , _bycount ) +#define JUDY_MASTER_BYCOUNT_STR JUDY_GLUE_STR ( map , _bycount ) + +#define JUDY_SLAVE_EDIT_FUNCTIONS + +#define JUDY_SLAVE_MEMORY_FUNC JUDY_GLUE_FUNC( map , _memory ) +#define JUDY_SLAVE_MEMORY_STR JUDY_GLUE_STR ( map , _memory ) + +#define JUDY_SLAVE_ISFILLED_FUNC JUDY_GLUE_FUNC( map , _isfilled ) +#define JUDY_SLAVE_ISFILLED_STR JUDY_GLUE_STR ( map , _isfilled ) + +#define JUDY_SLAVE_ISEMPTY_FUNC JUDY_GLUE_FUNC( map , _isempty ) +#define JUDY_SLAVE_ISEMPTY_STR JUDY_GLUE_STR ( map , _isempty ) + +#define JUDY_SLAVE_REMOVE_FUNC JUDY_GLUE_FUNC( map , _remove ) +#define JUDY_SLAVE_REMOVE_STR JUDY_GLUE_STR ( map , _remove ) + +#define JUDY_SLAVE_EDIT_BOOL +#define JUDY_SLAVE_GET_BOOL_FUNC JUDY_GLUE_FUNC( map , _get_bool ) +#define JUDY_SLAVE_SET_BOOL_FUNC JUDY_GLUE_FUNC( map , _set_bool ) + +#define JUDY_SLAVE_GET_BOOL_STR JUDY_GLUE_STR ( map , _get_bool ) +#define JUDY_SLAVE_SET_BOOL_STR JUDY_GLUE_STR ( map , _set_bool ) + +#define JUDY_SLAVE_EDIT_INT +#define JUDY_SLAVE_GET_INT_FUNC JUDY_GLUE_FUNC( map , _get_int ) +#define JUDY_SLAVE_SET_INT_FUNC JUDY_GLUE_FUNC( map , _set_int ) + +#define JUDY_SLAVE_GET_INT_STR JUDY_GLUE_STR ( map , _get_int ) +#define JUDY_SLAVE_SET_INT_STR JUDY_GLUE_STR ( map , _set_int ) + +#define JUDY_SLAVE_EDIT_FLO +#define JUDY_SLAVE_GET_FLO_FUNC JUDY_GLUE_FUNC( map , _get_float ) +#define JUDY_SLAVE_SET_FLO_FUNC JUDY_GLUE_FUNC( map , _set_float ) + +#define JUDY_SLAVE_GET_FLO_STR JUDY_GLUE_STR ( map , _get_float ) +#define JUDY_SLAVE_SET_FLO_STR JUDY_GLUE_STR ( map , _set_float ) + +#define JUDY_SLAVE_EDIT_STR +#define JUDY_SLAVE_GET_STR_FUNC JUDY_GLUE_FUNC( map , _get_string ) +#define JUDY_SLAVE_SET_STR_FUNC JUDY_GLUE_FUNC( map , _set_string ) + +#define JUDY_SLAVE_GET_STR_STR JUDY_GLUE_STR ( map , _get_string ) +#define JUDY_SLAVE_SET_STR_STR JUDY_GLUE_STR ( map , _set_string ) + +#define JUDY_SLAVE_EDIT_VEC +#define JUDY_SLAVE_GET_VEC_FUNC JUDY_GLUE_FUNC( map , _get_vector ) +#define JUDY_SLAVE_SET_VEC_FUNC JUDY_GLUE_FUNC( map , _set_vector ) + +#define JUDY_SLAVE_GET_VEC_STR JUDY_GLUE_STR ( map , _get_vector ) +#define JUDY_SLAVE_SET_VEC_STR JUDY_GLUE_STR ( map , _set_vector ) + +#define JUDY_SLAVE_SEARCH_FUNCTIONS +#define JUDY_SLAVE_FIRST_FUNC JUDY_GLUE_FUNC( map , _first ) +#define JUDY_SLAVE_LAST_FUNC JUDY_GLUE_FUNC( map , _last ) + +#define JUDY_SLAVE_FIRST_STR JUDY_GLUE_STR ( map , _first ) +#define JUDY_SLAVE_LAST_STR JUDY_GLUE_STR ( map , _last ) + +#define JUDY_SLAVE_NEXT_FUNC JUDY_GLUE_FUNC( map , _next ) +#define JUDY_SLAVE_PREV_FUNC JUDY_GLUE_FUNC( map , _prev ) + +#define JUDY_SLAVE_NEXT_STR JUDY_GLUE_STR ( map , _next ) +#define JUDY_SLAVE_PREV_STR JUDY_GLUE_STR ( map , _prev ) + +#endif \ No newline at end of file diff --git a/dlls/arrayx/MapNatives.cpp b/dlls/arrayx/MapNatives.cpp new file mode 100644 index 00000000..38de80e6 --- /dev/null +++ b/dlls/arrayx/MapNatives.cpp @@ -0,0 +1,54 @@ +#include "CBaseMap.h" +#include "CKeytable.h" +#include "ComboTable.h" +#include "CHashtable.h" + +#define KEY_TYPE char* +#define DYNAMIC_UNIT_TYPE CBaseMap +#define STORAGE_TYPE Capsule +#define MASTER_NAME MasterMap +#define EXPORT_NAME map_exports + +#define SEARCH_ERROR_OFFSET 2 + +#define GET_KEY(params, num) MF_GetAmxString(amx,params[num],num,NULL) +#define SET_KEY(str, num) MF_SetAmxString(amx,params[num],str,params[num + 1]) + +#include "MapNativeFunctions.h" +#include "NativeIncludes.h" + +static cell AMX_NATIVE_CALL keytable_create(AMX *amx,cell *params) +{ + DTYPE* Unit = NULL; + M_ITYPE Index = NULL; + + JUDY_CREATE_INDEX(MNAME,Unit,Keytable,Index); + return Index; +} + +static cell AMX_NATIVE_CALL combotable_create(AMX *amx,cell *params) +{ + DTYPE* Unit = NULL; + M_ITYPE Index = NULL; + + JUDY_CREATE_INDEX(MNAME,Unit,ComboTable,Index); + return Index; +} + +static cell AMX_NATIVE_CALL hashtable_create(AMX *amx,cell *params) +{ + DTYPE* Unit; + M_ITYPE Index = params[1]; + + JUDY_CREATE_INDEX(MNAME,Unit,Hashtable,Index); + return Index; +} + +AMX_NATIVE_INFO map_creation_exports[] = +{ + { "keytable_create", keytable_create }, + { "combotable_create", combotable_create }, + { "hashtable_create", hashtable_create }, + + { NULL, NULL } +}; \ No newline at end of file diff --git a/dlls/arrayx/NativeIncludes.h b/dlls/arrayx/NativeIncludes.h new file mode 100644 index 00000000..dc5def17 --- /dev/null +++ b/dlls/arrayx/NativeIncludes.h @@ -0,0 +1,130 @@ +#ifndef _NATIVE_INC_H +#define _NATIVE_INC_H + +#include "ComboArray.h" + +#ifndef SEARCH_ERROR_OFFSET +#define SEARCH_ERROR_OFFSET 0 +#endif + +#define SE_OFFSET SEARCH_ERROR_OFFSET + +#ifndef STORAGE_TYPE +#error No storage type declared +#endif + +#define STYPE STORAGE_TYPE + +#ifndef KEY_TYPE +#error No key type declared +#endif + +#define ITYPE KEY_TYPE + +#ifndef DYNAMIC_UNIT_TYPE +#error No Dynamic type declared +#endif + +#define DTYPE DYNAMIC_UNIT_TYPE + +#ifndef MASTER_NAME +#error No master name declared +#endif + +#define MNAME MASTER_NAME +#define M_ITYPE cell + +#ifndef GET_KEY +#error No method of getting keys has been declared +#endif + +#ifndef EXPORT_NAME +#define EXPORT_NAME MNAME_exports +#endif + +#define SE_OFFSET SEARCH_ERROR_OFFSET + +#define JUDY_GET_KEY GET_KEY + +#ifndef SET_KEY +#error No method of setting keys has been declared +#endif + +#define JUDY_SET_KEY SET_KEY + +#ifndef JUDY_ERROR_CATCH +#define JUDY_ERROR_CATCH(x_str) \ + catch(JudyEx& e) \ + { \ + if(e.IsFatal() )\ + {\ + MF_LogError(amx,AMX_ERR_NATIVE, "%s || Judy Error: %s", x_str, e.ErrorMessage());\ + return NULL;\ + };\ + return NULL;\ + }\ + catch(...) { MF_LogError(amx,AMX_ERR_NATIVE,"Unknown error occured, please post a bug report at www.amxmodx.org/forums"); return NULL; } +#endif + +#ifndef JUDY_SEARCH_ERROR_CATCH +#define JUDY_SEARCH_ERROR_CATCH(x_str, success) \ + catch(JudyEx& e) \ + { \ + if(e.IsFatal() )\ + {\ + MF_LogError(amx,AMX_ERR_NATIVE, "%s || Judy Error: %s", x_str, e.ErrorMessage());\ + return NULL;\ + };\ + return (success = 0);\ + }\ + catch(...) { MF_LogError(amx,AMX_ERR_NATIVE,"Unknown error occured, please post a bug report at www.amxmodx.org/forums"); return NULL; } +#endif + +#ifndef JUDY_CREATE_INDEX +#define JUDY_CREATE_INDEX(master, slave, slave_type, index)\ +\ + if( index == NULL )\ + {\ + try { index = master.FirstEmpty(); }\ + JUDY_ERROR_CATCH("Unable to create new unit (out of memory)");\ +\ + slave = new slave_type;\ + master.Set(index,slave);\ + } \ + else if(master.IsEmpty(index) )\ + {\ + slave = new slave_type;\ + master.Set(index,slave);\ + }\ + else slave = master.Get(index, slave ); + +#endif + +#ifndef JUDY_GET_INDEX +#define JUDY_GET_INDEX(master,slave, where) \ + try { slave = master.Get(where,slave); } \ + JUDY_ERROR_CATCH("Unable to access old unit (invalid index)"); +#endif + +#ifndef JUDY_SET_INDEX +#define JUDY_SET_INDEX(master,slave, where) \ + try { master.Set(where,slave); } \ + JUDY_ERROR_CATCH("Unknown Error occured (No error possible) - Set Function");\ + return 1; +#endif + +#ifndef JUDY_SET_INDEX_P +#define JUDY_SET_INDEX_P(master,slave, where) \ + try { master->Set(where,slave); } \ + JUDY_ERROR_CATCH("Unknown Error occured (No error possible) - Set Function");\ + return 1; +#endif + +inline char* JUDY_BUILD_PATH(AMX *amx, cell param, int buffer = 0) +{ + char *file = MF_GetAmxString(amx, param, 0, NULL); + return MF_BuildPathname("%s", file); +} + +#include "GenericNatives.h" +#endif \ No newline at end of file diff --git a/dlls/arrayx/amxxmodule.cpp b/dlls/arrayx/amxxmodule.cpp new file mode 100644 index 00000000..e374e441 --- /dev/null +++ b/dlls/arrayx/amxxmodule.cpp @@ -0,0 +1,3078 @@ +/* AMX Mod X +* +* by the AMX Mod X Development Team +* originally developed by OLO +* +* Parts Copyright (C) 2001-2003 Will Day +* +* This program 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. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, 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. +* +* Description: AMX Mod X Module Interface Functions +*/ + +#include +#include +#include +#include +#include +#include "amxxmodule.h" + +/************* METAMOD SUPPORT *************/ +#ifdef USE_METAMOD + +enginefuncs_t g_engfuncs; +globalvars_t *gpGlobals; + +DLL_FUNCTIONS *g_pFunctionTable; +DLL_FUNCTIONS *g_pFunctionTable_Post; +enginefuncs_t *g_pengfuncsTable; +enginefuncs_t *g_pengfuncsTable_Post; +NEW_DLL_FUNCTIONS *g_pNewFunctionsTable; +NEW_DLL_FUNCTIONS *g_pNewFunctionsTable_Post; + +// GetEntityAPI2 functions +static DLL_FUNCTIONS g_EntityAPI_Table = +{ +#ifdef FN_GameDLLInit + FN_GameDLLInit, +#else + NULL, +#endif +#ifdef FN_DispatchSpawn + FN_DispatchSpawn, +#else + NULL, +#endif +#ifdef FN_DispatchThink + FN_DispatchThink, +#else + NULL, +#endif +#ifdef FN_DispatchUse + FN_DispatchUse, +#else + NULL, +#endif +#ifdef FN_DispatchTouch + FN_DispatchTouch, +#else + NULL, +#endif +#ifdef FN_DispatchBlocked + FN_DispatchBlocked, +#else + NULL, +#endif +#ifdef FN_DispatchKeyValue + FN_DispatchKeyValue, +#else + NULL, +#endif +#ifdef FN_DispatchSave + FN_DispatchSave, +#else + NULL, +#endif +#ifdef FN_DispatchRestore + FN_DispatchRestore, +#else + NULL, +#endif +#ifdef FN_DispatchObjectCollsionBox + FN_DispatchObjectCollsionBox, +#else + NULL, +#endif +#ifdef FN_SaveWriteFields + FN_SaveWriteFields, +#else + NULL, +#endif +#ifdef FN_SaveReadFields + FN_SaveReadFields, +#else + NULL, +#endif +#ifdef FN_SaveGlobalState + FN_SaveGlobalState, +#else + NULL, +#endif +#ifdef FN_RestoreGlobalState + FN_RestoreGlobalState, +#else + NULL, +#endif +#ifdef FN_ResetGlobalState + FN_ResetGlobalState, +#else + NULL, +#endif +#ifdef FN_ClientConnect + FN_ClientConnect, +#else + NULL, +#endif +#ifdef FN_ClientDisconnect + FN_ClientDisconnect, +#else + NULL, +#endif +#ifdef FN_ClientKill + FN_ClientKill, +#else + NULL, +#endif +#ifdef FN_ClientPutInServer + FN_ClientPutInServer, +#else + NULL, +#endif +#ifdef FN_ClientCommand + FN_ClientCommand, +#else + NULL, +#endif +#ifdef FN_ClientUserInfoChanged + FN_ClientUserInfoChanged, +#else + NULL, +#endif +#ifdef FN_ServerActivate + FN_ServerActivate, +#else + NULL, +#endif +#ifdef FN_ServerDeactivate + FN_ServerDeactivate, +#else + NULL, +#endif +#ifdef FN_PlayerPreThink + FN_PlayerPreThink, +#else + NULL, +#endif +#ifdef FN_PlayerPostThink + FN_PlayerPostThink, +#else + NULL, +#endif +#ifdef FN_StartFrame + FN_StartFrame, +#else + NULL, +#endif +#ifdef FN_ParmsNewLevel + FN_ParmsNewLevel, +#else + NULL, +#endif +#ifdef FN_ParmsChangeLevel + FN_ParmsChangeLevel, +#else + NULL, +#endif +#ifdef FN_GetGameDescription + FN_GetGameDescription, +#else + NULL, +#endif +#ifdef FN_PlayerCustomization + FN_PlayerCustomization, +#else + NULL, +#endif +#ifdef FN_SpectatorConnect + FN_SpectatorConnect, +#else + NULL, +#endif +#ifdef FN_SpectatorDisconnect + FN_SpectatorDisconnect, +#else + NULL, +#endif +#ifdef FN_SpectatorThink + FN_SpectatorThink, +#else + NULL, +#endif +#ifdef FN_Sys_Error + FN_Sys_Error, +#else + NULL, +#endif +#ifdef FN_PM_Move + FN_PM_Move, +#else + NULL, +#endif +#ifdef FN_PM_Init + FN_PM_Init, +#else + NULL, +#endif +#ifdef FN_PM_FindTextureType + FN_PM_FindTextureType, +#else + NULL, +#endif +#ifdef FN_SetupVisibility + FN_SetupVisibility, +#else + NULL, +#endif +#ifdef FN_UpdateClientData + FN_UpdateClientData, +#else + NULL, +#endif +#ifdef FN_AddToFullPack + FN_AddToFullPack, +#else + NULL, +#endif +#ifdef FN_CreateBaseline + FN_CreateBaseline, +#else + NULL, +#endif +#ifdef FN_RegisterEncoders + FN_RegisterEncoders, +#else + NULL, +#endif +#ifdef FN_GetWeaponData + FN_GetWeaponData, +#else + NULL, +#endif +#ifdef FN_CmdStart + FN_CmdStart, +#else + NULL, +#endif +#ifdef FN_CmdEnd + FN_CmdEnd, +#else + NULL, +#endif +#ifdef FN_ConnectionlessPacket + FN_ConnectionlessPacket, +#else + NULL, +#endif +#ifdef FN_GetHullBounds + FN_GetHullBounds, +#else + NULL, +#endif +#ifdef FN_CreateInstancedBaselines + FN_CreateInstancedBaselines, +#else + NULL, +#endif +#ifdef FN_InconsistentFile + FN_InconsistentFile, +#else + NULL, +#endif +#ifdef FN_AllowLagCompensation + FN_AllowLagCompensation +#else + NULL +#endif +}; // g_EntityAPI2_Table + +// GetEntityAPI2_Post functions +static DLL_FUNCTIONS g_EntityAPI_Post_Table = +{ +#ifdef FN_GameDLLInit_Post + FN_GameDLLInit_Post, +#else + NULL, +#endif +#ifdef FN_DispatchSpawn_Post + FN_DispatchSpawn_Post, +#else + NULL, +#endif +#ifdef FN_DispatchThink_Post + FN_DispatchThink_Post, +#else + NULL, +#endif +#ifdef FN_DispatchUse_Post + FN_DispatchUse_Post, +#else + NULL, +#endif +#ifdef FN_DispatchTouch_Post + FN_DispatchTouch_Post, +#else + NULL, +#endif +#ifdef FN_DispatchBlocked_Post + FN_DispatchBlocked_Post, +#else + NULL, +#endif +#ifdef FN_DispatchKeyValue_Post + FN_DispatchKeyValue_Post, +#else + NULL, +#endif +#ifdef FN_DispatchSave_Post + FN_DispatchSave_Post, +#else + NULL, +#endif +#ifdef FN_DispatchRestore_Post + FN_DispatchRestore_Post, +#else + NULL, +#endif +#ifdef FN_DispatchObjectCollsionBox_Post + FN_DispatchObjectCollsionBox_Post, +#else + NULL, +#endif +#ifdef FN_SaveWriteFields_Post + FN_SaveWriteFields_Post, +#else + NULL, +#endif +#ifdef FN_SaveReadFields_Post + FN_SaveReadFields_Post, +#else + NULL, +#endif +#ifdef FN_SaveGlobalState_Post + FN_SaveGlobalState_Post, +#else + NULL, +#endif +#ifdef FN_RestoreGlobalState_Post + FN_RestoreGlobalState_Post, +#else + NULL, +#endif +#ifdef FN_ResetGlobalState_Post + FN_ResetGlobalState_Post, +#else + NULL, +#endif +#ifdef FN_ClientConnect_Post + FN_ClientConnect_Post, +#else + NULL, +#endif +#ifdef FN_ClientDisconnect_Post + FN_ClientDisconnect_Post, +#else + NULL, +#endif +#ifdef FN_ClientKill_Post + FN_ClientKill_Post, +#else + NULL, +#endif +#ifdef FN_ClientPutInServer_Post + FN_ClientPutInServer_Post, +#else + NULL, +#endif +#ifdef FN_ClientCommand_Post + FN_ClientCommand_Post, +#else + NULL, +#endif +#ifdef FN_ClientUserInfoChanged_Post + FN_ClientUserInfoChanged_Post, +#else + NULL, +#endif +#ifdef FN_ServerActivate_Post + FN_ServerActivate_Post, +#else + NULL, +#endif +#ifdef FN_ServerDeactivate_Post + FN_ServerDeactivate_Post, +#else + NULL, +#endif +#ifdef FN_PlayerPreThink_Post + FN_PlayerPreThink_Post, +#else + NULL, +#endif +#ifdef FN_PlayerPostThink_Post + FN_PlayerPostThink_Post, +#else + NULL, +#endif +#ifdef FN_StartFrame_Post + FN_StartFrame_Post, +#else + NULL, +#endif +#ifdef FN_ParmsNewLevel_Post + FN_ParmsNewLevel_Post, +#else + NULL, +#endif +#ifdef FN_ParmsChangeLevel_Post + FN_ParmsChangeLevel_Post, +#else + NULL, +#endif +#ifdef FN_GetGameDescription_Post + FN_GetGameDescription_Post, +#else + NULL, +#endif +#ifdef FN_PlayerCustomization_Post + FN_PlayerCustomization_Post, +#else + NULL, +#endif +#ifdef FN_SpectatorConnect_Post + FN_SpectatorConnect_Post, +#else + NULL, +#endif +#ifdef FN_SpectatorDisconnect_Post + FN_SpectatorDisconnect_Post, +#else + NULL, +#endif +#ifdef FN_SpectatorThink_Post + FN_SpectatorThink_Post, +#else + NULL, +#endif +#ifdef FN_Sys_Error_Post + FN_Sys_Error_Post, +#else + NULL, +#endif +#ifdef FN_PM_Move_Post + FN_PM_Move_Post, +#else + NULL, +#endif +#ifdef FN_PM_Init_Post + FN_PM_Init_Post, +#else + NULL, +#endif +#ifdef FN_PM_FindTextureType_Post + FN_PM_FindTextureType_Post, +#else + NULL, +#endif +#ifdef FN_SetupVisibility_Post + FN_SetupVisibility_Post, +#else + NULL, +#endif +#ifdef FN_UpdateClientData_Post + FN_UpdateClientData_Post, +#else + NULL, +#endif +#ifdef FN_AddToFullPack_Post + FN_AddToFullPack_Post, +#else + NULL, +#endif +#ifdef FN_CreateBaseline_Post + FN_CreateBaseline_Post, +#else + NULL, +#endif +#ifdef FN_RegisterEncoders_Post + FN_RegisterEncoders_Post, +#else + NULL, +#endif +#ifdef FN_GetWeaponData_Post + FN_GetWeaponData_Post, +#else + NULL, +#endif +#ifdef FN_CmdStart_Post + FN_CmdStart_Post, +#else + NULL, +#endif +#ifdef FN_CmdEnd_Post + FN_CmdEnd_Post, +#else + NULL, +#endif +#ifdef FN_ConnectionlessPacket_Post + FN_ConnectionlessPacket_Post, +#else + NULL, +#endif +#ifdef FN_GetHullBounds_Post + FN_GetHullBounds_Post, +#else + NULL, +#endif +#ifdef FN_CreateInstancedBaselines_Post + FN_CreateInstancedBaselines_Post, +#else + NULL, +#endif +#ifdef FN_InconsistentFile_Post + FN_InconsistentFile_Post, +#else + NULL, +#endif +#ifdef FN_AllowLagCompensation + FN_AllowLagCompensation, +#else + NULL, +#endif +}; // g_EntityAPI2_Table + +static enginefuncs_t g_EngineFuncs_Table = +{ +#ifdef FN_PrecacheModel + FN_PrecacheModel, +#else + NULL, +#endif +#ifdef FN_PrecacheSound + FN_PrecacheSound, +#else + NULL, +#endif +#ifdef FN_SetModel + FN_SetModel, +#else + NULL, +#endif +#ifdef FN_ModelIndex + FN_ModelIndex, +#else + NULL, +#endif +#ifdef FN_ModelFrames + FN_ModelFrames, +#else + NULL, +#endif +#ifdef FN_SetSize + FN_SetSize, +#else + NULL, +#endif +#ifdef FN_ChangeLevel + FN_ChangeLevel, +#else + NULL, +#endif +#ifdef FN_GetSpawnParms + FN_GetSpawnParms, +#else + NULL, +#endif +#ifdef FN_SaveSpawnParms + FN_SaveSpawnParms, +#else + NULL, +#endif +#ifdef FN_VecToYaw + FN_VecToYaw, +#else + NULL, +#endif +#ifdef FN_VecToAngles + FN_VecToAngles, +#else + NULL, +#endif +#ifdef FN_MoveToOrigin + FN_MoveToOrigin, +#else + NULL, +#endif +#ifdef FN_ChangeYaw + FN_ChangeYaw, +#else + NULL, +#endif +#ifdef FN_ChangePitch + FN_ChangePitch, +#else + NULL, +#endif +#ifdef FN_FindEntityByString + FN_FindEntityByString, +#else + NULL, +#endif +#ifdef FN_GetEntityIllum + FN_GetEntityIllum, +#else + NULL, +#endif +#ifdef FN_FindEntityInSphere + FN_FindEntityInSphere, +#else + NULL, +#endif +#ifdef FN_FindClientInPVS + FN_FindClientInPVS, +#else + NULL, +#endif +#ifdef FN_EntitiesInPVS + FN_EntitiesInPVS, +#else + NULL, +#endif +#ifdef FN_MakeVectors + FN_MakeVectors, +#else + NULL, +#endif +#ifdef FN_AngleVectors + FN_AngleVectors, +#else + NULL, +#endif +#ifdef FN_CreateEntity + FN_CreateEntity, +#else + NULL, +#endif +#ifdef FN_RemoveEntity + FN_RemoveEntity, +#else + NULL, +#endif +#ifdef FN_CreateNamedEntity + FN_CreateNamedEntity, +#else + NULL, +#endif +#ifdef FN_MakeStatic + FN_MakeStatic, +#else + NULL, +#endif +#ifdef FN_EntIsOnFloor + FN_EntIsOnFloor, +#else + NULL, +#endif +#ifdef FN_DropToFloor + FN_DropToFloor, +#else + NULL, +#endif +#ifdef FN_WalkMove + FN_WalkMove, +#else + NULL, +#endif +#ifdef FN_SetOrigin + FN_SetOrigin, +#else + NULL, +#endif +#ifdef FN_EmitSound + FN_EmitSound, +#else + NULL, +#endif +#ifdef FN_EmitAmbientSound + FN_EmitAmbientSound, +#else + NULL, +#endif +#ifdef FN_TraceLine + FN_TraceLine, +#else + NULL, +#endif +#ifdef FN_TraceToss + FN_TraceToss, +#else + NULL, +#endif +#ifdef FN_TraceMonsterHull + FN_TraceMonsterHull, +#else + NULL, +#endif +#ifdef FN_TraceHull + FN_TraceHull, +#else + NULL, +#endif +#ifdef FN_TraceModel + FN_TraceModel, +#else + NULL, +#endif +#ifdef FN_TraceTexture + FN_TraceTexture, +#else + NULL, +#endif +#ifdef FN_TraceSphere + FN_TraceSphere, +#else + NULL, +#endif +#ifdef FN_GetAimVector + FN_GetAimVector, +#else + NULL, +#endif +#ifdef FN_ServerCommand + FN_ServerCommand, +#else + NULL, +#endif +#ifdef FN_ServerExecute + FN_ServerExecute, +#else + NULL, +#endif +#ifdef FN_engClientCommand + FN_engClientCommand, +#else + NULL, +#endif +#ifdef FN_ParticleEffect + FN_ParticleEffect, +#else + NULL, +#endif +#ifdef FN_LightStyle + FN_LightStyle, +#else + NULL, +#endif +#ifdef FN_DecalIndex + FN_DecalIndex, +#else + NULL, +#endif +#ifdef FN_PointContents + FN_PointContents, +#else + NULL, +#endif +#ifdef FN_MessageBegin + FN_MessageBegin, +#else + NULL, +#endif +#ifdef FN_MessageEnd + FN_MessageEnd, +#else + NULL, +#endif +#ifdef FN_WriteByte + FN_WriteByte, +#else + NULL, +#endif +#ifdef FN_WriteChar + FN_WriteChar, +#else + NULL, +#endif +#ifdef FN_WriteShort + FN_WriteShort, +#else + NULL, +#endif +#ifdef FN_WriteLong + FN_WriteLong, +#else + NULL, +#endif +#ifdef FN_WriteAngle + FN_WriteAngle, +#else + NULL, +#endif +#ifdef FN_WriteCoord + FN_WriteCoord, +#else + NULL, +#endif +#ifdef FN_WriteString + FN_WriteString, +#else + NULL, +#endif +#ifdef FN_WriteEntity + FN_WriteEntity, +#else + NULL, +#endif +#ifdef FN_CVarRegister + FN_CVarRegister, +#else + NULL, +#endif +#ifdef FN_CVarGetFloat + FN_CVarGetFloat, +#else + NULL, +#endif +#ifdef FN_CVarGetString + FN_CVarGetString, +#else + NULL, +#endif +#ifdef FN_CVarSetFloat + FN_CVarSetFloat, +#else + NULL, +#endif +#ifdef FN_CVarSetString + FN_CVarSetString, +#else + NULL, +#endif +#ifdef FN_AlertMessage + FN_AlertMessage, +#else + NULL, +#endif +#ifdef FN_EngineFprintf + FN_EngineFprintf, +#else + NULL, +#endif +#ifdef FN_PvAllocEntPrivateData + FN_PvAllocEntPrivateData, +#else + NULL, +#endif +#ifdef FN_PvEntPrivateData + FN_PvEntPrivateData, +#else + NULL, +#endif +#ifdef FN_FreeEntPrivateData + FN_FreeEntPrivateData, +#else + NULL, +#endif +#ifdef FN_SzFromIndex + FN_SzFromIndex, +#else + NULL, +#endif +#ifdef FN_AllocString + FN_AllocString, +#else + NULL, +#endif +#ifdef FN_GetVarsOfEnt + FN_GetVarsOfEnt, +#else + NULL, +#endif +#ifdef FN_PEntityOfEntOffset + FN_PEntityOfEntOffset, +#else + NULL, +#endif +#ifdef FN_EntOffsetOfPEntity + FN_EntOffsetOfPEntity, +#else + NULL, +#endif +#ifdef FN_IndexOfEdict + FN_IndexOfEdict, +#else + NULL, +#endif +#ifdef FN_PEntityOfEntIndex + FN_PEntityOfEntIndex, +#else + NULL, +#endif +#ifdef FN_FindEntityByVars + FN_FindEntityByVars, +#else + NULL, +#endif +#ifdef FN_GetModelPtr + FN_GetModelPtr, +#else + NULL, +#endif +#ifdef FN_RegUserMsg + FN_RegUserMsg, +#else + NULL, +#endif +#ifdef FN_AnimationAutomove + FN_AnimationAutomove, +#else + NULL, +#endif +#ifdef FN_GetBonePosition + FN_GetBonePosition, +#else + NULL, +#endif +#ifdef FN_FunctionFromName + FN_FunctionFromName, +#else + NULL, +#endif +#ifdef FN_NameForFunction + FN_NameForFunction, +#else + NULL, +#endif +#ifdef FN_ClientPrintf + FN_ClientPrintf, +#else + NULL, +#endif +#ifdef FN_ServerPrint + FN_ServerPrint, +#else + NULL, +#endif +#ifdef FN_Cmd_Args + FN_Cmd_Args, +#else + NULL, +#endif +#ifdef FN_Cmd_Argv + FN_Cmd_Argv, +#else + NULL, +#endif +#ifdef FN_Cmd_Argc + FN_Cmd_Argc, +#else + NULL, +#endif +#ifdef FN_GetAttachment + FN_GetAttachment, +#else + NULL, +#endif +#ifdef FN_CRC32_Init + FN_CRC32_Init, +#else + NULL, +#endif +#ifdef FN_CRC32_ProcessBuffer + FN_CRC32_ProcessBuffer, +#else + NULL, +#endif +#ifdef FN_CRC32_ProcessByte + FN_CRC32_ProcessByte, +#else + NULL, +#endif +#ifdef FN_CRC32_Final + FN_CRC32_Final, +#else + NULL, +#endif +#ifdef FN_RandomLong + FN_RandomLong, +#else + NULL, +#endif +#ifdef FN_RandomFloat + FN_RandomFloat, +#else + NULL, +#endif +#ifdef FN_SetView + FN_SetView, +#else + NULL, +#endif +#ifdef FN_Time + FN_Time, +#else + NULL, +#endif +#ifdef FN_CrosshairAngle + FN_CrosshairAngle, +#else + NULL, +#endif +#ifdef FN_LoadFileForMe + FN_LoadFileForMe, +#else + NULL, +#endif +#ifdef FN_FreeFile + FN_FreeFile, +#else + NULL, +#endif +#ifdef FN_EndSection + FN_EndSection, +#else + NULL, +#endif +#ifdef FN_CompareFileTime + FN_CompareFileTime, +#else + NULL, +#endif +#ifdef FN_GetGameDir + FN_GetGameDir, +#else + NULL, +#endif +#ifdef FN_Cvar_RegisterVariable + FN_Cvar_RegisterVariable, +#else + NULL, +#endif +#ifdef FN_FadeClientVolume + FN_FadeClientVolume, +#else + NULL, +#endif +#ifdef FN_SetClientMaxspeed + FN_SetClientMaxspeed, +#else + NULL, +#endif +#ifdef FN_CreateFakeClient + FN_CreateFakeClient, +#else + NULL, +#endif +#ifdef FN_RunPlayerMove + FN_RunPlayerMove, +#else + NULL, +#endif +#ifdef FN_NumberOfEntities + FN_NumberOfEntities, +#else + NULL, +#endif +#ifdef FN_GetInfoKeyBuffer + FN_GetInfoKeyBuffer, +#else + NULL, +#endif +#ifdef FN_InfoKeyValue + FN_InfoKeyValue, +#else + NULL, +#endif +#ifdef FN_SetKeyValue + FN_SetKeyValue, +#else + NULL, +#endif +#ifdef FN_SetClientKeyValue + FN_SetClientKeyValue, +#else + NULL, +#endif +#ifdef FN_IsMapValid + FN_IsMapValid, +#else + NULL, +#endif +#ifdef FN_StaticDecal + FN_StaticDecal, +#else + NULL, +#endif +#ifdef FN_PrecacheGeneric + FN_PrecacheGeneric, +#else + NULL, +#endif +#ifdef FN_GetPlayerUserId + FN_GetPlayerUserId, +#else + NULL, +#endif +#ifdef FN_BuildSoundMsg + FN_BuildSoundMsg, +#else + NULL, +#endif +#ifdef FN_IsDedicatedServer + FN_IsDedicatedServer, +#else + NULL, +#endif +#ifdef FN_CVarGetPointer + FN_CVarGetPointer, +#else + NULL, +#endif +#ifdef FN_GetPlayerWONId + FN_GetPlayerWONId, +#else + NULL, +#endif +#ifdef FN_Info_RemoveKey + FN_Info_RemoveKey, +#else + NULL, +#endif +#ifdef FN_GetPhysicsKeyValue + FN_GetPhysicsKeyValue, +#else + NULL, +#endif +#ifdef FN_SetPhysicsKeyValue + FN_SetPhysicsKeyValue, +#else + NULL, +#endif +#ifdef FN_GetPhysicsInfoString + FN_GetPhysicsInfoString, +#else + NULL, +#endif +#ifdef FN_PrecacheEvent + FN_PrecacheEvent, +#else + NULL, +#endif +#ifdef FN_PlaybackEvent + FN_PlaybackEvent, +#else + NULL, +#endif +#ifdef FN_SetFatPVS + FN_SetFatPVS, +#else + NULL, +#endif +#ifdef FN_SetFatPAS + FN_SetFatPAS, +#else + NULL, +#endif +#ifdef FN_CheckVisibility + FN_CheckVisibility, +#else + NULL, +#endif +#ifdef FN_DeltaSetField + FN_DeltaSetField, +#else + NULL, +#endif +#ifdef FN_DeltaUnsetField + FN_DeltaUnsetField, +#else + NULL, +#endif +#ifdef FN_DeltaAddEncoder + FN_DeltaAddEncoder, +#else + NULL, +#endif +#ifdef FN_GetCurrentPlayer + FN_GetCurrentPlayer, +#else + NULL, +#endif +#ifdef FN_CanSkipPlayer + FN_CanSkipPlayer, +#else + NULL, +#endif +#ifdef FN_DeltaFindField + FN_DeltaFindField, +#else + NULL, +#endif +#ifdef FN_DeltaSetFieldByIndex + FN_DeltaSetFieldByIndex, +#else + NULL, +#endif +#ifdef FN_DeltaUnsetFieldByIndex + FN_DeltaUnsetFieldByIndex, +#else + NULL, +#endif +#ifdef FN_SetGroupMask + FN_SetGroupMask, +#else + NULL, +#endif +#ifdef FN_engCreateInstancedBaseline + FN_engCreateInstancedBaseline, +#else + NULL, +#endif +#ifdef FN_Cvar_DirectSet + FN_Cvar_DirectSet, +#else + NULL, +#endif +#ifdef FN_ForceUnmodified + FN_ForceUnmodified, +#else + NULL, +#endif +#ifdef FN_GetPlayerStats + FN_GetPlayerStats, +#else + NULL, +#endif +#ifdef FN_AddServerCommand + FN_AddServerCommand, +#else + NULL, +#endif +#ifdef FN_Voice_GetClientListening + FN_Voice_GetClientListening, +#else + NULL, +#endif +#ifdef FN_Voice_SetClientListening + FN_Voice_SetClientListening, +#else + NULL, +#endif +#ifdef FN_GetPlayerAuthId + FN_GetPlayerAuthId +#else + NULL +#endif +}; // g_EngineFuncs_Table + + +static enginefuncs_t g_EngineFuncs_Post_Table = +{ +#ifdef FN_PrecacheModel_Post + FN_PrecacheModel_Post, +#else + NULL, +#endif +#ifdef FN_PrecacheSound_Post + FN_PrecacheSound_Post, +#else + NULL, +#endif +#ifdef FN_SetModel_Post + FN_SetModel_Post, +#else + NULL, +#endif +#ifdef FN_ModelIndex_Post + FN_ModelIndex_Post, +#else + NULL, +#endif +#ifdef FN_ModelFrames_Post + FN_ModelFrames_Post, +#else + NULL, +#endif +#ifdef FN_SetSize_Post + FN_SetSize_Post, +#else + NULL, +#endif +#ifdef FN_ChangeLevel_Post + FN_ChangeLevel_Post, +#else + NULL, +#endif +#ifdef FN_GetSpawnParms_Post + FN_GetSpawnParms_Post, +#else + NULL, +#endif +#ifdef FN_SaveSpawnParms_Post + FN_SaveSpawnParms_Post, +#else + NULL, +#endif +#ifdef FN_VecToYaw_Post + FN_VecToYaw_Post, +#else + NULL, +#endif +#ifdef FN_VecToAngles_Post + FN_VecToAngles_Post, +#else + NULL, +#endif +#ifdef FN_MoveToOrigin_Post + FN_MoveToOrigin_Post, +#else + NULL, +#endif +#ifdef FN_ChangeYaw_Post + FN_ChangeYaw_Post, +#else + NULL, +#endif +#ifdef FN_ChangePitch_Post + FN_ChangePitch_Post, +#else + NULL, +#endif +#ifdef FN_FindEntityByString_Post + FN_FindEntityByString_Post, +#else + NULL, +#endif +#ifdef FN_GetEntityIllum_Post + FN_GetEntityIllum_Post, +#else + NULL, +#endif +#ifdef FN_FindEntityInSphere_Post + FN_FindEntityInSphere_Post, +#else + NULL, +#endif +#ifdef FN_FindClientInPVS_Post + FN_FindClientInPVS_Post, +#else + NULL, +#endif +#ifdef FN_EntitiesInPVS_Post + FN_EntitiesInPVS_Post, +#else + NULL, +#endif +#ifdef FN_MakeVectors_Post + FN_MakeVectors_Post, +#else + NULL, +#endif +#ifdef FN_AngleVectors_Post + FN_AngleVectors_Post, +#else + NULL, +#endif +#ifdef FN_CreateEntity_Post + FN_CreateEntity_Post, +#else + NULL, +#endif +#ifdef FN_RemoveEntity_Post + FN_RemoveEntity_Post, +#else + NULL, +#endif +#ifdef FN_CreateNamedEntity_Post + FN_CreateNamedEntity_Post, +#else + NULL, +#endif +#ifdef FN_MakeStatic_Post + FN_MakeStatic_Post, +#else + NULL, +#endif +#ifdef FN_EntIsOnFloor_Post + FN_EntIsOnFloor_Post, +#else + NULL, +#endif +#ifdef FN_DropToFloor_Post + FN_DropToFloor_Post, +#else + NULL, +#endif +#ifdef FN_WalkMove_Post + FN_WalkMove_Post, +#else + NULL, +#endif +#ifdef FN_SetOrigin_Post + FN_SetOrigin_Post, +#else + NULL, +#endif +#ifdef FN_EmitSound_Post + FN_EmitSound_Post, +#else + NULL, +#endif +#ifdef FN_EmitAmbientSound_Post + FN_EmitAmbientSound_Post, +#else + NULL, +#endif +#ifdef FN_TraceLine_Post + FN_TraceLine_Post, +#else + NULL, +#endif +#ifdef FN_TraceToss_Post + FN_TraceToss_Post, +#else + NULL, +#endif +#ifdef FN_TraceMonsterHull_Post + FN_TraceMonsterHull_Post, +#else + NULL, +#endif +#ifdef FN_TraceHull_Post + FN_TraceHull_Post, +#else + NULL, +#endif +#ifdef FN_TraceModel_Post + FN_TraceModel_Post, +#else + NULL, +#endif +#ifdef FN_TraceTexture_Post + FN_TraceTexture_Post, +#else + NULL, +#endif +#ifdef FN_TraceSphere_Post + FN_TraceSphere_Post, +#else + NULL, +#endif +#ifdef FN_GetAimVector_Post + FN_GetAimVector_Post, +#else + NULL, +#endif +#ifdef FN_ServerCommand_Post + FN_ServerCommand_Post, +#else + NULL, +#endif +#ifdef FN_ServerExecute_Post + FN_ServerExecute_Post, +#else + NULL, +#endif +#ifdef FN_engClientCommand_Post + FN_engClientCommand_Post, +#else + NULL, +#endif +#ifdef FN_ParticleEffect_Post + FN_ParticleEffect_Post, +#else + NULL, +#endif +#ifdef FN_LightStyle_Post + FN_LightStyle_Post, +#else + NULL, +#endif +#ifdef FN_DecalIndex_Post + FN_DecalIndex_Post, +#else + NULL, +#endif +#ifdef FN_PointContents_Post + FN_PointContents_Post, +#else + NULL, +#endif +#ifdef FN_MessageBegin_Post + FN_MessageBegin_Post, +#else + NULL, +#endif +#ifdef FN_MessageEnd_Post + FN_MessageEnd_Post, +#else + NULL, +#endif +#ifdef FN_WriteByte_Post + FN_WriteByte_Post, +#else + NULL, +#endif +#ifdef FN_WriteChar_Post + FN_WriteChar_Post, +#else + NULL, +#endif +#ifdef FN_WriteShort_Post + FN_WriteShort_Post, +#else + NULL, +#endif +#ifdef FN_WriteLong_Post + FN_WriteLong_Post, +#else + NULL, +#endif +#ifdef FN_WriteAngle_Post + FN_WriteAngle_Post, +#else + NULL, +#endif +#ifdef FN_WriteCoord_Post + FN_WriteCoord_Post, +#else + NULL, +#endif +#ifdef FN_WriteString_Post + FN_WriteString_Post, +#else + NULL, +#endif +#ifdef FN_WriteEntity_Post + FN_WriteEntity_Post, +#else + NULL, +#endif +#ifdef FN_CVarRegister_Post + FN_CVarRegister_Post, +#else + NULL, +#endif +#ifdef FN_CVarGetFloat_Post + FN_CVarGetFloat_Post, +#else + NULL, +#endif +#ifdef FN_CVarGetString_Post + FN_CVarGetString_Post, +#else + NULL, +#endif +#ifdef FN_CVarSetFloat_Post + FN_CVarSetFloat_Post, +#else + NULL, +#endif +#ifdef FN_CVarSetString_Post + FN_CVarSetString_Post, +#else + NULL, +#endif +#ifdef FN_AlertMessage_Post + FN_AlertMessage_Post, +#else + NULL, +#endif +#ifdef FN_EngineFprintf_Post + FN_EngineFprintf_Post, +#else + NULL, +#endif +#ifdef FN_PvAllocEntPrivateData_Post + FN_PvAllocEntPrivateData_Post, +#else + NULL, +#endif +#ifdef FN_PvEntPrivateData_Post + FN_PvEntPrivateData_Post, +#else + NULL, +#endif +#ifdef FN_FreeEntPrivateData_Post + FN_FreeEntPrivateData_Post, +#else + NULL, +#endif +#ifdef FN_SzFromIndex_Post + FN_SzFromIndex_Post, +#else + NULL, +#endif +#ifdef FN_AllocString_Post + FN_AllocString_Post, +#else + NULL, +#endif +#ifdef FN_GetVarsOfEnt_Post + FN_GetVarsOfEnt_Post, +#else + NULL, +#endif +#ifdef FN_PEntityOfEntOffset_Post + FN_PEntityOfEntOffset_Post, +#else + NULL, +#endif +#ifdef FN_EntOffsetOfPEntity_Post + FN_EntOffsetOfPEntity_Post, +#else + NULL, +#endif +#ifdef FN_IndexOfEdict_Post + FN_IndexOfEdict_Post, +#else + NULL, +#endif +#ifdef FN_PEntityOfEntIndex_Post + FN_PEntityOfEntIndex_Post, +#else + NULL, +#endif +#ifdef FN_FindEntityByVars_Post + FN_FindEntityByVars_Post, +#else + NULL, +#endif +#ifdef FN_GetModelPtr_Post + FN_GetModelPtr_Post, +#else + NULL, +#endif +#ifdef FN_RegUserMsg_Post + FN_RegUserMsg_Post, +#else + NULL, +#endif +#ifdef FN_AnimationAutomove_Post + FN_AnimationAutomove_Post, +#else + NULL, +#endif +#ifdef FN_GetBonePosition_Post + FN_GetBonePosition_Post, +#else + NULL, +#endif +#ifdef FN_FunctionFromName_Post + FN_FunctionFromName_Post, +#else + NULL, +#endif +#ifdef FN_NameForFunction_Post + FN_NameForFunction_Post, +#else + NULL, +#endif +#ifdef FN_ClientPrintf_Post + FN_ClientPrintf_Post, +#else + NULL, +#endif +#ifdef FN_ServerPrint_Post + FN_ServerPrint_Post, +#else + NULL, +#endif +#ifdef FN_Cmd_Args_Post + FN_Cmd_Args_Post, +#else + NULL, +#endif +#ifdef FN_Cmd_Argv_Post + FN_Cmd_Argv_Post, +#else + NULL, +#endif +#ifdef FN_Cmd_Argc_Post + FN_Cmd_Argc_Post, +#else + NULL, +#endif +#ifdef FN_GetAttachment_Post + FN_GetAttachment_Post, +#else + NULL, +#endif +#ifdef FN_CRC32_Init_Post + FN_CRC32_Init_Post, +#else + NULL, +#endif +#ifdef FN_CRC32_ProcessBuffer_Post + FN_CRC32_ProcessBuffer_Post, +#else + NULL, +#endif +#ifdef FN_CRC32_ProcessByte_Post + FN_CRC32_ProcessByte_Post, +#else + NULL, +#endif +#ifdef FN_CRC32_Final_Post + FN_CRC32_Final_Post, +#else + NULL, +#endif +#ifdef FN_RandomLong_Post + FN_RandomLong_Post, +#else + NULL, +#endif +#ifdef FN_RandomFloat_Post + FN_RandomFloat_Post, +#else + NULL, +#endif +#ifdef FN_SetView_Post + FN_SetView_Post, +#else + NULL, +#endif +#ifdef FN_Time_Post + FN_Time_Post, +#else + NULL, +#endif +#ifdef FN_CrosshairAngle_Post + FN_CrosshairAngle_Post, +#else + NULL, +#endif +#ifdef FN_LoadFileForMe_Post + FN_LoadFileForMe_Post, +#else + NULL, +#endif +#ifdef FN_FreeFile_Post + FN_FreeFile_Post, +#else + NULL, +#endif +#ifdef FN_EndSection_Post + FN_EndSection_Post, +#else + NULL, +#endif +#ifdef FN_CompareFileTime_Post + FN_CompareFileTime_Post, +#else + NULL, +#endif +#ifdef FN_GetGameDir_Post + FN_GetGameDir_Post, +#else + NULL, +#endif +#ifdef FN_Cvar_RegisterVariable_Post + FN_Cvar_RegisterVariable_Post, +#else + NULL, +#endif +#ifdef FN_FadeClientVolume_Post + FN_FadeClientVolume_Post, +#else + NULL, +#endif +#ifdef FN_SetClientMaxspeed_Post + FN_SetClientMaxspeed_Post, +#else + NULL, +#endif +#ifdef FN_CreateFakeClient_Post + FN_CreateFakeClient_Post, +#else + NULL, +#endif +#ifdef FN_RunPlayerMove_Post + FN_RunPlayerMove_Post, +#else + NULL, +#endif +#ifdef FN_NumberOfEntities_Post + FN_NumberOfEntities_Post, +#else + NULL, +#endif +#ifdef FN_GetInfoKeyBuffer_Post + FN_GetInfoKeyBuffer_Post, +#else + NULL, +#endif +#ifdef FN_InfoKeyValue_Post + FN_InfoKeyValue_Post, +#else + NULL, +#endif +#ifdef FN_SetKeyValue_Post + FN_SetKeyValue_Post, +#else + NULL, +#endif +#ifdef FN_SetClientKeyValue_Post + FN_SetClientKeyValue_Post, +#else + NULL, +#endif +#ifdef FN_IsMapValid_Post + FN_IsMapValid_Post, +#else + NULL, +#endif +#ifdef FN_StaticDecal_Post + FN_StaticDecal_Post, +#else + NULL, +#endif +#ifdef FN_PrecacheGeneric_Post + FN_PrecacheGeneric_Post, +#else + NULL, +#endif +#ifdef FN_GetPlayerUserId_Post + FN_GetPlayerUserId_Post, +#else + NULL, +#endif +#ifdef FN_BuildSoundMsg_Post + FN_BuildSoundMsg_Post, +#else + NULL, +#endif +#ifdef FN_IsDedicatedServer_Post + FN_IsDedicatedServer_Post, +#else + NULL, +#endif +#ifdef FN_CVarGetPointer_Post + FN_CVarGetPointer_Post, +#else + NULL, +#endif +#ifdef FN_GetPlayerWONId_Post + FN_GetPlayerWONId_Post, +#else + NULL, +#endif +#ifdef FN_Info_RemoveKey_Post + FN_Info_RemoveKey_Post, +#else + NULL, +#endif +#ifdef FN_GetPhysicsKeyValue_Post + FN_GetPhysicsKeyValue_Post, +#else + NULL, +#endif +#ifdef FN_SetPhysicsKeyValue_Post + FN_SetPhysicsKeyValue_Post, +#else + NULL, +#endif +#ifdef FN_GetPhysicsInfoString_Post + FN_GetPhysicsInfoString_Post, +#else + NULL, +#endif +#ifdef FN_PrecacheEvent_Post + FN_PrecacheEvent_Post, +#else + NULL, +#endif +#ifdef FN_PlaybackEvent_Post + FN_PlaybackEvent_Post, +#else + NULL, +#endif +#ifdef FN_SetFatPVS_Post + FN_SetFatPVS_Post, +#else + NULL, +#endif +#ifdef FN_SetFatPAS_Post + FN_SetFatPAS_Post, +#else + NULL, +#endif +#ifdef FN_CheckVisibility_Post + FN_CheckVisibility_Post, +#else + NULL, +#endif +#ifdef FN_DeltaSetField_Post + FN_DeltaSetField_Post, +#else + NULL, +#endif +#ifdef FN_DeltaUnsetField_Post + FN_DeltaUnsetField_Post, +#else + NULL, +#endif +#ifdef FN_DeltaAddEncoder_Post + FN_DeltaAddEncoder_Post, +#else + NULL, +#endif +#ifdef FN_GetCurrentPlayer_Post + FN_GetCurrentPlayer_Post, +#else + NULL, +#endif +#ifdef FN_CanSkipPlayer_Post + FN_CanSkipPlayer_Post, +#else + NULL, +#endif +#ifdef FN_DeltaFindField_Post + FN_DeltaFindField_Post, +#else + NULL, +#endif +#ifdef FN_DeltaSetFieldByIndex_Post + FN_DeltaSetFieldByIndex_Post, +#else + NULL, +#endif +#ifdef FN_DeltaUnsetFieldByIndex_Post + FN_DeltaUnsetFieldByIndex_Post, +#else + NULL, +#endif +#ifdef FN_SetGroupMask_Post + FN_SetGroupMask_Post, +#else + NULL, +#endif +#ifdef FN_engCreateInstancedBaseline_Post + FN_engCreateInstancedBaseline_Post, +#else + NULL, +#endif +#ifdef FN_Cvar_DirectSet_Post + FN_Cvar_DirectSet_Post, +#else + NULL, +#endif +#ifdef FN_ForceUnmodified_Post + FN_ForceUnmodified_Post, +#else + NULL, +#endif +#ifdef FN_GetPlayerStats_Post + FN_GetPlayerStats_Post, +#else + NULL, +#endif +#ifdef FN_AddServerCommand_Post + FN_AddServerCommand_Post, +#else + NULL, +#endif +#ifdef FN_Voice_GetClientListening_Post + FN_Voice_GetClientListening_Post, +#else + NULL, +#endif +#ifdef FN_Voice_SetClientListening_Post + FN_Voice_SetClientListening_Post, +#else + NULL, +#endif +#ifdef FN_GetPlayerAuthId_Post + FN_GetPlayerAuthId_Post +#else + NULL +#endif +}; // g_EngineFuncs_Post_Table + + +static NEW_DLL_FUNCTIONS g_NewFuncs_Table = +{ +#ifdef FN_OnFreeEntPrivateData + FN_OnFreeEntPrivateData, +#else + NULL, +#endif +#ifdef FN_GameShutdown + FN_GameShutdown, +#else + NULL, +#endif +#ifdef FN_ShouldCollide + ShouldCollide, +#else + NULL, +#endif +}; + + +static NEW_DLL_FUNCTIONS g_NewFuncs_Post_Table = +{ +#ifdef FN_OnFreeEntPrivateData_Post + FN_OnFreeEntPrivateData_Post, +#else + NULL, +#endif +#ifdef FN_GameShutdown_Post + FN_GameShutdown_Post, +#else + NULL, +#endif +#ifdef FN_ShouldCollide_Post + ShouldCollide_Post, +#else + NULL, +#endif +}; + +// Global variables from metamod. These variable names are referenced by +// various macros. +meta_globals_t *gpMetaGlobals; // metamod globals +gamedll_funcs_t *gpGamedllFuncs; // gameDLL function tables +mutil_funcs_t *gpMetaUtilFuncs; // metamod utility functions + + +plugin_info_t Plugin_info = { + META_INTERFACE_VERSION, + MODULE_NAME, + MODULE_VERSION, + MODULE_DATE, + MODULE_AUTHOR, + MODULE_URL, + MODULE_LOGTAG, + PT_ANYTIME, + PT_ANYTIME +}; + +/* +C_DLLEXPORT int GetEntityAPI(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetEntityAPI; version=%d", interfaceVersion); + if(!pFunctionTable) { + LOG_ERROR(PLID, "GetEntityAPI called with null pFunctionTable"); + return(FALSE); + } + else if(interfaceVersion != INTERFACE_VERSION) { + LOG_ERROR(PLID, "GetEntityAPI version mismatch; requested=%d ours=%d", interfaceVersion, INTERFACE_VERSION); + return(FALSE); + } + memcpy(pFunctionTable, &g_EntityAPI_Table, sizeof( DLL_FUNCTIONS ) ); + + return (TRUE); +} + +C_DLLEXPORT int GetEntityAPI_Post(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetEntityAPI_Post; version=%d", interfaceVersion); + if(!pFunctionTable) { + LOG_ERROR(PLID, "GetEntityAPI_Post called with null pFunctionTable"); + return(FALSE); + } + else if(interfaceVersion != INTERFACE_VERSION) { + LOG_ERROR(PLID, "GetEntityAPI_Post version mismatch; requested=%d ours=%d", interfaceVersion, INTERFACE_VERSION); + return(FALSE); + } + memcpy(pFunctionTable, &g_EntityAPI_Post_Table, sizeof( DLL_FUNCTIONS ) ); + + return(TRUE); +} +*/ + +C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetEntityAPI2; version=%d", *interfaceVersion); + if(!pFunctionTable) { + LOG_ERROR(PLID, "GetEntityAPI2 called with null pFunctionTable"); + return(FALSE); + } + else if(*interfaceVersion != INTERFACE_VERSION) { + LOG_ERROR(PLID, + "GetEntityAPI2 version mismatch; requested=%d ours=%d", + *interfaceVersion, INTERFACE_VERSION); + //! Tell engine what version we had, so it can figure out who is + //! out of date. + *interfaceVersion = INTERFACE_VERSION; + return(FALSE); + } + memcpy(pFunctionTable, &g_EntityAPI_Table, sizeof(DLL_FUNCTIONS)); + g_pFunctionTable=pFunctionTable; + return(TRUE); +} + +C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetEntityAPI2_Post; version=%d", *interfaceVersion); + if(!pFunctionTable) { + LOG_ERROR(PLID, "GetEntityAPI2_Post called with null pFunctionTable"); + return(FALSE); + } + else if(*interfaceVersion != INTERFACE_VERSION) { + LOG_ERROR(PLID, "GetEntityAPI2_Post version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION); + //! Tell engine what version we had, so it can figure out who is out of date. + *interfaceVersion = INTERFACE_VERSION; + return(FALSE); + } + memcpy( pFunctionTable, &g_EntityAPI_Post_Table, sizeof( DLL_FUNCTIONS ) ); + g_pFunctionTable_Post=pFunctionTable; + return(TRUE); +} + +C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetEngineFunctions; version=%d", + *interfaceVersion); + if(!pengfuncsFromEngine) { + LOG_ERROR(PLID, + "GetEngineFunctions called with null pengfuncsFromEngine"); + return(FALSE); + } + else if(*interfaceVersion != ENGINE_INTERFACE_VERSION) { + LOG_ERROR(PLID, + "GetEngineFunctions version mismatch; requested=%d ours=%d", + *interfaceVersion, ENGINE_INTERFACE_VERSION); + // Tell metamod what version we had, so it can figure out who is + // out of date. + *interfaceVersion = ENGINE_INTERFACE_VERSION; + return(FALSE); + } + memcpy(pengfuncsFromEngine, &g_EngineFuncs_Table, sizeof(enginefuncs_t)); + g_pengfuncsTable=pengfuncsFromEngine; + return TRUE; +} + +C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetEngineFunctions_Post; version=%d", *interfaceVersion); + if(!pengfuncsFromEngine) { + LOG_ERROR(PLID, "GetEngineFunctions_Post called with null pengfuncsFromEngine"); + return(FALSE); + } + else if(*interfaceVersion != ENGINE_INTERFACE_VERSION) { + LOG_ERROR(PLID, "GetEngineFunctions_Post version mismatch; requested=%d ours=%d", *interfaceVersion, ENGINE_INTERFACE_VERSION); + // Tell metamod what version we had, so it can figure out who is out of date. + *interfaceVersion = ENGINE_INTERFACE_VERSION; + return(FALSE); + } + memcpy(pengfuncsFromEngine, &g_EngineFuncs_Post_Table, sizeof(enginefuncs_t)); + g_pengfuncsTable_Post=pengfuncsFromEngine; + return TRUE; + +} + +C_DLLEXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable, + int *interfaceVersion) +{ + LOG_DEVELOPER(PLID, "called: GetNewDLLFunctions; version=%d", + *interfaceVersion); + if(!pNewFunctionTable) { + LOG_ERROR(PLID, + "GetNewDLLFunctions called with null pNewFunctionTable"); + return(FALSE); + } + else if(*interfaceVersion != NEW_DLL_FUNCTIONS_VERSION) { + LOG_ERROR(PLID, + "GetNewDLLFunctions version mismatch; requested=%d ours=%d", + *interfaceVersion, NEW_DLL_FUNCTIONS_VERSION); + //! Tell engine what version we had, so it can figure out who is + //! out of date. + *interfaceVersion = NEW_DLL_FUNCTIONS_VERSION; + return(FALSE); + } + memcpy(pNewFunctionTable, &g_NewFuncs_Table, sizeof(NEW_DLL_FUNCTIONS)); + g_pNewFunctionsTable=pNewFunctionTable; + return TRUE; +} + +C_DLLEXPORT int GetNewDLLFunctions_Post( NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion ) +{ + LOG_DEVELOPER(PLID, "called: GetNewDLLFunctions_Post; version=%d", *interfaceVersion); + if(!pNewFunctionTable) { + LOG_ERROR(PLID, "GetNewDLLFunctions_Post called with null pNewFunctionTable"); + return(FALSE); + } + else if(*interfaceVersion != NEW_DLL_FUNCTIONS_VERSION) { + LOG_ERROR(PLID, "GetNewDLLFunctions_Post version mismatch; requested=%d ours=%d", *interfaceVersion, NEW_DLL_FUNCTIONS_VERSION); + //! Tell engine what version we had, so it can figure out who is out of date. + *interfaceVersion = NEW_DLL_FUNCTIONS_VERSION; + return(FALSE); + } + memcpy(pNewFunctionTable, &g_NewFuncs_Post_Table, sizeof(NEW_DLL_FUNCTIONS)); + g_pNewFunctionsTable_Post=pNewFunctionTable; + return TRUE; +} + + +static META_FUNCTIONS g_MetaFunctions_Table = +{ + NULL, + NULL, + GetEntityAPI2, + GetEntityAPI2_Post, + GetNewDLLFunctions, + GetNewDLLFunctions_Post, + GetEngineFunctions, + GetEngineFunctions_Post +}; + +C_DLLEXPORT int Meta_Query(char *ifvers, plugin_info_t **pPlugInfo, mutil_funcs_t *pMetaUtilFuncs) +{ + if ((int) CVAR_GET_FLOAT("developer") != 0) + UTIL_LogPrintf("[%s] dev: called: Meta_Query; version=%s, ours=%s\n", + Plugin_info.logtag, ifvers, Plugin_info.ifvers); + + // Check for valid pMetaUtilFuncs before we continue. + if(!pMetaUtilFuncs) { + UTIL_LogPrintf("[%s] ERROR: Meta_Query called with null pMetaUtilFuncs\n", Plugin_info.logtag); + return(FALSE); + } + + gpMetaUtilFuncs = pMetaUtilFuncs; + + *pPlugInfo = &Plugin_info; + + // Check for interface version compatibility. + if(!FStrEq(ifvers, Plugin_info.ifvers)) { + int mmajor=0, mminor=0, pmajor=0, pminor=0; + LOG_MESSAGE(PLID, "WARNING: meta-interface version mismatch; requested=%s ours=%s", + Plugin_info.logtag, ifvers); + // If plugin has later interface version, it's incompatible (update + // metamod). + sscanf(ifvers, "%d:%d", &mmajor, &mminor); + sscanf(META_INTERFACE_VERSION, "%d:%d", &pmajor, &pminor); + if(pmajor > mmajor || (pmajor==mmajor && pminor > mminor)) { + LOG_ERROR(PLID, "metamod version is too old for this module; update metamod"); + return(FALSE); + } + // If plugin has older major interface version, it's incompatible + // (update plugin). + else if(pmajor < mmajor) { + LOG_ERROR(PLID, "metamod version is incompatible with this module; please find a newer version of this module"); + return(FALSE); + } + // Minor interface is older, but this is guaranteed to be backwards + // compatible, so we warn, but we still accept it. + else if(pmajor==mmajor && pminor < mminor) + LOG_MESSAGE(PLID, "WARNING: metamod version is newer than expected; consider finding a newer version of this module"); + else + LOG_ERROR(PLID, "unexpected version comparison; metavers=%s, mmajor=%d, mminor=%d; plugvers=%s, pmajor=%d, pminor=%d", ifvers, mmajor, mminor, META_INTERFACE_VERSION, pmajor, pminor); + } + +#ifdef FN_META_QUERY + return FN_META_QUERY(); +#endif // FN_META_QUERY + + return 1; +} + + +C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs) +{ + if(now > Plugin_info.loadable) { + LOG_ERROR(PLID, "Can't load module right now"); + return(FALSE); + } + 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, &g_MetaFunctions_Table, sizeof(META_FUNCTIONS)); + gpGamedllFuncs=pGamedllFuncs; + + // Let's go. + +#ifdef FN_META_ATTACH + FN_META_ATTACH(); +#endif // FN_META_ATTACH + + return TRUE; +} + +C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason) +{ + if(now > Plugin_info.unloadable && reason != PNL_CMD_FORCED) { + LOG_ERROR(PLID, "Can't unload plugin right now"); + return(FALSE); + } + +#ifdef FN_META_DETACH + return FN_META_DETACH(); +#endif // FN_META_DETACH + return TRUE; +} + + + +#ifdef __linux__ +// linux prototype +C_DLLEXPORT void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) { + +#else +#ifdef _MSC_VER +// MSVC: Simulate __stdcall calling convention +C_DLLEXPORT __declspec(naked) void GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) +{ + __asm // Prolog + { + // Save ebp + push ebp + // Set stack frame pointer + mov ebp, esp + // Allocate space for local variables + // The MSVC compiler gives us the needed size in __LOCAL_SIZE. + sub esp, __LOCAL_SIZE + // Push registers + push ebx + push esi + push edi + } +#else // _MSC_VER +#ifdef __GNUC__ +// GCC can also work with this +C_DLLEXPORT void __stdcall GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals ) +{ +#else // __GNUC__ +// compiler not known +#error There is no support (yet) for your compiler. Please use MSVC or GCC compilers or contact the AMX Mod X dev team. +#endif // __GNUC__ +#endif // _MSC_VER +#endif // __linux__ + + // ** Function core <-- + memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t)); + gpGlobals = pGlobals; + // NOTE! Have to call logging function _after_ copying into g_engfuncs, so + // that g_engfuncs.pfnAlertMessage() can be resolved properly, heh. :) + UTIL_LogPrintf("[%s] dev: called: GiveFnptrsToDll\n", Plugin_info.logtag); + // --> ** Function core + +#ifdef _MSC_VER + // Epilog + if (sizeof(int*) == 8) + { // 64 bit + __asm + { + // Pop registers + pop edi + pop esi + pop ebx + // Restore stack frame pointer + mov esp, ebp + // Restore ebp + pop ebp + // 2 * sizeof(int*) = 16 on 64 bit + ret 16 + } + } + else + { // 32 bit + __asm + { + // Pop registers + pop edi + pop esi + pop ebx + // Restore stack frame pointer + mov esp, ebp + // Restore ebp + pop ebp + // 2 * sizeof(int*) = 8 on 32 bit + ret 8 + } + } +#endif // #ifdef _MSC_VER +} + +#endif // #ifdef USE_METAMOD + +/************* AMXX Stuff *************/ + +// *** Globals *** +// Module info +static amxx_module_info_s g_ModuleInfo = +{ + MODULE_NAME, + MODULE_AUTHOR, + MODULE_VERSION, +#ifdef MODULE_RELOAD_ON_MAPCHANGE + 1, +#else // MODULE_RELOAD_ON_MAPCHANGE + 0, +#endif // MODULE_RELOAD_ON_MAPCHANGE + MODULE_LOGTAG +}; + +// Storage for the requested functions +PFN_ADD_NATIVES g_fn_AddNatives; +PFN_BUILD_PATHNAME g_fn_BuildPathname; +PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR; +PFN_GET_AMXADDR g_fn_GetAmxAddr; +PFN_PRINT_SRVCONSOLE g_fn_PrintSrvConsole; +PFN_GET_MODNAME g_fn_GetModname; +PFN_GET_AMXSCRIPTNAME g_fn_GetAmxScriptName; +PFN_GET_AMXSCRIPT g_fn_GetAmxScript; +PFN_FIND_AMXSCRIPT_BYAMX g_fn_FindAmxScriptByAmx; +PFN_FIND_AMXSCRIPT_BYNAME g_fn_FindAmxScriptByName; +PFN_SET_AMXSTRING g_fn_SetAmxString; +PFN_GET_AMXSTRING g_fn_GetAmxString; +PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen; +PFN_FORMAT_AMXSTRING g_fn_FormatAmxString; +PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory; +PFN_LOG g_fn_Log; +PFN_LOG_ERROR g_fn_LogErrorFunc; +PFN_RAISE_AMXERROR g_fn_RaiseAmxError; +PFN_REGISTER_FORWARD g_fn_RegisterForward; +PFN_EXECUTE_FORWARD g_fn_ExecuteForward; +PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray; +PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray; +PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA; +PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA; +PFN_IS_PLAYER_VALID g_fn_IsPlayerValid; +PFN_GET_PLAYER_NAME g_fn_GetPlayerName; +PFN_GET_PLAYER_IP g_fn_GetPlayerIP; +PFN_IS_PLAYER_INGAME g_fn_IsPlayerIngame; +PFN_IS_PLAYER_BOT g_fn_IsPlayerBot; +PFN_IS_PLAYER_AUTHORIZED g_fn_IsPlayerAuthorized; +PFN_GET_PLAYER_TIME g_fn_GetPlayerTime; +PFN_GET_PLAYER_PLAYTIME g_fn_GetPlayerPlayTime; +PFN_GET_PLAYER_CURWEAPON g_fn_GetPlayerCurweapon; +PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam; +PFN_GET_PLAYER_TEAMID g_fn_GetPlayerTeamID; +PFN_GET_PLAYER_DEATHS g_fn_GetPlayerDeaths; +PFN_GET_PLAYER_MENU g_fn_GetPlayerMenu; +PFN_GET_PLAYER_KEYS g_fn_GetPlayerKeys; +PFN_IS_PLAYER_ALIVE g_fn_IsPlayerAlive; +PFN_GET_PLAYER_FRAGS g_fn_GetPlayerFrags; +PFN_IS_PLAYER_CONNECTING g_fn_IsPlayerConnecting; +PFN_IS_PLAYER_HLTV g_fn_IsPlayerHLTV; +PFN_GET_PLAYER_ARMOR g_fn_GetPlayerArmor; +PFN_GET_PLAYER_HEALTH g_fn_GetPlayerHealth; +#ifdef MEMORY_TEST +PFN_ALLOCATOR g_fn_Allocator; +PFN_REALLOCATOR g_fn_Reallocator; +PFN_DEALLOCATOR g_fn_Deallocator; +#endif +PFN_AMX_EXEC g_fn_AmxExec; +PFN_AMX_EXECV g_fn_AmxExecv; +PFN_AMX_ALLOT g_fn_AmxAllot; +PFN_AMX_FINDPUBLIC g_fn_AmxFindPublic; +PFN_LOAD_AMXSCRIPT g_fn_LoadAmxScript; +PFN_UNLOAD_AMXSCRIPT g_fn_UnloadAmxScript; +PFN_REAL_TO_CELL g_fn_RealToCell; +PFN_CELL_TO_REAL g_fn_CellToReal; +PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward; +PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName; +PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward; +PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File; +PFN_AMX_FINDNATIVE g_fn_AmxFindNative; +PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags; +PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict; +PFN_FORMAT g_fn_Format; +PFN_REGISTERFUNCTION g_fn_RegisterFunction; +PFN_REQ_FNPTR g_fn_RequestFunction; +PFN_AMX_PUSH g_fn_AmxPush; + +// *** Exports *** +C_DLLEXPORT int AMXX_Query(int *interfaceVersion, amxx_module_info_s *moduleInfo) +{ + // check parameters + if (!interfaceVersion || !moduleInfo) + return AMXX_PARAM; + + // check interface version + if (*interfaceVersion != AMXX_INTERFACE_VERSION) + { + // Tell amxx core our interface version + *interfaceVersion = AMXX_INTERFACE_VERSION; + return AMXX_IFVERS; + } + + // copy module info + memcpy(moduleInfo, &g_ModuleInfo, sizeof(amxx_module_info_s)); + +#ifdef FN_AMXX_QUERY + FN_AMXX_QUERY(); +#endif // FN_AMXX_QUERY + // Everything ok :) + return AMXX_OK; +} + +// request function +#define REQFUNC(name, fptr, type) if ((fptr = (type)reqFnptrFunc(name)) == 0) return AMXX_FUNC_NOT_PRESENT +// request optional function +#define REQFUNC_OPT(name, fptr, type) fptr = (type)reqFnptrFunc(name) + +C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc) +{ + // Check pointer + if (!reqFnptrFunc) + return AMXX_PARAM; + + g_fn_RequestFunction = reqFnptrFunc; + + // Req all known functions + // Misc + REQFUNC("BuildPathname", g_fn_BuildPathname, PFN_BUILD_PATHNAME); + REQFUNC("BuildPathnameR", g_fn_BuildPathnameR, PFN_BUILD_PATHNAME_R); + REQFUNC("PrintSrvConsole", g_fn_PrintSrvConsole, PFN_PRINT_SRVCONSOLE); + REQFUNC("GetModname", g_fn_GetModname, PFN_GET_MODNAME); + REQFUNC("Log", g_fn_Log, PFN_LOG); + REQFUNC("LogError", g_fn_LogErrorFunc, PFN_LOG_ERROR); + REQFUNC("MergeDefinitionFile", g_fn_MergeDefinition_File, PFN_MERGEDEFINITION_FILE); + REQFUNC("Format", g_fn_Format, PFN_FORMAT); + REQFUNC("RegisterFunction", g_fn_RegisterFunction, PFN_REGISTERFUNCTION); + + // Amx scripts + REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT); + REQFUNC("FindAmxScriptByAmx", g_fn_FindAmxScriptByAmx, PFN_FIND_AMXSCRIPT_BYAMX); + REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME); + REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT); + REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT); + REQFUNC("GetAmxScriptName", g_fn_GetAmxScriptName, PFN_GET_AMXSCRIPTNAME); + + // String / mem in amx scripts support + REQFUNC("SetAmxString", g_fn_SetAmxString, PFN_SET_AMXSTRING); + REQFUNC("GetAmxString", g_fn_GetAmxString, PFN_GET_AMXSTRING); + REQFUNC("GetAmxStringLen", g_fn_GetAmxStringLen, PFN_GET_AMXSTRINGLEN); + REQFUNC("FormatAmxString", g_fn_FormatAmxString, PFN_FORMAT_AMXSTRING); + REQFUNC("CopyAmxMemory", g_fn_CopyAmxMemory, PFN_COPY_AMXMEMORY); + REQFUNC("GetAmxAddr", g_fn_GetAmxAddr, PFN_GET_AMXADDR); + + REQFUNC("amx_Exec", g_fn_AmxExec, PFN_AMX_EXEC); + REQFUNC("amx_Execv", g_fn_AmxExecv, PFN_AMX_EXECV); + REQFUNC("amx_FindPublic", g_fn_AmxFindPublic, PFN_AMX_FINDPUBLIC); + REQFUNC("amx_Allot", g_fn_AmxAllot, PFN_AMX_ALLOT); + REQFUNC("amx_FindNative", g_fn_AmxFindNative, PFN_AMX_FINDNATIVE); + + // Natives / Forwards + REQFUNC("AddNatives", g_fn_AddNatives, PFN_ADD_NATIVES); + REQFUNC("RaiseAmxError", g_fn_RaiseAmxError, PFN_RAISE_AMXERROR); + REQFUNC("RegisterForward", g_fn_RegisterForward, PFN_REGISTER_FORWARD); + REQFUNC("RegisterSPForward", g_fn_RegisterSPForward, PFN_REGISTER_SPFORWARD); + REQFUNC("RegisterSPForwardByName", g_fn_RegisterSPForwardByName, PFN_REGISTER_SPFORWARD_BYNAME); + REQFUNC("UnregisterSPForward", g_fn_UnregisterSPForward, PFN_UNREGISTER_SPFORWARD); + REQFUNC("ExecuteForward", g_fn_ExecuteForward, PFN_EXECUTE_FORWARD); + REQFUNC("PrepareCellArray", g_fn_PrepareCellArray, PFN_PREPARE_CELLARRAY); + REQFUNC("PrepareCharArray", g_fn_PrepareCharArray, PFN_PREPARE_CHARARRAY); + REQFUNC("PrepareCellArrayA", g_fn_PrepareCellArrayA, PFN_PREPARE_CELLARRAY_A); + REQFUNC("PrepareCharArrayA", g_fn_PrepareCharArrayA, PFN_PREPARE_CHARARRAY_A); + // Player + REQFUNC("IsPlayerValid", g_fn_IsPlayerValid, PFN_IS_PLAYER_VALID); + REQFUNC("GetPlayerName", g_fn_GetPlayerName, PFN_GET_PLAYER_NAME); + REQFUNC("GetPlayerIP", g_fn_GetPlayerIP, PFN_GET_PLAYER_IP); + REQFUNC("IsPlayerInGame", g_fn_IsPlayerIngame, PFN_IS_PLAYER_INGAME); + REQFUNC("IsPlayerBot", g_fn_IsPlayerBot, PFN_IS_PLAYER_BOT); + REQFUNC("IsPlayerAuthorized", g_fn_IsPlayerAuthorized, PFN_IS_PLAYER_AUTHORIZED); + REQFUNC("GetPlayerTime", g_fn_GetPlayerTime, PFN_GET_PLAYER_TIME); + REQFUNC("GetPlayerPlayTime", g_fn_GetPlayerPlayTime, PFN_GET_PLAYER_PLAYTIME); + REQFUNC("GetPlayerCurweapon", g_fn_GetPlayerCurweapon, PFN_GET_PLAYER_CURWEAPON); + REQFUNC("GetPlayerTeamID", g_fn_GetPlayerTeamID, PFN_GET_PLAYER_TEAMID); + REQFUNC("GetPlayerTeam",g_fn_GetPlayerTeam, PFN_GET_PLAYER_TEAM); + REQFUNC("GetPlayerDeaths", g_fn_GetPlayerDeaths, PFN_GET_PLAYER_DEATHS); + REQFUNC("GetPlayerMenu", g_fn_GetPlayerMenu, PFN_GET_PLAYER_MENU); + REQFUNC("GetPlayerKeys", g_fn_GetPlayerKeys, PFN_GET_PLAYER_KEYS); + REQFUNC("IsPlayerAlive", g_fn_IsPlayerAlive, PFN_IS_PLAYER_ALIVE); + REQFUNC("GetPlayerFrags", g_fn_GetPlayerFrags, PFN_GET_PLAYER_FRAGS); + REQFUNC("IsPlayerConnecting", g_fn_IsPlayerConnecting, PFN_IS_PLAYER_CONNECTING); + REQFUNC("IsPlayerHLTV", g_fn_IsPlayerHLTV, PFN_IS_PLAYER_HLTV); + REQFUNC("GetPlayerArmor", g_fn_GetPlayerArmor, PFN_GET_PLAYER_ARMOR); + REQFUNC("GetPlayerHealth", g_fn_GetPlayerHealth, PFN_GET_PLAYER_HEALTH); + REQFUNC("GetPlayerFlags", g_fn_GetPlayerFlags, PFN_GETPLAYERFLAGS); + REQFUNC("GetPlayerEdict", g_fn_GetPlayerEdict, PFN_GET_PLAYER_EDICT); + REQFUNC("amx_Push", g_fn_AmxPush, PFN_AMX_PUSH); + +#ifdef MEMORY_TEST + // Memory + REQFUNC_OPT("Allocator", g_fn_Allocator, PFN_ALLOCATOR); + REQFUNC_OPT("Reallocator", g_fn_Reallocator, PFN_REALLOCATOR); + REQFUNC_OPT("Deallocator", g_fn_Deallocator, PFN_DEALLOCATOR); +#endif + + REQFUNC("CellToReal", g_fn_CellToReal, PFN_CELL_TO_REAL); + REQFUNC("RealToCell", g_fn_RealToCell, PFN_REAL_TO_CELL); + +#ifdef FN_AMXX_ATTACH + FN_AMXX_ATTACH(); +#endif // FN_AMXX_ATACH + + return AMXX_OK; +} + +C_DLLEXPORT int AMXX_Detach() +{ +#ifdef FN_AMXX_DETACH + FN_AMXX_DETACH(); +#endif // FN_AMXX_DETACH + + return AMXX_OK; +} + +C_DLLEXPORT int AMXX_PluginsLoaded() +{ +#ifdef FN_AMXX_PLUGINSLOADED + FN_AMXX_PLUGINSLOADED(); +#endif // FN_AMXX_PLUGINSLOADED + return AMXX_OK; +} + +// Advanced MF functions +void MF_Log(const char *fmt, ...) +{ + // :TODO: Overflow possible here + char msg[3072]; + va_list arglst; + va_start(arglst, fmt); + vsprintf(msg, fmt, arglst); + va_end(arglst); + + g_fn_Log("[%s] %s", MODULE_LOGTAG, msg); +} + +void MF_LogError(AMX *amx, int err, const char *fmt, ...) +{ + // :TODO: Overflow possible here + char msg[3072]; + va_list arglst; + va_start(arglst, fmt); + vsprintf(msg, fmt, arglst); + va_end(arglst); + + g_fn_LogErrorFunc(amx, err, "[%s] %s", MODULE_LOGTAG, msg); +} + + +#ifdef _DEBUG +// validate macros +// Makes sure compiler reports errors when macros are invalid +void ValidateMacros_DontCallThis_Smiley() +{ + MF_BuildPathname("str", "str", 0); + MF_BuildPathnameR(NULL, 0, "%d", 0); + MF_FormatAmxString(NULL, 0, 0, NULL); + MF_GetAmxAddr(NULL, 0); + MF_PrintSrvConsole("str", "str", 0); + MF_GetModname(); + MF_GetScriptName(0); + MF_GetScriptAmx(0); + MF_FindScriptByAmx(NULL); + MF_FindScriptByName("str"); + MF_SetAmxString(NULL, 0, "str", 0); + MF_GetAmxString(NULL, 0, 0, 0); + MF_GetAmxStringLen(NULL); + MF_CopyAmxMemory(NULL, NULL, 0); + MF_Log("str", "str", 0); + MF_LogError(NULL, 0, NULL); + MF_RaiseAmxError(NULL, 0); + MF_RegisterForward("str", (ForwardExecType)0, 0, 0, 0); + MF_ExecuteForward(0, 0, 0); + MF_PrepareCellArray(NULL, 0); + MF_PrepareCharArray(NULL, 0); + MF_PrepareCellArrayA(NULL, 0, true); + MF_PrepareCharArrayA(NULL, 0, true); + MF_IsPlayerValid(0); + MF_GetPlayerName(0); + MF_GetPlayerIP(0); + MF_IsPlayerIngame(0); + MF_IsPlayerBot(0); + MF_IsPlayerAuthorized(0); + MF_GetPlayerTime(0); + MF_GetPlayerPlayTime(0); + MF_GetPlayerCurweapon(0); + MF_GetPlayerTeamID(0); + MF_GetPlayerTeam(0); + MF_GetPlayerDeaths(0); + MF_GetPlayerMenu(0); + MF_GetPlayerKeys(0); + MF_IsPlayerAlive(0); + MF_GetPlayerFrags(0); + MF_IsPlayerConnecting(0); + MF_IsPlayerHLTV(0); + MF_GetPlayerArmor(0); + MF_GetPlayerHealth(0); + MF_AmxExec(0, 0, 0); + MF_AmxExecv(0, 0, 0, 0, 0); + MF_AmxFindPublic(0, 0, 0); + MF_AmxAllot(0, 0, 0, 0); + MF_LoadAmxScript(0, 0, 0, 0, 0); + MF_UnloadAmxScript(0, 0); + MF_RegisterSPForward(0, 0, 0, 0, 0, 0); + MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0); + MF_UnregisterSPForward(0); + MF_GetPlayerFrags(0); + MF_GetPlayerEdict(0); + MF_Format("", 4, "str"); + MF_RegisterFunction(NULL, ""); +} +#endif + +#ifdef MEMORY_TEST + +/************* MEMORY *************/ +// undef all defined macros +#undef new +#undef delete +#undef malloc +#undef calloc +#undef realloc +#undef free + +const unsigned int m_alloc_unknown = 0; +const unsigned int m_alloc_new = 1; +const unsigned int m_alloc_new_array = 2; +const unsigned int m_alloc_malloc = 3; +const unsigned int m_alloc_calloc = 4; +const unsigned int m_alloc_realloc = 5; +const unsigned int m_alloc_delete = 6; +const unsigned int m_alloc_delete_array = 7; +const unsigned int m_alloc_free = 8; + +const char *g_Mem_CurrentFilename = "??"; +int g_Mem_CurrentLine = 0; +const char *g_Mem_CurrentFunc = "??"; + +const char *Mem_MakeSourceFile(const char *sourceFile) +{ + static char buffer[512]; + static size_t pos = 0; + if (!pos) + { + // init + buffer[0] = '['; + strcpy(buffer + 1, MODULE_NAME); + pos = strlen(MODULE_NAME) + 1; + buffer[pos++] = ']'; + } + + // convert from absolute path to [modulename]filename + const char *ptr = strrchr(sourceFile, '\\'); + if (ptr) + ptr++; + else + { + ptr = strrchr(sourceFile, '/'); + if (ptr) + ptr++; + else + ptr = sourceFile; + } + strcpy(buffer + pos, ptr); + return buffer; +} + +void Mem_SetOwner(const char *filename, int line, const char *function) +{ + g_Mem_CurrentFilename = filename; + g_Mem_CurrentLine = line; + g_Mem_CurrentFunc = function; +} + +void Mem_ResetGlobals() +{ + Mem_SetOwner("??", 0, "??"); +} + +// raw (re/de)allocators +void * Mem_Allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int allocationType, const size_t reportedSize) +{ + if (g_fn_Allocator) + return g_fn_Allocator(Mem_MakeSourceFile(sourceFile), sourceLine, sourceFunc, allocationType, reportedSize); + else + return malloc(reportedSize); +} + +void * Mem_Reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress) +{ + if (g_fn_Reallocator) + return g_fn_Reallocator(Mem_MakeSourceFile(sourceFile), sourceLine, sourceFunc, reallocationType, reportedSize, reportedAddress); + else + return realloc(reportedAddress, reportedSize); +} + +void Mem_Deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int deallocationType, void *reportedAddress) +{ + // If you you get user breakpoint here, something failed :) + // - invalid pointer + // - alloc type mismatch ( for example + // char *a = new char[5]; delete char; + // ) + // - The allocation unit is damaged (for example + // char *a = new char[5]; a[6] = 8; + // ) + // - break on dealloc flag set (somehow) + + if (g_fn_Deallocator) + g_fn_Deallocator(Mem_MakeSourceFile(sourceFile), sourceLine, sourceFunc, deallocationType, reportedAddress); + else + free(reportedAddress); +} + +// new and delete operators +void *operator new(size_t reportedSize) +{ + if (reportedSize == 0) + reportedSize = 1; + void *ptr = Mem_Allocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_new, reportedSize); + // :TODO: Handler support ? + if (ptr) + return ptr; + + // allocation failed + return NULL; +} + +void *operator new[](size_t reportedSize) +{ + if (reportedSize == 0) + reportedSize = 1; + void *ptr = Mem_Allocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_new_array, reportedSize); + // :TODO: Handler support ? + if (ptr) + return ptr; + + // allocation failed + return NULL; +} + +// Microsoft memory tracking operators +void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine) +{ + if (reportedSize == 0) + reportedSize = 1; + void *ptr = Mem_Allocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_new, reportedSize); + // :TODO: Handler support ? + if (ptr) + return ptr; + + // allocation failed + return NULL; +} +void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine) +{ + if (reportedSize == 0) + reportedSize = 1; + void *ptr = Mem_Allocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_new_array, reportedSize); + // :TODO: Handler support ? + if (ptr) + return ptr; + + // allocation failed + return NULL; +} + +void operator delete(void *reportedAddress) +{ + if (!reportedAddress) + return; + + Mem_Deallocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_delete, reportedAddress); +} + +void operator delete[](void *reportedAddress) +{ + if (!reportedAddress) + return; + + Mem_Deallocator(g_Mem_CurrentFilename, g_Mem_CurrentLine, g_Mem_CurrentFunc, m_alloc_delete_array, reportedAddress); +} + +#else + +#if !defined NO_ALLOC_OVERRIDES && !defined MEMORY_TEST && !defined WIN32 +void * ::operator new(size_t size) { + return(calloc(1, size)); +} + +void * ::operator new[](size_t size) { + return(calloc(1, size)); +} + +void ::operator delete(void * ptr) { + if(ptr) + free(ptr); +} + +void ::operator delete[](void * ptr) { + if(ptr) + free(ptr); +} +#endif + +#endif //MEMORY_TEST + +/************* stuff from dlls/util.cpp *************/ +// must come here because cbase.h declares it's own operator new + +#ifdef USE_METAMOD + +// Selected portions of dlls/util.cpp from SDK 2.1. +// Functions copied from there as needed... +// And modified to avoid buffer overflows (argh). + +/*** +* +* 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. +* +****/ +/* + +===== util.cpp ======================================================== + + Utility code. Really not optional after all. + +*/ + +#include +#include "sdk_util.h" +#include + +#include // for strncpy(), etc + +#include "osdep.h" // win32 vsnprintf, etc + +char* UTIL_VarArgs( char *format, ... ) +{ + va_list argptr; + static char string[1024]; + + va_start (argptr, format); + vsnprintf (string, sizeof(string), format, argptr); + va_end (argptr); + + return string; +} + + +//========================================================= +// UTIL_LogPrintf - Prints a logged message to console. +// Preceded by LOG: ( timestamp ) < message > +//========================================================= +void UTIL_LogPrintf( char *fmt, ... ) +{ + va_list argptr; + static char string[1024]; + + va_start ( argptr, fmt ); + vsnprintf ( string, sizeof(string), fmt, argptr ); + va_end ( argptr ); + + // Print to server console + ALERT( at_logged, "%s", string ); +} + + +void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, + const char *pMessage) +{ + if ( !pEntity ) + return; + + MESSAGE_BEGIN( MSG_ONE, SVC_TEMPENTITY, NULL, ENT(pEntity->pev) ); + WRITE_BYTE( TE_TEXTMESSAGE ); + WRITE_BYTE( textparms.channel & 0xFF ); + + WRITE_SHORT( FixedSigned16( textparms.x, 1<<13 ) ); + WRITE_SHORT( FixedSigned16( textparms.y, 1<<13 ) ); + WRITE_BYTE( textparms.effect ); + + WRITE_BYTE( textparms.r1 ); + WRITE_BYTE( textparms.g1 ); + WRITE_BYTE( textparms.b1 ); + WRITE_BYTE( textparms.a1 ); + + WRITE_BYTE( textparms.r2 ); + WRITE_BYTE( textparms.g2 ); + WRITE_BYTE( textparms.b2 ); + WRITE_BYTE( textparms.a2 ); + + WRITE_SHORT( FixedUnsigned16( textparms.fadeinTime, 1<<8 ) ); + WRITE_SHORT( FixedUnsigned16( textparms.fadeoutTime, 1<<8 ) ); + WRITE_SHORT( FixedUnsigned16( textparms.holdTime, 1<<8 ) ); + + if ( textparms.effect == 2 ) + WRITE_SHORT( FixedUnsigned16( textparms.fxTime, 1<<8 ) ); + + if ( strlen( pMessage ) < 512 ) + { + WRITE_STRING( pMessage ); + } + else + { + char tmp[512]; + strncpy( tmp, pMessage, 511 ); + tmp[511] = 0; + WRITE_STRING( tmp ); + } + MESSAGE_END(); +} + +short FixedSigned16( float value, float scale ) +{ + int output; + + output = (int) (value * scale); + + if ( output > 32767 ) + output = 32767; + + if ( output < -32768 ) + output = -32768; + + return (short)output; +} + +unsigned short FixedUnsigned16( float value, float scale ) +{ + int output; + + output = (int) (value * scale); + if ( output < 0 ) + output = 0; + if ( output > 0xFFFF ) + output = 0xFFFF; + + return (unsigned short)output; +} +#endif // USE_METAMOD diff --git a/dlls/arrayx/amxxmodule.h b/dlls/arrayx/amxxmodule.h new file mode 100644 index 00000000..0a000d20 --- /dev/null +++ b/dlls/arrayx/amxxmodule.h @@ -0,0 +1,2241 @@ +/* + * AMX Mod X Module Interface Functions + * This file may be freely used +*/ + +// prevent double include +#ifndef __AMXXMODULE_H__ +#define __AMXXMODULE_H__ + +// config +#include "moduleconfig.h" + +// metamod include files +#ifdef USE_METAMOD +#include +#include +#include "osdep.h" +#endif // #ifdef USE_METAMOD + +// DLL Export +#undef DLLEXPORT +#ifndef __linux__ +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#define LINUX +#endif + +#undef C_DLLEXPORT +#define C_DLLEXPORT extern "C" DLLEXPORT + +// ***** AMXX stuff ***** + +// module interface version was 1 +// 2 - added logtag to struct (amxx1.1-rc1) +// 3 - added new tagAMX structure (amxx1.5) +#define AMXX_INTERFACE_VERSION 3 + +// amxx module info +struct amxx_module_info_s +{ + const char *name; + const char *author; + const char *version; + int reload; // reload on mapchange when nonzero + const char *logtag; // added in version 2 +}; + +// return values from functions called by amxx +#define AMXX_OK 0 /* no error */ +#define AMXX_IFVERS 1 /* interface version */ +#define AMXX_PARAM 2 /* Invalid parameter */ +#define AMXX_FUNC_NOT_PRESENT 3 /* Function not present */ + +// *** Small stuff *** +// The next section is copied from the amx.h file +// Copyright (c) ITB CompuPhase, 1997-2005 + +#if defined HAVE_STDINT_H + #include +#else + #if defined __LCC__ || defined __DMC__ || defined LINUX + #if defined HAVE_INTTYPES_H + #include + #else + #include + #endif + #elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L + /* The ISO C99 defines the int16_t and int_32t types. If the compiler got + * here, these types are probably undefined. + */ + #if defined __MACH__ + #include + typedef unsigned short int uint16_t; + typedef unsigned long int uint32_t; + #elif defined __FreeBSD__ + #include + #else + typedef short int int16_t; + typedef unsigned short int uint16_t; + #if defined SN_TARGET_PS2 + typedef int int32_t; + typedef unsigned int uint32_t; + #else + typedef long int int32_t; + typedef unsigned long int uint32_t; + #endif + #if defined __WIN32__ || defined _WIN32 || defined WIN32 + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; + #define HAVE_I64 + #elif defined __GNUC__ + typedef long long int64_t; + typedef unsigned long long uint64_t; + #define HAVE_I64 + #endif + #endif + #endif + #define HAVE_STDINT_H +#endif +#if defined _LP64 || defined WIN64 || defined _WIN64 + #if !defined __64BIT__ + #define __64BIT__ + #endif +#endif + +/* calling convention for native functions */ +#if !defined AMX_NATIVE_CALL + #define AMX_NATIVE_CALL +#endif +/* calling convention for all interface functions and callback functions */ +#if !defined AMXAPI + #if defined STDECL + #define AMXAPI __stdcall + #elif defined CDECL + #define AMXAPI __cdecl + #else + #define AMXAPI + #endif +#endif +#if !defined AMXEXPORT + #define AMXEXPORT +#endif + +#if !defined PAWN_CELL_SIZE + #define PAWN_CELL_SIZE 32 /* by default, use 32-bit cells */ +#endif +#if PAWN_CELL_SIZE==16 + typedef uint16_t ucell; + typedef int16_t cell; +#elif PAWN_CELL_SIZE==32 + typedef uint32_t ucell; + typedef int32_t cell; +#define REAL float +#elif PAWN_CELL_SIZE==64 + typedef uint64_t ucell; + typedef int64_t cell; +#define REAL double +#else + #error Unsupported cell size (PAWN_CELL_SIZE) +#endif + +#define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1) +#define UNLIMITED (~1u >> 1) + +struct tagAMX; +typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params); +typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index, + cell *result, cell *params); +typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx); +#if !defined _FAR + #define _FAR +#endif + +#if defined _MSC_VER + #pragma warning(disable:4103) /* disable warning message 4103 that complains + * about pragma pack in a header file */ + #pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */ +#endif + + +/* Some compilers do not support the #pragma align, which should be fine. Some + * compilers give a warning on unknown #pragmas, which is not so fine... + */ +#if (defined SN_TARGET_PS2 || defined __GNUC__) && !defined AMX_NO_ALIGN + #define AMX_NO_ALIGN +#endif + +#if defined __GNUC__ + #define PACKED __attribute__((packed)) +#else + #define PACKED +#endif + +#if !defined AMX_NO_ALIGN + #if defined LINUX || defined __FreeBSD__ + #pragma pack(1) /* structures must be packed (byte-aligned) */ + #elif defined MACOS && defined __MWERKS__ + #pragma options align=mac68k + #else + #pragma pack(push) + #pragma pack(1) /* structures must be packed (byte-aligned) */ + #if defined __TURBOC__ + #pragma option -a- /* "pack" pragma for older Borland compilers */ + #endif + #endif +#endif + +typedef struct { + const char _FAR *name PACKED; + AMX_NATIVE func PACKED; +} AMX_NATIVE_INFO; + +#define AMX_USERNUM 4 + +/* The AMX structure is the internal structure for many functions. Not all + * fields are valid at all times; many fields are cached in local variables. + */ +typedef struct tagAMX { + unsigned char _FAR *base PACKED; /* points to the AMX header plus the code, optionally also the data */ + unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */ + AMX_CALLBACK callback PACKED; + AMX_DEBUG debug PACKED; /* debug callback */ + /* for external functions a few registers must be accessible from the outside */ + cell cip PACKED; /* instruction pointer: relative to base + amxhdr->cod */ + cell frm PACKED; /* stack frame base: relative to base + amxhdr->dat */ + cell hea PACKED; /* top of the heap: relative to base + amxhdr->dat */ + cell hlw PACKED; /* bottom of the heap: relative to base + amxhdr->dat */ + cell stk PACKED; /* stack pointer: relative to base + amxhdr->dat */ + cell stp PACKED; /* top of the stack: relative to base + amxhdr->dat */ + int flags PACKED; /* current status, see amx_Flags() */ + /* user data */ + long usertags[AMX_USERNUM] PACKED; + //okay userdata[3] in AMX Mod X is for the CPlugin * pointer + //we're also gonna set userdata[2] to a special debug structure + void _FAR *userdata[AMX_USERNUM] PACKED; + /* native functions can raise an error */ + int error PACKED; + /* passing parameters requires a "count" field */ + int paramcount; + /* the sleep opcode needs to store the full AMX status */ + cell pri PACKED; + cell alt PACKED; + cell reset_stk PACKED; + cell reset_hea PACKED; + cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */ + /* support variables for the JIT */ + int reloc_size PACKED; /* required temporary buffer for relocations */ + long code_size PACKED; /* estimated memory footprint of the native code */ +} PACKED AMX; + +enum { + AMX_ERR_NONE, + /* reserve the first 15 error codes for exit codes of the abstract machine */ + AMX_ERR_EXIT, /* forced exit */ + AMX_ERR_ASSERT, /* assertion failed */ + AMX_ERR_STACKERR, /* stack/heap collision */ + AMX_ERR_BOUNDS, /* index out of bounds */ + AMX_ERR_MEMACCESS, /* invalid memory access */ + AMX_ERR_INVINSTR, /* invalid instruction */ + AMX_ERR_STACKLOW, /* stack underflow */ + AMX_ERR_HEAPLOW, /* heap underflow */ + AMX_ERR_CALLBACK, /* no callback, or invalid callback */ + AMX_ERR_NATIVE, /* native function failed */ + AMX_ERR_DIVIDE, /* divide by zero */ + AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */ + AMX_ERR_INVSTATE, /* invalid state for this access */ + + AMX_ERR_MEMORY = 16, /* out of memory */ + AMX_ERR_FORMAT, /* invalid file format */ + AMX_ERR_VERSION, /* file is for a newer version of the AMX */ + AMX_ERR_NOTFOUND, /* function not found */ + AMX_ERR_INDEX, /* invalid index parameter (bad entry point) */ + AMX_ERR_DEBUG, /* debugger cannot run */ + AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */ + AMX_ERR_USERDATA, /* unable to set user data field (table full) */ + AMX_ERR_INIT_JIT, /* cannot initialize the JIT */ + AMX_ERR_PARAMS, /* parameter error */ + AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */ +}; + +#if !defined AMX_NO_ALIGN + #if defined __linux__ + #pragma pack() /* reset default packing */ + #else + #pragma pack(pop) /* reset previous packing */ + #endif +#endif + + +// ***** declare functions ***** + +#ifdef USE_METAMOD +void UTIL_LogPrintf( char *fmt, ... ); +void UTIL_HudMessage(CBaseEntity *pEntity, const hudtextparms_t &textparms, const char *pMessage); +short FixedSigned16( float value, float scale ); +unsigned short FixedUnsigned16( float value, float scale ); + +#ifdef FN_META_QUERY +void FN_META_QUERY(void); +#endif // FN_META_QUERY + +#ifdef FN_META_ATTACH +void FN_META_ATTACH(void); +#endif // FN_META_ATTACH + +#ifdef FN_META_DETACH +void FN_META_DETACH(void); +#endif // FN_META_DETACH + + + + + +#ifdef FN_GameDLLInit +void FN_GameDLLInit(void); +#endif // FN_GameDLLInit + +#ifdef FN_DispatchSpawn +int FN_DispatchSpawn(edict_t *pent); +#endif // FN_DispatchSpawn + +#ifdef FN_DispatchThink +void FN_DispatchThink(edict_t *pent); +#endif // FN_DispatchThink + +#ifdef FN_DispatchUse +void FN_DispatchUse(edict_t *pentUser, edict_t *pentOther); +#endif // FN_DispatchUse + +#ifdef FN_DispatchTouch +void FN_DispatchTouch(edict_t *pentTouched, edict_t *pentOther); +#endif // FN_DispatchTouch + +#ifdef FN_DispatchBlocked +void FN_DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther); +#endif // FN_DispatchBlocked + +#ifdef FN_DispatchKeyValue +void FN_DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd); +#endif // FN_DispatchKeyValue + +#ifdef FN_DispatchSave +void FN_DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData); +#endif // FN_DispatchSave + +#ifdef FN_DispatchRestore +int FN_DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity); +#endif // FN_DispatchRestore + +#ifdef FN_DispatchObjectCollsionBox +void FN_DispatchObjectCollsionBox(edict_t *pent); +#endif // FN_DispatchObjectCollsionBox + +#ifdef FN_SaveWriteFields +void FN_SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); +#endif // FN_SaveWriteFields + +#ifdef FN_SaveReadFields +void FN_SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); +#endif // FN_SaveReadFields + +#ifdef FN_SaveGlobalState +void FN_SaveGlobalState(SAVERESTOREDATA *pSaveData); +#endif // FN_SaveGlobalState + +#ifdef FN_RestoreGlobalState +void FN_RestoreGlobalState(SAVERESTOREDATA *pSaveData); +#endif // FN_RestoreGlobalState + +#ifdef FN_ResetGlobalState +void FN_ResetGlobalState(void); +#endif // FN_ResetGlobalState + +#ifdef FN_ClientConnect +BOOL FN_ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ]); +#endif // FN_ClientConnect + +#ifdef FN_ClientDisconnect +void FN_ClientDisconnect(edict_t *pEntity); +#endif // FN_ClientDisconnect + +#ifdef FN_ClientKill +void FN_ClientKill(edict_t *pEntity); +#endif // FN_ClientKill + +#ifdef FN_ClientPutInServer +void FN_ClientPutInServer(edict_t *pEntity); +#endif // FN_ClientPutInServer + +#ifdef FN_ClientCommand +void FN_ClientCommand(edict_t *pEntity); +#endif // FN_ClientCommand + +#ifdef FN_ClientUserInfoChanged +void FN_ClientUserInfoChanged(edict_t *pEntity, char *infobuffer); +#endif // FN_ClientUserInfoChanged + +#ifdef FN_ServerActivate +void FN_ServerActivate(edict_t *pEdictList, int edictCount, int clientMax); +#endif // FN_ServerActivate + +#ifdef FN_ServerDeactivate +void FN_ServerDeactivate(void); +#endif // FN_ServerDeactivate + +#ifdef FN_PlayerPreThink +void FN_PlayerPreThink(edict_t *pEntity); +#endif // FN_PlayerPreThink + +#ifdef FN_PlayerPostThink +void FN_PlayerPostThink(edict_t *pEntity); +#endif // FN_PlayerPostThink + +#ifdef FN_StartFrame +void FN_StartFrame(void); +#endif // FN_StartFrame + +#ifdef FN_ParmsNewLevel +void FN_ParmsNewLevel(void); +#endif // FN_ParmsNewLevel + +#ifdef FN_ParmsChangeLevel +void FN_ParmsChangeLevel(void); +#endif // FN_ParmsChangeLevel + +#ifdef FN_GetGameDescription +const char *FN_GetGameDescription(void); +#endif // FN_GetGameDescription + +#ifdef FN_PlayerCustomization +void FN_PlayerCustomization(edict_t *pEntity, customization_t *pCust); +#endif // FN_PlayerCustomization + +#ifdef FN_SpectatorConnect +void FN_SpectatorConnect(edict_t *pEntity); +#endif // FN_SpectatorConnect + +#ifdef FN_SpectatorDisconnect +void FN_SpectatorDisconnect(edict_t *pEntity); +#endif // FN_SpectatorDisconnect + +#ifdef FN_SpectatorThink +void FN_SpectatorThink(edict_t *pEntity); +#endif // FN_SpectatorThink + +#ifdef FN_Sys_Error +void FN_Sys_Error(const char *error_string); +#endif // FN_Sys_Error + +#ifdef FN_PM_Move +void FN_PM_Move(struct playermove_s *ppmove, int server); +#endif // FN_PM_Move + +#ifdef FN_PM_Init +void FN_PM_Init(struct playermove_s *ppmove); +#endif // FN_PM_Init + +#ifdef FN_PM_FindTextureType +char FN_PM_FindTextureType(char *name); +#endif // FN_PM_FindTextureType + +#ifdef FN_SetupVisibility +void FN_SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas); +#endif // FN_SetupVisibility + +#ifdef FN_UpdateClientData +void FN_UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd); +#endif // FN_UpdateClientData + +#ifdef FN_AddToFullPack +int FN_AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet); +#endif // FN_AddToFullPack + +#ifdef FN_CreateBaseline +void FN_CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs); +#endif // FN_CreateBaseline + +#ifdef FN_RegisterEncoders +void FN_RegisterEncoders(void); +#endif // FN_RegisterEncoders + +#ifdef FN_GetWeaponData +int FN_GetWeaponData(struct edict_s *player, struct weapon_data_s *info); +#endif // FN_GetWeaponData + +#ifdef FN_CmdStart +void FN_CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed); +#endif // FN_CmdStart + +#ifdef FN_CmdEnd +void FN_CmdEnd(const edict_t *player); +#endif // FN_CmdEnd + +#ifdef FN_ConnectionlessPacket +int FN_ConnectionlessPacket(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size); +#endif // FN_ConnectionlessPacket + +#ifdef FN_GetHullBounds +int FN_GetHullBounds(int hullnumber, float *mins, float *maxs); +#endif // FN_GetHullBounds + +#ifdef FN_CreateInstancedBaselines +void FN_CreateInstancedBaselines(void); +#endif // FN_CreateInstancedBaselines + +#ifdef FN_InconsistentFile +int FN_InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message); +#endif // FN_InconsistentFile + +#ifdef FN_AllowLagCompensation +int FN_AllowLagCompensation(void); +#endif // FN_AllowLagCompensation + + + + +#ifdef FN_GameDLLInit_Post +void FN_GameDLLInit_Post(void); +#endif // FN_GameDLLInit_Post + +#ifdef FN_DispatchSpawn_Post +int FN_DispatchSpawn_Post(edict_t *pent); +#endif // FN_DispatchSpawn_Post + +#ifdef FN_DispatchThink_Post +void FN_DispatchThink_Post(edict_t *pent); +#endif // FN_DispatchThink_Post + +#ifdef FN_DispatchUse_Post +void FN_DispatchUse_Post(edict_t *pentUser, edict_t *pentOther); +#endif // FN_DispatchUse_Post + +#ifdef FN_DispatchTouch_Post +void FN_DispatchTouch_Post(edict_t *pentTouched, edict_t *pentOther); +#endif // FN_DispatchTouch_Post + +#ifdef FN_DispatchBlocked_Post +void FN_DispatchBlocked_Post(edict_t *pentBlocked, edict_t *pentOther); +#endif // FN_DispatchBlocked_Post + +#ifdef FN_DispatchKeyValue_Post +void FN_DispatchKeyValue_Post(edict_t *pentKeyvalue, KeyValueData *pkvd); +#endif // FN_DispatchKeyValue_Post + +#ifdef FN_DispatchSave_Post +void FN_DispatchSave_Post(edict_t *pent, SAVERESTOREDATA *pSaveData); +#endif // FN_DispatchSave_Post + +#ifdef FN_DispatchRestore_Post +int FN_DispatchRestore_Post(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity); +#endif // FN_DispatchRestore_Post + +#ifdef FN_DispatchObjectCollsionBox_Post +void FN_DispatchObjectCollsionBox_Post(edict_t *pent); +#endif // FN_DispatchObjectCollsionBox_Post + +#ifdef FN_SaveWriteFields_Post +void FN_SaveWriteFields_Post(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); +#endif // FN_SaveWriteFields_Post + +#ifdef FN_SaveReadFields_Post +void FN_SaveReadFields_Post(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount); +#endif // FN_SaveReadFields_Post + +#ifdef FN_SaveGlobalState_Post +void FN_SaveGlobalState_Post(SAVERESTOREDATA *pSaveData); +#endif // FN_SaveGlobalState_Post + +#ifdef FN_RestoreGlobalState_Post +void FN_RestoreGlobalState_Post(SAVERESTOREDATA *pSaveData); +#endif // FN_RestoreGlobalState_Post + +#ifdef FN_ResetGlobalState_Post +void FN_ResetGlobalState_Post(void); +#endif // FN_ResetGlobalState_Post + +#ifdef FN_ClientConnect_Post +BOOL FN_ClientConnect_Post(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ]); +#endif // FN_ClientConnect_Post + +#ifdef FN_ClientDisconnect_Post +void FN_ClientDisconnect_Post(edict_t *pEntity); +#endif // FN_ClientDisconnect_Post + +#ifdef FN_ClientKill_Post +void FN_ClientKill_Post(edict_t *pEntity); +#endif // FN_ClientKill_Post + +#ifdef FN_ClientPutInServer_Post +void FN_ClientPutInServer_Post(edict_t *pEntity); +#endif // FN_ClientPutInServer_Post + +#ifdef FN_ClientCommand_Post +void FN_ClientCommand_Post(edict_t *pEntity); +#endif // FN_ClientCommand_Post + +#ifdef FN_ClientUserInfoChanged_Post +void FN_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer); +#endif // FN_ClientUserInfoChanged_Post + +#ifdef FN_ServerActivate_Post +void FN_ServerActivate_Post(edict_t *pEdictList, int edictCount, int clientMax); +#endif // FN_ServerActivate_Post + +#ifdef FN_ServerDeactivate_Post +void FN_ServerDeactivate_Post(void); +#endif // FN_ServerDeactivate_Post + +#ifdef FN_PlayerPreThink_Post +void FN_PlayerPreThink_Post(edict_t *pEntity); +#endif // FN_PlayerPreThink_Post + +#ifdef FN_PlayerPostThink_Post +void FN_PlayerPostThink_Post(edict_t *pEntity); +#endif // FN_PlayerPostThink_Post + +#ifdef FN_StartFrame_Post +void FN_StartFrame_Post(void); +#endif // FN_StartFrame_Post + +#ifdef FN_ParmsNewLevel_Post +void FN_ParmsNewLevel_Post(void); +#endif // FN_ParmsNewLevel_Post + +#ifdef FN_ParmsChangeLevel_Post +void FN_ParmsChangeLevel_Post(void); +#endif // FN_ParmsChangeLevel_Post + +#ifdef FN_GetGameDescription_Post +const char *FN_GetGameDescription_Post(void); +#endif // FN_GetGameDescription_Post + +#ifdef FN_PlayerCustomization_Post +void FN_PlayerCustomization_Post(edict_t *pEntity, customization_t *pCust); +#endif // FN_PlayerCustomization_Post + +#ifdef FN_SpectatorConnect_Post +void FN_SpectatorConnect_Post(edict_t *pEntity); +#endif // FN_SpectatorConnect_Post + +#ifdef FN_SpectatorDisconnect_Post +void FN_SpectatorDisconnect_Post(edict_t *pEntity); +#endif // FN_SpectatorDisconnect_Post + +#ifdef FN_SpectatorThink_Post +void FN_SpectatorThink_Post(edict_t *pEntity); +#endif // FN_SpectatorThink_Post + +#ifdef FN_Sys_Error_Post +void FN_Sys_Error_Post(const char *error_string); +#endif // FN_Sys_Error_Post + +#ifdef FN_PM_Move_Post +void FN_PM_Move_Post(struct playermove_s *ppmove, int server); +#endif // FN_PM_Move_Post + +#ifdef FN_PM_Init_Post +void FN_PM_Init_Post(struct playermove_s *ppmove); +#endif // FN_PM_Init_Post + +#ifdef FN_PM_FindTextureType_Post +char FN_PM_FindTextureType_Post(char *name); +#endif // FN_PM_FindTextureType_Post + +#ifdef FN_SetupVisibility_Post +void FN_SetupVisibility_Post(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas); +#endif // FN_SetupVisibility_Post + +#ifdef FN_UpdateClientData_Post +void FN_UpdateClientData_Post(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd); +#endif // FN_UpdateClientData_Post + +#ifdef FN_AddToFullPack_Post +int FN_AddToFullPack_Post(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet); +#endif // FN_AddToFullPack_Post + +#ifdef FN_CreateBaseline_Post +void FN_CreateBaseline_Post(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs); +#endif // FN_CreateBaseline_Post + +#ifdef FN_RegisterEncoders_Post +void FN_RegisterEncoders_Post(void); +#endif // FN_RegisterEncoders_Post + +#ifdef FN_GetWeaponData_Post +int FN_GetWeaponData_Post(struct edict_s *player, struct weapon_data_s *info); +#endif // FN_GetWeaponData_Post + +#ifdef FN_CmdStart_Post +void FN_CmdStart_Post(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed); +#endif // FN_CmdStart_Post + +#ifdef FN_CmdEnd_Post +void FN_CmdEnd_Post(const edict_t *player); +#endif // FN_CmdEnd_Post + +#ifdef FN_ConnectionlessPacket_Post +int FN_ConnectionlessPacket_Post(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size); +#endif // FN_ConnectionlessPacket_Post + +#ifdef FN_GetHullBounds_Post +int FN_GetHullBounds_Post(int hullnumber, float *mins, float *maxs); +#endif // FN_GetHullBounds_Post + +#ifdef FN_CreateInstancedBaselines_Post +void FN_CreateInstancedBaselines_Post(void); +#endif // FN_CreateInstancedBaselines_Post + +#ifdef FN_InconsistentFile_Post +int FN_InconsistentFile_Post(const edict_t *player, const char *filename, char *disconnect_message); +#endif // FN_InconsistentFile_Post + +#ifdef FN_AllowLagCompensation_Post +int FN_AllowLagCompensation_Post(void); +#endif // FN_AllowLagCompensation_Post + + + +#ifdef FN_PrecacheModel +int FN_PrecacheModel(char *s); +#endif // FN_PrecacheModel + +#ifdef FN_PrecacheSound +int FN_PrecacheSound(char *s); +#endif // FN_PrecacheSound + +#ifdef FN_SetModel +void FN_SetModel(edict_t *e, const char *m); +#endif // FN_SetModel + +#ifdef FN_ModelIndex +int FN_ModelIndex(const char *m); +#endif // FN_ModelIndex + +#ifdef FN_ModelFrames +int FN_ModelFrames(int modelIndex); +#endif // FN_ModelFrames + +#ifdef FN_SetSize +void FN_SetSize(edict_t *e, const float *rgflMin, const float *rgflMax); +#endif // FN_SetSize + +#ifdef FN_ChangeLevel +void FN_ChangeLevel(char *s1, char *s2); +#endif // FN_ChangeLevel + +#ifdef FN_GetSpawnParms +void FN_GetSpawnParms(edict_t *ent); +#endif // FN_GetSpawnParms + +#ifdef FN_SaveSpawnParms +void FN_SaveSpawnParms(edict_t *ent); +#endif // FN_SaveSpawnParms + +#ifdef FN_VecToYaw +float FN_VecToYaw(const float *rgflVector); +#endif // FN_VecToYaw + +#ifdef FN_VecToAngles +void FN_VecToAngles(const float *rgflVectorIn, float *rgflVectorOut); +#endif // FN_VecToAngles + +#ifdef FN_MoveToOrigin +void FN_MoveToOrigin(edict_t *ent, const float *pflGoal, float dist, int iMoveType); +#endif // FN_MoveToOrigin + +#ifdef FN_ChangeYaw +void FN_ChangeYaw(edict_t *ent); +#endif // FN_ChangeYaw + +#ifdef FN_ChangePitch +void FN_ChangePitch(edict_t *ent); +#endif // FN_ChangePitch + +#ifdef FN_FindEntityByString +edict_t *FN_FindEntityByString(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); +#endif // FN_FindEntityByString + +#ifdef FN_GetEntityIllum +int FN_GetEntityIllum(edict_t *pEnt); +#endif // FN_GetEntityIllum + +#ifdef FN_FindEntityInSphere +edict_t *FN_FindEntityInSphere(edict_t *pEdictStartSearchAfter, const float *org, float rad); +#endif // FN_FindEntityInSphere + +#ifdef FN_FindClientInPVS +edict_t *FN_FindClientInPVS(edict_t *pEdict); +#endif // FN_FindClientInPVS + +#ifdef FN_EntitiesInPVS +edict_t *FN_EntitiesInPVS(edict_t *pplayer); +#endif // FN_EntitiesInPVS + +#ifdef FN_MakeVectors +void FN_MakeVectors(const float *rgflVector); +#endif // FN_MakeVectors + +#ifdef FN_AngleVectors +void FN_AngleVectors(const float *rgflVector, float *forward, float *right, float *up); +#endif // FN_AngleVectors + +#ifdef FN_CreateEntity +edict_t *FN_CreateEntity(void); +#endif // FN_CreateEntity + +#ifdef FN_RemoveEntity +void FN_RemoveEntity(edict_t *e); +#endif // FN_RemoveEntity + +#ifdef FN_CreateNamedEntity +edict_t *FN_CreateNamedEntity(int className); +#endif // FN_CreateNamedEntity + +#ifdef FN_MakeStatic +void FN_MakeStatic(edict_t *ent); +#endif // FN_MakeStatic + +#ifdef FN_EntIsOnFloor +int FN_EntIsOnFloor(edict_t *ent); +#endif // FN_EntIsOnFloor + +#ifdef FN_DropToFloor +int FN_DropToFloor(edict_t *ent); +#endif // FN_DropToFloor + +#ifdef FN_WalkMove +int FN_WalkMove(edict_t *ent, float yaw, float dist, int iMode); +#endif // FN_WalkMove + +#ifdef FN_SetOrigin +void FN_SetOrigin(edict_t *e, const float *rgflOrigin); +#endif // FN_SetOrigin + +#ifdef FN_EmitSound +void FN_EmitSound(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); +#endif // FN_EmitSound + +#ifdef FN_EmitAmbientSound +void FN_EmitAmbientSound(edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); +#endif // FN_EmitAmbientSound + +#ifdef FN_TraceLine +void FN_TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceLine + +#ifdef FN_TraceToss +void FN_TraceToss(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr); +#endif // FN_TraceToss + +#ifdef FN_TraceMonsterHull +int FN_TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceMonsterHull + +#ifdef FN_TraceHull +void FN_TraceHull(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceHull + +#ifdef FN_TraceModel +void FN_TraceModel(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); +#endif // FN_TraceModel + +#ifdef FN_TraceTexture +const char *FN_TraceTexture(edict_t *pTextureEntity, const float *v1, const float *v2 ); +#endif // FN_TraceTexture + +#ifdef FN_TraceSphere +void FN_TraceSphere(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceSphere + +#ifdef FN_GetAimVector +void FN_GetAimVector(edict_t *ent, float speed, float *rgflReturn); +#endif // FN_GetAimVector + +#ifdef FN_ServerCommand +void FN_ServerCommand(char *str); +#endif // FN_ServerCommand + +#ifdef FN_ServerExecute +void FN_ServerExecute(void); +#endif // FN_ServerExecute + +#ifdef FN_engClientCommand +void FN_engClientCommand(edict_t *pEdict, char *szFmt, ...); +#endif // FN_engClientCommand + +#ifdef FN_ParticleEffect +void FN_ParticleEffect(const float *org, const float *dir, float color, float count); +#endif // FN_ParticleEffect + +#ifdef FN_LightStyle +void FN_LightStyle(int style, char *val); +#endif // FN_LightStyle + +#ifdef FN_DecalIndex +int FN_DecalIndex(const char *name); +#endif // FN_DecalIndex + +#ifdef FN_PointContents +int FN_PointContents(const float *rgflVector); +#endif // FN_PointContents + +#ifdef FN_MessageBegin +void FN_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); +#endif // FN_MessageBegin + +#ifdef FN_MessageEnd +void FN_MessageEnd(void); +#endif // FN_MessageEnd + +#ifdef FN_WriteByte +void FN_WriteByte(int iValue); +#endif // FN_WriteByte + +#ifdef FN_WriteChar +void FN_WriteChar(int iValue); +#endif // FN_WriteChar + +#ifdef FN_WriteShort +void FN_WriteShort(int iValue); +#endif // FN_WriteShort + +#ifdef FN_WriteLong +void FN_WriteLong(int iValue); +#endif // FN_WriteLong + +#ifdef FN_WriteAngle +void FN_WriteAngle(float flValue); +#endif // FN_WriteAngle + +#ifdef FN_WriteCoord +void FN_WriteCoord(float flValue); +#endif // FN_WriteCoord + +#ifdef FN_WriteString +void FN_WriteString(const char *sz); +#endif // FN_WriteString + +#ifdef FN_WriteEntity +void FN_WriteEntity(int iValue); +#endif // FN_WriteEntity + +#ifdef FN_CVarRegister +void FN_CVarRegister(cvar_t *pCvar); +#endif // FN_CVarRegister + +#ifdef FN_CVarGetFloat +float FN_CVarGetFloat(const char *szVarName); +#endif // FN_CVarGetFloat + +#ifdef FN_CVarGetString +const char *FN_CVarGetString(const char *szVarName); +#endif // FN_CVarGetString + +#ifdef FN_CVarSetFloat +void FN_CVarSetFloat(const char *szVarName, float flValue); +#endif // FN_CVarSetFloat + +#ifdef FN_CVarSetString +void FN_CVarSetString(const char *szVarName, const char *szValue); +#endif // FN_CVarSetString + +#ifdef FN_AlertMessage +void FN_AlertMessage(ALERT_TYPE atype, char *szFmt, ...); +#endif // FN_AlertMessage + +#ifdef FN_EngineFprintf +void FN_EngineFprintf(FILE *pfile, char *szFmt, ...); +#endif // FN_EngineFprintf + +#ifdef FN_PvAllocEntPrivateData +void *FN_PvAllocEntPrivateData(edict_t *pEdict, int32 cb); +#endif // FN_PvAllocEntPrivateData + +#ifdef FN_PvEntPrivateData +void *FN_PvEntPrivateData(edict_t *pEdict); +#endif // FN_PvEntPrivateData + +#ifdef FN_FreeEntPrivateData +void FN_FreeEntPrivateData(edict_t *pEdict); +#endif // FN_FreeEntPrivateData + +#ifdef FN_SzFromIndex +const char *FN_SzFromIndex(int iString); +#endif // FN_SzFromIndex + +#ifdef FN_AllocString +int FN_AllocString(const char *szValue); +#endif // FN_AllocString + +#ifdef FN_GetVarsOfEnt +struct entvars_s *FN_GetVarsOfEnt(edict_t *pEdict); +#endif // FN_GetVarsOfEnt + +#ifdef FN_PEntityOfEntOffset +edict_t *FN_PEntityOfEntOffset(int iEntOffset); +#endif // FN_PEntityOfEntOffset + +#ifdef FN_EntOffsetOfPEntity +int FN_EntOffsetOfPEntity(const edict_t *pEdict); +#endif // FN_EntOffsetOfPEntity + +#ifdef FN_IndexOfEdict +int FN_IndexOfEdict(const edict_t *pEdict); +#endif // FN_IndexOfEdict + +#ifdef FN_PEntityOfEntIndex +edict_t *FN_PEntityOfEntIndex(int iEntIndex); +#endif // FN_PEntityOfEntIndex + +#ifdef FN_FindEntityByVars +edict_t *FN_FindEntityByVars(struct entvars_s *pvars); +#endif // FN_FindEntityByVars + +#ifdef FN_GetModelPtr +void *FN_GetModelPtr(edict_t *pEdict); +#endif // FN_GetModelPtr + +#ifdef FN_RegUserMsg +int FN_RegUserMsg(const char *pszName, int iSize); +#endif // FN_RegUserMsg + +#ifdef FN_AnimationAutomove +void FN_AnimationAutomove(const edict_t *pEdict, float flTime); +#endif // FN_AnimationAutomove + +#ifdef FN_GetBonePosition +void FN_GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles); +#endif // FN_GetBonePosition + +#ifdef FN_FunctionFromName +unsigned long FN_FunctionFromName(const char *pName); +#endif // FN_FunctionFromName + +#ifdef FN_NameForFunction +const char *FN_NameForFunction(unsigned long function); +#endif // FN_NameForFunction + +#ifdef FN_ClientPrintf +void FN_ClientPrintf(edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg); +#endif // FN_ClientPrintf + +#ifdef FN_ServerPrint +void FN_ServerPrint(const char *szMsg); +#endif // FN_ServerPrint + +#ifdef FN_Cmd_Args +const char *FN_Cmd_Args(void); +#endif // FN_Cmd_Args + +#ifdef FN_Cmd_Argv +const char *FN_Cmd_Argv(int argc); +#endif // FN_Cmd_Argv + +#ifdef FN_Cmd_Argc +int FN_Cmd_Argc(void); +#endif // FN_Cmd_Argc + +#ifdef FN_GetAttachment +void FN_GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); +#endif // FN_GetAttachment + +#ifdef FN_CRC32_Init +void FN_CRC32_Init(CRC32_t *pulCRC); +#endif // FN_CRC32_Init + +#ifdef FN_CRC32_ProcessBuffer +void FN_CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); +#endif // FN_CRC32_ProcessBuffer + +#ifdef FN_CRC32_ProcessByte +void FN_CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); +#endif // FN_CRC32_ProcessByte + +#ifdef FN_CRC32_Final +CRC32_t FN_CRC32_Final(CRC32_t pulCRC); +#endif // FN_CRC32_Final + +#ifdef FN_RandomLong +long FN_RandomLong(long lLow, long lHigh); +#endif // FN_RandomLong + +#ifdef FN_RandomFloat +float FN_RandomFloat(float flLow, float flHigh); +#endif // FN_RandomFloat + +#ifdef FN_SetView +void FN_SetView(const edict_t *pClient, const edict_t *pViewent); +#endif // FN_SetView + +#ifdef FN_Time +float FN_Time(void); +#endif // FN_Time + +#ifdef FN_CrosshairAngle +void FN_CrosshairAngle(const edict_t *pClient, float pitch, float yaw); +#endif // FN_CrosshairAngle + +#ifdef FN_LoadFileForMe +byte *FN_LoadFileForMe(char *filename, int *pLength); +#endif // FN_LoadFileForMe + +#ifdef FN_FreeFile +void FN_FreeFile(void *buffer); +#endif // FN_FreeFile + +#ifdef FN_EndSection +void FN_EndSection(const char *pszSectionName); +#endif // FN_EndSection + +#ifdef FN_CompareFileTime +int FN_CompareFileTime(char *filename1, char *filename2, int *iCompare); +#endif // FN_CompareFileTime + +#ifdef FN_GetGameDir +void FN_GetGameDir(char *szGetGameDir); +#endif // FN_GetGameDir + +#ifdef FN_Cvar_RegisterVariable +void FN_Cvar_RegisterVariable(cvar_t *variable); +#endif // FN_Cvar_RegisterVariable + +#ifdef FN_FadeClientVolume +void FN_FadeClientVolume(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); +#endif // FN_FadeClientVolume + +#ifdef FN_SetClientMaxspeed +void FN_SetClientMaxspeed(const edict_t *pEdict, float fNewMaxspeed); +#endif // FN_SetClientMaxspeed + +#ifdef FN_CreateFakeClient +edict_t *FN_CreateFakeClient(const char *netname); +#endif // FN_CreateFakeClient + +#ifdef FN_RunPlayerMove +void FN_RunPlayerMove(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec); +#endif // FN_RunPlayerMove + +#ifdef FN_NumberOfEntities +int FN_NumberOfEntities(void); +#endif // FN_NumberOfEntities + +#ifdef FN_GetInfoKeyBuffer +char *FN_GetInfoKeyBuffer(edict_t *e); +#endif // FN_GetInfoKeyBuffer + +#ifdef FN_InfoKeyValue +char *FN_InfoKeyValue(char *infobuffer, char *key); +#endif // FN_InfoKeyValue + +#ifdef FN_SetKeyValue +void FN_SetKeyValue(char *infobuffer, char *key, char *value); +#endif // FN_SetKeyValue + +#ifdef FN_SetClientKeyValue +void FN_SetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value); +#endif // FN_SetClientKeyValue + +#ifdef FN_IsMapValid +int FN_IsMapValid(char *filename); +#endif // FN_IsMapValid + +#ifdef FN_StaticDecal +void FN_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex); +#endif // FN_StaticDecal + +#ifdef FN_PrecacheGeneric +int FN_PrecacheGeneric(char *s); +#endif // FN_PrecacheGeneric + +#ifdef FN_GetPlayerUserId +int FN_GetPlayerUserId(edict_t *e ); +#endif // FN_GetPlayerUserId + +#ifdef FN_BuildSoundMsg +void FN_BuildSoundMsg(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); +#endif // FN_BuildSoundMsg + +#ifdef FN_IsDedicatedServer +int FN_IsDedicatedServer(void); +#endif // FN_IsDedicatedServer + +#ifdef FN_CVarGetPointer +cvar_t *FN_CVarGetPointer(const char *szVarName); +#endif // FN_CVarGetPointer + +#ifdef FN_GetPlayerWONId +unsigned int FN_GetPlayerWONId(edict_t *e); +#endif // FN_GetPlayerWONId + +#ifdef FN_Info_RemoveKey +void FN_Info_RemoveKey( char *s, const char *key); +#endif // FN_Info_RemoveKey + +#ifdef FN_GetPhysicsKeyValue +const char *FN_GetPhysicsKeyValue(const edict_t *pClient, const char *key); +#endif // FN_GetPhysicsKeyValue + +#ifdef FN_SetPhysicsKeyValue +void FN_SetPhysicsKeyValue(const edict_t *pClient, const char *key, const char *value); +#endif // FN_SetPhysicsKeyValue + +#ifdef FN_GetPhysicsInfoString +const char *FN_GetPhysicsInfoString( const edict_t *pClient); +#endif // FN_GetPhysicsInfoString + +#ifdef FN_PrecacheEvent +unsigned short FN_PrecacheEvent(int type, const char *psz); +#endif // FN_PrecacheEvent + +#ifdef FN_PlaybackEvent +void FN_PlaybackEvent(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); +#endif // FN_PlaybackEvent + +#ifdef FN_SetFatPVS +unsigned char *FN_SetFatPVS(float *org); +#endif // FN_SetFatPVS + +#ifdef FN_SetFatPAS +unsigned char *FN_SetFatPAS(float *org); +#endif // FN_SetFatPAS + +#ifdef FN_CheckVisibility +int FN_CheckVisibility(const edict_t *entity, unsigned char *pset); +#endif // FN_CheckVisibility + +#ifdef FN_DeltaSetField +void FN_DeltaSetField(struct delta_s *pFields, const char *fieldname); +#endif // FN_DeltaSetField + +#ifdef FN_DeltaUnsetField +void FN_DeltaUnsetField(struct delta_s *pFields, const char *fieldname); +#endif // FN_DeltaUnsetField + +#ifdef FN_DeltaAddEncoder +void FN_DeltaAddEncoder(char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); +#endif // FN_DeltaAddEncoder + +#ifdef FN_GetCurrentPlayer +int FN_GetCurrentPlayer(void); +#endif // FN_GetCurrentPlayer + +#ifdef FN_CanSkipPlayer +int FN_CanSkipPlayer(const edict_t *player); +#endif // FN_CanSkipPlayer + +#ifdef FN_DeltaFindField +int FN_DeltaFindField(struct delta_s *pFields, const char *fieldname); +#endif // FN_DeltaFindField + +#ifdef FN_DeltaSetFieldByIndex +void FN_DeltaSetFieldByIndex(struct delta_s *pFields, int fieldNumber); +#endif // FN_DeltaSetFieldByIndex + +#ifdef FN_DeltaUnsetFieldByIndex +void FN_DeltaUnsetFieldByIndex(struct delta_s *pFields, int fieldNumber); +#endif // FN_DeltaUnsetFieldByIndex + +#ifdef FN_SetGroupMask +void FN_SetGroupMask(int mask, int op); +#endif // FN_SetGroupMask + +#ifdef FN_engCreateInstancedBaseline +int FN_engCreateInstancedBaseline(int classname, struct entity_state_s *baseline); +#endif // FN_engCreateInstancedBaseline + +#ifdef FN_Cvar_DirectSet +void FN_Cvar_DirectSet(struct cvar_s *var, char *value); +#endif // FN_Cvar_DirectSet + +#ifdef FN_ForceUnmodified +void FN_ForceUnmodified(FORCE_TYPE type, float *mins, float *maxs, const char *filename); +#endif // FN_ForceUnmodified + +#ifdef FN_GetPlayerStats +void FN_GetPlayerStats(const edict_t *pClient, int *ping, int *packet_loss); +#endif // FN_GetPlayerStats + +#ifdef FN_AddServerCommand +void FN_AddServerCommand(char *cmd_name, void (*function) (void)); +#endif // FN_AddServerCommand + +#ifdef FN_Voice_GetClientListening +qboolean FN_Voice_GetClientListening(int iReceiver, int iSender); +#endif // FN_Voice_GetClientListening + +#ifdef FN_Voice_SetClientListening +qboolean FN_Voice_SetClientListening(int iReceiver, int iSender, qboolean bListen); +#endif // FN_Voice_SetClientListening + +#ifdef FN_GetPlayerAuthId +const char *FN_GetPlayerAuthId(edict_t *e); +#endif // FN_GetPlayerAuthId + + + + + + +#ifdef FN_PrecacheModel_Post +int FN_PrecacheModel_Post(char *s); +#endif // FN_PrecacheModel_Post + +#ifdef FN_PrecacheSound_Post +int FN_PrecacheSound_Post(char *s); +#endif // FN_PrecacheSound_Post + +#ifdef FN_SetModel_Post +void FN_SetModel_Post(edict_t *e, const char *m); +#endif // FN_SetModel_Post + +#ifdef FN_ModelIndex_Post +int FN_ModelIndex_Post(const char *m); +#endif // FN_ModelIndex_Post + +#ifdef FN_ModelFrames_Post +int FN_ModelFrames_Post(int modelIndex); +#endif // FN_ModelFrames_Post + +#ifdef FN_SetSize_Post +void FN_SetSize_Post(edict_t *e, const float *rgflMin, const float *rgflMax); +#endif // FN_SetSize_Post + +#ifdef FN_ChangeLevel_Post +void FN_ChangeLevel_Post(char *s1, char *s2); +#endif // FN_ChangeLevel_Post + +#ifdef FN_GetSpawnParms_Post +void FN_GetSpawnParms_Post(edict_t *ent); +#endif // FN_GetSpawnParms_Post + +#ifdef FN_SaveSpawnParms_Post +void FN_SaveSpawnParms_Post(edict_t *ent); +#endif // FN_SaveSpawnParms_Post + +#ifdef FN_VecToYaw_Post +float FN_VecToYaw_Post(const float *rgflVector); +#endif // FN_VecToYaw_Post + +#ifdef FN_VecToAngles_Post +void FN_VecToAngles_Post(const float *rgflVectorIn, float *rgflVectorOut); +#endif // FN_VecToAngles_Post + +#ifdef FN_MoveToOrigin_Post +void FN_MoveToOrigin_Post(edict_t *ent, const float *pflGoal, float dist, int iMoveType); +#endif // FN_MoveToOrigin_Post + +#ifdef FN_ChangeYaw_Post +void FN_ChangeYaw_Post(edict_t *ent); +#endif // FN_ChangeYaw_Post + +#ifdef FN_ChangePitch_Post +void FN_ChangePitch_Post(edict_t *ent); +#endif // FN_ChangePitch_Post + +#ifdef FN_FindEntityByString_Post +edict_t *FN_FindEntityByString_Post(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); +#endif // FN_FindEntityByString_Post + +#ifdef FN_GetEntityIllum_Post +int FN_GetEntityIllum_Post(edict_t *pEnt); +#endif // FN_GetEntityIllum_Post + +#ifdef FN_FindEntityInSphere_Post +edict_t *FN_FindEntityInSphere_Post(edict_t *pEdictStartSearchAfter, const float *org, float rad); +#endif // FN_FindEntityInSphere_Post + +#ifdef FN_FindClientInPVS_Post +edict_t *FN_FindClientInPVS_Post(edict_t *pEdict); +#endif // FN_FindClientInPVS_Post + +#ifdef FN_EntitiesInPVS_Post +edict_t *FN_EntitiesInPVS_Post(edict_t *pplayer); +#endif // FN_EntitiesInPVS_Post + +#ifdef FN_MakeVectors_Post +void FN_MakeVectors_Post(const float *rgflVector); +#endif // FN_MakeVectors_Post + +#ifdef FN_AngleVectors_Post +void FN_AngleVectors_Post(const float *rgflVector, float *forward, float *right, float *up); +#endif // FN_AngleVectors_Post + +#ifdef FN_CreateEntity_Post +edict_t *FN_CreateEntity_Post(void); +#endif // FN_CreateEntity_Post + +#ifdef FN_RemoveEntity_Post +void FN_RemoveEntity_Post(edict_t *e); +#endif // FN_RemoveEntity_Post + +#ifdef FN_CreateNamedEntity_Post +edict_t *FN_CreateNamedEntity_Post(int className); +#endif // FN_CreateNamedEntity_Post + +#ifdef FN_MakeStatic_Post +void FN_MakeStatic_Post(edict_t *ent); +#endif // FN_MakeStatic_Post + +#ifdef FN_EntIsOnFloor_Post +int FN_EntIsOnFloor_Post(edict_t *ent); +#endif // FN_EntIsOnFloor_Post + +#ifdef FN_DropToFloor_Post +int FN_DropToFloor_Post(edict_t *ent); +#endif // FN_DropToFloor_Post + +#ifdef FN_WalkMove_Post +int FN_WalkMove_Post(edict_t *ent, float yaw, float dist, int iMode); +#endif // FN_WalkMove_Post + +#ifdef FN_SetOrigin_Post +void FN_SetOrigin_Post(edict_t *e, const float *rgflOrigin); +#endif // FN_SetOrigin_Post + +#ifdef FN_EmitSound_Post +void FN_EmitSound_Post(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); +#endif // FN_EmitSound_Post + +#ifdef FN_EmitAmbientSound_Post +void FN_EmitAmbientSound_Post(edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); +#endif // FN_EmitAmbientSound_Post + +#ifdef FN_TraceLine_Post +void FN_TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceLine_Post + +#ifdef FN_TraceToss_Post +void FN_TraceToss_Post(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr); +#endif // FN_TraceToss_Post + +#ifdef FN_TraceMonsterHull_Post +int FN_TraceMonsterHull_Post(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceMonsterHull_Post + +#ifdef FN_TraceHull_Post +void FN_TraceHull_Post(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceHull_Post + +#ifdef FN_TraceModel_Post +void FN_TraceModel_Post(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); +#endif // FN_TraceModel_Post + +#ifdef FN_TraceTexture_Post +const char *FN_TraceTexture_Post(edict_t *pTextureEntity, const float *v1, const float *v2 ); +#endif // FN_TraceTexture_Post + +#ifdef FN_TraceSphere_Post +void FN_TraceSphere_Post(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); +#endif // FN_TraceSphere_Post + +#ifdef FN_GetAimVector_Post +void FN_GetAimVector_Post(edict_t *ent, float speed, float *rgflReturn); +#endif // FN_GetAimVector_Post + +#ifdef FN_ServerCommand_Post +void FN_ServerCommand_Post(char *str); +#endif // FN_ServerCommand_Post + +#ifdef FN_ServerExecute_Post +void FN_ServerExecute_Post(void); +#endif // FN_ServerExecute_Post + +#ifdef FN_engClientCommand_Post +void FN_engClientCommand_Post(edict_t *pEdict, char *szFmt, ...); +#endif // FN_engClientCommand_Post + +#ifdef FN_ParticleEffect_Post +void FN_ParticleEffect_Post(const float *org, const float *dir, float color, float count); +#endif // FN_ParticleEffect_Post + +#ifdef FN_LightStyle_Post +void FN_LightStyle_Post(int style, char *val); +#endif // FN_LightStyle_Post + +#ifdef FN_DecalIndex_Post +int FN_DecalIndex_Post(const char *name); +#endif // FN_DecalIndex_Post + +#ifdef FN_PointContents_Post +int FN_PointContents_Post(const float *rgflVector); +#endif // FN_PointContents_Post + +#ifdef FN_MessageBegin_Post +void FN_MessageBegin_Post(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); +#endif // FN_MessageBegin_Post + +#ifdef FN_MessageEnd_Post +void FN_MessageEnd_Post(void); +#endif // FN_MessageEnd_Post + +#ifdef FN_WriteByte_Post +void FN_WriteByte_Post(int iValue); +#endif // FN_WriteByte_Post + +#ifdef FN_WriteChar_Post +void FN_WriteChar_Post(int iValue); +#endif // FN_WriteChar_Post + +#ifdef FN_WriteShort_Post +void FN_WriteShort_Post(int iValue); +#endif // FN_WriteShort_Post + +#ifdef FN_WriteLong_Post +void FN_WriteLong_Post(int iValue); +#endif // FN_WriteLong_Post + +#ifdef FN_WriteAngle_Post +void FN_WriteAngle_Post(float flValue); +#endif // FN_WriteAngle_Post + +#ifdef FN_WriteCoord_Post +void FN_WriteCoord_Post(float flValue); +#endif // FN_WriteCoord_Post + +#ifdef FN_WriteString_Post +void FN_WriteString_Post(const char *sz); +#endif // FN_WriteString_Post + +#ifdef FN_WriteEntity_Post +void FN_WriteEntity_Post(int iValue); +#endif // FN_WriteEntity_Post + +#ifdef FN_CVarRegister_Post +void FN_CVarRegister_Post(cvar_t *pCvar); +#endif // FN_CVarRegister_Post + +#ifdef FN_CVarGetFloat_Post +float FN_CVarGetFloat_Post(const char *szVarName); +#endif // FN_CVarGetFloat_Post + +#ifdef FN_CVarGetString_Post +const char *FN_CVarGetString_Post(const char *szVarName); +#endif // FN_CVarGetString_Post + +#ifdef FN_CVarSetFloat_Post +void FN_CVarSetFloat_Post(const char *szVarName, float flValue); +#endif // FN_CVarSetFloat_Post + +#ifdef FN_CVarSetString_Post +void FN_CVarSetString_Post(const char *szVarName, const char *szValue); +#endif // FN_CVarSetString_Post + +#ifdef FN_AlertMessage_Post +void FN_AlertMessage_Post(ALERT_TYPE atype, char *szFmt, ...); +#endif // FN_AlertMessage_Post + +#ifdef FN_EngineFprintf_Post +void FN_EngineFprintf_Post(FILE *pfile, char *szFmt, ...); +#endif // FN_EngineFprintf_Post + +#ifdef FN_PvAllocEntPrivateData_Post +void *FN_PvAllocEntPrivateData_Post(edict_t *pEdict, long cb); +#endif // FN_PvAllocEntPrivateData_Post + +#ifdef FN_PvEntPrivateData_Post +void *FN_PvEntPrivateData_Post(edict_t *pEdict); +#endif // FN_PvEntPrivateData_Post + +#ifdef FN_FreeEntPrivateData_Post +void FN_FreeEntPrivateData_Post(edict_t *pEdict); +#endif // FN_FreeEntPrivateData_Post + +#ifdef FN_SzFromIndex_Post +const char *FN_SzFromIndex_Post(int iString); +#endif // FN_SzFromIndex_Post + +#ifdef FN_AllocString_Post +int FN_AllocString_Post(const char *szValue); +#endif // FN_AllocString_Post + +#ifdef FN_GetVarsOfEnt_Post +struct entvars_s *FN_GetVarsOfEnt_Post(edict_t *pEdict); +#endif // FN_GetVarsOfEnt_Post + +#ifdef FN_PEntityOfEntOffset_Post +edict_t *FN_PEntityOfEntOffset_Post(int iEntOffset); +#endif // FN_PEntityOfEntOffset_Post + +#ifdef FN_EntOffsetOfPEntity_Post +int FN_EntOffsetOfPEntity_Post(const edict_t *pEdict); +#endif // FN_EntOffsetOfPEntity_Post + +#ifdef FN_IndexOfEdict_Post +int FN_IndexOfEdict_Post(const edict_t *pEdict); +#endif // FN_IndexOfEdict_Post + +#ifdef FN_PEntityOfEntIndex_Post +edict_t *FN_PEntityOfEntIndex_Post(int iEntIndex); +#endif // FN_PEntityOfEntIndex_Post + +#ifdef FN_FindEntityByVars_Post +edict_t *FN_FindEntityByVars_Post(struct entvars_s *pvars); +#endif // FN_FindEntityByVars_Post + +#ifdef FN_GetModelPtr_Post +void *FN_GetModelPtr_Post(edict_t *pEdict); +#endif // FN_GetModelPtr_Post + +#ifdef FN_RegUserMsg_Post +int FN_RegUserMsg_Post(const char *pszName, int iSize); +#endif // FN_RegUserMsg_Post + +#ifdef FN_AnimationAutomove_Post +void FN_AnimationAutomove_Post(const edict_t *pEdict, float flTime); +#endif // FN_AnimationAutomove_Post + +#ifdef FN_GetBonePosition_Post +void FN_GetBonePosition_Post(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles); +#endif // FN_GetBonePosition_Post + +#ifdef FN_FunctionFromName_Post +unsigned long FN_FunctionFromName_Post(const char *pName); +#endif // FN_FunctionFromName_Post + +#ifdef FN_NameForFunction_Post +const char *FN_NameForFunction_Post(unsigned long function); +#endif // FN_NameForFunction_Post + +#ifdef FN_ClientPrintf_Post +void FN_ClientPrintf_Post(edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg); +#endif // FN_ClientPrintf_Post + +#ifdef FN_ServerPrint_Post +void FN_ServerPrint_Post(const char *szMsg); +#endif // FN_ServerPrint_Post + +#ifdef FN_Cmd_Args_Post +const char *FN_Cmd_Args_Post(void); +#endif // FN_Cmd_Args_Post + +#ifdef FN_Cmd_Argv_Post +const char *FN_Cmd_Argv_Post(int argc); +#endif // FN_Cmd_Argv_Post + +#ifdef FN_Cmd_Argc_Post +int FN_Cmd_Argc_Post(void); +#endif // FN_Cmd_Argc_Post + +#ifdef FN_GetAttachment_Post +void FN_GetAttachment_Post(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); +#endif // FN_GetAttachment_Post + +#ifdef FN_CRC32_Init_Post +void FN_CRC32_Init_Post(CRC32_t *pulCRC); +#endif // FN_CRC32_Init_Post + +#ifdef FN_CRC32_ProcessBuffer_Post +void FN_CRC32_ProcessBuffer_Post(CRC32_t *pulCRC, void *p, int len); +#endif // FN_CRC32_ProcessBuffer_Post + +#ifdef FN_CRC32_ProcessByte_Post +void FN_CRC32_ProcessByte_Post(CRC32_t *pulCRC, unsigned char ch); +#endif // FN_CRC32_ProcessByte_Post + +#ifdef FN_CRC32_Final_Post +CRC32_t FN_CRC32_Final_Post(CRC32_t pulCRC); +#endif // FN_CRC32_Final_Post + +#ifdef FN_RandomLong_Post +long FN_RandomLong_Post(long lLow, long lHigh); +#endif // FN_RandomLong_Post + +#ifdef FN_RandomFloat_Post +float FN_RandomFloat_Post(float flLow, float flHigh); +#endif // FN_RandomFloat_Post + +#ifdef FN_SetView_Post +void FN_SetView_Post(const edict_t *pClient, const edict_t *pViewent); +#endif // FN_SetView_Post + +#ifdef FN_Time_Post +float FN_Time_Post(void); +#endif // FN_Time_Post + +#ifdef FN_CrosshairAngle_Post +void FN_CrosshairAngle_Post(const edict_t *pClient, float pitch, float yaw); +#endif // FN_CrosshairAngle_Post + +#ifdef FN_LoadFileForMe_Post +byte *FN_LoadFileForMe_Post(char *filename, int *pLength); +#endif // FN_LoadFileForMe_Post + +#ifdef FN_FreeFile_Post +void FN_FreeFile_Post(void *buffer); +#endif // FN_FreeFile_Post + +#ifdef FN_EndSection_Post +void FN_EndSection_Post(const char *pszSectionName); +#endif // FN_EndSection_Post + +#ifdef FN_CompareFileTime_Post +int FN_CompareFileTime_Post(char *filename1, char *filename2, int *iCompare); +#endif // FN_CompareFileTime_Post + +#ifdef FN_GetGameDir_Post +void FN_GetGameDir_Post(char *szGetGameDir); +#endif // FN_GetGameDir_Post + +#ifdef FN_Cvar_RegisterVariable_Post +void FN_Cvar_RegisterVariable_Post(cvar_t *variable); +#endif // FN_Cvar_RegisterVariable_Post + +#ifdef FN_FadeClientVolume_Post +void FN_FadeClientVolume_Post(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); +#endif // FN_FadeClientVolume_Post + +#ifdef FN_SetClientMaxspeed_Post +void FN_SetClientMaxspeed_Post(const edict_t *pEdict, float fNewMaxspeed); +#endif // FN_SetClientMaxspeed_Post + +#ifdef FN_CreateFakeClient_Post +edict_t *FN_CreateFakeClient_Post(const char *netname); +#endif // FN_CreateFakeClient_Post + +#ifdef FN_RunPlayerMove_Post +void FN_RunPlayerMove_Post(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec); +#endif // FN_RunPlayerMove_Post + +#ifdef FN_NumberOfEntities_Post +int FN_NumberOfEntities_Post(void); +#endif // FN_NumberOfEntities_Post + +#ifdef FN_GetInfoKeyBuffer_Post +char *FN_GetInfoKeyBuffer_Post(edict_t *e); +#endif // FN_GetInfoKeyBuffer_Post + +#ifdef FN_InfoKeyValue_Post +char *FN_InfoKeyValue_Post(char *infobuffer, char *key); +#endif // FN_InfoKeyValue_Post + +#ifdef FN_SetKeyValue_Post +void FN_SetKeyValue_Post(char *infobuffer, char *key, char *value); +#endif // FN_SetKeyValue_Post + +#ifdef FN_SetClientKeyValue_Post +void FN_SetClientKeyValue_Post(int clientIndex, char *infobuffer, char *key, char *value); +#endif // FN_SetClientKeyValue_Post + +#ifdef FN_IsMapValid_Post +int FN_IsMapValid_Post(char *filename); +#endif // FN_IsMapValid_Post + +#ifdef FN_StaticDecal_Post +void FN_StaticDecal_Post(const float *origin, int decalIndex, int entityIndex, int modelIndex); +#endif // FN_StaticDecal_Post + +#ifdef FN_PrecacheGeneric_Post +int FN_PrecacheGeneric_Post(char *s); +#endif // FN_PrecacheGeneric_Post + +#ifdef FN_GetPlayerUserId_Post +int FN_GetPlayerUserId_Post(edict_t *e ); +#endif // FN_GetPlayerUserId_Post + +#ifdef FN_BuildSoundMsg_Post +void FN_BuildSoundMsg_Post(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); +#endif // FN_BuildSoundMsg_Post + +#ifdef FN_IsDedicatedServer_Post +int FN_IsDedicatedServer_Post(void); +#endif // FN_IsDedicatedServer_Post + +#ifdef FN_CVarGetPointer_Post +cvar_t *FN_CVarGetPointer_Post(const char *szVarName); +#endif // FN_CVarGetPointer_Post + +#ifdef FN_GetPlayerWONId_Post +unsigned int FN_GetPlayerWONId_Post(edict_t *e); +#endif // FN_GetPlayerWONId_Post + +#ifdef FN_Info_RemoveKey_Post +void FN_Info_RemoveKey_Post( char *s, const char *key); +#endif // FN_Info_RemoveKey_Post + +#ifdef FN_GetPhysicsKeyValue_Post +const char *FN_GetPhysicsKeyValue_Post(const edict_t *pClient, const char *key); +#endif // FN_GetPhysicsKeyValue_Post + +#ifdef FN_SetPhysicsKeyValue_Post +void FN_SetPhysicsKeyValue_Post(const edict_t *pClient, const char *key, const char *value); +#endif // FN_SetPhysicsKeyValue_Post + +#ifdef FN_GetPhysicsInfoString_Post +const char *FN_GetPhysicsInfoString_Post( const edict_t *pClient); +#endif // FN_GetPhysicsInfoString_Post + +#ifdef FN_PrecacheEvent_Post +unsigned short FN_PrecacheEvent_Post(int type, const char *psz); +#endif // FN_PrecacheEvent_Post + +#ifdef FN_PlaybackEvent_Post +void FN_PlaybackEvent_Post(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); +#endif // FN_PlaybackEvent_Post + +#ifdef FN_SetFatPVS_Post +unsigned char *FN_SetFatPVS_Post(float *org); +#endif // FN_SetFatPVS_Post + +#ifdef FN_SetFatPAS_Post +unsigned char *FN_SetFatPAS_Post(float *org); +#endif // FN_SetFatPAS_Post + +#ifdef FN_CheckVisibility_Post +int FN_CheckVisibility_Post(const edict_t *entity, unsigned char *pset); +#endif // FN_CheckVisibility_Post + +#ifdef FN_DeltaSetField_Post +void FN_DeltaSetField_Post(struct delta_s *pFields, const char *fieldname); +#endif // FN_DeltaSetField_Post + +#ifdef FN_DeltaUnsetField_Post +void FN_DeltaUnsetField_Post(struct delta_s *pFields, const char *fieldname); +#endif // FN_DeltaUnsetField_Post + +#ifdef FN_DeltaAddEncoder_Post +void FN_DeltaAddEncoder_Post(char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); +#endif // FN_DeltaAddEncoder_Post + +#ifdef FN_GetCurrentPlayer_Post +int FN_GetCurrentPlayer_Post(void); +#endif // FN_GetCurrentPlayer_Post + +#ifdef FN_CanSkipPlayer_Post +int FN_CanSkipPlayer_Post(const edict_t *player); +#endif // FN_CanSkipPlayer_Post + +#ifdef FN_DeltaFindField_Post +int FN_DeltaFindField_Post(struct delta_s *pFields, const char *fieldname); +#endif // FN_DeltaFindField_Post + +#ifdef FN_DeltaSetFieldByIndex_Post +void FN_DeltaSetFieldByIndex_Post(struct delta_s *pFields, int fieldNumber); +#endif // FN_DeltaSetFieldByIndex_Post + +#ifdef FN_DeltaUnsetFieldByIndex_Post +void FN_DeltaUnsetFieldByIndex_Post(struct delta_s *pFields, int fieldNumber); +#endif // FN_DeltaUnsetFieldByIndex_Post + +#ifdef FN_SetGroupMask_Post +void FN_SetGroupMask_Post(int mask, int op); +#endif // FN_SetGroupMask_Post + +#ifdef FN_engCreateInstancedBaseline_Post +int FN_engCreateInstancedBaseline_Post(int classname, struct entity_state_s *baseline); +#endif // FN_engCreateInstancedBaseline_Post + +#ifdef FN_Cvar_DirectSet_Post +void FN_Cvar_DirectSet_Post(struct cvar_s *var, char *value); +#endif // FN_Cvar_DirectSet_Post + +#ifdef FN_ForceUnmodified_Post +void FN_ForceUnmodified_Post(FORCE_TYPE type, float *mins, float *maxs, const char *filename); +#endif // FN_ForceUnmodified_Post + +#ifdef FN_GetPlayerStats_Post +void FN_GetPlayerStats_Post(const edict_t *pClient, int *ping, int *packet_loss); +#endif // FN_GetPlayerStats_Post + +#ifdef FN_AddServerCommand_Post +void FN_AddServerCommand_Post(char *cmd_name, void (*function)(void)); +#endif // FN_AddServerCommand_Post + +#ifdef FN_Voice_GetClientListening_Post +qboolean FN_Voice_GetClientListening_Post(int iReceiver, int iSender); +#endif // FN_Voice_GetClientListening_Post + +#ifdef FN_Voice_SetClientListening_Post +qboolean FN_Voice_SetClientListening_Post(int iReceiver, int iSender, qboolean bListen); +#endif // FN_Voice_SetClientListening_Post + +#ifdef FN_GetPlayerAuthId_Post +const char *FN_GetPlayerAuthId_Post(edict_t *e); +#endif // FN_GetPlayerAuthId + + + + +#ifdef FN_OnFreeEntPrivateData +void FN_OnFreeEntPrivateData(edict_t *pEnt); +#endif // FN_OnFreeEntPrivateData + +#ifdef FN_GameShutdown +void FN_GameShutdown(void); +#endif // FN_GameShutdown + +#ifdef FN_ShouldCollide +int FN_ShouldCollide(edict_t *pentTouched, edict_t *pentOther); +#endif // FN_ShouldCollide + + + + + +#ifdef FN_OnFreeEntPrivateData_Post +void FN_OnFreeEntPrivateData_Post(edict_t *pEnt); +#endif // FN_OnFreeEntPrivateData_Post + +#ifdef FN_GameShutdown_Post +void FN_GameShutdown_Post(void); +#endif // FN_GameShutdown_Post + +#ifdef FN_ShouldCollide_Post +int FN_ShouldCollide_Post(edict_t *pentTouched, edict_t *pentOther); +#endif // FN_ShouldCollide_Post + +#endif // USE_METAMOD + + +#ifdef FN_AMXX_QUERY +void FN_AMXX_QUERY(void); +#endif // FN_AMXX_QUERY + +#ifdef FN_AMXX_ATTACH +void FN_AMXX_ATTACH(void); +#endif // FN_AMXX_ATTACH + +#ifdef FN_AMXX_DETACH +void FN_AMXX_DETACH(void); +#endif // FN_AMXX_DETACH + +#ifdef FN_AMXX_PLUGINSLOADED +void FN_AMXX_PLUGINSLOADED(void); +#endif // FN_AMXX_PLUGINSLOADED + +// *** Types *** +typedef void* (*PFN_REQ_FNPTR)(const char * /*name*/); + +// ***** Module funcs stuff ***** +enum ForwardExecType +{ + ET_IGNORE = 0, // Ignore return vaue + ET_STOP, // Stop on PLUGIN_HANDLED + ET_STOP2, // Stop on PLUGIN_HANDLED, continue on other values, return biggest return value + ET_CONTINUE, // Continue; return biggest return value +}; + +enum ForwardParam +{ + FP_DONE = -1, // specify this as the last argument + // only tells the function that there are no more arguments + FP_CELL, // normal cell + FP_FLOAT, // float; used as normal cell though + FP_STRING, // string + FP_STRINGEX, // string; will be updated to the last function's value + FP_ARRAY, // array; use the return value of prepareArray. +}; + + +typedef int (*PFN_ADD_NATIVES) (const AMX_NATIVE_INFO * /*list*/); +typedef char * (*PFN_BUILD_PATHNAME) (const char * /*format*/, ...); +typedef char * (*PFN_BUILD_PATHNAME_R) (char * /*buffer*/, size_t /* maxlen */, const char * /* format */, ...); +typedef cell * (*PFN_GET_AMXADDR) (AMX * /*amx*/, cell /*offset*/); +typedef void (*PFN_PRINT_SRVCONSOLE) (char * /*format*/, ...); +typedef const char * (*PFN_GET_MODNAME) (void); +typedef const char * (*PFN_GET_AMXSCRIPTNAME) (int /*id*/); +typedef AMX * (*PFN_GET_AMXSCRIPT) (int /*id*/); +typedef int (*PFN_FIND_AMXSCRIPT_BYAMX) (const AMX * /*amx*/); +typedef int (*PFN_FIND_AMXSCRIPT_BYNAME) (const char * /*name*/); +typedef int (*PFN_SET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, const char * /* source */, int /* max */); +typedef char * (*PFN_GET_AMXSTRING) (AMX * /*amx*/, cell /*amx_addr*/, int /*bufferId*/, int * /*pLen*/); +typedef int (*PFN_GET_AMXSTRINGLEN) (const cell *ptr); +typedef char * (*PFN_FORMAT_AMXSTRING) (AMX * /*amx*/, cell * /*params*/, int /*startParam*/, int * /*pLen*/); +typedef void (*PFN_COPY_AMXMEMORY) (cell * /*dest*/, const cell * /*src*/, int /*len*/); +typedef void (*PFN_LOG) (const char * /*fmt*/, ...); +typedef void (*PFN_LOG_ERROR) (AMX * /*amx*/, int /*err*/, const char * /*fmt*/, ...); +typedef int (*PFN_RAISE_AMXERROR) (AMX * /*amx*/, int /*error*/); +typedef int (*PFN_REGISTER_FORWARD) (const char * /*funcname*/, ForwardExecType /*exectype*/, ... /*paramtypes terminated by PF_DONE*/); +typedef int (*PFN_EXECUTE_FORWARD) (int /*id*/, ... /*params*/); +typedef cell (*PFN_PREPARE_CELLARRAY) (cell * /*ptr*/, unsigned int /*size*/); +typedef cell (*PFN_PREPARE_CHARARRAY) (char * /*ptr*/, unsigned int /*size*/); +typedef cell (*PFN_PREPARE_CELLARRAY_A) (cell * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/); +typedef cell (*PFN_PREPARE_CHARARRAY_A) (char * /*ptr*/, unsigned int /*size*/, bool /*copyBack*/); +typedef int (*PFN_IS_PLAYER_VALID) (int /*id*/); +typedef const char * (*PFN_GET_PLAYER_NAME) (int /*id*/); +typedef const char * (*PFN_GET_PLAYER_IP) (int /*id*/); +typedef int (*PFN_IS_PLAYER_INGAME) (int /*id*/); +typedef int (*PFN_IS_PLAYER_BOT) (int /*id*/); +typedef int (*PFN_IS_PLAYER_AUTHORIZED) (int /*id*/); +typedef float (*PFN_GET_PLAYER_TIME) (int /*id*/); +typedef float (*PFN_GET_PLAYER_PLAYTIME) (int /*id*/); +typedef int (*PFN_GETPLAYERFLAGS) (int /* id*/); +typedef int (*PFN_GET_PLAYER_CURWEAPON) (int /*id*/); +typedef const char * (*PFN_GET_PLAYER_TEAM) (int /*id*/); +typedef int (*PFN_GET_PLAYER_TEAMID) (int /*id*/); +typedef int (*PFN_GET_PLAYER_DEATHS) (int /*id*/); +typedef int (*PFN_GET_PLAYER_MENU) (int /*id*/); +typedef int (*PFN_GET_PLAYER_KEYS) (int /*id*/); +typedef int (*PFN_IS_PLAYER_ALIVE) (int /*id*/); +typedef int (*PFN_GET_PLAYER_FRAGS) (int /*id*/); +typedef int (*PFN_IS_PLAYER_CONNECTING) (int /*id*/); +typedef int (*PFN_IS_PLAYER_HLTV) (int /*id*/); +typedef int (*PFN_GET_PLAYER_ARMOR) (int /*id*/); +typedef int (*PFN_GET_PLAYER_HEALTH) (int /*id*/); +#ifdef USE_METAMOD +typedef edict_t * (*PFN_GET_PLAYER_EDICT) (int /*id*/); +#else +typedef void * (*PFN_GET_PLAYER_EDICT) (int /*id*/); +#endif + +#ifdef MEMORY_TEST +typedef void * (*PFN_ALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, + const unsigned int /*type*/, const size_t /*size*/); +typedef void * (*PFN_REALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, + const unsigned int /*type*/, const size_t /*size*/, void* /*addr*/ ); +typedef void (*PFN_DEALLOCATOR) (const char* /*filename*/, const unsigned int /*line*/, const char* /*func*/, + const unsigned int /*type*/, const void* /*addr*/ ); +#endif +typedef int (*PFN_AMX_EXEC) (AMX* /*amx*/, cell* /*return val*/, int /*index*/); +typedef int (*PFN_AMX_EXECV) (AMX* /*amx*/, cell* /*return val*/, int /*index*/, int /*numparams*/, cell[] /*params*/); +typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_addr*/, cell** /*phys_addr*/); +typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, char* /*func name*/, int* /*index*/); +typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); +typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); +typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); +typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); +typedef int (*PFN_REGISTER_SPFORWARD) (AMX * /*amx*/, int /*func*/, ... /*params*/); +typedef int (*PFN_REGISTER_SPFORWARD_BYNAME) (AMX * /*amx*/, const char * /*funcName*/, ... /*params*/); +typedef void (*PFN_UNREGISTER_SPFORWARD) (int /*id*/); +typedef void (*PFN_MERGEDEFINITION_FILE) (const char * /*filename*/); +typedef const char * (*PFN_FORMAT) (const char * /*fmt*/, ... /*params*/); +typedef void (*PFN_REGISTERFUNCTION) (void * /*pfn*/, const char * /*desc*/); +typedef int (*PFN_AMX_PUSH) (AMX * /*amx*/, cell /*value*/); + +extern PFN_ADD_NATIVES g_fn_AddNatives; +extern PFN_BUILD_PATHNAME g_fn_BuildPathname; +extern PFN_BUILD_PATHNAME_R g_fn_BuildPathnameR; +extern PFN_GET_AMXADDR g_fn_GetAmxAddr; +extern PFN_PRINT_SRVCONSOLE g_fn_PrintSrvConsole; +extern PFN_GET_MODNAME g_fn_GetModname; +extern PFN_GET_AMXSCRIPTNAME g_fn_GetAmxScriptName; +extern PFN_GET_AMXSCRIPT g_fn_GetAmxScript; +extern PFN_FIND_AMXSCRIPT_BYAMX g_fn_FindAmxScriptByAmx; +extern PFN_FIND_AMXSCRIPT_BYNAME g_fn_FindAmxScriptByName; +extern PFN_SET_AMXSTRING g_fn_SetAmxString; +extern PFN_GET_AMXSTRING g_fn_GetAmxString; +extern PFN_GET_AMXSTRINGLEN g_fn_GetAmxStringLen; +extern PFN_FORMAT_AMXSTRING g_fn_FormatAmxString; +extern PFN_COPY_AMXMEMORY g_fn_CopyAmxMemory; +extern PFN_LOG g_fn_Log; +extern PFN_LOG_ERROR g_fn_LogErrorFunc; +extern PFN_RAISE_AMXERROR g_fn_RaiseAmxError; +extern PFN_REGISTER_FORWARD g_fn_RegisterForward; +extern PFN_EXECUTE_FORWARD g_fn_ExecuteForward; +extern PFN_PREPARE_CELLARRAY g_fn_PrepareCellArray; +extern PFN_PREPARE_CHARARRAY g_fn_PrepareCharArray; +extern PFN_PREPARE_CELLARRAY_A g_fn_PrepareCellArrayA; +extern PFN_PREPARE_CHARARRAY_A g_fn_PrepareCharArrayA; +extern PFN_IS_PLAYER_VALID g_fn_IsPlayerValid; +extern PFN_GET_PLAYER_NAME g_fn_GetPlayerName; +extern PFN_GET_PLAYER_IP g_fn_GetPlayerIP; +extern PFN_IS_PLAYER_INGAME g_fn_IsPlayerIngame; +extern PFN_IS_PLAYER_BOT g_fn_IsPlayerBot; +extern PFN_IS_PLAYER_AUTHORIZED g_fn_IsPlayerAuthorized; +extern PFN_GET_PLAYER_TIME g_fn_GetPlayerTime; +extern PFN_GET_PLAYER_PLAYTIME g_fn_GetPlayerPlayTime; +extern PFN_GET_PLAYER_CURWEAPON g_fn_GetPlayerCurweapon; +extern PFN_GET_PLAYER_TEAMID g_fn_GetPlayerTeamID; +extern PFN_GET_PLAYER_DEATHS g_fn_GetPlayerDeaths; +extern PFN_GET_PLAYER_MENU g_fn_GetPlayerMenu; +extern PFN_GET_PLAYER_KEYS g_fn_GetPlayerKeys; +extern PFN_IS_PLAYER_ALIVE g_fn_IsPlayerAlive; +extern PFN_GET_PLAYER_FRAGS g_fn_GetPlayerFrags; +extern PFN_IS_PLAYER_CONNECTING g_fn_IsPlayerConnecting; +extern PFN_IS_PLAYER_HLTV g_fn_IsPlayerHLTV; +extern PFN_GET_PLAYER_ARMOR g_fn_GetPlayerArmor; +extern PFN_GET_PLAYER_HEALTH g_fn_GetPlayerHealth; +extern PFN_AMX_EXEC g_fn_AmxExec; +extern PFN_AMX_ALLOT g_fn_AmxAllot; +extern PFN_AMX_FINDPUBLIC g_fn_AmxFindPublic; +extern PFN_LOAD_AMXSCRIPT g_fn_LoadAmxScript; +extern PFN_UNLOAD_AMXSCRIPT g_fn_UnloadAmxScript; +extern PFN_REAL_TO_CELL g_fn_RealToCell; +extern PFN_CELL_TO_REAL g_fn_CellToReal; +extern PFN_REGISTER_SPFORWARD g_fn_RegisterSPForward; +extern PFN_REGISTER_SPFORWARD_BYNAME g_fn_RegisterSPForwardByName; +extern PFN_UNREGISTER_SPFORWARD g_fn_UnregisterSPForward; +extern PFN_MERGEDEFINITION_FILE g_fn_MergeDefinition_File; +extern PFN_AMX_FINDNATIVE g_fn_AmxFindNative; +extern PFN_GETPLAYERFLAGS g_fn_GetPlayerFlags; +extern PFN_GET_PLAYER_EDICT g_fn_GetPlayerEdict; +extern PFN_FORMAT g_fn_Format; +extern PFN_GET_PLAYER_TEAM g_fn_GetPlayerTeam; +extern PFN_REGISTERFUNCTION g_fn_RegisterFunction; +extern PFN_REQ_FNPTR g_fn_RequestFunction; +extern PFN_AMX_PUSH g_fn_AmxPush; + +#ifdef MAY_NEVER_BE_DEFINED +// Function prototypes for intellisense and similar systems +// They understand #if 0 so we use #ifdef MAY_NEVER_BE_DEFINED +int MF_AddNatives (const AMX_NATIVE_INFO *list) { } +char * MF_BuildPathname (const char * format, ...) { } +char * MF_BuildPathnameR (char *buffer, size_t maxlen, const char *fmt, ...) { } +cell * MF_GetAmxAddr (AMX * amx, cell offset) { } +void MF_PrintSrvConsole (char * format, ...) { } +const char * MF_GetModname (void) { } +const char * MF_GetScriptName (int id) { } +AMX * MF_GetScriptAmx (int id) { } +int MF_FindScriptByAmx (const AMX * amx) { } +int MF_FindScriptByAmx (const char * name) { } +int MF_SetAmxString (AMX * amx, cell amx_addr, const char * source , int max ) { } +char * MF_GetAmxString (AMX * amx, cell amx_addr, int bufferId, int * pLen) { } +int MF_GetAmxStringLen (const cell *ptr) { } +char * MF_FormatAmxString (AMX * amx, cell * params, int startParam, int * pLen) { } +void MF_CopyAmxMemory (cell * dest, const cell * src, int len) { } +void MF_Log (const char * fmt, ...) { } +void MF_LogError (AMX * amx, int err, const char *fmt, ...) { } +int MF_RaiseAmxError (AMX * amx, int error) { } +int MF_RegisterForward (const char * funcname, ForwardExecType exectype, ...) { } +int MF_ExecuteForward (int id, ...) { } +cell MF_PrepareCellArray (cell * ptr, unsigned int size) { } +cell MF_PrepareCharArray (char * ptr, unsigned int size) { } +cell MF_PrepareCellArrayA (cell * ptr, unsigned int size, bool copyBack) { } +cell MF_PrepareCharArrayA (char * ptr, unsigned int size, bool copyBack) { } +int MF_IsPlayerValid (int id) { } +const char * MF_GetPlayerName (int id) { } +const char * MF_GetPlayerIP (int id) { } +int MF_IsPlayerIngame (int id) { } +int MF_IsPlayerBot (int id) { } +int MF_IsPlayerAuthorized (int id) { } +float MF_GetPlayerTime (int id) { } +float MF_GetPlayerPlayTime (int id) { } +int MF_GetPlayerCurweapon (int id) { } +const char * MF_GetPlayerTeam (int id) { } +int MF_GetPlayerTeamID (int id) { } +int MF_GetPlayerDeaths (int id) { } +int MF_GetPlayerMenu (int id) { } +int MF_GetPlayerKeys (int id) { } +int MF_IsPlayerAlive (int id) { } +int MF_GetPlayerFrags (int id) { } +int MF_IsPlayerConnecting (int id) { } +int MF_IsPlayerHLTV (int id) { } +int MF_GetPlayerArmor (int id) { } +int MF_GetPlayerHealth (int id) { } +REAL amx_ctof (cell x) { } +cell amx_ftoc (float x) { } +int MF_RegisterSPForwardByName (AMX * amx, const char *str, ...) { } +int MF_RegisterSPForward (AMX * amx, int func, ...) { } +void MF_UnregisterSPForward (int id) { } +int MF_GetPlayerFlags (int id) { } +edict_t* MF_GetPlayerEdict (int id) { } +const char * MF_Format (const char *fmt, ...) { } +void MF_RegisterFunction (void *pfn, const char *description) { } +void * MF_RequestFunction (const char *description) { } +int MF_AmxPush (AMX *amx, cell *params) { } +int MF_AmxExec (AMX *amx, cell *retval, int idx) { } +#endif // MAY_NEVER_BE_DEFINED + +#define MF_AddNatives g_fn_AddNatives +#define MF_BuildPathname g_fn_BuildPathname +#define MF_BuildPathnameR g_fn_BuildPathnameR +#define MF_FormatAmxString g_fn_FormatAmxString +#define MF_GetAmxAddr g_fn_GetAmxAddr +#define MF_PrintSrvConsole g_fn_PrintSrvConsole +#define MF_GetModname g_fn_GetModname +#define MF_GetScriptName g_fn_GetAmxScriptName +#define MF_GetScriptAmx g_fn_GetAmxScript +#define MF_FindScriptByAmx g_fn_FindAmxScriptByAmx +#define MF_FindScriptByName g_fn_FindAmxScriptByName +#define MF_SetAmxString g_fn_SetAmxString +#define MF_GetAmxString g_fn_GetAmxString +#define MF_GetAmxStringLen g_fn_GetAmxStringLen +#define MF_CopyAmxMemory g_fn_CopyAmxMemory +void MF_Log(const char *fmt, ...); +void MF_LogError(AMX *amx, int err, const char *fmt, ...); +#define MF_RaiseAmxError g_fn_RaiseAmxError +#define MF_RegisterForward g_fn_RegisterForward +#define MF_ExecuteForward g_fn_ExecuteForward +#define MF_PrepareCellArray g_fn_PrepareCellArray +#define MF_PrepareCharArray g_fn_PrepareCharArray +#define MF_PrepareCellArrayA g_fn_PrepareCellArrayA +#define MF_PrepareCharArrayA g_fn_PrepareCharArrayA +#define MF_IsPlayerValid g_fn_IsPlayerValid +#define MF_GetPlayerName g_fn_GetPlayerName +#define MF_GetPlayerIP g_fn_GetPlayerIP +#define MF_IsPlayerIngame g_fn_IsPlayerIngame +#define MF_IsPlayerBot g_fn_IsPlayerBot +#define MF_IsPlayerAuthorized g_fn_IsPlayerAuthorized +#define MF_GetPlayerTime g_fn_GetPlayerTime +#define MF_GetPlayerPlayTime g_fn_GetPlayerPlayTime +#define MF_GetPlayerCurweapon g_fn_GetPlayerCurweapon +#define MF_GetPlayerTeam g_fn_GetPlayerTeam +#define MF_GetPlayerTeamID g_fn_GetPlayerTeamID +#define MF_GetPlayerDeaths g_fn_GetPlayerDeaths +#define MF_GetPlayerMenu g_fn_GetPlayerMenu +#define MF_GetPlayerKeys g_fn_GetPlayerKeys +#define MF_IsPlayerAlive g_fn_IsPlayerAlive +#define MF_GetPlayerFrags g_fn_GetPlayerFrags +#define MF_IsPlayerConnecting g_fn_IsPlayerConnecting +#define MF_IsPlayerHLTV g_fn_IsPlayerHLTV +#define MF_GetPlayerArmor g_fn_GetPlayerArmor +#define MF_GetPlayerHealth g_fn_GetPlayerHealth +#define MF_AmxExec g_fn_AmxExec +#define MF_AmxExecv g_fn_AmxExecv +#define MF_AmxFindPublic g_fn_AmxFindPublic +#define MF_AmxAllot g_fn_AmxAllot +#define MF_AmxFindNative g_fn_AmxFindNative +#define MF_LoadAmxScript g_fn_LoadAmxScript +#define MF_UnloadAmxScript g_fn_UnloadAmxScript +#define MF_MergeDefinitionFile g_fn_MergeDefinition_File +#define amx_ctof g_fn_CellToReal +#define amx_ftoc g_fn_RealToCell +#define MF_RegisterSPForwardByName g_fn_RegisterSPForwardByName +#define MF_RegisterSPForward g_fn_RegisterSPForward +#define MF_UnregisterSPForward g_fn_UnregisterSPForward +#define MF_GetPlayerFlags g_fn_GetPlayerFlags +#define MF_GetPlayerEdict g_fn_GetPlayerEdict +#define MF_Format g_fn_Format +#define MF_RegisterFunction g_fn_RegisterFunction +#define MF_RequestFunction g_fn_RequestFunction; +#define MF_AmxPush g_fn_AmxPush + +#ifdef MEMORY_TEST +/*** Memory ***/ +void *operator new(size_t reportedSize); +void *operator new[](size_t reportedSize); +void *operator new(size_t reportedSize, const char *sourceFile, int sourceLine); +void *operator new[](size_t reportedSize, const char *sourceFile, int sourceLine); +void operator delete(void *reportedAddress); +void operator delete[](void *reportedAddress); + +// Allocation types +extern const unsigned int m_alloc_unknown; +extern const unsigned int m_alloc_new; +extern const unsigned int m_alloc_new_array; +extern const unsigned int m_alloc_malloc; +extern const unsigned int m_alloc_calloc; +extern const unsigned int m_alloc_realloc; +extern const unsigned int m_alloc_delete; +extern const unsigned int m_alloc_delete_array; +extern const unsigned int m_alloc_free; + +// To be called before new / delete +void Mem_SetOwner(const char *filename, int line, const char *function); +// Actual allocator +void * Mem_Allocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int allocationType, const size_t reportedSize); +void * Mem_Reallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int reallocationType, const size_t reportedSize, void *reportedAddress); +void Mem_Deallocator(const char *sourceFile, const unsigned int sourceLine, const char *sourceFunc, + const unsigned int deallocationType, void *reportedAddress); + +// memory macros +#ifndef __FUNCTION__ +#define __FUNCTION__ "??" +#endif + +// call Mem_SetOwner, followed by the actual new operator +#define new (Mem_SetOwner(__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new +// call Mem_SetOwner, followed by the actual delete operator +#define delete (Mem_SetOwner(__FILE__,__LINE__,__FUNCTION__),false) ? Mem_SetOwner("",0,"") : delete +#define malloc(sz) Mem_Allocator (__FILE__,__LINE__,__FUNCTION__,m_alloc_malloc,sz) +#define calloc(sz) Mem_Allocator (__FILE__,__LINE__,__FUNCTION__,m_alloc_calloc,sz) +#define realloc(ptr,sz) Mem_Reallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_realloc,sz,ptr) +#define free(ptr) Mem_Deallocator(__FILE__,__LINE__,__FUNCTION__,m_alloc_free,ptr) + +#endif //MEMORY_TEST + +#endif // #ifndef __AMXXMODULE_H__ diff --git a/dlls/arrayx/moduleconfig.h b/dlls/arrayx/moduleconfig.h new file mode 100644 index 00000000..cc25d269 --- /dev/null +++ b/dlls/arrayx/moduleconfig.h @@ -0,0 +1,463 @@ +// Configuration + +#ifndef __MODULECONFIG_H__ +#define __MODULECONFIG_H__ + +// Module info +#define MODULE_NAME "Array" +#define MODULE_VERSION "1.7" +#define MODULE_AUTHOR "Twilight Suzuka" +#define MODULE_URL "www.amxmodx.org" +#define MODULE_LOGTAG "ARRAY" +// If you want the module not to be reloaded on mapchange, remove / comment out the next line +#define MODULE_RELOAD_ON_MAPCHANGE + +#ifdef __DATE__ +#define MODULE_DATE __DATE__ +#else // __DATE__ +#define MODULE_DATE "Unknown" +#endif // __DATE__ + +// metamod plugin? +//#define USE_METAMOD + +// - AMXX Init functions +// Also consider using FN_META_* +// AMXX query +//#define FN_AMXX_QUERY OnAmxxQuery +// AMXX attach +// Do native functions init here (MF_AddNatives) +#define FN_AMXX_ATTACH OnAmxxAttach +// AMXX dettach +#define FN_AMXX_DETTACH OnAmxxDettach +// All plugins loaded +// Do forward functions init here (MF_RegisterForward) +// #define FN_AMXX_PLUGINSLOADED OnPluginsLoaded + +/**** METAMOD ****/ +// If your module doesn't use metamod, you may close the file now :) +#ifdef USE_METAMOD +// ---- +// Hook Functions +// Uncomment these to be called +// You can also change the function name + +// - Metamod init functions +// Also consider using FN_AMXX_* +// Meta query +//#define FN_META_QUERY OnMetaQuery +// Meta attach +//#define FN_META_ATTACH OnMetaAttach +// Meta dettach +//#define FN_META_DETTACH OnMetaDettach + +// (wd) are Will Day's notes +// - GetEntityAPI2 functions +// #define FN_GameDLLInit GameDLLInit /* pfnGameInit() */ +// #define FN_DispatchSpawn DispatchSpawn /* pfnSpawn() */ +// #define FN_DispatchThink DispatchThink /* pfnThink() */ +// #define FN_DispatchUse DispatchUse /* pfnUse() */ +// #define FN_DispatchTouch DispatchTouch /* pfnTouch() */ +// #define FN_DispatchBlocked DispatchBlocked /* pfnBlocked() */ +// #define FN_DispatchKeyValue DispatchKeyValue /* pfnKeyValue() */ +// #define FN_DispatchSave DispatchSave /* pfnSave() */ +// #define FN_DispatchRestore DispatchRestore /* pfnRestore() */ +// #define FN_DispatchObjectCollsionBox DispatchObjectCollsionBox /* pfnSetAbsBox() */ +// #define FN_SaveWriteFields SaveWriteFields /* pfnSaveWriteFields() */ +// #define FN_SaveReadFields SaveReadFields /* pfnSaveReadFields() */ +// #define FN_SaveGlobalState SaveGlobalState /* pfnSaveGlobalState() */ +// #define FN_RestoreGlobalState RestoreGlobalState /* pfnRestoreGlobalState() */ +// #define FN_ResetGlobalState ResetGlobalState /* pfnResetGlobalState() */ +// #define FN_ClientConnect ClientConnect /* pfnClientConnect() (wd) Client has connected */ +// #define FN_ClientDisconnect ClientDisconnect /* pfnClientDisconnect() (wd) Player has left the game */ +// #define FN_ClientKill ClientKill /* pfnClientKill() (wd) Player has typed "kill" */ +// #define FN_ClientPutInServer ClientPutInServer /* pfnClientPutInServer() (wd) Client is entering the game */ +// #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */ +// #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */ +// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */ +// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */ +// #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */ +// #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */ +// #define FN_StartFrame StartFrame /* pfnStartFrame() */ +// #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */ +// #define FN_ParmsChangeLevel ParmsChangeLevel /* pfnParmsChangeLevel() */ +// #define FN_GetGameDescription GetGameDescription /* pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2" "Half-Life" */ +// #define FN_PlayerCustomization PlayerCustomization /* pfnPlayerCustomization() Notifies .dll of new customization for player. */ +// #define FN_SpectatorConnect SpectatorConnect /* pfnSpectatorConnect() Called when spectator joins server */ +// #define FN_SpectatorDisconnect SpectatorDisconnect /* pfnSpectatorDisconnect() Called when spectator leaves the server */ +// #define FN_SpectatorThink SpectatorThink /* pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t) */ +// #define FN_Sys_Error Sys_Error /* pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2 */ +// #define FN_PM_Move PM_Move /* pfnPM_Move() (wd) SDK2 */ +// #define FN_PM_Init PM_Init /* pfnPM_Init() Server version of player movement initialization; (wd) SDK2 */ +// #define FN_PM_FindTextureType PM_FindTextureType /* pfnPM_FindTextureType() (wd) SDK2 */ +// #define FN_SetupVisibility SetupVisibility /* pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2 */ +// #define FN_UpdateClientData UpdateClientData /* pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2 */ +// #define FN_AddToFullPack AddToFullPack /* pfnAddToFullPack() (wd) SDK2 */ +// #define FN_CreateBaseline CreateBaseline /* pfnCreateBaseline() Tweak entity baseline for network encoding allows setup of player baselines too.; (wd) SDK2 */ +// #define FN_RegisterEncoders RegisterEncoders /* pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2 */ +// #define FN_GetWeaponData GetWeaponData /* pfnGetWeaponData() (wd) SDK2 */ +// #define FN_CmdStart CmdStart /* pfnCmdStart() (wd) SDK2 */ +// #define FN_CmdEnd CmdEnd /* pfnCmdEnd() (wd) SDK2 */ +// #define FN_ConnectionlessPacket ConnectionlessPacket /* pfnConnectionlessPacket() (wd) SDK2 */ +// #define FN_GetHullBounds GetHullBounds /* pfnGetHullBounds() (wd) SDK2 */ +// #define FN_CreateInstancedBaselines CreateInstancedBaselines /* pfnCreateInstancedBaselines() (wd) SDK2 */ +// #define FN_InconsistentFile InconsistentFile /* pfnInconsistentFile() (wd) SDK2 */ +// #define FN_AllowLagCompensation AllowLagCompensation /* pfnAllowLagCompensation() (wd) SDK2 */ + +// - GetEntityAPI2_Post functions +// #define FN_GameDLLInit_Post GameDLLInit_Post +// #define FN_DispatchSpawn_Post DispatchSpawn_Post +// #define FN_DispatchThink_Post DispatchThink_Post +// #define FN_DispatchUse_Post DispatchUse_Post +// #define FN_DispatchTouch_Post DispatchTouch_Post +// #define FN_DispatchBlocked_Post DispatchBlocked_Post +// #define FN_DispatchKeyValue_Post DispatchKeyValue_Post +// #define FN_DispatchSave_Post DispatchSave_Post +// #define FN_DispatchRestore_Post DispatchRestore_Post +// #define FN_DispatchObjectCollsionBox_Post DispatchObjectCollsionBox_Post +// #define FN_SaveWriteFields_Post SaveWriteFields_Post +// #define FN_SaveReadFields_Post SaveReadFields_Post +// #define FN_SaveGlobalState_Post SaveGlobalState_Post +// #define FN_RestoreGlobalState_Post RestoreGlobalState_Post +// #define FN_ResetGlobalState_Post ResetGlobalState_Post +// #define FN_ClientConnect_Post ClientConnect_Post +// #define FN_ClientDisconnect_Post ClientDisconnect_Post +// #define FN_ClientKill_Post ClientKill_Post +// #define FN_ClientPutInServer_Post ClientPutInServer_Post +// #define FN_ClientCommand_Post ClientCommand_Post +// #define FN_ClientUserInfoChanged_Post ClientUserInfoChanged_Post +// #define FN_ServerActivate_Post ServerActivate_Post +// #define FN_ServerDeactivate_Post ServerDeactivate_Post +// #define FN_PlayerPreThink_Post PlayerPreThink_Post +// #define FN_PlayerPostThink_Post PlayerPostThink_Post +// #define FN_StartFrame_Post StartFrame_Post +// #define FN_ParmsNewLevel_Post ParmsNewLevel_Post +// #define FN_ParmsChangeLevel_Post ParmsChangeLevel_Post +// #define FN_GetGameDescription_Post GetGameDescription_Post +// #define FN_PlayerCustomization_Post PlayerCustomization_Post +// #define FN_SpectatorConnect_Post SpectatorConnect_Post +// #define FN_SpectatorDisconnect_Post SpectatorDisconnect_Post +// #define FN_SpectatorThink_Post SpectatorThink_Post +// #define FN_Sys_Error_Post Sys_Error_Post +// #define FN_PM_Move_Post PM_Move_Post +// #define FN_PM_Init_Post PM_Init_Post +// #define FN_PM_FindTextureType_Post PM_FindTextureType_Post +// #define FN_SetupVisibility_Post SetupVisibility_Post +// #define FN_UpdateClientData_Post UpdateClientData_Post +// #define FN_AddToFullPack_Post AddToFullPack_Post +// #define FN_CreateBaseline_Post CreateBaseline_Post +// #define FN_RegisterEncoders_Post RegisterEncoders_Post +// #define FN_GetWeaponData_Post GetWeaponData_Post +// #define FN_CmdStart_Post CmdStart_Post +// #define FN_CmdEnd_Post CmdEnd_Post +// #define FN_ConnectionlessPacket_Post ConnectionlessPacket_Post +// #define FN_GetHullBounds_Post GetHullBounds_Post +// #define FN_CreateInstancedBaselines_Post CreateInstancedBaselines_Post +// #define FN_InconsistentFile_Post InconsistentFile_Post +// #define FN_AllowLagCompensation_Post AllowLagCompensation_Post + +// - GetEngineAPI functions +// #define FN_PrecacheModel PrecacheModel +// #define FN_PrecacheSound PrecacheSound +// #define FN_SetModel SetModel +// #define FN_ModelIndex ModelIndex +// #define FN_ModelFrames ModelFrames +// #define FN_SetSize SetSize +// #define FN_ChangeLevel ChangeLevel +// #define FN_GetSpawnParms GetSpawnParms +// #define FN_SaveSpawnParms SaveSpawnParms +// #define FN_VecToYaw VecToYaw +// #define FN_VecToAngles VecToAngles +// #define FN_MoveToOrigin MoveToOrigin +// #define FN_ChangeYaw ChangeYaw +// #define FN_ChangePitch ChangePitch +// #define FN_FindEntityByString FindEntityByString +// #define FN_GetEntityIllum GetEntityIllum +// #define FN_FindEntityInSphere FindEntityInSphere +// #define FN_FindClientInPVS FindClientInPVS +// #define FN_EntitiesInPVS EntitiesInPVS +// #define FN_MakeVectors MakeVectors +// #define FN_AngleVectors AngleVectors +// #define FN_CreateEntity CreateEntity +// #define FN_RemoveEntity RemoveEntity +// #define FN_CreateNamedEntity CreateNamedEntity +// #define FN_MakeStatic MakeStatic +// #define FN_EntIsOnFloor EntIsOnFloor +// #define FN_DropToFloor DropToFloor +// #define FN_WalkMove WalkMove +// #define FN_SetOrigin SetOrigin +// #define FN_EmitSound EmitSound +// #define FN_EmitAmbientSound EmitAmbientSound +// #define FN_TraceLine TraceLine +// #define FN_TraceToss TraceToss +// #define FN_TraceMonsterHull TraceMonsterHull +// #define FN_TraceHull TraceHull +// #define FN_TraceModel TraceModel +// #define FN_TraceTexture TraceTexture +// #define FN_TraceSphere TraceSphere +// #define FN_GetAimVector GetAimVector +// #define FN_ServerCommand ServerCommand +// #define FN_ServerExecute ServerExecute +// #define FN_engClientCommand engClientCommand +// #define FN_ParticleEffect ParticleEffect +// #define FN_LightStyle LightStyle +// #define FN_DecalIndex DecalIndex +// #define FN_PointContents PointContents +// #define FN_MessageBegin MessageBegin +// #define FN_MessageEnd MessageEnd +// #define FN_WriteByte WriteByte +// #define FN_WriteChar WriteChar +// #define FN_WriteShort WriteShort +// #define FN_WriteLong WriteLong +// #define FN_WriteAngle WriteAngle +// #define FN_WriteCoord WriteCoord +// #define FN_WriteString WriteString +// #define FN_WriteEntity WriteEntity +// #define FN_CVarRegister CVarRegister +// #define FN_CVarGetFloat CVarGetFloat +// #define FN_CVarGetString CVarGetString +// #define FN_CVarSetFloat CVarSetFloat +// #define FN_CVarSetString CVarSetString +// #define FN_AlertMessage AlertMessage +// #define FN_EngineFprintf EngineFprintf +// #define FN_PvAllocEntPrivateData PvAllocEntPrivateData +// #define FN_PvEntPrivateData PvEntPrivateData +// #define FN_FreeEntPrivateData FreeEntPrivateData +// #define FN_SzFromIndex SzFromIndex +// #define FN_AllocString AllocString +// #define FN_GetVarsOfEnt GetVarsOfEnt +// #define FN_PEntityOfEntOffset PEntityOfEntOffset +// #define FN_EntOffsetOfPEntity EntOffsetOfPEntity +// #define FN_IndexOfEdict IndexOfEdict +// #define FN_PEntityOfEntIndex PEntityOfEntIndex +// #define FN_FindEntityByVars FindEntityByVars +// #define FN_GetModelPtr GetModelPtr +// #define FN_RegUserMsg RegUserMsg +// #define FN_AnimationAutomove AnimationAutomove +// #define FN_GetBonePosition GetBonePosition +// #define FN_FunctionFromName FunctionFromName +// #define FN_NameForFunction NameForFunction +// #define FN_ClientPrintf ClientPrintf +// #define FN_ServerPrint ServerPrint +// #define FN_Cmd_Args Cmd_Args +// #define FN_Cmd_Argv Cmd_Argv +// #define FN_Cmd_Argc Cmd_Argc +// #define FN_GetAttachment GetAttachment +// #define FN_CRC32_Init CRC32_Init +// #define FN_CRC32_ProcessBuffer CRC32_ProcessBuffer +// #define FN_CRC32_ProcessByte CRC32_ProcessByte +// #define FN_CRC32_Final CRC32_Final +// #define FN_RandomLong RandomLong +// #define FN_RandomFloat RandomFloat +// #define FN_SetView SetView +// #define FN_Time Time +// #define FN_CrosshairAngle CrosshairAngle +// #define FN_LoadFileForMe LoadFileForMe +// #define FN_FreeFile FreeFile +// #define FN_EndSection EndSection +// #define FN_CompareFileTime CompareFileTime +// #define FN_GetGameDir GetGameDir +// #define FN_Cvar_RegisterVariable Cvar_RegisterVariable +// #define FN_FadeClientVolume FadeClientVolume +// #define FN_SetClientMaxspeed SetClientMaxspeed +// #define FN_CreateFakeClient CreateFakeClient +// #define FN_RunPlayerMove RunPlayerMove +// #define FN_NumberOfEntities NumberOfEntities +// #define FN_GetInfoKeyBuffer GetInfoKeyBuffer +// #define FN_InfoKeyValue InfoKeyValue +// #define FN_SetKeyValue SetKeyValue +// #define FN_SetClientKeyValue SetClientKeyValue +// #define FN_IsMapValid IsMapValid +// #define FN_StaticDecal StaticDecal +// #define FN_PrecacheGeneric PrecacheGeneric +// #define FN_GetPlayerUserId GetPlayerUserId +// #define FN_BuildSoundMsg BuildSoundMsg +// #define FN_IsDedicatedServer IsDedicatedServer +// #define FN_CVarGetPointer CVarGetPointer +// #define FN_GetPlayerWONId GetPlayerWONId +// #define FN_Info_RemoveKey Info_RemoveKey +// #define FN_GetPhysicsKeyValue GetPhysicsKeyValue +// #define FN_SetPhysicsKeyValue SetPhysicsKeyValue +// #define FN_GetPhysicsInfoString GetPhysicsInfoString +// #define FN_PrecacheEvent PrecacheEvent +// #define FN_PlaybackEvent PlaybackEvent +// #define FN_SetFatPVS SetFatPVS +// #define FN_SetFatPAS SetFatPAS +// #define FN_CheckVisibility CheckVisibility +// #define FN_DeltaSetField DeltaSetField +// #define FN_DeltaUnsetField DeltaUnsetField +// #define FN_DeltaAddEncoder DeltaAddEncoder +// #define FN_GetCurrentPlayer GetCurrentPlayer +// #define FN_CanSkipPlayer CanSkipPlayer +// #define FN_DeltaFindField DeltaFindField +// #define FN_DeltaSetFieldByIndex DeltaSetFieldByIndex +// #define FN_DeltaUnsetFieldByIndex DeltaUnsetFieldByIndex +// #define FN_SetGroupMask SetGroupMask +// #define FN_engCreateInstancedBaseline engCreateInstancedBaseline +// #define FN_Cvar_DirectSet Cvar_DirectSet +// #define FN_ForceUnmodified ForceUnmodified +// #define FN_GetPlayerStats GetPlayerStats +// #define FN_AddServerCommand AddServerCommand +// #define FN_Voice_GetClientListening Voice_GetClientListening +// #define FN_Voice_SetClientListening Voice_SetClientListening +// #define FN_GetPlayerAuthId GetPlayerAuthId + +// - GetEngineAPI_Post functions +// #define FN_PrecacheModel_Post PrecacheModel_Post +// #define FN_PrecacheSound_Post PrecacheSound_Post +// #define FN_SetModel_Post SetModel_Post +// #define FN_ModelIndex_Post ModelIndex_Post +// #define FN_ModelFrames_Post ModelFrames_Post +// #define FN_SetSize_Post SetSize_Post +// #define FN_ChangeLevel_Post ChangeLevel_Post +// #define FN_GetSpawnParms_Post GetSpawnParms_Post +// #define FN_SaveSpawnParms_Post SaveSpawnParms_Post +// #define FN_VecToYaw_Post VecToYaw_Post +// #define FN_VecToAngles_Post VecToAngles_Post +// #define FN_MoveToOrigin_Post MoveToOrigin_Post +// #define FN_ChangeYaw_Post ChangeYaw_Post +// #define FN_ChangePitch_Post ChangePitch_Post +// #define FN_FindEntityByString_Post FindEntityByString_Post +// #define FN_GetEntityIllum_Post GetEntityIllum_Post +// #define FN_FindEntityInSphere_Post FindEntityInSphere_Post +// #define FN_FindClientInPVS_Post FindClientInPVS_Post +// #define FN_EntitiesInPVS_Post EntitiesInPVS_Post +// #define FN_MakeVectors_Post MakeVectors_Post +// #define FN_AngleVectors_Post AngleVectors_Post +// #define FN_CreateEntity_Post CreateEntity_Post +// #define FN_RemoveEntity_Post RemoveEntity_Post +// #define FN_CreateNamedEntity_Post CreateNamedEntity_Post +// #define FN_MakeStatic_Post MakeStatic_Post +// #define FN_EntIsOnFloor_Post EntIsOnFloor_Post +// #define FN_DropToFloor_Post DropToFloor_Post +// #define FN_WalkMove_Post WalkMove_Post +// #define FN_SetOrigin_Post SetOrigin_Post +// #define FN_EmitSound_Post EmitSound_Post +// #define FN_EmitAmbientSound_Post EmitAmbientSound_Post +// #define FN_TraceLine_Post TraceLine_Post +// #define FN_TraceToss_Post TraceToss_Post +// #define FN_TraceMonsterHull_Post TraceMonsterHull_Post +// #define FN_TraceHull_Post TraceHull_Post +// #define FN_TraceModel_Post TraceModel_Post +// #define FN_TraceTexture_Post TraceTexture_Post +// #define FN_TraceSphere_Post TraceSphere_Post +// #define FN_GetAimVector_Post GetAimVector_Post +// #define FN_ServerCommand_Post ServerCommand_Post +// #define FN_ServerExecute_Post ServerExecute_Post +// #define FN_engClientCommand_Post engClientCommand_Post +// #define FN_ParticleEffect_Post ParticleEffect_Post +// #define FN_LightStyle_Post LightStyle_Post +// #define FN_DecalIndex_Post DecalIndex_Post +// #define FN_PointContents_Post PointContents_Post +// #define FN_MessageBegin_Post MessageBegin_Post +// #define FN_MessageEnd_Post MessageEnd_Post +// #define FN_WriteByte_Post WriteByte_Post +// #define FN_WriteChar_Post WriteChar_Post +// #define FN_WriteShort_Post WriteShort_Post +// #define FN_WriteLong_Post WriteLong_Post +// #define FN_WriteAngle_Post WriteAngle_Post +// #define FN_WriteCoord_Post WriteCoord_Post +// #define FN_WriteString_Post WriteString_Post +// #define FN_WriteEntity_Post WriteEntity_Post +// #define FN_CVarRegister_Post CVarRegister_Post +// #define FN_CVarGetFloat_Post CVarGetFloat_Post +// #define FN_CVarGetString_Post CVarGetString_Post +// #define FN_CVarSetFloat_Post CVarSetFloat_Post +// #define FN_CVarSetString_Post CVarSetString_Post +// #define FN_AlertMessage_Post AlertMessage_Post +// #define FN_EngineFprintf_Post EngineFprintf_Post +// #define FN_PvAllocEntPrivateData_Post PvAllocEntPrivateData_Post +// #define FN_PvEntPrivateData_Post PvEntPrivateData_Post +// #define FN_FreeEntPrivateData_Post FreeEntPrivateData_Post +// #define FN_SzFromIndex_Post SzFromIndex_Post +// #define FN_AllocString_Post AllocString_Post +// #define FN_GetVarsOfEnt_Post GetVarsOfEnt_Post +// #define FN_PEntityOfEntOffset_Post PEntityOfEntOffset_Post +// #define FN_EntOffsetOfPEntity_Post EntOffsetOfPEntity_Post +// #define FN_IndexOfEdict_Post IndexOfEdict_Post +// #define FN_PEntityOfEntIndex_Post PEntityOfEntIndex_Post +// #define FN_FindEntityByVars_Post FindEntityByVars_Post +// #define FN_GetModelPtr_Post GetModelPtr_Post +// #define FN_RegUserMsg_Post RegUserMsg_Post +// #define FN_AnimationAutomove_Post AnimationAutomove_Post +// #define FN_GetBonePosition_Post GetBonePosition_Post +// #define FN_FunctionFromName_Post FunctionFromName_Post +// #define FN_NameForFunction_Post NameForFunction_Post +// #define FN_ClientPrintf_Post ClientPrintf_Post +// #define FN_ServerPrint_Post ServerPrint_Post +// #define FN_Cmd_Args_Post Cmd_Args_Post +// #define FN_Cmd_Argv_Post Cmd_Argv_Post +// #define FN_Cmd_Argc_Post Cmd_Argc_Post +// #define FN_GetAttachment_Post GetAttachment_Post +// #define FN_CRC32_Init_Post CRC32_Init_Post +// #define FN_CRC32_ProcessBuffer_Post CRC32_ProcessBuffer_Post +// #define FN_CRC32_ProcessByte_Post CRC32_ProcessByte_Post +// #define FN_CRC32_Final_Post CRC32_Final_Post +// #define FN_RandomLong_Post RandomLong_Post +// #define FN_RandomFloat_Post RandomFloat_Post +// #define FN_SetView_Post SetView_Post +// #define FN_Time_Post Time_Post +// #define FN_CrosshairAngle_Post CrosshairAngle_Post +// #define FN_LoadFileForMe_Post LoadFileForMe_Post +// #define FN_FreeFile_Post FreeFile_Post +// #define FN_EndSection_Post EndSection_Post +// #define FN_CompareFileTime_Post CompareFileTime_Post +// #define FN_GetGameDir_Post GetGameDir_Post +// #define FN_Cvar_RegisterVariable_Post Cvar_RegisterVariable_Post +// #define FN_FadeClientVolume_Post FadeClientVolume_Post +// #define FN_SetClientMaxspeed_Post SetClientMaxspeed_Post +// #define FN_CreateFakeClient_Post CreateFakeClient_Post +// #define FN_RunPlayerMove_Post RunPlayerMove_Post +// #define FN_NumberOfEntities_Post NumberOfEntities_Post +// #define FN_GetInfoKeyBuffer_Post GetInfoKeyBuffer_Post +// #define FN_InfoKeyValue_Post InfoKeyValue_Post +// #define FN_SetKeyValue_Post SetKeyValue_Post +// #define FN_SetClientKeyValue_Post SetClientKeyValue_Post +// #define FN_IsMapValid_Post IsMapValid_Post +// #define FN_StaticDecal_Post StaticDecal_Post +// #define FN_PrecacheGeneric_Post PrecacheGeneric_Post +// #define FN_GetPlayerUserId_Post GetPlayerUserId_Post +// #define FN_BuildSoundMsg_Post BuildSoundMsg_Post +// #define FN_IsDedicatedServer_Post IsDedicatedServer_Post +// #define FN_CVarGetPointer_Post CVarGetPointer_Post +// #define FN_GetPlayerWONId_Post GetPlayerWONId_Post +// #define FN_Info_RemoveKey_Post Info_RemoveKey_Post +// #define FN_GetPhysicsKeyValue_Post GetPhysicsKeyValue_Post +// #define FN_SetPhysicsKeyValue_Post SetPhysicsKeyValue_Post +// #define FN_GetPhysicsInfoString_Post GetPhysicsInfoString_Post +// #define FN_PrecacheEvent_Post PrecacheEvent_Post +// #define FN_PlaybackEvent_Post PlaybackEvent_Post +// #define FN_SetFatPVS_Post SetFatPVS_Post +// #define FN_SetFatPAS_Post SetFatPAS_Post +// #define FN_CheckVisibility_Post CheckVisibility_Post +// #define FN_DeltaSetField_Post DeltaSetField_Post +// #define FN_DeltaUnsetField_Post DeltaUnsetField_Post +// #define FN_DeltaAddEncoder_Post DeltaAddEncoder_Post +// #define FN_GetCurrentPlayer_Post GetCurrentPlayer_Post +// #define FN_CanSkipPlayer_Post CanSkipPlayer_Post +// #define FN_DeltaFindField_Post DeltaFindField_Post +// #define FN_DeltaSetFieldByIndex_Post DeltaSetFieldByIndex_Post +// #define FN_DeltaUnsetFieldByIndex_Post DeltaUnsetFieldByIndex_Post +// #define FN_SetGroupMask_Post SetGroupMask_Post +// #define FN_engCreateInstancedBaseline_Post engCreateInstancedBaseline_Post +// #define FN_Cvar_DirectSet_Post Cvar_DirectSet_Post +// #define FN_ForceUnmodified_Post ForceUnmodified_Post +// #define FN_GetPlayerStats_Post GetPlayerStats_Post +// #define FN_AddServerCommand_Post AddServerCommand_Post +// #define FN_Voice_GetClientListening_Post Voice_GetClientListening_Post +// #define FN_Voice_SetClientListening_Post Voice_SetClientListening_Post +// #define FN_GetPlayerAuthId_Post GetPlayerAuthId_Post + +// #define FN_OnFreeEntPrivateData OnFreeEntPrivateData +// #define FN_GameShutdown GameShutdown +// #define FN_ShouldCollide ShouldCollide + +// #define FN_OnFreeEntPrivateData_Post OnFreeEntPrivateData_Post +// #define FN_GameShutdown_Post GameShutdown_Post +// #define FN_ShouldCollide_Post ShouldCollide_Post + + +#endif // USE_METAMOD + +#endif // __MODULECONFIG_H__ + diff --git a/dlls/arrayx/osdefs.h b/dlls/arrayx/osdefs.h new file mode 100644 index 00000000..60d61e68 --- /dev/null +++ b/dlls/arrayx/osdefs.h @@ -0,0 +1,60 @@ +/* __MSDOS__ set when compiling for DOS (not Windows) + * _Windows set when compiling for any version of Microsoft Windows + * __WIN32__ set when compiling for Windows95 or WindowsNT (32 bit mode) + * __32BIT__ set when compiling in 32-bit "flat" mode (DOS or Windows) + * + * Copyright 1998-2002, ITB CompuPhase, The Netherlands. + * info@compuphase.com. + */ + +#ifndef _OSDEFS_H +#define _OSDEFS_H + +/* Every compiler uses different "default" macros to indicate the mode + * it is in. Throughout the source, we use the Borland C++ macros, so + * the macros of Watcom C/C++ and Microsoft Visual C/C++ are mapped to + * those of Borland C++. + */ +#if defined(__WATCOMC__) +# if defined(__WINDOWS__) || defined(__NT__) +# define _Windows 1 +# endif +# ifdef __386__ +# define __32BIT__ 1 +# endif +# if defined(_Windows) && defined(__32BIT__) +# define __WIN32__ 1 +# endif +#elif defined(_MSC_VER) +# if defined(_WINDOWS) || defined(_WIN32) +# define _Windows 1 +# endif +# ifdef _WIN32 +# define __WIN32__ 1 +# define __32BIT__ 1 +# endif +#endif + +#if defined __linux__ + #include +#endif + +/* Linux NOW has these */ +#if !defined BIG_ENDIAN + #define BIG_ENDIAN 4321 +#endif +#if !defined LITTLE_ENDIAN + #define LITTLE_ENDIAN 1234 +#endif + +/* educated guess, BYTE_ORDER is undefined, i386 is common => little endian */ +#if !defined BYTE_ORDER + #if defined UCLINUX + #define BYTE_ORDER BIG_ENDIAN + #else + #define BYTE_ORDER LITTLE_ENDIAN + #endif +#endif + +#endif /* _OSDEFS_H */ +