#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <cstrike>
#tryinclude <shop>

public Plugin:myinfo = 
{
	name = "Happy New Year_2k18",
	author = "",
	description = "",
	version = "2k18.b2",
	url = ""
}

static const String: sDownloadTable[][] = 
{

	"models/models_kit/xmas/xmastree.dx80.vtx",
	"models/models_kit/xmas/xmastree.dx90.vtx",
	"models/models_kit/xmas/xmastree.mdl",
	"models/models_kit/xmas/xmastree.phy",
	"models/models_kit/xmas/xmastree.sw.vtx",
	"models/models_kit/xmas/xmastree.vvd",
	"models/models_kit/xmas/xmastree.xbox.vtx",
	"models/logandougall/cel/cel_xmas_snowman.dx80.vtx",
	"models/logandougall/cel/cel_xmas_snowman.dx90.vtx",
	"models/logandougall/cel/cel_xmas_snowman.mdl",
	"models/logandougall/cel/cel_xmas_snowman.phy",
	"models/logandougall/cel/cel_xmas_snowman.sw.vtx",
	"models/logandougall/cel/cel_xmas_snowman.vvd",
	"materials/models/logandougall/cel/carrot.vtf",
	"materials/models/logandougall/cel/carrot.vmt",
	"materials/models/logandougall/cel/toolsblack.vmt",
	"materials/models/logandougall/cel/bark.vmt",
	"materials/models/logandougall/cel/bark.vtf",
	"models/models_kit/xmas/giftbox_mini_quad.dx80.vtx",
	"models/models_kit/xmas/giftbox_mini_quad.dx90.vtx",
	"models/models_kit/xmas/giftbox_mini_quad.mdl",
	"models/models_kit/xmas/giftbox_mini_quad.phy",
	"models/models_kit/xmas/giftbox_mini_quad.sw.vtx",
	"models/models_kit/xmas/giftbox_mini_quad.vvd",
	"models/models_kit/xmas/giftbox_mini_quad.xbox.vtx",
	"materials/models/models_kit/xmas/giftbox.vmt",
	"materials/models/models_kit/xmas/giftbox.vtf",
	"models/models_kit/xmas/xmastree_mini.dx80.vtx",
	"models/models_kit/xmas/xmastree_mini.dx90.vtx",
	"models/models_kit/xmas/xmastree_mini.mdl",
	"models/models_kit/xmas/xmastree_mini.phy",
	"models/models_kit/xmas/xmastree_mini.sw.vtx",
	"models/models_kit/xmas/xmastree_mini.vvd",
	"models/models_kit/xmas/xmastree_mini.xbox.vtx",
	"materials/models/models_kit/xmas/xmastree_miscA.vmt",
	"materials/models/models_kit/xmas/xmastree_miscA.vtf",
	"materials/models/models_kit/xmas/xmastree_miscA_skin2.vmt",
	"materials/models/models_kit/xmas/xmastree_miscA_skin2.vtf",
	"materials/models/models_kit/xmas/xmastree_miscB.vmt",
	"materials/models/models_kit/xmas/xmastree_miscB.vtf",
	"materials/models/models_kit/xmas/xmastree_miscB_skin2.vmt",
	"materials/models/models_kit/xmas/xmastree_miscB_skin2.vtf",
	"materials/models/models_kit/xmas/xmastree_miscB_spec.vtf"
}

String:g_sFile[64];

public OnPluginStart()
{
	HookEvent("player_death", Event_PlayerDeath);
	HookEvent("round_start", Event_RoundStart);
	
	RegAdminCmd("sm_gift",		GiftMe,			ADMFLAG_ROOT);
	RegAdminCmd("sm_tree",		CreateTree,		ADMFLAG_ROOT);
	RegAdminCmd("sm_del",		DeleteTree,		ADMFLAG_ROOT);
	RegAdminCmd("sm_snowman",	CreateSnowman,	ADMFLAG_ROOT);
	RegAdminCmd("sm_large",		CreateLarge,	ADMFLAG_ROOT);
	
	
	

}

public OnMapStart()
{
	for(new i; i < sizeof(sDownloadTable); i++)
	{
		AddFileToDownloadsTable(sDownloadTable[i]);
	}
	
	PrecacheModel("sprites/glow01.spr", true); 
	PrecacheModel("models/models_kit/xmas/giftbox_mini_quad.mdl", true); 
	PrecacheModel("models/models_kit/xmas/xmastree_mini.mdl", true); 
	PrecacheModel("models/logandougall/cel/cel_xmas_snowman.mdl", true); 
	PrecacheModel("models/models_kit/xmas/xmas_teddybear.mdl", true); 
	PrecacheModel("models/models_kit/xmas/xmastree.mdl", true); 
	PrecacheModel("models/logandougall/cel/cel_xmas_snowball_16.mdl", true); 
	
	decl String: g_sCurrentMap[32];
	GetCurrentMap(g_sCurrentMap, sizeof(g_sCurrentMap));
	
	if(!DirExists("addons/sourcemod/configs/newyear/"))
	{
		CreateDirectory("addons/sourcemod/configs/newyear/", 511);
	}
	FormatEx(g_sFile, sizeof(g_sFile), "addons/sourcemod/configs/newyear/%s.cfg", g_sCurrentMap);
}




public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	if (IsClientInGame(client))
	{
		CreateTimer(2.0, Gift, GetClientUserId(client));
	}
}

public Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
	new Handle:kv = CreateKeyValues("tree");
	if (FileToKeyValues(kv, g_sFile) && KvGotoFirstSubKey(kv)) 
	{ 
		decl String:KeyName[50]; 
		do 
		{ 
			if (KvGetSectionName(kv, KeyName, 50)) 
			{
				decl Float:g_fOrigin[3], Float:g_fAngles[3], String:type[20];
				KvGetVector(kv, "1", g_fOrigin);
				KvGetVector(kv, "2", g_fAngles);
				KvGetString(kv, "type", type, sizeof(type));
				if (StrEqual(type, "tree") || StrEqual(type, ""))
				{
					SpawnTree(g_fOrigin, g_fAngles);
					new w_color[4] = { 0, 0, 0, 255 };
					decl String: color[20], Float: Ori[3];
					g_fOrigin[2] += 10;
					for (new i = 1; i<= 10; i++)
					{
						for (new q = 0; q < 3; q++) w_color[q] = GetRandomInt(10, 255);
						for (new a = 0; a < 3; a++) Ori[a] = g_fOrigin[a]
						
						FormatEx(color, sizeof(color), "%i %i %i", w_color[0], w_color[1], w_color[2]);
						
						new index = CreateEntityByName("env_sprite");
						DispatchKeyValue(index, "rendermode", "5");
						DispatchKeyValue(index, "rendercolor", color);
						DispatchKeyValue(index, "renderamt", "255");
						DispatchKeyValue(index, "scale", "0.6");
						DispatchKeyValue(index, "model", "sprites/glow01.spr");
						DispatchSpawn(index);
						AcceptEntityInput(index, "ShowSprite");
						new Float:crd;
						switch(i)
						{
							case 1: crd = 97.0;
							case 2: crd = -97.0;
							case 3: crd = 92.0;
							case 4: crd = -92.0;
							case 5: crd = 17.0;
							case 6: crd = -17.0;
							case 7: crd = 12.0;
							case 8: crd = -12.0;
							case 9: crd = 7.0;
							case 10: crd = -7.0;
						}
						
						Ori[2] += 10*i;
						Ori[0] += crd; 
						Ori[1] +=  crd;
						TeleportEntity(index, Ori, g_fAngles, NULL_VECTOR);
					}
				}
				if (StrEqual(type, "snowman"))
				{
					SpawnSnowMan(g_fOrigin, g_fAngles);
				}
				if (StrEqual(type, "large"))
				{
					SpawnLarge(g_fOrigin, g_fAngles);
				}
			}
         }
         while (KvGotoNextKey(kv));
	}
	
	CloseHandle(kv);
}

public Action:Gift(Handle:timer, any:userid)
{
	new i = GetClientOfUserId(userid);
	
	if (i && IsClientInGame(i))
	{
		new iEntity = CreateEntityByName("prop_dynamic");
		if (iEntity)
		{
			decl Float:fPos[3], String:clr[20];
			new String:sTargetName[32],
				String:sBufer[70],
				Float:fTime = 30.0;
				
			GetClientAbsOrigin(i, fPos);
			fPos[0] += 50.0;
			
			if (!IsPlayerAlive(i))
			{
				fPos[2] -= 40.0;
			}
			
			Format(sTargetName, sizeof(sTargetName), "xmasgift_%i", iEntity);
			DispatchKeyValueVector(iEntity, "origin", fPos);
			DispatchKeyValue(iEntity, "solid", "6");
			DispatchKeyValue(iEntity, "model", "models/models_kit/xmas/giftbox_mini_quad.mdl");
			DispatchKeyValue(iEntity, "targetname", sTargetName);
			SetVariantString(sTargetName);
			DispatchSpawn(iEntity);
			SetEntProp(iEntity, Prop_Send, "m_usSolidFlags", 8);
			SetEntProp(iEntity, Prop_Send, "m_CollisionGroup", 1);
			Format(sBufer, sizeof(sBufer), "OnUser1 !self:kill::%0.2f:-1", fTime);
			SetVariantString(sBufer);
			AcceptEntityInput(iEntity, "AddOutput");
			AcceptEntityInput(iEntity, "FireUser1");

			
			new iRotating = CreateEntityByName("func_rotating", -1);
			DispatchKeyValueVector(iRotating, "origin", fPos);
			DispatchKeyValue(iRotating, "targetname", sTargetName);
			DispatchKeyValue(iRotating, "maxspeed", "180");
			DispatchKeyValue(iRotating, "friction", "0");
			DispatchKeyValue(iRotating, "dmg", "0");
			DispatchKeyValue(iRotating, "solid", "0");
			DispatchKeyValue(iRotating, "spawnflags", "64");
			DispatchSpawn(iRotating);
			SetVariantString("!activator");
			AcceptEntityInput(iEntity, "SetParent", iRotating, iRotating);
			AcceptEntityInput(iRotating, "Start", -1, -1);
			SetEntProp(iRotating, Prop_Send, "m_CollisionGroup", 1);
			Format(sBufer, sizeof(sBufer), "OnUser1 !self:kill::%0.2f:-1", fTime);
			SetVariantString(sBufer);
			AcceptEntityInput(iRotating, "AddOutput");
			AcceptEntityInput(iRotating, "FireUser1");
			SetEntPropEnt(iEntity, Prop_Send, "m_hEffectEntity", iRotating);
			
			Format(clr, sizeof(clr), "%i %i %i", GetRandomInt(0,255),GetRandomInt(0,255),GetRandomInt(0,255));
			new index5 = CreateEntityByName("env_sprite");
			DispatchKeyValue(index5, "rendermode", "5");
			DispatchKeyValue(index5, "rendercolor", String:clr);
			DispatchKeyValue(index5, "renderamt", "255");
			DispatchKeyValue(index5, "scale", "1");
			DispatchKeyValue(index5, "model", "sprites/glow01.spr");
			DispatchKeyValueVector(index5, "origin", fPos);
			DispatchSpawn(index5);
			SetVariantString("!activator");
			AcceptEntityInput(index5, "SetParent", iEntity); 


			SDKHook(iEntity, SDKHook_StartTouch, Hook_GiftStartTouch);
		}
	}
	return Plugin_Stop;
}

public Hook_GiftStartTouch(iEntity, activator)
{
	if (activator > 0 && activator <= MaxClients) 
	{
		switch (GetRandomInt(1,9))
		{
				
			#if defined _shop_included
			case 1:
			{
				new shopwin = GetRandomInt(0,100);
				
				if (shopwin <= 15)
					PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася бронзовый лотерейный билет с выигрышем в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, GetRandomInt(1000,1500), CREDITS_BY_NATIVE));
					
				else if (shopwin <= 40)
					PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася серебрянный лотерейный билет с выигрышем в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, GetRandomInt(1500,2500), CREDITS_BY_NATIVE));

				else if (shopwin <= 60)
					PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася золотой лотерейный билет с выигрышем в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, GetRandomInt(2500,3500), CREDITS_BY_NATIVE));
				
				else if (shopwin <= 80)
					PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася платиновый лотерейный билет с выигрышем в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, GetRandomInt(3500,4500), CREDITS_BY_NATIVE));
				
				else if (shopwin <= 99)
					PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася \x03VIP\x01 лотерейный билет с выигрышем в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, GetRandomInt(4500,5500), CREDITS_BY_NATIVE));

				else 
				{
					switch (GetRandomInt(0,3))
					{
						case 1: {PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася лотерейный билет с \x03ДЖЕКПОТОМ\x01 размером в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, 25000, CREDITS_BY_NATIVE));}
						case 2: {PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася лотерейный билет с \x03ДЖЕКПОТОМ\x01 размером в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, 35000, CREDITS_BY_NATIVE));}
						case 3: {PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказалася лотерейный билет с \x03ДЖЕКПОТОМ\x01 размером в \x03%i\x01 кр! ", Shop_GiveClientCredits(activator, 45000, CREDITS_BY_NATIVE));}
						default: PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 В Подарке оказался испорченый лотерейный билет с \x03ДЖЕКПОТОМ\x01.");
					}
				}
			}
			#endif
			
			default: {PrintToChat(activator,"\x04[✲Новогодний Подарок✲]\x01 К сожалению, подарок был пуст.");}
		}
	}
	
	if(IsValidEdict(iEntity))
	{
		new iRotating = GetEntPropEnt(iEntity, Prop_Send, "m_hEffectEntity");
		if(iRotating && IsValidEdict(iRotating))
		{
			AcceptEntityInput(iRotating, "Kill");
		}
		
		AcceptEntityInput(iEntity, "Kill");
	}
}



public Action:GiftMe(client, args)
{
	CreateTimer(0.1, Gift, GetClientUserId(client));
	return Plugin_Handled;
}

public Action:CreateTree(client, args)
{
	CreateSomethink(client, "tree");
	return Plugin_Handled;
}

public Action:CreateLarge(client, args)
{
	CreateSomethink(client, "large");
	return Plugin_Handled;
}

public Action:CreateSnowman(client, args)
{
	CreateSomethink(client, "snowman");
	return Plugin_Handled;
}

public bool:Trace_FilterPlayers(entity, contentsMask, any:data){
	if(entity != data && entity > MaxClients) 
		return true;
	return false;
}

CreateSomethink(client, const String: sType[])
{
	decl Float:g_fOrigin[3], Float:g_fAngles[3];
	GetClientEyePosition(client, g_fOrigin);
	GetClientEyeAngles(client, g_fAngles);
	
	TR_TraceRayFilter(g_fOrigin, g_fAngles, MASK_SOLID, RayType_Infinite, Trace_FilterPlayers, client);
	
	if(TR_DidHit(INVALID_HANDLE))
	{
		TR_GetEndPosition(g_fOrigin, INVALID_HANDLE);
		TR_GetPlaneNormal(INVALID_HANDLE, g_fAngles);
		GetVectorAngles(g_fAngles, g_fAngles);
		g_fAngles[0] += 90.0;
		switch(sType[0])
		{
			case 't': SpawnTree(g_fOrigin, g_fAngles);
			case 'l': SpawnLarge(g_fOrigin, g_fAngles);
			case 's': SpawnSnowMan(g_fOrigin, g_fAngles);
		}
		
		new Handle:kv = CreateKeyValues("tree");
		FileToKeyValues(kv, g_sFile);
		decl String:info[60];
		FormatEx(info, sizeof(info), "%f,%f",g_fOrigin[0], g_fOrigin[1]);
		KvJumpToKey(kv, info, true); 
		KvSetVector(kv, "1", g_fOrigin); 
		KvSetVector(kv, "2", g_fAngles);
		KvSetString(kv, "type", sType);
		KvRewind(kv);
		KeyValuesToFile(kv, g_sFile);
		CloseHandle(kv);
	}	
}

SpawnTree(const Float:g_fOrigin[3], const Float:g_fAngles[3])
{
	new index = CreateEntityByName("prop_dynamic");
	DispatchKeyValue(index, "model", "models/models_kit/xmas/xmastree_mini.mdl");
	DispatchKeyValue(index, "Solid", "6");
	DispatchSpawn(index);
	TeleportEntity(index, g_fOrigin, g_fAngles, NULL_VECTOR);
	SetEntityMoveType(index, MOVETYPE_VPHYSICS);
}

SpawnLarge(const Float:g_fOrigin[3], const Float:g_fAngles[3])
{
	new index = CreateEntityByName("prop_dynamic_override");
	if (index == -1) return;
	DispatchKeyValue(index, "model", "models/models_kit/xmas/xmastree.mdl");
	DispatchKeyValue(index, "Solid", "6");
	DispatchSpawn(index);
	TeleportEntity(index, g_fOrigin, g_fAngles, NULL_VECTOR);
	SetEntityMoveType(index, MOVETYPE_VPHYSICS);
}

SpawnSnowMan(const Float:g_fOrigin[3], const Float:g_fAngles[3])
{
	new index = CreateEntityByName("prop_dynamic");
	DispatchKeyValue(index, "model", "models/logandougall/cel/cel_xmas_snowman.mdl");
	DispatchKeyValue(index, "Solid", "6");
	DispatchSpawn(index);
	TeleportEntity(index, g_fOrigin, g_fAngles, NULL_VECTOR);
	SetEntityMoveType(index, MOVETYPE_VPHYSICS);
}

public Action:DeleteTree(client, args)
{
	new index = GetClientAimTarget(client, false);
	if (index  == -1)	return Plugin_Handled;
	
	decl Float:vec[3]; decl String:coord[15]; decl String:coord1[15], String:buf3[2][25], String:buf4[2][25]; 
	GetEntPropVector(index, Prop_Data, "m_vecAbsOrigin", vec);
	FloatToString(vec[0], coord, sizeof(coord));
	FloatToString(vec[1], coord1, sizeof(coord1));
	ExplodeString(coord, ".", buf3, 2, 25);
	ExplodeString(coord1, ".", buf4, 2, 25);
	
	new Handle:kv = CreateKeyValues("tree");
	if (FileToKeyValues(kv, g_sFile) && KvGotoFirstSubKey(kv)) 
	{ 
		decl String:KeyName[35]; 
		do 
		{ 
			if (KvGetSectionName(kv, KeyName, 35)) 
			{ 
				decl String:buf[2][25],String:buf1[2][25],String:buf2[2][25];
				ExplodeString(String:KeyName, ",", String:buf, 2, 25);
				ExplodeString(String:buf[0], ".", String:buf1, 2, 25);
				ExplodeString(String:buf[1], ".", String:buf2, 2, 25);
				if (StrEqual(buf1[0], buf3[0]) && StrEqual(buf2[0], buf4[0]))
				{
					AcceptEntityInput(index, "Kill");
					KvDeleteThis(kv); 
					KvRewind(kv); 
					KeyValuesToFile(kv, g_sFile);
				}
			}
         } 
         while (KvGotoNextKey(kv));
	
	}
	CloseHandle(kv);
	return Plugin_Handled;
}

	
public Action:Go(Handle:timer, any:val)
{
	if (IsValidEntity(val))
	{
		AcceptEntityInput(val, "Kill");
	}
}

UTIL_FindSendPropOffs(const String:sNetClass[], const String:sPropertyName[])
{
	new iOffset = FindSendPropInfo(sNetClass, sPropertyName);
	if (iOffset == -1) SetFailState("Fatal Error: Unable to find offset: \"%s::%s\"", sNetClass, sPropertyName);
	return iOffset;
}