‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_sensor_grenade.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
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;
13 
14 #insert scripts\shared\clientfields.gsh;
15 #insert scripts\shared\shared.gsh;
16 
17 #define SENSOR_GRENADE_LASER_DISTANCE_SQ 750 * 750
18 #define SENSOR_GRENADE_TRACK_TIME 10000
19 
20 #namespace sensor_grenade;
21 
22 function ‪init_shared()
23 {
24  level.isplayerTrackedFunc =&‪isPlayerTracked;
26 }
27 
28 //******************************************************************
29 // *
30 // *
31 //******************************************************************
33 {
34  watcher = self ‪weaponobjects::createUseWeaponObjectWatcher( "sensor_grenade", self.team );
35  watcher.headicon = false;
36  watcher.onSpawn =&‪onSpawnSensorGrenade;
37  watcher.onDetonateCallback =&‪sensorGrenadeDestroyed;
38  watcher.onStun = &‪weaponobjects::weaponStun;
39  watcher.stunTime = 0;
40  watcher.onDamage =&watchsensorGrenadeDamage;
41 
42  watcher.enemyDestroy = true;
43 }
44 
45 //******************************************************************
46 // *
47 // *
48 //******************************************************************
49 function ‪onSpawnSensorGrenade( watcher, player ) // self == sensor sensor
50 {
51  self endon( "death" );
52 
53  self thread ‪weaponobjects::onSpawnUseWeaponObject( watcher, player );
54 
55  self SetOwner( player );
56  self SetTeam( player.team );
57  self.owner = player;
58 
59  self PlayLoopSound ( "wpn_sensor_nade_lp" );
60 
61  self ‪hacker_tool::registerWithHackerTool( level.equipmentHackerToolRadius, level.equipmentHackerToolTimeMs );
62 
63  player AddWeaponStat( self.weapon, "used", 1 );
64 
65  self thread ‪watchForStationary( player );
66  self thread ‪watchForExplode( player );
67 
68  self thread ‪watch_for_decoys( player );
69 }
70 
71 function ‪watchForStationary( owner )
72 {
73  self endon( "death" );
74  self endon( "hacked" );
75  self endon( "explode" );
76  owner endon( "death" );
77  owner endon( "disconnect" );
78 
79  self waittill("stationary" );
80 
81  ‪checkForTracking( self.origin );
82 }
83 
84 function ‪watchForExplode( owner )
85 {
86  self endon( "hacked" );
87  self endon( "delete" );
88  owner endon( "death" );
89  owner endon( "disconnect" );
90 
91  self waittill( "explode", origin );
92 
93  ‪checkForTracking( origin + ( 0,0,1) );
94 }
95 
96 function ‪checkForTracking( origin )
97 {
98  if ( isdefined ( self.owner ) == false )
99  return;
100 
101  players = level.players;
102  foreach( player in level.players )
103  {
104  if ( player ‪util::IsEnemyPlayer( self.owner ) )
105  {
106  if ( ! ( player hasPerk ("specialty_nomotionsensor") ) &&
107  ! ( player hasPerk ("specialty_sengrenjammer") && player ‪clientfield::get( ‪CLIENT_FIELD_FLAG_SG_JAMMER_ACTIVE ) ) )
108  {
109  if ( DistanceSquared( player.origin, origin ) < ‪SENSOR_GRENADE_LASER_DISTANCE_SQ )
110  {
111  ‪trace = bullettrace( origin, player.origin + (0,0,12), false, player );
112  if ( ‪trace["fraction"] == 1 )
113  {
114  self.owner ‪trackSensorGrenadeVictim( player );
115  }
116  }
117  }
118  }
119  }
120 }
121 
122 function ‪trackSensorGrenadeVictim( victim )
123 {
124  if ( !isdefined( self.sensorGrenadeData ) )
125  {
126  self.sensorGrenadeData = [];
127  }
128 
129  if ( !isdefined( self.sensorGrenadeData[victim.clientid] ) )
130  {
131  self.sensorGrenadeData[victim.clientid] = getTime();
132  }
133 }
134 
135 function ‪isPlayerTracked( player, time )
136 {
137  playerTracked = false;
138  if ( isdefined ( self.sensorGrenadeData ) && isdefined( self.sensorGrenadeData[player.clientid] ) )
139  {
140  if ( self.sensorGrenadeData[player.clientid] + ‪SENSOR_GRENADE_TRACK_TIME > time )
141  {
142  playerTracked = true;
143  }
144  }
145  return playerTracked;
146 }
147 
148 //******************************************************************
149 // *
150 // *
151 //******************************************************************
152 function ‪sensorGrenadeDestroyed( attacker, weapon, target )
153 {
154  if ( !isdefined( weapon ) || !weapon.isEmp )
155  {
156  PlayFX( level._equipment_explode_fx, self.origin );
157  }
158 
159  if ( isdefined( attacker ) )
160  {
161  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
162  {
163  attacker ‪challenges::destroyedEquipment( weapon );
164  ‪scoreevents::processScoreEvent( "destroyed_motion_sensor", attacker, self.owner, weapon );
165  }
166  }
167 
168  PlaySoundAtPosition ( "wpn_sensor_nade_explo", self.origin );
169  self delete();
170 }
171 
172 //******************************************************************
173 // *
174 // *
175 //******************************************************************
176 function ‪watchSensorGrenadeDamage( watcher ) // self == sensor grenade
177 {
178  self endon( "death" );
179  self endon( "hacked" );
180 
181  self SetCanDamage( true );
182  damageMax = 1;
183 
184  if ( !self ‪util::isHacked() )
185  {
186  self.damageTaken = 0;
187  }
188 
189  while( true )
190  {
191  self.maxhealth = 100000;
192  self.health = self.maxhealth;
193 
194  self waittill( "damage", ‪damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
195 
196  if( !isdefined( attacker ) || !isplayer( attacker ) )
197  continue;
198 
199  if ( level.teambased && IsPlayer( attacker ) )
200  {
201  // if we're not hardcore and the team is the same, do not destroy
202  if( !level.hardcoreMode && self.owner.team == attacker.pers["team"] && self.owner != attacker )
203  {
204  continue;
205  }
206  }
207 
208  // most equipment should be flash/concussion-able, so it'll disable for a short period of time
209  // check to see if the equipment has been flashed/concussed and disable it (checking damage < 5 is a bad idea, so check the weapon name)
210  // we're currently allowing the owner/teammate to flash their own
211  // do damage feedback
212  if ( watcher.stunTime > 0 && weapon.doStun )
213  {
214  self thread ‪weaponobjects::stunStart( watcher, watcher.stunTime );
215  }
216 
217  if ( weapon.doDamageFeedback )
218  {
219  // if we're not on the same team then show damage feedback
220  if ( level.teambased && self.owner.team != attacker.team )
221  {
222  if ( ‪damagefeedback::doDamageFeedback( weapon, attacker ) )
223  attacker ‪damagefeedback::update();
224  }
225  // for ffa just make sure the owner isn't the same
226  else if ( !level.teambased && self.owner != attacker )
227  {
228  if ( ‪damagefeedback::doDamageFeedback( weapon, attacker ) )
229  attacker ‪damagefeedback::update();
230  }
231  }
232 
233  if ( type == "MOD_MELEE" || weapon.isEmp || weapon.destroysEquipment )
234  {
235  self.damageTaken = damageMax;
236  }
237  else
238  {
239  self.damageTaken += ‪damage;
240  }
241 
242  if( self.damageTaken >= damageMax )
243  {
244  watcher thread ‪weaponobjects::waitAndDetonate( self, 0.0, attacker, weapon );
245  return;
246  }
247  }
248 }
249 
250 
251 //******************************************************************
252 // *
253 // *
254 //******************************************************************
255 
256 #define DECOY_SPAWN_RADIUS 240
257 
258 #define DECOY_SPAWN_DISTANCE 240
259 #define DECOY_SPAWN_LIFETIME 15
260 
261 function ‪watch_for_decoys( owner )
262 {
263  self waittill("stationary" );
264 
265  players = level.players;
266  foreach( player in level.players )
267  {
268  if ( player ‪util::IsEnemyPlayer( self.owner ) )
269  {
270  if ( IsAlive(player) && player hasPerk ("specialty_decoy") )
271  {
272  if ( DistanceSquared( player.origin, self.origin ) < ‪DECOY_SPAWN_RADIUS * ‪DECOY_SPAWN_RADIUS )
273  {
274  player thread ‪watch_decoy( self );
275  }
276  }
277  }
278  }
279 
280 }
281 
283 {
284  // this needs to be much more intelligent
285  return self.origin - ‪DECOY_SPAWN_DISTANCE * AnglesToForward(self.angles);
286 }
287 
288 function ‪watch_decoy( sensor_grenade )
289 {
290  origin = self ‪get_decoy_spawn_loc();
291  decoy_grenade = ‪sys::Spawn( "script_model", origin );
292  decoy_grenade.angles = -1 * self.angles;
294 
295  decoy_grenade.initial_velocity = -1 * self GetVelocity();
296 
297  decoy_grenade thread ‪decoy::simulate_weapon_fire(self);
298 
300 
301  decoy_grenade notify( "done");
302  decoy_grenade notify( "death_before_explode");
303 
304  decoy_grenade delete();
305 }
306 
307 
308 
309 
310 
‪registerWithHackerTool
‪function registerWithHackerTool(radius, hackTimeMs)
Definition: _hacker_tool.gsc:944
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪onSpawnUseWeaponObject
‪function onSpawnUseWeaponObject(watcher, owner)
Definition: _weaponobjects.gsc:1597
‪weaponStun
‪function weaponStun()
Definition: _weaponobjects.gsc:1128
‪destroyedEquipment
‪function destroyedEquipment(weapon)
Definition: challenges_shared.gsc:43
‪watch_for_decoys
‪function watch_for_decoys(owner)
Definition: _sensor_grenade.gsc:261
‪get_decoy_spawn_loc
‪function get_decoy_spawn_loc()
Definition: _sensor_grenade.gsc:282
‪init_shared
‪function init_shared()
Definition: _sensor_grenade.gsc:22
‪DECOY_SPAWN_RADIUS
‪#define DECOY_SPAWN_RADIUS
Definition: _sensor_grenade.gsc:256
‪watch_decoy
‪function watch_decoy(sensor_grenade)
Definition: _sensor_grenade.gsc:288
‪isPlayerTracked
‪function isPlayerTracked(player, time)
Definition: _sensor_grenade.gsc:135
‪watchSensorGrenadeDamage
‪function watchSensorGrenadeDamage(watcher)
Definition: _sensor_grenade.gsc:176
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪simulate_weapon_fire
‪function simulate_weapon_fire(owner)
Definition: _decoy.gsc:123
‪SENSOR_GRENADE_LASER_DISTANCE_SQ
‪#define SENSOR_GRENADE_LASER_DISTANCE_SQ
Definition: _sensor_grenade.gsc:17
‪waitAndDetonate
‪function waitAndDetonate(object, delay, attacker, weapon)
Definition: _weaponobjects.gsc:615
‪sensorGrenadeDestroyed
‪function sensorGrenadeDestroyed(attacker, weapon, target)
Definition: _sensor_grenade.gsc:152
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪SENSOR_GRENADE_TRACK_TIME
‪#define SENSOR_GRENADE_TRACK_TIME
Definition: _sensor_grenade.gsc:18
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪onSpawnSensorGrenade
‪function onSpawnSensorGrenade(watcher, player)
Definition: _sensor_grenade.gsc:49
‪createSensorGrenadeWatcher
‪function createSensorGrenadeWatcher()
Definition: _sensor_grenade.gsc:32
‪checkForTracking
‪function checkForTracking(origin)
Definition: _sensor_grenade.gsc:96
‪doDamageFeedback
‪function doDamageFeedback(weapon, eInflictor, iDamage, sMeansOfDeath)
Definition: damagefeedback_shared.gsc:423
‪add_weapon_watcher
‪function add_weapon_watcher(callback)
Definition: callbacks_shared.gsc:609
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪trackSensorGrenadeVictim
‪function trackSensorGrenadeVictim(victim)
Definition: _sensor_grenade.gsc:122
‪DECOY_SPAWN_DISTANCE
‪#define DECOY_SPAWN_DISTANCE
Definition: _sensor_grenade.gsc:258
‪watchForStationary
‪function watchForStationary(owner)
Definition: _sensor_grenade.gsc:71
‪createUseWeaponObjectWatcher
‪function createUseWeaponObjectWatcher(weaponname, ownerTeam)
Definition: _weaponobjects.gsc:1297
‪update
‪function update()
Definition: _serversettings.gsc:71
‪stunStart
‪function stunStart(watcher, time)
Definition: _weaponobjects.gsc:1077
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪CLIENT_FIELD_FLAG_SG_JAMMER_ACTIVE
‪#define CLIENT_FIELD_FLAG_SG_JAMMER_ACTIVE
Definition: clientfields.gsh:12
‪watchForExplode
‪function watchForExplode(owner)
Definition: _sensor_grenade.gsc:84
‪DECOY_SPAWN_LIFETIME
‪#define DECOY_SPAWN_LIFETIME
Definition: _sensor_grenade.gsc:259
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265