//	Copyright © 2016 Vaqtincha

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

#define MIN_ARMOURYS			2
#define GLOW_THICK_VALUE		10
// #define DEBUG

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/


#include <amxmodx>
#include <fakemeta>
#include <reapi>

#define SET_MODEL(%1,%2)		engfunc(EngFunc_SetModel, %1, %2)

new const g_szArmouryModels[any:ARMOURY_SMOKEGRENADE+1][] = {

	"models/w_mp5.mdl",
	"models/w_tmp.mdl",
	"models/w_p90.mdl",
	"models/w_mac10.mdl",
	"models/w_ak47.mdl",
	"models/w_sg552.mdl",
	"models/w_m4a1.mdl",
	"models/w_aug.mdl",
	"models/w_scout.mdl",
	"models/w_g3sg1.mdl",
	"models/w_awp.mdl",
	"models/w_m3.mdl",
	"models/w_xm1014.mdl",
	"models/w_m249.mdl",
	"models/w_flashbang.mdl",
	"models/w_hegrenade.mdl",
	"models/w_kevlar.mdl",
	"models/w_assault.mdl",
	"models/w_smokegrenade.mdl"
}

const ARMOURY_DATA = 100

new const class[] = "armoury_entity"
new g_pCvar, g_pRandomGlow, m_iTotalArmouryCount
new bool:g_bChanged

public plugin_init() 
{
	register_plugin("[ReApi] Random Map Weapons", "0.0.1", "Vaqtincha")
	
	g_pCvar = register_cvar("random_armourys", "1")
	g_pRandomGlow = register_cvar("random_glow", "0")

	MapArmouryData()
#if defined DEBUG
	server_print("TotalArmouryCount: %d", m_iTotalArmouryCount)
#endif
	if(m_iTotalArmouryCount < MIN_ARMOURYS)
	{
		pause("ad")
		return
	}

	RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound", .post = true)
	CSGameRules_RestartRound()
}


public CSGameRules_RestartRound()
{
	if(get_pcvar_num(g_pCvar))
	{
		SetRandomArmoury(bool:get_pcvar_num(g_pRandomGlow))
		g_bChanged = true
	}
	else{
		if(g_bChanged)
		{
			MapArmouryData(.bRestore = true)
			g_bChanged = false
		}
	}

	return HC_CONTINUE
}

SetRandomArmoury(bool:bGlow)
{
	new iEnt = NULLENT, iRandItem, Float:flColor[3]

	while((iEnt = rg_find_ent_by_class(iEnt, class)))
	{
		iRandItem = random_num(any:ARMOURY_MP5NAVY, any:ARMOURY_SMOKEGRENADE)
		set_armoury_type(iEnt, iRandItem)
	
		if(bGlow)
		{
			flColor[0] = random_float(1.0, 255.0) 
			flColor[1] = random_float(1.0, 255.0) 
			flColor[2] = random_float(1.0, 255.0)
			rg_set_rendering(iEnt, kRenderFxGlowShell, flColor, GLOW_THICK_VALUE.0)
		#if defined DEBUG
			server_print("RandItemID: %d | Model: %s", iRandItem, g_szArmouryModels[iRandItem])
			// server_print("R: %0.f | G: %0.f | B: %0.f", flColor[0], flColor[1], flColor[2])
		#endif
		}else{
			rg_set_rendering(iEnt)
		}
	}
}

MapArmouryData(bool:bRestore = false) // save & restore
{
	new iEnt = NULLENT, iItemId
	while((iEnt = rg_find_ent_by_class(iEnt, class)))
	{
		if(bRestore)
		{
			set_armoury_type(iEnt, (get_entvar(iEnt, var_iuser1) + ARMOURY_DATA))
			rg_set_rendering(iEnt)
		}else{
			iItemId = get_member(iEnt, m_Armoury_iItem)
			set_entvar(iEnt, var_iuser1, iItemId - ARMOURY_DATA) // save def item id
			m_iTotalArmouryCount++
		#if defined DEBUG
			server_print("ItemID: %d | Model: %s", iItemId, g_szArmouryModels[iItemId])
		#endif
		}
	}
}

stock bool:set_armoury_type(iEnt, iItem)
{
	if(!(any:ARMOURY_MP5NAVY <= iItem <= any:ARMOURY_SMOKEGRENADE)) // wrong value
		return false

	set_member(iEnt, m_Armoury_iItem, iItem)
	SET_MODEL(iEnt, g_szArmouryModels[iItem])

	return true
}

stock rg_set_rendering(index, fx = kRenderFxNone, Float:color[3] = {255.0, 255.0, 255.0}, Float:amount = 16.0) 
{
	set_entvar(index, var_renderfx, fx)
	set_entvar(index, var_rendercolor, color)
	set_entvar(index, var_renderamt, amount)
	// return 1
}




