Code: Select all
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#pragma tabsize 0
new Float:g_flLastTouch[ 33 ];
new g_Pointer_FriendlyFire;
new g_iMsg_DeathMsg;
new g_iHookedDeathMsg;
new g_Cvar_Enabled;
new g_Cvar_Speed;
new g_Cvar_Fade;
new g_Cvar_Duration;
new g_iMaxplayers;
new bool:is_touched[33]
#define ERROR 0
#define HEGRENADE 1
#define FLASHBANG 2
#define SMOKENADE 3
new g_szGrenadeNames[ ][ ] = {
"", // ERROR
"weapon_hegrenade",
"weapon_flashbang",
"weapon_smokegrenade"
};
public plugin_init() {
register_plugin( "Grenade Touch Damage", "1.3", "xPaw" );
g_Cvar_Enabled = register_cvar( "grenadeslower", "1", FCVAR_SERVER );
g_Cvar_Speed = register_cvar( "grenadeslower_speed", "100", FCVAR_SERVER );
g_Cvar_Fade = register_cvar( "grenadeslower_duration", "1", FCVAR_SERVER );
g_Cvar_Duration = register_cvar( "grenadeslower_fade", "3", FCVAR_SERVER );
register_event("CurWeapon","Change_Wpn","be","1=1")
g_iMaxplayers = get_maxplayers( );
g_iMsg_DeathMsg = get_user_msgid( "DeathMsg" );
if( cstrike_running( ) ) {
g_Pointer_FriendlyFire = get_cvar_pointer( "mp_friendlyfire" );
RegisterHam( Ham_Touch, "grenade", "FwdHamTouch_Grenade" );
} else
set_fail_state( "Only Counter-Strike Mod allowed!" );
}
public Change_Wpn(id){
if(!is_user_alive(id)||!is_touched[id]) return
//set_user_maxspeed(id,float(get_pcvar_num(g_Cvar_Speed))
pev(id,pev_maxspeed,float(get_pcvar_num(g_Cvar_Speed)))
}
public client_putinserver(id) if(!is_user_bot(id)||!is_user_hltv(id)||is_user_connected(id)) is_touched[id]=false
public MsgDeathMsg( ) {
set_msg_arg_int( 3, ARG_BYTE, 1 );
set_msg_arg_string( 4, "grenade" );
return PLUGIN_CONTINUE;
}
public FwdHamTouch_Grenade( iEntity, iTouched ) {
if( !get_pcvar_num( g_Cvar_Enabled ) )
return HAM_IGNORED;
if( !( 1 <= iTouched <= g_iMaxplayers ) )
return HAM_IGNORED;
if( is_touched[iTouched] )
return HAM_IGNORED;
static Float:flGmTime;
flGmTime = get_gametime();
if( g_flLastTouch[iTouched] < flGmTime ) {
new iOwner = pev( iEntity, pev_owner );
if( iOwner == iTouched )
return HAM_IGNORED;
if( is_user_connected( iOwner ) ) {
if( !get_pcvar_num( g_Pointer_FriendlyFire ) && ( get_user_team( iTouched ) == get_user_team( iOwner ) ) )
return HAM_IGNORED;
if( pev( iTouched, pev_takedamage ) == DAMAGE_NO )
return HAM_IGNORED;
new Float:flVelocity[ 3 ];
pev( iEntity, pev_velocity, flVelocity );
new Float:flSpeed = vector_length( flVelocity );
new Float:flDamage = ( flSpeed * 0.15 ) / 13.0;
if( flSpeed > 100.0 ) { // anti grenade stuck bug damage fix
g_iHookedDeathMsg = register_message( g_iMsg_DeathMsg, "MsgDeathMsg" );
new iType = GetGrenadeType( iEntity );
if( iType != ERROR )
set_pev( iEntity, pev_classname, g_szGrenadeNames[ iType ] );
ExecuteHamB( Ham_TakeDamage, iTouched, iEntity, iOwner, flDamage, DMG_GENERIC );
if( g_iHookedDeathMsg ) {
unregister_message( g_iMsg_DeathMsg, g_iHookedDeathMsg );
g_iHookedDeathMsg = 0;
}
if( iType != ERROR )
set_pev( iEntity, pev_classname, "grenade" );
is_touched[iTouched]=true
engclient_cmd(iTouched,"weapon_knife")
set_task(float(get_pcvar_num(g_Cvar_Duration)),"CS",iTouched)
if(get_pcvar_num(g_Cvar_Fade)==1) Message_ScreenFade( iTouched, 0, 0, 1<<2, 255, 0, 0, 255 );
}
}
g_flLastTouch[iTouched] = flGmTime + 0.4;
}
return HAM_IGNORED;
}
public CS(id) if(is_user_connected(id)) is_touched[id]=false
stock GetGrenadeType( iEntity ) {
if( !pev_valid( iEntity ) )
return ERROR;
new szModel[ 32 ];
pev( iEntity, pev_model, szModel, charsmax( szModel ) );
if( szModel[ 7 ] != 'w' && szModel[ 8 ] != '_' )
return ERROR;
switch( szModel[ 9 ] ) {
case 'h': return HEGRENADE;
case 'f': return FLASHBANG;
case 's': return SMOKENADE;
default : return ERROR;
}
return ERROR;
}
public Message_ScreenFade( id, iDuration, iHold, FadeMode, iRed, iGreen, iBlue, iAlpha )
{
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenFade" ),{ 0, 0, 0 }, id );
write_short( iDuration );
write_short( iHold );
write_short( FadeMode );
write_byte( iRed );
write_byte( iGreen );
write_byte( iBlue );
write_byte( iAlpha );
message_end();
}