mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2025-03-27 04:49:06 +03:00
Revert GetWeaponData implementation.
This commit is contained in:
parent
6ef40779e7
commit
c8abe26ec5
@ -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];
|
||||
|
@ -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
|
||||
|
||||
|
@ -297,6 +297,7 @@ void FMH_ServerDeactivate_Post()
|
||||
RESETN(OnFreeEntPrivateData);
|
||||
RESETN(GameShutdown);
|
||||
RESETN(ShouldCollide);
|
||||
RESETD(GetWeaponData);
|
||||
|
||||
g_pFunctionTable->pfnServerActivate = ServerActivate;
|
||||
|
||||
|
@ -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[];
|
||||
|
||||
|
@ -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},
|
||||
};
|
||||
|
||||
|
@ -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.
|
||||
|
@ -180,6 +180,7 @@ enum {
|
||||
FM_GetInfoKeyBuffer,
|
||||
FM_ClientPrintf,
|
||||
FM_ServerPrint,
|
||||
FM_GetWeaponData,
|
||||
FM_LAST_DONT_USE_ME
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user