#include maps\mp\_utility; #include common_scripts\utility; #include maps\mp\zombies\_zm_utility; #include maps\mp\gametypes_zm\_hud_util; revive_do_revive( playerbeingrevived, revivergun ) { self thread revive_give_back_weapons_on_player_suicide( playerbeingrevived, revivergun ); self thread revive_check_for_weapon_change(); playerbeingrevived_player = playerbeingrevived; playerbeingrevived_player.revive_hud.y = -160; beingrevivedprogressbar_y = level.primaryprogressbary * -1; if ( isDefined( playerbeingrevived.e_chugabud_player ) ) { playerbeingrevived_player = playerbeingrevived.e_chugabud_player; playerbeingrevived_player.revive_hud.y = -50; beingrevivedprogressbar_y = level.secondaryprogressbary * -2; } revivetime = 3; if ( self hasperk( "specialty_quickrevive" ) ) { revivetime /= 1.5; } if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_revive_active() ) { revivetime *= 0.5; } timer = 0; revived = 0; playerbeingrevived.revivetrigger.beingrevived = 1; playerbeingrevived.revivetrigger sethintstring( "" ); if ( playerbeingrevived_player != self ) { playerbeingrevived_player.revive_hud settext( &"ZOMBIE_PLAYER_IS_REVIVING_YOU", self ); playerbeingrevived_player maps\mp\zombies\_zm_laststand::revive_hud_show_n_fade( revivetime ); } if ( isplayer( playerbeingrevived ) ) { playerbeingrevived startrevive( self ); } if ( !isDefined( playerbeingrevived_player.beingrevivedprogressbar ) && playerbeingrevived_player != self ) { playerbeingrevived_player.beingrevivedprogressbar = playerbeingrevived_player createprimaryprogressbar(); playerbeingrevived_player.beingrevivedprogressbar setpoint("CENTER", undefined, level.primaryprogressbarx, beingrevivedprogressbar_y); playerbeingrevived_player.beingrevivedprogressbar.bar.color = (0.5, 0.5, 1); playerbeingrevived_player.beingrevivedprogressbar.hidewheninmenu = 1; playerbeingrevived_player.beingrevivedprogressbar.bar.hidewheninmenu = 1; playerbeingrevived_player.beingrevivedprogressbar.barframe.hidewheninmenu = 1; playerbeingrevived_player.beingrevivedprogressbar.sort = 1; playerbeingrevived_player.beingrevivedprogressbar.bar.sort = 2; playerbeingrevived_player.beingrevivedprogressbar.barframe.sort = 3; playerbeingrevived_player.beingrevivedprogressbar.barframe destroy(); playerbeingrevived_player.beingrevivedprogressbar thread scripts\zm\_zm_reimagined::destroy_on_intermission(); } if ( !isDefined( self.reviveprogressbar ) ) { self.reviveprogressbar = self createprimaryprogressbar(); self.reviveprogressbar.bar.color = (0.5, 0.5, 1); self.reviveprogressbar.foreground = 1; self.reviveprogressbar.bar.foreground = 1; self.reviveprogressbar.barframe.foreground = 1; self.reviveprogressbar.sort = 1; self.reviveprogressbar.bar.sort = 2; self.reviveprogressbar.barframe.sort = 3; self.reviveprogressbar.barframe destroy(); self.reviveprogressbar thread scripts\zm\_zm_reimagined::destroy_on_intermission(); } if ( !isDefined( self.revivetexthud ) ) { self.revivetexthud = newclienthudelem( self ); } self thread laststand_clean_up_on_disconnect( playerbeingrevived_player, revivergun ); if ( !isDefined( self.is_reviving_any ) ) { self.is_reviving_any = 0; } self.is_reviving_any++; self thread laststand_clean_up_reviving_any( playerbeingrevived_player ); self.reviveprogressbar updatebar( 0.01, 1 / revivetime ); playerbeingrevived_player.beingrevivedprogressbar updatebar( 0.01, 1 / revivetime ); if ( isDefined( playerbeingrevived_player.beingrevivedprogressbar ) ) { playerbeingrevived_player.beingrevivedprogressbar updatebar( 0.01, 1 / revivetime ); } self.revivetexthud.alignx = "center"; self.revivetexthud.aligny = "middle"; self.revivetexthud.horzalign = "center"; self.revivetexthud.vertalign = "bottom"; self.revivetexthud.y = -113; if ( self issplitscreen() ) { self.revivetexthud.y = -347; } self.revivetexthud.foreground = 1; self.revivetexthud.font = "default"; self.revivetexthud.fontscale = 1.8; self.revivetexthud.alpha = 1; self.revivetexthud.color = ( 1, 1, 1 ); self.revivetexthud.hidewheninmenu = 1; if ( self maps\mp\zombies\_zm_pers_upgrades_functions::pers_revive_active() ) { self.revivetexthud.color = ( 0.5, 0.5, 1 ); } self.revivetexthud settext( &"ZOMBIE_REVIVING" ); self thread maps\mp\zombies\_zm_laststand::check_for_failed_revive( playerbeingrevived ); while ( self maps\mp\zombies\_zm_laststand::is_reviving( playerbeingrevived ) ) { wait 0.05; timer += 0.05; if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { break; } else if ( isDefined( playerbeingrevived.revivetrigger.auto_revive ) && playerbeingrevived.revivetrigger.auto_revive == 1 ) { break; } if ( timer >= revivetime ) { revived = 1; break; } } if ( isDefined( playerbeingrevived_player.beingrevivedprogressbar ) ) { if ( !flag( "wait_and_revive" ) ) { playerbeingrevived_player.beingrevivedprogressbar destroyelem(); } } if ( isDefined( playerbeingrevived_player.revive_hud ) ) { playerbeingrevived_player.revive_hud.y = -160; if ( !flag( "wait_and_revive" ) ) { playerbeingrevived_player.revive_hud settext(""); } } if ( isDefined( self.reviveprogressbar ) ) { self.reviveprogressbar destroyelem(); } if ( isDefined( self.revivetexthud ) ) { self.revivetexthud destroy(); } if ( isDefined( playerbeingrevived.revivetrigger.auto_revive ) && playerbeingrevived.revivetrigger.auto_revive == 1 ) { } else if ( !revived ) { if ( isplayer( playerbeingrevived ) ) { playerbeingrevived stoprevive( self ); } } playerbeingrevived.revivetrigger sethintstring( &"ZOMBIE_BUTTON_TO_REVIVE_PLAYER" ); playerbeingrevived.revivetrigger.beingrevived = 0; self notify( "do_revive_ended_normally" ); self.is_reviving_any--; if ( !revived ) { playerbeingrevived thread maps\mp\zombies\_zm_laststand::checkforbleedout( self ); } return revived; } revive_give_back_weapons_on_player_suicide( playerbeingrevived, revivergun ) { self notify( "revive_give_back_weapons_on_player_suicide" ); self endon( "revive_give_back_weapons_on_player_suicide" ); self endon( "do_revive_ended_normally" ); playerbeingrevived waittill( "player_suicide" ); self maps\mp\zombies\_zm_laststand::revive_give_back_weapons( revivergun ); } revive_check_for_weapon_change() { self notify( "revive_check_for_weapon_change" ); self endon( "revive_check_for_weapon_change" ); self endon( "do_revive_ended_normally" ); self.revive_weapon_changed = 0; self waittill_any( "weapon_change", "weapon_change_complete" ); self.revive_weapon_changed = 1; } laststand_clean_up_on_disconnect( playerbeingrevived, revivergun ) { self endon( "do_revive_ended_normally" ); revivetrigger = playerbeingrevived.revivetrigger; playerbeingrevived waittill( "disconnect" ); if ( isDefined( revivetrigger ) ) { revivetrigger delete(); } self maps\mp\zombies\_zm_laststand::cleanup_suicide_hud(); if ( isDefined( self.reviveprogressbar ) ) { self.reviveprogressbar destroyelem(); } if ( isDefined( self.revivetexthud ) ) { self.revivetexthud destroy(); } self maps\mp\zombies\_zm_laststand::revive_give_back_weapons( revivergun ); } laststand_clean_up_reviving_any( playerbeingrevived ) { self endon( "do_revive_ended_normally" ); playerbeingrevived waittill_any( "disconnect", "zombified", "stop_revive_trigger", "chugabud_effects_cleanup" ); self.is_reviving_any--; if ( self.is_reviving_any < 0 ) { self.is_reviving_any = 0; } if ( isDefined( playerbeingrevived.beingrevivedprogressbar ) ) { playerbeingrevived.beingrevivedprogressbar destroyelem(); } if ( isDefined( playerbeingrevived.revive_hud ) ) { playerbeingrevived.revive_hud settext(""); } if ( !self.is_reviving_any ) { if ( isDefined( self.reviveprogressbar ) ) { self.reviveprogressbar destroyelem(); } if ( isDefined( self.revivetexthud ) ) { self.revivetexthud destroy(); } } } revive_give_back_weapons( gun ) { revive_tool = level.revive_tool; if ( is_true( self.afterlife ) ) { revive_tool = level.afterlife_revive_tool; } cur_wep = self getCurrentWeapon(); self takeweapon( revive_tool ); if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { return; } if ( cur_wep != revive_tool && is_true( self.revive_weapon_changed ) ) { return; } if ( self hasWeapon( "item_meat_zm" ) ) { return; } if ( self hasWeapon( "screecher_arms_zm" ) ) { return; } if ( gun != "none" && gun != "equip_gasmask_zm" && gun != "lower_equip_gasmask_zm" && self hasweapon( gun ) ) { self switchtoweapon( gun ); } else { primaryweapons = self getweaponslistprimaries(); if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) { self switchtoweapon( primaryweapons[ 0 ] ); } } } revive_hud_think() { self endon( "disconnect" ); while ( 1 ) { wait 0.1; if ( !maps\mp\zombies\_zm_laststand::player_any_player_in_laststand() ) { continue; } players = get_players(); playertorevive = undefined; i = 0; while ( i < players.size ) { if ( !isDefined( players[ i ].revivetrigger ) || !isDefined( players[ i ].revivetrigger.createtime ) ) { i++; continue; } if ( !isDefined( playertorevive ) || playertorevive.revivetrigger.createtime > players[ i ].revivetrigger.createtime ) { playertorevive = players[ i ]; } i++; } if ( isDefined( playertorevive ) ) { i = 0; while ( i < players.size ) { if ( players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { i++; continue; } if ( getDvar( "g_gametype" ) == "vs" ) { if ( players[ i ].team != playertorevive.team ) { i++; continue; } } if ( is_encounter() ) { if ( players[ i ].sessionteam != playertorevive.sessionteam ) { i++; continue; } if ( is_true( level.hide_revive_message ) ) { i++; continue; } } players[ i ] thread maps\mp\zombies\_zm_laststand::faderevivemessageover( playertorevive, 3 ); i++; } playertorevive.revivetrigger.createtime = undefined; } } } auto_revive( reviver, dont_enable_weapons ) { if ( isdefined( self.revivetrigger ) ) { self.revivetrigger.auto_revive = 1; if ( self.revivetrigger.beingrevived == 1 ) { while ( true ) { if ( self.revivetrigger.beingrevived == 0 ) break; wait_network_frame(); } } self.revivetrigger.auto_trigger = 0; } self reviveplayer(); self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 ); setclientsysstate( "lsm", "0", self ); self notify( "stop_revive_trigger" ); if ( isdefined( self.revivetrigger ) ) { self.revivetrigger delete(); self.revivetrigger = undefined; } self cleanup_suicide_hud(); if ( !isdefined( dont_enable_weapons ) || dont_enable_weapons == 0 ) self laststand_enable_player_weapons(); self allowjump( 1 ); self.ignoreme = 0; self.laststand = undefined; valid_reviver = 1; if ( is_gametype_active( "zgrief" ) && reviver == self ) { valid_reviver = 0; } if ( valid_reviver ) { reviver.revives++; reviver maps\mp\zombies\_zm_stats::increment_client_stat( "revives" ); reviver maps\mp\zombies\_zm_stats::increment_player_stat( "revives" ); self recordplayerrevivezombies( reviver ); maps\mp\_demo::bookmark( "zm_player_revived", gettime(), self, reviver ); } self notify( "player_revived", reviver ); } playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) { self notify( "entering_last_stand" ); if ( isdefined( level._game_module_player_laststand_callback ) ) self [[ level._game_module_player_laststand_callback ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); if ( self player_is_in_laststand() ) return; if ( isdefined( self.in_zombify_call ) && self.in_zombify_call ) return; self thread player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); if ( isdefined( level.playerlaststand_func ) ) [[ level.playerlaststand_func ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); self.health = 1; self.laststand = 1; self.ignoreme = 1; self thread maps\mp\gametypes_zm\_gameobjects::onplayerlaststand(); self thread maps\mp\zombies\_zm_buildables::onplayerlaststand(); if ( !( isdefined( self.no_revive_trigger ) && self.no_revive_trigger ) ) self revive_trigger_spawn(); else self undolaststand(); if ( isdefined( self.is_zombie ) && self.is_zombie ) { self takeallweapons(); if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self ) attacker notify( "killed_a_zombie_player", einflictor, self, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); } else { self laststand_disable_player_weapons(); self laststand_give_pistol(); } if ( isdefined( level.playersuicideallowed ) && level.playersuicideallowed && get_players().size > 1 ) { if ( !isdefined( level.canplayersuicide ) || self [[ level.canplayersuicide ]]() ) self thread suicide_trigger_spawn(); } if ( level.laststandgetupallowed ) self thread laststand_getup(); else { bleedout_time = getdvarfloat( "player_lastStandBleedoutTime" ); self thread laststand_bleedout( bleedout_time ); } if ( "zcleansed" != level.gametype ) maps\mp\_demo::bookmark( "zm_player_downed", gettime(), self ); self notify( "player_downed" ); self thread refire_player_downed(); self thread cleanup_laststand_on_disconnect(); } revive_hud_create() { if (isDefined(self.revive_hud)) { return; } self.revive_hud = newclienthudelem( self ); self.revive_hud.alignx = "center"; self.revive_hud.aligny = "middle"; self.revive_hud.horzalign = "center"; self.revive_hud.vertalign = "bottom"; self.revive_hud.foreground = 1; self.revive_hud.font = "default"; self.revive_hud.fontscale = 1.5; self.revive_hud.alpha = 0; self.revive_hud.color = ( 1, 1, 1 ); self.revive_hud.hidewheninmenu = 1; self.revive_hud settext( "" ); self.revive_hud.y = -160; }