4442 lines
112 KiB
Plaintext
4442 lines
112 KiB
Plaintext
|
#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 );
|
|||
|
}
|
|||
|
}
|