‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_gadget_thief.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\flagsys_shared;
8 #using scripts\shared\killstreaks_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\util_shared;
12 #using scripts\shared\weapons\_weaponobjects;
13 #using scripts\shared\visionset_mgr_shared;
14 
15 #using scripts\shared\abilities\_ability_gadgets;
16 #using scripts\shared\abilities\_ability_player;
17 #using scripts\shared\abilities\_ability_power;
18 #using scripts\shared\abilities\_ability_util;
19 
20 #using scripts\shared\_burnplayer;
21 
22 #insert scripts\shared\shared.gsh;
23 #insert scripts\shared\version.gsh;
24 #insert scripts\shared\abilities\_ability_util.gsh;
25 
26 #namespace thief;
27 
28 ‪REGISTER_SYSTEM( "gadget_thief", &‪__init__, undefined )
29 
30 #define THIEF_STATE_DEFAULT 0
31 #define THIEF_STATE_RECEIVED_NEW_GADGET 1
32 #define THIEF_STATE_DONE_FLIPING 2
33 #define THIEF_WEAPON_OPTION_NONE 0
34 
35 #define THIEF_NEW_GADGET_ANIM_TIME 0.75
36 #define THIEF_PRE_FLIP_WAIT_TIME 0.85
37 #define THIEF_ACTIVATION_WAIT 1.1
38 
39 #define THIEF_OVERCLOCK_POWER_THRESHOLD 80
40 
41 #define BLACKJACK_BODY_INDEX 9
42 
43 #define MIN_TIME_BETWEEN_GIVE_FLIP_AUDIO_MS 99
44 
45 
46 function ‪__init__()
47 {
48  ‪clientfield::register( "toplayer", "thief_state", ‪VERSION_TU11, 2, "int" );
49  ‪clientfield::register( "toplayer", "thief_weapon_option", ‪VERSION_TU11, 4, "int" );
50 
57 
58  ‪clientfield::register( "scriptmover", "gadget_thief_fx", ‪VERSION_TU11, 1, "int" );
59 
60  ‪clientfield::register( "clientuimodel", "playerAbilities.playerGadget3.flashStart", ‪VERSION_TU11, 3, "int" );
61  ‪clientfield::register( "clientuimodel", "playerAbilities.playerGadget3.flashEnd", ‪VERSION_TU11, 3, "int" );
62 
65 
67 
68  level.gadgetThiefTimeCharge = false;
69  level.gadgetThiefShutdownFullcharge = getDvarInt( "gadgetThiefShutdownFullCharge", 1 );
70 }
71 
73 {
74  weapons = EnumerateWeapons( "weapon" );
75  level.gadgetthiefArray = [];
76 
77  for ( i = 0; i < weapons.size; i++ )
78  {
79  if ( weapons[i].isGadget && weapons[i].isheroweapon == true )
80  {
81  if ( weapons[i].‪name != "gadget_thief" &&
82  weapons[i].‪name != "gadget_roulette" &&
83  weapons[i].‪name != "hero_bowlauncher2" &&
84  weapons[i].‪name != "hero_bowlauncher3" &&
85  weapons[i].‪name != "hero_bowlauncher4" &&
86  weapons[i].‪name != "hero_pineapple_grenade" &&
87  weapons[i].‪name != "gadget_speed_burst" &&
88  weapons[i].‪name != "hero_minigun_body3" &&
89  weapons[i].‪name != "hero_lightninggun_arc" )
90  {
91  ArrayInsert( level.gadgetthiefArray, weapons[i], 0 );
92  }
93  }
94  }
95 }
96 
97 function ‪gadget_thief_is_inuse( slot )
98 {
99  // returns true when local script gadget state is on
100  return self GadgetIsActive( slot );
101 }
102 
104 {
105  // returns true when local script gadget state is flickering
106  return self GadgetFlickering( slot );
107 }
108 
109 function ‪gadget_thief_on_flicker( slot, weapon )
110 {
111  // excuted when the gadget flickers
112  self thread ‪gadget_thief_flicker( slot, weapon );
113 }
114 
115 function ‪gadget_thief_on_give( slot, weapon )
116 {
117  self.gadget_thief_kill_callback = &‪gadget_thief_kill_callback;
118  self.gadget_thief_slot = slot;
119  // executed when gadget is added to the players inventory
120  self thread ‪gadget_thief_active( slot, weapon );
121 
122  if ( SessionModeIsMultiplayerGame() )
123  {
124  self.isThief = true;
125  }
126 
128 
129  currentPower = ‪VAL( self gadgetPowerGet( slot ), 0 );
130 
131  savedPower = 0;
132  if( isdefined( self.pers["held_gadgets_power"] ) && isdefined( self.pers[#"thiefWeapon"] ) && isdefined( self.pers["held_gadgets_power"][self.pers[#"thiefWeapon"]] ) )
133  {
134  savedPower = self.pers["held_gadgets_power"][self.pers[#"thiefWeapon"]];
135  }
136 
137  if ( currentPower >= 100 || savedPower >= 100 )
138  {
139  self.giveStolenWeaponOnSpawn = true;
140  self.giveStolenWeaponSlot = slot;
141  }
142 }
143 
144 function ‪gadget_thief_kill_callback( victim, weapon )
145 {
146  assert( isDefined( self.gadget_thief_slot ) );
147  self thread ‪handleThiefKill( self.gadget_thief_slot, weapon, victim );
148 }
149 
150 function ‪gadget_thief_on_take( slot, weapon )
151 {
152  // executed when gadget is removed from the players inventory
153 
154 }
155 
156 //self is the player
158 {
159  // setup up stuff on player connect
160 
161  self.pers[#"thiefAllowFlip"] = true;
162 
163 }
164 
166 {
167  if ( self.isThief === true )
168  {
169  // setup up stuff on player spawned
170 
171  self thread ‪watchHeroWeaponChanged();
172 
173  if ( self.giveStolenWeaponOnSpawn === true )
174  {
175  self ‪givePreviouslyEarnedSpecialistWeapon( self.giveStolenWeaponSlot, true );
176  self GadgetPowerSet( self.giveStolenWeaponSlot, 100 );
177  self.giveStolenWeaponOnSpawn = undefined;
178  self.giveStolenWeaponSlot = undefined;
179  }
180  }
181 }
182 
184 {
185 }
186 
187 function ‪gadget_thief_on_activate( slot, weapon )
188 {
189 }
190 
191 function ‪gadget_thief_is_ready( slot, weapon )
192 {
193 }
194 
195 function ‪gadget_thief_active( slot, weapon )
196 {
197  waittillframeend;
198 
199  if ( isdefined( self.pers[#"thiefWeapon"] ) && weapon.name != "gadget_thief" )
200  {
201  self thread ‪gadget_give_random_gadget( slot, weapon, self.pers[#"thiefWeaponStolenFrom"] );
202  }
203  self thread ‪watchForHeroKill( slot );
204 }
205 
206 function ‪getStolenHeroWeapon( gadget )
207 {
208  if ( gadget.isheroweapon == false )
209  {
210  heroWeaponEquivalent = "";
211  switch( gadget.name )
212  {
213  case "gadget_flashback":
214  {
215  heroWeaponEquivalent = "hero_lightninggun";
216  }
217  break;
218  case "gadget_combat_efficiency":
219  {
220  heroWeaponEquivalent = "hero_annihilator";
221  }
222  break;
223  case "gadget_heat_wave" :
224  {
225  heroWeaponEquivalent = "hero_flamethrower";
226  }
227  break;
228  case "gadget_vision_pulse":
229  {
230  heroWeaponEquivalent = "hero_bowlauncher";
231  }
232  break;
233  case "gadget_speed_burst":
234  {
235  heroWeaponEquivalent = "hero_gravityspikes";
236  }
237  break;
238  case "gadget_camo":
239  {
240  heroWeaponEquivalent = "hero_armblade";
241  }
242  break;
243  case "gadget_armor":
244  {
245  heroWeaponEquivalent = "hero_pineapplegun";
246  }
247  break;
248  case "gadget_resurrect":
249  {
250  heroWeaponEquivalent = "hero_chemicalgelgun";
251  }
252  break;
253  case "gadget_clone":
254  {
255  heroWeaponEquivalent = "hero_minigun";
256  }
257  break;
258  }
259  if ( heroWeaponEquivalent != "" )
260  {
261  heroweapon = getweapon( heroWeaponEquivalent );
262  }
263  }
264  else
265  {
266  heroweapon = gadget;
267  }
268 
269  return heroweapon;
270 }
271 
273 {
274  self notify( "resetFlashStartAndEnd" );
275  self endon ( "resetFlashStartAndEnd" );
276 
277  wait ‪delay;
278 
279  self ‪clientfield::set_player_uimodel( "playerAbilities.playerGadget3.flashStart", 0 );
280  self ‪clientfield::set_player_uimodel( "playerAbilities.playerGadget3.flashEnd", 0 );
281 }
282 
284 {
285  gadgetThiefKillPowerGain = getDvarFloat( "gadgetThiefKillPowerGain", 12.5 );
286  thiefGametypeFactor = ‪VAL( GetGametypeSetting( "scoreThiefPowerGainFactor" ), 1.0 );
287  gadgetThiefKillPowerGain *= thiefGametypeFactor;
288  return gadgetThiefKillPowerGain;
289 }
290 
291 function ‪handleThiefKill( slot, weapon, victim )
292 {
293  if ( isdefined( weapon ) && !‪killstreaks::is_killstreak_weapon( weapon ) && !weapon.isHeroWeapon && IsAlive( self ) )
294  {
295  if ( self gadgetIsActive( slot ) == false )
296  {
297  power = self gadgetPowerGet( slot );
298  gadgetThiefKillPowerGain = ‪getThiefPowerGain();
299  gadgetThiefKillPowerGainWithoutMultiplier = ‪getThiefPowerGain();
300 
301  victimGadgetPower = ‪VAL( victim gadgetPowerGet( 0 ), 0 );
302 
303  alwaysPerformGain = false; // if we want to hear power gains even at full power, set this to true
304 
305  if ( alwaysPerformGain || power < 100 )
306  {
307  if ( victimGadgetPower == 100 )
308  {
309  // aku-- removed PowerTap by commenting out for now
310 
311  // gadgetThiefKillPowerGain *= getDvarFloat( "gadgetThiefKillFullPowerMultiplier", 2.0 );
312 
313  // scoreevents::processScoreEvent( "kill_enemy_who_has_full_power", self );
314 
315  // self playsoundtoplayer ("mpl_bm_specialist_bar_extra", self);
316 
317  self playsoundtoplayer ("mpl_bm_specialist_bar_thief", self); // play "normal" earn audio
318 
319  // JMCCAWLEY
320  // this is when you kill an enemy that has a full meter and you earn extra power
321  }
322  else
323  {
324  self playsoundtoplayer ("mpl_bm_specialist_bar_thief", self);
325  // JMCCAWLEY
326  // this is when you kill an enemy that has does not have a full meter
327  }
328  }
329 
330  currentPower = power + gadgetThiefKillPowerGain;
331 
332  if ( power < THIEF_OVERCLOCK_POWER_THRESHOLD && currentPower >= ‪THIEF_OVERCLOCK_POWER_THRESHOLD && currentPower < 100 )
333  {
334  if ( self HasPerk( "specialty_overcharge" ) ) // overclock
335  {
336  currentPower = 100;
337  }
338  }
339 
340  if ( currentPower >= 100 )
341  {
342  wasFullyCharged = ( power >= 100 );
343 
344  self ‪earnedSpecialistWeapon( victim, slot, wasFullyCharged );
345  }
346 
347  // todo handle overlapping cases, delay animations when you get several in a row
348  self ‪clientfield::set_player_uimodel( "playerAbilities.playerGadget3.flashStart", Int(power / gadgetThiefKillPowerGainWithoutMultiplier) );
349  self ‪clientfield::set_player_uimodel( "playerAbilities.playerGadget3.flashEnd", Int(currentPower / gadgetThiefKillPowerGainWithoutMultiplier) );
350  self thread ‪resetFlashStartAndEndAfterDelay( 3.0 ); // 3 seconds
351 
352  self GadgetPowerSet( slot, currentPower );
353  }
354  else // the else for if ( self gadgetIsActive( slot ) == false )
355  {
356  if ( IsPlayer( victim ) && self.pers[#"thiefWeaponStolenFrom"] === victim.entNum && weapon.isHeroWeapon )
357  {
358  ‪scoreevents::processScoreEvent( "kill_enemy_with_their_hero_weapon", self );
359  }
360  }
361  }
362 }
363 
364 function ‪earnedSpecialistWeapon( victim, slot, wasFullyCharged, stolenHeroWeapon )
365 {
366  if ( !isdefined( victim ) )
367  return;
368 
369  heroWeapon = undefined;
370  victimIsBlackjack = ( ( victim.isThief === true ) || ( victim.isRoulette === true ) );
371 
372  if ( victimIsBlackjack )
373  {
374  if( isDefined( stolenHeroWeapon ) )
375  {
376  heroWeapon = stolenHeroWeapon;
377  }
378  else if ( isdefined( victim.pers[#"thiefWeapon"] ) && ( victim.pers[#"thiefWeapon"].isHeroWeapon === true ) )
379  {
380  heroWeapon = victim.pers[#"thiefWeapon"];
381  }
382  }
383 
384  if ( !isdefined( heroWeapon ) )
385  {
386  victimGadget = victim._gadgets_player[0];
387  heroWeapon = ‪getStolenHeroWeapon( victimGadget );
388  }
389 
390  if ( wasFullyCharged )
391  {
392  if ( isdefined( heroWeapon ) && isdefined( self.pers[#"thiefWeapon"] ) && heroWeapon != self.pers[#"thiefWeapon"] && ( !isdefined( self.pers[#"thiefWeaponOption"] ) || heroWeapon != self.pers[#"thiefWeaponOption"] ) && self.pers[#"thiefAllowFlip"] )
393  {
394  self thread ‪giveFlipWeapon( slot, victim, heroWeapon );
395  }
396 
397  // JMCCAWLEY
398  // this is when you kill an enemy and you have full power yourself.
399  }
400  else
401  {
403  self ‪clientfield::set_to_player( "thief_weapon_option", ‪THIEF_WEAPON_OPTION_NONE );
404  self thread ‪gadget_give_random_gadget( slot, heroWeapon, victim.entNum );
405  // self thread disable_hero_gadget_activation( GetDvarFloat( "src_thief_activation_wait", THIEF_ACTIVATION_WAIT ) );
406  self.pers[#"thiefWeaponOption"] = undefined;
407  self.thief_new_gadget_time = GetTime();
408 
409  if ( isdefined( self.pers[#"thiefWeapon"] ) && ( self.pers[#"thiefWeapon"].isHeroWeapon === true ) )
410  {
411  self ‪handleStolenScoreEvent( self.pers[#"thiefWeapon"] );
412  }
413 
414  self playsoundtoplayer( "mpl_bm_specialist_bar_filled", self ); // no need to play this here, handled elsewhere
415  // JMCCAWLEY
416  // this is when you kill an enemy and you did not have full power and this event caused you to get full power
417  }
418 }
419 
420 function ‪giveFlipWeapon( slot, victim, heroWeapon )
421 {
422  self notify( "give_flip_weapon_singleton" );
423  self endon( "give_flip_weapon_singleton" );
424 
425  previousGiveFlipTime = ‪VAL( self.last_thief_give_flip_time, 0 );
426  self.last_thief_give_flip_time = GetTime();
427  alreadyGivenFlipThisFrame = ( previousGiveFlipTime == self.last_thief_give_flip_time );
428 
429  self.pers[#"thiefWeaponOption"] = heroWeapon;
430  victimBodyIndex = ‪GetVictimBodyIndex( victim, heroWeapon );
431  self ‪handleStolenScoreEvent( heroWeapon );
432 
433  self notify( "thief_flip_activated" );
434 
435  if ( self.last_thief_give_flip_time - previousGiveFlipTime > ‪MIN_TIME_BETWEEN_GIVE_FLIP_AUDIO_MS )
436  self playsoundtoplayer( "mpl_bm_specialist_coin_place", self );
437 
438  // self DisableOffhandSpecial();
439  // self thread failsafe_reenable_offhand_special();
440 
441  // wait for new gadget flip animation to finish before allowing second weapon flip
442  elapsed_time = ( GetTime() - ‪VAL( self.thief_new_gadget_time, 0 ) ) * 0.001;
443  if ( elapsed_time < ‪THIEF_NEW_GADGET_ANIM_TIME )
444  wait ( ‪THIEF_NEW_GADGET_ANIM_TIME - elapsed_time );
445 
447  self thread ‪watchForOptionUse( slot, victimBodyIndex, false );
448 }
449 
450 function ‪givePreviouslyEarnedSpecialistWeapon( slot, justSpawned )
451 {
452 
453  if ( isdefined( self.pers[#"thiefWeapon"] ) )
454  {
455  self thread ‪gadget_give_random_gadget( slot, self.pers[#"thiefWeapon"], self.pers[#"thiefWeaponStolenFrom"], justSpawned );
456 
457  if ( isdefined( self.pers[#"thiefWeaponOption"] ) )
458  {
459  self thread ‪watchForOptionUse( slot, self.pers[#"thief_weapon_option_body_index"], justSpawned );
460  }
461  }
462 }
463 
465 {
466  self endon( "death" );
467  self endon( "disconnect" );
468  self endon( "thief_flip_activated" );
469 
470  self DisableOffhandSpecial();
471 
472  wait duration;
473 
474  self EnableOffhandSpecial();
475 }
476 
478 {
479  self endon( "end_failsafe_reenable_offhand_special" );
480 
481  wait 3.0;
482 
483  if ( isdefined( self ) )
484  {
485  self EnableOffhandSpecial();
486  }
487 }
488 
489 
490 function ‪handleStolenScoreEvent( heroweapon )
491 {
492  switch( heroweapon.name )
493  {
494  case "hero_minigun":
495  case "hero_minigun_body3":
496  event = "minigun_stolen";
497  label = "SCORE_MINIGUN_STOLEN";
498  break;
499  case "hero_flamethrower":
500  event = "flamethrower_stolen";
501  label = "SCORE_FLAMETHROWER_STOLEN";
502  break;
503  case "hero_lightninggun":
504  case "hero_lightninggun_arc":
505  event = "lightninggun_stolen";
506  label = "SCORE_LIGHTNINGGUN_STOLEN";
507  break;
508  case "hero_chemicalgelgun":
509  case "hero_firefly_swarm":
510  event = "gelgun_stolen";
511  label = "SCORE_GELGUN_STOLEN";
512  break;
513  case "hero_pineapplegun":
514  case "hero_pineapple_grenade":
515  event = "pineapple_stolen";
516  label = "SCORE_PINEAPPLE_STOLEN";
517  break;
518  case "hero_armblade":
519  event = "armblades_stolen";
520  label = "SCORE_ARMBLADES_STOLEN";
521  break;
522  case "hero_bowlauncher":
523  case "hero_bowlauncher2":
524  case "hero_bowlauncher3":
525  case "hero_bowlauncher4":
526  event = "bowlauncher_stolen";
527  label = "SCORE_BOWLAUNCHER_STOLEN";
528  break;
529  case "hero_gravityspikes":
530  event = "gravityspikes_stolen";
531  label = "SCORE_GRAVITYSPIKES_STOLEN";
532  break;
533  case "hero_annihilator":
534  event = "annihilator_stolen";
535  label = "SCORE_ANNIHILATOR_STOLEN";
536  break;
537  default:
538  return;
539  }
540 
541  // note: score events with 0 score from scoreinfo.csv are considered "disabled"
542  // thread scoreevents::processScoreEvent( event, self );
543 
544  // send as LUI notify instead
545  self LUINotifyEvent( &"score_event", 5, iString( label ), 0 /*score*/, 0 /*combatEfficiencyBonus*/ , 0 /*rampageBonus*/, 1 /*thief score*/ );
546 }
547 
548 function ‪watchForHeroKill( slot )
549 {
550  self notify( "watchForThiefKill_singleton" );
551  self endon ( "watchForThiefKill_singleton" );
552 
553  self.gadgetThiefActive = true;
554 
555  while( 1 )
556  {
557  self waittill( "hero_shutdown_gadget", heroGadget, victim );
558 
559  stolenHeroWeapon = ‪getStolenHeroWeapon( heroGadget );
560 
561  performClientSideEffect = false; // disabling client side effects for now
562  if ( performClientSideEffect )
563  {
564  self ‪spawnThiefBeamEffect( victim.origin );
565  clientSideEffect = ‪spawn( "script_model", victim.origin );
566  clientSideEffect ‪clientfield::set( "gadget_thief_fx", 1 );
567  clientSideEffect thread ‪waitthendelete( 5 );
568  }
569 
570  // KSHERWOOD
571  // This is when Blackjack Shuts down an Enemy to Steal their Weapon.
572 
573  if ( isdefined( level.gadgetThiefShutdownFullcharge ) && level.gadgetThiefShutdownFullcharge )
574  {
575  if ( self gadgetIsActive( slot ) == false )
576  {
577  ‪scoreevents::processScoreEvent( "thief_shutdown_enemy", self );
578  //self.pers[#"thiefWeaponOption"] = stolenHeroWeapon;
579 
580  //DROCHE
581 
582  //self thread gadget_give_random_gadget( slot, stolenHeroWeapon, victim.entNum );
583 
584  power = self gadgetPowerGet( slot );
585  self GadgetPowerSet( slot, 100.0 );
586 
587  wasFullyCharged = ( power >= 100 );
588  self ‪earnedSpecialistWeapon( victim, slot, wasFullyCharged, stolenHeroWeapon );
589  }
590  }
591  }
592 }
593 
594 function ‪spawnThiefBeamEffect( origin )
595 {
596  clientSideEffect = ‪spawn( "script_model", origin );
597  clientSideEffect ‪clientfield::set( "gadget_thief_fx", 1 );
598 
599  clientSideEffect thread ‪waitthendelete( 5 );
600 }
601 
602 function ‪waitthendelete( time )
603 {
604  wait ( time );
605  self delete();
606 }
607 
608 function ‪gadget_give_random_gadget( slot, weapon, weaponStolenFromEntnum, justSpawned = false )
609 {
610  previousGadget = undefined; // script compiler complains if this is not here
611 
612  for ( i = ‪GADGET_HELD_0; i < ‪GADGET_HELD_COUNT; i++ )
613  {
614  if ( isdefined( self._gadgets_player[i] ) )
615  {
616  if ( !isdefined( previousGadget ) )
617  {
618  previousGadget = self._gadgets_player[i];
619  }
620  self TakeWeapon( self._gadgets_player[i] );
621  }
622  }
623 
624  if( !isDefined( weapon ) )
625  {
626  weapon = array::random( level.gadgetthiefarray );
627  }
628 
629  selectedWeapon = weapon;
630 
631 
632  self GiveWeapon( selectedWeapon );
633 
634  self GadgetCharging( slot, level.gadgetThiefTimeCharge );
635  self.gadgetThiefChargingSlot = slot;
636 
637  self.pers[#"thiefWeapon"] = selectedWeapon;
638  self.pers[#"thiefWeaponStolenFrom"] = weaponStolenFromEntnum;
639 
640  if ( !isdefined( previousGadget ) || previousGadget != selectedWeapon )
641  {
642  self notify( "thief_hero_weapon_changed", justSpawned, selectedWeapon );
643  }
644 
645  self thread ‪watchGadgetActivated( slot );
646 }
647 
648 function ‪watchForOptionUse( slot, victimBodyIndex, justSpawned )
649 {
650  self endon( "death" );
651  self endon( "hero_gadget_activated" );
652  self notify( "watchForOptionUse_thief_singleton" );
653  self endon ( "watchForOptionUse_thief_singleton" );
654 
655  if ( self.pers[#"thiefAllowFlip"] == false )
656  return;
657 
658  self ‪clientfield::set_to_player( "thief_weapon_option", victimBodyIndex + 1 ); //sending this value to lua which uses 1-index
659  self.pers[#"thief_weapon_option_body_index"] = victimBodyIndex;
660 
661  if ( !justSpawned )
662  {
663  wait ‪THIEF_PRE_FLIP_WAIT_TIME; // wait until the "flip activated" animation is done
664 
665  self EnableOffhandSpecial();
666  self notify( "end_failsafe_reenable_offhand_special" );
667  }
668 
669  while( 1 )
670  {
671  if ( self ‪dpad_left_pressed() )
672  {
674  self ‪clientfield::set_to_player( "thief_weapon_option", ‪THIEF_WEAPON_OPTION_NONE );
675  self.pers[#"thiefWeapon"] = self.pers[#"thiefWeaponOption"];
676  self.pers[#"thiefWeaponOption"] = undefined;
677  self.pers[#"thiefAllowFlip"] = false;
678  self thread ‪gadget_give_random_gadget( slot, self.pers[#"thiefWeapon"], self.pers[#"thiefWeaponStolenFrom"] );
679 
680  if ( isdefined( level.playGadgetReady ) )
681  {
682  self thread [[level.playGadgetReady]]( self.pers[#"thiefWeapon"], true );
683  }
684 
685  return;
686  }
687 
689  }
690 }
691 
693 {
694  return self ActionSlotThreeButtonPressed();
695 }
696 
698 {
699  self notify( "watchHeroWeaponChanged_singleton" );
700  self endon ( "watchHeroWeaponChanged_singleton" );
701 
702  self endon( "death" );
703  self endon( "disconnect" );
704 
705  while( 1 )
706  {
707  self waittill( "thief_hero_weapon_changed", justSpawned, newWeapon );
708 
709  if ( justSpawned )
710  {
711  if ( isdefined( newWeapon ) && isdefined( newWeapon.gadgetReadySoundPlayer ) )
712  {
713  self playsoundtoplayer( newWeapon.gadgetReadySoundPlayer, self );
714  }
715  }
716  else
717  {
718  self playsoundtoplayer( "mpl_bm_specialist_thief", self );
719  }
720  }
721 }
722 
723 function ‪watchGadgetActivated( slot )
724 {
725  self notify( "watchGadgetActivated_singleton" );
726  self endon ( "watchGadgetActivated_singleton" );
727 
728  self waittill( "hero_gadget_activated" );
729  self ‪clientfield::set_to_player( "thief_weapon_option", ‪THIEF_WEAPON_OPTION_NONE );
730 
731  self.pers[#"thiefWeapon"] = undefined;
732  self.pers[#"thiefWeaponOption"] = undefined;
733  self.pers[#"thiefAllowFlip"] = true;
734 
735  self waittill( "heroAbility_off" );
736  power = self gadgetPowerGet( slot );
737  power = Int( power / ‪getThiefPowerGain() ) * ‪getThiefPowerGain();
738  self GadgetPowerSet( slot, power );
739  for ( i = ‪GADGET_HELD_0; i < ‪GADGET_HELD_COUNT; i++ )
740  {
741  if ( isdefined( self._gadgets_player[i] ) )
742  {
743  self TakeWeapon( self._gadgets_player[i] );
744  }
745  }
746  self GiveWeapon( getweapon( "gadget_thief" ) );
748 }
749 
750 function ‪gadget_thief_on_deactivate( slot, weapon )
751 {
752  self waittill( "heroAbility_off" );
753  for ( i = ‪GADGET_HELD_0; i < ‪GADGET_HELD_COUNT; i++ )
754  {
755  if ( isdefined( self._gadgets_player[i] ) )
756  {
757  self TakeWeapon( self._gadgets_player[i] );
758  }
759  }
760  self GiveWeapon( weapon );
761  self GadgetCharging( slot, level.gadgetThiefTimeCharge );
762  self.gadgetThiefChargingSlot = slot;
763  //self.pers[#"thiefWeapon"] = undefined;
764 }
765 
766 function ‪gadget_thief_flicker( slot, weapon )
767 {
768 }
769 
770 function ‪set_gadget_status( status, time )
771 {
772  timeStr = "";
773 
774  if ( IsDefined( time ) )
775  {
776  timeStr = "^3" + ", time: " + time;
777  }
778 
779  if ( GetDvarInt( "scr_cpower_debug_prints" ) > 0 )
780  {
781  self IPrintlnBold( "Gadget thief: " + status + timeStr );
782  }
783 }
784 
785 function ‪GetVictimBodyIndex( victim, heroWeapon )
786 {
787  bodyIndex = victim GetCharacterBodyType();
788 
789  if ( bodyIndex == ‪BLACKJACK_BODY_INDEX )
790  {
791  // we can't use Blackjack's body index, we need the body type associated with the weapon
792  // pulled from mp_character_customization gdt (thus hardcoded for now)
793  switch( heroWeapon.name )
794  {
795  case "hero_minigun":
796  case "hero_minigun_body3":
797  bodyIndex = 6;
798  break;
799  case "hero_flamethrower":
800  bodyIndex = 8;
801  break;
802  case "hero_lightninggun":
803  bodyIndex = 2;
804  break;
805  case "hero_chemicalgelgun":
806  bodyIndex = 5;
807  break;
808  case "hero_pineapplegun":
809  bodyIndex = 3;
810  break;
811  case "hero_armblade":
812  bodyIndex = 7;
813  break;
814  case "hero_bowlauncher":
815  case "hero_bowlauncher2":
816  case "hero_bowlauncher3":
817  case "hero_bowlauncher4":
818  bodyIndex = 1;
819  break;
820  case "hero_gravityspikes":
821  bodyIndex = 0;
822  break;
823  default:
824  case "hero_annihilator":
825  bodyIndex = 4;
826  break;
827  }
828  }
829 
830  return bodyIndex;
831 }
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪gadget_thief_kill_callback
‪function gadget_thief_kill_callback(victim, weapon)
Definition: _gadget_thief.gsc:144
‪register_gadget_is_flickering_callbacks
‪function register_gadget_is_flickering_callbacks(type, flickering_func)
Definition: _ability_player.gsc:299
‪watch_entity_shutdown
‪function watch_entity_shutdown()
Definition: _gadget_thief.gsc:183
‪VERSION_TU11
‪#define VERSION_TU11
Definition: version.gsh:61
‪gadget_thief_is_flickering
‪function gadget_thief_is_flickering(slot)
Definition: _gadget_thief.gsc:103
‪gadget_thief_on_take
‪function gadget_thief_on_take(slot, weapon)
Definition: _gadget_thief.gsc:150
‪register_gadget_possession_callbacks
‪function register_gadget_possession_callbacks(type, on_give, on_take)
Definition: _ability_player.gsc:221
‪watchForOptionUse
‪function watchForOptionUse(slot, victimBodyIndex, justSpawned)
Definition: _gadget_thief.gsc:648
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪resetFlashStartAndEndAfterDelay
‪function resetFlashStartAndEndAfterDelay(delay)
Definition: _gadget_thief.gsc:272
‪register_gadget_is_inuse_callbacks
‪function register_gadget_is_inuse_callbacks(type, inuse_func)
Definition: _ability_player.gsc:289
‪THIEF_STATE_DONE_FLIPING
‪#define THIEF_STATE_DONE_FLIPING
Definition: _gadget_thief.gsc:32
‪spawnThiefBeamEffect
‪function spawnThiefBeamEffect(origin)
Definition: _gadget_thief.gsc:594
‪getThiefPowerGain
‪function getThiefPowerGain()
Definition: _gadget_thief.gsc:283
‪set_gadget_status
‪function set_gadget_status(status, time)
Definition: _gadget_thief.gsc:770
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪earnedSpecialistWeapon
‪function earnedSpecialistWeapon(victim, slot, wasFullyCharged, stolenHeroWeapon)
Definition: _gadget_thief.gsc:364
‪GADGET_HELD_0
‪#define GADGET_HELD_0
Definition: _ability_util.gsh:59
‪failsafe_reenable_offhand_special
‪function failsafe_reenable_offhand_special()
Definition: _gadget_thief.gsc:477
‪gadget_thief_is_ready
‪function gadget_thief_is_ready(slot, weapon)
Definition: _gadget_thief.gsc:191
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪gadget_thief_on_activate
‪function gadget_thief_on_activate(slot, weapon)
Definition: _gadget_thief.gsc:187
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪handleStolenScoreEvent
‪function handleStolenScoreEvent(heroweapon)
Definition: _gadget_thief.gsc:490
‪register_gadget_flicker_callbacks
‪function register_gadget_flicker_callbacks(type, on_flicker)
Definition: _ability_player.gsc:253
‪GADGET_TYPE_THIEF
‪#define GADGET_TYPE_THIEF
Definition: _ability_util.gsh:50
‪register_gadget_ready_callbacks
‪function register_gadget_ready_callbacks(type, ready_func)
Definition: _ability_player.gsc:265
‪getStolenHeroWeapon
‪function getStolenHeroWeapon(gadget)
Definition: _gadget_thief.gsc:206
‪watchForHeroKill
‪function watchForHeroKill(slot)
Definition: _gadget_thief.gsc:548
‪THIEF_NEW_GADGET_ANIM_TIME
‪#define THIEF_NEW_GADGET_ANIM_TIME
Definition: _gadget_thief.gsc:35
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪waitthendelete
‪function waitthendelete(time)
Definition: _gadget_thief.gsc:602
‪MIN_TIME_BETWEEN_GIVE_FLIP_AUDIO_MS
‪#define MIN_TIME_BETWEEN_GIVE_FLIP_AUDIO_MS
Definition: _gadget_thief.gsc:43
‪is_killstreak_weapon
‪function is_killstreak_weapon(weapon)
Definition: killstreaks_shared.gsc:16
‪GADGET_HELD_COUNT
‪#define GADGET_HELD_COUNT
Definition: _ability_util.gsh:62
‪__init__
‪function __init__()
Definition: _gadget_thief.gsc:46
‪register_gadget_activation_callbacks
‪function register_gadget_activation_callbacks(type, turn_on, turn_off)
Definition: _ability_player.gsc:237
‪THIEF_STATE_RECEIVED_NEW_GADGET
‪#define THIEF_STATE_RECEIVED_NEW_GADGET
Definition: _gadget_thief.gsc:31
‪gadget_thief_on_connect
‪function gadget_thief_on_connect()
Definition: _gadget_thief.gsc:157
‪gadget_thief_on_give
‪function gadget_thief_on_give(slot, weapon)
Definition: _gadget_thief.gsc:115
‪givePreviouslyEarnedSpecialistWeapon
‪function givePreviouslyEarnedSpecialistWeapon(slot, justSpawned)
Definition: _gadget_thief.gsc:450
‪giveFlipWeapon
‪function giveFlipWeapon(slot, victim, heroWeapon)
Definition: _gadget_thief.gsc:420
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪watchHeroWeaponChanged
‪function watchHeroWeaponChanged()
Definition: _gadget_thief.gsc:697
‪THIEF_WEAPON_OPTION_NONE
‪#define THIEF_WEAPON_OPTION_NONE
Definition: _gadget_thief.gsc:33
‪THIEF_OVERCLOCK_POWER_THRESHOLD
‪#define THIEF_OVERCLOCK_POWER_THRESHOLD
Definition: _gadget_thief.gsc:39
‪gadget_thief_is_inuse
‪function gadget_thief_is_inuse(slot)
Definition: _gadget_thief.gsc:97
‪THIEF_PRE_FLIP_WAIT_TIME
‪#define THIEF_PRE_FLIP_WAIT_TIME
Definition: _gadget_thief.gsc:36
‪gadget_thief_on_flicker
‪function gadget_thief_on_flicker(slot, weapon)
Definition: _gadget_thief.gsc:109
‪dpad_left_pressed
‪function dpad_left_pressed()
Definition: _gadget_thief.gsc:692
‪disable_hero_gadget_activation
‪function disable_hero_gadget_activation(duration)
Definition: _gadget_thief.gsc:464
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪handleThiefKill
‪function handleThiefKill(slot, weapon, victim)
Definition: _gadget_thief.gsc:291
‪set_player_uimodel
‪function set_player_uimodel(str_field_name, n_value)
Definition: clientfield_shared.gsc:75
‪BLACKJACK_BODY_INDEX
‪#define BLACKJACK_BODY_INDEX
Definition: _gadget_thief.gsc:41
‪watchGadgetActivated
‪function watchGadgetActivated(slot)
Definition: _gadget_thief.gsc:723
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪gadget_thief_flicker
‪function gadget_thief_flicker(slot, weapon)
Definition: _gadget_thief.gsc:766
‪gadget_give_random_gadget
‪function gadget_give_random_gadget(slot, weapon, weaponStolenFromEntnum, justSpawned=false)
Definition: _gadget_thief.gsc:608
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪THIEF_STATE_DEFAULT
‪#define THIEF_STATE_DEFAULT
Definition: _gadget_thief.gsc:30
‪gadget_thief_on_player_spawn
‪function gadget_thief_on_player_spawn()
Definition: _gadget_thief.gsc:165
‪name
‪class GroundFx name
‪setup_gadget_thief_array
‪function setup_gadget_thief_array()
Definition: _gadget_thief.gsc:72
‪gadget_thief_on_deactivate
‪function gadget_thief_on_deactivate(slot, weapon)
Definition: _gadget_thief.gsc:750
‪GetVictimBodyIndex
‪function GetVictimBodyIndex(victim, heroWeapon)
Definition: _gadget_thief.gsc:785
‪gadget_thief_active
‪function gadget_thief_active(slot, weapon)
Definition: _gadget_thief.gsc:195
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265