Revert GetWeaponData implementation.

This commit is contained in:
shel 2020-03-11 21:09:08 +03:00
parent 6ef40779e7
commit c8abe26ec5
9 changed files with 332 additions and 4 deletions

View File

@ -311,6 +311,22 @@ static cell AMX_NATIVE_CALL dllfunc(AMX *amx,cell *params)
pset = reinterpret_cast<unsigned char *>(*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<weapon_data_t *>(*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];

View File

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

View File

@ -297,6 +297,7 @@ void FMH_ServerDeactivate_Post()
RESETN(OnFreeEntPrivateData);
RESETN(GameShutdown);
RESETN(ShouldCollide);
RESETD(GetWeaponData);
g_pFunctionTable->pfnServerActivate = ServerActivate;

View File

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

View File

@ -25,6 +25,7 @@ ke::Vector<KVD_Wrapper *>g_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<weapon_data_t *>(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<weapon_data_t *>(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<TraceResult *> 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},
};

View File

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

View File

@ -180,6 +180,7 @@ enum {
FM_GetInfoKeyBuffer,
FM_ClientPrintf,
FM_ServerPrint,
FM_GetWeaponData,
FM_LAST_DONT_USE_ME
};

View File

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

View File

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