2658 lines
82 KiB
Plaintext
2658 lines
82 KiB
Plaintext
|
/* SOUNDS
|
||
|
helicopter_world_edge_warning
|
||
|
helicopter_world_edge_failure
|
||
|
|
||
|
alarm_cobra_altitude,,cobra/alarm_altitude.wav,0.99,0.99,na,,,360,6000,local,,,,,cobrapilot pilotcobra
|
||
|
alarm_cobra_caution,,cobra/alarm_caution.wav,0.99,0.99,na,,,360,6000,local,,,,,cobrapilot pilotcobra
|
||
|
alarm_cobra_pullup,,cobra/alarm_pullup.wav,0.99,0.99,na,,,360,6000,local,,,,,cobrapilot pilotcobra
|
||
|
alarm_cobra_warning,,cobra/alarm_warning.wav,0.99,0.99,na,,,360,6000,local,,,,,cobrapilot pilotcobra
|
||
|
|
||
|
weap_rearming,,cobra/weap_rearming.wav,0.99,0.99,wpnplyr,,,360,6000,auto,,,,,cobrapilot pilotcobra
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include maps\_utility;
|
||
|
#include maps\_helicopter_globals;
|
||
|
#include common_scripts\utility;
|
||
|
#using_animtree( "vehicles" );
|
||
|
init()
|
||
|
{
|
||
|
/******************************************************/
|
||
|
/* DVARS */
|
||
|
/******************************************************/
|
||
|
|
||
|
// dvar to give player's cobra unlimited ammo
|
||
|
// 0 - regular
|
||
|
// 1 - unlimited
|
||
|
setDvarIfUninitialized( "cobrapilot_unlimited_ammo", "0" );
|
||
|
|
||
|
// dvar to toggle the mode at which ammo reloading points operate
|
||
|
// 0 - player manually hovers above the point and ammo and health is regened
|
||
|
// 1 - players controls are taken away and sequence is started
|
||
|
setDvarIfUninitialized( "cobrapilot_farp_mode", "0" );
|
||
|
|
||
|
// dvar to set how the edge of the world acts
|
||
|
// 0 - nothing happens, player can fly out of bounds without penalty
|
||
|
// 1 - control is taken away and helicopter is automatically flown in bounds
|
||
|
// 2 - warning message pops up and player must fly in bounds within the time limit
|
||
|
setDvarIfUninitialized( "cobrapilot_edge_of_world_type", "2" );
|
||
|
|
||
|
// turn on/off the gunner in your chopper
|
||
|
// 0 - off
|
||
|
// 1 - on
|
||
|
setDvarIfUninitialized( "cobrapilot_gunner_enabled", "0" );
|
||
|
|
||
|
// turn on/off the wingman
|
||
|
// 0 - off
|
||
|
// 1 - on
|
||
|
setDvarIfUninitialized( "cobrapilot_wingman_enabled", "0" );
|
||
|
|
||
|
// difficulty dvar
|
||
|
// easy, medium, hard, insane
|
||
|
setdvar( "cobrapilot_difficulty", "easy" );
|
||
|
|
||
|
// dvar to turn on debug info ( prints, lines, etc )
|
||
|
setDvarIfUninitialized( "cobrapilot_debug", "0" );
|
||
|
|
||
|
|
||
|
// turn on/off cockpit sounds
|
||
|
// 0 - off
|
||
|
// 1 - on
|
||
|
setDvarIfUninitialized( "cobrapilot_sounds_enabled", "0" );
|
||
|
|
||
|
/******************************************************/
|
||
|
/******************************************************/
|
||
|
/******************************************************/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/******************************************************/
|
||
|
/* SETUP WEAPON TAGS */
|
||
|
/******************************************************/
|
||
|
|
||
|
/* Old cobra settings
|
||
|
level.cobra_weapon_tags = [];
|
||
|
level.cobra_weapon_tags[ "cobra_20mm" ][ 0 ] = "tag_flash";
|
||
|
level.cobra_weapon_tags[ "cobra_FFAR" ][ 0 ] = "tag_store_r_2";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 0 ] = "tag_store_l_1_a";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 1 ] = "tag_store_l_1_b";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 2 ] = "tag_store_l_1_c";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 3 ] = "tag_store_l_1_d";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 4 ] = "tag_store_r_1_a";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 5 ] = "tag_store_r_1_b";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 6 ] = "tag_store_r_1_c";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 7 ] = "tag_store_r_1_d";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 8 ] = "tag_store_l_2_a";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 9 ] = "tag_store_l_2_b";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 10 ] = "tag_store_l_2_c";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 11 ] = "tag_store_l_2_d";
|
||
|
level.cobra_weapon_tags[ "cobra_Sidewinder" ][ 0 ] = "tag_store_l_wing";
|
||
|
level.cobra_weapon_tags[ "cobra_Sidewinder" ][ 1 ] = "tag_store_r_wing";
|
||
|
*/
|
||
|
|
||
|
// Little Bird Config
|
||
|
level.cobra_weapon_tags = [];
|
||
|
level.cobra_weapon_tags[ "cobra_20mm" ][ 0 ] = "tag_minigun_attach_left";
|
||
|
level.cobra_weapon_tags[ "cobra_20mm" ][ 1 ] = "tag_minigun_attach_right";
|
||
|
level.cobra_weapon_tags[ "cobra_FFAR" ][ 0 ] = "tag_missile_left";
|
||
|
level.cobra_weapon_tags[ "cobra_FFAR" ][ 1 ] = "tag_missile_right";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 0 ] = "tag_missile_left";
|
||
|
level.cobra_weapon_tags[ "cobra_Hellfire" ][ 1 ] = "tag_missile_right";
|
||
|
level.cobra_weapon_tags[ "cobra_Sidewinder" ][ 0 ] = "tag_missile_left";
|
||
|
level.cobra_weapon_tags[ "cobra_Sidewinder" ][ 1 ] = "tag_missile_right";
|
||
|
//--------------
|
||
|
|
||
|
level.cobra_missile_models = [];
|
||
|
level.cobra_missile_models[ "cobra_Hellfire" ] = "projectile_hellfire_missile";
|
||
|
level.cobra_missile_models[ "cobra_Sidewinder" ] = "projectile_sidewinder_missile";
|
||
|
|
||
|
/******************************************************/
|
||
|
/******************************************************/
|
||
|
/******************************************************/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/******************************************************/
|
||
|
/* SETUP WEAPONS */
|
||
|
/******************************************************/
|
||
|
|
||
|
// 20mm Chain Gun
|
||
|
weapon = weaponsSystems_Create_Weapon();
|
||
|
weapon.v[ "weapon" ] = "cobra_20mm";
|
||
|
// M197 20mm Cannon
|
||
|
weapon.v[ "realWeaponName" ] = &"COBRAPILOT_20MM";
|
||
|
weapon.v[ "weaponNameLocationX" ] = 573;
|
||
|
weapon.v[ "weaponNameLocationY" ] = 149;
|
||
|
weapon.v[ "equipButton" ] = "BUTTON_A";
|
||
|
weapon.v[ "equipShader" ] = "cobra_controls_a";
|
||
|
weapon.v[ "singleShot" ] = false;
|
||
|
weapon.v[ "targetType" ] = "dummy";
|
||
|
weapon.v[ "requireLock" ] = false;
|
||
|
weapon.v[ "maxAmmo" ] = 750;
|
||
|
weapon.v[ "ammoPickupIncrement" ] = 50;
|
||
|
weapon.v[ "tags" ] = level.cobra_weapon_tags[ "cobra_20mm" ];
|
||
|
weaponsSystems_Add_Weapon( weapon );
|
||
|
|
||
|
// Unguided Rockets
|
||
|
weapon = weaponsSystems_Create_Weapon();
|
||
|
weapon.v[ "weapon" ] = "cobra_FFAR";
|
||
|
// LAU-61C/A Unguided Rockets
|
||
|
weapon.v[ "realWeaponName" ] = &"COBRAPILOT_FFAR";
|
||
|
weapon.v[ "weaponNameLocationX" ] = 573;
|
||
|
weapon.v[ "weaponNameLocationY" ] = 167;
|
||
|
weapon.v[ "equipButton" ] = "BUTTON_B";
|
||
|
weapon.v[ "equipShader" ] = "cobra_controls_b";
|
||
|
weapon.v[ "singleShot" ] = false;
|
||
|
weapon.v[ "targetType" ] = "dummy";
|
||
|
weapon.v[ "requireLock" ] = false;
|
||
|
weapon.v[ "maxAmmo" ] = 38;
|
||
|
weapon.v[ "ammoPickupIncrement" ] = 4;
|
||
|
weapon.v[ "tags" ] = level.cobra_weapon_tags[ "cobra_FFAR" ];
|
||
|
weaponsSystems_Add_Weapon( weapon );
|
||
|
|
||
|
// Hellfire
|
||
|
weapon = weaponsSystems_Create_Weapon();
|
||
|
weapon.v[ "weapon" ] = "cobra_Hellfire";
|
||
|
// AGM-114 Hellfire Anti-Tank
|
||
|
weapon.v[ "realWeaponName" ] = &"COBRAPILOT_HELLFIRE";
|
||
|
weapon.v[ "weaponNameLocationX" ] = 573;
|
||
|
weapon.v[ "weaponNameLocationY" ] = 185;
|
||
|
weapon.v[ "equipButton" ] = "BUTTON_X";
|
||
|
weapon.v[ "equipShader" ] = "cobra_controls_x";
|
||
|
weapon.v[ "hudShader" ] = "veh_hud_hellfire";
|
||
|
weapon.v[ "hudShader_size_x" ] = 200;
|
||
|
weapon.v[ "hudShader_size_y" ] = 200;
|
||
|
weapon.v[ "singleShot" ] = true;
|
||
|
weapon.v[ "targetType" ] = "ground";
|
||
|
weapon.v[ "requireLock" ] = true;
|
||
|
weapon.v[ "lockonTime" ] = 1500;
|
||
|
weapon.v[ "maxAmmo" ] = 8;
|
||
|
weapon.v[ "ammoPickupIncrement" ] = 1;
|
||
|
weapon.v[ "tags" ] = level.cobra_weapon_tags[ "cobra_Hellfire" ];
|
||
|
weaponsSystems_Add_Weapon( weapon );
|
||
|
|
||
|
// Sidewinder
|
||
|
weapon = weaponsSystems_Create_Weapon();
|
||
|
weapon.v[ "weapon" ] = "cobra_Sidewinder";
|
||
|
// AIM-9 Sidewinder Air-to-Air
|
||
|
weapon.v[ "realWeaponName" ] = &"COBRAPILOT_SIDEWINDER";
|
||
|
weapon.v[ "sound_armed_loop" ] = "weap_aim9_growl4";
|
||
|
weapon.v[ "weaponNameLocationX" ] = 573;
|
||
|
weapon.v[ "weaponNameLocationY" ] = 203;
|
||
|
weapon.v[ "equipButton" ] = "BUTTON_Y";
|
||
|
weapon.v[ "equipShader" ] = "cobra_controls_y";
|
||
|
weapon.v[ "hudShader" ] = "veh_hud_sidewinder";
|
||
|
weapon.v[ "hudShader_size_x" ] = 200;
|
||
|
weapon.v[ "hudShader_size_y" ] = 200;
|
||
|
weapon.v[ "singleShot" ] = true;
|
||
|
weapon.v[ "targetType" ] = "air";
|
||
|
weapon.v[ "requireLock" ] = true;
|
||
|
weapon.v[ "lockonTime" ] = 3000;
|
||
|
weapon.v[ "maxAmmo" ] = 2;
|
||
|
weapon.v[ "ammoPickupIncrement" ] = 1;
|
||
|
weapon.v[ "ammoPickupDelay_Min" ] = 1.0;
|
||
|
weapon.v[ "ammoPickupDelay_Max" ] = 2.0;
|
||
|
weapon.v[ "tags" ] = level.cobra_weapon_tags[ "cobra_Sidewinder" ];
|
||
|
weaponsSystems_Add_Weapon( weapon );
|
||
|
|
||
|
/******************************************************/
|
||
|
/******************************************************/
|
||
|
/******************************************************/
|
||
|
|
||
|
// Warning you are leaving the mission area! Turn back!
|
||
|
precacheString( &"COBRAPILOT_EDGE_OF_WORLD_WARNING" );
|
||
|
// You left the mission area! Mission Failed!
|
||
|
precacheString( &"COBRAPILOT_EDGE_OF_WORLD_FAIL" );
|
||
|
// No Ammo
|
||
|
precacheString( &"COBRAPILOT_NO_AMMO" );
|
||
|
// Requires Lock-On
|
||
|
precacheString( &"COBRAPILOT_NO_LOCK" );
|
||
|
// Objective indicator marks the ammo reload helipad
|
||
|
precacheString( &"COBRAPILOT_OBJECTIVE_AMMO_RELOAD_POINT" );
|
||
|
|
||
|
level.vehicleSpawnCallbackThread = ::vehicle_Spawn_Callback_Thread;
|
||
|
|
||
|
level.cobraHealth = [];
|
||
|
level.cobraHealth[ "easy" ] = 9000;
|
||
|
level.cobraHealth[ "medium" ] = 7000;
|
||
|
level.cobraHealth[ "hard" ] = 3000;
|
||
|
level.cobraHealth[ "insane" ] = 1500;
|
||
|
|
||
|
level.flareButton1 = "BUTTON_LSHLDR";
|
||
|
level.flareButton2 = "BUTTON_RSHLDR";
|
||
|
|
||
|
level.stats = [];
|
||
|
level.stats[ "enemies_killed" ] = 0;
|
||
|
level.stats[ "damage_taken" ] = 0;
|
||
|
level.stats[ "cobra_20mm" ] = 0;
|
||
|
level.stats[ "cobra_FFAR" ] = 0;
|
||
|
level.stats[ "cobra_Hellfire" ] = 0;
|
||
|
level.stats[ "cobra_Sidewinder" ] = 0;
|
||
|
level.stats[ "flares_used" ] = 0;
|
||
|
|
||
|
level.cosine = [];
|
||
|
level.cosine[ "45" ] = cos( 45 );
|
||
|
level.cosine[ "55" ] = cos( 55 );
|
||
|
|
||
|
level.GunnerTargetRange = 16000;
|
||
|
level.GunnerTargetFOV = level.cosine[ "55" ];
|
||
|
level.GunnerWeapon = "cobra_20mm_copilot";
|
||
|
level.GunnerWeaponPlayerEquiv = "cobra_20mm";
|
||
|
precacheItem( level.GunnerWeapon );
|
||
|
|
||
|
level.flare_fx = [];
|
||
|
level.flare_fx[ "cobra" ] = loadfx( "misc/flares_cobra" );
|
||
|
level.flare_fx[ "cobra_player" ] = loadfx( "misc/flares_cobra" );
|
||
|
level.flare_fx[ "hind" ] = loadfx( "misc/flares_cobra" );
|
||
|
|
||
|
level.player_death_fx = loadfx( "explosions/cobrapilot_vehicle_explosion" );
|
||
|
|
||
|
level.initialFOV = 65;
|
||
|
level.weaponZoomFOV = 35;
|
||
|
|
||
|
precacheShader( "compass_waypoint_farp" );
|
||
|
precacheShader( "cobra_health" );
|
||
|
|
||
|
// precache gunner character
|
||
|
precacheModel( "body_complete_sp_cobra_pilot_desert_zack" );
|
||
|
|
||
|
// precache materials used for missile hint indicators
|
||
|
level.missileHintIndicator_Missile = "veh_hud_missile";
|
||
|
level.missileHintIndicator_Missile_Flash = "veh_hud_missile_flash";
|
||
|
level.missileHintIndicator_Missile_Offscreen = "veh_hud_missile_offscreen";
|
||
|
level.missileHintIndicator_Arrow = [];
|
||
|
level.missileHintIndicator_Arrow[ "left" ] = "veh_hud_missile_arrow_left";
|
||
|
level.missileHintIndicator_Arrow[ "right" ] = "veh_hud_missile_arrow_right";
|
||
|
level.missileHintIndicator_Arrow[ "forward" ] = "veh_hud_missile_arrow_forward";
|
||
|
level.missileHintIndicator_Arrow[ "back" ] = "veh_hud_missile_arrow_back";
|
||
|
precacheShader( level.missileHintIndicator_Missile );
|
||
|
precacheShader( level.missileHintIndicator_Missile_Flash );
|
||
|
precacheShader( level.missileHintIndicator_Missile_Offscreen );
|
||
|
precacheShader( level.missileHintIndicator_Arrow[ "left" ] );
|
||
|
precacheShader( level.missileHintIndicator_Arrow[ "right" ] );
|
||
|
precacheShader( level.missileHintIndicator_Arrow[ "forward" ] );
|
||
|
precacheShader( level.missileHintIndicator_Arrow[ "back" ] );
|
||
|
|
||
|
level.cobrapilot_difficulty = getdvar( "cobrapilot_difficulty" );
|
||
|
assert( isdefined( level.cobraHealth[ level.cobrapilot_difficulty ] ) );
|
||
|
level.flyablecobra_starting_health = level.cobraHealth[ level.cobrapilot_difficulty ];
|
||
|
level.flyablecobra_healthWarning_value = 1000;
|
||
|
level.flyablecobra_healthRegenIncrement = int( level.flyablecobra_starting_health / 6 );
|
||
|
level.flyablecobra_healthRegenRate = 1.0;
|
||
|
level.flyablecobra_healthLeakIncrement = 30;
|
||
|
level.flyablecobra_healthLeakRate = 1.0;
|
||
|
|
||
|
/*
|
||
|
if ( getdvar( "cobrapilot_edge_of_world_type") == "1" )
|
||
|
array_thread( getentarray( "border_outer", "targetname" ), ::borderwall_method1 );
|
||
|
else if ( getdvar( "cobrapilot_edge_of_world_type") == "2" )
|
||
|
thread edge_Of_World();
|
||
|
*/
|
||
|
|
||
|
//thread ammo_Reload_Station();
|
||
|
//thread incommingMissile_Think();
|
||
|
|
||
|
/*
|
||
|
if ( getdvar( "cobrapilot_gunner_enabled") == "1" )
|
||
|
chopper thread gunner_spawn();
|
||
|
*/
|
||
|
|
||
|
array_thread( getentarray( "cobra", "targetname" ), ::setup_player_usable_vehicle );
|
||
|
array_thread( getentarray( "flyable_heli", "targetname" ), ::setup_player_usable_vehicle );
|
||
|
}
|
||
|
|
||
|
setup_player_usable_vehicle()
|
||
|
{
|
||
|
assert( isdefined( self ) );
|
||
|
assert( isdefined( self.target ) );
|
||
|
self.trigger = getent( self.target, "targetname" );
|
||
|
assert( isdefined( self.trigger ) );
|
||
|
|
||
|
self.script_targetoffset_z = -100;
|
||
|
|
||
|
self makeUnusable();
|
||
|
|
||
|
self thread wait_player_enter();
|
||
|
|
||
|
self notify( "stop_kicking_up_dust" );
|
||
|
}
|
||
|
|
||
|
wait_player_enter()
|
||
|
{
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self.trigger waittill( "trigger", pilot );
|
||
|
if ( pilot.classname == "player" )
|
||
|
break;
|
||
|
wait 0.05;
|
||
|
}
|
||
|
|
||
|
level thread player_enter_chopper( self, pilot );
|
||
|
}
|
||
|
|
||
|
player_enter_chopper( chopper, pilot )
|
||
|
{
|
||
|
chopper useby( pilot );
|
||
|
chopper setjitterparams( ( 3, 3, 3 ), 0.5, 1.5 );
|
||
|
chopper.hudelems = spawnstruct();
|
||
|
|
||
|
pilot.ignoreme = true;
|
||
|
|
||
|
chopper.pilot = pilot;
|
||
|
chopper.pilot.currentWeapon = 0;
|
||
|
chopper.playercontrolled = true;
|
||
|
|
||
|
thread player_becomes_pilot_model( chopper );
|
||
|
chopper thread startRotors();
|
||
|
chopper thread maps\_vehicle::aircraft_dust_kickup();
|
||
|
|
||
|
chopper.gunner_use_turret = false;
|
||
|
if ( level.cobraWeapon[ chopper.pilot.currentWeapon ].v[ "weapon" ] != level.GunnerWeaponPlayerEquiv )
|
||
|
chopper.gunner_use_turret = true;
|
||
|
|
||
|
if ( ( isdefined( level.cobraWeapon ) ) && ( level.cobraWeapon.size > 0 ) )
|
||
|
chopper setVehWeapon( level.cobraWeapon[ chopper.pilot.currentWeapon ].v[ "weapon" ] );
|
||
|
|
||
|
chopper notify( "nodeath_thread" );
|
||
|
chopper notify( "no_regen_health" );
|
||
|
chopper notify( "stop_turret_shoot" );
|
||
|
chopper notify( "stop_friendlyfire_shield" );
|
||
|
chopper notify( "stop_vehicle_wait" );
|
||
|
|
||
|
chopper thread globalThink();
|
||
|
chopper thread weaponsSystems();
|
||
|
|
||
|
chopper.pilot freezeControls( true );
|
||
|
chopper waittill( "takeoff" );
|
||
|
chopper thread setChopperHealth();
|
||
|
chopper setGoalYaw( chopper.angles[ 1 ] );
|
||
|
chopper setVehGoalPos( chopper.origin + ( 0, 0, 40 ), 1 );
|
||
|
chopper waittill( "goal" );
|
||
|
chopper returnPlayerControl();
|
||
|
chopper.pilot freezeControls( false );
|
||
|
}
|
||
|
|
||
|
player_becomes_pilot_model( chopper )
|
||
|
{
|
||
|
if ( chopper.vehicletype != "cobra_player" )
|
||
|
return;
|
||
|
|
||
|
assert( isdefined( chopper.pilot ) );
|
||
|
chopper.pilot hide();
|
||
|
|
||
|
chopper.pilotModel = spawn( "script_model", chopper getTagOrigin( "tag_pilot" ) );
|
||
|
chopper.pilotModel.angles = chopper getTagAngles( "tag_pilot" );
|
||
|
chopper.pilotModel setmodel( "body_complete_sp_cobra_pilot_desert_zack" );
|
||
|
chopper.pilotModel linkto( chopper, "tag_pilot", ( 0, 0, -40 ), ( 0, 0, 0 ) );
|
||
|
chopper.pilotModel useAnimTree( #animtree );
|
||
|
|
||
|
while ( isdefined( chopper ) )
|
||
|
{
|
||
|
chopper.pilotModel setFlaggedAnim( "pilot_idle_anim", %cobra_copilot_idle );
|
||
|
chopper.pilotModel waittillmatch( "pilot_idle_anim", "end" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
startRotors()
|
||
|
{
|
||
|
self useAnimTree( #animtree );
|
||
|
|
||
|
startUp = true;
|
||
|
rate = 0.2;
|
||
|
rate_inc = 0.2;
|
||
|
rate_time = 0.2;
|
||
|
|
||
|
while ( isdefined( self ) )
|
||
|
{
|
||
|
self setFlaggedAnim( "rotor_anim", %bh_rotors, 1.0, 0.1, rate );
|
||
|
if ( startUp )
|
||
|
{
|
||
|
wait rate_time;
|
||
|
rate += rate_inc;
|
||
|
if ( rate >= 4.0 )
|
||
|
{
|
||
|
rate = 1.0;
|
||
|
startUp = false;
|
||
|
self notify( "takeoff" );
|
||
|
if ( self.vehicletype == "cobra_player" )
|
||
|
self setModel( "vehicle_cobra_helicopter_fly" );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
self waittillmatch( "rotor_anim", "end" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
setChopperHealth()
|
||
|
{
|
||
|
assert( isdefined( self.pilot ) );
|
||
|
|
||
|
self.health = level.flyablecobra_starting_health;
|
||
|
self.currenthealth = level.flyablecobra_starting_health;
|
||
|
self.maxhealth = level.flyablecobra_starting_health;
|
||
|
|
||
|
self health_indicator_create();
|
||
|
self thread health_indicator_damageWait();
|
||
|
self thread health_think();
|
||
|
}
|
||
|
|
||
|
vehicle_Spawn_Callback_Thread( vehicle )
|
||
|
{
|
||
|
vehicle thread globalThink();
|
||
|
|
||
|
if ( !isdefined( vehicle.script_cobratarget ) )
|
||
|
return;
|
||
|
|
||
|
if ( vehicle.script_cobratarget != 1 )
|
||
|
return;
|
||
|
|
||
|
assert( isdefined( vehicle.script_targettype ) );
|
||
|
if ( !isdefined( vehicle.script_targetoffset_z ) )
|
||
|
vehicle.script_targetoffset_z = 0;
|
||
|
offset = ( 0, 0, vehicle.script_targetoffset_z );
|
||
|
|
||
|
cobraTarget_Add( level.player, vehicle, vehicle.script_targettype, offset );
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Create_Weapon()
|
||
|
{
|
||
|
ent = spawnStruct();
|
||
|
ent.v = [];
|
||
|
|
||
|
/*
|
||
|
weapon:
|
||
|
name of weapon defined in asset manager
|
||
|
realWeaponName:
|
||
|
real name of weapon used for hud/info, should be a localized string name
|
||
|
sound_armed:
|
||
|
sound to play when this weapon becomes equipped
|
||
|
sound_armed_loop (optional):
|
||
|
sound to loop while this weapon is armed
|
||
|
weaponNameLocationX / weaponNameLocationY:
|
||
|
x and y coordinate for realWeaponName text on the HUD
|
||
|
equipButton:
|
||
|
button pressed to equip this weapon
|
||
|
equipShader:
|
||
|
shader to use when this weapon is equipped
|
||
|
hudShader (optional):
|
||
|
shader to use for the HUD when this vehicle is equiped
|
||
|
hudShader_size_x (optional) / hudShader_size_y (optional):
|
||
|
size of the hudShader
|
||
|
singleShot:
|
||
|
if true, player must release the fire button before firing another shot
|
||
|
if false, holding the fire button fires multiple shots sequentially
|
||
|
targetType:
|
||
|
dummy - no targeting, just straight projectiles
|
||
|
ground - targets ground targets only
|
||
|
air - targets air targets only
|
||
|
lockonTime (optional):
|
||
|
number of milliseconds required for lockon to engage
|
||
|
shader_target:
|
||
|
shader targets use that are valid, but not locked
|
||
|
shader_target_offscreen:
|
||
|
shader valid targets use when they are offscreen
|
||
|
shader_lock:
|
||
|
shader targets use when they are fully locked on
|
||
|
shader_locking:
|
||
|
when a target is being locked (but isn't fully locked yet) it flashes this shader until full lock is reached
|
||
|
shader_invalid:
|
||
|
shader targets use that the current weapon system can't target
|
||
|
shader_invalid_offscreen:
|
||
|
shader invalid targets use when they are offscreen
|
||
|
maxAmmo:
|
||
|
maxinum number of rounds the helicopter can hold
|
||
|
ammoPickupIncrement:
|
||
|
number of rounds picked up each time the helicopter picks up ammo
|
||
|
ammoPickupDelay_Min / ammoPickupDelay_Max:
|
||
|
min and max random wait time between weapon pickups
|
||
|
tags:
|
||
|
array of tags on the helicopter where projectiles originate from
|
||
|
*/
|
||
|
|
||
|
// set some defaults
|
||
|
ent.v[ "weapon" ] = undefined;
|
||
|
ent.v[ "realWeaponName" ] = undefined;
|
||
|
ent.v[ "sound_armed" ] = "cobra_weapon_change";
|
||
|
ent.v[ "sound_armed_loop" ] = undefined;
|
||
|
ent.v[ "weaponNameLocationX" ] = undefined;
|
||
|
ent.v[ "weaponNameLocationY" ] = undefined;
|
||
|
ent.v[ "equipButton" ] = undefined;
|
||
|
ent.v[ "equipShader" ] = undefined;
|
||
|
ent.v[ "hudShader" ] = undefined;
|
||
|
ent.v[ "hudShader_size_x" ] = undefined;
|
||
|
ent.v[ "hudShader_size_y" ] = undefined;
|
||
|
ent.v[ "singleShot" ] = false;
|
||
|
ent.v[ "targetType" ] = undefined;
|
||
|
ent.v[ "requireLock" ] = false;
|
||
|
ent.v[ "lockonTime" ] = undefined;
|
||
|
ent.v[ "shader_target" ] = "veh_hud_target";
|
||
|
ent.v[ "shader_target_offscreen" ] = "veh_hud_target_offscreen";
|
||
|
ent.v[ "shader_lock" ] = "veh_hud_target_lock";
|
||
|
ent.v[ "shader_locking" ] = "veh_hud_target_locking";
|
||
|
ent.v[ "shader_invalid" ] = "veh_hud_target_invalid";
|
||
|
ent.v[ "shader_invalid_offscreen" ] = "veh_hud_target_invalid_offscreen";
|
||
|
ent.v[ "maxAmmo" ] = undefined;
|
||
|
ent.v[ "ammoPickupIncrement" ] = undefined;
|
||
|
ent.v[ "ammoPickupDelay_Min" ] = 0.5;
|
||
|
ent.v[ "ammoPickupDelay_Max" ] = 1.2;
|
||
|
ent.v[ "tags" ] = undefined;
|
||
|
|
||
|
return ent;
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Add_Weapon( weapon )
|
||
|
{
|
||
|
if ( !isdefined( level.cobraWeapon ) )
|
||
|
level.cobraWeapon = [];
|
||
|
|
||
|
assert( isdefined( level.cobraWeapon ) );
|
||
|
assert( isdefined( weapon.v[ "weapon" ] ) );
|
||
|
assert( isdefined( weapon.v[ "realWeaponName" ] ) );
|
||
|
assert( isdefined( weapon.v[ "sound_armed" ] ) );
|
||
|
assert( isdefined( weapon.v[ "weaponNameLocationX" ] ) );
|
||
|
assert( isdefined( weapon.v[ "weaponNameLocationY" ] ) );
|
||
|
assert( isdefined( weapon.v[ "equipButton" ] ) );
|
||
|
assert( isdefined( weapon.v[ "equipShader" ] ) );
|
||
|
assert( isdefined( weapon.v[ "singleShot" ] ) );
|
||
|
assert( isdefined( weapon.v[ "targetType" ] ) );
|
||
|
assert( isdefined( weapon.v[ "shader_target" ] ) );
|
||
|
assert( isdefined( weapon.v[ "shader_target_offscreen" ] ) );
|
||
|
assert( isdefined( weapon.v[ "shader_lock" ] ) );
|
||
|
assert( isdefined( weapon.v[ "shader_locking" ] ) );
|
||
|
assert( isdefined( weapon.v[ "shader_invalid" ] ) );
|
||
|
assert( isdefined( weapon.v[ "shader_invalid_offscreen" ] ) );
|
||
|
assert( isdefined( weapon.v[ "maxAmmo" ] ) );
|
||
|
assert( isdefined( weapon.v[ "ammoPickupIncrement" ] ) );
|
||
|
assert( isdefined( weapon.v[ "ammoPickupDelay_Min" ] ) );
|
||
|
assert( isdefined( weapon.v[ "ammoPickupDelay_Max" ] ) );
|
||
|
assert( isdefined( weapon.v[ "tags" ] ) );
|
||
|
assert( weapon.v[ "tags" ].size > 0 );
|
||
|
|
||
|
index = level.cobraWeapon.size;
|
||
|
level.cobraWeapon[ index ] = weapon;
|
||
|
level.cobraWeapon[ index ].v[ "currentAmmo" ] = level.cobraWeapon[ index ].v[ "maxAmmo" ];
|
||
|
level.cobraWeapon[ index ].v[ "nextTag" ] = 0;
|
||
|
|
||
|
//precache the weapons localized string name
|
||
|
precacheString( level.cobraWeapon[ index ].v[ "realWeaponName" ] );
|
||
|
|
||
|
//precache the weapon
|
||
|
precacheItem( level.cobraWeapon[ index ].v[ "weapon" ] );
|
||
|
|
||
|
//precache the shaders
|
||
|
if ( isdefined( level.cobraWeapon[ index ].v[ "hudShader" ] ) )
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "hudShader" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "equipShader" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "shader_target" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "shader_target_offscreen" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "shader_lock" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "shader_locking" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "shader_invalid" ] );
|
||
|
precacheShader( level.cobraWeapon[ index ].v[ "shader_invalid_offscreen" ] );
|
||
|
|
||
|
// create the HUD weapon name
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ] = newHudElem();
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].x = level.cobraWeapon[ index ].v[ "weaponNameLocationX" ];
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].y = level.cobraWeapon[ index ].v[ "weaponNameLocationY" ];
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].alignX = "left";
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].alignY = "middle";
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].horzAlign = "left";
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].vertAlign = "middle";
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].foreground = true;
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].fontscale = 1.0;
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ].color = ( 0, 1, 0 );
|
||
|
level.cobraWeapon[ index ].v[ "weaponNameHUD" ] setText( level.cobraWeapon[ index ].v[ "realWeaponName" ] );
|
||
|
|
||
|
// create the HUD ammo counter
|
||
|
if ( getdvar( "cobrapilot_unlimited_ammo" ) == "0" )
|
||
|
{
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ] = newHudElem();
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].x = level.cobraWeapon[ index ].v[ "weaponNameLocationX" ] + 160;
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].y = level.cobraWeapon[ index ].v[ "weaponNameLocationY" ];
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].alignX = "center";
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].alignY = "middle";
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].horzAlign = "left";
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].vertAlign = "middle";
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].foreground = true;
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].fontscale = 1.0;
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ].color = ( 0, 1, 0 );
|
||
|
level.cobraWeapon[ index ].v[ "ammoCounter" ] setValue( level.cobraWeapon[ index ].v[ "currentAmmo" ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
weaponsSystems()
|
||
|
{
|
||
|
assert( isdefined( self ) );
|
||
|
assert( isdefined( self.pilot ) );
|
||
|
assert( self.pilot.classname == "player" );
|
||
|
|
||
|
if ( !isdefined( level.cobraWeapon ) )
|
||
|
return;
|
||
|
if ( level.cobraWeapon.size == 0 )
|
||
|
return;
|
||
|
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
self thread weaponsSystems_HUD();
|
||
|
self thread weaponsSystems_Fire_Missile();
|
||
|
self thread weaponsSystems_zoom();
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
for ( i = 0 ; i < level.cobraWeapon.size ; i++ )
|
||
|
{
|
||
|
if ( self.pilot buttonPressed( level.cobraWeapon[ i ].v[ "equipButton" ] ) )
|
||
|
{
|
||
|
// stop the equip loop sound of the old weapon if it was playing one
|
||
|
weaponSystems_EquipLoopSound_Stop();
|
||
|
|
||
|
// activate the weapon
|
||
|
if ( self.pilot.currentWeapon == i )
|
||
|
{
|
||
|
self.pilot weaponsSystems_buttonRelease_Wait( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "equipButton" ] );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
self.pilot.currentWeapon = i;
|
||
|
|
||
|
if ( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "weapon" ] == level.GunnerWeaponPlayerEquiv )
|
||
|
{
|
||
|
self.gunner_use_turret = false;
|
||
|
self notify( "gunner_stop_firing" );
|
||
|
self clearTurretTarget();
|
||
|
}
|
||
|
else
|
||
|
self.gunner_use_turret = true;
|
||
|
|
||
|
self setVehWeapon( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "weapon" ] );
|
||
|
|
||
|
level notify( "weapon_armed" );
|
||
|
|
||
|
// stop any lockon sounds that might have started
|
||
|
if ( ( isdefined( level.cobraTarget ) ) && ( level.cobraTarget.size > 0 ) )
|
||
|
{
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
self thread cobraTarget_holdWait_missileLock_Sound_Stop( level.cobraTarget[ i ] );
|
||
|
}
|
||
|
|
||
|
// play weapon equip sound and if the weapon has an armed loop sound play it now
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
{
|
||
|
self.pilot playLocalSound( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "sound_armed" ] );
|
||
|
self thread weaponSystems_EquipLoopSound_Start();
|
||
|
}
|
||
|
|
||
|
cobraTarget_unlockAllTargets();
|
||
|
cobraTarget_UpdateShaders_All( self.pilot );
|
||
|
|
||
|
self.pilot weaponsSystems_buttonRelease_Wait( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "equipButton" ] );
|
||
|
}
|
||
|
}
|
||
|
wait 0.05;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
weaponSystems_EquipLoopSound_Start()
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) != "1" )
|
||
|
return;
|
||
|
|
||
|
if ( !isdefined( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "sound_armed_loop" ] ) )
|
||
|
return;
|
||
|
|
||
|
if ( isdefined( level.weaponEquipLoopSoundPlaying ) )
|
||
|
return;
|
||
|
|
||
|
level.weaponEquipLoopSoundPlaying = true;
|
||
|
|
||
|
self.pilot thread playLoopSoundForSeeking( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "sound_armed_loop" ] );
|
||
|
}
|
||
|
|
||
|
weaponSystems_EquipLoopSound_Stop()
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) != "1" )
|
||
|
return;
|
||
|
|
||
|
level.weaponEquipLoopSoundPlaying = undefined;
|
||
|
|
||
|
if ( !isdefined( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "sound_armed_loop" ] ) )
|
||
|
return;
|
||
|
self.pilot notify( "stop sound" + level.cobraWeapon[ self.pilot.currentWeapon ].v[ "sound_armed_loop" ] );
|
||
|
}
|
||
|
|
||
|
weaponsSystems_buttonRelease_Wait( button )
|
||
|
{
|
||
|
assert( isdefined( self ) );
|
||
|
assert( self.classname == "player" );
|
||
|
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
while ( self buttonPressed( button ) )
|
||
|
wait 0.05;
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
}
|
||
|
|
||
|
weaponsSystems_HUD()
|
||
|
{
|
||
|
assert( isdefined( self ) );
|
||
|
|
||
|
if ( !isdefined( level.cobraWeapon ) )
|
||
|
return;
|
||
|
if ( level.cobraWeapon.size == 0 )
|
||
|
return;
|
||
|
|
||
|
// weapon selection display
|
||
|
controller_layout_size_x = 300;
|
||
|
controller_layout_size_y = 75;
|
||
|
self.hudelems.controller_layout = newClientHudElem( self.pilot );
|
||
|
self.hudelems.controller_layout.x = 25;
|
||
|
self.hudelems.controller_layout.y = 10;
|
||
|
self.hudelems.controller_layout.alignX = "right";
|
||
|
self.hudelems.controller_layout.alignY = "bottom";
|
||
|
self.hudelems.controller_layout.horzAlign = "right";
|
||
|
self.hudelems.controller_layout.vertAlign = "bottom";
|
||
|
self.hudelems.controller_layout.foreground = true;
|
||
|
|
||
|
// weapon HUD
|
||
|
self.hudelems.weapon_hud = newClientHudElem( self.pilot );
|
||
|
self.hudelems.weapon_hud.x = 0;
|
||
|
self.hudelems.weapon_hud.y = 0;
|
||
|
self.hudelems.weapon_hud.alignX = "center";
|
||
|
self.hudelems.weapon_hud.alignY = "middle";
|
||
|
self.hudelems.weapon_hud.horzAlign = "center";
|
||
|
self.hudelems.weapon_hud.vertAlign = "middle";
|
||
|
self.hudelems.weapon_hud.foreground = true;
|
||
|
self.hudelems.weapon_hud.alpha = 0;
|
||
|
|
||
|
level endon( "cobra_death" );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
assert( isdefined( self.pilot.currentWeapon ) );
|
||
|
|
||
|
// weapon selection display
|
||
|
assert( isdefined( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "equipShader" ] ) );
|
||
|
self.hudelems.controller_layout setshader( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "equipShader" ], controller_layout_size_x, controller_layout_size_y );
|
||
|
|
||
|
// weapon HUD
|
||
|
if ( isdefined( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "hudShader" ] ) )
|
||
|
{
|
||
|
assert( isdefined( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "hudShader_size_x" ] ) );
|
||
|
assert( isdefined( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "hudShader_size_y" ] ) );
|
||
|
self.hudelems.weapon_hud setshader( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "hudShader" ], level.cobraWeapon[ self.pilot.currentWeapon ].v[ "hudShader_size_x" ], level.cobraWeapon[ self.pilot.currentWeapon ].v[ "hudShader_size_y" ] );
|
||
|
self.hudelems.weapon_hud.alpha = 1;
|
||
|
}
|
||
|
else
|
||
|
self.hudelems.weapon_hud.alpha = 0;
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
level waittill( "weapon_armed" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Fire_Missile()
|
||
|
{
|
||
|
self endon( "death" );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
// code notify that the trigger was pulled
|
||
|
self waittill( "turret_fire" );
|
||
|
|
||
|
// make sure the player has ammo
|
||
|
if ( getdvar( "cobrapilot_unlimited_ammo" ) != "1" )
|
||
|
{
|
||
|
if ( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "currentAmmo" ] <= 0 )
|
||
|
{
|
||
|
self thread weaponsSystems_noAmmo_Warning();
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// get the missile lock target if there is one
|
||
|
missileTarget = weaponsSystems_Get_Missile_Target();
|
||
|
|
||
|
// check if the weapon requires lockon, and that the player meets the requirements
|
||
|
if ( ( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "requireLock" ] == true ) && ( !isdefined( missileTarget ) ) )
|
||
|
{
|
||
|
thread weaponsSystems_noLock_Warning();
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// fire the weapon from the next tag to be used
|
||
|
// if there are targets that are locked, fire the missile at those targets
|
||
|
eMissile = undefined;
|
||
|
if ( isdefined( missileTarget ) )
|
||
|
{
|
||
|
eMissile = self fireWeapon( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "tags" ][ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "nextTag" ] ], missileTarget.targetEntity );
|
||
|
missileTarget.targetEntity notify( "incomming_missile", eMissile );
|
||
|
if ( !isdefined( missileTarget.targetEntity.incomming_Missiles ) )
|
||
|
missileTarget.targetEntity.incomming_Missiles = [];
|
||
|
missileTarget.targetEntity.incomming_Missiles = array_add( missileTarget.targetEntity.incomming_Missiles, eMissile );
|
||
|
thread missile_deathWait( eMissile, missileTarget.targetEntity );
|
||
|
}
|
||
|
else
|
||
|
eMissile = self fireWeapon( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "tags" ][ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "nextTag" ] ] );
|
||
|
|
||
|
assert( isdefined( eMissile ) );
|
||
|
|
||
|
assert( isdefined( level.stats[ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "weapon" ] ] ) );
|
||
|
level.stats[ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "weapon" ] ]++ ;
|
||
|
|
||
|
if ( isdefined( self.hasAttachedWeapons ) )
|
||
|
{
|
||
|
if ( ( isdefined( level.cobra_missile_models ) ) && ( isdefined( level.cobra_missile_models[ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "weapon" ] ] ) ) )
|
||
|
{
|
||
|
modelname = level.cobra_missile_models[ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "weapon" ] ];
|
||
|
tagname = level.cobraWeapon[ self.pilot.currentWeapon ].v[ "tags" ][ level.cobraWeapon[ self.pilot.currentWeapon ].v[ "nextTag" ] ];
|
||
|
self weaponsSystems_Detach_Weapon( modelname, tagname );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// update what the next tag should be - some weapons only use one tag so it will remain the same
|
||
|
level.cobraWeapon[ self.pilot.currentWeapon ].v[ "nextTag" ]++ ;
|
||
|
if ( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "nextTag" ] >= level.cobraWeapon[ self.pilot.currentWeapon ].v[ "tags" ].size )
|
||
|
level.cobraWeapon[ self.pilot.currentWeapon ].v[ "nextTag" ] = 0;
|
||
|
|
||
|
// take away ammo and update the ammo counter on the hud
|
||
|
if ( getdvar( "cobrapilot_unlimited_ammo" ) == "0" )
|
||
|
{
|
||
|
level.cobraWeapon[ self.pilot.currentWeapon ].v[ "currentAmmo" ] -- ;
|
||
|
level.cobraWeapon[ self.pilot.currentWeapon ].v[ "ammoCounter" ] setValue( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "currentAmmo" ] );
|
||
|
}
|
||
|
|
||
|
// some weapons require player to release the fire button before a second shot is fired
|
||
|
if ( level.cobraWeapon[ self.pilot.currentWeapon ].v[ "singleShot" ] )
|
||
|
self.pilot weaponsSystems_buttonRelease_Wait( "BUTTON_RTRIG" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Detach_Weapon( modelname, tagname )
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_unlimited_ammo" ) == "1" )
|
||
|
return;
|
||
|
|
||
|
// build list of all attached models
|
||
|
attachedModelCount = self getattachsize();
|
||
|
attachedModels = [];
|
||
|
for ( i = 0 ; i < attachedModelCount ; i++ )
|
||
|
attachedModels[ i ] = self getattachmodelname( i );
|
||
|
|
||
|
// check to see if this model is attached to this model
|
||
|
// if it is, see if it's on the matching tagname
|
||
|
qAttached = false;
|
||
|
for ( i = 0 ; i < attachedModels.size ; i++ )
|
||
|
{
|
||
|
if ( attachedModels[ i ] != modelname )
|
||
|
continue;
|
||
|
|
||
|
sName = self getattachtagname( i );
|
||
|
if ( tolower( tagname ) != tolower( sName ) )
|
||
|
continue;
|
||
|
|
||
|
qAttached = true;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( qAttached )
|
||
|
self detach( modelname, tagname );
|
||
|
else
|
||
|
println( "FAILED TO DETACH MODEL: " + modelname + " from tag: " + tagname );
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Attach_Weapon( weapon )
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_unlimited_ammo" ) == "1" )
|
||
|
return;
|
||
|
|
||
|
// build list of all attached models
|
||
|
attachedModelCount = self getattachsize();
|
||
|
|
||
|
//attachedModels = [];
|
||
|
//for ( i = 0 ; i < attachedModelCount ; i++ )
|
||
|
// attachedModels[ i ] = self getattachmodelname( i );
|
||
|
|
||
|
// find an open tag that this model could get attached to
|
||
|
if ( !isdefined( level.cobra_missile_models[ weapon ] ) )
|
||
|
return;
|
||
|
missileModel = level.cobra_missile_models[ weapon ];
|
||
|
attachToTag = undefined;
|
||
|
for ( i = 0 ; i < level.cobra_weapon_tags[ weapon ].size ; i++ )
|
||
|
{
|
||
|
tag = level.cobra_weapon_tags[ weapon ][ i ];
|
||
|
|
||
|
// check if a model is already attached to this tag
|
||
|
if ( weaponsSystems_Model_Attached_To_Tag( tag ) )
|
||
|
continue;
|
||
|
|
||
|
attachToTag = tag;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( isdefined( attachToTag ) )
|
||
|
self attach( missileModel, attachToTag );
|
||
|
//else
|
||
|
//println( "FAILED TO ATTACH MODEL: " + missileModel );
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Model_Attached_To_Tag( tagname )
|
||
|
{
|
||
|
// find if a model is attached to this tag
|
||
|
attachedModelCount = self getattachsize();
|
||
|
for ( i = 0 ; i < attachedModelCount ; i++ )
|
||
|
{
|
||
|
if ( self getattachtagname( i ) == tagname )
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
weaponsSystems_Get_Missile_Target()
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
missileTarget = undefined;
|
||
|
|
||
|
if ( !isdefined( level.cobraTarget ) )
|
||
|
return missileTarget;
|
||
|
|
||
|
if ( !isdefined( level.cobraTarget.size ) )
|
||
|
return missileTarget;
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
// find the missile with the lowest .locked time
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
{
|
||
|
if ( !isdefined( level.cobraTarget[ i ].locked ) )
|
||
|
continue;
|
||
|
|
||
|
if ( !isdefined( missileTarget ) )
|
||
|
missileTarget = level.cobraTarget[ i ];
|
||
|
|
||
|
if ( level.cobraTarget[ i ].locked < missileTarget.locked )
|
||
|
missileTarget = level.cobraTarget[ i ];
|
||
|
}
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
if ( isdefined( missileTarget ) )
|
||
|
missileTarget.locked = getTime();
|
||
|
|
||
|
return missileTarget;
|
||
|
}
|
||
|
|
||
|
weaponsSystems_noAmmo_Warning()
|
||
|
{
|
||
|
self notify( "noammo_warning" );
|
||
|
self endon( "noammo_warning" );
|
||
|
|
||
|
if ( isdefined( self.hudelems.noammo_warning ) )
|
||
|
self.hudelems.noammo_warning destroy();
|
||
|
|
||
|
self.hudelems.noammo_warning = newClientHudElem( self.pilot );
|
||
|
self.hudelems.noammo_warning.x = 0;
|
||
|
self.hudelems.noammo_warning.y = 40;
|
||
|
self.hudelems.noammo_warning.alignX = "center";
|
||
|
self.hudelems.noammo_warning.alignY = "middle";
|
||
|
self.hudelems.noammo_warning.horzAlign = "center";
|
||
|
self.hudelems.noammo_warning.vertAlign = "middle";
|
||
|
self.hudelems.noammo_warning.foreground = true;
|
||
|
// No Ammo
|
||
|
self.hudelems.noammo_warning setText( &"COBRAPILOT_NO_AMMO" );
|
||
|
self.hudelems.noammo_warning.fontscale = 1.5;
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
self.pilot playLocalSound( "cobra_no_ammo" );
|
||
|
|
||
|
self.hudelems.noammo_warning.alpha = 1;
|
||
|
wait 0.5;
|
||
|
self.hudelems.noammo_warning fadeOverTime( 1.0 );
|
||
|
self.hudelems.noammo_warning.alpha = 0;
|
||
|
wait 1.0;
|
||
|
self.hudelems.noammo_warning destroy();
|
||
|
}
|
||
|
|
||
|
weaponsSystems_noLock_Warning()
|
||
|
{
|
||
|
self notify( "nolock_warning" );
|
||
|
self endon( "nolock_warning" );
|
||
|
|
||
|
if ( isdefined( self.hudelems.nolock_warning ) )
|
||
|
self.hudelems.nolock_warning destroy();
|
||
|
|
||
|
self.hudelems.nolock_warning = newClientHudElem( self.pilot );
|
||
|
self.hudelems.nolock_warning.x = 0;
|
||
|
self.hudelems.nolock_warning.y = 40;
|
||
|
self.hudelems.nolock_warning.alignX = "center";
|
||
|
self.hudelems.nolock_warning.alignY = "middle";
|
||
|
self.hudelems.nolock_warning.horzAlign = "center";
|
||
|
self.hudelems.nolock_warning.vertAlign = "middle";
|
||
|
self.hudelems.nolock_warning.foreground = true;
|
||
|
// Requires Lock-On
|
||
|
self.hudelems.nolock_warning setText( &"COBRAPILOT_NO_LOCK" );
|
||
|
self.hudelems.nolock_warning.fontscale = 1.5;
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
self.pilot playLocalSound( "cobra_no_ammo" );
|
||
|
|
||
|
self.hudelems.nolock_warning.alpha = 1;
|
||
|
wait 0.5;
|
||
|
self.hudelems.nolock_warning fadeOverTime( 1.0 );
|
||
|
self.hudelems.nolock_warning.alpha = 0;
|
||
|
wait 1.0;
|
||
|
self.hudelems.nolock_warning destroy();
|
||
|
}
|
||
|
|
||
|
weaponsSystems_zoom()
|
||
|
{
|
||
|
assert( isdefined( self ) );
|
||
|
assert( isdefined( self.pilot ) );
|
||
|
assert( self.pilot.classname == "player" );
|
||
|
|
||
|
level endon( "cobra_death" );
|
||
|
self.pilot endon( "death" );
|
||
|
|
||
|
wait 0.05;
|
||
|
|
||
|
self.pilot reset_fov_for_player();
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
while ( !self.pilot buttonPressed( "BUTTON_LSTICK" ) )
|
||
|
wait 0.05;
|
||
|
self.pilot change_fov_for_player( level.weaponZoomFOV );
|
||
|
|
||
|
while ( self.pilot buttonPressed( "BUTTON_LSTICK" ) )
|
||
|
wait 0.05;
|
||
|
self.pilot reset_fov_for_player();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
change_fov_for_player( targetFOV )
|
||
|
{
|
||
|
targetFOV = int( targetFOV );
|
||
|
|
||
|
fov = int( getdvar( "cg_fov" ) );
|
||
|
if ( isdefined( fov ) && fov > 0 )
|
||
|
level.initialFOV = fov;
|
||
|
|
||
|
fovFraction = targetFOV / level.initialFOV;
|
||
|
fovFraction = cap_value( fovFraction, 0.2, 2.0 );
|
||
|
self change_fov_scale_for_player( fovFraction );
|
||
|
}
|
||
|
|
||
|
reset_fov_for_player()
|
||
|
{
|
||
|
self change_fov_scale_for_player( 1.0 );
|
||
|
}
|
||
|
|
||
|
change_fov_scale_for_player( scale )
|
||
|
{
|
||
|
if ( self == level.player )
|
||
|
setsaveddvar( "cg_playerFovScale0", scale );
|
||
|
else if ( self == level.player2 )
|
||
|
setsaveddvar( "cg_playerFovScale1", scale );
|
||
|
else
|
||
|
assertMsg( "Flyable helicopters currently only supports single player or coop with 2 players. Playing with more than 2 players is not yet supported" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_Add( player, targetEntity, targetType, targetOffset )
|
||
|
{
|
||
|
// adds a new entity target to the targets array
|
||
|
|
||
|
assert( isdefined( player ) );
|
||
|
assert( player.classname == "player" );
|
||
|
assert( isdefined( targetEntity ) );
|
||
|
assert( isdefined( targetType ) );
|
||
|
assert( targetType == "air" || targetType == "ground" || targetType == "dummy" );
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
if ( !isdefined( targetOffset ) )
|
||
|
targetOffset = ( 0, 0, 0 );
|
||
|
|
||
|
if ( !isdefined( level.cobraTarget ) )
|
||
|
level.cobraTarget = [];
|
||
|
|
||
|
index = level.cobraTarget.size;
|
||
|
|
||
|
level.cobraTarget[ index ] = spawnstruct();
|
||
|
level.cobraTarget[ index ].targetEntity = targetEntity;
|
||
|
level.cobraTarget[ index ].targetType = targetType;
|
||
|
level.cobraTarget[ index ].targetOffset = targetOffset;
|
||
|
level.cobraTarget[ index ].playerOwner = player;
|
||
|
//level.cobraTarget[ index ].hudelem = newClientHudElem( player );
|
||
|
//level.cobraTarget[ index ].hudelem SetShader( "veh_hud_target", 1, 1 );
|
||
|
//level.cobraTarget[ index ].hudelem SetWayPoint( true, true, true );
|
||
|
//level.cobraTarget[ index ].hudelem SetTargetEnt( targetEntity );
|
||
|
|
||
|
target_set( level.cobraTarget[ index ].targetEntity, level.cobraTarget[ index ].targetOffset );
|
||
|
|
||
|
level.cobraTarget[ index ].targetEntity.target_initilized = true;
|
||
|
thread cobraTarget_Death( level.cobraTarget[ index ] );
|
||
|
|
||
|
level notify( "targets_updated" );
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
cobraTarget_UpdateShaders_All( player );
|
||
|
thread cobraTarget_check_missileLock_All( player );
|
||
|
}
|
||
|
|
||
|
cobraTarget_Death( targetStruct )
|
||
|
{
|
||
|
targetStruct.targetEntity waittill( "death" );
|
||
|
cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct );
|
||
|
|
||
|
// if the sidewinder weapon was targeting this target, clear the target reticle
|
||
|
if ( isdefined( targetStruct.sideWinder_targeted ) )
|
||
|
cobraTarget_Sidewinder_ReticleLockOn_Stop( targetStruct );
|
||
|
|
||
|
level.stats[ "enemies_killed" ]++ ;
|
||
|
|
||
|
cobraTarget_Remove( targetStruct );
|
||
|
}
|
||
|
|
||
|
cobraTarget_Remove( targetStruct )
|
||
|
{
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
//targetStruct.hudelem destroy();
|
||
|
level.cobraTarget = array_remove( level.cobraTarget, targetStruct );
|
||
|
target_remove( targetStruct.targetEntity );
|
||
|
|
||
|
level notify( "targets_updated" );
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_UpdateShaders_All( player )
|
||
|
{
|
||
|
// updates shaders for all targets in the targets array
|
||
|
// if ground missiles are armed ground targets show "target" shader and air targets show "invalid" shader
|
||
|
// if air missiles are armed air targets show "target" shader and ground targets show "invalid" shader
|
||
|
// if dummy missiles are armed all targets show "target" shader
|
||
|
|
||
|
assert( isdefined( player ) );
|
||
|
assert( player.classname == "player" );
|
||
|
|
||
|
// player isn't in a chopper yet
|
||
|
if ( !isdefined( player.currentWeapon ) )
|
||
|
return;
|
||
|
|
||
|
if ( !isdefined( level.cobraTarget ) )
|
||
|
return;
|
||
|
if ( !isdefined( level.cobraTarget.size ) )
|
||
|
return;
|
||
|
if ( !isdefined( level.cobraWeapon ) )
|
||
|
return;
|
||
|
if ( level.cobraWeapon.size == 0 )
|
||
|
return;
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
{
|
||
|
// if the target type matches the weapon type (ie weapon type is "ground" and target type is also "ground")
|
||
|
// then make this target have a valid target shader
|
||
|
// if the weapon type is "dummy" then all targets are valid
|
||
|
// otherwise give it the invalid target shader
|
||
|
|
||
|
if ( level.cobraTarget[ i ].playerOwner != player )
|
||
|
continue;
|
||
|
|
||
|
if ( level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ] == "dummy" )
|
||
|
cobraTarget_UpdateShader( player, level.cobraTarget[ i ], "target" );
|
||
|
else if ( level.cobraTarget[ i ].targetType == level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ] )
|
||
|
cobraTarget_UpdateShader( player, level.cobraTarget[ i ], "target" );
|
||
|
else
|
||
|
cobraTarget_UpdateShader( player, level.cobraTarget[ i ], "invalid" );
|
||
|
}
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_UpdateShader( player, targetStruct, shader )
|
||
|
{
|
||
|
assert( isdefined( player ) );
|
||
|
assert( player.classname == "player" );
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( shader ) );
|
||
|
//assert( isdefined( targetStruct.hudelem ) );
|
||
|
|
||
|
assertEx( isdefined( targetStruct.targetEntity.target_initilized ), "Script is trying to do setShader on a target that hasn't run target_set. This is supposed to be impossible" );
|
||
|
|
||
|
switch( shader )
|
||
|
{
|
||
|
case "target":
|
||
|
//targetStruct.hudelem setShader( level.cobraWeapon[ player.currentWeapon ].v[ "shader_target" ] );
|
||
|
target_setShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_target" ] );
|
||
|
target_setOffscreenShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_target_offscreen" ] );
|
||
|
break;
|
||
|
case "lock":
|
||
|
//targetStruct.hudelem setShader( level.cobraWeapon[ player.currentWeapon ].v[ "shader_lock" ] );
|
||
|
target_setShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_lock" ] );
|
||
|
target_setOffscreenShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_target_offscreen" ] );
|
||
|
break;
|
||
|
case "locking":
|
||
|
//targetStruct.hudelem setShader( level.cobraWeapon[ player.currentWeapon ].v[ "shader_locking" ] );
|
||
|
target_setShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_locking" ] );
|
||
|
target_setOffscreenShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_target_offscreen" ] );
|
||
|
break;
|
||
|
case "invalid":
|
||
|
//targetStruct.hudelem setShader( level.cobraWeapon[ player.currentWeapon ].v[ "shader_invalid" ] );
|
||
|
target_setShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_invalid" ] );
|
||
|
target_setOffscreenShader( targetStruct.targetEntity, level.cobraWeapon[ player.currentWeapon ].v[ "shader_invalid_offscreen" ] );
|
||
|
break;
|
||
|
default:
|
||
|
assertMsg( "shader must be target, lock, locking, or invalid" );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cobraTarget_unlockAllTargets()
|
||
|
{
|
||
|
if ( !isdefined( level.cobraTarget ) )
|
||
|
return;
|
||
|
if ( !isdefined( level.cobraTarget.size ) )
|
||
|
return;
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
{
|
||
|
cobraTarget_Sidewinder_ReticleLockOn_Stop( level.cobraTarget[ i ] );
|
||
|
level.cobraTarget[ i ].sideWinder_targeted = undefined;
|
||
|
level.cobraTarget[ i ].locking = undefined;
|
||
|
level.cobraTarget[ i ].locked = undefined;
|
||
|
}
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_check_missileLock_All( player )
|
||
|
{
|
||
|
wait 0.05;
|
||
|
assert( isdefined( player ) && ( player.classname == "player" ) );
|
||
|
|
||
|
if ( !isdefined( level.cobraWeapon ) )
|
||
|
return;
|
||
|
if ( level.cobraWeapon.size == 0 )
|
||
|
return;
|
||
|
if ( !isdefined( player.currentWeapon ) )
|
||
|
return;
|
||
|
|
||
|
level notify( "checking for missile locks" );
|
||
|
level endon( "checking for missile locks" );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
assert( isdefined( level.cobraTarget ) );
|
||
|
|
||
|
if ( !isdefined( level.cobraTarget.size ) )
|
||
|
{
|
||
|
level waittill( "targets_updated" );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if ( !isdefined( level.cobraTarget.size ) )
|
||
|
continue;
|
||
|
|
||
|
if ( level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ] == "ground" )
|
||
|
{
|
||
|
boxHalfWidth = ( level.cobraWeapon[ player.currentWeapon ].v[ "hudShader_size_x" ] / 2 ) - 25;
|
||
|
boxHalfHeight = ( level.cobraWeapon[ player.currentWeapon ].v[ "hudShader_size_y" ] / 2 ) - 25;
|
||
|
|
||
|
// logic for hellfire missile lockons
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
{
|
||
|
z_type = level.cobraTarget[ i ].targetType;
|
||
|
z_weap = player.currentWeapon;
|
||
|
z_weaponmode = level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ];
|
||
|
|
||
|
if ( level.cobraTarget[ i ].targetType != level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ] )
|
||
|
{
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
continue;
|
||
|
}
|
||
|
cobraTarget_check_missileLock_Ground( level.cobraTarget[ i ], boxHalfWidth, boxHalfHeight );
|
||
|
}
|
||
|
}
|
||
|
else if ( level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ] == "air" )
|
||
|
{
|
||
|
circleRadius = ( level.cobraWeapon[ player.currentWeapon ].v[ "hudShader_size_x" ] / 2 ) - 10;
|
||
|
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
{
|
||
|
if ( level.cobraTarget[ i ].targetType != level.cobraWeapon[ player.currentWeapon ].v[ "targetType" ] )
|
||
|
{
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
continue;
|
||
|
}
|
||
|
cobraTarget_check_missileLock_Air( level.cobraTarget[ i ], circleRadius );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
level waittill( "weapon_armed" );
|
||
|
}
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
wait 0.05;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cobraTarget_isLockingOn( targetStruct, boxHalfWidth, boxHalfHeight, circleRadius )
|
||
|
{
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
|
||
|
if ( isdefined( boxHalfWidth ) )
|
||
|
assert( isdefined( boxHalfHeight ) );
|
||
|
|
||
|
if ( ( !isdefined( boxHalfWidth ) ) && ( !isdefined( boxHalfHeight ) ) )
|
||
|
assert( isdefined( circleRadius ) );
|
||
|
|
||
|
inReticle = false;
|
||
|
sightTrace = false;
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
inReticle = target_isinrect( targetStruct.targetEntity, level.player, int( getdvar( "cg_fov" ) ), boxHalfWidth, boxHalfHeight );
|
||
|
if ( inReticle )
|
||
|
sightTrace = sighttracepassed( level.player getEye() + ( 0, 0, 100 ), targetStruct.targetEntity.origin + targetStruct.targetOffset + ( 0, 0, 100 ), false, undefined );
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
if ( inReticle && sightTrace )
|
||
|
return true;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
cobraTarget_check_missileLock_Ground( targetStruct, boxHalfWidth, boxHalfHeight )
|
||
|
{
|
||
|
level endon( "weapon_armed" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( boxHalfWidth ) );
|
||
|
assert( isdefined( boxHalfHeight ) );
|
||
|
|
||
|
if ( cobraTarget_isLockingOn( targetStruct, boxHalfWidth, boxHalfHeight ) )
|
||
|
thread cobraTarget_holdWait_missileLock_Ground( targetStruct, boxHalfWidth, boxHalfHeight );
|
||
|
else
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "target" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_holdWait_missileLock_Ground( targetStruct, boxHalfWidth, boxHalfHeight )
|
||
|
{
|
||
|
level endon( "weapon_armed" );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( boxHalfWidth ) );
|
||
|
assert( isdefined( boxHalfHeight ) );
|
||
|
|
||
|
targetStruct.targetEntity endon( "death" );
|
||
|
|
||
|
if ( isdefined( targetStruct.locking ) )
|
||
|
return;
|
||
|
if ( isdefined( targetStruct.locked ) )
|
||
|
return;
|
||
|
targetStruct.locking = getTime();
|
||
|
|
||
|
lockStartTime = getTime();
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Start( targetStruct, "weap_hellfire_seeking" );
|
||
|
while ( cobraTarget_isLockingOn( targetStruct, boxHalfWidth, boxHalfHeight ) )
|
||
|
{
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "locking" );
|
||
|
wait 0.4;
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "target" );
|
||
|
wait 0.4;
|
||
|
|
||
|
currentTime = getTime();
|
||
|
elapsedTime = currentTime - lockStartTime;
|
||
|
|
||
|
if ( elapsedTime > level.cobraWeapon[ level.player.currentWeapon ].v[ "lockonTime" ] )
|
||
|
{
|
||
|
thread cobraTarget_holdLock_missileLock_Ground( targetStruct, boxHalfWidth, boxHalfHeight );
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct );
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
targetStruct.locking = undefined;
|
||
|
}
|
||
|
|
||
|
cobraTarget_holdLock_missileLock_Ground( targetStruct, boxHalfWidth, boxHalfHeight )
|
||
|
{
|
||
|
level endon( "weapon_armed" );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( boxHalfWidth ) );
|
||
|
assert( isdefined( boxHalfHeight ) );
|
||
|
|
||
|
targetStruct.targetEntity endon( "death" );
|
||
|
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "lock" );
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
targetStruct.locked = targetStruct.locking;
|
||
|
targetStruct.locking = undefined;
|
||
|
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct );
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
level.player playLocalSound( "weap_hellfire_lock" );
|
||
|
|
||
|
while ( cobraTarget_isLockingOn( targetStruct, boxHalfWidth, boxHalfHeight ) )
|
||
|
wait 0.05;
|
||
|
targetStruct.locked = undefined;
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_holdWait_missileLock_Sound_Start( targetStruct, alias )
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) != "1" )
|
||
|
return;
|
||
|
|
||
|
level endon( "cobra_death" );
|
||
|
level endon( "stop_cobra_hellfire_locking_sound" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( alias ) );
|
||
|
|
||
|
if ( isdefined( targetStruct.locking_sound_playing ) )
|
||
|
return;
|
||
|
targetStruct.locking_sound_playing = alias;
|
||
|
|
||
|
targetStruct thread playLoopSoundForSeeking( alias );
|
||
|
}
|
||
|
|
||
|
cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct )
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) != "1" )
|
||
|
return;
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
|
||
|
if ( !isdefined( targetStruct.locking_sound_playing ) )
|
||
|
return;
|
||
|
|
||
|
targetStruct notify( "stop sound" + targetStruct.locking_sound_playing );
|
||
|
targetStruct.locking_sound_playing = undefined;
|
||
|
}
|
||
|
|
||
|
cobraTarget_check_missileLock_Air( targetStruct, circleRadius )
|
||
|
{
|
||
|
level endon( "weapon_armed" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( circleRadius ) );
|
||
|
|
||
|
if ( cobraTarget_Sidewinder_Has_Target() )
|
||
|
return;
|
||
|
|
||
|
if ( target_isincircle( targetStruct.targetEntity, level.player, int( getdvar( "cg_fov" ) ), circleRadius ) )
|
||
|
{
|
||
|
targetStruct.sideWinder_targeted = true;
|
||
|
thread cobraTarget_holdWait_missileLock_Air( targetStruct, circleRadius );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "target" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_holdWait_missileLock_Air( targetStruct, circleRadius )
|
||
|
{
|
||
|
level endon( "weapon_armed" );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( targetStruct.sideWinder_targeted ) );
|
||
|
assert( isdefined( circleRadius ) );
|
||
|
|
||
|
targetStruct.targetEntity endon( "death" );
|
||
|
|
||
|
if ( isdefined( targetStruct.locking ) )
|
||
|
return;
|
||
|
if ( isdefined( targetStruct.locked ) )
|
||
|
return;
|
||
|
targetStruct.locking = getTime();
|
||
|
|
||
|
lockStartTime = getTime();
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
thread cobraTarget_Sidewinder_ReticleLockOn_Start( targetStruct );
|
||
|
|
||
|
while ( target_isincircle( targetStruct.targetEntity, level.player, int( getdvar( "cg_fov" ) ), circleRadius ) )
|
||
|
{
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "locking" );
|
||
|
wait 0.4;
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "target" );
|
||
|
wait 0.4;
|
||
|
|
||
|
currentTime = getTime();
|
||
|
elapsedTime = currentTime - lockStartTime;
|
||
|
|
||
|
if ( elapsedTime > level.cobraWeapon[ level.player.currentWeapon ].v[ "lockonTime" ] )
|
||
|
{
|
||
|
thread cobraTarget_holdLock_missileLock_Air( targetStruct, circleRadius );
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
cobraTarget_Sidewinder_ReticleLockOn_Stop( targetStruct );
|
||
|
targetStruct.locking = undefined;
|
||
|
}
|
||
|
|
||
|
cobraTarget_holdLock_missileLock_Air( targetStruct, circleRadius )
|
||
|
{
|
||
|
level endon( "weapon_armed" );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
assert( isdefined( circleRadius ) );
|
||
|
|
||
|
targetStruct.targetEntity endon( "death" );
|
||
|
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "lock" );
|
||
|
|
||
|
targetStruct.targetEntity notify( "missile_lock", level.playervehicle );
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
targetStruct.locked = targetStruct.locking;
|
||
|
targetStruct.locking = undefined;
|
||
|
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct );
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Start( targetStruct, "weap_aim9_lock" );
|
||
|
|
||
|
while ( target_isincircle( targetStruct.targetEntity, level.player, int( getdvar( "cg_fov" ) ), circleRadius ) )
|
||
|
wait 0.05;
|
||
|
|
||
|
cobraTarget_Sidewinder_ReticleLockOn_Stop( targetStruct );
|
||
|
|
||
|
targetStruct.locked = undefined;
|
||
|
cobraTarget_UpdateShader( level.player, targetStruct, "target" );
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
}
|
||
|
|
||
|
cobraTarget_Sidewinder_Has_Target()
|
||
|
{
|
||
|
for ( i = 0 ; i < level.cobraTarget.size ; i++ )
|
||
|
{
|
||
|
if ( isdefined( level.cobraTarget[ i ].sideWinder_targeted ) )
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
cobraTarget_Sidewinder_ReticleLockOn_Start( targetStruct )
|
||
|
{
|
||
|
targetStruct endon( "Sidewinder_ReticleLockOn_Stop" );
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
assert( isdefined( targetStruct.targetEntity ) );
|
||
|
|
||
|
targetStruct.targetEntity endon( "death" );
|
||
|
|
||
|
weaponSystems_EquipLoopSound_Stop();
|
||
|
|
||
|
segmentLength = ( level.cobraWeapon[ level.player.currentWeapon ].v[ "lockonTime" ] / 3 );
|
||
|
lockOnTime = ( level.cobraWeapon[ level.player.currentWeapon ].v[ "lockonTime" ] / 1000 );
|
||
|
|
||
|
target_startreticlelockon( targetStruct.targetEntity, lockOnTime );
|
||
|
|
||
|
lockonAliasList = [];
|
||
|
lockonAliasList[ 0 ] = "weap_aim9_growl1";
|
||
|
lockonAliasList[ 1 ] = "weap_aim9_growl2";
|
||
|
lockonAliasList[ 2 ] = "weap_aim9_growl3";
|
||
|
|
||
|
for ( i = 0 ; i < lockonAliasList.size ; i++ )
|
||
|
{
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct );
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Start( targetStruct, lockonAliasList[ i ] );
|
||
|
|
||
|
lastPhaseTime = getTime();
|
||
|
|
||
|
while ( ( getTime() - lastPhaseTime ) < segmentLength )
|
||
|
wait 0.05;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cobraTarget_Sidewinder_ReticleLockOn_Stop( targetStruct )
|
||
|
{
|
||
|
target_clearreticlelockon();
|
||
|
|
||
|
assert( isdefined( targetStruct ) );
|
||
|
|
||
|
targetStruct.targetEntity notify( "missile_lock_ended", level.playervehicle );
|
||
|
|
||
|
targetStruct notify( "Sidewinder_ReticleLockOn_Stop" );
|
||
|
|
||
|
targetStruct.sideWinder_targeted = undefined;
|
||
|
thread cobraTarget_holdWait_missileLock_Sound_Stop( targetStruct );
|
||
|
|
||
|
thread weaponSystems_EquipLoopSound_Start();
|
||
|
}
|
||
|
|
||
|
health_indicator_create( pilot )
|
||
|
{
|
||
|
assert( isdefined( self ) );
|
||
|
assert( isdefined( self.pilot ) );
|
||
|
|
||
|
// red screen overlay
|
||
|
self.hudelems.cobra_health_overlay = newClientHudElem( self.pilot );
|
||
|
self.hudelems.cobra_health_overlay.x = 0;
|
||
|
self.hudelems.cobra_health_overlay.y = 0;
|
||
|
self.hudelems.cobra_health_overlay setshader( "splatter_alt_sp", 640, 480 );
|
||
|
self.hudelems.cobra_health_overlay.alignX = "left";
|
||
|
self.hudelems.cobra_health_overlay.alignY = "top";
|
||
|
self.hudelems.cobra_health_overlay.horzAlign = "fullscreen";
|
||
|
self.hudelems.cobra_health_overlay.vertAlign = "fullscreen";
|
||
|
self.hudelems.cobra_health_overlay.alpha = 0;
|
||
|
|
||
|
// color changing health icon
|
||
|
self.hudelems.cobra_health_icon = newClientHudElem( self.pilot );
|
||
|
self.hudelems.cobra_health_icon.x = -10;
|
||
|
self.hudelems.cobra_health_icon.y = -65;
|
||
|
self.hudelems.cobra_health_icon.alignX = "right";
|
||
|
self.hudelems.cobra_health_icon.alignY = "bottom";
|
||
|
self.hudelems.cobra_health_icon.horzAlign = "right";
|
||
|
self.hudelems.cobra_health_icon.vertAlign = "bottom";
|
||
|
self.hudelems.cobra_health_icon.foreground = true;
|
||
|
self.hudelems.cobra_health_icon setshader( "cobra_health", 128, 48 );
|
||
|
self.hudelems.cobra_health_icon.alpha = 1;
|
||
|
self.hudelems.cobra_health_icon.color = ( 0, 1, 0 );
|
||
|
}
|
||
|
|
||
|
health_indicator_damageWait()
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self waittill( "damage" );
|
||
|
|
||
|
// flash the red overlay on the screen
|
||
|
thread health_indicator_redScreenFlash( self.hudelems.cobra_health_overlay );
|
||
|
|
||
|
newColor = self health_indicator_getColor();
|
||
|
self.hudelems.cobra_health_icon.color = ( newColor[ 0 ], newColor[ 1 ], newColor[ 2 ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
health_indicator_getColor()
|
||
|
{
|
||
|
color = ( 1, 0, 0 );
|
||
|
|
||
|
//define what colors to use
|
||
|
color_severe = [];
|
||
|
color_severe[ 0 ] = 1.0;
|
||
|
color_severe[ 1 ] = 0.0;
|
||
|
color_severe[ 2 ] = 0.0;
|
||
|
color_moderate = [];
|
||
|
color_moderate[ 0 ] = 1.0;
|
||
|
color_moderate[ 1 ] = 0.5;
|
||
|
color_moderate[ 2 ] = 0.0;
|
||
|
color_repaired = [];
|
||
|
color_repaired[ 0 ] = 0.0;
|
||
|
color_repaired[ 1 ] = 1.0;
|
||
|
color_repaired[ 2 ] = 0.0;
|
||
|
|
||
|
//default color
|
||
|
SetValue = [];
|
||
|
SetValue[ 0 ] = color_severe[ 0 ];
|
||
|
SetValue[ 1 ] = color_severe[ 1 ];
|
||
|
SetValue[ 2 ] = color_severe[ 2 ];
|
||
|
|
||
|
//define where the non blend points are
|
||
|
severe = 0;
|
||
|
moderate = ( level.flyablecobra_starting_health / 2 );
|
||
|
repaired = level.flyablecobra_starting_health;
|
||
|
|
||
|
iPercentage = undefined;
|
||
|
difference = undefined;
|
||
|
increment = undefined;
|
||
|
|
||
|
value = self.health;
|
||
|
|
||
|
if ( ( value > severe ) && ( value <= moderate ) )
|
||
|
{
|
||
|
iPercentage = int( value * ( 100 / moderate ) );
|
||
|
for ( colorIndex = 0 ; colorIndex < SetValue.size ; colorIndex++ )
|
||
|
{
|
||
|
difference = ( color_moderate[ colorIndex ] - color_severe[ colorIndex ] );
|
||
|
increment = ( difference / 100 );
|
||
|
SetValue[ colorIndex ] = color_severe[ colorIndex ] + ( increment * iPercentage );
|
||
|
}
|
||
|
}
|
||
|
else if ( ( value > moderate ) && ( value <= repaired ) )
|
||
|
{
|
||
|
iPercentage = int( ( value - moderate ) * ( 100 / ( repaired - moderate ) ) );
|
||
|
for ( colorIndex = 0 ; colorIndex < SetValue.size ; colorIndex++ )
|
||
|
{
|
||
|
difference = ( color_repaired[ colorIndex ] - color_moderate[ colorIndex ] );
|
||
|
increment = ( difference / 100 );
|
||
|
SetValue[ colorIndex ] = color_moderate[ colorIndex ] + ( increment * iPercentage );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return SetValue;
|
||
|
}
|
||
|
|
||
|
health_warningSound_Start()
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
if ( isdefined( level.lowhealth_warning_playing ) )
|
||
|
return;
|
||
|
level.lowhealth_warning_playing = true;
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
self.pilot thread play_loop_sound_on_entity( "alarm_cobra_death_imminent" );
|
||
|
}
|
||
|
|
||
|
health_warningSound_Stop()
|
||
|
{
|
||
|
self.pilot notify( "stop sound" + "alarm_cobra_death_imminent" );
|
||
|
level.lowhealth_warning_playing = undefined;
|
||
|
}
|
||
|
|
||
|
health_leak()
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
self endon( "stop_health_leak" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( self.health - level.flyablecobra_healthLeakIncrement <= 0 )
|
||
|
{
|
||
|
self thread cobra_death();
|
||
|
return;
|
||
|
}
|
||
|
self.health -= level.flyablecobra_healthLeakIncrement;
|
||
|
|
||
|
level.stats[ "damage_taken" ] += level.flyablecobra_healthLeakIncrement;
|
||
|
|
||
|
self notify( "damage" );
|
||
|
wait level.flyablecobra_healthLeakRate;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
health_indicator_redScreenFlash( overlay )
|
||
|
{
|
||
|
level notify( "redScreenFlash" );
|
||
|
level endon( "redScreenFlash" );
|
||
|
|
||
|
overlay fadeOverTime( 0.1 );
|
||
|
overlay.alpha = 1;
|
||
|
wait 0.2;
|
||
|
overlay fadeOverTime( 0.5 );
|
||
|
overlay.alpha = 0;
|
||
|
}
|
||
|
|
||
|
health_removeHudElems()
|
||
|
{
|
||
|
level waittill( "cobra_death" );
|
||
|
|
||
|
// remove hud elements when player dies
|
||
|
self.hudelems.controller_layout destroy();
|
||
|
self.hudelems.weapon_hud destroy();
|
||
|
}
|
||
|
|
||
|
health_Regen_Station()
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
level waittill( "health_regen" );
|
||
|
|
||
|
if ( self.health >= level.flyablecobra_starting_health )
|
||
|
continue;
|
||
|
|
||
|
// add health
|
||
|
self.health += level.flyablecobra_healthRegenIncrement;
|
||
|
if ( self.health > level.flyablecobra_starting_health )
|
||
|
self.health = level.flyablecobra_starting_health;
|
||
|
|
||
|
if ( self.health > level.flyablecobra_healthWarning_value )
|
||
|
{
|
||
|
self thread health_warningSound_Stop();
|
||
|
self notify( "stop_health_leak" );
|
||
|
}
|
||
|
|
||
|
newColor = health_indicator_getColor();
|
||
|
self.hudelems.cobra_health_icon.color = ( newColor[ 0 ], newColor[ 1 ], newColor[ 2 ] );
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
self.pilot playLocalSound( "cobra_health_pickup" );
|
||
|
|
||
|
wait level.flyablecobra_healthRegenRate;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
health_think()
|
||
|
{
|
||
|
self thread health_removeHudElems();
|
||
|
fatalImpactRate = 1500;
|
||
|
self thread health_Regen_Station();
|
||
|
for ( ;; )
|
||
|
{
|
||
|
self waittill( "veh_collision", velocity, collisionNormal );
|
||
|
|
||
|
prof_begin( "cobrapilot_health_system" );
|
||
|
|
||
|
/*
|
||
|
Impending Collision Notify
|
||
|
self waittill( "veh_predictedcollision", velocity, collisionNormal );
|
||
|
(use dvar g_helicopterLookaheadTime to specify how far ahead to check for impending collisions)
|
||
|
*/
|
||
|
|
||
|
impactVelocity = vectordot( velocity, collisionNormal );
|
||
|
slideVelocity = length( velocity - ( vector_multiply( collisionNormal, impactVelocity ) ) );
|
||
|
impactVelocity = abs( impactVelocity );
|
||
|
|
||
|
// reduce damage from slide velocity
|
||
|
slideVelocity = ( slideVelocity / 2 );
|
||
|
|
||
|
impactAmount = impactVelocity;
|
||
|
if ( slideVelocity > impactVelocity )
|
||
|
impactAmount = slideVelocity;
|
||
|
|
||
|
// cap the impact rate to not exceed fatalImpactRate since it wont mater at that point anyways
|
||
|
if ( impactAmount > fatalImpactRate )
|
||
|
impactAmount = fatalImpactRate;
|
||
|
|
||
|
damage = int( impactAmount * ( level.flyablecobra_starting_health / fatalImpactRate ) );
|
||
|
|
||
|
if ( damage <= 200 )
|
||
|
{
|
||
|
prof_end( "cobrapilot_health_system" );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
directionOfImpact = vector_multiply( collisionNormal, -1 );
|
||
|
directionOfImpact = self.origin + directionOfImpact;
|
||
|
|
||
|
prof_end( "cobrapilot_health_system" );
|
||
|
|
||
|
level.stats[ "damage_taken" ] += damage;
|
||
|
|
||
|
bDeath = false;
|
||
|
if ( ( self.health - damage ) <= 0 )
|
||
|
bDeath = true;
|
||
|
else
|
||
|
{
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
self.pilot playLocalSound( "helicopter_collide" );
|
||
|
|
||
|
self.health -= damage;
|
||
|
|
||
|
if ( self.health <= level.flyablecobra_healthWarning_value )
|
||
|
{
|
||
|
self thread health_warningSound_Start();
|
||
|
self thread health_leak();
|
||
|
}
|
||
|
|
||
|
self joltbody( directionOfImpact, ( damage / 1900 ) );
|
||
|
}
|
||
|
|
||
|
self notify( "damage" );
|
||
|
|
||
|
if ( bDeath )
|
||
|
{
|
||
|
self cobra_death();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
wait 0.25;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cobra_death()
|
||
|
{
|
||
|
/*
|
||
|
self.crashing = true;
|
||
|
self thread maps\_vehicle::kill_fx( self.model );
|
||
|
self thread maps\_vehicle::helicopter_crash_move();
|
||
|
|
||
|
self waittill( "crash_done" );
|
||
|
self notify( "stop_looping_death_fx" );
|
||
|
self notify( "death_finished" );
|
||
|
|
||
|
self useby( self.pilot );
|
||
|
self.pilot enablehealthshield( false );
|
||
|
self.pilot kill ( self.pilot.origin );
|
||
|
self.pilot enablehealthshield( true );
|
||
|
level notify ( "cobra_death" );
|
||
|
self freevehicle();
|
||
|
self delete();
|
||
|
*/
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
self.pilot playLocalSound( "helicopter_crash" );
|
||
|
|
||
|
self.health = 1;
|
||
|
|
||
|
self useby( self.pilot );
|
||
|
self hide();
|
||
|
self.pilot enablehealthshield( false );
|
||
|
|
||
|
level notify( "cobra_death" );
|
||
|
|
||
|
fxOrigin = self.pilot.origin;
|
||
|
|
||
|
playfx( level.player_death_fx, fxOrigin );
|
||
|
self.pilot kill( self.pilot.origin );
|
||
|
self.pilot enablehealthshield( true );
|
||
|
}
|
||
|
|
||
|
incommingMissile_Think()
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
thread missileIndicator_MissileFlashNotifies();
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
level.playervehicle waittill( "incomming_missile", eMissile );
|
||
|
assert( isdefined( eMissile ) );
|
||
|
thread missileIndicator( eMissile );
|
||
|
thread incommingMissile_Missile_Death( eMissile );
|
||
|
thread incommingMissile_Sound_Start();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
incommingMissile_Missile_Death( eMissile )
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
eMissile waittill( "death" );
|
||
|
incommingMissile_Sound_Stop();
|
||
|
}
|
||
|
|
||
|
incommingMissile_Sound_Start()
|
||
|
{
|
||
|
if ( !isdefined( level.missile_launched_warning_playing ) )
|
||
|
level.missile_launched_warning_playing = 0;
|
||
|
|
||
|
level.missile_launched_warning_playing++ ;
|
||
|
|
||
|
if ( level.missile_launched_warning_playing > 1 )
|
||
|
return;
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
level.player thread play_loop_sound_on_entity( "alarm_cobra_enemy_launch" );
|
||
|
}
|
||
|
|
||
|
incommingMissile_Sound_Stop()
|
||
|
{
|
||
|
level.missile_launched_warning_playing -- ;
|
||
|
|
||
|
if ( level.missile_launched_warning_playing > 0 )
|
||
|
return;
|
||
|
|
||
|
level.player notify( "stop sound" + "alarm_cobra_enemy_launch" );
|
||
|
}
|
||
|
|
||
|
ammo_Reload_Station()
|
||
|
{
|
||
|
if ( !isdefined( level.cobraWeapon ) )
|
||
|
return;
|
||
|
if ( level.cobraWeapon.size == 0 )
|
||
|
return;
|
||
|
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
array_thread( getentarray( "ammo_reload", "targetname" ), ::ammo_Reload_Station_Notify, "ammo_reload" );
|
||
|
|
||
|
if ( getdvar( "cobrapilot_unlimited_ammo" ) == "1" )
|
||
|
return;
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
regenPoint = undefined;
|
||
|
level waittill( "ammo_reload", regenPoint, trigger );
|
||
|
|
||
|
if ( getdvar( "cobrapilot_farp_mode" ) == "0" )
|
||
|
{
|
||
|
for ( i = 0 ; i < level.cobraWeapon.size ; i++ )
|
||
|
thread ammo_Reload_Station_Add_Ammo( level.cobraWeapon[ i ] );
|
||
|
wait 0.05;
|
||
|
}
|
||
|
else if ( getdvar( "cobrapilot_farp_mode" ) == "1" )
|
||
|
{
|
||
|
thread ammo_Reload_Station_AutoLand_HintPrint( regenPoint, trigger );
|
||
|
ammo_Reload_Station_Cinematic_Reload( regenPoint, trigger );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ammo_Reload_Station_Cinematic_Reload( regenPoint, trigger )
|
||
|
{
|
||
|
assert( isdefined( regenPoint ) );
|
||
|
hoverPoint = regenPoint + ( 0, 0, 300 );
|
||
|
level.player freezeControls( true );
|
||
|
level.playervehicle Vehicle_SetSpeed( 30, 5 );
|
||
|
level.playervehicle setVehGoalPos( hoverPoint, 1 );
|
||
|
level.playervehicle waittill( "goal" );
|
||
|
|
||
|
level.player unlink();
|
||
|
level.playervehicle useby( level.player );
|
||
|
level.player takeAllWeapons();
|
||
|
viewingEnt = undefined;
|
||
|
viewingEnt = trigger ammo_Reload_Station_Get_Viewing_Ent();
|
||
|
assert( isdefined( viewingEnt ) );
|
||
|
assert( viewingEnt.classname == "script_model" );
|
||
|
assert( viewingEnt.model == "tag_origin" );
|
||
|
level.player playerlinktodelta( viewingEnt, "tag_origin", 1.0 );
|
||
|
wait 0.05;
|
||
|
level.player setPlayerAngles( vectorToAngles( ( level.playervehicle.origin - ( 0, 0, 56 ) ) - viewingEnt.origin ) );
|
||
|
|
||
|
wait 5;
|
||
|
|
||
|
level.player linkto( level.playervehicle );
|
||
|
|
||
|
//level.playervehicle makeUsable();
|
||
|
level.playervehicle useby( level.player );
|
||
|
//level.playervehicle makeUnusable();
|
||
|
|
||
|
level.playervehicle returnplayercontrol();
|
||
|
level.player freezeControls( false );
|
||
|
}
|
||
|
|
||
|
ammo_Reload_Station_Get_Viewing_Ent()
|
||
|
{
|
||
|
viewingEnt = undefined;
|
||
|
ents = getentarray( "ammo_viewpoint", "targetname" );
|
||
|
viewingEnt = getClosest( self.origin, ents );
|
||
|
assert( isdefined( viewingEnt ) );
|
||
|
return viewingEnt;
|
||
|
}
|
||
|
|
||
|
ammo_Reload_Station_AutoLand_HintPrint( hoverPoint, trigger )
|
||
|
{
|
||
|
if ( isdefined( level.playervehicle.farp_autoland_print_on ) )
|
||
|
return;
|
||
|
level.playervehicle.farp_autoland_print_on = true;
|
||
|
|
||
|
// create print
|
||
|
//iprintlnbold( "in" );
|
||
|
|
||
|
while ( level.playervehicle isTouching( trigger ) )
|
||
|
wait 0.05;
|
||
|
|
||
|
// remove print
|
||
|
//iprintlnbold( "out" );
|
||
|
|
||
|
level.playervehicle.farp_autoland_print_on = undefined;
|
||
|
}
|
||
|
|
||
|
ammo_Reload_Station_Notify( notifyString )
|
||
|
{
|
||
|
assert( isdefined( notifyString ) );
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
farpicon = newHudElem();
|
||
|
farpicon setShader( "compass_waypoint_farp", 6, 6 );
|
||
|
farpicon.x = self.origin[ 0 ];
|
||
|
farpicon.y = self.origin[ 1 ];
|
||
|
farpicon.z = self.origin[ 2 ];
|
||
|
farpicon.alpha = .75;
|
||
|
farpicon SetWayPoint( true, false );
|
||
|
|
||
|
trig = undefined;
|
||
|
if ( getdvar( "cobrapilot_farp_mode" ) == "1" )
|
||
|
{
|
||
|
trig = spawn( "trigger_radius", self.origin, 16, 1500, 1000 );
|
||
|
}
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
vehicle = undefined;
|
||
|
if ( getdvar( "cobrapilot_farp_mode" ) == "0" )
|
||
|
self waittill( "trigger", vehicle );
|
||
|
else if ( getdvar( "cobrapilot_farp_mode" ) == "1" )
|
||
|
{
|
||
|
assert( isdefined( trig ) );
|
||
|
trig waittill( "trigger", vehicle );
|
||
|
}
|
||
|
if ( !isdefined( vehicle ) )
|
||
|
continue;
|
||
|
|
||
|
if ( vehicle != level.playervehicle )
|
||
|
continue;
|
||
|
|
||
|
regenPoint = self.origin;
|
||
|
if ( isdefined( self.target ) )
|
||
|
{
|
||
|
ent = getent( self.target, "targetname" );
|
||
|
if ( isdefined( ent ) )
|
||
|
regenPoint = ent.origin;
|
||
|
}
|
||
|
|
||
|
if ( isdefined( trig ) )
|
||
|
level notify( notifyString, regenPoint, trig );
|
||
|
else
|
||
|
level notify( notifyString, regenPoint, self );
|
||
|
level notify( "health_regen" );
|
||
|
|
||
|
if ( getdvar( "cobrapilot_farp_mode" ) == "1" )
|
||
|
{
|
||
|
while ( vehicle isTouching( trig ) )
|
||
|
wait 0.05;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ammo_Reload_Station_Add_Ammo( weapon )
|
||
|
{
|
||
|
level endon( "cobra_death" );
|
||
|
|
||
|
if ( isdefined( weapon.reloading ) )
|
||
|
return;
|
||
|
|
||
|
weapon.reloading = true;
|
||
|
|
||
|
wait randomFloatRange( weapon.v[ "ammoPickupDelay_Min" ], weapon.v[ "ammoPickupDelay_Max" ] );
|
||
|
|
||
|
if ( weapon.v[ "currentAmmo" ] >= weapon.v[ "maxAmmo" ] )
|
||
|
{
|
||
|
weapon.reloading = undefined;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// add ammo and update the ammo counter on the hud
|
||
|
weapon.v[ "currentAmmo" ] += weapon.v[ "ammoPickupIncrement" ];
|
||
|
if ( weapon.v[ "currentAmmo" ] > weapon.v[ "maxAmmo" ] )
|
||
|
weapon.v[ "currentAmmo" ] = weapon.v[ "maxAmmo" ];
|
||
|
|
||
|
// attach missiles back onto the chopper since they were detached when fired
|
||
|
for ( i = 0 ; i < weapon.v[ "ammoPickupIncrement" ] ; i++ )
|
||
|
level.playervehicle weaponsSystems_Attach_Weapon( weapon.v[ "weapon" ] );
|
||
|
|
||
|
if ( getdvar( "cobrapilot_sounds_enabled" ) == "1" )
|
||
|
level.player playLocalSound( "cobra_ammo_reload" );
|
||
|
|
||
|
weapon.v[ "ammoCounter" ] setValue( weapon.v[ "currentAmmo" ] );
|
||
|
|
||
|
weapon.reloading = undefined;
|
||
|
}
|
||
|
/*
|
||
|
borderwall_method1()
|
||
|
{
|
||
|
// When the player hits the border wall triggers the helicopter controls are taken over and the chopper
|
||
|
// is turned around and flown back into the map boundaries
|
||
|
|
||
|
level endon ( "cobra_death" );
|
||
|
|
||
|
target = getent( self.target, "targetname" );
|
||
|
for(;;)
|
||
|
{
|
||
|
self waittill ( "trigger", vehicle );
|
||
|
if ( vehicle != level.playervehicle )
|
||
|
continue;
|
||
|
|
||
|
normalvec = vectornormalize( target.origin - level.playervehicle.origin );
|
||
|
|
||
|
movetospot = level.playervehicle.origin + vector_multiply( normalvec, 2000 );
|
||
|
movetospot = ( movetospot[0], movetospot[1], level.playervehicle.origin[2] );
|
||
|
|
||
|
level.playervehicle Vehicle_SetSpeed( 60, 25 );
|
||
|
level.playervehicle setvehgoalpos( movetospot, 0 );
|
||
|
level.playervehicle waittill ( "goal" );
|
||
|
level.playervehicle returnplayercontrol();
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
/*
|
||
|
edge_Of_World()
|
||
|
{
|
||
|
// When the player leaves the playable area a warning is printed on the screen.
|
||
|
// The player must re-enter the playable area within a time limit or else the
|
||
|
//mission is failed
|
||
|
|
||
|
level endon ( "cobra_death" );
|
||
|
|
||
|
array_thread( getentarray( "border_inner", "targetname" ), ::edge_Of_World_Notify, "border_inner" );
|
||
|
array_thread( getentarray( "border_outer", "targetname" ), ::edge_Of_World_Notify, "border_outer" );
|
||
|
|
||
|
for (;;)
|
||
|
{
|
||
|
level waittill( "border_outer" );
|
||
|
level notify( "player_out_of_bounds" );
|
||
|
thread edge_Of_World_Warning();
|
||
|
|
||
|
level waittill( "border_inner" );
|
||
|
level notify( "player_in_bounds" );
|
||
|
if ( isdefined( level.edge_of_world_warning ) )
|
||
|
level.edge_of_world_warning destroy();
|
||
|
if ( isdefined( level.edge_of_world_timer ) )
|
||
|
level.edge_of_world_timer destroy();
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
/*
|
||
|
edge_Of_World_Notify( notifyString )
|
||
|
{
|
||
|
assert( isdefined( notifyString ) );
|
||
|
|
||
|
level endon ( "cobra_death" );
|
||
|
|
||
|
for(;;)
|
||
|
{
|
||
|
self waittill ( "trigger", vehicle );
|
||
|
if ( vehicle != level.playervehicle )
|
||
|
continue;
|
||
|
|
||
|
level notify( notifyString );
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
/*
|
||
|
edge_Of_World_Warning()
|
||
|
{
|
||
|
level notify( "edge_Of_World_Warning" );
|
||
|
level endon( "edge_Of_World_Warning" );
|
||
|
level endon ( "player_in_bounds" );
|
||
|
|
||
|
// max number of seconds player is allowed out of bounds
|
||
|
// when this time is exceeded the mission is failed
|
||
|
outOfBoundsMaxTime = 15;
|
||
|
|
||
|
if ( !isdefined( level.edge_of_world_warning ) )
|
||
|
{
|
||
|
level.edge_of_world_warning = newHudElem();
|
||
|
level.edge_of_world_warning.x = 0;
|
||
|
level.edge_of_world_warning.y = 0;
|
||
|
level.edge_of_world_warning.alignX = "center";
|
||
|
level.edge_of_world_warning.alignY = "middle";
|
||
|
level.edge_of_world_warning.horzAlign = "center";
|
||
|
level.edge_of_world_warning.vertAlign = "middle";
|
||
|
level.edge_of_world_warning.foreground = true;
|
||
|
level.edge_of_world_warning setText( &"COBRAPILOT_EDGE_OF_WORLD_WARNING" );
|
||
|
level.edge_of_world_warning.fontscale = 2;
|
||
|
level.edge_of_world_warning.color = ( 1, 0, 0 );
|
||
|
}
|
||
|
|
||
|
if ( !isdefined( level.edge_of_world_timer ) )
|
||
|
{
|
||
|
level.edge_of_world_timer = newHudElem();
|
||
|
level.edge_of_world_timer.x = 0;
|
||
|
level.edge_of_world_timer.y = 20;
|
||
|
level.edge_of_world_timer.alignX = "center";
|
||
|
level.edge_of_world_timer.alignY = "middle";
|
||
|
level.edge_of_world_timer.horzAlign = "center";
|
||
|
level.edge_of_world_timer.vertAlign = "middle";
|
||
|
level.edge_of_world_timer.foreground = true;
|
||
|
level.edge_of_world_timer.fontscale = 2;
|
||
|
level.edge_of_world_timer.color = ( 1, 0, 0 );
|
||
|
}
|
||
|
|
||
|
level.edge_of_world_timer setTimer( outOfBoundsMaxTime );
|
||
|
level.edge_of_world_warning.alpha = 1;
|
||
|
|
||
|
outOfBoundsTime = getTime();
|
||
|
|
||
|
wait 0.25;
|
||
|
while( getTime() - outOfBoundsTime < outOfBoundsMaxTime * 1000 )
|
||
|
{
|
||
|
wait 0.6;
|
||
|
level.edge_of_world_warning fadeOverTime( 0.2 );
|
||
|
level.edge_of_world_warning.alpha = 0;
|
||
|
level.edge_of_world_timer fadeOverTime( 0.2 );
|
||
|
level.edge_of_world_timer.alpha = 0;
|
||
|
wait 0.2;
|
||
|
level.edge_of_world_warning fadeOverTime( 0.2 );
|
||
|
level.edge_of_world_warning.alpha = 1;
|
||
|
level.edge_of_world_timer fadeOverTime( 0.2 );
|
||
|
level.edge_of_world_timer.alpha = 1;
|
||
|
wait 0.2;
|
||
|
}
|
||
|
|
||
|
edge_Of_World_Fail();
|
||
|
}
|
||
|
*/
|
||
|
/*
|
||
|
edge_Of_World_Fail()
|
||
|
{
|
||
|
setdvar( "ui_deadquote", "@COBRAPILOT_EDGE_OF_WORLD_FAIL" );
|
||
|
maps\_utility::missionFailedWrapper();
|
||
|
}
|
||
|
*/
|
||
|
playLoopSoundForSeeking( alias )
|
||
|
{
|
||
|
org = spawn( "script_origin", ( 0, 0, 0 ) );
|
||
|
org endon( "death" );
|
||
|
thread delete_on_death( org );
|
||
|
org.origin = level.player.origin;
|
||
|
org.angles = level.player.angles;
|
||
|
org linkto( level.player );
|
||
|
org playloopsound( alias );
|
||
|
self waittill( "stop sound" + alias );
|
||
|
org stoploopsound( alias );
|
||
|
org delete();
|
||
|
}
|
||
|
|
||
|
gunner_spawn( chopper )
|
||
|
{
|
||
|
gunner = spawn( "script_model", level.playervehicle getTagOrigin( "tag_gunner" ) );
|
||
|
gunner.angles = level.playervehicle getTagAngles( "tag_gunner" );
|
||
|
gunner linkto( level.playervehicle, "tag_gunner" );
|
||
|
gunner setModel( "body_complete_sp_cobra_pilot_desert_zack" );
|
||
|
|
||
|
gunner useAnimTree( #animtree );
|
||
|
|
||
|
chopper thread gunner_think( gunner );
|
||
|
}
|
||
|
|
||
|
gunner_think( gunner )
|
||
|
{
|
||
|
level.playervehicle endon( "death" );
|
||
|
level.player endon( "death" );
|
||
|
|
||
|
gunner thread gunner_lookAtTarget();
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( self.gunner_use_turret == false )
|
||
|
{
|
||
|
while ( self.gunner_use_turret == false )
|
||
|
wait 0.1;
|
||
|
wait randomfloatrange( 0.5, 1.2 );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
eTarget = level.playervehicle getEnemyTarget( level.GunnerTargetRange, level.GunnerTargetFOV, true, true );
|
||
|
if ( isdefined( eTarget ) )
|
||
|
{
|
||
|
gunner thread gunner_lookAtTarget( eTarget );
|
||
|
level.playervehicle thread shootEnemyTarget_Bullets( eTarget );
|
||
|
}
|
||
|
else if ( getdvar( "cobrapilot_debug" ) == "1" )
|
||
|
{
|
||
|
iprintln( "no valid targets" );
|
||
|
gunner thread gunner_lookAtTarget();
|
||
|
}
|
||
|
wait 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
gunner_lookAtTarget( eTarget )
|
||
|
{
|
||
|
level.playervehicle endon( "death" );
|
||
|
level.player endon( "death" );
|
||
|
|
||
|
self notify( "stop_looking_at_target" );
|
||
|
self endon( "stop_looking_at_target" );
|
||
|
if ( isdefined( eTarget ) )
|
||
|
eTarget endon( "death" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
if ( isdefined( self.lookingAtTarget ) && isdefined( eTarget ) )
|
||
|
blendTime = 0.1;
|
||
|
else
|
||
|
blendTime = 1.0;
|
||
|
|
||
|
self.lookingAtTarget = true;
|
||
|
|
||
|
blendAmount = self gunner_getBlendNumber( eTarget );
|
||
|
|
||
|
self setanim( %cobra_copilot_idle_l, blendAmount[ 0 ], blendTime );
|
||
|
self setanim( %cobra_copilot_idle, blendAmount[ 1 ], blendTime );
|
||
|
self setanim( %cobra_copilot_idle_r, blendAmount[ 2 ], blendTime );
|
||
|
|
||
|
if ( !isdefined( eTarget ) )
|
||
|
{
|
||
|
self.lookingAtTarget = undefined;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
wait blendTime;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
gunner_getBlendNumber( eTarget )
|
||
|
{
|
||
|
blendAmount = [];
|
||
|
blendAmount[ 0 ] = 0.0; // left
|
||
|
blendAmount[ 1 ] = 1.0; // forward
|
||
|
blendAmount[ 2 ] = 0.0; // right
|
||
|
|
||
|
if ( !isdefined( eTarget ) )
|
||
|
return blendAmount;
|
||
|
|
||
|
//prof_begin( "cobrapilot_ai" );
|
||
|
|
||
|
forward = anglesToForward( level.playervehicle.angles );
|
||
|
right = anglesToRight( level.playervehicle.angles );
|
||
|
t = ( eTarget.origin - level.playervehicle.origin );
|
||
|
s = vectorDot( t, right );
|
||
|
f = vectorDot( t, forward );
|
||
|
assert( f != 0 );
|
||
|
value = ( s / f );
|
||
|
|
||
|
if ( value < 0 )
|
||
|
{
|
||
|
// turn head to the left
|
||
|
value = abs( value );
|
||
|
if ( value > 1.0 )
|
||
|
value = 1.0;
|
||
|
blendAmount[ 0 ] = value; // left
|
||
|
blendAmount[ 1 ] = 1 - value; // forward
|
||
|
blendAmount[ 2 ] = 0.0; // right
|
||
|
|
||
|
}
|
||
|
else if ( value > 0 )
|
||
|
{
|
||
|
// turn head to the right
|
||
|
value = abs( value );
|
||
|
if ( value > 1.0 )
|
||
|
value = 1.0;
|
||
|
blendAmount[ 0 ] = 0.0; // left
|
||
|
blendAmount[ 1 ] = 1 - value; // forward
|
||
|
blendAmount[ 2 ] = value; // right
|
||
|
}
|
||
|
|
||
|
//prof_end( "cobrapilot_ai" );
|
||
|
|
||
|
return blendAmount;
|
||
|
}
|
||
|
|
||
|
missileIndicator( eMissile )
|
||
|
{
|
||
|
missileIndicator = spawnstruct();
|
||
|
|
||
|
missileIndicator.eMissile = eMissile;
|
||
|
target_set( missileIndicator.eMissile );
|
||
|
target_setShader( missileIndicator.eMissile, level.missileHintIndicator_Missile );
|
||
|
target_setOffscreenShader( missileIndicator.eMissile, level.missileHintIndicator_Missile_Offscreen );
|
||
|
|
||
|
// LEFT arrow
|
||
|
missileIndicator.arrowLeft = newHudElem();
|
||
|
missileIndicator.arrowLeft.x = -160;
|
||
|
missileIndicator.arrowLeft.y = 0;
|
||
|
missileIndicator.arrowLeft.alignX = "center";
|
||
|
missileIndicator.arrowLeft.alignY = "middle";
|
||
|
missileIndicator.arrowLeft.horzAlign = "center";
|
||
|
missileIndicator.arrowLeft.vertAlign = "middle";
|
||
|
missileIndicator.arrowLeft.foreground = true;
|
||
|
missileIndicator.arrowLeft.alpha = 0;
|
||
|
missileIndicator.arrowLeft setshader( level.missileHintIndicator_Arrow[ "left" ], 80, 160 );
|
||
|
|
||
|
// RIGHT arrow
|
||
|
missileIndicator.arrowRight = newHudElem();
|
||
|
missileIndicator.arrowRight.x = 160;
|
||
|
missileIndicator.arrowRight.y = 0;
|
||
|
missileIndicator.arrowRight.alignX = "center";
|
||
|
missileIndicator.arrowRight.alignY = "middle";
|
||
|
missileIndicator.arrowRight.horzAlign = "center";
|
||
|
missileIndicator.arrowRight.vertAlign = "middle";
|
||
|
missileIndicator.arrowRight.foreground = true;
|
||
|
missileIndicator.arrowRight.alpha = 0;
|
||
|
missileIndicator.arrowRight setshader( level.missileHintIndicator_Arrow[ "right" ], 80, 160 );
|
||
|
|
||
|
// FORWARD arrow
|
||
|
missileIndicator.arrowForward = newHudElem();
|
||
|
missileIndicator.arrowForward.x = 0;
|
||
|
missileIndicator.arrowForward.y = -160;
|
||
|
missileIndicator.arrowForward.alignX = "center";
|
||
|
missileIndicator.arrowForward.alignY = "middle";
|
||
|
missileIndicator.arrowForward.horzAlign = "center";
|
||
|
missileIndicator.arrowForward.vertAlign = "middle";
|
||
|
missileIndicator.arrowForward.foreground = true;
|
||
|
missileIndicator.arrowForward.alpha = 0;
|
||
|
missileIndicator.arrowForward setshader( level.missileHintIndicator_Arrow[ "forward" ], 160, 80 );
|
||
|
|
||
|
// BACK arrow
|
||
|
missileIndicator.arrowBack = newHudElem();
|
||
|
missileIndicator.arrowBack.x = 0;
|
||
|
missileIndicator.arrowBack.y = 160;
|
||
|
missileIndicator.arrowBack.alignX = "center";
|
||
|
missileIndicator.arrowBack.alignY = "middle";
|
||
|
missileIndicator.arrowBack.horzAlign = "center";
|
||
|
missileIndicator.arrowBack.vertAlign = "middle";
|
||
|
missileIndicator.arrowBack.foreground = true;
|
||
|
missileIndicator.arrowBack.alpha = 0;
|
||
|
missileIndicator.arrowBack setshader( level.missileHintIndicator_Arrow[ "back" ], 160, 80 );
|
||
|
|
||
|
thread missileIndicator_MissileDeath( missileIndicator );
|
||
|
thread missileIndicator_MissileFlash( missileIndicator );
|
||
|
|
||
|
// find where the missile is relative to the player so it can draw the appropriate arrows
|
||
|
eMissile endon( "death" );
|
||
|
level.player endon( "death" );
|
||
|
level.playervehicle endon( "death" );
|
||
|
for ( ;; )
|
||
|
{
|
||
|
// uses level.player angles instead of the cobra's angles so that it works when the player is in freelook
|
||
|
|
||
|
level waittill( "incomming_missile_blink_on" );
|
||
|
|
||
|
prof_begin( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
forwardvec = anglestoforward( level.player.angles );
|
||
|
backvec = vector_multiply( forwardvec, -1 );
|
||
|
rightvec = anglestoright( level.player.angles );
|
||
|
leftvec = vector_multiply( rightVec, -1 );
|
||
|
vecToMissile = vectorNormalize( missileIndicator.eMissile.origin - ( level.player getOrigin() ) );
|
||
|
|
||
|
// forward arrow
|
||
|
missileIndicator.arrowForward.alpha = 0;
|
||
|
vecdot = vectordot( forwardvec, vecToMissile );
|
||
|
if ( vecdot > level.cosine[ "45" ] )
|
||
|
missileIndicator.arrowForward.alpha = 1;
|
||
|
|
||
|
// back arrow
|
||
|
missileIndicator.arrowBack.alpha = 0;
|
||
|
vecdot = vectordot( backvec, vecToMissile );
|
||
|
if ( vecdot > level.cosine[ "45" ] )
|
||
|
missileIndicator.arrowBack.alpha = 1;
|
||
|
|
||
|
// left arrow
|
||
|
missileIndicator.arrowLeft.alpha = 0;
|
||
|
vecdot = vectordot( leftvec, vecToMissile );
|
||
|
if ( vecdot > level.cosine[ "45" ] )
|
||
|
missileIndicator.arrowLeft.alpha = 1;
|
||
|
|
||
|
// right arrow
|
||
|
missileIndicator.arrowRight.alpha = 0;
|
||
|
vecdot = vectordot( rightvec, vecToMissile );
|
||
|
if ( vecdot > level.cosine[ "45" ] )
|
||
|
missileIndicator.arrowRight.alpha = 1;
|
||
|
|
||
|
prof_end( "cobrapilot_weapons_systems" );
|
||
|
|
||
|
level waittill( "incomming_missile_blink_off" );
|
||
|
|
||
|
missileIndicator.arrowForward.alpha = 0;
|
||
|
missileIndicator.arrowBack.alpha = 0;
|
||
|
missileIndicator.arrowLeft.alpha = 0;
|
||
|
missileIndicator.arrowRight.alpha = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
missileIndicator_MissileFlash( missileIndicator )
|
||
|
{
|
||
|
level.playervehicle endon( "death" );
|
||
|
|
||
|
assert( isdefined( missileIndicator.eMissile ) );
|
||
|
|
||
|
missileIndicator.eMissile endon( "death" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
level waittill( "incomming_missile_blink_off" );
|
||
|
target_setShader( missileIndicator.eMissile, level.missileHintIndicator_Missile_Flash );
|
||
|
target_setOffscreenShader( missileIndicator.eMissile, level.missileHintIndicator_Missile_Flash );
|
||
|
|
||
|
level waittill( "incomming_missile_blink_on" );
|
||
|
target_setShader( missileIndicator.eMissile, level.missileHintIndicator_Missile );
|
||
|
target_setOffscreenShader( missileIndicator.eMissile, level.missileHintIndicator_Missile_Offscreen );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
missileIndicator_MissileDeath( missileIndicator )
|
||
|
{
|
||
|
level.playervehicle endon( "death" );
|
||
|
|
||
|
assert( isdefined( missileIndicator.eMissile ) );
|
||
|
|
||
|
missileIndicator.eMissile waittill( "death" );
|
||
|
|
||
|
if ( isdefined( missileIndicator.arrowLeft ) )
|
||
|
missileIndicator.arrowLeft destroy();
|
||
|
if ( isdefined( missileIndicator.arrowRight ) )
|
||
|
missileIndicator.arrowRight destroy();
|
||
|
if ( isdefined( missileIndicator.arrowForward ) )
|
||
|
missileIndicator.arrowForward destroy();
|
||
|
if ( isdefined( missileIndicator.arrowBack ) )
|
||
|
missileIndicator.arrowBack destroy();
|
||
|
}
|
||
|
|
||
|
missileIndicator_MissileFlashNotifies()
|
||
|
{
|
||
|
level.playervehicle endon( "death" );
|
||
|
level.player endon( "death" );
|
||
|
|
||
|
for ( ;; )
|
||
|
{
|
||
|
wait 0.2;
|
||
|
level notify( "incomming_missile_blink_off" );
|
||
|
wait 0.1;
|
||
|
level notify( "incomming_missile_blink_on" );
|
||
|
}
|
||
|
}
|