#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <xs>
#include <zombieplague>
 
#define IsPlayer(%1)    ( 1 <= %1 <= g_MaxPlayers )
 
//-------------------------------------
 
//Cost
new const g_goldenshotgun_Cost = 30
 
//Model
new const goldenshotgun_model_v[] = "models/zombie_plague/v_m1887g.mdl"
new const goldenshotgun_model_p[] = "models/zombie_plague/p_m1887g.mdl"
new const goldenshotgun_model_w[] = "models/zombie_plague/w_m1887g.mdl"
 
//-------------------------------------
 
//Version
#define VERSION "1.1"
 
new bullets[ 33 ]
new g_golden_shotgun[33], g_currentweapon[33]
new g_gold, g_MaxPlayers
new m_spriteTexture
new cvar_enable, cvar_oneround, cvar_knockback, cvar_knockbackpower,
cvar_uclip, cvar_damage, cvar_goldbullets
 
//Offset
#if cellbits == 32
const OFFSET_CLIPAMMO = 51
#else
const OFFSET_CLIPAMMO = 65
#endif
const OFFSET_LINUX = 5
const OFFSET_LINUX_WEAPONS = 4
const OFFSET_LASTPRIMARYITEM = 368
 
public plugin_init() 
{
	//Info
	register_plugin("[ZP] Extra Item: Golden Shotgun", "1.3", "H.RED.ZONE")
 
	register_clcmd("say /goldenshotgun","buy_shotgun");
	register_clcmd("say /gs","buy_shotgun");
 
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
	RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
 
	register_forward(FM_SetModel, "fw_SetModel")
	register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
	register_event("CurWeapon", "make_tracer", "be", "1=1", "3>0")
	register_message(get_user_msgid("CurWeapon"), "message_cur_weapon")
 
	//Cvar
	register_cvar("zp_extra_golden", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
	cvar_enable = register_cvar("zp_gshotgun_enable", "1") //Enable
	cvar_uclip = register_cvar("zp_gshotgun_unlimited_clip", "1") //Unlimited Clip
	cvar_damage = register_cvar("zp_gshotgun_damage_mult", "3.0") //Multi Damage
	cvar_oneround = register_cvar("zp_gshotgun_oneround", "0") //One Round
	cvar_knockback = register_cvar("zp_gshotgun_knockback", "1") //Knockback ON
	cvar_knockbackpower = register_cvar("zp_gshotgun_kbackpower", "15.0") //Power Of Knockback
	cvar_goldbullets = register_cvar("zp_gshotgun_gold_bullets", "1") //Golden Bullets ON
 
	g_MaxPlayers = get_maxplayers()
	g_gold = zp_register_extra_item("Golden Shotgun", g_goldenshotgun_Cost, ZP_TEAM_HUMAN)
 
}
 
public zp_extra_item_selected(id, itemid)
{
	if(itemid == g_gold)
	{
		if(!get_pcvar_num(cvar_enable))
		{
			zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + g_goldenshotgun_Cost)
			client_print(id, print_chat, "[ZP] Golden Shotgun Is Disabled")
 
			return;
		}
 
		// Already has an M3
		if(g_golden_shotgun[id] && user_has_weapon(id, CSW_M3))
		{
			zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + g_goldenshotgun_Cost)
			client_print(id, print_chat, "[ZP] You Have Golden Shotgun")
 
			return;
		}
 
		// Array
		g_golden_shotgun[id] = true
 
		// Weapon
		ham_give_weapon(id, "weapon_m3")
 
		// Message
		client_print(id, print_chat, "[ZP] You Have Golden Shotgun")
 
	}
}
 
public zp_user_infected_post(infected, infector)
{
	if(g_golden_shotgun[infected])
		g_golden_shotgun[infected] = false;
}
 
public zp_user_humanized_post(player)
{
	if(zp_get_user_survivor(player) && g_golden_shotgun[player])
		g_golden_shotgun[player] = false;
}
 
stock ham_give_weapon(id, weapon[])
{
	if(!equal(weapon,"weapon_",7)) 
		return 0
 
	new wEnt = create_entity(weapon)
 
	if(!is_valid_ent(wEnt)) 
		return 0
 
	entity_set_int(wEnt, EV_INT_spawnflags, SF_NORESPAWN)
	DispatchSpawn(wEnt)
 
	if(!ExecuteHamB(Ham_AddPlayerItem,id,wEnt))
	{
		if(is_valid_ent(wEnt)) entity_set_int(wEnt, EV_INT_flags, entity_get_int(wEnt, EV_INT_flags) | FL_KILLME)
		return 0
	}
 
	ExecuteHamB(Ham_Item_AttachToPlayer,wEnt,id)
	return 1
}
 
stock ham_strip_weapon(id, weapon[])
{
	if(!equal(weapon,"weapon_",7)) 
		return 0
 
	new wId = get_weaponid(weapon)
 
	if(!wId) return 0
 
	new wEnt
 
	while((wEnt = find_ent_by_class(wEnt, weapon)) && entity_get_edict(wEnt, EV_ENT_owner) != id) {}
 
	if(!wEnt) return 0
 
	if(get_user_weapon(id) == wId) 
		ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt);
 
	if(!ExecuteHamB(Ham_RemovePlayerItem,id,wEnt)) 
		return 0
 
	ExecuteHamB(Ham_Item_Kill, wEnt)
 
	entity_set_int(id, EV_INT_weapons, entity_get_int(id, EV_INT_weapons) & ~(1<<wId))
 
	return 1
}  
 
stock fm_set_weapon_ammo(entity, amount)
{
	set_pdata_int(entity, OFFSET_CLIPAMMO, amount, OFFSET_LINUX_WEAPONS);
}
 
stock fm_get_user_lastprimaryitem(id) // Thanks to joaquimandrade
{
	if(get_pdata_cbase(id, OFFSET_LASTPRIMARYITEM) != -1)
		return 1;
 
	return 0;
}
public make_tracer(id)
{
	if (get_pcvar_num(cvar_goldbullets))
	{
		new clip,ammo
		new wpnid = get_user_weapon(id,clip,ammo)
		new pteam[16]
 
		get_user_team(id, pteam, 15)
 
		if ((bullets[id] > clip) && (wpnid == CSW_M3) && g_golden_shotgun[id]) 
		{
			new vec1[3], vec2[3]
			get_user_origin(id, vec1, 1) // origin; your camera point.
			get_user_origin(id, vec2, 4) // termina; where your bullet goes (4 is cs-only)
 
 
			//BEAMENTPOINTS
			message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
			write_byte (0)     //TE_BEAMENTPOINTS 0
			write_coord(vec1[0])
			write_coord(vec1[1])
			write_coord(vec1[2])
			write_coord(vec2[0])
			write_coord(vec2[1])
			write_coord(vec2[2])
			write_short( m_spriteTexture )
			write_byte(1) // framestart
			write_byte(5) // framerate
			write_byte(2) // life
			write_byte(10) // width
			write_byte(0) // noise
			write_byte( 255 )     // r, g, b
			write_byte( 215 )       // r, g, b
			write_byte( 0 )       // r, g, b
			write_byte(200) // brightness
			write_byte(150) // speed
			message_end()
		}
 
		bullets[id] = clip
	}
 
}
 
 
 
public plugin_precache()
{
	m_spriteTexture = precache_model("sprites/dot.spr")
	precache_model(goldenshotgun_model_v)
	precache_model(goldenshotgun_model_p)
	precache_model(goldenshotgun_model_w)
}
 
//Event
public event_round_start()
{
	for(new id = 1; id <= g_MaxPlayers; id++)
	{
		if(get_pcvar_num(cvar_oneround) || !get_pcvar_num(cvar_enable))
		{
			if(g_golden_shotgun[id])
			{
				g_golden_shotgun[id] = false;
				ham_strip_weapon(id, "weapon_m3")
			}
		}
	}
}
 
//Message
public message_cur_weapon(msg_id, msg_dest, id)
{
	if (!g_golden_shotgun[id])
		return PLUGIN_CONTINUE
 
	if (!is_user_alive(id) || get_msg_arg_int(1) != 1)
		return PLUGIN_CONTINUE
 
	new clip = get_msg_arg_int(3)
 
	g_currentweapon[id] = get_msg_arg_int(2) // get weapon ID
 
	if(g_currentweapon[id] != CSW_M3)
		return PLUGIN_CONTINUE;
 
	entity_set_string(id, EV_SZ_viewmodel, goldenshotgun_model_v)
	entity_set_string(id, EV_SZ_weaponmodel, goldenshotgun_model_p)
 
	if(get_pcvar_num(cvar_uclip))
	{	
		set_msg_arg_int(3, get_msg_argtype(3), 8)
 
		if (clip < 2)
		{
			fm_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m3", id), 8)
		}
	}
 
	return PLUGIN_CONTINUE;
}
 
public touch_fix(id)
{
	if(g_golden_shotgun[id])
		g_golden_shotgun[id] = false;
}
 
 
public fw_PlayerKilled(victim, attacker, shouldgib)
{
	if(g_golden_shotgun[victim])
		g_golden_shotgun[victim] = false;
}
 
public fw_SetModel(entity, model[])
{
	if(!is_valid_ent(entity))
		return FMRES_IGNORED;
 
	if(!equali(model, "models/w_m3.mdl")) 
		return FMRES_IGNORED;
 
	new owner = entity_get_edict(entity, EV_ENT_owner)
	new classname[33]
	entity_get_string(entity, EV_SZ_classname, classname, charsmax(classname))
 
	if(equal(classname, "weaponbox"))
	{
		if(g_golden_shotgun[owner])
		{
			g_golden_shotgun[owner] = false;
			entity_set_model(entity, goldenshotgun_model_w)
			set_task(0.1, "touch_fix", owner)
 
			return FMRES_SUPERCEDE
		}
	}
 
	return FMRES_IGNORED
 
}
 
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
	if(!(1 <= attacker <= g_MaxPlayers))
		return HAM_IGNORED;
 
	if(g_currentweapon[attacker] != CSW_M3)
		return HAM_IGNORED;
 
	if(!g_golden_shotgun[attacker])
		return HAM_IGNORED;
 
	SetHamParamFloat(4, damage * get_pcvar_float(cvar_damage) )
 
	return HAM_IGNORED;
}
 
public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
{
    if(!IsPlayer(attacker) || !allowed_knockback(victim, attacker))
        return HAM_IGNORED;
 
    if(!(damage_type & DMG_BULLET))
        return HAM_IGNORED;
 
    // Make Knockback...
    new Float:velocity[3]; pev(victim, pev_velocity, velocity)
    xs_vec_mul_scalar(direction, get_pcvar_float(cvar_knockbackpower), direction)
    xs_vec_add(velocity, direction, direction)
    entity_set_vector(victim, EV_VEC_velocity, direction)
 
    return HAM_IGNORED;
 
}
 
public pfn_touch(entity, toucher)
{
	new model[33], toucherclass[33], entityclass[33]
 
	if((toucher > 0) && is_valid_ent(toucher)) entity_get_string(toucher, EV_SZ_classname, toucherclass, charsmax(toucherclass))
 
	if((entity > 0) && is_valid_ent(entity)) entity_get_string(entity, EV_SZ_classname, entityclass, charsmax(entityclass))
 
	if(equali(toucherclass, "player") && equali(entityclass, "weaponbox"))
	{
 
		entity_get_string(entity, EV_SZ_model, model, charsmax(model))
 
 
		if(equali(model, goldenshotgun_model_w))
			if(allowed_touch(toucher)) 
				g_golden_shotgun[toucher] = true
	}
}
 
allowed_touch(toucher)
{
	if(zp_get_user_survivor(toucher) || zp_get_user_zombie(toucher) || fm_get_user_lastprimaryitem(toucher) || g_golden_shotgun[toucher])
		return false;
 
	return true;
}
 
allowed_knockback(victim, attacker)
{
	if(!g_golden_shotgun[attacker] || !get_pcvar_num(cvar_knockback) || g_currentweapon[attacker] != CSW_M3 || !zp_get_user_zombie(victim))
		return false;
 
	return true;
}
 
public buy_shotgun(id)
{
	if (!zp_get_user_zombie(id)  == true)
	{
 
		new packs = zp_get_user_ammo_packs(id)
		new cost = g_goldenshotgun_Cost
 
		if(g_golden_shotgun[id] && user_has_weapon(id, CSW_M3))
		{
			client_print(id, print_chat, "[ZP] You Have Golden Shotgun")
 
			return;
		}
 
		// Array
		g_golden_shotgun[id] = true
 
		// Weapon
		ham_give_weapon(id, "weapon_m3")
		zp_set_user_ammo_packs(id, packs - cost)
		}
	}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang10266\\ f0\\ fs16 \n\\ par }
*/