Plugin

 avatar
unknown
plain_text
2 years ago
12 kB
118
Indexable
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>

#define PLUGIN "ADV Like: WallHack"
#define VERSION "1.0"
#define AUTHOR "Bim Bim Cay"

//**********************************************
//* Resources                                  *
//**********************************************

// Sprites
#define SPRITE_BEAM	"sprites/laserbeam.spr"	

//**********************************************
//* Some macroses.                             *
//**********************************************

#define SET_MODEL(%0,%1)		engfunc(EngFunc_SetModel, %0, %1)
#define SET_ORIGIN(%0,%1)		engfunc(EngFunc_SetOrigin, %0, %1)
#define SET_SIZE(%0,%1,%2)		engfunc(EngFunc_SetSize, %0, %1, %2)

#define PRECACHE_MODEL(%0)		engfunc(EngFunc_PrecacheModel, %0)
#define PRECACHE_SOUND(%0)		engfunc(EngFunc_PrecacheSound, %0)
#define PRECACHE_GENERIC(%0)		engfunc(EngFunc_PrecacheGeneric, %0)

#define NUMBER_OF_ENTITIES()		engfunc(EngFunc_NumberOfEntities)

#define IsObserver(%0) 			pev(%0,pev_iuser1)

#define BitSet(%0,%1) 			%0 |= (1 << (%1 - 1))
#define BitClear(%0,%1) 		%0 &= ~(1 << (%1 - 1))
#define BitCheck(%0,%1) 		(%0 & (1 << (%1 - 1)))

//**********************************************
//* Private Data Offsets.                      *
//**********************************************

// Linux extra offsets
#define extra_offset_player		5

// CBaseMonster
#define m_iTeam				114

//**********************************************
//* CS Team                                    *
//**********************************************

#define CS_TEAM_UNASSIGNED		0
#define CS_TEAM_T			1
#define CS_TEAM_CT			2
#define CS_TEAM_SPECTATOR		3

//**********************************************
//* Entity Classname                           *
//**********************************************

#define BEAM_CLASSNAME		"WallHack_Beam"

//**********************************************
//* Config                                     *
//**********************************************

// Color
#define SPRITECOLOR_T		{255, 0, 0}	
#define SPRITECOLOR_CT		{0, 0, 255}
#define	SPRITECOLOR_SPECTATOR	{255, 255, 255}	

//**********************************************
//* Vars                                       *
//**********************************************

#define MAX_PLAYER 32

// Is player connected ?
new g_IsConnected 

// Is player alive ?
new g_IsAlive 

// Is player enable ?
new g_IsWallHacking

// Can plugin work ?
new g_IsPluginEnabled

// Beam Key
new g_iszBeamKey

// PSet
new Float:flOriginData[MAX_PLAYER+1][3][3]

//**********************************************
//* Precache                                   *
//**********************************************

public plugin_precache()
{
	PRECACHE_MODEL(SPRITE_BEAM)
	
	g_iszBeamKey = engfunc(EngFunc_AllocString, BEAM_CLASSNAME)
}

//**********************************************
//* Natives                                    * 
//**********************************************

public plugin_natives()
{
	register_native("EnableWallHack", "EnableWallHack", 1)
	register_native("DisableWallHack", "DisableWallHack", 1)
}

//**********************************************
//* Plugin Init                                *
//**********************************************

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	g_IsPluginEnabled = Create_PlayerBeamEntity()
	
	if(g_IsPluginEnabled)
	{
		register_forward(FM_CheckVisibility, "fw_CheckVisibility")
		register_forward(FM_AddToFullPack, "fw_AddToFullPack")
		register_forward(FM_AddToFullPack, "fw_AddToFullPack_Post", 1)
		
		RegisterHam(Ham_Spawn, "player", "fw_Player_Spawn_Post", 1)
		RegisterHam(Ham_Killed, "player", "fw_Player_Killed_Post", 1)
		
		register_clcmd("say /wallhack", "ToggleWallHack")
	}
}

//**********************************************
//* Toggle WallHack                            *
//**********************************************

public client_connect(iPlayer)
{
	BitClear(g_IsAlive, iPlayer)
	BitClear(g_IsConnected, iPlayer)
	BitClear(g_IsWallHacking, iPlayer)
}

public client_disconnect(iPlayer)
{
	BitClear(g_IsAlive, iPlayer)
	BitClear(g_IsConnected, iPlayer)
	BitClear(g_IsWallHacking, iPlayer)
}

public client_putinserver(iPlayer)
{
	BitSet(g_IsConnected, iPlayer)	
}
	
public fw_Player_Spawn_Post(iPlayer)
{
	if(!BitCheck(g_IsConnected, iPlayer))
		return
		
	if(!IsAlive(iPlayer))
		return
	
	BitSet(g_IsAlive, iPlayer)
}
	
public fw_Player_Killed_Post(iPlayer)
{
	BitClear(g_IsAlive, iPlayer)
}

public EnableWallHack(iPlayer)
{
	if(!g_IsPluginEnabled)
		return
	
	BitSet(g_IsWallHacking, iPlayer)
}

public DisableWallHack(iPlayer)
{
	if(!g_IsPluginEnabled)
		return
	
	BitClear(g_IsWallHacking, iPlayer)
}

public ToggleWallHack(iPlayer)
{
	if(BitCheck(g_IsWallHacking, iPlayer))
	{
		BitClear(g_IsWallHacking, iPlayer)	
	}
	else
	{
		BitSet(g_IsWallHacking, iPlayer)
	}
}

//**********************************************
//* Create Entities                            *
//**********************************************

Create_PlayerBeamEntity()
{
	static g_MaxPlayers; g_MaxPlayers = get_maxplayers()
	
	if(global_get(glb_maxEntities) - NUMBER_OF_ENTITIES() < g_MaxPlayers)
		return 0
	
	static iEntity
	static iszAllocStringCached
	
	for(new iPlayer = 1; iPlayer <= g_MaxPlayers; iPlayer++)
	{
		if(iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "beam")))
		{
			iEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
		}
	
		if(!pev_valid(iEntity)) 
			return 0	
		
		set_pev(iEntity, pev_classname, BEAM_CLASSNAME)
		set_pev(iEntity, pev_flags, pev(iEntity, pev_flags) | FL_CUSTOMENTITY)
		
		SET_MODEL(iEntity, SPRITE_BEAM)
		
		set_pev(iEntity, pev_rendermode, (pev(iEntity, pev_rendermode) & 0xF0) | 0 & 0x0F)
		set_pev(iEntity, pev_rendermode, (pev(iEntity, pev_rendermode) & 0x0F) | 0 & 0xF0)
	
		set_pev(iEntity, pev_body, 0)
		set_pev(iEntity, pev_frame, 0.0)
		set_pev(iEntity, pev_scale, 0.0)
		set_pev(iEntity, pev_animtime, 0.0)
		set_pev(iEntity, pev_renderamt, 0.0)
		set_pev(iEntity, pev_rendercolor, Float:{0.0, 0.0, 0.0})
	
		set_pev(iEntity, pev_team, iPlayer)
		set_pev(iEntity, pev_impulse, g_iszBeamKey)
	}
	
	return 1	
}

//**********************************************
//* Wall hack                                  *
//**********************************************

// In Pawn, iEntity is the same as iE. 
public fw_AddToFullPack(iState, iE, iEntity, iHost, iHostflags, IsPlayer, pSet)
{
	if(!pev_valid(iEntity) || pev(iEntity, pev_impulse) != g_iszBeamKey) 
		return FMRES_IGNORED
	
	if(!BitCheck(g_IsWallHacking, iHost))
	{
		forward_return(FMV_CELL, 0)
		
		return FMRES_SUPERCEDE
	}
	
	static iTarget; iTarget = pev(iEntity, pev_team)
	
	if(iTarget == iHost || !BitCheck(g_IsAlive, iTarget))
	{
		forward_return(FMV_CELL, 0)
		
		return FMRES_SUPERCEDE
	}
	
	static Float:flTOrigin[3], Float:flVOrigin[3]
	
	pev(iTarget, pev_origin, flTOrigin)
	pev(iHost, pev_origin, flVOrigin)
	
	static Float:flDir[3], Float:flFacingDir[3]
	xs_vec_sub(flTOrigin, flVOrigin, flDir)
	xs_vec_normalize(flDir, flDir)
	
	pev(iHost, pev_v_angle, flFacingDir)
	angle_vector(flFacingDir, ANGLEVECTOR_FORWARD, flFacingDir)
	xs_vec_normalize(flFacingDir, flFacingDir)
	
	if(xs_vec_dot(flDir, flFacingDir) <= 0.0)
	{
		forward_return(FMV_CELL, 0)
		
		return FMRES_SUPERCEDE
	}
	
	static iTrace; iTrace = create_tr2()
	static Float:flFraction, Float:flHitPoint[3]
	
	engfunc(EngFunc_TraceLine, flVOrigin, flTOrigin, IGNORE_MONSTERS, iHost, iTrace)
	
	get_tr2(iTrace, TR_vecEndPos, flHitPoint)
	get_tr2(iTrace, TR_flFraction, flFraction)
		
	free_tr2(iTrace)
	
	if(flFraction >= 1.0)
	{
		forward_return(FMV_CELL, 0)
		
		return FMRES_SUPERCEDE
	}
	
	flOriginData[iHost][0] = flVOrigin 
	flOriginData[iHost][1] = flTOrigin
	flOriginData[iHost][2] = flHitPoint
	
	return FMRES_IGNORED
}

public fw_CheckVisibility(iEntity, pSet)
{
	if(pev(iEntity, pev_impulse) != g_iszBeamKey) 
		return FMRES_IGNORED
	
	forward_return(FMV_CELL, 1)
	
	return FMRES_SUPERCEDE
}

public fw_AddToFullPack_Post(iState, iE, iEntity, iHost, iHostflags, IsPlayer, pSet) 
{
	if(!get_orig_retval())
		return
	
	if(IsPlayer)
	{
		if(!BitCheck(g_IsWallHacking, iHost))
			return
		
		switch(get_pdata_int(iEntity, m_iTeam, extra_offset_player))
		{
			case CS_TEAM_T: 
			{
				set_es(iState, ES_RenderColor, SPRITECOLOR_T)
			}
			case CS_TEAM_CT:
			{
				set_es(iState, ES_RenderColor, SPRITECOLOR_CT)
			}
			case CS_TEAM_SPECTATOR:
			{
				set_es(iState, ES_RenderColor, SPRITECOLOR_SPECTATOR)
			}
		}

		set_es(iState, ES_RenderFx, kRenderFxGlowShell)
		set_es(iState, ES_RenderAmt, 16)
	}
	else
	{
		if(pev(iEntity, pev_impulse) != g_iszBeamKey) 
			return
			
		static iTarget; iTarget = pev(iEntity, pev_team)	
		static Float:flVOrigin[3], Float:flTOrigin[3], Float:flHitPoint[3]
		
		flVOrigin = flOriginData[iHost][0]
		flTOrigin = flOriginData[iHost][1]
		flHitPoint = flOriginData[iHost][2]
		
		static Float:flDistanceToTarget, Float:flDistanceToHitPoint
		
		flDistanceToTarget = get_distance_f(flVOrigin, flTOrigin)
		flDistanceToHitPoint = get_distance_f(flVOrigin, flHitPoint)
		
		static Float:flDirection[3]
		xs_vec_sub(flTOrigin, flVOrigin, flDirection)
		
		static Float:flScaleBoneLen, Float:flScaleBoneWid
		
		flScaleBoneLen = flDistanceToHitPoint / flDistanceToTarget * 50.0
		flScaleBoneWid = flDistanceToHitPoint / flDistanceToTarget * 150.0
		
		// Get the point 10.0 units away from wall
		xs_vec_normalize(flDirection, flDirection)
		xs_vec_mul_scalar(flDirection, flDistanceToHitPoint - 10.0, flDirection)
		
		static Float:flEyeLevel[3]
		xs_vec_copy(flVOrigin, flEyeLevel)
		
		if(pev(iHost, pev_flags) & FL_DUCKING)
		{
			flEyeLevel[2] += 12.0
		}
		else
		{
			flEyeLevel[2] += 18.0
		}
		
		static Float:flBoneStart[3]
		xs_vec_add(flDirection, flEyeLevel, flBoneStart)
		
		static Float:flBoneEnd[3]
		xs_vec_set(flBoneEnd, flBoneStart[0], flBoneStart[1], flBoneStart[2] - flScaleBoneLen)
		
		static Float:flTargetHitPointDistance; flTargetHitPointDistance = flDistanceToTarget - flDistanceToHitPoint
		static iBrightness; iBrightness = 255
		
		if(flTargetHitPointDistance < 2040.0)
		{
			iBrightness = (255 - floatround(flTargetHitPointDistance / 12.0))
										
		}
		else
		{
			iBrightness = 85
		}	
			
		set_es(iState, ES_Origin, flBoneStart)			
		set_es(iState, ES_Angles, flBoneEnd)
		
		switch(get_pdata_int(iTarget, m_iTeam, extra_offset_player))
		{
			case CS_TEAM_T: 
			{
				set_es(iState, ES_RenderColor, SPRITECOLOR_T)
			}
			case CS_TEAM_CT:
			{
				set_es(iState, ES_RenderColor, SPRITECOLOR_CT)
			}
			case CS_TEAM_SPECTATOR:
			{
				set_es(iState, ES_RenderColor, SPRITECOLOR_SPECTATOR)
			}
		}
		
		set_es(iState, ES_Scale, flScaleBoneWid)
		set_es(iState, ES_RenderAmt, iBrightness)
	}
}

//**********************************************
//* Player Check                               *
//**********************************************

IsAlive(iEntity)
{
	return (pev(iEntity, pev_deadflag) == DEAD_NO && pev(iEntity, pev_health) > 0)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
Editor is loading...