#include <amxmodx>
#include <engine>
#include <cstrike>
#include <fun>
#include <hamsandwich>
#include <fakemeta>
#include <fakemeta_util>

#define MIN -10.0
#define MAX 10.0

#define RADIUS 290.0
#define DAMAGE 2.0
#define V_MODEL "models/v_grenade_firee.mdl"

#define CRAZY_CODE 5646489
const TASK_BURN = 1000
new g_frostexp
new g_frost_gibs;
new gMsgScreenShake , g_iHookedDeathMsg, gMsgScreenFade, grenadetrail
new g_flameSpr;
new yaniyonfuatabi[33] = 0;
new const sprite_grenade_fire[] = "sprites/flame.spr"
public plugin_init()
{
	register_plugin("Behemoth Grenade" , "2.0" , "maTT_hArdy [T.Knight EDIT]!")
	register_cvar("behemot", "hardy", FCVAR_SERVER|FCVAR_SPONLY)
	register_forward(FM_SetModel, "fw_SetModel")
	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
	RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
	RegisterHam(Ham_Item_Deploy,"weapon_smokegrenade", "fw_Item_Deploy_Post", 1)
	RegisterHam( Ham_Killed, "player", "player_dead" )
	gMsgScreenShake = get_user_msgid("ScreenShake");
	gMsgScreenFade = get_user_msgid("ScreenFade");
}
public plugin_precache()
{
	grenadetrail = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
	engfunc(EngFunc_PrecacheModel, V_MODEL)
	engfunc(EngFunc_PrecacheSound, "zombi_bomb_exp.wav")
	g_frostexp = precache_model("sprites/fire_kurukafa.spr")
	g_frost_gibs = precache_model("sprites/firebomb_oskolok.spr")
	g_flameSpr = engfunc(EngFunc_PrecacheModel, sprite_grenade_fire)
}

public client_putinserver(id)
{	
	new g_Ham_Bot

	if(!g_Ham_Bot && is_user_bot(id))
	{
		g_Ham_Bot = 1
		set_task(0.1, "Do_RegisterHam_Bot", id)
	}
}

public Do_RegisterHam_Bot(id)
{
	RegisterHamFromEntity(Ham_Killed, id, "player_dead")
}

public fw_Item_Deploy_Post(weapon_ent)
{
	static id; id = fm_cs_get_weapon_ent_owner(weapon_ent)
	if (!pev_valid(id))
		return
		
	set_pev(id, pev_viewmodel2, V_MODEL)
}

public fw_ThinkGrenade(entity)
{
	// Invalid entity
	if (!pev_valid(entity)) return HAM_IGNORED;
	if(pev(entity, pev_iuser2) != CRAZY_CODE) return HAM_IGNORED;
	
	new Float:dmgtime;
	pev(entity,pev_dmgtime,dmgtime);
	if(dmgtime > get_gametime()) return HAM_IGNORED;
	
	fire_explode(entity)
	return HAM_SUPERCEDE;
}

public MsgDeathMsg( ) {
	set_msg_arg_int( 3, ARG_BYTE, 0 );
	set_msg_arg_string( 4, "grenade" );
	
	return PLUGIN_CONTINUE;
}

fire_explode(ent)
{
	// Get origin
	static Float:originF[3], Owner
	pev(ent, pev_origin, originF)
	Owner = pev(ent, pev_owner)
	// Make the explosion
	yeni_balast_ates(originF)
	
	// Fire nade explode sound
	emit_sound(ent, CHAN_WEAPON, "zombi_bomb_exp.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	
	static Float:PlayerOrigin[3]
	static Float:distance
	for(new i = 0; i < get_maxplayers(); i++)
	{
		if(!is_user_alive(i))
			continue
		if(!is_user_connected(Owner))
			continue
		if(cs_get_user_team(i) == cs_get_user_team(Owner))
			continue
		//if(!get_cvar_num("mp_friendlyfire") && cs_get_user_team(i) == cs_get_user_team(Owner) && i != Owner)
			//continue
		pev(i, pev_origin, PlayerOrigin)
		distance = get_distance_f(originF, PlayerOrigin)
		if(distance > RADIUS)
			continue
				
		new Float:pengurang = distance / RADIUS
		new Float:pengurang2 = 1.0 - pengurang
		new Float:flDamage = 100.0 * pengurang2
		new Float:flDamage_final = flDamage + (flDamage * DAMAGE)
		
		yaniyonfuatabi[i] = 1
		set_task(0.2, "yak", i)
		if (task_exists(i+56213)) remove_task(i+56213)
		set_task(10.0, "RemoveGlowShell", i+56213)
		//playerlight(i)
		crazy2(i)
		set_task(0.5,"crazy",i+231687,"",0,"a",20)
		
		g_iHookedDeathMsg = register_message( get_user_msgid("DeathMsg"), "MsgDeathMsg" );
		
		ExecuteHamB( Ham_TakeDamage, i, ent, Owner, flDamage_final, DMG_GENERIC );
		
		if( g_iHookedDeathMsg )
		{
			unregister_message( get_user_msgid("DeathMsg"), g_iHookedDeathMsg );
			
			g_iHookedDeathMsg = 0;
		}
	}
	
	// Get rid of the grenade
	set_pev(ent, pev_iuser2, 0)
	engfunc(EngFunc_RemoveEntity, ent)
}
public yak(kisi)
{	
	if (yaniyonfuatabi[kisi] == 1){
		
		//CSmiLeFaCe
		static Float:originF[3]
		pev(kisi, pev_origin, originF)
		
		engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
		write_byte(TE_SPRITE)
		engfunc(EngFunc_WriteCoord, originF[0]+random_float(-5.0, 5.0)) // x
		engfunc(EngFunc_WriteCoord, originF[1]+random_float(-5.0, 5.0)) // y
		engfunc(EngFunc_WriteCoord, originF[2]+random_float(-10.0, 10.0)) // z
		write_short(g_flameSpr) 
		write_byte(random_num(5, 10))
		write_byte(200) 
		message_end()
		set_task(0.2, "yak", kisi)
	}
	
}
public fw_SetModel(entity, const model[])
{//CSmiLeFaCe
	// We don't care
	if (strlen(model) < 8)
		return;
	
	if (model[9] == 's' && model[10] == 'm' && model[11] == 'o' && model[12] == 'k' && model[13] == 'e' && model[14] == 'g')
	{
		// Give it a glow
		fm_set_rendering(entity, kRenderFxGlowShell, 244, 251, 105, kRenderNormal, 16);
		
		set_pev(entity, pev_iuser2, CRAZY_CODE)
		
		// And a colored trail
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_BEAMFOLLOW) // TE id
		write_short(entity) // entity
		write_short(grenadetrail) // sprite
		write_byte(10) // life
		write_byte(10) // width
		write_byte(244) // r
		write_byte(251) // g
		write_byte(105) // b
		write_byte(200) // brightness
		message_end()
	}
}

public crazy(taskid)
{
	new id = taskid - 231687
	
	new Float:fVec[3];
	fVec[0] = random_float(MIN , MAX);
	fVec[1] = random_float(MIN , MAX);
	fVec[2] = random_float(MIN , MAX);
	entity_set_vector(id , EV_VEC_punchangle , fVec);
	message_begin(MSG_ONE , gMsgScreenShake , {0,0,0} ,id)
	write_short( 1<<14 );
	write_short( 1<<14 );
	write_short( 1<<14 );
	message_end();

	message_begin(MSG_ONE_UNRELIABLE , gMsgScreenFade , {0,0,0} , id);
	write_short( 1<<10 );
	write_short( 1<<10 );
	write_short( 1<<12 );
	write_byte( random_num(0,255) );
	write_byte( random_num(0,255) );
	write_byte( random_num(0,255) );
	write_byte( 95 );
	message_end();
}

public crazy2(id)
{
	new Float:fVec[3];
	fVec[0] = random_float(MIN , MAX);
	fVec[1] = random_float(MIN , MAX);
	fVec[2] = random_float(MIN , MAX);
	entity_set_vector(id , EV_VEC_punchangle , fVec);
	message_begin(MSG_ONE , gMsgScreenShake , {0,0,0} ,id)
	write_short( 1<<14 );
	write_short( 1<<14 );
	write_short( 1<<14 );
	message_end();

	message_begin(MSG_ONE_UNRELIABLE , gMsgScreenFade , {0,0,0} , id);
	write_short( 1<<10 );
	write_short( 1<<10 );
	write_short( 1<<12 );
	write_byte( random_num(0,255) );
	write_byte( random_num(0,255) );
	write_byte( random_num(0,255) );
	write_byte( 95 );
	message_end();
}

public Event_NewRound()
{
	for(new i = 0; i < get_maxplayers(); i++)
	{
		if(task_exists(i+56213))
		{
			remove_task(i+56213)
			set_normal(i)
		}
		if(task_exists(i+231687)) remove_task(i+231687)
		
	}
}

public player_dead(id)
{
	if(task_exists(id+56213))
	{
		remove_task(id+56213)
		set_normal(id)
	}
	if(task_exists(id+231687)) remove_task(id+231687)
}

public RemoveGlowShell(taskid)
{
	
	new id = taskid - 56213
	set_normal(id)
	
	if(task_exists(taskid)) remove_task(taskid)
	
}

stock set_normal(entity)
{
	yaniyonfuatabi[entity] = 0;
}
yeni_balast_ates(const Float:originF[3]){
	message_begin (MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(TE_SPRITE)
	engfunc(EngFunc_WriteCoord, originF[0]+random_float(-5.0, 5.0))
	engfunc(EngFunc_WriteCoord, originF[1]+random_float(-5.0, 5.0))
	engfunc(EngFunc_WriteCoord, originF[2]+50.0)
	write_short(g_frostexp)
	write_byte(13) //B�y�kl�k
	write_byte(150) //Saydaml�k
	message_end()
	
	message_begin (MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte( TE_SPRITETRAIL )
	engfunc(EngFunc_WriteCoord, originF[ 0 ]) // ba�lang��
	engfunc(EngFunc_WriteCoord, originF[ 1 ])
	engfunc(EngFunc_WriteCoord, originF[ 2 ] + 200.0)
	engfunc(EngFunc_WriteCoord, originF[ 0 ]) // h�z�
	engfunc(EngFunc_WriteCoord, originF[ 1 ])
	engfunc(EngFunc_WriteCoord, originF[ 2 ] + 30.0)
	write_short(g_frost_gibs) // sprite dosyas�
	write_byte(60) // ka� adet da��laca��
	write_byte(random_num(27,30))
	write_byte(2) 
	write_byte(50)
	write_byte(10)
	message_end() 
	
	
}


stock fm_cs_get_weapon_ent_owner(ent)
{
	if (pev_valid(ent) != 2)
		return -1
	
	return get_pdata_cbase(ent, 41, 4)
}
