diff --git a/modules/fakemeta/dllfunc.cpp b/modules/fakemeta/dllfunc.cpp index a932accc..3de9a2af 100644 --- a/modules/fakemeta/dllfunc.cpp +++ b/modules/fakemeta/dllfunc.cpp @@ -311,6 +311,22 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params) pset = reinterpret_cast(*cRet); return gpGamedllFuncs->dllapi_table->pfnAddToFullPack(es, iparam1, TypeConversion.id_to_edict(index), TypeConversion.id_to_edict(indexb), iparam2, iparam3, pset); + case DLLFunc_GetWeaponData: // int ) (struct edict_s *player, struct weapon_data_s *info); + cRet = MF_GetAmxAddr(amx, params[2]); + index = cRet[0]; + CHECK_ENTITY(index); + weapon_data_t *wd; + + if ((params[0] / sizeof(cell)) == 3){ + cell *ptr = MF_GetAmxAddr(amx, params[3]); + if (*ptr == 0) + wd = &g_wd_glb; + else + wd = reinterpret_cast(*ptr); + } + else + wd = &g_wd_glb; + return gpGamedllFuncs->dllapi_table->pfnGetWeaponData(TypeConversion.id_to_edict(index), wd); case DLLFunc_CmdStart: // void ) (const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed) cRet = MF_GetAmxAddr(amx, params[2]); index = cRet[0]; diff --git a/modules/fakemeta/dllfunc.h b/modules/fakemeta/dllfunc.h index 268c94ab..566eea8e 100644 --- a/modules/fakemeta/dllfunc.h +++ b/modules/fakemeta/dllfunc.h @@ -73,8 +73,8 @@ enum // 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_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); + 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); + DLLFunc_GetWeaponData // int ) (struct edict_s *player, struct weapon_data_s *info); }; - #endif //_INCLUDE_DLLFUNC_H diff --git a/modules/fakemeta/fakemeta_amxx.cpp b/modules/fakemeta/fakemeta_amxx.cpp index ab8130f4..f14a9b75 100644 --- a/modules/fakemeta/fakemeta_amxx.cpp +++ b/modules/fakemeta/fakemeta_amxx.cpp @@ -297,6 +297,7 @@ void FMH_ServerDeactivate_Post() RESETN(OnFreeEntPrivateData); RESETN(GameShutdown); RESETN(ShouldCollide); + RESETD(GetWeaponData); g_pFunctionTable->pfnServerActivate = ServerActivate; diff --git a/modules/fakemeta/fm_tr.h b/modules/fakemeta/fm_tr.h index 11ee26ba..f56a2f31 100644 --- a/modules/fakemeta/fm_tr.h +++ b/modules/fakemeta/fm_tr.h @@ -26,6 +26,8 @@ extern entity_state_t g_es_glb; extern entity_state_t *g_es_hook; extern usercmd_t g_uc_glb; extern usercmd_t *g_uc_hook; +extern weapon_data_t g_wd_glb; +extern weapon_data_t *g_wd_hook; struct KVD_Wrapper { @@ -218,6 +220,32 @@ enum UserCmd UC_ImpactPosition }; +enum WeaponData +{ + WD_iId, + WD_iClip, + WD_flNextPrimaryAttack, + WD_flNextSecondaryAttack, + WD_flTimeWeaponIdle, + WD_fInReload, + WD_fInSpecialReload, + WD_flNextReload, + WD_flPumpTime, + WD_fReloadTime, + WD_fAimedDamage, + WD_fNextAimBonus, + WD_fInZoom, + WD_iWeaponState, + WD_iUser1, + WD_iUser2, + WD_iUser3, + WD_iUser4, + WD_flUser1, + WD_flUser2, + WD_flUser3, + WD_flUser4, +}; + extern AMX_NATIVE_INFO tr_Natives[]; extern AMX_NATIVE_INFO ext2_natives[]; diff --git a/modules/fakemeta/fm_tr2.cpp b/modules/fakemeta/fm_tr2.cpp index 83edbc7a..d89a87b7 100644 --- a/modules/fakemeta/fm_tr2.cpp +++ b/modules/fakemeta/fm_tr2.cpp @@ -25,6 +25,7 @@ ke::Vectorg_FreeKVDWs; clientdata_t g_cd_glb; entity_state_t g_es_glb; usercmd_t g_uc_glb; +weapon_data_t g_wd_glb; static cell AMX_NATIVE_CALL set_tr2(AMX *amx, cell *params) { @@ -1243,6 +1244,198 @@ static cell AMX_NATIVE_CALL set_uc(AMX *amx, cell *params) return 0; } + +static cell AMX_NATIVE_CALL get_wd(AMX *amx, cell *params) +{ + weapon_data_t *wd1; + if (params[1] == 0) + wd1 = &g_wd_glb; + else + wd1 = reinterpret_cast(params[1]); + + auto wd = &wd1[params[2]]; + cell *ptr; + + switch(params[3]) + { + case WD_iId: + return wd->m_iId; + case WD_iClip: + return wd->m_iClip; + + case WD_flNextPrimaryAttack: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_flNextPrimaryAttack); + return 1; + case WD_flNextSecondaryAttack: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_flNextSecondaryAttack); + return 1; + case WD_flTimeWeaponIdle: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_flTimeWeaponIdle); + return 1; + + case WD_fInReload: + return wd->m_fInReload; + case WD_fInSpecialReload: + return wd->m_fInSpecialReload; + case WD_flNextReload: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_flNextReload); + return 1; + case WD_flPumpTime: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_flPumpTime); + return 1; + case WD_fReloadTime: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_fReloadTime); + return 1; + + case WD_fAimedDamage: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_fAimedDamage); + return 1; + case WD_fNextAimBonus: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->m_fNextAimBonus); + return 1; + case WD_fInZoom: + return wd->m_fInZoom; + case WD_iWeaponState: + return wd->m_iWeaponState; + + case WD_iUser1: + return wd->iuser1; + case WD_iUser2: + return wd->iuser2; + case WD_iUser3: + return wd->iuser3; + case WD_iUser4: + return wd->iuser4; + case WD_flUser1: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->fuser1); + return 1; + case WD_flUser2: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->fuser2); + return 1; + case WD_flUser3: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->fuser3); + return 1; + case WD_flUser4: + ptr = MF_GetAmxAddr(amx, params[4]); + *ptr = amx_ftoc(wd->fuser4); + return 1; + + } + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid WeaponData member: %d", params[3]); + + return 0; +} + +static cell AMX_NATIVE_CALL set_wd(AMX *amx, cell *params) +{ + if (*params / sizeof(cell) < 4) + { + MF_LogError(amx, AMX_ERR_NATIVE, "No data passed"); + return 0; + } + + weapon_data_t *pWd; + if (params[1] == 0) + pWd = &g_wd_glb; + else + pWd = reinterpret_cast(params[1]); + + auto wd = &pWd[params[2]]; + cell *ptr = MF_GetAmxAddr(amx, params[4]); + + switch(params[3]) + { + case WD_iId: + wd->m_iId = *ptr; + return 1; + case WD_iClip: + wd->m_iClip = *ptr; + return 1; + + case WD_flNextPrimaryAttack: + wd->m_flNextPrimaryAttack = amx_ctof(*ptr); + return 1; + case WD_flNextSecondaryAttack: + wd->m_flNextSecondaryAttack = amx_ctof(*ptr); + return 1; + case WD_flTimeWeaponIdle: + wd->m_flTimeWeaponIdle = amx_ctof(*ptr); + return 1; + + case WD_fInReload: + wd->m_fInReload = *ptr; + return 1; + case WD_fInSpecialReload: + wd->m_fInSpecialReload = *ptr; + return 1; + case WD_flNextReload: + wd->m_flNextReload = amx_ctof(*ptr); + return 1; + case WD_flPumpTime: + wd->m_flPumpTime = amx_ctof(*ptr); + return 1; + case WD_fReloadTime: + wd->m_fReloadTime = amx_ctof(*ptr); + return 1; + + case WD_fAimedDamage: + wd->m_fAimedDamage = amx_ctof(*ptr); + return 1; + case WD_fNextAimBonus: + wd->m_fNextAimBonus = amx_ctof(*ptr); + return 1; + case WD_fInZoom: + wd->m_fInZoom = *ptr; + return 1; + case WD_iWeaponState: + wd->m_iWeaponState = *ptr; + return 1; + + case WD_iUser1: + wd->iuser1 = *ptr; + return 1; + case WD_iUser2: + wd->iuser2 = *ptr; + return 1; + case WD_iUser3: + wd->iuser3 = *ptr; + return 1; + case WD_iUser4: + wd->iuser4 = *ptr; + return 1; + + case WD_flUser1: + wd->fuser1 = amx_ctof(*ptr); + return 1; + case WD_flUser2: + wd->fuser2 = amx_ctof(*ptr); + return 1; + case WD_flUser3: + wd->fuser3 = amx_ctof(*ptr); + return 1; + case WD_flUser4: + wd->fuser4 = amx_ctof(*ptr); + return 1; + + } + + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid ClientData member: %d", params[3]); + + return 0; +} + + CStack g_FreeTRs; static cell AMX_NATIVE_CALL create_tr2(AMX *amx, cell *params) @@ -1329,6 +1522,8 @@ AMX_NATIVE_INFO ext2_natives[] = {"set_es", set_es}, {"get_uc", get_uc}, {"set_uc", set_uc}, + {"set_wd", set_wd}, + {"get_wd", get_wd}, {NULL, NULL}, }; diff --git a/modules/fakemeta/forward.cpp b/modules/fakemeta/forward.cpp index 9e3e6621..a6d336d8 100644 --- a/modules/fakemeta/forward.cpp +++ b/modules/fakemeta/forward.cpp @@ -28,6 +28,7 @@ KVD_Wrapper g_kvd_hook; clientdata_t *g_cd_hook; entity_state_t *g_es_hook; usercmd_t *g_uc_hook; +weapon_data_t *g_wd_hook; cell origCellRet; float origFloatRet; @@ -820,6 +821,21 @@ SIMPLE_VOID_HOOK_VOID(GameShutdown); SIMPLE_INT_HOOK_EDICT_EDICT(ShouldCollide); +int GetWeaponData(struct edict_s *player, struct weapon_data_s *info) +{ + g_wd_hook = info; + FM_ENG_HANDLE(FM_GetWeaponData, (Engine[FM_GetWeaponData].at(i), (cell)ENTINDEX(player), (cell)info)); + RETURN_META_VALUE(mswi(lastFmRes), (int)mlCellResult); +} + +int GetWeaponData_post(struct edict_s *player, struct weapon_data_s *info) +{ + g_wd_hook = info; + origCellRet = META_RESULT_ORIG_RET(int); + FM_ENG_HANDLE_POST(FM_GetWeaponData, (EnginePost[FM_GetWeaponData].at(i), (cell)ENTINDEX(player), (cell)info)); + RETURN_META_VALUE(MRES_IGNORED, (int)mlCellResult); +} + static cell AMX_NATIVE_CALL unregister_forward(AMX *amx, cell *params) { int func = params[1]; @@ -1492,6 +1508,10 @@ static cell AMX_NATIVE_CALL register_forward(AMX *amx, cell *params) fId = MF_RegisterSPForwardByName(amx, funcname, FP_STRING, FP_DONE); ENGHOOK(ServerPrint); break; + case FM_GetWeaponData: + fId = MF_RegisterSPForwardByName(amx, funcname, FP_CELL, FP_CELL, FP_DONE); + DLLHOOK(GetWeaponData); + break; #if 0 // I know this does not fit with DLLFUNC(), but I dont want another native just for it. diff --git a/modules/fakemeta/forward.h b/modules/fakemeta/forward.h index 1194fb9f..0573eae9 100644 --- a/modules/fakemeta/forward.h +++ b/modules/fakemeta/forward.h @@ -180,6 +180,7 @@ enum { FM_GetInfoKeyBuffer, FM_ClientPrintf, FM_ServerPrint, + FM_GetWeaponData, FM_LAST_DONT_USE_ME }; diff --git a/plugins/include/fakemeta.inc b/plugins/include/fakemeta.inc index 35171a84..89943200 100755 --- a/plugins/include/fakemeta.inc +++ b/plugins/include/fakemeta.inc @@ -498,6 +498,13 @@ native free_kvd(kvd_handle); native get_cd(cd_handle, ClientData:member, any:...); native set_cd(cd_handle, ClientData:member, any:...); +// These functions are used with the weapon_data data structure (FM_GetWeaponData) +// Get: 0 extra params - Return integer; 1 extra param - by ref float or vector; 2 extra params - string and length +// Set: Use anything +// Use 0 for cd_handle to specify the global weapon_data handle +native get_wd(wd_handler, index, WeaponData:member, any:...); +native set_wd(wd_handler, index, WeaponData:member, any:...); + // These functions are used with the entity_state data structure (FM_AddToFullPack) // Get: 0 extra params - Return integer; 1 extra param - by ref float or vector or array // Set: Use anything diff --git a/plugins/include/fakemeta_const.inc b/plugins/include/fakemeta_const.inc index eba34b6b..afbcd842 100755 --- a/plugins/include/fakemeta_const.inc +++ b/plugins/include/fakemeta_const.inc @@ -190,7 +190,8 @@ enum // 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_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); + 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); + DLLFunc_GetWeaponData // int ) (struct edict_s *player, struct weapon_data_s *info); }; enum { @@ -550,7 +551,8 @@ enum { FM_ClientPrintf, // LATE ADDITIONS (v1.80) - FM_ServerPrint + FM_ServerPrint, + FM_GetWeaponData }; enum TraceResult @@ -744,6 +746,64 @@ enum UserCmd UC_ImpactPosition // float array[3] }; +enum WeaponData +{ + WD_iId, + WD_iClip, + WD_flNextPrimaryAttack, + WD_flNextSecondaryAttack, + WD_flTimeWeaponIdle, + WD_fInReload, + WD_fInSpecialReload, + WD_flNextReload, + WD_flPumpTime, + WD_fReloadTime, + WD_fAimedDamage, + WD_fNextAimBonus, + WD_fInZoom, + WD_iWeaponState, + WD_iUser1, + WD_iUser2, + WD_iUser3, + WD_iUser4, + WD_flUser1, + WD_flUser2, + WD_flUser3, + WD_flUser4, +}; + +/* Info about weapons player might have in his/her possession +typedef struct weapon_data_s +{ + int m_iId; + int m_iClip; + + float m_flNextPrimaryAttack; + float m_flNextSecondaryAttack; + float m_flTimeWeaponIdle; + + int m_fInReload; + int m_fInSpecialReload; + float m_flNextReload; + float m_flPumpTime; + float m_fReloadTime; + + float m_fAimedDamage; + float m_fNextAimBonus; + int m_fInZoom; + int m_iWeaponState; + + int iuser1; + int iuser2; + int iuser3; + int iuser4; + float fuser1; + float fuser2; + float fuser3; + float fuser4; +} weapon_data_t; +*/ + enum AlertType { at_notice = 0,