mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-09 10:27:51 -05:00
241 lines
8.6 KiB
Plaintext
241 lines
8.6 KiB
Plaintext
#include maps/mp/_scoreevents;
|
|
#include maps/mp/_challenges;
|
|
#include maps/mp/gametypes/_weaponobjects;
|
|
#include common_scripts/utility;
|
|
#include maps/mp/_utility;
|
|
|
|
init()
|
|
{
|
|
precacheshader( "gfx_fxt_fx_screen_droplets_02" );
|
|
precacherumble( "proximity_grenade" );
|
|
precacheitem( "proximity_grenade_aoe_mp" );
|
|
level._effect[ "prox_grenade_friendly_default" ] = loadfx( "weapon/grenade/fx_prox_grenade_scan_grn" );
|
|
level._effect[ "prox_grenade_friendly_warning" ] = loadfx( "weapon/grenade/fx_prox_grenade_wrn_grn" );
|
|
level._effect[ "prox_grenade_enemy_default" ] = loadfx( "weapon/grenade/fx_prox_grenade_scan_red" );
|
|
level._effect[ "prox_grenade_enemy_warning" ] = loadfx( "weapon/grenade/fx_prox_grenade_wrn_red" );
|
|
level._effect[ "prox_grenade_player_shock" ] = loadfx( "weapon/grenade/fx_prox_grenade_impact_player_spwner" );
|
|
level.proximitygrenadedetectionradius = weapons_get_dvar_int( "scr_proximityGrenadeDetectionRadius", "150" );
|
|
level.proximitygrenadegraceperiod = weapons_get_dvar( "scr_proximityGrenadeGracePeriod", 0,1 );
|
|
level.proximitygrenadedamageradius = weapons_get_dvar_int( "scr_proximityGrenadeDamageRadius", "200" );
|
|
level.proximitygrenadedotdamageamount = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmount", "1" );
|
|
level.proximitygrenadedotdamageamounthardcore = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmountHardcore", "1" );
|
|
level.proximitygrenadedotdamagetime = weapons_get_dvar( "scr_proximityGrenadeDOTDamageTime", 0,15 );
|
|
level.proximitygrenadedotdamageinstances = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageInstances", "4" );
|
|
level.proximitygrenademaxinstances = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances", "3" );
|
|
level.proximitygrenadeeffectdebug = weapons_get_dvar_int( "scr_proximityGrenadeEffectDebug", "0" );
|
|
level.proximitygrenadeactivationtime = weapons_get_dvar( "scr_proximityGrenadeActivationTime", 0,1 );
|
|
level.poisonfxduration = 6;
|
|
/#
|
|
level thread updatedvars();
|
|
#/
|
|
}
|
|
|
|
register()
|
|
{
|
|
registerclientfield( "toplayer", "tazered", 1000, 1, "int" );
|
|
}
|
|
|
|
updatedvars()
|
|
{
|
|
while ( 1 )
|
|
{
|
|
level.proximitygrenadedetectionradius = weapons_get_dvar_int( "scr_proximityGrenadeDetectionRadius", level.proximitygrenadedetectionradius );
|
|
level.proximitygrenadegraceperiod = weapons_get_dvar( "scr_proximityGrenadeGracePeriod", level.proximitygrenadegraceperiod );
|
|
level.proximitygrenadedamageradius = weapons_get_dvar_int( "scr_proximityGrenadeDamageRadius", level.proximitygrenadedamageradius );
|
|
level.proximitygrenadedotdamageamount = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmount", level.proximitygrenadedotdamageamount );
|
|
level.proximitygrenadedotdamageamounthardcore = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageAmountHardcore", level.proximitygrenadedotdamageamounthardcore );
|
|
level.proximitygrenadedotdamagetime = weapons_get_dvar( "scr_proximityGrenadeDOTDamageTime", level.proximitygrenadedotdamagetime );
|
|
level.proximitygrenadedotdamageinstances = weapons_get_dvar_int( "scr_proximityGrenadeDOTDamageInstances", level.proximitygrenadedotdamageinstances );
|
|
level.proximitygrenademaxinstances = weapons_get_dvar_int( "scr_proximityGrenadeMaxInstances", level.proximitygrenademaxinstances );
|
|
level.proximitygrenadeeffectdebug = weapons_get_dvar_int( "scr_proximityGrenadeEffectDebug", level.proximitygrenadeeffectdebug );
|
|
level.proximitygrenadeactivationtime = weapons_get_dvar( "scr_proximityGrenadeActivationTime", level.proximitygrenadeactivationtime );
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
createproximitygrenadewatcher()
|
|
{
|
|
watcher = self maps/mp/gametypes/_weaponobjects::createproximityweaponobjectwatcher( "proximity_grenade", "proximity_grenade_mp", self.team );
|
|
watcher.watchforfire = 1;
|
|
watcher.hackable = 1;
|
|
watcher.hackertoolradius = level.equipmenthackertoolradius;
|
|
watcher.hackertooltimems = level.equipmenthackertooltimems;
|
|
watcher.headicon = 0;
|
|
watcher.reconmodel = "t6_wpn_taser_mine_world_detect";
|
|
watcher.activatefx = 1;
|
|
watcher.ownergetsassist = 1;
|
|
watcher.ignoredirection = 1;
|
|
watcher.immediatedetonation = 1;
|
|
watcher.detectiongraceperiod = level.proximitygrenadegraceperiod;
|
|
watcher.detonateradius = level.proximitygrenadedetectionradius;
|
|
watcher.stun = ::maps/mp/gametypes/_weaponobjects::weaponstun;
|
|
watcher.stuntime = 1;
|
|
watcher.detonate = ::proximitydetonate;
|
|
watcher.activationdelay = level.proximitygrenadeactivationtime;
|
|
watcher.onspawn = ::onspawnproximitygrenadeweaponobject;
|
|
}
|
|
|
|
onspawnproximitygrenadeweaponobject( watcher, owner )
|
|
{
|
|
self thread setupkillcament();
|
|
owner addweaponstat( "proximity_grenade_mp", "used", 1 );
|
|
onspawnproximityweaponobject( watcher, owner );
|
|
}
|
|
|
|
setupkillcament()
|
|
{
|
|
self endon( "death" );
|
|
self waittillnotmoving();
|
|
self.killcament = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 8 ) );
|
|
self thread cleanupkillcamentondeath();
|
|
}
|
|
|
|
cleanupkillcamentondeath()
|
|
{
|
|
self waittill( "death" );
|
|
self.killcament deleteaftertime( 3 + ( level.proximitygrenadedotdamagetime * level.proximitygrenadedotdamageinstances ) );
|
|
}
|
|
|
|
proximitydetonate( attacker, weaponname )
|
|
{
|
|
if ( isDefined( weaponname ) )
|
|
{
|
|
if ( isDefined( attacker ) )
|
|
{
|
|
if ( self.owner isenemyplayer( attacker ) )
|
|
{
|
|
attacker maps/mp/_challenges::destroyedexplosive( weaponname );
|
|
maps/mp/_scoreevents::processscoreevent( "destroyed_proxy", attacker, self.owner, weaponname );
|
|
}
|
|
}
|
|
}
|
|
maps/mp/gametypes/_weaponobjects::weapondetonate( attacker, weaponname );
|
|
}
|
|
|
|
proximitygrenadedamageplayer( eattacker, einflictor )
|
|
{
|
|
if ( !self hasperk( "specialty_proximityprotection" ) )
|
|
{
|
|
if ( !level.proximitygrenadeeffectdebug )
|
|
{
|
|
self thread damageplayerinradius( einflictor.origin, eattacker, einflictor );
|
|
}
|
|
}
|
|
}
|
|
|
|
watchproximitygrenadehitplayer( owner )
|
|
{
|
|
self endon( "death" );
|
|
self setowner( owner );
|
|
self setteam( owner.team );
|
|
while ( 1 )
|
|
{
|
|
self waittill( "grenade_bounce", pos, normal, ent, surface );
|
|
if ( isDefined( ent ) && isplayer( ent ) && surface != "riotshield" )
|
|
{
|
|
if ( level.teambased && ent.team == self.owner.team )
|
|
{
|
|
continue;
|
|
}
|
|
self proximitydetonate( self.owner, undefined );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
performhudeffects( position, distancetogrenade )
|
|
{
|
|
forwardvec = vectornormalize( anglesToForward( self.angles ) );
|
|
rightvec = vectornormalize( anglesToRight( self.angles ) );
|
|
explosionvec = vectornormalize( position - self.origin );
|
|
fdot = vectordot( explosionvec, forwardvec );
|
|
rdot = vectordot( explosionvec, rightvec );
|
|
fangle = acos( fdot );
|
|
rangle = acos( rdot );
|
|
}
|
|
|
|
damageplayerinradius( position, owner, einflictor )
|
|
{
|
|
self notify( "proximityGrenadeDamageStart" );
|
|
self endon( "proximityGrenadeDamageStart" );
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
owner endon( "disconnect" );
|
|
self thread watch_death();
|
|
if ( !isDefined( einflictor.killcament ) )
|
|
{
|
|
killcament = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 8 ) );
|
|
killcament deleteaftertime( 3 + ( level.proximitygrenadedotdamagetime * level.proximitygrenadedotdamageinstances ) );
|
|
killcament.soundmod = "taser_spike";
|
|
}
|
|
else
|
|
{
|
|
killcament = einflictor.killcament;
|
|
killcament.soundmod = "taser_spike";
|
|
}
|
|
damage = level.proximitygrenadedotdamageamount;
|
|
playfxontag( level._effect[ "prox_grenade_player_shock" ], self, "J_SpineUpper" );
|
|
if ( level.hardcoremode )
|
|
{
|
|
damage = level.proximitygrenadedotdamageamounthardcore;
|
|
}
|
|
if ( self mayapplyscreeneffect() )
|
|
{
|
|
shellshock_duration = 1,5;
|
|
self shellshock( "proximity_grenade", shellshock_duration, 0 );
|
|
self setclientfieldtoplayer( "tazered", 1 );
|
|
}
|
|
self playrumbleonentity( "proximity_grenade" );
|
|
self playsound( "wpn_taser_mine_zap" );
|
|
self setclientuivisibilityflag( "hud_visible", 0 );
|
|
i = 0;
|
|
while ( i < level.proximitygrenadedotdamageinstances )
|
|
{
|
|
wait level.proximitygrenadedotdamagetime;
|
|
/#
|
|
assert( isDefined( owner ) );
|
|
#/
|
|
/#
|
|
assert( isDefined( killcament ) );
|
|
#/
|
|
self dodamage( damage, position, owner, killcament, "none", "MOD_GAS", 0, "proximity_grenade_aoe_mp" );
|
|
i++;
|
|
}
|
|
wait 0,85;
|
|
self shellshock( "proximity_grenade_exit", 0,6, 0 );
|
|
self setclientuivisibilityflag( "hud_visible", 1 );
|
|
self setclientfieldtoplayer( "tazered", 0 );
|
|
}
|
|
|
|
deleteentonownerdeath( owner )
|
|
{
|
|
self thread deleteentontimeout();
|
|
self thread deleteentaftertime();
|
|
self endon( "delete" );
|
|
owner waittill( "death" );
|
|
self notify( "deleteSound" );
|
|
}
|
|
|
|
deleteentaftertime()
|
|
{
|
|
self endon( "delete" );
|
|
wait 10;
|
|
self notify( "deleteSound" );
|
|
}
|
|
|
|
deleteentontimeout()
|
|
{
|
|
self endon( "delete" );
|
|
self waittill( "deleteSound" );
|
|
self delete();
|
|
}
|
|
|
|
watch_death()
|
|
{
|
|
self waittill( "death" );
|
|
self stoprumble( "proximity_grenade" );
|
|
self setblur( 0, 0 );
|
|
self setclientuivisibilityflag( "hud_visible", 1 );
|
|
self setclientfieldtoplayer( "tazered", 0 );
|
|
}
|