convert plugin to our mod

Unpaid Requests, Public Plugins
Post Reply
czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

convert plugin to our mod

#1

Post by czirimbolo » 4 years ago

can someone help me to convert this to our mod?

Code: Select all

#include <engine>
#include <xs>

#include <colorchat>


#define GET_MONEY(%0)		zp_cs_get_user_money(%0)
#define SET_MONEY(%0,%1) 	zp_cs_set_user_money(%0,%1)
#define GET_EXP(%0)			ze_get_user_xp(%0)
#define SET_EXP(%0,%1)		ze_set_user_xp(%0,%1)

/*
[0.9.5]
- Исправленна поддержка режимов
- Добавлена поддержка BuyMenu, Level System
*/

#define PLUGIN_NAME				"[ZDT] Bonus round: Pierrot"
#define PLUGIN_VERSION			"0.9.5"
#define PLUGIN_AUTHOR			"Doc.Batcon"
#define PLUGIN_PREFIX			"^4[BR]^1"
#define PLUGIN_DICTIONARY		"npc_bonusmon_092.txt"

new const SNOWMAN_ENTITY[] 		= "monster_hevsuit_dead"
new const SNOWMAN_CLASSNAME[] 	= "npc_snowman"
new const SNOWMAN_MODEL[] 		= "models/zdt/monsters/npc_snowman.mdl"
#define SNOWMAN_HEALTH 			100.0
#define SNOWMAN_SPEED			200.0
#define SNOWMAN_BODY			random_num(0, 1)
#define SNOWMAN_SKIN			random_num(0, 5)

new const SNOWMAN_SOUNDS[][] =
{
	"zdt/snow_idle.wav",
	"zdt/snow_die.wav",
	"zdt/snow_pain.wav"
}

enum _: eSnowmanAnim
{
	ANIM_DUMMY,
	ANIM_IDLE,
	ANIM_WALK,
	ANIM_RUN,
	ANIM_JUMP,
	ANIM_FLINCH,
	ANIM_FLINCH2,
	ANIM_DEATH
}
enum _: eSnowmanAct
{
	ACT_DUMMY,
	ACT_IDLE,
	ACT_MOVE,
	ACT_JUMP,
	ACT_FLINCH,
	ACT_DIE
}

#define HUD_EVENT_X			-1.0
#define HUD_EVENT_Y			0.17

#define BR_TASKID			111
#define SP_DIR 				"npc_snowman"

//НАСТРОЙКИ

//obslugiwane mody
enum _: eSupportMods
{
	SUPPORT_CLASSIC,	//[Money]
	SUPPORT_ZP43,		//[AmmoPacks]
	SUPPORT_ZP50,		//[AmmoPacks]
	SUPPORT_BIOHAZARD	//[Money]
}

#define SUPPORT_MOD		SUPPORT_ZP43

//nagroda za zabicie balwana
#define GIVE_REWARD		100
//ilosc expa za balwana
#define GIVE_EXP		1000

//muzyka podczas rundy balwanow		[mozna komentowac aby wylaczyc]
#define BR_MUSIC			"zdt/scenario_xmas.mp3" 
//czas trwania trybu 1.0 = 1 minuta	[mozna komentowac aby wylaczyc]
#define BR_ROUNDTIME		3.0
//szansa na uruchomienie 
#define BR_CHANGE			5
//Maksymalna liczba bałwanów utworzonych na cykl
#define BR_CLOWN_SPAWN		10
//Maksymalna liczba żywych bałwanów
//(zalecane 40-60) 
#define BR_CLOWN_MAX		50
//Blokowanie obrażeń między graczami w trybie [Mozesz komentowac]
//(dla SUPPORT_CLASSIC)
#define BR_BLOCK_DAMAGE		true
//Minimalna odległość między spawnem
#define SP_MIN_DIST		64.0
//Odrodzenie wyświetlania maksymalnego zakresu w menu
#define SP_MAX_SHOW_DIST	512.0
//Wlaczyc obsługę menu Kup? [Możesz komentować]
//#define ENABLED_SUPPORT_BUYMENU
//Włączyć obsługę poziomu systemu? [Możesz komentować]
//#define ENABLED_SUPPORT_LEVELSYSTEM

new g_iMenuClown;
new Array:g_aClownSpawnX, Array:g_aClownSpawnY, Array:g_aClownSpawnZ, Array:g_aSpawns;
new g_sModelIndexBeam;
new bool:g_bBonusRound, g_iBonusRoundStatus, g_iClownSpawned;
new bool:g_bNextRoundIsBonus;
new bool:g_bChangeBonusRound = true;
new bool:g_bIsFirstRound = true;
new g_iTrace;

#if defined BR_ROUNDTIME
new Float:g_fRoundTime;
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true && SUPPORT_MOD != SUPPORT_CLASSIC
	#undef BR_BLOCK_DAMAGE
	#define BR_BLOCK_DAMAGE	false
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
new HamHook:g_HamHookTraceAttack;
new HamHook:g_HamHookTakeDamage;
#endif

#if SUPPORT_MOD == SUPPORT_CLASSIC
	#include <cstrike>
#endif
#if SUPPORT_MOD == SUPPORT_ZP43
	#include <zombie_escape>
#endif
#if SUPPORT_MOD == SUPPORT_ZP50
	#include <zp50_ammopacks>
#endif
#if SUPPORT_MOD == SUPPORT_BIOHAZARD
	#include <cstrike>
	#include <biohazard>
#endif
#if defined ENABLED_SUPPORT_BUYMENU
	native GET_MONEY(pPlayer)
	native SET_MONEY(pPlayer, iValue)
#endif
#if defined ENABLED_SUPPORT_LEVELSYSTEM
	native GET_EXP(pPlayer)
	native SET_EXP(pPlayer, iValue)
#endif

#if SUPPORT_MOD == SUPPORT_ZP43 || SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
new g_CvarID_GameModeDelay;
new Float:g_fRoundDelay;
#endif

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_think(SNOWMAN_CLASSNAME, "Snowman_Think");
	RegisterHam(Ham_Killed, SNOWMAN_ENTITY, "CBaseEntity_Killed", false);
	RegisterHam(Ham_TakeDamage, SNOWMAN_ENTITY, "CBaseEntity_TakeDamage", false);
	RegisterHam(Ham_BloodColor, SNOWMAN_ENTITY, "CBaseEntity_BloodColor", false);
	RegisterHam(Ham_TraceBleed, SNOWMAN_ENTITY, "CBaseEntity_TraceBleed", false);
	RegisterHam(Ham_Classify, SNOWMAN_ENTITY, "CBaseEntity_Classify", false);

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		g_HamHookTraceAttack = RegisterHam(Ham_TraceAttack, "player", "CBasePlayer_TraceAttack", false);
		g_HamHookTakeDamage = RegisterHam(Ham_TakeDamage, "player", "CBasePlayer_TakeDamage", false);
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif

	register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
	register_logevent("Event_RoundStarted", 2, "1=Round_Start");
	register_logevent("Event_RoundEnd", 2, "1=Round_End");
	register_logevent("Event_RoundRestart", 2, "1=Game_Commencing");
	register_event("TextMsg", "Event_RoundRestart", "a", "2=#Game_will_restart_in");

	register_dictionary_colored(PLUGIN_DICTIONARY);

	register_clcmd("say bonusround", "ClientCmd_ShowMenu");
}
public plugin_precache()
{
	precache_model(SNOWMAN_MODEL);
	g_sModelIndexBeam = precache_model("sprites/laserbeam.spr");

	for(new i; i < sizeof SNOWMAN_SOUNDS; i++)
		precache_sound(SNOWMAN_SOUNDS[i]);

	#if defined BR_MUSIC
		new buffer[64]; formatex(buffer, charsmax(buffer), "sound/%s", BR_MUSIC);
		precache_generic(buffer);
	#endif

	g_aSpawns = ArrayCreate(1, 1);
	g_aClownSpawnX = ArrayCreate(1, 1);
	g_aClownSpawnY = ArrayCreate(1, 1);
	g_aClownSpawnZ = ArrayCreate(1, 1);

	g_iTrace = create_tr2();

	g_iMenuClown = menu_create("MENU_TITLE", "MenuHandler_Pierrot");
	menu_additem(g_iMenuClown, "MENU_ITEM_01");
	menu_additem(g_iMenuClown, "MENU_ITEM_02");
	menu_additem(g_iMenuClown, "MENU_ITEM_03");
}
public plugin_cfg()
{
	SP_LoadPoints();

	#if SUPPORT_MOD == SUPPORT_ZP43
		g_CvarID_GameModeDelay = get_cvar_pointer("zp_delay");
	#endif
	#if SUPPORT_MOD == SUPPORT_ZP50
		g_CvarID_GameModeDelay = get_cvar_pointer("zp_gamemode_delay");
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD
		g_CvarID_GameModeDelay = get_cvar_pointer("bh_starttime");
	#endif
}
public Snowman_Reward(const pEntity, const pPlayer)
{
	#if SUPPORT_MOD == SUPPORT_CLASSIC && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_ZP43 && !defined ENABLED_SUPPORT_BUYMENU
		ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_ZP50 && !defined ENABLED_SUPPORT_BUYMENU
		ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if defined ENABLED_SUPPORT_BUYMENU
		SET_MONEY(pPlayer, GET_MONEY(pPlayer) + GIVE_REWARD);
	#endif	
	#if defined ENABLED_SUPPORT_LEVELSYSTEM
		SET_EXP(pPlayer, GET_EXP(pPlayer) + GIVE_EXP);
	#endif	
}
#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
public CBasePlayer_TraceAttack(pPlayer, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBasePlayer_TakeDamage(pPlayer, pInflictor, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
#endif
public BonusRound_Start()
{
	set_dhudmessage(0, 120, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0);
	show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_HUD_PREPARE");

	#if defined BR_MUSIC
		UTIL_StopSound();
		UTIL_PlaySound(0, BR_MUSIC, true);
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		EnableHamForward(g_HamHookTraceAttack);
		EnableHamForward(g_HamHookTakeDamage);
	#endif	

	set_task(1.0, "Task_GL_BonusRound", BR_TASKID, _, _, "b");
	g_iBonusRoundStatus = 1;
	g_bBonusRound = true;
	g_bNextRoundIsBonus = false;
}
public BonusRound_End()
{
	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
		set_pcvar_float(g_CvarID_GameModeDelay, g_fRoundDelay);
	#endif

	remove_task(BR_TASKID);
	g_iBonusRoundStatus = 2;
	g_bBonusRound = false;
	
	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
	{
		if(entity_get_int(pEntity, EV_INT_deadflag) != DEAD_NO)
			continue;

		entity_set_edict(pEntity, EV_ENT_dmg_inflictor, 0);
		Snowman_SetActivity(pEntity, ACT_DIE);
	}
}
public BonusRound_NextRound()
{
	g_bNextRoundIsBonus = true;
	g_bChangeBonusRound = false;
	client_print_color(0, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_PREPARE");

	#if SUPPORT_MOD == SUPPORT_ZP43
		g_fRoundDelay = float(get_pcvar_num(g_CvarID_GameModeDelay));
		set_pcvar_num(g_CvarID_GameModeDelay, 999);
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
		g_fRoundDelay = get_pcvar_float(g_CvarID_GameModeDelay);
		set_pcvar_float(g_CvarID_GameModeDelay, 999.0);
	#endif
}

public Event_RoundStart()
{
	#if defined BR_ROUNDTIME
		if(g_bNextRoundIsBonus)
		{
			g_fRoundTime = get_cvar_float("mp_roundtime");
			server_cmd("mp_roundtime %f", BR_ROUNDTIME);
			server_exec();
		}
	#endif

	if(!g_iBonusRoundStatus)
		return;

	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif	

	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
		entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
	
	remove_task(BR_TASKID);
	g_iClownSpawned = 0;
	g_iBonusRoundStatus = 0;
	g_bBonusRound = false;
}
public Event_RoundStarted()
{
	if(g_bNextRoundIsBonus)
		BonusRound_Start();
}
public Event_RoundEnd()
{
	if(!g_bIsFirstRound && g_bChangeBonusRound && !random_num(0, BR_CHANGE))
	{
		BonusRound_NextRound();
	}

	g_bIsFirstRound = false;

	if(g_iBonusRoundStatus != 1)
		return;

	BonusRound_End();

	#if defined BR_ROUNDTIME
		server_cmd("mp_roundtime %f", g_fRoundTime);
		server_exec();
	#endif
}
public Event_RoundRestart()
{
	g_bNextRoundIsBonus = false;
	g_bChangeBonusRound = true;
	g_bIsFirstRound = true;

	if(!g_iBonusRoundStatus)
		return;

	#if SUPPORT_MOD == SUPPORT_ZP43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
		set_pcvar_float(g_CvarID_GameModeDelay, g_fRoundDelay);
	#endif
}

public Task_GL_BonusRound(TaskID)
{
	new PointID, Float:vPoint[3];
	new iMaxSpawns = BR_CLOWN_SPAWN;
	while(iMaxSpawns && (g_iClownSpawned <= BR_CLOWN_MAX) && ((PointID = SP_GetRandomEmptyPointID()) != -1))
	{
		SP_GetPointOrigin(PointID, vPoint);
		Snowman_Spawn(vPoint);
		iMaxSpawns--;
	}
}
public ClientCmd_ShowMenu(pPlayer)
{
	if(get_user_flags(pPlayer) & ADMIN_IMMUNITY)
	{
		new buffer[64]; 
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_MAIN_TITLE");
		menu_setprop(g_iMenuClown, MPROP_TITLE, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_01");
		menu_item_setname(g_iMenuClown, 0, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_02");
		menu_item_setname(g_iMenuClown, 1, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_03");
		menu_item_setname(g_iMenuClown, 2, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_EXIT");
		menu_setprop(g_iMenuClown, MPROP_EXITNAME, buffer);
		menu_display(pPlayer, g_iMenuClown);
		set_task(0.1, "Task_Client_ShowPoints", pPlayer, _, _, "b");
		set_pdata_int(pPlayer, 205, 0, 5);
	}
	else
	{
		client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_01");
	}
	return PLUGIN_HANDLED;
}
public Task_Client_ShowPoints(pPlayer)
{
	if(!is_user_connected(pPlayer) || !IsShowMenu(pPlayer,g_iMenuClown))
	{
		remove_task(pPlayer);
		return;
	}

	new Float:vOrigin[3]
	new Float:vPoint[3], iPoint[3];
	new PointID = -1;

	entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);

	while((PointID = SP_GetPointInSphere(PointID, vOrigin, SP_MAX_SHOW_DIST)) != -1)
	{
		SP_GetPointOrigin(PointID, vPoint);
		FVecIVec(vPoint, iPoint);

		message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, pPlayer);
		write_byte(TE_BEAMPOINTS);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]-36);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]+36);
		write_short(g_sModelIndexBeam);
		write_byte(1);               
        	write_byte(1);                 
        	write_byte(5);           
        	write_byte(10);     
        	write_byte(2);     
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(200);           
        	write_byte(0);               
        	message_end();
	}
}
public bool:IsShowMenu(pPlayer, iMenu)
{
	new iMenuOLD, iMenuNEW;
	player_menu_info(pPlayer, iMenuOLD, iMenuNEW);
	if(iMenuOLD == iMenu || iMenuNEW == iMenu)
		return true;
	return false;
}
public MenuHandler_Pierrot(pPlayer, iMenuID, iItem)
{
	if(iItem > -1)
		menu_display(pPlayer, iMenuID);

	if(iItem == MENU_EXIT)
		remove_task(pPlayer);

	switch(iItem)
	{
		case 0:
		{
			new Float:vOrigin[3]; UTIL_GetAimOriginSpawn(pPlayer, vOrigin);

			if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_DONT_VACPOINT");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}

			new PointID = SP_GetPointInSphere(-1, vOrigin, SP_MIN_DIST);
			if(PointID == -1)
			{
				SP_AddPoint(vOrigin);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_CREATED");
			}
			else
			{
				SP_SubPoint(PointID);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_DELETED");
			}
		}
		case 1:
		{
			if(SP_SavePoints())
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT");
			else
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT_FAIL");
		}
		case 2:
		{
			if(g_bBonusRound || g_iBonusRoundStatus || g_bNextRoundIsBonus || !SP_GetPointsNum())
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_02");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}
			
			BonusRound_NextRound();
		}
	}

	UTIL_PlaySound(pPlayer, "common/wpn_denyselect.wav");
}
public Snowman_Spawn(const Float:vOrigin[3])
{
	static pEntity;
	if(!(pEntity = create_entity(SNOWMAN_ENTITY)))
		return 0

	entity_set_string(pEntity, EV_SZ_classname, SNOWMAN_CLASSNAME);
	entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
	entity_set_int(pEntity, EV_INT_solid, SOLID_BBOX);
	entity_set_int(pEntity, EV_INT_deadflag, DEAD_NO);
	entity_set_int(pEntity, EV_INT_flags, FL_MONSTER);
	entity_set_int(pEntity, EV_INT_skin, SNOWMAN_SKIN);

	if(!entity_get_int(pEntity, EV_INT_skin))
		entity_set_int(pEntity, EV_INT_body,  SNOWMAN_BODY);
		
	entity_set_float(pEntity, EV_FL_health, SNOWMAN_HEALTH);
	entity_set_float(pEntity, EV_FL_gravity, 1.0);
	entity_set_float(pEntity, EV_FL_framerate, 1.0);
	entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_AIM);
	entity_set_vector(pEntity, EV_VEC_view_ofs, Float:{0.0, 0.0, 10.0});
	entity_set_model(pEntity, SNOWMAN_MODEL);
	entity_set_size(pEntity, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 18.0});
	entity_set_origin(pEntity, vOrigin);
	Snowman_SetActivity(pEntity, ACT_JUMP);
	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
	g_iClownSpawned++;
	return pEntity;
}
public Snowman_Think(const pEntity)
{
	static iActivity; iActivity = entity_get_int(pEntity, EV_INT_iuser1);
	static Float:fGameTime; fGameTime = get_gametime();
	static pTarget; pTarget = entity_get_edict(pEntity, EV_ENT_enemy);
	static Float:fDelay; fDelay = 0.1;
	static Float:vTarget[3];

	if(iActivity == ACT_IDLE || iActivity == ACT_MOVE)
	{
		if(pTarget)
		{
			if(!Snowman_IsValidPlayer(pEntity, pTarget))
			{
				Snowman_SetNextFindPlayer(pEntity, 1.0);
				Snowman_SetNextCheckMove(pEntity, 1.0);
				pTarget = 0;
			}

			if(pTarget)
			{
				entity_get_vector(pTarget, EV_VEC_origin, vTarget);
				Snowman_SetMovePoint(pEntity, vTarget);
				Snowman_SetNextCheckMove(pEntity, 1.0);

				if(Snowman_IsMoveComplete(pEntity) || 
				entity_get_edict(pEntity, EV_ENT_groundentity) == pTarget
				)
					iActivity = ACT_IDLE;
				else
					iActivity = ACT_MOVE;
			}
			else
			{
				iActivity = ACT_IDLE;
			}
		}
		else
		{
			if((Snowman_GetNextCheckMove(pEntity) > fGameTime) && !Snowman_IsMoveComplete(pEntity))
				iActivity = ACT_MOVE;
			else
				iActivity = ACT_IDLE;
		}
	}

	if(entity_get_edict(pEntity, EV_ENT_enemy) == 0)
		pTarget = 0;

	if(Snowman_GetNextFindPlayer(pEntity) < fGameTime)
	{
		pTarget = Snowman_FindTarget(pEntity);
		Snowman_SetNextFindPlayer(pEntity, pTarget ? 5.0 : 1.0);
	}

	entity_set_edict(pEntity, EV_ENT_enemy, pTarget);

	switch(iActivity)
	{
		case ACT_DUMMY:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);
		}
		case ACT_IDLE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
			{
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);

				 if(Snowman_GetNextSoundIdle(pEntity) - fGameTime > 1.0)
				 	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextSoundIdle(pEntity) < fGameTime)
			{
				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextCheckMove(pEntity) <= fGameTime)
			{
				new iPointNum = Snowman_GetRandomDir(pEntity, vTarget);

				if(iPointNum)
				{
					Snowman_SetMovePoint(pEntity, vTarget);
					Snowman_SetNextCheckMove(pEntity, random_float(2.0, 4.0));
					iActivity = ACT_MOVE;
				}
				else
					Snowman_SetNextCheckMove(pEntity, 2.0);
			}
		}
		case ACT_MOVE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_WALK)
				 UTIL_PlayAnimation(pEntity, ANIM_WALK);

			static MoveFlags; Snowman_MoveToOrigin(pEntity, SNOWMAN_SPEED, MoveFlags);

			if(MoveFlags & (1<<1))
				iActivity = ACT_IDLE;

			//Is snowman in air ?
			if(~entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				static Float:fFlyTime; fFlyTime = entity_get_float(pEntity, EV_FL_fuser1);
				if(fFlyTime == 0.0 || MoveFlags & (1<<0))
					fFlyTime = fGameTime;
				else if(fGameTime - fFlyTime > 0.15)
					iActivity = ACT_JUMP;
				entity_set_float(pEntity, EV_FL_fuser1, fFlyTime);
			}
			else
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
		}
		case ACT_JUMP:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_JUMP)
				 UTIL_PlayAnimation(pEntity, ANIM_JUMP);

			if(entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_PUSHSTEP);
				iActivity = ACT_IDLE;
			}	
		}
		case ACT_DIE:
		{
			if(entity_get_int(pEntity, EV_INT_deadflag) == DEAD_DEAD)
				entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
			else
			{
				new pAttacker = entity_get_edict(pEntity, EV_ENT_dmg_inflictor);
				if(is_user_connected(pAttacker))
					Snowman_Reward(pEntity, pAttacker);

				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				UTIL_PlayAnimation(pEntity, ANIM_DEATH);
				entity_set_int(pEntity, EV_INT_solid, SOLID_NOT);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
				entity_set_int(pEntity, EV_INT_deadflag, DEAD_DEAD);
				entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_NO);
				fDelay = 4.0
				g_iClownSpawned--;
			}
		}
		case ACT_FLINCH:
		{
			emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			UTIL_PlayAnimation(pEntity, random_num(ANIM_FLINCH, ANIM_FLINCH2));
			fDelay = 0.15
			iActivity = ACT_IDLE
		}
	}

	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, fGameTime + fDelay);
}
public Snowman_SetActivity(const pEntity, const iActivity)
{
	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, get_gametime());
}
public Snowman_FindTarget(const pEntity)
{
	static pTarget; pTarget = 0;
	static Float:fMin; fMin = 8192.0;
	static Float:fCur;

	static PlayersID[32], iPlayersNum;
	get_players(PlayersID, iPlayersNum, "ah");
	static i, pPlayer;
	for(i = 0; i < iPlayersNum; i++)
	{
		pPlayer = PlayersID[i];

		if(!ENG_is_visible(pEntity, pPlayer))
			continue;

		fCur = entity_range(pEntity, pPlayer);

		if(fCur < fMin)
		{
			fMin = fCur;
			pTarget = pPlayer;
		}
	}

	return pTarget;
}
public Snowman_GetRandomDir(const pEntity, Float:vTarget[3])
{
	static Float:vAngles[3]; entity_get_vector(pEntity, EV_VEC_angles, vAngles);
	static Float:vOrigin[3]; entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	static Float:vEnd[3];

	static Float:vForward[3];
	static Float:vPoint[16][3], iPointNum; iPointNum = 0;
	static Float:vAngles2[3]; vAngles2[1] = vAngles[1];
	static Float:vEndPos[3];
	static Float:fCur;

	static i;
	for(i = 0; i < 16; i++)
	{
		angle_vector(vAngles2, ANGLEVECTOR_FORWARD, vForward);
		vEnd[0] = vOrigin[0] + vForward[0] * 1024.0;
		vEnd[1] = vOrigin[1] + vForward[1] * 1024.0;
		vEnd[2] = vOrigin[2] + vForward[2] * 1024.0;
		
		
		ENG_trace_line(pEntity, vOrigin, vEnd, vEndPos);

		fCur = get_distance_f(vOrigin, vEndPos);
		vAngles2[1] += 20.0

		if(fCur < 64.0)
			continue;

		xs_vec_copy(vEndPos, vPoint[iPointNum]);
		iPointNum++;
	}

	if(iPointNum)
		xs_vec_copy(vPoint[random(iPointNum)], vTarget);

	return iPointNum;
}
public Float:Snowman_GetNextCheckMove(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser2);
}
public Snowman_SetNextCheckMove(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser2, get_gametime() + fDelay);
}
public Float:Snowman_GetNextFindPlayer(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser3);
}
public Snowman_SetNextFindPlayer(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser3, get_gametime() + fDelay);
}
public Snowman_SetMovePoint(const pEntity, const Float:vPoint[3])
{
	entity_set_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Snowman_GetMovePoint(const pEntity, Float:vPoint[3])
{
	entity_get_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Float:Snowman_GetNextSoundIdle(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser4);
}
public Float:Snowman_SetNextSoundIdle(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser4, get_gametime() + fDelay);
}

public bool:Snowman_IsMoveComplete(const pEntity)
{
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vEnd[3]; Snowman_GetMovePoint(pEntity, vEnd);

	if(get_distance_f(vSrc, vEnd) < 64.0)
		return true;

	vEnd[2] = vSrc[2];
	static Float:vDir[3]; xs_vec_sub(vEnd, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	vEnd[0] = vSrc[0] + vForward[0] * 26.0;
	vEnd[1] = vSrc[1] + vForward[1] * 26.0;
	vEnd[2] = vSrc[2] + vForward[2] * 26.0;
	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
		{
			if(entity_get_edict(pEntity, EV_ENT_enemy))
			{
				entity_set_edict(pEntity, EV_ENT_enemy, 0);
				Snowman_SetNextFindPlayer(pEntity, 0.5);
				Snowman_SetNextCheckMove(pEntity, 0.1);
			}
			return true;
		}
	}
	return false;
}
public bool:Snowman_IsValidPlayer(const pEntity, const pPlayer)
{
	if(!is_user_alive(pPlayer))
		return false;
	if(!ENG_is_visible(pEntity, pPlayer))
		return false;
	return true;
}

public CBaseEntity_Killed(const pEntity, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	Snowman_SetActivity(pEntity, ACT_DIE);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TakeDamage(const pEntity, const pInflictor, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return;
	entity_set_edict(pEntity, EV_ENT_dmg_inflictor, pAttacker);
	Snowman_SetActivity(pEntity, ACT_FLINCH);
}
public CBaseEntity_BloodColor(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(12);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TraceBleed(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBaseEntity_Classify(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(4);
	return HAM_SUPERCEDE;
}

public Snowman_MoveToOrigin(const pEntity, const Float:fSpeed, Flags)
{
	Flags = 0;

	static Float:vOrigin[3]; Snowman_GetMovePoint(pEntity, vOrigin);
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vDir[3]; xs_vec_sub(vOrigin, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vVel[3]; xs_vec_normalize(vDir, vDir);
	xs_vec_mul_scalar(vDir, fSpeed, vVel);
	vAngles[0] = vAngles[2] = 0.0;
	vVel[2] = -100.0;

	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	static Float:vEnd[3]; 
	vEnd[0] = vSrc[0] + vForward[0] * 20.0;
	vEnd[1] = vSrc[1] + vForward[1] * 20.0;
	vEnd[2] = vSrc[2] + vForward[2] * 20.0;

	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(!ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
		{
			vVel[2] = 200.0;
			Flags |= (1<<0);
		}
	}

	entity_set_vector(pEntity, EV_VEC_angles, vAngles);
	entity_set_vector(pEntity, EV_VEC_velocity, vVel);

	if(Snowman_IsMoveComplete(pEntity) && !(Flags & (1<<0)))
		Flags |= (1<<1);
}

stock UTIL_PlayAnimation(const pEntity, const iAnim)
{
	entity_set_int(pEntity, EV_INT_sequence, iAnim);
	entity_set_float(pEntity, EV_FL_animtime, get_gametime());
	entity_set_float(pEntity, EV_FL_frame, 0.0);
	return iAnim;
}
stock bool:UTIL_IsHullVacant(Float:vOrigin[3], const HullType)
{
	if(!ENG_trace_hull(vOrigin, vOrigin, HullType))
		return true;
	return false;
}
stock UTIL_GetAimOrigin(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);
}
stock UTIL_GetAimOriginSpawn(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);

	new Float:vNormal[3]; get_tr2(g_iTrace, TR_vecPlaneNormal, vNormal);
	if(vNormal[0] != 0.0) vPoint[0] += vNormal[0] * 20.0;
	if(vNormal[1] != 0.0) vPoint[1] += vNormal[1] * 20.0;
	if(vNormal[2] != 0.0) vPoint[2] += vNormal[2] * 36.0;
}

stock SP_AddPoint(const Float:vPoint[3])
{
	ArrayPushCell(g_aClownSpawnX, Float:vPoint[0]);
	ArrayPushCell(g_aClownSpawnY, Float:vPoint[1]);
	ArrayPushCell(g_aClownSpawnZ, Float:vPoint[2]);

	return SP_GetPointsNum();
}
stock bool:SP_SubPoint(const PointID)
{
	if(PointID < 0 || PointID > ArraySize(g_aClownSpawnX))
		return false;

	ArrayDeleteItem(g_aClownSpawnX, PointID);
	ArrayDeleteItem(g_aClownSpawnY, PointID);
	ArrayDeleteItem(g_aClownSpawnZ, PointID);
	return true;
}
stock bool:SP_IsValidOrigin(const Float:vOrigin[3])
{
	if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
		return false;

	if(!SP_IsValidMinDist(vOrigin))
		return false;

	return true;
}
stock bool:SP_IsValidMinDist(const Float:vOrigin[3], const Float:fMinDist = 64.0)
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fMinDist)
			return false;
	}
	return true;
}
stock SP_GetPointInSphere(StartPoint, const Float:vOrigin[3], const Float:fRadius = 64.0)
{
	new iPointsNum = SP_GetPointsNum();
	new PointID;

	if(!iPointsNum || StartPoint > iPointsNum)
		return -1;

	if(StartPoint < 0)
		StartPoint = 0;
	else
		StartPoint++;

	new Float:vPoint[3];
	for(PointID = StartPoint; PointID < iPointsNum; PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fRadius)
			return PointID;
	}

	return -1;
}
stock SP_GetPointOrigin(const PointID, Float:vOrigin[3])
{
	vOrigin[0] = Float:ArrayGetCell(g_aClownSpawnX, PointID);
	vOrigin[1] = Float:ArrayGetCell(g_aClownSpawnY, PointID);
	vOrigin[2] = Float:ArrayGetCell(g_aClownSpawnZ, PointID);
}
stock SP_GetEmptyPointID()
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			return PointID;
	}
	return -1;
}
stock SP_GetRandomEmptyPointID()
{
	ArrayClear(g_aSpawns);

	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			ArrayPushCell(g_aSpawns, PointID);
	}

	if(!ArraySize(g_aSpawns))
		return -1;

	return ArrayGetCell(g_aSpawns, random(ArraySize(g_aSpawns)));
}
stock SP_GetPointsNum()
{
	return ArraySize(g_aClownSpawnX);
}
stock bool:SP_SavePoints()
{	
	if(!SP_GetPointsNum())
		return false;

	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));

	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s",
		szCfgDir,
		SP_DIR
	);

	if(!dir_exists(szFileDir))
		mkdir(szFileDir);

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(file_exists(szFileDir))
		delete_file(szFileDir);

	new Float:vPoint[3];
	new szBuffer[64];
	for(new PointID = 0; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);

		formatex(szBuffer, charsmax(szBuffer), 
			"^"%.1f^" ^"%.1f^" ^"%.1f^"", 
			vPoint[0], vPoint[1], vPoint[2]
		);

		write_file(szFileDir, szBuffer);
	}

	return true;
}
stock SP_LoadPoints()
{
	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));
	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(!file_exists(szFileDir))
		return 0;

	new iFile = fopen(szFileDir, "rt");

	if(!iFile)
		return 0;

	new szBuffer[64];
	new Float:vPoint[3];
	new szPoint[3][7];
	while(iFile && !feof(iFile))
	{
		fgets(iFile, szBuffer, charsmax(szBuffer));
		if(!szBuffer[0] || szBuffer[0] == ';') 
			continue;

		parse(szBuffer, szPoint[0], 6, szPoint[1], 6, szPoint[2], 6);

		vPoint[0] = str_to_float(szPoint[0]);	
		vPoint[1] = str_to_float(szPoint[1]);	
		vPoint[2] = str_to_float(szPoint[2]);	

		SP_AddPoint(vPoint);
	}
	fclose(iFile);
	return SP_GetPointsNum();
}
stock ENG_trace_line(pEntity, Float:vSrc[3], Float:vEnd[3], Float:vEndPos[3])
{
	engfunc(EngFunc_TraceLine, vSrc, vEnd, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	get_tr2(g_iTrace, TR_vecEndPos, vEndPos);
}
stock bool:ENG_trace_hull(Float:vSrc[3], Float:vEnd[3], iHullType, pEntity = 0, Flags = 0)
{
	engfunc(EngFunc_TraceHull, vSrc, vEnd, Flags, iHullType, pEntity, g_iTrace);
	
	if(get_tr2(g_iTrace, TR_StartSolid) || get_tr2(g_iTrace, TR_AllSolid) || !get_tr2(g_iTrace, TR_InOpen))
		return true;
	return false;
}
stock bool:ENG_is_visible(pEntity, pEntity2)
{
	static Float:vOrigin[3];
	static Float:vLooker[3];
	static Float:vTarget[3];
	entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity, EV_VEC_view_ofs, vLooker);
	xs_vec_add(vLooker, vOrigin, vLooker);
	entity_get_vector(pEntity2, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity2, EV_VEC_view_ofs, vTarget);
	xs_vec_add(vTarget, vOrigin, vTarget);
	static Solid; Solid = entity_get_int(pEntity2, EV_INT_solid);
	entity_set_int(pEntity2, EV_INT_solid, SOLID_NOT);
	engfunc(EngFunc_TraceLine, vLooker, vTarget, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	entity_set_int(pEntity2, EV_INT_solid, Solid);
	if(get_tr2(g_iTrace, TR_InOpen) && get_tr2(g_iTrace, TR_InWater))
		return false;
	static Float:fFraction; get_tr2(g_iTrace, TR_flFraction, fFraction);
	if(fFraction == 1.0)
		return true;
	return false;
}
stock UTIL_PlaySound(iIndex = 0, szSound[], bool:bLoop = false) 
{
	new szTemp[128]; copyc(szTemp, charsmax(szTemp), szSound, '.');
	if(contain(szSound, ".mp3") != -1) 
		client_cmd(iIndex, "mp3 %s ^"sound/%s^"", bLoop ? "loop" : "play", szTemp);
	else 
		client_cmd(iIndex, "spk ^"%s^"", szTemp);
}
stock UTIL_StopSound(iIndex = 0) 
{
	client_cmd(iIndex, "stopsound;mp3 stop");
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/

I tried but failed. errors

//// perrot.sma
//
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\engine.inc(799) : error 017: undefined symbol "kRenderFxNone"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cssdk_const.inc(811) : error 021: symbol already defined: "TeamName"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(181) : error 017: undefined symbol "register_dictionary_colored"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : error 017: undefined symbol "DontChange"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : error 001: expected token: ";", but found ")"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : error 029: invalid expression, assumed zero
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : fatal error 107: too many error messages on one line
//
Image

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#2

Post by Muhammet20 » 4 years ago

czirimbolo wrote: 4 years ago can someone help me to convert this to our mod?

Code: Select all

#include <engine>
#include <xs>

#include <colorchat>


#define GET_MONEY(%0)		zp_cs_get_user_money(%0)
#define SET_MONEY(%0,%1) 	zp_cs_set_user_money(%0,%1)
#define GET_EXP(%0)			ze_get_user_xp(%0)
#define SET_EXP(%0,%1)		ze_set_user_xp(%0,%1)

/*
[0.9.5]
- Исправленна поддержка режимов
- Добавлена поддержка BuyMenu, Level System
*/

#define PLUGIN_NAME				"[ZDT] Bonus round: Pierrot"
#define PLUGIN_VERSION			"0.9.5"
#define PLUGIN_AUTHOR			"Doc.Batcon"
#define PLUGIN_PREFIX			"^4[BR]^1"
#define PLUGIN_DICTIONARY		"npc_bonusmon_092.txt"

new const SNOWMAN_ENTITY[] 		= "monster_hevsuit_dead"
new const SNOWMAN_CLASSNAME[] 	= "npc_snowman"
new const SNOWMAN_MODEL[] 		= "models/zdt/monsters/npc_snowman.mdl"
#define SNOWMAN_HEALTH 			100.0
#define SNOWMAN_SPEED			200.0
#define SNOWMAN_BODY			random_num(0, 1)
#define SNOWMAN_SKIN			random_num(0, 5)

new const SNOWMAN_SOUNDS[][] =
{
	"zdt/snow_idle.wav",
	"zdt/snow_die.wav",
	"zdt/snow_pain.wav"
}

enum _: eSnowmanAnim
{
	ANIM_DUMMY,
	ANIM_IDLE,
	ANIM_WALK,
	ANIM_RUN,
	ANIM_JUMP,
	ANIM_FLINCH,
	ANIM_FLINCH2,
	ANIM_DEATH
}
enum _: eSnowmanAct
{
	ACT_DUMMY,
	ACT_IDLE,
	ACT_MOVE,
	ACT_JUMP,
	ACT_FLINCH,
	ACT_DIE
}

#define HUD_EVENT_X			-1.0
#define HUD_EVENT_Y			0.17

#define BR_TASKID			111
#define SP_DIR 				"npc_snowman"

//НАСТРОЙКИ

//obslugiwane mody
enum _: eSupportMods
{
	SUPPORT_CLASSIC,	//[Money]
	SUPPORT_ZP43,		//[AmmoPacks]
	SUPPORT_ZP50,		//[AmmoPacks]
	SUPPORT_BIOHAZARD	//[Money]
}

#define SUPPORT_MOD		SUPPORT_ZP43

//nagroda za zabicie balwana
#define GIVE_REWARD		100
//ilosc expa za balwana
#define GIVE_EXP		1000

//muzyka podczas rundy balwanow		[mozna komentowac aby wylaczyc]
#define BR_MUSIC			"zdt/scenario_xmas.mp3" 
//czas trwania trybu 1.0 = 1 minuta	[mozna komentowac aby wylaczyc]
#define BR_ROUNDTIME		3.0
//szansa na uruchomienie 
#define BR_CHANGE			5
//Maksymalna liczba bałwanów utworzonych na cykl
#define BR_CLOWN_SPAWN		10
//Maksymalna liczba żywych bałwanów
//(zalecane 40-60) 
#define BR_CLOWN_MAX		50
//Blokowanie obrażeń między graczami w trybie [Mozesz komentowac]
//(dla SUPPORT_CLASSIC)
#define BR_BLOCK_DAMAGE		true
//Minimalna odległość między spawnem
#define SP_MIN_DIST		64.0
//Odrodzenie wyświetlania maksymalnego zakresu w menu
#define SP_MAX_SHOW_DIST	512.0
//Wlaczyc obsługę menu Kup? [Możesz komentować]
//#define ENABLED_SUPPORT_BUYMENU
//Włączyć obsługę poziomu systemu? [Możesz komentować]
//#define ENABLED_SUPPORT_LEVELSYSTEM

new g_iMenuClown;
new Array:g_aClownSpawnX, Array:g_aClownSpawnY, Array:g_aClownSpawnZ, Array:g_aSpawns;
new g_sModelIndexBeam;
new bool:g_bBonusRound, g_iBonusRoundStatus, g_iClownSpawned;
new bool:g_bNextRoundIsBonus;
new bool:g_bChangeBonusRound = true;
new bool:g_bIsFirstRound = true;
new g_iTrace;

#if defined BR_ROUNDTIME
new Float:g_fRoundTime;
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true && SUPPORT_MOD != SUPPORT_CLASSIC
	#undef BR_BLOCK_DAMAGE
	#define BR_BLOCK_DAMAGE	false
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
new HamHook:g_HamHookTraceAttack;
new HamHook:g_HamHookTakeDamage;
#endif

#if SUPPORT_MOD == SUPPORT_CLASSIC
	#include <cstrike>
#endif
#if SUPPORT_MOD == SUPPORT_ZP43
	#include <zombie_escape>
#endif
#if SUPPORT_MOD == SUPPORT_ZP50
	#include <zp50_ammopacks>
#endif
#if SUPPORT_MOD == SUPPORT_BIOHAZARD
	#include <cstrike>
	#include <biohazard>
#endif
#if defined ENABLED_SUPPORT_BUYMENU
	native GET_MONEY(pPlayer)
	native SET_MONEY(pPlayer, iValue)
#endif
#if defined ENABLED_SUPPORT_LEVELSYSTEM
	native GET_EXP(pPlayer)
	native SET_EXP(pPlayer, iValue)
#endif

#if SUPPORT_MOD == SUPPORT_ZP43 || SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
new g_CvarID_GameModeDelay;
new Float:g_fRoundDelay;
#endif

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_think(SNOWMAN_CLASSNAME, "Snowman_Think");
	RegisterHam(Ham_Killed, SNOWMAN_ENTITY, "CBaseEntity_Killed", false);
	RegisterHam(Ham_TakeDamage, SNOWMAN_ENTITY, "CBaseEntity_TakeDamage", false);
	RegisterHam(Ham_BloodColor, SNOWMAN_ENTITY, "CBaseEntity_BloodColor", false);
	RegisterHam(Ham_TraceBleed, SNOWMAN_ENTITY, "CBaseEntity_TraceBleed", false);
	RegisterHam(Ham_Classify, SNOWMAN_ENTITY, "CBaseEntity_Classify", false);

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		g_HamHookTraceAttack = RegisterHam(Ham_TraceAttack, "player", "CBasePlayer_TraceAttack", false);
		g_HamHookTakeDamage = RegisterHam(Ham_TakeDamage, "player", "CBasePlayer_TakeDamage", false);
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif

	register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
	register_logevent("Event_RoundStarted", 2, "1=Round_Start");
	register_logevent("Event_RoundEnd", 2, "1=Round_End");
	register_logevent("Event_RoundRestart", 2, "1=Game_Commencing");
	register_event("TextMsg", "Event_RoundRestart", "a", "2=#Game_will_restart_in");

	register_dictionary_colored(PLUGIN_DICTIONARY);

	register_clcmd("say bonusround", "ClientCmd_ShowMenu");
}
public plugin_precache()
{
	precache_model(SNOWMAN_MODEL);
	g_sModelIndexBeam = precache_model("sprites/laserbeam.spr");

	for(new i; i < sizeof SNOWMAN_SOUNDS; i++)
		precache_sound(SNOWMAN_SOUNDS[i]);

	#if defined BR_MUSIC
		new buffer[64]; formatex(buffer, charsmax(buffer), "sound/%s", BR_MUSIC);
		precache_generic(buffer);
	#endif

	g_aSpawns = ArrayCreate(1, 1);
	g_aClownSpawnX = ArrayCreate(1, 1);
	g_aClownSpawnY = ArrayCreate(1, 1);
	g_aClownSpawnZ = ArrayCreate(1, 1);

	g_iTrace = create_tr2();

	g_iMenuClown = menu_create("MENU_TITLE", "MenuHandler_Pierrot");
	menu_additem(g_iMenuClown, "MENU_ITEM_01");
	menu_additem(g_iMenuClown, "MENU_ITEM_02");
	menu_additem(g_iMenuClown, "MENU_ITEM_03");
}
public plugin_cfg()
{
	SP_LoadPoints();

	#if SUPPORT_MOD == SUPPORT_ZP43
		g_CvarID_GameModeDelay = get_cvar_pointer("zp_delay");
	#endif
	#if SUPPORT_MOD == SUPPORT_ZP50
		g_CvarID_GameModeDelay = get_cvar_pointer("zp_gamemode_delay");
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD
		g_CvarID_GameModeDelay = get_cvar_pointer("bh_starttime");
	#endif
}
public Snowman_Reward(const pEntity, const pPlayer)
{
	#if SUPPORT_MOD == SUPPORT_CLASSIC && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_ZP43 && !defined ENABLED_SUPPORT_BUYMENU
		ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_ZP50 && !defined ENABLED_SUPPORT_BUYMENU
		ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if defined ENABLED_SUPPORT_BUYMENU
		SET_MONEY(pPlayer, GET_MONEY(pPlayer) + GIVE_REWARD);
	#endif	
	#if defined ENABLED_SUPPORT_LEVELSYSTEM
		SET_EXP(pPlayer, GET_EXP(pPlayer) + GIVE_EXP);
	#endif	
}
#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
public CBasePlayer_TraceAttack(pPlayer, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBasePlayer_TakeDamage(pPlayer, pInflictor, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
#endif
public BonusRound_Start()
{
	set_dhudmessage(0, 120, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0);
	show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_HUD_PREPARE");

	#if defined BR_MUSIC
		UTIL_StopSound();
		UTIL_PlaySound(0, BR_MUSIC, true);
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		EnableHamForward(g_HamHookTraceAttack);
		EnableHamForward(g_HamHookTakeDamage);
	#endif	

	set_task(1.0, "Task_GL_BonusRound", BR_TASKID, _, _, "b");
	g_iBonusRoundStatus = 1;
	g_bBonusRound = true;
	g_bNextRoundIsBonus = false;
}
public BonusRound_End()
{
	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
		set_pcvar_float(g_CvarID_GameModeDelay, g_fRoundDelay);
	#endif

	remove_task(BR_TASKID);
	g_iBonusRoundStatus = 2;
	g_bBonusRound = false;
	
	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
	{
		if(entity_get_int(pEntity, EV_INT_deadflag) != DEAD_NO)
			continue;

		entity_set_edict(pEntity, EV_ENT_dmg_inflictor, 0);
		Snowman_SetActivity(pEntity, ACT_DIE);
	}
}
public BonusRound_NextRound()
{
	g_bNextRoundIsBonus = true;
	g_bChangeBonusRound = false;
	client_print_color(0, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_PREPARE");

	#if SUPPORT_MOD == SUPPORT_ZP43
		g_fRoundDelay = float(get_pcvar_num(g_CvarID_GameModeDelay));
		set_pcvar_num(g_CvarID_GameModeDelay, 999);
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
		g_fRoundDelay = get_pcvar_float(g_CvarID_GameModeDelay);
		set_pcvar_float(g_CvarID_GameModeDelay, 999.0);
	#endif
}

public Event_RoundStart()
{
	#if defined BR_ROUNDTIME
		if(g_bNextRoundIsBonus)
		{
			g_fRoundTime = get_cvar_float("mp_roundtime");
			server_cmd("mp_roundtime %f", BR_ROUNDTIME);
			server_exec();
		}
	#endif

	if(!g_iBonusRoundStatus)
		return;

	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif	

	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
		entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
	
	remove_task(BR_TASKID);
	g_iClownSpawned = 0;
	g_iBonusRoundStatus = 0;
	g_bBonusRound = false;
}
public Event_RoundStarted()
{
	if(g_bNextRoundIsBonus)
		BonusRound_Start();
}
public Event_RoundEnd()
{
	if(!g_bIsFirstRound && g_bChangeBonusRound && !random_num(0, BR_CHANGE))
	{
		BonusRound_NextRound();
	}

	g_bIsFirstRound = false;

	if(g_iBonusRoundStatus != 1)
		return;

	BonusRound_End();

	#if defined BR_ROUNDTIME
		server_cmd("mp_roundtime %f", g_fRoundTime);
		server_exec();
	#endif
}
public Event_RoundRestart()
{
	g_bNextRoundIsBonus = false;
	g_bChangeBonusRound = true;
	g_bIsFirstRound = true;

	if(!g_iBonusRoundStatus)
		return;

	#if SUPPORT_MOD == SUPPORT_ZP43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif

	#if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
		set_pcvar_float(g_CvarID_GameModeDelay, g_fRoundDelay);
	#endif
}

public Task_GL_BonusRound(TaskID)
{
	new PointID, Float:vPoint[3];
	new iMaxSpawns = BR_CLOWN_SPAWN;
	while(iMaxSpawns && (g_iClownSpawned <= BR_CLOWN_MAX) && ((PointID = SP_GetRandomEmptyPointID()) != -1))
	{
		SP_GetPointOrigin(PointID, vPoint);
		Snowman_Spawn(vPoint);
		iMaxSpawns--;
	}
}
public ClientCmd_ShowMenu(pPlayer)
{
	if(get_user_flags(pPlayer) & ADMIN_IMMUNITY)
	{
		new buffer[64]; 
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_MAIN_TITLE");
		menu_setprop(g_iMenuClown, MPROP_TITLE, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_01");
		menu_item_setname(g_iMenuClown, 0, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_02");
		menu_item_setname(g_iMenuClown, 1, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_03");
		menu_item_setname(g_iMenuClown, 2, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_EXIT");
		menu_setprop(g_iMenuClown, MPROP_EXITNAME, buffer);
		menu_display(pPlayer, g_iMenuClown);
		set_task(0.1, "Task_Client_ShowPoints", pPlayer, _, _, "b");
		set_pdata_int(pPlayer, 205, 0, 5);
	}
	else
	{
		client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_01");
	}
	return PLUGIN_HANDLED;
}
public Task_Client_ShowPoints(pPlayer)
{
	if(!is_user_connected(pPlayer) || !IsShowMenu(pPlayer,g_iMenuClown))
	{
		remove_task(pPlayer);
		return;
	}

	new Float:vOrigin[3]
	new Float:vPoint[3], iPoint[3];
	new PointID = -1;

	entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);

	while((PointID = SP_GetPointInSphere(PointID, vOrigin, SP_MAX_SHOW_DIST)) != -1)
	{
		SP_GetPointOrigin(PointID, vPoint);
		FVecIVec(vPoint, iPoint);

		message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, pPlayer);
		write_byte(TE_BEAMPOINTS);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]-36);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]+36);
		write_short(g_sModelIndexBeam);
		write_byte(1);               
        	write_byte(1);                 
        	write_byte(5);           
        	write_byte(10);     
        	write_byte(2);     
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(200);           
        	write_byte(0);               
        	message_end();
	}
}
public bool:IsShowMenu(pPlayer, iMenu)
{
	new iMenuOLD, iMenuNEW;
	player_menu_info(pPlayer, iMenuOLD, iMenuNEW);
	if(iMenuOLD == iMenu || iMenuNEW == iMenu)
		return true;
	return false;
}
public MenuHandler_Pierrot(pPlayer, iMenuID, iItem)
{
	if(iItem > -1)
		menu_display(pPlayer, iMenuID);

	if(iItem == MENU_EXIT)
		remove_task(pPlayer);

	switch(iItem)
	{
		case 0:
		{
			new Float:vOrigin[3]; UTIL_GetAimOriginSpawn(pPlayer, vOrigin);

			if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_DONT_VACPOINT");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}

			new PointID = SP_GetPointInSphere(-1, vOrigin, SP_MIN_DIST);
			if(PointID == -1)
			{
				SP_AddPoint(vOrigin);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_CREATED");
			}
			else
			{
				SP_SubPoint(PointID);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_DELETED");
			}
		}
		case 1:
		{
			if(SP_SavePoints())
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT");
			else
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT_FAIL");
		}
		case 2:
		{
			if(g_bBonusRound || g_iBonusRoundStatus || g_bNextRoundIsBonus || !SP_GetPointsNum())
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_02");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}
			
			BonusRound_NextRound();
		}
	}

	UTIL_PlaySound(pPlayer, "common/wpn_denyselect.wav");
}
public Snowman_Spawn(const Float:vOrigin[3])
{
	static pEntity;
	if(!(pEntity = create_entity(SNOWMAN_ENTITY)))
		return 0

	entity_set_string(pEntity, EV_SZ_classname, SNOWMAN_CLASSNAME);
	entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
	entity_set_int(pEntity, EV_INT_solid, SOLID_BBOX);
	entity_set_int(pEntity, EV_INT_deadflag, DEAD_NO);
	entity_set_int(pEntity, EV_INT_flags, FL_MONSTER);
	entity_set_int(pEntity, EV_INT_skin, SNOWMAN_SKIN);

	if(!entity_get_int(pEntity, EV_INT_skin))
		entity_set_int(pEntity, EV_INT_body,  SNOWMAN_BODY);
		
	entity_set_float(pEntity, EV_FL_health, SNOWMAN_HEALTH);
	entity_set_float(pEntity, EV_FL_gravity, 1.0);
	entity_set_float(pEntity, EV_FL_framerate, 1.0);
	entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_AIM);
	entity_set_vector(pEntity, EV_VEC_view_ofs, Float:{0.0, 0.0, 10.0});
	entity_set_model(pEntity, SNOWMAN_MODEL);
	entity_set_size(pEntity, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 18.0});
	entity_set_origin(pEntity, vOrigin);
	Snowman_SetActivity(pEntity, ACT_JUMP);
	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
	g_iClownSpawned++;
	return pEntity;
}
public Snowman_Think(const pEntity)
{
	static iActivity; iActivity = entity_get_int(pEntity, EV_INT_iuser1);
	static Float:fGameTime; fGameTime = get_gametime();
	static pTarget; pTarget = entity_get_edict(pEntity, EV_ENT_enemy);
	static Float:fDelay; fDelay = 0.1;
	static Float:vTarget[3];

	if(iActivity == ACT_IDLE || iActivity == ACT_MOVE)
	{
		if(pTarget)
		{
			if(!Snowman_IsValidPlayer(pEntity, pTarget))
			{
				Snowman_SetNextFindPlayer(pEntity, 1.0);
				Snowman_SetNextCheckMove(pEntity, 1.0);
				pTarget = 0;
			}

			if(pTarget)
			{
				entity_get_vector(pTarget, EV_VEC_origin, vTarget);
				Snowman_SetMovePoint(pEntity, vTarget);
				Snowman_SetNextCheckMove(pEntity, 1.0);

				if(Snowman_IsMoveComplete(pEntity) || 
				entity_get_edict(pEntity, EV_ENT_groundentity) == pTarget
				)
					iActivity = ACT_IDLE;
				else
					iActivity = ACT_MOVE;
			}
			else
			{
				iActivity = ACT_IDLE;
			}
		}
		else
		{
			if((Snowman_GetNextCheckMove(pEntity) > fGameTime) && !Snowman_IsMoveComplete(pEntity))
				iActivity = ACT_MOVE;
			else
				iActivity = ACT_IDLE;
		}
	}

	if(entity_get_edict(pEntity, EV_ENT_enemy) == 0)
		pTarget = 0;

	if(Snowman_GetNextFindPlayer(pEntity) < fGameTime)
	{
		pTarget = Snowman_FindTarget(pEntity);
		Snowman_SetNextFindPlayer(pEntity, pTarget ? 5.0 : 1.0);
	}

	entity_set_edict(pEntity, EV_ENT_enemy, pTarget);

	switch(iActivity)
	{
		case ACT_DUMMY:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);
		}
		case ACT_IDLE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
			{
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);

				 if(Snowman_GetNextSoundIdle(pEntity) - fGameTime > 1.0)
				 	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextSoundIdle(pEntity) < fGameTime)
			{
				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextCheckMove(pEntity) <= fGameTime)
			{
				new iPointNum = Snowman_GetRandomDir(pEntity, vTarget);

				if(iPointNum)
				{
					Snowman_SetMovePoint(pEntity, vTarget);
					Snowman_SetNextCheckMove(pEntity, random_float(2.0, 4.0));
					iActivity = ACT_MOVE;
				}
				else
					Snowman_SetNextCheckMove(pEntity, 2.0);
			}
		}
		case ACT_MOVE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_WALK)
				 UTIL_PlayAnimation(pEntity, ANIM_WALK);

			static MoveFlags; Snowman_MoveToOrigin(pEntity, SNOWMAN_SPEED, MoveFlags);

			if(MoveFlags & (1<<1))
				iActivity = ACT_IDLE;

			//Is snowman in air ?
			if(~entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				static Float:fFlyTime; fFlyTime = entity_get_float(pEntity, EV_FL_fuser1);
				if(fFlyTime == 0.0 || MoveFlags & (1<<0))
					fFlyTime = fGameTime;
				else if(fGameTime - fFlyTime > 0.15)
					iActivity = ACT_JUMP;
				entity_set_float(pEntity, EV_FL_fuser1, fFlyTime);
			}
			else
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
		}
		case ACT_JUMP:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_JUMP)
				 UTIL_PlayAnimation(pEntity, ANIM_JUMP);

			if(entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_PUSHSTEP);
				iActivity = ACT_IDLE;
			}	
		}
		case ACT_DIE:
		{
			if(entity_get_int(pEntity, EV_INT_deadflag) == DEAD_DEAD)
				entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
			else
			{
				new pAttacker = entity_get_edict(pEntity, EV_ENT_dmg_inflictor);
				if(is_user_connected(pAttacker))
					Snowman_Reward(pEntity, pAttacker);

				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				UTIL_PlayAnimation(pEntity, ANIM_DEATH);
				entity_set_int(pEntity, EV_INT_solid, SOLID_NOT);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
				entity_set_int(pEntity, EV_INT_deadflag, DEAD_DEAD);
				entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_NO);
				fDelay = 4.0
				g_iClownSpawned--;
			}
		}
		case ACT_FLINCH:
		{
			emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			UTIL_PlayAnimation(pEntity, random_num(ANIM_FLINCH, ANIM_FLINCH2));
			fDelay = 0.15
			iActivity = ACT_IDLE
		}
	}

	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, fGameTime + fDelay);
}
public Snowman_SetActivity(const pEntity, const iActivity)
{
	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, get_gametime());
}
public Snowman_FindTarget(const pEntity)
{
	static pTarget; pTarget = 0;
	static Float:fMin; fMin = 8192.0;
	static Float:fCur;

	static PlayersID[32], iPlayersNum;
	get_players(PlayersID, iPlayersNum, "ah");
	static i, pPlayer;
	for(i = 0; i < iPlayersNum; i++)
	{
		pPlayer = PlayersID[i];

		if(!ENG_is_visible(pEntity, pPlayer))
			continue;

		fCur = entity_range(pEntity, pPlayer);

		if(fCur < fMin)
		{
			fMin = fCur;
			pTarget = pPlayer;
		}
	}

	return pTarget;
}
public Snowman_GetRandomDir(const pEntity, Float:vTarget[3])
{
	static Float:vAngles[3]; entity_get_vector(pEntity, EV_VEC_angles, vAngles);
	static Float:vOrigin[3]; entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	static Float:vEnd[3];

	static Float:vForward[3];
	static Float:vPoint[16][3], iPointNum; iPointNum = 0;
	static Float:vAngles2[3]; vAngles2[1] = vAngles[1];
	static Float:vEndPos[3];
	static Float:fCur;

	static i;
	for(i = 0; i < 16; i++)
	{
		angle_vector(vAngles2, ANGLEVECTOR_FORWARD, vForward);
		vEnd[0] = vOrigin[0] + vForward[0] * 1024.0;
		vEnd[1] = vOrigin[1] + vForward[1] * 1024.0;
		vEnd[2] = vOrigin[2] + vForward[2] * 1024.0;
		
		
		ENG_trace_line(pEntity, vOrigin, vEnd, vEndPos);

		fCur = get_distance_f(vOrigin, vEndPos);
		vAngles2[1] += 20.0

		if(fCur < 64.0)
			continue;

		xs_vec_copy(vEndPos, vPoint[iPointNum]);
		iPointNum++;
	}

	if(iPointNum)
		xs_vec_copy(vPoint[random(iPointNum)], vTarget);

	return iPointNum;
}
public Float:Snowman_GetNextCheckMove(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser2);
}
public Snowman_SetNextCheckMove(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser2, get_gametime() + fDelay);
}
public Float:Snowman_GetNextFindPlayer(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser3);
}
public Snowman_SetNextFindPlayer(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser3, get_gametime() + fDelay);
}
public Snowman_SetMovePoint(const pEntity, const Float:vPoint[3])
{
	entity_set_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Snowman_GetMovePoint(const pEntity, Float:vPoint[3])
{
	entity_get_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Float:Snowman_GetNextSoundIdle(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser4);
}
public Float:Snowman_SetNextSoundIdle(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser4, get_gametime() + fDelay);
}

public bool:Snowman_IsMoveComplete(const pEntity)
{
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vEnd[3]; Snowman_GetMovePoint(pEntity, vEnd);

	if(get_distance_f(vSrc, vEnd) < 64.0)
		return true;

	vEnd[2] = vSrc[2];
	static Float:vDir[3]; xs_vec_sub(vEnd, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	vEnd[0] = vSrc[0] + vForward[0] * 26.0;
	vEnd[1] = vSrc[1] + vForward[1] * 26.0;
	vEnd[2] = vSrc[2] + vForward[2] * 26.0;
	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
		{
			if(entity_get_edict(pEntity, EV_ENT_enemy))
			{
				entity_set_edict(pEntity, EV_ENT_enemy, 0);
				Snowman_SetNextFindPlayer(pEntity, 0.5);
				Snowman_SetNextCheckMove(pEntity, 0.1);
			}
			return true;
		}
	}
	return false;
}
public bool:Snowman_IsValidPlayer(const pEntity, const pPlayer)
{
	if(!is_user_alive(pPlayer))
		return false;
	if(!ENG_is_visible(pEntity, pPlayer))
		return false;
	return true;
}

public CBaseEntity_Killed(const pEntity, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	Snowman_SetActivity(pEntity, ACT_DIE);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TakeDamage(const pEntity, const pInflictor, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return;
	entity_set_edict(pEntity, EV_ENT_dmg_inflictor, pAttacker);
	Snowman_SetActivity(pEntity, ACT_FLINCH);
}
public CBaseEntity_BloodColor(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(12);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TraceBleed(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBaseEntity_Classify(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(4);
	return HAM_SUPERCEDE;
}

public Snowman_MoveToOrigin(const pEntity, const Float:fSpeed, Flags)
{
	Flags = 0;

	static Float:vOrigin[3]; Snowman_GetMovePoint(pEntity, vOrigin);
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vDir[3]; xs_vec_sub(vOrigin, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vVel[3]; xs_vec_normalize(vDir, vDir);
	xs_vec_mul_scalar(vDir, fSpeed, vVel);
	vAngles[0] = vAngles[2] = 0.0;
	vVel[2] = -100.0;

	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	static Float:vEnd[3]; 
	vEnd[0] = vSrc[0] + vForward[0] * 20.0;
	vEnd[1] = vSrc[1] + vForward[1] * 20.0;
	vEnd[2] = vSrc[2] + vForward[2] * 20.0;

	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(!ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
		{
			vVel[2] = 200.0;
			Flags |= (1<<0);
		}
	}

	entity_set_vector(pEntity, EV_VEC_angles, vAngles);
	entity_set_vector(pEntity, EV_VEC_velocity, vVel);

	if(Snowman_IsMoveComplete(pEntity) && !(Flags & (1<<0)))
		Flags |= (1<<1);
}

stock UTIL_PlayAnimation(const pEntity, const iAnim)
{
	entity_set_int(pEntity, EV_INT_sequence, iAnim);
	entity_set_float(pEntity, EV_FL_animtime, get_gametime());
	entity_set_float(pEntity, EV_FL_frame, 0.0);
	return iAnim;
}
stock bool:UTIL_IsHullVacant(Float:vOrigin[3], const HullType)
{
	if(!ENG_trace_hull(vOrigin, vOrigin, HullType))
		return true;
	return false;
}
stock UTIL_GetAimOrigin(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);
}
stock UTIL_GetAimOriginSpawn(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);

	new Float:vNormal[3]; get_tr2(g_iTrace, TR_vecPlaneNormal, vNormal);
	if(vNormal[0] != 0.0) vPoint[0] += vNormal[0] * 20.0;
	if(vNormal[1] != 0.0) vPoint[1] += vNormal[1] * 20.0;
	if(vNormal[2] != 0.0) vPoint[2] += vNormal[2] * 36.0;
}

stock SP_AddPoint(const Float:vPoint[3])
{
	ArrayPushCell(g_aClownSpawnX, Float:vPoint[0]);
	ArrayPushCell(g_aClownSpawnY, Float:vPoint[1]);
	ArrayPushCell(g_aClownSpawnZ, Float:vPoint[2]);

	return SP_GetPointsNum();
}
stock bool:SP_SubPoint(const PointID)
{
	if(PointID < 0 || PointID > ArraySize(g_aClownSpawnX))
		return false;

	ArrayDeleteItem(g_aClownSpawnX, PointID);
	ArrayDeleteItem(g_aClownSpawnY, PointID);
	ArrayDeleteItem(g_aClownSpawnZ, PointID);
	return true;
}
stock bool:SP_IsValidOrigin(const Float:vOrigin[3])
{
	if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
		return false;

	if(!SP_IsValidMinDist(vOrigin))
		return false;

	return true;
}
stock bool:SP_IsValidMinDist(const Float:vOrigin[3], const Float:fMinDist = 64.0)
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fMinDist)
			return false;
	}
	return true;
}
stock SP_GetPointInSphere(StartPoint, const Float:vOrigin[3], const Float:fRadius = 64.0)
{
	new iPointsNum = SP_GetPointsNum();
	new PointID;

	if(!iPointsNum || StartPoint > iPointsNum)
		return -1;

	if(StartPoint < 0)
		StartPoint = 0;
	else
		StartPoint++;

	new Float:vPoint[3];
	for(PointID = StartPoint; PointID < iPointsNum; PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fRadius)
			return PointID;
	}

	return -1;
}
stock SP_GetPointOrigin(const PointID, Float:vOrigin[3])
{
	vOrigin[0] = Float:ArrayGetCell(g_aClownSpawnX, PointID);
	vOrigin[1] = Float:ArrayGetCell(g_aClownSpawnY, PointID);
	vOrigin[2] = Float:ArrayGetCell(g_aClownSpawnZ, PointID);
}
stock SP_GetEmptyPointID()
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			return PointID;
	}
	return -1;
}
stock SP_GetRandomEmptyPointID()
{
	ArrayClear(g_aSpawns);

	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			ArrayPushCell(g_aSpawns, PointID);
	}

	if(!ArraySize(g_aSpawns))
		return -1;

	return ArrayGetCell(g_aSpawns, random(ArraySize(g_aSpawns)));
}
stock SP_GetPointsNum()
{
	return ArraySize(g_aClownSpawnX);
}
stock bool:SP_SavePoints()
{	
	if(!SP_GetPointsNum())
		return false;

	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));

	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s",
		szCfgDir,
		SP_DIR
	);

	if(!dir_exists(szFileDir))
		mkdir(szFileDir);

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(file_exists(szFileDir))
		delete_file(szFileDir);

	new Float:vPoint[3];
	new szBuffer[64];
	for(new PointID = 0; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);

		formatex(szBuffer, charsmax(szBuffer), 
			"^"%.1f^" ^"%.1f^" ^"%.1f^"", 
			vPoint[0], vPoint[1], vPoint[2]
		);

		write_file(szFileDir, szBuffer);
	}

	return true;
}
stock SP_LoadPoints()
{
	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));
	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(!file_exists(szFileDir))
		return 0;

	new iFile = fopen(szFileDir, "rt");

	if(!iFile)
		return 0;

	new szBuffer[64];
	new Float:vPoint[3];
	new szPoint[3][7];
	while(iFile && !feof(iFile))
	{
		fgets(iFile, szBuffer, charsmax(szBuffer));
		if(!szBuffer[0] || szBuffer[0] == ';') 
			continue;

		parse(szBuffer, szPoint[0], 6, szPoint[1], 6, szPoint[2], 6);

		vPoint[0] = str_to_float(szPoint[0]);	
		vPoint[1] = str_to_float(szPoint[1]);	
		vPoint[2] = str_to_float(szPoint[2]);	

		SP_AddPoint(vPoint);
	}
	fclose(iFile);
	return SP_GetPointsNum();
}
stock ENG_trace_line(pEntity, Float:vSrc[3], Float:vEnd[3], Float:vEndPos[3])
{
	engfunc(EngFunc_TraceLine, vSrc, vEnd, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	get_tr2(g_iTrace, TR_vecEndPos, vEndPos);
}
stock bool:ENG_trace_hull(Float:vSrc[3], Float:vEnd[3], iHullType, pEntity = 0, Flags = 0)
{
	engfunc(EngFunc_TraceHull, vSrc, vEnd, Flags, iHullType, pEntity, g_iTrace);
	
	if(get_tr2(g_iTrace, TR_StartSolid) || get_tr2(g_iTrace, TR_AllSolid) || !get_tr2(g_iTrace, TR_InOpen))
		return true;
	return false;
}
stock bool:ENG_is_visible(pEntity, pEntity2)
{
	static Float:vOrigin[3];
	static Float:vLooker[3];
	static Float:vTarget[3];
	entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity, EV_VEC_view_ofs, vLooker);
	xs_vec_add(vLooker, vOrigin, vLooker);
	entity_get_vector(pEntity2, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity2, EV_VEC_view_ofs, vTarget);
	xs_vec_add(vTarget, vOrigin, vTarget);
	static Solid; Solid = entity_get_int(pEntity2, EV_INT_solid);
	entity_set_int(pEntity2, EV_INT_solid, SOLID_NOT);
	engfunc(EngFunc_TraceLine, vLooker, vTarget, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	entity_set_int(pEntity2, EV_INT_solid, Solid);
	if(get_tr2(g_iTrace, TR_InOpen) && get_tr2(g_iTrace, TR_InWater))
		return false;
	static Float:fFraction; get_tr2(g_iTrace, TR_flFraction, fFraction);
	if(fFraction == 1.0)
		return true;
	return false;
}
stock UTIL_PlaySound(iIndex = 0, szSound[], bool:bLoop = false) 
{
	new szTemp[128]; copyc(szTemp, charsmax(szTemp), szSound, '.');
	if(contain(szSound, ".mp3") != -1) 
		client_cmd(iIndex, "mp3 %s ^"sound/%s^"", bLoop ? "loop" : "play", szTemp);
	else 
		client_cmd(iIndex, "spk ^"%s^"", szTemp);
}
stock UTIL_StopSound(iIndex = 0) 
{
	client_cmd(iIndex, "stopsound;mp3 stop");
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/

I tried but failed. errors

//// perrot.sma
//
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\engine.inc(799) : error 017: undefined symbol "kRenderFxNone"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cssdk_const.inc(811) : error 021: symbol already defined: "TeamName"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(181) : error 017: undefined symbol "register_dictionary_colored"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : error 017: undefined symbol "DontChange"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : error 001: expected token: ";", but found ")"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : error 029: invalid expression, assumed zero
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\perrot.sma(311) : fatal error 107: too many error messages on one line
//
try but not sure:

Code: Select all

#include <engine>
#include <xs>

#include <colorchat>


#define GET_MONEY(%0)		cs_get_user_money(%0)
#define SET_MONEY(%0,%1) 	cs_set_user_money(%0,%1)
#define GET_EXP(%0)			ze_get_user_xp(%0)
#define SET_EXP(%0,%1)		ze_set_user_xp(%0,%1)

/*
[0.9.5]
- ??????????? ????????? ???????
- ????????? ????????? BuyMenu, Level System
*/

#define PLUGIN_NAME				"[ZDT] Bonus round: Pierrot"
#define PLUGIN_VERSION			"0.9.5"
#define PLUGIN_AUTHOR			"Doc.Batcon"
#define PLUGIN_PREFIX			"^4[BR]^1"
#define PLUGIN_DICTIONARY		"npc_bonusmon_092.txt"

new const SNOWMAN_ENTITY[] 		= "monster_hevsuit_dead"
new const SNOWMAN_CLASSNAME[] 	= "npc_snowman"
new const SNOWMAN_MODEL[] 		= "models/zdt/monsters/npc_snowman.mdl"
#define SNOWMAN_HEALTH 			100.0
#define SNOWMAN_SPEED			200.0
#define SNOWMAN_BODY			random_num(0, 1)
#define SNOWMAN_SKIN			random_num(0, 5)

new const SNOWMAN_SOUNDS[][] =
{
	"zdt/snow_idle.wav",
	"zdt/snow_die.wav",
	"zdt/snow_pain.wav"
}

enum _: eSnowmanAnim
{
	ANIM_DUMMY,
	ANIM_IDLE,
	ANIM_WALK,
	ANIM_RUN,
	ANIM_JUMP,
	ANIM_FLINCH,
	ANIM_FLINCH2,
	ANIM_DEATH
}
enum _: eSnowmanAct
{
	ACT_DUMMY,
	ACT_IDLE,
	ACT_MOVE,
	ACT_JUMP,
	ACT_FLINCH,
	ACT_DIE
}

#define HUD_EVENT_X			-1.0
#define HUD_EVENT_Y			0.17

#define BR_TASKID			111
#define SP_DIR 				"npc_snowman"

//?????????

//obslugiwane mody
enum _: eSupportMods
{
	SUPPORT_CLASSIC,	//[Money]
	SUPPORT_ZE43,		//[AmmoPacks]
	SUPPORT_BIOHAZARD	//[Money]
}

#define SUPPORT_MOD		SUPPORT_ZE43

//nagroda za zabicie balwana
#define GIVE_REWARD		100
//ilosc expa za balwana
#define GIVE_EXP		1000

//muzyka podczas rundy balwanow		[mozna komentowac aby wylaczyc]
#define BR_MUSIC			"zdt/scenario_xmas.mp3" 
//czas trwania trybu 1.0 = 1 minuta	[mozna komentowac aby wylaczyc]
#define BR_ROUNDTIME		3.0
//szansa na uruchomienie 
#define BR_CHANGE			5
//Maksymalna liczba ba?wan?w utworzonych na cykl
#define BR_CLOWN_SPAWN		10
//Maksymalna liczba ?ywych ba?wan?w
//(zalecane 40-60) 
#define BR_CLOWN_MAX		50
//Blokowanie obra?e? mi?dzy graczami w trybie [Mozesz komentowac]
//(dla SUPPORT_CLASSIC)
#define BR_BLOCK_DAMAGE		true
//Minimalna odleg?o?? mi?dzy spawnem
#define SP_MIN_DIST		64.0
//Odrodzenie wy?wietlania maksymalnego zakresu w menu
#define SP_MAX_SHOW_DIST	512.0
//Wlaczyc obs?ug? menu Kup? [Mo?esz komentowa?]
//#define ENABLED_SUPPORT_BUYMENU
//W??czy? obs?ug? poziomu systemu? [Mo?esz komentowa?]
//#define ENABLED_SUPPORT_LEVELSYSTEM

new g_iMenuClown;
new Array:g_aClownSpawnX, Array:g_aClownSpawnY, Array:g_aClownSpawnZ, Array:g_aSpawns;
new g_sModelIndexBeam;
new bool:g_bBonusRound, g_iBonusRoundStatus, g_iClownSpawned;
new bool:g_bNextRoundIsBonus;
new bool:g_bChangeBonusRound = true;
new bool:g_bIsFirstRound = true;
new g_iTrace;

#if defined BR_ROUNDTIME
new Float:g_fRoundTime;
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true && SUPPORT_MOD != SUPPORT_CLASSIC
	#undef BR_BLOCK_DAMAGE
	#define BR_BLOCK_DAMAGE	false
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
new HamHook:g_HamHookTraceAttack;
new HamHook:g_HamHookTakeDamage;
#endif

#if SUPPORT_MOD == SUPPORT_CLASSIC
	#include <cstrike>
#endif
#if SUPPORT_MOD == SUPPORT_ZE43
	#include <zombie_escape>
#endif
#if SUPPORT_MOD == SUPPORT_BIOHAZARD
	#include <cstrike>
	#include <biohazard>
#endif
#if defined ENABLED_SUPPORT_BUYMENU
	native GET_MONEY(pPlayer)
	native SET_MONEY(pPlayer, iValue)
#endif
#if defined ENABLED_SUPPORT_LEVELSYSTEM
	native GET_EXP(pPlayer)
	native SET_EXP(pPlayer, iValue)
#endif

#if SUPPORT_MOD == SUPPORT_ZE43 || SUPPORT_MOD == SUPPORT_BIOHAZARD
new g_CvarID_GameModeDelay;
new Float:g_fRoundDelay;
#endif

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_think(SNOWMAN_CLASSNAME, "Snowman_Think");
	RegisterHam(Ham_Killed, SNOWMAN_ENTITY, "CBaseEntity_Killed", false);
	RegisterHam(Ham_TakeDamage, SNOWMAN_ENTITY, "CBaseEntity_TakeDamage", false);
	RegisterHam(Ham_BloodColor, SNOWMAN_ENTITY, "CBaseEntity_BloodColor", false);
	RegisterHam(Ham_TraceBleed, SNOWMAN_ENTITY, "CBaseEntity_TraceBleed", false);
	RegisterHam(Ham_Classify, SNOWMAN_ENTITY, "CBaseEntity_Classify", false);

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		g_HamHookTraceAttack = RegisterHam(Ham_TraceAttack, "player", "CBasePlayer_TraceAttack", false);
		g_HamHookTakeDamage = RegisterHam(Ham_TakeDamage, "player", "CBasePlayer_TakeDamage", false);
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif

	register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
	register_logevent("Event_RoundStarted", 2, "1=Round_Start");
	register_logevent("Event_RoundEnd", 2, "1=Round_End");
	register_logevent("Event_RoundRestart", 2, "1=Game_Commencing");
	register_event("TextMsg", "Event_RoundRestart", "a", "2=#Game_will_restart_in");

	register_dictionary_colored(PLUGIN_DICTIONARY);

	register_clcmd("say bonusround", "ClientCmd_ShowMenu");
}
public plugin_precache()
{
	precache_model(SNOWMAN_MODEL);
	g_sModelIndexBeam = precache_model("sprites/laserbeam.spr");

	for(new i; i < sizeof SNOWMAN_SOUNDS; i++)
		precache_sound(SNOWMAN_SOUNDS[i]);

	#if defined BR_MUSIC
		new buffer[64]; formatex(buffer, charsmax(buffer), "sound/%s", BR_MUSIC);
		precache_generic(buffer);
	#endif

	g_aSpawns = ArrayCreate(1, 1);
	g_aClownSpawnX = ArrayCreate(1, 1);
	g_aClownSpawnY = ArrayCreate(1, 1);
	g_aClownSpawnZ = ArrayCreate(1, 1);

	g_iTrace = create_tr2();

	g_iMenuClown = menu_create("MENU_TITLE", "MenuHandler_Pierrot");
	menu_additem(g_iMenuClown, "MENU_ITEM_01");
	menu_additem(g_iMenuClown, "MENU_ITEM_02");
	menu_additem(g_iMenuClown, "MENU_ITEM_03");
}
public plugin_cfg()
{
	SP_LoadPoints();

	#if SUPPORT_MOD == SUPPORT_ZE43
		g_CvarID_GameModeDelay = get_cvar_pointer("ze_delay");
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD
		g_CvarID_GameModeDelay = get_cvar_pointer("bh_starttime");
	#endif
}
public Snowman_Reward(const pEntity, const pPlayer)
{
	#if SUPPORT_MOD == SUPPORT_CLASSIC && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_ZE43 && !defined ENABLED_SUPPORT_BUYMENU
		ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if defined ENABLED_SUPPORT_BUYMENU
		SET_MONEY(pPlayer, GET_MONEY(pPlayer) + GIVE_REWARD);
	#endif	
	#if defined ENABLED_SUPPORT_LEVELSYSTEM
		SET_EXP(pPlayer, GET_EXP(pPlayer) + GIVE_EXP);
	#endif	
}
#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
public CBasePlayer_TraceAttack(pPlayer, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBasePlayer_TakeDamage(pPlayer, pInflictor, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
#endif
public BonusRound_Start()
{
	set_dhudmessage(0, 120, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0);
	show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_HUD_PREPARE");

	#if defined BR_MUSIC
		UTIL_StopSound();
		UTIL_PlaySound(0, BR_MUSIC, true);
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		EnableHamForward(g_HamHookTraceAttack);
		EnableHamForward(g_HamHookTakeDamage);
	#endif	

	set_task(1.0, "Task_GL_BonusRound", BR_TASKID, _, _, "b");
	g_iBonusRoundStatus = 1;
	g_bBonusRound = true;
	g_bNextRoundIsBonus = false;
}
public BonusRound_End()
{
	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if SUPPORT_MOD == SUPPORT_ZE43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif

	remove_task(BR_TASKID);
	g_iBonusRoundStatus = 2;
	g_bBonusRound = false;
	
	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
	{
		if(entity_get_int(pEntity, EV_INT_deadflag) != DEAD_NO)
			continue;

		entity_set_edict(pEntity, EV_ENT_dmg_inflictor, 0);
		Snowman_SetActivity(pEntity, ACT_DIE);
	}
}
public BonusRound_NextRound()
{
	g_bNextRoundIsBonus = true;
	g_bChangeBonusRound = false;
	client_print_color(0, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_PREPARE");

	#if SUPPORT_MOD == SUPPORT_ZE43
		g_fRoundDelay = float(get_pcvar_num(g_CvarID_GameModeDelay));
		set_pcvar_num(g_CvarID_GameModeDelay, 999);
	#endif
}

public Event_RoundStart()
{
	#if defined BR_ROUNDTIME
		if(g_bNextRoundIsBonus)
		{
			g_fRoundTime = get_cvar_float("mp_roundtime");
			server_cmd("mp_roundtime %f", BR_ROUNDTIME);
			server_exec();
		}
	#endif

	if(!g_iBonusRoundStatus)
		return;

	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif	

	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
		entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
	
	remove_task(BR_TASKID);
	g_iClownSpawned = 0;
	g_iBonusRoundStatus = 0;
	g_bBonusRound = false;
}
public Event_RoundStarted()
{
	if(g_bNextRoundIsBonus)
		BonusRound_Start();
}
public Event_RoundEnd()
{
	if(!g_bIsFirstRound && g_bChangeBonusRound && !random_num(0, BR_CHANGE))
	{
		BonusRound_NextRound();
	}

	g_bIsFirstRound = false;

	if(g_iBonusRoundStatus != 1)
		return;

	BonusRound_End();

	#if defined BR_ROUNDTIME
		server_cmd("mp_roundtime %f", g_fRoundTime);
		server_exec();
	#endif
}
public Event_RoundRestart()
{
	g_bNextRoundIsBonus = false;
	g_bChangeBonusRound = true;
	g_bIsFirstRound = true;

	if(!g_iBonusRoundStatus)
		return;

	#if SUPPORT_MOD == SUPPORT_ZE43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif
}

public Task_GL_BonusRound(TaskID)
{
	new PointID, Float:vPoint[3];
	new iMaxSpawns = BR_CLOWN_SPAWN;
	while(iMaxSpawns && (g_iClownSpawned <= BR_CLOWN_MAX) && ((PointID = SP_GetRandomEmptyPointID()) != -1))
	{
		SP_GetPointOrigin(PointID, vPoint);
		Snowman_Spawn(vPoint);
		iMaxSpawns--;
	}
}
public ClientCmd_ShowMenu(pPlayer)
{
	if(get_user_flags(pPlayer) & ADMIN_IMMUNITY)
	{
		new buffer[64]; 
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_MAIN_TITLE");
		menu_setprop(g_iMenuClown, MPROP_TITLE, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_01");
		menu_item_setname(g_iMenuClown, 0, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_02");
		menu_item_setname(g_iMenuClown, 1, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_03");
		menu_item_setname(g_iMenuClown, 2, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_EXIT");
		menu_setprop(g_iMenuClown, MPROP_EXITNAME, buffer);
		menu_display(pPlayer, g_iMenuClown);
		set_task(0.1, "Task_Client_ShowPoints", pPlayer, _, _, "b");
		set_pdata_int(pPlayer, 205, 0, 5);
	}
	else
	{
		client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_01");
	}
	return PLUGIN_HANDLED;
}
public Task_Client_ShowPoints(pPlayer)
{
	if(!is_user_connected(pPlayer) || !IsShowMenu(pPlayer,g_iMenuClown))
	{
		remove_task(pPlayer);
		return;
	}

	new Float:vOrigin[3]
	new Float:vPoint[3], iPoint[3];
	new PointID = -1;

	entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);

	while((PointID = SP_GetPointInSphere(PointID, vOrigin, SP_MAX_SHOW_DIST)) != -1)
	{
		SP_GetPointOrigin(PointID, vPoint);
		FVecIVec(vPoint, iPoint);

		message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, pPlayer);
		write_byte(TE_BEAMPOINTS);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]-36);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]+36);
		write_short(g_sModelIndexBeam);
		write_byte(1);               
        	write_byte(1);                 
        	write_byte(5);           
        	write_byte(10);     
        	write_byte(2);     
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(200);           
        	write_byte(0);               
        	message_end();
	}
}
public bool:IsShowMenu(pPlayer, iMenu)
{
	new iMenuOLD, iMenuNEW;
	player_menu_info(pPlayer, iMenuOLD, iMenuNEW);
	if(iMenuOLD == iMenu || iMenuNEW == iMenu)
		return true;
	return false;
}
public MenuHandler_Pierrot(pPlayer, iMenuID, iItem)
{
	if(iItem > -1)
		menu_display(pPlayer, iMenuID);

	if(iItem == MENU_EXIT)
		remove_task(pPlayer);

	switch(iItem)
	{
		case 0:
		{
			new Float:vOrigin[3]; UTIL_GetAimOriginSpawn(pPlayer, vOrigin);

			if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_DONT_VACPOINT");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}

			new PointID = SP_GetPointInSphere(-1, vOrigin, SP_MIN_DIST);
			if(PointID == -1)
			{
				SP_AddPoint(vOrigin);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_CREATED");
			}
			else
			{
				SP_SubPoint(PointID);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_DELETED");
			}
		}
		case 1:
		{
			if(SP_SavePoints())
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT");
			else
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT_FAIL");
		}
		case 2:
		{
			if(g_bBonusRound || g_iBonusRoundStatus || g_bNextRoundIsBonus || !SP_GetPointsNum())
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_02");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}
			
			BonusRound_NextRound();
		}
	}

	UTIL_PlaySound(pPlayer, "common/wpn_denyselect.wav");
}
public Snowman_Spawn(const Float:vOrigin[3])
{
	static pEntity;
	if(!(pEntity = create_entity(SNOWMAN_ENTITY)))
		return 0

	entity_set_string(pEntity, EV_SZ_classname, SNOWMAN_CLASSNAME);
	entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
	entity_set_int(pEntity, EV_INT_solid, SOLID_BBOX);
	entity_set_int(pEntity, EV_INT_deadflag, DEAD_NO);
	entity_set_int(pEntity, EV_INT_flags, FL_MONSTER);
	entity_set_int(pEntity, EV_INT_skin, SNOWMAN_SKIN);

	if(!entity_get_int(pEntity, EV_INT_skin))
		entity_set_int(pEntity, EV_INT_body,  SNOWMAN_BODY);
		
	entity_set_float(pEntity, EV_FL_health, SNOWMAN_HEALTH);
	entity_set_float(pEntity, EV_FL_gravity, 1.0);
	entity_set_float(pEntity, EV_FL_framerate, 1.0);
	entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_AIM);
	entity_set_vector(pEntity, EV_VEC_view_ofs, Float:{0.0, 0.0, 10.0});
	entity_set_model(pEntity, SNOWMAN_MODEL);
	entity_set_size(pEntity, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 18.0});
	entity_set_origin(pEntity, vOrigin);
	Snowman_SetActivity(pEntity, ACT_JUMP);
	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
	g_iClownSpawned++;
	return pEntity;
}
public Snowman_Think(const pEntity)
{
	static iActivity; iActivity = entity_get_int(pEntity, EV_INT_iuser1);
	static Float:fGameTime; fGameTime = get_gametime();
	static pTarget; pTarget = entity_get_edict(pEntity, EV_ENT_enemy);
	static Float:fDelay; fDelay = 0.1;
	static Float:vTarget[3];

	if(iActivity == ACT_IDLE || iActivity == ACT_MOVE)
	{
		if(pTarget)
		{
			if(!Snowman_IsValidPlayer(pEntity, pTarget))
			{
				Snowman_SetNextFindPlayer(pEntity, 1.0);
				Snowman_SetNextCheckMove(pEntity, 1.0);
				pTarget = 0;
			}

			if(pTarget)
			{
				entity_get_vector(pTarget, EV_VEC_origin, vTarget);
				Snowman_SetMovePoint(pEntity, vTarget);
				Snowman_SetNextCheckMove(pEntity, 1.0);

				if(Snowman_IsMoveComplete(pEntity) || 
				entity_get_edict(pEntity, EV_ENT_groundentity) == pTarget
				)
					iActivity = ACT_IDLE;
				else
					iActivity = ACT_MOVE;
			}
			else
			{
				iActivity = ACT_IDLE;
			}
		}
		else
		{
			if((Snowman_GetNextCheckMove(pEntity) > fGameTime) && !Snowman_IsMoveComplete(pEntity))
				iActivity = ACT_MOVE;
			else
				iActivity = ACT_IDLE;
		}
	}

	if(entity_get_edict(pEntity, EV_ENT_enemy) == 0)
		pTarget = 0;

	if(Snowman_GetNextFindPlayer(pEntity) < fGameTime)
	{
		pTarget = Snowman_FindTarget(pEntity);
		Snowman_SetNextFindPlayer(pEntity, pTarget ? 5.0 : 1.0);
	}

	entity_set_edict(pEntity, EV_ENT_enemy, pTarget);

	switch(iActivity)
	{
		case ACT_DUMMY:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);
		}
		case ACT_IDLE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
			{
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);

				 if(Snowman_GetNextSoundIdle(pEntity) - fGameTime > 1.0)
				 	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextSoundIdle(pEntity) < fGameTime)
			{
				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextCheckMove(pEntity) <= fGameTime)
			{
				new iPointNum = Snowman_GetRandomDir(pEntity, vTarget);

				if(iPointNum)
				{
					Snowman_SetMovePoint(pEntity, vTarget);
					Snowman_SetNextCheckMove(pEntity, random_float(2.0, 4.0));
					iActivity = ACT_MOVE;
				}
				else
					Snowman_SetNextCheckMove(pEntity, 2.0);
			}
		}
		case ACT_MOVE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_WALK)
				 UTIL_PlayAnimation(pEntity, ANIM_WALK);

			static MoveFlags; Snowman_MoveToOrigin(pEntity, SNOWMAN_SPEED, MoveFlags);

			if(MoveFlags & (1<<1))
				iActivity = ACT_IDLE;

			//Is snowman in air ?
			if(~entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				static Float:fFlyTime; fFlyTime = entity_get_float(pEntity, EV_FL_fuser1);
				if(fFlyTime == 0.0 || MoveFlags & (1<<0))
					fFlyTime = fGameTime;
				else if(fGameTime - fFlyTime > 0.15)
					iActivity = ACT_JUMP;
				entity_set_float(pEntity, EV_FL_fuser1, fFlyTime);
			}
			else
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
		}
		case ACT_JUMP:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_JUMP)
				 UTIL_PlayAnimation(pEntity, ANIM_JUMP);

			if(entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_PUSHSTEP);
				iActivity = ACT_IDLE;
			}	
		}
		case ACT_DIE:
		{
			if(entity_get_int(pEntity, EV_INT_deadflag) == DEAD_DEAD)
				entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
			else
			{
				new pAttacker = entity_get_edict(pEntity, EV_ENT_dmg_inflictor);
				if(is_user_connected(pAttacker))
					Snowman_Reward(pEntity, pAttacker);

				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				UTIL_PlayAnimation(pEntity, ANIM_DEATH);
				entity_set_int(pEntity, EV_INT_solid, SOLID_NOT);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
				entity_set_int(pEntity, EV_INT_deadflag, DEAD_DEAD);
				entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_NO);
				fDelay = 4.0
				g_iClownSpawned--;
			}
		}
		case ACT_FLINCH:
		{
			emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			UTIL_PlayAnimation(pEntity, random_num(ANIM_FLINCH, ANIM_FLINCH2));
			fDelay = 0.15
			iActivity = ACT_IDLE
		}
	}

	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, fGameTime + fDelay);
}
public Snowman_SetActivity(const pEntity, const iActivity)
{
	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, get_gametime());
}
public Snowman_FindTarget(const pEntity)
{
	static pTarget; pTarget = 0;
	static Float:fMin; fMin = 8192.0;
	static Float:fCur;

	static PlayersID[32], iPlayersNum;
	get_players(PlayersID, iPlayersNum, "ah");
	static i, pPlayer;
	for(i = 0; i < iPlayersNum; i++)
	{
		pPlayer = PlayersID[i];

		if(!ENG_is_visible(pEntity, pPlayer))
			continue;

		fCur = entity_range(pEntity, pPlayer);

		if(fCur < fMin)
		{
			fMin = fCur;
			pTarget = pPlayer;
		}
	}

	return pTarget;
}
public Snowman_GetRandomDir(const pEntity, Float:vTarget[3])
{
	static Float:vAngles[3]; entity_get_vector(pEntity, EV_VEC_angles, vAngles);
	static Float:vOrigin[3]; entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	static Float:vEnd[3];

	static Float:vForward[3];
	static Float:vPoint[16][3], iPointNum; iPointNum = 0;
	static Float:vAngles2[3]; vAngles2[1] = vAngles[1];
	static Float:vEndPos[3];
	static Float:fCur;

	static i;
	for(i = 0; i < 16; i++)
	{
		angle_vector(vAngles2, ANGLEVECTOR_FORWARD, vForward);
		vEnd[0] = vOrigin[0] + vForward[0] * 1024.0;
		vEnd[1] = vOrigin[1] + vForward[1] * 1024.0;
		vEnd[2] = vOrigin[2] + vForward[2] * 1024.0;
		
		
		ENG_trace_line(pEntity, vOrigin, vEnd, vEndPos);

		fCur = get_distance_f(vOrigin, vEndPos);
		vAngles2[1] += 20.0

		if(fCur < 64.0)
			continue;

		xs_vec_copy(vEndPos, vPoint[iPointNum]);
		iPointNum++;
	}

	if(iPointNum)
		xs_vec_copy(vPoint[random(iPointNum)], vTarget);

	return iPointNum;
}
public Float:Snowman_GetNextCheckMove(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser2);
}
public Snowman_SetNextCheckMove(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser2, get_gametime() + fDelay);
}
public Float:Snowman_GetNextFindPlayer(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser3);
}
public Snowman_SetNextFindPlayer(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser3, get_gametime() + fDelay);
}
public Snowman_SetMovePoint(const pEntity, const Float:vPoint[3])
{
	entity_set_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Snowman_GetMovePoint(const pEntity, Float:vPoint[3])
{
	entity_get_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Float:Snowman_GetNextSoundIdle(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser4);
}
public Float:Snowman_SetNextSoundIdle(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser4, get_gametime() + fDelay);
}

public bool:Snowman_IsMoveComplete(const pEntity)
{
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vEnd[3]; Snowman_GetMovePoint(pEntity, vEnd);

	if(get_distance_f(vSrc, vEnd) < 64.0)
		return true;

	vEnd[2] = vSrc[2];
	static Float:vDir[3]; xs_vec_sub(vEnd, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	vEnd[0] = vSrc[0] + vForward[0] * 26.0;
	vEnd[1] = vSrc[1] + vForward[1] * 26.0;
	vEnd[2] = vSrc[2] + vForward[2] * 26.0;
	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
		{
			if(entity_get_edict(pEntity, EV_ENT_enemy))
			{
				entity_set_edict(pEntity, EV_ENT_enemy, 0);
				Snowman_SetNextFindPlayer(pEntity, 0.5);
				Snowman_SetNextCheckMove(pEntity, 0.1);
			}
			return true;
		}
	}
	return false;
}
public bool:Snowman_IsValidPlayer(const pEntity, const pPlayer)
{
	if(!is_user_alive(pPlayer))
		return false;
	if(!ENG_is_visible(pEntity, pPlayer))
		return false;
	return true;
}

public CBaseEntity_Killed(const pEntity, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	Snowman_SetActivity(pEntity, ACT_DIE);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TakeDamage(const pEntity, const pInflictor, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return;
	entity_set_edict(pEntity, EV_ENT_dmg_inflictor, pAttacker);
	Snowman_SetActivity(pEntity, ACT_FLINCH);
}
public CBaseEntity_BloodColor(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(12);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TraceBleed(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBaseEntity_Classify(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(4);
	return HAM_SUPERCEDE;
}

public Snowman_MoveToOrigin(const pEntity, const Float:fSpeed, Flags)
{
	Flags = 0;

	static Float:vOrigin[3]; Snowman_GetMovePoint(pEntity, vOrigin);
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vDir[3]; xs_vec_sub(vOrigin, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vVel[3]; xs_vec_normalize(vDir, vDir);
	xs_vec_mul_scalar(vDir, fSpeed, vVel);
	vAngles[0] = vAngles[2] = 0.0;
	vVel[2] = -100.0;

	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	static Float:vEnd[3]; 
	vEnd[0] = vSrc[0] + vForward[0] * 20.0;
	vEnd[1] = vSrc[1] + vForward[1] * 20.0;
	vEnd[2] = vSrc[2] + vForward[2] * 20.0;

	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(!ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
		{
			vVel[2] = 200.0;
			Flags |= (1<<0);
		}
	}

	entity_set_vector(pEntity, EV_VEC_angles, vAngles);
	entity_set_vector(pEntity, EV_VEC_velocity, vVel);

	if(Snowman_IsMoveComplete(pEntity) && !(Flags & (1<<0)))
		Flags |= (1<<1);
}

stock UTIL_PlayAnimation(const pEntity, const iAnim)
{
	entity_set_int(pEntity, EV_INT_sequence, iAnim);
	entity_set_float(pEntity, EV_FL_animtime, get_gametime());
	entity_set_float(pEntity, EV_FL_frame, 0.0);
	return iAnim;
}
stock bool:UTIL_IsHullVacant(Float:vOrigin[3], const HullType)
{
	if(!ENG_trace_hull(vOrigin, vOrigin, HullType))
		return true;
	return false;
}
stock UTIL_GetAimOrigin(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);
}
stock UTIL_GetAimOriginSpawn(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);

	new Float:vNormal[3]; get_tr2(g_iTrace, TR_vecPlaneNormal, vNormal);
	if(vNormal[0] != 0.0) vPoint[0] += vNormal[0] * 20.0;
	if(vNormal[1] != 0.0) vPoint[1] += vNormal[1] * 20.0;
	if(vNormal[2] != 0.0) vPoint[2] += vNormal[2] * 36.0;
}

stock SP_AddPoint(const Float:vPoint[3])
{
	ArrayPushCell(g_aClownSpawnX, Float:vPoint[0]);
	ArrayPushCell(g_aClownSpawnY, Float:vPoint[1]);
	ArrayPushCell(g_aClownSpawnZ, Float:vPoint[2]);

	return SP_GetPointsNum();
}
stock bool:SP_SubPoint(const PointID)
{
	if(PointID < 0 || PointID > ArraySize(g_aClownSpawnX))
		return false;

	ArrayDeleteItem(g_aClownSpawnX, PointID);
	ArrayDeleteItem(g_aClownSpawnY, PointID);
	ArrayDeleteItem(g_aClownSpawnZ, PointID);
	return true;
}
stock bool:SP_IsValidOrigin(const Float:vOrigin[3])
{
	if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
		return false;

	if(!SP_IsValidMinDist(vOrigin))
		return false;

	return true;
}
stock bool:SP_IsValidMinDist(const Float:vOrigin[3], const Float:fMinDist = 64.0)
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fMinDist)
			return false;
	}
	return true;
}
stock SP_GetPointInSphere(StartPoint, const Float:vOrigin[3], const Float:fRadius = 64.0)
{
	new iPointsNum = SP_GetPointsNum();
	new PointID;

	if(!iPointsNum || StartPoint > iPointsNum)
		return -1;

	if(StartPoint < 0)
		StartPoint = 0;
	else
		StartPoint++;

	new Float:vPoint[3];
	for(PointID = StartPoint; PointID < iPointsNum; PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fRadius)
			return PointID;
	}

	return -1;
}
stock SP_GetPointOrigin(const PointID, Float:vOrigin[3])
{
	vOrigin[0] = Float:ArrayGetCell(g_aClownSpawnX, PointID);
	vOrigin[1] = Float:ArrayGetCell(g_aClownSpawnY, PointID);
	vOrigin[2] = Float:ArrayGetCell(g_aClownSpawnZ, PointID);
}
stock SP_GetEmptyPointID()
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			return PointID;
	}
	return -1;
}
stock SP_GetRandomEmptyPointID()
{
	ArrayClear(g_aSpawns);

	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			ArrayPushCell(g_aSpawns, PointID);
	}

	if(!ArraySize(g_aSpawns))
		return -1;

	return ArrayGetCell(g_aSpawns, random(ArraySize(g_aSpawns)));
}
stock SP_GetPointsNum()
{
	return ArraySize(g_aClownSpawnX);
}
stock bool:SP_SavePoints()
{	
	if(!SP_GetPointsNum())
		return false;

	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));

	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s",
		szCfgDir,
		SP_DIR
	);

	if(!dir_exists(szFileDir))
		mkdir(szFileDir);

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(file_exists(szFileDir))
		delete_file(szFileDir);

	new Float:vPoint[3];
	new szBuffer[64];
	for(new PointID = 0; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);

		formatex(szBuffer, charsmax(szBuffer), 
			"^"%.1f^" ^"%.1f^" ^"%.1f^"", 
			vPoint[0], vPoint[1], vPoint[2]
		);

		write_file(szFileDir, szBuffer);
	}

	return true;
}
stock SP_LoadPoints()
{
	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));
	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(!file_exists(szFileDir))
		return 0;

	new iFile = fopen(szFileDir, "rt");

	if(!iFile)
		return 0;

	new szBuffer[64];
	new Float:vPoint[3];
	new szPoint[3][7];
	while(iFile && !feof(iFile))
	{
		fgets(iFile, szBuffer, charsmax(szBuffer));
		if(!szBuffer[0] || szBuffer[0] == ';') 
			continue;

		parse(szBuffer, szPoint[0], 6, szPoint[1], 6, szPoint[2], 6);

		vPoint[0] = str_to_float(szPoint[0]);	
		vPoint[1] = str_to_float(szPoint[1]);	
		vPoint[2] = str_to_float(szPoint[2]);	

		SP_AddPoint(vPoint);
	}
	fclose(iFile);
	return SP_GetPointsNum();
}
stock ENG_trace_line(pEntity, Float:vSrc[3], Float:vEnd[3], Float:vEndPos[3])
{
	engfunc(EngFunc_TraceLine, vSrc, vEnd, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	get_tr2(g_iTrace, TR_vecEndPos, vEndPos);
}
stock bool:ENG_trace_hull(Float:vSrc[3], Float:vEnd[3], iHullType, pEntity = 0, Flags = 0)
{
	engfunc(EngFunc_TraceHull, vSrc, vEnd, Flags, iHullType, pEntity, g_iTrace);
	
	if(get_tr2(g_iTrace, TR_StartSolid) || get_tr2(g_iTrace, TR_AllSolid) || !get_tr2(g_iTrace, TR_InOpen))
		return true;
	return false;
}
stock bool:ENG_is_visible(pEntity, pEntity2)
{
	static Float:vOrigin[3];
	static Float:vLooker[3];
	static Float:vTarget[3];
	entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity, EV_VEC_view_ofs, vLooker);
	xs_vec_add(vLooker, vOrigin, vLooker);
	entity_get_vector(pEntity2, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity2, EV_VEC_view_ofs, vTarget);
	xs_vec_add(vTarget, vOrigin, vTarget);
	static Solid; Solid = entity_get_int(pEntity2, EV_INT_solid);
	entity_set_int(pEntity2, EV_INT_solid, SOLID_NOT);
	engfunc(EngFunc_TraceLine, vLooker, vTarget, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	entity_set_int(pEntity2, EV_INT_solid, Solid);
	if(get_tr2(g_iTrace, TR_InOpen) && get_tr2(g_iTrace, TR_InWater))
		return false;
	static Float:fFraction; get_tr2(g_iTrace, TR_flFraction, fFraction);
	if(fFraction == 1.0)
		return true;
	return false;
}
stock UTIL_PlaySound(iIndex = 0, szSound[], bool:bLoop = false) 
{
	new szTemp[128]; copyc(szTemp, charsmax(szTemp), szSound, '.');
	if(contain(szSound, ".mp3") != -1) 
		client_cmd(iIndex, "mp3 %s ^"sound/%s^"", bLoop ? "loop" : "play", szTemp);
	else 
		client_cmd(iIndex, "spk ^"%s^"", szTemp);
}
stock UTIL_StopSound(iIndex = 0) 
{
	client_cmd(iIndex, "stopsound;mp3 stop");
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#3

Post by czirimbolo » 4 years ago

// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\engine.inc(799) : error 017: undefined symbol "kRenderFxNone"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cssdk_const.inc(808) : error 021: symbol already defined: "TeamName"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(176) : error 017: undefined symbol "register_dictionary_colored"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : error 017: undefined symbol "DontChange"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : error 001: expected token: ";", but found ")"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : error 029: invalid expression, assumed zero
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 7 Errors.
// Could not locate output file compiled\balwany.amx (compile failed).
//
// Compilation Time: 2,33 sec
Image

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#4

Post by Muhammet20 » 4 years ago

czirimbolo wrote: 4 years ago // C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\engine.inc(799) : error 017: undefined symbol "kRenderFxNone"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cssdk_const.inc(808) : error 021: symbol already defined: "TeamName"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(176) : error 017: undefined symbol "register_dictionary_colored"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : error 017: undefined symbol "DontChange"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : warning 215: expression has no effect
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : error 001: expected token: ";", but found ")"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : error 029: invalid expression, assumed zero
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\balwany.sma(296) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 7 Errors.
// Could not locate output file compiled\balwany.amx (compile failed).
//
// Compilation Time: 2,33 sec
am sorry for late but i said before that i can't use the pc on the school days
here is the code try it and give me the informations:

Code: Select all

#include <zombie_escape>
#include <xs>

#include <colorchat>


#define GET_MONEY(%0)		cs_get_user_money(%0)
#define SET_MONEY(%0,%1) 	cs_set_user_money(%0,%1)
#define GET_EXP(%0)			ze_get_user_xp(%0)
#define SET_EXP(%0,%1)		ze_set_user_xp(%0,%1)

/*
[0.9.5]
- ??????????? ????????? ???????
- ????????? ????????? BuyMenu, Level System
*/

#define PLUGIN_NAME				"[ZDT] Bonus round: Pierrot"
#define PLUGIN_VERSION			"0.9.5"
#define PLUGIN_AUTHOR			"Doc.Batcon"
#define PLUGIN_PREFIX			"^4[BR]^1"
#define PLUGIN_DICTIONARY		"npc_bonusmon_092.txt"

new const SNOWMAN_ENTITY[] 		= "monster_hevsuit_dead"
new const SNOWMAN_CLASSNAME[] 	= "npc_snowman"
new const SNOWMAN_MODEL[] 		= "models/zdt/monsters/npc_snowman.mdl"
#define SNOWMAN_HEALTH 			100.0
#define SNOWMAN_SPEED			200.0
#define SNOWMAN_BODY			random_num(0, 1)
#define SNOWMAN_SKIN			random_num(0, 5)

new const SNOWMAN_SOUNDS[][] =
{
	"zdt/snow_idle.wav",
	"zdt/snow_die.wav",
	"zdt/snow_pain.wav"
}

enum _: eSnowmanAnim
{
	ANIM_DUMMY,
	ANIM_IDLE,
	ANIM_WALK,
	ANIM_RUN,
	ANIM_JUMP,
	ANIM_FLINCH,
	ANIM_FLINCH2,
	ANIM_DEATH
}
enum _: eSnowmanAct
{
	ACT_DUMMY,
	ACT_IDLE,
	ACT_MOVE,
	ACT_JUMP,
	ACT_FLINCH,
	ACT_DIE
}

#define HUD_EVENT_X			-1.0
#define HUD_EVENT_Y			0.17

#define BR_TASKID			111
#define SP_DIR 				"npc_snowman"

//?????????

//obslugiwane mody
enum _: eSupportMods
{
	SUPPORT_CLASSIC,	//[Money]
	SUPPORT_ZE43,		//[AmmoPacks]
	SUPPORT_BIOHAZARD	//[Money]
}

#define SUPPORT_MOD		SUPPORT_ZE43

//nagroda za zabicie balwana
#define GIVE_REWARD		100
//ilosc expa za balwana
#define GIVE_EXP		1000

//muzyka podczas rundy balwanow		[mozna komentowac aby wylaczyc]
#define BR_MUSIC			"zdt/scenario_xmas.mp3" 
//czas trwania trybu 1.0 = 1 minuta	[mozna komentowac aby wylaczyc]
#define BR_ROUNDTIME		3.0
//szansa na uruchomienie 
#define BR_CHANGE			5
//Maksymalna liczba ba?wan?w utworzonych na cykl
#define BR_CLOWN_SPAWN		10
//Maksymalna liczba ?ywych ba?wan?w
//(zalecane 40-60) 
#define BR_CLOWN_MAX		50
//Blokowanie obra?e? mi?dzy graczami w trybie [Mozesz komentowac]
//(dla SUPPORT_CLASSIC)
#define BR_BLOCK_DAMAGE		true
//Minimalna odleg?o?? mi?dzy spawnem
#define SP_MIN_DIST		64.0
//Odrodzenie wy?wietlania maksymalnego zakresu w menu
#define SP_MAX_SHOW_DIST	512.0
//Wlaczyc obs?ug? menu Kup? [Mo?esz komentowa?]
//#define ENABLED_SUPPORT_BUYMENU
//W??czy? obs?ug? poziomu systemu? [Mo?esz komentowa?]
//#define ENABLED_SUPPORT_LEVELSYSTEM

new g_iMenuClown;
new Array:g_aClownSpawnX, Array:g_aClownSpawnY, Array:g_aClownSpawnZ, Array:g_aSpawns;
new g_sModelIndexBeam;
new bool:g_bBonusRound, g_iBonusRoundStatus, g_iClownSpawned;
new bool:g_bNextRoundIsBonus;
new bool:g_bChangeBonusRound = true;
new bool:g_bIsFirstRound = true;
new g_iTrace;

#if defined BR_ROUNDTIME
new Float:g_fRoundTime;
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true && SUPPORT_MOD != SUPPORT_CLASSIC
	#undef BR_BLOCK_DAMAGE
	#define BR_BLOCK_DAMAGE	false
#endif

#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
new HamHook:g_HamHookTraceAttack;
new HamHook:g_HamHookTakeDamage;
#endif

#if SUPPORT_MOD == SUPPORT_CLASSIC
	#include <cstrike>
#endif
#if SUPPORT_MOD == SUPPORT_ZE43
	#include <zombie_escape>
#endif
#if SUPPORT_MOD == SUPPORT_BIOHAZARD
	#include <cstrike>
	#include <biohazard>
#endif
#if defined ENABLED_SUPPORT_BUYMENU
	native GET_MONEY(pPlayer)
	native SET_MONEY(pPlayer, iValue)
#endif
#if defined ENABLED_SUPPORT_LEVELSYSTEM
	native GET_EXP(pPlayer)
	native SET_EXP(pPlayer, iValue)
#endif

#if SUPPORT_MOD == SUPPORT_ZE43 || SUPPORT_MOD == SUPPORT_BIOHAZARD
new g_CvarID_GameModeDelay;
new Float:g_fRoundDelay;
#endif

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_think(SNOWMAN_CLASSNAME, "Snowman_Think");
	RegisterHam(Ham_Killed, SNOWMAN_ENTITY, "CBaseEntity_Killed", false);
	RegisterHam(Ham_TakeDamage, SNOWMAN_ENTITY, "CBaseEntity_TakeDamage", false);
	RegisterHam(Ham_BloodColor, SNOWMAN_ENTITY, "CBaseEntity_BloodColor", false);
	RegisterHam(Ham_TraceBleed, SNOWMAN_ENTITY, "CBaseEntity_TraceBleed", false);
	RegisterHam(Ham_Classify, SNOWMAN_ENTITY, "CBaseEntity_Classify", false);

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		g_HamHookTraceAttack = RegisterHam(Ham_TraceAttack, "player", "CBasePlayer_TraceAttack", false);
		g_HamHookTakeDamage = RegisterHam(Ham_TakeDamage, "player", "CBasePlayer_TakeDamage", false);
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif

	register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
	register_logevent("Event_RoundStarted", 2, "1=Round_Start");
	register_logevent("Event_RoundEnd", 2, "1=Round_End");
	register_logevent("Event_RoundRestart", 2, "1=Game_Commencing");
	register_event("TextMsg", "Event_RoundRestart", "a", "2=#Game_will_restart_in");

	register_dictionary_colored(PLUGIN_DICTIONARY);

	register_clcmd("say bonusround", "ClientCmd_ShowMenu");
}
public plugin_precache()
{
	precache_model(SNOWMAN_MODEL);
	g_sModelIndexBeam = precache_model("sprites/laserbeam.spr");

	for(new i; i < sizeof SNOWMAN_SOUNDS; i++)
		precache_sound(SNOWMAN_SOUNDS[i]);

	#if defined BR_MUSIC
		new buffer[64]; formatex(buffer, charsmax(buffer), "sound/%s", BR_MUSIC);
		precache_generic(buffer);
	#endif

	g_aSpawns = ArrayCreate(1, 1);
	g_aClownSpawnX = ArrayCreate(1, 1);
	g_aClownSpawnY = ArrayCreate(1, 1);
	g_aClownSpawnZ = ArrayCreate(1, 1);

	g_iTrace = create_tr2();

	g_iMenuClown = menu_create("MENU_TITLE", "MenuHandler_Pierrot");
	menu_additem(g_iMenuClown, "MENU_ITEM_01");
	menu_additem(g_iMenuClown, "MENU_ITEM_02");
	menu_additem(g_iMenuClown, "MENU_ITEM_03");
}
public plugin_cfg()
{
	SP_LoadPoints();

	#if SUPPORT_MOD == SUPPORT_ZE43
		g_CvarID_GameModeDelay = get_cvar_pointer("ze_delay");
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD
		g_CvarID_GameModeDelay = get_cvar_pointer("bh_starttime");
	#endif
}
public Snowman_Reward(const pEntity, const pPlayer)
{
	#if SUPPORT_MOD == SUPPORT_CLASSIC && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_ZE43 && !defined ENABLED_SUPPORT_BUYMENU
		ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
	#endif
	#if SUPPORT_MOD == SUPPORT_BIOHAZARD && !defined ENABLED_SUPPORT_BUYMENU
		cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
	#endif
	#if defined ENABLED_SUPPORT_BUYMENU
		SET_MONEY(pPlayer, GET_MONEY(pPlayer) + GIVE_REWARD);
	#endif	
	#if defined ENABLED_SUPPORT_LEVELSYSTEM
		SET_EXP(pPlayer, GET_EXP(pPlayer) + GIVE_EXP);
	#endif	
}
#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
public CBasePlayer_TraceAttack(pPlayer, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBasePlayer_TakeDamage(pPlayer, pInflictor, pAttacker)
{
	if(!is_user_connected(pAttacker))
		return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
#endif
public BonusRound_Start()
{
	set_dhudmessage(0, 120, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0);
	show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_HUD_PREPARE");

	#if defined BR_MUSIC
		UTIL_StopSound();
		UTIL_PlaySound(0, BR_MUSIC, true);
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		EnableHamForward(g_HamHookTraceAttack);
		EnableHamForward(g_HamHookTakeDamage);
	#endif	

	set_task(1.0, "Task_GL_BonusRound", BR_TASKID, _, _, "b");
	g_iBonusRoundStatus = 1;
	g_bBonusRound = true;
	g_bNextRoundIsBonus = false;
}
public BonusRound_End()
{
	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if SUPPORT_MOD == SUPPORT_ZE43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif

	remove_task(BR_TASKID);
	g_iBonusRoundStatus = 2;
	g_bBonusRound = false;
	
	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
	{
		if(entity_get_int(pEntity, EV_INT_deadflag) != DEAD_NO)
			continue;

		entity_set_edict(pEntity, EV_ENT_dmg_inflictor, 0);
		Snowman_SetActivity(pEntity, ACT_DIE);
	}
}
public BonusRound_NextRound()
{
	g_bNextRoundIsBonus = true;
	g_bChangeBonusRound = false;
	client_print_color(0, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_PREPARE");

	#if SUPPORT_MOD == SUPPORT_ZE43
		g_fRoundDelay = float(get_pcvar_num(g_CvarID_GameModeDelay));
		set_pcvar_num(g_CvarID_GameModeDelay, 999);
	#endif
}

public Event_RoundStart()
{
	#if defined BR_ROUNDTIME
		if(g_bNextRoundIsBonus)
		{
			g_fRoundTime = get_cvar_float("mp_roundtime");
			server_cmd("mp_roundtime %f", BR_ROUNDTIME);
			server_exec();
		}
	#endif

	if(!g_iBonusRoundStatus)
		return;

	#if defined BR_MUSIC
		UTIL_StopSound();
	#endif

	#if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
		DisableHamForward(g_HamHookTraceAttack);
		DisableHamForward(g_HamHookTakeDamage);
	#endif	

	new pEntity = -1;
	while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
		entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
	
	remove_task(BR_TASKID);
	g_iClownSpawned = 0;
	g_iBonusRoundStatus = 0;
	g_bBonusRound = false;
}
public Event_RoundStarted()
{
	if(g_bNextRoundIsBonus)
		BonusRound_Start();
}
public Event_RoundEnd()
{
	if(!g_bIsFirstRound && g_bChangeBonusRound && !random_num(0, BR_CHANGE))
	{
		BonusRound_NextRound();
	}

	g_bIsFirstRound = false;

	if(g_iBonusRoundStatus != 1)
		return;

	BonusRound_End();

	#if defined BR_ROUNDTIME
		server_cmd("mp_roundtime %f", g_fRoundTime);
		server_exec();
	#endif
}
public Event_RoundRestart()
{
	g_bNextRoundIsBonus = false;
	g_bChangeBonusRound = true;
	g_bIsFirstRound = true;

	if(!g_iBonusRoundStatus)
		return;

	#if SUPPORT_MOD == SUPPORT_ZE43
		set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
	#endif
}

public Task_GL_BonusRound(TaskID)
{
	new PointID, Float:vPoint[3];
	new iMaxSpawns = BR_CLOWN_SPAWN;
	while(iMaxSpawns && (g_iClownSpawned <= BR_CLOWN_MAX) && ((PointID = SP_GetRandomEmptyPointID()) != -1))
	{
		SP_GetPointOrigin(PointID, vPoint);
		Snowman_Spawn(vPoint);
		iMaxSpawns--;
	}
}
public ClientCmd_ShowMenu(pPlayer)
{
	if(get_user_flags(pPlayer) & ADMIN_IMMUNITY)
	{
		new buffer[64]; 
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_MAIN_TITLE");
		menu_setprop(g_iMenuClown, MPROP_TITLE, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_01");
		menu_item_setname(g_iMenuClown, 0, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_02");
		menu_item_setname(g_iMenuClown, 1, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_03");
		menu_item_setname(g_iMenuClown, 2, buffer);
		formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_EXIT");
		menu_setprop(g_iMenuClown, MPROP_EXITNAME, buffer);
		menu_display(pPlayer, g_iMenuClown);
		set_task(0.1, "Task_Client_ShowPoints", pPlayer, _, _, "b");
		set_pdata_int(pPlayer, 205, 0, 5);
	}
	else
	{
		client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_01");
	}
	return PLUGIN_HANDLED;
}
public Task_Client_ShowPoints(pPlayer)
{
	if(!is_user_connected(pPlayer) || !IsShowMenu(pPlayer,g_iMenuClown))
	{
		remove_task(pPlayer);
		return;
	}

	new Float:vOrigin[3]
	new Float:vPoint[3], iPoint[3];
	new PointID = -1;

	entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);

	while((PointID = SP_GetPointInSphere(PointID, vOrigin, SP_MAX_SHOW_DIST)) != -1)
	{
		SP_GetPointOrigin(PointID, vPoint);
		FVecIVec(vPoint, iPoint);

		message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, pPlayer);
		write_byte(TE_BEAMPOINTS);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]-36);
		write_coord(iPoint[0]);
		write_coord(iPoint[1]);
		write_coord(iPoint[2]+36);
		write_short(g_sModelIndexBeam);
		write_byte(1);               
        	write_byte(1);                 
        	write_byte(5);           
        	write_byte(10);     
        	write_byte(2);     
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(255);           
        	write_byte(200);           
        	write_byte(0);               
        	message_end();
	}
}
public bool:IsShowMenu(pPlayer, iMenu)
{
	new iMenuOLD, iMenuNEW;
	player_menu_info(pPlayer, iMenuOLD, iMenuNEW);
	if(iMenuOLD == iMenu || iMenuNEW == iMenu)
		return true;
	return false;
}
public MenuHandler_Pierrot(pPlayer, iMenuID, iItem)
{
	if(iItem > -1)
		menu_display(pPlayer, iMenuID);

	if(iItem == MENU_EXIT)
		remove_task(pPlayer);

	switch(iItem)
	{
		case 0:
		{
			new Float:vOrigin[3]; UTIL_GetAimOriginSpawn(pPlayer, vOrigin);

			if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_DONT_VACPOINT");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}

			new PointID = SP_GetPointInSphere(-1, vOrigin, SP_MIN_DIST);
			if(PointID == -1)
			{
				SP_AddPoint(vOrigin);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_CREATED");
			}
			else
			{
				SP_SubPoint(PointID);
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_DELETED");
			}
		}
		case 1:
		{
			if(SP_SavePoints())
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT");
			else
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT_FAIL");
		}
		case 2:
		{
			if(g_bBonusRound || g_iBonusRoundStatus || g_bNextRoundIsBonus || !SP_GetPointsNum())
			{
				client_print_color(pPlayer, DontChange, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_02");
				UTIL_PlaySound(pPlayer, "buttons/button10.wav");
				return;
			}
			
			BonusRound_NextRound();
		}
	}

	UTIL_PlaySound(pPlayer, "common/wpn_denyselect.wav");
}
public Snowman_Spawn(const Float:vOrigin[3])
{
	static pEntity;
	if(!(pEntity = create_entity(SNOWMAN_ENTITY)))
		return 0

	entity_set_string(pEntity, EV_SZ_classname, SNOWMAN_CLASSNAME);
	entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
	entity_set_int(pEntity, EV_INT_solid, SOLID_BBOX);
	entity_set_int(pEntity, EV_INT_deadflag, DEAD_NO);
	entity_set_int(pEntity, EV_INT_flags, FL_MONSTER);
	entity_set_int(pEntity, EV_INT_skin, SNOWMAN_SKIN);

	if(!entity_get_int(pEntity, EV_INT_skin))
		entity_set_int(pEntity, EV_INT_body,  SNOWMAN_BODY);
		
	entity_set_float(pEntity, EV_FL_health, SNOWMAN_HEALTH);
	entity_set_float(pEntity, EV_FL_gravity, 1.0);
	entity_set_float(pEntity, EV_FL_framerate, 1.0);
	entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_AIM);
	entity_set_vector(pEntity, EV_VEC_view_ofs, Float:{0.0, 0.0, 10.0});
	entity_set_model(pEntity, SNOWMAN_MODEL);
	entity_set_size(pEntity, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 18.0});
	entity_set_origin(pEntity, vOrigin);
	Snowman_SetActivity(pEntity, ACT_JUMP);
	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
	g_iClownSpawned++;
	return pEntity;
}
public Snowman_Think(const pEntity)
{
	static iActivity; iActivity = entity_get_int(pEntity, EV_INT_iuser1);
	static Float:fGameTime; fGameTime = get_gametime();
	static pTarget; pTarget = entity_get_edict(pEntity, EV_ENT_enemy);
	static Float:fDelay; fDelay = 0.1;
	static Float:vTarget[3];

	if(iActivity == ACT_IDLE || iActivity == ACT_MOVE)
	{
		if(pTarget)
		{
			if(!Snowman_IsValidPlayer(pEntity, pTarget))
			{
				Snowman_SetNextFindPlayer(pEntity, 1.0);
				Snowman_SetNextCheckMove(pEntity, 1.0);
				pTarget = 0;
			}

			if(pTarget)
			{
				entity_get_vector(pTarget, EV_VEC_origin, vTarget);
				Snowman_SetMovePoint(pEntity, vTarget);
				Snowman_SetNextCheckMove(pEntity, 1.0);

				if(Snowman_IsMoveComplete(pEntity) || 
				entity_get_edict(pEntity, EV_ENT_groundentity) == pTarget
				)
					iActivity = ACT_IDLE;
				else
					iActivity = ACT_MOVE;
			}
			else
			{
				iActivity = ACT_IDLE;
			}
		}
		else
		{
			if((Snowman_GetNextCheckMove(pEntity) > fGameTime) && !Snowman_IsMoveComplete(pEntity))
				iActivity = ACT_MOVE;
			else
				iActivity = ACT_IDLE;
		}
	}

	if(entity_get_edict(pEntity, EV_ENT_enemy) == 0)
		pTarget = 0;

	if(Snowman_GetNextFindPlayer(pEntity) < fGameTime)
	{
		pTarget = Snowman_FindTarget(pEntity);
		Snowman_SetNextFindPlayer(pEntity, pTarget ? 5.0 : 1.0);
	}

	entity_set_edict(pEntity, EV_ENT_enemy, pTarget);

	switch(iActivity)
	{
		case ACT_DUMMY:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);
		}
		case ACT_IDLE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
			{
				 UTIL_PlayAnimation(pEntity, ANIM_IDLE);

				 if(Snowman_GetNextSoundIdle(pEntity) - fGameTime > 1.0)
				 	Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextSoundIdle(pEntity) < fGameTime)
			{
				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
			}

			if(Snowman_GetNextCheckMove(pEntity) <= fGameTime)
			{
				new iPointNum = Snowman_GetRandomDir(pEntity, vTarget);

				if(iPointNum)
				{
					Snowman_SetMovePoint(pEntity, vTarget);
					Snowman_SetNextCheckMove(pEntity, random_float(2.0, 4.0));
					iActivity = ACT_MOVE;
				}
				else
					Snowman_SetNextCheckMove(pEntity, 2.0);
			}
		}
		case ACT_MOVE:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_WALK)
				 UTIL_PlayAnimation(pEntity, ANIM_WALK);

			static MoveFlags; Snowman_MoveToOrigin(pEntity, SNOWMAN_SPEED, MoveFlags);

			if(MoveFlags & (1<<1))
				iActivity = ACT_IDLE;

			//Is snowman in air ?
			if(~entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				static Float:fFlyTime; fFlyTime = entity_get_float(pEntity, EV_FL_fuser1);
				if(fFlyTime == 0.0 || MoveFlags & (1<<0))
					fFlyTime = fGameTime;
				else if(fGameTime - fFlyTime > 0.15)
					iActivity = ACT_JUMP;
				entity_set_float(pEntity, EV_FL_fuser1, fFlyTime);
			}
			else
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
		}
		case ACT_JUMP:
		{
			if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_JUMP)
				 UTIL_PlayAnimation(pEntity, ANIM_JUMP);

			if(entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
			{
				entity_set_float(pEntity, EV_FL_fuser1, 0.0);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_PUSHSTEP);
				iActivity = ACT_IDLE;
			}	
		}
		case ACT_DIE:
		{
			if(entity_get_int(pEntity, EV_INT_deadflag) == DEAD_DEAD)
				entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
			else
			{
				new pAttacker = entity_get_edict(pEntity, EV_ENT_dmg_inflictor);
				if(is_user_connected(pAttacker))
					Snowman_Reward(pEntity, pAttacker);

				emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
				UTIL_PlayAnimation(pEntity, ANIM_DEATH);
				entity_set_int(pEntity, EV_INT_solid, SOLID_NOT);
				entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
				entity_set_int(pEntity, EV_INT_deadflag, DEAD_DEAD);
				entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_NO);
				fDelay = 4.0
				g_iClownSpawned--;
			}
		}
		case ACT_FLINCH:
		{
			emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			UTIL_PlayAnimation(pEntity, random_num(ANIM_FLINCH, ANIM_FLINCH2));
			fDelay = 0.15
			iActivity = ACT_IDLE
		}
	}

	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, fGameTime + fDelay);
}
public Snowman_SetActivity(const pEntity, const iActivity)
{
	entity_set_int(pEntity, EV_INT_iuser1, iActivity);
	entity_set_float(pEntity, EV_FL_nextthink, get_gametime());
}
public Snowman_FindTarget(const pEntity)
{
	static pTarget; pTarget = 0;
	static Float:fMin; fMin = 8192.0;
	static Float:fCur;

	static PlayersID[32], iPlayersNum;
	get_players(PlayersID, iPlayersNum, "ah");
	static i, pPlayer;
	for(i = 0; i < iPlayersNum; i++)
	{
		pPlayer = PlayersID[i];

		if(!ENG_is_visible(pEntity, pPlayer))
			continue;

		fCur = entity_range(pEntity, pPlayer);

		if(fCur < fMin)
		{
			fMin = fCur;
			pTarget = pPlayer;
		}
	}

	return pTarget;
}
public Snowman_GetRandomDir(const pEntity, Float:vTarget[3])
{
	static Float:vAngles[3]; entity_get_vector(pEntity, EV_VEC_angles, vAngles);
	static Float:vOrigin[3]; entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	static Float:vEnd[3];

	static Float:vForward[3];
	static Float:vPoint[16][3], iPointNum; iPointNum = 0;
	static Float:vAngles2[3]; vAngles2[1] = vAngles[1];
	static Float:vEndPos[3];
	static Float:fCur;

	static i;
	for(i = 0; i < 16; i++)
	{
		angle_vector(vAngles2, ANGLEVECTOR_FORWARD, vForward);
		vEnd[0] = vOrigin[0] + vForward[0] * 1024.0;
		vEnd[1] = vOrigin[1] + vForward[1] * 1024.0;
		vEnd[2] = vOrigin[2] + vForward[2] * 1024.0;
		
		
		ENG_trace_line(pEntity, vOrigin, vEnd, vEndPos);

		fCur = get_distance_f(vOrigin, vEndPos);
		vAngles2[1] += 20.0

		if(fCur < 64.0)
			continue;

		xs_vec_copy(vEndPos, vPoint[iPointNum]);
		iPointNum++;
	}

	if(iPointNum)
		xs_vec_copy(vPoint[random(iPointNum)], vTarget);

	return iPointNum;
}
public Float:Snowman_GetNextCheckMove(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser2);
}
public Snowman_SetNextCheckMove(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser2, get_gametime() + fDelay);
}
public Float:Snowman_GetNextFindPlayer(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser3);
}
public Snowman_SetNextFindPlayer(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser3, get_gametime() + fDelay);
}
public Snowman_SetMovePoint(const pEntity, const Float:vPoint[3])
{
	entity_set_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Snowman_GetMovePoint(const pEntity, Float:vPoint[3])
{
	entity_get_vector(pEntity, EV_VEC_vuser1, vPoint);
}
public Float:Snowman_GetNextSoundIdle(const pEntity)
{
	return entity_get_float(pEntity, EV_FL_fuser4);
}
public Float:Snowman_SetNextSoundIdle(const pEntity, const Float:fDelay)
{
	entity_set_float(pEntity, EV_FL_fuser4, get_gametime() + fDelay);
}

public bool:Snowman_IsMoveComplete(const pEntity)
{
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vEnd[3]; Snowman_GetMovePoint(pEntity, vEnd);

	if(get_distance_f(vSrc, vEnd) < 64.0)
		return true;

	vEnd[2] = vSrc[2];
	static Float:vDir[3]; xs_vec_sub(vEnd, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	vEnd[0] = vSrc[0] + vForward[0] * 26.0;
	vEnd[1] = vSrc[1] + vForward[1] * 26.0;
	vEnd[2] = vSrc[2] + vForward[2] * 26.0;
	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
		{
			if(entity_get_edict(pEntity, EV_ENT_enemy))
			{
				entity_set_edict(pEntity, EV_ENT_enemy, 0);
				Snowman_SetNextFindPlayer(pEntity, 0.5);
				Snowman_SetNextCheckMove(pEntity, 0.1);
			}
			return true;
		}
	}
	return false;
}
public bool:Snowman_IsValidPlayer(const pEntity, const pPlayer)
{
	if(!is_user_alive(pPlayer))
		return false;
	if(!ENG_is_visible(pEntity, pPlayer))
		return false;
	return true;
}

public CBaseEntity_Killed(const pEntity, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	Snowman_SetActivity(pEntity, ACT_DIE);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TakeDamage(const pEntity, const pInflictor, const pAttacker)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return;
	entity_set_edict(pEntity, EV_ENT_dmg_inflictor, pAttacker);
	Snowman_SetActivity(pEntity, ACT_FLINCH);
}
public CBaseEntity_BloodColor(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(12);
	return HAM_SUPERCEDE;
}
public CBaseEntity_TraceBleed(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	return HAM_SUPERCEDE;
}
public CBaseEntity_Classify(const pEntity)
{
	static szClassName[sizeof SNOWMAN_CLASSNAME];
	entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
	if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
	SetHamReturnInteger(4);
	return HAM_SUPERCEDE;
}

public Snowman_MoveToOrigin(const pEntity, const Float:fSpeed, Flags)
{
	Flags = 0;

	static Float:vOrigin[3]; Snowman_GetMovePoint(pEntity, vOrigin);
	static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
	static Float:vDir[3]; xs_vec_sub(vOrigin, vSrc, vDir);
	static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
	static Float:vVel[3]; xs_vec_normalize(vDir, vDir);
	xs_vec_mul_scalar(vDir, fSpeed, vVel);
	vAngles[0] = vAngles[2] = 0.0;
	vVel[2] = -100.0;

	static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
	static Float:vEnd[3]; 
	vEnd[0] = vSrc[0] + vForward[0] * 20.0;
	vEnd[1] = vSrc[1] + vForward[1] * 20.0;
	vEnd[2] = vSrc[2] + vForward[2] * 20.0;

	if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
	{
		vEnd[2] += 36.0;
		if(!ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
		{
			vVel[2] = 200.0;
			Flags |= (1<<0);
		}
	}

	entity_set_vector(pEntity, EV_VEC_angles, vAngles);
	entity_set_vector(pEntity, EV_VEC_velocity, vVel);

	if(Snowman_IsMoveComplete(pEntity) && !(Flags & (1<<0)))
		Flags |= (1<<1);
}

stock UTIL_PlayAnimation(const pEntity, const iAnim)
{
	entity_set_int(pEntity, EV_INT_sequence, iAnim);
	entity_set_float(pEntity, EV_FL_animtime, get_gametime());
	entity_set_float(pEntity, EV_FL_frame, 0.0);
	return iAnim;
}
stock bool:UTIL_IsHullVacant(Float:vOrigin[3], const HullType)
{
	if(!ENG_trace_hull(vOrigin, vOrigin, HullType))
		return true;
	return false;
}
stock UTIL_GetAimOrigin(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);
}
stock UTIL_GetAimOriginSpawn(const pPlayer, Float:vPoint[3])
{
	new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
	new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
	new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
	new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
	new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
	new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
	xs_vec_add(vSrc, vEnd, vEnd);
	ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);

	new Float:vNormal[3]; get_tr2(g_iTrace, TR_vecPlaneNormal, vNormal);
	if(vNormal[0] != 0.0) vPoint[0] += vNormal[0] * 20.0;
	if(vNormal[1] != 0.0) vPoint[1] += vNormal[1] * 20.0;
	if(vNormal[2] != 0.0) vPoint[2] += vNormal[2] * 36.0;
}

stock SP_AddPoint(const Float:vPoint[3])
{
	ArrayPushCell(g_aClownSpawnX, Float:vPoint[0]);
	ArrayPushCell(g_aClownSpawnY, Float:vPoint[1]);
	ArrayPushCell(g_aClownSpawnZ, Float:vPoint[2]);

	return SP_GetPointsNum();
}
stock bool:SP_SubPoint(const PointID)
{
	if(PointID < 0 || PointID > ArraySize(g_aClownSpawnX))
		return false;

	ArrayDeleteItem(g_aClownSpawnX, PointID);
	ArrayDeleteItem(g_aClownSpawnY, PointID);
	ArrayDeleteItem(g_aClownSpawnZ, PointID);
	return true;
}
stock bool:SP_IsValidOrigin(const Float:vOrigin[3])
{
	if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
		return false;

	if(!SP_IsValidMinDist(vOrigin))
		return false;

	return true;
}
stock bool:SP_IsValidMinDist(const Float:vOrigin[3], const Float:fMinDist = 64.0)
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fMinDist)
			return false;
	}
	return true;
}
stock SP_GetPointInSphere(StartPoint, const Float:vOrigin[3], const Float:fRadius = 64.0)
{
	new iPointsNum = SP_GetPointsNum();
	new PointID;

	if(!iPointsNum || StartPoint > iPointsNum)
		return -1;

	if(StartPoint < 0)
		StartPoint = 0;
	else
		StartPoint++;

	new Float:vPoint[3];
	for(PointID = StartPoint; PointID < iPointsNum; PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(get_distance_f(vOrigin, vPoint) <= fRadius)
			return PointID;
	}

	return -1;
}
stock SP_GetPointOrigin(const PointID, Float:vOrigin[3])
{
	vOrigin[0] = Float:ArrayGetCell(g_aClownSpawnX, PointID);
	vOrigin[1] = Float:ArrayGetCell(g_aClownSpawnY, PointID);
	vOrigin[2] = Float:ArrayGetCell(g_aClownSpawnZ, PointID);
}
stock SP_GetEmptyPointID()
{
	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			return PointID;
	}
	return -1;
}
stock SP_GetRandomEmptyPointID()
{
	ArrayClear(g_aSpawns);

	static Float:vPoint[3];
	for(new PointID; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);
		if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
			ArrayPushCell(g_aSpawns, PointID);
	}

	if(!ArraySize(g_aSpawns))
		return -1;

	return ArrayGetCell(g_aSpawns, random(ArraySize(g_aSpawns)));
}
stock SP_GetPointsNum()
{
	return ArraySize(g_aClownSpawnX);
}
stock bool:SP_SavePoints()
{	
	if(!SP_GetPointsNum())
		return false;

	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));

	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s",
		szCfgDir,
		SP_DIR
	);

	if(!dir_exists(szFileDir))
		mkdir(szFileDir);

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(file_exists(szFileDir))
		delete_file(szFileDir);

	new Float:vPoint[3];
	new szBuffer[64];
	for(new PointID = 0; PointID < SP_GetPointsNum(); PointID++)
	{
		SP_GetPointOrigin(PointID, vPoint);

		formatex(szBuffer, charsmax(szBuffer), 
			"^"%.1f^" ^"%.1f^" ^"%.1f^"", 
			vPoint[0], vPoint[1], vPoint[2]
		);

		write_file(szFileDir, szBuffer);
	}

	return true;
}
stock SP_LoadPoints()
{
	new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
	new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));
	new szFileDir[96]; 

	formatex(szFileDir, charsmax(szFileDir), 
		"%s/%s/%s.spawns.cfg", 
		szCfgDir, SP_DIR, szMapName
	);

	if(!file_exists(szFileDir))
		return 0;

	new iFile = fopen(szFileDir, "rt");

	if(!iFile)
		return 0;

	new szBuffer[64];
	new Float:vPoint[3];
	new szPoint[3][7];
	while(iFile && !feof(iFile))
	{
		fgets(iFile, szBuffer, charsmax(szBuffer));
		if(!szBuffer[0] || szBuffer[0] == ';') 
			continue;

		parse(szBuffer, szPoint[0], 6, szPoint[1], 6, szPoint[2], 6);

		vPoint[0] = str_to_float(szPoint[0]);	
		vPoint[1] = str_to_float(szPoint[1]);	
		vPoint[2] = str_to_float(szPoint[2]);	

		SP_AddPoint(vPoint);
	}
	fclose(iFile);
	return SP_GetPointsNum();
}
stock ENG_trace_line(pEntity, Float:vSrc[3], Float:vEnd[3], Float:vEndPos[3])
{
	engfunc(EngFunc_TraceLine, vSrc, vEnd, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	get_tr2(g_iTrace, TR_vecEndPos, vEndPos);
}
stock bool:ENG_trace_hull(Float:vSrc[3], Float:vEnd[3], iHullType, pEntity = 0, Flags = 0)
{
	engfunc(EngFunc_TraceHull, vSrc, vEnd, Flags, iHullType, pEntity, g_iTrace);
	
	if(get_tr2(g_iTrace, TR_StartSolid) || get_tr2(g_iTrace, TR_AllSolid) || !get_tr2(g_iTrace, TR_InOpen))
		return true;
	return false;
}
stock bool:ENG_is_visible(pEntity, pEntity2)
{
	static Float:vOrigin[3];
	static Float:vLooker[3];
	static Float:vTarget[3];
	entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity, EV_VEC_view_ofs, vLooker);
	xs_vec_add(vLooker, vOrigin, vLooker);
	entity_get_vector(pEntity2, EV_VEC_origin, vOrigin);
	entity_get_vector(pEntity2, EV_VEC_view_ofs, vTarget);
	xs_vec_add(vTarget, vOrigin, vTarget);
	static Solid; Solid = entity_get_int(pEntity2, EV_INT_solid);
	entity_set_int(pEntity2, EV_INT_solid, SOLID_NOT);
	engfunc(EngFunc_TraceLine, vLooker, vTarget, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
	entity_set_int(pEntity2, EV_INT_solid, Solid);
	if(get_tr2(g_iTrace, TR_InOpen) && get_tr2(g_iTrace, TR_InWater))
		return false;
	static Float:fFraction; get_tr2(g_iTrace, TR_flFraction, fFraction);
	if(fFraction == 1.0)
		return true;
	return false;
}
stock UTIL_PlaySound(iIndex = 0, szSound[], bool:bLoop = false) 
{
	new szTemp[128]; copyc(szTemp, charsmax(szTemp), szSound, '.');
	if(contain(szSound, ".mp3") != -1) 
		client_cmd(iIndex, "mp3 %s ^"sound/%s^"", bLoop ? "loop" : "play", szTemp);
	else 
		client_cmd(iIndex, "spk ^"%s^"", szTemp);
}
stock UTIL_StopSound(iIndex = 0) 
{
	client_cmd(iIndex, "stopsound;mp3 stop");
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#5

Post by czirimbolo » 4 years ago

// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\colorchat.inc(24) : error 021: symbol already defined: "TeamName"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(2) : error 021: symbol already defined: "amx_load_setting_string_arr"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(3) : error 021: symbol already defined: "amx_save_setting_string_arr"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(4) : error 021: symbol already defined: "amx_load_setting_int_arr"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(5) : error 021: symbol already defined: "amx_save_setting_int_arr"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(6) : error 021: symbol already defined: "amx_load_setting_float_arr"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(7) : error 021: symbol already defined: "amx_save_setting_float_arr"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(8) : error 021: symbol already defined: "amx_load_setting_string"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(9) : error 021: symbol already defined: "amx_save_setting_string"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(10) : error 021: symbol already defined: "amx_load_setting_int"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(11) : error 021: symbol already defined: "amx_save_setting_int"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(12) : error 021: symbol already defined: "amx_load_setting_float"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\amx_settings_api.inc(13) : error 021: symbol already defined: "amx_save_setting_float"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cs_weap_models_api.inc(10) : error 021: symbol already defined: "cs_set_player_view_model"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cs_weap_models_api.inc(18) : error 021: symbol already defined: "cs_reset_player_view_model"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cs_weap_models_api.inc(29) : error 021: symbol already defined: "cs_set_player_weap_model"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\cs_weap_models_api.inc(37) : error 021: symbol already defined: "cs_reset_player_weap_model"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(5) : error 021: symbol already defined: "ze_colored_print"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(84) : error 021: symbol already defined: "GetAlivePlayersNum"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(99) : error 021: symbol already defined: "GetTeamPlayersNum"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(114) : error 021: symbol already defined: "GetDeadPlayersNum"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(129) : error 021: symbol already defined: "GetAllAlivePlayersNum"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(141) : error 021: symbol already defined: "GetAllPlayersNum"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(153) : error 021: symbol already defined: "RequiredZombies"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(166) : error 021: symbol already defined: "GetRandomAlive"
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\include\zombie_escape_stocks.inc(182) : error 021: symbol already defined: "Set_MapLightStyle"
//
// Compilation aborted.
// 26 Errors.
// Could not locate output file compiled\balwany.amx (compile failed).
//
// Compilation Time: 2,14 sec
Image

Muhammet20
Veteran Member
Veteran Member
Posts: 408
Joined: 5 years ago
Contact:

#6

Post by Muhammet20 » 4 years ago

@Raheem

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#7

Post by czirimbolo » 4 years ago

nobody can make it
Image

User avatar
Raheem
Mod Developer
Mod Developer
Posts: 2214
Joined: 7 years ago
Contact:

#8

Post by Raheem » 3 years ago

Here it's compiling, but there is something not found in our mod it's zp_gamemode_delay, so I don't know how it will work. I don't know also what is this or what it do:
    1. //obslugiwane mody
    2. enum _: eSupportMods
    3. {
    4.     SUPPORT_CLASSIC,    //[Money]
    5.     SUPPORT_ZP43,       //[AmmoPacks]
    6.     SUPPORT_ZP50,       //[AmmoPacks]
    7.     SUPPORT_BIOHAZARD   //[Money]
    8. }
    9.  
    10. #define SUPPORT_MOD     SUPPORT_ZP50
    11.  
    12. #if SUPPORT_MOD == SUPPORT_ZP50
    13.     #include <zombie_escape>
    14. #endif
    15.  
    16. #include <engine>
    17. #include <xs>
    18.  
    19. #define GET_MONEY(%0)       zp_cs_get_user_money(%0)
    20. #define SET_MONEY(%0,%1)    zp_cs_set_user_money(%0,%1)
    21. #define GET_EXP(%0)         ze_get_user_xp(%0)
    22. #define SET_EXP(%0,%1)      ze_set_user_xp(%0,%1)
    23.  
    24. /*
    25. [0.9.5]
    26. - Исправленна поддержка режимов
    27. - Добавлена поддержка BuyMenu, Level System
    28. */
    29.  
    30. #define PLUGIN_NAME             "[ZDT] Bonus round: Pierrot"
    31. #define PLUGIN_VERSION          "0.9.5"
    32. #define PLUGIN_AUTHOR           "Doc.Batcon"
    33. #define PLUGIN_PREFIX           "^4[BR]^1"
    34. #define PLUGIN_DICTIONARY       "npc_bonusmon_092.txt"
    35.  
    36. new const SNOWMAN_ENTITY[]      = "monster_hevsuit_dead"
    37. new const SNOWMAN_CLASSNAME[]   = "npc_snowman"
    38. new const SNOWMAN_MODEL[]       = "models/zdt/monsters/npc_snowman.mdl"
    39. #define SNOWMAN_HEALTH          100.0
    40. #define SNOWMAN_SPEED           200.0
    41. #define SNOWMAN_BODY            random_num(0, 1)
    42. #define SNOWMAN_SKIN            random_num(0, 5)
    43.  
    44. new const SNOWMAN_SOUNDS[][] =
    45. {
    46.     "zdt/snow_idle.wav",
    47.     "zdt/snow_die.wav",
    48.     "zdt/snow_pain.wav"
    49. }
    50.  
    51. enum _: eSnowmanAnim
    52. {
    53.     ANIM_DUMMY,
    54.     ANIM_IDLE,
    55.     ANIM_WALK,
    56.     ANIM_RUN,
    57.     ANIM_JUMP,
    58.     ANIM_FLINCH,
    59.     ANIM_FLINCH2,
    60.     ANIM_DEATH
    61. }
    62. enum _: eSnowmanAct
    63. {
    64.     ACT_DUMMY,
    65.     ACT_IDLE,
    66.     ACT_MOVE,
    67.     ACT_JUMP,
    68.     ACT_FLINCH,
    69.     ACT_DIE
    70. }
    71.  
    72. #define HUD_EVENT_X         -1.0
    73. #define HUD_EVENT_Y         0.17
    74.  
    75. #define BR_TASKID           111
    76. #define SP_DIR              "npc_snowman"
    77.  
    78. //НАСТРОЙКИ
    79.  
    80. //nagroda za zabicie balwana
    81. #define GIVE_REWARD     100
    82. //ilosc expa za balwana
    83. #define GIVE_EXP        1000
    84.  
    85. //muzyka podczas rundy balwanow     [mozna komentowac aby wylaczyc]
    86. #define BR_MUSIC            "zdt/scenario_xmas.mp3"
    87. //czas trwania trybu 1.0 = 1 minuta [mozna komentowac aby wylaczyc]
    88. #define BR_ROUNDTIME        3.0
    89. //szansa na uruchomienie
    90. #define BR_CHANGE           5
    91. //Maksymalna liczba bałwanów utworzonych na cykl
    92. #define BR_CLOWN_SPAWN      10
    93. //Maksymalna liczba żywych bałwanów
    94. //(zalecane 40-60)
    95. #define BR_CLOWN_MAX        50
    96. //Blokowanie obrażeń między graczami w trybie [Mozesz komentowac]
    97. //(dla SUPPORT_CLASSIC)
    98. #define BR_BLOCK_DAMAGE     true
    99. //Minimalna odległość między spawnem
    100. #define SP_MIN_DIST     64.0
    101. //Odrodzenie wyświetlania maksymalnego zakresu w menu
    102. #define SP_MAX_SHOW_DIST    512.0
    103. //Wlaczyc obsługę menu Kup? [Możesz komentować]
    104. //#define ENABLED_SUPPORT_BUYMENU
    105. //Włączyć obsługę poziomu systemu? [Możesz komentować]
    106. //#define ENABLED_SUPPORT_LEVELSYSTEM
    107.  
    108. new g_iMenuClown;
    109. new Array:g_aClownSpawnX, Array:g_aClownSpawnY, Array:g_aClownSpawnZ, Array:g_aSpawns;
    110. new g_sModelIndexBeam;
    111. new bool:g_bBonusRound, g_iBonusRoundStatus, g_iClownSpawned;
    112. new bool:g_bNextRoundIsBonus;
    113. new bool:g_bChangeBonusRound = true;
    114. new bool:g_bIsFirstRound = true;
    115. new g_iTrace;
    116.  
    117. #if defined BR_ROUNDTIME
    118. new Float:g_fRoundTime;
    119. #endif
    120.  
    121. #if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true && SUPPORT_MOD != SUPPORT_CLASSIC
    122.     #undef BR_BLOCK_DAMAGE
    123.     #define BR_BLOCK_DAMAGE false
    124. #endif
    125.  
    126. #if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
    127. new HamHook:g_HamHookTraceAttack;
    128. new HamHook:g_HamHookTakeDamage;
    129. #endif
    130.  
    131. #if SUPPORT_MOD == SUPPORT_CLASSIC
    132.     #include <cstrike>
    133. #endif
    134. #if SUPPORT_MOD == SUPPORT_ZP43
    135.     #include <zombie_escape>
    136. #endif
    137. #if SUPPORT_MOD == SUPPORT_BIOHAZARD
    138.     #include <cstrike>
    139.     #include <biohazard>
    140. #endif
    141. #if defined ENABLED_SUPPORT_BUYMENU
    142.     native GET_MONEY(pPlayer)
    143.     native SET_MONEY(pPlayer, iValue)
    144. #endif
    145. #if defined ENABLED_SUPPORT_LEVELSYSTEM
    146.     native GET_EXP(pPlayer)
    147.     native SET_EXP(pPlayer, iValue)
    148. #endif
    149.  
    150. #if SUPPORT_MOD == SUPPORT_ZP43 || SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
    151. new g_CvarID_GameModeDelay;
    152. new Float:g_fRoundDelay;
    153. #endif
    154.  
    155. public plugin_init()
    156. {
    157.     register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
    158.     register_think(SNOWMAN_CLASSNAME, "Snowman_Think");
    159.     RegisterHam(Ham_Killed, SNOWMAN_ENTITY, "CBaseEntity_Killed", false);
    160.     RegisterHam(Ham_TakeDamage, SNOWMAN_ENTITY, "CBaseEntity_TakeDamage", false);
    161.     RegisterHam(Ham_BloodColor, SNOWMAN_ENTITY, "CBaseEntity_BloodColor", false);
    162.     RegisterHam(Ham_TraceBleed, SNOWMAN_ENTITY, "CBaseEntity_TraceBleed", false);
    163.     RegisterHam(Ham_Classify, SNOWMAN_ENTITY, "CBaseEntity_Classify", false);
    164.  
    165.     #if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
    166.         g_HamHookTraceAttack = RegisterHam(Ham_TraceAttack, "player", "CBasePlayer_TraceAttack", false);
    167.         g_HamHookTakeDamage = RegisterHam(Ham_TakeDamage, "player", "CBasePlayer_TakeDamage", false);
    168.         DisableHamForward(g_HamHookTraceAttack);
    169.         DisableHamForward(g_HamHookTakeDamage);
    170.     #endif
    171.  
    172.     register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
    173.     register_logevent("Event_RoundStarted", 2, "1=Round_Start");
    174.     register_logevent("Event_RoundEnd", 2, "1=Round_End");
    175.     register_logevent("Event_RoundRestart", 2, "1=Game_Commencing");
    176.     register_event("TextMsg", "Event_RoundRestart", "a", "2=#Game_will_restart_in");
    177.    
    178.     register_dictionary(PLUGIN_DICTIONARY);
    179.  
    180.     register_clcmd("say bonusround", "ClientCmd_ShowMenu");
    181. }
    182. public plugin_precache()
    183. {
    184.     precache_model(SNOWMAN_MODEL);
    185.     g_sModelIndexBeam = precache_model("sprites/laserbeam.spr");
    186.  
    187.     for(new i; i < sizeof SNOWMAN_SOUNDS; i++)
    188.         precache_sound(SNOWMAN_SOUNDS[i]);
    189.  
    190.     #if defined BR_MUSIC
    191.         new buffer[64]; formatex(buffer, charsmax(buffer), "sound/%s", BR_MUSIC);
    192.         precache_generic(buffer);
    193.     #endif
    194.  
    195.     g_aSpawns = ArrayCreate(1, 1);
    196.     g_aClownSpawnX = ArrayCreate(1, 1);
    197.     g_aClownSpawnY = ArrayCreate(1, 1);
    198.     g_aClownSpawnZ = ArrayCreate(1, 1);
    199.  
    200.     g_iTrace = create_tr2();
    201.  
    202.     g_iMenuClown = menu_create("MENU_TITLE", "MenuHandler_Pierrot");
    203.     menu_additem(g_iMenuClown, "MENU_ITEM_01");
    204.     menu_additem(g_iMenuClown, "MENU_ITEM_02");
    205.     menu_additem(g_iMenuClown, "MENU_ITEM_03");
    206. }
    207. public plugin_cfg()
    208. {
    209.     SP_LoadPoints();
    210.  
    211.     #if SUPPORT_MOD == SUPPORT_ZP43
    212.         g_CvarID_GameModeDelay = get_cvar_pointer("zp_delay");
    213.     #endif
    214.     #if SUPPORT_MOD == SUPPORT_ZP50
    215.         // g_CvarID_GameModeDelay = get_cvar_pointer("ze_gamemode_delay");
    216.     #endif
    217.     #if SUPPORT_MOD == SUPPORT_BIOHAZARD
    218.         g_CvarID_GameModeDelay = get_cvar_pointer("bh_starttime");
    219.     #endif
    220. }
    221. public Snowman_Reward(const pEntity, const pPlayer)
    222. {
    223.     #if SUPPORT_MOD == SUPPORT_CLASSIC && !defined ENABLED_SUPPORT_BUYMENU
    224.         cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
    225.     #endif
    226.     #if SUPPORT_MOD == SUPPORT_ZP43 && !defined ENABLED_SUPPORT_BUYMENU
    227.         ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
    228.     #endif
    229.     #if SUPPORT_MOD == SUPPORT_ZP50 && !defined ENABLED_SUPPORT_BUYMENU
    230.         ze_set_escape_coins(pPlayer, ze_get_escape_coins(pPlayer) + GIVE_REWARD);
    231.     #endif
    232.     #if SUPPORT_MOD == SUPPORT_BIOHAZARD && !defined ENABLED_SUPPORT_BUYMENU
    233.         cs_set_user_money(pPlayer, cs_get_user_money(pPlayer) + GIVE_REWARD);
    234.     #endif
    235.     #if defined ENABLED_SUPPORT_BUYMENU
    236.         SET_MONEY(pPlayer, GET_MONEY(pPlayer) + GIVE_REWARD);
    237.     #endif 
    238.     #if defined ENABLED_SUPPORT_LEVELSYSTEM
    239.         SET_EXP(pPlayer, GET_EXP(pPlayer) + GIVE_EXP);
    240.     #endif 
    241. }
    242. #if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
    243. public CBasePlayer_TraceAttack(pPlayer, pAttacker)
    244. {
    245.     if(!is_user_connected(pAttacker))
    246.         return HAM_IGNORED;
    247.     return HAM_SUPERCEDE;
    248. }
    249. public CBasePlayer_TakeDamage(pPlayer, pInflictor, pAttacker)
    250. {
    251.     if(!is_user_connected(pAttacker))
    252.         return HAM_IGNORED;
    253.     return HAM_SUPERCEDE;
    254. }
    255. #endif
    256. public BonusRound_Start()
    257. {
    258.     set_dhudmessage(0, 120, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0);
    259.     show_dhudmessage(0, "%L", LANG_PLAYER, "NOTICE_HUD_PREPARE");
    260.  
    261.     #if defined BR_MUSIC
    262.         UTIL_StopSound();
    263.         UTIL_PlaySound(0, BR_MUSIC, true);
    264.     #endif
    265.  
    266.     #if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
    267.         EnableHamForward(g_HamHookTraceAttack);
    268.         EnableHamForward(g_HamHookTakeDamage);
    269.     #endif 
    270.  
    271.     set_task(1.0, "Task_GL_BonusRound", BR_TASKID, _, _, "b");
    272.     g_iBonusRoundStatus = 1;
    273.     g_bBonusRound = true;
    274.     g_bNextRoundIsBonus = false;
    275. }
    276. public BonusRound_End()
    277. {
    278.     #if defined BR_MUSIC
    279.         UTIL_StopSound();
    280.     #endif
    281.  
    282.     #if SUPPORT_MOD == SUPPORT_ZP43
    283.         set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
    284.     #endif
    285.  
    286.     #if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
    287.         // set_pcvar_float(g_CvarID_GameModeDelay, g_fRoundDelay);
    288.     #endif
    289.  
    290.     remove_task(BR_TASKID);
    291.     g_iBonusRoundStatus = 2;
    292.     g_bBonusRound = false;
    293.    
    294.     new pEntity = -1;
    295.     while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
    296.     {
    297.         if(entity_get_int(pEntity, EV_INT_deadflag) != DEAD_NO)
    298.             continue;
    299.  
    300.         entity_set_edict(pEntity, EV_ENT_dmg_inflictor, 0);
    301.         Snowman_SetActivity(pEntity, ACT_DIE);
    302.     }
    303. }
    304. public BonusRound_NextRound()
    305. {
    306.     g_bNextRoundIsBonus = true;
    307.     g_bChangeBonusRound = false;
    308.     client_print_color(0, print_team_default, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_PREPARE");
    309.  
    310.     #if SUPPORT_MOD == SUPPORT_ZP43
    311.         g_fRoundDelay = float(get_pcvar_num(g_CvarID_GameModeDelay));
    312.         set_pcvar_num(g_CvarID_GameModeDelay, 999);
    313.     #endif
    314.  
    315.     #if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
    316.         // g_fRoundDelay = get_pcvar_float(g_CvarID_GameModeDelay);
    317.         // set_pcvar_float(g_CvarID_GameModeDelay, 999.0);
    318.     #endif
    319. }
    320.  
    321. public Event_RoundStart()
    322. {
    323.     #if defined BR_ROUNDTIME
    324.         if(g_bNextRoundIsBonus)
    325.         {
    326.             g_fRoundTime = get_cvar_float("mp_roundtime");
    327.             server_cmd("mp_roundtime %f", BR_ROUNDTIME);
    328.             server_exec();
    329.         }
    330.     #endif
    331.  
    332.     if(!g_iBonusRoundStatus)
    333.         return;
    334.  
    335.     #if defined BR_MUSIC
    336.         UTIL_StopSound();
    337.     #endif
    338.  
    339.     #if defined BR_BLOCK_DAMAGE && BR_BLOCK_DAMAGE == true
    340.         DisableHamForward(g_HamHookTraceAttack);
    341.         DisableHamForward(g_HamHookTakeDamage);
    342.     #endif 
    343.  
    344.     new pEntity = -1;
    345.     while((pEntity = find_ent_by_class(pEntity, SNOWMAN_CLASSNAME)))
    346.         entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
    347.    
    348.     remove_task(BR_TASKID);
    349.     g_iClownSpawned = 0;
    350.     g_iBonusRoundStatus = 0;
    351.     g_bBonusRound = false;
    352. }
    353. public Event_RoundStarted()
    354. {
    355.     if(g_bNextRoundIsBonus)
    356.         BonusRound_Start();
    357. }
    358. public Event_RoundEnd()
    359. {
    360.     if(!g_bIsFirstRound && g_bChangeBonusRound && !random_num(0, BR_CHANGE))
    361.     {
    362.         BonusRound_NextRound();
    363.     }
    364.  
    365.     g_bIsFirstRound = false;
    366.  
    367.     if(g_iBonusRoundStatus != 1)
    368.         return;
    369.  
    370.     BonusRound_End();
    371.  
    372.     #if defined BR_ROUNDTIME
    373.         server_cmd("mp_roundtime %f", g_fRoundTime);
    374.         server_exec();
    375.     #endif
    376. }
    377. public Event_RoundRestart()
    378. {
    379.     g_bNextRoundIsBonus = false;
    380.     g_bChangeBonusRound = true;
    381.     g_bIsFirstRound = true;
    382.  
    383.     if(!g_iBonusRoundStatus)
    384.         return;
    385.  
    386.     #if SUPPORT_MOD == SUPPORT_ZP43
    387.         set_pcvar_num(g_CvarID_GameModeDelay, floatround(g_fRoundDelay));
    388.     #endif
    389.  
    390.     #if SUPPORT_MOD == SUPPORT_ZP50 || SUPPORT_MOD == SUPPORT_BIOHAZARD
    391.         // set_pcvar_float(g_CvarID_GameModeDelay, g_fRoundDelay);
    392.     #endif
    393. }
    394.  
    395. public Task_GL_BonusRound(TaskID)
    396. {
    397.     new PointID, Float:vPoint[3];
    398.     new iMaxSpawns = BR_CLOWN_SPAWN;
    399.     while(iMaxSpawns && (g_iClownSpawned <= BR_CLOWN_MAX) && ((PointID = SP_GetRandomEmptyPointID()) != -1))
    400.     {
    401.         SP_GetPointOrigin(PointID, vPoint);
    402.         Snowman_Spawn(vPoint);
    403.         iMaxSpawns--;
    404.     }
    405. }
    406. public ClientCmd_ShowMenu(pPlayer)
    407. {
    408.     if(get_user_flags(pPlayer) & ADMIN_IMMUNITY)
    409.     {
    410.         new buffer[64];
    411.         formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_MAIN_TITLE");
    412.         menu_setprop(g_iMenuClown, MPROP_TITLE, buffer);
    413.         formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_01");
    414.         menu_item_setname(g_iMenuClown, 0, buffer);
    415.         formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_02");
    416.         menu_item_setname(g_iMenuClown, 1, buffer);
    417.         formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_ITEM_03");
    418.         menu_item_setname(g_iMenuClown, 2, buffer);
    419.         formatex(buffer, charsmax(buffer), "%L", pPlayer, "MENU_EXIT");
    420.         menu_setprop(g_iMenuClown, MPROP_EXITNAME, buffer);
    421.         menu_display(pPlayer, g_iMenuClown);
    422.         set_task(0.1, "Task_Client_ShowPoints", pPlayer, _, _, "b");
    423.         set_pdata_int(pPlayer, 205, 0, 5);
    424.     }
    425.     else
    426.     {
    427.         client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_01");
    428.     }
    429.     return PLUGIN_HANDLED;
    430. }
    431. public Task_Client_ShowPoints(pPlayer)
    432. {
    433.     if(!is_user_connected(pPlayer) || !IsShowMenu(pPlayer,g_iMenuClown))
    434.     {
    435.         remove_task(pPlayer);
    436.         return;
    437.     }
    438.  
    439.     new Float:vOrigin[3]
    440.     new Float:vPoint[3], iPoint[3];
    441.     new PointID = -1;
    442.  
    443.     entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
    444.  
    445.     while((PointID = SP_GetPointInSphere(PointID, vOrigin, SP_MAX_SHOW_DIST)) != -1)
    446.     {
    447.         SP_GetPointOrigin(PointID, vPoint);
    448.         FVecIVec(vPoint, iPoint);
    449.  
    450.         message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, pPlayer);
    451.         write_byte(TE_BEAMPOINTS);
    452.         write_coord(iPoint[0]);
    453.         write_coord(iPoint[1]);
    454.         write_coord(iPoint[2]-36);
    455.         write_coord(iPoint[0]);
    456.         write_coord(iPoint[1]);
    457.         write_coord(iPoint[2]+36);
    458.         write_short(g_sModelIndexBeam);
    459.         write_byte(1);              
    460.             write_byte(1);                
    461.             write_byte(5);          
    462.             write_byte(10);    
    463.             write_byte(2);    
    464.             write_byte(255);          
    465.             write_byte(255);          
    466.             write_byte(255);          
    467.             write_byte(200);          
    468.             write_byte(0);              
    469.             message_end();
    470.     }
    471. }
    472. public bool:IsShowMenu(pPlayer, iMenu)
    473. {
    474.     new iMenuOLD, iMenuNEW;
    475.     player_menu_info(pPlayer, iMenuOLD, iMenuNEW);
    476.     if(iMenuOLD == iMenu || iMenuNEW == iMenu)
    477.         return true;
    478.     return false;
    479. }
    480. public MenuHandler_Pierrot(pPlayer, iMenuID, iItem)
    481. {
    482.     if(iItem > -1)
    483.         menu_display(pPlayer, iMenuID);
    484.  
    485.     if(iItem == MENU_EXIT)
    486.         remove_task(pPlayer);
    487.  
    488.     switch(iItem)
    489.     {
    490.         case 0:
    491.         {
    492.             new Float:vOrigin[3]; UTIL_GetAimOriginSpawn(pPlayer, vOrigin);
    493.  
    494.             if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
    495.             {
    496.                 client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_DONT_VACPOINT");
    497.                 UTIL_PlaySound(pPlayer, "buttons/button10.wav");
    498.                 return;
    499.             }
    500.  
    501.             new PointID = SP_GetPointInSphere(-1, vOrigin, SP_MIN_DIST);
    502.             if(PointID == -1)
    503.             {
    504.                 SP_AddPoint(vOrigin);
    505.                 client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_CREATED");
    506.             }
    507.             else
    508.             {
    509.                 SP_SubPoint(PointID);
    510.                 client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SPAWN_DELETED");
    511.             }
    512.         }
    513.         case 1:
    514.         {
    515.             if(SP_SavePoints())
    516.                 client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT");
    517.             else
    518.                 client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, pPlayer, "MSG_SAVE_POINT_FAIL");
    519.         }
    520.         case 2:
    521.         {
    522.             if(g_bBonusRound || g_iBonusRoundStatus || g_bNextRoundIsBonus || !SP_GetPointsNum())
    523.             {
    524.                 client_print_color(pPlayer, print_team_default, "%s %L", PLUGIN_PREFIX, LANG_PLAYER, "MSG_NOT_ACCESS_02");
    525.                 UTIL_PlaySound(pPlayer, "buttons/button10.wav");
    526.                 return;
    527.             }
    528.            
    529.             BonusRound_NextRound();
    530.         }
    531.     }
    532.  
    533.     UTIL_PlaySound(pPlayer, "common/wpn_denyselect.wav");
    534. }
    535. public Snowman_Spawn(const Float:vOrigin[3])
    536. {
    537.     static pEntity;
    538.     if(!(pEntity = create_entity(SNOWMAN_ENTITY)))
    539.         return 0
    540.  
    541.     entity_set_string(pEntity, EV_SZ_classname, SNOWMAN_CLASSNAME);
    542.     entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
    543.     entity_set_int(pEntity, EV_INT_solid, SOLID_BBOX);
    544.     entity_set_int(pEntity, EV_INT_deadflag, DEAD_NO);
    545.     entity_set_int(pEntity, EV_INT_flags, FL_MONSTER);
    546.     entity_set_int(pEntity, EV_INT_skin, SNOWMAN_SKIN);
    547.  
    548.     if(!entity_get_int(pEntity, EV_INT_skin))
    549.         entity_set_int(pEntity, EV_INT_body,  SNOWMAN_BODY);
    550.        
    551.     entity_set_float(pEntity, EV_FL_health, SNOWMAN_HEALTH);
    552.     entity_set_float(pEntity, EV_FL_gravity, 1.0);
    553.     entity_set_float(pEntity, EV_FL_framerate, 1.0);
    554.     entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_AIM);
    555.     entity_set_vector(pEntity, EV_VEC_view_ofs, Float:{0.0, 0.0, 10.0});
    556.     entity_set_model(pEntity, SNOWMAN_MODEL);
    557.     entity_set_size(pEntity, Float:{-16.0, -16.0, -36.0}, Float:{16.0, 16.0, 18.0});
    558.     entity_set_origin(pEntity, vOrigin);
    559.     Snowman_SetActivity(pEntity, ACT_JUMP);
    560.     Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
    561.     g_iClownSpawned++;
    562.     return pEntity;
    563. }
    564. public Snowman_Think(const pEntity)
    565. {
    566.     static iActivity; iActivity = entity_get_int(pEntity, EV_INT_iuser1);
    567.     static Float:fGameTime; fGameTime = get_gametime();
    568.     static pTarget; pTarget = entity_get_edict(pEntity, EV_ENT_enemy);
    569.     static Float:fDelay; fDelay = 0.1;
    570.     static Float:vTarget[3];
    571.  
    572.     if(iActivity == ACT_IDLE || iActivity == ACT_MOVE)
    573.     {
    574.         if(pTarget)
    575.         {
    576.             if(!Snowman_IsValidPlayer(pEntity, pTarget))
    577.             {
    578.                 Snowman_SetNextFindPlayer(pEntity, 1.0);
    579.                 Snowman_SetNextCheckMove(pEntity, 1.0);
    580.                 pTarget = 0;
    581.             }
    582.  
    583.             if(pTarget)
    584.             {
    585.                 entity_get_vector(pTarget, EV_VEC_origin, vTarget);
    586.                 Snowman_SetMovePoint(pEntity, vTarget);
    587.                 Snowman_SetNextCheckMove(pEntity, 1.0);
    588.  
    589.                 if(Snowman_IsMoveComplete(pEntity) ||
    590.                 entity_get_edict(pEntity, EV_ENT_groundentity) == pTarget
    591.                 )
    592.                     iActivity = ACT_IDLE;
    593.                 else
    594.                     iActivity = ACT_MOVE;
    595.             }
    596.             else
    597.             {
    598.                 iActivity = ACT_IDLE;
    599.             }
    600.         }
    601.         else
    602.         {
    603.             if((Snowman_GetNextCheckMove(pEntity) > fGameTime) && !Snowman_IsMoveComplete(pEntity))
    604.                 iActivity = ACT_MOVE;
    605.             else
    606.                 iActivity = ACT_IDLE;
    607.         }
    608.     }
    609.  
    610.     if(entity_get_edict(pEntity, EV_ENT_enemy) == 0)
    611.         pTarget = 0;
    612.  
    613.     if(Snowman_GetNextFindPlayer(pEntity) < fGameTime)
    614.     {
    615.         pTarget = Snowman_FindTarget(pEntity);
    616.         Snowman_SetNextFindPlayer(pEntity, pTarget ? 5.0 : 1.0);
    617.     }
    618.  
    619.     entity_set_edict(pEntity, EV_ENT_enemy, pTarget);
    620.  
    621.     switch(iActivity)
    622.     {
    623.         case ACT_DUMMY:
    624.         {
    625.             if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
    626.                  UTIL_PlayAnimation(pEntity, ANIM_IDLE);
    627.         }
    628.         case ACT_IDLE:
    629.         {
    630.             if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_IDLE)
    631.             {
    632.                  UTIL_PlayAnimation(pEntity, ANIM_IDLE);
    633.  
    634.                  if(Snowman_GetNextSoundIdle(pEntity) - fGameTime > 1.0)
    635.                     Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
    636.             }
    637.  
    638.             if(Snowman_GetNextSoundIdle(pEntity) < fGameTime)
    639.             {
    640.                 emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    641.                 Snowman_SetNextSoundIdle(pEntity, random_float(5.0, 10.0));
    642.             }
    643.  
    644.             if(Snowman_GetNextCheckMove(pEntity) <= fGameTime)
    645.             {
    646.                 new iPointNum = Snowman_GetRandomDir(pEntity, vTarget);
    647.  
    648.                 if(iPointNum)
    649.                 {
    650.                     Snowman_SetMovePoint(pEntity, vTarget);
    651.                     Snowman_SetNextCheckMove(pEntity, random_float(2.0, 4.0));
    652.                     iActivity = ACT_MOVE;
    653.                 }
    654.                 else
    655.                     Snowman_SetNextCheckMove(pEntity, 2.0);
    656.             }
    657.         }
    658.         case ACT_MOVE:
    659.         {
    660.             if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_WALK)
    661.                  UTIL_PlayAnimation(pEntity, ANIM_WALK);
    662.  
    663.             static MoveFlags; Snowman_MoveToOrigin(pEntity, SNOWMAN_SPEED, MoveFlags);
    664.  
    665.             if(MoveFlags & (1<<1))
    666.                 iActivity = ACT_IDLE;
    667.  
    668.             //Is snowman in air ?
    669.             if(~entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
    670.             {
    671.                 static Float:fFlyTime; fFlyTime = entity_get_float(pEntity, EV_FL_fuser1);
    672.                 if(fFlyTime == 0.0 || MoveFlags & (1<<0))
    673.                     fFlyTime = fGameTime;
    674.                 else if(fGameTime - fFlyTime > 0.15)
    675.                     iActivity = ACT_JUMP;
    676.                 entity_set_float(pEntity, EV_FL_fuser1, fFlyTime);
    677.             }
    678.             else
    679.                 entity_set_float(pEntity, EV_FL_fuser1, 0.0);
    680.         }
    681.         case ACT_JUMP:
    682.         {
    683.             if(entity_get_int(pEntity, EV_INT_sequence) != ANIM_JUMP)
    684.                  UTIL_PlayAnimation(pEntity, ANIM_JUMP);
    685.  
    686.             if(entity_get_int(pEntity, EV_INT_flags) & FL_ONGROUND)
    687.             {
    688.                 entity_set_float(pEntity, EV_FL_fuser1, 0.0);
    689.                 entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_PUSHSTEP);
    690.                 iActivity = ACT_IDLE;
    691.             }  
    692.         }
    693.         case ACT_DIE:
    694.         {
    695.             if(entity_get_int(pEntity, EV_INT_deadflag) == DEAD_DEAD)
    696.                 entity_set_int(pEntity, EV_INT_flags, FL_KILLME);
    697.             else
    698.             {
    699.                 new pAttacker = entity_get_edict(pEntity, EV_ENT_dmg_inflictor);
    700.                 if(is_user_connected(pAttacker))
    701.                     Snowman_Reward(pEntity, pAttacker);
    702.  
    703.                 emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    704.                 UTIL_PlayAnimation(pEntity, ANIM_DEATH);
    705.                 entity_set_int(pEntity, EV_INT_solid, SOLID_NOT);
    706.                 entity_set_int(pEntity, EV_INT_movetype, MOVETYPE_TOSS);
    707.                 entity_set_int(pEntity, EV_INT_deadflag, DEAD_DEAD);
    708.                 entity_set_float(pEntity, EV_FL_takedamage, DAMAGE_NO);
    709.                 fDelay = 4.0
    710.                 g_iClownSpawned--;
    711.             }
    712.         }
    713.         case ACT_FLINCH:
    714.         {
    715.             emit_sound(pEntity, CHAN_VOICE, SNOWMAN_SOUNDS[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    716.             UTIL_PlayAnimation(pEntity, random_num(ANIM_FLINCH, ANIM_FLINCH2));
    717.             fDelay = 0.15
    718.             iActivity = ACT_IDLE
    719.         }
    720.     }
    721.  
    722.     entity_set_int(pEntity, EV_INT_iuser1, iActivity);
    723.     entity_set_float(pEntity, EV_FL_nextthink, fGameTime + fDelay);
    724. }
    725. public Snowman_SetActivity(const pEntity, const iActivity)
    726. {
    727.     entity_set_int(pEntity, EV_INT_iuser1, iActivity);
    728.     entity_set_float(pEntity, EV_FL_nextthink, get_gametime());
    729. }
    730. public Snowman_FindTarget(const pEntity)
    731. {
    732.     static pTarget; pTarget = 0;
    733.     static Float:fMin; fMin = 8192.0;
    734.     static Float:fCur;
    735.  
    736.     static PlayersID[32], iPlayersNum;
    737.     get_players(PlayersID, iPlayersNum, "ah");
    738.     static i, pPlayer;
    739.     for(i = 0; i < iPlayersNum; i++)
    740.     {
    741.         pPlayer = PlayersID[i];
    742.  
    743.         if(!ENG_is_visible(pEntity, pPlayer))
    744.             continue;
    745.  
    746.         fCur = entity_range(pEntity, pPlayer);
    747.  
    748.         if(fCur < fMin)
    749.         {
    750.             fMin = fCur;
    751.             pTarget = pPlayer;
    752.         }
    753.     }
    754.  
    755.     return pTarget;
    756. }
    757. public Snowman_GetRandomDir(const pEntity, Float:vTarget[3])
    758. {
    759.     static Float:vAngles[3]; entity_get_vector(pEntity, EV_VEC_angles, vAngles);
    760.     static Float:vOrigin[3]; entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
    761.     static Float:vEnd[3];
    762.  
    763.     static Float:vForward[3];
    764.     static Float:vPoint[16][3], iPointNum; iPointNum = 0;
    765.     static Float:vAngles2[3]; vAngles2[1] = vAngles[1];
    766.     static Float:vEndPos[3];
    767.     static Float:fCur;
    768.  
    769.     static i;
    770.     for(i = 0; i < 16; i++)
    771.     {
    772.         angle_vector(vAngles2, ANGLEVECTOR_FORWARD, vForward);
    773.         vEnd[0] = vOrigin[0] + vForward[0] * 1024.0;
    774.         vEnd[1] = vOrigin[1] + vForward[1] * 1024.0;
    775.         vEnd[2] = vOrigin[2] + vForward[2] * 1024.0;
    776.        
    777.        
    778.         ENG_trace_line(pEntity, vOrigin, vEnd, vEndPos);
    779.  
    780.         fCur = get_distance_f(vOrigin, vEndPos);
    781.         vAngles2[1] += 20.0
    782.  
    783.         if(fCur < 64.0)
    784.             continue;
    785.  
    786.         xs_vec_copy(vEndPos, vPoint[iPointNum]);
    787.         iPointNum++;
    788.     }
    789.  
    790.     if(iPointNum)
    791.         xs_vec_copy(vPoint[random(iPointNum)], vTarget);
    792.  
    793.     return iPointNum;
    794. }
    795. public Float:Snowman_GetNextCheckMove(const pEntity)
    796. {
    797.     return entity_get_float(pEntity, EV_FL_fuser2);
    798. }
    799. public Snowman_SetNextCheckMove(const pEntity, const Float:fDelay)
    800. {
    801.     entity_set_float(pEntity, EV_FL_fuser2, get_gametime() + fDelay);
    802. }
    803. public Float:Snowman_GetNextFindPlayer(const pEntity)
    804. {
    805.     return entity_get_float(pEntity, EV_FL_fuser3);
    806. }
    807. public Snowman_SetNextFindPlayer(const pEntity, const Float:fDelay)
    808. {
    809.     entity_set_float(pEntity, EV_FL_fuser3, get_gametime() + fDelay);
    810. }
    811. public Snowman_SetMovePoint(const pEntity, const Float:vPoint[3])
    812. {
    813.     entity_set_vector(pEntity, EV_VEC_vuser1, vPoint);
    814. }
    815. public Snowman_GetMovePoint(const pEntity, Float:vPoint[3])
    816. {
    817.     entity_get_vector(pEntity, EV_VEC_vuser1, vPoint);
    818. }
    819. public Float:Snowman_GetNextSoundIdle(const pEntity)
    820. {
    821.     return entity_get_float(pEntity, EV_FL_fuser4);
    822. }
    823. public Float:Snowman_SetNextSoundIdle(const pEntity, const Float:fDelay)
    824. {
    825.     entity_set_float(pEntity, EV_FL_fuser4, get_gametime() + fDelay);
    826. }
    827.  
    828. public bool:Snowman_IsMoveComplete(const pEntity)
    829. {
    830.     static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
    831.     static Float:vEnd[3]; Snowman_GetMovePoint(pEntity, vEnd);
    832.  
    833.     if(get_distance_f(vSrc, vEnd) < 64.0)
    834.         return true;
    835.  
    836.     vEnd[2] = vSrc[2];
    837.     static Float:vDir[3]; xs_vec_sub(vEnd, vSrc, vDir);
    838.     static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
    839.     static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
    840.     vEnd[0] = vSrc[0] + vForward[0] * 26.0;
    841.     vEnd[1] = vSrc[1] + vForward[1] * 26.0;
    842.     vEnd[2] = vSrc[2] + vForward[2] * 26.0;
    843.     if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
    844.     {
    845.         vEnd[2] += 36.0;
    846.         if(ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, DONT_IGNORE_MONSTERS))
    847.         {
    848.             if(entity_get_edict(pEntity, EV_ENT_enemy))
    849.             {
    850.                 entity_set_edict(pEntity, EV_ENT_enemy, 0);
    851.                 Snowman_SetNextFindPlayer(pEntity, 0.5);
    852.                 Snowman_SetNextCheckMove(pEntity, 0.1);
    853.             }
    854.             return true;
    855.         }
    856.     }
    857.     return false;
    858. }
    859. public bool:Snowman_IsValidPlayer(const pEntity, const pPlayer)
    860. {
    861.     if(!is_user_alive(pPlayer))
    862.         return false;
    863.     if(!ENG_is_visible(pEntity, pPlayer))
    864.         return false;
    865.     return true;
    866. }
    867.  
    868. public CBaseEntity_Killed(const pEntity, const pAttacker)
    869. {
    870.     static szClassName[sizeof SNOWMAN_CLASSNAME];
    871.     entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
    872.     if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
    873.     Snowman_SetActivity(pEntity, ACT_DIE);
    874.     return HAM_SUPERCEDE;
    875. }
    876. public CBaseEntity_TakeDamage(const pEntity, const pInflictor, const pAttacker)
    877. {
    878.     static szClassName[sizeof SNOWMAN_CLASSNAME];
    879.     entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
    880.     if(!equal(szClassName, SNOWMAN_CLASSNAME)) return;
    881.     entity_set_edict(pEntity, EV_ENT_dmg_inflictor, pAttacker);
    882.     Snowman_SetActivity(pEntity, ACT_FLINCH);
    883. }
    884. public CBaseEntity_BloodColor(const pEntity)
    885. {
    886.     static szClassName[sizeof SNOWMAN_CLASSNAME];
    887.     entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
    888.     if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
    889.     SetHamReturnInteger(12);
    890.     return HAM_SUPERCEDE;
    891. }
    892. public CBaseEntity_TraceBleed(const pEntity)
    893. {
    894.     static szClassName[sizeof SNOWMAN_CLASSNAME];
    895.     entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
    896.     if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
    897.     return HAM_SUPERCEDE;
    898. }
    899. public CBaseEntity_Classify(const pEntity)
    900. {
    901.     static szClassName[sizeof SNOWMAN_CLASSNAME];
    902.     entity_get_string(pEntity, EV_SZ_classname, szClassName, charsmax(szClassName));
    903.     if(!equal(szClassName, SNOWMAN_CLASSNAME)) return HAM_IGNORED;
    904.     SetHamReturnInteger(4);
    905.     return HAM_SUPERCEDE;
    906. }
    907.  
    908. public Snowman_MoveToOrigin(const pEntity, const Float:fSpeed, Flags)
    909. {
    910.     Flags = 0;
    911.  
    912.     static Float:vOrigin[3]; Snowman_GetMovePoint(pEntity, vOrigin);
    913.     static Float:vSrc[3]; entity_get_vector(pEntity, EV_VEC_origin, vSrc);
    914.     static Float:vDir[3]; xs_vec_sub(vOrigin, vSrc, vDir);
    915.     static Float:vAngles[3]; vector_to_angle(vDir, vAngles);
    916.     static Float:vVel[3]; xs_vec_normalize(vDir, vDir);
    917.     xs_vec_mul_scalar(vDir, fSpeed, vVel);
    918.     vAngles[0] = vAngles[2] = 0.0;
    919.     vVel[2] = -100.0;
    920.  
    921.     static Float:vForward[3]; angle_vector(vAngles, ANGLEVECTOR_FORWARD, vForward);
    922.     static Float:vEnd[3];
    923.     vEnd[0] = vSrc[0] + vForward[0] * 20.0;
    924.     vEnd[1] = vSrc[1] + vForward[1] * 20.0;
    925.     vEnd[2] = vSrc[2] + vForward[2] * 20.0;
    926.  
    927.     if(ENG_trace_hull(vEnd, vSrc, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
    928.     {
    929.         vEnd[2] += 36.0;
    930.         if(!ENG_trace_hull(vEnd, vEnd, HULL_HUMAN, pEntity, IGNORE_MONSTERS))
    931.         {
    932.             vVel[2] = 200.0;
    933.             Flags |= (1<<0);
    934.         }
    935.     }
    936.  
    937.     entity_set_vector(pEntity, EV_VEC_angles, vAngles);
    938.     entity_set_vector(pEntity, EV_VEC_velocity, vVel);
    939.  
    940.     if(Snowman_IsMoveComplete(pEntity) && !(Flags & (1<<0)))
    941.         Flags |= (1<<1);
    942. }
    943.  
    944. stock UTIL_PlayAnimation(const pEntity, const iAnim)
    945. {
    946.     entity_set_int(pEntity, EV_INT_sequence, iAnim);
    947.     entity_set_float(pEntity, EV_FL_animtime, get_gametime());
    948.     entity_set_float(pEntity, EV_FL_frame, 0.0);
    949.     return iAnim;
    950. }
    951. stock bool:UTIL_IsHullVacant(Float:vOrigin[3], const HullType)
    952. {
    953.     if(!ENG_trace_hull(vOrigin, vOrigin, HullType))
    954.         return true;
    955.     return false;
    956. }
    957. stock UTIL_GetAimOrigin(const pPlayer, Float:vPoint[3])
    958. {
    959.     new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
    960.     new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
    961.     new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
    962.     new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
    963.     new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
    964.     new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
    965.     xs_vec_add(vSrc, vEnd, vEnd);
    966.     ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);
    967. }
    968. stock UTIL_GetAimOriginSpawn(const pPlayer, Float:vPoint[3])
    969. {
    970.     new Float:vOrigin[3]; entity_get_vector(pPlayer, EV_VEC_origin, vOrigin);
    971.     new Float:vViewOfs[3]; entity_get_vector(pPlayer, EV_VEC_view_ofs, vViewOfs);
    972.     new Float:vViewAngle[3]; entity_get_vector(pPlayer, EV_VEC_v_angle, vViewAngle);
    973.     new Float:vSrc[3]; xs_vec_add(vOrigin, vViewOfs, vSrc);
    974.     new Float:vForward[3]; angle_vector(vViewAngle, ANGLEVECTOR_FORWARD, vForward);
    975.     new Float:vEnd[3]; xs_vec_mul_scalar(vForward, 8192.0, vEnd);
    976.     xs_vec_add(vSrc, vEnd, vEnd);
    977.     ENG_trace_line(pPlayer, vSrc, vEnd, vPoint);
    978.  
    979.     new Float:vNormal[3]; get_tr2(g_iTrace, TR_vecPlaneNormal, vNormal);
    980.     if(vNormal[0] != 0.0) vPoint[0] += vNormal[0] * 20.0;
    981.     if(vNormal[1] != 0.0) vPoint[1] += vNormal[1] * 20.0;
    982.     if(vNormal[2] != 0.0) vPoint[2] += vNormal[2] * 36.0;
    983. }
    984.  
    985. stock SP_AddPoint(const Float:vPoint[3])
    986. {
    987.     ArrayPushCell(g_aClownSpawnX, Float:vPoint[0]);
    988.     ArrayPushCell(g_aClownSpawnY, Float:vPoint[1]);
    989.     ArrayPushCell(g_aClownSpawnZ, Float:vPoint[2]);
    990.  
    991.     return SP_GetPointsNum();
    992. }
    993. stock bool:SP_SubPoint(const PointID)
    994. {
    995.     if(PointID < 0 || PointID > ArraySize(g_aClownSpawnX))
    996.         return false;
    997.  
    998.     ArrayDeleteItem(g_aClownSpawnX, PointID);
    999.     ArrayDeleteItem(g_aClownSpawnY, PointID);
    1000.     ArrayDeleteItem(g_aClownSpawnZ, PointID);
    1001.     return true;
    1002. }
    1003. stock bool:SP_IsValidOrigin(const Float:vOrigin[3])
    1004. {
    1005.     if(!UTIL_IsHullVacant(vOrigin, HULL_HUMAN))
    1006.         return false;
    1007.  
    1008.     if(!SP_IsValidMinDist(vOrigin))
    1009.         return false;
    1010.  
    1011.     return true;
    1012. }
    1013. stock bool:SP_IsValidMinDist(const Float:vOrigin[3], const Float:fMinDist = 64.0)
    1014. {
    1015.     static Float:vPoint[3];
    1016.     for(new PointID; PointID < SP_GetPointsNum(); PointID++)
    1017.     {
    1018.         SP_GetPointOrigin(PointID, vPoint);
    1019.         if(get_distance_f(vOrigin, vPoint) <= fMinDist)
    1020.             return false;
    1021.     }
    1022.     return true;
    1023. }
    1024. stock SP_GetPointInSphere(StartPoint, const Float:vOrigin[3], const Float:fRadius = 64.0)
    1025. {
    1026.     new iPointsNum = SP_GetPointsNum();
    1027.     new PointID;
    1028.  
    1029.     if(!iPointsNum || StartPoint > iPointsNum)
    1030.         return -1;
    1031.  
    1032.     if(StartPoint < 0)
    1033.         StartPoint = 0;
    1034.     else
    1035.         StartPoint++;
    1036.  
    1037.     new Float:vPoint[3];
    1038.     for(PointID = StartPoint; PointID < iPointsNum; PointID++)
    1039.     {
    1040.         SP_GetPointOrigin(PointID, vPoint);
    1041.         if(get_distance_f(vOrigin, vPoint) <= fRadius)
    1042.             return PointID;
    1043.     }
    1044.  
    1045.     return -1;
    1046. }
    1047. stock SP_GetPointOrigin(const PointID, Float:vOrigin[3])
    1048. {
    1049.     vOrigin[0] = Float:ArrayGetCell(g_aClownSpawnX, PointID);
    1050.     vOrigin[1] = Float:ArrayGetCell(g_aClownSpawnY, PointID);
    1051.     vOrigin[2] = Float:ArrayGetCell(g_aClownSpawnZ, PointID);
    1052. }
    1053. stock SP_GetEmptyPointID()
    1054. {
    1055.     static Float:vPoint[3];
    1056.     for(new PointID; PointID < SP_GetPointsNum(); PointID++)
    1057.     {
    1058.         SP_GetPointOrigin(PointID, vPoint);
    1059.         if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
    1060.             return PointID;
    1061.     }
    1062.     return -1;
    1063. }
    1064. stock SP_GetRandomEmptyPointID()
    1065. {
    1066.     ArrayClear(g_aSpawns);
    1067.  
    1068.     static Float:vPoint[3];
    1069.     for(new PointID; PointID < SP_GetPointsNum(); PointID++)
    1070.     {
    1071.         SP_GetPointOrigin(PointID, vPoint);
    1072.         if(UTIL_IsHullVacant(vPoint, HULL_HUMAN))
    1073.             ArrayPushCell(g_aSpawns, PointID);
    1074.     }
    1075.  
    1076.     if(!ArraySize(g_aSpawns))
    1077.         return -1;
    1078.  
    1079.     return ArrayGetCell(g_aSpawns, random(ArraySize(g_aSpawns)));
    1080. }
    1081. stock SP_GetPointsNum()
    1082. {
    1083.     return ArraySize(g_aClownSpawnX);
    1084. }
    1085. stock bool:SP_SavePoints()
    1086. {  
    1087.     if(!SP_GetPointsNum())
    1088.         return false;
    1089.  
    1090.     new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
    1091.     new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));
    1092.  
    1093.     new szFileDir[96];
    1094.  
    1095.     formatex(szFileDir, charsmax(szFileDir),
    1096.         "%s/%s",
    1097.         szCfgDir,
    1098.         SP_DIR
    1099.     );
    1100.  
    1101.     if(!dir_exists(szFileDir))
    1102.         mkdir(szFileDir);
    1103.  
    1104.     formatex(szFileDir, charsmax(szFileDir),
    1105.         "%s/%s/%s.spawns.cfg",
    1106.         szCfgDir, SP_DIR, szMapName
    1107.     );
    1108.  
    1109.     if(file_exists(szFileDir))
    1110.         delete_file(szFileDir);
    1111.  
    1112.     new Float:vPoint[3];
    1113.     new szBuffer[64];
    1114.     for(new PointID = 0; PointID < SP_GetPointsNum(); PointID++)
    1115.     {
    1116.         SP_GetPointOrigin(PointID, vPoint);
    1117.  
    1118.         formatex(szBuffer, charsmax(szBuffer),
    1119.             "^"%.1f^" ^"%.1f^" ^"%.1f^"",
    1120.             vPoint[0], vPoint[1], vPoint[2]
    1121.         );
    1122.  
    1123.         write_file(szFileDir, szBuffer);
    1124.     }
    1125.  
    1126.     return true;
    1127. }
    1128. stock SP_LoadPoints()
    1129. {
    1130.     new szCfgDir[32]; get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
    1131.     new szMapName[32]; get_mapname(szMapName, charsmax(szMapName));
    1132.     new szFileDir[96];
    1133.  
    1134.     formatex(szFileDir, charsmax(szFileDir),
    1135.         "%s/%s/%s.spawns.cfg",
    1136.         szCfgDir, SP_DIR, szMapName
    1137.     );
    1138.  
    1139.     if(!file_exists(szFileDir))
    1140.         return 0;
    1141.  
    1142.     new iFile = fopen(szFileDir, "rt");
    1143.  
    1144.     if(!iFile)
    1145.         return 0;
    1146.  
    1147.     new szBuffer[64];
    1148.     new Float:vPoint[3];
    1149.     new szPoint[3][7];
    1150.     while(iFile && !feof(iFile))
    1151.     {
    1152.         fgets(iFile, szBuffer, charsmax(szBuffer));
    1153.         if(!szBuffer[0] || szBuffer[0] == ';')
    1154.             continue;
    1155.  
    1156.         parse(szBuffer, szPoint[0], 6, szPoint[1], 6, szPoint[2], 6);
    1157.  
    1158.         vPoint[0] = str_to_float(szPoint[0]);  
    1159.         vPoint[1] = str_to_float(szPoint[1]);  
    1160.         vPoint[2] = str_to_float(szPoint[2]);  
    1161.  
    1162.         SP_AddPoint(vPoint);
    1163.     }
    1164.     fclose(iFile);
    1165.     return SP_GetPointsNum();
    1166. }
    1167. stock ENG_trace_line(pEntity, Float:vSrc[3], Float:vEnd[3], Float:vEndPos[3])
    1168. {
    1169.     engfunc(EngFunc_TraceLine, vSrc, vEnd, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
    1170.     get_tr2(g_iTrace, TR_vecEndPos, vEndPos);
    1171. }
    1172. stock bool:ENG_trace_hull(Float:vSrc[3], Float:vEnd[3], iHullType, pEntity = 0, Flags = 0)
    1173. {
    1174.     engfunc(EngFunc_TraceHull, vSrc, vEnd, Flags, iHullType, pEntity, g_iTrace);
    1175.    
    1176.     if(get_tr2(g_iTrace, TR_StartSolid) || get_tr2(g_iTrace, TR_AllSolid) || !get_tr2(g_iTrace, TR_InOpen))
    1177.         return true;
    1178.     return false;
    1179. }
    1180. stock bool:ENG_is_visible(pEntity, pEntity2)
    1181. {
    1182.     static Float:vOrigin[3];
    1183.     static Float:vLooker[3];
    1184.     static Float:vTarget[3];
    1185.     entity_get_vector(pEntity, EV_VEC_origin, vOrigin);
    1186.     entity_get_vector(pEntity, EV_VEC_view_ofs, vLooker);
    1187.     xs_vec_add(vLooker, vOrigin, vLooker);
    1188.     entity_get_vector(pEntity2, EV_VEC_origin, vOrigin);
    1189.     entity_get_vector(pEntity2, EV_VEC_view_ofs, vTarget);
    1190.     xs_vec_add(vTarget, vOrigin, vTarget);
    1191.     static Solid; Solid = entity_get_int(pEntity2, EV_INT_solid);
    1192.     entity_set_int(pEntity2, EV_INT_solid, SOLID_NOT);
    1193.     engfunc(EngFunc_TraceLine, vLooker, vTarget, DONT_IGNORE_MONSTERS, pEntity, g_iTrace);
    1194.     entity_set_int(pEntity2, EV_INT_solid, Solid);
    1195.     if(get_tr2(g_iTrace, TR_InOpen) && get_tr2(g_iTrace, TR_InWater))
    1196.         return false;
    1197.     static Float:fFraction; get_tr2(g_iTrace, TR_flFraction, fFraction);
    1198.     if(fFraction == 1.0)
    1199.         return true;
    1200.     return false;
    1201. }
    1202. stock UTIL_PlaySound(iIndex = 0, szSound[], bool:bLoop = false)
    1203. {
    1204.     new szTemp[128]; copyc(szTemp, charsmax(szTemp), szSound, '.');
    1205.     if(contain(szSound, ".mp3") != -1)
    1206.         client_cmd(iIndex, "mp3 %s ^"sound/%s^"", bLoop ? "loop" : "play", szTemp);
    1207.     else
    1208.         client_cmd(iIndex, "spk ^"%s^"", szTemp);
    1209. }
    1210. stock UTIL_StopSound(iIndex = 0)
    1211. {
    1212.     client_cmd(iIndex, "stopsound;mp3 stop");
    1213. }
He who fails to plan is planning to fail

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 1 guest