/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <dodx>
#include <dodfun>
#include <dod_stocks>
#include <fakemeta>

#pragma semicolon 1

#define PLUGIN "Rifle Grenades"
#define VERSION "1.0"
#define AUTHOR "29th.org"

#define GREN_VEL 	900
#define PEV_PRIMED	pev_iuser2
#define PEV_RIFLEGRENADE pev_iuser3

enum names
{
	w_handgrenade,
	w_millsbomb,
	w_stickgrenade,
	v_riflegrenade,
	firesound,
	weapon_garand,
	weapon_enfield,
	weapon_kar,
	weapon_k43,
	p_garand,
	p_enfield,
	p_kar,
	p_k43
};

new strings[ names ][32] = 
{
	"models/w_grenade.mdl",
	"models/w_mills.mdl",
	"models/w_stick.mdl",
	"models/v_riflegrenade.mdl",
	"weapons/mortar_shoot.wav",
	"weapon_garand",
	"weapon_enfield",
	"weapon_kar",
	"weapon_k43",
	"models/p_garand_l.mdl",
	"models/p_enfield_l.mdl",
	"models/p_k98_l.mdl",
	"models/p_k43.mdl"
};

new p_enabled, p_speed, p_fuse;
new g_msgCurWeapon;
new bool:g_holdingGren[33];

public plugin_init() {
	g_msgCurWeapon	= get_user_msgid( "CurWeapon" );
	p_enabled 	= register_cvar( "dod_riflegrenades", "1" );
	p_speed 	= register_cvar( "dod_riflegrenades_speed", "1500" ); // 1500
	p_fuse 		= register_cvar( "dod_riflegrenades_fuse", "3" ); // 3
	
	register_plugin ( PLUGIN, VERSION, AUTHOR );
	register_forward( FM_SetModel, 		"fwd_SetModel", 1 );
	register_message( g_msgCurWeapon, 	"fwd_CurWeapon" );
	
	register_clcmd( "firesound", "fire_sound" );
}

public plugin_precache() {
	precache_model( strings[v_riflegrenade] );
	precache_sound( strings[firesound] );
}

public fwd_SetModel( ent, const model[] ) {
	if( plugin_enabled() )
	{
		if( equal(model, strings[w_handgrenade])
		||  equal(model, strings[w_millsbomb])
		||  equal(model, strings[w_stickgrenade]) )
		{
			new id = pev( ent, pev_owner );
			
			// Check if primed to avoid being called on give_item()
			if( pev(ent, PEV_PRIMED) && g_holdingGren[id] )
			{
				new Float:fVel[3];
				velocity_by_aim( id, get_pcvar_num(p_speed), fVel );
				set_pev( ent, pev_velocity, fVel );
				
				new Float:newfuse = get_gametime() + get_pcvar_float( p_fuse );
				set_pev( ent, pev_dmgtime, newfuse );

				fire_sound( id );
			}
		}
	}
}

public fwd_CurWeapon( msgid, msgdest, id ) {
	if( plugin_enabled() )
	{
		new wpnactive = get_msg_arg_int( 1 );
		new wpnid = get_msg_arg_int( 2 );
		
		if( wpnactive && has_riflegrenade(id, wpnid) && has_rifle(id) )
		{
			g_holdingGren[id] = true;
			
			// Check and set model
			static curModel[32];
			pev( id, pev_viewmodel2, curModel, 31 );
			
			if( !equal(curModel, strings[v_riflegrenade]) )
			{
				fix_model( id );
			}
		}
		else
		{
			if( g_holdingGren[id] ) g_holdingGren[id] = false;
		}
	}
}

// Set delay to ensure player was given grenades after spawning first
public dod_player_spawn( id ) set_task( Float:0.3, "handle_spawn", id );

public handle_spawn( id ) {
	if( plugin_enabled() )
	{
		g_holdingGren[id] = false;
		
		new class = dod_get_user_class( id );
		if( class == DODC_CARBINE || class == DODC_ENFIELD || class == DODC_KAR )
		{
			has_riflegrenade( id, _, 1 );
		}
	}
}

has_riflegrenade( id, wpnid=0, set=-1 ) {
	if( !wpnid )
	{
		new team = get_user_team( id );
		
		if( team == ALLIES && !dod_is_map_british() )
			wpnid = DODW_HANDGRENADE;
		else if( team == ALLIES )
			wpnid = DODW_MILLS_BOMB;
		else
			wpnid = DODW_STICKGRENADE;
	}
	else if( wpnid != DODW_HANDGRENADE && wpnid != DODW_MILLS_BOMB && wpnid != DODW_STICKGRENADE )
		return 0;
	
	new wpnent = dod_get_weapon_ent( id, wpnid );
		
	if( set > -1 )
		set_pev( wpnent, PEV_RIFLEGRENADE, set );
	
	return pev( wpnent, PEV_RIFLEGRENADE );
}

has_rifle( id ) {
	new weapons[32], num;
	get_user_weapons( id, weapons, num );
	
	for( new i; i < num; i++ )
	{
		new wpnid = weapons[i];
		if( wpnid == DODW_GARAND || wpnid == DODW_ENFIELD || wpnid == DODW_KAR || wpnid == DODW_K43 )
			return wpnid;
	}
	return 0;
}

public fire_sound( id ) {
	emit_sound( id, CHAN_ITEM, strings[firesound], 0.8, ATTN_NORM, 0, PITCH_NORM );
}

fix_model( id ) {
	// View Model
	set_pev( id, pev_viewmodel2, strings[v_riflegrenade] );
	
	// Player Model
	new model;
	switch( has_rifle(id) )
	{
		case DODW_GARAND: 	model = p_garand;
		case DODW_ENFIELD: 	model = p_enfield;
		case DODW_KAR: 		model = p_kar;
		case DODW_K43: 		model = p_k43;
	}
	if( model ) set_pev( id, pev_weaponmodel2, strings[names:model] );
}

plugin_enabled() return get_pcvar_num( p_enabled );
