Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert GetWeaponData implementation. #847

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions modules/fakemeta/dllfunc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
4 changes: 2 additions & 2 deletions modules/fakemeta/dllfunc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

1 change: 1 addition & 0 deletions modules/fakemeta/fakemeta_amxx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ void FMH_ServerDeactivate_Post()
RESETN(OnFreeEntPrivateData);
RESETN(GameShutdown);
RESETN(ShouldCollide);
RESETD(GetWeaponData);

g_pFunctionTable->pfnServerActivate = ServerActivate;

Expand Down
28 changes: 28 additions & 0 deletions modules/fakemeta/fm_tr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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[];

Expand Down
195 changes: 195 additions & 0 deletions modules/fakemeta/fm_tr2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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},
};

20 changes: 20 additions & 0 deletions modules/fakemeta/forward.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions modules/fakemeta/forward.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ enum {
FM_GetInfoKeyBuffer,
FM_ClientPrintf,
FM_ServerPrint,
FM_GetWeaponData,
FM_LAST_DONT_USE_ME
};

Expand Down
7 changes: 7 additions & 0 deletions plugins/include/fakemeta.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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 or array
// 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
Expand Down
Loading