#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <zombiereloaded>
#include <hlstatsx_loghelper>

#pragma semicolon 1
#pragma newdecls required

bool g_bDisabled[2048];
bool g_bOnCD = false;

ConVar g_cCD;

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
	name        = "Trigger Rewards",
	author      = "Neon",
	description = "HLSTATS Trigger Rewards",
	version     = "1.0",
	url         = "https://steamcommunity.com/id/n3ontm"
};

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart()
{
	g_cCD = CreateConVar("sm_trigger_reward_cd", "10.0", "Cooldown between HLSTATS Trigger rewards", 0, true, 0.1);
	AutoExecConfig(true, "plugin.TriggerRewards");

	HookEvent("round_start", OnRoundStart);
	HookEntityOutput("trigger_once", "OnStartTouch", OnStartTouch);
	HookEntityOutput("func_button", "OnPressed", OnPressed);
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast)
{
	for(int i = 0; i < 2048; i++)
		g_bDisabled[i] = false;
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnStartTouch(const char[] sOutput, int iCaller, int iActivator, float fDelay)
{
	if (!IsValidClient(iActivator))
		return;

	if (g_bDisabled[iCaller] || g_bOnCD)
		return;

	if (!(ZR_IsClientHuman(iActivator)))
		return;

	g_bDisabled[iCaller] = true;
	g_bOnCD = true;

	CreateTimer(g_cCD.FloatValue, ResetCD);

	LH_LogPlayerEvent(iActivator, "triggered", "trigger", true);
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPressed(const char[] sOutput, int iCaller, int iActivator, float fDelay)
{
	if(!IsValidClient(iActivator))
		return;

	if (g_bDisabled[iCaller] || g_bOnCD)
		return;

	if (!(ZR_IsClientHuman(iActivator)))
		return;

	int iParent = INVALID_ENT_REFERENCE;
	if ((iParent = GetEntPropEnt(iCaller, Prop_Data, "m_hMoveParent")) != INVALID_ENT_REFERENCE)
	{
		char sClassname[64];
		GetEdictClassname(iParent, sClassname, sizeof(sClassname));

		if (strncmp(sClassname, "weapon_", 7, false) == 0)
			return;
	}

	g_bDisabled[iCaller] = true;
	g_bOnCD = true;

	CreateTimer(g_cCD.FloatValue, ResetCD);

	LH_LogPlayerEvent(iActivator, "triggered", "trigger", true);
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action ResetCD(Handle timer)
{
	g_bOnCD = false;
}

//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public bool IsValidClient(int iClient)
{
	if ( !( 1 <= iClient <= MaxClients ) || !IsClientInGame(iClient) || !IsPlayerAlive(iClient))
		return false;

	return true;
}