diff --git a/dlls/fakemeta/dllfunc.cpp b/dlls/fakemeta/dllfunc.cpp index 0f0fa91c..3a4aac66 100755 --- a/dlls/fakemeta/dllfunc.cpp +++ b/dlls/fakemeta/dllfunc.cpp @@ -15,6 +15,7 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) int iparam1; int iparam2; int iparam3; + entity_state_t *es; int len; cell *cRet; type = params[1]; @@ -216,7 +217,7 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) return iparam1; // Create baselines for certain "unplaced" items. - case DLLFunc_CreateInstancedBaselines: // void ) ( void ); + case DLLFunc_CreateInstancedBaselines: // void ) ( void ); gpGamedllFuncs->dllapi_table->pfnCreateInstancedBaselines(); return 1; @@ -261,8 +262,6 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) return 1; case DLLFunc_AddToFullPack: // int ) (struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet) - entity_state_t *es; - cRet = MF_GetAmxAddr(amx, params[2]); if (*cRet == 0) @@ -324,6 +323,41 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) gpGamedllFuncs->dllapi_table->pfnCmdEnd(INDEXENT2(index)); + return 1; + + case DLLFunc_CreateBaseline: // void ) (int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs); + cRet = MF_GetAmxAddr(amx, params[2]); + iparam1 = cRet[0]; + cRet = MF_GetAmxAddr(amx, params[3]); + iparam2 = cRet[0]; + + cRet = MF_GetAmxAddr(amx, params[4]); + + if (*cRet == 0) + es = &g_es_glb; + else + es = reinterpret_cast(*cRet); + + cRet = MF_GetAmxAddr(amx, params[5]); + index = cRet[0]; + + cRet = MF_GetAmxAddr(amx, params[6]); + iparam3 = cRet[0]; + + CHECK_ENTITY(index); + + cRet = MF_GetAmxAddr(amx, params[7]); + Vec1.x = amx_ctof(cRet[0]); + Vec1.y = amx_ctof(cRet[1]); + Vec1.z = amx_ctof(cRet[2]); + + cRet = MF_GetAmxAddr(amx, params[8]); + Vec2.x = amx_ctof(cRet[0]); + Vec2.y = amx_ctof(cRet[1]); + Vec2.z = amx_ctof(cRet[2]); + + gpGamedllFuncs->dllapi_table->pfnCreateBaseline(iparam1, iparam2, es, INDEXENT2(index), iparam3, Vec1, Vec2); + return 1; default: MF_LogError(amx, AMX_ERR_NATIVE, "Unknown dllfunc entry %d", type); diff --git a/dlls/fakemeta/dllfunc.h b/dlls/fakemeta/dllfunc.h index fd33cd0a..21c8d2e1 100755 --- a/dlls/fakemeta/dllfunc.h +++ b/dlls/fakemeta/dllfunc.h @@ -59,7 +59,8 @@ enum DLLFunc_AddToFullPack, // int ) (struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet); // You can pass in 0 for global usercmd handle or another usercmd handle here DLLFunc_CmdStart, // void ) (const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed); - DLLFunc_CmdEnd // void ) (const edict_t *player); + DLLFunc_CmdEnd, // void ) (const edict_t *player); + DLLFunc_CreateBaseline // void ) (int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs); }; #endif //_INCLUDE_DLLFUNC_H diff --git a/dlls/fakemeta/engfunc.cpp b/dlls/fakemeta/engfunc.cpp index 1ea1de1b..0ad9b219 100755 --- a/dlls/fakemeta/engfunc.cpp +++ b/dlls/fakemeta/engfunc.cpp @@ -1017,13 +1017,27 @@ static cell AMX_NATIVE_CALL engfunc(AMX *amx, cell *params) return 1; case EngFunc_SetClientKeyValue: // void ) (int clientIndex, char *infobuffer, char *key, char *value); - cRet = MF_GetAmxAddr(amx,params[2]); + cRet = MF_GetAmxAddr(amx, params[2]); index = cRet[0]; CHECK_ENTITY(index); - temp = MF_GetAmxString(amx,params[3],0,&len); - temp2 = MF_GetAmxString(amx,params[4],1,&len); + temp = MF_GetAmxString(amx, params[3], 0, &len); + temp2 = MF_GetAmxString(amx, params[4], 1, &len); (*g_engfuncs.pfnSetClientKeyValue)(index,(*g_engfuncs.pfnGetInfoKeyBuffer)(INDEXENT2(index)),temp,temp2); return 1; + case EngFunc_CreateInstancedBaseline: // int ) (int classname, struct entity_state_s *baseline); + cRet = MF_GetAmxAddr(amx, params[2]); + iparam1 = cRet[0]; + + entity_state_t *es; + + cRet = MF_GetAmxAddr(amx, params[3]); + + if (*cRet == 0) + es = &g_es_glb; + else + es = reinterpret_cast(*cRet); + + return (*g_engfuncs.pfnCreateInstancedBaseline)(iparam1, es); default: MF_LogError(amx, AMX_ERR_NATIVE, "Unknown engfunc type %d", type); return 0; diff --git a/dlls/fakemeta/engfunc.h b/dlls/fakemeta/engfunc.h index cd832395..beaeb168 100755 --- a/dlls/fakemeta/engfunc.h +++ b/dlls/fakemeta/engfunc.h @@ -66,9 +66,9 @@ enum { EngFunc_GetPhysicsInfoString, // const char *) (const edict_t *pClient); EngFunc_PrecacheEvent, // unsigned short) (int type, const char*psz); EngFunc_PlaybackEvent, // void ) (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); - EngFunc_CheckVisibility, // int ) (const edict_t *entity, unsigned char *pset); - EngFunc_GetCurrentPlayer, // int ) ( void ); - EngFunc_CanSkipPlayer, // int ) (const edict_t *player); + EngFunc_CheckVisibility, // int ) (const edict_t *entity, unsigned char *pset); + EngFunc_GetCurrentPlayer, // int ) ( void ); + EngFunc_CanSkipPlayer, // int ) (const edict_t *player); EngFunc_SetGroupMask, // void ) (int mask, int op); EngFunc_GetClientListening, // bool ) (int iReceiver, int iSender) EngFunc_SetClientListening, // bool ) (int iReceiver, int iSender, bool Listen) @@ -77,7 +77,8 @@ enum { EngFunc_WriteAngle, // void ) (float flValue) EngFunc_InfoKeyValue, // char*) (char *infobuffer, char *key); EngFunc_SetKeyValue, // void ) (char *infobuffer, char *key, char *value); - EngFunc_SetClientKeyValue // void ) (int clientIndex, char *infobuffer, char *key, char *value); + EngFunc_SetClientKeyValue, // void ) (int clientIndex, char *infobuffer, char *key, char *value); + EngFunc_CreateInstancedBaseline // int ) (int classname, struct entity_state_s *baseline); }; #endif //_ENGFUNC_INCLUDE_H diff --git a/dlls/fakemeta/fakemeta_amxx.cpp b/dlls/fakemeta/fakemeta_amxx.cpp index 117a697e..bd74f37e 100755 --- a/dlls/fakemeta/fakemeta_amxx.cpp +++ b/dlls/fakemeta/fakemeta_amxx.cpp @@ -139,6 +139,7 @@ void FMH_ServerDeactivate() RESETE(CVarSetFloat); RESETE(CVarSetString); RESETE(AlertMessage); + RESETE(CreateInstancedBaseline); RESETD(Spawn); RESETD(Think); @@ -172,6 +173,7 @@ void FMH_ServerDeactivate() RESETD(AddToFullPack); RESETD(CmdStart); RESETD(CmdEnd); + RESETD(CreateBaseline); RESETN(OnFreeEntPrivateData); RESETN(GameShutdown); diff --git a/dlls/fakemeta/forward.cpp b/dlls/fakemeta/forward.cpp index 51146ef5..5cc2fbd9 100755 --- a/dlls/fakemeta/forward.cpp +++ b/dlls/fakemeta/forward.cpp @@ -610,6 +610,21 @@ SIMPLE_UINT_HOOK_EDICT(GetPlayerWONId); SIMPLE_INT_HOOK_STRING(IsMapValid); +int CreateInstancedBaseline(int classname, struct entity_state_s *baseline) +{ + g_es_hook = baseline; + FM_ENG_HANDLE(FM_CreateInstancedBaseline, (Engine[FM_CreateInstancedBaseline].at(i), (cell)classname, (cell)baseline)); + RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult); +} + +int CreateInstancedBaseline_post(int classname, struct entity_state_s *baseline) +{ + g_es_hook = baseline; + origCellRet = META_RESULT_ORIG_RET(int); + FM_ENG_HANDLE_POST(FM_CreateInstancedBaseline, (EnginePost[FM_CreateInstancedBaseline].at(i), (cell)classname, (cell)baseline)); + RETURN_META_VALUE(MRES_IGNORED, (int)mlCellResult); +} + /* * Beginning of Engine->Game DLL hooks */ @@ -735,6 +750,24 @@ void CmdStart_post(const edict_t *player, const struct usercmd_s *cmd, unsigned RETURN_META(MRES_IGNORED); } +void CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs) +{ + g_es_hook = baseline; + PREPARE_VECTOR(player_mins); + PREPARE_VECTOR(player_maxs); + FM_ENG_HANDLE(FM_CreateBaseline, (Engine[FM_CreateBaseline].at(i), (cell)player, (cell)eindex, (cell)baseline, (cell)ENTINDEX(entity), (cell)playermodelindex, p_player_mins, p_player_maxs)); + RETURN_META(mswi(lastFmRes)); +} + +void 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) +{ + g_es_hook = baseline; + PREPARE_VECTOR(player_mins); + PREPARE_VECTOR(player_maxs); + FM_ENG_HANDLE_POST(FM_CreateBaseline, (EnginePost[FM_CreateBaseline].at(i), (cell)player, (cell)eindex, (cell)baseline, (cell)ENTINDEX(entity), (cell)playermodelindex, p_player_mins, p_player_maxs)); + RETURN_META(MRES_IGNORED); +} + // pfnCmdEnd SIMPLE_VOID_HOOK_CONSTEDICT(CmdEnd); @@ -1399,6 +1432,14 @@ static cell AMX_NATIVE_CALL register_forward(AMX *amx, cell *params) fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_DONE); DLLHOOK(CmdEnd); break; + case FM_CreateInstancedBaseline: + fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE); + ENGHOOK(CreateInstancedBaseline); + break; + case FM_CreateBaseline: + fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE); + DLLHOOK(CreateBaseline); + 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 cc4164c8..c5ac2941 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 FM_LAST_DONT_USE_ME // 127 +#define ENGFUNC_NUM FM_LAST_DONT_USE_ME // 129 #define FMV_STRING 1 #define FMV_FLOAT 2 @@ -160,6 +160,8 @@ enum { FM_AddToFullPack, FM_CmdStart, FM_CmdEnd, + FM_CreateInstancedBaseline, + FM_CreateBaseline, FM_LAST_DONT_USE_ME };