1537 lines
49 KiB
Plaintext
1537 lines
49 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
#using_animtree("vehicles");
|
|
|
|
main( var_0, var_1, var_2 )
|
|
{
|
|
maps\_vehicle::build_template( "apache_player", var_0, var_1, var_2 );
|
|
maps\_vehicle::build_localinit( ::init_local );
|
|
maps\_vehicle::build_team( "allies" );
|
|
maps\_vehicle::build_drive( %apache_cockpit_rotor, undefined, 0 );
|
|
maps\_vehicle::build_life( 10000, 5000, 15000 );
|
|
maps\_vehicle::build_is_helicopter();
|
|
maps\_vehicle::build_treadfx( var_2, "default", "fx/treadfx/heli_dust_default", 0 );
|
|
maps\_vehicle::build_turret( "apache_pilot_turret", "tag_barrel", "vehicle_apache_iw6_mg", undefined, "manual", undefined, 20, 0 );
|
|
_precache();
|
|
_fx();
|
|
_flags();
|
|
common_scripts\utility::create_lock( "add_apache_target_lock", 4 );
|
|
}
|
|
|
|
init_local()
|
|
{
|
|
self.originheightoffset = 162;
|
|
_init();
|
|
self dontcastshadows();
|
|
}
|
|
|
|
_precache()
|
|
{
|
|
precachedigitaldistortcodeassets();
|
|
precachemodel( "apache_cockpit_player" );
|
|
precachemodel( "apache_cockpit_player_pipe" );
|
|
precacherumble( "heavygun_fire" );
|
|
precacherumble( "damage_heavy" );
|
|
precacherumble( "damage_light" );
|
|
precacherumble( "minigun_rumble" );
|
|
vehicle_scripts\_apache_player_targeting::_precache();
|
|
vehicle_scripts\_chopper_player_missile_defense::_precache();
|
|
vehicle_scripts\_apache_player_pilot::_precache();
|
|
vehicle_scripts\_apache_player_audio::_precache();
|
|
maps\_utility::post_load_precache( vehicle_scripts\_apache_player_difficulty::difficulty );
|
|
}
|
|
|
|
_init()
|
|
{
|
|
|
|
}
|
|
|
|
_flags()
|
|
{
|
|
common_scripts\utility::flag_init( "FLAG_apache_crashing" );
|
|
}
|
|
|
|
_fx()
|
|
{
|
|
level._effect["apache_player_dlight_red_flicker"] = loadfx( "fx/_requests/apache/dlight_red_flicker" );
|
|
level._effect["apache_player_cockpit_smoke"] = loadfx( "fx/_requests/apache/cockpit_smoke" );
|
|
level._effect["apache_player_cockpit_sparks_v1"] = loadfx( "fx/_requests/apache/cockpit_sparks_v1" );
|
|
level._effect["apache_player_cockpit_sparks_v2"] = loadfx( "fx/_requests/apache/cockpit_sparks_v2" );
|
|
level._effect["apache_player_cockpit_explosion"] = loadfx( "fx/_requests/apache/cockpit_explosion" );
|
|
level._effect["apache_player_cockpit_pipe_hiss"] = loadfx( "vfx/moments/oil_rocks/heli_pipe_snap" );
|
|
}
|
|
|
|
enable_treadfx()
|
|
{
|
|
maps\_treadfx::setallvehiclefx( "player", "fx/treadfx/heli_dust_default" );
|
|
maps\_treadfx::setvehiclefx( "player", "water", "fx/treadfx/heli_water" );
|
|
maps\_treadfx::setvehiclefx( "player", "snow", "fx/treadfx/heli_snow_default" );
|
|
maps\_treadfx::setvehiclefx( "player", "slush", "fx/treadfx/heli_snow_default" );
|
|
maps\_treadfx::setvehiclefx( "player", "ice", "fx/treadfx/heli_snow_default" );
|
|
}
|
|
|
|
_globals()
|
|
{
|
|
|
|
}
|
|
|
|
_start( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = spawnstruct();
|
|
self.heli = var_3;
|
|
var_0.riding_heli = self;
|
|
var_3.owner = var_0;
|
|
var_3.vehicle = self;
|
|
var_3.cover_warnings_disabled = level.cover_warnings_disabled;
|
|
var_3.treadfx_maxheight = level.treadfx_maxheight;
|
|
var_3.g_friendlynamedist = getdvarint( "g_friendlyNameDist" );
|
|
var_3.hud_showstance = getdvarint( "hud_showStance" );
|
|
var_3.compass = getdvarint( "compass" );
|
|
var_3.ammocounterhide = getdvarint( "ammoCounterHide" );
|
|
var_3.hud_fade_ammodisplay = getdvarfloat( "hud_fade_ammodisplay" );
|
|
var_3.hud_fade_stance = getdvarfloat( "hud_fade_stance" );
|
|
var_3.friendlyfire_max_participation = level.friendlyfire["max_participation"];
|
|
level.friendlyfire["max_participation"] = 1750;
|
|
var_3.targeting = vehicle_scripts\_apache_player_targeting::_init( var_0 );
|
|
var_3.pilot = vehicle_scripts\_apache_player_pilot::_init( self, var_0 );
|
|
var_3.audio = vehicle_scripts\_apache_player_audio::_init( self, var_0 );
|
|
var_3.missiledefense = vehicle_scripts\_chopper_player_missile_defense::_init( self, var_0, var_2 );
|
|
var_3.cockpit_tubes = spawn( "script_model", self.origin );
|
|
var_3.cockpit_tubes.angles = self.angles;
|
|
var_3.cockpit_tubes setmodel( "apache_cockpit_player_pipe" );
|
|
var_3.cockpit_tubes linkto( self, "tag_origin" );
|
|
level.cover_warnings_disabled = 1;
|
|
level.treadfx_maxheight = 9000;
|
|
setsaveddvar( "g_friendlyNameDist", 150000 );
|
|
setsaveddvar( "hud_showStance", 0 );
|
|
setsaveddvar( "hud_fade_ammodisplay", "0.1" );
|
|
setsaveddvar( "hud_fade_stance", "0.1" );
|
|
setsaveddvar( "ammoCounterHide", 1 );
|
|
setsaveddvar( "compass", 1 );
|
|
setsaveddvar( "sm_spotenable", 0 );
|
|
var_3 maps\_utility::ent_flag_init( "FLAG_sprinting" );
|
|
var_3 maps\_utility::ent_flag_init( "FLAG_pilot_active" );
|
|
var_3 maps\_utility::ent_flag_init( "FLAG_gunCamera_active" );
|
|
var_0 maps\_utility::ent_flag_init( "FLAG_apache_player_move_up" );
|
|
var_0 maps\_utility::ent_flag_init( "FLAG_apache_player_used_move_up" );
|
|
var_0 maps\_utility::ent_flag_init( "FLAG_apache_player_move_down" );
|
|
var_0 maps\_utility::ent_flag_init( "FLAG_apache_player_used_move_down" );
|
|
var_0 maps\_utility::ent_flag_init( "FLAG_apache_pilot_active" );
|
|
var_0 maps\_utility::ent_flag_init( "FLAG_apache_gunCamera_active" );
|
|
maps\_vehicle::aircraft_wash();
|
|
var_3 maps\_utility::ent_flag_set( "FLAG_pilot_active" );
|
|
var_3.owner maps\_utility::ent_flag_set( "FLAG_apache_pilot_active" );
|
|
thread monitormachinegun();
|
|
thread monitorhealth();
|
|
thread monitorcockpitanims();
|
|
thread monitorsprint();
|
|
var_1 = common_scripts\utility::ter_op( isdefined( var_1 ), var_1, 0 );
|
|
|
|
if ( var_1 )
|
|
{
|
|
thread monitormoveup();
|
|
thread monitormovedown();
|
|
removealtituedmesh();
|
|
}
|
|
else
|
|
thread monitoraltitude();
|
|
|
|
var_3.targeting thread vehicle_scripts\_apache_player_targeting::_start();
|
|
var_3.missiledefense thread vehicle_scripts\_chopper_player_missile_defense::_start();
|
|
var_3.pilot vehicle_scripts\_apache_player_pilot::_start( !var_1 );
|
|
var_3.audio vehicle_scripts\_apache_player_audio::_start();
|
|
var_3.fov_orig = 65;
|
|
var_0 maps\_utility::lerpfov_saved( 65, 0.1 );
|
|
var_3.pitch_offset_ground = 25.0;
|
|
var_3.pitch_offset_mid = 12.0;
|
|
var_3.pitch_offset_air = 9.0;
|
|
setsaveddvar( "vehHelicopterPitchOffset", var_3.pitch_offset_ground );
|
|
var_3.pitch_max = 10.0;
|
|
setsaveddvar( "vehHelicopterMaxPitch", var_3.pitch_max );
|
|
setsaveddvar( "vehHelicopterSoftCollisions", 1 );
|
|
setsaveddvar( "vehHelicopterControlSystem", 1 );
|
|
setsaveddvar( "vehHelicopterDecelerationFwd", 1.0 );
|
|
setsaveddvar( "vehHelicopterMaxAccel", 60 );
|
|
setsaveddvar( "vehHelicopterMaxSpeed", 120 );
|
|
setsaveddvar( "vehHelicopterMaxYawAccel", 700.0 );
|
|
setsaveddvar( "vehHelicopterMaxYawRate", 120.0 );
|
|
setsaveddvar( "vehHelicopterPitchLock", 0 );
|
|
setsaveddvar( "vehHelicopterTiltFromLook", 0.0 );
|
|
setsaveddvar( "vehHelicopterTiltFromLookRate", 0.0 );
|
|
setsaveddvar( "vehHelicopterTiltSpeed", 1.2 );
|
|
setsaveddvar( "vehHelicopterTiltFromFwdAndYaw", 50 );
|
|
setsaveddvar( "vehHelicopterTiltFromFwdAndYaw_VelAtMaxTilt", 0.8 );
|
|
|
|
if ( var_1 )
|
|
{
|
|
setsaveddvar( "vehHelicopterControlsAltitude", 3 );
|
|
setsaveddvar( "vehHelicopterLookaheadTime", 1.0 );
|
|
setsaveddvar( "vehHelicopterMaxAccelVertical", 90.0 );
|
|
setsaveddvar( "vehHelicopterMaxSpeedVertical", 65.0 );
|
|
}
|
|
else
|
|
{
|
|
setsaveddvar( "vehHelicopterControlsAltitude", 4 );
|
|
setsaveddvar( "vehHelicopterLookaheadTime", 0.4 );
|
|
setsaveddvar( "vehHelicopterMaxAccelVertical", 200.0 );
|
|
setsaveddvar( "vehHelicopterMaxSpeedVertical", 300.0 );
|
|
}
|
|
|
|
var_0 disableweaponswitch();
|
|
var_0 allowcrouch( 0 );
|
|
var_0 allowprone( 0 );
|
|
var_0 allowjump( 0 );
|
|
var_0 setplayerangles( ( 0, self.angles[1], 0 ) );
|
|
var_0 maps\_utility::player_mount_vehicle( self );
|
|
level.disablegrenadetracking = 1;
|
|
level.disablegeardrop = 1;
|
|
level.disablemonitorflash = 1;
|
|
thread _battlechatter_off();
|
|
thread setaishootoverride();
|
|
maps\_friendlyfire::apply_friendly_fire_damage_modifier( 0.1 );
|
|
}
|
|
|
|
setaishootoverride()
|
|
{
|
|
anim.shootenemywrapper_func = ::overrideaishot;
|
|
anim.shootposwrapper_func = ::shootposwrapper;
|
|
}
|
|
|
|
overrideaishot( var_0 )
|
|
{
|
|
self.a.lastshoottime = gettime();
|
|
self notify( "shooting" );
|
|
shootblankorrpg( self.enemy.origin, var_0 );
|
|
}
|
|
|
|
shootposwrapper( var_0, var_1 )
|
|
{
|
|
self.a.lastshoottime = gettime();
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 1;
|
|
|
|
self notify( "shooting" );
|
|
shootblankorrpg( var_0, var_1 );
|
|
}
|
|
|
|
shootblankorrpg( var_0, var_1 )
|
|
{
|
|
if ( weaponclass( self.weapon ) == "rocketlauncher" )
|
|
self shoot( 1, var_0, var_1 );
|
|
else
|
|
self shootblank( 1, var_0, var_1 );
|
|
}
|
|
|
|
_battlechatter_off()
|
|
{
|
|
waittillframeend;
|
|
thread maps\_utility::battlechatter_off();
|
|
animscripts\battlechatter::disablebattlechatter();
|
|
}
|
|
|
|
_battlechatter_on()
|
|
{
|
|
thread maps\_utility::battlechatter_on();
|
|
animscripts\battlechatter::enablebattlechatter();
|
|
}
|
|
|
|
setmaxheight_overtime( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_1 = max( var_1, 0.05 );
|
|
var_2 = getdvarfloat( "vehHelicopterMaxAltitude" );
|
|
|
|
for ( var_3 = 0; var_3 < var_1; var_3 = var_3 + 0.05 )
|
|
{
|
|
setsaveddvar( "vehHelicopterMaxAltitude", var_2 + var_3 / var_1 * ( var_0 - var_2 ) );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
else
|
|
setsaveddvar( "vehHelicopterMaxAltitude", var_0 );
|
|
}
|
|
|
|
setminheight_overtime( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_1 = max( var_1, 0.05 );
|
|
var_2 = getdvarfloat( "vehHelicopterMinAltitude" );
|
|
|
|
for ( var_3 = 0; var_3 < var_1; var_3 = var_3 + 0.05 )
|
|
{
|
|
setsaveddvar( "vehHelicopterMinAltitude", var_2 + var_3 / var_1 * ( var_0 - var_2 ) );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
else
|
|
setsaveddvar( "vehHelicopterMinAltitude", var_0 );
|
|
}
|
|
|
|
_end()
|
|
{
|
|
if ( maps\_utility::ent_flag_exist( "ENT_FLAG_heli_destroyed" ) && maps\_utility::ent_flag( "ENT_FLAG_heli_destroyed" ) )
|
|
return;
|
|
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self notify( "LISTEN_heli_end" );
|
|
var_0 notify( "LISTEN_heli_end" );
|
|
var_0.targeting vehicle_scripts\_apache_player_targeting::_end();
|
|
var_0.missiledefense vehicle_scripts\_chopper_player_missile_defense::_destroy();
|
|
var_0.pilot vehicle_scripts\_apache_player_pilot::_destroy();
|
|
var_0.audio vehicle_scripts\_apache_player_audio::_destroy();
|
|
var_0.cockpit_tubes delete();
|
|
monitorhealth_damagestates_cleanup();
|
|
level.cover_warnings_disabled = var_0.cover_warnings_disabled;
|
|
level.treadfx_maxheight = var_0.treadfx_maxheight;
|
|
|
|
if ( isdefined( var_0.g_friendlynamedist ) )
|
|
setsaveddvar( "g_friendlyNameDist", var_0.g_friendlynamedist );
|
|
|
|
if ( isdefined( var_0.hud_showstance ) )
|
|
setsaveddvar( "hud_showStance", var_0.hud_showstance );
|
|
|
|
if ( isdefined( var_0.compass ) )
|
|
setsaveddvar( "compass", var_0.compass );
|
|
|
|
if ( isdefined( var_0.ammocounterhide ) )
|
|
setsaveddvar( "ammoCounterHide", var_0.ammocounterhide );
|
|
|
|
if ( isdefined( var_0.hud_fade_ammodisplay ) )
|
|
setsaveddvar( "hud_fade_ammodisplay", var_0.hud_fade_ammodisplay );
|
|
|
|
if ( isdefined( var_0.hud_fade_stance ) )
|
|
setsaveddvar( "hud_fade_stance", var_0.hud_fade_stance );
|
|
|
|
level.friendlyfire["max_participation"] = var_0.friendlyfire_max_participation;
|
|
|
|
if ( isdefined( var_0.fov_orig ) )
|
|
{
|
|
var_1 maps\_utility::lerpfov_saved( var_0.fov_orig, 1.05 );
|
|
var_0.fov_orig = undefined;
|
|
}
|
|
|
|
var_1 enableweaponswitch();
|
|
var_1 allowcrouch( 1 );
|
|
var_1 allowprone( 1 );
|
|
var_1 allowjump( 1 );
|
|
self notify( "stop_kicking_up_dust" );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_player_move_up", 1 );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_player_used_move_up", 1 );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_player_move_down", 1 );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_player_used_move_down", 1 );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_pilot_active", 1 );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_gunCamera_active", 1 );
|
|
var_1 maps\_utility::player_dismount_vehicle();
|
|
level.autosave_check_override = undefined;
|
|
level.disablegrenadetracking = undefined;
|
|
level.disablegeardrop = undefined;
|
|
level.disablemonitorflash = undefined;
|
|
self delete();
|
|
thread _battlechatter_on();
|
|
anim.shootenemywrapper_func = animscripts\utility::shootenemywrapper_shootnotify;
|
|
anim.shootposwrapper_func = animscripts\utility::shootposwrapper;
|
|
setsaveddvar( "sm_spotenable", 1 );
|
|
maps\_friendlyfire::remove_friendly_fire_damage_modifier();
|
|
}
|
|
|
|
monitor_pilotandguncameraswitch()
|
|
{
|
|
self endon( "LISTEN_heli_end" );
|
|
var_0 = self.heli;
|
|
var_1 = var_0.pilot;
|
|
var_2 = var_0.guncamera;
|
|
var_3 = var_0.missiledefense;
|
|
var_4 = var_0.owner;
|
|
var_4 notifyonplayercommand( "LISTEN_pilotAndGunCameraSwitch", "+usereload" );
|
|
var_0 maps\_utility::ent_flag_set( "FLAG_pilot_active" );
|
|
var_4 maps\_utility::ent_flag_set( "FLAG_apache_pilot_active" );
|
|
|
|
for (;;)
|
|
{
|
|
var_4 waittill( "LISTEN_pilotAndGunCameraSwitch" );
|
|
var_4 thread maps\_utility::play_sound_on_entity( "apache_pilot_guncamera_switch" );
|
|
var_4 maps\_hud_util::fade_out();
|
|
wait 0.2;
|
|
var_1 vehicle_scripts\_apache_player_pilot::_end();
|
|
var_0 maps\_utility::ent_flag_clear( "FLAG_pilot_active" );
|
|
var_4 maps\_utility::ent_flag_clear( "FLAG_apache_pilot_active" );
|
|
var_0 maps\_utility::ent_flag_set( "FLAG_gunCamera_active" );
|
|
var_4 maps\_utility::ent_flag_set( "FLAG_apache_gunCamera_active" );
|
|
var_3 vehicle_scripts\_chopper_player_missile_defense::hud_update();
|
|
var_4 maps\_hud_util::fade_in();
|
|
var_4 waittill( "LISTEN_pilotAndGunCameraSwitch" );
|
|
var_4 thread maps\_utility::play_sound_on_entity( "apache_pilot_guncamera_switch" );
|
|
var_4 maps\_hud_util::fade_out();
|
|
wait 0.2;
|
|
var_0 maps\_utility::ent_flag_clear( "FLAG_gunCamera_active" );
|
|
var_4 maps\_utility::ent_flag_clear( "FLAG_apache_gunCamera_active" );
|
|
var_1 vehicle_scripts\_apache_player_pilot::_start();
|
|
var_0 maps\_utility::ent_flag_set( "FLAG_pilot_active" );
|
|
var_4 maps\_utility::ent_flag_set( "FLAG_apache_pilot_active" );
|
|
var_3 vehicle_scripts\_chopper_player_missile_defense::hud_update();
|
|
var_4 maps\_hud_util::fade_in();
|
|
}
|
|
}
|
|
|
|
monitorsprint()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self endon( "LISTEN_heli_end" );
|
|
var_1 notifyonplayercommand( "LISTEN_sprinting_start", "+sprint_zoom" );
|
|
var_1 notifyonplayercommand( "LISTEN_sprinting_stop", "-sprint_zoom" );
|
|
var_1 notifyonplayercommand( "LISTEN_sprinting_start", "+sprint" );
|
|
var_1 notifyonplayercommand( "LISTEN_sprinting_stop", "-sprint" );
|
|
var_1 notifyonplayercommand( "LISTEN_sprinting_start", "+breath_sprint" );
|
|
var_1 notifyonplayercommand( "LISTEN_sprinting_stop", "-breath_sprint" );
|
|
var_2 = gettime();
|
|
|
|
for (;;)
|
|
{
|
|
var_1 waittill( "LISTEN_sprinting_start" );
|
|
var_0 maps\_utility::ent_flag_set( "FLAG_sprinting" );
|
|
setsaveddvar( "vehHelicopterMaxSpeed", 160 );
|
|
setsaveddvar( "vehHelicopterMaxAccel", 180 );
|
|
var_1 common_scripts\utility::waittill_notify_or_timeout( "LISTEN_sprinting_stop", 4.0 );
|
|
var_0 maps\_utility::ent_flag_clear( "FLAG_sprinting" );
|
|
setsaveddvar( "vehHelicopterMaxSpeed", 120 );
|
|
setsaveddvar( "vehHelicopterMaxAccel", 60 );
|
|
wait 4.0;
|
|
}
|
|
}
|
|
|
|
monitormachinegun()
|
|
{
|
|
var_0 = self.heli.owner;
|
|
var_1 = self.mgturret[0];
|
|
var_1 hide();
|
|
self endon( "LISTEN_heli_end" );
|
|
common_scripts\utility::flag_wait( "introscreen_complete" );
|
|
thread monitormachinegun_onstop();
|
|
var_2 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
wait 0.05;
|
|
var_3 = var_0 attackbuttonpressed() && !var_1.overheated;
|
|
|
|
if ( var_2 == var_3 )
|
|
continue;
|
|
|
|
var_2 = var_3;
|
|
|
|
if ( var_2 )
|
|
{
|
|
var_0 playrumblelooponentity( "minigun_rumble" );
|
|
continue;
|
|
}
|
|
|
|
var_0 stoprumble( "minigun_rumble" );
|
|
}
|
|
}
|
|
|
|
monitormachinegun_onstop()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self waittill( "LISTEN_heli_end" );
|
|
var_1 stoprumble( "minigun_rumble" );
|
|
}
|
|
|
|
monitormoveup()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self endon( "LISTEN_heli_end" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_start_move_up", "+smoke" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_stop_move_up", "-smoke" );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 waittill( "LISTEN_apache_player_start_move_up" );
|
|
var_1 maps\_utility::ent_flag_set( "FLAG_apache_player_move_up" );
|
|
var_1 maps\_utility::ent_flag_set( "FLAG_apache_player_used_move_up" );
|
|
var_1 waittill( "LISTEN_apache_player_stop_move_up" );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_player_move_up" );
|
|
}
|
|
}
|
|
|
|
monitormovedown()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self endon( "LISTEN_heli_end" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_start_move_down", "+toggleads_throw" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_start_move_down", "+speed_throw" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_start_move_down", "+speed" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_start_move_down", "+ads_akimbo_accessible" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_stop_move_down", "-toggleads_throw" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_stop_move_down", "-speed_throw" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_stop_move_down", "-speed" );
|
|
var_1 notifyonplayercommand( "LISTEN_apache_player_stop_move_down", "-ads_akimbo_accessible" );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 waittill( "LISTEN_apache_player_start_move_down" );
|
|
var_1 maps\_utility::ent_flag_set( "FLAG_apache_player_move_down" );
|
|
var_1 maps\_utility::ent_flag_set( "FLAG_apache_player_used_move_down" );
|
|
var_1 waittill( "LISTEN_apache_player_stop_move_down" );
|
|
var_1 maps\_utility::ent_flag_clear( "FLAG_apache_player_move_down" );
|
|
}
|
|
}
|
|
|
|
removealtituedmesh()
|
|
{
|
|
var_0 = getentarray( "apache_player_mesh", "targetname" );
|
|
common_scripts\utility::array_call( var_0, ::delete );
|
|
}
|
|
|
|
monitoraltitude()
|
|
{
|
|
disable_altitude_control();
|
|
self endon( "monitor_altitude_disable" );
|
|
self endon( "LISTEN_heli_end" );
|
|
var_0 = common_scripts\utility::getstruct( "struct_altitude_trace_start", "targetname" );
|
|
var_1 = common_scripts\utility::getstruct( "struct_altitude_offset", "targetname" );
|
|
var_2 = common_scripts\utility::getstruct( "struct_altitude_trace_end", "targetname" );
|
|
var_3 = common_scripts\utility::getstruct( "struct_altitude_default", "targetname" );
|
|
|
|
if ( !isdefined( var_3 ) || !isdefined( var_1 ) || !isdefined( var_0 ) || !isdefined( var_2 ) )
|
|
return;
|
|
|
|
var_4 = var_1.origin[2] - var_3.origin[2];
|
|
var_5 = var_1.origin[2];
|
|
var_6 = var_0.origin[2];
|
|
var_7 = var_2.origin[2];
|
|
var_8 = getentarray( "apache_player_mesh", "targetname" );
|
|
var_9 = ( 0, 0, var_4 );
|
|
|
|
foreach ( var_11 in var_8 )
|
|
{
|
|
if ( !isdefined( var_11.altitude_adjusted ) )
|
|
{
|
|
var_11.origin = var_11.origin + var_9;
|
|
var_11.altitude_adjusted = 1;
|
|
}
|
|
}
|
|
|
|
var_13 = -1;
|
|
|
|
for (;;)
|
|
{
|
|
var_14 = ( self.origin[0], self.origin[1], var_6 );
|
|
var_15 = ( self.origin[0], self.origin[1], var_7 );
|
|
var_16 = bullettrace( var_14, var_15, 0 );
|
|
var_17 = var_16["position"][2];
|
|
|
|
if ( abs( var_17 - var_15[2] ) <= 0.2 )
|
|
var_17 = var_5;
|
|
|
|
if ( var_13 != var_17 )
|
|
{
|
|
var_13 = var_17;
|
|
var_18 = var_17 - var_4;
|
|
|
|
if ( isdefined( self.alt_override ) )
|
|
var_18 = max( var_18, self.alt_override );
|
|
|
|
setsaveddvar( "vehHelicopterMinAltitude", var_18 );
|
|
setsaveddvar( "vehHelicopterMaxAltitude", var_18 );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
get_altitude_min()
|
|
{
|
|
var_0 = common_scripts\utility::getstruct( "struct_altitude_offset", "targetname" );
|
|
var_1 = common_scripts\utility::getstruct( "struct_altitude_trace_end", "targetname" );
|
|
var_2 = common_scripts\utility::getstruct( "struct_altitude_default", "targetname" );
|
|
return var_2.origin[2] - ( var_0.origin[2] - var_1.origin[2] );
|
|
}
|
|
|
|
disable_altitude_control()
|
|
{
|
|
self notify( "monitor_altitude_disable" );
|
|
}
|
|
|
|
enable_altitude_control()
|
|
{
|
|
thread monitoraltitude();
|
|
}
|
|
|
|
altitude_override_over_time( var_0, var_1 )
|
|
{
|
|
self notify( "altitude_min_override" );
|
|
self endon( "altitude_min_override" );
|
|
self endon( "LISTEN_heli_end" );
|
|
|
|
if ( isdefined( var_1 ) && var_1 > 0 )
|
|
{
|
|
if ( !isdefined( self.alt_override ) )
|
|
self.alt_override = get_altitude_min();
|
|
|
|
var_1 = max( var_1, 0.05 );
|
|
var_2 = self.alt_override;
|
|
|
|
for ( var_3 = 0; var_3 <= var_1; var_3 = var_3 + 0.05 )
|
|
{
|
|
self.alt_override = var_2 + var_3 / var_1 * ( var_0 - var_2 );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
self.alt_override = var_0;
|
|
return 1;
|
|
}
|
|
|
|
altitude_min_override( var_0, var_1 )
|
|
{
|
|
altitude_override_over_time( var_0, var_1 );
|
|
}
|
|
|
|
altitude_min_override_remove( var_0 )
|
|
{
|
|
if ( isdefined( var_0 ) && var_0 > 0 )
|
|
{
|
|
var_1 = get_altitude_min();
|
|
var_2 = altitude_override_over_time( var_1, var_0 );
|
|
|
|
if ( isdefined( var_2 ) && var_2 )
|
|
{
|
|
self.alt_override = undefined;
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
self.alt_override = undefined;
|
|
}
|
|
|
|
#using_animtree("script_model");
|
|
|
|
monitorcockpitanims()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self endon( "LISTEN_heli_end" );
|
|
self endon( "ENT_FLAG_heli_destroyed" );
|
|
var_0.cockpit_tubes.jiggle_disabled = [];
|
|
var_0.cockpit_tubes.jiggle_disabled["ALL"] = 0;
|
|
var_0.cockpit_tubes.jiggle_disabled["RIGHT"] = 0;
|
|
var_0.cockpit_tubes.jiggle_disabled["LEFT"] = 0;
|
|
childthread monitorcockpitanims_ondamage();
|
|
var_0.cockpit_tubes.anims_curr = [];
|
|
var_0.cockpit_tubes.anims_curr["ALL"] = undefined;
|
|
var_0.cockpit_tubes.anims_curr["RIGHT"] = undefined;
|
|
var_0.cockpit_tubes.anims_curr["LEFT"] = undefined;
|
|
var_2 = 0.25 * getdvarfloat( "vehHelicopterMaxSpeed" );
|
|
var_3 = 0.5 * getdvarfloat( "vehHelicopterMaxSpeed" );
|
|
var_4 = 1.0 * getdvarfloat( "vehHelicopterMaxSpeed" );
|
|
var_5 = [ "ALL", "RIGHT", "LEFT" ];
|
|
|
|
for (;;)
|
|
{
|
|
var_6 = [];
|
|
var_7 = var_0.vehicle vehicle_getspeed();
|
|
|
|
if ( var_7 <= var_2 )
|
|
{
|
|
var_6["ALL"] = %apache_cockpit_idle_at_rest;
|
|
var_6["RIGHT"] = %apache_cockpit_tube_right_at_rest;
|
|
var_6["LEFT"] = %apache_cockpit_tube_left_at_rest;
|
|
}
|
|
else if ( var_7 <= var_3 )
|
|
{
|
|
var_6["ALL"] = %apache_cockpit_idle_moving_slow;
|
|
var_6["RIGHT"] = %apache_cockpit_tube_right_moving_slow;
|
|
var_6["LEFT"] = %apache_cockpit_tube_left_moving_slow;
|
|
}
|
|
else if ( var_7 <= var_4 )
|
|
{
|
|
var_6["ALL"] = %apache_cockpit_idle_moving_fast;
|
|
var_6["RIGHT"] = %apache_cockpit_tube_right_moving_fast;
|
|
var_6["LEFT"] = %apache_cockpit_tube_left_moving_fast;
|
|
}
|
|
else
|
|
{
|
|
var_6["ALL"] = undefined;
|
|
var_6["RIGHT"] = undefined;
|
|
var_6["LEFT"] = undefined;
|
|
}
|
|
|
|
if ( isdefined( var_6["ALL"] ) && ( !isdefined( var_0.cockpit_tubes.anims_curr["ALL"] ) || var_0.cockpit_tubes.anims_curr["ALL"] != var_6["ALL"] ) )
|
|
{
|
|
var_0.cockpit_tubes useanimtree( #animtree );
|
|
|
|
foreach ( var_9 in var_5 )
|
|
{
|
|
if ( !var_0.cockpit_tubes.jiggle_disabled[var_9] )
|
|
{
|
|
if ( isdefined( var_0.cockpit_tubes.anims_curr[var_9] ) )
|
|
var_0.cockpit_tubes clearanim( var_0.cockpit_tubes.anims_curr[var_9], 0.2 );
|
|
|
|
if ( isdefined( var_6[var_9] ) )
|
|
var_0.cockpit_tubes setanim( var_6[var_9], 1, 0.2, 1.0 );
|
|
}
|
|
}
|
|
|
|
var_0.cockpit_tubes.anims_curr["ALL"] = var_6["ALL"];
|
|
var_0.cockpit_tubes.anims_curr["RIGHT"] = var_6["RIGHT"];
|
|
var_0.cockpit_tubes.anims_curr["LEFT"] = var_6["LEFT"];
|
|
}
|
|
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
monitorcockpitanims_ondamage()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
var_2 = undefined;
|
|
var_3 = undefined;
|
|
var_4 = undefined;
|
|
var_5 = undefined;
|
|
var_6 = undefined;
|
|
var_7 = [ "RIGHT", "LEFT" ];
|
|
|
|
while ( var_7.size > 0 )
|
|
{
|
|
var_8 = undefined;
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "LISTEN_apache_damage_state_enter", var_8 );
|
|
|
|
if ( var_8 == "health_none" )
|
|
break;
|
|
}
|
|
|
|
var_9 = var_7[randomint( var_7.size )];
|
|
var_7 = common_scripts\utility::array_remove( var_7, var_9 );
|
|
|
|
if ( !var_0.cockpit_tubes.jiggle_disabled[var_9] )
|
|
{
|
|
var_0.cockpit_tubes clearanim( var_0.cockpit_tubes.anims_curr[var_9], 0.5 );
|
|
var_0.cockpit_tubes.jiggle_disabled[var_9] = 1;
|
|
}
|
|
|
|
if ( var_9 == "RIGHT" )
|
|
{
|
|
var_2 = %apache_cockpit_tube_right_whip_in;
|
|
var_3 = %apache_cockpit_tube_right_whip;
|
|
var_4 = %apache_cockpit_tube_right_whip_out;
|
|
var_5 = %apache_cockpit_tube_right_idle;
|
|
var_6 = "r_innertubeend_jnt";
|
|
}
|
|
else if ( var_9 == "LEFT" )
|
|
{
|
|
var_2 = %apache_cockpit_tube_left_whip_in;
|
|
var_3 = %apache_cockpit_tube_left_whip;
|
|
var_4 = %apache_cockpit_tube_left_whip_out;
|
|
var_5 = %apache_cockpit_tube_left_idle;
|
|
var_6 = "l_innertubeend_jnt";
|
|
}
|
|
|
|
childthread monitorcockpitanims_tube_whip( var_2, var_3, var_4, var_5, var_6 );
|
|
}
|
|
}
|
|
|
|
monitorcockpitanims_tube_whip( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = self.heli;
|
|
var_6 = var_5.owner;
|
|
playfxontag( common_scripts\utility::getfx( "apache_player_cockpit_pipe_hiss" ), var_5.cockpit_tubes, var_4 );
|
|
var_5.cockpit_tubes thread maps\_utility::play_loop_sound_on_tag( "apache_player_tube_hiss", var_4, 1 );
|
|
var_5.cockpit_tubes setanim( var_0, 1, 0.5, 1.0 );
|
|
var_7 = getanimlength( var_0 );
|
|
wait( var_7 - min( 0.5, var_7 * 0.1 ) );
|
|
var_5.cockpit_tubes clearanim( var_0, 0.5 );
|
|
var_5.cockpit_tubes setanim( var_1, 1, 0.5, 1.0 );
|
|
var_7 = getanimlength( var_1 );
|
|
wait 1.0;
|
|
var_5.cockpit_tubes clearanim( var_1, 0.5 );
|
|
var_5.cockpit_tubes setanim( var_2, 1, 0.5, 1.0 );
|
|
var_7 = getanimlength( var_2 );
|
|
wait( var_7 - min( 0.5, var_7 * 0.1 ) );
|
|
var_5.cockpit_tubes clearanim( var_2, 0.5 );
|
|
stopfxontag( common_scripts\utility::getfx( "apache_player_cockpit_pipe_hiss" ), var_5.cockpit_tubes, var_4 );
|
|
var_5.cockpit_tubes notify( "stop soundapache_player_tube_hiss" );
|
|
var_5.cockpit_tubes setanim( var_3, 1, 0.5, 1.0 );
|
|
}
|
|
|
|
monitorhealth()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self endon( "LISTEN_heli_end" );
|
|
self endon( "ENT_FLAG_heli_destroyed" );
|
|
apache_health_init( 100000 );
|
|
maps\_vehicle::godon();
|
|
maps\_utility::ent_flag_init( "ENT_FLAG_heli_damaged" );
|
|
maps\_utility::ent_flag_init( "ENT_FLAG_heli_health_state_finished" );
|
|
maps\_utility::ent_flag_init( "ENT_FLAG_heli_destroyed" );
|
|
thread monitorhealth_ondamage();
|
|
thread monitorhealth_ondeath();
|
|
thread monitorhealth_damagestates();
|
|
var_2 = 0;
|
|
var_3 = "STATE_FULL";
|
|
|
|
for (;;)
|
|
{
|
|
common_scripts\utility::waittill_any( "ENT_FLAG_heli_damaged", "ENT_FLAG_heli_health_state_finished" );
|
|
waittillframeend;
|
|
|
|
if ( maps\_utility::ent_flag( "ENT_FLAG_heli_health_state_finished" ) )
|
|
{
|
|
var_3 = apache_health_state_next( var_3 );
|
|
childthread apache_health_state_think( var_3 );
|
|
var_2 = 0;
|
|
maps\_utility::ent_flag_clear( "ENT_FLAG_heli_health_state_finished" );
|
|
}
|
|
|
|
if ( maps\_utility::ent_flag( "ENT_FLAG_heli_damaged" ) )
|
|
{
|
|
apache_health_adjust( -1 * self.apache_dmg_recent );
|
|
var_2 = var_2 + self.apache_dmg_recent;
|
|
var_4 = undefined;
|
|
|
|
switch ( var_3 )
|
|
{
|
|
case "STATE_REGEN":
|
|
case "STATE_PAIN":
|
|
case "STATE_FULL":
|
|
if ( apache_health_get() == 0 )
|
|
var_4 = "STATE_INVULN";
|
|
else
|
|
var_4 = "STATE_PAIN";
|
|
|
|
break;
|
|
case "STATE_INVULN":
|
|
break;
|
|
case "STATE_VULN":
|
|
if ( var_2 / apache_health_max_get() >= 0.15 )
|
|
{
|
|
maps\_utility::ent_flag_set( "ENT_FLAG_heli_destroyed" );
|
|
common_scripts\utility::flag_set( "FLAG_apache_crashing" );
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if ( isdefined( var_4 ) )
|
|
{
|
|
var_3 = var_4;
|
|
childthread apache_health_state_think( var_3 );
|
|
var_2 = 0;
|
|
}
|
|
|
|
self.apache_dmg_recent = 0;
|
|
maps\_utility::ent_flag_clear( "ENT_FLAG_heli_damaged" );
|
|
}
|
|
}
|
|
}
|
|
|
|
apache_health_state_think( var_0 )
|
|
{
|
|
self notify( "apache_health_state_think_new" );
|
|
self endon( "apache_health_state_think_new" );
|
|
self endon( "LISTEN_heli_end" );
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "STATE_FULL":
|
|
level waittill( "forever" );
|
|
break;
|
|
case "STATE_PAIN":
|
|
wait 3.0;
|
|
break;
|
|
case "STATE_INVULN":
|
|
wait 1.0;
|
|
break;
|
|
case "STATE_VULN":
|
|
wait 4.0;
|
|
break;
|
|
case "STATE_REGEN":
|
|
if ( apache_health_pct_get() < 0.4 )
|
|
apache_health_pct_set( 0.4 );
|
|
|
|
var_1 = int( max( ( apache_health_max_get() - apache_health_get() ) / 200.0, 1 ) );
|
|
|
|
while ( !apache_health_at_max() )
|
|
{
|
|
wait 0.05;
|
|
apache_health_adjust( var_1 );
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
maps\_utility::ent_flag_set( "ENT_FLAG_heli_health_state_finished" );
|
|
}
|
|
|
|
apache_health_state_next( var_0 )
|
|
{
|
|
var_1 = "";
|
|
|
|
switch ( var_0 )
|
|
{
|
|
case "STATE_FULL":
|
|
break;
|
|
case "STATE_VULN":
|
|
case "STATE_PAIN":
|
|
var_1 = "STATE_REGEN";
|
|
break;
|
|
case "STATE_INVULN":
|
|
var_1 = "STATE_VULN";
|
|
break;
|
|
case "STATE_REGEN":
|
|
var_1 = "STATE_FULL";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
monitorhealth_ondamage()
|
|
{
|
|
self endon( "LISTEN_heli_end" );
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self.apache_dmg_recent = 0;
|
|
self.apache_dmg_time = gettime();
|
|
var_2 = int( max( level.apache_player_difficulty.dmg_bullet_pct * apache_health_max_get(), 1 ) );
|
|
var_3 = int( max( level.apache_player_difficulty.dmg_projectile_pct * apache_health_max_get(), 1 ) );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12, var_13 );
|
|
|
|
if ( !isdefined( var_5 ) )
|
|
continue;
|
|
|
|
if ( getteam() == var_5 getteam() )
|
|
continue;
|
|
|
|
if ( !isdefined( var_8 ) )
|
|
continue;
|
|
|
|
var_14 = gettime();
|
|
|
|
if ( var_8 == "MOD_RIFLE_BULLET" || var_8 == "MOD_PISTOL_BULLET" )
|
|
{
|
|
var_15 = common_scripts\utility::ter_op( isai( var_5 ), 15, 1 );
|
|
|
|
if ( var_14 - self.apache_dmg_time <= level.apache_player_difficulty.dmg_bullet_delay_between_msec * var_15 )
|
|
continue;
|
|
|
|
if ( apache_health_pct_get() <= level.apache_player_difficulty.dmg_player_health_adjust_chance )
|
|
{
|
|
var_16 = level.apache_player_difficulty.dmg_player_speed_evade_min_pct * getdvarfloat( "vehHelicopterMaxSpeed" );
|
|
var_17 = level.apache_player_difficulty.dmg_player_speed_evade_max_pct * getdvarfloat( "vehHelicopterMaxSpeed" );
|
|
var_18 = clamp( self vehicle_getspeed(), var_17, var_16 );
|
|
var_19 = 1 - ( var_18 - var_17 ) / ( var_16 - var_17 );
|
|
var_20 = level.apache_player_difficulty.dmg_bullet_chance_player_evade + ( level.apache_player_difficulty.dmg_bullet_chance_player_static - level.apache_player_difficulty.dmg_bullet_chance_player_static ) * var_19;
|
|
|
|
if ( randomfloat( 1.0 ) >= var_20 )
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( common_scripts\utility::cointoss() )
|
|
self playsound( "apache_impact" );
|
|
|
|
var_21 = undefined;
|
|
|
|
switch ( var_8 )
|
|
{
|
|
case "MOD_RIFLE_BULLET":
|
|
case "MOD_PISTOL_BULLET":
|
|
case "MOD_EXPLOSIVE":
|
|
var_21 = var_2;
|
|
break;
|
|
case "MOD_PROJECTILE_SPLASH":
|
|
case "MOD_PROJECTILE":
|
|
var_21 = var_3;
|
|
level.lastplayerapachedamage = gettime();
|
|
break;
|
|
default:
|
|
var_21 = var_2;
|
|
break;
|
|
}
|
|
|
|
if ( isdefined( var_13 ) && var_13 == "hind_turret" )
|
|
var_21 = var_2;
|
|
|
|
self.apache_dmg_time = var_14;
|
|
self.apache_dmg_recent = var_21;
|
|
maps\_utility::ent_flag_set( "ENT_FLAG_heli_damaged" );
|
|
}
|
|
}
|
|
|
|
monitorhealth_ondeath_fx()
|
|
{
|
|
self endon( "LISTEN_heli_end" );
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
var_2 = self;
|
|
playfxontag( common_scripts\utility::getfx( "apache_player_dlight_red_flicker" ), var_2, "tag_dial3" );
|
|
var_2 hidepart( "tag_glass_damage" );
|
|
var_2 hidepart( "tag_glass_damage1" );
|
|
var_2 showpart( "tag_glass_damage2" );
|
|
var_2 thread maps\_utility::play_sound_on_tag( "apache_player_glass_crack_lrg", "tag_glass_damage1" );
|
|
var_1 digitaldistortsetparams( 0.4, 1.0 );
|
|
}
|
|
|
|
monitorhealth_ondeath()
|
|
{
|
|
self endon( "LISTEN_heli_end" );
|
|
var_0 = common_scripts\utility::waittill_any_return( "death", "ENT_FLAG_heli_destroyed" );
|
|
|
|
if ( var_0 == "ENT_FLAG_heli_destroyed" )
|
|
{
|
|
monitorhealth_damagestates_cleanup();
|
|
monitorhealth_ondeath_fx();
|
|
thread maps\_vehicle_code::death_firesound( "apache_player_dying_alarm" );
|
|
self notify( "LISTEN_pilot_death" );
|
|
wait 0.5;
|
|
var_1 = 2.0;
|
|
thread monitorhealth_ondeath_apache_crash();
|
|
thread monitorhealth_ondeath_player_feedback( var_1 );
|
|
thread maps\_vehicle_code::death_firesound( "apache_player_dying_loop" );
|
|
common_scripts\utility::waittill_any_timeout_no_endon_death( var_1, "crash_done" );
|
|
}
|
|
|
|
if ( isdefined( level.lastplayerapachedamage ) && gettime() - level.lastplayerapachedamage < 4000 )
|
|
maps\_player_death::grenade_death_hint( &"OILROCKS_KILLED_BY_MISSILE", &"OILROCKS_HINT_APACHE_FLARES" );
|
|
else
|
|
setdvar( "ui_deadquote", "" );
|
|
|
|
maps\_utility::missionfailedwrapper();
|
|
}
|
|
|
|
monitorhealth_ondeath_apache_crash()
|
|
{
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self.perferred_crash_location = spawnstruct();
|
|
self.perferred_crash_location.script_parameters = "direct";
|
|
self.perferred_crash_location.radius = 60;
|
|
|
|
if ( self vehicle_getspeed() > 40 )
|
|
self vehicle_setspeedimmediate( 40 );
|
|
|
|
var_2 = 600;
|
|
var_3 = bullettrace( self.origin - 160, self.origin - ( 0, 0, var_2 ), 0, self );
|
|
|
|
if ( var_3["fraction"] > 0.98 )
|
|
self.perferred_crash_location.origin = self.origin - ( 0, 0, var_2 );
|
|
else
|
|
self.perferred_crash_location.origin = self.origin + ( 0, 0, var_2 );
|
|
|
|
maps\_vehicle_code::helicopter_crash_move();
|
|
}
|
|
|
|
monitorhealth_ondeath_player_feedback( var_0 )
|
|
{
|
|
var_1 = self.heli;
|
|
var_2 = var_1.owner;
|
|
var_2 enabledeathshield( 1 );
|
|
var_2 playrumblelooponentity( "damage_heavy" );
|
|
|
|
for (;;)
|
|
{
|
|
var_2 dodamage( 40, var_2.origin );
|
|
earthquake( 0.3, 1.0, var_2.origin, 512 );
|
|
var_3 = max( min( var_0 * 0.5, 1.0 ), 0.25 );
|
|
var_0 = var_0 - var_3;
|
|
wait( var_3 );
|
|
}
|
|
}
|
|
|
|
monitorhealth_damagestates_cleanup()
|
|
{
|
|
var_0 = self;
|
|
var_1 = self.heli;
|
|
|
|
foreach ( var_3 in var_1.damage_states )
|
|
var_3 damage_state_clear( 0 );
|
|
|
|
var_0 damage_state_tag_ent_clear_all();
|
|
}
|
|
|
|
monitorhealth_damagestates()
|
|
{
|
|
self endon( "LISTEN_heli_end" );
|
|
var_0 = self.heli;
|
|
var_1 = var_0.owner;
|
|
self hidepart( "tag_glass_damage1" );
|
|
self hidepart( "tag_glass_damage2" );
|
|
self hidepart( "tag_dial1" );
|
|
var_0.damage_states = [];
|
|
var_2 = damage_state_build( 0.01, self, 0.2, 1.0, 0.275, 1.0, 750 );
|
|
var_2 damage_state_notify_add( "health_none" );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_smoke", "tag_front", 0 );
|
|
var_2 damage_state_fx_add( "apache_player_dlight_red_flicker", "tag_dial4", 0 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_sparks_v2", "tag_cable_up_front_left", 0 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_sparks_v2", "tag_cable_up_right", 0 );
|
|
var_2 damage_state_prt_add( "tag_glass_damage1", 1, "tag_glass_damage", 2, "apache_player_glass_crack_sml" );
|
|
var_2 damage_state_prt_add( "tag_glass_damage2", 1, "tag_glass_damage1", 3, "apache_player_glass_crack_lrg" );
|
|
var_2 damage_state_prt_add( "tag_dial1", 0, "tag_dial_on", 1 );
|
|
var_2 damage_state_snd_add( "apache_player_damaged_alarm", "tag_player", 0, 1 );
|
|
var_0.damage_states[var_0.damage_states.size] = var_2;
|
|
var_2 = damage_state_build( 0.25, self, 0.1, 1.0, 0.2, 1.0, 1000 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_smoke", "tag_front", 0 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_sparks_v1", "tag_cable_up_front_left", 0 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_sparks_v1", "tag_cable_up_right", 0 );
|
|
var_2 damage_state_prt_add( "tag_dial1", 0, "tag_dial_on", 1 );
|
|
var_2 damage_state_snd_add( "apache_player_damaged_25_percent_alarm", "tag_player", 0, 1 );
|
|
var_0.damage_states[var_0.damage_states.size] = var_2;
|
|
var_2 = damage_state_build( 0.55, self, 0.05, 1.0, 0.15, 1.0, 1300 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_smoke", "tag_front", 0 );
|
|
var_2 damage_state_fx_add( "apache_player_cockpit_sparks_v1", "tag_cable_up_front_left", 0 );
|
|
var_2 damage_state_snd_add( "apache_player_damaged_55_percent_alarm", "tag_player", 0, 1 );
|
|
var_0.damage_states[var_0.damage_states.size] = var_2;
|
|
var_2 = damage_state_build( 0.85, self, 0.025, 1.0, 0.1, 1.0, 1500 );
|
|
var_2 damage_state_snd_add( "apache_player_damaged_85_percent_alarm", "tag_player", 0, 1 );
|
|
var_0.damage_states[var_0.damage_states.size] = var_2;
|
|
var_2 = damage_state_build( 1.0, self, 0.0, 1.0, 0.0, 0.0, 0.0 );
|
|
var_0.damage_states[var_0.damage_states.size] = var_2;
|
|
var_0.damage_states = common_scripts\utility::array_sort_by_handler( var_0.damage_states, ::damage_state_health_pct_get );
|
|
var_5 = damage_state_choose( var_0.damage_states, apache_health_pct_get() );
|
|
var_5 damage_state_apply( 0, 1 );
|
|
var_6 = apache_health_pct_get();
|
|
var_7 = gettime();
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "apache_player_health_updated" );
|
|
waittillframeend;
|
|
var_8 = apache_health_pct_get();
|
|
var_9 = damage_state_choose( var_0.damage_states, var_8 );
|
|
|
|
if ( var_8 < var_6 || var_8 <= 0 )
|
|
{
|
|
var_10 = var_9 damage_state_quake( var_7 );
|
|
|
|
if ( var_10 )
|
|
var_7 = gettime();
|
|
}
|
|
|
|
var_6 = var_8;
|
|
|
|
if ( var_9 == var_5 )
|
|
continue;
|
|
|
|
if ( var_9.health_pct < var_5.health_pct )
|
|
{
|
|
for ( var_11 = var_0.damage_states.size - 1; var_11 >= 0; var_11-- )
|
|
{
|
|
var_2 = var_0.damage_states[var_11];
|
|
|
|
if ( var_2 == var_9 )
|
|
break;
|
|
|
|
var_2 damage_state_apply( 1 );
|
|
}
|
|
}
|
|
|
|
var_5 damage_state_clear( 1 );
|
|
var_5 damage_state_notify_send_exit();
|
|
var_9 damage_state_apply( 0 );
|
|
var_9 damage_state_notify_send_enter();
|
|
var_5 = var_9;
|
|
}
|
|
}
|
|
|
|
damage_state_choose( var_0, var_1 )
|
|
{
|
|
var_2 = undefined;
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
if ( var_1 <= var_4.health_pct )
|
|
{
|
|
var_2 = var_4;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
damage_state_build( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
|
|
{
|
|
var_7 = spawnstruct();
|
|
var_7.health_pct = var_0;
|
|
var_7.perm_on = 0;
|
|
var_7.temp_on = 0;
|
|
var_7.distort_pct = var_2;
|
|
var_7.distort_time = var_3;
|
|
var_7.quake_scale = var_4;
|
|
var_7.quake_time = var_5;
|
|
var_7.quake_interval_msec = var_6;
|
|
var_7.vehicle = var_1;
|
|
var_7.notify_msg = undefined;
|
|
var_7.fx_array = [];
|
|
var_7.prt_array = [];
|
|
var_7.snd_array = [];
|
|
return var_7;
|
|
}
|
|
|
|
damage_state_apply( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 0;
|
|
|
|
foreach ( var_3 in self.fx_array )
|
|
{
|
|
if ( var_3["perm"] && self.perm_on )
|
|
continue;
|
|
|
|
if ( !var_3["perm"] && ( var_0 || self.temp_on ) )
|
|
continue;
|
|
|
|
damage_state_play_fx_on_tag( var_3 );
|
|
}
|
|
|
|
foreach ( var_7, var_6 in self.prt_array )
|
|
{
|
|
if ( var_6["perm"] && var_6["activations"] <= 0 )
|
|
continue;
|
|
|
|
if ( !var_6["perm"] && ( var_0 || var_6["activations"] <= 0 ) )
|
|
continue;
|
|
|
|
self.prt_array[var_7]["activations"]--;
|
|
|
|
if ( self.prt_array[var_7]["activations"] > 0 )
|
|
continue;
|
|
|
|
if ( isdefined( var_6["tag_hide"] ) )
|
|
self.vehicle hidepart( var_6["tag_hide"] );
|
|
|
|
self.vehicle showpart( var_6["tag_show"] );
|
|
|
|
if ( isdefined( var_6["sound"] ) )
|
|
self.vehicle thread maps\_utility::play_sound_on_tag( var_6["sound"], var_6["tag_show"] );
|
|
}
|
|
|
|
foreach ( var_9 in self.snd_array )
|
|
{
|
|
if ( var_9["perm"] && self.perm_on )
|
|
continue;
|
|
|
|
if ( !var_9["perm"] && ( var_0 || self.temp_on ) )
|
|
continue;
|
|
|
|
if ( var_9["loop"] )
|
|
{
|
|
self.vehicle thread maps\_utility::play_loop_sound_on_tag( var_9["alias"], var_9["tag"], 1, 1 );
|
|
continue;
|
|
}
|
|
|
|
self.vehicle thread maps\_utility::play_sound_on_tag( var_9["alias"], var_9["tag"] );
|
|
}
|
|
|
|
if ( !var_1 && !var_0 && isdefined( self.distort_pct ) && isdefined( self.distort_time ) )
|
|
self.vehicle.heli.owner digitaldistortsetparams( self.distort_pct, self.distort_time );
|
|
|
|
if ( !self.perm_on )
|
|
self.perm_on = 1;
|
|
|
|
if ( !var_0 && !self.temp_on )
|
|
self.temp_on = 1;
|
|
}
|
|
|
|
damage_state_clear( var_0 )
|
|
{
|
|
foreach ( var_2 in self.fx_array )
|
|
{
|
|
if ( var_2["perm"] && ( var_0 || !self.perm_on ) )
|
|
continue;
|
|
|
|
if ( !var_2["perm"] && !self.temp_on )
|
|
continue;
|
|
|
|
damage_state_stop_fx_on_tag( var_2 );
|
|
}
|
|
|
|
foreach ( var_6, var_5 in self.prt_array )
|
|
{
|
|
if ( var_5["perm"] && ( var_0 || var_5["activations"] > 0 ) )
|
|
continue;
|
|
|
|
if ( !var_5["perm"] && var_5["activations"] > 0 )
|
|
continue;
|
|
|
|
self.prt_array[var_6]["activations"]++;
|
|
|
|
if ( isdefined( var_5["tag_hide"] ) )
|
|
self.vehicle showpart( var_5["tag_hide"] );
|
|
|
|
self.vehicle hidepart( var_5["tag_show"] );
|
|
}
|
|
|
|
foreach ( var_8 in self.snd_array )
|
|
{
|
|
if ( !var_8["loop"] )
|
|
continue;
|
|
|
|
if ( var_8["perm"] && ( var_0 || !self.perm_on ) )
|
|
continue;
|
|
|
|
if ( !var_8["perm"] && !self.temp_on )
|
|
continue;
|
|
|
|
self.vehicle notify( "stop sound" + var_8["alias"] );
|
|
}
|
|
|
|
if ( isdefined( self.distort_pct ) && isdefined( self.distort_time ) )
|
|
self.vehicle.heli.owner digitaldistortsetparams( 0.0, 0.0 );
|
|
|
|
if ( self.perm_on && !var_0 )
|
|
self.perm_on = 0;
|
|
|
|
if ( self.temp_on )
|
|
self.temp_on = 0;
|
|
}
|
|
|
|
damage_state_quake( var_0 )
|
|
{
|
|
var_1 = 0;
|
|
|
|
if ( self.quake_scale > 0 && gettime() - var_0 >= self.quake_interval_msec )
|
|
{
|
|
earthquake( self.quake_scale, self.quake_time, self.vehicle.heli.owner.origin, 1024 );
|
|
self.vehicle.heli.owner playrumbleonentity( "damage_light" );
|
|
var_1 = 1;
|
|
}
|
|
|
|
return var_1;
|
|
}
|
|
|
|
damage_state_health_pct_get()
|
|
{
|
|
return self.health_pct;
|
|
}
|
|
|
|
damage_state_fx_add( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = [];
|
|
var_3["fx"] = var_0;
|
|
var_3["tag"] = var_1;
|
|
var_3["perm"] = var_2;
|
|
self.fx_array[self.fx_array.size] = var_3;
|
|
}
|
|
|
|
damage_state_prt_add( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = [];
|
|
var_5["tag_show"] = var_0;
|
|
var_5["perm"] = var_1;
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_5["tag_hide"] = var_2;
|
|
|
|
var_5["activations"] = common_scripts\utility::ter_op( isdefined( var_3 ), int( max( var_3, 1 ) ), 1 );
|
|
|
|
if ( isdefined( var_4 ) )
|
|
var_5["sound"] = var_4;
|
|
|
|
self.prt_array[self.prt_array.size] = var_5;
|
|
}
|
|
|
|
damage_state_snd_add( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = [];
|
|
var_4["alias"] = var_0;
|
|
var_4["tag"] = var_1;
|
|
var_4["perm"] = var_2;
|
|
var_4["loop"] = var_3;
|
|
self.snd_array[self.snd_array.size] = var_4;
|
|
}
|
|
|
|
damage_state_notify_add( var_0 )
|
|
{
|
|
self.notify_msg = var_0;
|
|
}
|
|
|
|
damage_state_notify_send_enter()
|
|
{
|
|
if ( isdefined( self.notify_msg ) )
|
|
self.vehicle notify( "LISTEN_apache_damage_state_enter", self.notify_msg );
|
|
}
|
|
|
|
damage_state_notify_send_exit()
|
|
{
|
|
if ( isdefined( self.notify_msg ) )
|
|
self.vehicle notify( "LISTEN_apache_damage_state_exit", self.notify_msg );
|
|
}
|
|
|
|
damage_state_tag_ent_get( var_0 )
|
|
{
|
|
if ( !isdefined( self.vehicle.damage_state_tag_ents ) )
|
|
self.vehicle.damage_state_tag_ents = [];
|
|
|
|
if ( !isdefined( self.vehicle.damage_state_tag_ents[var_0] ) )
|
|
{
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
var_1.origin = self.vehicle gettagorigin( var_0 );
|
|
var_1.angles = self.vehicle gettagangles( var_0 );
|
|
var_1 linkto( self.vehicle, var_0 );
|
|
self.vehicle.damage_state_tag_ents[var_0] = var_1;
|
|
}
|
|
|
|
return self.vehicle.damage_state_tag_ents[var_0];
|
|
}
|
|
|
|
damage_state_tag_ent_clear_all()
|
|
{
|
|
if ( isdefined( self.damage_state_tag_ents ) )
|
|
{
|
|
foreach ( var_1 in self.damage_state_tag_ents )
|
|
var_1 delete();
|
|
|
|
self.damage_state_tag_ents = undefined;
|
|
}
|
|
}
|
|
|
|
damage_state_play_fx_on_tag( var_0 )
|
|
{
|
|
var_1 = damage_state_tag_ent_get( var_0["tag"] );
|
|
playfxontag( common_scripts\utility::getfx( var_0["fx"] ), var_1, "tag_origin" );
|
|
}
|
|
|
|
damage_state_stop_fx_on_tag( var_0 )
|
|
{
|
|
var_1 = damage_state_tag_ent_get( var_0["tag"] );
|
|
stopfxontag( common_scripts\utility::getfx( var_0["fx"] ), var_1, "tag_origin" );
|
|
}
|
|
|
|
apache_health_init( var_0, var_1 )
|
|
{
|
|
self.apache_health = var_0;
|
|
self.apache_health_max = common_scripts\utility::ter_op( isdefined( var_1 ), var_1, var_0 );
|
|
}
|
|
|
|
apache_health_get()
|
|
{
|
|
return self.apache_health;
|
|
}
|
|
|
|
apache_health_pct_get()
|
|
{
|
|
return apache_health_get() / apache_health_max_get();
|
|
}
|
|
|
|
apache_health_at_max()
|
|
{
|
|
return apache_health_get() >= apache_health_max_get();
|
|
}
|
|
|
|
apache_health_set( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::ter_op( isdefined( self.apache_health_min ), self.apache_health_min, 0 );
|
|
self.apache_health = int( clamp( var_0, var_1, apache_health_max_get() ) );
|
|
self notify( "apache_player_health_updated" );
|
|
}
|
|
|
|
apache_health_pct_set( var_0 )
|
|
{
|
|
apache_health_set( apache_health_max_get() * var_0 );
|
|
}
|
|
|
|
apache_health_pct_min_set( var_0 )
|
|
{
|
|
self.apache_health_min = int( apache_health_max_get() * var_0 );
|
|
}
|
|
|
|
apache_health_pct_min_clear()
|
|
{
|
|
self.apache_health_min = undefined;
|
|
}
|
|
|
|
apache_health_adjust( var_0 )
|
|
{
|
|
var_1 = apache_health_get() + var_0;
|
|
apache_health_set( var_1 );
|
|
}
|
|
|
|
apache_health_max_get()
|
|
{
|
|
return self.apache_health_max;
|
|
}
|
|
|
|
apache_health_max_set( var_0 )
|
|
{
|
|
self.apache_health_max = var_0;
|
|
}
|
|
|
|
hud_addandshowtargets( var_0, var_1 )
|
|
{
|
|
common_scripts\utility::lock( "add_apache_target_lock" );
|
|
self.heli.targeting vehicle_scripts\_apache_player_targeting::hud_addtargets( var_0, var_1 );
|
|
self.heli.targeting vehicle_scripts\_apache_player_targeting::hud_showtargets( var_0 );
|
|
common_scripts\utility::unlock( "add_apache_target_lock" );
|
|
}
|
|
|
|
hud_addtargets( var_0, var_1 )
|
|
{
|
|
self.heli.targeting vehicle_scripts\_apache_player_targeting::hud_addtargets( var_0, var_1 );
|
|
}
|
|
|
|
hud_showtargets( var_0 )
|
|
{
|
|
self.heli.targeting vehicle_scripts\_apache_player_targeting::hud_showtargets( var_0 );
|
|
}
|
|
|
|
hud_hidetargets( var_0 )
|
|
{
|
|
self.heli.targeting vehicle_scripts\_apache_player_targeting::hud_hidetargets( var_0 );
|
|
}
|
|
|
|
hud_color_ally()
|
|
{
|
|
return vehicle_scripts\_apache_player_targeting::hud_color_ally();
|
|
}
|
|
|
|
hud_set_target_locked( var_0 )
|
|
{
|
|
vehicle_scripts\_apache_player_targeting::hud_set_target_locked( var_0 );
|
|
}
|
|
|
|
hud_set_target_default( var_0 )
|
|
{
|
|
vehicle_scripts\_apache_player_targeting::hud_set_target_default( var_0 );
|
|
}
|
|
|
|
getteam()
|
|
{
|
|
if ( isturret( self ) && isdefined( self.script_team ) )
|
|
return self.script_team;
|
|
|
|
if ( maps\_vehicle::isvehicle() && isdefined( self.script_team ) )
|
|
return self.script_team;
|
|
|
|
if ( isdefined( self.team ) )
|
|
return self.team;
|
|
|
|
return "none";
|
|
}
|
|
|
|
isturret( var_0 )
|
|
{
|
|
return isdefined( var_0 ) && isdefined( var_0.classname ) && issubstr( var_0.classname, "turret" );
|
|
}
|