‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_threat_detector.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\_hacker_tool;
11 #using scripts\shared\weapons\_weaponobjects;
12 
13 #insert scripts\shared\clientfields.gsh;
14 #insert scripts\shared\shared.gsh;
15 
16 #insert scripts\shared\version.gsh;
17 
18 #namespace threat_detector;
19 
20 
21 ‪REGISTER_SYSTEM( "threat_detector", &‪__init__, undefined )
22 
23 function ‪__init__()
24 {
25  ‪clientfield::register( "missile", "threat_detector", ‪VERSION_SHIP, 1, "int" );
27 }
28 
30 {
31  watcher = self ‪weaponobjects::createUseWeaponObjectWatcher( "threat_detector", self.team );
32  watcher.headicon = false;
33  watcher.onSpawn =&‪onSpawnThreatDetector;
34  watcher.onDetonateCallback =&‪threatDetectorDestroyed;
35  watcher.stun = &‪weaponobjects::weaponStun;
36  watcher.stunTime = 0;
37  watcher.onDamage =&‪watchThreatDetectorDamage;
38 
39  watcher.enemyDestroy = true;
40 }
41 
42 function ‪onSpawnThreatDetector( watcher, player )
43 {
44  self endon( "death" );
45 
46  self thread ‪weaponobjects::onSpawnUseWeaponObject( watcher, player );
47 
48  self SetOwner( player );
49  self SetTeam( player.team );
50  self.owner = player;
51 
52  self PlayLoopSound( "wpn_sensor_nade_lp" );
53  self ‪hacker_tool::registerWithHackerTool( level.equipmentHackerToolRadius, level.equipmentHackerToolTimeMs );
54 
55  player AddWeaponStat( self.weapon, "used", 1 );
56 
57  self thread ‪watchForStationary( player );
58 }
59 
60 function ‪watchForStationary( owner )
61 {
62  self endon( "death" );
63  self endon( "hacked" );
64  self endon( "explode" );
65  owner endon( "death" );
66  owner endon( "disconnect" );
67 
68  self waittill("stationary" );
69  self ‪clientfield::set( "threat_detector", 1 );
70 }
71 
72 function ‪trackSensorGrenadeVictim( victim )
73 {
74  if( !isdefined( self.sensorGrenadeData ) )
75  {
76  self.sensorGrenadeData = [];
77  }
78 
79  if ( !isdefined( self.sensorGrenadeData[victim.clientid] ) )
80  {
81  self.sensorGrenadeData[victim.clientid] = getTime();
82  }
83 
84  self ‪clientfield::set_to_player( "threat_detected", 1 );
85 }
86 
87 //******************************************************************
88 // *
89 // *
90 //******************************************************************
91 function ‪threatDetectorDestroyed( attacker, weapon, target )
92 {
93  if ( !isdefined( weapon ) || !weapon.isEmp )
94  {
95  PlayFX( level._equipment_explode_fx, self.origin );
96  }
97 
98  if ( isdefined( attacker ) )
99  {
100  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
101  {
102  attacker ‪challenges::destroyedEquipment( weapon );
103  ‪scoreevents::processScoreEvent( "destroyed_motion_sensor", attacker, self.owner, weapon );
104  }
105  }
106 
107  PlaySoundAtPosition ( "wpn_sensor_nade_explo", self.origin );
108  self delete();
109 }
110 
111 //******************************************************************
112 // *
113 // *
114 //******************************************************************
115 function ‪watchThreatDetectorDamage( watcher ) // self == sensor grenade
116 {
117  self endon( "death" );
118  self endon( "hacked" );
119 
120  self SetCanDamage( true );
121  damageMax = 1;
122 
123  if ( !self ‪util::isHacked() )
124  {
125  self.damageTaken = 0;
126  }
127 
128  while( true )
129  {
130  self.maxhealth = 100000;
131  self.health = self.maxhealth;
132 
133  self waittill( "damage", ‪damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
134 
135  if( !isdefined( attacker ) || !isplayer( attacker ) )
136  continue;
137 
138  if ( level.teambased && IsPlayer( attacker ) )
139  {
140  // if we're not hardcore and the team is the same, do not destroy
141  if( !level.hardcoreMode && self.owner.team == attacker.pers["team"] && self.owner != attacker )
142  {
143  continue;
144  }
145  }
146 
147  // most equipment should be flash/concussion-able, so it'll disable for a short period of time
148  // 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)
149  // we're currently allowing the owner/teammate to flash their own
150  // do damage feedback
151  if ( watcher.stunTime > 0 && weapon.doStun )
152  {
153  self thread ‪weaponobjects::stunStart( watcher, watcher.stunTime );
154  }
155 
156  if ( weapon.doDamageFeedback )
157  {
158  // if we're not on the same team then show damage feedback
159  if ( level.teambased && self.owner.team != attacker.team )
160  {
161  if ( ‪damagefeedback::doDamageFeedback( weapon, attacker ) )
162  attacker ‪damagefeedback::update();
163  }
164  // for ffa just make sure the owner isn't the same
165  else if ( !level.teambased && self.owner != attacker )
166  {
167  if ( ‪damagefeedback::doDamageFeedback( weapon, attacker ) )
168  attacker ‪damagefeedback::update();
169  }
170  }
171 
172  if ( type == "MOD_MELEE" || weapon.isEmp )
173  {
174  self.damageTaken = damageMax;
175  }
176  else
177  {
178  self.damageTaken += ‪damage;
179  }
180 
181  if( self.damageTaken >= damageMax )
182  {
183  watcher thread ‪weaponobjects::waitAndDetonate( self, 0.0, attacker, weapon );
184  return;
185  }
186  }
187 }
‪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
‪createThreatDetectorWatcher
‪function createThreatDetectorWatcher()
Definition: _threat_detector.gsc:29
‪onSpawnThreatDetector
‪function onSpawnThreatDetector(watcher, player)
Definition: _threat_detector.gsc:42
‪destroyedEquipment
‪function destroyedEquipment(weapon)
Definition: challenges_shared.gsc:43
‪__init__
‪function __init__()
Definition: _threat_detector.gsc:23
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪trackSensorGrenadeVictim
‪function trackSensorGrenadeVictim(victim)
Definition: _threat_detector.gsc:72
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪waitAndDetonate
‪function waitAndDetonate(object, delay, attacker, weapon)
Definition: _weaponobjects.gsc:615
‪IsEnemyPlayer
‪function IsEnemyPlayer(player)
Definition: util_shared.csc:1220
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪watchForStationary
‪function watchForStationary(owner)
Definition: _threat_detector.gsc:60
‪doDamageFeedback
‪function doDamageFeedback(weapon, eInflictor, iDamage, sMeansOfDeath)
Definition: damagefeedback_shared.gsc:423
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪add_weapon_watcher
‪function add_weapon_watcher(callback)
Definition: callbacks_shared.gsc:609
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪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
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪threatDetectorDestroyed
‪function threatDetectorDestroyed(attacker, weapon, target)
Definition: _threat_detector.gsc:91
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪watchThreatDetectorDamage
‪function watchThreatDetectorDamage(watcher)
Definition: _threat_detector.gsc:115