#include <amxmodx>
#include <amxmisc>
#include <colorchat>
#include <cstrike>
#include <fakemeta>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Heroes Mode"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

#define Ham_CS_Player_ResetMaxSpeed Ham_Item_PreFrame // если amxmodx > 1.8.3, то закоментируйте строку
#define HeroesAmmount 4 // Максимум героев [Не трогать]
#define MaxPlayer 32 // Максимум игроков [Не трогать]
#define TaskIdOne 19867 // Ид задачи [Не трогать]

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_8|MENU_KEY_0;
new keys2 = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_8|MENU_KEY_0;

new gHero[MaxPlayer];
new OptionSave[MaxPlayer];

new const HeroModel1[] = "models/player/hero1/hero1.mdl"; // Путь до модели героя 1
new const HeroModel2[] = "models/player/hero2/hero2.mdl"; // Путь до модели героя 2
new const HeroModel3[] = "models/player/hero3/hero3.mdl"; // Путь до модели героя 3
new const HeroModel4[] = "models/player/hero4/hero4.mdl"; // Путь до модели героя 4

new HeroesList[HeroesAmmount][]=
{
	"Хиппер", // Имя 1 героя
	"Мэйтдрайв", // Имя 2 героя
	"Хэбатор", // Имя 3 героя
	"Фрилансия" // Имя 4 героя
};

new HeroesDescription[HeroesAmmount][]=
{
	"Баланс сил: HP[+], Speed [+], Jump [+]", // Описание способности 1 героя
	"Гравитация: HP [+], Speed [+], Jump [++]", // Описание способности 2 героя
	"Сильный: HP [++], Speed [-], Jump [-] Dmg [+]", // Описание способности 3 героя
	"Скорость: HP [+], Speed [++], Jump [+]" // Описание способности 4 героя
};

new HeroesHealth[HeroesAmmount]=
{
	110, // Кол-во здоровья у 1 героя
	110, // Кол-во здоровья у 2 героя
	130, // Кол-во здоровья у 3 героя
	105 // Кол-во здоровья у 4 героя

};

new Float: HeroesSpeed[HeroesAmmount]=
{
	270.0, // Скорость 1 героя
	270.0, // Скорость 2 героя
	250.0, // Скорость 3 героя (250.0 - стандартная)
	300.0 // Скорость 4 героя

};

new Float: HeroesGravity[HeroesAmmount]=
{
	0.9, // Значение гравитации у 1 героя
	0.8, // Значение гравитации у 2 героя
	1.0, // Значение гравитации у 3 героя (1.0 - стандартная)
	0.9 // Значение гравитации у 4 героя

};

new Float: DmgHero = 1.2; // Насколько умножать урон у героя Хэбатор

public plugin_precache()
{
	precache_model(HeroModel1);
	precache_model(HeroModel2);
	precache_model(HeroModel3);
	precache_model(HeroModel4);
}

public plugin_connect(id)
{
	gHero[id] = 0;
}

public plugin_disconnect(id)
{
	remove_task(TaskIdOne);
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR);
	register_clcmd("say /hero", "HeroesMenu");
	
	RegisterHam(Ham_Spawn, "player", "SpawnFunction", .Post = true);
	RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "SpeedFunction", .Post = true);
	RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = true)
	
	register_menu("Menu 1", keys, "Menu_Heroes");
	register_menu("Menu 2", keys2, "Menu_Description");
	
	set_task(1.0, "HudMessage", TaskIdOne, _, _, "b");
}

public SpawnFunction(id)
{
	if(!is_user_alive(id))
		return;
			
	OptionSave[id] = false;
	ModelChangeFunction(id);
	RenderModel(id);
	HealthFunction(id);
	HeroesMenu(id);
	GravityFunction(id);
}

public HudMessage()
{
	for(new id = 1; id <= get_maxplayers(); id++)
	{
		if(!is_user_alive(id))
			continue;
		
		set_hudmessage(0, 255, 0, 0.01, 0.18, 0, 6.0, 1.0, 1.0, 1.0, 1)
		show_hudmessage(id, "Герой: %s", HeroesList[gHero[id]]);
	}
}

public HeroesMenu(id)
{
	if(!is_user_alive(id))
		return;
	
	if(OptionSave[id])
	{
		ColorChat(id, GREEN, "Вы в этом раунде уже выбирали героя");
		return;
	}
	
	static menu[650], iLen
	iLen = 0
	iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yМеню Героев^n\rВыберите персонажа^n^n")
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", HeroesList[0])
	keys |= MENU_KEY_1
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", HeroesList[1])
	keys |= MENU_KEY_2

	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", HeroesList[2])
	keys |= MENU_KEY_3

	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n^n", HeroesList[3])
	keys |= MENU_KEY_4
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r8. \w-- \rИнформация о героях \w--^n")
	keys |= MENU_KEY_8
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n")
	keys |= MENU_KEY_0

	show_menu(id, keys, menu, -1, "Menu 1")
}

public Menu_Heroes(id, key)
{
	if(!is_user_alive(id))
		return;
	
	switch(key)
	{
		case 0:
		{
			gHero[id] = 0;
			OptionSave[id] = true;
			ModelChangeFunction(id);
			HealthFunction(id);
			SpeedFunction(id);
			GravityFunction(id);
			MessageInfo(id);
		}
		case 1:
		{
			gHero[id] = 1;
			OptionSave[id] = true;
			ModelChangeFunction(id);
			HealthFunction(id);
			SpeedFunction(id);
			GravityFunction(id);
			MessageInfo(id);
		}
		case 2:
		{
			gHero[id] = 2;
			OptionSave[id] = true;
			ModelChangeFunction(id);
			HealthFunction(id);
			SpeedFunction(id);
			GravityFunction(id);
			MessageInfo(id);
		}
		case 3:
		{
			gHero[id] = 3;
			OptionSave[id] = true;
			ModelChangeFunction(id);
			HealthFunction(id);
			SpeedFunction(id);
			GravityFunction(id);
			MessageInfo(id);
		}
		case 7:
		{
			DescriptionMenu(id);
		}
	}
}

public DescriptionMenu(id)
{
	if(!is_user_alive(id))
		return;
	
	static menu[650], iLen
	iLen = 0
	iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВозможности Героев^n\rВыбор невозможен^n^n")
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", HeroesDescription[0])
	keys2 &= MENU_KEY_1
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", HeroesDescription[1])
	keys2 &= MENU_KEY_2

	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", HeroesDescription[2])
	keys2 &= MENU_KEY_3

	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n^n", HeroesDescription[3])
	keys2 &= MENU_KEY_4
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r8. \w-- \rВыбрать героя \w--^n")
	keys2 |= MENU_KEY_8		
	
	iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n")
	keys2 |= MENU_KEY_0

	show_menu(id, keys2, menu, -1, "Menu 2")
}

public Menu_Description(id, key)
{
	if(!is_user_alive(id))
	return;
	
	switch(key)
	{
		case 0: client_print(id, print_chat, "Автор плагина: 6u3oH"); // Пункт нажать нельзя
		case 1: client_print(id, print_chat, "Контакты: vk.com/6u3oH"); // Потому пишу здесь
		case 2: client_print(id, print_chat, "Группа Вконтакте:"); // На правах автора
		case 3: client_print(id, print_chat, "vk.com/halh_gamers"); // Свою рекламу
		case 7: HeroesMenu(id)
	}
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: szDamage, szDamagebits )
{
	if(!is_user_connected(szVictim) || !is_user_connected(szAttacker))
		return;
	
	if(cs_get_user_team(szAttacker) == cs_get_user_team(szVictim) || szAttacker == szVictim)
		return;
	
	if(gHero[szAttacker] == 2)
	{
		szDamage *= DmgHero;
	}
}

public MessageInfo(id)
{
	if(!is_user_alive(id))
		return;
		
	ColorChat(id, GREEN, "Вы выбрали героя: ^4%s", HeroesList[gHero[id]]);
	ColorChat(id, GREEN, "Описание - ^4%s", HeroesDescription[gHero[id]]);
}

public RenderModel(id)
{    	
	if(!is_user_alive(id))
		return;
	
	if(cs_get_user_team(id) == CS_TEAM_T)
	{
		set_user_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 10)
	}

	if(cs_get_user_team(id) == CS_TEAM_CT)
	{
		set_user_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 10)
	}
}

public ModelChangeFunction(id)
{
	if(!is_user_alive(id))
		return;

	switch(gHero[id])
	{
		case 0:	cs_set_user_model(id, "hero1");
		case 1:	cs_set_user_model(id, "hero2");
		case 2:	cs_set_user_model(id, "hero3");
		case 3:	cs_set_user_model(id, "hero4");
	}
}

public HealthFunction(id)
{
	if(!is_user_alive(id))
		return;
	
	set_user_health(id, HeroesHealth[gHero[id]]);
}

public SpeedFunction(id)
{
	if(!is_user_alive(id))
		return;
		
	set_user_maxspeed(id, Float: HeroesSpeed[gHero[id]]);
}

public GravityFunction(id)
{
	if(!is_user_alive(id))
		return;
	
	set_user_gravity(id, Float: HeroesGravity[gHero[id]]);
}