From 9763aea12721621d2a2d41d2de7ff9e7a431c0e5 Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Sat, 25 Jul 2020 02:29:30 -0700 Subject: [PATCH] uploading 17 zm_highrise_patch/mp scripts as a baseline --- zm_highrise_patch/maps/mp/_sticky_grenade.gsc | 12 + zm_highrise_patch/maps/mp/zm_highrise.gsc | 1803 +++++++++++++++++ .../maps/mp/zm_highrise_achievement.gsc | 193 ++ zm_highrise_patch/maps/mp/zm_highrise_amb.gsc | 75 + .../maps/mp/zm_highrise_buildables.gsc | 353 ++++ .../maps/mp/zm_highrise_classic.gsc | 1171 +++++++++++ .../maps/mp/zm_highrise_distance_tracking.gsc | 415 ++++ .../maps/mp/zm_highrise_elevators.gsc | 1438 +++++++++++++ .../maps/mp/zm_highrise_ffotd.gsc | 195 ++ zm_highrise_patch/maps/mp/zm_highrise_fx.gsc | 114 ++ .../maps/mp/zm_highrise_gamemodes.gsc | 13 + zm_highrise_patch/maps/mp/zm_highrise_sq.gsc | 1157 +++++++++++ .../maps/mp/zm_highrise_sq_atd.gsc | 247 +++ .../maps/mp/zm_highrise_sq_pts.gsc | 570 ++++++ .../maps/mp/zm_highrise_sq_slb.gsc | 199 ++ .../maps/mp/zm_highrise_sq_ssp.gsc | 328 +++ .../maps/mp/zm_highrise_utility.gsc | 280 +++ 17 files changed, 8563 insertions(+) create mode 100644 zm_highrise_patch/maps/mp/_sticky_grenade.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_achievement.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_amb.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_buildables.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_classic.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_distance_tracking.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_elevators.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_ffotd.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_fx.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_gamemodes.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_sq.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_sq_atd.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_sq_pts.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_sq_slb.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_sq_ssp.gsc create mode 100644 zm_highrise_patch/maps/mp/zm_highrise_utility.gsc diff --git a/zm_highrise_patch/maps/mp/_sticky_grenade.gsc b/zm_highrise_patch/maps/mp/_sticky_grenade.gsc new file mode 100644 index 0000000..eb8885c --- /dev/null +++ b/zm_highrise_patch/maps/mp/_sticky_grenade.gsc @@ -0,0 +1,12 @@ +#include common_scripts/utility; +#include maps/mp/_utility; + +init() +{ + loadfx( "weapon/crossbow/fx_trail_crossbow_blink_grn_os" ); + loadfx( "weapon/crossbow/fx_trail_crossbow_blink_red_os" ); +} + +watch_bolt_detonation( owner ) +{ +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise.gsc b/zm_highrise_patch/maps/mp/zm_highrise.gsc new file mode 100644 index 0000000..d60ef2d --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise.gsc @@ -0,0 +1,1803 @@ +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_equipment; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_audio; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_devgui; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zm_highrise_distance_tracking; +#include maps/mp/zombies/_zm_zonemgr; +#include maps/mp/zm_highrise; +#include maps/mp/zm_highrise_classic; +#include maps/mp/gametypes_zm/_spawning; +#include maps/mp/zm_highrise_elevators; +#include maps/mp/animscripts/zm_death; +#include maps/mp/zm_highrise_sq; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +gamemode_callback_setup() +{ + maps/mp/zm_highrise_gamemodes::init(); +} + +survival_init() +{ + level.precachecustomcharacters = ::precache_personality_characters; + level.givecustomcharacters = ::give_personality_characters; + level.setupcustomcharacterexerts = ::setup_personality_character_exerts; + level.buildable_build_custom_func = ::buildable_build_custom_func; + level.use_female_animations = 1; + vend_trigs = getentarray( "zombie_vending", "targetname" ); + _a34 = vend_trigs; + _k34 = getFirstArrayKey( _a34 ); + while ( isDefined( _k34 ) ) + { + ent = _a34[ _k34 ]; + if ( isDefined( ent.clip ) ) + { + ent.clip delete(); + } + _k34 = getNextArrayKey( _a34, _k34 ); + } + flag_wait( "start_zombie_round_logic" ); +} + +zclassic_preinit() +{ + registerclientfield( "scriptmover", "clientfield_escape_pod_tell_fx", 5000, 1, "int" ); + registerclientfield( "scriptmover", "clientfield_escape_pod_sparks_fx", 5000, 1, "int" ); + registerclientfield( "scriptmover", "clientfield_escape_pod_impact_fx", 5000, 1, "int" ); + registerclientfield( "scriptmover", "clientfield_escape_pod_light_fx", 5000, 1, "int" ); + registerclientfield( "actor", "clientfield_whos_who_clone_glow_shader", 5000, 1, "int" ); + registerclientfield( "toplayer", "clientfield_whos_who_audio", 5000, 1, "int" ); + registerclientfield( "toplayer", "clientfield_whos_who_filter", 5000, 1, "int" ); + level.whos_who_client_setup = 1; + maps/mp/zm_highrise_sq::sq_highrise_clientfield_init(); + precachemodel( "p6_zm_keycard" ); + precachemodel( "p6_zm_hr_keycard" ); + precachemodel( "fxanim_zom_highrise_trample_gen_mod" ); + survival_init(); +} + +createfx_callback() +{ + ents = getentarray(); + i = 0; + while ( i < ents.size ) + { + if ( ents[ i ].classname != "info_player_start" ) + { + ents[ i ] delete(); + } + i++; + } +} + +main() +{ + maps/mp/zm_highrise_fx::main(); + level thread maps/mp/zm_highrise_ffotd::main_start(); + level thread maps/mp/zm_highrise_utility::main_start(); + level.level_createfx_callback_thread = ::createfx_callback; + if ( !isDefined( level.vsmgr_prio_visionset_zm_whos_who ) ) + { + level.vsmgr_prio_visionset_zm_whos_who = 123; + } + level.default_game_mode = "zclassic"; + level.default_start_location = "rooftop"; + setup_rex_starts(); + maps/mp/zombies/_zm::init_fx(); + maps/mp/animscripts/zm_death::precache_gib_fx(); + level.zombiemode = 1; + level._no_water_risers = 1; + maps/mp/zm_highrise_amb::main(); + level._override_eye_fx = level._effect[ "blue_eyes" ]; + level.level_specific_stats_init = ::init_highrise_stats; + level.hostmigration_link_entity_callback = ::maps/mp/zm_highrise_elevators::get_link_entity_for_host_migration; + level.hostmigration_ai_link_entity_callback = ::maps/mp/zm_highrise_elevators::get_link_entity_for_host_migration; + maps/mp/zombies/_load::main(); + if ( getDvar( "createfx" ) != "" ) + { + return; + } + setdvar( "r_lightGridEnableTweaks", 1 ); + setdvar( "r_lightGridIntensity", 1,25 ); + setdvar( "r_lightGridContrast", -0,25 ); + maps/mp/gametypes_zm/_spawning::level_use_unified_spawning( 1 ); + level.givecustomloadout = ::givecustomloadout; + level.custom_player_fake_death = ::zm_player_fake_death; + level.custom_player_fake_death_cleanup = ::zm_player_fake_death_cleanup; + level.initial_round_wait_func = ::initial_round_wait_func; + level.zombie_init_done = ::zombie_init_done; + level.check_for_valid_spawn_near_team_callback = ::highrise_respawn_override; + level.zombiemode_using_pack_a_punch = 1; + level.zombiemode_reusing_pack_a_punch = 1; + level.pap_interaction_height = 47; + level.zombiemode_using_doubletap_perk = 1; + level.zombiemode_using_juggernaut_perk = 1; + level.zombiemode_using_revive_perk = 1; + level.zombiemode_using_sleightofhand_perk = 1; + level.zombiemode_using_chugabud_perk = 1; + level.zombiemode_using_additionalprimaryweapon_perk = 1; + level._custom_zombie_audio_func = ::custom_zombie_audio_func; + init_persistent_abilities(); + level._zmbvoxlevelspecific = ::init_level_specific_audio; + maps/mp/zm_highrise_classic::init_escape_elevators_animtree(); + maps/mp/zm_highrise_elevators::init_perk_elvators_animtree(); + level.register_offhand_weapons_for_level_defaults_override = ::offhand_weapon_overrride; + level.zombiemode_offhand_weapon_give_override = ::offhand_weapon_give_override; + level._zombie_custom_add_weapons = ::custom_add_weapons; + level._allow_melee_weapon_switching = 1; + level.custom_ai_type = []; + level.custom_ai_type[ level.custom_ai_type.size ] = ::maps/mp/zombies/_zm_ai_leaper::init; + include_weapons(); + include_powerups(); + include_equipment_for_level(); + init_level_specific_wall_buy_fx(); + level.melee_anim_state = ::melee_anim_state; + level.pandora_fx_func = ::zm_highrise_pandora_fx_func; + maps/mp/zm_highrise_elevators::init_elevator_perks(); + level.custom_vending_precaching = ::custom_vending_precaching; + maps/mp/zombies/_zm::init(); + level thread maps/mp/_sticky_grenade::init(); + maps/mp/zombies/_zm_weap_bowie::init(); + maps/mp/zombies/_zm_weap_cymbal_monkey::init(); + maps/mp/zombies/_zm_weap_claymore::init(); + maps/mp/zombies/_zm_weap_ballistic_knife::init(); + maps/mp/zombies/_zm_weap_slipgun::init(); + maps/mp/zombies/_zm_weap_tazer_knuckles::init(); + level maps/mp/zm_highrise_achievement::init(); + precacheitem( "death_throe_zm" ); + if ( level.splitscreen && getDvarInt( "splitscreen_playerCount" ) > 2 ) + { + level.optimise_for_splitscreen = 1; + } + else + { + level.optimise_for_splitscreen = 0; + } + precache_team_whos_who_characters(); + maps/mp/zombies/_zm_ai_leaper::precache(); + level thread maps/mp/zm_highrise_sq::start_highrise_sidequest(); + level.zones = []; + level.zone_manager_init_func = ::highrise_zone_init; + init_zones[ 0 ] = "zone_green_start"; + init_zones[ 1 ] = "zone_orange_level3a"; + init_zones[ 2 ] = "zone_green_level3d"; + init_zones[ 3 ] = "zone_blue_level2a"; + level thread maps/mp/zombies/_zm_zonemgr::manage_zones( init_zones ); + if ( isDefined( level.optimise_for_splitscreen ) && level.optimise_for_splitscreen ) + { + if ( is_classic() ) + { + level.zombie_ai_limit = 20; + } + setdvar( "fx_marks_draw", 0 ); + setdvar( "disable_rope", 1 ); + setdvar( "cg_disableplayernames", 1 ); + setdvar( "disableLookAtEntityLogic", 1 ); + } + else + { + level.zombie_ai_limit = 24; + } + level.speed_change_round = 15; + level.speed_change_max = 5; + level._audio_custom_response_line = ::highrise_audio_custom_response_line; + setup_zone_monitor(); + setup_leapers(); + level thread toggle_leaper_traversals(); + level thread toggle_zombie_traversals(); + level thread toggle_leaper_collision(); + level thread electric_switch(); + level.ignore_equipment = ::ignore_equipment; +/# + execdevgui( "devgui_zombie_highrise" ); + level.custom_devgui = ::zombie_highrise_devgui; + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Lighting:3/Power On:1" "set zombie_devgui_hrpowerlighting on" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Lighting:3/Power Off:2" "set zombie_devgui_hrpowerlighting off" \n" ); + level thread watch_lightpower_devgui(); +#/ + level thread maps/mp/zombies/_zm::post_main(); + level thread maps/mp/zm_highrise_ffotd::main_end(); + level thread maps/mp/zm_highrise_utility::main_end(); + level thread maps/mp/zm_highrise_distance_tracking::zombie_tracking_init(); + trigs = getentarray( "force_from_prone", "targetname" ); + array_thread( trigs, ::player_force_from_prone ); + level._dont_unhide_quickervive_on_hotjoin = 1; +} + +custom_vending_precaching() +{ + if ( isDefined( level.zombiemode_using_pack_a_punch ) && level.zombiemode_using_pack_a_punch ) + { + precacheitem( "zombie_knuckle_crack" ); + precachemodel( "p6_anim_zm_buildable_pap" ); + precachemodel( "p6_anim_zm_buildable_pap_on" ); + precachestring( &"ZOMBIE_PERK_PACKAPUNCH" ); + precachestring( &"ZOMBIE_PERK_PACKAPUNCH_ATT" ); + level._effect[ "packapunch_fx" ] = loadfx( "maps/zombie/fx_zmb_highrise_packapunch" ); + level.machine_assets[ "packapunch" ] = spawnstruct(); + level.machine_assets[ "packapunch" ].weapon = "zombie_knuckle_crack"; + level.machine_assets[ "packapunch" ].off_model = "p6_anim_zm_buildable_pap"; + level.machine_assets[ "packapunch" ].on_model = "p6_anim_zm_buildable_pap_on"; + } + if ( isDefined( level.zombiemode_using_additionalprimaryweapon_perk ) && level.zombiemode_using_additionalprimaryweapon_perk ) + { + precacheitem( "zombie_perk_bottle_additionalprimaryweapon" ); + precacheshader( "specialty_additionalprimaryweapon_zombies" ); + precachemodel( "zombie_vending_three_gun" ); + precachemodel( "zombie_vending_three_gun_on" ); + precachestring( &"ZOMBIE_PERK_ADDITIONALWEAPONPERK" ); + level._effect[ "additionalprimaryweapon_light" ] = loadfx( "misc/fx_zombie_cola_arsenal_on" ); + level.machine_assets[ "additionalprimaryweapon" ] = spawnstruct(); + level.machine_assets[ "additionalprimaryweapon" ].weapon = "zombie_perk_bottle_additionalprimaryweapon"; + level.machine_assets[ "additionalprimaryweapon" ].off_model = "zombie_vending_three_gun"; + level.machine_assets[ "additionalprimaryweapon" ].on_model = "zombie_vending_three_gun_on"; + } + if ( isDefined( level.zombiemode_using_deadshot_perk ) && level.zombiemode_using_deadshot_perk ) + { + precacheitem( "zombie_perk_bottle_deadshot" ); + precacheshader( "specialty_ads_zombies" ); + precachemodel( "zombie_vending_ads" ); + precachemodel( "zombie_vending_ads_on" ); + precachestring( &"ZOMBIE_PERK_DEADSHOT" ); + level._effect[ "deadshot_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level.machine_assets[ "deadshot" ] = spawnstruct(); + level.machine_assets[ "deadshot" ].weapon = "zombie_perk_bottle_deadshot"; + level.machine_assets[ "deadshot" ].off_model = "zombie_vending_ads"; + level.machine_assets[ "deadshot" ].on_model = "zombie_vending_ads_on"; + } + if ( isDefined( level.zombiemode_using_divetonuke_perk ) && level.zombiemode_using_divetonuke_perk ) + { + precacheitem( "zombie_perk_bottle_nuke" ); + precacheshader( "specialty_divetonuke_zombies" ); + precachemodel( "zombie_vending_nuke" ); + precachemodel( "zombie_vending_nuke_on" ); + precachestring( &"ZOMBIE_PERK_DIVETONUKE" ); + level._effect[ "divetonuke_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level.machine_assets[ "divetonuke" ] = spawnstruct(); + level.machine_assets[ "divetonuke" ].weapon = "zombie_perk_bottle_nuke"; + level.machine_assets[ "divetonuke" ].off_model = "zombie_vending_nuke"; + level.machine_assets[ "divetonuke" ].on_model = "zombie_vending_nuke_on"; + } + if ( isDefined( level.zombiemode_using_doubletap_perk ) && level.zombiemode_using_doubletap_perk ) + { + precacheitem( "zombie_perk_bottle_doubletap" ); + precacheshader( "specialty_doubletap_zombies" ); + precachemodel( "zombie_vending_doubletap2" ); + precachemodel( "zombie_vending_doubletap2_on" ); + precachestring( &"ZOMBIE_PERK_DOUBLETAP" ); + level._effect[ "doubletap_light" ] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level.machine_assets[ "doubletap" ] = spawnstruct(); + level.machine_assets[ "doubletap" ].weapon = "zombie_perk_bottle_doubletap"; + level.machine_assets[ "doubletap" ].off_model = "zombie_vending_doubletap2"; + level.machine_assets[ "doubletap" ].on_model = "zombie_vending_doubletap2_on"; + } + if ( isDefined( level.zombiemode_using_juggernaut_perk ) && level.zombiemode_using_juggernaut_perk ) + { + precacheitem( "zombie_perk_bottle_jugg" ); + precacheshader( "specialty_juggernaut_zombies" ); + precachemodel( "zombie_vending_jugg" ); + precachemodel( "zombie_vending_jugg_on" ); + precachestring( &"ZOMBIE_PERK_JUGGERNAUT" ); + level._effect[ "jugger_light" ] = loadfx( "misc/fx_zombie_cola_jugg_on" ); + level.machine_assets[ "juggernog" ] = spawnstruct(); + level.machine_assets[ "juggernog" ].weapon = "zombie_perk_bottle_jugg"; + level.machine_assets[ "juggernog" ].off_model = "zombie_vending_jugg"; + level.machine_assets[ "juggernog" ].on_model = "zombie_vending_jugg_on"; + } + if ( isDefined( level.zombiemode_using_marathon_perk ) && level.zombiemode_using_marathon_perk ) + { + precacheitem( "zombie_perk_bottle_marathon" ); + precacheshader( "specialty_marathon_zombies" ); + precachemodel( "zombie_vending_marathon" ); + precachemodel( "zombie_vending_marathon_on" ); + precachestring( &"ZOMBIE_PERK_MARATHON" ); + level._effect[ "marathon_light" ] = loadfx( "maps/zombie/fx_zmb_cola_staminup_on" ); + level.machine_assets[ "marathon" ] = spawnstruct(); + level.machine_assets[ "marathon" ].weapon = "zombie_perk_bottle_marathon"; + level.machine_assets[ "marathon" ].off_model = "zombie_vending_marathon"; + level.machine_assets[ "marathon" ].on_model = "zombie_vending_marathon_on"; + } + if ( isDefined( level.zombiemode_using_revive_perk ) && level.zombiemode_using_revive_perk ) + { + precacheitem( "zombie_perk_bottle_revive" ); + precacheshader( "specialty_quickrevive_zombies" ); + precachemodel( "zombie_vending_revive" ); + precachemodel( "zombie_vending_revive_on" ); + precachestring( &"ZOMBIE_PERK_QUICKREVIVE" ); + level._effect[ "revive_light" ] = loadfx( "misc/fx_zombie_cola_revive_on" ); + level._effect[ "revive_light_flicker" ] = loadfx( "maps/zombie/fx_zmb_cola_revive_flicker" ); + level.machine_assets[ "revive" ] = spawnstruct(); + level.machine_assets[ "revive" ].weapon = "zombie_perk_bottle_revive"; + level.machine_assets[ "revive" ].off_model = "zombie_vending_revive"; + level.machine_assets[ "revive" ].on_model = "zombie_vending_revive_on"; + } + if ( isDefined( level.zombiemode_using_sleightofhand_perk ) && level.zombiemode_using_sleightofhand_perk ) + { + precacheitem( "zombie_perk_bottle_sleight" ); + precacheshader( "specialty_fastreload_zombies" ); + precachemodel( "zombie_vending_sleight" ); + precachemodel( "zombie_vending_sleight_on" ); + precachestring( &"ZOMBIE_PERK_FASTRELOAD" ); + level._effect[ "sleight_light" ] = loadfx( "misc/fx_zombie_cola_on" ); + level.machine_assets[ "speedcola" ] = spawnstruct(); + level.machine_assets[ "speedcola" ].weapon = "zombie_perk_bottle_sleight"; + level.machine_assets[ "speedcola" ].off_model = "zombie_vending_sleight"; + level.machine_assets[ "speedcola" ].on_model = "zombie_vending_sleight_on"; + } + if ( isDefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk ) + { + precacheitem( "zombie_perk_bottle_tombstone" ); + precacheshader( "specialty_tombstone_zombies" ); + precachemodel( "zombie_vending_tombstone" ); + precachemodel( "zombie_vending_tombstone_on" ); + precachemodel( "ch_tombstone1" ); + precachestring( &"ZOMBIE_PERK_TOMBSTONE" ); + level._effect[ "tombstone_light" ] = loadfx( "misc/fx_zombie_cola_on" ); + level.machine_assets[ "tombstone" ] = spawnstruct(); + level.machine_assets[ "tombstone" ].weapon = "zombie_perk_bottle_tombstone"; + level.machine_assets[ "tombstone" ].off_model = "zombie_vending_tombstone"; + level.machine_assets[ "tombstone" ].on_model = "zombie_vending_tombstone_on"; + } + if ( isDefined( level.zombiemode_using_chugabud_perk ) && level.zombiemode_using_chugabud_perk ) + { + precacheitem( "zombie_perk_bottle_whoswho" ); + precacheshader( "specialty_quickrevive_zombies" ); + precachemodel( "p6_zm_vending_chugabud" ); + precachemodel( "p6_zm_vending_chugabud_on" ); + precachemodel( "ch_tombstone1" ); + precachestring( &"ZOMBIE_PERK_TOMBSTONE" ); + level._effect[ "tombstone_light" ] = loadfx( "misc/fx_zombie_cola_on" ); + level.machine_assets[ "whoswho" ] = spawnstruct(); + level.machine_assets[ "whoswho" ].weapon = "zombie_perk_bottle_whoswho"; + level.machine_assets[ "whoswho" ].off_model = "p6_zm_vending_chugabud"; + level.machine_assets[ "whoswho" ].on_model = "p6_zm_vending_chugabud_on"; + } +} + +choose_a_line_to_play() +{ + if ( !isDefined( level.custom_zombie_sounds ) ) + { + level.custom_zombie_sounds = array( "vox_zombie_sidequest_zombie_lies_0", "vox_zombie_sidequest_zombie_lies_1", "vox_zombie_sidequest_zombie_lies_2", "vox_zombie_sidequest_zombie_pain_0", "vox_zombie_sidequest_zombie_pain_1", "vox_zombie_sidequest_zombie_pain_2", "vox_zombie_sidequest_zombie_pain_3", "vox_zombie_sidequest_zombie_pain_4", "vox_zombie_sidequest_zombie_pain_5", "vox_zombie_sidequest_zombie_pain_6", "vox_zombie_sidequest_zombie_plea_0", "vox_zombie_sidequest_zombie_plea_1", "vox_zombie_sidequest_zombie_plea_2", "vox_zombie_sidequest_zombie_plea_3", "vox_zombie_sidequest_zombie_plea_4", "vox_zombie_sidequest_zombie_plea_5" ); + level.custom_zombie_sounds = randomize_array( level.custom_zombie_sounds ); + level.last_custom_sound_played = 0; + level.custom_zombie_sound_play_frequences = array( 5, 10, 20, 30 ); + level.custom_zombie_sound_play_round_numbers = array( 2, 5, 7, 10 ); + level.custom_zombie_sound_played_interval = 6000; + } + else + { + if ( level.last_custom_sound_played >= level.custom_zombie_sounds.size ) + { + level.custom_zombie_sounds = randomize_array( level.custom_zombie_sounds ); + level.last_custom_sound_played = 0; + } + } + sound = level.custom_zombie_sounds[ level.last_custom_sound_played ]; + level.last_custom_sound_played++; + return sound; +} + +get_custom_zombie_sound_play_frequency() +{ + if ( !isDefined( level.custom_zombie_sounds ) ) + { + return 100; + } + if ( isDefined( level.last_custom_zombie_sound_time ) ) + { + if ( getTime() < ( level.last_custom_zombie_sound_time + level.custom_zombie_sound_played_interval ) ) + { + return 0; + } + } + if ( level.round_number >= level.custom_zombie_sound_play_round_numbers[ level.custom_zombie_sound_play_round_numbers.size - 1 ] ) + { + return 40; + } + i = 0; + while ( i < level.custom_zombie_sound_play_round_numbers.size ) + { + if ( level.round_number < level.custom_zombie_sound_play_round_numbers[ i ] ) + { + return level.custom_zombie_sound_play_frequences[ i ]; + } + i++; + } + return 0; +} + +custom_zombie_audio_func( alias, alias_type ) +{ + if ( alias_type != "behind" ) + { + if ( isDefined( level.isstuhlingeringame ) && level.isstuhlingeringame ) + { + if ( randomint( 100 ) > ( 100 - get_custom_zombie_sound_play_frequency() ) ) + { + players = get_players(); + _a551 = players; + _k551 = getFirstArrayKey( _a551 ); + while ( isDefined( _k551 ) ) + { + player = _a551[ _k551 ]; + if ( isDefined( player.characterindex ) && player.characterindex == 1 ) + { + level.last_custom_zombie_sound_time = getTime(); + alias_to_play = choose_a_line_to_play(); + self playsoundtoplayer( alias_to_play, player ); + } + else + { + self playsoundtoplayer( alias, player ); + } + _k551 = getNextArrayKey( _a551, _k551 ); + } + return; + } + } + } + self playsound( alias ); +} + +init_persistent_abilities() +{ + if ( is_classic() ) + { + level.pers_upgrade_boards = 1; + level.pers_upgrade_revive = 1; + level.pers_upgrade_multi_kill_headshots = 1; + level.pers_upgrade_cash_back = 1; + level.pers_upgrade_insta_kill = 1; + level.pers_upgrade_jugg = 1; + level.pers_upgrade_carpenter = 1; + } +} + +watch_lightpower_devgui() +{ +/# + while ( 1 ) + { + powercmd = getDvar( "zombie_devgui_hrpowerlighting" ); + if ( isDefined( powercmd ) && powercmd != "" ) + { + if ( powercmd == "on" ) + { + clientnotify( "pwr" ); + } + else + { + clientnotify( "pwo" ); + } + setdvar( "zombie_devgui_hrpowerlighting", "" ); + } + wait 1; +#/ + } +} + +setup_leapers() +{ + if ( isDefined( getDvarInt( #"60AEA36D" ) ) ) + { + b_disable_leapers = getDvarInt( #"60AEA36D" ); + } + if ( b_disable_leapers ) + { + flag_init( "leaper_round" ); + } + else + { + maps/mp/zombies/_zm_ai_leaper::enable_leaper_rounds(); + } + level.leapers_per_player = 6; +} + +setup_zone_monitor() +{ + level.player_out_of_playable_area_monitor = 1; + str_dvar_zone_monitor = getDvarInt( #"E9322600" ); + if ( isDefined( str_dvar_zone_monitor ) && str_dvar_zone_monitor ) + { + level.player_out_of_playable_area_monitor = 0; + } + str_dvar_zone_test = getDvarInt( #"2313B5C5" ); + if ( isDefined( str_dvar_zone_test ) && str_dvar_zone_test ) + { + level.kill_thread_test_mode = 1; + level.check_kill_thread_every_frame = 1; + } + level.player_out_of_playable_area_monitor_callback = ::zm_highrise_zone_monitor_callback; +} + +zm_highrise_zone_monitor_callback() +{ + b_kill_player = 1; + if ( !self isonground() ) + { + b_kill_player = 0; + } + if ( getnumconnectedplayers() == 1 ) + { + if ( isDefined( self.lives ) && self.lives > 0 ) + { + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + b_kill_player = 0; + } + } + } + if ( b_kill_player ) + { + self thread maps/mp/zm_highrise_classic::insta_kill_player( 0, 0 ); + } + return b_kill_player; +} + +ignore_equipment( zombie ) +{ + if ( isDefined( zombie.completed_emerging_into_playable_area ) && !zombie.completed_emerging_into_playable_area ) + { + return 1; + } + if ( isDefined( zombie.is_avogadro ) && zombie.is_avogadro ) + { + return 1; + } + if ( isDefined( zombie.is_inert ) && zombie.is_inert ) + { + return 1; + } + if ( isDefined( zombie.inert_delay ) ) + { + return 1; + } + if ( isDefined( self.is_armed ) && self.is_armed ) + { + return 1; + } + return 0; +} + +highrise_respawn_override( revivee, return_struct ) +{ + players = get_players(); + spawn_points = maps/mp/gametypes_zm/_zm_gametype::get_player_spawns_for_gametype(); + if ( spawn_points.size == 0 ) + { + return undefined; + } + i = 0; + while ( i < players.size ) + { + while ( is_player_valid( players[ i ], undefined, 1 ) && players[ i ] != self ) + { + j = 0; + while ( j < spawn_points.size ) + { + while ( isDefined( spawn_points[ j ].script_noteworthy ) ) + { + zone = level.zones[ spawn_points[ j ].script_noteworthy ]; + k = 0; + while ( k < zone.volumes.size ) + { + if ( players[ i ] istouching( zone.volumes[ k ] ) ) + { + closest_group = j; + spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isDefined( spawn_location ) ) + { + return spawn_location; + } + } + k++; + } + } + j++; + } + } + i++; + } +} + +givecustomloadout( takeallweapons, alreadyspawned ) +{ + self giveweapon( "knife_zm" ); + self give_start_weapon( 1 ); +} + +precache_team_whos_who_characters() +{ + precachemodel( "c_zom_player_engineer_dlc1_fb" ); + precachemodel( "c_zom_player_farmgirl_dlc1_fb" ); + precachemodel( "c_zom_player_oldman_dlc1_fb" ); + precachemodel( "c_zom_player_reporter_dlc1_fb" ); +} + +initcharacterstartindex() +{ + level.characterstartindex = randomint( 4 ); +} + +zm_player_fake_death_cleanup() +{ + if ( isDefined( self._fall_down_anchor ) ) + { + self._fall_down_anchor delete(); + self._fall_down_anchor = undefined; + } +} + +zm_player_fake_death( vdir, smeansofdeath ) +{ + level notify( "fake_death" ); + self notify( "fake_death" ); + stance = self getstance(); + self.ignoreme = 1; + self enableinvulnerability(); + self takeallweapons(); + if ( isDefined( self.insta_killed ) && !self.insta_killed || self maps/mp/zm_highrise_elevators::is_self_on_elevator() && isDefined( smeansofdeath ) && smeansofdeath == "MOD_FALLING" ) + { + self maps/mp/zombies/_zm::player_fake_death(); + self allowprone( 1 ); + self allowcrouch( 0 ); + self allowstand( 0 ); + wait 0,25; + self freezecontrols( 1 ); + } + else + { + self freezecontrols( 1 ); + self thread fall_down( vdir, stance ); + wait 1; + } +} + +fall_down( vdir, stance ) +{ + self endon( "disconnect" ); + level endon( "game_module_ended" ); + self ghost(); + origin = self.origin; + xyspeed = ( -1, 0, -1 ); + angles = self getplayerangles(); + angles = ( angles[ 0 ], angles[ 1 ], angles[ 2 ] + randomfloatrange( -5, 5 ) ); + if ( isDefined( vdir ) && length( vdir ) > 0 ) + { + xyspeedmag = 40 + randomint( 12 ) + randomint( 12 ); + xyspeed = xyspeedmag * vectornormalize( ( vdir[ 0 ], vdir[ 1 ], 0 ) ); + } + linker = spawn( "script_origin", ( -1, 0, -1 ) ); + linker.origin = origin; + linker.angles = angles; + self._fall_down_anchor = linker; + self playerlinkto( linker ); + self playsoundtoplayer( "zmb_player_death_fall", self ); + falling = stance != "prone"; + if ( falling ) + { + origin = playerphysicstrace( origin, origin + xyspeed ); + eye = self get_eye(); + floor_height = ( 10 + origin[ 2 ] ) - eye[ 2 ]; + origin += ( 0, 0, floor_height ); + lerptime = 0,5; + linker moveto( origin, lerptime, lerptime ); + linker rotateto( angles, lerptime, lerptime ); + } + self freezecontrols( 1 ); + if ( falling ) + { + linker waittill( "movedone" ); + } + self giveweapon( "death_throe_zm" ); + self switchtoweapon( "death_throe_zm" ); + if ( falling ) + { + bounce = randomint( 4 ) + 8; + origin = ( origin + ( 0, 0, bounce ) ) - ( xyspeed * 0,1 ); + lerptime = bounce / 50; + linker moveto( origin, lerptime, 0, lerptime ); + linker waittill( "movedone" ); + origin = ( origin + ( 0, 0, bounce * -1 ) ) + ( xyspeed * 0,1 ); + lerptime /= 2; + linker moveto( origin, lerptime, lerptime ); + linker waittill( "movedone" ); + linker moveto( origin, 5, 0 ); + } + wait 15; + linker delete(); +} + +initial_round_wait_func() +{ + flag_wait( "initial_blackscreen_passed" ); +} + +offhand_weapon_overrride() +{ + register_lethal_grenade_for_level( "frag_grenade_zm" ); + level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; + register_lethal_grenade_for_level( "sticky_grenade_zm" ); + register_tactical_grenade_for_level( "cymbal_monkey_zm" ); + register_tactical_grenade_for_level( "emp_grenade_zm" ); + register_placeable_mine_for_level( "claymore_zm" ); + register_melee_weapon_for_level( "knife_zm" ); + register_melee_weapon_for_level( "bowie_knife_zm" ); + register_melee_weapon_for_level( "tazer_knuckles_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; + register_equipment_for_level( "equip_springpad_zm" ); + level.zombie_equipment_player_init = undefined; + if ( isDefined( level.slipgun_as_equipment ) && level.slipgun_as_equipment ) + { + register_equipment_for_level( "slipgun_zm" ); + } +} + +offhand_weapon_give_override( str_weapon ) +{ + self endon( "death" ); + if ( is_tactical_grenade( str_weapon ) && isDefined( self get_player_tactical_grenade() ) && !self is_player_tactical_grenade( str_weapon ) ) + { + self setweaponammoclip( self get_player_tactical_grenade(), 0 ); + self takeweapon( self get_player_tactical_grenade() ); + } + return 0; +} + +custom_add_weapons() +{ + add_zombie_weapon( "m1911_zm", "m1911_upgraded_zm", &"ZOMBIE_WEAPON_M1911", 50, "", "", undefined ); + add_zombie_weapon( "python_zm", "python_upgraded_zm", &"ZOMBIE_WEAPON_PYTHON", 50, "wpck_python", "", undefined, 1 ); + add_zombie_weapon( "judge_zm", "judge_upgraded_zm", &"ZOMBIE_WEAPON_JUDGE", 50, "wpck_judge", "", undefined, 1 ); + add_zombie_weapon( "kard_zm", "kard_upgraded_zm", &"ZOMBIE_WEAPON_KARD", 50, "wpck_kap", "", undefined, 1 ); + add_zombie_weapon( "fiveseven_zm", "fiveseven_upgraded_zm", &"ZOMBIE_WEAPON_FIVESEVEN", 50, "wpck_57", "", undefined, 1 ); + add_zombie_weapon( "beretta93r_zm", "beretta93r_upgraded_zm", &"ZOMBIE_WEAPON_BERETTA93r", 1000, "", "", undefined ); + add_zombie_weapon( "fivesevendw_zm", "fivesevendw_upgraded_zm", &"ZOMBIE_WEAPON_FIVESEVENDW", 50, "wpck_duel57", "", undefined, 1 ); + add_zombie_weapon( "ak74u_zm", "ak74u_upgraded_zm", &"ZOMBIE_WEAPON_AK74U", 1200, "smg", "", undefined ); + add_zombie_weapon( "mp5k_zm", "mp5k_upgraded_zm", &"ZOMBIE_WEAPON_MP5K", 1000, "smg", "", undefined ); + add_zombie_weapon( "qcw05_zm", "qcw05_upgraded_zm", &"ZOMBIE_WEAPON_QCW05", 50, "wpck_chicom", "", undefined, 1 ); + add_zombie_weapon( "pdw57_zm", "pdw57_upgraded_zm", &"ZOMBIE_WEAPON_PDW57", 1000, "smg", "", undefined ); + add_zombie_weapon( "870mcs_zm", "870mcs_upgraded_zm", &"ZOMBIE_WEAPON_870MCS", 1500, "shotgun", "", undefined ); + add_zombie_weapon( "rottweil72_zm", "rottweil72_upgraded_zm", &"ZOMBIE_WEAPON_ROTTWEIL72", 500, "shotgun", "", undefined ); + add_zombie_weapon( "saiga12_zm", "saiga12_upgraded_zm", &"ZOMBIE_WEAPON_SAIGA12", 50, "wpck_saiga12", "", undefined, 1 ); + add_zombie_weapon( "srm1216_zm", "srm1216_upgraded_zm", &"ZOMBIE_WEAPON_SRM1216", 50, "wpck_m1216", "", undefined, 1 ); + add_zombie_weapon( "m14_zm", "m14_upgraded_zm", &"ZOMBIE_WEAPON_M14", 500, "rifle", "", undefined ); + add_zombie_weapon( "saritch_zm", "saritch_upgraded_zm", &"ZOMBIE_WEAPON_SARITCH", 50, "wpck_sidr", "", undefined, 1 ); + add_zombie_weapon( "m16_zm", "m16_gl_upgraded_zm", &"ZOMBIE_WEAPON_M16", 1200, "burstrifle", "", undefined ); + add_zombie_weapon( "xm8_zm", "xm8_upgraded_zm", &"ZOMBIE_WEAPON_XM8", 50, "wpck_m8a1", "", undefined, 1 ); + add_zombie_weapon( "type95_zm", "type95_upgraded_zm", &"ZOMBIE_WEAPON_TYPE95", 50, "wpck_type25", "", undefined, 1 ); + add_zombie_weapon( "tar21_zm", "tar21_upgraded_zm", &"ZOMBIE_WEAPON_TAR21", 50, "wpck_x95l", "", undefined, 1 ); + add_zombie_weapon( "galil_zm", "galil_upgraded_zm", &"ZOMBIE_WEAPON_GALIL", 50, "wpck_galil", "", undefined, 1 ); + add_zombie_weapon( "fnfal_zm", "fnfal_upgraded_zm", &"ZOMBIE_WEAPON_FNFAL", 50, "wpck_fal", "", undefined, 1 ); + add_zombie_weapon( "dsr50_zm", "dsr50_upgraded_zm", &"ZOMBIE_WEAPON_DR50", 50, "wpck_dsr50", "", undefined, 1 ); + add_zombie_weapon( "barretm82_zm", "barretm82_upgraded_zm", &"ZOMBIE_WEAPON_BARRETM82", 50, "wpck_m82a1", "", undefined, 1 ); + add_zombie_weapon( "svu_zm", "svu_upgraded_zm", &"ZOMBIE_WEAPON_SVU", 1000, "wpck_svuas", "", undefined ); + add_zombie_weapon( "rpd_zm", "rpd_upgraded_zm", &"ZOMBIE_WEAPON_RPD", 50, "wpck_rpd", "", undefined, 1 ); + add_zombie_weapon( "hamr_zm", "hamr_upgraded_zm", &"ZOMBIE_WEAPON_HAMR", 50, "wpck_hamr", "", undefined, 1 ); + add_zombie_weapon( "frag_grenade_zm", undefined, &"ZOMBIE_WEAPON_FRAG_GRENADE", 250, "grenade", "", 250 ); + add_zombie_weapon( "sticky_grenade_zm", undefined, &"ZOMBIE_WEAPON_STICKY_GRENADE", 250, "grenade", "", 250 ); + add_zombie_weapon( "claymore_zm", undefined, &"ZOMBIE_WEAPON_CLAYMORE", 1000, "grenade", "", undefined ); + add_zombie_weapon( "usrpg_zm", "usrpg_upgraded_zm", &"ZOMBIE_WEAPON_USRPG", 50, "wpck_rpg", "", undefined, 1 ); + add_zombie_weapon( "m32_zm", "m32_upgraded_zm", &"ZOMBIE_WEAPON_M32", 50, "wpck_m32", "", undefined, 1 ); + add_zombie_weapon( "an94_zm", "an94_upgraded_zm", &"ZOMBIE_WEAPON_AN94", 1200, "", "", undefined ); + add_zombie_weapon( "cymbal_monkey_zm", undefined, &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "wpck_monkey", "", undefined, 1 ); + add_zombie_weapon( "ray_gun_zm", "ray_gun_upgraded_zm", &"ZOMBIE_WEAPON_RAYGUN", 10000, "wpck_ray", "", undefined, 1 ); + add_zombie_weapon( "knife_ballistic_zm", "knife_ballistic_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "wpck_knife", "", undefined, 1 ); + add_zombie_weapon( "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "sickle", "", undefined, 1 ); + add_zombie_weapon( "knife_ballistic_no_melee_zm", "knife_ballistic_no_melee_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "wpck_knife", "", undefined ); + add_zombie_weapon( "tazer_knuckles_zm", undefined, &"ZOMBIE_WEAPON_TAZER_KNUCKLES", 100, "tazerknuckles", "", undefined ); + add_zombie_weapon( "slipgun_zm", undefined, &"ZOMBIE_WEAPON_SLIPGUN", 10, "slip", "", undefined ); +} + +include_weapons() +{ + include_weapon( "knife_zm", 0 ); + include_weapon( "frag_grenade_zm", 0 ); + include_weapon( "claymore_zm", 0 ); + include_weapon( "sticky_grenade_zm", 0 ); + include_weapon( "m1911_zm", 0 ); + include_weapon( "m1911_upgraded_zm", 0 ); + include_weapon( "python_zm" ); + include_weapon( "python_upgraded_zm", 0 ); + include_weapon( "judge_zm" ); + include_weapon( "judge_upgraded_zm", 0 ); + include_weapon( "kard_zm" ); + include_weapon( "kard_upgraded_zm", 0 ); + include_weapon( "fiveseven_zm" ); + include_weapon( "fiveseven_upgraded_zm", 0 ); + include_weapon( "beretta93r_zm", 0 ); + include_weapon( "beretta93r_upgraded_zm", 0 ); + include_weapon( "fivesevendw_zm" ); + include_weapon( "fivesevendw_upgraded_zm", 0 ); + include_weapon( "ak74u_zm", 0 ); + include_weapon( "ak74u_upgraded_zm", 0 ); + include_weapon( "mp5k_zm", 0 ); + include_weapon( "mp5k_upgraded_zm", 0 ); + include_weapon( "qcw05_zm" ); + include_weapon( "qcw05_upgraded_zm", 0 ); + include_weapon( "870mcs_zm", 0 ); + include_weapon( "870mcs_upgraded_zm", 0 ); + include_weapon( "rottweil72_zm", 0 ); + include_weapon( "rottweil72_upgraded_zm", 0 ); + include_weapon( "saiga12_zm" ); + include_weapon( "saiga12_upgraded_zm", 0 ); + include_weapon( "srm1216_zm" ); + include_weapon( "srm1216_upgraded_zm", 0 ); + include_weapon( "m14_zm", 0 ); + include_weapon( "m14_upgraded_zm", 0 ); + include_weapon( "saritch_zm" ); + include_weapon( "saritch_upgraded_zm", 0 ); + include_weapon( "m16_zm", 0 ); + include_weapon( "m16_gl_upgraded_zm", 0 ); + include_weapon( "xm8_zm" ); + include_weapon( "xm8_upgraded_zm", 0 ); + include_weapon( "type95_zm" ); + include_weapon( "type95_upgraded_zm", 0 ); + include_weapon( "tar21_zm" ); + include_weapon( "tar21_upgraded_zm", 0 ); + include_weapon( "galil_zm" ); + include_weapon( "galil_upgraded_zm", 0 ); + include_weapon( "fnfal_zm" ); + include_weapon( "fnfal_upgraded_zm", 0 ); + include_weapon( "dsr50_zm" ); + include_weapon( "dsr50_upgraded_zm", 0 ); + include_weapon( "barretm82_zm" ); + include_weapon( "barretm82_upgraded_zm", 0 ); + include_weapon( "svu_zm", 0 ); + include_weapon( "svu_upgraded_zm", 0 ); + include_weapon( "rpd_zm" ); + include_weapon( "rpd_upgraded_zm", 0 ); + include_weapon( "hamr_zm" ); + include_weapon( "hamr_upgraded_zm", 0 ); + include_weapon( "pdw57_zm", 0 ); + include_weapon( "pdw57_upgraded_zm", 0 ); + include_weapon( "usrpg_zm" ); + include_weapon( "usrpg_upgraded_zm", 0 ); + include_weapon( "m32_zm" ); + include_weapon( "m32_upgraded_zm", 0 ); + include_weapon( "an94_zm", 0 ); + include_weapon( "cymbal_monkey_zm" ); + include_weapon( "ray_gun_zm" ); + include_weapon( "ray_gun_upgraded_zm", 0 ); + include_weapon( "slipgun_zm", 0 ); + include_weapon( "slipgun_upgraded_zm", 0 ); + include_weapon( "tazer_knuckles_zm", 0 ); + include_weapon( "knife_ballistic_no_melee_zm", 0 ); + include_weapon( "knife_ballistic_no_melee_upgraded_zm", 0 ); + include_weapon( "knife_ballistic_zm" ); + include_weapon( "knife_ballistic_upgraded_zm", 0 ); + include_weapon( "knife_ballistic_bowie_zm", 0 ); + include_weapon( "knife_ballistic_bowie_upgraded_zm", 0 ); + level._uses_retrievable_ballisitic_knives = 1; + add_limited_weapon( "m1911_zm", 0 ); + add_limited_weapon( "knife_ballistic_zm", 1 ); + add_limited_weapon( "slipgun_zm", 1 ); + add_limited_weapon( "slipgun_upgraded_zm", 1 ); + add_limited_weapon( "ray_gun_zm", 4 ); + add_limited_weapon( "ray_gun_upgraded_zm", 4 ); + add_limited_weapon( "knife_ballistic_upgraded_zm", 0 ); + add_limited_weapon( "knife_ballistic_no_melee_zm", 0 ); + add_limited_weapon( "knife_ballistic_no_melee_upgraded_zm", 0 ); + add_limited_weapon( "knife_ballistic_bowie_zm", 0 ); + add_limited_weapon( "knife_ballistic_bowie_upgraded_zm", 0 ); +} + +include_powerups() +{ + include_powerup( "nuke" ); + include_powerup( "insta_kill" ); + include_powerup( "double_points" ); + include_powerup( "full_ammo" ); + include_powerup( "carpenter" ); + include_powerup( "insta_kill_ug" ); + include_powerup( "free_perk" ); +} + +include_equipment_for_level() +{ + include_equipment( "equip_springpad_zm" ); + if ( isDefined( level.slipgun_as_equipment ) && level.slipgun_as_equipment ) + { + include_equipment( "slipgun_zm" ); + } + level.equipment_planted = ::equipment_planted; + level.equipment_safe_to_drop = ::equipment_safe_to_drop; + level.check_force_deploy_z = ::use_safe_spawn_on_elevator; + level.safe_place_for_buildable_piece = ::safe_place_for_buildable_piece; +} + +setup_rex_starts() +{ + add_gametype( "zclassic", ::dummy, "zclassic", ::dummy ); + add_gameloc( "rooftop", ::dummy, "rooftop", ::dummy ); +} + +dummy() +{ +} + +zombie_highrise_devgui( cmd ) +{ +/# + cmd_strings = strtok( cmd, " " ); + switch( cmd_strings[ 0 ] ) + { + case "leaper_round_skip": + if ( isDefined( level.next_leaper_round ) ) + { + maps/mp/zombies/_zm_devgui::zombie_devgui_goto_round( level.next_leaper_round ); + } + break; + case "pick_up_keys": + thread pick_up_keys(); + break; + default: + } +#/ + } +} + +pick_up_keys() +{ +/# + players = get_players(); + _a1220 = players; + _k1220 = getFirstArrayKey( _a1220 ); + while ( isDefined( _k1220 ) ) + { + player = _a1220[ _k1220 ]; + if ( isDefined( player.current_buildable_piece ) && player.current_buildable_piece.buildablename == "keys_zm" ) + { + } + else + { + candidate_list = []; + _a1227 = level.zones; + _k1227 = getFirstArrayKey( _a1227 ); + while ( isDefined( _k1227 ) ) + { + zone = _a1227[ _k1227 ]; + if ( isDefined( zone.unitrigger_stubs ) ) + { + candidate_list = arraycombine( candidate_list, zone.unitrigger_stubs, 1, 0 ); + } + _k1227 = getNextArrayKey( _a1227, _k1227 ); + } + _a1236 = candidate_list; + _k1236 = getFirstArrayKey( _a1236 ); + while ( isDefined( _k1236 ) ) + { + stub = _a1236[ _k1236 ]; + if ( isDefined( stub.piece ) && stub.piece.buildablename == "keys_zm" ) + { + player thread maps/mp/zombies/_zm_buildables::player_take_piece( stub.piece ); + break; + } + else + { + _k1236 = getNextArrayKey( _a1236, _k1236 ); + } + } + } + _k1220 = getNextArrayKey( _a1220, _k1220 ); +#/ + } +} + +highrise_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "zone_green_start", "zone_green_level1", "green_start_door" ); + add_adjacent_zone( "zone_green_start", "zone_green_escape_pod", "always_on" ); + add_adjacent_zone( "zone_green_escape_pod", "zone_green_escape_pod_ground", "always_on", 1 ); + add_adjacent_zone( "zone_blue_level4a", "zone_green_escape_pod_ground", "always_on", 1 ); + add_adjacent_zone( "zone_blue_level5", "zone_green_escape_pod_ground", "always_on", 1 ); + add_adjacent_zone( "zone_green_level1", "zone_green_level2a", "always_on" ); + add_adjacent_zone( "zone_green_level1", "zone_green_level2b", "always_on" ); + add_adjacent_zone( "zone_green_level2a", "zone_green_level2b", "green_level2_door2" ); + add_adjacent_zone( "zone_green_level2a", "zone_green_level3b", "always_on" ); + add_adjacent_zone( "zone_green_level2b", "zone_green_level3a", "always_on" ); + add_adjacent_zone( "zone_green_level3a", "zone_green_level3d", "always_on" ); + add_adjacent_zone( "zone_orange_level1", "zone_green_level3d", "always_on", 1 ); + add_adjacent_zone( "zone_green_level3b", "zone_green_level3c", "green_level3_door2" ); + add_adjacent_zone( "zone_orange_level1", "zone_orange_level2", "always_on" ); + add_adjacent_zone( "zone_orange_elevator_shaft_bottom", "zone_orange_level3a", "always_on" ); + add_adjacent_zone( "zone_orange_level3a", "zone_orange_level3b", "zone_orange_level3a_to_level3b" ); + add_adjacent_zone( "zone_blue_level5", "zone_blue_level4b", "blocker_blue_level_4_to_5" ); + add_adjacent_zone( "zone_blue_level4a", "zone_blue_level4b", "blue_level4_door2" ); + add_adjacent_zone( "zone_blue_level4a", "zone_blue_level4c", "blue_level4_door1" ); + add_adjacent_zone( "zone_blue_level2a", "zone_blue_level2b", "blue_level2_door1" ); + add_adjacent_zone( "zone_blue_level2b", "zone_blue_level1a", "blue_level2_door2" ); + add_adjacent_zone( "zone_blue_level1a", "zone_blue_level1b", "always_on" ); + add_adjacent_zone( "zone_blue_level1a", "zone_blue_level1c", "always_on" ); + add_adjacent_zone( "zone_blue_level2a", "zone_blue_level2c", "blocker_blue_level2a_to_level2c" ); + add_adjacent_zone( "zone_blue_level1b", "zone_blue_level2d", "always_on" ); + add_adjacent_zone( "zone_blue_level2d", "zone_blue_level2c", "blocker_blue_level1b_to_level2c" ); + add_adjacent_zone( "zone_green_level3b", "zone_blue_level1c", "always_on", 1 ); + level thread enable_zone_on_flag( "zone_blue_level4b", "power_on" ); + init_elevator_shaft_zones(); +} + +init_elevator_shaft_zones() +{ + a_zones = array( "zone_orange_elevator_shaft_middle_1", "zone_orange_elevator_shaft_middle_2", "zone_green_level1", "zone_green_level2a", "zone_green_level2b", "zone_green_level3a", "zone_green_level3b", "zone_green_level3c", "zone_blue_level1a", "zone_blue_level1b", "zone_blue_level2b", "zone_blue_level2c", "zone_blue_level4b", "zone_blue_level4c", "zone_blue_level5", "zone_orange_elevator_shaft_top", "zone_blue_level2a", "zone_orange_level3b" ); + _a1341 = a_zones; + _k1341 = getFirstArrayKey( _a1341 ); + while ( isDefined( _k1341 ) ) + { + zone = _a1341[ _k1341 ]; + zone_init( zone ); + enable_zone( zone ); + _k1341 = getNextArrayKey( _a1341, _k1341 ); + } +} + +enable_zone_on_flag( str_zone_name, str_flag_name ) +{ +/# + assert( flag_exists( str_flag_name ), "Tried to enable zone on flag, but flag " + str_flag_name + " hasn't been initialized" ); +#/ +/# + assert( isDefined( level.zones[ str_zone_name ] ), "There is no zone with name '" + str_zone_name + " in the map!" ); +#/ + flag_wait( str_flag_name ); + enable_zone( str_zone_name ); +} + +electric_switch() +{ + trig = getent( "use_elec_switch", "targetname" ); + master_switch = getent( "elec_switch", "targetname" ); + master_switch notsolid(); + trig sethintstring( &"ZOMBIE_ELECTRIC_SWITCH" ); + trig setvisibletoall(); + trig waittill( "trigger", user ); + trig setinvisibletoall(); + master_switch rotateroll( -90, 0,3 ); + master_switch playsound( "zmb_switch_flip" ); + master_switch playsound( "evt_poweron_front" ); + if ( isDefined( user ) ) + { + user thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "power", "power_on" ); + } + level thread maps/mp/zombies/_zm_perks::perk_unpause_all_perks(); + master_switch waittill( "rotatedone" ); + fx_spot = spawnstruct(); + fx_spot.origin = ( 2886, -132, 1296 ); + fx_spot.angles = vectorScale( ( -1, 0, -1 ), 240 ); + playfx( level._effect[ "switch_sparks" ], fx_spot.origin, anglesToForward( fx_spot.angles ) ); + master_switch playsound( "zmb_turn_on" ); + level notify( "electric_door" ); + clientnotify( "power_on" ); + flag_set( "power_on" ); + stop_exploder( 10 ); + exploder( 11 ); +} + +precache_personality_characters() +{ + character/c_highrise_player_farmgirl::precache(); + character/c_highrise_player_oldman::precache(); + character/c_highrise_player_engineer::precache(); + character/c_highrise_player_reporter::precache(); + precachemodel( "c_zom_farmgirl_viewhands" ); + precachemodel( "c_zom_oldman_viewhands" ); + precachemodel( "c_zom_engineer_viewhands" ); + precachemodel( "c_zom_reporter_viewhands" ); +} + +give_personality_characters() +{ + if ( isDefined( level.hotjoin_player_setup ) && [[ level.hotjoin_player_setup ]]( "c_zom_farmgirl_viewhands" ) ) + { + return; + } + self detachall(); + if ( !isDefined( self.characterindex ) ) + { + self.characterindex = assign_lowest_unused_character_index(); + if ( self.characterindex == 1 && !isDefined( level.isstuhlingeringame ) ) + { + level.isstuhlingeringame = 1; + } + } + self.favorite_wall_weapons_list = []; + self.talks_in_danger = 0; +/# + if ( getDvar( #"40772CF1" ) != "" ) + { + self.characterindex = getDvarInt( #"40772CF1" ); +#/ + } + switch( self.characterindex ) + { + case 2: + self character/c_highrise_player_farmgirl::main(); + self setviewmodel( "c_zom_farmgirl_viewhands" ); + level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self ); + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "rottweil72_zm"; + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "870mcs_zm"; + self set_player_is_female( 1 ); + self.whos_who_shader = "c_zom_player_farmgirl_dlc1_fb"; + break; + case 0: + self character/c_highrise_player_oldman::main(); + self setviewmodel( "c_zom_oldman_viewhands" ); + level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self ); + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "frag_grenade_zm"; + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "claymore_zm"; + self set_player_is_female( 0 ); + self.whos_who_shader = "c_zom_player_oldman_dlc1_fb"; + break; + case 3: + self character/c_highrise_player_engineer::main(); + self setviewmodel( "c_zom_engineer_viewhands" ); + level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self ); + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "m14_zm"; + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "m16_zm"; + self set_player_is_female( 0 ); + self.whos_who_shader = "c_zom_player_engineer_dlc1_fb"; + break; + case 1: + self character/c_highrise_player_reporter::main(); + self setviewmodel( "c_zom_reporter_viewhands" ); + level.vox maps/mp/zombies/_zm_audio::zmbvoxinitspeaker( "player", "vox_plr_", self ); + self.talks_in_danger = 1; + level.rich_sq_player = self; + self.favorite_wall_weapons_list[ self.favorite_wall_weapons_list.size ] = "beretta93r_zm"; + self set_player_is_female( 0 ); + self.whos_who_shader = "c_zom_player_reporter_dlc1_fb"; + break; + } + self setmovespeedscale( 1 ); + self setsprintduration( 4 ); + self setsprintcooldown( 0 ); + self thread set_exert_id(); +} + +set_exert_id() +{ + self endon( "disconnect" ); + wait_network_frame(); + wait_network_frame(); + self maps/mp/zombies/_zm_audio::setexertvoice( self.characterindex + 1 ); +} + +assign_lowest_unused_character_index() +{ + charindexarray = []; + charindexarray[ 0 ] = 0; + charindexarray[ 1 ] = 1; + charindexarray[ 2 ] = 2; + charindexarray[ 3 ] = 3; + players = get_players(); + if ( players.size == 1 ) + { + charindexarray = array_randomize( charindexarray ); + return charindexarray[ 0 ]; + } + else + { + if ( players.size == 2 ) + { + _a1558 = players; + _k1558 = getFirstArrayKey( _a1558 ); + while ( isDefined( _k1558 ) ) + { + player = _a1558[ _k1558 ]; + if ( isDefined( player.characterindex ) ) + { + if ( player.characterindex == 2 || player.characterindex == 0 ) + { + if ( randomint( 100 ) > 50 ) + { + return 1; + } + return 3; + } + else + { + if ( player.characterindex == 3 || player.characterindex == 1 ) + { + if ( randomint( 100 ) > 50 ) + { + return 0; + } + return 2; + } + } + } + _k1558 = getNextArrayKey( _a1558, _k1558 ); + } + charindexarray = array_randomize( charindexarray ); + return charindexarray[ 0 ]; + } + else + { + _a1586 = players; + _k1586 = getFirstArrayKey( _a1586 ); + while ( isDefined( _k1586 ) ) + { + player = _a1586[ _k1586 ]; + if ( isDefined( player.characterindex ) ) + { + arrayremovevalue( charindexarray, player.characterindex, 0 ); + } + _k1586 = getNextArrayKey( _a1586, _k1586 ); + } + if ( charindexarray.size > 0 ) + { + return charindexarray[ 0 ]; + } + } + } + return 0; +} + +zombie_init_done() +{ + self.allowpain = 0; + self.zombie_path_bad = 0; + self thread maps/mp/zm_highrise_distance_tracking::escaped_zombies_cleanup_init(); + self thread elevator_traverse_watcher(); + if ( self.classname == "actor_zm_highrise_basic_03" ) + { + health_bonus = int( self.maxhealth * 0,05 ); + self.maxhealth += health_bonus; + if ( self.headmodel == "c_zom_zombie_chinese_head3_helmet" ) + { + self.maxhealth += health_bonus; + } + self.health = self.maxhealth; + } +} + +setup_personality_character_exerts() +{ + level.exert_sounds[ 1 ][ "burp" ][ 0 ] = "vox_plr_0_exert_burp_0"; + level.exert_sounds[ 1 ][ "burp" ][ 1 ] = "vox_plr_0_exert_burp_1"; + level.exert_sounds[ 1 ][ "burp" ][ 2 ] = "vox_plr_0_exert_burp_2"; + level.exert_sounds[ 1 ][ "burp" ][ 3 ] = "vox_plr_0_exert_burp_3"; + level.exert_sounds[ 1 ][ "burp" ][ 4 ] = "vox_plr_0_exert_burp_4"; + level.exert_sounds[ 1 ][ "burp" ][ 5 ] = "vox_plr_0_exert_burp_5"; + level.exert_sounds[ 1 ][ "burp" ][ 6 ] = "vox_plr_0_exert_burp_6"; + level.exert_sounds[ 2 ][ "burp" ][ 0 ] = "vox_plr_1_exert_burp_0"; + level.exert_sounds[ 2 ][ "burp" ][ 1 ] = "vox_plr_1_exert_burp_1"; + level.exert_sounds[ 2 ][ "burp" ][ 2 ] = "vox_plr_1_exert_burp_2"; + level.exert_sounds[ 2 ][ "burp" ][ 3 ] = "vox_plr_1_exert_burp_3"; + level.exert_sounds[ 3 ][ "burp" ][ 0 ] = "vox_plr_2_exert_burp_0"; + level.exert_sounds[ 3 ][ "burp" ][ 1 ] = "vox_plr_2_exert_burp_1"; + level.exert_sounds[ 3 ][ "burp" ][ 2 ] = "vox_plr_2_exert_burp_2"; + level.exert_sounds[ 3 ][ "burp" ][ 3 ] = "vox_plr_2_exert_burp_3"; + level.exert_sounds[ 3 ][ "burp" ][ 4 ] = "vox_plr_2_exert_burp_4"; + level.exert_sounds[ 3 ][ "burp" ][ 5 ] = "vox_plr_2_exert_burp_5"; + level.exert_sounds[ 3 ][ "burp" ][ 6 ] = "vox_plr_2_exert_burp_6"; + level.exert_sounds[ 4 ][ "burp" ][ 0 ] = "vox_plr_3_exert_burp_0"; + level.exert_sounds[ 4 ][ "burp" ][ 1 ] = "vox_plr_3_exert_burp_1"; + level.exert_sounds[ 4 ][ "burp" ][ 2 ] = "vox_plr_3_exert_burp_2"; + level.exert_sounds[ 4 ][ "burp" ][ 3 ] = "vox_plr_3_exert_burp_3"; + level.exert_sounds[ 4 ][ "burp" ][ 4 ] = "vox_plr_3_exert_burp_4"; + level.exert_sounds[ 4 ][ "burp" ][ 5 ] = "vox_plr_3_exert_burp_5"; + level.exert_sounds[ 4 ][ "burp" ][ 6 ] = "vox_plr_3_exert_burp_6"; + level.exert_sounds[ 1 ][ "hitmed" ][ 0 ] = "vox_plr_0_exert_pain_medium_0"; + level.exert_sounds[ 1 ][ "hitmed" ][ 1 ] = "vox_plr_0_exert_pain_medium_1"; + level.exert_sounds[ 1 ][ "hitmed" ][ 2 ] = "vox_plr_0_exert_pain_medium_2"; + level.exert_sounds[ 1 ][ "hitmed" ][ 3 ] = "vox_plr_0_exert_pain_medium_3"; + level.exert_sounds[ 2 ][ "hitmed" ][ 0 ] = "vox_plr_1_exert_pain_medium_0"; + level.exert_sounds[ 2 ][ "hitmed" ][ 1 ] = "vox_plr_1_exert_pain_medium_1"; + level.exert_sounds[ 2 ][ "hitmed" ][ 2 ] = "vox_plr_1_exert_pain_medium_2"; + level.exert_sounds[ 2 ][ "hitmed" ][ 3 ] = "vox_plr_1_exert_pain_medium_3"; + level.exert_sounds[ 3 ][ "hitmed" ][ 0 ] = "vox_plr_2_exert_pain_medium_0"; + level.exert_sounds[ 3 ][ "hitmed" ][ 1 ] = "vox_plr_2_exert_pain_medium_1"; + level.exert_sounds[ 3 ][ "hitmed" ][ 2 ] = "vox_plr_2_exert_pain_medium_2"; + level.exert_sounds[ 3 ][ "hitmed" ][ 3 ] = "vox_plr_2_exert_pain_medium_3"; + level.exert_sounds[ 4 ][ "hitmed" ][ 0 ] = "vox_plr_3_exert_pain_medium_0"; + level.exert_sounds[ 4 ][ "hitmed" ][ 1 ] = "vox_plr_3_exert_pain_medium_1"; + level.exert_sounds[ 4 ][ "hitmed" ][ 2 ] = "vox_plr_3_exert_pain_medium_2"; + level.exert_sounds[ 4 ][ "hitmed" ][ 3 ] = "vox_plr_3_exert_pain_medium_3"; + level.exert_sounds[ 1 ][ "hitlrg" ][ 0 ] = "vox_plr_0_exert_pain_high_0"; + level.exert_sounds[ 1 ][ "hitlrg" ][ 1 ] = "vox_plr_0_exert_pain_high_1"; + level.exert_sounds[ 1 ][ "hitlrg" ][ 2 ] = "vox_plr_0_exert_pain_high_2"; + level.exert_sounds[ 1 ][ "hitlrg" ][ 3 ] = "vox_plr_0_exert_pain_high_3"; + level.exert_sounds[ 2 ][ "hitlrg" ][ 0 ] = "vox_plr_1_exert_pain_high_0"; + level.exert_sounds[ 2 ][ "hitlrg" ][ 1 ] = "vox_plr_1_exert_pain_high_1"; + level.exert_sounds[ 2 ][ "hitlrg" ][ 2 ] = "vox_plr_1_exert_pain_high_2"; + level.exert_sounds[ 2 ][ "hitlrg" ][ 3 ] = "vox_plr_1_exert_pain_high_3"; + level.exert_sounds[ 3 ][ "hitlrg" ][ 0 ] = "vox_plr_2_exert_pain_high_0"; + level.exert_sounds[ 3 ][ "hitlrg" ][ 1 ] = "vox_plr_2_exert_pain_high_1"; + level.exert_sounds[ 3 ][ "hitlrg" ][ 2 ] = "vox_plr_2_exert_pain_high_2"; + level.exert_sounds[ 3 ][ "hitlrg" ][ 3 ] = "vox_plr_2_exert_pain_high_3"; + level.exert_sounds[ 4 ][ "hitlrg" ][ 0 ] = "vox_plr_3_exert_pain_high_0"; + level.exert_sounds[ 4 ][ "hitlrg" ][ 1 ] = "vox_plr_3_exert_pain_high_1"; + level.exert_sounds[ 4 ][ "hitlrg" ][ 2 ] = "vox_plr_3_exert_pain_high_2"; + level.exert_sounds[ 4 ][ "hitlrg" ][ 3 ] = "vox_plr_3_exert_pain_high_3"; +} + +melee_anim_state() +{ + if ( flag( "leaper_round" ) ) + { + mas = "zm_run_melee"; + melee_dist = distancesquared( self.origin, self.enemy.origin ); + kick_dist = 1024; + if ( melee_dist < kick_dist ) + { + mas = "zm_jump_melee"; + } + self.melee_attack = 1; + return mas; + } + return undefined; +} + +toggle_leaper_collision() +{ + level endon( "end_game" ); + a_leaper_collision = getentarray( "leaper_clip", "targetname" ); + while ( 1 ) + { + flag_waitopen( "leaper_round" ); + _a1737 = a_leaper_collision; + _k1737 = getFirstArrayKey( _a1737 ); + while ( isDefined( _k1737 ) ) + { + clip_brush = _a1737[ _k1737 ]; + clip_brush notsolid(); + clip_brush connectpaths(); + _k1737 = getNextArrayKey( _a1737, _k1737 ); + } + flag_wait( "leaper_round" ); + _a1746 = a_leaper_collision; + _k1746 = getFirstArrayKey( _a1746 ); + while ( isDefined( _k1746 ) ) + { + clip_brush = _a1746[ _k1746 ]; + clip_brush solid(); + clip_brush connectpaths(); + _k1746 = getNextArrayKey( _a1746, _k1746 ); + } + } +} + +toggle_leaper_traversals() +{ + level endon( "end_game" ); + a_leaper_traversals = getentarray( "leaper_traversal_clip", "targetname" ); + while ( 1 ) + { + flag_waitopen( "leaper_round" ); + _a1766 = a_leaper_traversals; + _k1766 = getFirstArrayKey( _a1766 ); + while ( isDefined( _k1766 ) ) + { + clip_brush = _a1766[ _k1766 ]; + clip_brush solid(); + clip_brush disconnectpaths(); + clip_brush notsolid(); + _k1766 = getNextArrayKey( _a1766, _k1766 ); + } + flag_wait( "leaper_round" ); + _a1776 = a_leaper_traversals; + _k1776 = getFirstArrayKey( _a1776 ); + while ( isDefined( _k1776 ) ) + { + clip_brush = _a1776[ _k1776 ]; + clip_brush notsolid(); + clip_brush connectpaths(); + _k1776 = getNextArrayKey( _a1776, _k1776 ); + } + } +} + +toggle_zombie_traversals() +{ + level endon( "end_game" ); + a_zombie_only_traversals = getentarray( "zombie_traversal_clip", "targetname" ); + while ( 1 ) + { + flag_waitopen( "leaper_round" ); + _a1795 = a_zombie_only_traversals; + _k1795 = getFirstArrayKey( _a1795 ); + while ( isDefined( _k1795 ) ) + { + clip_brush = _a1795[ _k1795 ]; + clip_brush notsolid(); + clip_brush connectpaths(); + _k1795 = getNextArrayKey( _a1795, _k1795 ); + } + flag_wait( "leaper_round" ); + _a1804 = a_zombie_only_traversals; + _k1804 = getFirstArrayKey( _a1804 ); + while ( isDefined( _k1804 ) ) + { + clip_brush = _a1804[ _k1804 ]; + clip_brush solid(); + clip_brush disconnectpaths(); + clip_brush notsolid(); + _k1804 = getNextArrayKey( _a1804, _k1804 ); + } + } +} + +is_touching_instakill() +{ + _a1817 = level.insta_kill_triggers; + _k1817 = getFirstArrayKey( _a1817 ); + while ( isDefined( _k1817 ) ) + { + trigger = _a1817[ _k1817 ]; + if ( self istouching( trigger ) ) + { + return 1; + } + _k1817 = getNextArrayKey( _a1817, _k1817 ); + } + return 0; +} + +player_force_from_prone() +{ + level endon( "intermission" ); + level endon( "end_game" ); + while ( 1 ) + { + self waittill( "trigger", who ); + if ( who getstance() == "prone" && isplayer( who ) ) + { + who setstance( "crouch" ); + } + wait 0,1; + } +} + +equipment_safe_to_drop( weapon ) +{ + if ( isDefined( self.origin ) && abs( self.origin[ 2 ] - weapon.origin[ 2 ] ) > 120 ) + { + return 0; + } + if ( !isDefined( weapon.canmove ) ) + { + weapon.canmove = weapon maps/mp/zm_highrise_elevators::object_is_on_elevator(); + } + if ( isDefined( weapon.canmove ) && weapon.canmove ) + { + return 1; + } + if ( weapon is_touching_instakill() ) + { + return 0; + } + return 1; +} + +use_safe_spawn_on_elevator( weapon, origin, angles ) +{ + if ( !isDefined( weapon.canmove ) ) + { + weapon.canmove = weapon maps/mp/zm_highrise_elevators::object_is_on_elevator(); + } + if ( isDefined( weapon.canmove ) && weapon.canmove && isDefined( weapon.elevator_parent.is_moving ) && weapon.elevator_parent.is_moving ) + { + return 1; + } + return 0; +} + +equipment_planted( weapon, equipname, groundfrom ) +{ + weaponelevator = groundfrom maps/mp/zm_highrise_elevators::object_is_on_elevator(); + if ( !weaponelevator && weapon is_touching_instakill() ) + { + self maps/mp/zombies/_zm_equipment::equipment_take( equipname ); + wait 0,05; + self notify( equipname + "_taken" ); + return; + } + if ( weaponelevator && isDefined( weapon.canmove ) && !weapon.canmove ) + { + weapon.canmove = 1; + maps/mp/zombies/_zm_unitrigger::reregister_unitrigger_as_dynamic( weapon.stub ); + } + if ( isDefined( self ) && weaponelevator ) + { + if ( isDefined( weapon ) ) + { + parent = groundfrom.elevator_parent; + weapon linkto( parent ); + weapon setmovingplatformenabled( 1 ); + if ( isDefined( weapon.stub ) ) + { + weapon.stub.link_parent = parent; + weapon.stub.origin_parent = weapon; + } + weapon.equipment_can_move = 1; + weapon.isonbus = 1; + weapon.move_parent = parent; + } + } +} + +safe_place_for_buildable_piece( piece ) +{ + if ( self is_jumping() ) + { + return 0; + } + return 1; +} + +zm_highrise_pandora_fx_func() +{ + self endon( "death" ); + self.pandora_light = spawn( "script_model", self.zbarrier.origin ); + self.pandora_light.angles = self.zbarrier.angles + vectorScale( ( -1, 0, -1 ), 90 ); + self.pandora_light setmodel( "tag_origin" ); + if ( isDefined( level._box_initialized ) && !level._box_initialized ) + { + flag_wait( "start_zombie_round_logic" ); + level._box_initialized = 1; + } + wait 1; + if ( isDefined( self ) && isDefined( self.pandora_light ) ) + { + n_pandora_fx = level._effect[ "lght_marker" ]; + if ( is_magic_box_in_inverted_building() ) + { + n_pandora_fx = level._effect[ "pandora_box_inverted" ]; + } + playfxontag( n_pandora_fx, self.pandora_light, "tag_origin" ); + } +} + +is_magic_box_in_inverted_building() +{ + b_is_in_inverted_building = 0; + a_boxes_in_inverted_building = array( "start_chest" ); + str_location = level.chests[ level.chest_index ].script_noteworthy; +/# + assert( isDefined( str_location ), "is_magic_box_in_inverted_building() can't find magic box location" ); +#/ + i = 0; + while ( i < a_boxes_in_inverted_building.size ) + { + if ( a_boxes_in_inverted_building[ i ] == str_location ) + { + b_is_in_inverted_building = 1; + } + i++; + } + return b_is_in_inverted_building; +} + +init_highrise_stats() +{ + self maps/mp/zm_highrise_sq::init_player_sidequest_stats(); + self maps/mp/zm_highrise_achievement::init_player_achievement_stats(); +} + +init_level_specific_wall_buy_fx() +{ + level._effect[ "an94_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_an94" ); + level._effect[ "pdw57_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_pdw57" ); + level._effect[ "svu_zm_fx" ] = loadfx( "maps/zombie/fx_zmb_wall_buy_svuas" ); +} + +init_level_specific_audio() +{ + init_highrise_player_dialogue(); + add_highrise_response_chance(); + level thread survivor_vox(); +} + +add_highrise_response_chance() +{ + add_vox_response_chance( "crawl_spawn", 10 ); + add_vox_response_chance( "reboard", 5 ); + add_vox_response_chance( "slipgun_kill", 10 ); + add_vox_response_chance( "leaper_round", 100 ); + add_vox_response_chance( "achievement", 100 ); + add_vox_response_chance( "power_on", 100 ); + add_vox_response_chance( "power_off", 100 ); + add_vox_response_chance( "upgrade", 100 ); + add_vox_response_chance( "build_pck_bspringpad_zm", 45 ); + add_vox_response_chance( "build_pck_bslipgun_zm", 45 ); + add_vox_response_chance( "build_pck_wspringpad_zm", 45 ); + add_vox_response_chance( "build_pck_wslipgun", 45 ); + add_vox_response_chance( "build_plc_springpad_zm", 45 ); + add_vox_response_chance( "build_plc_slipgun_zm", 45 ); + add_vox_response_chance( "build_pickup", 45 ); + add_vox_response_chance( "build_swap", 45 ); + add_vox_response_chance( "build_add", 45 ); + add_vox_response_chance( "build_final", 45 ); +} + +init_highrise_player_dialogue() +{ + level.vox zmbvoxadd( "player", "general", "revive_down", "bus_down", undefined ); + level.vox zmbvoxadd( "player", "general", "revive_up", "heal_revived", undefined ); + level.vox zmbvoxadd( "player", "general", "achievement", "earn_acheivement", undefined ); + level.vox zmbvoxadd( "player", "general", "no_money_weapon", "nomoney_weapon", undefined ); + level.vox zmbvoxadd( "player", "general", "no_money_box", "nomoney_box", undefined ); + level.vox zmbvoxadd( "player", "general", "exert_sigh", "exert_sigh", undefined ); + level.vox zmbvoxadd( "player", "general", "exert_laugh", "exert_laugh", undefined ); + level.vox zmbvoxadd( "player", "general", "pain_high", "pain_high", undefined ); + level.vox zmbvoxadd( "player", "kill", "slipgun_kill", "kill_sliquifier", undefined ); + level.vox zmbvoxadd( "player", "general", "leaper_round", "leaper_reveal", undefined ); + level.vox zmbvoxadd( "player", "general", "leaper_seen", "leaper_see", undefined ); + level.vox zmbvoxadd( "player", "general", "leaper_killed", "leaper_kill", undefined ); + level.vox zmbvoxadd( "player", "general", "leaper_attack", "leaper_attack", undefined ); + level.vox zmbvoxadd( "player", "general", "build_pck_bspringpad_zm", "build_pck_bsteam", undefined ); + level.vox zmbvoxadd( "player", "general", "build_pck_bslipgun_zm", "build_pck_bsliquifier", undefined ); + level.vox zmbvoxadd( "player", "general", "build_pck_wspringpad_zm", "build_pck_wsteam", undefined ); + level.vox zmbvoxadd( "player", "general", "build_pck_wslipgun_zm", "build_pck_wsliquifier", undefined ); + level.vox zmbvoxadd( "player", "general", "build_plc_springpad_zm", "build_plc_steam", undefined ); + level.vox zmbvoxadd( "player", "general", "build_plc_slipgun_zm", "build_plc_sliquifier", undefined ); + level.vox zmbvoxadd( "player", "general", "build_pickup", "build_pickup", undefined ); + level.vox zmbvoxadd( "player", "general", "build_swap", "build_swap", undefined ); + level.vox zmbvoxadd( "player", "general", "build_add", "build_add", undefined ); + level.vox zmbvoxadd( "player", "general", "build_final", "build_final", undefined ); + level.vox zmbvoxadd( "player", "general", "intro", "power_off", undefined ); + level.vox zmbvoxadd( "player", "power", "power_on", "power_on", undefined ); + level.vox zmbvoxadd( "player", "general", "reboard", "rebuild_boards", undefined ); + level.vox zmbvoxadd( "player", "general", "upgrade", "find_secret", undefined ); + level.vox zmbvoxadd( "player", "general", "pap_wait", "pap_wait", undefined ); + level.vox zmbvoxadd( "player", "general", "pap_wait2", "pap_wait2", undefined ); + level.vox zmbvoxadd( "player", "general", "pap_arm", "pap_arm", undefined ); + level.vox zmbvoxadd( "player", "general", "pap_arm2", "pap_arm2", undefined ); + level.vox zmbvoxadd( "player", "general", "pap_hint", "pap_hint", undefined ); +} + +highrise_audio_custom_response_line( player, index, category, type ) +{ + russman = 0; + samuel = 1; + misty = 2; + marlton = 3; + switch( player.characterindex ) + { + case 0: + level maps/mp/zombies/_zm_audio::setup_hero_rival( player, samuel, marlton, category, type ); + break; + case 1: + level maps/mp/zombies/_zm_audio::setup_hero_rival( player, russman, misty, category, type ); + break; + case 2: + level maps/mp/zombies/_zm_audio::setup_hero_rival( player, marlton, samuel, category, type ); + break; + case 3: + level maps/mp/zombies/_zm_audio::setup_hero_rival( player, misty, russman, category, type ); + break; + } + return; +} + +survivor_vox() +{ + trigger = spawn( "trigger_radius_use", ( 2398,5, -366, 1332,5 ), 0, 40, 72 ); + trigger setcursorhint( "HINT_NOICON" ); + trigger sethintstring( "" ); + trigger triggerignoreteam(); + level waittill( "power_on" ); + initiated = 0; + while ( !initiated ) + { + trigger waittill( "trigger", player ); + playsoundatposition( "zmb_zombie_arc", trigger.origin ); + start_time = getTime(); + end_time = start_time + 5000; + while ( player usebuttonpressed() && player istouching( trigger ) && is_player_valid( player ) ) + { + if ( getTime() > end_time ) + { + initiated = 1; + } + wait 0,05; + } + } + sur_num = 1; + index = 0; + count = 0; + playsoundatposition( "zmb_buildable_piece_add", trigger.origin ); + while ( 1 ) + { + trigger waittill( "trigger", player ); + while ( is_player_valid( player ) ) + { + if ( sur_num == 1 ) + { + count = 7; + } + else if ( sur_num == 2 ) + { + count = 5; + } + else if ( sur_num == 3 ) + { + count = 6; + } + else if ( sur_num == 4 ) + { + count = 4; + } + else + { + if ( sur_num == 5 ) + { + count = 1; + } + } + index = 0; + while ( index < count ) + { + trigger playsoundwithnotify( "vox_sur" + sur_num + "_tv_distress_" + index, "vox_sur" + sur_num + "_tv_distress_" + index + "done" ); + trigger waittill( "vox_sur" + sur_num + "_tv_distress_" + index + "done" ); + trigger waittill( "trigger", player ); + index++; + } + } + sur_num++; + if ( sur_num > 5 ) + { + sur_num = 1; + } + wait 5; + } +} + +buildable_build_custom_func( stub ) +{ + buildable = stub.buildablezone; + counter = 0; + i = 0; + while ( i < buildable.pieces.size ) + { + if ( isDefined( buildable.pieces[ i ].built ) && buildable.pieces[ i ].built ) + { + counter++; + } + i++; + } + if ( counter == ( buildable.pieces.size - 1 ) ) + { + self thread do_player_general_vox( "general", "build_final", 45 ); + } +} + +elevator_traverse_watcher() +{ + self endon( "death" ); + while ( 1 ) + { + if ( is_true( self.is_traversing ) ) + { + self.elevator_parent = undefined; + if ( is_true( self maps/mp/zm_highrise_elevators::object_is_on_elevator() ) ) + { + if ( isDefined( self.elevator_parent ) ) + { + if ( is_true( self.elevator_parent.is_moving ) ) + { + playfx( level._effect[ "zomb_gib" ], self.origin ); + if ( !is_true( self.has_been_damaged_by_player ) ) + { + level.zombie_total++; + } + self delete(); + return; + } + } + } + } + wait 0,2; + } +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_achievement.gsc b/zm_highrise_patch/maps/mp/zm_highrise_achievement.gsc new file mode 100644 index 0000000..9aeae3a --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_achievement.gsc @@ -0,0 +1,193 @@ +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +init() +{ + level thread achievement_highrise_sidequest(); + level thread achievement_mad_without_power(); + level.achievement_sound_func = ::achievement_sound_func; + onplayerconnect_callback( ::onplayerconnect ); +} + +achievement_sound_func( achievement_name_lower ) +{ + self thread do_player_general_vox( "general", "achievement" ); +} + +init_player_achievement_stats() +{ + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_highrise_sidequest", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_vertigoner", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_slippery_when_undead", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_facing_the_dragon", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_im_my_own_best_friend", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_mad_without_power", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "zm_dlc1_shafted", 0 ); +} + +onplayerconnect() +{ + self thread achievement_vertigoner(); + self thread achievement_slippery_when_undead(); + self thread achievement_facing_the_dragon(); + self thread achievement_im_my_own_best_friend(); + self thread achievement_shafted(); +} + +achievement_highrise_sidequest() +{ + level endon( "end_game" ); + level waittill( "highrise_sidequest_achieved" ); +/# + iprintlnbold( "ZM_DLC1_HIGHRISE_SIDEQUEST achieved for the team" ); +#/ + level giveachievement_wrapper( "ZM_DLC1_HIGHRISE_SIDEQUEST", 1 ); +} + +achievement_vertigoner() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + self.num_zombies_flung = 0; + max_zombies_flung = 10; + while ( self.num_zombies_flung < max_zombies_flung ) + { + self waittill( "zombie_flung" ); + wait 0,1; + } +/# +#/ + self giveachievement_wrapper( "ZM_DLC1_VERTIGONER" ); +} + +achievement_slippery_when_undead() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + self.num_sliquifier_kills = 0; + max_kills_with_one_shot = 5; + while ( self.num_sliquifier_kills < max_kills_with_one_shot ) + { + self waittill( "sliquifier_kill" ); + wait 0,01; + } +/# +#/ + self giveachievement_wrapper( "ZM_DLC1_SLIPPERY_WHEN_UNDEAD" ); +} + +achievement_facing_the_dragon() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + v_achievement_location = ( 2209, 693, 3200 ); + v_dragon_position = ( 971, 43, 3800 ); + is_touching_distance = 350; + round_number_max = 2; + while ( 1 ) + { + if ( level.round_number >= round_number_max ) + { + return; + } + dist = distance( self.origin, v_achievement_location ); + if ( dist <= is_touching_distance ) + { + v_dir = vectornormalize( v_dragon_position - self.origin ); + v_forward = self getweaponforwarddir(); + dp = vectordot( v_dir, v_forward ); + if ( dp > 0,95 ) + { + break; + } + } + else + { + wait 0,01; + } + } +/# +#/ + self giveachievement_wrapper( "ZM_DLC1_FACING_THE_DRAGON" ); +} + +achievement_im_my_own_best_friend() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + self waittill( "whos_who_self_revive" ); +/# +#/ + self giveachievement_wrapper( "ZM_DLC1_IM_MY_OWN_BEST_FRIEND" ); +} + +achievement_mad_without_power() +{ + level endon( "end_game" ); + round_number_max = 10; + while ( level.round_number < round_number_max ) + { + level waittill( "start_of_round" ); + if ( flag( "power_on" ) ) + { + return; + } + } +/# +#/ + self giveachievement_wrapper( "ZM_DLC1_MAD_WITHOUT_POWER", 1 ); +} + +achievement_shafted() +{ + level endon( "end_game" ); + self endon( "disconnect" ); + level.perk_bought_func = ::player_buys_perk_machine; + max_unique_perk_machines = 6; + while ( 1 ) + { + self waittill_any( "player_buys_perk", "pap_used" ); + if ( isDefined( self.pap_used ) && self.pap_used == 1 ) + { + if ( isDefined( self.perk_machines_bought ) && self.perk_machines_bought.size >= max_unique_perk_machines ) + { + break; + } + } + else + { + } + } +/# +#/ + self giveachievement_wrapper( "ZM_DLC1_SHAFTED" ); +} + +player_buys_perk_machine( perk ) +{ + if ( !isDefined( self.perk_machines_bought ) ) + { + self.perk_machines_bought = []; + } + found = 0; + i = 0; + while ( i < self.perk_machines_bought.size ) + { + if ( perk == self.perk_machines_bought[ i ] ) + { + found = 1; + break; + } + else + { + i++; + } + } + if ( !found ) + { + self.perk_machines_bought[ self.perk_machines_bought.size ] = perk; + self notify( "player_buys_perk" ); + } +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_amb.gsc b/zm_highrise_patch/maps/mp/zm_highrise_amb.gsc new file mode 100644 index 0000000..42acc3e --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_amb.gsc @@ -0,0 +1,75 @@ +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; +#include maps/mp/_ambientpackage; + +main() +{ + level thread sndmusicegg(); +} + +sndmusicegg() +{ + origins = []; + origins[ 0 ] = ( 2724, 300, 1347 ); + origins[ 1 ] = ( 2639, 1831, 1359 ); + origins[ 2 ] = ( 1230, 1846, 3249 ); + level.meteor_counter = 0; + level.music_override = 0; + i = 0; + while ( i < origins.size ) + { + level thread sndmusicegg_wait( origins[ i ] ); + i++; + } +} + +sndmusicegg_wait( bear_origin ) +{ + temp_ent = spawn( "script_origin", bear_origin ); + temp_ent playloopsound( "zmb_meteor_loop" ); + temp_ent thread maps/mp/zombies/_zm_sidequests::fake_use( "main_music_egg_hit", ::sndmusicegg_override ); + temp_ent waittill( "main_music_egg_hit", player ); + temp_ent stoploopsound( 1 ); + player playsound( "zmb_meteor_activate" ); + level.meteor_counter += 1; + if ( level.meteor_counter == 3 ) + { + level thread sndmuseggplay( temp_ent, "mus_zmb_secret_song", 190 ); + } + else + { + wait 1,5; + temp_ent delete(); + } +} + +sndmusicegg_override() +{ + if ( is_true( level.music_override ) ) + { + return 0; + } + return 1; +} + +sndmuseggplay( ent, alias, time ) +{ + level.music_override = 1; + wait 1; + ent playsound( alias ); + level thread sndeggmusicwait( time ); + level waittill_either( "end_game", "sndSongDone" ); + ent stopsounds(); + wait 0,05; + ent delete(); + level.music_override = 0; +} + +sndeggmusicwait( time ) +{ + level endon( "end_game" ); + wait time; + level notify( "sndSongDone" ); +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_buildables.gsc b/zm_highrise_patch/maps/mp/zm_highrise_buildables.gsc new file mode 100644 index 0000000..a2f369e --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_buildables.gsc @@ -0,0 +1,353 @@ +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zm_highrise_elevators; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zm_transit_utility; +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init_buildables() +{ + level.buildable_piece_count = 13; + add_zombie_buildable( "springpad_zm", &"ZM_HIGHRISE_BUILD_SPRINGPAD", &"ZM_HIGHRISE_BUILDING_SPRINGPAD", &"ZM_HIGHRISE_BOUGHT_SPRINGPAD" ); + add_zombie_buildable( "slipgun_zm", &"ZM_HIGHRISE_BUILD_SLIPGUN", &"ZM_HIGHRISE_BUILDING_SLIPGUN", &"ZM_HIGHRISE_BOUGHT_SLIPGUN" ); + add_zombie_buildable( "keys_zm", &"ZM_HIGHRISE_BUILD_KEYS", &"ZM_HIGHRISE_BUILDING_KEYS", &"ZM_HIGHRISE_BOUGHT_KEYS" ); + add_zombie_buildable( "ekeys_zm", &"ZM_HIGHRISE_BUILD_KEYS", &"ZM_HIGHRISE_BUILDING_KEYS", &"ZM_HIGHRISE_BOUGHT_KEYS" ); + add_zombie_buildable( "sq_common", &"ZOMBIE_BUILD_SQ_COMMON", &"ZOMBIE_BUILDING_SQ_COMMON" ); +} + +include_buildables() +{ + springpad_door = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_door", 32, 64, 0, "zom_hud_trample_steam_screen", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_02", undefined, 1 ); + springpad_flag = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_bellows", 48, 15, 0, "zom_hud_trample_steam_bellow", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_04", undefined, 2 ); + springpad_motor = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_compressor", 48, 15, 0, "zom_hud_trample_steam_compressor", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_01", undefined, 3 ); + springpad_whistle = generate_zombie_buildable_piece( "springpad_zm", "p6_zm_buildable_tramplesteam_flag", 48, 15, 0, "zom_hud_trample_steam_whistle", ::onpickup_common, ::ondrop_common, undefined, "Tag_part_03", undefined, 4 ); + springpad = spawnstruct(); + springpad.name = "springpad_zm"; + springpad add_buildable_piece( springpad_door ); + springpad add_buildable_piece( springpad_flag ); + springpad add_buildable_piece( springpad_motor ); + springpad add_buildable_piece( springpad_whistle ); + springpad.triggerthink = ::springpadbuildable; + include_buildable( springpad ); + slipgun_canister = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_extinguisher", 32, 64, 0, "zom_hud_icon_buildable_slip_ext", ::onpickup_common, ::ondrop_common, undefined, "TAG_CO2", undefined, 5 ); + slipgun_cooker = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_cooker", 48, 15, 0, "zom_hud_icon_buildable_slip_cooker", ::onpickup_common, ::ondrop_common, undefined, "TAG_COOKER", undefined, 6 ); + slipgun_foot = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_foot", 48, 15, 0, "zom_hud_icon_buildable_slip_foot", ::onpickup_common, ::ondrop_common, undefined, "TAG_FOOT", undefined, 7 ); + slipgun_throttle = generate_zombie_buildable_piece( "slipgun_zm", "t6_zmb_buildable_slipgun_throttle", 48, 15, 0, "zom_hud_icon_buildable_slip_handle", ::onpickup_common, ::ondrop_common, undefined, "TAG_THROTTLE", undefined, 8 ); + slipgun = spawnstruct(); + slipgun.name = "slipgun_zm"; + slipgun add_buildable_piece( slipgun_canister ); + slipgun add_buildable_piece( slipgun_cooker ); + slipgun add_buildable_piece( slipgun_foot ); + slipgun add_buildable_piece( slipgun_throttle ); + slipgun.onbuyweapon = ::onbuyweapon_slipgun; + slipgun.triggerthink = ::slipgunbuildable; + slipgun.onuseplantobject = ::onuseplantobject_slipgun; + include_buildable( slipgun ); + key_chain = generate_zombie_buildable_piece( "keys_zm", "P6_zm_hr_key", 32, 64, 2,4, "zom_hud_icon_epod_key", ::onpickup_keys, ::ondrop_keys, undefined, undefined, 0, 9 ); + key_chain.onspawn = ::onspawn_keys; + key_chain manage_multiple_pieces( 4 ); + key = spawnstruct(); + key.name = "keys_zm"; + key add_buildable_piece( key_chain ); + key.triggerthink = ::keysbuildable; + key.onuseplantobject = ::onuseplantobject_escapepodkey; + key.buildablepieces[ 0 ].onspawn = ::onspawn_keys; + include_buildable( key ); + ekey = spawnstruct(); + ekey.name = "ekeys_zm"; + ekey add_buildable_piece( key_chain ); + ekey.triggerthink = ::ekeysbuildable; + ekey.onuseplantobject = ::onuseplantobject_elevatorkey; + ekey.buildablepieces[ 0 ].onspawn = ::onspawn_keys; + include_buildable( ekey ); + if ( !isDefined( level.gamedifficulty ) || level.gamedifficulty != 0 ) + { + sq_common_electricbox = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_electric_box", 32, 64, 0, "zm_hud_icon_sq_powerbox", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 10 ); + sq_common_meteor = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_meteor", 128, 64, 0, "zm_hud_icon_sq_meteor", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 11 ); + sq_common_scaffolding = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_scaffolding", 64, 96, 0, "zm_hud_icon_sq_scafold", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 12 ); + sq_common_transceiver = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_transceiver", 64, 96, 0, "zm_hud_icon_sq_tranceiver", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 13 ); + sqcommon = spawnstruct(); + sqcommon.name = "sq_common"; + sqcommon add_buildable_piece( sq_common_electricbox ); + sqcommon add_buildable_piece( sq_common_meteor ); + sqcommon add_buildable_piece( sq_common_scaffolding ); + sqcommon add_buildable_piece( sq_common_transceiver ); + sqcommon.triggerthink = ::sqcommonbuildable; + include_buildable( sqcommon ); + maps/mp/zombies/_zm_buildables::hide_buildable_table_model( "sq_common_buildable_trigger" ); + } +} + +springpadbuildable() +{ + maps/mp/zombies/_zm_buildables::buildable_trigger_think( "springpad_zm_buildable_trigger", "springpad_zm", "equip_springpad_zm", &"ZM_HIGHRISE_GRAB_SPRINGPAD", 1, 1 ); +} + +slipgunbuildable() +{ + level thread wait_for_slipgun(); + if ( isDefined( level.slipgun_as_equipment ) && !level.slipgun_as_equipment ) + { + persist = 2; + } + else + { + persist = 1; + } + maps/mp/zombies/_zm_buildables::buildable_trigger_think( "slipgun_zm_buildable_trigger", "slipgun_zm", "slipgun_zm", &"ZM_HIGHRISE_GRAB_SLIPGUN", 1, persist ); +} + +keysbuildable() +{ + pod_key = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "escape_pod_key_console_trigger", "keys_zm", "keys_zm", "", 1, 3 ); + pod_key.prompt_and_visibility_func = ::escape_pod_key_prompt; +} + +ekeysbuildable() +{ + elevator_keys = maps/mp/zombies/_zm_buildables::buildable_trigger_think_array( "elevator_key_console_trigger", "ekeys_zm", "keys_zm", "", 1, 3 ); + _a143 = elevator_keys; + _k143 = getFirstArrayKey( _a143 ); + while ( isDefined( _k143 ) ) + { + stub = _a143[ _k143 ]; + stub.prompt_and_visibility_func = ::elevator_key_prompt; + stub.buildablezone.stat_name = "keys_zm"; + _k143 = getNextArrayKey( _a143, _k143 ); + } +} + +ondrop_common( player ) +{ +/# + println( "ZM >> Common part callback onDrop()" ); +#/ + self droponelevator( player ); + self.piece_owner = undefined; +} + +onpickup_common( player ) +{ +/# + println( "ZM >> Common part callback onPickup()" ); +#/ + player playsound( "zmb_buildable_pickup" ); + self pickupfromelevator(); + self.piece_owner = player; +} + +sqcommonbuildable() +{ + level.sq_buildable = maps/mp/zombies/_zm_buildables::buildable_trigger_think( "sq_common_buildable_trigger", "sq_common", "sq_common", "", 1, 0 ); +} + +onbuyweapon_slipgun( player ) +{ + player givestartammo( self.stub.weaponname ); + player switchtoweapon( self.stub.weaponname ); + level notify( "slipgun_bought" ); +} + +wait_for_slipgun() +{ + level.zombie_include_weapons[ "slipgun_zm" ] = 0; + if ( isDefined( level.slipgun_as_equipment ) && !level.slipgun_as_equipment ) + { + level waittill( "slipgun_bought", player ); + level.zombie_include_weapons[ "slipgun_zm" ] = 1; + level.zombie_weapons[ "slipgun_zm" ].is_in_box = 1; + } +} + +keyscreateglint() +{ + if ( !isDefined( self.model.glint_fx ) ) + { + playfxontag( level._effect[ "elevator_glint" ], self.model, "tag_origin" ); + } +} + +onspawn_keys() +{ + self keyscreateglint(); +} + +ondrop_keys( player ) +{ + self keyscreateglint(); +} + +onpickup_keys( player ) +{ +} + +escape_pod_key_prompt( player ) +{ + if ( !flag( "escape_pod_needs_reset" ) ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + return 0; + } + return self buildabletrigger_update_prompt( player ); +} + +onuseplantobject_escapepodkey( player ) +{ + level notify( "reset_escape_pod" ); +} + +watch_elevator_prompt( player, trig ) +{ + player notify( "watch_elevator_prompt" ); + player endon( "watch_elevator_prompt" ); + trig endon( "kill_trigger" ); + while ( 1 ) + { + trig.stub.elevator waittill( "floor_changed" ); + if ( isDefined( self.stub.elevator ) ) + { + if ( trig.stub.elevator maps/mp/zm_highrise_elevators::elevator_is_on_floor( trig.stub.floor ) ) + { + thread maps/mp/zombies/_zm_unitrigger::cleanup_trigger( trig, player ); + return; + } + } + } +} + +elevator_key_prompt( player ) +{ + if ( !isDefined( self.stub.elevator ) ) + { + elevatorname = self.stub.script_noteworthy; + if ( isDefined( elevatorname ) && isDefined( self.stub.script_parameters ) ) + { + elevator = level.elevators[ elevatorname ]; + floor = int( self.stub.script_parameters ); + flevel = elevator maps/mp/zm_highrise_elevators::elevator_level_for_floor( floor ); + self.stub.elevator = elevator; + self.stub.floor = flevel; + } + } +/# + if ( !isDefined( self.stub.elevator ) ) + { + if ( isDefined( self.stub.script_noteworthy ) ) + { + error( "Cannot locate elevator " + self.stub.script_noteworthy ); + } + else + { + error( "Cannot locate elevator " ); + } + } + else + { + color = vectorScale( ( 0, 0, 1 ), 0,7 ); + stop = self.stub.floor; + floor = self.stub.elevator.floors[ "" + stop ].script_location; + text = "call " + self.stub.script_noteworthy + " to stop " + stop + " floor " + floor + ""; + if ( getDvarInt( #"B67910B4" ) ) + { + print3d( self.stub.origin, text, color, 1, 0,5, 300 ); +#/ + } + } + if ( isDefined( self.stub.elevator ) ) + { + if ( self.stub.elevator maps/mp/zm_highrise_elevators::elevator_is_on_floor( self.stub.floor ) ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + return 0; + } + } + if ( !flag( "power_on" ) ) + { + self.stub.hint_string = ""; + self sethintstring( self.stub.hint_string ); + return 0; + } + can_use = self buildabletrigger_update_prompt( player ); + if ( can_use ) + { + thread watch_elevator_prompt( player, self ); + } + return can_use; +} + +onuseplantobject_elevatorkey( player ) +{ + elevatorname = self.script_noteworthy; + if ( isDefined( elevatorname ) && isDefined( self.script_parameters ) ) + { + floor = int( self.script_parameters ); + elevator = level.elevators[ elevatorname ]; + if ( isDefined( elevator ) ) + { + elevator.body.force_starting_floor = floor; + elevator.body notify( "forcego" ); + } + } +} + +droponelevator( player ) +{ + if ( isDefined( player ) && isDefined( player maps/mp/zm_highrise_elevators::object_is_on_elevator() ) && player maps/mp/zm_highrise_elevators::object_is_on_elevator() ) + { + self.model linkto( player.elevator_parent ); + self.linked_to_elevator = 1; + self.unitrigger.link_parent = player.elevator_parent; + } + else + { + self.unitrigger.link_parent = undefined; + } +} + +pickupfromelevator() +{ + if ( isDefined( self.linked_to_elevator ) && self.linked_to_elevator ) + { + if ( isDefined( self.model ) ) + { + self.model unlink(); + } + self.linked_to_elevator = undefined; + } + if ( isDefined( self.unitrigger ) ) + { + self.unitrigger.link_parent = undefined; + } +} + +onuseplantobject_slipgun( player ) +{ +/# + println( "ZM >> Slipgun Buildable CallBack onUsePlantObject()" ); +#/ + buildable = self.buildablezone; + first_part = "TAG_COOKER"; + second_part = "TAG_BASE"; + i = 0; + while ( i < buildable.pieces.size ) + { + if ( buildable.pieces[ i ].part_name == first_part ) + { + if ( isDefined( buildable.pieces[ i ].built ) || buildable.pieces[ i ].built && player.current_buildable_piece.part_name == first_part ) + { + buildable.stub.model showpart( second_part ); + i++; + continue; + } + else + { + buildable.stub.model hidepart( second_part ); + } + } + i++; + } +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_classic.gsc b/zm_highrise_patch/maps/mp/zm_highrise_classic.gsc new file mode 100644 index 0000000..dd36682 --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_classic.gsc @@ -0,0 +1,1171 @@ +#include maps/mp/zm_highrise_utility; +#include maps/mp/zombies/_zm_zonemgr; +#include maps/mp/zombies/_zm_laststand; +#include maps/mp/zombies/_zm_ai_leaper; +#include maps/mp/zombies/_zm_magicbox; +#include maps/mp/zm_highrise_elevators; +#include maps/mp/zm_highrise_classic; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zm_highrise_buildables; +#include maps/mp/zombies/_zm_chugabud; +#include maps/mp/gametypes_zm/_hud_util; +#include maps/mp/gametypes_zm/_hud; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +#using_animtree( "zombie_escape_elevator" ); + +precache() +{ + precacheshader( "overlay_low_health_splat" ); + precacheshellshock( "elevator_crash" ); + maps/mp/zombies/_zm_chugabud::chugabug_precache(); + maps/mp/zm_highrise_buildables::include_buildables(); + maps/mp/zm_highrise_buildables::init_buildables(); + maps/mp/zm_highrise_sq::init(); + maps/mp/zombies/_zm_equip_springpad::init( &"ZM_HIGHRISE_EQUIP_SPRINGPAD_PICKUP_HINT_STRING", &"ZM_HIGHRISE_EQUIP_SPRINGPAD_HOWTO" ); + level._zombiemode_post_respawn_callback = ::highrise_post_respawn_callback; + onplayerconnect_callback( ::highrise_player_connect_callback ); +} + +main() +{ + level.buildables_built[ "pap" ] = 1; + level.custom_pap_move_in = ::highrise_pap_move_in; + level.custom_pap_move_out = ::highrise_pap_move_out; + flag_init( "perks_ready" ); + maps/mp/gametypes_zm/_zm_gametype::setup_standard_objects( "rooftop" ); + maps/mp/zombies/_zm_game_module::set_current_game_module( level.game_module_standard_index ); + level thread maps/mp/zombies/_zm_buildables::think_buildables(); + level.calc_closest_player_using_paths = 1; + level.validate_enemy_path_length = ::highrise_validate_enemy_path_length; + level thread maps/mp/zm_highrise_classic::init_escape_pod(); + level thread maps/mp/zm_highrise_elevators::init_elevators(); + temp_clips = getentarray( "elevator_delete", "targetname" ); + if ( isDefined( temp_clips ) && temp_clips.size > 0 ) + { + array_thread( temp_clips, ::self_delete ); + } + level thread maps/mp/zm_highrise_elevators::init_elevator( "1b" ); + level thread maps/mp/zm_highrise_elevators::init_elevator( "1c", 1 ); + level thread maps/mp/zm_highrise_elevators::init_elevator( "1d" ); + if ( randomint( 100 ) > 50 ) + { + level thread maps/mp/zm_highrise_elevators::init_elevator( "3", 1, -1264 ); + level thread maps/mp/zm_highrise_elevators::init_elevator( "3b", 2 ); + } + else + { + level thread maps/mp/zm_highrise_elevators::init_elevator( "3", 2 ); + level thread maps/mp/zm_highrise_elevators::init_elevator( "3b", 1, -1264 ); + } + level thread maps/mp/zm_highrise_elevators::init_elevator( "3c", 3 ); + level thread maps/mp/zm_highrise_elevators::init_elevator( "3d", 1 ); + flag_wait( "initial_blackscreen_passed" ); + level thread escape_pod(); + level._chugabug_reject_corpse_override_func = ::highrise_chugabud_reject_corpse_func; + level._chugabud_reject_node_override_func = ::highrise_chugabud_reject_node_func; + level._chugabud_post_respawn_override_func = ::highrise_chugabud_post_respawn_func; + level.insta_kill_triggers = getentarray( "instant_death", "targetname" ); + array_thread( level.insta_kill_triggers, ::squashed_death_init, 0 ); + e_trigger = getent( "instant_death_escape_pod_shaft", "targetname" ); + if ( isDefined( e_trigger ) ) + { + e_trigger thread squashed_death_init( 1 ); + e_trigger thread escape_pod_death_trigger_think(); + level.insta_kill_triggers[ level.insta_kill_triggers.size ] = e_trigger; + } + exploder( 9 ); + exploder( 10 ); + flag_wait( "start_zombie_round_logic" ); + level thread maps/mp/zm_highrise_elevators::random_elevator_perks(); + level thread maps/mp/zm_highrise_elevators::faller_location_logic(); + level.custom_faller_entrance_logic = ::maps/mp/zm_highrise_elevators::watch_for_elevator_during_faller_spawn; + setdvar( "zombiemode_path_minz_bias", 13 ); + level.check_valid_poi = ::check_valid_poi; + level thread maps/mp/zm_highrise_elevators::shouldsuppressgibs(); +} + +highrise_validate_enemy_path_length( player ) +{ + max_dist = 1296; + d = distancesquared( self.origin, player.origin ); + if ( d <= max_dist ) + { + return 1; + } + return 0; +} + +highrise_player_connect_callback() +{ + self setperk( "specialty_fastmantle" ); + self thread end_game_turn_off_whoswho(); +} + +end_game_turn_off_whoswho() +{ + self endon( "disconnect" ); + level waittill( "end_game" ); + self thread turn_off_whoswho(); +} + +highrise_post_respawn_callback() +{ + self setperk( "specialty_fastmantle" ); + self thread turn_off_whoswho(); +} + +turn_off_whoswho() +{ + self endon( "disconnect" ); + self setclientfieldtoplayer( "clientfield_whos_who_filter", 1 ); + wait_network_frame(); + wait_network_frame(); + self setclientfieldtoplayer( "clientfield_whos_who_filter", 0 ); +} + +highrise_pap_move_in( trigger, origin_offset, angles_offset ) +{ + level endon( "Pack_A_Punch_off" ); + trigger endon( "pap_player_disconnected" ); + pap_machine = trigger.perk_machine; + worldgun = trigger.worldgun; + worldgundw = trigger.worldgun.worldgundw; + offset = origin_offset[ 2 ]; + trigger.worldgun rotateto( self.angles + angles_offset + vectorScale( ( 0, 0, 1 ), 90 ), 0,35, 0, 0 ); + offsetdw = vectorScale( ( 0, 0, 1 ), 3 ); + if ( isDefined( trigger.worldgun.worldgundw ) ) + { + worldgundw rotateto( self.angles + angles_offset + vectorScale( ( 0, 0, 1 ), 90 ), 0,35, 0, 0 ); + } + wait 0,5; + move_vec = ( ( ( self.origin + origin_offset ) - worldgun.origin ) * 0,05 ) / 0,5; + elapsed_time_counter = 0; + while ( isDefined( worldgun ) && elapsed_time_counter < 0,5 ) + { + worldgun.origin = ( worldgun.origin[ 0 ] + move_vec[ 0 ], worldgun.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset ); + if ( isDefined( worldgundw ) ) + { + worldgundw.origin = ( worldgundw.origin[ 0 ] + move_vec[ 0 ], worldgundw.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset + offsetdw[ 2 ] ); + } + elapsed_time_counter += 0,05; + wait 0,05; + } +} + +highrise_pap_move_out( trigger, origin_offset, interact_offset ) +{ + level endon( "Pack_A_Punch_off" ); + trigger endon( "pap_player_disconnected" ); + pap_machine = trigger.perk_machine; + worldgun = trigger.worldgun; + worldgundw = trigger.worldgun.worldgundw; + offset = origin_offset[ 2 ]; + offsetdw = vectorScale( ( 0, 0, 1 ), 3 ); + move_vec = ( ( interact_offset - origin_offset ) * 0,05 ) / 0,5; + elapsed_time_counter = 0; + while ( isDefined( worldgun ) && elapsed_time_counter < 0,5 ) + { + worldgun.origin = ( worldgun.origin[ 0 ] + move_vec[ 0 ], worldgun.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset ); + if ( isDefined( worldgundw ) ) + { + worldgundw.origin = ( worldgundw.origin[ 0 ] + move_vec[ 0 ], worldgundw.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset + offsetdw[ 2 ] ); + } + elapsed_time_counter += 0,05; + wait 0,05; + } + move_vec = ( ( origin_offset - interact_offset ) * 0,05 ) / level.packapunch_timeout; + elapsed_time_counter = 0; + while ( isDefined( worldgun ) && elapsed_time_counter < level.packapunch_timeout ) + { + worldgun.origin = ( worldgun.origin[ 0 ] + move_vec[ 0 ], worldgun.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset ); + if ( isDefined( worldgundw ) ) + { + worldgundw.origin = ( worldgundw.origin[ 0 ] + move_vec[ 0 ], worldgundw.origin[ 1 ] + move_vec[ 1 ], pap_machine.origin[ 2 ] + offset + offsetdw[ 2 ] ); + } + elapsed_time_counter += 0,05; + wait 0,05; + } +} + +escape_pod_death_trigger_think() +{ + self endon( "death" ); + while ( 1 ) + { + level waittill( "escape_pod_falling_begin" ); + self trigger_off(); + level waittill( "escape_pod_falling_complete" ); + self trigger_on(); + level waittill( "escape_pod_moving_back_to_start_position" ); + self trigger_off(); + level waittill( "escape_pod_returns_to_start_location" ); + self trigger_on(); + } +} + +zm_treasure_chest_init() +{ + chest1 = getstruct( "start_chest", "script_noteworthy" ); + level.chests = []; + level.chests[ level.chests.size ] = chest1; + maps/mp/zombies/_zm_magicbox::treasure_chest_init( "start_chest" ); +} + +squashed_death_init( kill_if_falling ) +{ + while ( 1 ) + { + self waittill( "trigger", who ); + if ( isDefined( who.insta_killed ) && !who.insta_killed ) + { + if ( isplayer( who ) ) + { + who thread elevator_black_screen_squash_check(); + who thread insta_kill_player( 1, kill_if_falling ); + break; + } + else if ( isai( who ) ) + { + while ( is_true( who.in_the_ceiling ) ) + { + continue; + } + who dodamage( who.health + 100, who.origin ); + who.insta_killed = 1; + if ( isDefined( who.has_been_damaged_by_player ) && !who.has_been_damaged_by_player ) + { + if ( isDefined( who.is_leaper ) && who.is_leaper ) + { + who thread maps/mp/zombies/_zm_ai_leaper::leaper_cleanup(); + break; + } + else + { + level.zombie_total++; + } + } + } + } + } +} + +elevator_black_screen_squash_check() +{ + if ( !self hasperk( "specialty_finalstand" ) ) + { + return; + } + while ( isDefined( level.elevators ) ) + { + _a385 = level.elevators; + _k385 = getFirstArrayKey( _a385 ); + while ( isDefined( _k385 ) ) + { + elevator = _a385[ _k385 ]; + if ( isDefined( elevator.body.trig ) ) + { + if ( self istouching( elevator.body.trig ) ) + { + if ( isDefined( self.fade_to_black_time ) ) + { + time = getTime(); + dt = ( time - self.fade_to_black_time ) / 1000; + if ( abs( dt ) < 10 ) + { + return; + } + } + start_wait = 0; + black_screen_wait = 3,8; + fade_in_time = 0,2; + fade_out_time = 0,01; + self thread fadetoblackforxsec( start_wait, black_screen_wait, fade_in_time, fade_out_time ); + self.fade_to_black_time = getTime(); + return 1; + } + } + _k385 = getNextArrayKey( _a385, _k385 ); + } + } +} + +insta_kill_player( perks_can_respawn_player, kill_if_falling ) +{ + self endon( "disconnect" ); + if ( isDefined( perks_can_respawn_player ) && perks_can_respawn_player == 0 ) + { + if ( self hasperk( "specialty_quickrevive" ) ) + { + self unsetperk( "specialty_quickrevive" ); + } + if ( self hasperk( "specialty_finalstand" ) ) + { + self unsetperk( "specialty_finalstand" ); + } + } + self maps/mp/zombies/_zm_buildables::player_return_piece_to_original_spawn(); + if ( isDefined( self.insta_killed ) && self.insta_killed ) + { + return; + } + if ( isDefined( self.ignore_insta_kill ) ) + { + self.disable_chugabud_corpse = 1; + return; + } + if ( self hasperk( "specialty_finalstand" ) ) + { + self.ignore_insta_kill = 1; + self.disable_chugabud_corpse = 1; + self dodamage( self.health + 1000, ( 0, 0, 1 ) ); + return; + } + if ( !isDefined( kill_if_falling ) || kill_if_falling == 0 ) + { + if ( !self isonground() ) + { + return; + } + } + if ( is_player_killable( self ) ) + { + self.insta_killed = 1; + in_last_stand = 0; + self notify( "chugabud_effects_cleanup" ); + if ( self maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) + { + in_last_stand = 1; + } + self thread blood_splat(); + if ( getnumconnectedplayers() == 1 ) + { + if ( isDefined( self.lives ) && self.lives > 0 ) + { + self.waiting_to_revive = 1; + points = getstruct( "zone_green_start", "script_noteworthy" ); + spawn_points = getstructarray( points.target, "targetname" ); + point = spawn_points[ 0 ]; + if ( in_last_stand == 0 ) + { + self dodamage( self.health + 1000, ( 0, 0, 1 ) ); + } + wait 0,5; + self freezecontrols( 1 ); + wait 0,25; + self setorigin( point.origin + vectorScale( ( 0, 0, 1 ), 20 ) ); + self.angles = point.angles; + if ( in_last_stand ) + { + flag_set( "instant_revive" ); + self.stopflashingbadlytime = getTime() + 1000; + wait_network_frame(); + flag_clear( "instant_revive" ); + } + else + { + self thread maps/mp/zombies/_zm_laststand::auto_revive( self ); + self.waiting_to_revive = 0; + self.solo_respawn = 0; + self.lives = 0; + } + self freezecontrols( 0 ); + self.insta_killed = 0; + } + else + { + self dodamage( self.health + 1000, ( 0, 0, 1 ) ); + } + } + else + { + self dodamage( self.health + 1000, ( 0, 0, 1 ) ); + wait_network_frame(); + self.bleedout_time = 0; + } + self.insta_killed = 0; + } +} + +highrise_chugabud_reject_corpse_func( v_corpse_position ) +{ + reject = 0; + if ( isDefined( level.elevator_volumes ) ) + { + scr_org = spawn( "script_origin", v_corpse_position ); + _a563 = level.elevator_volumes; + _k563 = getFirstArrayKey( _a563 ); + while ( isDefined( _k563 ) ) + { + volume = _a563[ _k563 ]; + if ( scr_org istouching( volume ) ) + { + reject = 1; + break; + } + else + { + _k563 = getNextArrayKey( _a563, _k563 ); + } + } + scr_org delete(); + } + return reject; +} + +highrise_chugabud_reject_node_func( v_corpse_pos, nd_node ) +{ + reject = 0; + skip_elevator_volume_check = 0; + scr_org = spawn( "script_origin", nd_node.origin ); + player_zone = maps/mp/zombies/_zm_zonemgr::get_player_zone(); + if ( isDefined( player_zone ) ) + { + if ( player_zone == "zone_orange_elevator_shaft_middle_1" || player_zone == "zone_orange_elevator_shaft_middle_2" ) + { + skip_elevator_volume_check = 1; + } + } + if ( !isDefined( level.chugabud_info_volume1 ) ) + { + level.chugabud_info_volume1 = getent( "zone_orange_level1_whos_who_info_volume", "targetname" ); + } + scr_org.origin = v_corpse_pos; + if ( scr_org istouching( level.chugabud_info_volume1 ) ) + { + scr_org.origin = nd_node.origin; + if ( !scr_org istouching( level.chugabud_info_volume1 ) ) + { + reject = 1; + } + } + if ( !reject ) + { + if ( !isDefined( level.chugabud_info_volume2 ) ) + { + level.chugabud_info_volume2 = getent( "whos_who_slide_info_volume", "targetname" ); + } + scr_org.origin = v_corpse_pos; + if ( scr_org istouching( level.chugabud_info_volume2 ) ) + { + n_node_corpse = getnode( "whos_who_slide_corpse_respawn_position", "targetname" ); + maps/mp/zombies/_zm_chugabud::force_corpse_respawn_position( n_node_corpse.origin ); + } + } + while ( !reject ) + { + while ( !skip_elevator_volume_check ) + { + scr_org.origin = nd_node.origin; + while ( isDefined( level.elevator_volumes ) ) + { + _a665 = level.elevator_volumes; + _k665 = getFirstArrayKey( _a665 ); + while ( isDefined( _k665 ) ) + { + volume = _a665[ _k665 ]; + if ( scr_org istouching( volume ) ) + { + reject = 1; + break; + } + else + { + _k665 = getNextArrayKey( _a665, _k665 ); + } + } + } + } + } + scr_org delete(); + return reject; +} + +highrise_chugabud_post_respawn_func( v_new_player_position ) +{ + scr_org = spawn( "script_origin", v_new_player_position ); + e_corpse = self.e_chugabud_corpse; + if ( isDefined( e_corpse ) ) + { + corpse_zone = maps/mp/zombies/_zm_zonemgr::get_zone_from_position( e_corpse.origin ); + if ( isDefined( corpse_zone ) || corpse_zone == "zone_orange_elevator_shaft_middle_2" && corpse_zone == "zone_orange_elevator_shaft_middle_1" ) + { + if ( !isDefined( level.elevator_shaft_middle_2_respawn_nodes ) ) + { + level.elevator_shaft_middle_2_respawn_nodes = getnodearray( "orange_elevator_middle_2_player_respawn_loc", "targetname" ); + level.elevator_shaft_middle_2_respawn_nodes_index = 0; + } + nd_node = level.elevator_shaft_middle_2_respawn_nodes[ level.elevator_shaft_middle_2_respawn_nodes_index ]; + level.elevator_shaft_middle_2_respawn_nodes_index++; + if ( level.elevator_shaft_middle_2_respawn_nodes_index >= level.elevator_shaft_middle_2_respawn_nodes.size ) + { + level.elevator_shaft_middle_2_respawn_nodes_index = 0; + } + maps/mp/zombies/_zm_chugabud::force_player_respawn_position( nd_node.origin ); + } + } + e_corpse = self.e_chugabud_corpse; + if ( isDefined( e_corpse ) ) + { + a_escape_pod_ents = []; + a_escape_pod_ents[ a_escape_pod_ents.size ] = getent( "escape_pod_trigger", "targetname" ); + a_escape_pod_ents[ a_escape_pod_ents.size ] = getent( "zone_green_escape_pod", "targetname" ); + scr_org.origin = e_corpse.origin; + touching = 0; + i = 0; + while ( i < a_escape_pod_ents.size ) + { + e_ent = a_escape_pod_ents[ i ]; + if ( scr_org istouching( e_ent ) ) + { + touching = 1; + break; + } + else + { + i++; + } + } + if ( touching ) + { + scr_org.origin = v_new_player_position; + touching = 0; + i = 0; + while ( i < a_escape_pod_ents.size ) + { + e_ent = a_escape_pod_ents[ i ]; + if ( scr_org istouching( e_ent ) ) + { + touching = 1; + break; + } + else + { + i++; + } + } + if ( !touching ) + { + if ( v_new_player_position[ 2 ] > 3300 ) + { + if ( !isDefined( level.escape_pod_corpse_respawn_nodes ) ) + { + level.escape_pod_corpse_respawn_nodes = getnodearray( "escape_pod_corpse_respawn_loc", "targetname" ); + level.escape_pod_corpse_respawn_node_index = 0; + } + nd_node = level.escape_pod_corpse_respawn_nodes[ level.escape_pod_corpse_respawn_node_index ]; + level.escape_pod_corpse_respawn_node_index++; + if ( level.escape_pod_corpse_respawn_node_index >= level.escape_pod_corpse_respawn_nodes.size ) + { + level.escape_pod_corpse_respawn_node_index = 0; + } + maps/mp/zombies/_zm_chugabud::force_corpse_respawn_position( nd_node.origin ); + if ( isDefined( self.riding_escape_pod ) ) + { + self.riding_escape_pod = undefined; + } + } + } + } + } + scr_org delete(); +} + +blood_splat() +{ + earthquake( 0,3, 3, self.origin, 128 ); + if ( isDefined( self.blood_splats_overlay ) ) + { + return; + } + self.blood_splats_overlay = newclienthudelem( self ); + self.blood_splats_overlay setshader( "overlay_low_health_splat", 640, 480 ); + self.blood_splats_overlay.x = 0; + self.blood_splats_overlay.y = 0; + self.blood_splats_overlay.splatter = 1; + self.blood_splats_overlay.alignx = "left"; + self.blood_splats_overlay.aligny = "top"; + self.blood_splats_overlay.sort = 1; + self.blood_splats_overlay.foreground = 0; + self.blood_splats_overlay.horzalign = "fullscreen"; + self.blood_splats_overlay.vertalign = "fullscreen"; + self.blood_splats_overlay.alpha = 1; + wait 3; + self.blood_splats_overlay fadeovertime( 1 ); + self.blood_splats_overlay.alpha = 0; + wait 1; + self.blood_splats_overlay destroy(); +} + +is_player_killable( player, checkignoremeflag ) +{ + if ( !isDefined( player ) ) + { + return 0; + } + if ( !isalive( player ) ) + { + return 0; + } + if ( !isplayer( player ) ) + { + return 0; + } + if ( player.sessionstate == "spectator" ) + { + return 0; + } + if ( player.sessionstate == "intermission" ) + { + return 0; + } + if ( isDefined( self.intermission ) && self.intermission ) + { + return 0; + } + if ( isDefined( checkignoremeflag ) && player.ignoreme ) + { + return 0; + } + return 1; +} + +init_escape_elevators_animtree() +{ + scriptmodelsuseanimtree( -1 ); +} + +escapeelevatoruseanimtree() +{ + self useanimtree( -1 ); +} + +init_escape_pod() +{ + flag_init( "escape_pod_needs_reset" ); + level thread init_escape_elevators_anims(); +/# + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Escape Pod:2/Reset To Top:1" "set zombie_devgui_hrescapepodreset 1" \n" ); + level thread watch_escapepod_devgui(); +#/ +} + +init_escape_elevators_anims() +{ + level.escape_elevator_1_state = %v_zombie_elevator_escape_player1_loop; + level.escape_elevator_2_state = %v_zombie_elevator_escape_player2_loop; + level.escape_elevator_3_state = %v_zombie_elevator_escape_player3_loop; + level.escape_elevator_4_state = %v_zombie_elevator_escape_player4_loop; + level.escape_elevator_5_state = %v_zombie_elevator_escape_player4_cablebreak; + level.escape_elevator_prestine_idle_state = %fxanim_zm_highrise_elevator_prestine_idle_anim; + level.escape_elevator_prestine_drop_state = %fxanim_zm_highrise_elevator_prestine_drop_anim; + level.escape_elevator_prestine_impact_state = %fxanim_zm_highrise_elevator_prestine_impact_anim; + level.escape_elevator_damage_idle_state = %fxanim_zm_highrise_elevator_damage_idle_anim; + level.escape_elevator_damage_drop_state = %fxanim_zm_highrise_elevator_damage_drop_anim; + level.escape_elevator_damage_impact_state = %fxanim_zm_highrise_elevator_damage_impact_anim; + level.escape_elevator_idle = level.escape_elevator_prestine_idle_state; + level.escape_elevator_drop = level.escape_elevator_prestine_drop_state; + level.escape_elevator_impact = level.escape_elevator_prestine_impact_state; +} + +escape_pod() +{ + escape_pod = getent( "elevator_bldg1a_body", "targetname" ); + escape_pod setmovingplatformenabled( 1 ); + escape_pod escapeelevatoruseanimtree(); + escape_pod_trigger = getent( "escape_pod_trigger", "targetname" ); + escape_pod.is_elevator = 1; + escape_pod._post_host_migration_thread = ::maps/mp/zm_highrise_elevators::escape_pod_host_migration_respawn_check; + if ( !isDefined( escape_pod_trigger ) ) + { + return; + } + escape_pod.home_origin = escape_pod.origin; + escape_pod.link_start = []; + escape_pod.link_end = []; + escape_pod_blocker_door = getent( "elevator_bldg1a_body_door_clip", "targetname" ); + number_of_times_used = 0; + used_at_least_once = 0; + escape_pod setanim( level.escape_elevator_1_state ); + escape_pod setclientfield( "clientfield_escape_pod_light_fx", 1 ); + escape_pod_trigger thread escape_pod_walk_on_off( escape_pod ); + while ( 1 ) + { + escape_pod setanim( level.escape_elevator_idle ); + flag_clear( "escape_pod_needs_reset" ); + if ( isDefined( escape_pod_blocker_door ) ) + { + escape_pod escape_pod_linknodes( "escape_pod_door_l_node" ); + escape_pod escape_pod_linknodes( "escape_pod_door_r_node" ); + escape_pod_blocker_door unlink(); + escape_pod_blocker_door thread trigger_off(); + } + if ( is_true( used_at_least_once ) ) + { + wait 3; + } + escape_pod thread escape_pod_state_run(); + while ( 1 ) + { + players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + while ( players_in_escape_pod == 0 ) + { + escape_pod.escape_pod_state = 1; + wait 0,05; + } + all_players_touching = escape_pod_trigger escape_pod_are_all_alive_players_ready(); + players_total = escape_pod_trigger escape_pod_get_all_alive_players(); + players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + if ( players_in_escape_pod > 0 ) + { + escape_pod.escape_pod_state = 2; + } + if ( all_players_touching ) + { + escape_pod thread escape_pod_tell_fx(); + wait 3; + all_players_still_touching = escape_pod_trigger escape_pod_are_all_alive_players_ready(); + if ( all_players_still_touching ) + { + break; + } + } + else + { + wait 0,05; + } + } + level notify( "escape_pod_falling_begin" ); + players = get_players(); + _a1053 = players; + _k1053 = getFirstArrayKey( _a1053 ); + while ( isDefined( _k1053 ) ) + { + player = _a1053[ _k1053 ]; + player.riding_escape_pod = 1; + player allowjump( 0 ); + _k1053 = getNextArrayKey( _a1053, _k1053 ); + } + if ( isDefined( escape_pod_blocker_door ) ) + { + escape_pod_blocker_door trigger_on(); + escape_pod_blocker_door linkto( escape_pod ); + escape_pod escape_pod_unlinknodes( "escape_pod_door_l_node" ); + escape_pod escape_pod_unlinknodes( "escape_pod_door_r_node" ); + } + escape_pod.escape_pod_state = 5; + escape_pod thread escape_pod_shake(); + wait ( getanimlength( level.escape_elevator_5_state ) - 0,05 ); + escape_pod setanim( level.escape_elevator_drop ); + escape_pod setclientfield( "clientfield_escape_pod_light_fx", 0 ); + escape_pod setclientfield( "clientfield_escape_pod_sparks_fx", 1 ); + escape_pod thread escape_pod_move(); + escape_pod thread escape_pod_rotate(); + escape_pod waittill( "reached_destination" ); + number_of_times_used++; + escape_pod thread impact_animate(); + if ( number_of_times_used == 1 ) + { + level.escape_elevator_idle = level.escape_elevator_damage_idle_state; + level.escape_elevator_drop = level.escape_elevator_damage_drop_state; + level.escape_elevator_impact = level.escape_elevator_damage_impact_state; + } + level notify( "escape_pod_falling_complete" ); + if ( isDefined( escape_pod_blocker_door ) ) + { + escape_pod_blocker_door unlink(); + escape_pod_blocker_door trigger_off(); + escape_pod escape_pod_linknodes( "escape_pod_door_l_node" ); + escape_pod escape_pod_linknodes( "escape_pod_door_r_node" ); + } + escape_pod setclientfield( "clientfield_escape_pod_sparks_fx", 0 ); + escape_pod setclientfield( "clientfield_escape_pod_impact_fx", 1 ); + escape_pod setclientfield( "clientfield_escape_pod_light_fx", 1 ); + flag_set( "escape_pod_needs_reset" ); + level waittill( "reset_escape_pod" ); + flag_clear( "escape_pod_needs_reset" ); + escape_pod setclientfield( "clientfield_escape_pod_impact_fx", 0 ); + escape_pod thread escape_pod_breaking_rotate(); + wait 6; + escape_pod playsound( "zmb_elevator_run_start" ); + escape_pod playloopsound( "zmb_elevator_run", 1 ); + level notify( "escape_pod_moving_back_to_start_position" ); + if ( isDefined( escape_pod_blocker_door ) ) + { + escape_pod_blocker_door trigger_on(); + escape_pod_blocker_door linkto( escape_pod ); + escape_pod escape_pod_unlinknodes( "escape_pod_door_l_node" ); + escape_pod escape_pod_unlinknodes( "escape_pod_door_r_node" ); + } + escape_pod moveto( escape_pod.home_origin, 3, 0,1, 0,1 ); + escape_pod waittill( "movedone" ); + escape_pod stoploopsound( 1 ); + escape_pod playsound( "zmb_esc_pod_crash" ); + escape_pod playsound( "zmb_elevator_run_stop" ); + escape_pod playsound( "zmb_elevator_ding" ); + escape_pod thread reset_impact_animate(); + used_at_least_once = 1; + } +} + +escape_pod_walk_on_off( escape_pod ) +{ + while ( 1 ) + { + self waittill( "trigger", who ); + if ( isplayer( who ) ) + { + if ( !is_true( who.in_escape_pod_trigger ) ) + { + self thread escape_pod_walk_on_off_watch( who, escape_pod ); + } + } + } +} + +escape_pod_walk_on_off_watch( who, escape_pod ) +{ + who endon( "disconnect" ); + who.in_escape_pod_trigger = 1; + playsoundatposition( "zmb_esc_pod_bump", escape_pod.origin + vectorScale( ( 0, 0, 1 ), 15 ) ); + while ( who istouching( self ) ) + { + wait 1; + } + playsoundatposition( "zmb_esc_pod_bump", escape_pod.origin + vectorScale( ( 0, 0, 1 ), 15 ) ); + who.in_escape_pod_trigger = 0; +} + +reset_impact_animate() +{ + self setanim( level.escape_elevator_prestine_impact_state ); + wait getanimlength( level.escape_elevator_prestine_impact_state ); + level notify( "escape_pod_returns_to_start_location" ); +} + +impact_animate() +{ + self setanim( level.escape_elevator_impact ); + wait getanimlength( level.escape_elevator_impact ); + self setanim( level.escape_elevator_idle ); +} + +escape_pod_state( set, wait_for_current_end ) +{ + if ( isDefined( self.state ) && self.state == set ) + { + return; + } + if ( is_true( wait_for_current_end ) ) + { + self waittill( "done" ); + } + self.state = set; + switch( set ) + { + case 1: + self.state_anim = level.escape_elevator_1_state; + break; + case 2: + self.state_anim = level.escape_elevator_2_state; + break; + case 3: + self.state_anim = level.escape_elevator_3_state; + break; + case 4: + self.state_anim = level.escape_elevator_4_state; + break; + case 5: + self.state_anim = level.escape_elevator_5_state; + break; + } + self setanim( self.state_anim ); +} + +escape_pod_state_run() +{ + while ( 1 ) + { + while ( !isDefined( self.escape_pod_state ) ) + { + wait 0,05; + } + while ( isDefined( self.state ) && self.state == 1 && self.state == self.escape_pod_state ) + { + wait 0,05; + } + self.state = self.escape_pod_state; + shouldwait = 1; + switch( self.state ) + { + case 1: + self.state_anim = level.escape_elevator_1_state; + shouldwait = 0; + break; + case 2: + self.state_anim = level.escape_elevator_2_state; + break; + case 3: + self.state_anim = level.escape_elevator_3_state; + break; + case 4: + self.state_anim = level.escape_elevator_4_state; + break; + case 5: + self.state_anim = level.escape_elevator_5_state; + break; + } + self setanim( self.state_anim ); + if ( shouldwait ) + { + wait ( getanimlength( self.state_anim ) - 0,05 ); + continue; + } + else + { + wait 0,05; + } + } +} + +escape_pod_tell_fx() +{ + self setclientfield( "clientfield_escape_pod_tell_fx", 1 ); + wait 3; + self setclientfield( "clientfield_escape_pod_tell_fx", 0 ); +} + +escape_pod_get_all_alive_players() +{ + players = get_players(); + players_alive = 0; + _a1318 = players; + _k1318 = getFirstArrayKey( _a1318 ); + while ( isDefined( _k1318 ) ) + { + player = _a1318[ _k1318 ]; + if ( player.sessionstate != "spectator" ) + { + players_alive++; + } + _k1318 = getNextArrayKey( _a1318, _k1318 ); + } + return players_alive; +} + +escape_pod_get_all_alive_players_inside() +{ + players = get_players(); + players_in_escape_pod = 0; + _a1335 = players; + _k1335 = getFirstArrayKey( _a1335 ); + while ( isDefined( _k1335 ) ) + { + player = _a1335[ _k1335 ]; + if ( player.sessionstate != "spectator" ) + { + if ( player istouching( self ) ) + { + players_in_escape_pod++; + } + } + _k1335 = getNextArrayKey( _a1335, _k1335 ); + } + return players_in_escape_pod; +} + +escape_pod_breaking_rotate() +{ + rolls = array( -3, 6, -6, 3 ); + time = 0,74; + accel = 0,1; + deccel = 0,1; + _a1358 = rolls; + _k1358 = getFirstArrayKey( _a1358 ); + while ( isDefined( _k1358 ) ) + { + roll = _a1358[ _k1358 ]; + self rotateroll( roll, time, accel, deccel ); + self playsound( "zmb_esc_pod_bump" ); + self waittill( "rotatedone" ); + _k1358 = getNextArrayKey( _a1358, _k1358 ); + } +} + +escape_pod_rotate() +{ + rolls = array( -3, 11, -8, 9, -13, 15, -13, 5, -9, 10, -4 ); + time = 0,21; + accel = 0,1; + deccel = 0,1; + _a1375 = rolls; + _k1375 = getFirstArrayKey( _a1375 ); + while ( isDefined( _k1375 ) ) + { + roll = _a1375[ _k1375 ]; + self rotateroll( roll, time, accel, deccel ); + self waittill( "rotatedone" ); + _k1375 = getNextArrayKey( _a1375, _k1375 ); + } +} + +escape_pod_move() +{ + shock_radius = 117,6; + destination_struct = getstruct( self.target, "targetname" ); + level notify( "free_fall" ); + self playsound( "zmb_esc_pod_break" ); + self moveto( destination_struct.origin, 3, 0,1, 0,1 ); + self waittill( "movedone" ); + self playsound( "zmb_esc_pod_crash" ); + earthquake( 0,3, 1,5, self.origin, 256 ); + self notify( "reached_destination" ); + players = get_players(); + _a1398 = players; + _k1398 = getFirstArrayKey( _a1398 ); + while ( isDefined( _k1398 ) ) + { + player = _a1398[ _k1398 ]; + if ( !is_true( player.riding_escape_pod ) ) + { + } + else + { + player.riding_escape_pod = 0; + player allowstand( 0 ); + player allowcrouch( 0 ); + player setstance( "prone" ); + player shellshock( "elevator_crash", 4,5 ); + player allowjump( 1 ); + player allowstand( 1 ); + player allowcrouch( 1 ); + } + _k1398 = getNextArrayKey( _a1398, _k1398 ); + } +} + +escape_pod_shake() +{ + self endon( "reached_destination" ); + duration = randomfloatrange( 0,5, 1,5 ); + wait_time = randomfloatrange( 1,5, 2,5 ); + while ( 1 ) + { + wait wait_time; + earthquake( 0,2, duration, self.origin, 1024 ); + } +} + +escape_pod_linknodes( node_name ) +{ + start_node = getnode( node_name, "targetname" ); + while ( isDefined( start_node ) ) + { + start_node.links = []; + near_nodes = getnodesinradiussorted( start_node.origin, 128, 0, 64, "pathnodes" ); + links = 0; + _a1445 = near_nodes; + _k1445 = getFirstArrayKey( _a1445 ); + while ( isDefined( _k1445 ) ) + { + node = _a1445[ _k1445 ]; + if ( !isDefined( node.target ) ) + { + self.link_start[ self.link_start.size ] = start_node; + self.link_end[ self.link_end.size ] = node; + maps/mp/zm_highrise_utility::highrise_link_nodes( start_node, node ); + maps/mp/zm_highrise_utility::highrise_link_nodes( node, start_node ); + start_node.links[ start_node.links.size ] = node; + links++; + if ( links == 2 ) + { + return; + } + } + else + { + _k1445 = getNextArrayKey( _a1445, _k1445 ); + } + } + } +} + +escape_pod_unlinknodes( node_name ) +{ + start_node = getnode( node_name, "targetname" ); + while ( isDefined( start_node ) && isDefined( start_node.links ) ) + { + linked_nodes = start_node.links; + _a1476 = linked_nodes; + _k1476 = getFirstArrayKey( _a1476 ); + while ( isDefined( _k1476 ) ) + { + node = _a1476[ _k1476 ]; + if ( !isDefined( node.target ) ) + { + maps/mp/zm_highrise_utility::highrise_unlink_nodes( start_node, node ); + maps/mp/zm_highrise_utility::highrise_unlink_nodes( node, start_node ); + } + _k1476 = getNextArrayKey( _a1476, _k1476 ); + } + } +} + +escape_pod_are_all_alive_players_ready() +{ + players = get_players(); + players_in_escape_pod = 0; + players_alive = 0; + _a1506 = players; + _k1506 = getFirstArrayKey( _a1506 ); + while ( isDefined( _k1506 ) ) + { + player = _a1506[ _k1506 ]; + if ( player.sessionstate != "spectator" ) + { + players_alive++; + if ( player istouching( self ) ) + { + players_in_escape_pod++; + } + } + _k1506 = getNextArrayKey( _a1506, _k1506 ); + } + return players_alive == players_in_escape_pod; +} + +watch_escapepod_devgui() +{ +/# + while ( 1 ) + { + resetcmd = getDvar( "zombie_devgui_hrescapepodreset" ); + if ( isDefined( resetcmd ) && resetcmd != "" ) + { + level notify( "reset_escape_pod" ); + setdvar( "zombie_devgui_hrescapepodreset", "" ); + } + wait 1; +#/ + } +} + +check_valid_poi( valid ) +{ + _a1545 = level.elevator_volumes; + _k1545 = getFirstArrayKey( _a1545 ); + while ( isDefined( _k1545 ) ) + { + volume = _a1545[ _k1545 ]; + if ( self istouching( volume ) ) + { + return 0; + } + _k1545 = getNextArrayKey( _a1545, _k1545 ); + } + return valid; +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_distance_tracking.gsc b/zm_highrise_patch/maps/mp/zm_highrise_distance_tracking.gsc new file mode 100644 index 0000000..810637f --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_distance_tracking.gsc @@ -0,0 +1,415 @@ +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +zombie_tracking_init() +{ + level.zombie_respawned_health = []; + if ( !isDefined( level.zombie_tracking_dist ) ) + { + level.zombie_tracking_dist = 1000; + } + if ( !isDefined( level.zombie_tracking_high ) ) + { + level.zombie_tracking_high = 500; + } + if ( !isDefined( level.zombie_tracking_wait ) ) + { + level.zombie_tracking_wait = 10; + } + building_trigs = getentarray( "zombie_fell_off", "targetname" ); + if ( isDefined( building_trigs ) ) + { + array_thread( building_trigs, ::zombies_off_building ); + } + level.distance_tracker_aggressive_distance = 500; + level.distance_tracker_aggressive_height = 200; + for ( ;; ) + { + while ( 1 ) + { + zombies = get_round_enemy_array(); + if ( !isDefined( zombies ) || isDefined( level.ignore_distance_tracking ) && level.ignore_distance_tracking ) + { + wait level.zombie_tracking_wait; + } + } + else i = 0; + while ( i < zombies.size ) + { + if ( isDefined( zombies[ i ] ) && isDefined( zombies[ i ].ignore_distance_tracking ) && !zombies[ i ].ignore_distance_tracking ) + { + zombies[ i ] thread delete_zombie_noone_looking( level.zombie_tracking_dist, level.zombie_tracking_high ); + } + i++; + } + wait level.zombie_tracking_wait; + } +} + +delete_zombie_noone_looking( how_close, how_high ) +{ + self endon( "death" ); + if ( !isDefined( how_close ) ) + { + how_close = 1000; + } + if ( !isDefined( how_high ) ) + { + how_high = 500; + } + distance_squared_check = how_close * how_close; + height_squared_check = how_high * how_high; + too_far_dist = distance_squared_check * 3; + if ( isDefined( level.zombie_tracking_too_far_dist ) ) + { + too_far_dist = level.zombie_tracking_too_far_dist * level.zombie_tracking_too_far_dist; + } + self.inview = 0; + self.player_close = 0; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( players[ i ].sessionstate == "spectator" ) + { + i++; + continue; + } + else if ( isDefined( level.only_track_targeted_players ) ) + { + if ( !isDefined( self.favoriteenemy ) || self.favoriteenemy != players[ i ] ) + { + i++; + continue; + } + } + else + { + can_be_seen = self player_can_see_me( players[ i ] ); + if ( can_be_seen && distancesquared( self.origin, players[ i ].origin ) < too_far_dist ) + { + self.inview++; + } + if ( distancesquared( self.origin, players[ i ].origin ) < distance_squared_check && abs( self.origin[ 2 ] - players[ i ].origin[ 2 ] ) < how_high ) + { + self.player_close++; + } + } + i++; + } + wait 0,1; + if ( self.inview == 0 && self.player_close == 0 ) + { + if ( !isDefined( self.animname ) || isDefined( self.animname ) && self.animname != "zombie" ) + { + return; + } + if ( isDefined( self.electrified ) && self.electrified == 1 ) + { + return; + } + zombies = getaiarray( "axis" ); + if ( ( zombies.size + level.zombie_total ) > 24 || ( zombies.size + level.zombie_total ) <= 24 && self.health >= self.maxhealth ) + { + if ( isDefined( self.exclude_distance_cleanup_adding_to_total ) && !self.exclude_distance_cleanup_adding_to_total && isDefined( self.isscreecher ) && !self.isscreecher ) + { + level.zombie_total++; + if ( self.health < level.zombie_health ) + { + level.zombie_respawned_health[ level.zombie_respawned_health.size ] = self.health; + } + } + } + self maps/mp/zombies/_zm_spawner::reset_attack_spot(); + self notify( "zombie_delete" ); + self delete(); + recalc_zombie_array(); + } +} + +player_can_see_me( player ) +{ + playerangles = player getplayerangles(); + playerforwardvec = anglesToForward( playerangles ); + playerunitforwardvec = vectornormalize( playerforwardvec ); + banzaipos = self.origin; + playerpos = player getorigin(); + playertobanzaivec = banzaipos - playerpos; + playertobanzaiunitvec = vectornormalize( playertobanzaivec ); + forwarddotbanzai = vectordot( playerunitforwardvec, playertobanzaiunitvec ); + if ( forwarddotbanzai >= 1 ) + { + anglefromcenter = 0; + } + else if ( forwarddotbanzai <= -1 ) + { + anglefromcenter = 180; + } + else + { + anglefromcenter = acos( forwarddotbanzai ); + } + playerfov = getDvarFloat( "cg_fov" ); + banzaivsplayerfovbuffer = getDvarFloat( "g_banzai_player_fov_buffer" ); + if ( banzaivsplayerfovbuffer <= 0 ) + { + banzaivsplayerfovbuffer = 0,2; + } + playercanseeme = anglefromcenter <= ( ( playerfov * 0,5 ) * ( 1 - banzaivsplayerfovbuffer ) ); + return playercanseeme; +} + +escaped_zombies_cleanup_init() +{ + self endon( "death" ); + self.zombie_path_bad = 0; + while ( 1 ) + { + if ( !self.zombie_path_bad ) + { + self waittill( "bad_path" ); + } + found_player = undefined; + players = get_players(); + i = 0; + while ( i < players.size ) + { + if ( self maymovetopoint( players[ i ].origin, 1 ) ) + { + self.favoriteenemy = players[ i ]; + found_player = 1; + i++; + continue; + } + i++; + } + n_delete_distance = 800; + n_delete_height = 300; + if ( is_player_in_inverted_elevator_shaft() ) + { + n_delete_distance = level.distance_tracker_aggressive_distance; + n_delete_height = level.distance_tracker_aggressive_height; + } + if ( !isDefined( found_player ) && isDefined( self.completed_emerging_into_playable_area ) && self.completed_emerging_into_playable_area ) + { + self thread delete_zombie_noone_looking( n_delete_distance, n_delete_height ); + self.zombie_path_bad = 1; + self escaped_zombies_cleanup(); + } + wait 0,1; + } +} + +is_player_in_inverted_elevator_shaft() +{ + b_player_is_in_elevator_shaft = 0; + a_occupied_zones = get_occupied_zones(); + i = 0; + while ( i < a_occupied_zones.size ) + { + if ( issubstr( a_occupied_zones[ i ], "orange_elevator_shaft" ) ) + { + b_player_is_in_elevator_shaft = 1; + } + i++; + } + return b_player_is_in_elevator_shaft; +} + +get_occupied_zones() +{ + a_occupied_zones = []; + i = 0; + while ( i < level.active_zone_names.size ) + { + if ( level.zones[ level.active_zone_names[ i ] ].is_occupied ) + { + a_occupied_zones[ a_occupied_zones.size ] = level.active_zone_names[ i ]; + } + i++; + } + return a_occupied_zones; +} + +get_escape_position() +{ + self endon( "death" ); + str_zone = get_current_zone(); + if ( isDefined( str_zone ) ) + { + a_zones = get_adjacencies_to_zone( str_zone ); + a_dog_locations = get_dog_locations_in_zones( a_zones ); + s_farthest = self get_farthest_dog_location( a_dog_locations ); + } + return s_farthest; +} + +get_current_zone() +{ + str_zone = undefined; + a_zones = getarraykeys( level.zones ); + _a310 = a_zones; + _k310 = getFirstArrayKey( _a310 ); + while ( isDefined( _k310 ) ) + { + zone = _a310[ _k310 ]; + i = 0; + while ( i < level.zones[ zone ].volumes.size ) + { + if ( self istouching( level.zones[ zone ].volumes[ i ] ) ) + { + str_zone = zone; + } + i++; + } + _k310 = getNextArrayKey( _a310, _k310 ); + } + return str_zone; +} + +get_adjacencies_to_zone( str_zone ) +{ + a_adjacencies = []; + a_adjacencies[ 0 ] = str_zone; + a_adjacent_zones = getarraykeys( level.zones[ str_zone ].adjacent_zones ); + i = 0; + while ( i < a_adjacent_zones.size ) + { + if ( level.zones[ str_zone ].adjacent_zones[ a_adjacent_zones[ i ] ].is_connected ) + { + a_adjacencies[ a_adjacencies.size ] = a_adjacent_zones[ i ]; + } + i++; + } + return a_adjacencies; +} + +get_dog_locations_in_zones( a_zones ) +{ + a_dog_locations = []; + _a345 = a_zones; + _k345 = getFirstArrayKey( _a345 ); + while ( isDefined( _k345 ) ) + { + zone = _a345[ _k345 ]; + a_dog_locations = arraycombine( a_dog_locations, level.zones[ zone ].dog_locations, 0, 0 ); + _k345 = getNextArrayKey( _a345, _k345 ); + } + return a_dog_locations; +} + +get_farthest_dog_location( a_dog_locations ) +{ + n_farthest_index = 0; + n_distance_farthest = 0; + i = 0; + while ( i < a_dog_locations.size ) + { + n_distance_sq = distancesquared( self.origin, a_dog_locations[ i ].origin ); + if ( n_distance_sq > n_distance_farthest ) + { + n_distance_farthest = n_distance_sq; + n_farthest_index = i; + } + i++; + } + return a_dog_locations[ n_farthest_index ]; +} + +escaped_zombies_cleanup() +{ + self endon( "death" ); + s_escape = self get_escape_position(); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + if ( isDefined( s_escape ) ) + { + self setgoalpos( s_escape.origin ); + self thread check_player_available(); + self waittill_any( "goal", "reaquire_player" ); + } + self.zombie_path_bad = !can_zombie_path_to_any_player(); + wait 0,1; + if ( !self.zombie_path_bad ) + { + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); + } +} + +check_player_available() +{ + self notify( "_check_player_available" ); + self endon( "_check_player_available" ); + self endon( "death" ); + self endon( "goal" ); + self endon( "reaquire_player" ); + while ( self.zombie_path_bad ) + { + if ( self can_zombie_see_any_player() ) + { + self notify( "reaquire_player" ); + } + wait randomfloatrange( 0,2, 0,5 ); + } +} + +can_zombie_path_to_any_player() +{ + a_players = get_players(); + i = 0; + while ( i < a_players.size ) + { + if ( findpath( self.origin, a_players[ i ].origin ) ) + { + return 1; + } + i++; + } + return 0; +} + +can_zombie_see_any_player() +{ + a_players = get_players(); + i = 0; + while ( i < a_players.size ) + { + if ( self maymovetopoint( a_players[ i ].origin, 1 ) ) + { + return 1; + } + i++; + } + return 0; +} + +zombies_off_building() +{ + while ( 1 ) + { + self waittill( "trigger", who ); + if ( !isplayer( who ) && isDefined( who.is_leaper ) && !who.is_leaper ) + { + zombies = getaiarray( "axis" ); + if ( ( zombies.size + level.zombie_total ) > 24 || ( zombies.size + level.zombie_total ) <= 24 && who.health >= who.maxhealth ) + { + if ( isDefined( who.exclude_distance_cleanup_adding_to_total ) && !who.exclude_distance_cleanup_adding_to_total && isDefined( who.is_leaper ) && !who.is_leaper ) + { + level.zombie_total++; + if ( who.health < level.zombie_health ) + { + level.zombie_respawned_health[ level.zombie_respawned_health.size ] = who.health; + } + } + } + who maps/mp/zombies/_zm_spawner::reset_attack_spot(); + who notify( "zombie_delete" ); + who dodamage( who.health + 666, who.origin, who ); + recalc_zombie_array(); + } + wait 0,1; + } +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_elevators.gsc b/zm_highrise_patch/maps/mp/zm_highrise_elevators.gsc new file mode 100644 index 0000000..e57e221 --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_elevators.gsc @@ -0,0 +1,1438 @@ +#include maps/mp/zombies/_zm_ai_leaper; +#include maps/mp/zombies/_zm_ai_basic; +#include maps/mp/animscripts/zm_shared; +#include maps/mp/zm_highrise_distance_tracking; +#include maps/mp/zm_highrise_utility; +#include maps/mp/gametypes_zm/_hostmigration; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +#using_animtree( "zombie_perk_elevator" ); + +init_perk_elvators_animtree() +{ + scriptmodelsuseanimtree( -1 ); +} + +init_elevators() +{ + level thread init_perk_elevators_anims(); +/# + init_elevator_devgui(); +#/ +} + +quick_revive_solo_watch() +{ + if ( flag( "solo_game" ) ) + { + self.body perkelevatordoor( 1 ); + } + machine_triggers = getentarray( "vending_revive", "target" ); + machine_trigger = machine_triggers[ 0 ]; + triggeroffset = machine_trigger.origin - self.body.origin; + machineoffset = level.quick_revive_machine.origin - self.body.origin; + while ( 1 ) + { + level waittill_any( "revive_off", "revive_hide" ); + self.body.lock_doors = 1; + self.body perkelevatordoor( 0 ); + machine_trigger unlink(); + wait 1; + machine_trigger.origin += vectorScale( ( 0, 1, 0 ), 10000 ); + level waittill( "revive_on" ); + wait 1; + machine_trigger.origin = self.body.origin + triggeroffset; + machine_trigger linkto( self.body ); + level.quick_revive_machine.origin = self.body.origin + machineoffset; + level.quick_revive_machine linkto( self.body ); + level.quick_revive_machine show(); + self.body.lock_doors = 0; + self.body perkelevatordoor( 1 ); + } +} + +init_perk_elevators_anims() +{ + level.perk_elevators_door_open_state = %v_zombie_elevator_doors_open; + level.perk_elevators_door_close_state = %v_zombie_elevator_doors_close; + level.perk_elevators_door_movement_state = %v_zombie_elevator_doors_idle_movement; + level.perk_elevators_anims = []; + level.perk_elevators_anims[ "vending_chugabud" ][ 0 ] = %v_zombie_elevator_doors_whoswho_banging_before_leaving; + level.perk_elevators_anims[ "vending_chugabud" ][ 1 ] = %v_zombie_elevator_doors_whoswho_trying_to_close; + level.perk_elevators_anims[ "vending_doubletap" ][ 0 ] = %v_zombie_elevator_doors_doubletap_banging_before_leaving; + level.perk_elevators_anims[ "vending_doubletap" ][ 1 ] = %v_zombie_elevator_doors_doubletap_trying_to_close; + level.perk_elevators_anims[ "vending_jugg" ][ 0 ] = %v_zombie_elevator_doors_jugg_banging_before_leaving; + level.perk_elevators_anims[ "vending_jugg" ][ 1 ] = %v_zombie_elevator_doors_jugg_trying_to_close; + level.perk_elevators_anims[ "vending_revive" ][ 0 ] = %v_zombie_elevator_doors_marathon_banging_before_leaving; + level.perk_elevators_anims[ "vending_revive" ][ 1 ] = %v_zombie_elevator_doors_marathon_trying_to_close; + level.perk_elevators_anims[ "vending_additionalprimaryweapon" ][ 0 ] = %v_zombie_elevator_doors_mulekick_banging_before_leaving; + level.perk_elevators_anims[ "vending_additionalprimaryweapon" ][ 1 ] = %v_zombie_elevator_doors_mulekick_trying_to_close; + level.perk_elevators_anims[ "specialty_weapupgrade" ][ 0 ] = %v_zombie_elevator_doors_pap_banging_before_leaving; + level.perk_elevators_anims[ "specialty_weapupgrade" ][ 1 ] = %v_zombie_elevator_doors_pap_trying_to_close; + level.perk_elevators_anims[ "vending_sleight" ][ 0 ] = %v_zombie_elevator_doors_speed_banging_before_leaving; + level.perk_elevators_anims[ "vending_sleight" ][ 1 ] = %v_zombie_elevator_doors_speed_trying_to_close; +} + +perkelevatoruseanimtree() +{ + self useanimtree( -1 ); +} + +perkelevatordoor( set ) +{ + self endon( "death" ); + animtime = 1; + if ( is_true( set ) ) + { + self.door_state = set; + self setanim( level.perk_elevators_door_open_state, 1, animtime, 1 ); + wait getanimlength( level.perk_elevators_door_open_state ); + } + else + { + self.door_state = set; + self setanim( level.perk_elevators_door_close_state, 1, animtime, 1 ); + wait getanimlength( level.perk_elevators_door_close_state ); + } + self notify( "PerkElevatorDoor" ); +} + +get_link_entity_for_host_migration() +{ + _a127 = level.elevators; + _k127 = getFirstArrayKey( _a127 ); + while ( isDefined( _k127 ) ) + { + elevator = _a127[ _k127 ]; + if ( isDefined( elevator.body.trig ) ) + { + if ( self istouching( elevator.body.trig ) ) + { + return elevator.body; + } + } + _k127 = getNextArrayKey( _a127, _k127 ); + } + escape_pod = getent( "elevator_bldg1a_body", "targetname" ); + if ( self istouching( escape_pod ) ) + { + return escape_pod; + } + if ( distance( escape_pod.origin, self.origin ) < 128 ) + { + return escape_pod; + } + return undefined; +} + +escape_pod_host_migration_respawn_check( escape_pod ) +{ + wait 0,2; + dif = self.origin[ 2 ] - escape_pod.origin[ 2 ]; +/# + println( "Escape_pod_host_migration_respawn_check :" ); +#/ +/# + println( "dif : " + dif ); +#/ + if ( dif > 100 ) + { +/# + println( "Finding a better place for the player to be." ); +#/ + self maps/mp/gametypes_zm/_hostmigration::hostmigration_put_player_in_better_place(); + } + else + { +/# + println( "Taking no action." ); +#/ + } +} + +is_self_on_elevator() +{ + elevator_volumes = []; + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1b", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1c", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1d", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3a", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3b", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3c", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3d", "targetname" ); + _a190 = elevator_volumes; + _k190 = getFirstArrayKey( _a190 ); + while ( isDefined( _k190 ) ) + { + zone = _a190[ _k190 ]; + if ( self istouching( zone ) ) + { + return 1; + } + _k190 = getNextArrayKey( _a190, _k190 ); + } + _a198 = level.elevators; + _k198 = getFirstArrayKey( _a198 ); + while ( isDefined( _k198 ) ) + { + elevator = _a198[ _k198 ]; + if ( isDefined( elevator.body.trig ) ) + { + if ( self istouching( elevator.body.trig ) ) + { + return 1; + } + } + _k198 = getNextArrayKey( _a198, _k198 ); + } + escape_pod = getent( "elevator_bldg1a_body", "targetname" ); + if ( self istouching( escape_pod ) ) + { + return 1; + } + if ( distance( escape_pod.origin, self.origin ) < 128 ) + { + return 1; + } + return 0; +} + +object_is_on_elevator() +{ + ground_ent = self getgroundent(); + depth = 0; + while ( isDefined( ground_ent ) && depth < 2 ) + { + if ( isDefined( ground_ent.is_elevator ) && ground_ent.is_elevator ) + { + self.elevator_parent = ground_ent; + return 1; + } + new_ground_ent = ground_ent getgroundent(); + if ( !isDefined( new_ground_ent ) || new_ground_ent == ground_ent ) + { + } + else + { + ground_ent = new_ground_ent; + depth++; + } + } + return 0; +} + +elevator_level_for_floor( floor ) +{ + flevel = "0"; + if ( isDefined( self.floors[ "" + ( floor + 1 ) ] ) ) + { + flevel = "" + ( floor + 1 ); + } + else + { + flevel = "0"; + } + return flevel; +} + +elevator_is_on_floor( floor ) +{ + if ( self.body.current_level == floor ) + { + return 1; + } + if ( self.floors[ self.body.current_level ].script_location == self.floors[ floor ].script_location ) + { + return 1; + } + return 0; +} + +elevator_path_nodes( elevatorname, floorname ) +{ + name = "elevator_" + elevatorname + "_" + floorname; + epaths = getnodearray( name, "script_noteworthy" ); + return epaths; +} + +elevator_paths_onoff( onoff, target ) +{ + while ( isDefined( self ) && self.size > 0 ) + { + _a354 = self; + _k354 = getFirstArrayKey( _a354 ); + while ( isDefined( _k354 ) ) + { + node = _a354[ _k354 ]; + while ( isDefined( node.script_parameters ) && node.script_parameters == "roof_connect" ) + { + _a358 = target; + _k358 = getFirstArrayKey( _a358 ); + while ( isDefined( _k358 ) ) + { + tnode = _a358[ _k358 ]; + if ( onoff ) + { + maps/mp/zm_highrise_utility::highrise_link_nodes( node, tnode ); + maps/mp/zm_highrise_utility::highrise_link_nodes( tnode, node ); + } + else + { + maps/mp/zm_highrise_utility::highrise_unlink_nodes( node, tnode ); + maps/mp/zm_highrise_utility::highrise_unlink_nodes( tnode, node ); + } + _k358 = getNextArrayKey( _a358, _k358 ); + } + } + _k354 = getNextArrayKey( _a354, _k354 ); + } + } +} + +elevator_enable_paths( floor ) +{ + self elevator_disable_paths( floor ); + paths = undefined; + if ( !isDefined( floor ) || !isDefined( self.floors[ floor ].paths ) ) + { + return; + } + else + { + paths = self.floors[ floor ].paths; + } + self.current_paths = paths; + self.current_paths elevator_paths_onoff( 1, self.roof_paths ); +} + +elevator_disable_paths( floor ) +{ + if ( isDefined( self.current_paths ) ) + { + self.current_paths elevator_paths_onoff( 0, self.roof_paths ); + } + self.current_paths = undefined; +} + +init_elevator( elevatorname, force_starting_floor, force_starting_origin ) +{ + if ( !isDefined( level.elevators ) ) + { + level.elevators = []; + } + elevator = spawnstruct(); + elevator.name = elevatorname; + elevator.body = undefined; + level.elevators[ "bldg" + elevatorname ] = elevator; + piece = getent( "elevator_bldg" + elevatorname + "_body", "targetname" ); + piece setmovingplatformenabled( 1 ); + piece.is_moving = 0; + if ( !isDefined( piece ) ) + { +/# + iprintlnbold( "Elevator with name: bldg" + elevatorname + " not found." ); +#/ + return; + } + trig = getent( "elevator_bldg" + elevatorname + "_trigger", "targetname" ); + if ( isDefined( trig ) ) + { + trig enablelinkto(); + trig linkto( piece ); + trig setmovingplatformenabled( 1 ); + piece.trig = trig; + piece thread elevator_roof_watcher(); + } + elevator.body = piece; + piece.is_elevator = 1; + elevator.body perkelevatoruseanimtree(); +/# + assert( isDefined( piece.script_location ) ); +#/ + elevator.body.current_level = piece.script_location; + elevator.body.starting_floor = piece.script_location; + elevator.roof_paths = elevator_path_nodes( "bldg" + elevatorname, "moving" ); + elevator.floors = []; + elevator.floors[ piece.script_location ] = piece; + elevator.floors[ piece.script_location ].starting_position = piece.origin; + elevator.floors[ piece.script_location ].paths = elevator_path_nodes( "bldg" + elevatorname, "floor" + piece.script_location ); + while ( isDefined( piece.target ) ) + { + piece = getstruct( piece.target, "targetname" ); + piece.is_elevator = 1; + if ( !isDefined( elevator.floors[ piece.script_location ] ) ) + { + elevator.floors[ piece.script_location ] = piece; + elevator.floors[ piece.script_location ].paths = elevator_path_nodes( "bldg" + elevatorname, "floor" + piece.script_location ); + } + } + if ( elevatorname != "3c" ) + { + elevator.floors[ "" + elevator.floors.size ] = elevator.floors[ "1" ]; + } + if ( isDefined( force_starting_floor ) ) + { + elevator.body.force_starting_floor = force_starting_floor; + } + if ( isDefined( force_starting_origin ) ) + { + elevator.body.force_starting_origin_offset = force_starting_origin; + } + level thread elevator_think( elevator ); + level thread elevator_depart_early( elevator ); + level thread elevator_sparks_fx( elevator ); +/# + init_elevator_devgui( "bldg" + elevatorname, elevator ); +#/ +} + +elevator_roof_watcher() +{ + level endon( "end_game" ); + while ( 1 ) + { + self.trig waittill( "trigger", who ); + while ( isDefined( who ) && isplayer( who ) ) + { + while ( isDefined( who ) && who istouching( self.trig ) ) + { + if ( self.is_moving ) + { + self waittill_any( "movedone", "forcego" ); + } + zombies = getaiarray( level.zombie_team ); + if ( isDefined( zombies ) && zombies.size > 0 ) + { + _a535 = zombies; + _k535 = getFirstArrayKey( _a535 ); + while ( isDefined( _k535 ) ) + { + zombie = _a535[ _k535 ]; + climber = zombie zombie_for_elevator_unseen(); + if ( isDefined( climber ) ) + { + break; + } + _k535 = getNextArrayKey( _a535, _k535 ); + } + if ( isDefined( climber ) ) + { + zombie zombie_climb_elevator( self ); + wait randomint( 30 ); + } + } + wait 0,5; + } + } + wait 0,5; + } +} + +zombie_for_elevator_unseen() +{ + how_close = 600; + distance_squared_check = how_close * how_close; + zombie_seen = 0; + players = get_players(); + i = 0; + while ( i < players.size ) + { + can_be_seen = self maps/mp/zm_highrise_distance_tracking::player_can_see_me( players[ i ] ); + if ( can_be_seen || distancesquared( self.origin, players[ i ].origin ) < distance_squared_check ) + { + return undefined; + } + i++; + } + return self; +} + +zombie_climb_elevator( elev ) +{ + self endon( "death" ); + self endon( "removed" ); + self endon( "sonicBoom" ); + level endon( "intermission" ); + self notify( "stop_find_flesh" ); + self.dont_throw_gib = 1; + self.forcemovementscriptstate = 1; + self.attachent = elev; + self linkto( self.attachent, "tag_origin" ); + self.jumpingtoelev = 1; + animstate = "zm_traverse_elevator"; + anim_name = "zm_zombie_climb_elevator"; + tag_origin = self.attachent gettagorigin( "tag_origin" ); + tag_angles = self.attachent gettagangles( "tag_origin" ); + self animmode( "noclip" ); + self animscripted( tag_origin, tag_angles, animstate, anim_name ); + self maps/mp/animscripts/zm_shared::donotetracks( "traverse_anim" ); + self animmode( "gravity" ); + self.dont_throw_gib = 0; + self.jumpingtoelev = 0; + self.forcemovementscriptstate = 0; + self unlink(); + self setgoalpos( self.origin ); + self thread maps/mp/zombies/_zm_ai_basic::find_flesh(); +} + +elev_clean_up_corpses() +{ + corpses = getcorpsearray(); + zombies = getaiarray( level.zombie_team ); + while ( isDefined( corpses ) ) + { + i = 0; + while ( i < corpses.size ) + { + if ( corpses[ i ] istouching( self.trig ) ) + { + corpses[ i ] thread elev_remove_corpses(); + } + i++; + } + } + while ( isDefined( zombies ) ) + { + _a633 = zombies; + _k633 = getFirstArrayKey( _a633 ); + while ( isDefined( _k633 ) ) + { + zombie = _a633[ _k633 ]; + if ( zombie istouching( self.trig ) && zombie.health <= 0 ) + { + zombie thread elev_remove_corpses(); + } + _k633 = getNextArrayKey( _a633, _k633 ); + } + } +} + +elev_remove_corpses() +{ + playfx( level._effect[ "zomb_gib" ], self.origin ); + self delete(); +} + +elevator_next_floor( elevator, last, justchecking ) +{ + if ( isDefined( elevator.body.force_starting_floor ) ) + { + floor = elevator.body.force_starting_floor; + if ( !justchecking ) + { + elevator.body.force_starting_floor = undefined; + } + return floor; + } + if ( !isDefined( last ) ) + { + return 0; + } + if ( ( last + 1 ) < elevator.floors.size ) + { + return last + 1; + } + return 0; +} + +elevator_initial_wait( elevator, minwait, maxwait, delaybeforeleaving ) +{ + elevator.body endon( "forcego" ); + elevator.body waittill_any_or_timeout( randomintrange( minwait, maxwait ), "depart_early" ); + if ( !is_true( elevator.body.lock_doors ) ) + { + elevator.body setanim( level.perk_elevators_anims[ elevator.body.perk_type ][ 0 ] ); + } + if ( !is_true( elevator.body.departing_early ) ) + { + wait delaybeforeleaving; + } + if ( elevator.body.perk_type == "specialty_weapupgrade" ) + { + while ( flag( "pack_machine_in_use" ) ) + { + wait 0,5; + } + wait randomintrange( 1, 3 ); + } + while ( isDefined( level.elevators_stop ) || level.elevators_stop && isDefined( elevator.body.elevator_stop ) && elevator.body.elevator_stop ) + { + wait 0,05; + } +} + +elevator_set_moving( moving ) +{ + self.body.is_moving = moving; + if ( self.body is_pap() ) + { + level.pap_moving = moving; + } +} + +predict_floor( elevator, next, speed ) +{ + next = elevator_next_floor( elevator, next, 1 ); + if ( isDefined( elevator.floors[ "" + ( next + 1 ) ] ) ) + { + elevator.body.next_level = "" + ( next + 1 ); + } + else + { + start_location = 1; + elevator.body.next_level = "0"; + } + floor_stop = elevator.floors[ elevator.body.next_level ]; + floor_goal = undefined; + cur_level_start_pos = elevator.floors[ elevator.body.next_level ].starting_position; + start_level_start_pos = elevator.floors[ elevator.body.starting_floor ].starting_position; + if ( elevator.body.next_level == elevator.body.starting_floor || isDefined( cur_level_start_pos ) && isDefined( start_level_start_pos ) && cur_level_start_pos == start_level_start_pos ) + { + floor_goal = cur_level_start_pos; + } + else + { + floor_goal = floor_stop.origin; + } + dist = distance( elevator.body.origin, floor_goal ); + time = dist / speed; + if ( dist > 0 ) + { + if ( elevator.body.origin[ 2 ] > floor_goal[ 2 ] ) + { + clientnotify( elevator.name + "_d" ); + return; + } + else + { + clientnotify( elevator.name + "_u" ); + } + } +} + +elevator_think( elevator ) +{ + current_floor = elevator.body.current_location; + delaybeforeleaving = 5; + skipinitialwait = 0; + speed = 100; + minwait = 5; + maxwait = 20; + flag_wait( "perks_ready" ); + if ( isDefined( elevator.body.force_starting_floor ) ) + { + elevator.body.current_level = "" + elevator.body.force_starting_floor; + elevator.body.origin = elevator.floors[ elevator.body.current_level ].origin; + if ( isDefined( elevator.body.force_starting_origin_offset ) ) + { + elevator.body.origin += ( 0, 0, elevator.body.force_starting_origin_offset ); + } + } + elevator.body.can_move = 1; + elevator elevator_set_moving( 0 ); + elevator elevator_enable_paths( elevator.body.current_level ); + if ( elevator.body.perk_type == "vending_revive" ) + { + minwait = level.packapunch_timeout; + maxwait = minwait + 10; + elevator thread quick_revive_solo_watch(); + } + if ( elevator.body.perk_type == "vending_revive" && flag( "solo_game" ) ) + { + } + else + { + flag_wait( "power_on" ); + } + elevator.body perkelevatordoor( 1 ); + next = undefined; + while ( 1 ) + { + start_location = 0; + if ( isDefined( elevator.body.force_starting_floor ) ) + { + skipinitialwait = 1; + } + elevator.body.departing = 1; + if ( !is_true( elevator.body.lock_doors ) ) + { + elevator.body setanim( level.perk_elevators_anims[ elevator.body.perk_type ][ 1 ] ); + } + predict_floor( elevator, next, speed ); + if ( !is_true( skipinitialwait ) ) + { + elevator_initial_wait( elevator, minwait, maxwait, delaybeforeleaving ); + if ( !is_true( elevator.body.lock_doors ) ) + { + elevator.body setanim( level.perk_elevators_anims[ elevator.body.perk_type ][ 1 ] ); + } + } + next = elevator_next_floor( elevator, next, 0 ); + if ( isDefined( elevator.floors[ "" + ( next + 1 ) ] ) ) + { + elevator.body.next_level = "" + ( next + 1 ); + } + else + { + start_location = 1; + elevator.body.next_level = "0"; + } + floor_stop = elevator.floors[ elevator.body.next_level ]; + floor_goal = undefined; + cur_level_start_pos = elevator.floors[ elevator.body.next_level ].starting_position; + start_level_start_pos = elevator.floors[ elevator.body.starting_floor ].starting_position; + if ( elevator.body.next_level == elevator.body.starting_floor || isDefined( cur_level_start_pos ) && isDefined( start_level_start_pos ) && cur_level_start_pos == start_level_start_pos ) + { + floor_goal = cur_level_start_pos; + } + else + { + floor_goal = floor_stop.origin; + } + dist = distance( elevator.body.origin, floor_goal ); + time = dist / speed; + if ( dist > 0 ) + { + if ( elevator.body.origin[ 2 ] > floor_goal[ 2 ] ) + { + clientnotify( elevator.name + "_d" ); + break; + } + else + { + clientnotify( elevator.name + "_u" ); + } + } + if ( is_true( start_location ) ) + { + elevator.body thread squashed_death_alarm(); + if ( !skipinitialwait ) + { + wait 3; + } + } + skipinitialwait = 0; + elevator.body.current_level = elevator.body.next_level; + elevator notify( "floor_changed" ); + elevator elevator_disable_paths( elevator.body.current_level ); + elevator.body.departing = 0; + elevator elevator_set_moving( 1 ); + if ( dist > 0 ) + { + elevator.body moveto( floor_goal, time, time * 0,25, time * 0,25 ); + if ( isDefined( elevator.body.trig ) ) + { + elevator.body thread elev_clean_up_corpses(); + } + elevator.body thread elevator_move_sound(); + elevator.body waittill_any( "movedone", "forcego" ); + } + elevator elevator_set_moving( 0 ); + elevator elevator_enable_paths( elevator.body.current_level ); + if ( elevator.body.perk_type == "vending_revive" && !flag( "solo_game" ) && !flag( "power_on" ) ) + { + flag_wait( "power_on" ); + } + } +} + +is_pap() +{ + return self.perk_type == "specialty_weapupgrade"; +} + +squashed_death_alarm() +{ + if ( !is_true( self.squashed_death_alarm ) ) + { + self.squashed_death_alarm = 1; + alarm_origin = spawn( "script_origin", self squashed_death_alarm_nearest_point() ); + alarm_origin playloopsound( "amb_alarm_bell", 0,1 ); + self waittill_any( "movedone", "forcego" ); + alarm_origin delete(); + self.squashed_death_alarm = 0; + } +} + +squashed_death_alarm_nearest_point() +{ + positions = array( ( 1653, 2267, 3527 ), ( 1962, 1803, 3575 ), ( 1379, 1224, 3356 ), ( 3161, -35, 3032 ), ( 2745, -672, 3014 ), ( 2404, -754, 3019 ), ( 1381, -660, 2842 ) ); + closest = vectorScale( ( 0, 1, 0 ), 999999 ); + _a965 = positions; + _k965 = getFirstArrayKey( _a965 ); + while ( isDefined( _k965 ) ) + { + vector = _a965[ _k965 ]; + if ( distance2dsquared( self.origin, vector ) < distance2dsquared( self.origin, closest ) ) + { + closest = vector; + } + _k965 = getNextArrayKey( _a965, _k965 ); + } + return closest; +} + +elevator_move_sound() +{ + self playsound( "zmb_elevator_ding" ); + wait 0,4; + self playsound( "zmb_elevator_ding" ); + self playsound( "zmb_elevator_run_start" ); + self playloopsound( "zmb_elevator_run", 0,5 ); + self waittill( "movedone" ); + self stoploopsound( 0,5 ); + self playsound( "zmb_elevator_run_stop" ); + self playsound( "zmb_elevator_ding" ); +} + +init_elevator_perks() +{ + level.elevator_perks = []; + level.elevator_perks_building = []; + level.elevator_perks_building[ "green" ] = []; + level.elevator_perks_building[ "blue" ] = []; + level.elevator_perks_building[ "green" ][ 0 ] = spawnstruct(); + level.elevator_perks_building[ "green" ][ 0 ].model = "zombie_vending_revive"; + level.elevator_perks_building[ "green" ][ 0 ].script_noteworthy = "specialty_quickrevive"; + level.elevator_perks_building[ "green" ][ 0 ].turn_on_notify = "revive_on"; + a = 1; + b = 2; + if ( randomint( 100 ) > 50 ) + { + a = 2; + b = 1; + } + level.elevator_perks_building[ "green" ][ a ] = spawnstruct(); + level.elevator_perks_building[ "green" ][ a ].model = "p6_zm_vending_chugabud"; + level.elevator_perks_building[ "green" ][ a ].script_noteworthy = "specialty_finalstand"; + level.elevator_perks_building[ "green" ][ a ].turn_on_notify = "chugabud_on"; + level.elevator_perks_building[ "green" ][ b ] = spawnstruct(); + level.elevator_perks_building[ "green" ][ b ].model = "zombie_vending_sleight"; + level.elevator_perks_building[ "green" ][ b ].script_noteworthy = "specialty_fastreload"; + level.elevator_perks_building[ "green" ][ b ].turn_on_notify = "sleight_on"; + level.elevator_perks_building[ "blue" ][ 0 ] = spawnstruct(); + level.elevator_perks_building[ "blue" ][ 0 ].model = "zombie_vending_three_gun"; + level.elevator_perks_building[ "blue" ][ 0 ].script_noteworthy = "specialty_additionalprimaryweapon"; + level.elevator_perks_building[ "blue" ][ 0 ].turn_on_notify = "specialty_additionalprimaryweapon_power_on"; + level.elevator_perks_building[ "blue" ][ 1 ] = spawnstruct(); + level.elevator_perks_building[ "blue" ][ 1 ].model = "zombie_vending_jugg"; + level.elevator_perks_building[ "blue" ][ 1 ].script_noteworthy = "specialty_armorvest"; + level.elevator_perks_building[ "blue" ][ 1 ].turn_on_notify = "juggernog_on"; + level.elevator_perks_building[ "blue" ][ 2 ] = spawnstruct(); + level.elevator_perks_building[ "blue" ][ 2 ].model = "zombie_vending_doubletap2"; + level.elevator_perks_building[ "blue" ][ 2 ].script_noteworthy = "specialty_rof"; + level.elevator_perks_building[ "blue" ][ 2 ].turn_on_notify = "doubletap_on"; + level.elevator_perks_building[ "blue" ][ 3 ] = spawnstruct(); + level.elevator_perks_building[ "blue" ][ 3 ].model = "p6_anim_zm_buildable_pap"; + level.elevator_perks_building[ "blue" ][ 3 ].script_noteworthy = "specialty_weapupgrade"; + level.elevator_perks_building[ "blue" ][ 3 ].turn_on_notify = "Pack_A_Punch_on"; + players_expected = getnumexpectedplayers(); + level.override_perk_targetname = "zm_perk_machine_override"; + level.elevator_perks_building[ "blue" ] = array_randomize( level.elevator_perks_building[ "blue" ] ); + level.elevator_perks = arraycombine( level.elevator_perks_building[ "green" ], level.elevator_perks_building[ "blue" ], 0, 0 ); + random_perk_structs = []; + revive_perk_struct = getstruct( "force_quick_revive", "targetname" ); + revive_perk_struct = getstruct( revive_perk_struct.target, "targetname" ); + perk_structs = getstructarray( "zm_random_machine", "script_noteworthy" ); + i = 0; + while ( i < perk_structs.size ) + { + random_perk_structs[ i ] = getstruct( perk_structs[ i ].target, "targetname" ); + random_perk_structs[ i ].script_parameters = perk_structs[ i ].script_parameters; + random_perk_structs[ i ].script_linkent = getent( "elevator_" + perk_structs[ i ].script_parameters + "_body", "targetname" ); + i++; + } + green_structs = []; + blue_structs = []; + _a1075 = random_perk_structs; + _k1075 = getFirstArrayKey( _a1075 ); + while ( isDefined( _k1075 ) ) + { + perk_struct = _a1075[ _k1075 ]; + if ( isDefined( perk_struct.script_parameters ) ) + { + if ( issubstr( perk_struct.script_parameters, "bldg1" ) ) + { + green_structs[ green_structs.size ] = perk_struct; + break; + } + else + { + blue_structs[ blue_structs.size ] = perk_struct; + } + } + _k1075 = getNextArrayKey( _a1075, _k1075 ); + } + green_structs = array_exclude( green_structs, revive_perk_struct ); + green_structs = array_randomize( green_structs ); + blue_structs = array_randomize( blue_structs ); + level.random_perk_structs = array( revive_perk_struct ); + level.random_perk_structs = arraycombine( level.random_perk_structs, green_structs, 0, 0 ); + level.random_perk_structs = arraycombine( level.random_perk_structs, blue_structs, 0, 0 ); + i = 0; + while ( i < level.elevator_perks.size ) + { + if ( !isDefined( level.random_perk_structs[ i ] ) ) + { + i++; + continue; + } + else + { + level.random_perk_structs[ i ].targetname = "zm_perk_machine_override"; + level.random_perk_structs[ i ].model = level.elevator_perks[ i ].model; + level.random_perk_structs[ i ].script_noteworthy = level.elevator_perks[ i ].script_noteworthy; + level.random_perk_structs[ i ].turn_on_notify = level.elevator_perks[ i ].turn_on_notify; + if ( !isDefined( level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] ) ) + { + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ] = []; + } + level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ][ level.struct_class_names[ "targetname" ][ "zm_perk_machine_override" ].size ] = level.random_perk_structs[ i ]; + } + i++; + } +} + +random_elevator_perks() +{ + perks = array( "vending_additionalprimaryweapon", "vending_revive", "vending_chugabud", "vending_jugg", "vending_doubletap", "vending_sleight" ); + _a1127 = perks; + _k1127 = getFirstArrayKey( _a1127 ); + while ( isDefined( _k1127 ) ) + { + perk = _a1127[ _k1127 ]; + machine = getent( perk, "targetname" ); + trigger = getent( perk, "target" ); + if ( !isDefined( machine ) || !isDefined( trigger ) ) + { + } + else + { + elevator = machine get_perk_elevator(); + trigger enablelinkto(); + trigger linkto( machine ); + if ( isDefined( trigger.clip ) ) + { + trigger.clip delete(); + } + if ( isDefined( trigger.bump ) ) + { + trigger.bump enablelinkto(); + trigger.bump linkto( machine ); + } + if ( isDefined( elevator ) ) + { + elevator.perk_type = perk; + elevator elevator_perk_offset( machine, perk ); + machine linkto( elevator ); + machine._linked_ent = elevator; + machine._linked_ent_moves = 1; + machine._linked_ent_offset = machine.origin - elevator.origin; + if ( perk == "vending_revive" ) + { + level.quick_revive_linked_ent = elevator; + level.quick_revive_linked_ent_moves = 1; + level.quick_revive_linked_ent_offset = machine._linked_ent_offset; + } + level thread debugline( machine, elevator ); + } + } + _k1127 = getNextArrayKey( _a1127, _k1127 ); + } + trigger = getent( "specialty_weapupgrade", "script_noteworthy" ); + if ( isDefined( trigger ) ) + { + machine = getent( trigger.target, "targetname" ); + elevator = machine get_perk_elevator(); + trigger enablelinkto(); + trigger linkto( machine ); + if ( isDefined( trigger.clip ) ) + { + trigger.clip delete(); + } + if ( isDefined( elevator ) ) + { + elevator.perk_type = "specialty_weapupgrade"; + machine linkto( elevator ); + level thread debugline( machine, elevator ); + } + } + flag_set( "perks_ready" ); +} + +elevator_perk_offset( machine, perk ) +{ + scale = 14; + switch( perk ) + { + case "vending_revive": + scale = 10; + break; + case "vending_additionalprimaryweapon": + scale = 8; + break; + case "vending_jugg": + scale = 6; + break; + case "vending_doubletap": + scale = 5; + break; + case "vending_chugabud": + scale = -3; + break; + case "vending_packapunch": + scale = 0; + break; + } + if ( scale == 0 ) + { + return; + } + forward = anglesToForward( self.angles ); + machine.origin -= forward * scale; +} + +debugline( ent1, ent2 ) +{ +/# + org = ent2.origin; + while ( 1 ) + { + if ( !isDefined( ent1 ) ) + { + return; + } + line( ent1.origin, org, ( 0, 1, 0 ) ); + wait 0,05; +#/ + } +} + +get_perk_elevator() +{ + arraylist = level.random_perk_structs; + x = 0; + while ( x < arraylist.size ) + { + struct = arraylist[ x ]; + if ( isDefined( struct.script_noteworthy ) && isDefined( self.targetname ) ) + { + nw = struct.script_noteworthy; + tn = self.targetname; + if ( nw == "specialty_quickrevive" && tn != "vending_revive" && nw == "specialty_fastreload" && tn != "vending_sleight" && nw == "specialty_rof" && tn != "vending_doubletap" && nw == "specialty_armorvest" && tn != "vending_jugg" && nw == "specialty_finalstand" && tn != "vending_chugabud" && nw == "specialty_additionalprimaryweapon" || tn == "vending_additionalprimaryweapon" && nw == "specialty_weapupgrade" && tn == "vending_packapunch" ) + { + if ( isDefined( struct.script_linkent ) ) + { + return struct.script_linkent; + } + } + } + x++; + } + return undefined; +} + +elevator_depart_early( elevator ) +{ + touchent = elevator.body; + if ( isDefined( elevator.body.trig ) ) + { + touchent = elevator.body.trig; + } + while ( 1 ) + { + while ( is_true( elevator.body.is_moving ) ) + { + wait 0,5; + } + someone_touching_elevator = 0; + players = get_players(); + _a1321 = players; + _k1321 = getFirstArrayKey( _a1321 ); + while ( isDefined( _k1321 ) ) + { + player = _a1321[ _k1321 ]; + if ( player istouching( touchent ) ) + { + someone_touching_elevator = 1; + } + _k1321 = getNextArrayKey( _a1321, _k1321 ); + } + if ( is_true( someone_touching_elevator ) ) + { + someone_still_touching_elevator = 0; + wait 5; + players = get_players(); + _a1336 = players; + _k1336 = getFirstArrayKey( _a1336 ); + while ( isDefined( _k1336 ) ) + { + player = _a1336[ _k1336 ]; + if ( player istouching( touchent ) ) + { + someone_still_touching_elevator = 1; + } + _k1336 = getNextArrayKey( _a1336, _k1336 ); + } + if ( is_true( someone_still_touching_elevator ) ) + { + elevator.body.departing_early = 1; + elevator.body notify( "depart_early" ); + wait 3; + elevator.body.departing_early = 0; + } + } + wait 1; + } +} + +elevator_sparks_fx( elevator ) +{ + while ( 1 ) + { + while ( !is_true( elevator.body.door_state ) ) + { + wait 1; + } + if ( is_true( elevator.body.departing ) ) + { + playfxontag( level._effect[ "perk_elevator_departing" ], elevator.body, "tag_origin" ); + } + else + { + playfxontag( level._effect[ "perk_elevator_idle" ], elevator.body, "tag_origin" ); + } + wait 0,5; + } +} + +faller_location_logic() +{ + wait 1; + faller_spawn_points = getstructarray( "faller_location", "script_noteworthy" ); + leaper_spawn_points = getstructarray( "leaper_location", "script_noteworthy" ); + spawn_points = arraycombine( faller_spawn_points, leaper_spawn_points, 1, 0 ); + dist_check = 16384; + elevator_names = getarraykeys( level.elevators ); + elevators = []; + i = 0; + while ( i < elevator_names.size ) + { + elevators[ i ] = getent( "elevator_" + elevator_names[ i ] + "_body", "targetname" ); + i++; + } + elevator_volumes = []; + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1b", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1c", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1d", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3a", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3b", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3c", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3d", "targetname" ); + level.elevator_volumes = elevator_volumes; + while ( 1 ) + { + _a1409 = spawn_points; + _k1409 = getFirstArrayKey( _a1409 ); + while ( isDefined( _k1409 ) ) + { + point = _a1409[ _k1409 ]; + should_block = 0; + _a1412 = elevators; + _k1412 = getFirstArrayKey( _a1412 ); + while ( isDefined( _k1412 ) ) + { + elevator = _a1412[ _k1412 ]; + if ( distancesquared( elevator.origin, point.origin ) <= dist_check ) + { + should_block = 1; + } + _k1412 = getNextArrayKey( _a1412, _k1412 ); + } + if ( should_block ) + { + point.is_enabled = 0; + point.is_blocked = 1; + } + else if ( isDefined( point.is_blocked ) && point.is_blocked ) + { + point.is_blocked = 0; + } + if ( !isDefined( point.zone_name ) ) + { + } + else + { + zone = level.zones[ point.zone_name ]; + if ( zone.is_enabled && zone.is_active && zone.is_spawning_allowed ) + { + point.is_enabled = 1; + } + } + _k1409 = getNextArrayKey( _a1409, _k1409 ); + } + players = get_players(); + _a1441 = elevator_volumes; + _k1441 = getFirstArrayKey( _a1441 ); + while ( isDefined( _k1441 ) ) + { + volume = _a1441[ _k1441 ]; + should_disable = 0; + _a1444 = players; + _k1444 = getFirstArrayKey( _a1444 ); + while ( isDefined( _k1444 ) ) + { + player = _a1444[ _k1444 ]; + if ( is_player_valid( player ) ) + { + if ( player istouching( volume ) ) + { + should_disable = 1; + } + } + _k1444 = getNextArrayKey( _a1444, _k1444 ); + } + if ( should_disable ) + { + disable_elevator_spawners( volume, spawn_points ); + } + _k1441 = getNextArrayKey( _a1441, _k1441 ); + } + wait 0,5; + } +} + +disable_elevator_spawners( volume, spawn_points ) +{ + _a1468 = spawn_points; + _k1468 = getFirstArrayKey( _a1468 ); + while ( isDefined( _k1468 ) ) + { + point = _a1468[ _k1468 ]; + if ( isDefined( point.name ) && point.name == volume.targetname ) + { + point.is_enabled = 0; + } + _k1468 = getNextArrayKey( _a1468, _k1468 ); + } +} + +shouldsuppressgibs() +{ + elevator_volumes = []; + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1b", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1c", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_1d", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3a", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3b", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3c", "targetname" ); + elevator_volumes[ elevator_volumes.size ] = getent( "elevator_3d", "targetname" ); + while ( 1 ) + { + zombies = get_round_enemy_array(); + while ( isDefined( zombies ) ) + { + _a1494 = zombies; + _k1494 = getFirstArrayKey( _a1494 ); + while ( isDefined( _k1494 ) ) + { + zombie = _a1494[ _k1494 ]; + shouldnotgib = 0; + _a1500 = elevator_volumes; + _k1500 = getFirstArrayKey( _a1500 ); + while ( isDefined( _k1500 ) ) + { + zone = _a1500[ _k1500 ]; + if ( is_true( shouldnotgib ) ) + { + } + else + { + if ( zombie istouching( zone ) ) + { + shouldnotgib = 1; + } + } + _k1500 = getNextArrayKey( _a1500, _k1500 ); + } + zombie.dont_throw_gib = shouldnotgib; + _k1494 = getNextArrayKey( _a1494, _k1494 ); + } + } + wait randomfloatrange( 0,5, 1,5 ); + } +} + +watch_for_elevator_during_faller_spawn() +{ + self endon( "death" ); + self endon( "risen" ); + self endon( "spawn_anim" ); + while ( 1 ) + { + should_gib = 0; + _a1531 = level.elevators; + _k1531 = getFirstArrayKey( _a1531 ); + while ( isDefined( _k1531 ) ) + { + elevator = _a1531[ _k1531 ]; + if ( self istouching( elevator.body ) ) + { + should_gib = 1; + } + _k1531 = getNextArrayKey( _a1531, _k1531 ); + } + if ( should_gib ) + { + playfx( level._effect[ "zomb_gib" ], self.origin ); + if ( isDefined( self.has_been_damaged_by_player ) && !self.has_been_damaged_by_player && isDefined( self.is_leaper ) && !self.is_leaper ) + { + level.zombie_total++; + } + if ( isDefined( self.is_leaper ) && self.is_leaper ) + { + self maps/mp/zombies/_zm_ai_leaper::leaper_cleanup(); + self dodamage( self.health + 100, self.origin ); + } + else + { + self delete(); + } + return; + } + else + { + wait 0,1; + } + } +} + +init_elevator_devgui( elevatorname, elevator ) +{ +/# + if ( !isDefined( elevatorname ) ) + { + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Elevators:1/Stop All:1" "set zombie_devgui_hrelevatorstop all" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Elevators:1/Unstop All:2" "set zombie_devgui_hrelevatorgo all" \n" ); + level thread watch_elevator_devgui( "all", 1 ); + } + else + { + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Elevators:1/" + elevatorname + "/Stop:1" "set zombie_devgui_hrelevatorstop " + elevatorname + "" \n" ); + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Elevators:1/" + elevatorname + "/Go:2" "set zombie_devgui_hrelevatorgo " + elevatorname + "" \n" ); + i = 0; + while ( i < elevator.floors.size ) + { + fname = elevator.floors[ "" + i ].script_location; + adddebugcommand( "devgui_cmd "Zombies:1/Highrise:15/Elevators:1/" + elevatorname + "/stop " + i + " [floor " + fname + "]" "set zombie_devgui_hrelevatorfloor " + i + "; set zombie_devgui_hrelevatorgo " + elevatorname + "" \n" ); + i++; + } + elevator thread watch_elevator_devgui( elevatorname, 0 ); + elevator thread show_elevator_floor( elevatorname ); +#/ + } +} + +watch_elevator_devgui( name, global ) +{ +/# + while ( 1 ) + { + stopcmd = getDvar( "zombie_devgui_hrelevatorstop" ); + if ( isDefined( stopcmd ) && stopcmd == name ) + { + if ( global ) + { + level.elevators_stop = 1; + } + else + { + if ( isDefined( self ) ) + { + self.body.elevator_stop = 1; + } + } + setdvar( "zombie_devgui_hrelevatorstop", "" ); + } + gofloor = getDvarInt( "zombie_devgui_hrelevatorfloor" ); + gocmd = getDvar( "zombie_devgui_hrelevatorgo" ); + if ( isDefined( gocmd ) && gocmd == name ) + { + if ( global ) + { + level.elevators_stop = 0; + } + else + { + if ( isDefined( self ) ) + { + self.body.elevator_stop = 0; + if ( gofloor >= 0 ) + { + self.body.force_starting_floor = gofloor; + } + self.body notify( "forcego" ); + } + } + setdvar( "zombie_devgui_hrelevatorfloor", "-1" ); + setdvar( "zombie_devgui_hrelevatorgo", "" ); + } + wait 1; +#/ + } +} + +show_elevator_floor( name ) +{ +/# + while ( 1 ) + { + if ( getDvarInt( #"B67910B4" ) ) + { + floor = 0; + forced = isDefined( self.body.force_starting_floor ); + color = vectorScale( ( 0, 1, 0 ), 0,7 ); + if ( forced ) + { + color = ( 0,7, 0,3, 0 ); + } + if ( isDefined( level.elevators_stop ) || level.elevators_stop && isDefined( self.body.elevator_stop ) && self.body.elevator_stop ) + { + if ( forced ) + { + color = vectorScale( ( 0, 1, 0 ), 0,7 ); + } + else + { + color = vectorScale( ( 0, 1, 0 ), 0,7 ); + } + } + else + { + if ( self.body.is_moving ) + { + if ( forced ) + { + color = vectorScale( ( 0, 1, 0 ), 0,7 ); + break; + } + else + { + color = vectorScale( ( 0, 1, 0 ), 0,7 ); + } + } + } + if ( isDefined( self.body.current_level ) ) + { + floor = self.body.current_level; + } + text = "elv " + name + " stop " + self.body.current_level + " floor " + self.floors[ self.body.current_level ].script_location; + pos = self.body.origin; + print3d( pos, text, color, 1, 0,75, 1 ); + } + wait 0,05; +#/ + } +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_ffotd.gsc b/zm_highrise_patch/maps/mp/zm_highrise_ffotd.gsc new file mode 100644 index 0000000..fd28b2e --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_ffotd.gsc @@ -0,0 +1,195 @@ +#include maps/mp/zombies/_zm_weapons; +#include maps/mp/zombies/_zm_zonemgr; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +main_start() +{ + level thread spawned_collision_ffotd(); + level thread eject_player_trigger_init(); + level thread change_bad_spawner(); +} + +main_end() +{ + level thread eject_player_trigger(); +} + +spawned_collision_ffotd() +{ + precachemodel( "collision_wall_32x32x10_standard" ); + flag_wait( "start_zombie_round_logic" ); + if ( !is_true( level.optimise_for_splitscreen ) ) + { + collision1 = spawn( "script_model", ( 2044, 499, 2893 ) ); + collision1 setmodel( "collision_wall_32x32x10_standard" ); + collision1.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision1 ghost(); + collision2 = spawn( "script_model", ( 2044, 499, 2925 ) ); + collision2 setmodel( "collision_wall_32x32x10_standard" ); + collision2.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision2 ghost(); + collision3 = spawn( "script_model", ( 1768, 1507, 3075 ) ); + collision3 setmodel( "collision_wall_256x256x10_standard" ); + collision3.angles = ( 0, 0, 0 ); + collision3 ghost(); + collision3b = spawn( "script_model", ( 1740, 1497, 3075 ) ); + collision3b setmodel( "collision_wall_256x256x10_standard" ); + collision3b.angles = ( 0, 0, 0 ); + collision3b ghost(); + collision3 = spawn( "script_model", ( 2054, 1455, 3440 ) ); + collision3 setmodel( "collision_wall_128x128x10_standard" ); + collision3.angles = ( 0, 0, 0 ); + collision3 ghost(); + collision4 = spawn( "script_model", ( 2257, 2374, 3101 ) ); + collision4 setmodel( "collision_wall_256x256x10_standard" ); + collision4.angles = vectorScale( ( 0, 0, 0 ), 270 ); + collision4 ghost(); + collision5 = spawn( "script_model", ( 3076, 1598, 2791 ) ); + collision5 setmodel( "collision_wall_256x256x10_standard" ); + collision5.angles = vectorScale( ( 0, 0, 0 ), 347,6 ); + collision5 ghost(); + collision6b = spawn( "script_model", ( 3693, 1840, 1897 ) ); + collision6b setmodel( "collision_wall_256x256x10_standard" ); + collision6b.angles = ( 0, 270, 12 ); + collision6b ghost(); + collision6c = spawn( "script_model", ( 3666, 1840, 2023 ) ); + collision6c setmodel( "collision_wall_256x256x10_standard" ); + collision6c.angles = ( 0, 270, 12 ); + collision6c ghost(); + collision7 = spawn( "script_model", ( 2157, 839, 3129 ) ); + collision7 setmodel( "collision_wall_128x128x10_standard" ); + collision7.angles = ( 0, 9,79996, -90 ); + collision7 ghost(); + collision7 = spawn( "script_model", ( 3594, 1708, 2247 ) ); + collision7 setmodel( "collision_wall_128x128x10_standard" ); + collision7.angles = ( 0, 270, 12 ); + collision7 ghost(); + } +} + +eject_player_trigger_init() +{ + trig1 = spawn( "trigger_box", ( 3172, 1679, 1296,09 ), 0, 64, 10, 64 ); + trig1.angles = ( 0, 0, 0 ); + trig1.targetname = "eject_player_pos"; + trig1.point = spawn( "script_origin", ( 3266, 1703,5, 1325 ) ); + trig2 = spawn( "trigger_box", ( 3225,5, 1153, 1346,48 ), 0, 64, 10, 64 ); + trig2.angles = ( 0, 0, 0 ); + trig2.targetname = "eject_player_pos"; + trig2.point = spawn( "script_origin", ( 3074, 1137,5, 1282,26 ) ); + trig3 = spawn( "trigger_radius", ( 3583, 1964, 2751,95 ), 0, 30, 64 ); + trig3.angles = ( 0, 0, 0 ); + trig3.targetname = "eject_player_pos"; + trig3.point = spawn( "script_origin", ( 3590,2, 2068, 2720,34 ) ); +} + +eject_player_trigger() +{ + trigs = getentarray( "eject_player_pos", "targetname" ); + array_thread( trigs, ::player_eject_watcher ); +} + +player_eject_watcher() +{ + time = 0; + while ( 1 ) + { + self waittill( "trigger", who ); + if ( is_player_valid( who ) ) + { + while ( who istouching( self ) ) + { + time++; + if ( time >= 6 ) + { + if ( isDefined( self.point ) ) + { + if ( !positionwouldtelefrag( self.point.origin ) ) + { + who setorigin( self.point.origin ); + who playlocalsound( level.zmb_laugh_alias ); + who playrumbleonentity( "damage_light" ); + earthquake( 0,5, 0,5, who.origin, 100 ); + who thread ejected_overrun( self ); + } + } + } + wait 1; + } + time = 0; + } + wait 0,1; + } +} + +ejected_overrun( trig ) +{ + if ( !isDefined( trig.ejected ) ) + { + trig.ejected = 1; + } + else + { + trig.ejected++; + if ( trig.ejected >= 3 ) + { + primaries = self getweaponslistprimaries(); + _a169 = primaries; + _k169 = getFirstArrayKey( _a169 ); + while ( isDefined( _k169 ) ) + { + weapon = _a169[ _k169 ]; + self takeweapon( weapon ); + _k169 = getNextArrayKey( _a169, _k169 ); + } + lethal = self get_player_lethal_grenade(); + if ( isDefined( lethal ) && lethal != "" ) + { + self takeweapon( lethal ); + maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( lethal ); + } + tactical = self get_player_tactical_grenade(); + if ( isDefined( tactical ) && tactical != "" ) + { + self takeweapon( tactical ); + maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( tactical ); + } + mine = self get_player_placeable_mine(); + if ( isDefined( mine ) ) + { + self takeweapon( mine ); + maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( mine ); + } + melee_weapon = self get_player_melee_weapon(); + if ( isDefined( melee_weapon ) ) + { + self takeweapon( melee_weapon ); + maps/mp/zombies/_zm_weapons::unacquire_weapon_toggle( melee_weapon ); + } + self giveweapon( "knife_zm" ); + self.current_melee_weapon = "knife_zm"; + self give_start_weapon( 1 ); + self.currentweapon = "m1911_zm"; + } + } +} + +change_bad_spawner() +{ + flag_wait( "always_on" ); + spawner_array = getstructarray( "zone_blue_level4a_spawners", "targetname" ); + _a214 = spawner_array; + _k214 = getFirstArrayKey( _a214 ); + while ( isDefined( _k214 ) ) + { + struct = _a214[ _k214 ]; + if ( isDefined( struct.origin ) && struct.origin == ( 2154, 748,5, 1312 ) ) + { + struct.script_noteworthy = "riser_location"; + return; + } + _k214 = getNextArrayKey( _a214, _k214 ); + } +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_fx.gsc b/zm_highrise_patch/maps/mp/zm_highrise_fx.gsc new file mode 100644 index 0000000..766a02b --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_fx.gsc @@ -0,0 +1,114 @@ +#include maps/mp/_utility; + +#using_animtree( "fxanim_props" ); + +main() +{ + precache_createfx_fx(); + precache_scripted_fx(); + precache_fxanim_props(); + maps/mp/createfx/zm_highrise_fx::main(); +} + +precache_scripted_fx() +{ + level._effect[ "switch_sparks" ] = loadfx( "maps/zombie/fx_zmb_pswitch_spark" ); + level._effect[ "zapper_light_ready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_green" ); + level._effect[ "zapper_light_notready" ] = loadfx( "maps/zombie/fx_zombie_zapper_light_red" ); + level._effect[ "lght_marker" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker" ); + level._effect[ "pandora_box_inverted" ] = loadfx( "maps/zombie/fx_zmb_highrise_marker" ); + level._effect[ "lght_marker_flare" ] = loadfx( "maps/zombie/fx_zmb_tranzit_marker_fl" ); + level._effect[ "poltergeist" ] = loadfx( "misc/fx_zombie_couch_effect" ); + level._effect[ "zomb_gib" ] = loadfx( "maps/zombie/fx_zmb_tranzit_lava_torso_explo" ); + level._effect[ "elec_md" ] = loadfx( "electrical/fx_elec_player_md" ); + level._effect[ "elec_sm" ] = loadfx( "electrical/fx_elec_player_sm" ); + level._effect[ "elec_torso" ] = loadfx( "electrical/fx_elec_player_torso" ); + level._effect[ "blue_eyes" ] = loadfx( "maps/zombie/fx_zombie_eye_single_blue" ); + level._effect[ "elevator_tell" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_tell" ); + level._effect[ "elevator_sparks" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_sparks" ); + level._effect[ "elevator_impact" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_impact" ); + level._effect[ "elevator_glint" ] = loadfx( "maps/zombie_highrise/fx_highrise_key_glint" ); + level._effect[ "elevator_light" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_light" ); + level._effect[ "perk_elevator_idle" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_perk_slow" ); + level._effect[ "perk_elevator_departing" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_perk_fast" ); + level._effect[ "perk_elevator_indicator_up" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_arrow_up" ); + level._effect[ "perk_elevator_indicator_down" ] = loadfx( "maps/zombie_highrise/fx_highrise_elevator_arrow_down" ); + level._effect[ "sidequest_dragon_spark_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_spark_max" ); + level._effect[ "sidequest_dragon_fireball_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_fireball_max" ); + level._effect[ "sidequest_dragon_spark_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_spark_ric" ); + level._effect[ "sidequest_dragon_fireball_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_fireball_ric" ); + level._effect[ "sidequest_flash" ] = loadfx( "maps/zombie_highrise/fx_highrise_sq_flash" ); + level._effect[ "sidequest_tower_bolts" ] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_tower_bolts" ); +} + +precache_createfx_fx() +{ + level._effect[ "fx_highrise_cloud_lg_single" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_single" ); + level._effect[ "fx_highrise_cloud_lg_flat" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_flat" ); + level._effect[ "fx_highrise_cloud_lg_left" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_left" ); + level._effect[ "fx_highrise_cloud_lg_right" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_lg_right" ); + level._effect[ "fx_highrise_cloud_sm_bottom" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_sm_bottom" ); + level._effect[ "fx_highrise_cloud_sm_right" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_sm_right" ); + level._effect[ "fx_highrise_cloud_bend_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_bend_sm" ); + level._effect[ "fx_highrise_cloud_bend_01" ] = loadfx( "maps/zombie_highrise/fx_highrise_cloud_bend_01" ); + level._effect[ "fx_highrise_meteor_lg_bottom" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_bottom" ); + level._effect[ "fx_highrise_meteor_lg_top" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_top" ); + level._effect[ "fx_highrise_meteor_lg_top2" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_lg_top2" ); + level._effect[ "fx_highrise_meteor_sm_top" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_sm_top" ); + level._effect[ "fx_highrise_meteor_sm_horizon" ] = loadfx( "maps/zombie_highrise/fx_highrise_meteor_sm_horizon" ); + level._effect[ "fx_lf_zmb_highrise_sun" ] = loadfx( "lens_flares/fx_lf_zmb_highrise_sun" ); + level._effect[ "fx_zmb_flies" ] = loadfx( "maps/zombie/fx_zmb_flies" ); + level._effect[ "fx_zmb_tranzit_fire_med" ] = loadfx( "maps/zombie/fx_zmb_tranzit_fire_med" ); + level._effect[ "fx_highrise_ash_rising_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_ash_rising_md" ); + level._effect[ "fx_highrise_bld_crumble_runner" ] = loadfx( "maps/zombie_highrise/fx_highrise_bld_crumble_runner" ); + level._effect[ "fx_highrise_ceiling_dust_md_runner" ] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_md_runner" ); + level._effect[ "fx_highrise_ceiling_dust_sm_runner" ] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_sm_runner" ); + level._effect[ "fx_highrise_ceiling_dust_edge_100" ] = loadfx( "maps/zombie_highrise/fx_highrise_ceiling_dust_edge_100" ); + level._effect[ "fx_highrise_edge_crumble_ext" ] = loadfx( "maps/zombie_highrise/fx_highrise_edge_crumble_ext" ); + level._effect[ "fx_highrise_point_crumble_ext" ] = loadfx( "maps/zombie_highrise/fx_highrise_point_crumble_ext" ); + level._effect[ "fx_highrise_wire_spark" ] = loadfx( "maps/zombie_highrise/fx_highrise_wire_spark" ); + level._effect[ "fx_highrise_water_drip_fast" ] = loadfx( "maps/zombie_highrise/fx_highrise_water_drip_fast" ); + level._effect[ "fx_highrise_haze_int_med" ] = loadfx( "maps/zombie_highrise/fx_highrise_haze_int_med" ); + level._effect[ "fx_highrise_fire_distant" ] = loadfx( "maps/zombie_highrise/fx_highrise_fire_distant" ); + level._effect[ "fx_highrise_smk_plume_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_sm" ); + level._effect[ "fx_highrise_smk_plume_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_md" ); + level._effect[ "fx_highrise_smk_plume_xlg" ] = loadfx( "maps/zombie_highrise/fx_highrise_smk_plume_xlg" ); + level._effect[ "fx_highrise_moon" ] = loadfx( "maps/zombie_highrise/fx_highrise_moon" ); + level._effect[ "fx_highrise_god_ray_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_sm" ); + level._effect[ "fx_highrise_god_ray_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_md" ); + level._effect[ "fx_highrise_god_ray_cool_sm" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_cool_sm" ); + level._effect[ "fx_highrise_god_ray_cool_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_god_ray_cool_md" ); + level._effect[ "fx_highrise_light_bulb" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_bulb" ); + level._effect[ "fx_highrise_light_build_lamp" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_build_lamp" ); + level._effect[ "fx_highrise_light_fluorescent" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent" ); + level._effect[ "fx_highrise_light_fluorescent_wall" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent_wall" ); + level._effect[ "fx_highrise_light_fluorescent_wal2" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_fluorescent_wal2" ); + level._effect[ "fx_highrise_light_recessed" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed" ); + level._effect[ "fx_highrise_light_recessed_md" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_md" ); + level._effect[ "fx_highrise_light_recessed_tall" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_tall" ); + level._effect[ "fx_highrise_light_recessed_tiny" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_recessed_tiny" ); + level._effect[ "fx_highrise_light_mall" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_mall" ); + level._effect[ "fx_highrise_light_lantern_red" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_lantern_red" ); + level._effect[ "fx_highrise_light_lantern_yel" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_lantern_yel" ); + level._effect[ "fx_highrise_light_sconce_glow" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_sconce_glow" ); + level._effect[ "fx_highrise_light_sconce_beam" ] = loadfx( "maps/zombie_highrise/fx_highrise_light_sconce_beam" ); + level._effect[ "fx_highrise_dragon_breath_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_breath_max" ); + level._effect[ "fx_highrise_dragon_tower_absorb_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_absorb_max" ); + level._effect[ "fx_highrise_dragon_tower_glow_max" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_glow_max" ); + level._effect[ "fx_highrise_sidequest_complete" ] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete" ); + level._effect[ "fx_highrise_dragon_breath_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_breath_ric" ); + level._effect[ "fx_highrise_dragon_tower_absorb_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_absorb_ric" ); + level._effect[ "fx_highrise_dragon_tower_glow_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_dragon_tower_glow_ric" ); + level._effect[ "fx_highrise_sidequest_complete_ric" ] = loadfx( "maps/zombie_highrise/fx_highrise_sidequest_complete_ric" ); +} + +precache_fxanim_props() +{ + level.scr_anim[ "fxanim_props" ][ "wirespark_med_lrg" ] = %fxanim_gp_wirespark_med_lrg_anim; + level.scr_anim[ "fxanim_props" ][ "wirespark_long_lrg" ] = %fxanim_gp_wirespark_long_lrg_anim; + level.scr_anim[ "fxanim_props" ][ "roaches" ] = %fxanim_gp_roaches_anim; + level.scr_anim[ "fxanim_props" ][ "dragon_a" ] = %fxanim_zom_highrise_dragon_a_anim; + level.scr_anim[ "fxanim_props" ][ "dragon_b" ] = %fxanim_zom_highrise_dragon_b_anim; + level.scr_anim[ "fxanim_props" ][ "dragon" ] = %fxanim_zom_highrise_dragon_idle_anim; + level.scr_anim[ "fxanim_props" ][ "rock_slide" ] = %fxanim_zom_highrise_rock_slide_anim; +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_gamemodes.gsc b/zm_highrise_patch/maps/mp/zm_highrise_gamemodes.gsc new file mode 100644 index 0000000..3aa079b --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_gamemodes.gsc @@ -0,0 +1,13 @@ +#include maps/mp/zm_highrise_classic; +#include maps/mp/zm_highrise; +#include maps/mp/gametypes_zm/_zm_gametype; +#include maps/mp/zombies/_zm_game_module; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + add_map_gamemode( "zclassic", ::maps/mp/zm_highrise::zclassic_preinit, undefined, undefined ); + add_map_location_gamemode( "zclassic", "rooftop", ::maps/mp/zm_highrise_classic::precache, ::maps/mp/zm_highrise_classic::main ); +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_sq.gsc b/zm_highrise_patch/maps/mp/zm_highrise_sq.gsc new file mode 100644 index 0000000..09d10f8 --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_sq.gsc @@ -0,0 +1,1157 @@ +#include maps/mp/zm_highrise_sq; +#include maps/mp/zombies/_zm_perks; +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zombies/_zm_buildables; +#include maps/mp/zombies/_zm_stats; +#include maps/mp/gametypes_zm/_globallogic_score; +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +#using_animtree( "fxanim_props" ); + +init() +{ + if ( isDefined( level.gamedifficulty ) && level.gamedifficulty == 0 ) + { + sq_easy_cleanup(); + return; + } + flag_init( "sq_disabled" ); + flag_init( "sq_branch_complete" ); + flag_init( "sq_tower_active" ); + flag_init( "sq_player_has_sniper" ); + flag_init( "sq_player_has_ballistic" ); + flag_init( "sq_ric_tower_complete" ); + flag_init( "sq_max_tower_complete" ); + flag_init( "sq_players_out_of_sync" ); + flag_init( "sq_ball_picked_up" ); + register_map_navcard( "navcard_held_zm_highrise", "navcard_held_zm_transit" ); + ss_buttons = getentarray( "sq_ss_button", "targetname" ); + i = 0; + while ( i < ss_buttons.size ) + { + ss_buttons[ i ] usetriggerrequirelookat(); + ss_buttons[ i ] sethintstring( "" ); + ss_buttons[ i ] setcursorhint( "HINT_NOICON" ); + i++; + } + level thread mahjong_tiles_setup(); + flag_init( "sq_nav_built" ); + declare_sidequest( "sq", ::init_sidequest, ::sidequest_logic, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete ); + maps/mp/zm_highrise_sq_atd::init(); + maps/mp/zm_highrise_sq_slb::init(); + declare_sidequest( "sq_1", ::init_sidequest_1, ::sidequest_logic_1, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete ); + maps/mp/zm_highrise_sq_ssp::init_1(); + maps/mp/zm_highrise_sq_pts::init_1(); + declare_sidequest( "sq_2", ::init_sidequest_2, ::sidequest_logic_2, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete ); + maps/mp/zm_highrise_sq_ssp::init_2(); + maps/mp/zm_highrise_sq_pts::init_2(); + level thread init_navcard(); + level thread init_navcomputer(); + precache_sidequest_assets(); +} + +sq_highrise_clientfield_init() +{ + registerclientfield( "toplayer", "clientfield_sq_vo", 5000, 5, "int" ); + level.sq_clientfield_vo[ "none" ] = 0; + level.sq_clientfield_vo[ "vox_maxi_sidequest_activ_dragons_0" ] = 1; + level.sq_clientfield_vo[ "vox_maxi_sidequest_congratulate_0" ] = 2; + level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_0" ] = 3; + level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_1" ] = 4; + level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_2" ] = 5; + level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_3" ] = 6; + level.sq_clientfield_vo[ "vox_maxi_sidequest_create_trample_4" ] = 7; + level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_0" ] = 8; + level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_1" ] = 9; + level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_2" ] = 10; + level.sq_clientfield_vo[ "vox_maxi_sidequest_fail_3" ] = 11; + level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_0" ] = 12; + level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_1" ] = 13; + level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_2" ] = 14; + level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_3" ] = 15; + level.sq_clientfield_vo[ "vox_maxi_sidequest_lion_balls_4" ] = 16; + level.sq_clientfield_vo[ "vox_maxi_sidequest_max_com_0" ] = 17; + level.sq_clientfield_vo[ "vox_maxi_sidequest_max_com_1" ] = 18; + level.sq_clientfield_vo[ "vox_maxi_sidequest_max_com_2" ] = 19; + level.sq_clientfield_vo[ "vox_maxi_sidequest_punch_tower_0" ] = 20; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_0" ] = 21; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_1" ] = 22; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_2" ] = 23; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_3" ] = 24; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_4" ] = 25; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_5" ] = 26; + level.sq_clientfield_vo[ "vox_maxi_sidequest_reincar_zombie_6" ] = 27; + level.sq_clientfield_vo[ "vox_maxi_sidequest_sec_symbols_0" ] = 28; + level.sq_clientfield_vo[ "vox_maxi_sidequest_sec_symbols_1" ] = 29; + level.sq_clientfield_vo[ "vox_maxi_sidequest_sniper_rifle_0" ] = 30; + level.sq_clientfield_vo[ "vox_maxi_sidequest_tower_complete_0" ] = 31; +} + +sq_easy_cleanup() +{ + computer_buildable_trig = getent( "sq_common_buildable_trigger", "targetname" ); + computer_buildable_trig delete(); + sq_buildables = getentarray( "buildable_sq_common", "targetname" ); + _a112 = sq_buildables; + _k112 = getFirstArrayKey( _a112 ); + while ( isDefined( _k112 ) ) + { + item = _a112[ _k112 ]; + item delete(); + _k112 = getNextArrayKey( _a112, _k112 ); + } + a_balls = getentarray( "sq_dragon_lion_ball", "targetname" ); + array_delete( a_balls ); + a_tiles = getentarray( "mahjong_tile", "script_noteworthy" ); + array_delete( a_tiles ); + a_emblems_lit = getentarray( "elevator_dragon_lit", "targetname" ); + array_delete( a_emblems_lit ); + a_emblems = getentarray( "elevator_dragon_icon", "targetname" ); + array_delete( a_emblems ); + a_emblems = getentarray( "atd2_marker_lit", "targetname" ); + array_delete( a_emblems ); +} + +init_player_sidequest_stats() +{ + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_started", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_transit", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_held_zm_highrise", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "navcard_applied_zm_highrise", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_maxis_reset", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_rich_reset", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_rich_complete", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_maxis_complete", 0 ); + self maps/mp/gametypes_zm/_globallogic_score::initpersstat( "sq_highrise_last_completed", 0 ); +} + +start_highrise_sidequest() +{ + flag_wait( "start_zombie_round_logic" ); + sidequest_start( "sq" ); +} + +init_sidequest() +{ + players = get_players(); + thread sq_refresh_player_navcard_hud(); + a_balls = getentarray( "sq_sliquify_ball", "targetname" ); + _a180 = a_balls; + _k180 = getFirstArrayKey( _a180 ); + while ( isDefined( _k180 ) ) + { + m_ball = _a180[ _k180 ]; + m_ball.can_pickup = 0; + m_ball hide(); + _k180 = getNextArrayKey( _a180, _k180 ); + } + scriptmodelsuseanimtree( -1 ); + level.scr_anim[ "fxanim_props" ][ "trample_gen_ab" ] = %fxanim_zom_highrise_trample_gen_ab_anim; + level.scr_anim[ "fxanim_props" ][ "trample_gen_ba" ] = %fxanim_zom_highrise_trample_gen_ba_anim; + level.scr_anim[ "fxanim_props" ][ "trample_gen_cd" ] = %fxanim_zom_highrise_trample_gen_cd_anim; + level.scr_anim[ "fxanim_props" ][ "trample_gen_dc" ] = %fxanim_zom_highrise_trample_gen_dc_anim; + level thread vo_maxis_do_quest(); + level thread vo_weapon_watcher(); + level.maxcompleted = 0; + level.richcompleted = 0; + _a199 = players; + _k199 = getFirstArrayKey( _a199 ); + while ( isDefined( _k199 ) ) + { + player = _a199[ _k199 ]; + player.highrise_sq_started = 1; + lastcompleted = player maps/mp/zombies/_zm_stats::get_global_stat( "sq_highrise_last_completed" ); + if ( lastcompleted == 1 ) + { + level.richcompleted = 1; + } + else + { + if ( lastcompleted == 2 ) + { + level.maxcompleted = 1; + } + } + _k199 = getNextArrayKey( _a199, _k199 ); + } + if ( level.richcompleted ) + { + if ( level.maxcompleted ) + { + flag_set( "sq_players_out_of_sync" ); + } + else + { + tower_in_sync_lightning(); + } + exploder( 1003 ); + } + if ( level.maxcompleted ) + { + if ( !flag( "sq_players_out_of_sync" ) ) + { + tower_in_sync_lightning(); + } + exploder( 903 ); + } +} + +init_sidequest_1() +{ +} + +init_sidequest_2() +{ +} + +generic_stage_start() +{ +/# + level thread cheat_complete_stage(); +#/ + level._stage_active = 1; +} + +cheat_complete_stage() +{ + level endon( "reset_sundial" ); + while ( 1 ) + { + if ( getDvar( "cheat_sq" ) != "" ) + { + if ( isDefined( level._last_stage_started ) ) + { + setdvar( "cheat_sq", "" ); + stage_completed( "sq", level._last_stage_started ); + } + } + wait 0,1; + } +} + +sidequest_logic() +{ + level thread temp_test_fx(); + if ( is_true( level.maxcompleted ) && is_true( level.richcompleted ) ) + { + return; + } + level thread watch_nav_computer_built(); + flag_wait( "power_on" ); + level thread vo_richtofen_power_on(); + flag_wait( "sq_nav_built" ); + if ( !is_true( level.navcomputer_spawned ) ) + { + update_sidequest_stats( "sq_highrise_started" ); + } + level thread navcomputer_waitfor_navcard(); + stage_start( "sq", "atd" ); + level waittill( "sq_atd_over" ); + stage_start( "sq", "slb" ); + level waittill( "sq_slb_over" ); + if ( !is_true( level.richcompleted ) ) + { + level thread sidequest_start( "sq_1" ); + } + if ( !is_true( level.maxcompleted ) ) + { + level thread sidequest_start( "sq_2" ); + } + flag_wait( "sq_branch_complete" ); + tower_punch_watcher(); + if ( flag( "sq_ric_tower_complete" ) ) + { + update_sidequest_stats( "sq_highrise_rich_complete" ); + } + else + { + if ( flag( "sq_max_tower_complete" ) ) + { + update_sidequest_stats( "sq_highrise_maxis_complete" ); + } + } +} + +sidequest_logic_1() +{ + stage_start( "sq_1", "ssp_1" ); + level waittill( "sq_1_ssp_1_over" ); + stage_start( "sq_1", "pts_1" ); + level waittill( "sq_1_pts_1_over" ); + flag_set( "sq_branch_complete" ); + flag_set( "sq_ric_tower_complete" ); + exploder( 1001 ); + clientnotify( "start_fireball_dragon_b" ); + wait 0,1; + clientnotify( "fxanim_dragon_b_start" ); + wait getanimlength( %fxanim_zom_highrise_dragon_b_anim ); + exploder( 1002 ); + level thread vo_richtofen_punch_tower(); +} + +sidequest_logic_2() +{ + stage_start( "sq_2", "ssp_2" ); + level waittill( "sq_2_ssp_2_over" ); + stage_start( "sq_2", "pts_2" ); + level waittill( "sq_2_pts_2_over" ); + exploder( 901 ); + clientnotify( "start_fireball_dragon_a" ); + wait 0,1; + clientnotify( "fxanim_dragon_a_start" ); + wait getanimlength( %fxanim_zom_highrise_dragon_a_anim ); + exploder( 902 ); + flag_set( "sq_branch_complete" ); + flag_set( "sq_max_tower_complete" ); + level thread vo_maxis_punch_tower(); +} + +watch_nav_computer_built() +{ + if ( !is_true( level.navcomputer_spawned ) ) + { + wait_for_buildable( "sq_common" ); + } + flag_set( "sq_nav_built" ); +} + +get_specific_player( num ) +{ + players = get_players(); + return undefined; +} + +tower_punch_watcher() +{ + level thread playtoweraudio(); + a_leg_trigs = []; + _a411 = level.a_wind_order; + _k411 = getFirstArrayKey( _a411 ); + while ( isDefined( _k411 ) ) + { + str_wind = _a411[ _k411 ]; + a_leg_trigs[ a_leg_trigs.size ] = "sq_tower_" + str_wind; + _k411 = getNextArrayKey( _a411, _k411 ); + } + level.n_cur_leg = 0; + level.sq_leg_punches = 0; + _a419 = a_leg_trigs; + _k419 = getFirstArrayKey( _a419 ); + while ( isDefined( _k419 ) ) + { + str_leg = _a419[ _k419 ]; + t_leg = getent( str_leg, "script_noteworthy" ); + t_leg thread tower_punch_watch_leg( a_leg_trigs ); + _k419 = getNextArrayKey( _a419, _k419 ); + } + flag_wait( "sq_tower_active" ); +/# + iprintlnbold( "TOWER ACTIVE" ); +#/ + if ( flag( "sq_ric_tower_complete" ) ) + { + exploder_stop( 1002 ); + exploder_stop( 903 ); + exploder( 1003 ); + } + else + { + exploder_stop( 902 ); + exploder_stop( 1003 ); + exploder( 903 ); + } + wait 1; + level thread tower_in_sync_lightning(); + wait 1; + level thread sq_give_all_perks(); +} + +tower_in_sync_lightning() +{ + s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" ); + playfx( level._effect[ "sidequest_tower_bolts" ], s_tower_top.origin - vectorScale( ( 0, 0, 0 ), 88 ), ( 0, 0, 0 ) ); +} + +playtoweraudio() +{ + origin = ( 2207, 682, 3239 ); + ent = spawn( "script_origin", origin ); + ent playsound( "zmb_sq_tower_powerup_start_1" ); + ent playloopsound( "zmb_sq_tower_powerup_loop_1", 1 ); + flag_wait( "sq_tower_active" ); + ent stoploopsound( 2 ); + ent playsound( "zmb_sq_tower_powerup_start_2" ); + wait 2; + ent playloopsound( "zmb_sq_tower_powerup_loop_2", 1 ); +} + +tower_punch_watch_leg( a_leg_trigs ) +{ + while ( !flag( "sq_tower_active" ) ) + { + self waittill( "trigger", who ); + if ( level.n_cur_leg < a_leg_trigs.size && isplayer( who ) || who.current_melee_weapon == "tazer_knuckles_zm" && who.current_melee_weapon == "tazer_knuckles_upgraded_zm" ) + { + if ( self.script_noteworthy == a_leg_trigs[ level.n_cur_leg ] ) + { + level.n_cur_leg++; + self playsound( "zmb_sq_leg_powerup_" + level.n_cur_leg ); + if ( level.n_cur_leg == 4 ) + { + flag_set( "sq_tower_active" ); + } + } + else + { + level.n_cur_leg = 0; + self playsound( "zmb_sq_leg_powerdown" ); + } + level.sq_leg_punches++; + self playsound( "zmb_sq_leg_powerup_" + level.sq_leg_punches ); + if ( level.sq_leg_punches >= 4 && !flag( "sq_tower_active" ) ) + { + wait 1; + self playsound( "zmb_sq_leg_powerdown" ); + exploder_stop( 1002 ); + exploder_stop( 902 ); + cur_round = level.round_number; + level waittill( "start_of_round" ); + level.sq_leg_punches = 0; + wait 2; + if ( flag( "sq_ric_tower_complete" ) ) + { + exploder( 1002 ); + break; + } + else + { + exploder( 902 ); + } + } + } + } +} + +mahjong_tiles_setup() +{ + a_winds = array_randomize( array( "north", "south", "east", "west" ) ); + a_colors = array_randomize( array( "blk", "blu", "grn", "red" ) ); + a_locs = array_randomize( getstructarray( "sq_tile_loc_random", "targetname" ) ); +/# + assert( a_locs.size > a_winds.size, "zm_highrise_sq: not enough locations for mahjong tiles!" ); +#/ + a_wind_order = array( "none" ); + i = 0; + while ( i < a_winds.size ) + { + a_wind_order[ a_wind_order.size ] = a_winds[ i ]; + m_wind_tile = getent( "tile_" + a_winds[ i ] + "_" + a_colors[ i ], "targetname" ); + m_wind_tile.script_noteworthy = undefined; + s_spot = a_locs[ i ]; + if ( a_winds[ i ] == "north" ) + { + s_spot = getstruct( "sq_tile_loc_north", "targetname" ); + } + m_wind_tile.origin = s_spot.origin; + m_wind_tile.angles = s_spot.angles; + i++; + } + i = 0; + while ( i < a_colors.size ) + { + m_num_tile = getent( "tile_" + ( i + 1 ) + "_" + a_colors[ i ], "targetname" ); + m_num_tile.script_noteworthy = undefined; + s_spot = a_locs[ i + a_winds.size ]; + m_num_tile.origin = s_spot.origin; + m_num_tile.angles = s_spot.angles; + i++; + } + a_tiles = getentarray( "mahjong_tile", "script_noteworthy" ); + array_delete( a_tiles ); + level.a_wind_order = a_winds; +} + +light_dragon_fireworks( str_dragon, n_num_fireworks ) +{ + i = 0; + while ( i < n_num_fireworks ) + { + wait 1; + clientnotify( str_dragon + "_start_firework" ); + wait 1; + i++; + } +} + +temp_test_fx() +{ + n_index = 0; + level waittill( "temp_play_next_sq_fx" ); + clientnotify( "r_drg_tail" ); + clientnotify( "m_drg_tail" ); + while ( n_index < 7 ) + { + level waittill( "temp_play_next_sq_fx" ); + clientnotify( "r_start_firework" ); + clientnotify( "m_start_firework" ); + n_index++; + } + level waittill( "temp_play_next_sq_fx" ); + exploder( 901 ); + clientnotify( "start_fireball_dragon_b" ); + wait 0,1; + clientnotify( "fxanim_dragon_b_start" ); + level waittill( "temp_play_next_sq_fx" ); + clientnotify( "start_fireball_dragon_a" ); + wait 0,1; + clientnotify( "fxanim_dragon_a_start" ); + level waittill( "temp_play_next_sq_fx" ); + wait 1; + exploder( 902 ); + wait 1; + exploder( 903 ); + level waittill( "temp_play_next_sq_fx" ); + stop_exploder( 901 ); + stop_exploder( 902 ); + stop_exploder( 903 ); + exploder( 1001 ); + exploder( 1002 ); + exploder( 1003 ); +} + +generic_stage_complete() +{ + level._stage_active = 0; +} + +complete_sidequest() +{ + level thread sidequest_done(); +} + +sidequest_done() +{ +} + +get_variant_from_entity_num( player_number ) +{ + if ( !isDefined( player_number ) ) + { + player_number = 0; + } + post_fix = "a"; + switch( player_number ) + { + case 0: + post_fix = "a"; + break; + case 1: + post_fix = "b"; + break; + case 2: + post_fix = "c"; + break; + case 3: + post_fix = "d"; + break; + } + return post_fix; +} + +init_navcard() +{ + flag_wait( "start_zombie_round_logic" ); + spawn_card = 1; + players = get_players(); + _a678 = players; + _k678 = getFirstArrayKey( _a678 ); + while ( isDefined( _k678 ) ) + { + player = _a678[ _k678 ]; + has_card = does_player_have_map_navcard( player ); + if ( has_card ) + { + player.navcard_grabbed = level.map_navcard; + spawn_card = 0; + } + _k678 = getNextArrayKey( _a678, _k678 ); + } + thread sq_refresh_player_navcard_hud(); + if ( !spawn_card ) + { + return; + } + next_model = "p6_zm_keycard"; + place_navcard( next_model, next_model, level.map_navcard, level.navcard_needed ); +} + +place_navcard( str_model, str_next_model, str_stat, str_next_stat ) +{ + org = ( 1743, 1070, 3244,5 ); + angles = ( 0, 0, 0 ); + navcard = spawn( "script_model", org ); + navcard setmodel( str_model ); + navcard.angles = angles; + wait 1; + navcard_pickup_trig = spawn( "trigger_radius_use", org, 0, 84, 72 ); + navcard_pickup_trig setcursorhint( "HINT_NOICON" ); + navcard_pickup_trig sethintstring( &"ZOMBIE_NAVCARD_PICKUP" ); + navcard_pickup_trig triggerignoreteam(); + is_holding_card = 0; + while ( 1 ) + { + navcard_pickup_trig waittill( "trigger", who ); + if ( is_player_valid( who ) ) + { + if ( who maps/mp/zombies/_zm_stats::get_global_stat( str_next_stat ) ) + { + is_holding_card = 1; + who maps/mp/zombies/_zm_stats::set_global_stat( str_next_stat, 0 ); + } + who playsound( "zmb_buildable_piece_add" ); + who maps/mp/zombies/_zm_stats::set_global_stat( str_stat, 1 ); + who.navcard_grabbed = str_stat; + wait_network_frame(); + is_stat = who maps/mp/zombies/_zm_stats::get_global_stat( str_stat ); + is_next_stat = who maps/mp/zombies/_zm_stats::get_global_stat( str_next_stat ); + thread sq_refresh_player_navcard_hud(); + break; + } + else + { + } + } + navcard delete(); + navcard_pickup_trig delete(); + if ( is_holding_card ) + { + level thread place_navcard( str_next_model, str_model, str_next_stat, str_stat ); + } +} + +init_navcomputer() +{ + flag_wait( "start_zombie_round_logic" ); + spawn_navcomputer = 1; + players = get_players(); + _a757 = players; + _k757 = getFirstArrayKey( _a757 ); + while ( isDefined( _k757 ) ) + { + player = _a757[ _k757 ]; + built_comptuer = player maps/mp/zombies/_zm_stats::get_global_stat( "sq_highrise_started" ); + if ( !built_comptuer ) + { + spawn_navcomputer = 0; + break; + } + else + { + _k757 = getNextArrayKey( _a757, _k757 ); + } + } + if ( !spawn_navcomputer ) + { + return; + } + level.navcomputer_spawned = 1; + get_players()[ 0 ] maps/mp/zombies/_zm_buildables::player_finish_buildable( level.sq_buildable.buildablezone ); + while ( isDefined( level.sq_buildable ) && isDefined( level.sq_buildable.model ) ) + { + buildable = level.sq_buildable.buildablezone; + i = 0; + while ( i < buildable.pieces.size ) + { + if ( isDefined( buildable.pieces[ i ].model ) ) + { + buildable.pieces[ i ].model delete(); + maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( buildable.pieces[ i ].unitrigger ); + } + if ( isDefined( buildable.pieces[ i ].part_name ) ) + { + buildable.stub.model notsolid(); + buildable.stub.model show(); + buildable.stub.model showpart( buildable.pieces[ i ].part_name ); + } + i++; + } + } +} + +navcomputer_waitfor_navcard() +{ + spawn_trigger = 1; + players = get_players(); + _a801 = players; + _k801 = getFirstArrayKey( _a801 ); + while ( isDefined( _k801 ) ) + { + player = _a801[ _k801 ]; + card_swiped = player maps/mp/zombies/_zm_stats::get_global_stat( "navcard_applied_zm_highrise" ); + if ( card_swiped ) + { + spawn_trigger = 0; + break; + } + else + { + _k801 = getNextArrayKey( _a801, _k801 ); + } + } + if ( !spawn_trigger ) + { + return; + } + computer_buildable_trig = getent( "sq_common_buildable_trigger", "targetname" ); + trig_pos = getstruct( "sq_common_key", "targetname" ); + navcomputer_use_trig = spawn( "trigger_radius_use", trig_pos.origin, 0, 48, 48 ); + navcomputer_use_trig setcursorhint( "HINT_NOICON" ); + navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_USE" ); + navcomputer_use_trig triggerignoreteam(); + while ( 1 ) + { + navcomputer_use_trig waittill( "trigger", who ); + if ( isplayer( who ) && is_player_valid( who ) ) + { + if ( does_player_have_correct_navcard( who ) ) + { + navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_SUCCESS" ); + who playsound( "zmb_sq_navcard_success" ); + update_sidequest_stats( "navcard_applied_zm_highrise" ); + who.navcard_grabbed = undefined; + wait 1; + navcomputer_use_trig delete(); + return; + break; + } + else + { + navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_FAIL" ); + who playsound( "zmb_sq_navcard_fail" ); + wait 1; + navcomputer_use_trig sethintstring( &"ZOMBIE_NAVCARD_USE" ); + } + } + } +} + +update_sidequest_stats( stat_name ) +{ + maxis_complete = 0; + rich_complete = 0; + started = 0; + if ( stat_name == "sq_highrise_maxis_complete" ) + { + maxis_complete = 1; + } + else + { + if ( stat_name == "sq_highrise_rich_complete" ) + { + rich_complete = 1; + } + } + players = get_players(); + _a867 = players; + _k867 = getFirstArrayKey( _a867 ); + while ( isDefined( _k867 ) ) + { + player = _a867[ _k867 ]; + if ( stat_name == "sq_highrise_started" ) + { + player.highrise_sq_started = 1; + } + else if ( stat_name == "navcard_applied_zm_highrise" ) + { + player maps/mp/zombies/_zm_stats::set_global_stat( level.navcard_needed, 0 ); + thread sq_refresh_player_navcard_hud(); + } + else + { + if ( !is_true( player.highrise_sq_started ) ) + { + } + } + else + { + if ( rich_complete ) + { + player maps/mp/zombies/_zm_stats::set_global_stat( "sq_highrise_last_completed", 1 ); + incrementcounter( "global_zm_total_rich_sq_complete_highrise", 1 ); + } + else + { + if ( maxis_complete ) + { + player maps/mp/zombies/_zm_stats::set_global_stat( "sq_highrise_last_completed", 2 ); + incrementcounter( "global_zm_total_max_sq_complete_highrise", 1 ); + } + } + player maps/mp/zombies/_zm_stats::increment_client_stat( stat_name, 0 ); + } + _k867 = getNextArrayKey( _a867, _k867 ); + } + if ( rich_complete || maxis_complete ) + { + level notify( "highrise_sidequest_achieved" ); + } +} + +sq_give_all_perks() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + perks = []; + i = 0; + while ( i < vending_triggers.size ) + { + perk = vending_triggers[ i ].script_noteworthy; + if ( perk == "specialty_weapupgrade" ) + { + i++; + continue; + } + else + { + perks[ perks.size ] = perk; + } + i++; + } + if ( flag( "sq_ric_tower_complete" ) ) + { + v_fireball_start_loc = ( 1946, 608, 3338 ); + n_fireball_exploder = 1001; + } + else + { + v_fireball_start_loc = ( 1068, -1362, 3340,5 ); + n_fireball_exploder = 901; + } + players = getplayers(); + _a935 = players; + _k935 = getFirstArrayKey( _a935 ); + while ( isDefined( _k935 ) ) + { + player = _a935[ _k935 ]; + player thread sq_give_player_perks( perks, v_fireball_start_loc, n_fireball_exploder ); + level waittill( "sq_fireball_hit_player" ); + _k935 = getNextArrayKey( _a935, _k935 ); + } +} + +sq_give_player_perks( perks, v_fireball_start_loc, n_fireball_exploder ) +{ + exploder( n_fireball_exploder ); + m_fireball = spawn( "script_model", v_fireball_start_loc ); + m_fireball setmodel( "tag_origin" ); + playfxontag( level._effect[ "sidequest_dragon_fireball_max" ], m_fireball, "tag_origin" ); + wait_network_frame(); + v_to_player = vectornormalize( self gettagorigin( "J_SpineLower" ) - m_fireball.origin ); + v_move_spot = m_fireball.origin + ( v_to_player * 48 ); + m_fireball.origin = v_move_spot; + m_fireball.origin = self gettagorigin( "J_SpineLower" ); + m_fireball linkto( self, "J_SpineLower" ); + wait 1,5; + playfx( level._effect[ "sidequest_flash" ], m_fireball.origin ); + m_fireball delete(); + level notify( "sq_fireball_hit_player" ); + _a967 = perks; + _k967 = getFirstArrayKey( _a967 ); + while ( isDefined( _k967 ) ) + { + perk = _a967[ _k967 ]; + if ( isDefined( self.perk_purchased ) && self.perk_purchased == perk ) + { + } + else + { + if ( self hasperk( perk ) || self maps/mp/zombies/_zm_perks::has_perk_paused( perk ) ) + { + break; + } + else + { + self maps/mp/zombies/_zm_perks::give_perk( perk, 0 ); + wait 1; + } + } + _k967 = getNextArrayKey( _a967, _k967 ); + } +} + +sq_refresh_player_navcard_hud_internal() +{ + self endon( "disconnect" ); + navcard_bits = 0; + i = 0; + while ( i < level.navcards.size ) + { + hasit = self maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] ); + if ( isDefined( self.navcard_grabbed ) && self.navcard_grabbed == level.navcards[ i ] ) + { + hasit = 1; + } + if ( hasit ) + { + navcard_bits += 1 << i; + } + i++; + } + wait_network_frame(); + self setclientfield( "navcard_held", 0 ); + if ( navcard_bits > 0 ) + { + wait_network_frame(); + self setclientfield( "navcard_held", navcard_bits ); + } +} + +sq_refresh_player_navcard_hud() +{ + if ( !isDefined( level.navcards ) ) + { + return; + } + players = get_players(); + _a1013 = players; + _k1013 = getFirstArrayKey( _a1013 ); + while ( isDefined( _k1013 ) ) + { + player = _a1013[ _k1013 ]; + player thread sq_refresh_player_navcard_hud_internal(); + _k1013 = getNextArrayKey( _a1013, _k1013 ); + } +} + +vo_maxis_do_quest() +{ + wait 20; + if ( 1 ) + { + maxissay( "vox_maxi_sidequest_max_com_0" ); + } + else + { + maxissay( "vox_maxi_sidequest_max_com_1" ); + maxissay( "vox_maxi_sidequest_max_com_2" ); + } +} + +vo_richtofen_power_on() +{ + wait 6; + richtofensay( "vox_zmba_sidequest_power_on_0" ); +} + +vo_richtofen_nav_card() +{ + switch( self.characterindex ) + { + case 2: + break; + case 0: + case 3: + case 1: + } + if ( 1 ) + { + level thread vo_maxis_first_tower(); + } + else if ( 0 ) + { + level thread vo_richtofen_first_tower(); + } + } + } + } +} + +vo_richtofen_first_tower() +{ + richtofensay( "vox_zmba_sidequest_congratulate_0" ); + richtofensay( "vox_zmba_sidequest_congratulate_1" ); +} + +vo_maxis_first_tower() +{ + maxissay( "vox_maxi_sidequest_congratulate_0" ); +} + +vo_find_nav_card() +{ + switch( self.characterindex ) + { + case 2: + break; + case 0: + case 3: + case 1: + } + } + } + } +} + +vo_maxis_find_sniper() +{ + maxissay( "vox_maxi_sidequest_sniper_rifle_0" ); +} + +vo_richtofen_find_sniper() +{ + richtofensay( "vox_zmba_sidequest_sniper_rifle_0" ); + wait 10; + richtofensay( "vox_zmba_sidequest_sniper_rifle_1" ); +} + +vo_maxis_player_has_pap_ballistic() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_2" ); +} + +vo_richtofen_punch_tower() +{ + richtofensay( "vox_zmba_sidequest_punch_tower_0" ); + richtofensay( "vox_zmba_sidequest_punch_tower_1" ); + richtofensay( "vox_zmba_sidequest_punch_tower_2" ); + richtofensay( "vox_zmba_sidequest_punch_tower_3" ); +} + +vo_maxis_punch_tower() +{ + maxissay( "vox_maxi_sidequest_punch_tower_0" ); +} + +vo_weapon_watcher() +{ + while ( !flag( "sq_player_has_sniper" ) || !flag( "sq_player_has_ballistic" ) ) + { + players = getplayers(); + _a1155 = players; + _k1155 = getFirstArrayKey( _a1155 ); + while ( isDefined( _k1155 ) ) + { + player = _a1155[ _k1155 ]; + if ( !flag( "sq_player_has_sniper" ) && isDefined( player.currentweapon ) && sq_is_weapon_sniper( player.currentweapon ) ) + { + flag_set( "sq_player_has_sniper" ); + if ( isDefined( level.rich_sq_player ) && is_player_valid( level.rich_sq_player ) && player == level.rich_sq_player ) + { + level thread vo_richtofen_find_sniper(); + } + else + { + level thread vo_maxis_find_sniper(); + } + } + else + { + if ( !flag( "sq_player_has_ballistic" ) && isDefined( player.currentweapon ) && player.currentweapon == "knife_ballistic_upgraded_zm" ) + { + flag_set( "sq_player_has_ballistic" ); + level thread vo_maxis_player_has_pap_ballistic(); + } + } + _k1155 = getNextArrayKey( _a1155, _k1155 ); + } + wait 1; + } +} + +sq_is_weapon_sniper( str_weapon ) +{ + a_snipers = array( "dsr50", "barretm82", "svu" ); + _a1184 = a_snipers; + _k1184 = getFirstArrayKey( _a1184 ); + while ( isDefined( _k1184 ) ) + { + str_sniper = _a1184[ _k1184 ]; + if ( issubstr( str_weapon, str_sniper ) ) + { + return 1; + } + _k1184 = getNextArrayKey( _a1184, _k1184 ); + } + return 0; +} + +richtofensay( vox_line, time ) +{ + level endon( "end_game" ); + level endon( "intermission" ); + if ( is_true( level.intermission ) ) + { + return; + } + if ( is_true( level.richcompleted ) ) + { + return; + } + level endon( "richtofen_c_complete" ); + if ( !isDefined( time ) ) + { + time = 2; + } + while ( is_true( level.richtofen_talking_to_samuel ) ) + { + wait 1; + } + if ( isDefined( level.rich_sq_player ) && is_player_valid( level.rich_sq_player ) ) + { +/# + iprintlnbold( "Richtoffen Says: " + vox_line ); +#/ + level.rich_sq_player playsoundtoplayer( vox_line, level.rich_sq_player ); + if ( !is_true( level.richtofen_talking_to_samuel ) ) + { + level thread richtofen_talking( time ); + } + } +} + +richtofen_talking( time ) +{ + level.rich_sq_player.dontspeak = 1; + level.richtofen_talking_to_samuel = 1; + wait time; + level.richtofen_talking_to_samuel = 0; + if ( isDefined( level.rich_sq_player ) ) + { + level.rich_sq_player.dontspeak = 0; + } +} + +maxissay( line ) +{ + level endon( "end_game" ); + level endon( "intermission" ); + if ( is_true( level.maxcompleted ) ) + { + return; + } + if ( is_true( level.intermission ) ) + { + return; + } + while ( is_true( level.maxis_talking ) ) + { + wait 0,05; + } + level.maxis_talking = 1; +/# + iprintlnbold( "Maxis Says: " + line ); +#/ + players = getplayers(); + _a1286 = players; + _k1286 = getFirstArrayKey( _a1286 ); + while ( isDefined( _k1286 ) ) + { + player = _a1286[ _k1286 ]; + player setclientfieldtoplayer( "clientfield_sq_vo", level.sq_clientfield_vo[ line ] ); + _k1286 = getNextArrayKey( _a1286, _k1286 ); + } + wait 10; + level.maxis_talking = 0; +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_sq_atd.gsc b/zm_highrise_patch/maps/mp/zm_highrise_sq_atd.gsc new file mode 100644 index 0000000..4d3f963 --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_sq_atd.gsc @@ -0,0 +1,247 @@ +#include maps/mp/zm_highrise_sq; +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + flag_init( "sq_atd_elevator0" ); + flag_init( "sq_atd_elevator1" ); + flag_init( "sq_atd_elevator2" ); + flag_init( "sq_atd_elevator3" ); + flag_init( "sq_atd_elevator_activated" ); + flag_init( "sq_atd_drg_puzzle_1st_error" ); + flag_init( "sq_atd_drg_puzzle_complete" ); + declare_sidequest_stage( "sq", "atd", ::init_stage, ::stage_logic, ::exit_stage_1 ); + sq_atd_dragon_icon_setup(); +} + +init_stage() +{ + level._cur_stage_name = "atd"; + clientnotify( "atd" ); +} + +stage_logic() +{ +/# + iprintlnbold( "ATD Started" ); +#/ + sq_atd_elevators(); + sq_atd_drg_puzzle(); + stage_completed( "sq", level._cur_stage_name ); +} + +exit_stage_1( success ) +{ +} + +sq_atd_dragon_icon_setup() +{ + a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" ); + _a51 = a_dragon_icons; + _k51 = getFirstArrayKey( _a51 ); + while ( isDefined( _k51 ) ) + { + m_icon = _a51[ _k51 ]; + m_icon notsolid(); + m_icon.m_elevator = getent( "elevator_" + m_icon.script_noteworthy + "_body", "targetname" ); + m_icon.origin = m_icon.m_elevator.origin + vectorScale( ( 0, 0, 1 ), 134 ); + m_icon.angles = m_icon.m_elevator.angles; + m_icon linkto( m_icon.m_elevator ); + m_icon.m_lit_icon = getent( m_icon.script_noteworthy + "_elevator_lit", "script_noteworthy" ); + if ( isDefined( m_icon.m_lit_icon ) ) + { + m_icon.m_lit_icon notsolid(); + m_icon.m_lit_icon.origin = m_icon.origin - vectorScale( ( 0, 0, 1 ), 2 ); + m_icon.m_lit_icon.angles = m_icon.angles; + m_icon.m_lit_icon linkto( m_icon.m_elevator ); + } + _k51 = getNextArrayKey( _a51, _k51 ); + } + a_atd2_icons = getentarray( "atd2_marker_unlit", "script_noteworthy" ); + a_atd2_lit_icons = getentarray( "atd2_marker_lit", "targetname" ); + i = 0; + while ( i < a_atd2_icons.size ) + { + a_atd2_lit_icons[ i ].origin = a_atd2_icons[ i ].origin - vectorScale( ( 0, 0, 1 ), 5 ); + a_atd2_lit_icons[ i ].angles = a_atd2_icons[ i ].angles; + a_atd2_icons[ i ].lit_icon = a_atd2_lit_icons[ i ]; + i++; + } +} + +sq_atd_elevators() +{ + a_elevators = array( "elevator_bldg1b_trigger", "elevator_bldg1d_trigger", "elevator_bldg3b_trigger", "elevator_bldg3c_trigger" ); + a_elevator_flags = array( "sq_atd_elevator0", "sq_atd_elevator1", "sq_atd_elevator2", "sq_atd_elevator3" ); + i = 0; + while ( i < a_elevators.size ) + { + trig_elevator = getent( a_elevators[ i ], "targetname" ); + trig_elevator thread sq_atd_watch_elevator( a_elevator_flags[ i ] ); + i++; + } + while ( flag( "sq_atd_elevator0" ) && flag( "sq_atd_elevator1" ) || !flag( "sq_atd_elevator2" ) && !flag( "sq_atd_elevator3" ) ) + { + flag_wait_any_array( a_elevator_flags ); + wait 0,5; + } +/# + iprintlnbold( "Standing on Elevators Complete" ); +#/ + a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" ); + _a105 = a_dragon_icons; + _k105 = getFirstArrayKey( _a105 ); + while ( isDefined( _k105 ) ) + { + m_icon = _a105[ _k105 ]; + v_off_pos = m_icon.m_lit_icon.origin; + m_icon.m_lit_icon unlink(); + m_icon unlink(); + m_icon.m_lit_icon.origin = m_icon.origin; + m_icon.origin = v_off_pos; + m_icon.m_lit_icon linkto( m_icon.m_elevator ); + m_icon linkto( m_icon.m_elevator ); + m_icon playsound( "zmb_sq_symbol_light" ); + _k105 = getNextArrayKey( _a105, _k105 ); + } + flag_set( "sq_atd_elevator_activated" ); + vo_richtofen_atd_elevators(); + level thread vo_maxis_atd_elevators(); +} + +sq_atd_watch_elevator( str_flag ) +{ + level endon( "sq_atd_elevator_activated" ); + while ( 1 ) + { + self waittill( "trigger", e_who ); + while ( !isplayer( e_who ) ) + { + wait 0,05; + } + flag_set( str_flag ); + while ( isalive( e_who ) && e_who istouching( self ) ) + { + wait 0,05; + } + flag_clear( str_flag ); + } +} + +sq_atd_drg_puzzle() +{ + level.sq_atd_cur_drg = 0; + a_puzzle_trigs = getentarray( "trig_atd_drg_puzzle", "targetname" ); + a_puzzle_trigs = array_randomize( a_puzzle_trigs ); + i = 0; + while ( i < a_puzzle_trigs.size ) + { + a_puzzle_trigs[ i ] thread drg_puzzle_trig_think( i ); + i++; + } + while ( level.sq_atd_cur_drg < 4 ) + { + wait 1; + } + flag_set( "sq_atd_drg_puzzle_complete" ); + level thread vo_maxis_atd_order_complete(); +/# + iprintlnbold( "Dragon Puzzle COMPLETE" ); +#/ +} + +drg_puzzle_trig_think( n_order_id ) +{ + self.drg_active = 0; + m_unlit = getent( self.target, "targetname" ); + m_lit = m_unlit.lit_icon; + v_top = m_unlit.origin; + v_hidden = m_lit.origin; + while ( !flag( "sq_atd_drg_puzzle_complete" ) ) + { + while ( self.drg_active ) + { + level waittill_either( "sq_atd_drg_puzzle_complete", "drg_puzzle_reset" ); + while ( flag( "sq_atd_drg_puzzle_complete" ) ) + { + continue; + } + } + self waittill( "trigger", e_who ); + if ( level.sq_atd_cur_drg == n_order_id ) + { + m_lit.origin = v_top; + m_unlit.origin = v_hidden; + m_lit playsound( "zmb_sq_symbol_light" ); + self.drg_active = 1; + level thread vo_richtofen_atd_order( level.sq_atd_cur_drg ); + level.sq_atd_cur_drg++; +/# + iprintlnbold( "Dragon " + n_order_id + " Correct" ); +#/ + self thread drg_puzzle_trig_watch_fade( m_lit, m_unlit, v_top, v_hidden ); + } + else + { + if ( !flag( "sq_atd_drg_puzzle_1st_error" ) ) + { + level thread vo_maxis_atd_order_error(); + } + level.sq_atd_cur_drg = 0; + level notify( "drg_puzzle_reset" ); +/# + iprintlnbold( "INCORRECT DRAGON" ); +#/ + wait 0,5; + } + while ( e_who istouching( self ) ) + { + wait 0,5; + } + } +} + +drg_puzzle_trig_watch_fade( m_lit, m_unlit, v_top, v_hidden ) +{ + level endon( "sq_atd_drg_puzzle_complete" ); + level waittill( "drg_puzzle_reset" ); + m_unlit.origin = v_top; + m_lit.origin = v_hidden; + m_unlit playsound( "zmb_sq_symbol_fade" ); + self.drg_active = 0; +} + +vo_richtofen_atd_elevators() +{ + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_activ_dragons_0" ); +} + +vo_maxis_atd_elevators() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_activ_dragons_0" ); +} + +vo_richtofen_atd_order( n_which ) +{ + str_vox = "vox_zmba_sidequest_sec_symbols_" + n_which; + maps/mp/zm_highrise_sq::richtofensay( str_vox ); +} + +vo_richtofen_atd_order_error() +{ + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sec_symbols_5" ); +} + +vo_maxis_atd_order_error() +{ + flag_set( "sq_atd_drg_puzzle_1st_error" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_sec_symbols_0" ); +} + +vo_maxis_atd_order_complete() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_sec_symbols_1" ); +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_sq_pts.gsc b/zm_highrise_patch/maps/mp/zm_highrise_sq_pts.gsc new file mode 100644 index 0000000..6fdfd5b --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_sq_pts.gsc @@ -0,0 +1,570 @@ +#include maps/mp/zombies/_zm_unitrigger; +#include maps/mp/zm_highrise_sq; +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +#using_animtree( "fxanim_props" ); + +init_1() +{ + flag_init( "pts_1_springpads_placed" ); + declare_sidequest_stage( "sq_1", "pts_1", ::init_stage_1, ::stage_logic_1, ::exit_stage_1 ); +} + +init_2() +{ + flag_init( "pts_2_springpads_placed" ); + flag_init( "pts_2_generator_1_started" ); + flag_init( "pts_2_generator_2_started" ); + declare_sidequest_stage( "sq_2", "pts_2", ::init_stage_2, ::stage_logic_2, ::exit_stage_2 ); +} + +init_stage_1() +{ + clientnotify( "pts_1" ); + level.n_launched_zombies = 0; + wait 15; + level thread richtofen_pts_instructions(); + level thread richtofen_pts_placed(); +} + +init_stage_2() +{ + clientnotify( "pts_2" ); + level.sq_ball_putdown_trigs = []; + level thread maxis_pts_instructions(); + level thread maxis_pts_placed(); +} + +stage_logic_1() +{ +/# + iprintlnbold( "PTS1 Started" ); +#/ + watch_player_springpads( 0 ); + wait_for_all_springpads_placed( "pts_ghoul", "pts_1_springpads_placed" ); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 1 ); + wait_for_zombies_launched(); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 2 ); + stage_completed( "sq_1", "pts_1" ); +} + +wait_for_zombies_launched() +{ + level thread richtofen_zombies_launched(); + t_tower = getent( "pts_tower_trig", "targetname" ); + s_tower_top = getstruct( "sq_zombie_launch_target", "targetname" ); + while ( level.n_launched_zombies < 16 ) + { + wait 0,5; + } +} + +watch_zombie_flings() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "equip_springpad_zm_taken" ); + self endon( "equip_springpad_zm_pickup" ); + while ( level.n_launched_zombies < 16 ) + { + self waittill( "fling" ); + level.n_launched_zombies++; + if ( level.n_launched_zombies != 1 || level.n_launched_zombies == 5 && level.n_launched_zombies == 10 ) + { + level notify( "pts1_say_next_line" ); + } + wait 0,1; + } +} + +stage_logic_2() +{ +/# + iprintlnbold( "PTS2 Started" ); +#/ + watch_player_springpads( 1 ); + level thread wait_for_balls_launched(); + flag_wait( "pts_2_generator_1_started" ); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 2 ); + flag_wait( "pts_2_generator_2_started" ); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 2 ); + level thread maxis_balls_placed(); + stage_completed( "sq_2", "pts_2" ); +} + +wait_for_balls_launched() +{ + level.current_generator = 1; + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + _a138 = a_lion_spots; + _k138 = getFirstArrayKey( _a138 ); + while ( isDefined( _k138 ) ) + { + s_lion_spot = _a138[ _k138 ]; + s_lion_spot.a_place_ball_trigs = []; + s_lion_spot.springpad_buddy = getstruct( s_lion_spot.script_string, "script_noteworthy" ); + _k138 = getNextArrayKey( _a138, _k138 ); + } + a_players = getplayers(); + _a145 = a_players; + _k145 = getFirstArrayKey( _a145 ); + while ( isDefined( _k145 ) ) + { + player = _a145[ _k145 ]; + player.a_place_ball_trigs = []; + if ( isDefined( player.zm_sq_has_ball ) ) + { + player thread player_has_ball(); + } + _k145 = getNextArrayKey( _a145, _k145 ); + } + while ( 1 ) + { + level waittill( "zm_ball_picked_up", player ); + player thread player_has_ball(); + } +} + +player_has_ball() +{ + self thread player_set_down_ball_watcher(); +} + +player_set_down_ball_watcher() +{ + self waittill_either( "zm_sq_ball_putdown", "zm_sq_ball_used" ); + pts_putdown_trigs_remove_for_player( self ); +} + +sq_pts_create_use_trigger( v_origin, radius, height, str_hint_string ) +{ + t_pickup = spawn( "trigger_radius_use", v_origin, 0, radius, height ); + t_pickup setcursorhint( "HINT_NOICON" ); + t_pickup sethintstring( str_hint_string ); + t_pickup.targetname = "ball_place_trig"; + t_pickup triggerignoreteam(); + t_pickup usetriggerrequirelookat(); + return t_pickup; +} + +place_ball_think( t_place_ball, s_lion_spot ) +{ + t_place_ball endon( "delete" ); + t_place_ball waittill( "trigger" ); + pts_putdown_trigs_remove_for_spot( s_lion_spot ); + pts_putdown_trigs_remove_for_spot( s_lion_spot.springpad_buddy ); + self.zm_sq_has_ball = undefined; + s_lion_spot.which_ball = self.which_ball; + self notify( "zm_sq_ball_used" ); + s_lion_spot.zm_pts_animating = 1; + s_lion_spot.springpad_buddy.zm_pts_animating = 1; + flag_set( "pts_2_generator_" + level.current_generator + "_started" ); + s_lion_spot.which_generator = level.current_generator; + level.current_generator++; +/# + iprintlnbold( "Ball Animating" ); +#/ + s_lion_spot.springpad thread pts_springpad_fling( s_lion_spot.script_noteworthy, s_lion_spot.springpad_buddy.springpad ); + self.t_putdown_ball delete(); +} + +delete_all_springpads() +{ +} + +exit_stage_1( success ) +{ +} + +exit_stage_2( success ) +{ +} + +watch_player_springpads( is_generator ) +{ + level thread springpad_count_watcher( is_generator ); + a_players = get_players(); + _a240 = a_players; + _k240 = getFirstArrayKey( _a240 ); + while ( isDefined( _k240 ) ) + { + player = _a240[ _k240 ]; + player thread pts_watch_springpad_use( is_generator ); + _k240 = getNextArrayKey( _a240, _k240 ); + } +} + +pts_watch_springpad_use( is_generator ) +{ + self endon( "death" ); + self endon( "disconnect" ); + while ( !flag( "sq_branch_complete" ) ) + { + self waittill( "equipment_placed", weapon, weapname ); + if ( weapname == level.springpad_name ) + { + self is_springpad_in_place( weapon, is_generator ); + } + } +} + +springpad_count_watcher( is_generator ) +{ + level endon( "sq_pts_springad_count4" ); + str_which_spots = "pts_ghoul"; + if ( is_generator ) + { + str_which_spots = "pts_lion"; + } + a_spots = getstructarray( str_which_spots, "targetname" ); + while ( 1 ) + { + level waittill( "sq_pts_springpad_in_place" ); + n_count = 0; + _a279 = a_spots; + _k279 = getFirstArrayKey( _a279 ); + while ( isDefined( _k279 ) ) + { + s_spot = _a279[ _k279 ]; + if ( isDefined( s_spot.springpad ) ) + { + n_count++; + } + _k279 = getNextArrayKey( _a279, _k279 ); + } + level notify( "sq_pts_springad_count" + n_count ); + } +} + +is_springpad_in_place( m_springpad, is_generator ) +{ + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + a_ghoul_spots = getstructarray( "pts_ghoul", "targetname" ); + a_spots = arraycombine( a_lion_spots, a_ghoul_spots, 0, 0 ); + _a298 = a_spots; + _k298 = getFirstArrayKey( _a298 ); + while ( isDefined( _k298 ) ) + { + s_spot = _a298[ _k298 ]; + n_dist = distance2dsquared( m_springpad.origin, s_spot.origin ); + if ( n_dist < 1024 ) + { + v_spot_forward = vectornormalize( anglesToForward( s_spot.angles ) ); + v_pad_forward = vectornormalize( anglesToForward( m_springpad.angles ) ); + n_dot = vectordot( v_spot_forward, v_pad_forward ); +/# + iprintlnbold( "Trample Steam OFF: Dist(" + sqrt( n_dist ) + ") Dot(" + n_dot + ")" ); +#/ + if ( n_dot > 0,98 ) + { +/# + iprintlnbold( "Trample Steam IN PLACE: Dist(" + sqrt( n_dist ) + ") Dot(" + n_dot + ")" ); +#/ + level notify( "sq_pts_springpad_in_place" ); + s_spot.springpad = m_springpad; + self thread pts_springpad_removed_watcher( m_springpad, s_spot ); + if ( is_generator ) + { + wait 0,1; + level thread pts_should_springpad_create_trigs( s_spot ); + thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub ); + } + else + { + m_springpad.fling_scaler = 2; + m_springpad thread watch_zombie_flings(); + } + if ( isDefined( s_spot.script_float ) ) + { + s_target = getstruct( "sq_zombie_launch_target", "targetname" ); + v_override_dir = vectornormalize( s_target.origin - m_springpad.origin ); + v_override_dir = vectorScale( v_override_dir, 1024 ); + m_springpad.direction_vec_override = v_override_dir; + m_springpad.fling_scaler = s_spot.script_float; + } + return; + } + } + else + { + _k298 = getNextArrayKey( _a298, _k298 ); + } + } +} + +pts_springpad_fling( str_spot_name, m_buddy_springpad ) +{ + str_anim1 = undefined; + n_anim_length1 = undefined; + str_anim2 = undefined; + n_anim_length2 = undefined; + switch( str_spot_name ) + { + case "lion_pair_1": + str_anim1 = "dc"; + str_anim2 = "cd"; + break; + case "lion_pair_2": + str_anim1 = "ab"; + str_anim2 = "ba"; + break; + case "lion_pair_3": + str_anim1 = "cd"; + str_anim2 = "dc"; + break; + case "lion_pair_4": + str_anim1 = "ba"; + str_anim2 = "ab"; + break; + } + m_anim = spawn( "script_model", ( 2090, 675, 3542 ) ); + m_anim.angles = ( 0, 0, 0 ); + m_anim setmodel( "fxanim_zom_highrise_trample_gen_mod" ); + m_anim useanimtree( -1 ); + m_anim.targetname = "trample_gen_" + str_spot_name; + pts_springpad_anim_ball( m_buddy_springpad, m_anim, str_anim1, str_anim2 ); +} + +pts_springpad_anim_ball( m_buddy_springpad, m_anim, str_anim1, str_anim2 ) +{ + m_anim endon( "delete" ); + self endon( "delete" ); + m_buddy_springpad endon( "delete" ); + n_anim_length1 = getanimlength( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim1 ] ); + n_anim_length2 = getanimlength( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim2 ] ); + while ( isDefined( m_anim ) ) + { + self notify( "fling" ); + if ( isDefined( m_anim ) ) + { + m_anim setanim( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim1 ] ); + } + wait n_anim_length1; + m_buddy_springpad notify( "fling" ); + if ( isDefined( m_anim ) ) + { + m_anim setanim( level.scr_anim[ "fxanim_props" ][ "trample_gen_" + str_anim2 ] ); + } + wait n_anim_length2; + } +} + +pts_springpad_removed_watcher( m_springpad, s_spot ) +{ + self pts_springpad_waittill_removed( m_springpad ); + s_spot.springpad = undefined; +} + +pts_springpad_waittill_removed( m_springpad ) +{ + m_springpad endon( "delete" ); + m_springpad endon( "death" ); + self waittill_any( "death", "disconnect", "equip_springpad_zm_taken", "equip_springpad_zm_pickup" ); +} + +wait_for_all_springpads_placed( str_type, str_flag ) +{ + a_spots = getstructarray( str_type, "targetname" ); + while ( !flag( str_flag ) ) + { + is_clear = 0; + _a442 = a_spots; + _k442 = getFirstArrayKey( _a442 ); + while ( isDefined( _k442 ) ) + { + s_spot = _a442[ _k442 ]; + if ( !isDefined( s_spot.springpad ) ) + { + is_clear = 1; + } + _k442 = getNextArrayKey( _a442, _k442 ); + } + if ( !is_clear ) + { + flag_set( str_flag ); + } + wait 1; + } +} + +pts_should_player_create_trigs( player ) +{ + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + _a467 = a_lion_spots; + _k467 = getFirstArrayKey( _a467 ); + while ( isDefined( _k467 ) ) + { + s_lion_spot = _a467[ _k467 ]; + if ( isDefined( s_lion_spot.springpad ) && isDefined( s_lion_spot.springpad_buddy.springpad ) ) + { + pts_putdown_trigs_create_for_spot( s_lion_spot, player ); + } + _k467 = getNextArrayKey( _a467, _k467 ); + } +} + +pts_should_springpad_create_trigs( s_lion_spot ) +{ + while ( isDefined( s_lion_spot.springpad ) && isDefined( s_lion_spot.springpad_buddy.springpad ) ) + { + a_players = getplayers(); + _a481 = a_players; + _k481 = getFirstArrayKey( _a481 ); + while ( isDefined( _k481 ) ) + { + player = _a481[ _k481 ]; + if ( isDefined( player.zm_sq_has_ball ) && player.zm_sq_has_ball ) + { + pts_putdown_trigs_create_for_spot( s_lion_spot, player ); + pts_putdown_trigs_create_for_spot( s_lion_spot.springpad_buddy, player ); + } + _k481 = getNextArrayKey( _a481, _k481 ); + } + } +} + +pts_putdown_trigs_create_for_spot( s_lion_spot, player ) +{ + if ( isDefined( s_lion_spot.which_ball ) || isDefined( s_lion_spot.springpad_buddy ) && isDefined( s_lion_spot.springpad_buddy.which_ball ) ) + { + return; + } + t_place_ball = sq_pts_create_use_trigger( s_lion_spot.origin, 16, 70, &"ZM_HIGHRISE_SQ_PUTDOWN_BALL" ); + player clientclaimtrigger( t_place_ball ); + t_place_ball.owner = player; + player thread place_ball_think( t_place_ball, s_lion_spot ); + if ( !isDefined( s_lion_spot.pts_putdown_trigs ) ) + { + s_lion_spot.pts_putdown_trigs = []; + } + s_lion_spot.pts_putdown_trigs[ player.characterindex ] = t_place_ball; + level thread pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot ); +} + +pts_putdown_trigs_springpad_delete_watcher( player, s_lion_spot ) +{ + player pts_springpad_waittill_removed( s_lion_spot.springpad ); + pts_putdown_trigs_remove_for_spot( s_lion_spot ); + pts_putdown_trigs_remove_for_spot( s_lion_spot.springpad_buddy ); + level thread pts_reset_ball( s_lion_spot ); +} + +pts_reset_ball( s_lion_spot ) +{ + if ( isDefined( s_lion_spot.which_ball ) ) + { + s_lion_spot.sq_pickup_reset = 1; + s_lion_spot.which_ball notify( "sq_pickup_reset" ); + m_ball_anim = getent( "trample_gen_" + s_lion_spot.script_noteworthy, "targetname" ); + playfx( level._effect[ "sidequest_flash" ], m_ball_anim gettagorigin( "fxanim_zom_highrise_trample_gen1_jnt" ) ); + flag_clear( "pts_2_generator_" + s_lion_spot.which_generator + "_started" ); + level.current_generator--; + + s_lion_spot.which_ball = undefined; + m_ball_anim delete(); + } + else + { + if ( isDefined( s_lion_spot.springpad_buddy.which_ball ) ) + { + s_lion_spot.springpad_buddy.sq_pickup_reset = 1; + s_lion_spot.springpad_buddy.which_ball notify( "sq_pickup_reset" ); + m_ball_anim = getent( "trample_gen_" + s_lion_spot.springpad_buddy.script_noteworthy, "targetname" ); + playfx( level._effect[ "sidequest_flash" ], m_ball_anim gettagorigin( "fxanim_zom_highrise_trample_gen1_jnt" ) ); + flag_clear( "pts_2_generator_" + s_lion_spot.springpad_buddy.which_generator + "_started" ); + level.current_generator--; + + s_lion_spot.springpad_buddy.which_ball = undefined; + m_ball_anim delete(); + } + } +} + +pts_putdown_trigs_remove_for_player( player ) +{ + a_lion_spots = getstructarray( "pts_lion", "targetname" ); + _a554 = a_lion_spots; + _k554 = getFirstArrayKey( _a554 ); + while ( isDefined( _k554 ) ) + { + s_lion_spot = _a554[ _k554 ]; + if ( !isDefined( s_lion_spot.pts_putdown_trigs ) ) + { + } + else if ( isDefined( s_lion_spot.pts_putdown_trigs[ player.characterindex ] ) ) + { + s_lion_spot.pts_putdown_trigs[ player.characterindex ] delete(); + arrayremoveindex( s_lion_spot.pts_putdown_trigs, player.characterindex, 1 ); + } + _k554 = getNextArrayKey( _a554, _k554 ); + } +} + +pts_putdown_trigs_remove_for_spot( s_lion_spot ) +{ + if ( !isDefined( s_lion_spot.pts_putdown_trigs ) ) + { + return; + } + _a575 = s_lion_spot.pts_putdown_trigs; + _k575 = getFirstArrayKey( _a575 ); + while ( isDefined( _k575 ) ) + { + t_putdown = _a575[ _k575 ]; + t_putdown delete(); + _k575 = getNextArrayKey( _a575, _k575 ); + } + s_lion_spot.pts_putdown_trigs = []; +} + +richtofen_pts_instructions() +{ + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_0" ); +} + +richtofen_pts_placed() +{ + level waittill( "sq_pts_springad_count1" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_1" ); + level waittill( "sq_pts_springad_count2" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_2" ); + level waittill( "sq_pts_springad_count3" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_3" ); + level waittill( "sq_pts_springad_count4" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_place_trample_4" ); +} + +richtofen_zombies_launched() +{ + level waittill( "pts1_say_next_line" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_0" ); + wait 1; + level waittill( "pts1_say_next_line" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_1" ); + wait 1; + level waittill( "pts1_say_next_line" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_spill_blood_2" ); +} + +maxis_pts_instructions() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_0" ); +} + +maxis_pts_placed() +{ + level waittill( "sq_pts_springad_count1" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_1" ); + level waittill( "sq_pts_springad_count2" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_2" ); + level waittill( "sq_pts_springad_count4" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_3" ); +} + +maxis_balls_placed() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_create_trample_4" ); +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_sq_slb.gsc b/zm_highrise_patch/maps/mp/zm_highrise_sq_slb.gsc new file mode 100644 index 0000000..bf9d862 --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_sq_slb.gsc @@ -0,0 +1,199 @@ +#include maps/mp/zm_highrise_sq_pts; +#include maps/mp/zm_highrise_sq; +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init() +{ + flag_init( "sq_slb_first_ball_sniped" ); + flag_init( "sq_slb_richtofen_spoke" ); + declare_sidequest_stage( "sq", "slb", ::init_stage, ::stage_logic, ::exit_stage_1 ); +} + +init_stage() +{ + level._cur_stage_name = "slb"; + clientnotify( "slb" ); + level thread vo_maxis_slb_hint(); +} + +stage_logic() +{ +/# + iprintlnbold( "SLB Started" ); +#/ + snipe_balls_wait(); + stage_completed( "sq", level._cur_stage_name ); +} + +exit_stage_1( success ) +{ +} + +snipe_balls_wait() +{ + a_balls = getentarray( "sq_dragon_lion_ball", "targetname" ); + array_thread( a_balls, ::snipe_balls_watch_ball ); + is_complete = 0; + while ( !is_complete ) + { + level waittill( "zm_ball_shot" ); + wait 1; + is_complete = 1; + _a50 = a_balls; + _k50 = getFirstArrayKey( _a50 ); + while ( isDefined( _k50 ) ) + { + m_ball = _a50[ _k50 ]; + if ( isDefined( m_ball ) ) + { + is_complete = 0; + } + _k50 = getNextArrayKey( _a50, _k50 ); + } + } +/# + iprintlnbold( "All Balls Shot" ); +#/ +} + +snipe_balls_watch_ball() +{ + self endon( "delete" ); + a_snipers = array( "dsr50_zm", "dsr50_upgraded_zm+vzoom", "barretm82_zm", "barretm82_upgraded_zm+vzoom", "svu_zm", "svu_upgraded_zm+vzoom" ); + self setcandamage( 1 ); + while ( 1 ) + { + self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname ); + if ( maps/mp/zm_highrise_sq::sq_is_weapon_sniper( weaponname ) ) + { + level notify( "zm_ball_shot" ); + playsoundatposition( "zmb_sq_ball_ding", self.origin ); + playfx( level._effect[ "sidequest_flash" ], self.origin ); + str_noteworthy = self.script_noteworthy; + self delete(); + wait 0,5; + clientnotify( str_noteworthy ); + m_ball = getent( "sq_sliquify_r", "script_noteworthy" ); + if ( str_noteworthy == "m_drg_tail" ) + { + m_ball = getent( "sq_sliquify_m", "script_noteworthy" ); + } + playfx( level._effect[ "sidequest_flash" ], m_ball.origin ); + m_ball show(); + m_ball thread lion_ball_enable_pickup(); + if ( !flag( "sq_slb_first_ball_sniped" ) ) + { + flag_set( "sq_slb_first_ball_sniped" ); + level thread vo_atd_ball1_sniped(); + break; + } + else + { + level thread vo_maxis_atd_ball2_sniped(); + } + } + } +} + +lion_ball_enable_pickup() +{ + self endon( "sq_sliquified" ); + while ( 1 ) + { + self.can_pickup = 1; + self.t_pickup = sq_slb_create_use_trigger( self.origin, 32, 70, &"ZM_HIGHRISE_SQ_PICKUP_BALL" ); + while ( self.can_pickup ) + { + self.t_pickup waittill( "trigger", player ); + if ( !isDefined( player.zm_sq_has_ball ) ) + { + player.zm_sq_has_ball = 1; + player.which_ball = self; + self.can_pickup = 0; + self.player = player; + flag_set( "sq_ball_picked_up" ); + level thread maps/mp/zm_highrise_sq_pts::pts_should_player_create_trigs( player ); + level notify( "zm_ball_picked_up" ); + } + } + self.t_pickup delete(); + self hide(); + self setcandamage( 0 ); + wait 1; + self.t_putdown = sq_slb_create_use_trigger( self.origin, 16, 70, &"ZM_HIGHRISE_SQ_PUTDOWN_BALL" ); + self.player clientclaimtrigger( self.t_putdown ); + self.player.t_putdown_ball = self.t_putdown; + self ball_pickup_waittill_change(); + play_spark = 0; + if ( !isDefined( self.t_putdown ) ) + { + self waittill( "sq_pickup_reset" ); + play_spark = 1; + } + else + { + self.t_putdown delete(); + } + self.player notify( "zm_sq_ball_putdown" ); + if ( play_spark ) + { + self.sq_pickup_reset = undefined; + playfx( level._effect[ "sidequest_flash" ], self.origin ); + } + self show(); + self setcandamage( 1 ); + self.player.zm_sq_has_ball = undefined; + self.player = undefined; + wait 1; + } +} + +ball_pickup_waittill_change() +{ + self endon( "sq_pickup_reset" ); + self.t_putdown waittill_any_return( "trigger", "delete", "reset" ); +} + +sq_slb_create_use_trigger( v_origin, radius, height, str_hint_string ) +{ + t_pickup = spawn( "trigger_radius_use", v_origin, 0, radius, height ); + t_pickup setcursorhint( "HINT_NOICON" ); + t_pickup sethintstring( str_hint_string ); + t_pickup.targetname = "ball_pickup_trig"; + t_pickup triggerignoreteam(); + t_pickup usetriggerrequirelookat(); + return t_pickup; +} + +vo_richtofen_atd_ball_sniped() +{ + if ( !flag( "sq_slb_richtofen_spoke" ) ) + { + flag_set( "sq_slb_richtofen_spoke" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sec_symbols_4" ); + } +} + +vo_maxis_slb_hint() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_0" ); +} + +vo_maxis_atd_ball1_sniped() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_1" ); +} + +vo_maxis_atd_ball2_sniped() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_2" ); +} + +vo_atd_ball1_sniped() +{ + vo_richtofen_atd_ball_sniped(); + level thread vo_maxis_atd_ball1_sniped(); +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_sq_ssp.gsc b/zm_highrise_patch/maps/mp/zm_highrise_sq_ssp.gsc new file mode 100644 index 0000000..cd166cf --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_sq_ssp.gsc @@ -0,0 +1,328 @@ +#include maps/mp/zm_highrise_sq; +#include maps/mp/zombies/_zm_spawner; +#include maps/mp/zombies/_zm_sidequests; +#include maps/mp/zombies/_zm_utility; +#include maps/mp/_utility; +#include common_scripts/utility; + +init_1() +{ + flag_init( "ssp1_ball0_complete" ); + flag_init( "ssp1_ball1_complete" ); + flag_init( "ssp1_complete" ); + declare_sidequest_stage( "sq_1", "ssp_1", ::init_stage_1, ::stage_logic_1, ::exit_stage_1 ); +} + +init_2() +{ + flag_init( "ssp2_maxis_keep_going_said" ); + flag_init( "ssp2_maxis_reincarnate_said" ); + flag_init( "ssp2_corpses_in_place" ); + flag_init( "ssp2_resurrection_done" ); + flag_init( "ssp2_statue_complete" ); + maps/mp/zombies/_zm_spawner::add_custom_zombie_spawn_logic( ::ssp_2_zombie_death_check ); + declare_sidequest_stage( "sq_2", "ssp_2", ::init_stage_2, ::stage_logic_2, ::exit_stage_2 ); +} + +init_stage_1() +{ + clientnotify( "ssp_1" ); + level thread vo_richtofen_instructions(); +} + +init_stage_2() +{ + clientnotify( "ssp_2" ); + level thread vo_maxis_start_ssp(); +} + +stage_logic_1() +{ +/# + iprintlnbold( "SSP1 Started" ); +#/ + ssp1_sliquify_balls(); + stage_completed( "sq_1", "ssp_1" ); +} + +ssp1_sliquify_balls() +{ + a_balls = getentarray( "sq_sliquify_ball", "targetname" ); + level thread vo_sliquify_fail_watch(); + level thread ssp1_advance_dragon(); + level thread vo_richtofen_sliquify_confirm(); + level thread vo_maxis_sliquify_fail(); + i = 0; + while ( i < a_balls.size ) + { + a_balls[ i ] thread ssp1_watch_ball( "ssp1_ball" + i + "_complete" ); + i++; + } + while ( !flag( "ssp1_ball0_complete" ) || !flag( "ssp1_ball1_complete" ) ) + { + flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" ); + wait 0,5; + } + maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 2 ); +} + +ssp1_watch_ball( str_complete_flag ) +{ + self watch_model_sliquification( 20, str_complete_flag ); + self thread ssp1_rotate_ball(); + self playloopsound( "zmb_sq_ball_rotate_loop", 0,25 ); +} + +ssp1_rotate_ball() +{ + while ( isDefined( self ) ) + { + self rotateyaw( 360, 1 ); + wait 0,9; + } +} + +ssp1_advance_dragon() +{ + flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" ); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "r", 2 ); +} + +stage_logic_2() +{ +/# + iprintlnbold( "SSP2 Started" ); +#/ + level thread ssp2_advance_dragon(); + corpse_room_watcher(); + stage_completed( "sq_2", "ssp_2" ); +} + +corpse_room_watcher() +{ + t_corpse_room = getent( "corpse_room_trigger", "targetname" ); + n_count = 0; + while ( !flag( "ssp2_resurrection_done" ) ) + { + level waittill( "ssp2_corpse_made", is_in_room ); + if ( is_in_room ) + { + n_count++; + } + else + { + n_count = 0; + } + if ( n_count == 1 && !flag( "ssp2_maxis_keep_going_said" ) ) + { + flag_set( "ssp2_maxis_keep_going_said" ); + level thread maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_0" ); + continue; + } + else + { + if ( n_count >= 15 ) + { +/# + iprintlnbold( "Corpse Count Reached" ); +#/ + level thread vo_maxis_ssp_reincarnate(); + flag_set( "ssp2_corpses_in_place" ); + corpse_room_revive_watcher(); + level notify( "end_revive_watcher" ); + } + } + } +} + +ssp_2_zombie_death_check() +{ + self waittill( "death" ); + if ( !isDefined( self ) ) + { + return; + } + t_corpse_room = getent( "corpse_room_trigger", "targetname" ); + if ( self istouching( t_corpse_room ) ) + { + level notify( "ssp2_corpse_made" ); + } + else + { + level notify( "ssp2_corpse_made" ); + } +} + +corpse_room_cleanup_watcher() +{ + level endon( "ssp2_resurrection_done" ); + t_corpse_room = getent( "corpse_room_trigger", "targetname" ); + while ( 1 ) + { + wait 1; + a_corpses = getcorpsearray(); + if ( a_corpses.size < 15 ) + { + level thread vo_maxis_ssp_fail(); + level notify( "end_revive_watcher" ); + return; + } + n_count = 0; + _a206 = a_corpses; + _k206 = getFirstArrayKey( _a206 ); + while ( isDefined( _k206 ) ) + { + m_corpse = _a206[ _k206 ]; + if ( m_corpse istouching( t_corpse_room ) ) + { + n_count++; + } + _k206 = getNextArrayKey( _a206, _k206 ); + } + if ( n_count < 15 ) + { + level thread vo_maxis_ssp_fail(); + level notify( "end_revive_watcher" ); + return; + } + } +} + +corpse_room_revive_watcher() +{ + level endon( "end_revive_watcher" ); + weaponname = "none"; + str_type = "none"; + t_corpse_room_dmg = getent( "corpse_room_trigger", "targetname" ); + while ( weaponname != "knife_ballistic_upgraded_zm" || str_type != "MOD_IMPACT" ) + { + t_corpse_room_dmg waittill( "damage", amount, inflictor, direction, point, type ); + if ( isplayer( inflictor ) ) + { + weaponname = inflictor.currentweapon; + str_type = type; + } + } +/# + iprintlnbold( "Revive Complete" ); +#/ + vo_maxis_ssp_complete(); + flag_set( "ssp2_resurrection_done" ); +} + +ssp2_advance_dragon() +{ + flag_wait( "ssp2_corpses_in_place" ); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 1 ); + flag_wait( "ssp2_resurrection_done" ); + maps/mp/zm_highrise_sq::light_dragon_fireworks( "m", 2 ); +} + +exit_stage_1( success ) +{ + flag_set( "ssp1_complete" ); +} + +exit_stage_2( success ) +{ +} + +watch_model_sliquification( n_end_limit, str_complete_flag ) +{ + n_count = 0; + self setcandamage( 1 ); + while ( !flag( str_complete_flag ) ) + { + self waittill( "damage", amount, attacker, direction, point, mod, tagname, modelname, partname, weaponname ); + if ( issubstr( weaponname, "slipgun" ) && !flag( "sq_ball_picked_up" ) ) + { + n_count++; + if ( n_count >= n_end_limit ) + { +/# + iprintlnbold( "MODEL COMPLETE: " + str_complete_flag ); +#/ + self notify( "sq_sliquified" ); + if ( isDefined( self.t_pickup ) ) + { + self.t_pickup delete(); + } + flag_set( str_complete_flag ); + break; + } + else if ( n_count == 1 ) + { + level notify( "ssp1_ball_first_sliquified" ); + break; + } + else + { + if ( n_count == 10 ) + { + level notify( "ssp1_ball_sliquified_2" ); + } + } + } + } +} + +vo_richtofen_instructions() +{ + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_0" ); + wait 10; + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_1" ); +} + +vo_sliquify_fail_watch() +{ + flag_wait( "sq_ball_picked_up" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_fail_1" ); +} + +vo_richtofen_sliquify_confirm() +{ + level waittill( "ssp1_ball_first_sliquified" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_2" ); + level waittill( "ssp1_ball_sliquified_2" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_3" ); + flag_wait( "ssp1_complete" ); + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_4" ); + wait 10; + maps/mp/zm_highrise_sq::richtofensay( "vox_zmba_sidequest_sliquif_balls_5" ); +} + +vo_maxis_sliquify_fail() +{ + flag_wait_any( "ssp1_ball0_complete", "ssp1_ball1_complete" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_fail_3" ); +} + +vo_maxis_start_ssp() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_3" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_lion_balls_4" ); +} + +vo_maxis_ssp_reincarnate() +{ + if ( !flag( "ssp2_maxis_reincarnate_said" ) ) + { + flag_set( "ssp2_maxis_reincarnate_said" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_1" ); + } + else + { + flag_clear( "ssp2_maxis_reincarnate_said" ); + } +} + +vo_maxis_ssp_fail() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_5" ); +} + +vo_maxis_ssp_complete() +{ + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_3" ); + maps/mp/zm_highrise_sq::maxissay( "vox_maxi_sidequest_reincar_zombie_6" ); +} diff --git a/zm_highrise_patch/maps/mp/zm_highrise_utility.gsc b/zm_highrise_patch/maps/mp/zm_highrise_utility.gsc new file mode 100644 index 0000000..75eecc5 --- /dev/null +++ b/zm_highrise_patch/maps/mp/zm_highrise_utility.gsc @@ -0,0 +1,280 @@ +#include maps/mp/zombies/_zm_ffotd; +#include maps/mp/zombies/_zm_zonemgr; +#include maps/mp/zombies/_zm_utility; +#include common_scripts/utility; +#include maps/mp/_utility; + +main_start() +{ + level thread spawned_collision_fix(); + level thread kill_trigger_spawn(); +} + +main_end() +{ + connect_zones_for_ffotd( "zone_orange_level3a", "zone_orange_level3b", 0 ); + connect_zones_for_ffotd( "zone_orange_elevator_shaft_middle_1", "zone_orange_elevator_shaft_top", 1 ); + level thread pathfinding_override_fix(); +} + +spawned_collision_fix() +{ + precachemodel( "collision_geo_512x512x512_standard" ); + precachemodel( "collision_geo_32x32x128_standard" ); + precachemodel( "collision_geo_64x64x256_standard" ); + precachemodel( "collision_wall_128x128x10_standard" ); + precachemodel( "collision_wall_256x256x10_standard" ); + flag_wait( "start_zombie_round_logic" ); + if ( !is_true( level.optimise_for_splitscreen ) ) + { + collision1 = spawn( "script_model", ( 2992, 536, 497 ) ); + collision1 setmodel( "collision_geo_512x512x512_standard" ); + collision1.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision1 ghost(); + collision2 = spawn( "script_model", ( 2824, 632, 497 ) ); + collision2 setmodel( "collision_geo_512x512x512_standard" ); + collision2.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision2 ghost(); + collision3 = spawn( "script_model", ( 2992, 536, -15 ) ); + collision3 setmodel( "collision_geo_512x512x512_standard" ); + collision3.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision3 ghost(); + collision4 = spawn( "script_model", ( 2824, 632, -15 ) ); + collision4 setmodel( "collision_geo_512x512x512_standard" ); + collision4.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision4 ghost(); + collision5 = spawn( "script_model", ( 2992, 536, -527 ) ); + collision5 setmodel( "collision_geo_512x512x512_standard" ); + collision5.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision5 ghost(); + collision6 = spawn( "script_model", ( 2824, 632, -527 ) ); + collision6 setmodel( "collision_geo_512x512x512_standard" ); + collision6.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision6 ghost(); + collision7 = spawn( "script_model", ( 2992, 536, -1039 ) ); + collision7 setmodel( "collision_geo_512x512x512_standard" ); + collision7.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision7 ghost(); + collision8 = spawn( "script_model", ( 2824, 632, -1039 ) ); + collision8 setmodel( "collision_geo_512x512x512_standard" ); + collision8.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision8 ghost(); + collision9 = spawn( "script_model", ( 2992, 536, -1551 ) ); + collision9 setmodel( "collision_geo_512x512x512_standard" ); + collision9.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision9 ghost(); + collision10 = spawn( "script_model", ( 2824, 632, -1551 ) ); + collision10 setmodel( "collision_geo_512x512x512_standard" ); + collision10.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision10 ghost(); + collision11 = spawn( "script_model", ( 2992, 536, -2063 ) ); + collision11 setmodel( "collision_geo_512x512x512_standard" ); + collision11.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision11 ghost(); + collision12 = spawn( "script_model", ( 2824, 632, -2063 ) ); + collision12 setmodel( "collision_geo_512x512x512_standard" ); + collision12.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision12 ghost(); + collisione1 = spawn( "script_model", ( 1649, 2164, 2843 ) ); + collisione1 setmodel( "collision_wall_256x256x10_standard" ); + collisione1.angles = ( 0, 0, 0 ); + collisione1 ghost(); + collisione2 = spawn( "script_model", ( 1649, 2164, 2587 ) ); + collisione2 setmodel( "collision_wall_256x256x10_standard" ); + collisione2.angles = ( 0, 0, 0 ); + collisione2 ghost(); + collisione3 = spawn( "script_model", ( 1478, 1216, 2843 ) ); + collisione3 setmodel( "collision_wall_256x256x10_standard" ); + collisione3.angles = vectorScale( ( 0, 0, 0 ), 270 ); + collisione3 ghost(); + collisione4 = spawn( "script_model", ( 1478, 1216, 2587 ) ); + collisione4 setmodel( "collision_wall_256x256x10_standard" ); + collisione4.angles = vectorScale( ( 0, 0, 0 ), 270 ); + collisione4 ghost(); + collisione5 = spawn( "script_model", ( 1478, 1216, 2331 ) ); + collisione5 setmodel( "collision_wall_256x256x10_standard" ); + collisione5.angles = vectorScale( ( 0, 0, 0 ), 270 ); + collisione5 ghost(); + collisione6 = spawn( "script_model", ( 1478, 1216, 2242 ) ); + collisione6 setmodel( "collision_wall_256x256x10_standard" ); + collisione6.angles = vectorScale( ( 0, 0, 0 ), 270 ); + collisione6 ghost(); + collision13 = spawn( "script_model", ( 2251, 2687, 3095 ) ); + collision13 setmodel( "collision_wall_128x128x10_standard" ); + collision13.angles = vectorScale( ( 0, 0, 0 ), 270 ); + collision13 ghost(); + collision14 = spawn( "script_model", ( 2046, 1270, 2758 ) ); + collision14 setmodel( "collision_geo_512x512x512_standard" ); + collision14.angles = vectorScale( ( 0, 0, 0 ), 6,20013 ); + collision14 ghost(); + collision15 = spawn( "script_model", ( 2518, 597, 3191 ) ); + collision15 setmodel( "collision_wall_128x128x10_standard" ); + collision15.angles = ( 0, 240,4, -3,00014 ); + collision15 ghost(); + collision16 = spawn( "script_model", ( 2613, -721, 1184 ) ); + collision16 setmodel( "collision_wall_128x128x10_standard" ); + collision16.angles = ( 0, 60, -2,60003 ); + collision16 ghost(); + collision17 = spawn( "script_model", ( 2721, -533, 1184 ) ); + collision17 setmodel( "collision_wall_128x128x10_standard" ); + collision17.angles = ( 0, 60, -2,60003 ); + collision17 ghost(); + collision18 = spawn( "script_model", ( 2940, 1512, 3004 ) ); + collision18 setmodel( "collision_geo_64x64x256_standard" ); + collision18.angles = vectorScale( ( 0, 0, 0 ), 350 ); + collision18 ghost(); + collision19 = spawn( "script_model", ( 1631, -235, 2943 ) ); + collision19 setmodel( "collision_geo_32x32x128_standard" ); + collision19.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision19 ghost(); + collision20 = spawn( "script_model", ( 2232, -579, 1354 ) ); + collision20 setmodel( "collision_wall_128x128x10_standard" ); + collision20.angles = vectorScale( ( 0, 0, 0 ), 330 ); + collision20 ghost(); + collision21 = spawn( "script_model", ( 2349, 805, 1346 ) ); + collision21 setmodel( "collision_geo_32x32x128_standard" ); + collision21.angles = vectorScale( ( 0, 0, 0 ), 8,6 ); + collision21 ghost(); + collision22 = spawn( "script_model", ( 2791, 1093, 1272 ) ); + collision22 setmodel( "collision_geo_32x32x128_standard" ); + collision22.angles = vectorScale( ( 0, 0, 0 ), 3,2 ); + collision22 ghost(); + collision23 = spawn( "script_model", ( 2222, 1488, 3280 ) ); + collision23 setmodel( "collision_geo_32x32x128_standard" ); + collision23.angles = ( 0, 0, 0 ); + collision23 ghost(); + collision24 = spawn( "script_model", ( 2222, 1488, 3312 ) ); + collision24 setmodel( "collision_geo_32x32x128_standard" ); + collision24.angles = ( 0, 0, 0 ); + collision24 ghost(); + } +} + +connect_zones_for_ffotd( zone_name_a, zone_name_b, one_way ) +{ + if ( !isDefined( one_way ) ) + { + one_way = 0; + } + zone_init( zone_name_a ); + zone_init( zone_name_b ); + enable_zone( zone_name_a ); + enable_zone( zone_name_b ); + if ( !isDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) ) + { + level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] = spawnstruct(); + } + level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = 1; + if ( !one_way ) + { + if ( !isDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) ) + { + level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] = spawnstruct(); + } + level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = 1; + } +} + +kill_trigger_spawn() +{ + trig = spawn( "trigger_box", ( 3328, 160, 1480 ), 0, 96, 200, 128 ); + trig.angles = vectorScale( ( 0, 0, 0 ), 150 ); + trig.targetname = "instant_death"; + trig2 = spawn( "trigger_box", ( 2512, 1824, 1488 ), 0, 140, 140, 128 ); + trig2.angles = ( 0, 0, 0 ); + trig2.targetname = "instant_death"; +} + +pathfinding_override_fix() +{ + zombie_trigger_origin = ( 2303, 746, 1296 ); + zombie_trigger_radius = 30; + zombie_trigger_height = 128; + player_trigger_origin = ( 2357, 778, 1304 ); + player_trigger_radius = 40; + zombie_goto_point = ( 2361, 738, 1304 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3767, 1867, 2790 ); + zombie_trigger_radius = 64; + zombie_trigger_height = 128; + player_trigger_origin = ( 3684, 1772, 2758 ); + player_trigger_radius = 70; + zombie_goto_point = ( 3659, 1872, 2790 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3245, 1251, 1347,79 ); + zombie_trigger_radius = 64; + zombie_trigger_height = 128; + player_trigger_origin = ( 3246, 1126, 1347,79 ); + player_trigger_radius = 64; + zombie_goto_point = ( 3031, 1234, 1278,12 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3246, 1113, 1347,79 ); + zombie_trigger_radius = 64; + zombie_trigger_height = 128; + player_trigger_origin = ( 3245, 1230, 1347,79 ); + player_trigger_radius = 44; + zombie_goto_point = ( 3023, 1154, 1278,12 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3389, 1182, 1364,79 ); + zombie_trigger_radius = 64; + zombie_trigger_height = 128; + player_trigger_origin = ( 3246, 1126, 1347,79 ); + player_trigger_radius = 64; + zombie_goto_point = ( 3381, 1093, 1364,79 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3148, 1712, 1299,07 ); + zombie_trigger_radius = 64; + zombie_trigger_height = 128; + player_trigger_origin = ( 3149, 1604, 1302,2 ); + player_trigger_radius = 44; + zombie_goto_point = ( 3259, 1644, 1321,5 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3149, 1584, 1302,2 ); + zombie_trigger_radius = 64; + zombie_trigger_height = 128; + player_trigger_origin = ( 3148, 1692, 1299,07 ); + player_trigger_radius = 44; + zombie_goto_point = ( 3291, 1684, 1321,5 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + zombie_trigger_origin = ( 3818, 1860, 2789,23 ); + zombie_trigger_radius = 100; + zombie_trigger_height = 128; + player_trigger_origin = ( 3601, 1961, 2744,95 ); + player_trigger_radius = 50; + zombie_goto_point = ( 3626, 1918, 2750,26 ); + level thread maps/mp/zombies/_zm_ffotd::path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point ); + all_nodes = getallnodes(); + _a331 = all_nodes; + _k331 = getFirstArrayKey( _a331 ); + while ( isDefined( _k331 ) ) + { + node = _a331[ _k331 ]; + if ( node.origin[ 0 ] == 3598,2 ) + { + deletepathnode( node ); + return; + } + else + { + _k331 = getNextArrayKey( _a331, _k331 ); + } + } +} + +highrise_link_nodes( a, b ) +{ + if ( nodesarelinked( a, b ) ) + { + return; + } + link_nodes( a, b ); +} + +highrise_unlink_nodes( a, b ) +{ + if ( !nodesarelinked( a, b ) ) + { + return; + } + unlink_nodes( a, b ); +}