All pastes #2004810 Raw Edit

v

public text v1 · immutable
#2004810 ·published 2010-11-28 21:02 UTC
rendered paste body
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>

#define PLUGIN "Winter Events"
#define VERSION "1.0"
#define AUTHOR "Alka"

new const gSnowManModel[] = "models/frost_man.mdl";
new const gSnowManClassname[] = "snow_man";
new const gSnowBallModel[] = "sprites/bhit.spr";
new const gSnowBallClassname[] = "snow_ball";
new const gBombModel[] = "models/christmastree.mdl";

new gSnowBallLife = 5;

new gAccessFlag = ADMIN_BAN;

new const gGunsEvents[][] = {
	
	"events/awp.sc",
	"events/g3sg1.sc",
	"events/ak47.sc",
	"events/scout.sc",
	"events/m249.sc",
	"events/m4a1.sc",
	"events/sg552.sc",
	"events/aug.sc",
	"events/sg550.sc",
	"events/m3.sc",
	"events/xm1014.sc",
	"events/usp.sc",
	"events/mac10.sc",
	"events/ump45.sc",
	"events/fiveseven.sc",
	"events/p90.sc",
	"events/deagle.sc",
	"events/p228.sc",
	"events/glock18.sc",
	"events/mp5n.sc",
	"events/tmp.sc",
	"events/elite_left.sc",
	"events/elite_right.sc",
	"events/galil.sc",
	"events/famas.sc"
}

new gEventsIndex[sizeof gGunsEvents];

public plugin_init() {
	
	register_plugin(PLUGIN, VERSION, AUTHOR);
	
	register_forward(FM_PlaybackEvent, "Fwd_PlaybackEvent");
	register_forward(FM_Think, "Fwd_Think");
	register_forward(FM_SetModel, "Fwd_SetModel");
	
	register_clcmd("say !addsnowman", "cmdAddSnowman", -1);
	register_clcmd("say !removesnowman", "cmdRemoveSnowman", -1);
	register_clcmd("say !rotatesnowman", "cmdRotateSnowman", -1);
	register_clcmd("say !saveorigins", "cmdSaveOrigins", -1);
}

public plugin_precache()
{
	engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_snow"));
	
	for(new i = 0 ; i < sizeof gGunsEvents ; i++)
	{
		gEventsIndex[i] = engfunc(EngFunc_PrecacheEvent, 1, gGunsEvents[i]);
	}
	
	precache_model(gSnowManModel);
	precache_model(gSnowBallModel);
	precache_model(gBombModel);
}

public plugin_cfg()
{
	static sConfigsDir[64], sFile[64];
	get_configsdir(sConfigsDir, sizeof sConfigsDir - 1);
	
	static sMapName[32];
	get_mapname(sMapName, sizeof sMapName - 1);
	
	formatex(sFile, sizeof sFile - 1, "%s/%s_snowman_origins.cfg", sConfigsDir, sMapName);
	
	if(!file_exists(sFile))
		return 1;
	
	static sFileOrigin[3][32], sFileAngles[3][32], iLine, iLength, sBuffer[256];
	static sTemp1[128], sTemp2[128];
	static Float:fOrigin[3], Float:fAngles[3];
	
	while(read_file(sFile, iLine++, sBuffer, sizeof sBuffer - 1, iLength))
	{
		if((sBuffer[0]==';') || !iLength)
			continue;
		
		strtok(sBuffer, sTemp1, sizeof sTemp1 - 1, sTemp2, sizeof sTemp2 - 1, '|', 0);
		
		parse(sTemp1, sFileOrigin[0], sizeof sFileOrigin[] - 1, sFileOrigin[1], sizeof sFileOrigin[] - 1, sFileOrigin[2], sizeof sFileOrigin[] - 1);
		
		fOrigin[0] = str_to_float(sFileOrigin[0]);
		fOrigin[1] = str_to_float(sFileOrigin[1]);
		fOrigin[2] = str_to_float(sFileOrigin[2]);
		
		parse(sTemp2, sFileAngles[0], sizeof sFileAngles[] - 1, sFileAngles[1], sizeof sFileAngles[] - 1, sFileAngles[2], sizeof sFileAngles[] - 1);
		
		fAngles[0] = str_to_float(sFileAngles[0]);
		fAngles[1] = str_to_float(sFileAngles[1]);
		fAngles[2] = str_to_float(sFileAngles[2]);
		
		static iEnt;
		iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
		
		if(!iEnt)
			return 0;
		
		engfunc(EngFunc_SetOrigin, iEnt, fOrigin);
		set_pev(iEnt, pev_angles, fAngles);
		
		static Float:fMaxs[3] = { 16.0, 16.0, 38.0 };
		static Float:fMins[3] = { -16.0, -16.0, -38.0 };
		
		engfunc(EngFunc_SetModel, iEnt, gSnowManModel);
		set_pev(iEnt, pev_classname, gSnowManClassname);
		
		dllfunc(DLLFunc_Spawn, iEnt);
		set_pev(iEnt, pev_solid, SOLID_BBOX);
		engfunc(EngFunc_SetSize, iEnt, fMins, fMaxs);
	}
	return 1;
	
}

public Fwd_PlaybackEvent(flags, id, eventindex)
{
	for(new i = 0 ; i < sizeof gGunsEvents ; i++)
	{
		if(eventindex == gEventsIndex[i])
		{
			static Float:fAimOrigin[3];
			fm_get_aimorigin(id, fAimOrigin);
			
			if(engfunc(EngFunc_PointContents, fAimOrigin) != CONTENTS_SKY)
			{
				static iEnt;
				iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
				
				if(!iEnt)
					return FMRES_IGNORED;
				
				set_pev(iEnt, pev_solid, SOLID_NOT);
				set_pev(iEnt, pev_movetype, MOVETYPE_NONE);
				engfunc(EngFunc_SetModel, iEnt, gSnowBallModel);
				set_pev(iEnt, pev_classname, gSnowBallClassname);
				
				engfunc(EngFunc_SetOrigin, iEnt, fAimOrigin);
				
				fm_set_rendering(iEnt, kRenderFxNoDissipation, 255, 255, 255, kRenderGlow, 255);
				set_pev(iEnt, pev_flags, FL_ALWAYSTHINK);
				set_pev(iEnt, pev_nextthink, get_gametime() + float(gSnowBallLife));
				
				return FMRES_IGNORED;
			}
		}
	}
	return FMRES_IGNORED;
}

public Fwd_Think(Ent)
{
	if(!pev_valid(Ent))
		return FMRES_IGNORED;
	
	static sClassName[32];
	pev(Ent, pev_classname, sClassName, sizeof sClassName - 1);
	
	if(!strcmp(sClassName, gSnowBallClassname, 1))
	{
		engfunc(EngFunc_RemoveEntity, Ent);
	}
	
	return FMRES_IGNORED;
}

public Fwd_SetModel(Ent, const szModel[])
{
	if(!pev_valid(Ent))
		return FMRES_IGNORED;
	
	if(!strcmp(szModel, "models/w_c4.mdl"))
	{
		engfunc(EngFunc_SetModel, Ent, gBombModel);
		
		return FMRES_SUPERCEDE;
	}
	return FMRES_IGNORED;
}

public cmdAddSnowman(id)
{
	if(!access(id, gAccessFlag))
		return 1;
	
	if(!is_user_alive(id))
		return 1;
	
	static Float:fAimOrigin[3];
	fm_get_aimorigin(id, fAimOrigin);
	
	if((engfunc(EngFunc_PointContents, fAimOrigin) != CONTENTS_SKY) && (engfunc(EngFunc_PointContents, fAimOrigin) != CONTENTS_SOLID))
	{
		static iEnt;
		iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
		
		if(!iEnt)
			return 0;
		
		engfunc(EngFunc_SetOrigin, iEnt, fAimOrigin);
		
		static Float:fMaxs[3] = { 16.0, 16.0, 38.0 };
		static Float:fMins[3] = { -16.0, -16.0, -38.0 };
		
		engfunc(EngFunc_SetModel, iEnt, gSnowManModel);
		set_pev(iEnt, pev_classname, gSnowManClassname);
		
		dllfunc(DLLFunc_Spawn, iEnt);
		set_pev(iEnt, pev_solid, SOLID_BBOX);
		engfunc(EngFunc_SetSize, iEnt, fMins, fMaxs);
		
		client_print(id, print_chat, "Successfuly created a snowman!Now save the origins ^"!saveorigins^"");
	}
	else
		client_print(id, print_chat, "Sorry, but that location is unavailable!");
	
	return 0;
}

public cmdRemoveSnowman(id)
{
	if(!access(id, gAccessFlag))
		return 1;
	
	if(!is_user_alive(id))
		return 1;
	
	static iEnt, iBody;
	get_user_aiming(id, iEnt, iBody);
	
	if(pev_valid(iEnt))
	{
		static sClassname[32];
		pev(iEnt, pev_classname, sClassname, sizeof sClassname - 1);
		
		if(!strcmp(sClassname, gSnowManClassname, 1))
		{
			engfunc(EngFunc_RemoveEntity, iEnt);
			
			client_print(id, print_chat, "Successfuly, you removed a snowman!Now save the origins ^"!saveorigins^"");
		}
		else
			client_print(id, print_chat, "Sorry, you must aim at an snowman to remove it!");
	}
	return 0;
}

public cmdSaveOrigins(id)
{
	if(!access(id, gAccessFlag))
		return 1;
	
	if(!is_user_alive(id))
		return 1;
	
	static sConfigsDir[64], sFile[64];
	get_configsdir(sConfigsDir, sizeof sConfigsDir - 1);
	
	static sMapName[32];
	get_mapname(sMapName, sizeof sMapName - 1);
	
	formatex(sFile, sizeof sFile - 1, "%s/%s_snowman_origins.cfg", sConfigsDir, sMapName);
	
	if(file_exists(sFile))
		delete_file(sFile);
	
	new iEnt = -1, Float:fEntOrigin[3], Float:fEntAngles[3], iCount;
	static sBuffer[256];
	
	while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", gSnowManClassname)))
	{
		pev(iEnt, pev_origin, fEntOrigin);
		pev(iEnt, pev_angles, fEntAngles);
		
		formatex(sBuffer, sizeof sBuffer - 1, "%f %f %f | %f %f %f", fEntOrigin[0], fEntOrigin[1], fEntOrigin[2], fEntAngles[0], fEntAngles[1], fEntAngles[2]);
		
		write_file(sFile, sBuffer, -1);
		
		iCount++;
	}
	client_print(id, print_chat, "Successfuly saved all snowman origins (%d) for map %s!", iCount,sMapName);
	
	return 0;
}

public cmdRotateSnowman(id)
{
	if(!access(id, gAccessFlag))
		return 1;
	
	if(!is_user_alive(id))
		return 1;
	
	static iEnt, iBody;
	get_user_aiming(id, iEnt, iBody);
	
	if(pev_valid(iEnt))
	{
		static sClassname[32];
		pev(iEnt, pev_classname, sClassname, sizeof sClassname - 1);
		
		if(!strcmp(sClassname, gSnowManClassname, 1))
		{
			static Float:fAngles[3];
			pev(iEnt, pev_angles, fAngles);
			
			fAngles[1] += 90.0;
			
			set_pev(iEnt, pev_angles, fAngles);
			
			client_print(id, print_chat, "Successfuly, you rotated a snowman!Now save the origins ^"!saveorigins^"");
		}
		else
			client_print(id, print_chat, "Sorry, you must aim at an snowman to rotate it!");
	}
	return 0;
	
}

public client_connect(id)
	client_cmd(id, "cl_weather 1");

stock fm_get_aimorigin(index, Float:origin[3])
{
	new Float:start[3], Float:view_ofs[3];
	pev(index, pev_origin, start);
	pev(index, pev_view_ofs, view_ofs);
	xs_vec_add(start, view_ofs, start);
	
	new Float:dest[3];
	pev(index, pev_v_angle, dest);
	engfunc(EngFunc_MakeVectors, dest);
	global_get(glb_v_forward, dest);
	xs_vec_mul_scalar(dest, 9999.0, dest);
	xs_vec_add(start, dest, dest);
	
	engfunc(EngFunc_TraceLine, start, dest, 0, index, 0);
	get_tr2(0, TR_vecEndPos, origin);
	
	return 1;
}

stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) 
{
	static Float:rendercolor[3];
	rendercolor[0] = float(r);
	rendercolor[1] = float(g);
	rendercolor[2] = float(b);
	
	set_pev(entity, pev_renderfx, fx)
	set_pev(entity, pev_rendercolor, rendercolor);
	set_pev(entity, pev_rendermode, render);
	set_pev(entity, pev_renderamt, float(amount));
	
	return 1;
}