mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-10 15:17:57 -05:00
493 lines
12 KiB
Plaintext
493 lines
12 KiB
Plaintext
#include maps\mp\zombies\_zm_chugabud;
|
|
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
#include maps\mp\gametypes_zm\_hud_util;
|
|
|
|
chugabud_laststand()
|
|
{
|
|
self endon( "player_suicide" );
|
|
self endon( "disconnect" );
|
|
self endon( "chugabud_bleedout" );
|
|
|
|
if ( isdefined( self.e_chugabud_corpse ) )
|
|
{
|
|
self notify( "chugabud_handle_multiple_instances" );
|
|
return;
|
|
}
|
|
|
|
self maps\mp\zombies\_zm_laststand::increment_downed_stat();
|
|
self.ignore_insta_kill = 1;
|
|
self.health = self.maxhealth;
|
|
self chugabud_save_loadout();
|
|
self chugabud_fake_death();
|
|
wait 3;
|
|
|
|
if ( isdefined( self.insta_killed ) && self.insta_killed || isdefined( self.disable_chugabud_corpse ) )
|
|
create_corpse = 0;
|
|
else
|
|
create_corpse = 1;
|
|
|
|
if ( create_corpse == 1 )
|
|
{
|
|
if ( isdefined( level._chugabug_reject_corpse_override_func ) )
|
|
{
|
|
reject_corpse = self [[ level._chugabug_reject_corpse_override_func ]]( self.origin );
|
|
|
|
if ( reject_corpse )
|
|
create_corpse = 0;
|
|
}
|
|
}
|
|
|
|
if ( create_corpse == 1 )
|
|
{
|
|
self thread activate_chugabud_effects_and_audio();
|
|
corpse = self chugabud_spawn_corpse();
|
|
self.e_chugabud_corpse = corpse;
|
|
corpse.e_chugabud_player = self;
|
|
corpse thread chugabud_corpse_revive_icon( self );
|
|
corpse thread chugabud_corpse_cleanup_on_spectator( self );
|
|
corpse thread chugabud_corpse_cleanup_on_disconnect( self );
|
|
|
|
if ( isdefined( level.whos_who_client_setup ) )
|
|
corpse setclientfield( "clientfield_whos_who_clone_glow_shader", 1 );
|
|
}
|
|
|
|
self thread chugabud_fake_revive();
|
|
wait 0.1;
|
|
self.ignore_insta_kill = undefined;
|
|
self.disable_chugabud_corpse = undefined;
|
|
|
|
if ( create_corpse == 0 )
|
|
{
|
|
if ( is_player_valid( self ) )
|
|
{
|
|
self.statusicon = "";
|
|
}
|
|
|
|
self notify( "chugabud_effects_cleanup" );
|
|
return;
|
|
}
|
|
|
|
bleedout_time = 30;
|
|
self thread chugabud_bleed_timeout( bleedout_time, corpse );
|
|
self thread chugabud_handle_multiple_instances( corpse );
|
|
|
|
corpse waittill( "player_revived", e_reviver );
|
|
|
|
if ( isdefined( e_reviver ) && e_reviver == self )
|
|
self notify( "whos_who_self_revive" );
|
|
|
|
self perk_abort_drinking( 0.1 );
|
|
self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 );
|
|
self setorigin( corpse.origin );
|
|
self setplayerangles( corpse.angles );
|
|
|
|
if ( self player_is_in_laststand() )
|
|
{
|
|
self thread chugabud_laststand_cleanup( corpse, "player_revived" );
|
|
self enableweaponcycling();
|
|
self enableoffhandweapons();
|
|
self auto_revive( self, 1 );
|
|
return;
|
|
}
|
|
|
|
self chugabud_laststand_cleanup( corpse, undefined );
|
|
}
|
|
|
|
chugabud_save_loadout()
|
|
{
|
|
primaries = self getweaponslistprimaries();
|
|
currentweapon = self getcurrentweapon();
|
|
self.loadout = spawnstruct();
|
|
self.loadout.player = self;
|
|
self.loadout.weapons = [];
|
|
self.loadout.score = self.score;
|
|
self.loadout.current_weapon = -1;
|
|
|
|
foreach ( index, weapon in primaries )
|
|
{
|
|
self.loadout.weapons[index] = maps\mp\zombies\_zm_weapons::get_player_weapondata( self, weapon );
|
|
|
|
if ( weapon == currentweapon || self.loadout.weapons[index]["alt_name"] == currentweapon )
|
|
self.loadout.current_weapon = index;
|
|
}
|
|
|
|
self.loadout.equipment = self get_player_equipment();
|
|
|
|
if ( isdefined( self.loadout.equipment ) )
|
|
self equipment_take( self.loadout.equipment );
|
|
|
|
self.loadout save_weapons_for_chugabud( self );
|
|
|
|
if ( self hasweapon( "claymore_zm" ) )
|
|
{
|
|
self.loadout.hasclaymore = 1;
|
|
self.loadout.claymoreclip = self getweaponammoclip( "claymore_zm" );
|
|
}
|
|
|
|
self.loadout.perks = chugabud_save_perks( self );
|
|
self chugabud_save_grenades();
|
|
|
|
if ( maps\mp\zombies\_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
|
self.loadout.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" );
|
|
}
|
|
|
|
chugabud_save_perks( ent )
|
|
{
|
|
perk_array = ent get_perk_array( 1 );
|
|
|
|
foreach ( perk in perk_array )
|
|
{
|
|
if ( perk == "specialty_additionalprimaryweapon" )
|
|
{
|
|
ent maps\mp\zombies\_zm::take_additionalprimaryweapon();
|
|
}
|
|
|
|
ent unsetperk( perk );
|
|
}
|
|
|
|
return perk_array;
|
|
}
|
|
|
|
chugabud_fake_death()
|
|
{
|
|
level notify( "fake_death" );
|
|
self notify( "fake_death" );
|
|
self takeallweapons();
|
|
self allowstand( 0 );
|
|
self allowcrouch( 0 );
|
|
self allowprone( 1 );
|
|
self setstance( "prone" );
|
|
self.ignoreme = 1;
|
|
self enableinvulnerability();
|
|
|
|
if ( self is_jumping() )
|
|
{
|
|
while ( self is_jumping() )
|
|
wait 0.05;
|
|
}
|
|
|
|
self freezecontrols( 1 );
|
|
}
|
|
|
|
chugabud_fake_revive()
|
|
{
|
|
level notify( "fake_revive" );
|
|
self notify( "fake_revive" );
|
|
playsoundatposition( "evt_ww_disappear", self.origin );
|
|
playfx( level._effect["chugabud_revive_fx"], self.origin );
|
|
spawnpoint = chugabud_get_spawnpoint();
|
|
|
|
if ( isdefined( level._chugabud_post_respawn_override_func ) )
|
|
self [[ level._chugabud_post_respawn_override_func ]]( spawnpoint.origin );
|
|
|
|
if ( isdefined( level.chugabud_force_corpse_position ) )
|
|
{
|
|
if ( isdefined( self.e_chugabud_corpse ) )
|
|
self.e_chugabud_corpse forceteleport( level.chugabud_force_corpse_position );
|
|
|
|
level.chugabud_force_corpse_position = undefined;
|
|
}
|
|
|
|
if ( isdefined( level.chugabud_force_player_position ) )
|
|
{
|
|
spawnpoint.origin = level.chugabud_force_player_position;
|
|
level.chugabud_force_player_position = undefined;
|
|
}
|
|
|
|
self allowstand( 1 );
|
|
self allowcrouch( 1 );
|
|
self allowprone( 1 );
|
|
self setstance( "stand" );
|
|
self chugabud_give_loadout();
|
|
self seteverhadweaponall( 1 );
|
|
self.score = self.loadout.score;
|
|
self.pers["score"] = self.loadout.score;
|
|
|
|
self setorigin( spawnpoint.origin );
|
|
self setplayerangles( spawnpoint.angles );
|
|
playsoundatposition( "evt_ww_appear", spawnpoint.origin );
|
|
playfx( level._effect["chugabud_revive_fx"], spawnpoint.origin );
|
|
|
|
wait 0.5;
|
|
|
|
self freezecontrols( 0 );
|
|
|
|
wait 0.5;
|
|
|
|
self.ignoreme = 0;
|
|
|
|
wait 1;
|
|
|
|
self disableinvulnerability();
|
|
}
|
|
|
|
chugabud_give_loadout()
|
|
{
|
|
self takeallweapons();
|
|
loadout = self.loadout;
|
|
primaries = self getweaponslistprimaries();
|
|
|
|
if ( loadout.weapons.size > 1 || primaries.size > 1 )
|
|
{
|
|
foreach ( weapon in primaries )
|
|
self takeweapon( weapon );
|
|
}
|
|
|
|
weapons_given = 0;
|
|
for ( i = 0; i < loadout.weapons.size; i++ )
|
|
{
|
|
if ( !isdefined( loadout.weapons[i] ) )
|
|
continue;
|
|
|
|
if ( loadout.weapons[i]["name"] == "none" )
|
|
continue;
|
|
|
|
self maps\mp\zombies\_zm_weapons::weapondata_give( loadout.weapons[i] );
|
|
|
|
weapons_given++;
|
|
if (weapons_given >= 2)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( loadout.current_weapon >= 0 && isdefined( loadout.weapons[loadout.current_weapon]["name"] ) )
|
|
self switchtoweapon( loadout.weapons[loadout.current_weapon]["name"] );
|
|
|
|
self giveweapon( "knife_zm" );
|
|
self.do_not_display_equipment_pickup_hint = 1;
|
|
self maps\mp\zombies\_zm_equipment::equipment_give( self.loadout.equipment );
|
|
self.do_not_display_equipment_pickup_hint = undefined;
|
|
loadout restore_weapons_for_chugabud( self );
|
|
self chugabud_restore_claymore();
|
|
self.score = loadout.score;
|
|
self.pers["score"] = loadout.score;
|
|
|
|
self chugabud_restore_grenades();
|
|
|
|
if ( maps\mp\zombies\_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
|
{
|
|
if ( loadout.zombie_cymbal_monkey_count )
|
|
{
|
|
self maps\mp\zombies\_zm_weap_cymbal_monkey::player_give_cymbal_monkey();
|
|
self setweaponammoclip( "cymbal_monkey_zm", loadout.zombie_cymbal_monkey_count );
|
|
}
|
|
}
|
|
|
|
self.loadout.weapons = undefined;
|
|
}
|
|
|
|
chugabud_give_perks()
|
|
{
|
|
loadout = self.loadout;
|
|
|
|
if ( isdefined( loadout.perks ) && loadout.perks.size > 0 )
|
|
{
|
|
for ( i = 0; i < loadout.perks.size; i++ )
|
|
{
|
|
if ( self hasperk( loadout.perks[i] ) )
|
|
continue;
|
|
|
|
if ( loadout.perks[i] == "specialty_quickrevive" && flag( "solo_game" ) )
|
|
level.solo_game_free_player_quickrevive = 1;
|
|
|
|
if ( loadout.perks[i] == "specialty_finalstand" )
|
|
continue;
|
|
|
|
maps\mp\zombies\_zm_perks::give_perk( loadout.perks[i] );
|
|
}
|
|
}
|
|
self.loadout.perks = undefined;
|
|
}
|
|
|
|
chugabud_spawn_corpse()
|
|
{
|
|
corpse = maps\mp\zombies\_zm_clone::spawn_player_clone( self, self.origin, undefined, self.whos_who_shader );
|
|
corpse.angles = self.angles;
|
|
corpse maps\mp\zombies\_zm_clone::clone_give_weapon( "m1911_zm" );
|
|
corpse maps\mp\zombies\_zm_clone::clone_animate( "laststand" );
|
|
corpse thread maps\mp\zombies\_zm_laststand::revive_trigger_spawn();
|
|
return corpse;
|
|
}
|
|
|
|
chugabud_bleed_timeout_hud_create( delay )
|
|
{
|
|
hud = self createbar((0.25, 0.25, 1), level.secondaryprogressbarwidth * 2, level.secondaryprogressbarheight);
|
|
hud setpoint("CENTER", undefined, level.secondaryprogressbarx, -2.25 * level.secondaryprogressbary);
|
|
hud.hidewheninmenu = 1;
|
|
hud.bar.hidewheninmenu = 1;
|
|
hud.barframe.hidewheninmenu = 1;
|
|
hud.foreground = 1;
|
|
hud.bar.foreground = 1;
|
|
hud.barframe.foreground = 1;
|
|
hud.sort = 1;
|
|
hud.bar.sort = 2;
|
|
hud.barframe.sort = 3;
|
|
hud.barframe destroy();
|
|
hud thread scripts\zm\_zm_reimagined::destroy_on_intermission();
|
|
|
|
hud updatebar(1);
|
|
hud.bar scaleovertime(delay, 1, hud.height);
|
|
|
|
return hud;
|
|
}
|
|
|
|
chugabud_corpse_revive_icon( player )
|
|
{
|
|
self endon( "death" );
|
|
height_offset = 30;
|
|
index = player.clientid;
|
|
self.revive_waypoint_origin = spawn( "script_model", self.origin + (0, 0, height_offset) );
|
|
self.revive_waypoint_origin setmodel( "tag_origin" );
|
|
self.revive_waypoint_origin linkto( self );
|
|
|
|
hud_elem = newhudelem();
|
|
self.revive_hud_elem = hud_elem;
|
|
hud_elem.alpha = 1;
|
|
hud_elem.archived = 1;
|
|
hud_elem.hidewheninmenu = 1;
|
|
hud_elem.immunetodemogamehudsettings = 1;
|
|
hud_elem setwaypoint( 1, "specialty_chugabud_zombies" );
|
|
hud_elem settargetent( self.revive_waypoint_origin );
|
|
}
|
|
|
|
chugabud_corpse_cleanup( corpse, was_revived )
|
|
{
|
|
self notify( "chugabud_effects_cleanup" );
|
|
|
|
if ( was_revived )
|
|
{
|
|
playsoundatposition( "evt_ww_appear", corpse.origin );
|
|
playfx( level._effect["chugabud_revive_fx"], corpse.origin );
|
|
}
|
|
else
|
|
{
|
|
playsoundatposition( "evt_ww_disappear", corpse.origin );
|
|
playfx( level._effect["chugabud_bleedout_fx"], corpse.origin );
|
|
self notify( "chugabud_bleedout" );
|
|
}
|
|
|
|
if ( isdefined( corpse.revivetrigger ) )
|
|
{
|
|
corpse notify( "stop_revive_trigger" );
|
|
corpse.revivetrigger delete();
|
|
corpse.revivetrigger = undefined;
|
|
}
|
|
|
|
if ( isdefined( corpse.revive_hud_elem ) )
|
|
{
|
|
corpse.revive_hud_elem destroy();
|
|
corpse.revive_hud_elem = undefined;
|
|
}
|
|
|
|
if ( isdefined( corpse.revive_waypoint_origin ) )
|
|
{
|
|
corpse.revive_waypoint_origin delete();
|
|
corpse.revive_waypoint_origin = undefined;
|
|
}
|
|
|
|
if ( isdefined( self.chugabud_bleed_timeout_hud ) )
|
|
{
|
|
self.chugabud_bleed_timeout_hud destroy();
|
|
self.chugabud_bleed_timeout_hud.bar destroy();
|
|
self.chugabud_bleed_timeout_hud.barframe destroy();
|
|
self.chugabud_bleed_timeout_hud = undefined;
|
|
}
|
|
|
|
self.loadout = undefined;
|
|
wait 0.1;
|
|
corpse delete();
|
|
self.e_chugabud_corpse = undefined;
|
|
|
|
if ( is_player_valid( self ) )
|
|
{
|
|
self.statusicon = "";
|
|
}
|
|
}
|
|
|
|
chugabud_handle_multiple_instances( corpse )
|
|
{
|
|
corpse endon( "death" );
|
|
|
|
self waittill( "chugabud_handle_multiple_instances" );
|
|
|
|
self thread chugabud_laststand_wait( corpse );
|
|
self chugabud_corpse_cleanup( corpse, 0 );
|
|
}
|
|
|
|
chugabud_laststand_wait( corpse )
|
|
{
|
|
corpse waittill( "death" );
|
|
|
|
self chugabud_laststand();
|
|
}
|
|
|
|
chugabud_corpse_cleanup_on_disconnect( player )
|
|
{
|
|
self endon( "death" );
|
|
|
|
player waittill( "disconnect" );
|
|
|
|
player chugabud_corpse_cleanup( self, 0 );
|
|
}
|
|
|
|
chugabud_laststand_cleanup( corpse, str_notify )
|
|
{
|
|
if ( isdefined( str_notify ) )
|
|
self waittill( str_notify );
|
|
|
|
self setstance( "stand" );
|
|
self thread chugabud_leave_freeze();
|
|
self thread chugabud_revive_invincible();
|
|
self chugabud_give_perks();
|
|
self chugabud_corpse_cleanup( corpse, 1 );
|
|
}
|
|
|
|
chugabud_leave_freeze()
|
|
{
|
|
self endon( "disconnect" );
|
|
level endon( "end_game" );
|
|
|
|
self freezecontrols( 1 );
|
|
|
|
wait 0.5;
|
|
|
|
if ( !is_true( self.hostmigrationcontrolsfrozen ) )
|
|
self freezecontrols( 0 );
|
|
}
|
|
|
|
chugabud_revive_invincible()
|
|
{
|
|
self endon( "disconnect" );
|
|
level endon( "end_game" );
|
|
|
|
self.health = self.maxhealth;
|
|
self enableinvulnerability();
|
|
|
|
wait 2;
|
|
|
|
self disableinvulnerability();
|
|
}
|
|
|
|
chugabud_bleed_timeout( delay, corpse )
|
|
{
|
|
self endon( "player_suicide" );
|
|
self endon( "disconnect" );
|
|
corpse endon( "death" );
|
|
|
|
self.chugabud_bleed_timeout_hud = self chugabud_bleed_timeout_hud_create( delay );
|
|
|
|
wait delay;
|
|
|
|
if ( isDefined( corpse.revivetrigger ) )
|
|
{
|
|
while ( corpse.revivetrigger.beingrevived )
|
|
{
|
|
wait 0.01;
|
|
}
|
|
}
|
|
|
|
self chugabud_corpse_cleanup( corpse, 0 );
|
|
} |