hello,
i'm trying to make a new weapon for a zombie mode
anyways, i have some problems in creating the weapon. the weapon is on deagle, it's shooting like a xm1014 and it's reloading like a m3
sounds crazy, right?
the problem is:
- why i can attack in reload anim, even if i set flNextPrimaryAttack in reload function
- why sometime the attack anim it's not playing?
- why i can overlap reload action? like reloading when it's already reloading
hams:
Code:
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_NAME, "Weapon_PrimaryAttack_Pre")
RegisterHam(Ham_Weapon_Reload, WEAPON_NAME, "Weapon_Reload_Pre")
RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_NAME, "Weapon_Idle_Pre")
here, in reload pre hook i'm checking the flNextPrimaryAttack expecting that the user it's shooting if the var it s higher than 0.0.
laso, i'm setting m_flNextReload, but i still can reload
Code:
public Weapon_Reload_Pre(const iWeaponEnt)
{
if(GetWeapCustom(iWeaponEnt) != WEAPON_DATA)
{
return HAM_IGNORED
}
new iClip, iAmmo, iOwner = GetWeapOwner(iWeaponEnt)
if(get_member(iWeaponEnt, m_Weapon_flNextPrimaryAttack) > 0.0 ||
((iClip = get_member(iWeaponEnt, m_Weapon_iClip)) == WEAPON_MAX_CLIP) ||
((iAmmo = get_member(iOwner, m_rgAmmo, WEAPON_AMMO_ID)) <= 0)
)
{
return HAM_SUPERCEDE
}
new m_flInSpecialReload = get_member(iWeaponEnt, m_Weapon_fInSpecialReload)
switch(m_flInSpecialReload)
{
case 0:
{
rg_set_animation(iOwner, PLAYER_RELOAD)
SendWeaponAnim(ANIM_START_RELOAD, iWeaponEnt, iOwner)
set_member(iWeaponEnt, m_Weapon_flTimeWeaponIdle, 0.53)
set_member(iWeaponEnt, m_Weapon_flNextPrimaryAttack, 0.53)
set_member(iWeaponEnt, m_Weapon_flNextSecondaryAttack, 0.53)
client_print(iOwner, print_chat, "Starting anim")
m_flInSpecialReload = 1
}
case 1:
{
if(Float:get_member(iWeaponEnt, m_Weapon_flTimeWeaponIdle) >= 0.0)
{
return HAM_SUPERCEDE
}
SendWeaponAnim(random_num(ANIM_INSERT1, ANIM_INSERT2), iWeaponEnt, iOwner)
client_print(iOwner, print_chat, "Inserting bullet anim")
set_member(iWeaponEnt, m_Weapon_flTimeWeaponIdle, 0.46)
set_member(iWeaponEnt, m_Weapon_flNextReload, 0.46)
m_flInSpecialReload = 2
}
case 2:
{
set_member(iWeaponEnt, m_Weapon_iClip, ++iClip)
set_member(iOwner, m_rgAmmo, --iAmmo, WEAPON_AMMO_ID)
client_print(iOwner, print_chat, "Increase clip size")
SendWeaponAnim(ANIM_AFTER_RELOAD, iWeaponEnt, iOwner)
m_flInSpecialReload = 0
}
}
set_member(iWeaponEnt, m_Weapon_fInSpecialReload, m_flInSpecialReload)
return HAM_SUPERCEDE
}
Code:
public Weapon_PrimaryAttack_Pre(const iWeaponEnt)
{
if(GetWeapCustom(iWeaponEnt) != WEAPON_DATA)
{
return HAM_IGNORED
}
if(get_member(iWeaponEnt, m_Weapon_flNextPrimaryAttack) > 0.0)
{
return HAM_SUPERCEDE
}
new iOwner = GetWeapOwner(iWeaponEnt)
if(get_entvar(iOwner, var_waterlevel) == 3)
{
set_member(iWeaponEnt, m_Weapon_flNextPrimaryAttack, 0.3)
return HAM_SUPERCEDE
}
rg_set_animation(iOwner, PLAYER_ATTACK1)
SendWeaponAnim(random_num(ANIM_SHOOT1, ANIM_SHOOT2), iWeaponEnt, iOwner)
rh_emit_sound2(iOwner, 0, CHAN_WEAPON, WEAPON_FIRE_SOUND)
set_member(iOwner, m_iWeaponVolume, LOUD_GUN_VOLUME)
set_member(iOwner, m_iWeaponFlash, BRIGHT_GUN_FLASH)
set_entvar(iOwner, var_effects, get_entvar(iOwner, var_effects) | EF_MUZZLEFLASH)
set_member(iWeaponEnt, m_Weapon_flNextPrimaryAttack, 0.90)
set_member(iWeaponEnt, m_Weapon_flTimeWeaponIdle, 0.90)
set_member(iWeaponEnt, m_Weapon_iClip, get_member(iWeaponEnt, m_Weapon_iClip) - 1)
client_print(iOwner, print_chat, "shooting %f", get_member(iWeaponEnt, m_Weapon_flNextPrimaryAttack))
return HAM_SUPERCEDE
}
stock i'm using for sending weap anim message
credits to hamlet
Code:
stock SendWeaponAnim(animation, weapon, owner)
{
set_entvar(owner, var_weaponanim, animation);
if (ExecuteHam(Ham_Weapon_UseDecrement, weapon) && engfunc(EngFunc_CanSkipPlayer, owner))
{
return;
}
message_begin(MSG_ONE, SVC_WEAPONANIM, .player = owner);
write_byte(animation);
write_byte(get_entvar(weapon, var_body));
message_end();
}
any solutions? thanks in advance