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_chugabud.gsc
Jbleezy 747751bc0b Melee weapons: add held weapon
Combat Knife: add model from BO2 MP
Add melee wallbuy HUD icons to all maps
Fix level.item_meat_name being undefined
2023-12-22 03:26:12 -08:00

503 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.melee_weapon = self get_player_melee_weapon();
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.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;
self chugabud_restore_melee_weapon();
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_restore_melee_weapon()
{
self giveweapon( self.loadout.melee_weapon );
self set_player_melee_weapon( self.loadout.melee_weapon );
self giveweapon("held_" + self.loadout.melee_weapon);
self setactionslot(2, "weapon", "held_" + self.loadout.melee_weapon);
}
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(level.start_weapon);
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);
}