‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_scrambler.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\challenges_shared;
5 #using scripts\shared\damagefeedback_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\shared\weapons\_weaponobjects;
9 
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\version.gsh;
12 
13 
14 #precache( "fx", "_t6/misc/fx_equip_light_red" );
15 #precache( "fx", "_t6/misc/fx_equip_light_green" );
16 
17 #namespace scrambler;
18 
19 function ‪init_shared()
20 {
21  level._effect["scrambler_enemy_light"] = "_t6/misc/fx_equip_light_red";
22  level._effect["scrambler_friendly_light"] = "_t6/misc/fx_equip_light_green";
23  level.scramblerWeapon = GetWeapon( "scrambler" );
24  level.scramblerLength = 30.0;
25 
26  // should be kept in sync with the radius in _scrambler.csc
27  level.scramblerOuterRadiusSq = 1000 * 1000;
28  level.scramblerInnerRadiusSq = 600 * 600;
29 
30  ‪clientfield::register( "missile", "scrambler", ‪VERSION_SHIP, 1, "int" );
31 }
32 
34 {
35  watcher = self ‪weaponobjects::createUseWeaponObjectWatcher( "scrambler", self.team );
36  watcher.onSpawn =&‪onSpawnScrambler;
37  watcher.onDetonateCallback =&‪scramblerDetonate;
38  watcher.onStun = &‪weaponobjects::weaponStun;
39  watcher.stunTime = 5;
40  watcher.hackable = true;
41  watcher.onDamage =&‪watchScramblerDamage;
42 }
43 
44 function ‪onSpawnScrambler( watcher, player ) // self == scrambler
45 {
46  player endon("disconnect");
47  self endon( "death" );
48 
49  self thread ‪weaponobjects::onSpawnUseWeaponObject( watcher, player );
50 
51  player.scrambler = self;
52  self SetOwner( player );
53  self SetTeam( player.team );
54  self.owner = player;
55  self ‪clientfield::set( "scrambler", 1 );
56 
57  if ( !self ‪util::isHacked() )
58  {
59  player AddWeaponStat( self.weapon, "used", 1 );
60  }
61 
62  self thread ‪watchShutdown( player );
63  level notify( "scrambler_spawn" );
64 }
65 
66 function ‪scramblerDetonate( attacker, weapon, target )
67 {
68  if ( !isdefined( weapon ) || !weapon.isEmp )
69  {
70  PlayFX( level._equipment_explode_fx, self.origin );
71  }
72 
73  if ( self.owner ‪util::IsEnemyPlayer( attacker ) )
74  {
75  attacker ‪challenges::destroyedEquipment( weapon );
76  }
77 
78  PlaySoundAtPosition ( "dst_equipment_destroy", self.origin );
79  self delete();
80 }
81 
82 function ‪watchShutdown( player )
83 {
84  self ‪util::waittill_any( "death", "hacked" );
85  level notify( "scrambler_death" );
86 
87  if ( isdefined( player ) )
88  player.scrambler = undefined;
89 }
90 
91 function ‪destroyEnt()
92 {
93  self delete();
94 }
95 
96 function ‪watchScramblerDamage( watcher ) // self == scrambler
97 {
98  self endon( "death" );
99  self endon( "hacked" );
100 
101  self SetCanDamage( true );
102  damageMax = 100;
103 
104  if ( !self ‪util::isHacked() )
105  {
106  self.damageTaken = 0;
107  }
108 
109  while( true )
110  {
111  self.maxhealth = 100000;
112  self.health = self.maxhealth;
113 
114  self waittill( "damage", ‪damage, attacker, direction, point, type, tagName, modelName, partname, weapon, iDFlags );
115 
116  if( !isdefined( attacker ) || !isplayer( attacker ) )
117  continue;
118 
119  if ( level.teamBased && attacker.team == self.owner.team && attacker != self.owner )
120  continue;
121 
122  // most equipment should be flash/concussion-able, so it'll disable for a short period of time
123  // 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)
124  // we're currently allowing the owner/teammate to flash their own
125  if ( watcher.stunTime > 0 && weapon.doStun )
126  {
127  self thread ‪weaponobjects::stunStart( watcher, watcher.stunTime );
128  }
129 
130  if ( weapon.doDamageFeedback )
131  {
132  // if we're not on the same team then show damage feedback
133  if ( level.teambased && self.owner.team != attacker.team )
134  {
135  if ( ‪damagefeedback::doDamageFeedback( weapon, attacker ) )
136  attacker ‪damagefeedback::update();
137  }
138  // for ffa just make sure the owner isn't the same
139  else if ( !level.teambased && self.owner != attacker )
140  {
141  if ( ‪damagefeedback::doDamageFeedback( weapon, attacker ) )
142  attacker ‪damagefeedback::update();
143  }
144  }
145 
146  if ( isPlayer( attacker ) && level.teambased && isdefined( attacker.team ) && self.owner.team == attacker.team && attacker != self.owner )
147  continue;
148 
149  if ( type == "MOD_MELEE" || weapon.isEmp )
150  {
151  self.damageTaken = damageMax;
152  }
153  else
154  {
155  self.damageTaken += ‪damage;
156  }
157 
158  if ( self.damageTaken >= damageMax )
159  {
160  // attacker _properks::shotEquipment( self.owner, iDFlags );
161  watcher thread ‪weaponobjects::waitAndDetonate( self, 0.0, attacker, weapon );
162  }
163  }
164 }
165 
166 function ‪ownerSameTeam( owner1, owner2 )
167 {
168  if ( !level.teamBased )
169  {
170  return false;
171  }
172 
173  if ( !isdefined( owner1 ) || !isdefined( owner2 ) )
174  {
175  return false;
176  }
177 
178  if ( !isdefined( owner1.team ) || !isdefined( owner2.team ) )
179  {
180  return false;
181  }
182 
183  return ( owner1.team == owner2.team );
184 }
185 
187 {
188  scramblers = GetEntArray( "grenade", "classname" );
189 
190  if ( isdefined( self.‪name ) && self.‪name == "scrambler" )
191  {
192  return false;
193  }
194 
195  for ( i = 0; i < scramblers.size; i++ )
196  {
197  scrambler = scramblers[i];
198 
199  if ( !IsAlive( scrambler ) )
200  {
201  continue;
202  }
203 
204  if ( !isdefined( scrambler.name ) )
205  {
206  continue;
207  }
208 
209  if ( scrambler.name != "scrambler" )
210  {
211  continue;
212  }
213 
214  if ( ‪ownerSameTeam( self.owner, scrambler.owner ) )
215  {
216  continue;
217  }
218 
219  // check is cylindrical
220  flattenedSelfOrigin = (self.origin[0], self.origin[1], 0 );
221  flattenedscramblerOrigin = (scrambler.origin[0], scrambler.origin[1], 0 );
222  if ( DistanceSquared( flattenedSelfOrigin, flattenedscramblerOrigin ) < level.scramblerOuterRadiusSq )
223  {
224  return true;
225  }
226  }
227 
228  return false;
229 }
230 
231 /*function watchScramble()//moved from _turret
232 {
233  self endon( "death" );
234  self endon( "turret_deactivated" );
235  self endon( "turret_carried" );
236 
237  if ( self scrambler::checkScramblerStun() )
238  {
239  self thread scramblerStun( true );
240  }
241 
242  for ( ;; )
243  {
244  level util::waittill_any( "scrambler_spawn", "scrambler_death", "hacked", "turret_stun_ended" );
245  WAIT_SERVER_FRAME;
246 
247  if ( self scrambler::checkScramblerStun() )
248  {
249  self thread scramblerStun( true );
250  }
251  else
252  {
253  self scramblerStun( false );
254  }
255  }
256 }*/
257 
258 /*function watchScramble( watcher )//moved from _weaponobjects
259 {
260  self endon( "death" );
261  self endon( "hacked" );
262 
263  self util::waitTillNotMoving();
264 
265  if ( self scrambler::checkScramblerStun() )
266  {
267  self thread weaponobjects::stunStart( watcher );
268  }
269  else
270  {
271  self stunStop();
272  }
273 
274  for ( ;; )
275  {
276  level util::waittill_any( "scrambler_spawn", "scrambler_death", "hacked" );
277 
278  if ( isdefined( self.owner ) && self.owner IsEMPJammed() )
279  {
280  continue;
281  }
282 
283  if ( self scrambler::checkScramblerStun() )
284  {
285  self thread weaponobjects::stunStart( watcher );
286  }
287  else
288  {
289  self stunStop();
290  }
291  }
292 }*/
‪onSpawnUseWeaponObject
‪function onSpawnUseWeaponObject(watcher, owner)
Definition: _weaponobjects.gsc:1597
‪watchShutdown
‪function watchShutdown(player)
Definition: _scrambler.gsc:82
‪weaponStun
‪function weaponStun()
Definition: _weaponobjects.gsc:1128
‪ownerSameTeam
‪function ownerSameTeam(owner1, owner2)
Definition: _scrambler.gsc:166
‪destroyedEquipment
‪function destroyedEquipment(weapon)
Definition: challenges_shared.gsc:43
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪scramblerDetonate
‪function scramblerDetonate(attacker, weapon, target)
Definition: _scrambler.gsc:66
‪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
‪waittill_any
‪function waittill_any(str_notify1, str_notify2, str_notify3, str_notify4, str_notify5)
Definition: util_shared.csc:375
‪onSpawnScrambler
‪function onSpawnScrambler(watcher, player)
Definition: _scrambler.gsc:44
‪doDamageFeedback
‪function doDamageFeedback(weapon, eInflictor, iDamage, sMeansOfDeath)
Definition: damagefeedback_shared.gsc:423
‪destroyEnt
‪function destroyEnt()
Definition: _scrambler.gsc:91
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪createUseWeaponObjectWatcher
‪function createUseWeaponObjectWatcher(weaponname, ownerTeam)
Definition: _weaponobjects.gsc:1297
‪watchScramblerDamage
‪function watchScramblerDamage(watcher)
Definition: _scrambler.gsc:96
‪createScramblerWatcher
‪function createScramblerWatcher()
Definition: _scrambler.gsc:33
‪init_shared
‪function init_shared()
Definition: _scrambler.gsc:19
‪update
‪function update()
Definition: _serversettings.gsc:71
‪stunStart
‪function stunStart(watcher, time)
Definition: _weaponobjects.gsc:1077
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪checkScramblerStun
‪function checkScramblerStun()
Definition: _scrambler.gsc:186
‪isHacked
‪function isHacked()
Definition: util_shared.gsc:2493
‪name
‪class GroundFx name