amxmodx/dlls/fakemeta/forward.cpp

1395 lines
40 KiB
C++
Raw Normal View History

2004-07-28 03:14:07 +00:00
#include "fakemeta_amxx.h"
2004-07-28 03:14:07 +00:00
CVector<int> Engine[ENGFUNC_NUM+10];
CVector<int> EnginePost[ENGFUNC_NUM+10];
cell mCellResult;
cell mlCellResult;
float mFloatResult;
float mlFloatResult;
const char *mStringResult;
const char *mlStringResult;
int retType = 0;
int lastFmRes = FMRES_IGNORED;
2006-03-20 18:08:51 +00:00
KVD_Wrapper g_kvd_hook;
2004-07-28 03:14:07 +00:00
cell origCellRet;
float origFloatRet;
const char *origStringRet;
#include "forwardmacros.h"
2004-07-28 03:14:07 +00:00
META_RES mswi(int fmres)
{
if (fmres == FMRES_IGNORED)
return MRES_IGNORED;
if (fmres == FMRES_HANDLED)
return MRES_HANDLED;
if (fmres == FMRES_SUPERCEDE)
return MRES_SUPERCEDE;
if (fmres == FMRES_OVERRIDE)
return MRES_OVERRIDE;
return (META_RES)0;
}
void clfm()
{
mCellResult = 0;
mlCellResult = 0;
mStringResult = "";
mlStringResult = "";
lastFmRes = FMRES_IGNORED;
mFloatResult = 0.0;
mlFloatResult = 0.0;
}
static cell AMX_NATIVE_CALL fm_return(AMX *amx, cell *params)
{
int len;
switch (params[1])
{
case FMV_STRING:
{
mStringResult = STRING(ALLOC_STRING(MF_GetAmxString(amx, params[2], 0 ,&len)));
break;
}
case FMV_FLOAT:
{
mFloatResult = amx_ctof(params[2]);
break;
}
case FMV_CELL:
{
mCellResult = params[2];
break;
}
default:
{
return 0;
break;
}
}
retType = params[1];
return 1;
}
2004-08-11 05:06:27 +00:00
/*
* Begining of Game DLL->Engine hooks
*/
// pfnPrecacheModel
SIMPLE_INT_HOOK_STRING(PrecacheModel);
// pfnPrecacheSound
SIMPLE_INT_HOOK_STRING(PrecacheSound);
2004-07-28 03:14:07 +00:00
2006-03-30 00:31:33 +00:00
void ClientUserInfoChanged(edict_t *e, char *infobuffer)
{
FM_ENG_HANDLE(FM_ClientInfoChanged, (Engine[FM_ClientInfoChanged].at(i), (cell)ENTINDEX(e)));
2006-03-30 00:31:33 +00:00
RETURN_META(mswi(lastFmRes));
}
void ClientUserInfoChanged_post(edict_t *e, char *infobuffer)
{
FM_ENG_HANDLE_POST(FM_ClientInfoChanged, (EnginePost[FM_ClientInfoChanged].at(i), (cell)ENTINDEX(e)));
2006-03-30 00:31:33 +00:00
RETURN_META(mswi(lastFmRes));
}
2004-07-28 03:14:07 +00:00
void SetModel(edict_t *e, const char *m)
{
FM_ENG_HANDLE(FM_SetModel, (Engine[FM_SetModel].at(i), ENTINDEX(e), m));
RETURN_META(mswi(lastFmRes));
}
void SetModel_post(edict_t *e, const char *m)
{
FM_ENG_HANDLE_POST(FM_SetModel, (EnginePost[FM_SetModel].at(i), ENTINDEX(e), m));
RETURN_META(MRES_IGNORED);
}
2004-07-28 03:14:07 +00:00
2004-09-14 06:16:52 +00:00
void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr)
{
2004-09-15 18:40:18 +00:00
/*
TRACE_LINE(v1, v2, fNoMonsters, pentToSkip, ptr); //from fun module - prevents crash? - t(+)rget/freecode // well i guess that's what you get for listening, isnt it? =/
*/
gfm_tr=ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
2006-03-20 18:08:51 +00:00
FM_ENG_HANDLE(FM_TraceLine, (Engine[FM_TraceLine].at(i), p_v1, p_v2, fNoMonsters, ENTINDEX(pentToSkip) , (cell)ptr));
2004-09-14 06:16:52 +00:00
RETURN_META(mswi(lastFmRes));
}
void TraceLine_post(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr)
{
2004-09-15 18:40:18 +00:00
gfm_tr=ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
2006-03-20 18:08:51 +00:00
FM_ENG_HANDLE_POST(FM_TraceLine, (EnginePost[FM_TraceLine].at(i), p_v1, p_v2, fNoMonsters, ENTINDEX(pentToSkip), (cell)ptr));
2004-09-14 06:16:52 +00:00
RETURN_META(MRES_IGNORED);
}
void TraceToss(edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr)
{
gfm_tr = ptr;
FM_ENG_HANDLE(FM_TraceToss, (Engine[FM_TraceToss].at(i), ENTINDEX(pent), ENTINDEX(pentToIgnore), (cell)ptr));
RETURN_META(mswi(lastFmRes));
}
void TraceToss_post(edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr)
{
gfm_tr = ptr;
FM_ENG_HANDLE_POST(FM_TraceToss, (EnginePost[FM_TraceToss].at(i), ENTINDEX(pent), ENTINDEX(pentToIgnore), (cell)ptr));
RETURN_META(MRES_IGNORED);
}
int TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE(FM_TraceMonsterHull, (Engine[FM_TraceMonsterHull].at(i), ENTINDEX(pEdict), p_v1, p_v2, fNoMonsters, ENTINDEX(pentToSkip), (cell)ptr));
RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult);
}
int TraceMonsterHull_post(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
origCellRet = META_RESULT_ORIG_RET(int);
FM_ENG_HANDLE_POST(FM_TraceMonsterHull, (EnginePost[FM_TraceMonsterHull].at(i), ENTINDEX(pEdict), p_v1, p_v2, fNoMonsters, ENTINDEX(pentToSkip), (cell)ptr));
RETURN_META_VALUE(MRES_IGNORED, (int)mlCellResult);
}
void TraceHull(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE(FM_TraceHull, (Engine[FM_TraceHull].at(i), p_v1, p_v2, fNoMonsters, hullNumber, ENTINDEX(pentToSkip), (cell)ptr));
RETURN_META(mswi(lastFmRes));
}
void TraceHull_post(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE_POST(FM_TraceHull, (EnginePost[FM_TraceHull].at(i), p_v1, p_v2, fNoMonsters, hullNumber, ENTINDEX(pentToSkip), (cell)ptr));
RETURN_META(MRES_IGNORED);
}
void TraceModel(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE(FM_TraceModel, (Engine[FM_TraceModel].at(i), p_v1, p_v2, hullNumber, ENTINDEX(pent), ptr));
RETURN_META(mswi(lastFmRes));
}
void TraceModel_post(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE_POST(FM_TraceModel, (EnginePost[FM_TraceModel].at(i), p_v1, p_v2, hullNumber, ENTINDEX(pent), ptr));
RETURN_META(MRES_IGNORED);
}
const char *TraceTexture(edict_t *pTextureEntity, const float *v1, const float *v2)
{
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE(FM_TraceTexture, (Engine[FM_TraceTexture].at(i), ENTINDEX(pTextureEntity), p_v1, p_v2));
RETURN_META_VALUE(mswi(lastFmRes), mlStringResult);
}
const char *TraceTexture_post(edict_t *pTextureEntity, const float *v1, const float *v2)
{
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
origStringRet = META_RESULT_ORIG_RET(const char *);
FM_ENG_HANDLE_POST(FM_TraceTexture, (EnginePost[FM_TraceTexture].at(i), ENTINDEX(pTextureEntity), p_v1, p_v2));
RETURN_META_VALUE(MRES_IGNORED, mlStringResult);
}
void TraceSphere(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE(FM_TraceSphere, (Engine[FM_TraceSphere].at(i), p_v1, p_v2, fNoMonsters, radius, ENTINDEX(pentToSkip), (cell)ptr));
RETURN_META(mswi(lastFmRes));
}
void TraceSphere_post(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr)
{
gfm_tr = ptr;
PREPARE_VECTOR(v1);
PREPARE_VECTOR(v2);
FM_ENG_HANDLE_POST(FM_TraceSphere, (EnginePost[FM_TraceSphere].at(i), p_v1, p_v2, fNoMonsters, radius, ENTINDEX(pentToSkip), (cell)ptr));
RETURN_META(MRES_IGNORED);
}
/*
// Passed to pfnKeyValue
typedef struct KeyValueData_s
{
char *szClassName; // in: entity classname
char *szKeyName; // in: name of key
char *szValue; // in: value of key
int32 fHandled; // out: DLL sets to true if key-value pair was understood
} KeyValueData;
*/
2006-02-05 08:06:50 +00:00
void KeyValue(edict_t* entity, KeyValueData* data)
{
2006-03-20 18:08:51 +00:00
g_kvd_hook.kvd = data;
FM_ENG_HANDLE(FM_KeyValue, (Engine[FM_KeyValue].at(i), ENTINDEX(entity), (cell)(&g_kvd_hook)));
RETURN_META(mswi(lastFmRes));
}
2006-02-05 08:06:50 +00:00
void KeyValue_post(edict_t* entity, KeyValueData* data)
{
2006-03-20 18:08:51 +00:00
g_kvd_hook.kvd = data;
FM_ENG_HANDLE_POST(FM_KeyValue, (EnginePost[FM_KeyValue].at(i), ENTINDEX(entity), (cell)(&g_kvd_hook)));
RETURN_META(MRES_IGNORED);
}
2004-10-03 07:04:08 +00:00
void AlertMessage(ALERT_TYPE atype, char *szFmt, ...)
{
static char buf[2048];
va_list ap;
va_start(ap, szFmt);
vsprintf(buf, szFmt, ap);
va_end(ap);
FM_ENG_HANDLE(FM_AlertMessage, (Engine[FM_AlertMessage].at(i), atype, buf));
RETURN_META(mswi(lastFmRes));
}
void AlertMessage_post(ALERT_TYPE atype, char *szFmt, ...)
{
static char buf[2048];
va_list ap;
va_start(ap, szFmt);
vsprintf(buf, szFmt, ap);
va_end(ap);
FM_ENG_HANDLE_POST(FM_AlertMessage, (EnginePost[FM_AlertMessage].at(i), atype, buf));
2004-10-03 07:04:08 +00:00
RETURN_META(MRES_IGNORED);
}
// pfnModelIndex
SIMPLE_INT_HOOK_CONSTSTRING(ModelIndex);
2004-07-28 03:14:07 +00:00
// pfnModelFrames
SIMPLE_INT_HOOK_INT(ModelFrames);
2004-07-28 03:14:07 +00:00
2004-08-11 05:06:27 +00:00
// pfnSetSize
SIMPLE_VOID_HOOK_EDICT_CONSTVECT_CONSTVECT(SetSize);
2004-07-28 03:14:07 +00:00
2004-08-11 05:06:27 +00:00
// pfnChangeLevel
SIMPLE_VOID_HOOK_STRING_STRING(ChangeLevel);
2004-07-28 03:14:07 +00:00
2004-08-11 05:06:27 +00:00
// pfnVecToYaw
SIMPLE_FLOAT_HOOK_CONSTVECT(VecToYaw);
2004-07-28 03:14:07 +00:00
void VecToAngles(const float *rgflVectorIn, float *rgflVectorOut)
{
PREPARE_VECTOR(rgflVectorIn);
PREPARE_VECTOR(rgflVectorOut);
FM_ENG_HANDLE(FM_VecToAngles, (Engine[FM_VecToAngles].at(i), p_rgflVectorIn, p_rgflVectorOut));
2004-07-28 03:14:07 +00:00
RETURN_META(mswi(lastFmRes));
}
void VecToAngles_post(const float *rgflVectorIn, float *rgflVectorOut)
{
PREPARE_VECTOR(rgflVectorIn);
PREPARE_VECTOR(rgflVectorOut);
FM_ENG_HANDLE_POST(FM_VecToAngles, (EnginePost[FM_VecToAngles].at(i), p_rgflVectorIn, p_rgflVectorOut));
RETURN_META(MRES_IGNORED);
}
2004-07-28 03:14:07 +00:00
void MoveToOrigin(edict_t *ent, const float *pflGoal, float dist, int iMoveType)
{
PREPARE_VECTOR(pflGoal);
FM_ENG_HANDLE(FM_MoveToOrigin, (Engine[FM_MoveToOrigin].at(i), ENTINDEX(ent), p_pflGoal, dist, iMoveType));
2004-07-28 03:14:07 +00:00
RETURN_META(mswi(lastFmRes));
}
2006-02-05 08:06:50 +00:00
void MoveToOrigin_post(edict_t *ent, const float *pflGoal, float dist, int iMoveType)
{
PREPARE_VECTOR(pflGoal);
FM_ENG_HANDLE_POST(FM_MoveToOrigin, (EnginePost[FM_MoveToOrigin].at(i), ENTINDEX(ent), p_pflGoal, dist, iMoveType));
RETURN_META(MRES_IGNORED);
}
2004-07-28 03:14:07 +00:00
edict_t *FindEntityByString(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue)
{
FM_ENG_HANDLE(FM_FindEntityByString, (Engine[FM_FindEntityByString].at(i), ENTINDEX(pEdictStartSearchAfter), pszField, pszValue));
RETURN_META_VALUE(mswi(lastFmRes), INDEXENT2((int)mlCellResult));
2004-07-28 03:14:07 +00:00
}
2006-02-05 08:06:50 +00:00
edict_t *FindEntityByString_post(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue)
{
origCellRet = ENTINDEX(META_RESULT_ORIG_RET(edict_t *));
FM_ENG_HANDLE_POST(FM_FindEntityByString, (EnginePost[FM_FindEntityByString].at(i), ENTINDEX(pEdictStartSearchAfter), pszField, pszValue));
RETURN_META_VALUE(MRES_IGNORED, INDEXENT2((int)mlCellResult));
}
// pfnGetEntityIllum
SIMPLE_INT_HOOK_EDICT(GetEntityIllum);
2004-07-28 03:14:07 +00:00
2004-08-11 05:06:27 +00:00
// pfnFindEntityInSphere
SIMPLE_EDICT_HOOK_EDICT_CONSTVECT_FLOAT(FindEntityInSphere);
// pfnFindClientInPVS
SIMPLE_EDICT_HOOK_EDICT(FindClientInPVS);
// pfnEntitiesInPVS
SIMPLE_EDICT_HOOK_EDICT(EntitiesInPVS);
// pfnMakeVectors
SIMPLE_VOID_HOOK_CONSTVECT(MakeVectors);
// pfnAngleVectors
SIMPLE_VOID_HOOK_CONSTVECT_VECT_VECT_VECT(AngleVectors);
// pfnChangeYaw
SIMPLE_VOID_HOOK_EDICT(ChangeYaw);
// pfnChangePitch
SIMPLE_VOID_HOOK_EDICT(ChangePitch);
// pfnCreateEntity
SIMPLE_EDICT_HOOK_VOID(CreateEntity);
// pfnRemoveEntity
SIMPLE_VOID_HOOK_EDICT(RemoveEntity);
// pfnCreateNamedEntity
SIMPLE_EDICT_HOOK_INT(CreateNamedEntity);
// pfnMakeStatic
SIMPLE_VOID_HOOK_EDICT(MakeStatic);
// pfnEntIsOnFloor
SIMPLE_INT_HOOK_EDICT(EntIsOnFloor);
// pfnDropToFloor
SIMPLE_INT_HOOK_EDICT(DropToFloor);
// pfnWalkMove
SIMPLE_INT_HOOK_EDICT_FLOAT_FLOAT_INT(WalkMove);
2004-08-11 05:06:27 +00:00
// pfnSetOrigin
SIMPLE_VOID_HOOK_EDICT_CONSTVECT(SetOrigin);
// pfnEmitSound
SIMPLE_VOID_HOOK_EDICT_INT_CONSTSTRING_FLOAT_FLOAT_INT_INT(EmitSound);
// pfnEmitAmbientSound
SIMPLE_VOID_HOOK_EDICT_VECT_CONSTSTRING_FLOAT_FLOAT_INT_INT(EmitAmbientSound);
// pfnGetAimVector
SIMPLE_VOID_HOOK_EDICT_FLOAT_VECT(GetAimVector);
// pfnParticleEffect
SIMPLE_VOID_HOOK_CONSTVECT_CONSTVECT_FLOAT_FLOAT(ParticleEffect);
// pfnLightStyle
SIMPLE_VOID_HOOK_INT_STRING(LightStyle);
// pfnDecalIndex
SIMPLE_INT_HOOK_CONSTSTRING(DecalIndex);
2004-08-11 05:06:27 +00:00
// pfnPointContents
SIMPLE_INT_HOOK_CONSTVECT(PointContents);
// pfnMessageBegin
SIMPLE_VOID_HOOK_INT_INT_CONSTVECT_EDICT(MessageBegin);
// pfnMessageEnd
SIMPLE_VOID_HOOK_VOID(MessageEnd);
// pfnWriteByte
SIMPLE_VOID_HOOK_INT(WriteByte);
// pfnWriteChar
SIMPLE_VOID_HOOK_INT(WriteChar);
// pfnWriteShort
SIMPLE_VOID_HOOK_INT(WriteShort);
// pfnWriteLong
SIMPLE_VOID_HOOK_INT(WriteLong);
// pfnWriteAngle
SIMPLE_VOID_HOOK_FLOAT(WriteAngle);
// pfnWriteCoord
SIMPLE_VOID_HOOK_FLOAT(WriteCoord);
// pfnWriteString
SIMPLE_VOID_HOOK_CONSTSTRING(WriteString);
// pfnWriteEntity
SIMPLE_VOID_HOOK_INT(WriteEntity);
SIMPLE_FLOAT_HOOK_CONSTSTRING(CVarGetFloat);
SIMPLE_CONSTSTRING_HOOK_CONSTSTRING(CVarGetString);
SIMPLE_VOID_HOOK_CONSTSTRING_FLOAT(CVarSetFloat);
SIMPLE_VOID_HOOK_CONSTSTRING_CONSTSTRING(CVarSetString);
// pfnFreeEntPrivateData
SIMPLE_VOID_HOOK_EDICT(FreeEntPrivateData);
2004-08-11 05:06:27 +00:00
// pfnSzFromIndex
SIMPLE_CONSTSTRING_HOOK_INT(SzFromIndex);
// pfnAllocString
SIMPLE_INT_HOOK_CONSTSTRING(AllocString);
2004-08-11 05:06:27 +00:00
SIMPLE_INT_HOOK_CONSTSTRING_INT(RegUserMsg);
// pfnAnimationAutomove
SIMPLE_VOID_HOOK_CONSTEDICT_FLOAT(AnimationAutomove);
void GetBonePosition(const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles)
{
PREPARE_VECTOR(rgflOrigin);
PREPARE_VECTOR(rgflAngles);
FM_ENG_HANDLE(FM_GetBonePosition, (Engine[FM_GetBonePosition].at(i), ENTINDEX(pEdict), iBone, p_rgflOrigin, p_rgflAngles));
RETURN_META(mswi(lastFmRes));
}
void GetBonePosition_post(const edict_t* pEdict, int iBone, float *rgflOrigin, float *rgflAngles)
{
PREPARE_VECTOR(rgflOrigin);
PREPARE_VECTOR(rgflAngles);
FM_ENG_HANDLE_POST(FM_GetBonePosition, (EnginePost[FM_GetBonePosition].at(i), ENTINDEX(pEdict), iBone, p_rgflOrigin, p_rgflAngles));
RETURN_META(MRES_IGNORED);
}
void GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles)
{
PREPARE_VECTOR(rgflOrigin);
PREPARE_VECTOR(rgflAngles);
FM_ENG_HANDLE(FM_GetAttachment, (Engine[FM_GetAttachment].at(i), ENTINDEX(pEdict), iAttachment, p_rgflOrigin, p_rgflAngles));
RETURN_META(mswi(lastFmRes));
}
void GetAttachment_post(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles)
{
PREPARE_VECTOR(rgflOrigin);
PREPARE_VECTOR(rgflAngles);
FM_ENG_HANDLE_POST(FM_GetAttachment, (EnginePost[FM_GetAttachment].at(i), ENTINDEX(pEdict), iAttachment, p_rgflOrigin, p_rgflAngles));
RETURN_META(MRES_IGNORED);
}
2004-08-11 05:06:27 +00:00
// pfnSetView
SIMPLE_VOID_HOOK_CONSTEDICT_CONSTEDICT(SetView);
// pfnTime
SIMPLE_FLOAT_HOOK_VOID(Time);
// pfnCrosshairAngle
SIMPLE_VOID_HOOK_CONSTEDICT_FLOAT_FLOAT(CrosshairAngle);
SIMPLE_VOID_HOOK_CONSTEDICT_INT_INT_INT_INT(FadeClientVolume);
// pfnSetClientMaxspeed
SIMPLE_VOID_HOOK_CONSTEDICT_FLOAT(SetClientMaxspeed);
// pfnPrecacheGeneric
SIMPLE_INT_HOOK_STRING(PrecacheGeneric);
2004-08-11 05:06:27 +00:00
// pfnPrecacheEvent
SIMPLE_USHORT_HOOK_INT_CONSTSTRING(PrecacheEvent);
// pfnGetPhysicsKeyValue
SIMPLE_CONSTSTRING_HOOK_CONSTEDICT_CONSTSTRING(GetPhysicsKeyValue);
// pfnSetPhysicsKeyValue
SIMPLE_VOID_HOOK_CONSTEDICT_CONSTSTRING_CONSTSTRING(SetPhysicsKeyValue);
// pfnGetPhysicsInfoString
SIMPLE_CONSTSTRING_HOOK_CONSTEDICT(GetPhysicsInfoString);
// pfnPlaybackEvent
HOOK_PLAYBACK_EVENT(PlaybackEvent);
// pfnCreateFakeClient
SIMPLE_EDICT_HOOK_CONSTSTRING(CreateFakeClient);
void RunPlayerMove(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec)
{
PREPARE_VECTOR(viewangles);
FM_ENG_HANDLE(FM_RunPlayerMove, (Engine[FM_RunPlayerMove].at(i), ENTINDEX(fakeclient), p_viewangles, forwardmove, sidemove, upmove, buttons, impulse, msec));
RETURN_META(mswi(lastFmRes));
}
void RunPlayerMove_post(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec)
{
PREPARE_VECTOR(viewangles);
FM_ENG_HANDLE_POST(FM_RunPlayerMove, (EnginePost[FM_RunPlayerMove].at(i), ENTINDEX(fakeclient), p_viewangles, forwardmove, sidemove, upmove, buttons, impulse, msec));
RETURN_META(MRES_IGNORED);
}
// pfnNumberOfEntities
SIMPLE_INT_HOOK_VOID(NumberOfEntities);
void StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex)
{
PREPARE_VECTOR(origin);
FM_ENG_HANDLE(FM_StaticDecal, (Engine[FM_StaticDecal].at(i), p_origin, decalIndex, entityIndex, modelIndex));
RETURN_META(mswi(lastFmRes));
}
void StaticDecal_post(const float *origin, int decalIndex, int entityIndex, int modelIndex)
{
PREPARE_VECTOR(origin);
FM_ENG_HANDLE_POST(FM_StaticDecal, (EnginePost[FM_StaticDecal].at(i), p_origin, decalIndex, entityIndex, modelIndex));
RETURN_META(MRES_IGNORED);
}
void BuildSoundMsg(edict_t *entity, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
{
PREPARE_VECTOR(pOrigin);
FM_ENG_HANDLE(FM_BuildSoundMsg, (Engine[FM_BuildSoundMsg].at(i), ENTINDEX(entity), channel, sample, volume, attenuation, fFlags, pitch, msg_dest, msg_type, p_pOrigin, ENTINDEX(ed)));
RETURN_META(mswi(lastFmRes));
}
void BuildSoundMsg_post(edict_t *entity, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
{
PREPARE_VECTOR(pOrigin);
FM_ENG_HANDLE_POST(FM_BuildSoundMsg, (EnginePost[FM_BuildSoundMsg].at(i), ENTINDEX(entity), channel, sample, volume, attenuation, fFlags, pitch, msg_dest, msg_type, p_pOrigin, ENTINDEX(ed)));
RETURN_META(MRES_IGNORED);
}
int CheckVisibility(const edict_t *entity, unsigned char *pset)
{
FM_ENG_HANDLE(FM_CheckVisibility, (Engine[FM_CheckVisibility].at(i), ENTINDEX(entity), pset));
RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult);
}
int CheckVisibility_post(const edict_t *entity, unsigned char *pset)
{
origCellRet = META_RESULT_ORIG_RET(int);
FM_ENG_HANDLE(FM_CheckVisibility, (Engine[FM_CheckVisibility].at(i), ENTINDEX(entity), pset));
RETURN_META_VALUE(MRES_IGNORED, (int)mlCellResult);
}
// pfnGetCurrentPlayer
SIMPLE_INT_HOOK_VOID(GetCurrentPlayer);
2004-08-11 05:06:27 +00:00
// pfnCanSkipPlayer
SIMPLE_INT_HOOK_CONSTEDICT(CanSkipPlayer);
// pfnSetGroupMask
SIMPLE_VOID_HOOK_INT_INT(SetGroupMask);
// pfnVoice_GetClientListening
SIMPLE_BOOL_HOOK_INT_INT(Voice_GetClientListening);
// pfnVoice_SetClientListening
SIMPLE_BOOL_HOOK_INT_INT_BOOL(Voice_SetClientListening);
SIMPLE_STRING_HOOK_STRING_STRING(InfoKeyValue);
SIMPLE_VOID_HOOK_STRING_STRING_STRING(SetKeyValue);
SIMPLE_VOID_HOOK_INT_STRING_STRING_STRING(SetClientKeyValue);
SIMPLE_CONSTSTRING_HOOK_EDICT(GetPlayerAuthId);
SIMPLE_UINT_HOOK_EDICT(GetPlayerWONId);
SIMPLE_INT_HOOK_STRING(IsMapValid);
/*
2004-08-11 05:06:27 +00:00
* Beginning of Engine->Game DLL hooks
*/
// pfnSpawn
SIMPLE_INT_HOOK_EDICT(Spawn);
// pfnThink
SIMPLE_VOID_HOOK_EDICT(Think);
// pfnUse
SIMPLE_VOID_HOOK_EDICT_EDICT(Use);
// pfnTouch
SIMPLE_VOID_HOOK_EDICT_EDICT(Touch);
// pfnBlocked
SIMPLE_VOID_HOOK_EDICT_EDICT(Blocked);
// pfnSetAbsBox
SIMPLE_VOID_HOOK_EDICT(SetAbsBox);
2004-08-11 05:06:27 +00:00
// pfnClientConnect
SIMPLE_BOOL_HOOK_EDICT_CONSTSTRING_CONSTSTRING_STRING128(ClientConnect);
// pfnClientDisconnect
SIMPLE_VOID_HOOK_EDICT(ClientDisconnect);
// pfnClientPutInServer
SIMPLE_VOID_HOOK_EDICT(ClientPutInServer);
// pfnClientKill
SIMPLE_VOID_HOOK_EDICT(ClientKill);
// pfnClientCommand
SIMPLE_VOID_HOOK_EDICT(ClientCommand);
// pfnServerDeactivate
SIMPLE_VOID_HOOK_VOID(ServerDeactivate);
// pfnPlayerPreThink
SIMPLE_VOID_HOOK_EDICT(PlayerPreThink);
// pfnPlayerPostThink
SIMPLE_VOID_HOOK_EDICT(PlayerPostThink);
// pfnStartFrame
SIMPLE_VOID_HOOK_VOID(StartFrame);
// pfnParmsNewLevel
SIMPLE_VOID_HOOK_VOID(ParmsNewLevel);
// pfnParmsChangeLevel
SIMPLE_VOID_HOOK_VOID(ParmsChangeLevel);
// pfnGetGameDescription
SIMPLE_CONSTSTRING_HOOK_VOID(GetGameDescription);
// pfnSpectatorConnect
SIMPLE_VOID_HOOK_EDICT(SpectatorConnect);
// pfnSpectatorDisconnect
SIMPLE_VOID_HOOK_EDICT(SpectatorDisconnect);
// pfnSpectatorThink
SIMPLE_VOID_HOOK_EDICT(SpectatorThink);
2004-07-28 03:14:07 +00:00
// pfnSys_Error
SIMPLE_VOID_HOOK_CONSTSTRING(Sys_Error);
// pfnPM_FindTextureType
SIMPLE_CHAR_HOOK_STRING(PM_FindTextureType);
// pfnRegisterEncoders
SIMPLE_VOID_HOOK_VOID(RegisterEncoders);
// pfnCreateInstancedBaselines
SIMPLE_VOID_HOOK_VOID(CreateInstancedBaselines);
// pfnAllowLagCompensation
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);
2006-02-03 03:27:03 +00:00
static cell AMX_NATIVE_CALL unregister_forward(AMX *amx, cell *params)
{
int func = params[1];
int func_id = params[2];
int post = params[3];
if (func >= FM_LAST_DONT_USE_ME || func < 1)
{
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid function: %d", func);
return 0;
}
2006-02-03 03:28:43 +00:00
CVector<int> *peng = NULL;
if (post)
peng = &(Engine[func]);
else
peng = &(EnginePost[func]);
2006-02-03 03:28:43 +00:00
CVector<int>::iterator begin, end=peng->end();
for (begin=peng->begin(); begin!=end; begin++)
2006-02-03 03:27:03 +00:00
{
if ((*begin) == func_id)
{
2006-02-03 03:28:43 +00:00
peng->erase(begin);
if (!peng->size())
2006-02-03 03:27:03 +00:00
{
//:TODO: we should probably clear this here!
//but, we have no reverse lookup possible.
}
return 1;
}
}
return 0;
}
2004-07-28 03:14:07 +00:00
static cell AMX_NATIVE_CALL register_forward(AMX *amx, cell *params)
{
int func = params[1];
// You originally had both post coming from params[2] AND the function name. I've moved post to 3.
int post = params[3];
2004-10-16 14:26:11 +00:00
if (func >= FM_LAST_DONT_USE_ME || func < 1)
2004-07-28 03:14:07 +00:00
{
2006-02-03 03:27:03 +00:00
MF_LogError(amx, AMX_ERR_NATIVE, "Invalid function: %d", func);
2004-07-28 03:14:07 +00:00
return 0;
}
int len, fId=0;
const char *funcname = MF_GetAmxString(amx, params[2], 0, &len);
enginefuncs_t *engtable;
DLL_FUNCTIONS *dlltable;
NEW_DLL_FUNCTIONS *newdlltable;
2004-07-28 03:14:07 +00:00
if (post)
{
engtable = g_pengfuncsTable_Post;
dlltable = g_pFunctionTable_Post;
newdlltable = g_pNewFunctionsTable_Post;
}
2004-07-28 03:14:07 +00:00
else
{
engtable = g_pengfuncsTable;
dlltable = g_pFunctionTable;
newdlltable = g_pNewFunctionsTable;
}
2006-03-04 06:34:28 +00:00
2004-07-28 03:14:07 +00:00
switch (func)
{
case FM_PrecacheModel:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(PrecacheModel);
break;
case FM_PrecacheSound:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(PrecacheSound);
break;
case FM_SetModel:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_DONE);
ENGHOOK(SetModel);
break;
case FM_ModelIndex:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(ModelIndex);
break;
case FM_ModelFrames:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(ModelFrames);
break;
case FM_SetSize:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE);
ENGHOOK(SetSize);
break;
case FM_ChangeLevel:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_STRING, FP_DONE);
ENGHOOK(ChangeLevel);
break;
case FM_VecToYaw:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_DONE);
ENGHOOK(VecToYaw);
break;
case FM_VecToAngles:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_DONE);
ENGHOOK(VecToAngles);
break;
case FM_MoveToOrigin:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_FLOAT, FP_CELL, FP_DONE);
ENGHOOK(MoveToOrigin);
break;
case FM_ChangeYaw:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(ChangeYaw);
break;
case FM_ChangePitch:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(ChangePitch);
break;
case FM_FindEntityByString:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_STRING, FP_DONE);
ENGHOOK(FindEntityByString);
break;
case FM_GetEntityIllum:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(GetEntityIllum);
break;
case FM_FindEntityInSphere:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_FLOAT, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(FindEntityInSphere);
2004-07-28 03:14:07 +00:00
break;
case FM_FindClientInPVS:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(FindClientInPVS);
2004-07-28 03:14:07 +00:00
break;
case FM_EntitiesInPVS:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(EntitiesInPVS);
2004-07-28 03:14:07 +00:00
break;
case FM_MakeVectors:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(MakeVectors);
2004-07-28 03:14:07 +00:00
break;
case FM_AngleVectors:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_ARRAY, FP_ARRAY, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(AngleVectors);
2004-07-28 03:14:07 +00:00
break;
case FM_CreateEntity:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
ENGHOOK(CreateEntity);
2004-07-28 03:14:07 +00:00
break;
case FM_RemoveEntity:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(RemoveEntity);
2004-07-28 03:14:07 +00:00
break;
case FM_CreateNamedEntity:
2004-08-11 05:06:27 +00:00
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(CreateNamedEntity);
2004-07-28 03:14:07 +00:00
break;
case FM_MakeStatic:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(MakeStatic);
2004-07-28 03:14:07 +00:00
break;
case FM_EntIsOnFloor:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(EntIsOnFloor);
2004-07-28 03:14:07 +00:00
break;
case FM_DropToFloor:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(DropToFloor);
2004-07-28 03:14:07 +00:00
break;
case FM_WalkMove:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_FLOAT, FP_FLOAT, FP_CELL, FP_DONE);
ENGHOOK(WalkMove);
2004-07-28 03:14:07 +00:00
break;
case FM_SetOrigin:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetOrigin);
2004-07-28 03:14:07 +00:00
break;
case FM_EmitSound:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_STRING, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(EmitSound);
2004-07-28 03:14:07 +00:00
break;
case FM_EmitAmbientSound:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_STRING, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(EmitAmbientSound);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceLine:
2006-03-20 18:08:51 +00:00
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
2004-09-14 06:16:52 +00:00
ENGHOOK(TraceLine);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceToss:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
ENGHOOK(TraceToss);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceMonsterHull:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_ARRAY, FP_CELL, FP_CELL, FP_DONE);
ENGHOOK(TraceMonsterHull);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceHull:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
ENGHOOK(TraceHull);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceModel:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_CELL, FP_CELL, FP_DONE);
ENGHOOK(TraceModel);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceTexture:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE);
ENGHOOK(TraceTexture);
2004-07-28 03:14:07 +00:00
break;
case FM_TraceSphere:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_CELL, FP_FLOAT, FP_CELL, FP_DONE);
ENGHOOK(TraceSphere);
2004-07-28 03:14:07 +00:00
break;
case FM_GetAimVector:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_FLOAT, FP_ARRAY, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(GetAimVector);
2004-07-28 03:14:07 +00:00
break;
case FM_ParticleEffect:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_ARRAY, FP_FLOAT, FP_FLOAT, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(ParticleEffect);
2004-07-28 03:14:07 +00:00
break;
case FM_LightStyle:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(LightStyle);
2004-07-28 03:14:07 +00:00
break;
case FM_DecalIndex:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(DecalIndex);
2004-07-28 03:14:07 +00:00
break;
case FM_PointContents:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(PointContents);
break;
case FM_MessageBegin:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_ARRAY, FP_CELL, FP_DONE);
ENGHOOK(MessageBegin);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
case FM_MessageEnd:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
ENGHOOK(MessageEnd);
break;
case FM_WriteByte:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(WriteByte);
break;
case FM_WriteChar:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(WriteChar);
break;
case FM_WriteShort:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(WriteShort);
break;
case FM_WriteLong:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(WriteLong);
break;
case FM_WriteAngle:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_FLOAT, FP_DONE);
ENGHOOK(WriteAngle);
break;
case FM_WriteCoord:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_FLOAT, FP_DONE);
ENGHOOK(WriteCoord);
break;
case FM_WriteString:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(WriteString);
break;
case FM_WriteEntity:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(WriteEntity);
break;
case FM_CVarGetFloat:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(CVarGetFloat);
break;
case FM_CVarGetString:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(CVarGetString);
break;
case FM_CVarSetFloat:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_FLOAT, FP_DONE);
ENGHOOK(CVarSetFloat);
break;
case FM_CVarSetString:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_STRING, FP_DONE);
ENGHOOK(CVarSetString);
break;
2004-07-28 03:14:07 +00:00
case FM_FreeEntPrivateData:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_DONE);
ENGHOOK(FreeEntPrivateData);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_SzFromIndex:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SzFromIndex);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_AllocString:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(AllocString);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_RegUserMsg:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(RegUserMsg);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_AnimationAutomove:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_FLOAT, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(AnimationAutomove);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_GetBonePosition:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE);
ENGHOOK(GetBonePosition);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_GetAttachment:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE);
ENGHOOK(GetAttachment);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_SetView:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetView);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_Time:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(Time);
2004-07-28 03:14:07 +00:00
break;
case FM_CrosshairAngle:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_FLOAT, FP_FLOAT, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(CrosshairAngle);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_FadeClientVolume:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(FadeClientVolume);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_SetClientMaxspeed:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_FLOAT, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetClientMaxspeed);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_CreateFakeClient:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(CreateFakeClient);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_RunPlayerMove:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_ARRAY, FP_FLOAT, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
ENGHOOK(RunPlayerMove);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_NumberOfEntities:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
ENGHOOK(NumberOfEntities);
2004-07-28 03:14:07 +00:00
break;
case FM_StaticDecal:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_ARRAY, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
ENGHOOK(StaticDecal);
2004-07-28 03:14:07 +00:00
break;
2004-08-11 05:06:27 +00:00
2004-07-28 03:14:07 +00:00
case FM_PrecacheGeneric:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
ENGHOOK(PrecacheGeneric);
2004-07-28 03:14:07 +00:00
break;
case FM_BuildSoundMsg:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_STRING, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_ARRAY, FP_CELL, FP_DONE);
ENGHOOK(BuildSoundMsg);
2004-07-28 03:14:07 +00:00
break;
case FM_GetPhysicsKeyValue:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(GetPhysicsKeyValue);
2004-07-28 03:14:07 +00:00
break;
case FM_SetPhysicsKeyValue:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetPhysicsKeyValue);
2004-07-28 03:14:07 +00:00
break;
case FM_GetPhysicsInfoString:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(GetPhysicsInfoString);
2004-07-28 03:14:07 +00:00
break;
case FM_PrecacheEvent:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(PrecacheEvent);
2004-07-28 03:14:07 +00:00
break;
case FM_PlaybackEvent:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_FLOAT, FP_ARRAY, FP_ARRAY, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(PlaybackEvent); // waaaaaaaaaah, its so damn big. :~(
2004-07-28 03:14:07 +00:00
break;
//EngFunc_CheckVisibility, //) ( const edict_t *entity, unsigned char *pset );
case FM_CheckVisibility:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_DONE);
ENGHOOK(CheckVisibility);
break;
2004-08-11 05:06:27 +00:00
case FM_GetCurrentPlayer:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
ENGHOOK(GetCurrentPlayer);
break;
//EngFunc_CanSkipPlayer, //) ( const edict_t *player );
case FM_CanSkipPlayer:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(CanSkipPlayer);
break;
//EngFunc_SetGroupMask, //) ( int mask, int op );
case FM_SetGroupMask:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetGroupMask);
break;
//EngFunc_GetClientListening, // bool (int iReceiver, int iSender)
case FM_Voice_GetClientListening:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(Voice_GetClientListening);
break;
//EngFunc_SetClientListening, // bool (int iReceiver, int iSender, bool Listen)
case FM_Voice_SetClientListening:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_DONE); // TODO: bool as cell 3rd arg?
2004-08-11 05:06:27 +00:00
ENGHOOK(Voice_SetClientListening);
break;
//EngFunc_InfoKeyValue, // char* ) (char *infobuffer, char *key);
case FM_InfoKeyValue:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(InfoKeyValue);
break;
//EngFunc_SetKeyValue, // void ) (char *infobuffer, char *key, char *value);
case FM_SetKeyValue:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_STRING, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetKeyValue);
break;
//EngFunc_SetClientKeyValue // void ) (int clientIndex, char *infobuffer, char *key, char *value);
case FM_SetClientKeyValue:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_STRING, FP_STRING, FP_DONE);
2004-08-11 05:06:27 +00:00
ENGHOOK(SetClientKeyValue);
break;
case FM_GetPlayerAuthId:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
ENGHOOK(GetPlayerAuthId);
break;
case FM_GetPlayerWONId:
fId = MF_RegisterSPForwardByName(amx,funcname,FP_CELL,FP_DONE);
ENGHOOK(GetPlayerWONId);
break;
2004-08-11 05:06:27 +00:00
case FM_IsMapValid:
fId = MF_RegisterSPForwardByName(amx, funcname,FP_STRING,FP_DONE);
ENGHOOK(IsMapValid);
break;
2004-10-03 07:04:08 +00:00
case FM_AlertMessage:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_DONE);
ENGHOOK(AlertMessage);
break;
/*
* Begin of DLLFuncs
*/
2004-08-11 05:06:27 +00:00
case FM_Spawn:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(Spawn);
break;
2004-08-11 05:06:27 +00:00
case FM_Think:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(Think);
break;
2004-08-11 05:06:27 +00:00
case FM_Use:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
DLLHOOK(Use);
break;
2004-08-11 05:06:27 +00:00
case FM_Touch:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
DLLHOOK(Touch);
break;
2004-08-11 05:06:27 +00:00
case FM_Blocked:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
DLLHOOK(Blocked);
break;
//TODO: Expand the structure (simple: just a bunch of strings and a float.)
2004-08-11 05:06:27 +00:00
//DLLFunc_KeyValue, // void ) ( edict_t *pentKeyvalue, KeyValueData *pkvd );
case FM_KeyValue:
//fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_STRING, FP_STRING, FP_CELL, FP_DONE);
2006-03-20 18:08:51 +00:00
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE);
DLLHOOK(KeyValue);
break;
//DLLFunc_SetAbsBox, // void ) ( edict_t *pent );
case FM_SetAbsBox:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(SetAbsBox);
break;
2004-07-28 03:14:07 +00:00
case FM_ClientConnect:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_STRING, FP_STRING, FP_STRING, FP_DONE); // TODO: 4th arg must be of set size 128?
2004-08-11 05:06:27 +00:00
DLLHOOK(ClientConnect);
break;
2004-08-11 05:06:27 +00:00
case FM_ClientDisconnect:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(ClientDisconnect);
break;
2004-08-11 05:06:27 +00:00
case FM_ClientKill:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(ClientKill);
break;
2004-08-11 05:06:27 +00:00
case FM_ClientPutInServer:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(ClientPutInServer);
break;
2004-08-11 05:06:27 +00:00
case FM_ClientCommand:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(ClientCommand);
break;
case FM_ServerDeactivate:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(ServerDeactivate);
break;
2004-07-28 03:14:07 +00:00
case FM_PlayerPreThink:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(PlayerPreThink);
break;
2004-08-11 05:06:27 +00:00
case FM_PlayerPostThink:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(PlayerPostThink);
break;
2004-07-28 03:14:07 +00:00
case FM_StartFrame:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(StartFrame);
break;
2004-08-11 05:06:27 +00:00
case FM_ParmsNewLevel:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(ParmsNewLevel);
break;
2004-08-11 05:06:27 +00:00
case FM_ParmsChangeLevel:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(ParmsChangeLevel);
break;
2004-07-28 03:14:07 +00:00
case FM_GetGameDescription:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(GetGameDescription);
break;
2004-07-28 03:14:07 +00:00
case FM_SpectatorConnect:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(SpectatorConnect);
break;
2004-08-11 05:06:27 +00:00
case FM_SpectatorDisconnect:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(SpectatorDisconnect);
break;
2004-08-11 05:06:27 +00:00
case FM_SpectatorThink:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(SpectatorThink);
break;
2004-07-28 03:14:07 +00:00
case FM_Sys_Error:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
DLLHOOK(Sys_Error);
break;
2004-07-28 03:14:07 +00:00
case FM_PM_FindTextureType:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE);
DLLHOOK(PM_FindTextureType);
break;
2004-08-11 05:06:27 +00:00
case FM_RegisterEncoders:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(RegisterEncoders);
break;
2004-07-28 03:14:07 +00:00
case FM_CreateInstancedBaselines:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_DONE);
DLLHOOK(CreateInstancedBaselines);
break;
2004-08-11 05:06:27 +00:00
case FM_AllowLagCompensation:
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;
2006-03-30 00:31:33 +00:00
case FM_ClientInfoChanged:
fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE);
DLLHOOK(ClientUserInfoChanged);
break;
#if 0
2004-07-28 03:14:07 +00:00
// I know this does not fit with DLLFUNC(), but I dont want another native just for it.
MetaFunc_CallGameEntity // bool (plid_t plid, const char *entStr,entvars_t *pev);
#endif
default:
fId = 0;
break;
}
if (!fId)
2006-02-03 03:27:03 +00:00
{
MF_LogError(amx, AMX_ERR_NATIVE, "Function not found (%d, %s)", func, funcname);
2004-07-28 03:14:07 +00:00
return 0;
2006-02-03 03:27:03 +00:00
}
2004-07-28 03:14:07 +00:00
if (post)
{
EnginePost[func].push_back(fId);
} else {
Engine[func].push_back(fId);
}
2006-02-03 03:27:03 +00:00
return fId;
2004-07-28 03:14:07 +00:00
}
static cell AMX_NATIVE_CALL get_orig_retval(AMX *amx, cell *params)
{
int paramCount = params[0] / sizeof(cell);
cell *refFloatRet = 0;
switch (paramCount)
{
case 0:
return origCellRet;
case 1:
refFloatRet = MF_GetAmxAddr(amx, params[1]);
*refFloatRet = amx_ftoc(origFloatRet);
return 1;
case 2:
MF_SetAmxString(amx, params[1], origStringRet, params[2]);
return 1;
default:
MF_LogError(amx, AMX_ERR_NATIVE, "Too many parameters passed");
return 0;
}
}
AMX_NATIVE_INFO forward_natives[] = {
{ "register_forward", register_forward },
2006-02-03 03:27:03 +00:00
{ "unregister_forward", unregister_forward },
2004-08-11 05:06:27 +00:00
{ "forward_return", fm_return },
{ "get_orig_retval", get_orig_retval },
{ NULL, NULL }
2004-09-14 18:02:32 +00:00
};