#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
 
#define PLUGIN_NAME	"Reload Animation Fix"
#define PLUGIN_VERSION	"1.1"
#define PLUGIN_AUTHOR	"Numb"
 
#define SetPlayerBit(%1,%2)    ( %1 |=  ( 1 << ( %2 & 31 ) ) )
#define ClearPlayerBit(%1,%2)  ( %1 &= ~( 1 << ( %2 & 31 ) ) )
#define CheckPlayerBit(%1,%2)  ( %1 &   ( 1 << ( %2 & 31 ) ) )
 
#define m_pPlayer 41
#define m_iId 43
#define m_flTimeWeaponIdle 48
#define m_fInReload 54
#define m_fInSpecialReload 55
#define m_fWeaponState 74
#define WEAPONSTATE_USP_SILENCED (1<<0)
#define WEAPONSTATE_M4A1_SILENCED (1<<2)
 
#define m_pActiveItem 373
#define m_iUserPrefs 510
#define USERPREFS_HAS_SHIELD (1<<24)
 
 
new g_iMaxPlayers;
new g_iAlive;
 
public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
 
	RegisterHam(Ham_Spawn,  "player", "Ham_Spawn_player_Post",  1);
	RegisterHam(Ham_Killed, "player", "Ham_Killed_player_Post", 1);
 
	RegisterHam(Ham_Item_PostFrame, "weapon_glock18",      "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_usp",          "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_deagle",       "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_p228",         "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_elite",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_fiveseven",    "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_mp5navy",      "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_mac10",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_tmp",          "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_p90",          "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_ump45",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_galil",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_famas",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_ak47",         "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_m4a1",         "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_sg552",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_aug",          "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_g3sg1",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_sg550",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_scout",        "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_awp",          "Ham_Item_PostFrame_Pre", 0);
	RegisterHam(Ham_Item_PostFrame, "weapon_m249",         "Ham_Item_PostFrame_Pre", 0);
 
	RegisterHam(Ham_Weapon_WeaponIdle, "weapon_deagle", "Ham_WeaponIdle_deagle_Pre", 0);
 
	RegisterHam(Ham_Item_Deploy, "weapon_m3",     "Ham_Item_Deploy_Pre", 0);
	RegisterHam(Ham_Item_Deploy, "weapon_xm1014", "Ham_Item_Deploy_Pre", 0);
 
	g_iMaxPlayers = clamp(get_maxplayers(), 1, 32);
}
 
public plugin_unpause()
{
	g_iAlive = 0;
 
	new iPlayers[32], iPlayerNum;
	get_players(iPlayers, iPlayerNum, "a");
 
	for( new iPlayer; iPlayer<iPlayerNum; iPlayer++ )
		SetPlayerBit(g_iAlive, iPlayers[iPlayer]);
}
 
public client_disconnect(iPlrId)
	ClearPlayerBit(g_iAlive, iPlrId);
 
public Ham_Spawn_player_Post(iPlrId)
{
	if( is_user_alive(iPlrId) )
		SetPlayerBit(g_iAlive, iPlrId);
	else
		ClearPlayerBit(g_iAlive, iPlrId);
}
 
public Ham_Killed_player_Post(iPlrId, iAttackerId, iShouldGib)
{
	if( is_user_alive(iPlrId) )
		SetPlayerBit(g_iAlive, iPlrId);
	else
		ClearPlayerBit(g_iAlive, iPlrId);
}
 
public Ham_Item_PostFrame_Pre(iEnt)
{
	if( !get_pdata_int(iEnt, m_fInReload, 4) )
	{
		static s_iOwner;
		s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
 
		if( 0<s_iOwner<=g_iMaxPlayers )
		{
			if( CheckPlayerBit(g_iAlive, s_iOwner) )
			{
				if( iEnt==get_pdata_cbase(s_iOwner, m_pActiveItem, 5) )
				{
					switch( get_pdata_int(iEnt, m_iId, 4) )
					{
						case CSW_GLOCK18:
						{
							if( pev(s_iOwner, pev_weaponanim)==((get_pdata_int(s_iOwner, m_iUserPrefs, 5)&USERPREFS_HAS_SHIELD)?4:7) )
								set_pev(s_iOwner, pev_weaponanim, 0);
						}
						case CSW_USP:
						{
							if( get_pdata_int(s_iOwner, m_iUserPrefs, 5)&USERPREFS_HAS_SHIELD )
							{
								if( pev(s_iOwner, pev_weaponanim)==4 )
									set_pev(s_iOwner, pev_weaponanim, 0);
							}
							else if( get_pdata_int(iEnt, m_fWeaponState, 4)&WEAPONSTATE_USP_SILENCED )
							{
								if( pev(s_iOwner, pev_weaponanim)==5 )
									set_pev(s_iOwner, pev_weaponanim, 0);
							}
							else
							{
								if( pev(s_iOwner, pev_weaponanim)==13 )
									set_pev(s_iOwner, pev_weaponanim, 8);
							}
						}
						case CSW_DEAGLE, CSW_FIVESEVEN, CSW_AWP:
						{
							if( pev(s_iOwner, pev_weaponanim)==4 ) //((get_pdata_int(s_iOwner, m_iUserPrefs, 5)&USERPREFS_HAS_SHIELD)?4:4) )
								set_pev(s_iOwner, pev_weaponanim, 0);
						}
						case CSW_P228:
						{
							if( pev(s_iOwner, pev_weaponanim)==((get_pdata_int(s_iOwner, m_iUserPrefs, 5)&USERPREFS_HAS_SHIELD)?4:5) )
								set_pev(s_iOwner, pev_weaponanim, 0);
						}
						case CSW_ELITE:
						{
							if( pev(s_iOwner, pev_weaponanim)==14 )
								set_pev(s_iOwner, pev_weaponanim, 0);
						}
						//case CSW_M3, CSW_XM1014: // there's no need to fix reload issue for this 2 weapons, cause animation #3 is impossible
						//{			   // before start of the reload.
						//	if( 3<=pev(s_iOwner, pev_weaponanim)<=5 ) // 3 for insert, 4 for stop, 5 for start
						//		set_pev(s_iOwner, pev_weaponanim, 0);
						//}
						case CSW_MP5NAVY, CSW_MAC10, CSW_TMP, CSW_P90, CSW_UMP45, CSW_GALIL, CSW_FAMAS, CSW_AK47, CSW_SG552, CSW_AUG:
						{
							if( pev(s_iOwner, pev_weaponanim)==1 )
								set_pev(s_iOwner, pev_weaponanim, 0);
						}
						case CSW_M4A1:
						{
							if( get_pdata_int(iEnt, m_fWeaponState, 4)&WEAPONSTATE_M4A1_SILENCED )
							{
								if( pev(s_iOwner, pev_weaponanim)==4 )
									set_pev(s_iOwner, pev_weaponanim, 0);
							}
							else
							{
								if( pev(s_iOwner, pev_weaponanim)==11 )
									set_pev(s_iOwner, pev_weaponanim, 7);
							}
						}
						case CSW_G3SG1, CSW_SG550, CSW_SCOUT, CSW_M249:
						{
							if( pev(s_iOwner, pev_weaponanim)==3 )
								set_pev(s_iOwner, pev_weaponanim, 0);
						}
					}
				}
			}
		}
	}
}
 
public Ham_WeaponIdle_deagle_Pre(iEnt)
{
	if( get_pdata_float(iEnt, m_flTimeWeaponIdle, 4)<=0.0 )
	{
		static s_iOwner;
		s_iOwner = get_pdata_cbase(iEnt, m_pPlayer, 4);
 
		if( 0<s_iOwner<=g_iMaxPlayers )
		{
			if( CheckPlayerBit(g_iAlive, s_iOwner) )
			{
				//if( pev(s_iOwner, pev_weaponanim)==5 ) // fix deploy animation glitch for deagle when spectating
				set_pev(s_iOwner, pev_weaponanim, 0);
			}
		}
	}
}
 
public Ham_Item_Deploy_Pre(iEnt)
	set_pdata_int(iEnt, m_fInSpecialReload, 0, 4);