1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\demo_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\hud_util_shared;
8 #using scripts\shared\gameobjects_shared;
9 #using scripts\shared\laststand_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\system_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\shared\visionset_mgr_shared;
15 #insert scripts\shared\version.gsh;
16 #insert scripts\shared\shared.gsh;
18 #using scripts\zm\_util;
19 #using scripts\zm\_zm_equipment;
20 #using scripts\zm\_zm_hero_weapon;
21 #using scripts\zm\_zm_perks;
22 #using scripts\zm\_zm_pers_upgrades_functions;
23 #using scripts\zm\_zm_stats;
24 #using scripts\zm\_zm_utility;
25 #using scripts\zm\_zm_weapons;
27 #insert scripts\zm\_zm_laststand.gsh;
28 #insert scripts\zm\_zm_perks.gsh;
30 #precache( "triggerstring", "ZOMBIE_BUTTON_TO_REVIVE_PLAYER" );
31 #precache( "string", "ZOMBIE_REVIVING" );
33 #precache( "string", "ZOMBIE_PLAYER_IS_REVIVING_YOU", "ZOMBIE_PLAYER_NAME_0" );
34 #precache( "string", "ZOMBIE_PLAYER_IS_REVIVING_YOU", "ZOMBIE_PLAYER_NAME_1" );
35 #precache( "string", "ZOMBIE_PLAYER_IS_REVIVING_YOU", "ZOMBIE_PLAYER_NAME_2" );
36 #precache( "string", "ZOMBIE_PLAYER_IS_REVIVING_YOU", "ZOMBIE_PLAYER_NAME_3" );
38 #define SHOW_LAST_STAND_PROGRESS_BAR false
40 #namespace zm_laststand;
42 #define N_REVIVE_VISIBILITY_DELAY 2.0 // Delay before a revived player becomes visible to zombies again
52 level.laststand_update_clientfields = [];
53 for( i = 0; i < 4; i++ )
55 level.laststand_update_clientfields[i] =
"laststand_update" + i;
61 level.weaponSuicide = GetWeapon(
"death_self" );
63 level.primaryProgressBarX = 0;
64 level.primaryProgressBarY = 110;
65 level.primaryProgressBarHeight = 4;
66 level.primaryProgressBarWidth = 120;
67 level.primaryProgressBarY_ss = 280;
69 if( GetDvarString(
"revive_trigger_radius" ) ==
"" )
71 SetDvar(
"revive_trigger_radius",
"40" );
74 level.lastStandGetupAllowed =
false;
76 DEFAULT( level.vsmgr_prio_visionset_zm_laststand, 1000 );
79 DEFAULT( level.vsmgr_prio_visionset_zm_death, 1100 );
85 level.CONST_LASTSTAND_GETUP_COUNT_START = 0;
87 level.CONST_LASTSTAND_GETUP_BAR_START = 0.5;
88 level.CONST_LASTSTAND_GETUP_BAR_REGEN = 0.0025;
89 level.CONST_LASTSTAND_GETUP_BAR_DAMAGE = 0.1;
91 level.player_name_directive=[];
92 level.player_name_directive[0] = &
"ZOMBIE_PLAYER_NAME_0";
93 level.player_name_directive[1] = &
"ZOMBIE_PLAYER_NAME_1";
94 level.player_name_directive[2] = &
"ZOMBIE_PLAYER_NAME_2";
95 level.player_name_directive[3] = &
"ZOMBIE_PLAYER_NAME_3";
98 function player_last_stand_stats( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
101 if ( isdefined( attacker ) && IsPlayer( attacker ) && attacker !=
self )
103 if (
"zcleansed" == level.gametype )
108 if (
"zcleansed" == level.gametype )
110 if ( !
IS_TRUE( attacker.is_zombie ) )
125 attacker AddWeaponStat( weapon,
"kills", 1 );
129 attacker.headshots++;
131 attacker AddWeaponStat( weapon,
"headshots", 1 );
138 if( level
flag::get(
"solo_game" ) && !
self.lives && GetNumConnectedPlayers() < 2 )
147 if (
"zcleansed" != level.gametype )
159 if ( !isdefined( zoneName ) )
163 self RecordPlayerDownZombies( zoneName );
166 function PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
168 self notify(
"entering_last_stand");
170 self DisableWeaponCycling();
173 if( isdefined( level._game_module_player_laststand_callback ) )
175 self [[ level._game_module_player_laststand_callback ]]( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration );
188 self thread
player_last_stand_stats( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration );
190 if( isdefined( level.playerlaststand_func ) )
192 [[level.playerlaststand_func]]( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration );
200 self.laststand =
true;
209 if ( !
IS_TRUE(
self.no_revive_trigger ) )
215 self UndoLastStand();
221 self TakeAllWeapons();
223 if ( isdefined( attacker ) && IsPlayer( attacker ) && attacker !=
self )
225 attacker notify(
"killed_a_zombie_player", eInflictor,
self, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration );
234 if(
IS_TRUE(level.playerSuicideAllowed ) && GetPlayers().size > 1 )
236 if (!isdefined(level.canPlayerSuicide) ||
self [[level.canPlayerSuicide]]() )
244 if ( isdefined(
self.disabled_perks ) )
246 self.disabled_perks = [];
249 if( level.lastStandGetupAllowed )
256 bleedout_time = GetDvarfloat(
"player_lastStandBleedoutTime" );
258 if( isdefined(
self.n_bleedout_time_multiplier ) )
260 bleedout_time *=
self.n_bleedout_time_multiplier;
265 self thread laststand_bleedout( bleedout_time );
270 self notify(
"player_downed" );
279 self endon(
"player_revived");
281 self endon(
"disconnect");
285 self notify(
"player_downed");
292 self DisableWeaponCycling();
294 weaponInventory =
self GetWeaponsList(
true );
295 self.laststandPrimaryWeapons =
self GetWeaponsListPrimaries();
296 self.lastActiveWeapon =
self GetCurrentWeapon();
298 if ( IsDefined(
self) &&
self IsSwitchingWeapons() )
304 if (
self.lastActiveWeapon.isriotshield )
308 if ( isdefined(
self.laststandPrimaryWeapons ) &&
self.laststandPrimaryWeapons.size > 0 )
310 self SwitchToWeaponImmediate();
318 self.lastActiveWeapon =
self GetCurrentWeapon();
319 self SetLastStandPrevWeap(
self.lastActiveWeapon );
320 self.laststandpistol = undefined;
322 self.hadpistol =
false;
324 for( i = 0; i < weaponInventory.size; i++ )
326 weapon = weaponInventory[i];
328 wclass = weapon.weapClass;
329 if ( weapon.isBallisticKnife )
334 if ( ( wclass ==
"pistol" || wclass ==
"pistol spread" || wclass ==
"pistolspread" ) && !isdefined(
self.laststandpistol ) )
336 self.laststandpistol = weapon;
337 self.hadpistol =
true;
341 if ( weapon == level.weaponReviveTool ||
IS_EQUAL(weapon,
self.weaponReviveTool) )
348 else if ( weapon.isPerkBottle )
350 self TakeWeapon( weapon );
351 self.lastActiveWeapon = level.weaponNone;
356 if(
IS_TRUE(
self.hadpistol ) && isdefined( level.zombie_last_stand_pistol_memory ) )
358 self [ [ level.zombie_last_stand_pistol_memory ] ]();
361 if ( !isdefined(
self.laststandpistol ) )
363 self.laststandpistol = level.laststandpistol;
366 self notify(
"weapons_taken_for_last_stand");
376 if ( isdefined(level.return_additionalprimaryweapon) )
378 self [[ level.return_additionalprimaryweapon ]](
self.weapon_taken_by_losing_specialty_additionalprimaryweapon );
385 else if ( isdefined(
self.weapon_taken_by_losing_specialty_additionalprimaryweapon) &&
self.lastActiveWeapon ==
self.weapon_taken_by_losing_specialty_additionalprimaryweapon )
387 self.lastActiveWeapon = level.weaponNone;
390 if ( isdefined(
self.hadpistol ) && !
self.hadpistol && isdefined(
self.laststandpistol ) )
392 self TakeWeapon(
self.laststandpistol );
395 if( isdefined(
self.hadpistol ) &&
self.hadpistol ==
true && isdefined( level.zombie_last_stand_ammo_return ) && isdefined(
self.laststandpistol ) )
397 [ [ level.zombie_last_stand_ammo_return ] ]();
400 self EnableWeaponCycling();
401 self EnableOffhandWeapons();
407 self SwitchToWeapon(
self.lastActiveWeapon );
411 self SwitchToWeapon();
414 self.laststandpistol = undefined;
419 if( isdefined( e_player.laststandpistol ) )
429 self endon(
"do_revive_ended_normally" );
431 reviveTrigger = e_revivee.revivetrigger;
433 e_revivee waittill(
"disconnect");
435 if( isdefined( reviveTrigger ) )
437 reviveTrigger
delete();
441 if( isdefined(
self.reviveProgressBar ) )
446 if( isdefined(
self.reviveTextHud ) )
451 if ( isdefined ( w_reviver ) && isdefined( w_revive_tool ) )
459 self endon(
"do_revive_ended_normally" );
463 self.is_reviving_any--;
466 self.is_reviving_any = 0;
469 if( isdefined(
self.reviveProgressBar ) )
474 if( isdefined(
self.reviveTextHud ) )
483 assert( isdefined(
self.laststandpistol ) );
484 assert(
self.laststandpistol != level.weaponNone );
486 if( isdefined( level.zombie_last_stand ) )
488 [ [ level.zombie_last_stand ] ]();
492 self GiveWeapon(
self.laststandpistol );
493 self GiveMaxAmmo(
self.laststandpistol );
494 self SwitchToWeapon(
self.laststandpistol );
503 self endon (
"player_revived");
504 self endon (
"player_suicide");
505 self endon (
"zombified");
506 self endon (
"disconnect");
509 self SwitchToWeapon( w_weapon );
515 self endon (
"player_revived");
516 self endon (
"player_suicide");
517 self endon (
"zombified");
518 self endon (
"disconnect");
523 self notify(
"bled_out");
537 self.bleedout_time =
delay;
539 n_default_bleedout_time = GetDvarfloat(
"player_lastStandBleedoutTime" );
540 n_bleedout_time =
self.bleedout_time;
541 n_start_time = gettime();
543 while (
self.bleedout_time > Int(
delay * 0.5 ) )
546 if( ( n_bleedout_time > n_default_bleedout_time ) && (!isdefined(
self.n_bleedout_time_multiplier)) )
548 n_current_time = gettime();
549 n_total_time = ( n_current_time - n_start_time ) / 1000;
550 if( n_total_time > n_default_bleedout_time )
553 self.bleedout_time = 2;
558 self.bleedout_time -= 1;
564 while (
self.bleedout_time > 0 )
566 self.bleedout_time -= 1;
575 while( isdefined(
self.revivetrigger ) && isdefined(
self.revivetrigger.beingRevived ) &&
self.revivetrigger.beingRevived == 1 )
580 self notify(
"bled_out");
591 if( isdefined(
self.reviveTrigger ) )
592 self.reviveTrigger
delete();
593 self.reviveTrigger=undefined;
599 self RecordPlayerDeathZombies();
600 self.last_bleed_out_time = GetTime();
609 level notify(
"bleed_out",
self.characterindex);
611 self UndoLastStand();
616 if (isdefined(level.is_zombie_level ) && level.is_zombie_level)
618 self thread [[level.player_becomes_zombie]]();
620 else if (isdefined(level.is_specops_level ) && level.is_specops_level)
622 self thread [[level.spawnSpectator]]();
632 radius = GetDvarint(
"revive_trigger_radius" );
634 self.suicidePrompt = newclientHudElem(
self );
636 self.suicidePrompt.alignX =
"center";
637 self.suicidePrompt.alignY =
"middle";
638 self.suicidePrompt.horzAlign =
"center";
639 self.suicidePrompt.vertAlign =
"bottom";
640 self.suicidePrompt.y = -170;
641 if (
self IsSplitScreen() )
643 self.suicidePrompt.y = -132;
645 self.suicidePrompt.foreground =
true;
646 self.suicidePrompt.font =
"default";
647 self.suicidePrompt.fontScale = 1.5;
648 self.suicidePrompt.alpha = 1;
649 self.suicidePrompt.color = ( 1.0, 1.0, 1.0 );
650 self.suicidePrompt.hidewheninmenu =
true;
658 self endon (
"disconnect" );
659 self endon (
"zombified" );
660 self endon (
"stop_revive_trigger" );
661 self endon (
"player_revived");
662 self endon (
"bled_out");
663 self endon (
"fake_death");
664 level endon(
"end_game");
665 level endon(
"stop_suicide_trigger");
674 while (
self UseButtonPressed() )
679 if(!isdefined(
self.suicidePrompt))
688 if(!isdefined(
self.suicidePrompt))
693 self.suicidePrompt setText( &
"ZOMBIE_BUTTON_TO_SUICIDE" );
700 self.pre_suicide_weapon =
self GetCurrentWeapon();
701 self GiveWeapon( level.weaponSuicide );
702 self SwitchToWeapon( level.weaponSuicide );
703 duration =
self doCowardsWayAnims();
706 self.laststand = undefined;
707 self TakeWeapon( level.weaponSuicide );
709 if ( suicide_success )
711 self notify(
"player_suicide");
723 self SwitchToWeapon(
self.pre_suicide_weapon );
724 self.pre_suicide_weapon = undefined;
730 level endon(
"end_game");
731 level endon(
"stop_suicide_trigger");
733 suicideTime = duration;
739 self.suicidePrompt setText(
"" );
741 if( !isdefined(
self.suicideProgressBar) )
746 if( !isdefined(
self.suicideTextHud) )
748 self.suicideTextHud = newclientHudElem(
self );
753 self.suicideTextHud.alignX =
"center";
754 self.suicideTextHud.alignY =
"middle";
755 self.suicideTextHud.horzAlign =
"center";
756 self.suicideTextHud.vertAlign =
"bottom";
757 self.suicideTextHud.y = -173;
758 if (
self IsSplitScreen() )
760 self.suicideTextHud.y = -147;
762 self.suicideTextHud.foreground =
true;
763 self.suicideTextHud.font =
"default";
764 self.suicideTextHud.fontScale = 1.8;
765 self.suicideTextHud.alpha = 1;
766 self.suicideTextHud.color = ( 1.0, 1.0, 1.0 );
767 self.suicideTextHud.hidewheninmenu =
true;
768 self.suicideTextHud setText( &
"ZOMBIE_SUICIDING" );
775 if(
timer >= suicideTime)
782 if( isdefined(
self.suicideProgressBar ) )
787 if( isdefined(
self.suicideTextHud ) )
792 if ( isDefined(
self.suicidePrompt) )
794 self.suicidePrompt setText( &
"ZOMBIE_BUTTON_TO_SUICIDE" );
801 if ( !isAlive(
self ) )
811 if ( !isdefined(
self.suicidePrompt ) )
821 if (
IS_TRUE( level.intermission ) )
839 if ( isdefined( level.revive_trigger_spawn_override_link ) )
841 [[ level.revive_trigger_spawn_override_link ]]( self );
845 radius = GetDvarint(
"revive_trigger_radius" );
846 self.revivetrigger =
spawn(
"trigger_radius", (0.0,0.0,0.0), 0, radius, radius );
847 self.revivetrigger setHintString(
"" );
848 self.revivetrigger setCursorHint(
"HINT_NOICON" );
849 self.revivetrigger SetMovingPlatformEnabled(
true );
850 self.revivetrigger EnableLinkTo();
851 self.revivetrigger.origin =
self.origin;
852 self.revivetrigger LinkTo(
self );
853 self.revivetrigger SetInvisibleToPlayer(
self );
855 self.revivetrigger.beingRevived = 0;
856 self.revivetrigger.createtime = gettime();
867 self endon (
"disconnect" );
868 self endon (
"zombified" );
869 self endon (
"stop_revive_trigger" );
870 level endon(
"end_game");
871 self endon(
"death" );
877 if( isdefined( t_secondary ) )
879 t_revive = t_secondary;
883 t_revive =
self.revivetrigger;
886 t_revive setHintString(
"" );
888 for ( i = 0; i < level.players.size; i++ )
891 n_depth =
self depthinwater();
893 if( isdefined( t_secondary ) )
896 if ( ( level.players[i]
can_revive(
self,
true,
true ) && level.players[i] IsTouching( t_revive ) ) || n_depth > 20 )
898 t_revive setReviveHintString( &
"ZOMBIE_BUTTON_TO_REVIVE_PLAYER",
self.team );
912 t_revive setReviveHintString( &
"ZOMBIE_BUTTON_TO_REVIVE_PLAYER",
self.team );
918 for ( i = 0; i < level.players.size; i++ )
920 e_reviver = level.players[i];
922 if(
self == e_reviver || !e_reviver
is_reviving(
self, t_secondary ) )
928 if ( !isdefined( e_reviver.s_revive_override_used ) || e_reviver.s_revive_override_used.b_use_revive_tool )
930 w_revive_tool = level.weaponReviveTool;
931 if ( isdefined(e_reviver.weaponReviveTool) )
933 w_revive_tool = e_reviver.weaponReviveTool;
937 w_reviver = e_reviver GetCurrentWeapon();
938 assert( isdefined( w_reviver ) );
939 if ( w_reviver == w_revive_tool )
945 e_reviver GiveWeapon( w_revive_tool );
946 e_reviver SwitchToWeapon( w_revive_tool );
947 e_reviver SetWeaponAmmoStock( w_revive_tool, 1 );
953 w_reviver = undefined;
954 w_revive_tool = undefined;
958 b_revive_successful = e_reviver
revive_do_revive(
self, w_reviver, w_revive_tool, t_secondary );
960 e_reviver notify(
"revive_done");
963 if ( IsPlayer(
self ) )
965 self AllowJump(
true);
969 self.laststand = undefined;
971 if( b_revive_successful )
973 if( isdefined( level.a_revive_success_perk_func ) )
975 foreach( func
in level.a_revive_success_perk_func )
984 self notify(
"stop_revive_trigger" );
993 e_revivee endon (
"disconnect" );
994 e_revivee endon (
"zombified" );
995 e_revivee endon (
"stop_revive_trigger" );
996 level endon(
"end_game");
997 e_revivee endon(
"death" );
999 e_reviver waittill(
"revive_done");
1012 self TakeWeapon( w_revive_tool );
1020 if( IsDefined( level.revive_give_back_weapons_custom_func ) &&
self [[ level.revive_give_back_weapons_custom_func ]] ( w_reviver ) )
1036 function can_revive( e_revivee, ignore_sight_checks =
false, ignore_touch_checks =
false )
1038 if ( !isdefined( e_revivee.revivetrigger ) )
1043 if ( !isAlive(
self ) )
1053 if(
self.team != e_revivee.team )
1073 if (
IS_TRUE( level.can_revive_use_depthinwater_test ) && e_revivee depthinwater() > 10 )
1078 if ( isdefined( level.can_revive ) && ![[ level.can_revive ]]( e_revivee ) )
1083 if ( isdefined( level.can_revive_game_module ) && ![[ level.can_revive_game_module ]]( e_revivee ) )
1088 if( !ignore_sight_checks && ( isdefined( level.revive_trigger_should_ignore_sight_checks ) ) )
1090 ignore_sight_checks = [[ level.revive_trigger_should_ignore_sight_checks ]]( self );
1092 if( ignore_sight_checks && isdefined(e_revivee.revivetrigger.beingRevived) && (e_revivee.revivetrigger.beingRevived==1) )
1094 ignore_touch_checks =
true;
1098 if( !ignore_touch_checks )
1100 if ( !
self IsTouching( e_revivee.revivetrigger ) )
1106 if( !ignore_sight_checks )
1113 if ( !SightTracePassed(
self.origin + ( 0, 0, 50 ), e_revivee.origin + ( 0, 0, 30 ),
false, undefined ) )
1119 if ( !bullettracepassed(
self.origin + (0, 0, 50), e_revivee.origin + (0, 0, 30),
false, undefined ) )
1136 if( isdefined( t_secondary ) )
1138 return(
self UseButtonPressed() &&
self can_revive( e_revivee,
true,
true ) &&
self IsTouching( t_secondary ) );
1141 return (
self UseButtonPressed() &&
can_revive( e_revivee ) );
1158 reviveTime = reviveTime / 2;
1161 if ( isdefined(
self.get_revive_time) )
1163 reviveTime =
self [[
self.get_revive_time]](e_revivee);
1180 e_revivee.revivetrigger.beingRevived = 1;
1181 name = level.player_name_directive[
self GetEntityNumber()];
1182 e_revivee.revive_hud setText( &
"ZOMBIE_PLAYER_IS_REVIVING_YOU",
name );
1185 e_revivee.revivetrigger setHintString(
"" );
1187 if ( IsPlayer( e_revivee ) )
1189 e_revivee startrevive(
self );
1197 if( !isdefined(
self.reviveTextHud) )
1199 self.reviveTextHud = newclientHudElem(
self );
1206 self.is_reviving_any = 0;
1208 self.is_reviving_any++;
1211 if( isdefined(
self.reviveProgressBar) )
1216 self.reviveTextHud.alignX =
"center";
1217 self.reviveTextHud.alignY =
"middle";
1218 self.reviveTextHud.horzAlign =
"center";
1219 self.reviveTextHud.vertAlign =
"bottom";
1220 self.reviveTextHud.y = -113;
1221 if (
self IsSplitScreen() )
1223 self.reviveTextHud.y = -347;
1225 self.reviveTextHud.foreground =
true;
1226 self.reviveTextHud.font =
"default";
1227 self.reviveTextHud.fontScale = 1.8;
1228 self.reviveTextHud.alpha = 1;
1229 self.reviveTextHud.color = ( 1.0, 1.0, 1.0 );
1230 self.reviveTextHud.hidewheninmenu =
true;
1231 self.reviveTextHud setText( &
"ZOMBIE_REVIVING" );
1246 if( isdefined( e_revivee.revivetrigger.auto_revive ) && e_revivee.revivetrigger.auto_revive ==
true )
1251 if(
timer >= reviveTime)
1258 if( isdefined(
self.reviveProgressBar ) )
1263 if( isdefined(
self.reviveTextHud ) )
1268 if( isdefined( e_revivee.revivetrigger.auto_revive ) && e_revivee.revivetrigger.auto_revive ==
true )
1274 if ( IsPlayer( e_revivee ) )
1276 e_revivee stoprevive(
self );
1281 e_revivee.revivetrigger setHintString( &
"ZOMBIE_BUTTON_TO_REVIVE_PLAYER" );
1282 e_revivee.revivetrigger.beingRevived = 0;
1284 self notify(
"do_revive_ended_normally" );
1285 self.is_reviving_any--;
1304 self endon (
"player_revived" );
1305 self endon (
"player_suicide" );
1306 self endon (
"disconnect" );
1307 player endon(
"disconnect" );
1318 player.failed_revives++;
1319 player notify(
"player_failed_revive" );
1329 if( isdefined(
self.revivetrigger ) )
1331 self.revivetrigger.auto_revive =
true;
1332 if(
self.revivetrigger.beingRevived == 1 )
1336 if( !isdefined(
self.revivetrigger ) || (
self.revivetrigger.beingRevived == 0 ) )
1345 if( isdefined(
self.revivetrigger ) )
1347 self.revivetrigger.auto_trigger =
false;
1351 self reviveplayer();
1358 self notify(
"stop_revive_trigger" );
1359 if(isdefined(
self.revivetrigger))
1361 self.revivetrigger
delete();
1362 self.revivetrigger = undefined;
1370 self notify(
"clear_red_flashing_overlay");
1372 self AllowJump(
true );
1375 self.laststand = undefined;
1378 if(!
IS_TRUE(level.isresetting_grief))
1381 if( isPlayer( reviver ) )
1387 self RecordPlayerReviveZombies( reviver );
1392 self notify (
"player_revived", reviver );
1397 if( !isdefined(dont_enable_weapons) || (dont_enable_weapons ==
false) )
1410 self playsound(
"zmb_character_remote_revived" );
1419 if( !IsPlayer(
self) )
1421 self notify (
"player_revived", reviver );
1430 self notify (
"player_revived", reviver );
1431 reviver notify (
"player_did_a_revive",
self );
1432 self reviveplayer();
1447 self RecordPlayerReviveZombies( reviver );
1448 reviver.upgrade_fx_origin =
self.origin;
1460 if( isdefined( level.missionCallbacks ) )
1468 self.revivetrigger
delete();
1469 self.revivetrigger = undefined;
1484 if( !isdefined(
self.number_revives_per_round) )
1486 self.number_revives_per_round = [];
1489 if( !isdefined(
self.number_revives_per_round[player_being_revived.characterIndex]) )
1491 self.number_revives_per_round[player_being_revived.characterIndex] = 0;
1494 if(
self.number_revives_per_round[player_being_revived.characterIndex] == 0 )
1498 self.number_revives_per_round[player_being_revived.characterIndex]++;
1505 DEFAULT(
self.laststand_ignoreme,
false);
1506 if ( b_ignoreme !=
self.laststand_ignoreme )
1508 self.laststand_ignoreme = b_ignoreme;
1519 assert( isdefined(
self ) );
1520 assert( IsPlayer(
self ) );
1529 self.laststand_info = SpawnStruct();
1530 self.laststand_info.type_getup_lives = level.CONST_LASTSTAND_GETUP_COUNT_START;
1535 self endon (
"player_revived");
1536 self endon (
"disconnect");
1543 self.laststand_info.getup_bar_value = level.CONST_LASTSTAND_GETUP_BAR_START;
1548 while (
self.laststand_info.getup_bar_value < 1 )
1550 self.laststand_info.getup_bar_value += level.CONST_LASTSTAND_GETUP_BAR_REGEN;
1561 self endon (
"player_revived");
1562 self endon (
"disconnect");
1566 self waittill(
"damage" );
1568 self.laststand_info.getup_bar_value -= level.CONST_LASTSTAND_GETUP_BAR_DAMAGE;
1570 if(
self.laststand_info.getup_bar_value < 0 )
1572 self.laststand_info.getup_bar_value = 0;
1581 self endon(
"sacrifice_denied");
1583 self waittill(
"player_downed");
1594 self endon(
"disconnect");
1596 e_revivee endon(
"disconnect");
1597 e_revivee endon(
"player_suicide");
1599 self notify(
"checking_for_failed_revive");
1600 self endon(
"checking_for_failed_revive");
1602 e_revivee endon(
"player_revived");
1604 e_revivee waittill(
"bled_out");
1626 if ( !isdefined(
self.a_s_revive_overrides ) )
1628 self.a_s_revive_overrides = [];
1631 s_revive_override = SpawnStruct();
1633 s_revive_override.func_is_reviving = func_is_reviving;
1635 if ( isdefined( func_can_revive ) )
1637 s_revive_override.func_can_revive = func_can_revive;
1641 s_revive_override.func_can_revive = func_is_reviving;
1644 s_revive_override.b_use_revive_tool = b_use_revive_tool;
1646 self.a_s_revive_overrides[
self.a_s_revive_overrides.size ] = s_revive_override;
1648 return s_revive_override;
1653 if ( isdefined(
self.a_s_revive_overrides ) )
1655 ArrayRemoveValue(
self.a_s_revive_overrides, s_revive_override );
1661 if ( isdefined(
self.a_s_revive_overrides ) )
1663 for ( i = 0; i <
self.a_s_revive_overrides.size; i++ )
1665 if (
self [[
self.a_s_revive_overrides[ i ].func_can_revive ]]( e_revivee ) )
1677 if ( isdefined(
self.a_s_revive_overrides ) )
1679 for ( i = 0; i <
self.a_s_revive_overrides.size; i++ )
1681 if (
self [[
self.a_s_revive_overrides[ i ].func_is_reviving ]]( e_revivee ) )
1683 self.s_revive_override_used =
self.a_s_revive_overrides[ i ];
1689 self.s_revive_override_used = undefined;