#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <engine>
#include <xs>
#include <fun>
#include <hamsandwich>
#include <cstrike>
 
//Az alsó stock része(drop_pri)
new const priwpns[][] = {
	"weapon_shield",
	"weapon_scout",
	"weapon_xm1014",
	"weapon_mac10",
	"weapon_aug",
	"weapon_ump45",
	"weapon_sg550",
	"weapon_galil",
	"weapon_famas",
	"weapon_awp",
	"weapon_mp5navy",
	"weapon_m249",
	"weapon_m3",
	"weapon_m4a1",
	"weapon_tmp",
	"weapon_g3sg1",
	"weapon_sg552",
	"weapon_ak47",
	"weapon_p90"
}
 
#define	GAK47_WEAPONKEY	12553	//ez teljesen mindegy mi csak random legyen és két fegyónál ne használjuk egyan azt...
 
new bool:has_gak47[33]
new lastammo[33],in_reload[33],gak_clip[33]
 
new Float:cl_pushangle[33][3]
 
new v_model[64] = "models/v_goldak47.mdl"
new p_model[64] = "models/p_goldak47.mdl"
new w_model[64] = "models/w_goldak47.mdl"
 
new cvar_dmgx,cvar_cost,cvar_recoil,cvar_rof,cvar_clip,cvar_ammo,cvar_reload_time
 
public plugin_init() {
	register_plugin("Arany AK","1.0","Nandee")
 
	cvar_dmgx=register_cvar("gak47_dmgx","1.8")//Sebzés szorzó
	cvar_cost=register_cvar("gak47_cost","5000")//Ár
	cvar_recoil=register_cvar("gak47_recoil","1.5")//Visszalökés szorzó
	cvar_rof=register_cvar("gak47_rof","1.2")//Sebzés sebesség szorzó(Rate of fire)
	cvar_clip=register_cvar("gak47_clip","45")//Egyszerre betárazható golyók száma
	cvar_ammo=register_cvar("gak47_ammo","4")//Tárolható tárak száma
	cvar_reload_time=register_cvar("gak47_reload_time","4.0")//Újratöltési idő szorzó
 
	register_clcmd("say /gak47","buy_gak47")
	register_clcmd("weapon_gak47","switch_weapon")
 
	register_event("CurWeapon","event_curwpn","be","1=1")
	register_event("CurWeapon","make_tracer", "be", "1=1", "3>0")
	register_event("DeathMsg","event_death","a")
	register_message(get_user_msgid("DeathMsg"),"msg_death")
	register_forward(FM_SetModel, "fw_setmodel")
	RegisterHam(Ham_Item_AddToPlayer,"weapon_ak47","hevent_atp",.Post=true)
	RegisterHam(Ham_TakeDamage,"player","hevent_damage")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "hevent_primary_attack")
	RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "hevent_primary_attack_post",1) 
	RegisterHam(Ham_Item_PostFrame,"weapon_ak47","hevent_postframe")
	RegisterHam(Ham_Weapon_Reload,"weapon_ak47","hevent_reload")
	RegisterHam(Ham_Weapon_Reload,"weapon_ak47","hevent_reload_post",1)
}
 
public plugin_precache()
{
	precache_model(p_model)
	precache_model(v_model)
	precache_model(w_model)
}
//Vásárlás
public buy_gak47(id)
{
	new cost=get_pcvar_num(cvar_cost)
	if(!is_user_alive(id)||!is_user_connected(id))
		return
	else if(cs_get_user_money(id)<cost)
	{
		client_print(id,print_chat,"[GAK47] Nem eleg a penzed!")
		return
	}
	else if(has_gak47[id]&&user_has_weapon(id,CSW_AK47))
	{
		client_print(id,print_chat,"[GAK47] Neked mar van Arany AK47-d!")
		return
	}
	else
	{
		client_print(id,print_chat,"[GAK47] Sikeres vasarlas!")
		cs_set_user_money(id,cs_get_user_money(id)-cost)
		drop_pri(id)
		new wpn=give_item(id,"weapon_ak47")
		if(wpn>0)
		{
			cs_set_weapon_ammo(wpn,get_pcvar_num(cvar_clip))
			//Ha a következő sort kitörlöd, akkor nem teljes tárral kapja
			cs_set_user_bpammo (id,CSW_AK47,get_pcvar_num(cvar_clip)*get_pcvar_num(cvar_ammo))
		}
		engclient_cmd(id,"weapon_ak47")
		has_gak47[id]=true
		replace_weapon_models(id)
	}
}
//Csatlakozáskor/lekapcsolódáskor/halálkor elveszik
public client_connect(id)
	has_gak47[id]=false
 
public client_disconnect(id)
	has_gak47[id]=false
 
public event_death()
	has_gak47[read_data(2)]=false
//konzol üzenet megváltoztatása
public msg_death(msg_id, msg_dest, id)
{
	new weapon[33], attacker
	get_msg_arg_string(4,weapon, charsmax(weapon))
	attacker=get_msg_arg_int(1)
	if(equal(weapon,"ak47")&&get_user_weapon(attacker)==CSW_AK47&&has_gak47[attacker]&&is_user_connected(attacker))
			set_msg_arg_string(4,"golden ak47")
	return PLUGIN_CONTINUE
}
//konzol parancsra elővétel, ez szokott lenni a fegyvereknél...
public switch_weapon(id)
{
	if(has_gak47[id]&&get_user_weapon(id)!=CSW_AK47)
		engclient_cmd(id,"weapon_ak47")
}
//ha ak47 van a kezébe és van gold ak-ja akkor megszorozza a sebzést a cvarral
public hevent_damage(id, inflictor, attacker, Float:damage)
{
	if(get_user_weapon(attacker)==CSW_AK47&&has_gak47[attacker])
	{
		SetHamParamFloat(4,damage*get_pcvar_float(cvar_dmgx))
	}
}
//Modellek megváltoztatása
public replace_weapon_models(id)
{
	if(is_user_alive(id)&&get_user_weapon(id)==CSW_AK47&&has_gak47[id])
	{
		set_pev(id, pev_viewmodel2,v_model)
		set_pev(id, pev_weaponmodel2,p_model)
	}
}
//Amikor ak47-re vált modellt változtat
//Lövés sebesség beállítása
public event_curwpn(id)
{
	replace_weapon_models(id)
	if(is_user_alive(id)&&get_user_weapon(id)==CSW_AK47&&has_gak47[id])
	{
		new ent=fm_find_ent_by_owner(-1,"weapon_ak47",id)//fm_util kell hozzá!
		if(!ent)
			return PLUGIN_CONTINUE
		new Float:delay,Float:m_delay
		delay=get_pdata_float(ent,46,4)*get_pcvar_float(cvar_rof)
		m_delay=get_pdata_float(ent,47,4)*get_pcvar_float(cvar_rof)
		if(delay>0.0)
		{
			set_pdata_float(ent,46,delay,4)
			set_pdata_float(ent,47,m_delay,4)
		}
	}
	return PLUGIN_HANDLED
}
//Eldobáskor megváltoztatja a modell-t és eltárolja rajta az GAK47_WEAPONKEY-t
//azért hogyha felveszi betudja azonosítani, hogy ez nem sima ak...
public fw_setmodel(ent, model[])
{
	if(!is_valid_ent(ent))
		return FMRES_IGNORED
	new classname[33]
	entity_get_string(ent, EV_SZ_classname, classname, charsmax(classname))
	if(!equal(classname, "weaponbox"))
		return FMRES_IGNORED
	new owner=entity_get_edict(ent,EV_ENT_owner)
	if(equal(model, "models/w_ak47.mdl"))
	{
		new weaponid=find_ent_by_owner(-1,"weapon_ak47", ent)
		if(!is_valid_ent(weaponid))
			return FMRES_IGNORED
		if(has_gak47[owner])
		{
			entity_set_int(weaponid,EV_INT_impulse, GAK47_WEAPONKEY)
			has_gak47[owner]=false
 
			entity_set_model(ent,w_model)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}
//Felvételkor megnézi, hogy arany ak-e
public hevent_atp(item,id)  
{  
	if(entity_get_int(item,EV_INT_impulse)==GAK47_WEAPONKEY)
	{
		has_gak47[id]=true
		entity_set_int(item,EV_INT_impulse,0)
	}
}
//Visszalökés szorzó beállítása
public hevent_primary_attack(ent)
{
	new id = pev(ent,pev_owner)
	if(get_user_weapon(id)==CSW_AK47&&has_gak47[id])
		pev(id,pev_punchangle,cl_pushangle[id])
	return HAM_IGNORED
}
 
public hevent_primary_attack_post(ent)
{
	new id = pev(ent,pev_owner)
	if(get_user_weapon(id)==CSW_AK47&&has_gak47[id])
	{
		new Float:push[3]
		pev(id,pev_punchangle,push)
		xs_vec_sub(push,cl_pushangle[id],push)
		xs_vec_mul_scalar(push,get_pcvar_float(cvar_recoil),push)
		xs_vec_add(push,cl_pushangle[id],push)
		set_pev(id,pev_punchangle,push)
	}
	return HAM_IGNORED
}
//Arany golyók létrehozása...
public make_tracer(id)
{
	new clip=read_data(3) 
	if(lastammo[id]>clip&&get_user_weapon(id)==CSW_AK47&&has_gak47[id])
	{
		new o1[3],o2[3]
		get_user_origin(id,o1,1)//Fegyver végpontja
		get_user_origin(id,o2,4)//Utolsó lövés koordinátája
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_TRACER)//Arany golyók
		write_coord(o1[0])//kezdő koordináta x
		write_coord(o1[1])//kezdő koordináta y
		write_coord(o1[2])//kezdő koordináta z
		write_coord(o2[0])//végső koordináta x
		write_coord(o2[1])//végső koordináta y
		write_coord(o2[2])//végső koordináta z
		message_end()
		lastammo[id]=clip
	}
}
//Lőszer beállítása
public hevent_postframe(ent)
{
	new id=pev(ent,pev_owner)
	if(!is_user_connected(id)||!has_gak47[id])
		return HAM_IGNORED
 
	new Float:nextattack=get_pdata_float(id,83, 5)
	new bpammo=cs_get_user_bpammo(id, CSW_AK47)
	new clip=get_pdata_int(ent,51,4)
	new inreload=get_pdata_int(ent,54, 4) 
 
	if(inreload&&nextattack<= 0.0 )
	{
		new j=min(get_pcvar_num(cvar_clip)-clip,bpammo)
		set_pdata_int(ent,51,clip+j,4)
		cs_set_user_bpammo(id, CSW_AK47, bpammo-j)
		set_pdata_int(ent,54, 0,4)
		inreload=0
		in_reload[id]=0
	}
	return HAM_IGNORED
}
 
 
public hevent_reload(ent)
{
	new id=pev(ent,pev_owner)
	if(!is_user_connected(id)||!has_gak47[id])
		return HAM_IGNORED
	gak_clip[id] = -1
 
	new bpammo=cs_get_user_bpammo(id, CSW_AK47)
	new clip=get_pdata_int(ent,51,4)
 
	if(bpammo<=0||clip>=get_pcvar_num(cvar_clip))
		return HAM_SUPERCEDE
	gak_clip[id]=clip
	in_reload[id]=1
	return HAM_IGNORED
}
 
public hevent_reload_post(ent)
{
	new id=pev(ent,pev_owner)
	if(!is_user_connected(id)||!has_gak47[id]||gak_clip[id]==1)
		return HAM_IGNORED
 
	new bpammo=cs_get_user_bpammo(id, CSW_AK47)
	new clip=get_pdata_int(ent,51,4)
	if(bpammo<=0||clip>=get_pcvar_num(cvar_clip))
		return HAM_SUPERCEDE
 
	set_pdata_int(ent,51,gak_clip[id], 4)
	set_pdata_float(ent,48,get_pdata_float(ent,48,4)*get_pcvar_float(cvar_reload_time),4)
	set_pdata_float(id,83,get_pdata_float(id,83,5)*get_pcvar_float(cvar_reload_time),5)
	set_pdata_int(ent,54,1,4)
	return HAM_IGNORED;
}
//:::STOCK:::
//Egy saját stockom(erre copyright van xD)
//Eldobja ez elsődleges fegyvert
stock drop_pri(id)
{
	for(new j = 0; j < sizeof priwpns; j++)
	{
		engclient_cmd(id,"drop", priwpns[j])
	}
}