1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-08 22:31:36 -05:00
BO2-Reimagined/scripts/zm/replaced/_zm_powerups.gsc
2023-12-25 03:31:27 -08:00

833 lines
21 KiB
Plaintext

#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\zombies\_zm_utility;
powerup_drop(drop_point)
{
if (level.powerup_drop_count >= level.zombie_vars["zombie_powerup_drop_max_per_round"])
{
return;
}
if (!isdefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0)
return;
rand_drop = randomint(100);
powerup_chance = 2;
if (rand_drop >= powerup_chance)
{
if (!level.zombie_vars["zombie_drop_item"])
return;
debug = "score";
}
else
debug = "random";
playable_area = getentarray("player_volume", "script_noteworthy");
level.powerup_drop_count++;
powerup = maps\mp\zombies\_zm_net::network_safe_spawn("powerup", 1, "script_model", drop_point + vectorscale((0, 0, 1), 40.0));
valid_drop = 0;
for (i = 0; i < playable_area.size; i++)
{
if (powerup istouching(playable_area[i]))
valid_drop = 1;
}
if (valid_drop && level.rare_powerups_active)
{
pos = (drop_point[0], drop_point[1], drop_point[2] + 42);
if (check_for_rare_drop_override(pos))
{
level.zombie_vars["zombie_drop_item"] = 0;
valid_drop = 0;
}
}
if (!valid_drop)
{
level.powerup_drop_count--;
powerup delete();
return;
}
powerup powerup_setup();
print_powerup_drop(powerup.powerup_name, debug);
powerup thread powerup_timeout();
powerup thread powerup_wobble();
powerup thread powerup_grab();
powerup thread powerup_move();
powerup thread powerup_emp();
level.zombie_vars["zombie_drop_item"] = 0;
level notify("powerup_dropped", powerup);
}
get_next_powerup()
{
powerup = level.zombie_powerup_array[level.zombie_powerup_index];
level.zombie_powerup_index++;
if (level.zombie_powerup_index >= level.zombie_powerup_array.size)
{
level.zombie_powerup_index = 0;
randomize_powerups();
level thread play_fx_on_powerup_dropped();
}
return powerup;
}
play_fx_on_powerup_dropped()
{
level waittill("powerup_dropped", powerup);
if (powerup.solo)
{
playfx(level._effect["powerup_grabbed_solo"], powerup.origin);
playfx(level._effect["powerup_grabbed_wave_solo"], powerup.origin);
}
else if (powerup.caution)
{
playfx(level._effect["powerup_grabbed_caution"], powerup.origin);
playfx(level._effect["powerup_grabbed_wave_caution"], powerup.origin);
}
else
{
playfx(level._effect["powerup_grabbed"], powerup.origin);
playfx(level._effect["powerup_grabbed_wave"], powerup.origin);
}
}
powerup_grab(powerup_team)
{
if (isdefined(self) && self.zombie_grabbable)
{
self thread powerup_zombie_grab(powerup_team);
return;
}
self endon("powerup_timedout");
self endon("powerup_grabbed");
range_squared = 4096;
while (isdefined(self))
{
players = array_randomize(get_players());
for (i = 0; i < players.size; i++)
{
if ((self.powerup_name == "minigun" || self.powerup_name == "tesla" || self.powerup_name == "random_weapon" || self.powerup_name == "meat_stink") && (players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || players[i] usebuttonpressed() && players[i] in_revive_trigger()))
continue;
if (isdefined(self.can_pick_up_in_last_stand) && !self.can_pick_up_in_last_stand && players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand())
continue;
if (players[i].sessionstate != "playing")
continue;
ignore_range = 0;
if (isdefined(players[i].ignore_range_powerup) && players[i].ignore_range_powerup == self)
{
players[i].ignore_range_powerup = undefined;
ignore_range = 1;
}
if (distancesquared(players[i] getCentroid(), self.origin) < range_squared || ignore_range)
{
if (isdefined(level._powerup_grab_check))
{
if (!self [[level._powerup_grab_check]](players[i]))
continue;
}
self.power_up_grab_player = players[i];
if (isdefined(level.zombie_powerup_grab_func))
level thread [[level.zombie_powerup_grab_func]]();
else
{
switch (self.powerup_name)
{
case "nuke":
level thread nuke_powerup(self, players[i].team);
players[i] thread powerup_vo("nuke");
zombies = getaiarray(level.zombie_team);
players[i].zombie_nuked = arraysort(zombies, self.origin);
players[i] notify("nuke_triggered");
break;
case "full_ammo":
level thread full_ammo_powerup(self, players[i]);
players[i] thread powerup_vo("full_ammo");
break;
case "double_points":
level thread double_points_powerup(self, players[i]);
players[i] thread powerup_vo("double_points");
break;
case "insta_kill":
level thread insta_kill_powerup(self, players[i]);
players[i] thread powerup_vo("insta_kill");
break;
case "carpenter":
if (is_classic())
players[i] thread maps\mp\zombies\_zm_pers_upgrades::persistent_carpenter_ability_check();
if (isdefined(level.use_new_carpenter_func))
level thread [[level.use_new_carpenter_func]](self.origin);
else
level thread start_carpenter(self.origin);
players[i] thread powerup_vo("carpenter");
break;
case "fire_sale":
level thread start_fire_sale(self);
players[i] thread powerup_vo("firesale");
break;
case "bonfire_sale":
level thread start_bonfire_sale(self);
players[i] thread powerup_vo("firesale");
break;
case "minigun":
level thread minigun_weapon_powerup(players[i]);
players[i] thread powerup_vo("minigun");
break;
case "free_perk":
level thread free_perk_powerup(self);
break;
case "tesla":
level thread tesla_weapon_powerup(players[i]);
players[i] thread powerup_vo("tesla");
break;
case "random_weapon":
if (!level random_weapon_powerup(self, players[i]))
continue;
break;
case "bonus_points_player":
level thread bonus_points_player_powerup(self, players[i]);
players[i] thread powerup_vo("bonus_points_solo");
break;
case "bonus_points_team":
level thread bonus_points_team_powerup(self);
players[i] thread powerup_vo("bonus_points_team");
break;
case "teller_withdrawl":
level thread teller_withdrawl(self, players[i]);
break;
default:
if (isdefined(level._zombiemode_powerup_grab))
level thread [[level._zombiemode_powerup_grab]](self, players[i]);
break;
}
}
maps\mp\_demo::bookmark("zm_player_powerup_grabbed", gettime(), players[i]);
if (should_award_stat(self.powerup_name))
{
players[i] maps\mp\zombies\_zm_stats::increment_client_stat("drops");
players[i] maps\mp\zombies\_zm_stats::increment_player_stat("drops");
players[i] maps\mp\zombies\_zm_stats::increment_client_stat(self.powerup_name + "_pickedup");
players[i] maps\mp\zombies\_zm_stats::increment_player_stat(self.powerup_name + "_pickedup");
}
if (self.solo)
{
playfx(level._effect["powerup_grabbed_solo"], self.origin);
playfx(level._effect["powerup_grabbed_wave_solo"], self.origin);
}
else if (self.caution)
{
playfx(level._effect["powerup_grabbed_caution"], self.origin);
playfx(level._effect["powerup_grabbed_wave_caution"], self.origin);
}
else
{
playfx(level._effect["powerup_grabbed"], self.origin);
playfx(level._effect["powerup_grabbed_wave"], self.origin);
}
if (isdefined(self.stolen) && self.stolen)
level notify("monkey_see_monkey_dont_achieved");
if (isdefined(self.grabbed_level_notify))
level notify(self.grabbed_level_notify);
self.claimed = 1;
wait 0.1;
playsoundatposition("zmb_powerup_grabbed", self.origin);
self stoploopsound();
self hide();
if (self.powerup_name != "fire_sale")
{
if (isdefined(self.power_up_grab_player))
{
if (isdefined(level.powerup_intro_vox))
{
level thread [[level.powerup_intro_vox]](self);
return;
}
else if (isdefined(level.powerup_vo_available))
{
can_say_vo = [[level.powerup_vo_available]]();
if (!can_say_vo)
{
self powerup_delete();
self notify("powerup_grabbed");
return;
}
}
}
}
level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog(self.powerup_name, self.power_up_grab_player.pers["team"]);
self powerup_delete();
self notify("powerup_grabbed");
}
}
wait 0.1;
}
}
full_ammo_powerup(drop_item, player)
{
clip_only = 0;
if (level.scr_zm_ui_gametype == "zgrief")
{
clip_only = 1;
drop_item.hint = &"ZOMBIE_POWERUP_CLIP_AMMO";
}
players = get_players(player.team);
if (isdefined(level._get_game_module_players))
{
players = [[level._get_game_module_players]](player);
}
i = 0;
while (i < players.size)
{
if (players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand())
{
i++;
continue;
}
primary_weapons = players[i] getweaponslist(1);
players[i] notify("zmb_max_ammo");
players[i] notify("zmb_lost_knife");
players[i] notify("zmb_disable_claymore_prompt");
players[i] notify("zmb_disable_spikemore_prompt");
x = 0;
while (x < primary_weapons.size)
{
if (level.headshots_only && is_lethal_grenade(primary_weapons[x]))
{
x++;
continue;
}
if (isdefined(level.zombie_include_equipment) && isdefined(level.zombie_include_equipment[primary_weapons[x]]))
{
x++;
continue;
}
if (isdefined(level.zombie_weapons_no_max_ammo) && isdefined(level.zombie_weapons_no_max_ammo[primary_weapons[x]]))
{
x++;
continue;
}
if (players[i] hasweapon(primary_weapons[x]))
{
if (clip_only)
{
if (weaponMaxAmmo(primary_weapons[x]) == 0)
{
x++;
continue;
}
new_ammo = players[i] getWeaponAmmoStock(primary_weapons[x]) + weaponClipSize(primary_weapons[x]);
if (weaponDualWieldWeaponName(primary_weapons[x]) != "none")
{
new_ammo += weaponClipSize(weaponDualWieldWeaponName(primary_weapons[x]));
}
if (new_ammo > weaponMaxAmmo(primary_weapons[x]))
{
new_ammo = weaponMaxAmmo(primary_weapons[x]);
}
players[i] setWeaponAmmoStock(primary_weapons[x], new_ammo);
}
else
{
players[i] givemaxammo(primary_weapons[x]);
}
}
x++;
}
players[i] notify("weapon_ammo_change");
i++;
}
level thread full_ammo_on_hud(drop_item, player.team);
if (level.scr_zm_ui_gametype == "zgrief")
{
level thread empty_clip_powerup(drop_item, player);
}
}
full_ammo_on_hud(drop_item, player_team)
{
self endon("disconnect");
hudelem = maps\mp\gametypes_zm\_hud_util::createserverfontstring("objective", 2, player_team);
hudelem maps\mp\gametypes_zm\_hud_util::setpoint("TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - level.zombie_vars["zombie_timer_offset_interval"] * 2);
hudelem.sort = 0.5;
hudelem.alpha = 0;
hudelem fadeovertime(0.5);
hudelem.alpha = 1;
if (isdefined(drop_item))
hudelem.label = drop_item.hint;
hudelem thread full_ammo_move_hud(player_team);
}
full_ammo_move_hud(player_team)
{
players = get_players(player_team);
players[0] playsoundtoteam("zmb_full_ammo", player_team);
wait 0.5;
move_fade_time = 1.5;
self fadeovertime(move_fade_time);
self moveovertime(move_fade_time);
self.y = 270;
self.alpha = 0;
wait(move_fade_time);
self destroyelem();
}
empty_clip_powerup(drop_item, player)
{
team = getOtherTeam(player.team);
i = 0;
players = get_players(team);
while (i < players.size)
{
if (players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand())
{
i++;
continue;
}
primaries = players[i] getweaponslistprimaries();
foreach (weapon in primaries)
{
dual_wield_weapon = weaponDualWieldWeaponName(weapon);
alt_weapon = weaponAltWeaponName(weapon);
if (dual_wield_weapon != "none")
{
players[i] scripts\zm\_zm_reimagined::set_weapon_ammo_clip_left(weapon, 0);
}
players[i] setweaponammoclip(weapon, 0);
players[i] setweaponammoclip(alt_weapon, 0);
}
players[i] setweaponammoclip(players[i] get_player_lethal_grenade(), 0);
players[i] setweaponammoclip(players[i] get_player_tactical_grenade(), 0);
players[i] setweaponammoclip(players[i] get_player_placeable_mine(), 0);
i++;
}
level thread empty_clip_on_hud(drop_item, team);
}
empty_clip_on_hud(drop_item, team)
{
self endon("disconnect");
hudelem = maps\mp\gametypes_zm\_hud_util::createserverfontstring("objective", 2, team);
hudelem maps\mp\gametypes_zm\_hud_util::setpoint("TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - (level.zombie_vars["zombie_timer_offset_interval"] * 2));
hudelem.sort = 0.5;
hudelem.color = (0.21, 0, 0);
hudelem.alpha = 0;
hudelem fadeovertime(0.5);
hudelem.alpha = 1;
hudelem.label = &"ZOMBIE_POWERUP_CLIP_EMPTY";
hudelem thread empty_clip_move_hud(team);
}
empty_clip_move_hud(team)
{
wait 0.5;
move_fade_time = 1.5;
self fadeovertime(move_fade_time);
self moveovertime(move_fade_time);
self.y = 270;
self.alpha = 0;
wait move_fade_time;
self destroy();
}
nuke_powerup(drop_item, player_team)
{
location = drop_item.origin;
player = drop_item.power_up_grab_player;
playfx(drop_item.fx, location);
level thread maps\mp\zombies\_zm_powerups::nuke_flash(player_team);
wait 0.5;
zombies = getaiarray(level.zombie_team);
zombies = arraysort(zombies, location);
zombies_nuked = [];
for (i = 0; i < zombies.size; i++)
{
if (isdefined(zombies[i].ignore_nuke) && zombies[i].ignore_nuke)
continue;
if (isdefined(zombies[i].marked_for_death) && zombies[i].marked_for_death)
continue;
if (isdefined(zombies[i].nuke_damage_func))
{
zombies[i] thread [[zombies[i].nuke_damage_func]]();
continue;
}
if (is_magic_bullet_shield_enabled(zombies[i]))
continue;
zombies[i].marked_for_death = 1;
zombies[i].nuked = 1;
zombies_nuked[zombies_nuked.size] = zombies[i];
}
for (i = 0; i < zombies_nuked.size; i++)
{
if (!isdefined(zombies_nuked[i]))
continue;
if (is_magic_bullet_shield_enabled(zombies_nuked[i]))
continue;
if (i < 5 && !zombies_nuked[i].isdog)
zombies_nuked[i] thread maps\mp\animscripts\zm_death::flame_death_fx();
if (!zombies_nuked[i].isdog)
{
if (!(isdefined(zombies_nuked[i].no_gib) && zombies_nuked[i].no_gib))
zombies_nuked[i] maps\mp\zombies\_zm_spawner::zombie_head_gib();
zombies_nuked[i] playsound("evt_nuked");
}
zombies_nuked[i] dodamage(zombies_nuked[i].health + 666, zombies_nuked[i].origin);
}
players = get_players(player_team);
for (i = 0; i < players.size; i++)
{
players[i] maps\mp\zombies\_zm_score::player_add_points("nuke_powerup", 400);
}
if (level.scr_zm_ui_gametype == "zgrief")
{
players = get_players(getOtherTeam(player_team));
for (i = 0; i < players.size; i++)
{
if (is_player_valid(players[i]))
{
score = 400 * maps\mp\zombies\_zm_score::get_points_multiplier(player);
if (players[i].score < score)
{
players[i] maps\mp\zombies\_zm_score::minus_to_player_score(players[i].score);
}
else
{
players[i] maps\mp\zombies\_zm_score::minus_to_player_score(score);
}
radiusDamage(players[i].origin + (0, 0, 5), 10, 75, 75);
}
else if (players[i] maps\mp\zombies\_zm_laststand::player_is_in_laststand())
{
if (isDefined(level.player_suicide_func))
{
players[i] thread [[level.player_suicide_func]]();
}
}
}
if (level.scr_zm_ui_gametype_obj == "zrace")
{
if (isDefined(level.increment_score_func))
{
[[level.increment_score_func]](player_team, 10, 1, &"ZOMBIE_ZGRIEF_NUKE_GRABBED_SCORE");
}
}
}
}
insta_kill_powerup(drop_item, player)
{
if (isDefined(level.insta_kill_powerup_override))
{
level thread [[level.insta_kill_powerup_override]](drop_item, player);
return;
}
if (is_classic())
{
player thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_insta_kill_upgrade_check();
}
team = player.team;
time = 30;
if (level.scr_zm_ui_gametype == "zgrief")
{
time = 15;
level thread half_damage_powerup(drop_item, player);
}
if (level.zombie_vars[team]["zombie_powerup_insta_kill_on"])
{
level.zombie_vars[team]["zombie_powerup_insta_kill_time"] += time;
return;
}
temp_enta = spawn("script_origin", (0, 0, 0));
temp_enta playloopsound("zmb_insta_kill_loop");
level.zombie_vars[team]["zombie_half_damage"] = 0;
level.zombie_vars[team]["zombie_insta_kill"] = !is_true(level.zombie_vars[team]["zombie_powerup_half_damage_on"]);
level.zombie_vars[team]["zombie_powerup_insta_kill_on"] = 1;
while (level.zombie_vars[team]["zombie_powerup_insta_kill_time"] >= 0)
{
wait 0.05;
level.zombie_vars[team]["zombie_powerup_insta_kill_time"] -= 0.05;
}
level.zombie_vars[team]["zombie_half_damage"] = is_true(level.zombie_vars[team]["zombie_powerup_half_damage_on"]);
level.zombie_vars[team]["zombie_insta_kill"] = 0;
level.zombie_vars[team]["zombie_powerup_insta_kill_on"] = 0;
level.zombie_vars[team]["zombie_powerup_insta_kill_time"] = time;
get_players()[0] playsoundtoteam("zmb_insta_kill", team);
temp_enta stoploopsound(2);
temp_enta delete();
players = get_players(team);
i = 0;
while (i < players.size)
{
if (isDefined(players[i]))
{
players[i] notify("insta_kill_over");
}
i++;
}
}
half_damage_powerup(drop_item, player)
{
team = getOtherTeam(player.team);
time = 15;
if (level.zombie_vars[team]["zombie_powerup_half_damage_on"])
{
level.zombie_vars[team]["zombie_powerup_half_damage_time"] += time;
return;
}
level.zombie_vars[team]["zombie_insta_kill"] = 0;
level.zombie_vars[team]["zombie_half_damage"] = !is_true(level.zombie_vars[team]["zombie_powerup_insta_kill_on"]);
level.zombie_vars[team]["zombie_powerup_half_damage_on"] = 1;
while (level.zombie_vars[team]["zombie_powerup_half_damage_time"] >= 0)
{
wait 0.05;
level.zombie_vars[team]["zombie_powerup_half_damage_time"] -= 0.05;
}
level.zombie_vars[team]["zombie_insta_kill"] = is_true(level.zombie_vars[team]["zombie_powerup_insta_kill_on"]);
level.zombie_vars[team]["zombie_half_damage"] = 0;
level.zombie_vars[team]["zombie_powerup_half_damage_on"] = 0;
level.zombie_vars[team]["zombie_powerup_half_damage_time"] = time;
}
double_points_powerup(drop_item, player)
{
team = player.team;
time = 30;
if (level.scr_zm_ui_gametype == "zgrief")
{
time = 15;
level thread half_points_powerup(drop_item, player);
}
if (level.zombie_vars[team]["zombie_powerup_point_doubler_on"])
{
level.zombie_vars[team]["zombie_powerup_point_doubler_time"] += time;
return;
}
if (is_true(level.pers_upgrade_double_points))
{
player thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_double_points_pickup_start();
}
if (isDefined(level.current_game_module) && level.current_game_module == 2)
{
if (isDefined(player._race_team))
{
if (player._race_team == 1)
{
level._race_team_double_points = 1;
}
else
{
level._race_team_double_points = 2;
}
}
}
players = get_players(team);
for (i = 0; i < players.size; i++)
{
players[i] setclientfield("score_cf_double_points_active", 1);
}
temp_ent = spawn("script_origin", (0, 0, 0));
temp_ent playloopsound("zmb_double_point_loop");
level.zombie_vars[team]["zombie_point_scalar"] *= 2;
level.zombie_vars[team]["zombie_powerup_point_doubler_on"] = 1;
while (level.zombie_vars[team]["zombie_powerup_point_doubler_time"] >= 0)
{
wait 0.05;
level.zombie_vars[team]["zombie_powerup_point_doubler_time"] -= 0.05;
}
level.zombie_vars[team]["zombie_point_scalar"] /= 2;
level.zombie_vars[team]["zombie_powerup_point_doubler_on"] = 0;
level.zombie_vars[team]["zombie_powerup_point_doubler_time"] = time;
temp_ent stoploopsound(2);
temp_ent delete();
players = get_players(team);
for (i = 0; i < players.size; i++)
{
players[i] playsound("zmb_points_loop_off");
players[i] setclientfield("score_cf_double_points_active", 0);
}
level._race_team_double_points = undefined;
}
half_points_powerup(drop_item, player)
{
team = getOtherTeam(player.team);
time = 15;
if (level.zombie_vars[team]["zombie_powerup_point_halfer_on"])
{
level.zombie_vars[team]["zombie_powerup_point_halfer_time"] += time;
return;
}
level.zombie_vars[team]["zombie_point_scalar"] /= 2;
level.zombie_vars[team]["zombie_powerup_point_halfer_on"] = 1;
while (level.zombie_vars[team]["zombie_powerup_point_halfer_time"] >= 0)
{
wait 0.05;
level.zombie_vars[team]["zombie_powerup_point_halfer_time"] -= 0.05;
}
level.zombie_vars[team]["zombie_point_scalar"] *= 2;
level.zombie_vars[team]["zombie_powerup_point_halfer_on"] = 0;
level.zombie_vars[team]["zombie_powerup_point_halfer_time"] = time;
}
start_fire_sale(item)
{
level thread maps\mp\zombies\_zm_audio_announcer::leaderdialog("fire_sale", getotherteam(item.power_up_grab_player.pers["team"]));
if (level.zombie_vars["zombie_powerup_fire_sale_time"] > 0 && is_true(level.zombie_vars["zombie_powerup_fire_sale_on"]))
{
level.zombie_vars["zombie_powerup_fire_sale_time"] += 30;
return;
}
level notify("powerup fire sale");
level endon("powerup fire sale");
level.zombie_vars["zombie_powerup_fire_sale_on"] = 1;
level thread toggle_fire_sale_on();
for (level.zombie_vars["zombie_powerup_fire_sale_time"] = 30; level.zombie_vars["zombie_powerup_fire_sale_time"] > 0; level.zombie_vars["zombie_powerup_fire_sale_time"] -= 0.05)
wait 0.05;
level.zombie_vars["zombie_powerup_fire_sale_on"] = 0;
level notify("fire_sale_off");
}