IW4-Dump-Files/maps/_climb.gsc

4442 lines
112 KiB
Plaintext
Raw Normal View History

2017-07-08 11:47:21 -07:00
#include maps\_utility;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_climb_anim;
#include maps\_vehicle;
#include maps\_hud_util;
CONST_min_stick_move = 0.5;
climb_init()
{
if ( level.script == "climb" )
level.friendly_init_cliffhanger = ::empty;
player_jumpdown_block = GetEnt( "player_jumpdown_block", "targetname" );
player_jumpdown_block NotSolid();
level.price_climb_time = 0;
level._effect[ "icepick_impact_rock" ] = LoadFX( "misc/ice_pick" );
level._effect[ "icepick_impact_snow" ] = LoadFX( "misc/ice_pick" );
level._effect[ "icepick_impact_ice" ] = LoadFX( "misc/ice_pick" );
level._effect[ "ice_pick_scrape" ] = LoadFX( "misc/ice_pick_scrape" );
level._effect[ "climbing_cracks_1" ] = LoadFX( "impacts/climbing_cracks_1" );
level._effect[ "climbing_cracks_2" ] = LoadFX( "impacts/climbing_cracks_2" );
level._effect[ "climbing_cracks_3" ] = LoadFX( "impacts/climbing_cracks_3" );
// level._effect[ "climbing_cracks_4" ] = LoadFX( "impacts/climbing_cracks_4" );
// level._effect[ "climbing_cracks_5" ] = LoadFX( "impacts/climbing_cracks_5" );
SoundSetTimeScaleFactor( "Announcer", 0.0 );
SoundSetTimeScaleFactor( "Music", 0 );
level._effect[ "footstep_ice_climbing" ] = LoadFX( "impacts/footstep_ice_climbing" );
//Player Climb Pick FX
tracefx = add_trace_fx( "player_ice_pick" );
tracefx.surface = "ice";
tracefx.fx_array = [];
tracefx.fx_array[ 0 ] = LoadFX( "impacts/climbing_cracks_1" );
tracefx.fx_array[ 1 ] = LoadFX( "misc/ice_pick" );
tracefx.rumble = "icepick_climb";
tracefx.sound = "icepick_impact_ice";
//Price Climb Pick FX
tracefx = add_trace_fx( "ice_pick" );
tracefx.surface = "ice";
tracefx.fx = LoadFX( "misc/ice_pick_large" );
tracefx.sound = "icepick_impact_ice_npc";
//Price Climb Pick FX
tracefx = add_trace_fx( "ice_pick_out" );
tracefx.surface = "ice";
tracefx.fx = LoadFX( "misc/ice_pick_large" );
tracefx.sound = "icepick_pullout_ice_npc";
//Player slide fx
tracefx = add_trace_fx( "slide_fx" );
tracefx.surface = "ice";
tracefx.fx = LoadFX( "misc/ice_pick_scrape" );
//tracefx.sound = "icepick_impact_ice";
thread player_slides_off_cliff();
/*
//Price Climb Foot FX - Tried hooking up but didn't work very good since the feet are in the ground, so I just played fxontag
tracefx = add_trace_fx( "footstep_ice_climbing" );
tracefx.surface = "ice";
tracefx.surface = "snow";
tracefx.surface = "default";
tracefx.surface = "rock";
tracefx.fx = LoadFX( "impacts/footstep_ice_climbing" );
tracefx.sound = "step_walk_ice";
*/
level._effect[ "cigar_glow" ] = LoadFX( "fire/cigar_glow" );
level._effect[ "cigar_glow_puff" ] = LoadFX( "fire/cigar_glow_puff" );
level._effect[ "cigar_smoke_puff" ] = LoadFX( "smoke/cigarsmoke_puff" );
level._effect[ "cigar_exhale" ] = LoadFX( "smoke/cigarsmoke_exhale" );
level.trace_depth = 4.75;// 6.25;
level.additive_weight = 0.2;
level.additive_count = 0;
level.additive_arm_boost = 4;
level.climb_wrist_mod = 4.2;
level.ice_pick_tags = [];
level.ice_pick_tags[ "left" ] = "tag_weapon_left";
level.ice_pick_tags[ "right" ] = "tag_weapon_right";
PreCacheModel( "viewmodel_ice_picker" );
PreCacheModel( "viewmodel_ice_picker_03" );
//precacheModel( "weapon_m14_cloth_wrap_silencer" );
PreCacheModel( "prop_price_cigar" );
PreCacheModel( "weapon_ice_picker" );
PreCacheItem( "ice_picker" );
PreCacheItem( "ice_picker_bigjump" );
PreCacheRumble( "icepick_slide" );
PreCacheRumble( "icepick_hang" );
PreCacheRumble( "icepick_climb" );
PreCacheRumble( "icepick_release" );
PreCacheRumble( "falling_land" );
level.ice_pick_viewweapon = "ice_picker";
create_dvar( "climb_thirdperson", 0 );
create_dvar( "climb_add", 0 );
create_dvar( "climb_automove", 0 );
create_dvar( "climb_startdir", "up" );
create_dvar( "climb_preview", 0 );
player_animations();
friendly_climb_anims();
// Hold ^3[{+speed_throw}]^7 to swing your left icepick.
add_hint_string( "left_icepick", &"CLIFFHANGER_LEFT_ICEPICK", ::should_stop_hanging_left_icepick_hint );
// Hold ^3[{+attack}]^7 to swing your right icepick.
add_hint_string( "right_icepick", &"CLIFFHANGER_RIGHT_ICEPICK", ::should_stop_hanging_right_icepick_hint );
// Approach the ice and hold ^3[{+attack}]^7 to climb.
add_hint_string( "how_to_climb", &"CLIFFHANGER_HOW_TO_CLIMB", ::should_stop_how_to_climb_hint );
//trigger = GetEnt( "climb_trigger", "script_noteworthy" );
//trigger SetHintString( "Hold &&1 to climb" );
//level.climb_use_trigger = trigger;
flag_init( "we_care_about_right_icepick" );
flag_init( "finished_climbing" );
flag_init( "reached_top" );
flag_init( "flyin_complete" );
flag_init( "player_hangs_on" );
flag_init( "player_preps_for_jump" );
flag_init( "player_makes_the_jump" );
flag_init( "price_caught_player" );
flag_init( "price_climbs_past_start" );
flag_init( "player_begins_to_climb" );
flag_init( "player_climbed_3_steps" );
flag_init( "final_climb" );
flag_init( "flying_in" );
flag_init( "player_was_caught" );
flag_init( "player_starts_climbing" );
flag_init( "slam_zoom_started" );
flag_init( "climbing_dof" );
if ( GetDvarInt( "climb_preview" ) )
run_thread_on_targetname( "climb_model", ::climb_preview_anim );
else
run_thread_on_targetname( "climb_model", ::self_delete );
battlechatter_off( "allies" );
battlechatter_off( "axis" );
thread give_player_icepicker_ammo();
thread blend_in_climbing_dof( 3 );
climb_tests = GetEntArray( "climb_test", "targetname" );
climb_catch = GetEnt( "climb_catch", "targetname" );
climb_catch Hide();
array_call( climb_tests, ::Hide );
//thread earthquake_flyover();
thread toggle_jump_ramp();
//run_thread_on_targetname( "trace", ::trace_test );
//NotifyOnCommand( "jump", "+gostand" );
//NotifyOnCommand( "jump", "+moveup" );
}
toggle_jump_ramp()
{
ramp_toggles_until_jump_over();
player_ramp_block = GetEnt( "player_ramp_block", "targetname" );
player_ramp_block Delete();
triggers = getEntArrayWithFlag( "ramp_block_notsolid" );
foreach ( trigger in triggers )
{
trigger Delete();
}
}
ramp_toggles_until_jump_over()
{
level endon( "reached_top" );
player_ramp_block = GetEnt( "player_ramp_block", "targetname" );
for ( ;; )
{
flag_wait( "ramp_block_notsolid" );
add_wait( ::player_stops_moving );
add_wait( ::_wait, 0.5 );
do_wait_any();
player_ramp_block NotSolid();
flag_waitopen( "ramp_block_notsolid" );
player_ramp_block Solid();
}
}
player_stops_moving()
{
for ( ;; )
{
vel = level.player GetVelocity();
velocity = Distance( ( vel[ 0 ], vel[ 1 ], 0 ), ( 0, 0, 0 ) );
if ( velocity < 75 )
return;
wait( 0.05 );
}
}
empty()
{
}
death_trigger()
{
flag_clear( "fade_to_death" );
flag_wait( "fade_to_death" );
level.player PlaySound( "cliff_plyr_fall_scream" );
SetSavedDvar( "compass", "0" );
SetSavedDvar( "ammoCounterHide", 1 );
SetSavedDvar( "actionSlotsHide", 1 );
SetSavedDvar( "hud_showStance", 0 );
//SetSavedDvar( "hud_drawhud", 0 );
VisionSetNaked( "black_bw", 2.5 );
wait( 2.5 );
level.player PlayRumbleOnEntity( "falling_land" );
wait( 0.5 );
if ( flag( "ramp_block_notsolid" ) )
{
if ( !flag( "reached_top" ) )
{
if ( GetDvarInt( "hold_on_tight" ) )
{
// Hold on for dear life.
SetDvar( "ui_deadquote", &"CLIFFHANGER_HOLD_ON_TIGHT" );
}
else
{
SetDvar( "hold_on_tight", 1 );
// Nobody makes the first jump...
SetDvar( "ui_deadquote", &"CLIFFHANGER_MAKES_FIRST_JUMP" );
}
maps\_utility::missionFailedWrapper();
}
}
level.player Kill();
}
earthquake_flyover()
{
flag_wait( "mig_flies_over" );
mig_flies_over = getEntWithFlag( "mig_flies_over" );
Earthquake( 0.5, 3, mig_flies_over.origin, 10000 );
}
give_player_icepicker_ammo()
{
if ( flag( "reached_top" ) )
return;
level endon( "reached_top" );
for ( ;; )
{
if ( player_has_weapon( level.ice_pick_viewweapon ) )
{
level.player GiveMaxAmmo( level.ice_pick_viewweapon );
level.player SetWeaponAmmoClip( level.ice_pick_viewweapon, 90 );
}
wait( 1 );
}
}
kill_on_slip()
{
level endon( "reached_top" );
if ( flag( "reached_top" ) )
return;
for ( ;; )
{
flag_waitopen( "flying_in" );
if ( level.player.origin[ 2 ] < - 1000 )
break;
wait( 0.05 );
}
level.player Kill();
}
player_rig_test()
{
wait( 1 );
org = ( 0, 0, 0 );
model = spawn_anim_model( "player_rig" );
for ( ;; )
{
//model.origin = org + randomvector( 30 );
model.angles = ( RandomIntRange( 0, 360 ), RandomIntRange( 0, 360 ), RandomIntRange( 0, 360 ) );
//model.origin += (0,0,1 );
wait( 0.05 );
}
}
tag_flies_in_on_vehicle( vehicle )
{
vehicle endon( "reached_end_node" );
dest = GetEnt( "player_climb_start", "targetname" );
timer = 0.2;
for ( ;; )
{
self MoveTo( vehicle.origin, timer, 0, 0 );
angles = VectorToAngles( dest.origin - self.origin );
self.angles = angles;
wait( timer );
}
}
old_crazy_fly_in()
{
slowmo_start();
slowmo_setspeed_slow( 2 );
slowmo_setlerptime_in( 0.05 );
slowmo_lerp_in();
level.player SetDepthOfField( 0, 0, 15000, 20000, 4, 4 );
thread maps\_introscreen::introscreen_generic_white_fade_in( 1.25, 2 );
thread maps\_blizzard::blizzard_level_transition_snowmobile( 0.05 );
SetExpFog( 2000, 20000, level.fog_color[ "r" ], level.fog_color[ "g" ], level.fog_color[ "b" ], .47, 0 );
// thread maps\_blizzard::blizzard_level_transition_climbing( .05 );
maps\_blizzard::blizzard_overlay_clear();
level.player TakeAllWeapons();
flag_set( "flying_in" );
//fly_in_spawner
vehicle = spawn_vehicle_from_targetname_and_drive( "fly_in_spawner" );
level.fly_in_vehicle = vehicle;
helis = spawn_vehicles_from_targetname_and_drive( "fly_in_heli" );
level.player PlayerLinkToDelta( vehicle, "tag_origin", 1, 0, 0, 0, 0 );
//tag_origin tag_flies_in_on_vehicle( vehicle );
//tag_origin Delete();
//flag_wait( "fade_to_white" );
wait( 16 );
foreach ( heli in helis )
heli Delete();
thread maps\_introscreen::introscreen_generic_white_fade_in( 0.5, 1, 2 );
slowmo_setlerptime_out( 0.5 );
slowmo_lerp_out();
slowmo_end();
wait( 2.5 );
vehicle Delete();
vehicle = spawn_vehicle_from_targetname_and_drive( "fly_in_spawner_cliff_repeat" );
level.player PlayerLinkToDelta( vehicle, "tag_origin", 1, 0, 0, 0, 0 );
// thread maps\_introscreen::introscreen_generic_white_fade_in( 0.1, 1.0, 0 );
wait( 4.5 );
thread maps\_introscreen::introscreen_generic_white_fade_in( 2, 0.5, 1.5 );
//vehicle waittill( "reached_end_node" );
wait( 2.0 );
vehicle Delete();
}
get_dof_from_distance_to_price( climb_cam )
{
dist = Distance( level.player.origin, climb_cam.origin );
dof[ "nearStart" ] = 1;
dof[ "nearEnd" ] = dist - 4000;
if ( dof[ "nearEnd" ] < 100 )
dof[ "nearEnd" ] = 100;
dof[ "nearBlur" ] = 5;
dof[ "farStart" ] = dist + 1000;
dof[ "farEnd" ] = dist + 2000;
dof[ "farBlur" ] = 2;
return dof;
}
keep_price_in_focus( original_dof )
{
//level endon( "finished_slam_zoom" );
mid_dof = original_dof;
mid_dof[ "farStart" ] = 400;
mid_dof[ "farEnd" ] = 600;
mid_dof[ "farBlur" ] = 4;
climb_cam = GetEnt( "player_climb_start", "targetname" );
for ( ;; )
{
if ( flag( "nearing_top_of_slam_zoom" ) )
break;
// if ( Distance( climb_cam.origin, level.player.origin ) < 400 )
// break;
level.dofDefault = get_dof_from_distance_to_price( climb_cam );
wait( 0.05 );
}
// blend back to normal dof
blend_dof( level.dofDefault, mid_dof, 0.5 );
wait( 3 );
blend_dof( level.dofDefault, original_dof, 2 );
}
blizzard_lead_fx()
{
self endon( "death" );
while ( 1 )
{
if ( self.veh_speed > 50 )
{
PlayFX( level._effect[ "blizzard_level_1" ], self.origin );
// wait( .3 );
}
wait( 0.1 );
}
}
faux_player_on_mountain()
{
spawner = GetEnt( "faux_player_spawner", "targetname" );
guy = spawner StalingradSpawn();
guy.team = "allies";
ent = GetEnt( "faux_player_ent", "targetname" );
guy gun_remove();
ent anim_generic_first_frame( guy, "faux_player" );
wait( 8 );
ent thread anim_generic( guy, "faux_player" );
wait( 4 );
guy Delete();
spawner Delete();
ent Delete();
}
fly_up_the_mountain()
{
thread maps\_introscreen::introscreen_generic_white_fade_in( 0.1, 1 );
SetSavedDvar( "compass", "0" );
original_dof = level.dofDefault;
level.dofDefault[ "nearStart" ] = 1;
level.dofDefault[ "nearEnd" ] = 1;
level.dofDefault[ "nearBlur" ] = 4;
level.dofDefault[ "farStart" ] = 10000;
level.dofDefault[ "farEnd" ] = 20000;
level.dofDefault[ "farBlur" ] = 2;
// thread maps\_blizzard::blizzard_level_transition_snowmobile( 0.05 );
maps\_blizzard::blizzard_overlay_clear();
climb_cam = GetEnt( "player_climb_start", "targetname" );
climb_cam.angles = ( 16.5, climb_cam.angles[ 1 ], 0 );
level.player TakeAllWeapons();
level.player GiveWeapon( level.ice_pick_viewweapon, 0, 1 );
slam_zoom_path = GetVehicleNode( "slam_zoom_path", "targetname" );
vehicle = spawn_vehicle_from_targetname( "fly_in_spawner" );
fx_veh = spawn_vehicle_from_targetname( "fly_in_fx" );
fx_veh thread blizzard_lead_fx();
level.fly_in_vehicle = vehicle;
vehicle AttachPath( slam_zoom_path );
fx_veh AttachPath( slam_zoom_path );
//vehicle thread blizzard_lead_fx();
level.player PlayerLinkTo( vehicle, "tag_origin", 1, 0, 0, 0, 0, 0 );
// disable rumble for the migs for the fly in
old_rumble = level.vehicle_rumble[ "mig29" ];
level.vehicle_rumble[ "mig29" ] = undefined;
delayThread( 1.95, ::spawn_vehicles_from_targetname_and_drive, "slam_zoom_mig" );
thread faux_player_on_mountain();
start = level.dofDefault;
end = get_dof_from_distance_to_price( climb_cam );
blend_dof( start, end, 0.7 );
//migs = spawn_vehicles_from_targetname_and_drive( "slam_zoom_mig" );
fx_veh StartPath();
vehicle StartPath();
flag_set( "slam_zoom_started" );
thread keep_price_in_focus( original_dof );
vehicle waittill( "reached_end_node" );
vehicle Delete();
fx_veh Delete();
wait( 0.5 );
//level notify( "finished_slam_zoom" );
level.player Unlink();
flag_set( "can_save" );
thread autosave_now_silent();
thread death_trigger();
// level.player Unlink();
// maps\_introscreen::flying_intro( climb_cam.angles, climb_cam.origin );
flag_clear( "flying_in" );
level.vehicle_rumble[ "mig29" ] = old_rumble;
SetSavedDvar( "compass", "1" );
// */
/*
climb_cam = GetEnt( "climb_cam", "targetname" );
model = climb_cam spawn_tag_origin();
timer = 0;
level.player PlayerLinkToBlend( model, "tag_origin", 0, 0, 0 );
climb_cam delayThread( 2, ::self_delete );
climb_cam = GetEnt( climb_cam.target, "targetname" );
timer = 4.5;
model MoveTo( climb_cam.origin, timer, 0, timer );
model RotateTo( climb_cam.angles, timer * 2, 0, timer );
wait( 1.4 );
timer = 0.5;
model MoveTo( climb_cam.origin, timer, 0, timer );
model RotateTo( climb_cam.angles, timer * 2, 0, timer );
wait( timer - 0.05 );
climb_cam = GetEnt( "player_climb_start", "targetname" );
timer = 0.5;
model MoveTo( climb_cam.origin, timer, 0, timer );
model RotateTo( climb_cam.angles, timer * 2, 0, timer );
wait( timer + 0.5 );
model Delete();
level.player Unlink();
*/
}
teleport_to_cave()
{
SetSavedDvar( "compass", "0" );
SetSavedDvar( "ammoCounterHide", 1 );
SetSavedDvar( "actionSlotsHide", 1 );
SetSavedDvar( "hud_showStance", 0 );
thread maps\_introscreen::introscreen_generic_white_fade_in( 1.25, 2 );
climb_cam = GetEnt( "player_climb_start", "targetname" );
climb_cam.angles = ( 16.5, climb_cam.angles[ 1 ], 0 );
level.player SetOrigin( climb_cam.origin + ( 0, 0, -12 ) );
level.player SetPlayerAngles( climb_cam.angles );
level.player Unlink();
flag_clear( "price_begins_climbing" );
flag_set( "flyin_complete" );
level.player AllowProne( false );
level.player AllowSprint( false );
wait( 0.05 );// needed to set the stance > <
level.player SetStance( "crouch" );
level.player TakeAllWeapons();
level.player GiveWeapon( level.ice_pick_viewweapon, 0, 1 );
}
player_mantles_top()
{
for ( ;; )
{
if ( level.player CanMantle() )
{
level.player Unlink();
level.player ForceMantle();
//level.player.mantled = true;
thread player_big_jump();
return;
}
wait( 0.05 );
}
}
climb_wall( start_org, start_ang )
{
level.player SetMoveSpeedScale( 0.35 );
//thread maps\_blizzard::blizzard_level_transition_climbing( .01 );
//thread player_mantles_top();
MusicPlayWrapper( "cliffhanger_climbing_music" );
skip_first_wait = false;
if ( !skip_first_wait )
{
flag_wait( "player_gets_on_wall" );
}
player_climb_blocker = GetEnt( "player_climb_blocker", "targetname" );
player_climb_blocker Delete();
starting_climb_brush = GetEnt( "starting_climb_brush", "targetname" );
player_jump_blocker = GetEnt( "player_jump_blocker", "targetname" );
for ( ;; )
{
player_jump_blocker Solid();
starting_climb_brush NotSolid();
if ( !skip_first_wait )
{
wait_until_player_climbs();
}
starting_climb_brush Solid();
skip_first_wait = false;
//self TakeAllWeapons();
//level.climb_use_trigger trigger_off();
player_jump_blocker NotSolid();
if ( player_finishes_climbing( start_org, start_ang ) )
{
break;
}
level.player GiveWeapon( level.ice_pick_viewweapon, 0, 1 );
level.player SwitchToWeapon( level.ice_pick_viewweapon );
//level.climb_use_trigger trigger_on();
// flag_clear( "player_gets_on_wall" );
// flag_wait( "player_gets_on_wall" );
}
level.player SetMoveSpeedScale( 1 );
}
get_forward_from_ent( ent )
{
ent_targ = GetEnt( ent.target, "targetname" );
angles = VectorToAngles( ent_targ.origin - ent.origin );
angles = ( 0, angles[ 1 ], 0 );
return AnglesToForward( angles );
}
wait_until_player_climbs()
{
player_climb_yaw_check = GetEnt( "player_climb_yaw_check", "targetname" );
climb_forward = get_forward_from_ent( player_climb_yaw_check );
autosaved = false;
hint_time = GetTime() + 3000;
displayed_hint = false;
for ( ;; )
{
if ( !displayed_hint && GetTime() > hint_time )
{
displayed_hint = true;
display_hint( "how_to_climb" );
}
if ( !flag( "player_in_position_to_climb" ) )
level.player AllowFire( true );
flag_wait( "player_in_position_to_climb" );
if ( level.player GetStance() != "stand" )
{
level.player AllowFire( true );
wait( 0.05 );
continue;
}
player_angles = level.player GetPlayerAngles();
if ( player_angles[ 0 ] >= 28 )
{
level.player AllowFire( true );
wait( 0.05 );
continue;
}
player_angles = ( 0, player_angles[ 1 ], 0 );
player_forward = AnglesToForward( player_angles );
dot = VectorDot( player_forward, climb_forward );
if ( dot < 0.6 )
{
level.player AllowFire( true );
wait( 0.05 );
continue;
}
level.player AllowFire( false );
level.player SwitchToWeapon( level.ice_pick_viewweapon );
if ( !autosaved )
thread autosave_now_silent();
autosaved = true;
if ( level.player rightSwingPressed() )
return;
if ( level.player leftSwingPressed() )
return;
wait( 0.05 );
}
}
rightSwingPressed()
{
return level.player buttonpressed( "mouse2" );// adsButtonPressed();
}
leftSwingPressed()
{
return level.player buttonpressed( "mouse1" ); // attackButtonPressed();
}
set_normal_fov()
{
SetSavedDvar( "cg_fov", 65 );
/*
fov = GetDvarInt( "cg_fov" );
for ( i = fov; i >= 65; i-- )
{
SetSavedDvar( "cg_fov", i );
wait( 0.05 );
}*/
}
set_zoomed_fov()
{
SetSavedDvar( "cg_fov", 78 );
/*
fov = GetDvarInt( "cg_fov" );
for ( i = fov; i <= 78; i++ )
{
SetSavedDvar( "cg_fov", i );
wait( 0.05 );
}
*/
}
modellines( start_org, start_ang, model )
{
for ( ;; )
{
Line( start_org, model GetTagOrigin( "tag_player" ), ( 1, 0, 0 ) );
wait( 0.05 );
}
}
player_finishes_climbing( start_org, start_ang, no_relink, skipRelink )
{
level.player AllowCrouch( false );
level.player AllowProne( false );
level.player AllowSprint( false );
flag_set( "player_starts_climbing" );
model = spawn_anim_model( "player_rig", start_org );
//model DontInterpolate();
model.angles = start_ang;
//model Hide();
// pick = spawn_anim_model( "icepick" );
// pick LinkTo( model, "tag_weapon", (0,0,0), (0,0,0) );
// anim_spawn_model( "viewmodel_ice_picker", "pick", anime, tag )
model anim_spawn_tag_model( "viewmodel_ice_picker", "tag_weapon_right" );
model anim_spawn_tag_model( "viewmodel_ice_picker_03", "tag_weapon_left" );
/#
model thread draw_ent_num();
#/
tag_origin = Spawn( "script_model", ( 0, 0, 0 ) );
tag_origin SetModel( "tag_origin" );
tag_origin Hide();
tag_origin LinkTo( model, "tag_player" );
// self PlayerSetGroundReferenceEnt( tag_origin );
anims = [];
thread set_zoomed_fov();
////////////////////////////////////////////////////////////////////
// PLAYER LINKING
////////////////////////////////////////////////////////////////////
// fov = 90;
// model thread lerp_player_view_to_tag_oldstyle( self, "tag_player", 0.2, 1, fov, fov, fov * 0.2, fov * ( 2 / 3 ) );
// model thread maps\_debug::dragTagUntilDeath( "tag_player", (1,1,0) );
// model thread maps\_debug::dragTagUntilDeath( "tag_origin", (1,0,0) );
arms = [];
arms[ arms.size ] = "left";
arms[ arms.size ] = "right";
button_functions = [];
button_functions[ "left" ] = ::leftSwingPressed;
button_functions[ "right" ] = ::rightSwingPressed;
arm_ents = [];
keys = [];
keys[ "left" ] = "j";
keys[ "right" ] = "k";
angles = model.angles;
forward = AnglesToForward( angles );
up = AnglesToUp( angles );
right = AnglesToRight( angles );
// global arm vars that are not arm specific
arm_globals = SpawnStruct();
arm_globals.arm_weight = 0.01;
arm_globals.fake_models = [];
arm_globals.player = self;
arm_globals.stab_notetrack = false;
arm_globals.current_arm = "left";
arm_globals.org_difference = ( 0, 0, 0 );
arm_globals.climbing = true;
arm_globals.ground_ref_ent_set = false;
arm_globals.ground_ref_ent = tag_origin;
arm_globals.climb_count = 0;
flag_set( "climbing_dof" );
// set the player's lookat angle info for determining stab angles
//model thread test_player_angle( arm_globals );
//model thread maps\_debug::drawTagForever( "tag_origin" );
start_dir = GetDvar( "climb_startdir" );
arm_globals.start_climb_time = 0;
relink_time = 0;
if ( level.gameskill <= 1 )
relink_time = 10000;
foreach ( arm in arms )
{
struct = Spawn( "script_origin", ( 0, 0, 0 ) );
key = keys[ arm ];
struct.key = key;
struct.arm = arm;
if ( IsDefined( no_relink ) )// && arm == "right" )
struct.last_button_press = GetTime() + relink_time;
else
struct.last_button_press = 0;
struct.stabbed = true;
struct.viewmodel = model;
struct.anims = anims[ arm ];
struct.anims = get_anims_for_climbing_direction( struct.anims, start_dir, arm );
struct.climb_dir = start_dir;
struct.player = self;
struct.buttonCheck = button_functions[ arm ];
thread button_detection( struct );
struct.globals = arm_globals;
struct.additive_type = "additive_in";
struct.additive_weight = 0;
struct.surface_type = "ice";
//thread generate_notetrack_times( struct );
//thread spawn_additive_models( struct );
fx_tag_name = get_icepick_tag_name( arm );
struct.fx_tag = spawn_icepick_fx_tag( model, fx_tag_name );
struct.fx_tag.swinging = false;
struct thread icepick_impact_fx( struct.fx_tag, model );
//struct.fx_tag thread maps\_debug::drawTagForever( "tag_origin" );
//struct.fx_tag thread test_line();
arm_ents[ arm ] = struct;
}
arm_globals.arm_ents = arm_ents;
//wait( 2.5 );
ent = arm_ents[ arm_globals.current_arm ];
level.arm_ent_globals = arm_globals;
thread sleeve_flap( ent.viewModel );
// set up random waits
assign_random_waits( ent );
level.stabs_completed = 0;
//arm_ent.viewModel SetAnimLimited( arm_ent.anims[ "climb" ], 1, 0, 1 );
other_arm_ent = get_other_arm_ent( ent );
ent.viewModel SetAnim( other_arm_ent.anims[ "idle" ], 1, 0, 1 );
//thread wrist_test( arm_ent );
//thread right_add_test( arm_ent );
ent.player.jumped = false;
if ( !isdefined( no_relink ) )
{
flag_set( "we_care_about_right_icepick" );
// used for the initial getting on the wall
player_relinks_to_tag( ent );
}
else
{
if ( level.gameSkill < 2 )
flag_clear( "we_care_about_right_icepick" );
else
flag_set( "we_care_about_right_icepick" );
thread player_gets_back_into_climbing( ent );
arm_globals.start_climb_time = GetTime();
}
//thread player_jump_check( ent );
stabbed = true;// controls if you must hold for the first stab, to stay on
fall_time = GetTime() + 8000;
stop_climbing = false;
thread track_trigger_pulls( arm_globals );
climb_count = 0;
e3_start = is_e3_start();
e3_skipout_time = 0;
for ( ;; )
{
if ( flag( "finished_climbing" ) )
{
stop_climbing = true;
break;
}
if ( e3_start && flag( "final_climb" ) )
{
if ( climb_count == 2 && e3_skipout_time == 0 )
{
fade_time = 1.5;
e3_skipout_time = GetTime();
level.black_overlay = create_client_overlay( "black", 0, level.player );
level.black_overlay FadeOverTime( fade_time );
level.black_overlay.alpha = 1;
// In the interest of time..
level.e3_text_overlay = maps\cliffhanger_code::e3_text_hud( &"CLIFFHANGER_E3_INTEREST_OF_TIME" );
level.e3_text_overlay FadeOverTime( fade_time );
level.e3_text_overlay.alpha = 1;
}
else
if ( climb_count >= 2 && GetTime() > e3_skipout_time + 2000 )
{
tag_origin Delete();
level.player AllowFire( true );
level.player AllowCrouch( true );
level.player AllowProne( true );
level.player AllowSprint( true );
flag_set( "finished_climbing" );
level.player disableweapons();
ent.viewModel notify( "stop_crack" ); // stop the rumble
flag_clear( "climbing_dof" );
return true;
}
}
// if ( IsDefined( level.player.mantled ) )
// break;
ent = arm_globals.arm_ents[ arm_globals.current_arm ];
other_arm = get_other_arm( arm_globals.current_arm );
other_arm_ent = arm_ents[ other_arm ];
if ( should_fall( stabbed, fall_time, ent ) )
{
stop_climbing = player_falls_to_death( ent );
break;
}
if ( arm_completes_stab( arm_ents[ arm_globals.current_arm ], skipRelink ) )
{
fall_time = GetTime() + 8000;
// to require the player to release the button to stab again.
ent.button_press_num_last = ent.button_press_num;
// switch arms when you complete a stab
arm_globals.current_arm = get_other_arm( arm_globals.current_arm );
stabbed = true;
climb_count++;
}
else
wait( 0.05 );
if ( flag( "finished_climbing" ) )
{
stop_climbing = true;
break;
}
skipRelink = undefined;
// special case situations
if ( !arm_globals.climbing )
{
flag_wait( "climb_start" );
flag_waitopen( "climb_pullup" );
ent = arm_ents[ arm_globals.current_arm ];
player_gets_back_on_wall( ent );
// while ( movement_stick_pressed( arm_ent ) )
while ( icepick_button_pressed( ent ) )
wait( 0.05 );
}
}
tag_origin Delete();
if ( IsDefined( model ) )
model Delete();
if ( stop_climbing )
{
level.player AllowFire( true );
level.player AllowCrouch( true );
level.player AllowProne( true );
level.player AllowSprint( true );
thread set_normal_fov();
flag_clear( "climbing_dof" );
}
return stop_climbing;
}
player_falls_to_death( ent )
{
ent.viewModel notify( "stop_crack" );
if ( flag( "final_climb" ) )
{
timer = 0.5;
flag_clear( "can_save" );
// throw the player off the cliff
movent = spawn_tag_origin();
movent.origin = level.player.origin + ( 0, 0, 32 );
movent.angles = ent.viewModel GetTagAngles( "tag_player" );
level.player Unlink();
ent.player PlayerSetGroundReferenceEnt( undefined );
level.player SetPlayerAngles( movent.angles );
wait( 0.1 );
// ent.viewModel Hide();
anims = ent.anims;
mult = 2;
ent.viewModel SetFlaggedAnimKnobAllRestart( "anim", anims[ "fall" ], anims[ "root" ], 1, 0.35, mult );
ent.viewModel MoveTo( movent.origin, timer, 0.1, 0 );
level.player PlayerLinkToBlend( movent, "tag_origin", 0.5, 0.1, 0 );
wait( timer );
movent Delete();
cleanup_player_arms( ent );
angles = ( -15, -100, 0 );
forward = AnglesToForward( angles );
level.player SetVelocity( forward * 50 );
level.player BeginSliding();
wait( 1.2 );
flag_set( "fade_to_death" );
level waittill( "foreverever" );
}
if ( flag( "player_climbs_past_safe_point" ) )
{
flag_clear( "can_save" );
fall_to_your_death( ent );
return true;
}
ent = get_other_arm_ent( ent );
anims = ent.anims;
ent.viewModel ClearAnim( anims[ "additive" ], 0.1 );
ent.viewModel SetFlaggedAnimKnobAllRestart( "anim", anims[ "fall_small" ], anims[ "root" ], 1, 0.15, 1 );
ent.viewModel waittillmatch( "anim", "end" );
ent.viewModel Hide();
player_recover = GetEnt( "player_recover", "targetname" );
fall_dist = Distance( player_recover.origin, ent.viewModel.origin );
fall_time = fall_dist * 0.0065 + 0.15;
ent.viewModel MoveTo( player_recover.origin, fall_time, fall_time * 0.6 );
ent.viewModel RotateTo( ( 70, 165, 0 ), fall_time, fall_time );
wait( fall_time );
wait( 0.05 );
cleanup_player_arms( ent );
return false;
}
cleanup_player_arms( ent )
{
ent.player PlayerSetGroundReferenceEnt( undefined );
ent.player Unlink();
ent.viewModel Delete();
}
fall_to_your_death( ent )
{
ent = get_other_arm_ent( ent );
anims = ent.anims;
mult = 2;
ent.viewModel SetFlaggedAnimKnobAllRestart( "anim", anims[ "fall" ], anims[ "root" ], 1, 0.15, mult );
animlength = GetAnimLength( anims[ "fall" ] );
animlength /= mult;
wait( animlength * 0.5 );
flag_set( "fade_to_death" );
level waittill( "foreverever" );
}
should_fall( stabbed, fall_time, ent )
{
if ( is_e3_start() )
return false;
if ( !stabbed )
return false;
if ( GetTime() > fall_time )
return true;
// if ( icepick_button_pressed( ent ) )
// return false;
ent = get_other_arm_ent( ent );
if ( GetTimeSinceLastPaused() < 10000 )
return false;
return !icepick_button_pressed( ent );
}
player_jump_check( ent )
{
for ( ;; )
{
ent.player.jumped = false;
ent.player waittill( "jump" );
ent.player.jumped = true;
ent.player waittill( "climbing" );
}
}
get_other_arm_ent( ent )
{
other_arm = get_other_arm( ent.arm );
return ent.globals.arm_ents[ other_arm ];
}
get_other_arm( current_arm )
{
arms[ "left" ] = "right";
arms[ "right" ] = "left";
return arms[ current_arm ];
}
/*
finished_stabbing( ent )
{
anims = ent.anims;
if ( ent.viewModel GetAnimTime( anims[ "stab" ] ) >= 1.0 )
return true;
if ( !ent.globals.stab_notetrack )
return false;
if ( movement_stick_pressed( ent ) )
return false;
// check to see if we're pressing the other arm
other_arm = get_other_arm( ent.arm );
other_arm_ent = ent.globals.arm_ents[ other_arm ];
return !icepick_button_pressed( other_arm_ent );
}
*/
assign_random_waits( ent )
{
ent.globals.random_wait_index = 0;
ent.globals.random_waits = [];
steps = 10;
for ( i = 0; i < steps; i++ )
{
random_wait = i / steps;
random_wait *= 0.25;
ent.globals.random_waits[ i ] = random_wait;
}
ent.globals.random_waits = array_randomize( ent.globals.random_waits );
}
get_random_wait( ent )
{
if ( ent.globals.random_wait_index >= ent.globals.random_waits.size )
{
assign_random_waits( ent );
}
random_wait = ent.globals.random_waits[ ent.globals.random_wait_index ];
ent.globals.random_wait_index++;
return random_wait;
}
add_icepicks()
{
self anim_spawn_tag_model( "viewmodel_ice_picker", "tag_weapon_right" );
self anim_spawn_tag_model( "viewmodel_ice_picker_03", "tag_weapon_left" );
}
right_add_test( ent )
{
arm_models = [];
arm_anims = [];
arm_tags = [];
additive_strength = [];
arm = ent.arm;
arm_anims[ arm ] = ent.anims;
additive_strength[ arm ][ "additive_in" ] = ent.anims[ "additive_in_strength" ];
additive_strength[ arm ][ "additive_out" ] = ent.anims[ "additive_out_strength" ];
arm_models[ arm ] = get_fake_model( ent, "stab" );
arm_models[ arm ] SetAnimTime( arm_anims[ arm ][ "stab" ], 1 );
arm_models[ arm ] add_icepicks();
arm_models[ arm ] Show();
arm_models[ arm ].origin = ( 230, 200, 200 );
ent = get_other_arm_ent( ent );
arm = ent.arm;
arm_anims[ arm ] = ent.anims;
additive_strength[ arm ][ "additive_in" ] = ent.anims[ "additive_in_strength" ];
additive_strength[ arm ][ "additive_out" ] = ent.anims[ "additive_out_strength" ];
arm_models[ arm ] = get_fake_model( ent, "stab" );
arm_models[ arm ] SetAnimTime( arm_anims[ arm ][ "stab" ], 1 );
arm_models[ arm ] add_icepicks();
arm_models[ arm ] Show();
arm_models[ arm ].origin = ( 200, 200, 200 );
steps = 40;
add_types = [];
add_types[ "additive_in" ] = "additive_out";
add_types[ "additive_out" ] = "additive_in";
add = "additive_in";
left = arm_models[ "left" ];
right = arm_models[ "right" ];
left_anims = arm_anims[ "left" ];
right_anims = arm_anims[ "right" ];
Print3d( left.origin, left GetEntNum(), ( 1, 1, 0 ), 1, 0.3, 50000 );
Print3d( right.origin, right GetEntNum(), ( 0, 1, 1 ), 1, 0.3, 50000 );
left_tag_name = get_icepick_tag_name( "left" );
right_tag_name = get_icepick_tag_name( "right" );
extra_boost = level.additive_arm_boost;
for ( ;; )
{
add = add_types[ add ];
left SetAnimKnob( left_anims[ add ], 1, 0, 1 );
//right SetAnimKnob( right_anims[ "correct_down" ], 1, 0, 1 );
right SetAnimKnob( right_anims[ add ], 1, 0, 1 );
for ( i = 0; i < steps; i++ )
{
index = i;
weight = index / steps;
if ( add == "additive_in" )
weight = 1 - weight;
weight = 1 - weight;
weight *= extra_boost;
//weight *= 4;
left SetAnimLimited( left_anims[ "additive" ], weight * additive_strength[ "left" ][ add ], 0, 1 );
right SetAnimLimited( right_anims[ "additive" ], weight * additive_strength[ "right" ][ add ], 0, 1 );
//right SetAnimLimited( right_anims[ "vertical_corrector" ], weight * 0.2, 0, 1 );
left_org = left GetTagOrigin( left_tag_name );
right_org = right GetTagOrigin( right_tag_name );
Print3d( left_org, ".", ( 1, 1, 0 ), 1, 0.2, 100 );
Print3d( right_org, ".", ( 0, 1, 1 ), 1, 0.2, 100 );
//Print3d( <origin>, <text>, <color>, <alpha>, <scale>, <duration> );
wait( 0.05 );
}
}
}
wrist_test( ent )
{
anims = ent.anims;
fake_model = get_fake_model( ent, "stab" );
fake_model SetAnimTime( anims[ "stab" ], 1 );
fake_model add_icepicks();
fake_model Show();
fake_model.origin += ( 0, 200, 100 );
types = [];
types[ "wrist_in" ] = "wrist_in";
types[ "wrist_out" ] = "wrist_in";
add = [];
add[ "wrist_in" ] = "additive_out";
add[ "wrist_out" ] = "additive_in";
add_adjust = [];
add_adjust[ "wrist_out" ] = 1.7;
add_adjust[ "wrist_in" ] = 8;
type = "wrist_in";
//fake_model thread maps\_debug::dragTagUntilDeath( "J_Wrist_LE", ( 0, 1, 0 ) );
fake_model thread draw_ent_num();
wait( 0.05 );
fx_tag_name = get_icepick_tag_name( ent.arm );
past_tag = spawn_icepick_fx_tag( fake_model, fx_tag_name );
past_tag Unlink();
past_tag move_forward( level.trace_depth );
forward = AnglesToForward( past_tag.angles );
//past_tag thread maps\_debug::dragTagUntilDeath( "tag_origin", (0,1,0) );
current_tag = spawn_icepick_fx_tag( fake_model, fx_tag_name );
current_tag Unlink();
current_tag move_forward( level.trace_depth );
current_tag LinkTo( fake_model, fx_tag_name );
//current_tag thread maps\_debug::dragTagUntilDeath( "tag_origin", (1,1,0) );
SetDvarIfUninitialized( "climb_float", 2.5 );
fake_model thread fix_org( current_tag, past_tag );
for ( ;; )
{
start = RandomFloatRange( 0, 1 );
start = 1;
/*
type = types[ type ];
arm_type = add[ type ];
climb_float = add_adjust[ type ];
*/
// out 4.2
wrist_types = [];
wrist_types[ "additive_in" ] = "wrist_in";
wrist_types[ "additive_out" ] = "wrist_out";
additive_type = "additive_out";
wrist_type = wrist_types[ additive_type ];
fake_model ClearAnim( anims[ "wrist" ], 0 );
fake_model SetAnimLimited( anims[ "wrist" ], 0, 0, 1 );
fake_model SetAnimKnob( anims[ additive_type ], 1, 0, 1 );
fake_model SetAnimLimited( anims[ "additive" ], level.additive_arm_boost * anims[ additive_type + "_strength" ] * start, 0, 1 );
climb_float = anims[ additive_type + "_strength" ] * start * level.climb_wrist_mod;// 4.2;
climb_float *= 0.2;
wait( 0.7 );
lerp_time = 1;
fake_model ClearAnim( anims[ "additive" ], lerp_time );
fake_model SetAnimKnob( anims[ wrist_type ], 1, 0, 1 );
fake_model SetAnimLimited( anims[ "wrist" ], 0, 0, 1 );
fake_model SetAnimLimited( anims[ "wrist" ], climb_float, lerp_time, 1 );
wait( lerp_time );
wait( 1.5 );
fake_model SetAnimLimited( anims[ "wrist" ], climb_float * 0.35, lerp_time, 1 );
wait( 1.2 );
/*
steps = 30;
for ( i = 0; i < steps; i++ )
{
dif = ( i / steps );
dif = 1 - dif;
//weight = 1 - dif;
weight = 1 - dif;
// fake_model SetAnimLimited( anims[ "wrist" ], 0, 0, 1 );
// fake_model SetAnimLimited( anims[ "additive" ], 0, 0, 1 );
fake_model SetAnimLimited( anims[ "wrist" ], weight * climb_float, 0, 1 );
fake_model SetAnimLimited( anims[ "additive" ], level.additive_arm_boost * dif, 0, 1 );
wait( 0.05 );
org_dif = past_tag.origin - current_tag.origin;
fake_model.origin += org_dif;
wait( 0.1 );
}
*/
}
}
fix_org( current_tag, past_tag )
{
for ( ;; )
{
wait( 0.05 );
org_dif = past_tag.origin - current_tag.origin;
self.origin += org_dif;
}
}
blend_out_additive_and_in_wrist( ent, fake_model, lerp_time )
{
//wait( 0.05 ); // for up/down sillyness on right only bleh
climb_float = ent.additive_weight / level.additive_arm_boost * level.climb_wrist_mod;// 4.2;
climb_float *= 0.4;
//climb_float = 0;
if ( ent.climb_dir != "up" )
{
climb_float = 0;
}
//climb_float = 0;
other_arm_ent = get_other_arm_ent( ent );
anims = other_arm_ent.anims;
other_arm_ent.viewModel ClearAnim( anims[ "wrist_in" ], lerp_time );
other_arm_ent.viewModel ClearAnim( anims[ "wrist_out" ], lerp_time );
fake_model ClearAnim( anims[ "wrist_in" ], lerp_time );
fake_model ClearAnim( anims[ "wrist_out" ], lerp_time );
anims = ent.anims;
wrist_types = [];
wrist_types[ "additive_in" ] = "wrist_in";
wrist_types[ "additive_out" ] = "wrist_out";
wrist_additive = wrist_types[ ent.additive_type ];
ent.corrector_type = undefined;
fake_model ClearAnim( anims[ "additive" ], lerp_time );
if ( IsDefined( anims[ "vertical_corrector" ] ) )
{
fake_model ClearAnim( anims[ "vertical_corrector" ], lerp_time );
}
fake_model SetAnimKnob( anims[ wrist_additive ], 1, 0, 1 );
fake_model SetAnimLimited( anims[ "wrist" ], 0, 0, 1 );
fake_model SetAnimLimited( anims[ "wrist" ], climb_float, lerp_time, 1 );
wait( 0.05 );
ent.viewModel ClearAnim( anims[ "additive" ], lerp_time );
if ( IsDefined( anims[ "vertical_corrector" ] ) )
ent.viewModel ClearAnim( anims[ "vertical_corrector" ], lerp_time );
ent.viewModel SetAnimKnob( anims[ wrist_additive ], 1, 0, 1 );
ent.viewModel SetAnimLimited( anims[ "wrist" ], 0, 0, 1 );
ent.viewModel SetAnimLimited( anims[ "wrist" ], climb_float, lerp_time, 1 );
wait( lerp_time );
/*
fake_model SetAnimLimited( anims[ "wrist" ], 0, lerp_time, 1 );
wait( 0.05 );
ent.viewModel SetAnimLimited( anims[ "wrist" ], 0, lerp_time, 1 );
wait( lerp_time );
*/
fake_model notify( "stop_fixing_origin" );
}
move_forward( dist )
{
forward = AnglesToForward( self.angles );
self.origin += forward * dist;
}
arm_completes_stab( ent, skipRelink )
{
if ( GetTime() < ent.globals.start_climb_time + 500 )
return false;
if ( ent.button_press_num == ent.button_press_num_last )
return false;
ent.viewModel notify( "stop_crack" );
if ( !icepick_button_pressed( ent ) )
return false;
/*
if ( !movement_stick_pressed( ent ) )
return false;
*/
stab_success = arm_stabs( ent, skipRelink );
if ( !stab_success )
flag_set( "finished_climbing" );
if ( GetDvarInt( "climb_automove" ) )
wait( 0.5 );
/*
if ( stab_success )
{
if ( !flag( "final_climb" ) )
{
delay_for_reaching_top();
}
}
*/
return stab_success;
}
delay_for_reaching_top()
{
max_height = 730;
min_height = 550;
max_wait = 0.4;
range = max_height - min_height;
height = level.player.origin[2] - min_height;
if ( height <= 0 )
return;
if ( height > range )
height = range;
/*
height
range max_wait
*/
wait_time = max_wait * height / range;
wait( wait_time );
}
GetStick( ent )
{
movement = self GetNormalizedMovement();
if ( GetDvarInt( "climb_automove" ) )
{
if ( ent.climb_dir == "up" )
movement = ( 1, 0, 0 );
if ( ent.climb_dir == "right" )
movement = ( 0, 1, 0 );
if ( ent.climb_dir == "left" )
movement = ( 0, -1, 0 );
return movement;
}
vert = movement[ 0 ];
horz = movement[ 1 ];
if ( ent.player ButtonPressed( "DPAD_UP" ) )
{
vert = 1;
}
if ( ent.player ButtonPressed( "DPAD_LEFT" ) )
{
horz = -1;
}
if ( ent.player ButtonPressed( "DPAD_RIGHT" ) )
{
horz = 1;
}
movement = ( vert, horz, 0 );
return movement;
}
player_relinks_to_tag( ent )
{
anims = ent.anims;
ent.player endon( "stop_climbing" );
/*
if ( !isdefined( level.climb_first_link ) )
{
// is it the main arms or debug arms?
climb_normal_start_org = GetEnt( "climb_normal_start_org", "targetname" );
fly_in = Distance( ent.viewModel.origin, climb_normal_start_org.origin ) < 150;
fly_in = false;
if ( fly_in )
{
ent.viewModel Hide();
level.climb_first_link = true;
climb_cam = GetEnt( "climb_cam", "targetname" );
model = climb_cam spawn_tag_origin();
timer = 0;
ent.player PlayerLinkToBlend( model, "tag_origin", 0, 0, 0 );
climb_cam delayThread( 2, ::self_delete );
climb_cam = GetEnt( climb_cam.target, "targetname" );
timer = 4.5;
model MoveTo( climb_cam.origin, timer, 0, timer );
model RotateTo( climb_cam.angles, timer * 2, 0, timer );
wait( timer - 0.5 );
ent.viewModel Show();
ent.player PlayerLinkToBlend( ent.viewModel, "tag_player", timer, 0, timer );
climb_cam delayThread( 2, ::self_delete );
model delayThread( 2, ::self_delete );
}
else
{
}
}
else
{
timer = .6;
ent.player PlayerLinkToBlend( ent.viewModel, "tag_player", timer, timer * 0.2, timer * 0.2 );
}
*/
if ( !ent.globals.ground_ref_ent_set )
{
if ( level.player GetStance() == "crouch" )
{
level.player SetStance( "stand" );
wait( 1 );
}
//start_climb_left
//start_climb_right
//early_climb_left
//early_climb_right
prefix = "start";
if ( GetTime() < level.price_climb_time + 22000 )
prefix = "early";
start_climb = prefix + "_climb_left";
ent.globals.current_arm = "right";
if ( level.player rightSwingPressed() )
{
start_climb = prefix + "_climb_right";
ent.globals.current_arm = "left";
}
thread start_climb_hint( ent );
ent = ent.globals.arm_ents[ ent.globals.current_arm ];
// put the hands in the first frame
ent.viewModel SetFlaggedAnimKnobAll( "start_climb", anims[ start_climb ], anims[ "root" ], 1, 0, 0 );
other_arm_ent = get_other_arm_ent( ent );
thread start_climb_sfx( other_arm_ent );
timer = 0.5;
ent.player PlayerLinkToBlend( ent.viewModel, "tag_player", timer, timer * 0.2, timer * 0.2 );
if ( start_climb == prefix + "_climb_left" )
{
other_arm_ent = get_other_arm_ent( ent );
other_arm_ent.additive_type = "additive_out";
other_arm_ent.additive_weight = 0.5;
thread blend_in_additive( other_arm_ent );
}
//wait( timer - 0.05 );
//ent.player PlayerLinkToDelta( ent.viewModel, "tag_player", 1, 0,0,0,0 );
if ( !ent.globals.ground_ref_ent_set )
{
ent.player PlayerSetGroundReferenceEnt( ent.globals.ground_ref_ent );
ent.globals.ground_ref_ent_set = true;
wait .05;
}
ent.viewModel Show();
level.player TakeAllWeapons();
ent.viewModel SetFlaggedAnim( "start_climb", anims[ start_climb ], 1, 0, 1 );
delayThread( 1.2, ::flag_set, "player_begins_to_climb" );
SetSavedDvar( "sm_sunsamplesizenear", 0.0625 );
for ( ;; )
{
if ( ent.viewModel GetAnimTime( anims[ start_climb ] ) > 0.97 )
break;
wait( 0.05 );
}
//ent.viewModel waittillmatch( "start_climb", "end" );
other_arm_ent = get_other_arm_ent( ent );
playerlinktodeltaWide( other_arm_ent, "tag_player" );
return;
}
thread player_relinks_to_tag_threaded( ent );
tag_angles = ent.viewModel GetTagAngles( "tag_view" );
player_angles = ent.player GetPlayerAngles();
tag_forward = AnglesToForward( tag_angles );
player_forward = AnglesToForward( player_angles );
dot = VectorDot( tag_forward, player_forward );
level.dot = dot;
if ( dot < 0.85 )
wait( 0.2 );
}
playerlinktodeltaWide( ent, tag )
{
if ( ent.arm == "right" )
ent.player PlayerLinkToDelta( ent.viewModel, tag, 1, 22, 60, 40, 40, true );
else
ent.player PlayerLinkToDelta( ent.viewModel, tag, 1, 70, 28, 40, 40, true );
}
start_climb_sfx( ent )
{
// special fx and sound for when you start climbing
//ent.fx_tag thread maps\_debug::dragTagUntilDeath( "tag_origin", (0,1,0) );
ent.viewModel waittillmatch( "start_climb", "stab" );
ent.fx_tag traceFX_on_tag( "player_ice_pick", "tag_origin", 10 );
ent.fx_tag PlaySound( "icepick_inactive_cracking" );
ent.viewModel waittill( "stop_crack" );
ent.fx_tag PlaySound( "icepick_inactive_cracking_stop" );
// thread play_sound_in_space( "icepick_inactive_cracking", ent.fx_tag.origin );
}
player_relinks_to_tag_threaded( ent )
{
ent.player endon( "stop_climbing" );
timer = 0.3;
ent.player PlayerLinkToBlend( ent.viewModel, "tag_player", timer, timer * 0.2, timer * 0.2 );
wait( timer );
ent.player PlayerLinkToDelta( ent.viewModel, "tag_player", 1, 0, 0, 0, 0, true );
wait( 0.5 );
playerlinktodeltaWide( ent, "tag_player" );
}
arm_stabs( ent, skipRelink )
{
if ( !isdefined( skipRelink ) )
player_relinks_to_tag( ent );
// limit the player's fov while stabbing
directions = [];
directions[ 0 ] = "left";
directions[ 1 ] = "right";
ent.viewModel notify( "arm_stabs" );
/*
climb_dir = directions[ ent.globals.player_right ];
movement = ent.player GetStick( ent );
if ( movement[ 0 ] > CONST_min_stick_move )
{
climb_dir = "up";
}
else
if ( movement[ 1 ] > CONST_min_stick_move )
{
climb_dir = "right";
}
else
if ( movement[ 1 ] < CONST_min_stick_move * -1 )
{
climb_dir = "left";
}
else
{
if ( ent.globals.player_up )
climb_dir = "up";
}
*/
climb_dir = "up";// forcing up now
// change the anims in use based on the current climbing direction
set_ent_anims_for_climbing_direction( ent, climb_dir );
arm_stab_begins( ent );
anims = ent.anims;
ent.globals.org_offset = undefined;
thread calc_org_offset( ent );
stab_length = GetAnimLength( anims[ "stab" ] );
level.player PlaySound( "player_climb_effort" );
wait( stab_length );
stab_success = penetrable_surface( ent );
surface = ent.surface_type;
fx = "icepick_impact_" + surface;
if ( fxExists( fx ) )
{
PlayFX( getfx( fx ), ent.hit_pos, ent.normal );
}
ent.viewModel thread climbing_cracks_think( ent, ent.hit_pos, ent.normal );
thread play_sound_in_space( "icepick_impact_ice", ent.hit_pos );
level.stabs_completed++;
if ( level.stabs_completed == 3 )
{
level notify( "fourth_swing" );
flag_set( "price_climb_continues" );
}
if ( reached_drop_down_spot( ent ) )
return false;
if ( stab_success )
{
level.player PlayRumbleOnEntity( "icepick_climb" );
fake_model = get_fake_model( ent, "settle", undefined, ent.globals.fake_model );
fake_model thread draw_ent_num( -60 );
fake_model.origin += ent.globals.org_offset;
//fake_model Show();
ent.globals.fake_model = fake_model;
//ent.viewModel waittillmatch( "stabbing", "end" );
//ent.viewModel thread maps\_debug::drawTagTrails( "tag_origin", (1,0,0) );
//ent.viewModel thread maps\_debug::drawTagTrails( "tag_player", (0,0,1) );
level.settle = anims[ "settle" ];
// now do the pull out and settle anim
fake_model SetFlaggedAnimKnobRestart( "stabbing", anims[ "settle" ], 1, 0, 1 );
ent.viewModel SetFlaggedAnimKnobRestart( "stabbing", anims[ "settle" ], 1, 0, 1 );
thread modify_viewmodel_based_on_fakemodel( ent, fake_model );
thread pop_origin( ent );
delayThread( 0.05, ::blend_out_additive_and_in_wrist, ent, fake_model, 0.5 );
ent.globals.climb_count++;
if ( ent.globals.climb_count == 3 )
{
flag_set( "player_climbed_3_steps" );
}
ent.viewModel waittillmatch( "stabbing", "release" );
level.player PlayRumbleOnEntity( "icepick_release" );
ent.viewModel waittillmatch( "stabbing", "settle" );
//blend_out_additive_and_in_wrist( ent, fake_model, 0.1 );
//fake_model Delete();
//fake_model notify( "stop_fixing_origin" );
thread arm_idles( ent );
if ( ent.climb_dir == "up" || ent.climb_dir != ent.arm )
{
random_wait = get_random_wait( ent );
if ( random_wait > 0 )
wait( random_wait );
}
}
else
{
//level.player PlayRumbleOnEntity( "damage_heavy" );
fail = "fail";
ent.viewModel SetFlaggedAnimKnobRestart( "stabbing", anims[ fail ], 1, 0, 1 );
ent.viewModel waittillmatch( "stabbing", "end" );
// play the old idle because we didnt complete the swing
other_arm_ent = get_other_arm_ent( ent );
anims = other_arm_ent.anims;
ent.viewModel SetAnimKnobAllRestart( anims[ "idle" ], anims[ "root" ], 1, 0.2, 1 );
}
// by now, all additives are blended out
return stab_success;
}
modify_viewmodel_based_on_fakemodel( ent, fake_model )
{
/*
wait( 0.05 );
waittillframeend;
waittillframeend;
*/
//ent = get_other_arm_ent( ent );
fx_tag_name = get_icepick_tag_name( ent.arm );
past_tag = spawn_icepick_fx_tag( fake_model, fx_tag_name );
past_tag Unlink();
past_tag move_forward( level.trace_depth );
forward = AnglesToForward( past_tag.angles );
// past_tag thread maps\_debug::dragTagUntilDeath( "tag_origin", (0,1,0) );
current_tag = spawn_icepick_fx_tag( fake_model, fx_tag_name );
current_tag Unlink();
current_tag move_forward( level.trace_depth );
current_tag LinkTo( fake_model, fx_tag_name );
//current_tag thread maps\_debug::dragTagUntilDeath( "tag_origin", (1,1,0) );
fix_origins_until_death( ent, fake_model, past_tag, current_tag );
anims = ent.anims;
fake_model ClearAnim( anims[ "root" ], 0 );
//current_tag Unlink();
current_tag Delete();
past_tag Delete();
}
player_gets_back_on_wall( ent )
{
climb_get_on = GetEnt( "climb_get_on", "targetname" );
ent.globals.climbing = true;
ent.player notify( "climbing" );
player_relinks_to_tag( ent );
//// temp overwrite for the view until andrew can fix the change to ground plane ent
ent.player PlayerLinkToDelta( ent.viewModel, "tag_player", 1, 0, 0, 0, 0, false );
wait( 0.05 );
playerlinktodeltaWide( ent, "tag_player" );
ent.viewModel Show();
}
player_got_off_cliff( ent )
{
// if ( IsDefined( ent.player.mantled ) )
// return true;
// if ( ent.player CanMantle() )
// return true;
if ( flag( "climb_pullup" ) )
return true;
if ( ent.player.jumped )
return true;
if ( !flag( "climb_drop_down" ) )
return false;
if ( ent.arm != "right" )
return false;
if ( ent.climb_dir != "right" )
return false;
return true;
}
detach_pick_2( player_arms )
{
player_arms Detach( "viewmodel_ice_picker_03", "tag_weapon_left" );
/*
org = player_arms GetTagOrigin( "tag_weapon_right" );
ang = player_arms GetTagAngles( "tag_weapon_right" );
pick = Spawn( "script_model", org );
pick SetModel( "weapon_ice_picker" );
pick.angles = ang;
pick PhysicsLaunchClient( pick.origin, ( 0, 0, -1 ) );
*/
}
detach_pick( player_arms )
{
player_arms Detach( "viewmodel_ice_picker", "tag_weapon_right" );
org = player_arms GetTagOrigin( "tag_weapon_right" );
ang = player_arms GetTagAngles( "tag_weapon_right" );
pick = Spawn( "script_model", org );
pick SetModel( "viewmodel_ice_picker" );
pick.angles = ang;
pick PhysicsLaunchClient( pick.origin, ( 0, 0, -1 ) );
}
free_ground_ref( timer )
{
wait( timer );
level.player PlayerSetGroundReferenceEnt( undefined );
}
reached_drop_down_spot( ent )
{
if ( !player_got_off_cliff( ent ) )
return false;
if ( flag( "final_climb" ) && flag( "climb_pullup" ) )
{
ent.viewModel notify( "stop_crack" );
anims = ent.anims;
thread free_ground_ref( 1.5 );
//ent.viewModel RotateTo( ( 0, ent.viewModel.angles[ 1 ], 0 ), 0.2 );
struct = getstruct( "player_icepicker_bigjump_end_getup", "targetname" );
//ent.viewModel moveto( struct.origin, 0.2 );
//ent.viewModel rotateto( struct.angles, 0.2 );
//ent.viewModel SetFlaggedAnimKnobAllRestart( "anim", anims[ "climb_finish" ], anims[ "root" ], 1, 0.15, 1 );
//thread start_notetrack_wait( ent.viewModel, "anim", "climbing" );
timer = 0.5;
animation = ent.viewmodel getanim( "climb_finish" );
// time = getanimlength( animation );
//maps\_debug::drawArrow( ent.viewmodel.origin, ent.viewmodel.angles, (1,0,0), 5000 );
org = GetStartOrigin( struct.origin, struct.angles, animation );
ang = GetStartAngles( struct.origin, struct.angles, animation );
//maps\_debug::drawArrow( org, ang, (0,0,1), 5000 );
ent.viewmodel hide();
ent.viewmodel delaycall( 0.1, ::show );
ent.player PlayerLinkToBlend( ent.viewmodel, "tag_origin", timer, timer * 0.2, timer * 0.2 );
struct anim_single_solo( ent.viewmodel, "climb_finish" );
// level.player delaycall( ::PlayerSetGroundReferenceEnt, undefined );
//ent.viewModel waittillmatch( "anim", "end" );
ent.viewModel Hide();
ent.player Unlink();
wait( 0.05 );
PrintLn( "Origin " + level.player.origin );
ent.player SetMoveSpeedScale( 1 );
ent.player notify( "stop_climbing" );
return true;
}
ent.player notify( "stop_climbing" );
/*
anims = ent.anims;
// player drops down and stops climbing
ent.viewModel SetFlaggedAnimKnobRestart( "jump", anims[ "jump_down_start" ], 1, 0, 1 );
timer = GetAnimLength( anims[ "jump_down_start" ] );
//wait( timer * 0.45 ); // drops too far so clip the end
//ent.player Unlink();
*/
ent.globals.climbing = false;
ent.globals.ground_ref_ent_set = false;
if ( flag( "climb_pullup" ) && !flag( "final_climb" ) )
{
ent.viewModel notify( "stop_crack" );
level.player PlayerLinkToDelta( ent.viewModel, "tag_player", 1, 0, 0, 0, 0 );
/*
model = undefined;
ent.viewModel Hide();
climb_to_ridge = GetEnt( "climb_to_ridge", "targetname" );
model = climb_to_ridge spawn_tag_origin();
timer = 1;
ent.player PlayerLinkToBlend( model, "tag_origin", timer, timer * 0.5, timer * 0.5 );
wait( timer );
ent.player PlayerSetGroundReferenceEnt( undefined );
*/
climb_jump_org = GetEnt( "climb_jump_org", "targetname" );
animation = ent.viewModel getanim( "first_pullup_" + ent.globals.current_arm );
org = GetStartOrigin( climb_jump_org.origin, climb_jump_org.angles, animation );
ang = GetStartAngles( climb_jump_org.origin, climb_jump_org.angles, animation );
ent.viewmodel.origin = org;
ent.viewmodel.angles = ang;
anims = ent.anims;
blendTime = 0;
ent.viewmodel ClearAnim( anims[ "root" ], blendTime );
//ent.viewmodel MoveTo( org, blendTime );
//ent.viewmodel RotateTo( ang, blendTime );
ent.viewmodel SetFlaggedAnimKnob( "animdone", animation, 1, blendTime, 1 );
thread start_notetrack_wait( ent.viewModel, "animdone", "climbing" );
ent.viewmodel waittillmatch( "animdone", "end" );
//climb_jump_org anim_single_solo( ent.viewModel, "first_pullup_" + ent.globals.current_arm );
ent.player Unlink();
// model Delete();
ent.player SetMoveSpeedScale( 1 );
ent.viewModel Hide();
thread player_big_jump();
return true;
}
ent.viewModel Hide();
ent.player PlayerSetGroundReferenceEnt( undefined );
ent.player SetMoveSpeedScale( 0.35 );
// if ( IsDefined( ent.player.mantled ) )
// return true;
/*
if ( ent.player CanMantle() )
{
ent.player Unlink();
ent.player ForceMantle();
wait( 1550 );
return true;
}
*/
jump_down_org = GetEnt( "jump_down_org", "targetname" );
model = jump_down_org spawn_tag_origin();
model.origin = jump_down_org.origin + ( 0, 0, 1 );
timer = 0.4;
ent.player PlayerLinkToBlend( model, "tag_origin", timer, timer * 0.2, timer * 0.2 );
wait( timer );
wait( 0.1 );// settle
ent.player Unlink();
model Delete();
// prep the get-back-on
climb_get_on = GetEnt( "climb_get_on", "targetname" );
ent.viewModel.origin = climb_get_on.origin;
ent.viewModel.angles = climb_get_on.angles;
ent.globals.current_arm = "left";
set_ent_anims_for_climbing_direction( ent, "up" );
anims = ent.anims;
ent.viewModel ClearAnim( anims[ "player_climb_root" ], 0 );
ent.viewModel SetFlaggedAnimKnobRestart( "stabbing", anims[ "idle" ], 1, 0, 1 );
return true;
}
fix_origins_until_death( ent, fake_model, past_tag, current_tag )
{
//fake_model endon( "death" );
fake_model endon( "stop_fixing_origin" );
for ( ;; )
{
wait( 0.05 );
//org_dif = model1_tag.origin - viewModel_tag.origin;
//viewModel_org_tag.origin += org_dif;
// TransformMove( <position T1>, <angles T1>, <position T2>, <angles T2>, <position E>, <angles E> )
org_dif = past_tag.origin - current_tag.origin;
array = TransformMove( past_tag.origin, past_tag.angles, current_tag.origin, current_tag.angles, fake_model.origin, fake_model.angles );
//ent.viewModel.origin = array[ "origin" ];
fake_model.origin += org_dif;
ent.viewModel.origin += org_dif;
dist = Distance( ( 0, 0, 0 ), org_dif );
dist *= 10;
dist = Int( dist );
dist *= 0.1;
//println( "Org dif " + dist );
pitch = array[ "angles" ][ 0 ];
if ( pitch > 200 )
{
// dont slant to the wall if it slants back
pitch = 0;
}
//pitch = 0;
fake_model.angles = ( pitch, array[ "angles" ][ 1 ], 0 );
ent.viewModel.angles = ( pitch, array[ "angles" ][ 1 ], 0 );
}
}
calc_org_offset( ent )
{
wait( 0.05 );
anims = ent.anims;
fake_stab = get_fake_model( ent, "stab" );
fake_settle = get_fake_model( ent, "settle" );
fake_stab SetAnimTime( anims[ "stab" ], 1.0 );
fake_settle SetAnimTime( anims[ "settle" ], 0.0 );
wait( 0.05 );
stab_org = fake_stab GetTagOrigin( "tag_player" );
settle_org = fake_settle GetTagOrigin( "tag_player" );
ent.globals.org_offset = stab_org - settle_org;
fake_stab Delete();
fake_settle Delete();
//ent.globals.org_offset *= 0.5;
}
pop_origin( ent )
{
AssertEx( IsDefined( ent.globals.org_offset ), "no org offset to pop" );
ent.viewModel DontInterpolate();
ent.viewModel.origin += ent.globals.org_offset;
}
arm_idles( ent )
{
anims = ent.anims;
ent.viewModel endon( "arm_stabs" );
ent.viewModel waittillmatch( "stabbing", "end" );
ent.viewModel SetAnimKnobAllRestart( anims[ "idle" ], anims[ "root" ], 1, 0, 1 );
}
set_ent_anims_for_climbing_direction( ent, climb_dir )
{
// change the anims in use based on the current climbing direction
ent.anims = get_anims_for_climbing_direction( ent.anims, climb_dir, ent.arm );
ent.climb_dir = climb_dir;
other_arm = get_other_arm( ent.arm );
other_arm_ent = ent.globals.arm_ents[ other_arm ];
other_arm_ent.anims = get_anims_for_climbing_direction( other_arm_ent.anims, climb_dir, other_arm_ent.arm );
}
arm_stab_begins( ent )
{
anims = ent.anims;
blendTime = 0.2;
ent.viewModel ClearAnim( anims[ "root" ], blendTime );
ent.viewModel SetFlaggedAnimKnobRestart( "stabbing", anims[ "stab" ], 1, blendTime, 1 );
thread catch_stab_notetrack( ent );
thread calculate_additive( ent );
//println( "difference " + ( ent.viewModel GetTagOrigin( "tag_player" ) - ent.old_org ) );
//ent.player DontInterpolate();
//ent.viewModel DontInterpolate();
// ent.viewModel.origin += ent.viewModel GetTagOrigin( "tag_player" ) - ent.old_org;
ent.old_origin = ent.viewModel.origin;
}
catch_stab_notetrack( ent )
{
ent notify( "searching_for_new_stab_notetrack" );
ent endon( "searching_for_new_stab_notetrack" );
anims = ent.anims;
ent.globals.stab_notetrack = false;
ent.viewModel waittillmatch( "stabbing", "stab" );
ent.globals.stab_notetrack = true;
}
blend_in_corrector( ent, additive_mod )
{
if ( ent.corrector_weight <= 0 )
return;
anims = ent.anims;
if ( additive_mod != 0 )
{
apply_additive_mod_to_ent( ent, additive_mod );
ent.viewModel SetAnimKnob( anims[ ent.additive_type ], 1, 0, 1 );
ent.viewModel SetAnimLimited( anims[ "additive" ], ent.additive_weight, 0, 1 );
}
ent.viewModel SetAnimKnob( anims[ ent.corrector_type ], 1, 0, 1 );
ent.viewModel SetAnimLimited( anims[ "vertical_corrector" ], ent.corrector_weight, 0, 1 );
}
blend_in_additive( ent )
{
anims = ent.anims;
ent.viewModel SetAnimKnob( anims[ ent.additive_type ], 1, 0, 1 );
ent.viewModel SetAnimLimited( anims[ "additive" ], ent.additive_weight, 0, 1 );
}
calculate_additive( ent )
{
//ent = get_other_arm_ent( ent );
old_org = ent.viewModel.origin;
// make fake arms that trial the various degrees of additive to find out which one will strike the surface
hits = SpawnStruct();
hits.calcs = [];
hits.surface_types = [];
hits.normals = [];
hits.hit_pos = [];
weights = [];
weight_type = [];
extra_boost = level.additive_arm_boost;
anims = ent.anims;
additive_type = "additive_in";
//steps = ent.additive_models[ additive_type ].size;
steps = 40;
for ( i = 0; i < steps; i++ )
{
additive_weight = i / steps * extra_boost * anims[ additive_type + "_strength" ];// "additive_in_strength / additive_out_strength"
weights[ i ] = additive_weight;
weight_type[ i ] = additive_type;
hits thread calculate_add_penetration( ent, i, additive_weight, additive_type );
}
additive_type = "additive_out";
for ( i = 0; i < steps; i++ )
{
additive_weight = i / steps * extra_boost * anims[ additive_type + "_strength" ];// "additive_in_strength / additive_out_strength"
index = i + steps;
weights[ index ] = additive_weight;
weight_type[ index ] = additive_type;
hits thread calculate_add_penetration( ent, index, additive_weight, additive_type );
}
wait( 0.05 ); // takes a frame for animations to take effect
waittillframeend;// wait until all calcs are finished
additive_weight = 0;
highest_hit_depth = 1000;
hits.hit_index = 0;
found_penetratable = false;
desired_hit_depth = 0.98;
hit_depth_difference = 1000;
foreach ( index, hit_depth in hits.calcs )
{
/*
if ( !legal_hit_depth( hit_depth ) )
{
// did not impact the surface
continue;
}
*/
penetrable = penetrable_surface( ent, hits.surface_types[ index ] );
if ( !penetrable )
continue;
abs_difference_between_hit_depth_and_desired_hit_depth = abs( hit_depth - desired_hit_depth );
if ( abs_difference_between_hit_depth_and_desired_hit_depth > hit_depth_difference )
continue;
hit_depth_difference = abs_difference_between_hit_depth_and_desired_hit_depth;
/*
//if ( index > hits.hit_index )
if ( hit_depth >= highest_hit_depth )
continue;
*/
found_penetratable = penetrable;
highest_hit_depth = hit_depth;
additive_weight = weights[ index ];
hits.hit_index = index;
additive_type = weight_type[ index ];
}
if ( !isdefined( hits.hit_index ) )
{
// didnt hit anything so jam it all the way in.
additive_weight = 1 * extra_boost;
additive_type = "additive_in";
ent.surface_type = "none";
}
else
{
ent.surface_type = hits.surface_types[ hits.hit_index ];
ent.normal = hits.normals[ hits.hit_index ];
ent.hit_pos = hits.hit_pos[ hits.hit_index ];
}
ent.additive_type = additive_type;
ent.additive_weight = additive_weight;
if ( !penetrable_surface( ent ) )
{
try_to_do_vertical_correction( ent );
}
//assertex( old_org == ent.viewModel.origin, "arm model origin changed" );
thread blend_in_additive( ent );
}
try_to_do_vertical_correction( ent )
{
if ( ent.climb_dir == "up" )
return;
if ( ent.arm != ent.climb_dir )
return;
hits = SpawnStruct();
hits.calcs = [];
hits.surface_types = [];
hits.normals = [];
hits.hit_pos = [];
additive_mods = [];
weights = [];
weight_type = [];
anims = ent.anims;
additive_strength = 1;
extra_boost = 2;
steps = 10;
inward_steps = 6;
half_step = inward_steps * 0.5;
waittillframeend;// for old models to get deleted
additive_type = undefined;
for ( p = 0; p < inward_steps; p++ )
{
additive_mod = ( p - half_step ) / inward_steps;
additive_type = "correct_up";
for ( i = 0; i < steps; i++ )
{
additive_weight = i / steps * extra_boost * additive_strength;
index = i + p * steps;
weights[ index ] = additive_weight;
weight_type[ index ] = additive_type;
additive_mods[ index ] = additive_mod;
hits thread calculate_add_vertical_correction( ent, index, additive_weight, additive_type, additive_mod );
}
additive_type = "correct_down";
for ( i = 0; i < steps; i++ )
{
additive_weight = i / steps * extra_boost * additive_strength;
index = inward_steps * steps + i + p * steps;
weights[ index ] = additive_weight;
weight_type[ index ] = additive_type;
additive_mods[ index ] = additive_mod;
hits thread calculate_add_vertical_correction( ent, index, additive_weight, additive_type, additive_mod );
}
}
wait( 0.05 );
waittillframeend;// wait until all calcs are finished
additive_weight = 0;
highest_hit_depth = 1000;
hits.hit_index = 0;
additive_mod = 0;
foreach ( index, hit_depth in hits.calcs )
{
if ( !penetrable_surface( ent, hits.surface_types[ index ] ) )
continue;
if ( !legal_hit_depth( hit_depth ) )
continue;
//if ( index > hits.hit_index )
if ( hit_depth < highest_hit_depth )
{
highest_hit_depth = hit_depth;
additive_weight = weights[ index ];
hits.hit_index = index;
additive_type = weight_type[ index ];
additive_mod = additive_mods[ index ];
}
}
if ( !isdefined( hits.hit_index ) )
{
return;
}
else
{
ent.surface_type = hits.surface_types[ hits.hit_index ];
ent.normal = hits.normals[ hits.hit_index ];
ent.hit_pos = hits.hit_pos[ hits.hit_index ];
}
ent.corrector_type = additive_type;
ent.corrector_weight = additive_weight;
//assertex( old_org == ent.viewModel.origin, "arm model origin changed" );
thread blend_in_corrector( ent, additive_mod );
}
legal_hit_depth( hit_depth )
{
if ( hit_depth <= 0.9 )
return false;
if ( hit_depth >= 0.98 )
return false;
return true;
}
set_arm_weight( ent, weight )
{
ent.globals.arm_weight = weight;
}
get_arm_weight( ent )
{
return ent.globals.arm_weight;
}
get_fake_model( ent, anim_type, override_ent, optional_model )
{
// create a copy of the existing arms
anims = ent.anims;
model = ent.viewModel;
additive_weight = [];
additive_type = [];
corrector_type = [];
corrector_weight = [];
foreach ( arm, arm_ent in ent.globals.arm_ents )
{
if ( arm == ent.arm )
{
additive_type[ arm ] = ent.globals.arm_ents[ arm ].additive_type;
additive_weight[ arm ] = ent.globals.arm_ents[ arm ].additive_weight;
if ( IsDefined( ent.globals.arm_ents[ arm ].corrector_type ) )
{
corrector_type[ arm ] = ent.globals.arm_ents[ arm ].corrector_type;
corrector_weight[ arm ] = ent.globals.arm_ents[ arm ].corrector_weight;
}
}
else
{
additive_type[ arm ] = ent.globals.arm_ents[ arm ].additive_type;
additive_weight[ arm ] = 0;
}
}
// override values to make new arm positions
if ( IsDefined( override_ent ) )
{
if ( IsDefined( override_ent.additive_weight ) )
{
foreach ( arm, add_weight in override_ent.additive_weight )
{
additive_weight[ arm ] = add_weight;
}
}
if ( IsDefined( override_ent.additive_type ) )
{
foreach ( arm, add_type in override_ent.additive_type )
{
additive_type[ arm ] = add_type;
}
}
}
fake_model = optional_model;
if ( !isdefined( optional_model ) )
fake_model = spawn_anim_model( "player_rig" );
fake_model Hide();
fake_model.origin = ent.viewModel.origin;
fake_model.angles = ent.viewModel.angles;
fake_model ClearAnim( anims[ "root" ], 0 );
fake_model SetAnimKnobRestart( anims[ anim_type ], 1, 0, 0 );
foreach ( arm, arm_ent in ent.globals.arm_ents )
{
anims = arm_ent.anims;
add_type = additive_type[ arm ];
add_weight = additive_weight[ arm ];
cor_type = corrector_type[ arm ];
cor_weight = corrector_weight[ arm ];
fake_model SetAnimLimited( anims[ "additive" ], add_weight, 0, 1 );
fake_model SetAnimLimited( anims[ add_type ], add_weight, 0, 1 );
if ( IsDefined( cor_type ) )
{
fake_model SetAnimLimited( anims[ "vertical_corrector" ], cor_weight, 0, 1 );
fake_model SetAnimLimited( anims[ cor_type ], cor_weight, 0, 1 );
}
}
return fake_model;
}
trace_test()
{
for ( ;; )
{
targ = GetEnt( self.target, "targetname" );
trace = BulletTrace( self.origin, targ.origin, false, undefined );
//line( self.origin, trace[ "position" ], ( 0.4, 0.4, 0.5 ), 1, 1, 5000 );
// Line( trace[ "position" ], trace[ "position" ] + trace[ "normal" ] * 15, ( 0.3, 0.85, 0.53 ), 1, 1, 5000 );
Line( trace[ "position" ], trace[ "position" ] + trace[ "normal" ] * 15, ( 0.9, 0.3, 0.2 ), 1, 1, 5000 );
Print3d( trace[ "position" ], trace[ "surfacetype" ], ( 1, 1, 0 ), 1, 0.5 );
wait( 0.05 );
// self.origin += randomvector( 64 );
// targ.origin += randomvector( 64 );
}
}
get_time_for_notetrack( ent, anim_type, notetrack )
{
if ( !isdefined( ent.notetrack_times[ anim_type ] ) )
return 1;
if ( !isdefined( ent.notetrack_times[ anim_type ][ notetrack ] ) )
return 1;
return ent.notetrack_times[ anim_type ][ notetrack ];
}
set_time_to_notetrack( ent, anim_type, notetrack )
{
anims = ent.anims;
time = get_time_for_notetrack( ent, anim_type, notetrack );
self SetAnimTime( anims[ anim_type ], time );
}
calculate_add_penetration( ent, index, additive_weight, additive_type )
{
anims = ent.anims;
model = ent.viewModel;
arm = ent.arm;
overrides = SpawnStruct();
overrides.additive_weight[ arm ] = additive_weight;
overrides.additive_type[ arm ] = additive_type;
fake_model = get_fake_model( ent, "stab", overrides );
//fake_model set_time_to_notetrack( ent, "stab", "stab" );
fake_model SetAnimTime( anims[ "stab" ], 1.0 );
/#
fake_model add_icepicks();
#/
//fake_model.org.origin = ent.viewModel.origin;
//fake_model.org.angles = ent.viewModel.angles;
//fake_model SetAnimLimited( anims[ "additive" ], additive_weight, 0, 1 );
//fake_model SetAnimLimited( anims[ additive_type ], additive_weight, 0, 1 );
fx_tag_name = get_icepick_tag_name( ent.arm );
fx_tag = spawn_icepick_fx_tag( fake_model, fx_tag_name );
wait( 0.05 );
forward = AnglesToForward( fx_tag.angles );
trace_depth = level.trace_depth;
start = fx_tag.origin + forward * ( trace_depth * -5 );
end = fx_tag.origin + forward * trace_depth;
trace = BulletTrace( start, end, false, undefined );
/*
if ( trace[ "fraction" ] < 1 )
{
frac = trace[ "fraction" ];
frac *= 10;
frac = Int( frac );
frac *= 0.1;
Print3d( trace[ "position" ], frac, ( 1, 0, 0 ), 1, 0.4, 5000 );
}
*/
self.calcs[ index ] = trace[ "fraction" ];
self.surface_types[ index ] = trace[ "surfacetype" ];
self.normals[ index ] = trace[ "normal" ];
self.hit_pos[ index ] = trace[ "position" ];
/#
wait( 0.05 );
if ( GetDvarInt( "climb_add" ) )// && legal_hit_depth( trace[ "fraction" ] ) )
{
fake_model Show();
line_time = 50;
depthTest = false;
if ( !isdefined( self.hit_index ) )
{
//line( start, trace[ "position" ], (1,0,0), 1, depthTest, line_time );
}
else
{
if ( self.hit_index == index )
{
Line( start + ( 1, 1, 0 ), trace[ "position" ] + ( 1, 1, 0 ), ( 1, 0, 0 ), 1, depthTest, line_time );
frac = trace[ "fraction" ];
frac *= 10;
frac = Int( frac );
frac *= 0.1;
Print3d( trace[ "position" ], frac, ( 1, 0, 0 ), 1, 0.4, 5000 );
wait( 0.8 );
}
else
{
//line( start, trace[ "position" ], (0,0,1), 1, depthTest, line_time );
// fake_model Delete();
}
}
}
//wait( 3 );
#/
fake_model Delete();
fx_tag Delete();
/*
if ( trace[ "fraction" ] < 1 )
{
Line( fx_tag.origin, trace[ "position" ], (1,1,1), 1, 1, 5000 );
}
*/
}
apply_additive_mod( arm, overrides, additive_mod )
{
overrides.additive_weight[ arm ] += additive_mod;
if ( overrides.additive_weight[ arm ] >= 0 )
return;
overrides.additive_weight[ arm ] *= -1;
if ( overrides.additive_type[ arm ] == "additive_in" )
overrides.additive_type[ arm ] = "additive_out";
else
overrides.additive_type[ arm ] = "additive_in";
}
apply_additive_mod_to_ent( ent, additive_mod )
{
ent.additive_weight += additive_mod;
if ( ent.additive_weight >= 0 )
return;
ent.additive_weight *= -1;
if ( ent.additive_type == "additive_in" )
ent.additive_type = "additive_out";
else
ent.additive_type = "additive_in";
}
calculate_add_vertical_correction( ent, index, additive_weight, additive_type, additive_mod )
{
anims = ent.anims;
model = ent.viewModel;
arm = ent.arm;
overrides = SpawnStruct();
overrides.additive_weight[ arm ] = ent.additive_weight;
overrides.additive_type[ arm ] = ent.additive_type;
apply_additive_mod( arm, overrides, additive_mod );
fake_model = get_fake_model( ent, "stab", overrides );
fake_model SetAnimTime( anims[ "stab" ], 1.0 );
/#
fake_model add_icepicks();
#/
fake_model SetAnimLimited( anims[ "vertical_corrector" ], additive_weight, 0, 1 );
fake_model SetAnimKnob( anims[ additive_type ], additive_weight, 0, 1 );
fx_tag_name = get_icepick_tag_name( ent.arm );
fx_tag = spawn_icepick_fx_tag( fake_model, fx_tag_name );
wait( 0.05 );
forward = AnglesToForward( fx_tag.angles );
trace_depth = level.trace_depth;
start = fx_tag.origin + forward * ( trace_depth * -5 );
end = fx_tag.origin + forward * trace_depth;
trace = BulletTrace( start, end, false, undefined );
self.calcs[ index ] = trace[ "fraction" ];
self.surface_types[ index ] = trace[ "surfacetype" ];
self.normals[ index ] = trace[ "normal" ];
self.hit_pos[ index ] = trace[ "position" ];
wait( 0.05 );
/#
if ( GetDvarInt( "climb_add" ) )
//if ( trace[ "surfacetype" ] != "none" )
{
fake_model Show();
line_time = 50;
depthTest = false;
if ( !isdefined( self.hit_index ) )
{
Line( start, trace[ "position" ], ( 1, 0, 0 ), 1, depthTest, line_time );
}
else
{
if ( self.hit_index == index )
{
Line( start + ( 1, 1, 0 ), trace[ "position" ] + ( 1, 1, 0 ), ( 1, 0, 0 ), 1, depthTest, line_time );
frac = trace[ "fraction" ];
frac *= 10;
frac = Int( frac );
frac *= 0.1;
Print3d( trace[ "position" ], frac, ( 1, 0, 0 ), 1, 0.4, 5000 );
}
else
{
Line( start, trace[ "position" ], ( 0, 0, 1 ), 1, depthTest, line_time );
// fake_model Delete();
}
}
wait( 0.8 );
}
#/
fake_model Delete();
fx_tag Delete();
/*
if ( trace[ "fraction" ] < 1 )
{
Line( fx_tag.origin, trace[ "position" ], (1,1,1), 1, 1, 5000 );
}
*/
}
arm_transitioning( ent )
{
anims = ent.anims;
//if ( ent.viewModel GetAnimTime( anims[ "low_release" ] ) >= 0.95 )
// return false;
if ( ent.viewModel GetAnimTime( anims[ "stab" ] ) > 0 )
return true;
//if ( ent.viewModel GetAnimTime( anims[ "high_release" ] ) < 1 )
// return true;
return false;
}
movement_stick_pressed( ent )
{
movement = ent.player GetStick( ent );
if ( abs( movement[ 0 ] ) > CONST_min_stick_move )
return true;
return abs( movement[ 1 ] ) > CONST_min_stick_move;
}
button_detection( ent )
{
ent.button_pressed = icepick_button_pressed( ent );
ent.button_press_num = 0;
ent.button_press_num_last = 0;
held_at_start = false;
if ( ent.button_pressed || icepick_button_pressed_instant( ent ) )
{
ent.button_press_num_last++;
held_at_start = true;
}
for ( ;; )
{
if ( icepick_button_pressed_instant( ent ) || held_at_start )
{
ent.button_press_num++;
ent.button_pressed = true;
while ( icepick_button_pressed_instant( ent ) )
{
wait( 0.05 );
}
}
held_at_start = false;
ent.button_pressed = false;
wait( 0.05 );
}
}
track_trigger_pulls( globals )
{
ent = globals.arm_ents[ "left" ];
ent.viewModel endon( "death" );
for ( ;; )
{
ent = globals.arm_ents[ "left" ];
if ( ent.player [[ ent.buttonCheck ]]() )
{
ent.last_button_press = GetTime();
if ( !flag( "we_care_about_right_icepick" ) )
{
flag_set( "we_care_about_right_icepick" );
ent = globals.arm_ents[ "right" ];
ent.last_button_press = GetTime();
}
}
if ( flag( "we_care_about_right_icepick" ) )
{
ent = globals.arm_ents[ "right" ];
if ( ent.player [[ ent.buttonCheck ]]() )
ent.last_button_press = GetTime();
}
wait( 0.05 );
}
}
icepick_button_pressed( ent )
{
if ( ent.player ButtonPressed( ent.key ) )
return true;
return ent.last_button_press + 750 > GetTime();
}
icepick_button_pressed_instant( ent )
{
if ( ent.player ButtonPressed( ent.key ) )
return true;
return ent.player [[ ent.buttonCheck ]]();
}
link_model( model )
{
SetDvar( "b1", "0" );
SetDvar( "b2", "90" );
SetDvar( "b3", "40" );
for ( ;; )
{
b1 = GetDvarInt( "b1" );
b2 = GetDvarInt( "b2" );
b3 = GetDvarInt( "b3" );
//self LinkTo( model, "tag_player", (0,0,0), (b1,b2,b3) );
angles = model GetTagAngles( "tag_player" );
yaw = angles[ 1 ];
self.angles = ( 0, yaw, 0 );
self.origin = model GetTagOrigin( "tag_player" );
if ( 1 )
return;
wait( 0.05 );
}
}
track_model( model )
{
// self.angles = (0,-90,0);
z = model.origin[ 2 ] - 1000;
for ( ;; )
{
org1 = model GetTagOrigin( "j_wrist_le" );
org2 = model GetTagOrigin( "j_wrist_ri" );
org = org1 * 0.5 + org2 * 0.5;
forward = AnglesToForward( model.angles );
move_vec = forward * -145;
move_vec = ( move_vec[ 0 ], move_vec[ 1 ], 0 );
org += move_vec;
// never climb downwards
if ( org[ 2 ] < z )
{
org = ( org[ 0 ], org[ 1 ], z );
}
z = org[ 2 ];
self MoveTo( org + ( 0, 0, -60 ), 0.3 );
view_angles = VectorToAngles( model.origin - org );
self RotateTo( ( 0, view_angles[ 1 ], 0 ), 0.3 );
wait( 0.3 );
}
}
test_player_angle( global )
{
for ( ;; )
{
player_angles = global.player GetPlayerAngles();
tag_angles = self GetTagAngles( "tag_player" );
//maps\_debug::drawArrow( ent.globals.player.origin, player_angles, ( 1,1,1 ) );
//maps\_debug::drawArrow( ent.globals.player.origin, tag_angles, ( 0.4,0.4,1 ) );
//player_angles = ( tag_angles[ 0 ], player_angles[ 1 ], player_angles[ 2 ] );
player_forward = AnglesToForward( player_angles );
tag_forward = AnglesToForward( tag_angles );
player_right = AnglesToRight( player_angles );
player_up = AnglesToUp( player_angles );
global.player_dot = VectorDot( player_forward, tag_forward );
global.player_right = VectorDot( player_right, tag_forward ) < 0;
global.player_up_dot = VectorDot( player_up, tag_forward );
global.player_up = global.player_up_dot < 0.2;
/*
angles = VectorToAngles( second_point - first_point );
forward = AnglesToForward( angles );
end = first_point;
difference = VectorNormalize( end - start );
dot = VectorDot( forward, difference );
*/
wait( 0.05 );
}
}
penetrable_surface( ent, override_surface )
{
surface = ent.surface_type;
if ( IsDefined( override_surface ) )
surface = override_surface;
if ( ( ent.climb_dir == "right" || ent.climb_dir == "left" ) && ent.climb_dir != ent.arm )
{
// can always penetrate these odd arm catchups
//if ( surface != "none" )
return true;
}
penetrable_surfaces = [];
penetrable_surfaces[ "ice" ] = true;
penetrable_surfaces[ "plaster" ] = true;
penetrable_surfaces[ "rock" ] = true;
penetrable_surfaces[ "snow" ] = true;
return IsDefined( penetrable_surfaces[ surface ] );
}
test_line()
{
for ( ;; )
{
forward = AnglesToForward( self.angles );
trace = BulletTrace( self.origin, self.origin + forward * 6.25, false, undefined );
Line( self.origin, trace[ "position" ] );
wait( 0.05 );
}
}
spawn_icepick_fx_tag( model, fx_tag_name )
{
fx_tag = Spawn( "script_model", ( 0, 0, 0 ) );
fx_tag SetModel( "tag_origin" );
fx_tag Hide();
fx_tag.origin = model GetTagOrigin( fx_tag_name );
fx_tag.angles = model GetTagAngles( fx_tag_name );
// translate the posts into the proper positions for the animations
ent = SpawnStruct();
ent.entity = fx_tag;
ent.forward = 2;
ent.up = 15.35;
ent.right = 0;
ent.yaw = 0;
ent.pitch = 41;
ent translate_local();
fx_tag LinkTo( model, fx_tag_name );
return fx_tag;
}
spawn_player_icepick_fx_tag( model, fx_tag_name )
{
fx_tag = Spawn( "script_model", ( 25, 25, -25 ) );
fx_tag SetModel( "tag_origin" );
fx_tag Hide();
fx_tag.origin = model GetTagOrigin( fx_tag_name );
fx_tag.angles = model GetTagAngles( fx_tag_name );
// translate the posts into the proper positions for the animations
ent = SpawnStruct();
ent.entity = fx_tag;
ent.forward = 2;
ent.up = 8.35;
ent.right = -1;
ent.yaw = 0;
ent.pitch = 41;
ent translate_local();
fx_tag LinkTo( model, fx_tag_name );
return fx_tag;
}
icepick_impact_fx( fx_tag, model )
{
model endon( "death" );
impacted = false;
trace_depth = level.trace_depth;
for ( ;; )
{
wait( 0.05 );
forward = AnglesToForward( fx_tag.angles );
trace = BulletTrace( fx_tag.origin, fx_tag.origin + forward * trace_depth, false, undefined );
//Line( fx_tag.origin, fx_tag.origin + forward * trace_depth, ( 0, 1, 0 ), 1, 0 );
if ( self.stabbed )
continue;
if ( impacted )
{
// check to see if we're still impacted
if ( trace[ "fraction" ] < 1 )
continue;
// we're free!
impacted = false;
wait( 0.8 );// debounce off a pull out
}
// didn't hit anything
if ( trace[ "fraction" ] >= 1 )
continue;
impacted = true;
surface = trace[ "surfacetype" ];
fx = "icepick_impact_" + surface;
if ( fxExists( fx ) )
{
PlayFX( getfx( fx ), trace[ "position" ], trace[ "normal" ] );
fx_tag PlaySound( "icepick_impact_ice" );
level.player PlayRumbleOnEntity( "icepick_climb" );
}
}
}
get_icepick_tag_name( arm )
{
return level.ice_pick_tags[ arm ];
}
spawn_additive_models( ent )
{
ent.additive_models = [];
spawn_additive_models_of_type( ent, "additive_in" );
spawn_additive_models_of_type( ent, "additive_out" );
}
spawn_additive_models_of_type( ent, additive_type )
{
ent.additive_models[ additive_type ] = [];
steps = 20;
for ( i = 0; i < steps; i++ )
{
level.additive_count++;
thread spawn_additive_models_of_type_and_depth( ent, additive_type );
}
}
spawn_additive_models_of_type_and_depth( ent, additive_type )
{
model = spawn_anim_model( "player_rig" );
AssertEx( model.origin == ( 0, 0, 0 ), "model wrong origin" );
//model Hide();
additive_weight = 2;
model SetAnimLimited( ent.anims[ "additive" ], additive_weight, 0, 1 );
model SetAnimLimited( ent.anims[ additive_type ], additive_weight, 0, 1 );
// let the anim play until the notetrack, then pause it there
animation = ent.anims[ "stab" ];
model SetFlaggedAnimKnobRestart( "anim", animation, 1, 0, 1 );
model waittillmatch( "anim", "stab" );
model SetAnim( animation, 1.0, 0, 0 );
// need an anchor so we get the right delta offset for the model's origin
org = Spawn( "script_origin", ( 0, 0, 0 ) );
model LinkTo( org );
model.org = org;
//model thread maps\_debug::dragTagUntilDeath( "tag_origin", (0.3, 0.3, 0.3 ) );
//org thread maps\_debug::drawOrgForever( ( 0.5, 0.2, 0.2 ) );
ent.additive_models[ additive_type ][ ent.additive_models[ additive_type ].size ] = model;
level.additive_count--;
if ( level.additive_count == 0 )
{
level notify( "additives_created" );
}
}
generate_notetrack_times( ent )
{
ent.notetrack_times = [];
generate_notetrack_times_for_anim( ent, "stab" );
}
generate_notetrack_times_for_anim( ent, anim_type )
{
anims = ent.anims;
model = spawn_anim_model( "player_rig" );
model Hide();
model SetFlaggedAnimKnobRestart( "anim", anims[ anim_type ], 1, 0, 1 );
ent.notetrack_times[ anim_type ] = [];
start_time = GetTime();
total_time = GetAnimLength( anims[ anim_type ] );
for ( ;; )
{
model waittill( "anim", notetrack );
current_time = GetTime() - start_time;
ent.notetrack_times[ anim_type ][ notetrack ] = current_time / total_time * 0.001;
if ( notetrack == "end" )
break;
AssertEx( ent.notetrack_times[ anim_type ][ notetrack ] <= 1.0, "Notetrack time exceeded 1" );
}
}
draw_ent_num( offset )
{
/#
if ( !isdefined( offset ) )
offset = -30;
self endon( "death" );
self notify( "draw_ent_num" );
self endon( "draw_ent_num" );
for ( ;; )
{
Print3d( self.origin + ( 0, 0, offset ), self GetEntNum(), ( 0.3, 0.9, 0.5 ), 1, 0.25 );
wait( 0.05 );
}
#/
}
play_crack_fx_on_arm( arm )
{
fx_tag_name = get_icepick_tag_name( arm );
fx_tag = spawn_icepick_fx_tag( self, fx_tag_name );
wait( 0.05 );
sound = false;
org = Spawn( "script_origin", ( self.origin ) );
fx = [];
fx[ 0 ] = 1;
fx[ 1 ] = 2;
fx[ 2 ] = 3;
fx[ 3 ] = 1;
fx[ 4 ] = 4;
fx[ 5 ] = 5;
fx[ 6 ] = 1;
fx[ 7 ] = 2;
fx[ 8 ] = 4;
fx[ 9 ] = 3;
fx[ 10 ] = 1;
fx[ 11 ] = 5;
fx[ 12 ] = 2;
fx[ 13 ] = 1;
fx[ 14 ] = 3;
for ( count = 1; count < fx.size; count++ )
{
forward = AnglesToForward( fx_tag.angles );
trace_depth = level.trace_depth;
start = fx_tag.origin + forward * ( trace_depth * -2 );
end = fx_tag.origin + forward * trace_depth * 2;
trace = BulletTrace( start, end, false, undefined );
hit_pos = trace[ "position" ];
normal = trace[ "normal" ];
PlayFX( getfx( "climbing_cracks_" + fx[ count ] ), hit_pos, normal );
if ( !sound )
{
org.origin = hit_pos;
org thread play_sound_on_entity( "icepick_inactive_cracking" );
}
sound = true;
wait( 0.1 );
}
fx_tag Delete();
org Delete();
}
climbing_cracks_think( ent, hit_pos, normal )
{
org = Spawn( "script_origin", hit_pos );
org thread climbing_cracks_fx( ent, hit_pos, normal );
rumble = get_rumble_ent( "icepick_hang" );
rumble.intensity = 0;
rumble delayThread( 2, ::rumble_ramp_on, 4.5 );
ent.viewModel waittill( "stop_crack" );
rumble Delete();
org PlaySound( "icepick_inactive_cracking_stop" );
wait( 0.05 );
org Delete();
}
climbing_cracks_fx( ent, hit_pos, normal )
{
self endon( "death" );
ent.viewModel endon( "stop_crack" );
for ( count = 1; count <= 3; count++ )
{
PlayFX( getfx( "climbing_cracks_" + count ), hit_pos, normal );
self PlaySound( "icepick_inactive_cracking" );
wait( RandomFloatRange( 1, 2 ) );
// more cracks come later
if ( !flag( "player_climbs_past_safe_point" ) )
return;
}
}
safe_price_delete( price )
{
if ( !isalive( price ) )
return;
if ( IsDefined( price.magic_bullet_shield ) )
price stop_magic_bullet_shield();
if ( IsDefined( price.fakegun ) )
price.fakegun Delete();
price Delete();
}
get_me_captain_price()
{
safe_price_delete( level.price );
spawner = level.price_spawner;
spawner.count = 1;
price = spawner StalingradSpawn();
spawn_failed( price );
price.animname = "price";
level.price = price;
level.friendlyFireDisabled = true;
price disable_pain();
price thread magic_bullet_shield();
SetSavedDvar( "g_friendlyfiredist", 0 );
price gun_remove();
//price anim_spawn_tag_model( "weapon_m14_cloth_wrap_silencer", "TAG_WEAPON_CHEST" );
//price anim_spawn_tag_model( "weapon_m21SD_wht", "TAG_WEAPON_CHEST" );
fakegun = Spawn( "script_model", price.origin );
fakegun SetModel( "weapon_m14ebr_arctic" );
fakegun HidePart( "TAG_THERMAL_SCOPE" );
fakegun HidePart( "TAG_FOREGRIP" );
fakegun HidePart( "TAG_ACOG_2" );
fakegun HidePart( "TAG_HEARTBEAT" );
fakegun LinkTo( price, "TAG_WEAPON_CHEST", ( 0, 0, 0 ), ( 0, 0, 0 ) );
price.fakegun = fakegun;
//price anim_spawn_tag_model( "weapon_m14ebr_arctic", "TAG_WEAPON_CHEST" );
return price;
/*
if ( !isalive( level.price ) )
{
price_spawner = GetEnt( "climbing_price", "targetname" );
price_spawner.count = 1;
price = price_spawner spawn_ai();
price.animname = "price";
level.price = price;
}
return level.price;
*/
}
cliff_scene_with_price()
{
do_flyin = false;
/#
if ( level.start_point == "cave" )
do_flyin = false;
if ( level.start_point == "climb" )
{
do_flyin = false;
player_recover = GetEnt( "player_recover", "targetname" );
level.player SetOrigin( player_recover.origin + ( 10, 0, -30 ) );
level.player TakeAllWeapons();
level.player GiveWeapon( level.ice_pick_viewweapon, 0, 1 );
level.player SwitchToWeapon( level.ice_pick_viewweapon );
flag_set( "player_gets_on_wall" );
flag_set( "player_in_position_to_climb" );
}
#/
thread maps\_blizzard::blizzard_level_transition_climbing( .05 );
if ( do_flyin )
{
thread fly_up_the_mountain();
}
else
{
thread teleport_to_cave();
thread death_trigger();
}
SetSavedDvar( "sm_sunsamplesizenear", 0.0625 );
// thread old_crazy_fly_in();
flag_set( "can_save" );
/*
if ( level.start_point == "cave" || do_flyin )
teleport_to_cave();
*/
//maps\_blizzard::blizzard_overlay_full( 1 );
/#
if ( level.start_point == "climb" )
{
flag_wait( "reached_top" );
level.player AllowProne( true );
level.player AllowSprint( true );
battlechatter_off( "allies" );
battlechatter_on( "axis" );
return;
}
#/
// wait( 0.05 );
price = get_me_captain_price();
price PlayLoopSound( "gear_jacket_flapping_loop" );
animation = price getanim( "price_climb_intro" );
animLength = GetAnimLength( animation );
//price delayThread( animLength * 0.42, ::dialogue_queue, "breaksover" );
price anim_spawn_tag_model( "prop_price_cigar", "tag_inhand" );
PlayFXOnTag( level._effect[ "cigar_glow" ], price, "tag_cigarglow" );
node = GetEnt( "cliffhanger_cliff", "targetname" );
/*
if ( do_flyin )
flag_wait( "flyin_complete" );
*/
thread autosave_now_silent();
if ( do_flyin )
flag_wait( "slam_zoom_started" );
//wait( 1.0 ); // 2.0
delayThread( 6, ::spawn_vehicles_from_targetname_and_drive, "climb_mig_distant_spawner" );
//node anim_first_frame_solo( price, "price_climb_intro" );
//wait( 2.5 ); // 2.5
level delayThread( 10, ::send_notify, "follow_price_obj" );
level delayThread( 10, ::_setsaveddvar, "g_friendlyNameDist", 0 );
// break's over soap, let's go
level.player thread play_loop_sound_on_entity( "gear_jacket_flapping_plr_loop" );
delayThread( 0.1, ::autosave_now );
node anim_single_solo( price, "price_climb_intro" );
/*
wait( 0.05 );
price SetAnimTime( price getanim( "price_climb_intro" ), 0.08 );
for ( ;; )
{
if ( price GetAnimTime( price getanim( "price_climb_intro" ) ) > 0.98 )
break;
wait( 0.05 );
}
*/
node thread anim_loop_solo( price, "price_climb_intro_idle", "stop_idle" );
flag_wait( "price_begins_climbing" );
flag_clear( "price_climb_continues" );
node notify( "stop_idle" );
// level.player delayCall( 7.2, ::switchtoweapon, level.ice_pick_viewweapon );
delay_time = 7.2;
level.player delayCall( delay_time, ::SetStance, "stand" );
level.player delayCall( delay_time, ::allowcrouch, false );
level.player delayCall( delay_time, ::allowprone, false );
// pop Price up the cliff cause he's so slow
price thread delete_player_climb_blocker_and_set_time();
level.price_climb_time = GetTime();
node thread anim_single_solo( price, "price_climb_start" );
node add_wait( ::waittill_msg, "price_climb_start" );
level add_wait( ::waittill_msg, "fourth_swing" );
do_wait_any();
flag_set( "price_climbs_past_start" );
node anim_first_frame_solo( price, "price_climb_mid" );
flag_wait( "price_climb_continues" );
SetSavedDvar( "g_friendlyNameDist", 0 );
// whoosh
delayThread( 6.8, ::activate_trigger_with_targetname, "mig_flyover_trigger" );
delayThread( 4, ::exploder, 3 );// mig29 flys overhead and fires a snow blowing effect using exploder #3
anim_length = GetAnimLength( level.scr_anim[ price.animname ][ "price_climb_mid" ] );
seconds_in = 5.5;
anim_progress_percent = seconds_in / anim_length;
delayThread( 0.05, ::set_anim_time, price, "price_climb_mid", anim_progress_percent );
thread maps\_blizzard::blizzard_level_transition_climbing_up( 2 );
node anim_single_solo( price, "price_climb_mid" );
safe_price_delete( price );
flag_wait( "reached_top" );
}
delete_player_climb_blocker_and_set_time()
{
animation = self getanim( "price_climb_start" );
for ( ;; )
{
if ( self GetAnimTime( animation ) > 0.5 )
break;
wait( 0.05 );
}
flag_set( "player_gets_on_wall" );
flag_wait( "player_begins_to_climb" );
if ( flag( "price_climbs_past_start" ) )
return;
if ( self GetAnimTime( animation ) < 0.75 )
{
self SetAnimTime( animation, 0.75 );
//println( "POP" );
}
flag_wait( "player_climbed_3_steps" );
if ( flag( "price_climbs_past_start" ) )
return;
if ( self GetAnimTime( animation ) < 0.99 )
{
self SetAnimTime( animation, 0.99 );
//println( "POP" );
}
}
gaz_catches_player( player )
{
//gaz_spawner = GetEnt( "climbing_gaz", "targetname" );
[[ level.friendly_init_cliffhanger ]]();
gaz = level.price;
gaz.dontavoidplayer = true;
gaz PushPlayer( true );
//get_me_captain_price(); // gaz_spawner spawn_ai();
spawn_failed( gaz );
if ( IsAlive( level.jumping_price ) && gaz != level.jumping_price )
{
safe_price_delete( level.jumping_price );
gaz gun_remove();
fakegun = Spawn( "script_model", gaz.origin );
fakegun SetModel( "weapon_m14ebr_arctic" );
fakegun HidePart( "TAG_THERMAL_SCOPE" );
fakegun HidePart( "TAG_FOREGRIP" );
fakegun HidePart( "TAG_ACOG_2" );
fakegun HidePart( "TAG_HEARTBEAT" );
fakegun LinkTo( gaz, "TAG_WEAPON_CHEST", ( 0, 0, 0 ), ( 0, 0, 0 ) );
gaz.fakegun = fakegun;
//gaz anim_spawn_tag_model( "weapon_m21SD_wht", "TAG_WEAPON_CHEST" );
}
else
{
self notify( "stop_idle" );
}
level.climbing_gaz = gaz;
//climbing_gaz.team = "allies";
//climbing_gaz.animname = "gaz";
gaz endon( "death" );
thread slowmo_gaz();
self anim_single_solo( level.climbing_gaz, "climb_catch" );
if ( !isalive( gaz ) )
return;
//gaz Detach( "weapon_m21SD_wht", "TAG_WEAPON_CHEST" );
gaz.fakegun Delete();
gaz detach_picks();
gaz gun_recall();
//level.player Unlink();
gaz disable_ai_color();
gaz enable_ai_color();
flag_wait( "reached_top" );
wait( 8 );
gaz.dontavoidplayer = false;
gaz PushPlayer( false );
}
slowmo_gaz()
{
//exploder( 4 ); // price slomo dives to catch you, effects fall off him as he skids on the ice
wait( 0.5 );
if ( !flag( "player_hangs_on" ) )
return;
level.player PlaySound( "scn_cliffhanger_bigjump_slowdown" );
slowmo_start();
slowmo_setspeed_slow( 0.25 );
slowmo_setlerptime_in( 0.05 );
slowmo_lerp_in();
// level.player delayThread( 2.5, ::play_sound_on_entity, "slomo_whoosh" );
//wait( animation_length * 0.005 );
wait( 0.2 );
slowmo_setlerptime_out( 0.01 );
level.player PlaySound( "scn_cliffhanger_bigjump_speedup" );
slowmo_lerp_out();
slowmo_end();
flag_set( "price_caught_player" );
}
price_tells_you_to_jump()
{
lines = [];
// lines[ lines.size ] = "letsgo";
// lines[ lines.size ] = "12metergap";
// lines[ lines.size ] = "dicey";
lines[ lines.size ] = "thefarside";
// Let<65>s go.
// Hmph. Twelve meter gap. Piece o<> piss.
// This could get dicey Soap. Mind the gap.
// Good luck mate - see you on the far side.
jump_line = random( lines );
wait( 1.5 );
level.price dialogue_queue( jump_line );
}
price_makes_the_jump( climb_jump_org )
{
price = get_me_captain_price();
level.jumping_price = price;
price endon( "death" );
climb_jump_org endon( "stop_idle" );
maps\_climb_anim::attach_pick( price );
//thread maps\_blizzard::blizzard_level_transition_climbing( .01 );
// price will sit at this time until the player looks at him
climb_jump_org anim_first_frame_solo( price, "price_jump" );
climb_jump_org = GetEnt( "climb_jump_org", "targetname" );
climb_jump_org waittill_player_lookat( 0.4, 0, true );
delayThread( 1, ::autosave_by_name, "price_jump" );
//thread price_tells_you_to_jump();
climb_jump_org anim_single_solo( price, "price_jump" );
climb_jump_org thread anim_loop_solo( price, "price_idle", "stop_idle" );
flag_wait( "player_makes_the_jump" );
climb_jump_org notify( "stop_idle" );
climb_jump_org anim_single_solo( price, "price_reach" );
safe_price_delete( price );
wait( 1.0 );
flag_set( "price_jumped" );
}
set_anim_time( character, anime, time_percent )
{
animation = character getanim( anime );
character SetAnimTime( animation, time_percent );
}
set_anim_rate( character, anime, rate )
{
animation = character getanim( anime );
character SetFlaggedAnim( "single anim", animation, 1, 0, rate );
}
player_leaps( jump_forward )
{
if ( flag( "climb_icepick_slide" ) )
{
// player managed to hit the slide trigger without "leaping" properly
// so he falls to his death
level.player BeginSliding();
level waittill( "foreverever" );
}
if ( !flag( "climb_big_jump" ) )
return false;
if ( level.player GetStance() != "stand" )
return false;
// gotta jump straight
player_angles = level.player GetPlayerAngles();
player_angles = ( 0, player_angles[ 1 ], 0 );
player_forward = AnglesToForward( player_angles );
dot = VectorDot( player_forward, jump_forward );
if ( dot < 0.94 )
{
flag_clear( "climb_big_jump" );
return false;
}
vel = level.player GetVelocity();
velocity = Distance( ( vel[ 0 ], vel[ 1 ], 0 ), ( 0, 0, 0 ) );
if ( velocity < 162 )
{
flag_clear( "climb_big_jump" );
return false;
}
/*
vel = level.player GetVelocity();
if ( vel[ 0 ] > -167 )
return false;
if ( vel[ 2 ] < 20 )
return false;
*/
level.player SetVelocity( ( vel[ 0 ] * 1.5, vel[ 1 ] * 1.5, vel[ 2 ] ) );
return true;
}
player_slides_off_cliff()
{
level endon( "stop_force_sliding_the_player" );
flag_wait( "climb_icepick_slide" );
// player managed to hit the slide trigger without "leaping" properly
// so he falls to his death
level.player BeginSliding();
}
player_big_jump()
{
if ( flag( "player_preps_for_jump" ) )
return;
player_jumpdown_block = GetEnt( "player_jumpdown_block", "targetname" );
player_jumpdown_block Solid();
flag_set( "player_preps_for_jump" );
level.player TakeAllWeapons();
// delayThread( 0.1, ::autosave_now );
level.player GiveWeapon( level.ice_pick_viewweapon, 0, 1 );
level.player SwitchToWeapon( level.ice_pick_viewweapon );
level.player notify( "stop_climbing" );
level.player PlayerSetGroundReferenceEnt( undefined );
level.player SetMoveSpeedScale( 1 );
climb_jump_org = GetEnt( "climb_jump_org", "targetname" );
flag_init( "price_jumped" );
thread price_makes_the_jump( climb_jump_org );
thread track_player_button_presses_for_holding_on();
level.price = getaiarray( "allies" )[0];
Objective_OnEntity( obj( "obj_follow_price" ), level.price );
setsaveddvar( "compass", 1 ); // see where Soap is
flag_wait( "climb_jump_prep" );
if ( level.gameskill <= 1 )
{
// on easy and normal you don't have to jump
trigger = getEntWithFlag( "climb_big_jump" );
trigger.origin += ( 0, 0, -40 );
}
flag_clear( "climb_big_jump" );
flag_wait( "climb_big_jump" );
big_jump_yaw = GetEnt( "big_jump_yaw", "targetname" );
big_jump_yaw_targ = GetEnt( big_jump_yaw.target, "targetname" );
jump_angles = VectorToAngles( big_jump_yaw_targ.origin - big_jump_yaw.origin );
jump_angles = ( 0, jump_angles[ 1 ], 0 );
jump_forward = AnglesToForward( jump_angles );
level notify( "stop_force_sliding_the_player" );
for ( ;; )
{
if ( player_leaps( jump_forward ) )
break;
wait( 0.05 );
}
// player grunts as he jumps
level.player PlaySound( "scn_cliffhanger_player_make_bigjump" );
SetDvar( "hold_on_tight", 1 );
// if the player is going too fast, he may clip through the slope, so slow him down
vel = level.player GetVelocity();
speed = Distance( vel, ( 0, 0, 0 ) );
max_speed = 300;
if ( speed > max_speed )
{
ratio = max_speed / speed;
new_vel = ( vel[ 0 ] * ratio, vel[ 1 ] * ratio, vel[ 2 ] * ratio );
level.player SetVelocity( new_vel );
}
level.player SetStance( "stand" );
level.player AllowProne( false );
level.player AllowCrouch( false );
level.player AllowSprint( false );
//level.player TakeWeapon( level.ice_pick_viewweapon );
//level.player GiveWeapon( "ice_picker_bigjump" );
//level.player SwitchToWeapon( "ice_picker_bigjump" );
flag_set( "player_makes_the_jump" );
/*
flag_wait( "climb_icepick_slide" );
level.arm_ent_globals
//if ( !flag( "price_jumped" ) )
*/
/*
if ( 1 )
{
return;
}
*/
wait( 0.4 );
// level.player TakeAllWeapons();
player_arms = spawn_anim_model( "player_rig" );
player_arms add_icepicks();
player_arms Hide();
//player_arms thread maps\_debug::dragTagUntilDeath( "tag_player", (0,1,0) );
level.playeR_arms = player_arms;
anim_both_in = player_arms getanim( "big_jump_both_in" );
anim_left = player_arms getanim( "big_jump_left" );
anim_right = player_arms getanim( "big_jump_right" );
anim_both_out = player_arms getanim( "big_jump_both_out" );
start_org = GetStartOrigin( climb_jump_org.origin, climb_jump_org.angles, anim_both_in );
start_ang = GetStartAngles( climb_jump_org.origin, climb_jump_org.angles, anim_both_in );
player_arms.origin = start_org;
player_arms.angles = start_ang;
anim_both_in_controller = player_arms getanim( "controller_both_in" );
anim_both_out_controller = player_arms getanim( "controller_both_out" );
anim_right_controller = player_arms getanim( "controller_right" );
anim_left_controller = player_arms getanim( "controller_left" );
anim_slide_controller = player_arms getanim( "controller_slide" );
anim_climb_controller = player_arms getanim( "controller_climb" );
player_arms SetAnimLimited( anim_slide_controller, 0.999, 0, 1 );
player_arms SetAnimLimited( anim_both_in_controller, 0.999, 0, 1 );
player_arms SetAnimLimited( anim_both_out_controller, 0.001, 0, 1 );
player_arms SetAnimLimited( anim_left_controller, 0.001, 0, 1 );
player_arms SetAnimLimited( anim_right_controller, 0.001, 0, 1 );
level.slip_rate = 1.6;
rate = level.slip_rate;
player_arms SetFlaggedAnimLimited( "slide", anim_both_in, 1, 0, rate );
player_arms SetAnimLimited( anim_both_out, 1, 0, rate );
player_arms SetAnimLimited( anim_left, 1, 0, rate );
player_arms SetAnimLimited( anim_right, 1, 0, rate );
//player_arms SetAnimLimited( big_jump_anim, 0.001, 0, 0 );
//player_arms SetAnimLimited( anim_climb_controller, 0.001, 0, 1 );
SetSavedDvar( "sm_sunsamplesizenear", 0.0625 );
player_arms thread arms_animated_relative_to_input();
timer = 0.7;
//thread ice_cracks( player_arms ); // soon!
level.player PlayerLinkToBlend( player_arms, "tag_player", timer, timer * 0.7, 0 );
wait( timer - 0.05 );
player_arms Show();
thread sleeve_flap( player_arms );
thread play_sound_in_space( "scn_cliffhanger_player_bigjump_bodyfall", level.player.origin );
level.player.impacted = true;
wait( 0.05 );
level.player TakeAllWeapons();
thread price_shouts();
//level.player PlayerLinkToDelta( player_arms, "tag_player", 1, 90, 90, 40, 40, false );
//player_arms SetAnim( big_jump_anim, 0.001, 0, 0 );
//player_arms SetAnimTime( big_jump_anim, 0.15 );
wait( 0.05 );
//player_arms waittillmatch( "slide", "end" );
for ( ;; )
{
if ( player_arms GetAnimTime( anim_both_in ) >= 0.99 )
break;
wait( 0.05 );
}
// player hangs sound
level.player PlaySound( "scn_cliffhanger_snow_breakaway" );
setsaveddvar( "compass", 0 );
flag_set( "player_hangs_on" );
exploder( 5 );
if ( player_arms.left_looping )
player_arms StopLoopSound( "scn_cliffhanger_icepick_scrape_left" );
if ( player_arms.right_looping )
player_arms StopLoopSound( "scn_cliffhanger_icepick_scrape_right" );
level.player.impacted = false;
player_arms notify( "stop_weights" );
player_arms notify( "stop_fx" );
climb_jump_org thread anim_single_solo( player_arms, "big_jump" );
level.rumble_ent = get_rumble_ent( "icepick_hang" );
level.rumble_ent.intensity = 0;
level.rumble_ent delayThread( 2, ::rumble_ramp_on, 4.5 );
animation = player_arms getanim( "big_jump" );
e3_start = is_e3_start();
anim_end_time = 0.95;
// if ( e3_start )
// anim_end_time = 0.62;
for ( ;; )
{
if ( player_arms GetAnimTime( animation ) > anim_end_time )
break;
// if ( flag( "price_caught_player" ) )
// break;
if ( level.gameSkill > 1 )
{
// don't fall on easy/normal
if ( !flag( "player_was_caught" ) && GetTime() > level.player.last_button_pressed_time + 1000 )
{
flag_clear( "player_hangs_on" );
level.player Unlink();
//level.player GiveWeapon( level.ice_pick_viewweapon, 0, 1 );
//level.player SwitchToWeapon( level.ice_pick_viewweapon );
playeR_arms Hide();
return;
}
}
wait( 0.05 );
}
if ( IsDefined( level.rumble_ent ) )
level.rumble_ent Delete();
// thread play_sound_in_space( "scn_cliffhanger_player_bigjump", player_arms.origin );
player_arms notify( "stop_weights" );
climb_catch = GetEnt( "climb_catch", "targetname" );
start_org = climb_catch.origin;
start_ang = climb_catch.angles;
climb_catch Delete();
flag_clear( "climb_pullup" );
flag_clear( "finished_climbing" );
flag_set( "final_climb" );
player_arms Hide();
player_arms delayThread( 0.5, ::self_delete );
PrintLn( "Origin " + level.player.origin );
for ( ;; )
{
if ( level.player player_finishes_climbing( start_org, start_ang, true, true ) )
{
break;
}
if ( flag( "finished_climbing" ) )
break;
}
if ( !flag( "can_save" ) )
return;
if ( e3_start )
{
fade_time = 1.5;
wait( fade_time );
thread set_normal_fov();
level.player PlayerSetGroundReferenceEnt( undefined );
//flag_clear( "climb_pullup" );
//flag_clear( "finished_climbing" );
//flag_set( "final_climb" );
//player_arms Hide();
//player_arms delayThread( 0.5, ::self_delete );
//player_arms notify( "stop_weights" );
}
flag_set( "reached_top" );
Objective_OnEntity( obj( "obj_follow_price" ), level.price );
SetSavedDvar( "compass", 1 );
SetSavedDvar( "ammoCounterHide", 0 );
SetSavedDvar( "actionSlotsHide", 0 );
SetSavedDvar( "hud_showStance", 1 );
SetSavedDvar( "hud_drawhud", 1 );
SetSavedDvar( "sm_sunsamplesizenear", 0.25 );
SetSavedDvar( "g_friendlyNameDist", 15000 );
level.player AllowProne( true );
level.player AllowCrouch( true );
level.player AllowSprint( true );
battlechatter_off( "allies" );
battlechatter_on( "axis" );
level.player notify( "stop sound" + "gear_jacket_flapping_plr_loop" );
level.price StopLoopSound( "gear_jacket_flapping_loop" );
// You look like you<6F>ve seen a ghost, Soap.
//level.price dialogue_queue( "seenaghost" );
thread set_normal_fov();
level.player AllowFire( true );
player_jumpdown_block Delete();
}
stop_complaining_about_goal()
{
self endon( "death" );
for ( ;; )
{
self SetGoalPos( self.origin );
wait( 0.05 );
}
}
wait_and_then_transition_to_next_part()
{
level notify( "player_in_base" );
for ( ;; )
{
if ( flag( "one_c4_planted" ) )
break;
if ( level.player.health < 50 )
break;
wait( 0.05 );
}
flag_set( "mig_c4_planted" );
flag_set( "one_c4_planted" );
thread spam_max_health();
flag_set( "tarmac_escape" );// kill price dialogue
fade_time = 1.5;
level.black_overlay = create_client_overlay( "black", 0, level.player );
level.black_overlay.alpha = 0;
// Things do not always go as planned..
level.e3_text_overlay = maps\cliffhanger_code::e3_text_hud( &"CLIFFHANGER_E3_NOT_AS_PLANNED" );
level.e3_text_overlay.alpha = 0;
level.black_overlay FadeOverTime( fade_time );
level.black_overlay.alpha = 1;
wait( fade_time );
level.e3_text_overlay FadeOverTime( fade_time );
level.e3_text_overlay.alpha = 1;
level.black_overlay delayCall( 0.1, ::Destroy );// a new one is created in the other start
level.price thread stop_complaining_about_goal();
if ( IsAlive( level.price ) )
{
if ( IsDefined( level.price.magic_bullet_shield ) )
level.price stop_magic_bullet_shield();
level.price Delete();
}
ai = GetAIArray( "axis" );
foreach ( guy in ai )
{
guy Delete();
}
thread maps\cliffhanger::start_ch_tarmac( true );
wait( 3 );
level notify( "stop_spamming_max_health" );
maps\cliffhanger::cliffhanger_tarmac_main();
maps\cliffhanger_snowmobile::snowmobile_main();
//level.player EnableDeathShield( false );
//maps\cliffhanger_snowmobile::start_snowmobile( true );
//maps\cliffhanger_snowmobile::snowmobile_main();
}
spam_max_health()
{
level endon( "stop_spamming_max_health" );
for ( ;; )
{
level.player SetNormalHealth( 100 );
wait( 0.05 );
}
}
player_gets_back_into_climbing( ent )
{
thread climbing_cracks_think( ent, ( 0, 0, 0 ), ( 1, 0, 0 ) );
wait( 0.1 );
ent.player PlayerLinkToBlend( ent.viewModel, "tag_player", 0.2 );
wait( 0.2 );
//ent.player PlayerLinkToDelta( ent.viewModel, "tag_player", 1, 0,0,0,0 );
ent.player PlayerSetGroundReferenceEnt( ent.globals.ground_ref_ent );
SetSavedDvar( "sm_sunsamplesizenear", 0.0625 );
ent.globals.ground_ref_ent_set = true;
// ent.viewModel Show();
}
price_shouts()
{
wait( 0.5 );
// Hold on! Don't let go!
level.price play_sound_on_entity( "cliff_pri_holdon" );
}
track_player_button_presses_for_holding_on()
{
level endon( "reached_top" );
level.player.last_button_pressed_time = 0;
for ( ;; )
{
left_pressed = level.player leftSwingPressed();
right_pressed = level.player rightSwingPressed();
if ( left_pressed || right_pressed )
level.player.last_button_pressed_time = GetTime();
wait( 0.05 );
}
}
sleeve_flap( model )
{
model endon( "death" );
anims = get_anims_for_climbing_direction( [], "up", "right" );
for ( ;; )
{
rate = RandomFloatRange( 1.0, 1.8 );
model SetAnim( anims[ "sleeve_flap" ], 1, 0, rate );
wait( RandomFloatRange( 0.2, 5 ) );
}
}
ice_cracks( player_arms )
{
wait( 0.2 );
player_arms thread play_crack_fx_on_arm( "left" );
player_arms thread play_crack_fx_on_arm( "right" );
}
arms_animated_relative_to_input()
{
self endon( "stop_weights" );
level.player.impacted = false;
controller_both_in = self getanim( "controller_both_in" );
controller_left = self getanim( "controller_left" );
controller_right = self getanim( "controller_right" );
controller_both_out = self getanim( "controller_both_out" );
anim_both_in = self getanim( "big_jump_both_in" );
anim_left = self getanim( "big_jump_left" );
anim_right = self getanim( "big_jump_right" );
anim_both_out = self getanim( "big_jump_both_out" );
all_anims = [];
all_anims[ all_anims.size ] = controller_both_in;
all_anims[ all_anims.size ] = controller_left;
all_anims[ all_anims.size ] = controller_right;
all_anims[ all_anims.size ] = controller_both_out;
anims = [];
anims[ 1 ][ 1 ] = controller_both_in;
anims[ 1 ][ 0 ] = controller_left;
anims[ 0 ][ 1 ] = controller_right;
anims[ 0 ][ 0 ] = controller_both_out;
pressed_rates = [];
pressed_rates[ 0 ] = 4;
pressed_rates[ 1 ] = 2;
pressed_rates[ 2 ] = level.slip_rate;
current_rate = 1;
ent = SpawnStruct();
ent.pressed[ "left" ] = false;
ent.pressed[ "right" ] = false;
thread sliding_fx( ent );
self.left_looping = false;
self.right_looping = false;
for ( ;; )
{
pressed = 0;
right_pressed = level.player rightSwingPressed();
left_pressed = level.player leftSwingPressed();
ent.pressed[ "left" ] = left_pressed;
ent.pressed[ "right" ] = right_pressed;
if ( level.player.impacted )
{
if ( left_pressed )
{
if ( !self.left_looping )
self PlayLoopSound( "scn_cliffhanger_icepick_scrape_left" );
self.left_looping = true;
}
else
{
if ( self.left_looping )
self StopLoopSound( "scn_cliffhanger_icepick_scrape_left" );
self.left_looping = false;
}
if ( right_pressed )
{
if ( !self.right_looping )
self PlayLoopSound( "scn_cliffhanger_icepick_scrape_right" );
self.right_looping = true;
}
else
{
if ( self.right_looping )
self StopLoopSound( "scn_cliffhanger_icepick_scrape_right" );
self.right_looping = false;
}
}
if ( left_pressed )
pressed++;
if ( right_pressed )
pressed++;
slide_rumble( pressed, anim_both_in );
animation = anims[ left_pressed ][ right_pressed ];
foreach ( other_animation in all_anims )
{
if ( other_animation == animation )
continue;
self SetAnimLimited( other_animation, 0.001, 0.1, 1 );
}
self SetAnimLimited( animation, 0.999, 0.1, 1 );
rate = pressed_rates[ pressed ];
if ( rate > current_rate )
{
current_rate = rate;
}
else
{
dif = 0.9;
current_rate = current_rate * dif + rate * ( 1 - dif );
}
self SetAnimLimited( anim_both_in, 1, 0, current_rate );
self SetAnimLimited( anim_both_out, 1, 0, current_rate );
self SetAnimLimited( anim_left, 1, 0, current_rate );
self SetAnimLimited( anim_right, 1, 0, current_rate );
wait( 0.05 );
}
}
sliding_fx( ent )
{
self endon( "stop_fx" );
for ( ;; )
{
foreach ( arm, pressed in ent.pressed )
{
if ( pressed )
{
fx_tag_name = get_icepick_tag_name( arm );
fx_tag = spawn_player_icepick_fx_tag( self, fx_tag_name );
fx_tag traceFX_on_tag( "slide_fx", "tag_origin", 10 );
fx_tag Delete();
wait( RandomFloatRange( 0.05, 0.1 ) );
}
}
wait( 0.05 );
}
}
slide_rumble( pressed, anim_both_in, player_arms )
{
if ( self GetAnimTime( anim_both_in ) >= 0.90 )
return;
if ( pressed == 0 )
return;
if ( !level.player.impacted )
return;
level.player PlayRumbleOnEntity( "icepick_slide" );
}
start_climb_hint( ent )
{
if ( level.gameSkill > 1 )
{
wait( 5 );
}
else
{
wait( 2 );
}
// "right_icepick", "left_icepick"
display_hint( ent.globals.current_arm + "_icepick" );
}
should_stop_hanging_left_icepick_hint()
{
return stop_hanging_arm_hint( "left" );
}
should_stop_hanging_right_icepick_hint()
{
return stop_hanging_arm_hint( "right" );
}
stop_hanging_arm_hint( arm )
{
other_arm = get_other_arm( arm );
if ( !level.player [[ level.arm_ent_globals.arm_ents[ other_arm ].buttonCheck ]]() )
return true;
return level.player [[ level.arm_ent_globals.arm_ents[ arm ].buttonCheck ]]();
}
should_stop_how_to_climb_hint()
{
return flag( "player_starts_climbing" );
}
cliff_plane_sound_node( loop, sonic_boom )
{
maps\_mig29::plane_sound_players( "veh_mig29_cliff_dist_loop", "veh_mig29_cliff_sonic_boom" );
}
is_e3_start()
{
return maps\cliffhanger_code::is_e3_start();
}
blend_in_climbing_dof( time )
{
start = level.dofDefault;
end[ "nearStart" ] = 15;
end[ "nearEnd" ] = 24;
end[ "nearBlur" ] = 4;
end[ "farStart" ] = level.dofDefault[ "farStart" ];
end[ "farEnd" ] = level.dofDefault[ "farEnd" ];
end[ "farBlur" ] = level.dofDefault[ "farBlur" ];
for ( ;; )
{
flag_wait( "climbing_dof" );
delay_then_blend_dof( start, end, time );
// set_far_dof_dist_to_price();
flag_waitopen( "climbing_dof" );
current = level.dofDefault;
blend_dof( current, start, 1 );
}
}
delay_then_blend_dof( start, end, time )
{
level endon( "climbing_dof" );
wait( 5 );
blend_dof( start, end, time );
}
set_far_dof_dist_to_price()
{
for ( ;; )
{
if ( !flag( "climbing_dof" ) )
return;
if ( !isalive( level.price ) )
return;
dist = distance( level.player.origin, level.price.origin );
level.dofDefault[ "farStart" ] = dist - 50;
level.dofDefault[ "farEnd" ] = dist + 100;
wait( 0.05 );
}
}