mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-07 13:49:33 -05:00
3442 lines
90 KiB
Plaintext
3442 lines
90 KiB
Plaintext
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
#include maps\mp\gametypes_zm\_hud_util;
|
|
|
|
main()
|
|
{
|
|
setDvar("scr_disablePlutoniumFixes", 1);
|
|
|
|
replaceFunc(common_scripts\utility::struct_class_init, scripts\zm\replaced\utility::struct_class_init);
|
|
replaceFunc(maps\mp\animscripts\zm_melee::meleecombat, scripts\zm\replaced\zm_melee::meleecombat);
|
|
replaceFunc(maps\mp\animscripts\zm_utility::wait_network_frame, scripts\zm\replaced\_zm_utility::wait_network_frame);
|
|
replaceFunc(maps\mp\animscripts\traverse\zm_shared::dotraverse, scripts\zm\replaced\zm_shared::dotraverse);
|
|
replaceFunc(maps\mp\gametypes_zm\_damagefeedback::onplayerconnect, scripts\zm\replaced\_damagefeedback::onplayerconnect);
|
|
replaceFunc(maps\mp\gametypes_zm\_globallogic_player::callback_playerconnect, scripts\zm\replaced\_globallogic_player::callback_playerconnect);
|
|
replaceFunc(maps\mp\gametypes_zm\_hud_message::onplayerconnect, scripts\zm\replaced\_hud_message::onplayerconnect);
|
|
replaceFunc(maps\mp\gametypes_zm\_zm_gametype::hide_gump_loading_for_hotjoiners, scripts\zm\replaced\_zm_gametype::hide_gump_loading_for_hotjoiners);
|
|
replaceFunc(maps\mp\zombies\_zm::init_fx, scripts\zm\replaced\_zm::init_fx);
|
|
replaceFunc(maps\mp\zombies\_zm::round_start, scripts\zm\replaced\_zm::round_start);
|
|
replaceFunc(maps\mp\zombies\_zm::ai_calculate_health, scripts\zm\replaced\_zm::ai_calculate_health);
|
|
replaceFunc(maps\mp\zombies\_zm::onallplayersready, scripts\zm\replaced\_zm::onallplayersready);
|
|
replaceFunc(maps\mp\zombies\_zm::last_stand_pistol_rank_init, scripts\zm\replaced\_zm::last_stand_pistol_rank_init);
|
|
replaceFunc(maps\mp\zombies\_zm::last_stand_best_pistol, scripts\zm\replaced\_zm::last_stand_best_pistol);
|
|
replaceFunc(maps\mp\zombies\_zm::can_track_ammo, scripts\zm\replaced\_zm::can_track_ammo);
|
|
replaceFunc(maps\mp\zombies\_zm::take_additionalprimaryweapon, scripts\zm\replaced\_zm::take_additionalprimaryweapon);
|
|
replaceFunc(maps\mp\zombies\_zm::check_for_valid_spawn_near_team, scripts\zm\replaced\_zm::check_for_valid_spawn_near_team);
|
|
replaceFunc(maps\mp\zombies\_zm::get_valid_spawn_location, scripts\zm\replaced\_zm::get_valid_spawn_location);
|
|
replaceFunc(maps\mp\zombies\_zm::actor_damage_override, scripts\zm\replaced\_zm::actor_damage_override);
|
|
replaceFunc(maps\mp\zombies\_zm::player_spawn_protection, scripts\zm\replaced\_zm::player_spawn_protection);
|
|
replaceFunc(maps\mp\zombies\_zm::wait_and_revive, scripts\zm\replaced\_zm::wait_and_revive);
|
|
replaceFunc(maps\mp\zombies\_zm::player_revive_monitor, scripts\zm\replaced\_zm::player_revive_monitor);
|
|
replaceFunc(maps\mp\zombies\_zm::player_out_of_playable_area_monitor, scripts\zm\replaced\_zm::player_out_of_playable_area_monitor);
|
|
replaceFunc(maps\mp\zombies\_zm::end_game, scripts\zm\replaced\_zm::end_game);
|
|
replaceFunc(maps\mp\zombies\_zm::check_quickrevive_for_hotjoin, scripts\zm\replaced\_zm::check_quickrevive_for_hotjoin);
|
|
replaceFunc(maps\mp\zombies\_zm_audio::create_and_play_dialog, scripts\zm\replaced\_zm_audio::create_and_play_dialog);
|
|
replaceFunc(maps\mp\zombies\_zm_audio_announcer::playleaderdialogonplayer, scripts\zm\replaced\_zm_audio_announcer::playleaderdialogonplayer);
|
|
replaceFunc(maps\mp\zombies\_zm_stats::set_global_stat, scripts\zm\replaced\_zm_stats::set_global_stat);
|
|
replaceFunc(maps\mp\zombies\_zm_playerhealth::playerhealthregen, scripts\zm\replaced\_zm_playerhealth::playerhealthregen);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::init_player_offhand_weapons, scripts\zm\replaced\_zm_utility::init_player_offhand_weapons);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::give_start_weapon, scripts\zm\replaced\_zm_utility::give_start_weapon);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::is_headshot, scripts\zm\replaced\_zm_utility::is_headshot);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::shock_onpain, scripts\zm\replaced\_zm_utility::shock_onpain);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::create_zombie_point_of_interest_attractor_positions, scripts\zm\replaced\_zm_utility::create_zombie_point_of_interest_attractor_positions);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::get_current_zone, scripts\zm\replaced\_zm_utility::get_current_zone);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::is_temporary_zombie_weapon, scripts\zm\replaced\_zm_utility::is_temporary_zombie_weapon);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::wait_network_frame, scripts\zm\replaced\_zm_utility::wait_network_frame);
|
|
replaceFunc(maps\mp\zombies\_zm_utility::track_players_intersection_tracker, scripts\zm\replaced\_zm_utility::track_players_intersection_tracker);
|
|
replaceFunc(maps\mp\zombies\_zm_ffotd::ffotd_melee_miss_func, scripts\zm\replaced\_zm_ffotd::ffotd_melee_miss_func);
|
|
replaceFunc(maps\mp\zombies\_zm_score::add_to_player_score, scripts\zm\replaced\_zm_score::add_to_player_score);
|
|
replaceFunc(maps\mp\zombies\_zm_score::minus_to_player_score, scripts\zm\replaced\_zm_score::minus_to_player_score);
|
|
replaceFunc(maps\mp\zombies\_zm_score::player_add_points_kill_bonus, scripts\zm\replaced\_zm_score::player_add_points_kill_bonus);
|
|
replaceFunc(maps\mp\zombies\_zm_laststand::revive_do_revive, scripts\zm\replaced\_zm_laststand::revive_do_revive);
|
|
replaceFunc(maps\mp\zombies\_zm_laststand::revive_give_back_weapons, scripts\zm\replaced\_zm_laststand::revive_give_back_weapons);
|
|
replaceFunc(maps\mp\zombies\_zm_laststand::revive_hud_think, scripts\zm\replaced\_zm_laststand::revive_hud_think);
|
|
replaceFunc(maps\mp\zombies\_zm_laststand::auto_revive, scripts\zm\replaced\_zm_laststand::auto_revive);
|
|
replaceFunc(maps\mp\zombies\_zm_laststand::revive_hud_create, scripts\zm\replaced\_zm_laststand::revive_hud_create);
|
|
replaceFunc(maps\mp\zombies\_zm_blockers::door_buy, scripts\zm\replaced\_zm_blockers::door_buy);
|
|
replaceFunc(maps\mp\zombies\_zm_blockers::door_opened, scripts\zm\replaced\_zm_blockers::door_opened);
|
|
replaceFunc(maps\mp\zombies\_zm_blockers::player_fails_blocker_repair_trigger_preamble, scripts\zm\replaced\_zm_blockers::player_fails_blocker_repair_trigger_preamble);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::init_weapon_upgrade, scripts\zm\replaced\_zm_weapons::init_weapon_upgrade);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::add_dynamic_wallbuy, scripts\zm\replaced\_zm_weapons::add_dynamic_wallbuy);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options, scripts\zm\replaced\_zm_weapons::get_pack_a_punch_weapon_options);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::weapon_give, scripts\zm\replaced\_zm_weapons::weapon_give);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::ammo_give, scripts\zm\replaced\_zm_weapons::ammo_give);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::get_upgraded_ammo_cost, scripts\zm\replaced\_zm_weapons::get_upgraded_ammo_cost);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::makegrenadedudanddestroy, scripts\zm\replaced\_zm_weapons::makegrenadedudanddestroy);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::weaponobjects_on_player_connect_override_internal, scripts\zm\replaced\_zm_weapons::weaponobjects_on_player_connect_override_internal);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::setupretrievablehintstrings, scripts\zm\replaced\_zm_weapons::setupretrievablehintstrings);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::createballisticknifewatcher_zm, scripts\zm\replaced\_zm_weapons::createballisticknifewatcher_zm);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::weapon_spawn_think, scripts\zm\replaced\_zm_weapons::weapon_spawn_think);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::weapon_set_first_time_hint, scripts\zm\replaced\_zm_weapons::weapon_set_first_time_hint);
|
|
replaceFunc(maps\mp\zombies\_zm_weapons::give_fallback_weapon, scripts\zm\replaced\_zm_weapons::give_fallback_weapon);
|
|
replaceFunc(maps\mp\zombies\_zm_magicbox::treasure_chest_init, scripts\zm\replaced\_zm_magicbox::treasure_chest_init);
|
|
replaceFunc(maps\mp\zombies\_zm_magicbox::init_starting_chest_location, scripts\zm\replaced\_zm_magicbox::init_starting_chest_location);
|
|
replaceFunc(maps\mp\zombies\_zm_magicbox::decide_hide_show_hint, scripts\zm\replaced\_zm_magicbox::decide_hide_show_hint);
|
|
replaceFunc(maps\mp\zombies\_zm_magicbox::trigger_visible_to_player, scripts\zm\replaced\_zm_magicbox::trigger_visible_to_player);
|
|
replaceFunc(maps\mp\zombies\_zm_magicbox::can_buy_weapon, scripts\zm\replaced\_zm_magicbox::can_buy_weapon);
|
|
replaceFunc(maps\mp\zombies\_zm_magicbox::weapon_is_dual_wield, scripts\zm\replaced\_zm_magicbox::weapon_is_dual_wield);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::init, scripts\zm\replaced\_zm_perks::init);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::vending_trigger_think, scripts\zm\replaced\_zm_perks::vending_trigger_think);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::perk_give_bottle_end, scripts\zm\replaced\_zm_perks::perk_give_bottle_end);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::vending_weapon_upgrade, scripts\zm\replaced\_zm_perks::vending_weapon_upgrade);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::give_perk, scripts\zm\replaced\_zm_perks::give_perk);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::perk_think, scripts\zm\replaced\_zm_perks::perk_think);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg, scripts\zm\replaced\_zm_perks::perk_set_max_health_if_jugg);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::initialize_custom_perk_arrays, scripts\zm\replaced\_zm_perks::initialize_custom_perk_arrays);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::turn_tombstone_on, scripts\zm\replaced\_zm_perks::turn_tombstone_on);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::wait_for_player_to_take, scripts\zm\replaced\_zm_perks::wait_for_player_to_take);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::check_player_has_perk, scripts\zm\replaced\_zm_perks::check_player_has_perk);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::set_perk_clientfield, scripts\zm\replaced\_zm_perks::set_perk_clientfield);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::perk_pause, scripts\zm\replaced\_zm_perks::perk_pause);
|
|
replaceFunc(maps\mp\zombies\_zm_perks::perk_unpause, scripts\zm\replaced\_zm_perks::perk_unpause);
|
|
replaceFunc(maps\mp\zombies\_zm_buildables::buildablestub_update_prompt, scripts\zm\replaced\_zm_buildables::buildablestub_update_prompt);
|
|
replaceFunc(maps\mp\zombies\_zm_buildables::player_progress_bar_update, scripts\zm\replaced\_zm_buildables::player_progress_bar_update);
|
|
replaceFunc(maps\mp\zombies\_zm_power::standard_powered_items, scripts\zm\replaced\_zm_power::standard_powered_items);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::powerup_drop, scripts\zm\replaced\_zm_powerups::powerup_drop);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::get_next_powerup, scripts\zm\replaced\_zm_powerups::get_next_powerup);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::powerup_grab, scripts\zm\replaced\_zm_powerups::powerup_grab);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::full_ammo_powerup, scripts\zm\replaced\_zm_powerups::full_ammo_powerup);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::nuke_powerup, scripts\zm\replaced\_zm_powerups::nuke_powerup);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::insta_kill_powerup, scripts\zm\replaced\_zm_powerups::insta_kill_powerup);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::double_points_powerup, scripts\zm\replaced\_zm_powerups::double_points_powerup);
|
|
replaceFunc(maps\mp\zombies\_zm_powerups::powerup_hud_monitor, scripts\zm\replaced\_zm_powerups::powerup_hud_monitor);
|
|
replaceFunc(maps\mp\zombies\_zm_pers_upgrades::is_pers_system_disabled, scripts\zm\replaced\_zm_pers_upgrades::is_pers_system_disabled);
|
|
replaceFunc(maps\mp\zombies\_zm_pers_upgrades_system::check_pers_upgrade, scripts\zm\replaced\_zm_pers_upgrades_system::check_pers_upgrade);
|
|
replaceFunc(maps\mp\zombies\_zm_traps::player_elec_damage, scripts\zm\replaced\_zm_traps::player_elec_damage);
|
|
replaceFunc(maps\mp\zombies\_zm_equipment::show_equipment_hint, scripts\zm\replaced\_zm_equipment::show_equipment_hint);
|
|
replaceFunc(maps\mp\zombies\_zm_equipment::placed_equipment_think, scripts\zm\replaced\_zm_equipment::placed_equipment_think);
|
|
replaceFunc(maps\mp\zombies\_zm_clone::spawn_player_clone, scripts\zm\replaced\_zm_clone::spawn_player_clone);
|
|
replaceFunc(maps\mp\zombies\_zm_spawner::zombie_gib_on_damage, scripts\zm\replaced\_zm_spawner::zombie_gib_on_damage);
|
|
replaceFunc(maps\mp\zombies\_zm_spawner::head_should_gib, scripts\zm\replaced\_zm_spawner::head_should_gib);
|
|
replaceFunc(maps\mp\zombies\_zm_spawner::zombie_death_animscript, scripts\zm\replaced\_zm_spawner::zombie_death_animscript);
|
|
replaceFunc(maps\mp\zombies\_zm_spawner::zombie_can_drop_powerups, scripts\zm\replaced\_zm_spawner::zombie_can_drop_powerups);
|
|
replaceFunc(maps\mp\zombies\_zm_spawner::zombie_complete_emerging_into_playable_area, scripts\zm\replaced\_zm_spawner::zombie_complete_emerging_into_playable_area);
|
|
replaceFunc(maps\mp\zombies\_zm_ai_basic::inert_wakeup, scripts\zm\replaced\_zm_ai_basic::inert_wakeup);
|
|
replaceFunc(maps\mp\zombies\_zm_ai_dogs::enable_dog_rounds, scripts\zm\replaced\_zm_ai_dogs::enable_dog_rounds);
|
|
replaceFunc(maps\mp\zombies\_zm_melee_weapon::init, scripts\zm\replaced\_zm_melee_weapon::init);
|
|
replaceFunc(maps\mp\zombies\_zm_melee_weapon::change_melee_weapon, scripts\zm\replaced\_zm_melee_weapon::change_melee_weapon);
|
|
replaceFunc(maps\mp\zombies\_zm_melee_weapon::give_melee_weapon, scripts\zm\replaced\_zm_melee_weapon::give_melee_weapon);
|
|
replaceFunc(maps\mp\zombies\_zm_melee_weapon::melee_weapon_think, scripts\zm\replaced\_zm_melee_weapon::melee_weapon_think);
|
|
replaceFunc(maps\mp\zombies\_zm_weap_ballistic_knife::init, scripts\zm\replaced\_zm_weap_ballistic_knife::init);
|
|
replaceFunc(maps\mp\zombies\_zm_weap_ballistic_knife::watch_use_trigger, scripts\zm\replaced\_zm_weap_ballistic_knife::watch_use_trigger);
|
|
replaceFunc(maps\mp\zombies\_zm_weap_ballistic_knife::pick_up, scripts\zm\replaced\_zm_weap_ballistic_knife::pick_up);
|
|
replaceFunc(maps\mp\zombies\_zm_weap_claymore::claymore_watch, scripts\zm\replaced\_zm_weap_claymore::claymore_watch);
|
|
replaceFunc(maps\mp\zombies\_zm_weap_cymbal_monkey::init, scripts\zm\replaced\_zm_weap_cymbal_monkey::init);
|
|
replaceFunc(maps\mp\zombies\_zm_weap_cymbal_monkey::player_handle_cymbal_monkey, scripts\zm\replaced\_zm_weap_cymbal_monkey::player_handle_cymbal_monkey);
|
|
|
|
powerup_changes();
|
|
}
|
|
|
|
init()
|
|
{
|
|
precache_strings();
|
|
precache_status_icons();
|
|
|
|
level.using_solo_revive = 0;
|
|
level.claymores_max_per_player = 20;
|
|
level.navcards = undefined; // removes navcards on HUD
|
|
level.powerup_intro_vox = undefined;
|
|
level.player_too_many_players_check = 0;
|
|
level.player_too_many_weapons_monitor_func = scripts\zm\replaced\_zm::player_too_many_weapons_monitor;
|
|
level.pregame_minplayers = getDvarInt("party_minplayers");
|
|
level.player_starting_health = 150;
|
|
|
|
if (!isdefined(level.item_meat_name))
|
|
{
|
|
level.item_meat_name = "";
|
|
}
|
|
|
|
setscoreboardcolumns_gametype();
|
|
|
|
set_dvars();
|
|
|
|
weapon_changes();
|
|
|
|
spawn_mystery_box_blocks_and_collision();
|
|
|
|
spawn_intercom_ents();
|
|
|
|
add_fire_sale_vox();
|
|
|
|
level thread on_player_connect();
|
|
|
|
level thread post_all_players_spawned();
|
|
|
|
level thread enemy_counter_hud();
|
|
|
|
level thread timer_hud();
|
|
|
|
level thread swap_staminup_perk();
|
|
|
|
level thread remove_status_icons_on_intermission();
|
|
|
|
if (isDedicated())
|
|
{
|
|
scripts\zm\server\_zm_reimagined_server::init();
|
|
}
|
|
}
|
|
|
|
precache_strings()
|
|
{
|
|
precacheString(&"hud_update_health");
|
|
precacheString(&"hud_update_zone_fade_out");
|
|
precacheString(&"hud_update_zone_fade_in");
|
|
|
|
foreach (zone_name in level.zone_keys)
|
|
{
|
|
precacheString(istring(toupper(level.script + "_" + zone_name)));
|
|
}
|
|
}
|
|
|
|
precache_status_icons()
|
|
{
|
|
precacheStatusIcon("menu_mp_killstreak_select");
|
|
precacheStatusIcon("menu_mp_contract_expired");
|
|
precacheStatusIcon("waypoint_revive");
|
|
|
|
if (is_true(level.zombiemode_using_chugabud_perk))
|
|
{
|
|
precacheStatusIcon("specialty_chugabud_zombies");
|
|
}
|
|
|
|
if (is_true(level.zombiemode_using_afterlife))
|
|
{
|
|
precacheStatusIcon("waypoint_revive_afterlife");
|
|
}
|
|
}
|
|
|
|
spawn_mystery_box_blocks_and_collision()
|
|
{
|
|
chests_to_spawn_ents = [];
|
|
|
|
foreach (chest in level.chests)
|
|
{
|
|
if (!isDefined(chest.script_noteworthy))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (level.script == "zm_transit")
|
|
{
|
|
if (chest.script_noteworthy == "tunnel_chest")
|
|
{
|
|
chests_to_spawn_ents[chests_to_spawn_ents.size] = chest;
|
|
}
|
|
else if (chest.script_noteworthy == "cornfield_chest")
|
|
{
|
|
chests_to_spawn_ents[chests_to_spawn_ents.size] = chest;
|
|
}
|
|
}
|
|
else if (level.script == "zm_highrise")
|
|
{
|
|
if (chest.script_noteworthy == "gb1_chest")
|
|
{
|
|
chests_to_spawn_ents[chests_to_spawn_ents.size] = chest;
|
|
}
|
|
else if (chest.script_noteworthy == "blue_level4_chest")
|
|
{
|
|
chests_to_spawn_ents[chests_to_spawn_ents.size] = chest;
|
|
}
|
|
else if (chest.script_noteworthy == "orange_level3_chest")
|
|
{
|
|
chests_to_spawn_ents[chests_to_spawn_ents.size] = chest;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (chests_to_spawn_ents.size == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
precacheModel("p_glo_cinder_block");
|
|
|
|
foreach (chest in chests_to_spawn_ents)
|
|
{
|
|
// spawn cinder blocks
|
|
for (i = 0; i < 8; i++)
|
|
{
|
|
block = spawn("script_model", chest.zbarrier.origin);
|
|
block.angles = chest.zbarrier.angles + (0, 90, 0);
|
|
|
|
// fix upside down box angles
|
|
if (abs(chest.zbarrier.angles[2]) >= 90)
|
|
{
|
|
block.angles = (0, block.angles[1], block.angles[2] + block.angles[0]);
|
|
}
|
|
|
|
block.origin += anglesToRight(chest.zbarrier.angles) * -5;
|
|
block.origin += anglesToForward(chest.zbarrier.angles) * (37.5 + (i % 4 * -25));
|
|
|
|
if (i >= 4)
|
|
{
|
|
block.origin += anglesToUp(chest.zbarrier.angles) * -12;
|
|
block.angles += (0, 0, 90);
|
|
}
|
|
else
|
|
{
|
|
block.origin += anglesToUp(chest.zbarrier.angles) * -4;
|
|
}
|
|
|
|
if (i % 4 == 0)
|
|
{
|
|
block.angles += (0, -45, 0);
|
|
}
|
|
else if (i % 4 == 1)
|
|
{
|
|
block.angles += (0, 22.5, 0);
|
|
}
|
|
else if (i % 4 == 2)
|
|
{
|
|
block.angles += (0, -5, 0);
|
|
}
|
|
else if (i % 4 == 3)
|
|
{
|
|
block.angles += (0, 22.5, 0);
|
|
}
|
|
|
|
// fix upside down box angles
|
|
if (abs(chest.zbarrier.angles[2]) >= 90)
|
|
{
|
|
if (i % 4 == 0)
|
|
{
|
|
block.angles += (-8, 0, 4);
|
|
}
|
|
else if (i % 4 == 1)
|
|
{
|
|
block.angles += (5, 0, 1);
|
|
}
|
|
else if (i % 4 == 2)
|
|
{
|
|
block.angles += (-1, 0, 0);
|
|
}
|
|
else if (i % 4 == 3)
|
|
{
|
|
block.angles += (5, 0, 1);
|
|
}
|
|
}
|
|
|
|
block setModel("p_glo_cinder_block");
|
|
}
|
|
|
|
// spawn collision
|
|
for (i = 0; i < 3; i++)
|
|
{
|
|
collision = spawn("script_model", chest.zbarrier.origin, 1);
|
|
collision.angles = chest.zbarrier.angles;
|
|
|
|
collision.origin += anglesToForward(chest.zbarrier.angles) * (32 + (i * -32));
|
|
collision.origin += anglesToUp(chest.zbarrier.angles) * 64;
|
|
|
|
collision setModel("collision_clip_32x32x128");
|
|
collision disconnectPaths();
|
|
}
|
|
}
|
|
}
|
|
|
|
spawn_intercom_ents()
|
|
{
|
|
if (level.script != "zm_transit" && level.script != "zm_highrise")
|
|
{
|
|
return;
|
|
}
|
|
|
|
foreach (chest in level.chests)
|
|
{
|
|
ent = spawn("script_origin", chest.origin + (0, 0, 15));
|
|
ent.targetname = "intercom";
|
|
}
|
|
}
|
|
|
|
// hack to add Fire Sale vox without overriding on all maps
|
|
add_fire_sale_vox()
|
|
{
|
|
if (level.script != "zm_transit" && level.script != "zm_highrise")
|
|
{
|
|
return;
|
|
}
|
|
|
|
postfix = "_rich";
|
|
|
|
game["zmbdialog"]["fire_sale"] += postfix;
|
|
level.vox.speaker["player"].alias["powerup"]["firesale"] += postfix;
|
|
}
|
|
|
|
on_player_connect()
|
|
{
|
|
while (true)
|
|
{
|
|
level waittill("connecting", player);
|
|
|
|
player thread on_player_spawned();
|
|
player thread on_player_spectate();
|
|
player thread on_player_downed();
|
|
player thread on_player_revived();
|
|
player thread on_player_fake_revive();
|
|
|
|
player thread grenade_fire_watcher();
|
|
player thread sndmeleewpnsound();
|
|
}
|
|
}
|
|
|
|
on_player_spawned()
|
|
{
|
|
level endon("game_ended");
|
|
self endon("disconnect");
|
|
|
|
self.initial_spawn = true;
|
|
|
|
for (;;)
|
|
{
|
|
self waittill("spawned_player");
|
|
|
|
if (self.initial_spawn)
|
|
{
|
|
self.initial_spawn = false;
|
|
|
|
self.solo_lives_given = 0;
|
|
self.stored_weapon_data = undefined;
|
|
|
|
self thread health_bar_hud();
|
|
self thread zone_name_hud();
|
|
|
|
self thread bleedout_bar_hud();
|
|
|
|
self thread veryhurt_blood_fx();
|
|
|
|
self thread ignoreme_after_revived();
|
|
|
|
self thread held_melee_weapon_world_model_fix();
|
|
|
|
self thread fall_velocity_check();
|
|
|
|
self thread give_additional_perks();
|
|
|
|
self thread weapon_locker_give_ammo_after_rounds();
|
|
|
|
self thread additionalprimaryweapon_indicator();
|
|
self thread additionalprimaryweapon_stowed_weapon_refill();
|
|
|
|
self thread electric_cherry_unlimited();
|
|
}
|
|
|
|
self.statusicon = "";
|
|
|
|
self set_client_dvars();
|
|
self set_perks();
|
|
self set_favorite_wall_weapons();
|
|
}
|
|
}
|
|
|
|
on_player_spectate()
|
|
{
|
|
level endon("end_game");
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("spawned_spectator");
|
|
|
|
self.statusicon = "hud_status_dead";
|
|
}
|
|
}
|
|
|
|
on_player_downed()
|
|
{
|
|
level endon("game_ended");
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("entering_last_stand");
|
|
|
|
if (is_gametype_active("zcleansed"))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
self.statusicon = "waypoint_revive";
|
|
self.health = self.maxhealth;
|
|
}
|
|
}
|
|
|
|
on_player_revived()
|
|
{
|
|
level endon("end_game");
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("player_revived", reviver);
|
|
|
|
if (isDefined(self.e_chugabud_corpse))
|
|
{
|
|
self.statusicon = "specialty_chugabud_zombies";
|
|
}
|
|
else
|
|
{
|
|
self.statusicon = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
on_player_fake_revive()
|
|
{
|
|
level endon("end_game");
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("fake_revive");
|
|
|
|
if (is_true(level.zombiemode_using_chugabud_perk))
|
|
{
|
|
self.statusicon = "specialty_chugabud_zombies";
|
|
}
|
|
else if (is_true(level.zombiemode_using_afterlife))
|
|
{
|
|
self.statusicon = "waypoint_revive_afterlife";
|
|
}
|
|
}
|
|
}
|
|
|
|
post_all_players_spawned()
|
|
{
|
|
flag_wait("start_zombie_round_logic");
|
|
|
|
wait 0.05;
|
|
|
|
level.ta_vaultfee = 0;
|
|
level.ta_tellerfee = 0;
|
|
level.weapon_locker_online = 0;
|
|
level.disable_melee_wallbuy_icons = 0;
|
|
level.dont_link_common_wallbuys = 1;
|
|
level.magicbox_timeout = 9;
|
|
level.packapunch_timeout = 12;
|
|
level.perk_purchase_limit = 9;
|
|
level._random_zombie_perk_cost = 2500;
|
|
level.flopper_network_optimized = 0;
|
|
level.equipment_etrap_needs_power = 0;
|
|
level.equipment_turret_needs_power = 0;
|
|
level.equipment_subwoofer_needs_power = 0;
|
|
level.limited_weapons["ray_gun_zm"] = 8;
|
|
level.limited_weapons["raygun_mark2_zm"] = 1;
|
|
|
|
if (isDefined(level.zombie_weapons["slipgun_zm"]))
|
|
{
|
|
level.zombie_weapons["slipgun_zm"].upgrade_name = "slipgun_upgraded_zm";
|
|
level.zombie_weapons_upgraded["slipgun_upgraded_zm"] = "slipgun_zm";
|
|
}
|
|
|
|
level.zombie_vars["riotshield_hit_points"] = 1500;
|
|
level.zombie_vars["slipgun_reslip_rate"] = 0;
|
|
level.zombie_vars["zombie_perk_divetonuke_min_damage"] = 1000;
|
|
level.zombie_vars["zombie_perk_divetonuke_max_damage"] = 5000;
|
|
level.players_can_damage_riotshields = 1;
|
|
level.speed_change_round = undefined;
|
|
level.playersuicideallowed = undefined;
|
|
level.disable_free_perks_before_power = undefined;
|
|
level.custom_random_perk_weights = undefined;
|
|
level.zombiemode_divetonuke_perk_func = scripts\zm\replaced\_zm_perk_divetonuke::divetonuke_explode;
|
|
level.global_damage_func = scripts\zm\replaced\_zm_spawner::zombie_damage;
|
|
level.callbackplayerdamage = scripts\zm\replaced\_zm::callback_playerdamage;
|
|
level.overrideplayerdamage = scripts\zm\replaced\_zm::player_damage_override;
|
|
level.playerlaststand_func = scripts\zm\replaced\_zm::player_laststand;
|
|
level.callbackplayerlaststand = scripts\zm\replaced\_zm::callback_playerlaststand;
|
|
level._zombies_round_spawn_failsafe = scripts\zm\replaced\_zm::round_spawn_failsafe;
|
|
level.etrap_damage = maps\mp\zombies\_zm::ai_zombie_health(255);
|
|
level.slipgun_damage = maps\mp\zombies\_zm::ai_zombie_health(255);
|
|
level.should_respawn_func = ::should_respawn;
|
|
level.tombstone_spawn_func = ::tombstone_spawn;
|
|
level.tombstone_laststand_func = ::tombstone_save;
|
|
level.zombie_last_stand = ::last_stand_pistol_swap;
|
|
level.zombie_last_stand_ammo_return = ::last_stand_restore_pistol_ammo;
|
|
|
|
disable_carpenter();
|
|
|
|
disable_bank_teller();
|
|
|
|
zone_changes();
|
|
|
|
jetgun_remove_forced_weapon_switch();
|
|
|
|
level thread wallbuy_cost_changes();
|
|
|
|
level thread buildbuildables();
|
|
level thread buildcraftables();
|
|
}
|
|
|
|
set_dvars()
|
|
{
|
|
setDvar("player_backSpeedScale", 1);
|
|
|
|
// can't set to exactly 90 or else looking completely up or down will cause the player to move in the opposite direction
|
|
setDvar("player_view_pitch_up", 89.9999);
|
|
setDvar("player_view_pitch_down", 89.9999);
|
|
|
|
setDvar("dtp_post_move_pause", 0);
|
|
setDvar("dtp_startup_delay", 100);
|
|
setDvar("dtp_exhaustion_window", 100);
|
|
|
|
setDvar("player_meleeRange", 64);
|
|
setDvar("player_breath_gasp_lerp", 0);
|
|
|
|
setDvar("g_friendlyfireDist", 0);
|
|
|
|
setDvar("perk_weapRateEnhanced", 0);
|
|
|
|
setDvar("riotshield_melee_damage_scale", 1);
|
|
setDvar("riotshield_bullet_damage_scale", 1);
|
|
setDvar("riotshield_explosive_damage_scale", 1);
|
|
setDvar("riotshield_projectile_damage_scale", 1);
|
|
setDvar("riotshield_deployed_health", 1500);
|
|
|
|
setDvar("r_fog", 0);
|
|
|
|
setDvar("sv_patch_zm_weapons", 1);
|
|
setDvar("sv_fix_zm_weapons", 0);
|
|
|
|
setDvar("sv_voice", 2);
|
|
setDvar("sv_voiceQuality", 9);
|
|
|
|
if (level.script == "zm_transit")
|
|
{
|
|
setDvar("bg_chargeShotMaxBulletsInQueue", 5);
|
|
}
|
|
else
|
|
{
|
|
setDvar("bg_chargeShotMaxBulletsInQueue", 3);
|
|
}
|
|
}
|
|
|
|
set_client_dvars()
|
|
{
|
|
self setClientDvar("player_lastStandBleedoutTime", getDvarInt("player_lastStandBleedoutTime"));
|
|
|
|
self setClientDvar("dtp_post_move_pause", getDvarInt("dtp_post_move_pause"));
|
|
self setClientDvar("dtp_startup_delay", getDvarInt("dtp_startup_delay"));
|
|
self setClientDvar("dtp_exhaustion_window", getDvarInt("dtp_exhaustion_window"));
|
|
|
|
self setClientDvar("aim_automelee_enabled", 0);
|
|
|
|
self setClientDvar("g_friendlyfireDist", 0);
|
|
|
|
self setClientDvar("cg_friendlyNameFadeIn", 0);
|
|
self setClientDvar("cg_friendlyNameFadeOut", 250);
|
|
self setClientDvar("cg_enemyNameFadeIn", 0);
|
|
self setClientDvar("cg_enemyNameFadeOut", 250);
|
|
|
|
self setClientDvar("waypointOffscreenPointerDistance", 30);
|
|
self setClientDvar("waypointOffscreenPadTop", 32);
|
|
self setClientDvar("waypointOffscreenPadBottom", 32);
|
|
self setClientDvar("waypointPlayerOffsetStand", 30);
|
|
self setClientDvar("waypointPlayerOffsetCrouch", 30);
|
|
|
|
self setClientDvar("r_fog", 0);
|
|
|
|
self setClientDvar("r_dof_enable", 0);
|
|
self setClientDvar("r_lodBiasRigid", -1000);
|
|
self setClientDvar("r_lodBiasSkinned", -1000);
|
|
|
|
if (level.script == "zm_transit")
|
|
{
|
|
self setClientDvar("bg_chargeShotMaxBulletsInQueue", 5);
|
|
}
|
|
else
|
|
{
|
|
self setClientDvar("bg_chargeShotMaxBulletsInQueue", 3);
|
|
}
|
|
}
|
|
|
|
set_perks()
|
|
{
|
|
if (!(getDvar("g_gametype") == "zgrief" && getDvarIntDefault("ui_gametype_pro", 0)))
|
|
{
|
|
self setperk("specialty_unlimitedsprint");
|
|
}
|
|
|
|
self setperk("specialty_fastmantle");
|
|
self setperk("specialty_fastladderclimb");
|
|
}
|
|
|
|
set_favorite_wall_weapons()
|
|
{
|
|
if (!isdefined(self.favorite_wall_weapons_list))
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < self.favorite_wall_weapons_list.size; i++)
|
|
{
|
|
if (self.favorite_wall_weapons_list[i] == "rottweil72_zm")
|
|
{
|
|
self.favorite_wall_weapons_list[i] = "ballista_zm";
|
|
}
|
|
else if (self.favorite_wall_weapons_list[i] == "m14_zm")
|
|
{
|
|
self.favorite_wall_weapons_list[i] = "saritch_zm";
|
|
}
|
|
else if (self.favorite_wall_weapons_list[i] == "m16_zm")
|
|
{
|
|
self.favorite_wall_weapons_list[i] = "sig556_zm";
|
|
}
|
|
}
|
|
}
|
|
|
|
health_bar_hud()
|
|
{
|
|
level endon("intermission");
|
|
self endon("disconnect");
|
|
|
|
wait 0.05;
|
|
|
|
flag_wait("hud_visible");
|
|
|
|
vars = [];
|
|
vars["prev_health"] = 0;
|
|
vars["prev_maxhealth"] = 0;
|
|
vars["prev_shield_health"] = 0;
|
|
|
|
while (1)
|
|
{
|
|
player = self get_current_spectating_player();
|
|
|
|
shield_health = 0;
|
|
|
|
if (is_true(player.hasriotshield) && isdefined(player.shielddamagetaken) && player.shielddamagetaken < level.zombie_vars["riotshield_hit_points"])
|
|
{
|
|
shield_health = level.zombie_vars["riotshield_hit_points"] - player.shielddamagetaken;
|
|
shield_health = int((shield_health / level.zombie_vars["riotshield_hit_points"]) * 100);
|
|
}
|
|
|
|
if (player.health != vars["prev_health"] || player.maxhealth != vars["prev_maxhealth"] || shield_health != vars["prev_shield_health"])
|
|
{
|
|
self luinotifyevent(&"hud_update_health", 3, player.health, player.maxhealth, shield_health);
|
|
}
|
|
|
|
vars["prev_health"] = player.health;
|
|
vars["prev_maxhealth"] = player.maxhealth;
|
|
vars["prev_shield_health"] = shield_health;
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
enemy_counter_hud()
|
|
{
|
|
if (getDvar("g_gametype") == "zgrief")
|
|
{
|
|
return;
|
|
}
|
|
|
|
hud = newHudElem();
|
|
hud.alignx = "left";
|
|
hud.aligny = "top";
|
|
hud.horzalign = "user_left";
|
|
hud.vertalign = "user_top";
|
|
hud.x += 5;
|
|
hud.y += 2;
|
|
hud.fontscale = 1.4;
|
|
hud.alpha = 0;
|
|
hud.color = (1, 1, 1);
|
|
hud.hidewheninmenu = 1;
|
|
hud.foreground = 1;
|
|
hud.label = &"ZOMBIE_HUD_ENEMIES_REMAINING";
|
|
|
|
hud endon("death");
|
|
|
|
hud thread destroy_on_intermission();
|
|
|
|
flag_wait("hud_visible");
|
|
|
|
hud.alpha = 1;
|
|
|
|
vars = [];
|
|
|
|
while (1)
|
|
{
|
|
vars["enemies"] = get_round_enemy_array().size + level.zombie_total;
|
|
|
|
if (level flag_exists("spawn_ghosts") && flag("spawn_ghosts"))
|
|
{
|
|
vars["enemies"] = get_current_ghost_count();
|
|
}
|
|
else if (level flag_exists("sq_tpo_special_round_active") && flag("sq_tpo_special_round_active"))
|
|
{
|
|
vars["enemies"] = 0;
|
|
}
|
|
|
|
if (vars["enemies"] == 0)
|
|
{
|
|
hud setText("");
|
|
}
|
|
else
|
|
{
|
|
hud setValue(vars["enemies"]);
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
get_current_ghost_count()
|
|
{
|
|
vars = [];
|
|
vars["ghost_count"] = 0;
|
|
vars["ais"] = getaiarray(level.zombie_team);
|
|
|
|
for (i = 0; i < vars["ais"].size; i++)
|
|
{
|
|
vars["ai"] = vars["ais"][i];
|
|
|
|
if (isdefined(vars["ai"].is_ghost) && vars["ai"].is_ghost)
|
|
vars["ghost_count"]++;
|
|
}
|
|
|
|
return vars["ghost_count"];
|
|
}
|
|
|
|
timer_hud()
|
|
{
|
|
level thread round_timer_hud();
|
|
|
|
hud = newHudElem();
|
|
hud.alignx = "right";
|
|
hud.aligny = "top";
|
|
hud.horzalign = "user_right";
|
|
hud.vertalign = "user_top";
|
|
hud.x -= 5;
|
|
hud.y += 12;
|
|
hud.fontscale = 1.4;
|
|
hud.alpha = 0;
|
|
hud.color = (1, 1, 1);
|
|
hud.hidewheninmenu = 1;
|
|
hud.foreground = 1;
|
|
hud.label = &"ZOMBIE_HUD_TOTAL_TIME";
|
|
|
|
hud endon("death");
|
|
|
|
hud thread destroy_on_intermission();
|
|
|
|
hud thread set_time_frozen_on_end_game();
|
|
|
|
flag_wait("hud_visible");
|
|
|
|
hud.alpha = 1;
|
|
|
|
if (!flag("initial_blackscreen_passed"))
|
|
{
|
|
hud set_time_frozen(0, "initial_blackscreen_passed");
|
|
}
|
|
|
|
if (getDvar("g_gametype") == "zgrief")
|
|
{
|
|
hud set_time_frozen(0);
|
|
}
|
|
|
|
hud setTimerUp(0);
|
|
hud.start_time = getTime();
|
|
level.timer_hud_start_time = hud.start_time;
|
|
}
|
|
|
|
round_timer_hud()
|
|
{
|
|
flag_wait("hud_visible");
|
|
|
|
if (isDefined(level.scr_zm_ui_gametype_obj) && level.scr_zm_ui_gametype_obj != "zsnr")
|
|
{
|
|
return;
|
|
}
|
|
|
|
hud = newHudElem();
|
|
hud.alignx = "right";
|
|
hud.aligny = "top";
|
|
hud.horzalign = "user_right";
|
|
hud.vertalign = "user_top";
|
|
hud.x -= 5;
|
|
hud.y += 27;
|
|
hud.fontscale = 1.4;
|
|
hud.alpha = 0;
|
|
hud.color = (1, 1, 1);
|
|
hud.hidewheninmenu = 1;
|
|
hud.foreground = 1;
|
|
hud.label = &"ZOMBIE_HUD_ROUND_TIME";
|
|
|
|
hud endon("death");
|
|
|
|
hud thread destroy_on_intermission();
|
|
|
|
hud thread set_time_frozen_on_end_game();
|
|
|
|
hud.alpha = 1;
|
|
|
|
if (!flag("initial_blackscreen_passed"))
|
|
{
|
|
hud set_time_frozen(0, "initial_blackscreen_passed");
|
|
}
|
|
|
|
if (getDvar("g_gametype") == "zgrief")
|
|
{
|
|
hud set_time_frozen(0);
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
hud setTimerUp(0);
|
|
hud.start_time = getTime();
|
|
|
|
if (getDvar("g_gametype") == "zgrief")
|
|
{
|
|
level waittill("restart_round");
|
|
}
|
|
else
|
|
{
|
|
level waittill("end_of_round");
|
|
}
|
|
|
|
level thread round_total_timer_hud();
|
|
|
|
time = int((getTime() - hud.start_time) / 1000);
|
|
|
|
hud set_time_frozen(time);
|
|
}
|
|
}
|
|
|
|
round_total_timer_hud()
|
|
{
|
|
if (getDvar("g_gametype") == "zgrief")
|
|
{
|
|
return;
|
|
}
|
|
|
|
hud = newHudElem();
|
|
hud.alignx = "right";
|
|
hud.aligny = "top";
|
|
hud.horzalign = "user_right";
|
|
hud.vertalign = "user_top";
|
|
hud.x -= 5;
|
|
hud.y += 42;
|
|
hud.fontscale = 1.4;
|
|
hud.alpha = 0;
|
|
hud.color = (1, 1, 1);
|
|
hud.hidewheninmenu = 1;
|
|
hud.foreground = 1;
|
|
hud.label = &"ZOMBIE_HUD_ROUND_TOTAL_TIME";
|
|
|
|
hud endon("death");
|
|
|
|
hud thread destroy_on_intermission();
|
|
|
|
fade_time = 0.5;
|
|
|
|
hud fadeOverTime(fade_time);
|
|
hud.alpha = 1;
|
|
|
|
time = int((getTime() - level.timer_hud_start_time) / 1000);
|
|
|
|
hud set_time_frozen(time);
|
|
|
|
hud fadeOverTime(fade_time);
|
|
hud.alpha = 0;
|
|
|
|
wait fade_time;
|
|
|
|
hud destroy();
|
|
}
|
|
|
|
set_time_frozen(time, endon_notify)
|
|
{
|
|
if (isDefined(endon_notify))
|
|
{
|
|
level endon(endon_notify);
|
|
}
|
|
else if (getDvar("g_gametype") == "zgrief")
|
|
{
|
|
level endon("restart_round_start");
|
|
}
|
|
else
|
|
{
|
|
level endon("start_of_round");
|
|
}
|
|
|
|
self endon("death");
|
|
|
|
if (time != 0)
|
|
{
|
|
time -= 0.5; // need to set it below the number or it shows the next number
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
if (time == 0)
|
|
{
|
|
self setTimerUp(time);
|
|
}
|
|
else
|
|
{
|
|
self setTimer(time);
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
set_time_frozen_on_end_game()
|
|
{
|
|
level endon("intermission");
|
|
|
|
level waittill_any("end_game", "freeze_timers");
|
|
|
|
time = int((getTime() - self.start_time) / 1000);
|
|
|
|
self set_time_frozen(time, "forever");
|
|
}
|
|
|
|
zone_name_hud()
|
|
{
|
|
level endon("intermission");
|
|
self endon("disconnect");
|
|
|
|
wait 0.05;
|
|
|
|
flag_wait("hud_visible");
|
|
|
|
vars = [];
|
|
vars["prev_zone_name"] = &"";
|
|
|
|
while (1)
|
|
{
|
|
player = self get_current_spectating_player();
|
|
|
|
vars["zone"] = player get_current_zone();
|
|
vars["zone_name"] = player get_zone_display_name(vars["zone"]);
|
|
|
|
if (vars["zone_name"] != vars["prev_zone_name"])
|
|
{
|
|
if (vars["prev_zone_name"] != &"")
|
|
{
|
|
self luinotifyevent(&"hud_update_zone_fade_out");
|
|
|
|
wait 0.25;
|
|
}
|
|
|
|
if (vars["zone_name"] != &"")
|
|
{
|
|
self luinotifyevent(&"hud_update_zone_fade_in", 1, vars["zone_name"]);
|
|
|
|
wait 0.25;
|
|
}
|
|
|
|
vars["prev_zone_name"] = vars["zone_name"];
|
|
|
|
continue;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
get_zone_display_name(zone)
|
|
{
|
|
if (!isDefined(zone))
|
|
{
|
|
return &"";
|
|
}
|
|
|
|
if (level.script == "zm_tomb")
|
|
{
|
|
if (isDefined(self.teleporting) && self.teleporting)
|
|
{
|
|
return &"";
|
|
}
|
|
}
|
|
|
|
return istring(toupper(level.script + "_" + zone));
|
|
}
|
|
|
|
bleedout_bar_hud()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
flag_wait("hud_visible");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("entering_last_stand");
|
|
|
|
if (is_gametype_active("zcleansed"))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// don't show for last player downed
|
|
if (!self maps\mp\zombies\_zm_laststand::player_is_in_laststand())
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (flag("solo_game"))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
hud = self createbar((1, 0, 0), level.secondaryprogressbarwidth * 2, level.secondaryprogressbarheight);
|
|
hud setpoint("CENTER", undefined, level.secondaryprogressbarx, -1 * level.secondaryprogressbary);
|
|
hud.hidewheninmenu = 1;
|
|
hud.bar.hidewheninmenu = 1;
|
|
hud.barframe.hidewheninmenu = 1;
|
|
hud.sort = 1;
|
|
hud.bar.sort = 2;
|
|
hud.barframe.sort = 3;
|
|
hud.barframe destroy();
|
|
hud thread destroy_on_intermission();
|
|
|
|
self thread bleedout_bar_hud_updatebar(hud);
|
|
|
|
self waittill_any("player_revived", "bled_out", "player_suicide");
|
|
|
|
hud.bar destroy();
|
|
hud destroy();
|
|
}
|
|
}
|
|
|
|
// scaleovertime doesn't work past 30 seconds so here is a workaround
|
|
bleedout_bar_hud_updatebar(hud)
|
|
{
|
|
self endon("player_revived");
|
|
self endon("bled_out");
|
|
self endon("player_suicide");
|
|
|
|
vars = [];
|
|
|
|
vars["bleedout_time"] = getDvarInt("player_lastStandBleedoutTime");
|
|
vars["interval_time"] = 30;
|
|
vars["interval_frac"] = vars["interval_time"] / vars["bleedout_time"];
|
|
vars["num_intervals"] = int(vars["bleedout_time"] / vars["interval_time"]) + 1;
|
|
|
|
hud updatebar(1);
|
|
|
|
for (i = 0; i < vars["num_intervals"]; i++)
|
|
{
|
|
vars["time"] = vars["bleedout_time"];
|
|
|
|
if (vars["time"] > vars["interval_time"])
|
|
{
|
|
vars["time"] = vars["interval_time"];
|
|
}
|
|
|
|
vars["frac"] = 0.99 - ((i + 1) * vars["interval_frac"]);
|
|
|
|
barwidth = int((hud.width * vars["frac"]) + 0.5);
|
|
|
|
if (barwidth < 1)
|
|
{
|
|
barwidth = 1;
|
|
}
|
|
|
|
hud.bar scaleovertime(vars["time"], barwidth, hud.height);
|
|
|
|
wait vars["time"];
|
|
|
|
vars["bleedout_time"] -= vars["time"];
|
|
}
|
|
}
|
|
|
|
last_stand_pistol_swap()
|
|
{
|
|
if (self has_powerup_weapon())
|
|
{
|
|
self.lastactiveweapon = "none";
|
|
}
|
|
|
|
if (!self hasweapon(self.laststandpistol))
|
|
{
|
|
if (!is_weapon_upgraded(self.laststandpistol))
|
|
{
|
|
self giveweapon(self.laststandpistol);
|
|
}
|
|
else
|
|
{
|
|
self giveweapon(self.laststandpistol, 0, self get_pack_a_punch_weapon_options(self.laststandpistol));
|
|
}
|
|
}
|
|
|
|
amt = 0;
|
|
ammoclip = weaponclipsize(self.laststandpistol);
|
|
doubleclip = ammoclip * 2;
|
|
dual_wield_wep = weapondualwieldweaponname(self.laststandpistol);
|
|
|
|
if (dual_wield_wep != "none")
|
|
{
|
|
ammoclip += weaponclipsize(dual_wield_wep);
|
|
doubleclip = ammoclip;
|
|
}
|
|
|
|
if (is_true(self._special_solo_pistol_swap) || self.laststandpistol == level.default_solo_laststandpistol && !self.hadpistol)
|
|
{
|
|
self._special_solo_pistol_swap = 0;
|
|
self.hadpistol = 0;
|
|
amt = ammoclip;
|
|
}
|
|
else if (flag("solo_game") && self.laststandpistol == level.default_solo_laststandpistol)
|
|
{
|
|
amt = ammoclip;
|
|
}
|
|
else if (self.laststandpistol == level.default_laststandpistol)
|
|
{
|
|
amt = ammoclip + doubleclip;
|
|
}
|
|
else if (self.laststandpistol == "ray_gun_zm" || self.laststandpistol == "ray_gun_upgraded_zm" || self.laststandpistol == "raygun_mark2_zm" || self.laststandpistol == "raygun_mark2_upgraded_zm" || self.laststandpistol == level.default_solo_laststandpistol)
|
|
{
|
|
amt = ammoclip;
|
|
|
|
if (self.hadpistol && amt > self.stored_weapon_info[self.laststandpistol].total_amt)
|
|
{
|
|
amt = self.stored_weapon_info[self.laststandpistol].total_amt;
|
|
}
|
|
|
|
self.stored_weapon_info[self.laststandpistol].given_amt = amt;
|
|
}
|
|
else
|
|
{
|
|
amt = ammoclip + doubleclip;
|
|
|
|
if (self.hadpistol && amt > self.stored_weapon_info[self.laststandpistol].total_amt)
|
|
{
|
|
amt = self.stored_weapon_info[self.laststandpistol].total_amt;
|
|
}
|
|
|
|
self.stored_weapon_info[self.laststandpistol].given_amt = amt;
|
|
}
|
|
|
|
clip_amt_init = 0;
|
|
left_clip_amt_init = 0;
|
|
|
|
if (self.hadpistol)
|
|
{
|
|
clip_amt_init = self.stored_weapon_info[self.laststandpistol].clip_amt;
|
|
|
|
if (dual_wield_wep != "none")
|
|
{
|
|
left_clip_amt_init = self.stored_weapon_info[self.laststandpistol].left_clip_amt;
|
|
}
|
|
|
|
amt -= clip_amt_init + left_clip_amt_init;
|
|
}
|
|
|
|
clip_amt_add = weaponclipsize(self.laststandpistol) - clip_amt_init;
|
|
|
|
if (clip_amt_add > amt)
|
|
{
|
|
clip_amt_add = amt;
|
|
}
|
|
|
|
self setweaponammoclip(self.laststandpistol, clip_amt_init + clip_amt_add);
|
|
|
|
amt -= clip_amt_add;
|
|
|
|
if (dual_wield_wep != "none")
|
|
{
|
|
left_clip_amt_add = weaponclipsize(dual_wield_wep) - left_clip_amt_init;
|
|
|
|
if (left_clip_amt_add > amt)
|
|
{
|
|
left_clip_amt_add = amt;
|
|
}
|
|
|
|
self set_weapon_ammo_clip_left(self.laststandpistol, left_clip_amt_init + left_clip_amt_add);
|
|
|
|
amt -= left_clip_amt_add;
|
|
}
|
|
|
|
stock_amt = doubleclip;
|
|
|
|
if (stock_amt > amt)
|
|
{
|
|
stock_amt = amt;
|
|
}
|
|
|
|
self setweaponammostock(self.laststandpistol, stock_amt);
|
|
|
|
self switchtoweapon(self.laststandpistol);
|
|
}
|
|
|
|
last_stand_restore_pistol_ammo(only_store_info = false)
|
|
{
|
|
self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined;
|
|
|
|
if (!isDefined(self.stored_weapon_info))
|
|
{
|
|
return;
|
|
}
|
|
|
|
weapon_inventory = self getweaponslist(1);
|
|
weapon_to_restore = getarraykeys(self.stored_weapon_info);
|
|
i = 0;
|
|
|
|
while (i < weapon_inventory.size)
|
|
{
|
|
weapon = weapon_inventory[i];
|
|
|
|
if (weapon != self.laststandpistol)
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
for (j = 0; j < weapon_to_restore.size; j++)
|
|
{
|
|
check_weapon = weapon_to_restore[j];
|
|
|
|
if (weapon == check_weapon)
|
|
{
|
|
dual_wield_name = weapondualwieldweaponname(weapon);
|
|
|
|
if (self.stored_weapon_info[weapon].given_amt == 0)
|
|
{
|
|
self setweaponammoclip(weapon, self.stored_weapon_info[weapon].clip_amt);
|
|
|
|
if ("none" != dual_wield_name)
|
|
self set_weapon_ammo_clip_left(weapon, self.stored_weapon_info[weapon].left_clip_amt);
|
|
|
|
self setweaponammostock(weapon, self.stored_weapon_info[weapon].stock_amt);
|
|
|
|
break;
|
|
}
|
|
|
|
last_clip = self getweaponammoclip(weapon);
|
|
last_left_clip = 0;
|
|
|
|
if ("none" != dual_wield_name)
|
|
{
|
|
last_left_clip = self getweaponammoclip(dual_wield_name);
|
|
}
|
|
|
|
last_stock = self getweaponammostock(weapon);
|
|
last_total = last_clip + last_left_clip + last_stock;
|
|
|
|
self.stored_weapon_info[weapon].used_amt = self.stored_weapon_info[weapon].given_amt - last_total;
|
|
|
|
if (only_store_info)
|
|
{
|
|
break;
|
|
}
|
|
|
|
used_amt = self.stored_weapon_info[weapon].used_amt;
|
|
|
|
if (used_amt >= self.stored_weapon_info[weapon].stock_amt)
|
|
{
|
|
used_amt -= self.stored_weapon_info[weapon].stock_amt;
|
|
self.stored_weapon_info[weapon].stock_amt = 0;
|
|
|
|
if ("none" != dual_wield_name)
|
|
{
|
|
if (used_amt >= self.stored_weapon_info[weapon].left_clip_amt)
|
|
{
|
|
used_amt -= self.stored_weapon_info[weapon].left_clip_amt;
|
|
self.stored_weapon_info[weapon].left_clip_amt = 0;
|
|
|
|
if (used_amt >= self.stored_weapon_info[weapon].clip_amt)
|
|
{
|
|
used_amt -= self.stored_weapon_info[weapon].clip_amt;
|
|
self.stored_weapon_info[weapon].clip_amt = 0;
|
|
}
|
|
else
|
|
{
|
|
self.stored_weapon_info[weapon].clip_amt -= used_amt;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self.stored_weapon_info[weapon].left_clip_amt -= used_amt;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (used_amt >= self.stored_weapon_info[weapon].clip_amt)
|
|
{
|
|
used_amt -= self.stored_weapon_info[weapon].clip_amt;
|
|
self.stored_weapon_info[weapon].clip_amt = 0;
|
|
}
|
|
else
|
|
{
|
|
self.stored_weapon_info[weapon].clip_amt -= used_amt;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self.stored_weapon_info[weapon].stock_amt -= used_amt;
|
|
}
|
|
|
|
self setweaponammoclip(weapon, self.stored_weapon_info[weapon].clip_amt);
|
|
|
|
if ("none" != dual_wield_name)
|
|
self set_weapon_ammo_clip_left(weapon, self.stored_weapon_info[weapon].left_clip_amt);
|
|
|
|
self setweaponammostock(weapon, self.stored_weapon_info[weapon].stock_amt);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
i++;
|
|
}
|
|
}
|
|
|
|
// setweaponammoclip on dual wield left weapons only works when the weapon is given
|
|
set_weapon_ammo_clip_left(weapon, amount)
|
|
{
|
|
dual_wield_weapon = weaponDualWieldWeaponName(weapon);
|
|
alt_weapon = weaponAltWeaponName(weapon);
|
|
|
|
clip_ammo = self getweaponammoclip(weapon);
|
|
stock_ammo = self getweaponammostock(weapon);
|
|
alt_clip_ammo = self getweaponammoclip(alt_weapon);
|
|
alt_stock_ammo = self getweaponammostock(alt_weapon);
|
|
|
|
self takeweapon(weapon);
|
|
self giveweapon(weapon, 0, self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options(weapon));
|
|
|
|
self setweaponammoclip(weapon, clip_ammo);
|
|
self setweaponammostock(weapon, stock_ammo);
|
|
self setweaponammoclip(alt_weapon, alt_clip_ammo);
|
|
self setweaponammostock(alt_weapon, alt_stock_ammo);
|
|
|
|
self setweaponammoclip(dual_wield_weapon, amount);
|
|
|
|
self seteverhadweaponall(1);
|
|
}
|
|
|
|
setscoreboardcolumns_gametype()
|
|
{
|
|
if (level.scr_zm_ui_gametype != "zgrief")
|
|
{
|
|
setscoreboardcolumns("score", "kills", "headshots", "downs", "revives");
|
|
}
|
|
}
|
|
|
|
swap_staminup_perk()
|
|
{
|
|
vending_triggers = getentarray("zombie_vending", "targetname");
|
|
|
|
foreach (trigger in vending_triggers)
|
|
{
|
|
if (trigger.script_noteworthy == "specialty_longersprint")
|
|
{
|
|
trigger.script_noteworthy = "specialty_movefaster";
|
|
}
|
|
}
|
|
|
|
if (isDefined(level._random_perk_machine_perk_list))
|
|
{
|
|
for (i = 0; i < level._random_perk_machine_perk_list.size; i++)
|
|
{
|
|
if (level._random_perk_machine_perk_list[i] == "specialty_longersprint")
|
|
{
|
|
level._random_perk_machine_perk_list[i] = "specialty_movefaster";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
veryhurt_blood_fx()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
health_ratio = self.health / self.maxhealth;
|
|
|
|
if (health_ratio <= 0.2)
|
|
{
|
|
playFXOnTag(level._effect["zombie_guts_explosion"], self, "J_SpineLower");
|
|
|
|
wait 1;
|
|
|
|
continue;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
ignoreme_after_revived()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("player_revived", reviver);
|
|
|
|
self thread player_revive_protection();
|
|
}
|
|
}
|
|
|
|
player_revive_protection()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("player_downed");
|
|
self endon("meat_grabbed");
|
|
self endon("meat_stink_player_start");
|
|
|
|
self thread player_revive_protection_timeout();
|
|
|
|
self.revive_protection = 1;
|
|
|
|
for (i = 0; i < 20; i++)
|
|
{
|
|
self.ignoreme = 1;
|
|
wait 0.05;
|
|
}
|
|
|
|
if (!isDefined(level.meat_player))
|
|
{
|
|
self.ignoreme = 0;
|
|
}
|
|
|
|
self.revive_protection = 0;
|
|
self notify("player_revive_protection_end");
|
|
}
|
|
|
|
player_revive_protection_timeout()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("player_revive_protection_end");
|
|
|
|
self waittill_any("player_downed", "meat_grabbed", "meat_stink_player_start");
|
|
|
|
self.revive_protection = 0;
|
|
}
|
|
|
|
held_melee_weapon_world_model_fix()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
melee_weapon = self get_player_melee_weapon();
|
|
current_weapon = self getcurrentweapon();
|
|
|
|
if (getweaponmodel(melee_weapon) == "t6_wpn_none_world")
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
if (!self hasweapon(melee_weapon) && !self hasweapon("held_" + melee_weapon))
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
if (current_weapon == "held_" + melee_weapon && self hasweapon(melee_weapon))
|
|
{
|
|
self takeweapon(melee_weapon);
|
|
|
|
if (is_held_melee_weapon_offhand_melee(melee_weapon))
|
|
{
|
|
self giveweapon("held_" + melee_weapon + "_offhand");
|
|
}
|
|
}
|
|
else if (current_weapon != "held_" + melee_weapon && !self hasweapon(melee_weapon))
|
|
{
|
|
self giveweapon(melee_weapon);
|
|
|
|
if (is_held_melee_weapon_offhand_melee(melee_weapon))
|
|
{
|
|
self takeweapon("held_" + melee_weapon + "_offhand");
|
|
}
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
is_held_melee_weapon_offhand_melee(weaponname)
|
|
{
|
|
return weaponname == "tazer_knuckles_zm";
|
|
}
|
|
|
|
fall_velocity_check()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
vars = [];
|
|
|
|
while (1)
|
|
{
|
|
vars["was_on_ground"] = 1;
|
|
self.fall_velocity = 0;
|
|
|
|
while (!self isOnGround())
|
|
{
|
|
vars["was_on_ground"] = 0;
|
|
vars["vel"] = self getVelocity();
|
|
self.fall_velocity = vars["vel"][2];
|
|
wait 0.05;
|
|
}
|
|
|
|
if (!vars["was_on_ground"])
|
|
{
|
|
// fall damage does not register when player's max health is less than 100 and has PHD Flopper
|
|
if (self.maxhealth < 100 && self hasPerk("specialty_flakjacket"))
|
|
{
|
|
if (is_true(self.divetoprone) && self.fall_velocity <= -300)
|
|
{
|
|
if (isDefined(level.zombiemode_divetonuke_perk_func))
|
|
{
|
|
[[level.zombiemode_divetonuke_perk_func]](self, self.origin);
|
|
}
|
|
}
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
disable_bank_teller()
|
|
{
|
|
vars = [];
|
|
|
|
level notify("stop_bank_teller");
|
|
vars["bank_teller_dmg_trig"] = getent("bank_teller_tazer_trig", "targetname");
|
|
|
|
if (IsDefined(vars["bank_teller_dmg_trig"]))
|
|
{
|
|
vars["bank_teller_transfer_trig"] = getent(vars["bank_teller_dmg_trig"].target, "targetname");
|
|
vars["bank_teller_transfer_trig"] delete();
|
|
vars["bank_teller_dmg_trig"] delete();
|
|
}
|
|
}
|
|
|
|
disable_carpenter()
|
|
{
|
|
arrayremovevalue(level.zombie_powerup_array, "carpenter");
|
|
}
|
|
|
|
powerup_changes()
|
|
{
|
|
if (getDvar("mapname") == "zm_transit" || getDvar("mapname") == "zm_highrise")
|
|
{
|
|
include_powerup("fire_sale");
|
|
}
|
|
}
|
|
|
|
weapon_changes()
|
|
{
|
|
if (level.script == "zm_transit" || level.script == "zm_nuked" || level.script == "zm_highrise" || level.script == "zm_buried" || level.script == "zm_tomb")
|
|
{
|
|
include_weapon("held_knife_zm", 0);
|
|
register_melee_weapon_for_level("held_knife_zm");
|
|
}
|
|
|
|
if (level.script == "zm_transit" || level.script == "zm_nuked" || level.script == "zm_highrise" || level.script == "zm_buried")
|
|
{
|
|
include_weapon("held_bowie_knife_zm", 0);
|
|
register_melee_weapon_for_level("held_bowie_knife_zm");
|
|
|
|
include_weapon("held_tazer_knuckles_zm", 0);
|
|
register_melee_weapon_for_level("held_tazer_knuckles_zm");
|
|
|
|
level.laststandpistol = "fnp45_zm";
|
|
level.default_laststandpistol = "fnp45_zm";
|
|
level.default_solo_laststandpistol = "fnp45_upgraded_zm";
|
|
level.start_weapon = "fnp45_zm";
|
|
include_weapon("fnp45_zm", 0);
|
|
include_weapon("fnp45_upgraded_zm", 0);
|
|
add_limited_weapon("fnp45_zm", 0);
|
|
add_zombie_weapon("fnp45_zm", "fnp45_upgraded_zm", &"WEAPON_FNP45", 500, "", "", undefined, 1);
|
|
}
|
|
|
|
if (level.script == "zm_transit")
|
|
{
|
|
include_weapon("an94_zm", 0);
|
|
include_weapon("an94_upgraded_zm", 0);
|
|
add_zombie_weapon("an94_zm", "an94_upgraded_zm", &"ZOMBIE_WEAPON_AN94", 1500, "", "", undefined, 1);
|
|
|
|
include_weapon("pdw57_zm", 0);
|
|
include_weapon("pdw57_upgraded_zm", 0);
|
|
add_zombie_weapon("pdw57_zm", "pdw57_upgraded_zm", &"ZOMBIE_WEAPON_PDW57", 1000, "", "", undefined, 1);
|
|
|
|
include_weapon("svu_zm", 0);
|
|
include_weapon("svu_upgraded_zm", 0);
|
|
add_zombie_weapon("svu_zm", "svu_upgraded_zm", &"ZOMBIE_WEAPON_SVU", 1000, "", "", undefined, 1);
|
|
|
|
include_weapon("metalstorm_mms_zm");
|
|
include_weapon("metalstorm_mms_upgraded_zm", 0);
|
|
add_limited_weapon("metalstorm_mms_zm", 1);
|
|
add_zombie_weapon("metalstorm_mms_zm", "metalstorm_mms_upgraded_zm", &"WEAPON_METALSTORM", 1000, "", "", undefined, 1);
|
|
}
|
|
|
|
if (level.script == "zm_prison")
|
|
{
|
|
include_weapon("held_knife_zm_alcatraz", 0);
|
|
register_melee_weapon_for_level("held_knife_zm_alcatraz");
|
|
|
|
include_weapon("held_spoon_zm_alcatraz", 0);
|
|
register_melee_weapon_for_level("held_spoon_zm_alcatraz");
|
|
|
|
include_weapon("held_spork_zm_alcatraz", 0);
|
|
register_melee_weapon_for_level("held_spork_zm_alcatraz");
|
|
|
|
include_weapon("sticky_grenade_zm", 0);
|
|
add_zombie_weapon("sticky_grenade_zm", undefined, &"ZOMBIE_WEAPON_STICKY_GRENADE", 250, "wpck_explo", "", 250);
|
|
register_lethal_grenade_for_level("sticky_grenade_zm");
|
|
|
|
maps\mp\zombies\_zm_weapons::register_zombie_weapon_callback("willy_pete_zm", ::player_give_willy_pete);
|
|
register_tactical_grenade_for_level("willy_pete_zm");
|
|
level.zombie_weapons["willy_pete_zm"].is_in_box = 1;
|
|
}
|
|
|
|
if (level.script == "zm_tomb")
|
|
{
|
|
include_weapon("held_one_inch_punch_zm", 0);
|
|
register_melee_weapon_for_level("held_one_inch_punch_zm");
|
|
|
|
include_weapon("held_one_inch_punch_upgraded_zm", 0);
|
|
register_melee_weapon_for_level("held_one_inch_punch_upgraded_zm");
|
|
|
|
include_weapon("held_one_inch_punch_air_zm", 0);
|
|
register_melee_weapon_for_level("held_one_inch_punch_air_zm");
|
|
|
|
include_weapon("held_one_inch_punch_fire_zm", 0);
|
|
register_melee_weapon_for_level("held_one_inch_punch_fire_zm");
|
|
|
|
include_weapon("held_one_inch_punch_ice_zm", 0);
|
|
register_melee_weapon_for_level("held_one_inch_punch_ice_zm");
|
|
|
|
include_weapon("held_one_inch_punch_lightning_zm", 0);
|
|
register_melee_weapon_for_level("held_one_inch_punch_lightning_zm");
|
|
|
|
include_weapon("bouncingbetty_zm", 0);
|
|
add_zombie_weapon("bouncingbetty_zm", undefined, &"ZOMBIE_WEAPON_BOUNCINGBETTY", 1000, "wpck_explo", "", undefined, 1);
|
|
register_placeable_mine_for_level("bouncingbetty_zm");
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["saritch_zm"]))
|
|
{
|
|
level.zombie_weapons["saritch_zm"].is_in_box = 0;
|
|
level.zombie_weapons["saritch_zm"].cost = 500;
|
|
level.zombie_weapons["saritch_zm"].ammo_cost = 250;
|
|
level.vox.speaker["player"].alias["weapon_pickup"]["saritch_zm"] = "";
|
|
}
|
|
else
|
|
{
|
|
include_weapon("saritch_zm", 0);
|
|
include_weapon("saritch_upgraded_zm", 0);
|
|
add_zombie_weapon("saritch_zm", "saritch_upgraded_zm", &"ZOMBIE_WEAPON_SARITCH", 500, "", "", undefined, 1);
|
|
}
|
|
|
|
if (!isdefined(level.zombie_weapons["ballista_zm"]))
|
|
{
|
|
include_weapon("ballista_zm", 0);
|
|
include_weapon("ballista_upgraded_zm", 0);
|
|
add_zombie_weapon("ballista_zm", "ballista_upgraded_zm", &"ZMWEAPON_BALLISTA_WALLBUY", 500, "", "", undefined, 1);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["mp5k_zm"]))
|
|
{
|
|
include_weapon("insas_zm", 0);
|
|
include_weapon("insas_upgraded_zm", 0);
|
|
add_zombie_weapon("insas_zm", "insas_upgraded_zm", &"ZOMBIE_WEAPON_INSAS", 1000, "", "", undefined, 1);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["ak74u_zm"]))
|
|
{
|
|
include_weapon("vector_zm", 0);
|
|
include_weapon("vector_upgraded_zm", 0);
|
|
add_zombie_weapon("vector_zm", "vector_upgraded_zm", &"ZOMBIE_WEAPON_VECTOR", 1200, "", "", undefined, 1);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["ak74u_extclip_zm"]))
|
|
{
|
|
level.zombie_weapons["ak74u_extclip_zm"].is_in_box = 0;
|
|
|
|
include_weapon("vector_extclip_zm");
|
|
include_weapon("vector_extclip_upgraded_zm", 0);
|
|
add_zombie_weapon("vector_extclip_zm", "vector_extclip_upgraded_zm", &"ZOMBIE_WEAPON_VECTOR", 1200, "wpck_smg", "", undefined, 1);
|
|
add_shared_ammo_weapon("vector_extclip_zm", "vector_zm");
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["m16_zm"]))
|
|
{
|
|
include_weapon("sig556_zm", 0);
|
|
include_weapon("sig556_upgraded_zm", 0);
|
|
add_zombie_weapon("sig556_zm", "sig556_upgraded_zm", &"ZOMBIE_WEAPON_SIG556", 1200, "", "", undefined, 1);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["python_zm"]))
|
|
{
|
|
level.zombie_weapons["python_zm"].is_in_box = 0;
|
|
}
|
|
|
|
if (level.script == "zm_buried")
|
|
{
|
|
level.zombie_weapons["judge_zm"].is_in_box = 0;
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["galil_zm"]))
|
|
{
|
|
level.zombie_weapons["galil_zm"].is_in_box = 0;
|
|
}
|
|
|
|
if (level.script == "zm_transit" || level.script == "zm_highrise" || level.script == "zm_buried")
|
|
{
|
|
include_weapon("hk416_zm");
|
|
include_weapon("hk416_upgraded_zm", 0);
|
|
add_zombie_weapon("hk416_zm", "hk416_upgraded_zm", &"ZOMBIE_WEAPON_HK416", 1000, "", "", undefined);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["fnfal_zm"]))
|
|
{
|
|
level.zombie_weapons["fnfal_zm"].is_in_box = 0;
|
|
|
|
vox = "wpck_fal";
|
|
|
|
if (level.script == "zm_prison")
|
|
{
|
|
vox = "wpck_mg";
|
|
}
|
|
else if (level.script == "zm_tomb")
|
|
{
|
|
vox = "wpck_rifle";
|
|
}
|
|
|
|
include_weapon("sa58_zm");
|
|
include_weapon("sa58_upgraded_zm", 0);
|
|
add_zombie_weapon("sa58_zm", "sa58_upgraded_zm", &"WEAPON_SA58", 1000, vox, "", undefined, 1);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["rpd_zm"]))
|
|
{
|
|
level.zombie_weapons["rpd_zm"].is_in_box = 0;
|
|
|
|
vox = "wpck_rpd";
|
|
|
|
include_weapon("mk48_zm");
|
|
include_weapon("mk48_upgraded_zm", 0);
|
|
add_zombie_weapon("mk48_zm", "mk48_upgraded_zm", &"WEAPON_MK48", 1000, vox, "", undefined, 1);
|
|
}
|
|
|
|
if (isdefined(level.zombie_weapons["barretm82_zm"]))
|
|
{
|
|
level.zombie_weapons["barretm82_zm"].is_in_box = 0;
|
|
|
|
vox = "wpck_m82a1";
|
|
|
|
if (level.script == "zm_transit" || level.script == "zm_nuked")
|
|
{
|
|
vox = "sniper";
|
|
}
|
|
else if (level.script == "zm_prison")
|
|
{
|
|
vox = "wpck_snipe";
|
|
}
|
|
|
|
include_weapon("as50_zm");
|
|
include_weapon("as50_upgraded_zm", 0);
|
|
add_zombie_weapon("as50_zm", "as50_upgraded_zm", &"WEAPON_AS50", 1000, vox, "", undefined, 1);
|
|
}
|
|
|
|
if (level.script == "zm_transit" || level.script == "zm_nuked" || level.script == "zm_highrise" || level.script == "zm_prison")
|
|
{
|
|
level.zombie_lethal_grenade_player_init = "sticky_grenade_zm";
|
|
}
|
|
}
|
|
|
|
player_give_willy_pete()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
self setclientfieldtoplayer("tomahawk_in_use", 0);
|
|
|
|
wait 0.05;
|
|
|
|
self giveweapon("willy_pete_zm");
|
|
}
|
|
|
|
wallbuy_cost_changes()
|
|
{
|
|
flag_wait("initial_blackscreen_passed");
|
|
|
|
if (isDefined(level.zombie_weapons["beretta93r_zm"]))
|
|
{
|
|
cost = 900;
|
|
level.zombie_weapons["beretta93r_zm"].cost = cost;
|
|
level.zombie_weapons["beretta93r_zm"].ammo_cost = int(cost / 2);
|
|
}
|
|
|
|
if (isDefined(level.zombie_weapons["870mcs_zm"]))
|
|
{
|
|
cost = 1200;
|
|
level.zombie_weapons["870mcs_zm"].cost = cost;
|
|
level.zombie_weapons["870mcs_zm"].ammo_cost = int(cost / 2);
|
|
}
|
|
|
|
if (isDefined(level.zombie_weapons["an94_zm"]))
|
|
{
|
|
cost = 1500;
|
|
level.zombie_weapons["an94_zm"].cost = cost;
|
|
level.zombie_weapons["an94_zm"].ammo_cost = int(cost / 2);
|
|
}
|
|
|
|
if (isDefined(level.zombie_weapons["thompson_zm"]))
|
|
{
|
|
level.zombie_weapons["thompson_zm"].ammo_cost = 750;
|
|
}
|
|
}
|
|
|
|
grenade_fire_watcher()
|
|
{
|
|
level endon("end_game");
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
self waittill("grenade_fire", grenade, weapname);
|
|
|
|
if (is_lethal_grenade(weapname) || is_tactical_grenade(weapname))
|
|
{
|
|
self thread temp_disable_offhand_weapons();
|
|
}
|
|
|
|
if (isdefined(level.headchopper_name) && weapname == level.headchopper_name)
|
|
{
|
|
grenade.angles = (0, grenade.angles[1], 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
temp_disable_offhand_weapons()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("entering_last_stand");
|
|
|
|
self disableOffhandWeapons();
|
|
|
|
while (self isThrowingGrenade())
|
|
{
|
|
wait 0.05;
|
|
}
|
|
|
|
if (!is_true(self.is_drinking))
|
|
{
|
|
self enableOffhandWeapons();
|
|
}
|
|
}
|
|
|
|
sndmeleewpnsound()
|
|
{
|
|
self endon("disconnect");
|
|
level endon("end_game");
|
|
|
|
while (1)
|
|
{
|
|
while (!self ismeleeing())
|
|
{
|
|
wait 0.05;
|
|
}
|
|
|
|
current_melee_weapon = self get_player_melee_weapon();
|
|
current_weapon = self getcurrentweapon();
|
|
|
|
alias = "zmb_melee_whoosh_npc";
|
|
|
|
if (is_true(self.is_player_zombie))
|
|
{
|
|
alias = "zmb_melee_whoosh_zmb_npc";
|
|
}
|
|
else if (issubstr(current_weapon, "shield_zm"))
|
|
{
|
|
alias = "fly_riotshield_zm_swing";
|
|
}
|
|
else if (current_melee_weapon == "bowie_knife_zm")
|
|
{
|
|
alias = "zmb_bowie_swing";
|
|
}
|
|
else if (current_melee_weapon == "tazer_knuckles_zm")
|
|
{
|
|
alias = "wpn_tazer_whoosh_npc";
|
|
}
|
|
else if (current_melee_weapon == "spoon_zm_alcatraz")
|
|
{
|
|
alias = "zmb_spoon_swing";
|
|
}
|
|
else if (current_melee_weapon == "spork_zm_alcatraz")
|
|
{
|
|
alias = "zmb_spork_swing";
|
|
}
|
|
else if (current_melee_weapon == "one_inch_punch_zm")
|
|
{
|
|
alias = "wpn_one_inch_punch_npc";
|
|
}
|
|
else if (current_melee_weapon == "one_inch_punch_upgraded_zm")
|
|
{
|
|
alias = "wpn_one_inch_punch_npc";
|
|
}
|
|
else if (current_melee_weapon == "one_inch_punch_fire_zm")
|
|
{
|
|
alias = "wpn_one_inch_punch_fire_npc";
|
|
}
|
|
else if (current_melee_weapon == "one_inch_punch_air_zm")
|
|
{
|
|
alias = "wpn_one_inch_punch_air_npc";
|
|
}
|
|
else if (current_melee_weapon == "one_inch_punch_ice_zm")
|
|
{
|
|
alias = "wpn_one_inch_punch_ice_npc";
|
|
}
|
|
else if (current_melee_weapon == "one_inch_punch_lightning_zm")
|
|
{
|
|
alias = "wpn_one_inch_punch_lightning_npc";
|
|
}
|
|
else if (sndmeleewpn_isstaff(current_melee_weapon))
|
|
{
|
|
alias = "zmb_melee_staff_upgraded_npc";
|
|
}
|
|
|
|
if (maps\mp\zombies\_zm_audio::sndisnetworksafe())
|
|
{
|
|
self play_sound_to_nearby_players(alias);
|
|
}
|
|
|
|
while (self ismeleeing())
|
|
{
|
|
wait 0.05;
|
|
}
|
|
}
|
|
}
|
|
|
|
play_sound_to_nearby_players(alias, range = 500)
|
|
{
|
|
players = get_players();
|
|
|
|
foreach (player in players)
|
|
{
|
|
if (player != self && distancesquared(player.origin, self.origin) <= range * range)
|
|
{
|
|
self playsoundtoplayer(alias, player);
|
|
}
|
|
}
|
|
}
|
|
|
|
sndmeleewpn_isstaff(weapon)
|
|
{
|
|
switch (weapon)
|
|
{
|
|
case "staff_melee_zm":
|
|
case "staff_air_melee_zm":
|
|
case "staff_fire_melee_zm":
|
|
case "staff_water_melee_zm":
|
|
case "staff_lightning_melee_zm":
|
|
|
|
isstaff = 1;
|
|
break;
|
|
|
|
default:
|
|
isstaff = 0;
|
|
}
|
|
|
|
return isstaff;
|
|
}
|
|
|
|
buildbuildables()
|
|
{
|
|
wait 1; // need a wait or else some buildables dont build
|
|
|
|
if (is_classic())
|
|
{
|
|
if (level.scr_zm_map_start_location == "transit")
|
|
{
|
|
level.buildables_available = array("turbine", "riotshield_zm", "turret", "electric_trap", "jetgun_zm");
|
|
|
|
buildbuildable("turbine");
|
|
buildbuildable("electric_trap");
|
|
buildbuildable("turret");
|
|
buildbuildable("riotshield_zm");
|
|
buildbuildable("jetgun_zm");
|
|
buildbuildable("powerswitch", 1);
|
|
buildbuildable("pap", 1);
|
|
buildbuildable("sq_common", 1);
|
|
buildbuildable("dinerhatch", 1, 0);
|
|
|
|
// power switch is not showing up from forced build
|
|
show_powerswitch();
|
|
}
|
|
else if (level.scr_zm_map_start_location == "rooftop")
|
|
{
|
|
level.buildables_available = array("springpad_zm", "slipgun_zm");
|
|
|
|
buildbuildable("slipgun_zm");
|
|
buildbuildable("springpad_zm");
|
|
buildbuildable("sq_common", 1);
|
|
}
|
|
else if (level.scr_zm_map_start_location == "processing")
|
|
{
|
|
flag_wait("initial_blackscreen_passed"); // wait for buildables to randomize
|
|
wait 1;
|
|
|
|
level.buildables_available = array("subwoofer_zm", "springpad_zm", "headchopper_zm");
|
|
|
|
removebuildable("keys_zm");
|
|
removebuildable("booze");
|
|
removebuildable("candy");
|
|
removebuildable("sloth");
|
|
buildbuildable("turbine");
|
|
buildbuildable("subwoofer_zm");
|
|
buildbuildable("springpad_zm");
|
|
buildbuildable("headchopper_zm");
|
|
buildbuildable("sq_common", 1);
|
|
buildbuildable("buried_sq_bt_m_tower", 0, 1, 1, ::onuseplantobject_mtower);
|
|
buildbuildable("buried_sq_bt_r_tower", 0, 1, 1, ::onuseplantobject_rtower);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (level.scr_zm_map_start_location == "street")
|
|
{
|
|
flag_wait("initial_blackscreen_passed"); // wait for buildables to be built
|
|
wait 1;
|
|
|
|
updatebuildables();
|
|
removebuildable("turbine", "buried");
|
|
}
|
|
}
|
|
}
|
|
|
|
buildbuildable(buildable, craft = 0, remove_pieces = 1, solo_pool = 0, onuse)
|
|
{
|
|
player = get_players()[0];
|
|
|
|
foreach (stub in level.buildable_stubs)
|
|
{
|
|
if (!isDefined(buildable) || stub.equipname == buildable)
|
|
{
|
|
if (isDefined(buildable) || stub.persistent != 3)
|
|
{
|
|
stub.cost = stub get_equipment_cost();
|
|
stub.trigger_func = scripts\zm\replaced\_zm_buildables_pooled::pooled_buildable_place_think;
|
|
|
|
if (isDefined(onuse))
|
|
{
|
|
stub.buildablestruct.onuseplantobject = onuse;
|
|
}
|
|
|
|
if (craft)
|
|
{
|
|
stub maps\mp\zombies\_zm_buildables::buildablestub_finish_build(player);
|
|
stub maps\mp\zombies\_zm_buildables::buildablestub_remove();
|
|
|
|
if (isdefined(stub.model))
|
|
{
|
|
stub.model notsolid();
|
|
stub.model show();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (level.script == "zm_buried")
|
|
{
|
|
if (solo_pool)
|
|
{
|
|
stub.solo_pool = 1;
|
|
scripts\zm\replaced\_zm_buildables_pooled::add_buildable_to_pool(stub, stub.equipname);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
scripts\zm\replaced\_zm_buildables_pooled::add_buildable_to_pool(stub, level.script);
|
|
}
|
|
}
|
|
|
|
if (remove_pieces)
|
|
{
|
|
foreach (piece in stub.buildablezone.pieces)
|
|
{
|
|
piece maps\mp\zombies\_zm_buildables::piece_unspawn();
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
get_equipment_cost()
|
|
{
|
|
if (self.equipname == "turbine")
|
|
{
|
|
return 500;
|
|
}
|
|
else if (self.equipname == "jetgun_zm")
|
|
{
|
|
return 10000;
|
|
}
|
|
else if (self.equipname == "slipgun_zm")
|
|
{
|
|
return 10000;
|
|
}
|
|
else if (self.equipname == "packasplat")
|
|
{
|
|
return 2500;
|
|
}
|
|
|
|
return 1000;
|
|
}
|
|
|
|
// adds updated hintstring and functionality
|
|
updatebuildables()
|
|
{
|
|
foreach (stub in level._unitriggers.trigger_stubs)
|
|
{
|
|
if (IsDefined(stub.equipname) && stub.equipname != "chalk")
|
|
{
|
|
stub.cost = stub get_equipment_cost();
|
|
stub.trigger_func = scripts\zm\replaced\_zm_buildables_pooled::pooled_buildable_place_think;
|
|
stub.prompt_and_visibility_func = scripts\zm\replaced\_zm_buildables_pooled::pooledbuildabletrigger_update_prompt;
|
|
}
|
|
}
|
|
}
|
|
|
|
removebuildable(buildable, poolname)
|
|
{
|
|
if (isDefined(poolname))
|
|
{
|
|
foreach (stub in level.buildablepools[poolname].stubs)
|
|
{
|
|
if (IsDefined(stub.equipname) && stub.equipname == buildable)
|
|
{
|
|
stub.model hide();
|
|
maps\mp\zombies\_zm_unitrigger::unregister_unitrigger(stub);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (stub in level.buildable_stubs)
|
|
{
|
|
if (!isDefined(buildable) || stub.equipname == buildable)
|
|
{
|
|
if (isDefined(buildable) || stub.persistent != 3)
|
|
{
|
|
stub maps\mp\zombies\_zm_buildables::buildablestub_remove();
|
|
|
|
foreach (piece in stub.buildablezone.pieces)
|
|
{
|
|
piece maps\mp\zombies\_zm_buildables::piece_unspawn();
|
|
}
|
|
|
|
maps\mp\zombies\_zm_unitrigger::unregister_unitrigger(stub);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
onuseplantobject_mtower(player)
|
|
{
|
|
level setclientfield("sq_gl_b_vt", 1);
|
|
level setclientfield("sq_gl_b_bb", 1);
|
|
level setclientfield("sq_gl_b_a", 1);
|
|
level setclientfield("sq_gl_b_ws", 1);
|
|
level notify("mtower_object_planted");
|
|
|
|
self maps\mp\zombies\_zm_buildables::buildablestub_finish_build(player);
|
|
player playsound("zmb_buildable_complete");
|
|
|
|
level thread unregister_tower_unitriggers();
|
|
}
|
|
|
|
onuseplantobject_rtower(player)
|
|
{
|
|
m_tower = getent("sq_guillotine", "targetname");
|
|
m_tower sq_tower_spawn_attachment("p6_zm_bu_sq_crystal", "j_crystal_01");
|
|
m_tower sq_tower_spawn_attachment("p6_zm_bu_sq_satellite_dish", "j_satellite");
|
|
m_tower sq_tower_spawn_attachment("p6_zm_bu_sq_antenna", "j_antenna");
|
|
m_tower sq_tower_spawn_attachment("p6_zm_bu_sq_wire_spool", "j_spool");
|
|
level notify("rtower_object_planted");
|
|
|
|
self maps\mp\zombies\_zm_buildables::buildablestub_finish_build(player);
|
|
player playsound("zmb_buildable_complete");
|
|
|
|
level thread unregister_tower_unitriggers();
|
|
}
|
|
|
|
sq_tower_spawn_attachment(str_model, str_tag)
|
|
{
|
|
m_part = spawn("script_model", self gettagorigin(str_tag));
|
|
m_part.angles = self gettagangles(str_tag);
|
|
m_part setmodel(str_model);
|
|
}
|
|
|
|
unregister_tower_unitriggers()
|
|
{
|
|
foreach (stub in level.buildable_stubs)
|
|
{
|
|
if (isDefined(stub.equipname))
|
|
{
|
|
if (stub.equipname == "buried_sq_bt_m_tower" || stub.equipname == "buried_sq_bt_r_tower")
|
|
{
|
|
maps\mp\zombies\_zm_unitrigger::unregister_unitrigger(stub);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// MOTD\Origins style buildables
|
|
buildcraftables()
|
|
{
|
|
flag_wait("initial_blackscreen_passed");
|
|
|
|
if (is_true(level.zombiemode_using_afterlife))
|
|
{
|
|
flag_wait("afterlife_start_over");
|
|
}
|
|
|
|
if (is_classic())
|
|
{
|
|
if (level.scr_zm_map_start_location == "prison")
|
|
{
|
|
buildcraftable("alcatraz_shield_zm");
|
|
buildcraftable("packasplat");
|
|
}
|
|
else if (level.scr_zm_map_start_location == "tomb")
|
|
{
|
|
buildcraftable("tomb_shield_zm");
|
|
buildcraftable("equip_dieseldrone_zm");
|
|
takecraftableparts("gramophone");
|
|
}
|
|
}
|
|
}
|
|
|
|
takecraftableparts(buildable)
|
|
{
|
|
player = get_players()[0];
|
|
|
|
foreach (stub in level.zombie_include_craftables)
|
|
{
|
|
if (stub.name == buildable)
|
|
{
|
|
foreach (piece in stub.a_piecestubs)
|
|
{
|
|
piecespawn = piece.piecespawn;
|
|
|
|
if (isDefined(piecespawn))
|
|
{
|
|
player player_take_piece(piecespawn);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
buildcraftable(buildable)
|
|
{
|
|
player = get_players()[0];
|
|
|
|
foreach (stub in level.a_uts_craftables)
|
|
{
|
|
if (stub.craftablestub.name == buildable)
|
|
{
|
|
foreach (piece in stub.craftablespawn.a_piecespawns)
|
|
{
|
|
piecespawn = get_craftable_piece(stub.craftablestub.name, piece.piecename);
|
|
|
|
if (isDefined(piecespawn))
|
|
{
|
|
player player_take_piece(piecespawn);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
get_craftable_piece(str_craftable, str_piece)
|
|
{
|
|
foreach (uts_craftable in level.a_uts_craftables)
|
|
{
|
|
if (uts_craftable.craftablestub.name == str_craftable)
|
|
{
|
|
foreach (piecespawn in uts_craftable.craftablespawn.a_piecespawns)
|
|
{
|
|
if (piecespawn.piecename == str_piece)
|
|
{
|
|
return piecespawn;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
player_take_piece(piecespawn)
|
|
{
|
|
piecestub = piecespawn.piecestub;
|
|
damage = piecespawn.damage;
|
|
|
|
if (isDefined(piecestub.onpickup))
|
|
{
|
|
piecespawn [[piecestub.onpickup]](self);
|
|
}
|
|
|
|
if (isDefined(piecestub.is_shared) && piecestub.is_shared)
|
|
{
|
|
if (isDefined(piecestub.client_field_id))
|
|
{
|
|
level setclientfield(piecestub.client_field_id, 1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (isDefined(piecestub.client_field_state))
|
|
{
|
|
self setclientfieldtoplayer("craftable", piecestub.client_field_state);
|
|
}
|
|
}
|
|
|
|
piecespawn piece_unspawn();
|
|
piecespawn notify("pickup");
|
|
|
|
if (isDefined(piecestub.is_shared) && piecestub.is_shared)
|
|
{
|
|
piecespawn.in_shared_inventory = 1;
|
|
}
|
|
|
|
self adddstat("buildables", piecespawn.craftablename, "pieces_pickedup", 1);
|
|
}
|
|
|
|
piece_unspawn()
|
|
{
|
|
if (isDefined(self.model))
|
|
{
|
|
self.model delete();
|
|
}
|
|
|
|
self.model = undefined;
|
|
|
|
if (isDefined(self.unitrigger))
|
|
{
|
|
thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger(self.unitrigger);
|
|
}
|
|
|
|
self.unitrigger = undefined;
|
|
}
|
|
|
|
remove_buildable_pieces(buildable_name)
|
|
{
|
|
foreach (buildable in level.zombie_include_buildables)
|
|
{
|
|
if (IsDefined(buildable.name) && buildable.name == buildable_name)
|
|
{
|
|
pieces = buildable.buildablepieces;
|
|
|
|
for (i = 0; i < pieces.size; i++)
|
|
{
|
|
pieces[i] maps\mp\zombies\_zm_buildables::piece_unspawn();
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
jetgun_remove_forced_weapon_switch()
|
|
{
|
|
if (!IsDefined(level.zombie_include_buildables))
|
|
{
|
|
return;
|
|
}
|
|
|
|
foreach (buildable in level.zombie_include_buildables)
|
|
{
|
|
if (IsDefined(buildable.name) && buildable.name == "jetgun_zm")
|
|
{
|
|
buildable.onbuyweapon = undefined;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
give_additional_perks()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
for (;;)
|
|
{
|
|
self waittill_any("perk_acquired", "perk_lost");
|
|
|
|
if (self HasPerk("specialty_fastreload"))
|
|
{
|
|
self SetPerk("specialty_fastads");
|
|
self SetPerk("specialty_fastweaponswitch");
|
|
self Setperk("specialty_fasttoss");
|
|
}
|
|
else
|
|
{
|
|
self UnsetPerk("specialty_fastads");
|
|
self UnsetPerk("specialty_fastweaponswitch");
|
|
self Unsetperk("specialty_fasttoss");
|
|
}
|
|
|
|
if (self HasPerk("specialty_deadshot"))
|
|
{
|
|
self SetPerk("specialty_stalker");
|
|
self Setperk("specialty_sprintrecovery");
|
|
}
|
|
else
|
|
{
|
|
self UnsetPerk("specialty_stalker");
|
|
self Unsetperk("specialty_sprintrecovery");
|
|
}
|
|
}
|
|
}
|
|
|
|
weapon_locker_give_ammo_after_rounds()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
while (1)
|
|
{
|
|
level waittill("end_of_round");
|
|
|
|
if (isDefined(self.stored_weapon_data))
|
|
{
|
|
if (self.stored_weapon_data["name"] != "none")
|
|
{
|
|
self.stored_weapon_data["clip"] = weaponClipSize(self.stored_weapon_data["name"]);
|
|
self.stored_weapon_data["stock"] = weaponMaxAmmo(self.stored_weapon_data["name"]);
|
|
}
|
|
|
|
if (self.stored_weapon_data["dw_name"] != "none")
|
|
{
|
|
self.stored_weapon_data["lh_clip"] = weaponClipSize(self.stored_weapon_data["dw_name"]);
|
|
}
|
|
|
|
if (self.stored_weapon_data["alt_name"] != "none")
|
|
{
|
|
self.stored_weapon_data["alt_clip"] = weaponClipSize(self.stored_weapon_data["alt_name"]);
|
|
self.stored_weapon_data["alt_stock"] = weaponMaxAmmo(self.stored_weapon_data["alt_name"]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
tombstone_spawn()
|
|
{
|
|
vars = [];
|
|
|
|
vars["powerup"] = spawn("script_model", self.origin + vectorScale((0, 0, 1), 40));
|
|
vars["powerup"].angles = self.angles;
|
|
vars["powerup"] setmodel("tag_origin");
|
|
vars["icon"] = spawn("script_model", self.origin + vectorScale((0, 0, 1), 40));
|
|
vars["icon"].angles = self.angles;
|
|
vars["icon"] setmodel("ch_tombstone1");
|
|
vars["icon"] linkto(vars["powerup"]);
|
|
vars["powerup"].icon = vars["icon"];
|
|
vars["powerup"].script_noteworthy = "player_tombstone_model";
|
|
vars["powerup"].player = self;
|
|
|
|
self thread maps\mp\zombies\_zm_tombstone::tombstone_clear();
|
|
vars["powerup"] thread tombstone_wobble();
|
|
vars["powerup"] thread tombstone_emp();
|
|
|
|
result = self waittill_any_return("player_revived", "spawned_player", "disconnect");
|
|
|
|
if (result == "disconnect")
|
|
{
|
|
vars["powerup"] tombstone_delete();
|
|
return;
|
|
}
|
|
|
|
vars["powerup"] thread tombstone_waypoint();
|
|
vars["powerup"] thread tombstone_timeout();
|
|
vars["powerup"] thread tombstone_grab();
|
|
}
|
|
|
|
tombstone_wobble()
|
|
{
|
|
self endon("tombstone_grabbed");
|
|
self endon("tombstone_timedout");
|
|
|
|
if (isDefined(self))
|
|
{
|
|
playfxontag(level._effect["powerup_on_solo"], self, "tag_origin");
|
|
self playsound("zmb_tombstone_spawn");
|
|
self playloopsound("zmb_tombstone_looper");
|
|
}
|
|
|
|
while (isDefined(self))
|
|
{
|
|
self rotateyaw(360, 3);
|
|
wait 2.9;
|
|
}
|
|
}
|
|
|
|
tombstone_emp()
|
|
{
|
|
self endon("tombstone_timedout");
|
|
self endon("tombstone_grabbed");
|
|
|
|
if (!should_watch_for_emp())
|
|
{
|
|
return;
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
level waittill("emp_detonate", origin, radius);
|
|
|
|
if (distancesquared(origin, self.origin) < (radius * radius))
|
|
{
|
|
playfx(level._effect["powerup_off"], self.origin);
|
|
self thread tombstone_delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
tombstone_waypoint()
|
|
{
|
|
hud = newClientHudElem(self.player);
|
|
hud.x = self.origin[0];
|
|
hud.y = self.origin[1];
|
|
hud.z = self.origin[2] + 40;
|
|
hud.alpha = 1;
|
|
hud.color = (0.5, 0.5, 0.5);
|
|
hud.hidewheninmenu = 1;
|
|
hud.fadewhentargeted = 1;
|
|
hud setShader("specialty_tombstone_zombies", 8, 8);
|
|
hud setWaypoint(1);
|
|
|
|
self waittill_any("tombstone_grabbed", "tombstone_timedout");
|
|
|
|
hud destroy();
|
|
}
|
|
|
|
tombstone_timeout()
|
|
{
|
|
self endon("tombstone_grabbed");
|
|
|
|
self thread maps\mp\zombies\_zm_tombstone::playtombstonetimeraudio();
|
|
|
|
self.player waittill("player_downed");
|
|
|
|
self tombstone_delete();
|
|
}
|
|
|
|
tombstone_grab()
|
|
{
|
|
self endon("tombstone_timedout");
|
|
|
|
while (isDefined(self))
|
|
{
|
|
players = get_players();
|
|
i = 0;
|
|
|
|
while (i < players.size)
|
|
{
|
|
if (players[i].is_zombie)
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if (isDefined(self.player) && players[i] == self.player)
|
|
{
|
|
dist = distance(players[i].origin, self.origin);
|
|
|
|
if (dist < 64)
|
|
{
|
|
playfx(level._effect["powerup_grabbed_solo"], self.origin);
|
|
playfx(level._effect["powerup_grabbed_wave_solo"], self.origin);
|
|
players[i] tombstone_give();
|
|
wait 0.1;
|
|
playsoundatposition("zmb_tombstone_grab", self.origin);
|
|
self stoploopsound();
|
|
self.icon unlink();
|
|
self.icon delete();
|
|
self delete();
|
|
self notify("tombstone_grabbed");
|
|
players[i] clientnotify("dc0");
|
|
players[i] notify("dance_on_my_grave");
|
|
}
|
|
}
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
wait_network_frame();
|
|
}
|
|
}
|
|
|
|
tombstone_delete()
|
|
{
|
|
self notify("tombstone_timedout");
|
|
self.icon unlink();
|
|
self.icon delete();
|
|
self delete();
|
|
}
|
|
|
|
tombstone_save()
|
|
{
|
|
self.tombstone_savedweapon_weapons = self getweaponslist();
|
|
self.tombstone_savedweapon_weaponsammo_clip = [];
|
|
self.tombstone_savedweapon_weaponsammo_clip_dualwield = [];
|
|
self.tombstone_savedweapon_weaponsammo_stock = [];
|
|
self.tombstone_savedweapon_weaponsammo_clip_alt = [];
|
|
self.tombstone_savedweapon_weaponsammo_stock_alt = [];
|
|
self.tombstone_savedweapon_currentweapon = self getcurrentweapon();
|
|
self.tombstone_savedweapon_melee = self get_player_melee_weapon();
|
|
self.tombstone_savedweapon_grenades = self get_player_lethal_grenade();
|
|
self.tombstone_savedweapon_tactical = self get_player_tactical_grenade();
|
|
self.tombstone_savedweapon_mine = self get_player_placeable_mine();
|
|
self.tombstone_savedweapon_equipment = self get_player_equipment();
|
|
self.tombstone_hasriotshield = undefined;
|
|
self.tombstone_perks = tombstone_save_perks(self);
|
|
|
|
// can't switch to alt weapon
|
|
if (is_alt_weapon(self.tombstone_savedweapon_currentweapon))
|
|
{
|
|
self.tombstone_savedweapon_currentweapon = maps\mp\zombies\_zm_weapons::get_nonalternate_weapon(self.tombstone_savedweapon_currentweapon);
|
|
}
|
|
|
|
for (i = 0; i < self.tombstone_savedweapon_weapons.size; i++)
|
|
{
|
|
self.tombstone_savedweapon_weaponsammo_clip[i] = self getweaponammoclip(self.tombstone_savedweapon_weapons[i]);
|
|
self.tombstone_savedweapon_weaponsammo_clip_dualwield[i] = self getweaponammoclip(weaponDualWieldWeaponName(self.tombstone_savedweapon_weapons[i]));
|
|
self.tombstone_savedweapon_weaponsammo_stock[i] = self getweaponammostock(self.tombstone_savedweapon_weapons[i]);
|
|
self.tombstone_savedweapon_weaponsammo_clip_alt[i] = self getweaponammoclip(weaponAltWeaponName(self.tombstone_savedweapon_weapons[i]));
|
|
self.tombstone_savedweapon_weaponsammo_stock_alt[i] = self getweaponammostock(weaponAltWeaponName(self.tombstone_savedweapon_weapons[i]));
|
|
|
|
wep = self.tombstone_savedweapon_weapons[i];
|
|
dualwield_wep = weaponDualWieldWeaponName(wep);
|
|
alt_wep = weaponAltWeaponName(wep);
|
|
|
|
clip_missing = weaponClipSize(wep) - self.tombstone_savedweapon_weaponsammo_clip[i];
|
|
|
|
if (clip_missing > self.tombstone_savedweapon_weaponsammo_stock[i])
|
|
{
|
|
clip_missing = self.tombstone_savedweapon_weaponsammo_stock[i];
|
|
}
|
|
|
|
self.tombstone_savedweapon_weaponsammo_clip[i] += clip_missing;
|
|
self.tombstone_savedweapon_weaponsammo_stock[i] -= clip_missing;
|
|
|
|
if (dualwield_wep != "none")
|
|
{
|
|
clip_dualwield_missing = weaponClipSize(dualwield_wep) - self.tombstone_savedweapon_weaponsammo_clip_dualwield[i];
|
|
|
|
if (clip_dualwield_missing > self.tombstone_savedweapon_weaponsammo_stock[i])
|
|
{
|
|
clip_dualwield_missing = self.tombstone_savedweapon_weaponsammo_stock[i];
|
|
}
|
|
|
|
self.tombstone_savedweapon_weaponsammo_clip_dualwield[i] += clip_dualwield_missing;
|
|
self.tombstone_savedweapon_weaponsammo_stock[i] -= clip_dualwield_missing;
|
|
}
|
|
|
|
if (alt_wep != "none")
|
|
{
|
|
clip_alt_missing = weaponClipSize(alt_wep) - self.tombstone_savedweapon_weaponsammo_clip_alt[i];
|
|
|
|
if (clip_alt_missing > self.tombstone_savedweapon_weaponsammo_stock_alt[i])
|
|
{
|
|
clip_alt_missing = self.tombstone_savedweapon_weaponsammo_stock_alt[i];
|
|
}
|
|
|
|
self.tombstone_savedweapon_weaponsammo_clip_alt[i] += clip_alt_missing;
|
|
self.tombstone_savedweapon_weaponsammo_stock_alt[i] -= clip_alt_missing;
|
|
}
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_grenades))
|
|
{
|
|
self.tombstone_savedweapon_grenades_clip = self getweaponammoclip(self.tombstone_savedweapon_grenades);
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_tactical))
|
|
{
|
|
self.tombstone_savedweapon_tactical_clip = self getweaponammoclip(self.tombstone_savedweapon_tactical);
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_mine))
|
|
{
|
|
self.tombstone_savedweapon_mine_clip = self getweaponammoclip(self.tombstone_savedweapon_mine);
|
|
}
|
|
|
|
if (isDefined(self.hasriotshield) && self.hasriotshield)
|
|
{
|
|
self.tombstone_hasriotshield = 1;
|
|
}
|
|
}
|
|
|
|
tombstone_save_perks(ent)
|
|
{
|
|
perk_array = [];
|
|
|
|
if (ent hasperk("specialty_armorvest"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_armorvest";
|
|
}
|
|
|
|
if (ent hasperk("specialty_deadshot"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_deadshot";
|
|
}
|
|
|
|
if (ent hasperk("specialty_fastreload"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_fastreload";
|
|
}
|
|
|
|
if (ent hasperk("specialty_flakjacket"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_flakjacket";
|
|
}
|
|
|
|
if (ent hasperk("specialty_movefaster"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_movefaster";
|
|
}
|
|
|
|
if (ent hasperk("specialty_quickrevive"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_quickrevive";
|
|
}
|
|
|
|
if (ent hasperk("specialty_rof"))
|
|
{
|
|
perk_array[perk_array.size] = "specialty_rof";
|
|
}
|
|
|
|
return perk_array;
|
|
}
|
|
|
|
tombstone_give()
|
|
{
|
|
if (!isDefined(self.tombstone_savedweapon_weapons))
|
|
{
|
|
return;
|
|
}
|
|
|
|
primary_weapons = self getWeaponsListPrimaries();
|
|
|
|
foreach (weapon in primary_weapons)
|
|
{
|
|
self takeWeapon(weapon);
|
|
}
|
|
|
|
self takeWeapon(self get_player_melee_weapon());
|
|
self takeWeapon(self get_player_lethal_grenade());
|
|
self takeWeapon(self get_player_tactical_grenade());
|
|
self takeWeapon(self get_player_placeable_mine());
|
|
|
|
primary_weapons_returned = 0;
|
|
i = 0;
|
|
|
|
while (i < self.tombstone_savedweapon_weapons.size)
|
|
{
|
|
if (isdefined(self.tombstone_savedweapon_grenades) && self.tombstone_savedweapon_weapons[i] == self.tombstone_savedweapon_grenades || (isdefined(self.tombstone_savedweapon_tactical) && self.tombstone_savedweapon_weapons[i] == self.tombstone_savedweapon_tactical))
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
if (isweaponprimary(self.tombstone_savedweapon_weapons[i]))
|
|
{
|
|
if (primary_weapons_returned >= 2)
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
primary_weapons_returned++;
|
|
}
|
|
|
|
if (level.item_meat_name == self.tombstone_savedweapon_weapons[i])
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
self giveweapon(self.tombstone_savedweapon_weapons[i], 0, self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options(self.tombstone_savedweapon_weapons[i]));
|
|
|
|
if (isdefined(self.tombstone_savedweapon_weaponsammo_clip[i]))
|
|
{
|
|
self setweaponammoclip(self.tombstone_savedweapon_weapons[i], self.tombstone_savedweapon_weaponsammo_clip[i]);
|
|
}
|
|
|
|
if (isdefined(self.tombstone_savedweapon_weaponsammo_clip_dualwield[i]))
|
|
{
|
|
self setweaponammoclip(weaponDualWieldWeaponName(self.tombstone_savedweapon_weapons[i]), self.tombstone_savedweapon_weaponsammo_clip_dualwield[i]);
|
|
}
|
|
|
|
if (isdefined(self.tombstone_savedweapon_weaponsammo_stock[i]))
|
|
{
|
|
self setweaponammostock(self.tombstone_savedweapon_weapons[i], self.tombstone_savedweapon_weaponsammo_stock[i]);
|
|
}
|
|
|
|
if (isdefined(self.tombstone_savedweapon_weaponsammo_clip_alt[i]))
|
|
{
|
|
self setweaponammoclip(weaponAltWeaponName(self.tombstone_savedweapon_weapons[i]), self.tombstone_savedweapon_weaponsammo_clip_alt[i]);
|
|
}
|
|
|
|
if (isdefined(self.tombstone_savedweapon_weaponsammo_stock_alt[i]))
|
|
{
|
|
self setweaponammostock(weaponAltWeaponName(self.tombstone_savedweapon_weapons[i]), self.tombstone_savedweapon_weaponsammo_stock_alt[i]);
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_melee))
|
|
{
|
|
self set_player_melee_weapon(self.tombstone_savedweapon_melee);
|
|
self setactionslot(2, "weapon", "held_" + self.tombstone_savedweapon_melee);
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_grenades))
|
|
{
|
|
self giveweapon(self.tombstone_savedweapon_grenades);
|
|
self set_player_lethal_grenade(self.tombstone_savedweapon_grenades);
|
|
|
|
if (isDefined(self.tombstone_savedweapon_grenades_clip))
|
|
{
|
|
self setweaponammoclip(self.tombstone_savedweapon_grenades, self.tombstone_savedweapon_grenades_clip);
|
|
}
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_tactical))
|
|
{
|
|
self giveweapon(self.tombstone_savedweapon_tactical);
|
|
self set_player_tactical_grenade(self.tombstone_savedweapon_tactical);
|
|
|
|
if (isDefined(self.tombstone_savedweapon_tactical_clip))
|
|
{
|
|
self setweaponammoclip(self.tombstone_savedweapon_tactical, self.tombstone_savedweapon_tactical_clip);
|
|
}
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_mine))
|
|
{
|
|
self giveweapon(self.tombstone_savedweapon_mine);
|
|
self set_player_placeable_mine(self.tombstone_savedweapon_mine);
|
|
self setactionslot(4, "weapon", self.tombstone_savedweapon_mine);
|
|
self setweaponammoclip(self.tombstone_savedweapon_mine, self.tombstone_savedweapon_mine_clip);
|
|
}
|
|
|
|
if (isDefined(self.current_equipment))
|
|
{
|
|
self maps\mp\zombies\_zm_equipment::equipment_take(self.current_equipment);
|
|
}
|
|
|
|
if (isDefined(self.tombstone_savedweapon_equipment))
|
|
{
|
|
self.do_not_display_equipment_pickup_hint = 1;
|
|
self maps\mp\zombies\_zm_equipment::equipment_give(self.tombstone_savedweapon_equipment);
|
|
self.do_not_display_equipment_pickup_hint = undefined;
|
|
}
|
|
|
|
if (isDefined(self.tombstone_hasriotshield) && self.tombstone_hasriotshield)
|
|
{
|
|
if (isDefined(self.player_shield_reset_health))
|
|
{
|
|
self [[self.player_shield_reset_health]]();
|
|
}
|
|
}
|
|
|
|
current_wep = self getCurrentWeapon();
|
|
|
|
if (!isSubStr(current_wep, "perk_bottle") && !isSubStr(current_wep, "knuckle_crack") && !isSubStr(current_wep, "flourish") && !isSubStr(current_wep, level.item_meat_name))
|
|
{
|
|
switched = 0;
|
|
primaries = self getweaponslistprimaries();
|
|
|
|
foreach (weapon in primaries)
|
|
{
|
|
if (isDefined(self.tombstone_savedweapon_currentweapon) && self.tombstone_savedweapon_currentweapon == weapon)
|
|
{
|
|
switched = 1;
|
|
self switchtoweapon(weapon);
|
|
}
|
|
}
|
|
|
|
if (!switched)
|
|
{
|
|
if (primaries.size > 0)
|
|
{
|
|
self switchtoweapon(primaries[0]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isDefined(self.tombstone_perks) && self.tombstone_perks.size > 0)
|
|
{
|
|
i = 0;
|
|
|
|
while (i < self.tombstone_perks.size)
|
|
{
|
|
if (self hasperk(self.tombstone_perks[i]))
|
|
{
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
self maps\mp\zombies\_zm_perks::give_perk(self.tombstone_perks[i]);
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
additionalprimaryweapon_indicator()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
self setClientDvar("additionalPrimaryWeaponName", "");
|
|
|
|
if (!is_true(level.zombiemode_using_additionalprimaryweapon_perk))
|
|
{
|
|
return;
|
|
}
|
|
|
|
vars = [];
|
|
vars["prev_weapon_name"] = "";
|
|
|
|
while (1)
|
|
{
|
|
wait 0.05;
|
|
|
|
if (self.sessionstate == "spectator")
|
|
{
|
|
if (vars["prev_weapon_name"] != "")
|
|
{
|
|
self setClientDvar("additionalPrimaryWeaponName", "");
|
|
vars["prev_weapon_name"] = "";
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
self additionalprimaryweapon_update_weapon_slots();
|
|
|
|
if (!self hasPerk("specialty_additionalprimaryweapon"))
|
|
{
|
|
if (vars["prev_weapon_name"] != "")
|
|
{
|
|
self setClientDvar("additionalPrimaryWeaponName", "");
|
|
vars["prev_weapon_name"] = "";
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
vars["weapon"] = self.weapon_to_take_by_losing_specialty_additionalprimaryweapon;
|
|
|
|
if (!isDefined(vars["weapon"]))
|
|
{
|
|
if (vars["prev_weapon_name"] != "")
|
|
{
|
|
self setClientDvar("additionalPrimaryWeaponName", "");
|
|
vars["prev_weapon_name"] = "";
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
vars["weapon_name"] = getweapondisplayname(vars["weapon"]);
|
|
|
|
if (vars["prev_weapon_name"] != vars["weapon_name"])
|
|
{
|
|
self setClientDvar("additionalPrimaryWeaponName", vars["weapon_name"]);
|
|
vars["prev_weapon_name"] = vars["weapon_name"];
|
|
}
|
|
}
|
|
}
|
|
|
|
additionalprimaryweapon_update_weapon_slots()
|
|
{
|
|
if (!isDefined(self.weapon_slots))
|
|
{
|
|
self.weapon_slots = [];
|
|
}
|
|
|
|
vars = [];
|
|
vars["primaries_that_can_be_taken"] = [];
|
|
vars["primaries"] = self getweaponslistprimaries();
|
|
|
|
for (i = 0; i < vars["primaries"].size; i++)
|
|
{
|
|
if (maps\mp\zombies\_zm_weapons::is_weapon_included(vars["primaries"][i]) || maps\mp\zombies\_zm_weapons::is_weapon_upgraded(vars["primaries"][i]))
|
|
{
|
|
vars["primaries_that_can_be_taken"][vars["primaries_that_can_be_taken"].size] = vars["primaries"][i];
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self.weapon_slots.size; i++)
|
|
{
|
|
if (!self hasWeapon(self.weapon_slots[i]))
|
|
{
|
|
self.weapon_slots[i] = "none";
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < vars["primaries_that_can_be_taken"].size; i++)
|
|
{
|
|
vars["weapon"] = vars["primaries_that_can_be_taken"][i];
|
|
|
|
if (!isInArray(self.weapon_slots, vars["weapon"]))
|
|
{
|
|
vars["added"] = 0;
|
|
|
|
for (j = 0; j < self.weapon_slots.size; j++)
|
|
{
|
|
if (self.weapon_slots[j] == "none")
|
|
{
|
|
vars["added"] = 1;
|
|
self.weapon_slots[j] = vars["weapon"];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!vars["added"])
|
|
{
|
|
self.weapon_slots[self.weapon_slots.size] = vars["weapon"];
|
|
}
|
|
}
|
|
}
|
|
|
|
vars["num_weapons"] = 0;
|
|
|
|
for (i = 0; i < self.weapon_slots.size; i++)
|
|
{
|
|
if (self.weapon_slots[i] != "none")
|
|
{
|
|
vars["num_weapons"]++;
|
|
}
|
|
}
|
|
|
|
if (vars["num_weapons"] >= 3)
|
|
{
|
|
self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = self.weapon_slots[self.weapon_slots.size - 1];
|
|
}
|
|
else
|
|
{
|
|
self.weapon_to_take_by_losing_specialty_additionalprimaryweapon = undefined;
|
|
}
|
|
}
|
|
|
|
additionalprimaryweapon_stowed_weapon_refill()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
vars = [];
|
|
|
|
while (1)
|
|
{
|
|
vars["string"] = self waittill_any_return("weapon_change", "weapon_change_complete", "perk_additionalprimaryweapon_activated", "specialty_additionalprimaryweapon_stop", "spawned_player");
|
|
|
|
if (self hasPerk("specialty_additionalprimaryweapon"))
|
|
{
|
|
vars["curr_wep"] = self getCurrentWeapon();
|
|
|
|
if (vars["curr_wep"] == "none")
|
|
{
|
|
continue;
|
|
}
|
|
|
|
primaries = self getWeaponsListPrimaries();
|
|
|
|
foreach (primary in primaries)
|
|
{
|
|
if (primary != maps\mp\zombies\_zm_weapons::get_nonalternate_weapon(vars["curr_wep"]))
|
|
{
|
|
if (vars["string"] != "weapon_change")
|
|
{
|
|
self thread refill_after_time(primary);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self notify(primary + "_reload_stop");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
refill_after_time(primary)
|
|
{
|
|
self endon(primary + "_reload_stop");
|
|
self endon("specialty_additionalprimaryweapon_stop");
|
|
self endon("spawned_player");
|
|
|
|
vars = [];
|
|
|
|
vars["reload_time"] = weaponReloadTime(primary);
|
|
vars["reload_amount"] = undefined;
|
|
|
|
if (primary == "m32_zm" || primary == "python_zm" || maps\mp\zombies\_zm_weapons::get_base_weapon_name(primary, 1) == "judge_zm" || maps\mp\zombies\_zm_weapons::get_base_weapon_name(primary, 1) == "870mcs_zm" || maps\mp\zombies\_zm_weapons::get_base_weapon_name(primary, 1) == "ksg_zm")
|
|
{
|
|
vars["reload_amount"] = 1;
|
|
|
|
if (maps\mp\zombies\_zm_weapons::get_base_weapon_name(primary, 1) == "ksg_zm" && maps\mp\zombies\_zm_weapons::is_weapon_upgraded(primary))
|
|
{
|
|
vars["reload_amount"] = 2;
|
|
}
|
|
}
|
|
|
|
if (!isDefined(vars["reload_amount"]) && vars["reload_time"] < 1)
|
|
{
|
|
vars["reload_time"] = 1;
|
|
}
|
|
|
|
if (self hasPerk("specialty_fastreload"))
|
|
{
|
|
vars["reload_time"] *= getDvarFloat("perk_weapReloadMultiplier");
|
|
}
|
|
|
|
wait vars["reload_time"];
|
|
|
|
vars["ammo_clip"] = self getWeaponAmmoClip(primary);
|
|
vars["ammo_stock"] = self getWeaponAmmoStock(primary);
|
|
vars["missing_clip"] = weaponClipSize(primary) - vars["ammo_clip"];
|
|
vars["og_ammo_stock"] = vars["ammo_stock"];
|
|
|
|
if (vars["missing_clip"] > vars["ammo_stock"])
|
|
{
|
|
vars["missing_clip"] = vars["ammo_stock"];
|
|
}
|
|
|
|
if (isDefined(vars["reload_amount"]) && vars["missing_clip"] > vars["reload_amount"])
|
|
{
|
|
vars["missing_clip"] = vars["reload_amount"];
|
|
}
|
|
|
|
vars["dw_primary"] = weaponDualWieldWeaponName(primary);
|
|
vars["alt_primary"] = weaponAltWeaponName(primary);
|
|
|
|
vars["ammo_stock"] -= vars["missing_clip"];
|
|
|
|
if (vars["dw_primary"] != "none")
|
|
{
|
|
vars["dw_ammo_clip"] = self getWeaponAmmoClip(vars["dw_primary"]);
|
|
vars["dw_missing_clip"] = weaponClipSize(vars["dw_primary"]) - vars["dw_ammo_clip"];
|
|
|
|
if (vars["dw_missing_clip"] > vars["ammo_stock"])
|
|
{
|
|
vars["dw_missing_clip"] = vars["ammo_stock"];
|
|
}
|
|
|
|
vars["ammo_stock"] -= vars["dw_missing_clip"];
|
|
}
|
|
|
|
if (vars["ammo_stock"] != vars["og_ammo_stock"])
|
|
{
|
|
// setWeaponAmmoClip changes dual wield weapon clip ammo of current weapon when called on any dual wield weapon
|
|
vars["curr_primary"] = self getCurrentWeapon();
|
|
vars["curr_dw_primary"] = weaponDualWieldWeaponName(vars["curr_primary"]);
|
|
vars["curr_dw_ammo_clip"] = 0;
|
|
|
|
// save current dual wield weapon clip ammo
|
|
if (vars["dw_primary"] != "none" && vars["curr_dw_primary"] != "none")
|
|
{
|
|
vars["curr_dw_ammo_clip"] = self getWeaponAmmoClip(vars["curr_dw_primary"]);
|
|
}
|
|
|
|
// setWeaponAmmoClip changes both clips ammo on dual wield weapons so must calculate both left and right ammo before setting ammo
|
|
self setWeaponAmmoClip(primary, vars["ammo_clip"] + vars["missing_clip"]);
|
|
|
|
if (vars["dw_primary"] != "none")
|
|
{
|
|
self set_weapon_ammo_clip_left(primary, vars["dw_ammo_clip"] + vars["dw_missing_clip"]);
|
|
}
|
|
|
|
self setWeaponAmmoStock(primary, vars["ammo_stock"]);
|
|
|
|
// restore current dual wield weapon clip ammo
|
|
if (vars["dw_primary"] != "none" && vars["curr_dw_primary"] != "none")
|
|
{
|
|
self set_weapon_ammo_clip_left(vars["curr_primary"], vars["curr_dw_ammo_clip"]);
|
|
}
|
|
}
|
|
|
|
if (vars["alt_primary"] != "none")
|
|
{
|
|
vars["ammo_clip"] = self getWeaponAmmoClip(vars["alt_primary"]);
|
|
vars["ammo_stock"] = self getWeaponAmmoStock(vars["alt_primary"]);
|
|
vars["missing_clip"] = weaponClipSize(vars["alt_primary"]) - vars["ammo_clip"];
|
|
|
|
if (vars["missing_clip"] > vars["ammo_stock"])
|
|
{
|
|
vars["missing_clip"] = vars["ammo_stock"];
|
|
}
|
|
|
|
self setWeaponAmmoClip(vars["alt_primary"], vars["ammo_clip"] + vars["missing_clip"]);
|
|
self setWeaponAmmoStock(vars["alt_primary"], vars["ammo_stock"] - vars["missing_clip"]);
|
|
}
|
|
|
|
if (isDefined(vars["reload_amount"]) && self getWeaponAmmoStock(primary) > 0 && self getWeaponAmmoClip(primary) < weaponClipSize(primary))
|
|
{
|
|
self refill_after_time(primary);
|
|
}
|
|
}
|
|
|
|
electric_cherry_unlimited()
|
|
{
|
|
self endon("disconnect");
|
|
|
|
for (;;)
|
|
{
|
|
self.consecutive_electric_cherry_attacks = 0;
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
show_powerswitch()
|
|
{
|
|
getent("powerswitch_p6_zm_buildable_pswitch_hand", "targetname") show();
|
|
getent("powerswitch_p6_zm_buildable_pswitch_body", "targetname") show();
|
|
getent("powerswitch_p6_zm_buildable_pswitch_lever", "targetname") show();
|
|
}
|
|
|
|
zone_changes()
|
|
{
|
|
if (level.script == "zm_transit")
|
|
{
|
|
if (level.scr_zm_map_start_location == "farm")
|
|
{
|
|
// Barn to Farm
|
|
flag_set("OnFarm_enter");
|
|
}
|
|
}
|
|
else if (level.script == "zm_highrise")
|
|
{
|
|
// Green Highrise to Lower Blue Highrise
|
|
level.zones["zone_green_level3b"].adjacent_zones["zone_blue_level1c"] structdelete();
|
|
level.zones["zone_green_level3b"].adjacent_zones["zone_blue_level1c"] = undefined;
|
|
|
|
// Lower Orange Highrise debris
|
|
level.zones["zone_orange_level3a"].adjacent_zones["zone_orange_level3b"].is_connected = 0;
|
|
level.zones["zone_orange_level3b"].adjacent_zones["zone_orange_level3a"].is_connected = 0;
|
|
}
|
|
}
|
|
|
|
should_respawn()
|
|
{
|
|
if (is_true(level.intermission))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (!flag("initial_blackscreen_passed"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (isDefined(level.is_respawn_gamemode_func) && [[level.is_respawn_gamemode_func]]())
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
is_tazer_weapon(weapon)
|
|
{
|
|
return issubstr(weapon, "tazer_knuckles") || issubstr(weapon, "knife_ballistic_no_melee");
|
|
}
|
|
|
|
get_current_spectating_player()
|
|
{
|
|
if (self.currentspectatingclient == -1)
|
|
{
|
|
return self;
|
|
}
|
|
|
|
players = get_players();
|
|
|
|
foreach (player in players)
|
|
{
|
|
if (self.currentspectatingclient == player getentitynumber())
|
|
{
|
|
return player;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
setclientdvarall(dvar, value)
|
|
{
|
|
players = get_players();
|
|
|
|
foreach (player in players)
|
|
{
|
|
player setclientdvar(dvar, value);
|
|
}
|
|
}
|
|
|
|
remove_status_icons_on_intermission()
|
|
{
|
|
level waittill("intermission");
|
|
|
|
players = get_players();
|
|
|
|
foreach (player in players)
|
|
{
|
|
player.statusicon = "";
|
|
}
|
|
}
|
|
|
|
destroy_on_end_game()
|
|
{
|
|
self endon("death");
|
|
|
|
level waittill("end_game");
|
|
|
|
if (isDefined(self.bar))
|
|
{
|
|
self.bar destroy();
|
|
}
|
|
|
|
if (isDefined(self.barframe))
|
|
{
|
|
self.barframe destroy();
|
|
}
|
|
|
|
self destroy();
|
|
}
|
|
|
|
destroy_on_intermission()
|
|
{
|
|
self endon("death");
|
|
|
|
level waittill("intermission");
|
|
|
|
if (isDefined(self.bar))
|
|
{
|
|
self.bar destroy();
|
|
}
|
|
|
|
if (isDefined(self.barframe))
|
|
{
|
|
self.barframe destroy();
|
|
}
|
|
|
|
self destroy();
|
|
} |