1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\damagefeedback_shared;
7 #using scripts\shared\scoreevents_shared;
8 #using scripts\shared\system_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\weapons\_decoy;
11 #using scripts\shared\weapons\_hacker_tool;
12 #using scripts\shared\weapons\_weaponobjects;
14 #insert scripts\shared\clientfields.gsh;
15 #insert scripts\shared\shared.gsh;
17 #define SENSOR_GRENADE_LASER_DISTANCE_SQ 750 * 750
18 #define SENSOR_GRENADE_TRACK_TIME 10000
20 #namespace sensor_grenade;
35 watcher.headicon =
false;
40 watcher.onDamage =&watchsensorGrenadeDamage;
42 watcher.enemyDestroy =
true;
51 self endon(
"death" );
55 self SetOwner( player );
56 self SetTeam( player.team );
59 self PlayLoopSound (
"wpn_sensor_nade_lp" );
63 player AddWeaponStat(
self.weapon,
"used", 1 );
73 self endon(
"death" );
74 self endon(
"hacked" );
75 self endon(
"explode" );
76 owner endon(
"death" );
77 owner endon(
"disconnect" );
79 self waittill(
"stationary" );
86 self endon(
"hacked" );
87 self endon(
"delete" );
88 owner endon(
"death" );
89 owner endon(
"disconnect" );
91 self waittill(
"explode", origin );
98 if ( isdefined (
self.owner ) ==
false )
101 players = level.players;
102 foreach( player
in level.players )
106 if ( ! ( player hasPerk (
"specialty_nomotionsensor") ) &&
111 trace = bullettrace( origin, player.origin + (0,0,12),
false, player );
112 if (
trace[
"fraction"] == 1 )
124 if ( !isdefined(
self.sensorGrenadeData ) )
126 self.sensorGrenadeData = [];
129 if ( !isdefined(
self.sensorGrenadeData[victim.clientid] ) )
131 self.sensorGrenadeData[victim.clientid] = getTime();
137 playerTracked =
false;
138 if ( isdefined (
self.sensorGrenadeData ) && isdefined(
self.sensorGrenadeData[player.clientid] ) )
142 playerTracked =
true;
145 return playerTracked;
154 if ( !isdefined( weapon ) || !weapon.isEmp )
156 PlayFX( level._equipment_explode_fx,
self.origin );
159 if ( isdefined( attacker ) )
168 PlaySoundAtPosition (
"wpn_sensor_nade_explo",
self.origin );
178 self endon(
"death" );
179 self endon(
"hacked" );
181 self SetCanDamage(
true );
186 self.damageTaken = 0;
191 self.maxhealth = 100000;
192 self.health =
self.maxhealth;
194 self waittill(
"damage",
damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
196 if( !isdefined( attacker ) || !isplayer( attacker ) )
199 if ( level.teambased && IsPlayer( attacker ) )
202 if( !level.hardcoreMode &&
self.owner.team == attacker.pers[
"team"] &&
self.owner != attacker )
212 if ( watcher.stunTime > 0 && weapon.doStun )
217 if ( weapon.doDamageFeedback )
220 if ( level.teambased &&
self.owner.team != attacker.team )
226 else if ( !level.teambased &&
self.owner != attacker )
233 if ( type ==
"MOD_MELEE" || weapon.isEmp || weapon.destroysEquipment )
235 self.damageTaken = damageMax;
242 if(
self.damageTaken >= damageMax )
256 #define DECOY_SPAWN_RADIUS 240
258 #define DECOY_SPAWN_DISTANCE 240
259 #define DECOY_SPAWN_LIFETIME 15
263 self waittill(
"stationary" );
265 players = level.players;
266 foreach( player
in level.players )
270 if ( IsAlive(player) && player hasPerk (
"specialty_decoy") )
291 decoy_grenade =
sys::Spawn(
"script_model", origin );
292 decoy_grenade.angles = -1 *
self.angles;
295 decoy_grenade.initial_velocity = -1 *
self GetVelocity();
301 decoy_grenade notify(
"done");
302 decoy_grenade notify(
"death_before_explode");
304 decoy_grenade
delete();