1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 15:17:57 -05:00
Files
BO2-Reimagined/scripts/zm/replaced/zm_highrise_sq_pts.gsc

360 lines
10 KiB
Plaintext

#include maps\mp\zm_highrise_sq_pts;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_sidequests;
#include maps\mp\zm_highrise_sq;
#include maps\mp\zombies\_zm_unitrigger;
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 );
}
stage_logic_1()
{
watch_player_springpads( 0 );
flag_set( "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" );
}
stage_logic_2()
{
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" );
}
watch_player_springpads( is_generator )
{
level thread springpad_count_watcher( is_generator );
a_players = get_players();
foreach ( player in a_players )
player thread pts_watch_springpad_use( 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 ( true )
{
level waittill( "sq_pts_springpad_in_place" );
n_count = 0;
foreach ( s_spot in a_spots )
{
if ( isdefined( s_spot.springpad ) )
n_count++;
}
level notify( "sq_pts_springad_count" + n_count );
}
}
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 thread is_springpad_in_place( weapon, is_generator );
}
}
is_springpad_in_place( m_springpad, is_generator )
{
m_springpad endon( "death" );
m_springpad waittill( "armed" );
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 );
foreach ( s_spot in a_spots )
{
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 );
if ( n_dot > 0.98 )
{
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;
if ( 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;
}
break;
}
}
}
}
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 < 15 )
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 < 15 )
{
self waittill( "fling", zombies_only );
if ( zombies_only )
{
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;
}
}
wait_for_balls_launched()
{
level.current_generator = 1;
a_lion_spots = getstructarray( "pts_lion", "targetname" );
foreach ( s_lion_spot in a_lion_spots )
{
s_lion_spot.a_place_ball_trigs = [];
}
a_players = getplayers();
foreach ( player in a_players )
{
player.a_place_ball_trigs = [];
if ( isdefined( player.zm_sq_has_ball ) )
player thread player_set_down_ball_watcher();
}
while ( true )
{
level waittill( "zm_ball_picked_up", player );
player thread player_set_down_ball_watcher();
}
}
player_set_down_ball_watcher()
{
self waittill_any( "zm_sq_ball_putdown", "zm_sq_ball_used" );
pts_putdown_trigs_remove_for_player( self );
}
pts_should_player_create_trigs( player )
{
a_lion_spots = getstructarray( "pts_lion", "targetname" );
foreach ( s_lion_spot in a_lion_spots )
{
if ( isdefined( s_lion_spot.springpad ) && !isdefined( s_lion_spot.which_ball ) )
{
pts_putdown_trigs_create_for_spot( s_lion_spot, player );
return true;
}
}
return false;
}
pts_should_springpad_create_trigs( s_lion_spot )
{
if ( isdefined( s_lion_spot.springpad ) && !isdefined( s_lion_spot.which_ball ) )
{
a_players = getplayers();
foreach ( player in a_players )
{
if ( isdefined( player.zm_sq_has_ball ) && player.zm_sq_has_ball )
{
pts_putdown_trigs_create_for_spot( s_lion_spot, player );
return true;
}
}
}
return false;
}
pts_putdown_trigs_create_for_spot( s_lion_spot, player )
{
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 );
}
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();
return t_pickup;
}
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 );
}
place_ball_think( t_place_ball, s_lion_spot )
{
t_place_ball endon( "delete" );
while (1)
{
t_place_ball waittill( "trigger" );
if (!is_true( self.zm_sq_has_ball ) )
{
continue;
}
pts_putdown_trigs_remove_for_spot( s_lion_spot );
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;
flag_set( "pts_2_generator_" + level.current_generator + "_started" );
s_lion_spot.which_generator = level.current_generator;
level.current_generator++;
s_lion_spot.springpad thread pts_springpad_fling( s_lion_spot.script_noteworthy );
thread maps\mp\zombies\_zm_unitrigger::register_unitrigger( self.buildablespringpad.stub );
self.t_putdown_ball delete();
}
}
#using_animtree("fxanim_props");
pts_springpad_fling( str_spot_name )
{
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( #animtree );
m_anim.targetname = "trample_gen_" + str_spot_name;
pts_springpad_anim_ball( m_anim, str_anim1, str_anim2 );
}
pts_springpad_anim_ball( m_anim, str_anim1, str_anim2 )
{
m_anim endon( "delete" );
self 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] );
self notify( "fling", 1 );
if ( isdefined( m_anim ) )
m_anim setanim( level.scr_anim["fxanim_props"]["trample_gen_" + str_anim1] );
wait( n_anim_length1 );
}