Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#pragma semicolon 1
#define PLUGIN "GasNades"
#define AUTHOR "ConnorMcLeod"
#define VERSION "2.0.0b_HosFix"
#define GASP_SOUND1 "player/gasp1.wav"
#define GASP_SOUND2 "player/gasp2.wav"
#define PEV_PDATA_SAFE 2
#define MAX_PLAYERS 32
#define m_bitsDamageType 76 // VEN
#define OFFSET_TEAM 114
#define fm_get_user_team(%1) get_pdata_int(%1,OFFSET_TEAM)
#define write_coord_f(%1) engfunc(EngFunc_WriteCoord, %1)
#define GASNADE_HURT -666
#define GASNADE_HEAL -777
new g_pCvarRadius, g_pCvarCheckTime, g_pCvarDmg, g_pCvarDmgHeal, g_pCvarFF, g_pCvarLife, g_pCvarGasp,
g_pCvarRestore, g_pCvarEnabled;
new mp_friendlyfire;
new g_iMaxPlayers;
new g_iHealer;
new Float:g_fLastHurt[MAX_PLAYERS+1];
new Float:g_fDmgToRestore[MAX_PLAYERS+1];
//new g_iForwardEmitSound;
new HamHook:g_iHamTouch, HamHook:g_iHamThink;
//native knife_only_on(id);
new g_szSmokeSprite_red, g_szSmokeSprite_blue;
#define FIRST_THINK 39546
#define FIRST_TOUCH 23921
new const g_szClassname[] = "colored_smokenade";
public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR );
register_cvar("gasnade", VERSION, FCVAR_SERVER);
g_pCvarEnabled = register_cvar("amx_gasnades", "1");
g_pCvarDmg = register_cvar("amx_gasdmg", "30");
g_pCvarDmgHeal = register_cvar("amx_gas_heal", "10");
g_pCvarRadius = register_cvar("amx_gasradius", "160");
g_pCvarCheckTime = register_cvar("amx_gascheck", "2");
g_pCvarFF = register_cvar("amx_gasobeyFF", "1");
g_pCvarLife = register_cvar("amx_gaslife", "25");
g_pCvarGasp = register_cvar("amx_smokegasp", "1");
g_pCvarRestore = register_cvar("amx_gas_restore", "0");
register_event("HLTV", "Event_HLTV_NewRound", "a", "1=0", "2=0");
g_iMaxPlayers = get_maxplayers();
mp_friendlyfire = get_cvar_pointer("mp_friendlyfire");
Event_HLTV_NewRound();
register_touch( "grenade", "worldspawn", "FwdTouch_Grenade" );
// register_touch( g_szClassname, "worldspawn", "FwdTouch_FakeSmoke" );
register_think( g_szClassname, "FwdThink_FakeSmoke" );
}
public plugin_precache()
{
precache_sound(GASP_SOUND1);
precache_sound(GASP_SOUND2);
g_szSmokeSprite_red = precache_model("sprites/gas_puff_01r.spr" );
g_szSmokeSprite_blue = precache_model("sprites/gas_puff_01b.spr" );
}
public plugin_pause()
{
new iEnt = FM_NULLENT;
while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "trigger_hurt")) > 0 )
{
if( pev(iEnt, pev_iuser1) == GASNADE_HURT )
engfunc(EngFunc_RemoveEntity, iEnt);
}
Healer(0);
}
public Event_HLTV_NewRound()
{
new iEnt = FM_NULLENT;
while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "trigger_hurt")) > 0 )
{
if( pev(iEnt, pev_iuser1) == GASNADE_HURT )
engfunc(EngFunc_RemoveEntity, iEnt);
}
for(new id=1; id<=g_iMaxPlayers; id++)
{
g_fLastHurt[id] = g_fDmgToRestore[id] = 0.0;
}
if( get_pcvar_num(g_pCvarEnabled) )
{
/* if( !g_iForwardEmitSound )
{
g_iForwardEmitSound = register_forward(FM_EmitSound, "EmitSound");
}*/
if( g_iHamTouch )
{
EnableHamForward(g_iHamTouch);
}
else
{
g_iHamTouch = RegisterHam(Ham_Touch, "trigger_hurt", "HurtTouch");
}
if( g_iHamThink )
{
EnableHamForward(g_iHamThink);
}
else
{
g_iHamThink = RegisterHam(Ham_Think, "trigger_hurt", "HurtThink");
}
Healer(get_pcvar_num(g_pCvarRestore) ? 1 : 0);
}
else
{/*
if( g_iForwardEmitSound )
{
unregister_forward(FM_EmitSound, g_iForwardEmitSound);
g_iForwardEmitSound = 0;
}*/
if( g_iHamTouch )
{
DisableHamForward(g_iHamTouch);
}
if( g_iHamThink )
{
DisableHamForward(g_iHamThink);
}
Healer(0);
}
}
public EmitSound(iEntity, iChannel, const szSample[], Float:fVol, Float:fAttn, iFlags, iPitch)
{
if( !equal(szSample, "weapons/sg_explode.wav") )
return;
new iEnt = engfunc( EngFunc_CreateNamedEntity , engfunc( EngFunc_AllocString, "trigger_hurt") );
dllfunc(DLLFunc_Spawn, iEnt);
new Float:fRadius = get_pcvar_float(g_pCvarRadius);
new Float:fMins[3], Float:fMaxs[3];
for(new i; i<3; i++)
{
fMins[i] = -fRadius;
fMaxs[i] = fRadius;
}
engfunc(EngFunc_SetSize , iEnt , fMins , fMaxs );
new Float:fOrigin[3];
pev(iEntity, pev_origin, fOrigin);
engfunc(EngFunc_SetOrigin, iEnt, fOrigin);
set_pev(iEnt, pev_dmg, get_pcvar_float(g_pCvarDmg));
set_pev(iEnt, pev_iuser1, GASNADE_HURT);
new iOwner = pev(iEntity, pev_owner);
if( pev_valid(iOwner) == PEV_PDATA_SAFE )
{
set_pev(iEnt, pev_iuser2, fm_get_user_team(iOwner));
set_pev(iEnt, pev_owner, iOwner);
}
set_pev(iEnt, pev_nextthink, get_gametime() + get_pcvar_float(g_pCvarLife));
}
public HurtThink(iEnt)
{
if( pev(iEnt, pev_iuser1) == GASNADE_HURT )
{
engfunc(EngFunc_RemoveEntity, iEnt);
}
}
public HurtTouch(iEnt, id)
{
new iPod;
iPod = pev(iEnt, pev_iuser1);
if( iPod != GASNADE_HURT && iPod != GASNADE_HEAL )
{
return HAM_IGNORED;
}
if( !(1 <= id <= g_iMaxPlayers) )
{
return HAM_SUPERCEDE;
}
new iOwner = pev(iEnt, pev_owner);
if( iPod == GASNADE_HURT && get_pcvar_num(g_pCvarFF) && !get_pcvar_num(mp_friendlyfire) &&
pev(iEnt, pev_iuser2) == fm_get_user_team(id) )
{
return HAM_SUPERCEDE;
}
// if(knife_only_on(id))
// {
// return HAM_SUPERCEDE;
// }
if(pev(iEnt, pev_iuser2) == iOwner )
{
return HAM_SUPERCEDE;
}
static Float:flTime, Float:flDmgTime;
flTime = get_gametime();
pev(iEnt, pev_dmgtime, flDmgTime);
if( flDmgTime > flTime )
{
static Float:flPainFinished;
pev(iEnt, pev_pain_finished, flPainFinished);
if( flTime != flPainFinished )
{
static iImpulse;
iImpulse = pev(iEnt, pev_impulse);
if ( iImpulse & (1<<(id-1)) )
return HAM_SUPERCEDE;
set_pev(iEnt, pev_impulse, iImpulse | (1<<(id-1)));
}
}
else
{
set_pev(iEnt, pev_impulse, (1<<(id-1)));
}
static Float:flDmg, Float:flCheckTime;
pev(iEnt, pev_dmg, flDmg);
flCheckTime = get_pcvar_float(g_pCvarCheckTime);
if( iPod == GASNADE_HURT )
{
TakeDamage(id, iEnt, iOwner, flDmg, DMG_SLOWFREEZE);
g_fDmgToRestore[id] += flDmg;
if(get_pcvar_num(g_pCvarGasp))
{
switch (random_num(1, 2))
{
case 1: emit_sound(id, CHAN_VOICE, GASP_SOUND1, 1.0, ATTN_NORM, 0, PITCH_NORM);
case 2: emit_sound(id, CHAN_VOICE, GASP_SOUND2, 1.0, ATTN_NORM, 0, PITCH_NORM);
}
}
g_fLastHurt[id] = flTime;
}
else
{
if( flTime - g_fLastHurt[id] > flCheckTime && g_fDmgToRestore[id])
{
if( g_fDmgToRestore[id] < flDmg )
{
flDmg = g_fDmgToRestore[id];
}
g_fDmgToRestore[id] -= flDmg;
TakeHealth(id, flDmg);
}
}
set_pev(iEnt, pev_pain_finished, flTime);
set_pev(iEnt, pev_dmgtime, flTime + flCheckTime);
return HAM_SUPERCEDE;
}
Healer(iStatus)
{
if( iStatus )
{
if( !pev_valid(g_iHealer) )
{
g_iHealer = engfunc( EngFunc_CreateNamedEntity , engfunc( EngFunc_AllocString, "trigger_hurt") );
dllfunc(DLLFunc_Spawn, g_iHealer);
engfunc(EngFunc_SetSize , g_iHealer , Float:{-4096.0, -4096.0, -4096.0} , Float:{4096.0, 4096.0, 4096.0} );
set_pev(g_iHealer, pev_iuser1, GASNADE_HEAL);
}
set_pev(g_iHealer, pev_dmg, get_pcvar_float(g_pCvarDmgHeal));
}
else
{
if( pev_valid(g_iHealer) )
{
engfunc(EngFunc_RemoveEntity, g_iHealer);
g_iHealer = FM_NULLENT;
}
}
}
TakeHealth(id, Float:flDmg)
{
new Float:flHealth, Float:flMaxHealth;
pev(id, pev_health, flHealth);
pev(id, pev_max_health, flMaxHealth);
if( flMaxHealth <= flHealth )
return;
flHealth += flDmg;
if( flHealth > flMaxHealth )
flHealth = flMaxHealth;
set_pev(id, pev_health, flHealth);
}
TakeDamage(id, iEnt, iAttacker, Float:flDmg, iDmgBit)
{
if(!is_user_connected(id) || !is_user_connected(iAttacker) )
return PLUGIN_CONTINUE;
// new Float:dmg = get_pcvar_float(g_pCvarDmg);
new Float:flHealth;
pev(id, pev_health, flHealth);
flHealth -= flDmg;
if( flHealth < 1 )
{
// ExecuteHamB( Ham_Killed, id, iAttacker, 0 );
ExecuteHam( Ham_Killed, id, iAttacker, 0 );
return PLUGIN_CONTINUE;
}
set_pev(id, pev_health, flHealth);
set_pev(id, pev_dmg_take, flDmg);
set_pdata_int(id, m_bitsDamageType, iDmgBit);
set_pev(id, pev_dmg_inflictor, iEnt);
return PLUGIN_CONTINUE;
}
public FwdTouch_Grenade( iEntity, iWorld ) {
static const szSmoke[] = "models/w_smokegrenade.mdl";
static szModel[ 26 ];
entity_get_string( iEntity, EV_SZ_model, szModel, charsmax( szModel ) );
if( equali( szModel, szSmoke ) ) {
static Float:vVelocity[ 3 ];
entity_get_vector( iEntity, EV_VEC_velocity, vVelocity );
if( vector_length( vVelocity ) <= 200.0 ) {
new iFake = create_entity( "info_target" );
// If created smoke is not valid, let cs explode standart 1 then...
if( !is_valid_ent( iFake ) )
return PLUGIN_CONTINUE;
entity_set_string( iFake, EV_SZ_classname, g_szClassname );
entity_set_edict( iFake, EV_ENT_owner, entity_get_edict( iEntity, EV_ENT_owner ) );
entity_set_int( iFake, EV_INT_movetype, MOVETYPE_BOUNCE );
entity_set_int( iFake, EV_INT_solid, SOLID_NOT );
new Float:vOrigin[ 3 ], Float:vAngles[ 3 ];
entity_get_vector( iEntity, EV_VEC_origin, vOrigin );
entity_get_vector( iEntity, EV_VEC_angles, vAngles );
entity_set_vector( iFake, EV_VEC_origin, vOrigin );
vVelocity[ 2 ] += 150.0;
entity_set_vector( iFake, EV_VEC_velocity, vVelocity );
entity_set_vector( iFake, EV_VEC_angles, vAngles );
entity_set_int( iFake, EV_INT_fixangle, 1 );
entity_set_model( iFake, szModel );
entity_set_int( iFake, EV_INT_iuser3, FIRST_TOUCH );
entity_set_int( iFake, EV_INT_iuser4, FIRST_THINK );
entity_set_float( iFake, EV_FL_nextthink, get_gametime( ) + 0.6 );
// Delete Original Smoke
entity_set_int( iEntity, EV_INT_flags, FL_KILLME );
// Detonate Smoke
emit_sound( iFake, CHAN_WEAPON, "weapons/sg_explode.wav", 1.0, ATTN_NORM, 0, PITCH_NORM );
new iOrigin[ 3 ];
FVecIVec( vOrigin, iOrigin );
go_damage(iFake);
new iOwner = pev(iEntity, pev_owner);
new sprite_team = fm_get_user_team(iOwner) ? g_szSmokeSprite_red : g_szSmokeSprite_blue; ////
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_FIREFIELD );
write_coord( iOrigin[ 0 ] );
write_coord( iOrigin[ 1 ] );
write_coord( iOrigin[ 2 ] + 50 );
write_short( 100 );
write_short( sprite_team );
write_byte( 100 );
write_byte( TEFIRE_FLAG_ALPHA );
write_byte( 1000 );
message_end();
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_FIREFIELD );
write_coord( iOrigin[ 0 ] );
write_coord( iOrigin[ 1 ] );
write_coord( iOrigin[ 2 ] + 50 );
write_short( 150 );
write_short( sprite_team );
write_byte( 10 );
write_byte( TEFIRE_FLAG_ALLFLOAT | TEFIRE_FLAG_ALPHA );
write_byte( 1000 );
message_end( );
}
}
return PLUGIN_CONTINUE;
}
public go_damage(iEntity)
{
new iEnt = engfunc( EngFunc_CreateNamedEntity , engfunc( EngFunc_AllocString, "trigger_hurt") );
dllfunc(DLLFunc_Spawn, iEnt);
new Float:fRadius = get_pcvar_float(g_pCvarRadius);
new Float:fMins[3], Float:fMaxs[3];
for(new i; i<3; i++)
{
fMins[i] = -fRadius;
fMaxs[i] = fRadius;
}
engfunc(EngFunc_SetSize , iEnt , fMins , fMaxs );
new Float:fOrigin[3];
pev(iEntity, pev_origin, fOrigin);
engfunc(EngFunc_SetOrigin, iEnt, fOrigin);
set_pev(iEnt, pev_dmg, get_pcvar_float(g_pCvarDmg));
set_pev(iEnt, pev_iuser1, GASNADE_HURT);
new iOwner = pev(iEntity, pev_owner);
if( pev_valid(iOwner) == PEV_PDATA_SAFE )
{
set_pev(iEnt, pev_iuser2, fm_get_user_team(iOwner));
set_pev(iEnt, pev_owner, iOwner);
}
set_pev(iEnt, pev_nextthink, get_gametime() + get_pcvar_float(g_pCvarLife));
}
public FwdTouch_FakeSmoke( iEntity, iWorld ) {
if( !is_valid_ent( iEntity ) )
return PLUGIN_CONTINUE;
if( entity_get_int( iEntity, EV_INT_iuser3 ) == FIRST_TOUCH ) {
// Touch sound
emit_sound( iEntity, CHAN_WEAPON, "weapons/grenade_hit1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM );
entity_set_int( iEntity, EV_INT_iuser3, 0 );
}
return PLUGIN_CONTINUE;
}
public FwdThink_FakeSmoke( iEntity ) {
if( !is_valid_ent( iEntity ) )
return PLUGIN_CONTINUE;
if( entity_get_int( iEntity, EV_INT_iuser4 ) == FIRST_THINK ) {
entity_set_int( iEntity, EV_INT_iuser4, 0 );
entity_set_int( iEntity, EV_INT_movetype, MOVETYPE_TOSS );
entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + 21.0 );
} else
remove_entity( iEntity );
return PLUGIN_CONTINUE;
}