1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\exploder_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\visionset_mgr_shared;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\version.gsh;
14 #using scripts\zm\_util;
15 #using scripts\zm\_zm;
16 #using scripts\zm\_zm_perks;
17 #using scripts\zm\_zm_pers_upgrades;
18 #using scripts\zm\_zm_pers_upgrades_functions;
19 #using scripts\zm\_zm_pers_upgrades_system;
20 #using scripts\zm\_zm_stats;
21 #using scripts\zm\_zm_utility;
23 #insert scripts\zm\_zm_perk_quick_revive.gsh;
24 #insert scripts\zm\_zm_perks.gsh;
25 #insert scripts\zm\_zm_utility.gsh;
27 #precache( "material", QUICK_REVIVE_SHADER );
28 #precache( "string", "ZOMBIE_PERK_QUICKREVIVE" );
29 #precache( "fx", "zombie/fx_perk_quick_revive_zmb" );
31 #namespace zm_perk_quick_revive;
62 if( IsDefined(level.quick_revive_precache_override_func) )
64 [[ level.quick_revive_precache_override_func ]]();
88 use_trigger.script_sound =
"mus_perks_revive_jingle";
89 use_trigger.script_string =
"revive_perk";
90 use_trigger.script_label =
"mus_perks_revive_sting";
92 perk_machine.script_string =
"revive_perk";
94 if(IsDefined(bump_trigger))
96 bump_trigger.script_string =
"revive_perk";
116 level endon(
"stop_quickrevive_logic");
126 if (solo_mode && !
IS_TRUE(level.solo_revive_init))
128 level.solo_revive_init=
true;
133 machine = getentarray(
"vending_revive",
"targetname");
134 machine_triggers = GetEntArray(
"vending_revive",
"target" );
136 for( i = 0; i < machine.size; i++ )
141 machine[i] NotSolid();
146 if( isDefined(level.quick_revive_final_pos))
148 level.quick_revive_default_origin = level.quick_revive_final_pos;
151 if(!isDefined(level.quick_revive_default_origin))
153 level.quick_revive_default_origin = machine[i].origin;
154 level.quick_revive_default_angles = machine[i].angles;
156 level.quick_revive_machine = machine[i];
161 if (
IS_TRUE( level.initial_quick_revive_power_off ) )
163 level waittill(
"revive_on");
165 else if ( !solo_mode )
167 level waittill(
"revive_on");
170 for( i = 0; i < machine.size; i++ )
172 if(IsDefined(machine[i].classname) && machine[i].classname ==
"script_model")
174 if(IsDefined(machine[i].script_noteworthy) && machine[i].script_noteworthy ==
"clip")
176 machine_clip = machine[i];
181 machine[i] playsound(
"zmb_perks_power_on");
182 machine[i] vibrate((0,-100,0), 0.3, 0.4, 3);
183 machine_model = machine[i];
186 machine[i] notify(
"stop_loopsound");
188 if (isdefined(machine_triggers[i]) )
189 machine_clip = machine_triggers[i].clip;
191 if (isdefined(machine_triggers[i]) )
192 blocker_model = machine_triggers[i].blocker_model;
197 if ( solo_mode && isdefined( machine_model ) && !
IS_TRUE(machine_model.ishidden) )
205 array::thread_all( machine, level.machine_assets[
PERK_QUICK_REVIVE ].power_on_callback );
208 level notify(
"specialty_quickrevive_power_on" );
210 if ( IsDefined( machine_model ) )
212 machine_model.ishidden =
false;
217 if(notify_str ==
"revive_hide")
224 array::thread_all( machine, level.machine_assets[
PERK_QUICK_REVIVE ].power_off_callback );
227 for( i = 0; i < machine.size; i++ )
229 if(IsDefined(machine[i].classname) && machine[i].classname ==
"script_model")
239 if(isDefined(level.revive_machine_spawned) && !
IS_TRUE(level.revive_machine_spawned))
252 players = GetPlayers();
253 foreach( player
in players)
255 if(isDefined(player.lives) && player.lives > 0 && power_state)
257 should_pause =
false;
259 else if(isDefined(player.lives) && player.lives < 1)
288 level notify(
"revive_off");
290 level notify(
"stop_quickrevive_logic");
294 if ( !
IS_TRUE( level._dont_unhide_quickervive_on_hotjoin))
297 level notify(
"revive_off");
300 level notify(
"revive_hide");
301 level notify(
"stop_quickrevive_logic");
306 triggers = GetEntArray(
"zombie_vending",
"targetname" );
307 foreach(trigger
in triggers)
309 if(!isDefined(trigger.script_noteworthy))
314 if(IsDefined(trigger.script_int))
316 if(level
flag::get(
"power_on" + trigger.script_int))
338 level notify(
"revive_on");
340 level notify(
"specialty_quickrevive_power_on");
353 players = GetPlayers();
354 foreach(player
in players)
360 if(!isDefined(player.lives))
363 if(!isDefined(level.solo_lives_given))
364 level.solo_lives_given = 0;
366 level.solo_lives_given++;
369 if(isDefined(player.lives) && player.lives > 0 && power_state )
371 should_pause =
false;
392 if(!isDefined(solo_mode))
398 if(isDefined(level.quick_revive_machine_clip))
400 clip = level.quick_revive_machine_clip;
411 level notify(
"notify_check_quickrevive_for_hotjoin" );
412 level endon(
"notify_check_quickrevive_for_hotjoin" );
419 players = GetPlayers();
420 if ( players.size == 1 ||
IS_TRUE( level.force_solo_quick_revive ) )
436 level.using_solo_revive = solo_mode;
437 level.revive_machine_is_solo = solo_mode;
441 if(should_update && isDefined(level.quick_revive_machine))
454 if(isDefined(machine_clip))
456 level.quick_revive_machine_clip = machine_clip;
460 level notify(
"revive_solo_fx");
461 level endon(
"revive_solo_fx");
466 if ( isdefined( level.revive_solo_fx_func ) )
468 level thread [[ level.revive_solo_fx_func ]]();
476 self playsound(
"zmb_box_move");
478 playsoundatposition (
"zmb_whoosh",
self.origin );
481 if(isdefined(
self._linked_ent))
486 self moveto(
self.origin + (0,0,40),3);
488 if( isDefined( level.custom_vibrate_func ) )
490 [[ level.custom_vibrate_func ]]( self );
494 direction =
self.origin;
495 direction = (direction[1], direction[0], 0);
497 if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0))
499 direction = (direction[0], direction[1] * -1, 0);
501 else if(direction[0] < 0)
503 direction = (direction[0] * -1, direction[1], 0);
506 self Vibrate( direction, 10, 0.5, 5);
509 self waittill(
"movedone");
510 PlayFX(level._effect[
"poltergeist"],
self.origin);
511 playsoundatposition (
"zmb_box_poof",
self.origin);
514 if (isdefined(
self.fx))
521 if (isdefined(machine_clip))
524 machine_clip ConnectPaths();
527 if( IsDefined( blocker_model ) )
529 blocker_model Show();
532 level notify(
"revive_hide");
537 if (
IS_TRUE( level.solo_revive_init ) && level
flag::get(
"solo_revive" ) && isdefined( level.quick_revive_machine ) )
540 triggers = GetEntArray(
"zombie_vending",
"targetname" );
541 foreach(trigger
in triggers)
543 if(!isDefined(trigger.script_noteworthy))
549 trigger TriggerEnable(
false );
553 foreach(item
in level.powered_items )
555 if(isDefined(item.target) && isDefined(item.target.script_noteworthy) && item.target.script_noteworthy ==
PERK_QUICK_REVIVE )
559 item.self_powered = 1;
563 if(isDefined(level.quick_revive_machine.original_pos) )
565 level.quick_revive_default_origin = level.quick_revive_machine.original_pos;
566 level.quick_revive_default_angles = level.quick_revive_machine.original_angles;
569 move_org = level.quick_revive_default_origin;
571 if(isdefined(level.quick_revive_linked_ent))
573 move_org = level.quick_revive_linked_ent.origin;
575 if(isdefined(level.quick_revive_linked_ent_offset))
577 move_org += level.quick_revive_linked_ent_offset;
580 level.quick_revive_machine unlink();
583 level.quick_revive_machine moveto(move_org + (0,0,40),3);
585 direction = level.quick_revive_machine.origin;
586 direction = (direction[1], direction[0], 0);
588 if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0))
590 direction = (direction[0], direction[1] * -1, 0);
592 else if(direction[0] < 0)
594 direction = (direction[0] * -1, direction[1], 0);
597 level.quick_revive_machine Vibrate( direction, 10, 0.5, 4);
598 level.quick_revive_machine waittill(
"movedone");
600 level.quick_revive_machine hide();
601 level.quick_revive_machine.ishidden =
true;
602 if(isDefined(level.quick_revive_machine_clip))
604 level.quick_revive_machine_clip Hide();
605 level.quick_revive_machine_clip ConnectPaths();
609 PlayFX(level._effect[
"poltergeist"], level.quick_revive_machine.origin);
610 if(isDefined(level.quick_revive_trigger) && isDefined(level.quick_revive_trigger.blocker_model))
612 level.quick_revive_trigger.blocker_model show();
614 level notify(
"revive_hide");
625 if(isDefined(level.quick_revive_machine_clip))
627 level.quick_revive_machine_clip Show();
628 level.quick_revive_machine_clip DisconnectPaths();
631 if(isDefined(level.quick_revive_final_pos))
633 level.quick_revive_machine.origin = level.quick_revive_final_pos;
636 PlayFX(level._effect[
"poltergeist"], level.quick_revive_machine.origin);
637 if(isDefined(level.quick_revive_trigger) && isDefined(level.quick_revive_trigger.blocker_model))
639 level.quick_revive_trigger.blocker_model hide();
642 level.quick_revive_machine Show();
643 level.quick_revive_machine Solid();
645 if(isDefined(level.quick_revive_machine.original_pos) )
647 level.quick_revive_default_origin = level.quick_revive_machine.original_pos;
648 level.quick_revive_default_angles = level.quick_revive_machine.original_angles;
651 direction = level.quick_revive_machine.origin;
652 direction = (direction[1], direction[0], 0);
654 if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0))
656 direction = (direction[0], direction[1] * -1, 0);
658 else if(direction[0] < 0)
660 direction = (direction[0] * -1, direction[1], 0);
667 org = level.quick_revive_default_origin;
669 if(isdefined(level.quick_revive_linked_ent))
671 org = level.quick_revive_linked_ent.origin;
673 if(isdefined(level.quick_revive_linked_ent_offset))
675 org += level.quick_revive_linked_ent_offset;
679 if(!
IS_TRUE(level.quick_revive_linked_ent_moves) && (level.quick_revive_machine.origin != org) )
681 level.quick_revive_machine moveto(org,3);
683 level.quick_revive_machine Vibrate( direction, 10, 0.5, 2.9);
684 level.quick_revive_machine waittill(
"movedone");
686 level.quick_revive_machine.angles = level.quick_revive_default_angles;
691 if(isdefined(level.quick_revive_linked_ent))
693 org = level.quick_revive_linked_ent.origin;
695 if(isdefined(level.quick_revive_linked_ent_offset))
697 org += level.quick_revive_linked_ent_offset;
700 level.quick_revive_machine.origin = org;
703 level.quick_revive_machine vibrate((0,-100,0), 0.3, 0.4, 3);
706 if(isdefined(level.quick_revive_linked_ent))
708 level.quick_revive_machine LinkTo(level.quick_revive_linked_ent);
711 level.quick_revive_machine.ishidden =
false;
716 triggers = GetEntArray(
"zombie_vending",
"targetname" );
717 foreach(trigger
in triggers)
719 if(!isDefined(trigger.script_noteworthy))
724 trigger notify(
"stop_quickrevive_logic");
726 trigger TriggerEnable(
true );
733 foreach(item
in level.powered_items )
735 if(isDefined(item.target) && isDefined(item.target.script_noteworthy) && item.target.script_noteworthy ==
"specialty_quickrevive" )
737 if(item.power && !poweron)
739 if(!isDefined(item.powered_count))
741 item.powered_count = 0;
743 else if(item.powered_count > 0)
745 item.powered_count--;
748 else if( !item.power && poweron )
750 if(!isDefined(item.powered_count))
752 item.powered_count = 0;
754 item.powered_count++;
758 if(!isDefined(item.depowered_count))
760 item.depowered_count = 0;
764 item.power = poweron;
772 self endon(
"death" );
774 revive_perk_triggers = GetEntArray( revive_trigger_noteworthy,
"script_noteworthy" );
776 foreach( revive_perk_trigger
in revive_perk_triggers )
784 self endon(
"death" );
786 revive_perk_trigger SetInvisibleToPlayer(
self );
788 if( level.solo_lives_given >= 3 )
790 revive_perk_trigger TriggerEnable(
false );
793 if(IsDefined(level._solo_revive_machine_expire_func))
795 revive_perk_trigger [[level._solo_revive_machine_expire_func]]();
801 while(
self.lives > 0 )
806 revive_perk_trigger SetVisibleToPlayer(
self );
816 if(!isDefined(level.solo_lives_given))
818 level.solo_lives_given = 0;
822 if( IsDefined(level.solo_game_free_player_quickrevive) )
824 level.solo_game_free_player_quickrevive = undefined;
828 level.solo_lives_given++;
831 if( level.solo_lives_given >= 3 )