/* DOD STOCKS
   Created by the Day of Defeat AMXX Community
   www.dodplugins.net
   
   Required Modules:
   -DoDx
   -Fakemeta
*/

#if defined _dod_stocks_included
  #endinput
#endif
#define _dod_stocks_included

#if !defined _amxmodx_included
  #include <amxmodx>
#endif

#if !defined _fakemeta_included
  #include <fakemeta>
#endif

#if !defined _dodx_included
  #include <dodx>
#endif

#define OFFSET_WPN_ID			91
#define OFFSET_WPN_SCOPED		115
#define OFFSET_WPN_SHOULDERED	115
#define OFFSET_LINUX			4

//  Returns entity name of provided wpnid
//	Will pass the weaponname into the 2nd argument
stock dod_get_weapon_name( wpnid, weaponname[], len ) {
	xmod_get_wpnlogname( wpnid, weaponname, len );
	format( weaponname, len, "weapon_%s", weaponname );
}

//	Returns entity number of the client's weapon
//	Provide *either* wpnid (ie. DODW_GARAND) *or* weaponname (ie. "weapon_garand")
stock dod_get_weapon_ent( id, wpnid=0, weaponname[] = "" ) {
	new ent = -1, entid, entname[32];

	// Get User Origin
	new Float:origin[3];
	pev( id, pev_origin, origin );
	
	// Find Weapon
	while( ( ent = engfunc( EngFunc_FindEntityInSphere, ent, origin, Float:1.0 ) ) != 0 ) {
		if( pev_valid(ent) )
		{
			if( wpnid )
			{
				entid = get_pdata_int( ent, OFFSET_WPN_ID, OFFSET_LINUX );
				if( wpnid == entid ) return ent;
			}
			else if( weaponname[0] )
			{
				pev( ent, pev_classname, entname, 31 );
				if( equal(entname, weaponname) ) return ent;
			}
		}
	}
	return 0;
}

//  Returns DODW_ id of the weapon entity provided
stock dod_get_weapon_id( wpnent ) return get_pdata_int( wpnent, OFFSET_WPN_ID, OFFSET_LINUX );

//	Special Scoped Weapons (ie. FG42, Enfield) are not their own weapon entities
//		but use the entities of similar weapons and this offset to distinguish
//	Returns whether or not the weapon is set to special
//	Provide *either* wpnid (ie. DODW_GARAND) *or* weaponname (ie. "weapon_garand")
//	Only use the set param (value of 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock dod_scoped_weapon( id, wpnid, weaponname[] = "", set = -1 ) {
	new ent = dod_get_weapon_ent( id, wpnid, weaponname );
	if( set > -1 )	set_pdata_int( ent, OFFSET_WPN_SCOPED, set, OFFSET_LINUX );
	return 		get_pdata_int( ent, OFFSET_WPN_SCOPED, OFFSET_LINUX );
}

//  Gets or Sets the prone state of the client
//  Values: 0=Not Proned, 1=Proned, 2=Proned and Deployed
//	Only use the set param (value of 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock dod_prone_state( id, set = -1 ) {
	if( set > -1 )	set_pev( id, pev_iuser3, set );
	return 		pev( id, pev_iuser3 );
}

//	Gets or Sets whether or not the current weapon (ie. Rocket) is shouldered
//	Only use the set param (value of 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock dod_shouldered( id, set = -1 ) {
	new wpnent = dod_get_weapon_ent( id, get_user_weapon(id) );
	if( set > -1 )	set_pdata_int( wpnent, OFFSET_WPN_SHOULDERED, set, OFFSET_LINUX );
	return		get_pdata_int( wpnent, OFFSET_WPN_SHOULDERED, OFFSET_LINUX );
}

// Returns whether or not the provided wpnid is a deployable weapon
stock dod_is_deployable( wpnid ) {
	if( wpnid == DODW_30_CAL
	 || wpnid == DODW_MG34
	 || wpnid == DODW_MG42
	 || wpnid == DODW_BAR
	 || wpnid == DODW_FG42
	 || wpnid == DODW_BREN )
		return 1;
	return 0;
}

//	Gets or Sets the client's deploy state
//	Values: 0=Not Deployed, 1=Deployable, 2=Deployed
//	Only use the set param (value of 2, 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock dod_deploy_state( id, set = -1 ) {
	new Float:value[3];
	if( set > -1 )
	{
		value[0] = float(set);
		set_pev( id, pev_vuser1, value );
	}
	pev( id, pev_vuser1, value );
	return floatround(value[0]);
}

//  Gets or Sets client's current stamina
//	Only use the set param (value of 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock Float:dod_stamina( id, Float:set = -1.0 ) {
	if( set > -1.0 )	set_pev( id, pev_fuser4, set );

	new Float:current;
	pev( id, pev_fuser4, current );

	return current;
}

//  Gets or Sets the fuse on a grenade entity
//	Only use the set param (value of 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock Float:dod_fuse( grenindex, Float:set = -1.0 ) {
	new Float:gametime = get_gametime();
	if( set > -1.0 )	set_pev( grenindex, pev_dmgtime, gametime + set );
	
	new Float:current;
	pev( grenindex, pev_dmgtime, current );
	
	return current - gametime;
}

//  Tests if client has cl_autoreload enabled - Or sets it for them
//	Only use the set param (value of 1 or 0) to set this offset; ignore it to "get"
//		the current value
stock dod_autoreload( id, set = -1 ) {
	new const cl_autoreload[16] = "cl_autoreload";
	
	if( set > -1 )
	{
		new szset[4];
		num_to_str( set, szset, 3 );
		set_user_info( id, cl_autoreload, szset );
	}
	new szvalue[4];
	get_user_info( id, "cl_autoreload", szvalue, 3 );
	
	return str_to_num( szvalue );
}

//  by diamond-optic (12.24.07)
//  converts weapon ids (from dod_get_user_weapon for example)
//  into the ids used for those weapons in death messages
stock dod_weaponid_to_deathmsgid( weaponid ) {
    if(weaponid > 31 && weaponid < 38)
        return weaponid+3
    else if(weaponid == 38 || weaponid == 41)
        return 42
    else if(weaponid == 39)
        return 43
    else if(weaponid == 40)
        return 32

    return weaponid
}

//	Provided simply for convenience/logic
stock dod_is_map_british() return dod_get_map_info( MI_ALLIES_TEAM );
