1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-07 21:59:49 -05:00
BO2-Reimagined/scripts/zm/replaced/_zm_afterlife.gsc
2023-12-23 01:18:40 -08:00

733 lines
21 KiB
Plaintext

#include maps\mp\zombies\_zm_afterlife;
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\gametypes_zm\_hud_util;
#include maps\mp\gametypes_zm\_hud;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zm_alcatraz_utility;
#include maps\mp\_visionset_mgr;
#include maps\mp\zombies\_zm;
#include maps\mp\zombies\_zm_unitrigger;
#include maps\mp\zombies\_zm_perks;
#include maps\mp\zombies\_zm_perk_electric_cherry;
#include maps\mp\zombies\_zm_clone;
#include maps\mp\zombies\_zm_pers_upgrades_functions;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\gametypes_zm\_zm_gametype;
#include maps\mp\zm_alcatraz_travel;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\animscripts\shared;
#include maps\mp\zombies\_zm_ai_basic;
init()
{
level.zombiemode_using_afterlife = 1;
flag_init("afterlife_start_over");
level.afterlife_revive_tool = "syrette_afterlife_zm";
precacheitem(level.afterlife_revive_tool);
precachemodel("drone_collision");
maps\mp\_visionset_mgr::vsmgr_register_info("visionset", "zm_afterlife", 9000, 120, 1, 1);
maps\mp\_visionset_mgr::vsmgr_register_info("overlay", "zm_afterlife_filter", 9000, 120, 1, 1);
if (isdefined(level.afterlife_player_damage_override))
maps\mp\zombies\_zm::register_player_damage_callback(level.afterlife_player_damage_override);
else
maps\mp\zombies\_zm::register_player_damage_callback(::afterlife_player_damage_callback);
registerclientfield("toplayer", "player_lives", 9000, 2, "int");
registerclientfield("toplayer", "player_in_afterlife", 9000, 1, "int");
registerclientfield("toplayer", "player_afterlife_mana", 9000, 5, "float");
registerclientfield("allplayers", "player_afterlife_fx", 9000, 1, "int");
registerclientfield("toplayer", "clientfield_afterlife_audio", 9000, 1, "int");
registerclientfield("toplayer", "player_afterlife_refill", 9000, 1, "int");
registerclientfield("scriptmover", "player_corpse_id", 9000, 3, "int");
afterlife_load_fx();
level thread afterlife_hostmigration();
precachemodel("c_zom_ghost_viewhands");
precachemodel("c_zom_hero_ghost_fb");
precacheitem("lightning_hands_zm");
precachemodel("p6_zm_al_shock_box_on");
precacheshader("waypoint_revive_afterlife");
a_afterlife_interact = getentarray("afterlife_interact", "targetname");
array_thread(a_afterlife_interact, ::afterlife_interact_object_think);
level.zombie_spawners = getentarray("zombie_spawner", "script_noteworthy");
array_thread(level.zombie_spawners, ::add_spawn_function, ::afterlife_zombie_damage);
a_afterlife_triggers = getstructarray("afterlife_trigger", "targetname");
foreach (struct in a_afterlife_triggers)
afterlife_trigger_create(struct);
level.afterlife_interact_dist = 256;
level.is_player_valid_override = ::is_player_valid_afterlife;
level.can_revive = ::can_revive_override;
level.round_prestart_func = ::afterlife_start_zombie_logic;
level.custom_pap_validation = ::is_player_valid_afterlife;
level.player_out_of_playable_area_monitor_callback = ::player_out_of_playable_area;
level thread afterlife_gameover_cleanup();
level.afterlife_get_spawnpoint = ::afterlife_get_spawnpoint;
level.afterlife_zapped = ::afterlife_zapped;
level.afterlife_give_loadout = ::afterlife_give_loadout;
level.afterlife_save_loadout = ::afterlife_save_loadout;
}
init_player()
{
flag_wait("initial_players_connected");
self.lives = 1;
self setclientfieldtoplayer("player_lives", self.lives);
self.afterlife = 0;
self.afterliferound = level.round_number;
self.afterlifedeaths = 0;
self thread afterlife_doors_close();
self thread afterlife_player_refill_watch();
}
afterlife_add()
{
if (self.lives < 1)
{
self.lives++;
self thread afterlife_add_fx();
}
self playsoundtoplayer("zmb_afterlife_add", self);
self setclientfieldtoplayer("player_lives", self.lives);
}
afterlife_start_zombie_logic()
{
flag_wait("start_zombie_round_logic");
wait 0.5;
everyone_alive = 0;
while (isDefined(everyone_alive) && !everyone_alive)
{
everyone_alive = 1;
players = getplayers();
foreach (player in players)
{
if (isDefined(player.afterlife) && player.afterlife)
{
everyone_alive = 0;
wait 0.05;
break;
}
}
}
wait 0.5;
while (level.intermission)
{
wait 0.05;
}
flag_set("afterlife_start_over");
wait 2;
array_func(getplayers(), ::afterlife_add);
}
afterlife_laststand(b_electric_chair = 0)
{
self endon("disconnect");
self endon("afterlife_bleedout");
level endon("end_game");
if (isdefined(level.afterlife_laststand_override))
{
self thread [[level.afterlife_laststand_override]](b_electric_chair);
return;
}
self.dontspeak = 1;
self.health = 1000;
b_has_electric_cherry = 0;
if (self hasperk("specialty_grenadepulldeath"))
b_has_electric_cherry = 1;
self [[level.afterlife_save_loadout]]();
self afterlife_fake_death();
if (isdefined(b_electric_chair) && !b_electric_chair)
wait 1;
if (isdefined(b_has_electric_cherry) && b_has_electric_cherry && (isdefined(b_electric_chair) && !b_electric_chair))
{
self scripts\zm\replaced\_zm_perk_electric_cherry::electric_cherry_laststand();
}
self setclientfieldtoplayer("clientfield_afterlife_audio", 1);
if (flag("afterlife_start_over"))
{
self clientnotify("al_t");
wait 1;
self thread fadetoblackforxsec(0, 1, 0.5, 0.5, "white");
wait 0.5;
}
self ghost();
corpse = self afterlife_spawn_corpse();
self.e_afterlife_corpse = corpse;
corpse.e_afterlife_player = self;
self thread afterlife_clean_up_on_disconnect();
self notify("player_fake_corpse_created");
self afterlife_fake_revive();
self afterlife_enter();
self.e_afterlife_corpse setclientfield("player_corpse_id", self getentitynumber() + 1);
wait 0.5;
self show();
if (!(isdefined(self.hostmigrationcontrolsfrozen) && self.hostmigrationcontrolsfrozen))
self freezecontrols(0);
self disableinvulnerability();
self.e_afterlife_corpse waittill("player_revived", e_reviver);
self notify("player_revived");
self enableinvulnerability();
self.afterlife_revived = 1;
playsoundatposition("zmb_afterlife_spawn_leave", self.e_afterlife_corpse.origin);
self afterlife_leave();
self seteverhadweaponall(1);
self thread afterlife_revive_invincible();
self playsound("zmb_afterlife_revived_gasp");
}
afterlife_spawn_corpse()
{
if (isdefined(self.is_on_gondola) && self.is_on_gondola && level.e_gondola.destination == "roof")
corpse = maps\mp\zombies\_zm_clone::spawn_player_clone(self, self.origin, undefined);
else
{
trace_start = self.origin;
trace_end = self.origin + vectorscale((0, 0, -1), 500.0);
corpse_trace = playerphysicstrace(trace_start, trace_end);
corpse = spawn_player_clone(self, corpse_trace, undefined);
}
corpse.angles = self.angles;
corpse.ignoreme = 1;
corpse maps\mp\zombies\_zm_clone::clone_give_weapon(level.start_weapon);
corpse maps\mp\zombies\_zm_clone::clone_animate("afterlife");
corpse thread afterlife_revive_trigger_spawn();
collision = spawn("script_model", corpse.origin + (0, 0, 16));
collision.angles = corpse.angles;
collision setmodel("collision_clip_32x32x32");
collision linkto(corpse);
collision ghost();
corpse.collision = collision;
if (get_players().size == 1)
corpse thread afterlife_corpse_create_pois();
return corpse;
}
afterlife_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 enableinvulnerability();
self.ignoreme = 1;
if (self is_jumping())
{
while (self is_jumping())
wait 0.05;
}
playfx(level._effect["afterlife_enter"], self.origin);
self freezecontrols(1);
}
afterlife_fake_revive()
{
level notify("fake_revive");
self notify("fake_revive");
playsoundatposition("zmb_afterlife_spawn_leave", self.origin);
self allowstand(1);
self allowcrouch(0);
self allowprone(0);
self.ignoreme = 0;
self setstance("stand");
self giveweapon("lightning_hands_zm");
self switchtoweapon("lightning_hands_zm");
self.score = 0;
if (flag("afterlife_start_over"))
{
spawnpoint = [[level.afterlife_get_spawnpoint]]();
trace_start = spawnpoint.origin;
trace_end = spawnpoint.origin + vectorscale((0, 0, -1), 200.0);
respawn_trace = playerphysicstrace(trace_start, trace_end);
dir = vectornormalize(self.origin - respawn_trace);
angles = vectortoangles(dir);
self setorigin(respawn_trace);
self setplayerangles(angles);
playsoundatposition("zmb_afterlife_spawn_enter", spawnpoint.origin);
}
else
{
playsoundatposition("zmb_afterlife_spawn_enter", self.origin);
}
wait 1;
}
afterlife_revive_invincible()
{
self endon("disconnect");
wait 2;
self disableinvulnerability();
self.afterlife_revived = undefined;
}
afterlife_revive_do_revive(playerbeingrevived, revivergun)
{
playerbeingrevived_player = playerbeingrevived;
playerbeingrevived_player.revive_hud.y = -160;
beingrevivedprogressbar_y = level.primaryprogressbary * -1;
if (isDefined(playerbeingrevived.e_afterlife_player))
{
playerbeingrevived_player = playerbeingrevived.e_afterlife_player;
playerbeingrevived_player.revive_hud.y = -50;
beingrevivedprogressbar_y = level.secondaryprogressbary * -2;
}
assert(self is_reviving_afterlife(playerbeingrevived));
revivetime = 3;
playloop = 0;
if (isdefined(self.afterlife) && self.afterlife)
{
playloop = 1;
revivetime = 1;
}
timer = 0;
revived = 0;
playerbeingrevived.revivetrigger.beingrevived = 1;
playerbeingrevived.revivetrigger sethintstring("");
if (playerbeingrevived_player != self)
{
playerbeingrevived_player.revive_hud settext(&"GAME_PLAYER_IS_REVIVING_YOU", self);
playerbeingrevived_player 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 revive_clean_up_on_gameover();
self thread laststand_clean_up_on_disconnect(playerbeingrevived, revivergun);
if (!isdefined(self.is_reviving_any))
self.is_reviving_any = 0;
self.is_reviving_any++;
self thread laststand_clean_up_reviving_any(playerbeingrevived);
self.reviveprogressbar updatebar(0.01, 1 / revivetime);
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.0);
self.revivetexthud settext(&"GAME_REVIVING");
self thread check_for_failed_revive(playerbeingrevived);
e_fx = spawn("script_model", playerbeingrevived.revivetrigger.origin);
e_fx setmodel("tag_origin");
e_fx thread revive_fx_clean_up_on_disconnect(playerbeingrevived);
playfxontag(level._effect["afterlife_leave"], e_fx, "tag_origin");
if (isdefined(playloop) && playloop)
e_fx playloopsound("zmb_afterlife_reviving", 0.05);
while (self is_reviving_afterlife(playerbeingrevived))
{
wait 0.05;
timer += 0.05;
if (self player_is_in_laststand())
break;
if (isdefined(playerbeingrevived.revivetrigger.auto_revive) && playerbeingrevived.revivetrigger.auto_revive == 1)
break;
if (timer >= revivetime)
{
revived = 1;
break;
}
}
e_fx delete();
if (isDefined(playerbeingrevived_player.beingrevivedprogressbar))
{
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(&"GAME_BUTTON_TO_REVIVE_PLAYER");
playerbeingrevived.revivetrigger.beingrevived = 0;
self notify("do_revive_ended_normally");
self.is_reviving_any--;
if (!revived)
playerbeingrevived thread checkforbleedout(self);
return revived;
}
afterlife_corpse_cleanup(corpse)
{
playsoundatposition("zmb_afterlife_revived", corpse.origin);
if (isdefined(corpse.revivetrigger))
{
corpse notify("stop_revive_trigger");
corpse.revivetrigger delete();
corpse.revivetrigger = undefined;
}
if (isdefined(corpse.collision))
{
corpse.collision delete();
corpse.collision = undefined;
}
self.e_afterlife_corpse = undefined;
corpse setclientfield("player_corpse_id", 0);
corpse afterlife_corpse_remove_pois();
corpse ghost();
self.loadout = undefined;
wait_network_frame();
wait_network_frame();
wait_network_frame();
corpse delete();
}
afterlife_player_damage_callback(einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime)
{
if (isdefined(eattacker))
{
if (isdefined(eattacker.is_zombie) && eattacker.is_zombie)
{
if (isdefined(eattacker.custom_damage_func))
idamage = eattacker [[eattacker.custom_damage_func]](self);
else if (isdefined(eattacker.meleedamage) && smeansofdeath != "MOD_GRENADE_SPLASH")
idamage = eattacker.meleedamage;
if (isdefined(self.afterlife) && self.afterlife)
{
self afterlife_reduce_mana(10);
self clientnotify("al_d");
return 0;
}
}
}
if (isdefined(self.afterlife) && self.afterlife)
return 0;
if (self maps\mp\zombies\_zm_laststand::player_is_in_laststand())
return 0;
if (isdefined(eattacker) && (isdefined(eattacker.is_zombie) && eattacker.is_zombie || isplayer(eattacker)))
{
if (isdefined(self.hasriotshield) && self.hasriotshield && isdefined(vdir))
{
item_dmg = 100;
if (isdefined(eattacker.custom_item_dmg))
item_dmg = eattacker.custom_item_dmg;
if (isdefined(self.hasriotshieldequipped) && self.hasriotshieldequipped)
{
if (self player_shield_facing_attacker(vdir, 0.2) && isdefined(self.player_shield_apply_damage))
{
self [[self.player_shield_apply_damage]](item_dmg, 0);
return 0;
}
}
else if (!isdefined(self.riotshieldentity))
{
if (!self player_shield_facing_attacker(vdir, -0.2) && isdefined(self.player_shield_apply_damage))
{
self [[self.player_shield_apply_damage]](item_dmg, 0);
return 0;
}
}
}
}
if (sweapon == "tower_trap_zm" || sweapon == "tower_trap_upgraded_zm" || sweapon == "none" && shitloc == "riotshield" && !(isdefined(eattacker.is_zombie) && eattacker.is_zombie))
{
self.use_adjusted_grenade_damage = 1;
return 0;
}
if (smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH")
{
if (sweapon == "blundersplat_explosive_dart_zm")
{
if (self hasperk("specialty_flakjacket"))
{
self.use_adjusted_grenade_damage = 1;
idamage = 0;
}
if (isalive(self) && !(isdefined(self.is_zombie) && self.is_zombie))
{
self.use_adjusted_grenade_damage = 1;
idamage = 15;
}
}
else
{
if (self hasperk("specialty_flakjacket"))
return 0;
if (self.health > 75 && !(isdefined(self.is_zombie) && self.is_zombie))
idamage = 75;
}
}
if (idamage >= self.health && (isdefined(level.intermission) && !level.intermission))
{
if (self.lives > 0 && (isdefined(self.afterlife) && !self.afterlife))
{
self playsoundtoplayer("zmb_afterlife_death", self);
self afterlife_remove();
self.afterlife = 1;
self thread afterlife_laststand();
if (self.health <= 1)
return 0;
else
idamage = self.health - 1;
}
else
self thread last_stand_conscience_vo();
}
return idamage;
}
afterlife_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);
}
for (i = 0; i < loadout.weapons.size; i++)
{
if (!isdefined(loadout.weapons[i]))
continue;
if (loadout.weapons[i] == "none")
continue;
weapon = loadout.weapons[i];
stock_amount = loadout.stockcount[i];
clip_amount = loadout.clipcount[i];
if (!self hasweapon(weapon))
{
self giveweapon(weapon, 0, self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options(weapon));
self setweaponammostock(weapon, stock_amount);
self setweaponammoclip(weapon, clip_amount);
if (weaponisdualwield(weapon))
{
weapon_dw = weapondualwieldweaponname(weapon);
self setweaponammoclip(weapon_dw, loadout.clipcount2[i]);
}
weapon_alt = weaponaltweaponname(weapon);
if (weapon_alt != "none")
{
self setweaponammostock(weapon_alt, loadout.stockcountalt[i]);
self setweaponammoclip(weapon_alt, loadout.clipcountalt[i]);
}
}
}
self setspawnweapon(loadout.weapons[loadout.current_weapon]);
self switchtoweaponimmediate(loadout.weapons[loadout.current_weapon]);
if (isdefined(self get_player_melee_weapon()))
{
self giveweapon(self get_player_melee_weapon());
self giveweapon("held_" + self get_player_melee_weapon());
self setactionslot(2, "weapon", "held_" + self get_player_melee_weapon());
}
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;
if (isdefined(loadout.hasclaymore) && loadout.hasclaymore && !self hasweapon("claymore_zm"))
{
self giveweapon("claymore_zm");
self set_player_placeable_mine("claymore_zm");
self setactionslot(4, "weapon", "claymore_zm");
self setweaponammoclip("claymore_zm", loadout.claymoreclip);
}
if (isdefined(loadout.hasemp) && loadout.hasemp)
{
self giveweapon("emp_grenade_zm");
self setweaponammoclip("emp_grenade_zm", loadout.empclip);
}
if (isdefined(loadout.hastomahawk) && loadout.hastomahawk)
{
self giveweapon(self.current_tomahawk_weapon);
self set_player_tactical_grenade(self.current_tomahawk_weapon);
self setclientfieldtoplayer("tomahawk_in_use", 1);
}
self.score = loadout.score;
perk_array = maps\mp\zombies\_zm_perks::get_perk_array(1);
for (i = 0; i < perk_array.size; i++)
{
perk = perk_array[i];
self unsetperk(perk);
self set_perk_clientfield(perk, 0);
}
if (isdefined(self.keep_perks) && self.keep_perks && 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.keep_perks = undefined;
self set_player_lethal_grenade(self.loadout.lethal_grenade);
if (loadout.grenade > 0)
{
curgrenadecount = 0;
if (self hasweapon(self get_player_lethal_grenade()))
self getweaponammoclip(self get_player_lethal_grenade());
else
self giveweapon(self get_player_lethal_grenade());
self setweaponammoclip(self get_player_lethal_grenade(), loadout.grenade + curgrenadecount);
}
}