1 #using scripts\codescripts\struct;
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;
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;
20 #using scripts\shared\_burnplayer;
22 #insert scripts\shared\shared.gsh;
23 #insert scripts\shared\version.gsh;
24 #insert scripts\shared\abilities\_ability_util.gsh;
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
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
39 #define THIEF_OVERCLOCK_POWER_THRESHOLD 80
41 #define BLACKJACK_BODY_INDEX 9
43 #define MIN_TIME_BETWEEN_GIVE_FLIP_AUDIO_MS 99
68 level.gadgetThiefTimeCharge =
false;
69 level.gadgetThiefShutdownFullcharge = getDvarInt(
"gadgetThiefShutdownFullCharge", 1 );
74 weapons = EnumerateWeapons(
"weapon" );
75 level.gadgetthiefArray = [];
77 for ( i = 0; i < weapons.size; i++ )
79 if ( weapons[i].isGadget && weapons[i].isheroweapon ==
true )
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" )
91 ArrayInsert( level.gadgetthiefArray, weapons[i], 0 );
100 return self GadgetIsActive( slot );
106 return self GadgetFlickering( slot );
118 self.gadget_thief_slot = slot;
122 if ( SessionModeIsMultiplayerGame() )
129 currentPower =
VAL(
self gadgetPowerGet( slot ), 0 );
132 if( isdefined(
self.pers[
"held_gadgets_power"] ) && isdefined(
self.pers[#
"thiefWeapon"] ) && isdefined(
self.pers[
"held_gadgets_power"][
self.pers[#
"thiefWeapon"]] ) )
134 savedPower =
self.pers[
"held_gadgets_power"][
self.pers[#
"thiefWeapon"]];
137 if ( currentPower >= 100 || savedPower >= 100 )
139 self.giveStolenWeaponOnSpawn =
true;
140 self.giveStolenWeaponSlot = slot;
146 assert( isDefined(
self.gadget_thief_slot ) );
161 self.pers[#
"thiefAllowFlip"] =
true;
167 if (
self.isThief ===
true )
173 if (
self.giveStolenWeaponOnSpawn ===
true )
176 self GadgetPowerSet(
self.giveStolenWeaponSlot, 100 );
177 self.giveStolenWeaponOnSpawn = undefined;
178 self.giveStolenWeaponSlot = undefined;
199 if ( isdefined(
self.pers[#
"thiefWeapon"] ) && weapon.name !=
"gadget_thief" )
208 if ( gadget.isheroweapon ==
false )
210 heroWeaponEquivalent =
"";
211 switch( gadget.name )
213 case "gadget_flashback":
215 heroWeaponEquivalent =
"hero_lightninggun";
218 case "gadget_combat_efficiency":
220 heroWeaponEquivalent =
"hero_annihilator";
223 case "gadget_heat_wave" :
225 heroWeaponEquivalent =
"hero_flamethrower";
228 case "gadget_vision_pulse":
230 heroWeaponEquivalent =
"hero_bowlauncher";
233 case "gadget_speed_burst":
235 heroWeaponEquivalent =
"hero_gravityspikes";
240 heroWeaponEquivalent =
"hero_armblade";
245 heroWeaponEquivalent =
"hero_pineapplegun";
248 case "gadget_resurrect":
250 heroWeaponEquivalent =
"hero_chemicalgelgun";
255 heroWeaponEquivalent =
"hero_minigun";
259 if ( heroWeaponEquivalent !=
"" )
261 heroweapon = getweapon( heroWeaponEquivalent );
274 self notify(
"resetFlashStartAndEnd" );
275 self endon (
"resetFlashStartAndEnd" );
285 gadgetThiefKillPowerGain = getDvarFloat(
"gadgetThiefKillPowerGain", 12.5 );
286 thiefGametypeFactor =
VAL( GetGametypeSetting(
"scoreThiefPowerGainFactor" ), 1.0 );
287 gadgetThiefKillPowerGain *= thiefGametypeFactor;
288 return gadgetThiefKillPowerGain;
295 if (
self gadgetIsActive( slot ) ==
false )
297 power =
self gadgetPowerGet( slot );
301 victimGadgetPower =
VAL( victim gadgetPowerGet( 0 ), 0 );
303 alwaysPerformGain =
false;
305 if ( alwaysPerformGain || power < 100 )
307 if ( victimGadgetPower == 100 )
317 self playsoundtoplayer (
"mpl_bm_specialist_bar_thief",
self);
324 self playsoundtoplayer (
"mpl_bm_specialist_bar_thief",
self);
330 currentPower = power + gadgetThiefKillPowerGain;
334 if (
self HasPerk(
"specialty_overcharge" ) )
340 if ( currentPower >= 100 )
342 wasFullyCharged = ( power >= 100 );
352 self GadgetPowerSet( slot, currentPower );
356 if ( IsPlayer( victim ) &&
self.pers[#
"thiefWeaponStolenFrom"] === victim.entNum && weapon.isHeroWeapon )
366 if ( !isdefined( victim ) )
369 heroWeapon = undefined;
370 victimIsBlackjack = ( ( victim.isThief === true ) || ( victim.isRoulette ===
true ) );
372 if ( victimIsBlackjack )
374 if( isDefined( stolenHeroWeapon ) )
376 heroWeapon = stolenHeroWeapon;
378 else if ( isdefined( victim.pers[#
"thiefWeapon"] ) && ( victim.pers[#
"thiefWeapon"].isHeroWeapon === true ) )
380 heroWeapon = victim.pers[#
"thiefWeapon"];
384 if ( !isdefined( heroWeapon ) )
386 victimGadget = victim._gadgets_player[0];
390 if ( wasFullyCharged )
392 if ( isdefined( heroWeapon ) && isdefined(
self.pers[#
"thiefWeapon"] ) && heroWeapon !=
self.pers[#
"thiefWeapon"] && ( !isdefined(
self.pers[#
"thiefWeaponOption"] ) || heroWeapon !=
self.pers[#
"thiefWeaponOption"] ) &&
self.pers[#
"thiefAllowFlip"] )
406 self.pers[#
"thiefWeaponOption"] = undefined;
407 self.thief_new_gadget_time = GetTime();
409 if ( isdefined(
self.pers[#
"thiefWeapon"] ) && (
self.pers[#
"thiefWeapon"].isHeroWeapon ===
true ) )
414 self playsoundtoplayer(
"mpl_bm_specialist_bar_filled",
self );
422 self notify(
"give_flip_weapon_singleton" );
423 self endon(
"give_flip_weapon_singleton" );
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 );
429 self.pers[#
"thiefWeaponOption"] = heroWeapon;
433 self notify(
"thief_flip_activated" );
436 self playsoundtoplayer(
"mpl_bm_specialist_coin_place",
self );
442 elapsed_time = ( GetTime() -
VAL(
self.thief_new_gadget_time, 0 ) ) * 0.001;
453 if ( isdefined(
self.pers[#
"thiefWeapon"] ) )
457 if ( isdefined(
self.pers[#
"thiefWeaponOption"] ) )
459 self thread
watchForOptionUse( slot,
self.pers[#
"thief_weapon_option_body_index"], justSpawned );
466 self endon(
"death" );
467 self endon(
"disconnect" );
468 self endon(
"thief_flip_activated" );
470 self DisableOffhandSpecial();
474 self EnableOffhandSpecial();
479 self endon(
"end_failsafe_reenable_offhand_special" );
483 if ( isdefined(
self ) )
485 self EnableOffhandSpecial();
492 switch( heroweapon.name )
495 case "hero_minigun_body3":
496 event =
"minigun_stolen";
497 label =
"SCORE_MINIGUN_STOLEN";
499 case "hero_flamethrower":
500 event =
"flamethrower_stolen";
501 label =
"SCORE_FLAMETHROWER_STOLEN";
503 case "hero_lightninggun":
504 case "hero_lightninggun_arc":
505 event =
"lightninggun_stolen";
506 label =
"SCORE_LIGHTNINGGUN_STOLEN";
508 case "hero_chemicalgelgun":
509 case "hero_firefly_swarm":
510 event =
"gelgun_stolen";
511 label =
"SCORE_GELGUN_STOLEN";
513 case "hero_pineapplegun":
514 case "hero_pineapple_grenade":
515 event =
"pineapple_stolen";
516 label =
"SCORE_PINEAPPLE_STOLEN";
518 case "hero_armblade":
519 event =
"armblades_stolen";
520 label =
"SCORE_ARMBLADES_STOLEN";
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";
529 case "hero_gravityspikes":
530 event =
"gravityspikes_stolen";
531 label =
"SCORE_GRAVITYSPIKES_STOLEN";
533 case "hero_annihilator":
534 event =
"annihilator_stolen";
535 label =
"SCORE_ANNIHILATOR_STOLEN";
545 self LUINotifyEvent( &
"score_event", 5, iString( label ), 0 , 0 , 0 , 1 );
550 self notify(
"watchForThiefKill_singleton" );
551 self endon (
"watchForThiefKill_singleton" );
553 self.gadgetThiefActive =
true;
557 self waittill(
"hero_shutdown_gadget", heroGadget, victim );
561 performClientSideEffect =
false;
562 if ( performClientSideEffect )
565 clientSideEffect =
spawn(
"script_model", victim.origin );
573 if ( isdefined( level.gadgetThiefShutdownFullcharge ) && level.gadgetThiefShutdownFullcharge )
575 if (
self gadgetIsActive( slot ) ==
false )
584 power =
self gadgetPowerGet( slot );
585 self GadgetPowerSet( slot, 100.0 );
587 wasFullyCharged = ( power >= 100 );
596 clientSideEffect =
spawn(
"script_model", origin );
610 previousGadget = undefined;
614 if ( isdefined(
self._gadgets_player[i] ) )
616 if ( !isdefined( previousGadget ) )
618 previousGadget =
self._gadgets_player[i];
620 self TakeWeapon(
self._gadgets_player[i] );
624 if( !isDefined( weapon ) )
626 weapon = array::random( level.gadgetthiefarray );
629 selectedWeapon = weapon;
632 self GiveWeapon( selectedWeapon );
634 self GadgetCharging( slot, level.gadgetThiefTimeCharge );
635 self.gadgetThiefChargingSlot = slot;
637 self.pers[#
"thiefWeapon"] = selectedWeapon;
638 self.pers[#
"thiefWeaponStolenFrom"] = weaponStolenFromEntnum;
640 if ( !isdefined( previousGadget ) || previousGadget != selectedWeapon )
642 self notify(
"thief_hero_weapon_changed", justSpawned, selectedWeapon );
650 self endon(
"death" );
651 self endon(
"hero_gadget_activated" );
652 self notify(
"watchForOptionUse_thief_singleton" );
653 self endon (
"watchForOptionUse_thief_singleton" );
655 if (
self.pers[#
"thiefAllowFlip"] ==
false )
659 self.pers[#
"thief_weapon_option_body_index"] = victimBodyIndex;
665 self EnableOffhandSpecial();
666 self notify(
"end_failsafe_reenable_offhand_special" );
675 self.pers[#
"thiefWeapon"] =
self.pers[#
"thiefWeaponOption"];
676 self.pers[#
"thiefWeaponOption"] = undefined;
677 self.pers[#
"thiefAllowFlip"] =
false;
680 if ( isdefined( level.playGadgetReady ) )
682 self thread [[level.playGadgetReady]](
self.pers[#
"thiefWeapon"], true );
694 return self ActionSlotThreeButtonPressed();
699 self notify(
"watchHeroWeaponChanged_singleton" );
700 self endon (
"watchHeroWeaponChanged_singleton" );
702 self endon(
"death" );
703 self endon(
"disconnect" );
707 self waittill(
"thief_hero_weapon_changed", justSpawned, newWeapon );
711 if ( isdefined( newWeapon ) && isdefined( newWeapon.gadgetReadySoundPlayer ) )
713 self playsoundtoplayer( newWeapon.gadgetReadySoundPlayer,
self );
718 self playsoundtoplayer(
"mpl_bm_specialist_thief",
self );
725 self notify(
"watchGadgetActivated_singleton" );
726 self endon (
"watchGadgetActivated_singleton" );
728 self waittill(
"hero_gadget_activated" );
731 self.pers[#
"thiefWeapon"] = undefined;
732 self.pers[#
"thiefWeaponOption"] = undefined;
733 self.pers[#
"thiefAllowFlip"] =
true;
735 self waittill(
"heroAbility_off" );
736 power =
self gadgetPowerGet( slot );
738 self GadgetPowerSet( slot, power );
741 if ( isdefined(
self._gadgets_player[i] ) )
743 self TakeWeapon(
self._gadgets_player[i] );
746 self GiveWeapon( getweapon(
"gadget_thief" ) );
752 self waittill(
"heroAbility_off" );
755 if ( isdefined(
self._gadgets_player[i] ) )
757 self TakeWeapon(
self._gadgets_player[i] );
760 self GiveWeapon( weapon );
761 self GadgetCharging( slot, level.gadgetThiefTimeCharge );
762 self.gadgetThiefChargingSlot = slot;
774 if ( IsDefined( time ) )
776 timeStr =
"^3" +
", time: " + time;
779 if ( GetDvarInt(
"scr_cpower_debug_prints" ) > 0 )
781 self IPrintlnBold(
"Gadget thief: " + status + timeStr );
787 bodyIndex = victim GetCharacterBodyType();
793 switch( heroWeapon.name )
796 case "hero_minigun_body3":
799 case "hero_flamethrower":
802 case "hero_lightninggun":
805 case "hero_chemicalgelgun":
808 case "hero_pineapplegun":
811 case "hero_armblade":
814 case "hero_bowlauncher":
815 case "hero_bowlauncher2":
816 case "hero_bowlauncher3":
817 case "hero_bowlauncher4":
820 case "hero_gravityspikes":
824 case "hero_annihilator":