diff --git a/dlls/fakemeta/Makefile b/dlls/fakemeta/Makefile index 8120bb35..8183726e 100755 --- a/dlls/fakemeta/Makefile +++ b/dlls/fakemeta/Makefile @@ -11,10 +11,10 @@ DEBUG_FLAGS = -g -ggdb3 CPP = gcc NAME = fakemeta_amxx -OBJECTS = sdk/amxxmodule.cpp dllfunc.cpp engfunc.cpp fakemeta_amxx.cpp pdata.cpp forward.cpp \ - fm_tr.cpp pev.cpp +OBJECTS = sdk/amxxmodule.cpp dllfunc.cpp newdllfunc.cpp engfunc.cpp fakemeta_amxx.cpp pdata.cpp forward.cpp \ + fm_tr.cpp pev.cpp -LINK = +LINK = INCLUDE = -I. -I$(HLSDK) -I$(HLSDK)/dlls -I$(HLSDK)/engine -I$(HLSDK)/game_shared -I$(HLSDK)/game_shared \ -I$(MM_ROOT) -Lzlib -I$(HLSDK)/common @@ -31,7 +31,7 @@ CFLAGS += -DNDEBUG -fPIC -Wno-deprecated -fno-exceptions -DHAVE_STDINT_H ifeq "$(AMD64)" "true" BINARY = $(NAME)_amd64.so - CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 + CFLAGS += -DPAWN_CELL_SIZE=64 -DHAVE_I64 -m64 else BINARY = $(NAME)_i386.so CFLAGS += -DPAWN_CELL_SIZE=32 -DJIT -DASM32 @@ -54,7 +54,7 @@ amd64: fakemeta: $(OBJ_LINUX) $(CPP) $(INCLUDE) $(CFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) -debug: +debug: $(MAKE) all DEBUG=true default: all diff --git a/dlls/fakemeta/dllfunc.cpp b/dlls/fakemeta/dllfunc.cpp index 77e6d3a6..d494c589 100755 --- a/dlls/fakemeta/dllfunc.cpp +++ b/dlls/fakemeta/dllfunc.cpp @@ -89,7 +89,7 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) iparam1 = MDLL_ClientConnect(INDEXENT2(index),STRING(ALLOC_STRING(temp)),STRING(ALLOC_STRING(temp2)),temp3); cRet = MF_GetAmxAddr(amx,params[6]); MF_SetAmxString(amx,params[5],temp3,cRet[0]); - return 1; + return iparam1; case DLLFunc_ClientDisconnect: // void ) ( edict_t *pEntity ); cRet = MF_GetAmxAddr(amx,params[2]); diff --git a/dlls/fakemeta/fakemeta.vcproj b/dlls/fakemeta/fakemeta.vcproj index ec51d2cc..209ac114 100755 --- a/dlls/fakemeta/fakemeta.vcproj +++ b/dlls/fakemeta/fakemeta.vcproj @@ -161,6 +161,12 @@ + + + + + Name="Debug|Win32"> @@ -177,8 +182,7 @@ + Name="Debug|Win32"> diff --git a/dlls/fakemeta/fakemeta_amxx.cpp b/dlls/fakemeta/fakemeta_amxx.cpp index 5da36ea1..91cf05bf 100755 --- a/dlls/fakemeta/fakemeta_amxx.cpp +++ b/dlls/fakemeta/fakemeta_amxx.cpp @@ -10,6 +10,7 @@ void OnAmxxAttach() MF_AddNatives(forward_natives); MF_AddNatives(pdata_natives); MF_AddNatives(tr_Natives); + MF_AddNatives(newdllfunc_natives); } int GetHullBounds(int hullnumber, float *mins, float *maxs); // sawce: Do not null out the forward for ServerActivate. It's required for the INDEXENT() fix. (I don't think ServerActivate is planned on being forwarded anyway) diff --git a/dlls/fakemeta/fakemeta_amxx.h b/dlls/fakemeta/fakemeta_amxx.h index 79c62ec0..e44d89f1 100755 --- a/dlls/fakemeta/fakemeta_amxx.h +++ b/dlls/fakemeta/fakemeta_amxx.h @@ -42,7 +42,7 @@ inline edict_t* INDEXENT2( int iEdictNum ) #define CHECK_ENTITY(x) if (x != 0 && (FNullEnt(INDEXENT2(x)) || x < 0 || x > gpGlobals->maxEntities)) { MF_RaiseAmxError(amx,AMX_ERR_NATIVE); return 0; } extern AMX_NATIVE_INFO engfunc_natives[]; extern AMX_NATIVE_INFO dllfunc_natives[]; -//extern AMX_NATIVE_INFO pev_natives[]; +extern AMX_NATIVE_INFO newdllfunc_natives[]; extern AMX_NATIVE_INFO forward_natives[]; extern AMX_NATIVE_INFO pdata_natives[]; extern AMX_NATIVE_INFO tr_Natives[]; @@ -58,7 +58,8 @@ extern DLL_FUNCTIONS *g_pFunctionTable; extern DLL_FUNCTIONS *g_pFunctionTable_Post; extern enginefuncs_t *g_pengfuncsTable; extern enginefuncs_t *g_pengfuncsTable_Post; - +extern NEW_DLL_FUNCTIONS *g_pNewFunctionsTable; +extern NEW_DLL_FUNCTIONS *g_pNewFunctionsTable_Post; #endif //_FAKEMETA_INCLUDE_H diff --git a/dlls/fakemeta/forward.cpp b/dlls/fakemeta/forward.cpp index e7bccccb..dbdd58b3 100755 --- a/dlls/fakemeta/forward.cpp +++ b/dlls/fakemeta/forward.cpp @@ -479,7 +479,15 @@ SIMPLE_VOID_HOOK_VOID(CreateInstancedBaselines); SIMPLE_INT_HOOK_VOID(AllowLagCompensation); - +/* + * NEW_DLL_FUNCTIONS + */ +// pfnOnFreeEntPrivateData +SIMPLE_VOID_HOOK_EDICT(OnFreeEntPrivateData); +// pfnGameShutdown +SIMPLE_VOID_HOOK_VOID(GameShutdown); +// pfnShouldCollide +SIMPLE_INT_HOOK_EDICT_EDICT(ShouldCollide); @@ -503,15 +511,19 @@ static cell AMX_NATIVE_CALL register_forward(AMX *amx, cell *params) DLL_FUNCTIONS *dlltable; + NEW_DLL_FUNCTIONS *newdlltable; + if (post) { engtable = g_pengfuncsTable_Post; dlltable = g_pFunctionTable_Post; + newdlltable = g_pNewFunctionsTable_Post; } else { engtable = g_pengfuncsTable; dlltable = g_pFunctionTable; + newdlltable = g_pNewFunctionsTable; } switch (func) @@ -1061,6 +1073,20 @@ static cell AMX_NATIVE_CALL register_forward(AMX *amx, cell *params) fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE); DLLHOOK(AllowLagCompensation); break; + // NEW_DLL_FUNCTIONS: + case FM_OnFreeEntPrivateData: + fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE); + NEWDLLHOOK(OnFreeEntPrivateData); + break; + // Maybe it's not possible to hook this forward? O_o + case FM_GameShutdown: + fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE); + NEWDLLHOOK(GameShutdown); + break; + case FM_ShouldCollide: + fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE); + NEWDLLHOOK(ShouldCollide); + break; #if 0 // I know this does not fit with DLLFUNC(), but I dont want another native just for it. diff --git a/dlls/fakemeta/forward.h b/dlls/fakemeta/forward.h index 6362024e..89389802 100755 --- a/dlls/fakemeta/forward.h +++ b/dlls/fakemeta/forward.h @@ -1,7 +1,7 @@ #ifndef _INCLUDE_FORWARD_H #define _INCLUDE_FORWARD_H -#define ENGFUNC_NUM 118 +#define ENGFUNC_NUM FM_LAST_DONT_USE_ME // 118 #define FMV_STRING 1 #define FMV_FLOAT 2 @@ -150,6 +150,12 @@ enum { FM_CreateInstancedBaselines, // done FM_AllowLagCompensation, // done FM_AlertMessage, + + // NEW_DLL_FUNCTIONS + FM_OnFreeEntPrivateData, + FM_GameShutdown, + FM_ShouldCollide, + // FM_CvarValue FM_LAST_DONT_USE_ME, }; diff --git a/dlls/fakemeta/forwardmacros.h b/dlls/fakemeta/forwardmacros.h index 1139e154..e6092ccb 100755 --- a/dlls/fakemeta/forwardmacros.h +++ b/dlls/fakemeta/forwardmacros.h @@ -742,12 +742,31 @@ RETURN_META(MRES_IGNORED); \ } +/* +#define SIMPLE_INT_HOOK_EDICT(call) \ + int call (edict_t *pent) \ + { \ + FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i), ENTINDEX(pent))); \ + RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult); \ + } \ + int call##_post (edict_t *pent) \ + { \ + FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i), ENTINDEX(pent))); \ + RETURN_META_VALUE(MRES_IGNORED, (int)mlCellResult); \ + } +*/ - - - - - +#define SIMPLE_INT_HOOK_EDICT_EDICT(call) \ + int call (edict_t *pent,edict_t *pentb) \ + { \ + FM_ENG_HANDLE(FM_##call, (Engine[FM_##call].at(i), ENTINDEX(pent), ENTINDEX(pentb))); \ + RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult); \ + } \ + int call##_post (edict_t *pent,edict_t *pentb) \ + { \ + FM_ENG_HANDLE_POST(FM_##call, (EnginePost[FM_##call].at(i), ENTINDEX(pent), ENTINDEX(pentb))); \ + RETURN_META_VALUE(MRES_IGNORED, (int)mlCellResult); \ + } #define ENGHOOK(pfnCall) \ if (post) \ @@ -772,6 +791,17 @@ if (dlltable->pfn##pfnCall == NULL) \ dlltable->pfn##pfnCall = pfnCall; \ } +#define NEWDLLHOOK(pfnCall) \ + if (post) \ + { \ + if (newdlltable->pfn##pfnCall == NULL) \ + newdlltable->pfn##pfnCall = pfnCall##_post; \ + } \ + else \ + { \ + if (newdlltable->pfn##pfnCall == NULL) \ + newdlltable->pfn##pfnCall = pfnCall; \ + } #define PREPARE_VECTOR(vector_name) \ cell vector_name##_cell[3] = {amx_ftoc(vector_name[0]), amx_ftoc(vector_name[1]), amx_ftoc(vector_name[2])}; \ diff --git a/dlls/fakemeta/newdllfunc.cpp b/dlls/fakemeta/newdllfunc.cpp new file mode 100755 index 00000000..bfe3c123 --- /dev/null +++ b/dlls/fakemeta/newdllfunc.cpp @@ -0,0 +1,52 @@ +#include "newdllfunc.h" + +static cell AMX_NATIVE_CALL newdllfunc(AMX *amx,cell *params) +{ + int type; + int index; + int indexb; + //char *temp = ""; + //char *temp2 = ""; + //char *temp3 = ""; + //vec3_t Vec1; + //vec3_t Vec2; + int iparam1; + //int len; + cell *cRet; + type = params[1]; + switch(type) + { + + /*// pfnGameInit + case DLLFunc_GameInit: // void) ( void ); + gpGamedllFuncs->dllapi_table->pfnGameInit(); + return 1; + */ + case NEWDLLFunc_OnFreeEntPrivateData: // void ) ( edict_t *pent ); + cRet = MF_GetAmxAddr(amx, params[2]); + index=cRet[0]; + CHECK_ENTITY(index); + gpGamedllFuncs->newapi_table->pfnOnFreeEntPrivateData(INDEXENT2(index)); + return 1; + case NEWDLLFunc_GameShutdown: // void ) ( void ); + gpGamedllFuncs->newapi_table->pfnGameShutdown(); + return 1; + case NEWDLLFunc_ShouldCollide: // int ) ( ent1, ent2 ); + cRet = MF_GetAmxAddr(amx,params[2]); + index=cRet[0]; + CHECK_ENTITY(index); + cRet = MF_GetAmxAddr(amx,params[3]); + indexb=cRet[0]; + CHECK_ENTITY(indexb); + iparam1 = gpGamedllFuncs->newapi_table->pfnShouldCollide(INDEXENT2(index),INDEXENT2(indexb)); + return iparam1; + default: + MF_LogError(amx, AMX_ERR_NATIVE, "Unknown newdllfunc entry %d", type); + return 0; + } +} + +AMX_NATIVE_INFO newdllfunc_natives[] = { + {"newdllfunc", newdllfunc}, + {NULL, NULL}, +}; \ No newline at end of file diff --git a/dlls/fakemeta/newdllfunc.h b/dlls/fakemeta/newdllfunc.h new file mode 100755 index 00000000..a103c87d --- /dev/null +++ b/dlls/fakemeta/newdllfunc.h @@ -0,0 +1,13 @@ +#ifndef _NEWDLLFUNC_INCLUDE_H +#define _NEWDLLFUNC_INCLUDE_H + +#include "fakemeta_amxx.h" + +enum { + NEWDLLFunc_OnFreeEntPrivateData, // void ) (edict_t *pEnt); + NEWDLLFunc_GameShutdown, // void ) (void); + NEWDLLFunc_ShouldCollide // int ) (edict_t *pentTouched, edict_t *pentOther); +}; + +#endif //_NEWDLLFUNC_INCLUDE_H + diff --git a/plugins/include/fakemeta.inc b/plugins/include/fakemeta.inc index 29509962..91f10074 100755 --- a/plugins/include/fakemeta.inc +++ b/plugins/include/fakemeta.inc @@ -38,6 +38,7 @@ native forward_return(type,{Float,Sql,Result,_}:...); native engfunc(type,{Float,Sql,Result,_}:...); native dllfunc(type,{Float,Sql,Result,_}:...); +native newdllfunc(type,{Float,Sql,Result,_}:...); //only use this with functions that pass a Trace // get: zero extra params - return int, one extra param = byref float or vector diff --git a/plugins/include/fakemeta_const.inc b/plugins/include/fakemeta_const.inc index d961715a..346e7ba9 100755 --- a/plugins/include/fakemeta_const.inc +++ b/plugins/include/fakemeta_const.inc @@ -154,6 +154,15 @@ enum MetaFunc_CallGameEntity, // bool (plid_t plid, const char *entStr,entvars_t *pev); DLLFunc_ClientUserInfoChanged // void (idplayer) }; + +/* Used with newdllfunc() + */ +enum { + NEWDLLFunc_OnFreeEntPrivateData, // void ) (edict_t *pEnt); + NEWDLLFunc_GameShutdown, // void ) (void); + NEWDLLFunc_ShouldCollide // int ) (edict_t *pentTouched, edict_t *pentOther); +}; + enum { pev_string_start = 0, pev_classname, @@ -437,6 +446,11 @@ enum { FM_CreateInstancedBaseline, // done FM_AllowLagCompensation, // done FM_AlertMessage, //done (at_type, message[]) + + // NEW_DLL_FUNCTIONS: + FM_OnFreeEntPrivateData, + FM_GameShutdown, + FM_ShouldCollide }; enum TraceResult