mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-10 07:08:06 -05:00
530 lines
18 KiB
Plaintext
530 lines
18 KiB
Plaintext
#include maps\mp\zm_highrise_elevators;
|
|
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
#include maps\mp\gametypes_zm\_hostmigration;
|
|
#include maps\mp\zm_highrise_utility;
|
|
#include maps\mp\zm_highrise_distance_tracking;
|
|
#include maps\mp\animscripts\zm_shared;
|
|
#include maps\mp\zombies\_zm_ai_basic;
|
|
#include maps\mp\zombies\_zm_ai_leaper;
|
|
|
|
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";
|
|
level.elevator_perks_building["green"][1] = spawnstruct();
|
|
level.elevator_perks_building["green"][1].model = "p6_zm_vending_chugabud";
|
|
level.elevator_perks_building["green"][1].script_noteworthy = "specialty_finalstand";
|
|
level.elevator_perks_building["green"][1].turn_on_notify = "chugabud_on";
|
|
level.elevator_perks_building["green"][2] = spawnstruct();
|
|
level.elevator_perks_building["green"][2].model = "zombie_vending_sleight";
|
|
level.elevator_perks_building["green"][2].script_noteworthy = "specialty_fastreload";
|
|
level.elevator_perks_building["green"][2].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["green"] = array_randomize( level.elevator_perks_building["green"] );
|
|
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 = [];
|
|
perk_structs = getstructarray( "zm_random_machine", "script_noteworthy" );
|
|
|
|
for ( i = 0; i < perk_structs.size; i++ )
|
|
{
|
|
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" );
|
|
}
|
|
|
|
green_structs = [];
|
|
blue_structs = [];
|
|
|
|
foreach ( perk_struct in random_perk_structs )
|
|
{
|
|
if ( isdefined( perk_struct.script_parameters ) )
|
|
{
|
|
if ( issubstr( perk_struct.script_parameters, "bldg1" ) )
|
|
{
|
|
green_structs[green_structs.size] = perk_struct;
|
|
continue;
|
|
}
|
|
|
|
blue_structs[blue_structs.size] = perk_struct;
|
|
}
|
|
}
|
|
|
|
green_structs = array_randomize( green_structs );
|
|
blue_structs = array_randomize( blue_structs );
|
|
level.random_perk_structs = green_structs;
|
|
level.random_perk_structs = arraycombine( level.random_perk_structs, blue_structs, 0, 0 );
|
|
|
|
for ( i = 0; i < level.elevator_perks.size; i++ )
|
|
{
|
|
if ( !isdefined( level.random_perk_structs[i] ) )
|
|
continue;
|
|
|
|
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];
|
|
}
|
|
}
|
|
|
|
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 );
|
|
|
|
flag_wait( "power_on" );
|
|
|
|
elevator.body perkelevatordoor( 1 );
|
|
next = undefined;
|
|
|
|
while ( true )
|
|
{
|
|
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] );
|
|
}
|
|
|
|
if ( isdefined( elevator.body.force_starting_floor ) )
|
|
skipinitialwait = 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] )
|
|
{
|
|
elevator.dir = "_d";
|
|
}
|
|
else
|
|
{
|
|
elevator.dir = "_u";
|
|
}
|
|
|
|
clientnotify( elevator.name + elevator.dir );
|
|
}
|
|
|
|
if ( is_true( start_location ) )
|
|
{
|
|
elevator.body thread squashed_death_alarm();
|
|
|
|
if ( !skipinitialwait )
|
|
{
|
|
elevator.body.start_location_wait = 1;
|
|
|
|
elevator.body notify( "startwait" );
|
|
event = elevator.body waittill_any_timeout( 3, "forcego" );
|
|
|
|
elevator.body.start_location_wait = 0;
|
|
|
|
if ( event == "forcego" )
|
|
{
|
|
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] )
|
|
{
|
|
elevator.dir = "_d";
|
|
}
|
|
else
|
|
{
|
|
elevator.dir = "_u";
|
|
}
|
|
|
|
clientnotify( elevator.name + elevator.dir );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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 );
|
|
}
|
|
}
|
|
|
|
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] )
|
|
{
|
|
elevator.dir = "_d";
|
|
}
|
|
else
|
|
{
|
|
elevator.dir = "_u";
|
|
}
|
|
|
|
clientnotify( elevator.name + elevator.dir );
|
|
}
|
|
}
|
|
|
|
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 ) && !is_true( elevator.body.elevator_stop ) )
|
|
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_move_sound()
|
|
{
|
|
self playsound( "zmb_elevator_ding" );
|
|
|
|
wait 0.4;
|
|
|
|
if ( !is_true( self.is_moving ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
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" );
|
|
}
|
|
|
|
elevator_roof_watcher()
|
|
{
|
|
level endon( "end_game" );
|
|
|
|
while ( true )
|
|
{
|
|
self.trig waittill( "trigger", who );
|
|
|
|
if ( isdefined( who ) && isplayer( who ) )
|
|
{
|
|
while ( isdefined( who ) && who istouching( self.trig ) )
|
|
{
|
|
if ( self.is_moving )
|
|
self waittill_any( "movedone", "forcego" );
|
|
|
|
if ( self.current_level == 0 )
|
|
{
|
|
break; // don't make climber at top level
|
|
}
|
|
|
|
zombies = getaiarray( level.zombie_team );
|
|
|
|
if ( isdefined( zombies ) && zombies.size > 0 )
|
|
{
|
|
foreach ( zombie in zombies )
|
|
{
|
|
climber = zombie zombie_for_elevator_unseen();
|
|
|
|
if ( isdefined( climber ) )
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( climber ) )
|
|
{
|
|
zombie zombie_climb_elevator( self );
|
|
wait( randomint( 30 ) );
|
|
}
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
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 = [];
|
|
|
|
for ( i = 0; i < elevator_names.size; i++ )
|
|
elevators[i] = getent( "elevator_" + elevator_names[i] + "_body", "targetname" );
|
|
|
|
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 ( true )
|
|
{
|
|
foreach ( point in spawn_points )
|
|
{
|
|
should_block = 0;
|
|
|
|
foreach ( elevator in elevators )
|
|
{
|
|
if ( distancesquared( elevator getCentroid(), point.origin ) <= dist_check )
|
|
should_block = 1;
|
|
}
|
|
|
|
if ( should_block )
|
|
{
|
|
point.is_enabled = 0;
|
|
point.is_blocked = 1;
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( point.is_blocked ) && point.is_blocked )
|
|
point.is_blocked = 0;
|
|
|
|
if ( !isdefined( point.zone_name ) )
|
|
continue;
|
|
|
|
zone = level.zones[point.zone_name];
|
|
|
|
if ( zone.is_enabled && zone.is_active && zone.is_spawning_allowed )
|
|
point.is_enabled = 1;
|
|
}
|
|
|
|
players = get_players();
|
|
|
|
foreach ( volume in elevator_volumes )
|
|
{
|
|
should_disable = 0;
|
|
|
|
foreach ( player in players )
|
|
{
|
|
if ( is_player_valid( player ) )
|
|
{
|
|
if ( player istouching( volume ) )
|
|
should_disable = 1;
|
|
}
|
|
}
|
|
|
|
if ( should_disable )
|
|
disable_elevator_spawners( volume, spawn_points );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
watch_for_elevator_during_faller_spawn()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "risen" );
|
|
self endon( "spawn_anim" );
|
|
|
|
flag_wait( "power_on" );
|
|
|
|
elevator_bodies = [];
|
|
foreach ( elevator in level.elevators )
|
|
{
|
|
elevator_bodies[elevator_bodies.size] = elevator.body;
|
|
}
|
|
|
|
elevator_body = get_closest_2d( self.zombie_faller_location.origin, elevator_bodies );
|
|
|
|
while ( true )
|
|
{
|
|
should_gib = 0;
|
|
|
|
if ( is_true( elevator_body.is_moving ) )
|
|
{
|
|
if ( self istouching( elevator_body ) )
|
|
{
|
|
should_gib = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( is_true( self.zombie_faller_location.is_blocked ) )
|
|
{
|
|
should_gib = 1;
|
|
}
|
|
}
|
|
|
|
if ( should_gib )
|
|
{
|
|
playfx( level._effect["zomb_gib"], self.origin );
|
|
|
|
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();
|
|
|
|
break;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
} |