1 #using scripts\codescripts\struct;
2 #using scripts\shared\array_shared;
3 #using scripts\shared\bots\_bot;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\weapons\replay_gun;
8 #using scripts\shared\system_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\visionset_mgr_shared;
12 #using scripts\shared\abilities\_ability_gadgets;
13 #using scripts\shared\abilities\_ability_power;
14 #using scripts\shared\abilities\_ability_util;
16 #using scripts\shared\abilities\gadgets\_gadget_armor; // for loading purposes only - do not use from here
17 #using scripts\shared\abilities\gadgets\_gadget_speed_burst; // for loading purposes only - do not use from here
18 #using scripts\shared\abilities\gadgets\_gadget_camo; // for loading purposes only - do not use from here
19 #using scripts\shared\abilities\gadgets\_gadget_vision_pulse; // for loading purposes only - do not use from here
20 #using scripts\shared\abilities\gadgets\_gadget_hero_weapon; // for loading purposes only - do not use from here
21 #using scripts\shared\abilities\gadgets\_gadget_other; // for loading purposes only - do not use from here
22 #using scripts\shared\abilities\gadgets\_gadget_combat_efficiency; // for loading purposes only - do not use from here
23 #using scripts\shared\abilities\gadgets\_gadget_flashback; // for loading purposes only - do not use from here
24 #using scripts\shared\abilities\gadgets\_gadget_cleanse; // for loading purposes only - do not use from here
26 #using scripts\shared\abilities\gadgets\_gadget_system_overload; // for loading purposes only - do not use from here
27 #using scripts\shared\abilities\gadgets\_gadget_servo_shortout; // for loading purposes only - do not use from here
28 #using scripts\shared\abilities\gadgets\_gadget_exo_breakdown; // for loading purposes only - do not use from here
29 #using scripts\shared\abilities\gadgets\_gadget_surge; // for loading purposes only - do not use from here
30 #using scripts\shared\abilities\gadgets\_gadget_security_breach; // for loading purposes only - do not use from here
31 #using scripts\shared\abilities\gadgets\_gadget_iff_override; // for loading purposes only - do not use from here
32 #using scripts\shared\abilities\gadgets\_gadget_cacophany; // for loading purposes only - do not use from here
33 #using scripts\shared\abilities\gadgets\_gadget_es_strike; // for loading purposes only - do not use from here
34 #using scripts\shared\abilities\gadgets\_gadget_ravage_core; // for loading purposes only - do not use from here
35 #using scripts\shared\abilities\gadgets\_gadget_concussive_wave; // for loading purposes only - do not use from here
36 #using scripts\shared\abilities\gadgets\_gadget_overdrive; // for loading purposes only - do not use from here
37 #using scripts\shared\abilities\gadgets\_gadget_unstoppable_force; // for loading purposes only - do not use from here
38 #using scripts\shared\abilities\gadgets\_gadget_rapid_strike; // for loading purposes only - do not use from here
39 #using scripts\shared\abilities\gadgets\_gadget_sensory_overload; // for loading purposes only - do not use from here
40 #using scripts\shared\abilities\gadgets\_gadget_forced_malfunction; // for loading purposes only - do not use from here
41 #using scripts\shared\abilities\gadgets\_gadget_immolation; // for loading purposes only - do not use from here
42 #using scripts\shared\abilities\gadgets\_gadget_firefly_swarm; // for loading purposes only - do not use from here
43 #using scripts\shared\abilities\gadgets\_gadget_smokescreen; // for loading purposes only - do not use from here
44 #using scripts\shared\abilities\gadgets\_gadget_misdirection; // for loading purposes only - do not use from here
45 #using scripts\shared\abilities\gadgets\_gadget_mrpukey; // for loading purposes only - do not use from here
46 #using scripts\shared\abilities\gadgets\_gadget_active_camo; // for loading purposes only - do not use from here
48 #using scripts\shared\abilities\gadgets\_gadget_shock_field; // for loading purposes only - do not use from here
49 #using scripts\shared\abilities\gadgets\_gadget_resurrect; // for loading purposes only - do not use from here
50 #using scripts\shared\abilities\gadgets\_gadget_heat_wave; // for loading purposes only - do not use from here
51 #using scripts\shared\abilities\gadgets\_gadget_clone; // for loading purposes only - do not use from here
52 #using scripts\shared\abilities\gadgets\_gadget_roulette; // for loading purposes only - do not use from here
53 #using scripts\shared\abilities\gadgets\_gadget_thief; // for loading purposes only - do not use from here
55 #insert scripts\shared\shared.gsh;
56 #insert scripts\shared\version.gsh;
57 #insert scripts\shared\abilities\_ability_util.gsh;
58 #insert scripts\shared\statstable_shared.gsh;
60 #namespace ability_player;
78 DEFAULT( level._gadgets_level, [] );
91 DEFAULT(
self._gadgets_player, [] );
97 self.heroAbilityActivateTime = undefined;
98 self.heroAbilityDectivateTime = undefined;
99 self.heroAbilityActive = undefined;
108 if ( !isPlayer(
self ) )
126 if ( !isdefined(
self._gadgets_player[slot] ) )
131 gadgetWeapon =
self._gadgets_player[slot];
133 powerLeft =
self GadgetPowerChange( slot, 0.0 );
137 self GadgetDeactivate( slot, gadgetweapon );
139 if ( gadgetWeapon.gadget_power_round_end_active_penalty > 0 )
141 powerLeft = powerLeft - gadgetWeapon.gadget_power_round_end_active_penalty;
142 powerLeft = max( 0.0, powerLeft );
146 self.pers[
"held_gadgets_power"][gadgetWeapon] = powerLeft;
152 self endon(
"disconnect" );
154 self.pers[
"held_gadgets_power"] = [];
156 self waittill(
"death" );
158 if ( !isdefined(
self._gadgets_player ) )
168 level waittill(
"game_ended" );
170 players = GetPlayers();
172 foreach ( player
in players )
174 if ( !IsAlive( player ) )
179 if ( !isdefined( player._gadgets_player ) )
202 DEFAULT( level._gadgets_level, [] );
204 if ( !IsDefined( level._gadgets_level[ type ] ) )
206 level._gadgets_level[ type ] = spawnstruct();
207 level._gadgets_level[ type ].should_notify =
true;
215 if( isDefined( should_notify ) )
217 level._gadgets_level[ type ].should_notify = should_notify;
225 DEFAULT(level._gadgets_level[ type ].on_give, []);
226 DEFAULT(level._gadgets_level[ type ].on_take, []);
227 if ( IsDefined(on_give) )
229 ARRAY_ADD(level._gadgets_level[ type ].on_give,on_give);
231 if ( IsDefined(on_take) )
233 ARRAY_ADD(level._gadgets_level[ type ].on_take,on_take);
241 DEFAULT(level._gadgets_level[ type ].turn_on, []);
242 DEFAULT(level._gadgets_level[ type ].turn_off, []);
257 DEFAULT( level._gadgets_level[ type ].on_flicker, [] );
259 if ( IsDefined( on_flicker ) )
261 ARRAY_ADD( level._gadgets_level[ type ].on_flicker, on_flicker );
269 DEFAULT( level._gadgets_level[ type ].on_ready, [] );
271 if ( IsDefined( ready_func ) )
273 ARRAY_ADD( level._gadgets_level[ type ].on_ready, ready_func );
281 DEFAULT( level._gadgets_level[ type ].on_primed, [] );
283 if ( IsDefined( primed_func ) )
285 ARRAY_ADD( level._gadgets_level[ type ].on_primed, primed_func );
293 if ( IsDefined( inuse_func ) )
295 level._gadgets_level[ type ].isInUse = inuse_func;
303 if ( IsDefined( flickering_func ) )
305 level._gadgets_level[ type ].isFlickering = flickering_func;
313 DEFAULT( level._gadgets_level[ type ].failed_activate, [] );
315 if ( IsDefined( failed_activate ) )
317 ARRAY_ADD( level._gadgets_level[ type ].failed_activate, failed_activate );
323 if ( IsDefined(
self._gadgets_player[slot] ) )
325 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
327 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].isInUse ) )
329 return self [[level._gadgets_level[
self._gadgets_player[slot].gadget_type ].isInUse]]( slot );
334 return self GadgetIsActive( slot );
339 if ( !IsDefined(
self._gadgets_player[slot] ) )
344 if ( !IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].isFlickering ) )
349 return self [[level._gadgets_level[
self._gadgets_player[slot].gadget_type ].isFlickering]]( slot );
354 if ( IsDefined(
self._gadgets_player[slot] ) )
361 existingGadget =
self._gadgets_player[eSlot];
363 if ( IsDefined( existingGadget ) && existingGadget == weapon )
369 self._gadgets_player[slot] = weapon;
371 if ( !IsDefined(
self._gadgets_player[slot] ) )
376 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
378 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_give ) )
380 foreach( on_give
in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_give )
381 self [[on_give]]( slot, weapon );
385 if ( SessionModeIsMultiplayerGame() )
387 self.heroAbilityName = ( isdefined( weapon ) ? weapon.name : undefined );
393 if ( !IsDefined(
self._gadgets_player[slot] ) )
398 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
400 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_take ) )
402 foreach( on_take
in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_take )
403 self [[on_take]]( slot, weapon );
407 self._gadgets_player[slot] = undefined;
413 if ( !IsDefined(
self._gadgets_player[slot] ) )
418 self.playedGadgetSuccess =
false;
420 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
422 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].turn_on ) )
424 foreach(
turn_on in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].turn_on )
428 self trackHeroPowerActivated( game[
"timepassed"] );
430 level notify(
"hero_gadget_activated",
self, weapon );
431 self notify(
"hero_gadget_activated", weapon );
436 if( IsDefined( level.cybercom ) && IsDefined( level.cybercom._ability_turn_on ) )
438 self [[level.cybercom._ability_turn_on]]( slot, weapon );
442 self.pers[
"heroGadgetNotified"] =
false;
444 xuid =
self GetXUID();
447 if ( isdefined( level.playGadgetActivate ) )
449 self [[level.playGadgetActivate]]( weapon );
454 if ( isdefined (
self.isNearDeath ) &&
self.isNearDeath == true )
456 if ( isdefined( level.heroAbilityActivateNearDeath ) )
458 [[level.heroAbilityActivateNearDeath]]();
461 self.heroAbilityActivateTime = getTime();
462 self.heroAbilityActive =
true;
463 self.heroAbility = weapon;
471 if ( !IsDefined(
self._gadgets_player[slot] ) )
476 if ( !IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
481 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].turn_off ) )
483 foreach(
turn_off in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].turn_off )
488 dead =
self.health <= 0;
489 self trackHeroPowerExpired( game[
"timepassed"], dead,
self.heroweaponShots,
self.heroweaponHits );
494 if( IsDefined( level.cybercom ) && IsDefined( level.cybercom._ability_turn_off ) )
496 self [[level.cybercom._ability_turn_off]]( slot, weapon );
501 if (
self IsEMPJammed() == true )
503 self GadgetTargetResult(
false );
505 if ( isdefined( level.callbackEndHeroSpecialistEMP ) )
507 if ( isdefined( weapon.gadget_turnoff_onempjammed ) && weapon.gadget_turnoff_onempjammed ==
true )
509 self thread [[level.callbackEndHeroSpecialistEMP]]();
514 self.heroAbilityDectivateTime = getTime();
515 self.heroAbilityActive = undefined;
516 self.heroAbility = weapon;
519 self notify(
"heroAbility_off", weapon );
521 xuid =
self GetXUID();
525 self TakeWeapon( weapon );
531 heroAbilityStat =
false;
533 if ( isdefined( attacker.heroAbility ) )
535 switch( attacker.heroAbility.name )
539 case "gadget_speed_burst":
540 case "gadget_heat_wave":
542 if ( isdefined( attacker.heroAbilityActive ) || ( isdefined( attacker.heroAbilityDectivateTime ) && attacker.heroAbilityDectivateTime > gettime() - 100 ) )
544 heroAbilityStat =
true;
549 case "gadget_flashback":
550 case "gadget_resurrect":
552 if ( isdefined( attacker.heroAbilityActive )
553 || ( isdefined( attacker.heroAbilityDectivateTime ) && attacker.heroAbilityDectivateTime > gettime() - 6000 ) )
555 heroAbilityStat =
true;
559 case "gadget_vision_pulse":
561 if ( isdefined( attacker.visionPulseSpottedEnemyTime ) )
563 timeCutoff = getTime();
564 if ( attacker.visionPulseSpottedEnemyTime + 10000 > timeCutoff )
566 for ( i = 0; i < attacker.visionPulseSpottedEnemy.size; i++ )
568 spottedEnemy = attacker.visionPulseSpottedEnemy[i];
569 if ( spottedEnemy ==
self )
571 if (
self.lastSpawnTime < attacker.visionPulseSpottedEnemyTime )
573 heroAbilityStat =
true;
581 case "gadget_combat_efficiency":
583 if ( isdefined( attacker._gadget_combat_efficiency ) && attacker._gadget_combat_efficiency ==
true )
585 heroAbilityStat =
true;
588 else if ( isdefined( attacker.combatEfficiencyLastOnTime ) && attacker.combatEfficiencyLastOnTime > gettime() - 100 )
590 heroAbilityStat =
true;
596 return heroAbilityStat;
602 if ( !IsDefined(
self._gadgets_player[slot] ) )
607 if ( !IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
612 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_flicker ) )
614 foreach( on_flicker
in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_flicker )
615 self [[on_flicker]]( slot, weapon );
621 if ( !IsDefined(
self._gadgets_player[slot] ) )
626 if ( !IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
631 if( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].should_notify ) && level._gadgets_level[
self._gadgets_player[slot].gadget_type ].should_notify )
633 if ( IsDefined( level.statsTableID ) )
641 self LUINotifyEvent( &
"hero_weapon_received", 1, index );
642 self LUINotifyEventToSpectators( &
"hero_weapon_received", 1, index );
647 if ( !isdefined( level.gameEnded ) || !level.gameEnded )
649 if ( !isdefined(
self.pers[
"heroGadgetNotified"] ) || !
self.pers[
"heroGadgetNotified"] )
651 self.pers[
"heroGadgetNotified"] =
true;
653 if ( isdefined( level.playGadgetReady ) )
655 self [[level.playGadgetReady]]( weapon );
658 self trackHeroPowerAvailable( game[
"timepassed"] );
663 xuid =
self GetXUID();
666 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_ready ) )
668 foreach( on_ready
in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_ready )
669 self [[on_ready]]( slot, weapon );
675 if ( !IsDefined(
self._gadgets_player[slot] ) )
680 if ( !IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ] ) )
685 if ( IsDefined( level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_primed ) )
687 foreach( on_primed
in level._gadgets_level[
self._gadgets_player[slot].gadget_type ].on_primed )
688 self [[on_primed]]( slot, weapon );