Added NEW_DLL_FUNCTIONS to FM_* and a newdllfunc() native to call these... Although I'm not sure there is a reason to call those?

Anyway it will be needed later when client cvar query function is implemented.
This commit is contained in:
Johnny Bergström 2005-08-18 09:33:51 +00:00
parent e9993cce25
commit 1cdb12c4e4
12 changed files with 167 additions and 19 deletions

View File

@ -11,7 +11,7 @@ DEBUG_FLAGS = -g -ggdb3
CPP = gcc
NAME = fakemeta_amxx
OBJECTS = sdk/amxxmodule.cpp dllfunc.cpp engfunc.cpp fakemeta_amxx.cpp pdata.cpp forward.cpp \
OBJECTS = sdk/amxxmodule.cpp dllfunc.cpp newdllfunc.cpp engfunc.cpp fakemeta_amxx.cpp pdata.cpp forward.cpp \
fm_tr.cpp pev.cpp
LINK =

View File

@ -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]);

View File

@ -161,6 +161,12 @@
<File
RelativePath=".\engfunc.h">
</File>
<File
RelativePath=".\newdllfunc.cpp">
</File>
<File
RelativePath=".\newdllfunc.h">
</File>
</Filter>
<Filter
Name="pev"
@ -168,8 +174,7 @@
<File
RelativePath=".\pev.cpp">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
@ -177,8 +182,7 @@
<File
RelativePath=".\pev.h">
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
Name="Debug|Win32">
<Tool
Name="VCCustomBuildTool"/>
</FileConfiguration>

View File

@ -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)

View File

@ -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

View File

@ -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.

View File

@ -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,
};

View File

@ -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])}; \

52
dlls/fakemeta/newdllfunc.cpp Executable file
View File

@ -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},
};

13
dlls/fakemeta/newdllfunc.h Executable file
View File

@ -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

View File

@ -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

View File

@ -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