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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�!;{H4w?{n{SUZ3&j8;4dd-`G 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 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 zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*1Oo3?K{^5@2BX_y7NY5F18=*#AetkP3mn z|NsA2U|?WiW?*1oVPIfjWnciuIXeRb0|x^G11AFm0~Z4W12+RCzIhoK82A_%82A|& z7z7v?7z7y@7=#!Y7=#%Z7(^Ht7(}7!#2FYEBp4VNBpDbOq!<_&q!}0(WEdD2WEmJ3 zz7#Q>!7#Iu~7#Iv07#NHg7#NHh7#K{T>dY7z7|a z7;G3A7;G6B80?_x92giF92poGoER7woEaDxTo@P_Tp1V`+!z=b+!+`cJfP}8>D!xu zfx(A?fx(x7fx(Y~fx(}Ffgyl_fgzBAfgy;2fgu>GHk5&ZA&h~6A)JAMA%cN{A(DZC zA&P;4A)0}KA%=m0Ar`7`uq2WohJ1#6h7tw^23LkWh7yJ%hDuO2CK`(|urk2>!bCvV zgzYV}*xipYg2EG~G@K!yp@<=yp_rk7A(0`OA(cUaA()|rA(5ekAr+5BM2UIQ+Yd;Ujc&PoZ3@Hqm z3?<-D011QSd5g>G?@nsmUd1lBpF1Tt1$D-bnH1>Ex`W zker{FmXn!WQmjy(S(2epTAZqopQeysl95^jvb@+DETr$}@8as_80r(^`l(kD*>ftu4pd(y!@Q}^n3;Vd?i$0Clx0vDR3$2#XyCjiMTkaNC{cgDKjsmC^Hon z*67mCi3P=_IjMRW;*g-l5QZ9usop!avILaqF=P;l7~L@BB!Mo6lswR-kdg{WDi#s& z$@#gtpxmF6nU|`dlvJFYo0y%dms*jk;6O?oAPh_@$}cZYRmjXs%U1x!B`7`GWEk7| zmzETimMDa0=B4D9+vsN)+i`Jmae-ulQj1G-N{S(3kT6Wi$x+Z%Fi=P>D#|a?DAv?b zFtmh~B^t$=TsHazMX7dNHu_2VDU~2Pqa-)Sjw{B6aGJ4%q#1;R$xC{U5M#he9x3T% zrxxX<<`^4+GgxVHY7vx~o{|Y=m1pJ^7v$&XfK?>t=ceSOLuC?E$`T7;%8D~mb71D= z=cGcFl67!vR-hAxB1V(2o+SqxncDT|>?A!RX`6vz%x1SxUh%y2oG zdD*1oHb}AqXB#XT$~ix`ATtMA2|$7>xuAdx8alA@3?u{#U@#k@(iy50T%kC_0}rGM zL(p5NXi3EQCcYiNk1!7pXj&=x{_{U*1d4%yp#j-G z(C8{?1Q{U))qoJd#)|)83?6|_fJiogjA8f(8jgktK!&9m7#M!o!`yYoj)fu2k%b|O zftewMVJS=<4jLNTIArk%f2hSH2^}s6seq?1VJ8-bP0=h2dl>{7rZVhgVCeu!GeQQ= zK}-w`i#gCJJBB1y0cZ#ZfX1N>7#JL&d`z|f|Nn=Dmt+hJ!@U$1hKmeh49uVm3Q-M; z9!e`_NT*?R{15BkC~DVYbo?(>VRZZtW0VikzXpxTArC+zk`KBJ^56uz9Ma$fx)jpj z1V{?!aKz~NAF)HvkbxMCq36-@ztQnOz0vVMg0qK+5)L$3h`qx?=c&TM(1RQu|AWmR zkBth}ku=zPU1v!0fDN$0g<;FqFeKnv3|$5>0EI4tJj9MJhcv{FE`>D24wC}eF}nVb zhzYXM@jvLUiP7;t*r?a&_#Z4JM#uj~$N#|99{LWe(eXdTnAhm|A0jM9$NykMJEP-& zu#kY$qvL<@puo)-mg9fe_FsoHWHRJ2q=5HD;|>mpj1mJABWQ6ZXzwuyLqzeDiXds| z{$o#u00vKncm_v?B8DP{L=tzOgU%dag6}^k)_!d)_Jf4T!CVZa+iwc823-*no!T zk%pE=*MC9>p-1OZsXDQpNJS49sfmy#pw7iA}mJ7e?g-jAUrz$ z3kn4kJUaf15**k$!*cvL;T7aeUr}%$N@9f0zj-+tT3_PU=}FIg~7JL-Qbd%RGJP_%LqPK0K~$tpN&H#IM^wO zfsuim!8s(cC_S~rvm`YayTfo<2oi@Hgfb+_$iM{&0QaK&(gLUoRt^ytuW*#nN<8Y& z1~T!eWKKyfU}O+saCS*8NX<)0%}cIy&d)1J%*;zILa~|%g`7!=#i=F5DS8=<4E)F@ zf<{_V41@RvLXMvQh`#(1I+_3*oIsa`ot=gu4o=jV+q|L1VM@RUC(uno^i0uZkQb++ z%ONdJLzhBYoCcB_-T$pHdj8|+`HzsnAM`Os77RI{t?Ui_!BR5n(ZU{v#qRM$dm7 zJ^v9js(=$iPb3^Y{}B{Iqvt;|Ffh>X{72aM9|L$5At(Ys<80VQ;&2b6fpmdx0t4Lu z10TJEF4_Q@Hah+X8B-e_{~Nvk1)42l;CCv3M&6Kjd5@m|IC}rf=>0F?+pSyB?illSCC^zNAG{3!Bugi>;FdA|AEJ;5yP>g<9~>;jnVNxL|BZD{~^L+bo>ty z7Ng^TqvL;|ArhQ;bo>t~Xhz5X=sNxfyZ`zBfAFd~=bU1k}F=mUJvHLEZCAJvi z*iC~Ev16!*FR?|JK`cN+ml<9Emzg?x|FemqfuWUxdMbS{p&4EOH@g0>5^WH2^!!J} zfb8h~FGyiAy8jn3@;18v7ZDbt`+q@W86Z5m{}&VrD0p=LFG_G==M2mJzb*`^3`q>7 z4CxH%45k4}q2&9||7;LF;B)#QOa=xA1_lPu$Q+ChIcE^T!@(L| z|4G;NpKPFrWw^|U7(E501<0`9==dMfwKI6e^+wNsOi4{kEX^s&$xKpE^6_+XR#HgL z&r8e6OfD%_D9p$T`Z=>fwLes?P_}}RGA9&jX`nurJ@jt|v*XZ~kA}mJ7|6l`7qvL`5mW+wmu 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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 + +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 */ +