#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 ); }