mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-23 01:25:52 +00:00
440 lines
14 KiB
Plaintext
440 lines
14 KiB
Plaintext
//****************************************************************************
|
|
// **
|
|
// Confidential - (C) Activision Publishing, Inc. 2010 **
|
|
// **
|
|
//****************************************************************************
|
|
// **
|
|
// Module: new future rail gun tank, based off abrams tank **
|
|
// Created: 10/21/2010 - mario sanchez **
|
|
// **
|
|
//****************************************************************************
|
|
|
|
#include maps\_utility;
|
|
#include maps\_vehicle_aianim;
|
|
#include maps\_vehicle;
|
|
#include maps\_atbr;
|
|
#include common_scripts\_atbr;
|
|
#include common_scripts\utility;
|
|
|
|
#using_animtree( "vehicles" );
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
CONST_TANK_FOV = 80;
|
|
CONST_TURRET_UPDATE_INTERVAL_SEC = 0.001;
|
|
CONST_TURRET_PITCH_LIMIT = 12.50;
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
main( model, type )
|
|
{
|
|
//SNDFILE=vehicle_abrams
|
|
build_template( "nx_future_tank", model, type );
|
|
build_localinit( ::init_local );
|
|
build_spawn_callback( ::spawn_callback );
|
|
build_deathmodel( "nx_vehicle_future_tank", "vehicle_m1a1_abrams_dmg" );
|
|
build_shoot_shock( "nx_us_tank_blast" );
|
|
build_drive( %nx_vh_future_tank_movement, %nx_vh_future_tank_movement_backwards, 10 );
|
|
build_exhaust( "distortion/abrams_exhaust" );
|
|
build_deathfx( "explosions/large_vehicle_explosion", undefined, "exp_armor_vehicle" );
|
|
build_treadfx();
|
|
build_rumble( "tank_rumble", 0.05, 4.5, 900, 1, 1 );
|
|
build_team( "allies" );
|
|
build_compassicon( "tank" );
|
|
build_aianims( ::setanims, ::set_vehicle_anims );
|
|
|
|
// weapon stuff
|
|
build_mainturret();
|
|
// tagMJS<NOTE> we're going follow what BenK did with the UGV and high jack the auto_nonai mode instead of using the manual mode
|
|
build_turret( "nx_us_tank_turret",
|
|
"tag_turret_second",
|
|
"nx_vehicle_us_tank_turret",
|
|
undefined,
|
|
"auto_nonai",
|
|
0.0,
|
|
0,
|
|
0 );
|
|
|
|
build_trophy_turret( "ugv_trophy_turret",
|
|
"tag_trophy",
|
|
"nx_ugv_rangefinder",
|
|
undefined,
|
|
"trophy",
|
|
0.2,
|
|
undefined,
|
|
undefined,
|
|
"player", // Trophy owner.
|
|
undefined, // Trophy laser sound.
|
|
undefined
|
|
);
|
|
|
|
|
|
build_vehicle_weapon_effects( "dust/abrams_desk_dust" );
|
|
build_vehicle_weapon_effects( "dust/abrams_desk_dust", "nx_ugv_rangefinder" );
|
|
|
|
// health stuff
|
|
//build_frontarmor( .33 );// regens this much of the damage from attacks to the front
|
|
//build_life( 10000 );
|
|
//build_vehicle_regen_health_system( 100, 5.0 );
|
|
build_life( 15000 );
|
|
build_vehicle_regen_health_system( 150, 3.0 );
|
|
|
|
maps\_atbr::init_atbr();
|
|
|
|
PreCacheItem( "nx_rail_gun_spread" );
|
|
PreCacheItem( "atbr_missile" );
|
|
PreCacheItem( "atbr_bullet" );
|
|
|
|
VisionSetMissilecam( "missilecam" );
|
|
PreCacheShader( "remotemissile_infantry_target" );
|
|
PreCacheShader( "hud_fofbox_self_sp" );
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
init_local()
|
|
{
|
|
//ent_flag_init("primary_turret_override");
|
|
ent_flag_init("secondary_turret_override");
|
|
//ent_flag_init("committed_action");
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
set_vehicle_anims( positions )
|
|
{
|
|
return positions;
|
|
}
|
|
|
|
|
|
#using_animtree( "generic_human" );
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
setanims()
|
|
{
|
|
positions = [];
|
|
for ( i = 0;i < 5;i++ )
|
|
positions[ i ] = spawnstruct();
|
|
|
|
// tagJW<NOTE>: Position 0 is the "driver", and the player mount animations use "tag_mount_1"
|
|
// So I swapped position 0 and 4 so that the player and a driver can both be mounted
|
|
|
|
positions[ 4 ].sittag = "tag_mount_1";
|
|
positions[ 1 ].sittag = "tag_mount_2";
|
|
positions[ 2 ].sittag = "tag_mount_3";
|
|
positions[ 3 ].sittag = "tag_mount_4";
|
|
positions[ 0 ].sittag = "tag_mount_5";
|
|
|
|
positions[ 0 ].bHasGunWhileRiding = false;
|
|
|
|
positions[ 4 ].idle = %nx_tp_future_tank_desant_idle_1;
|
|
positions[ 1 ].idle = %nx_tp_future_tank_desant_idle_2;
|
|
positions[ 2 ].idle = %nx_tp_future_tank_desant_idle_3;
|
|
positions[ 3 ].idle = %nx_tp_future_tank_desant_idle_4;
|
|
positions[ 0 ].idle = %nx_tp_future_tank_desant_idle_5;
|
|
|
|
positions[ 4 ].death = %exposed_crouch_death_flip;
|
|
positions[ 1 ].death = %exposed_crouch_death_flip;
|
|
positions[ 2 ].death = %exposed_crouch_death_flip;
|
|
positions[ 3 ].death = %exposed_crouch_death_flip;
|
|
positions[ 0 ].death = %exposed_crouch_death_flip;
|
|
|
|
positions[ 4 ].getout = %nx_tp_future_tank_desant_dismount_1;
|
|
positions[ 1 ].getout = %nx_tp_future_tank_desant_dismount_2;
|
|
positions[ 2 ].getout = %nx_tp_future_tank_desant_dismount_3;
|
|
positions[ 3 ].getout = %nx_tp_future_tank_desant_dismount_4;
|
|
positions[ 0 ].getout = %nx_tp_future_tank_desant_dismount_5;
|
|
|
|
positions[ 4 ].getin = %nx_tp_future_tank_desant_mount_1;
|
|
positions[ 1 ].getin = %nx_tp_future_tank_desant_mount_2;
|
|
positions[ 2 ].getin = %nx_tp_future_tank_desant_mount_3;
|
|
positions[ 3 ].getin = %nx_tp_future_tank_desant_mount_4;
|
|
positions[ 0 ].getin = %nx_tp_future_tank_desant_mount_5;
|
|
|
|
return positions;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
spawn_callback( vehicle )
|
|
{
|
|
vehicle endon( "death" );
|
|
|
|
// here we add only the functionality we want for a player controlled vehicle
|
|
if( IsDefined( vehicle.script_vehicle_player ) )
|
|
{
|
|
level.rg_tank_cannon_spread = 1;
|
|
level.rg_tank_cannon_disable = 0;
|
|
|
|
// we need to do a turret update to stop it from going into full auto_nonai mode
|
|
direction_vec = anglesToForward( vehicle.angles );
|
|
trace = bullettrace( vehicle.origin, vehicle.origin + ( direction_vec * 128 ), 0, undefined );
|
|
vehicle.mgturret[ 0 ] SetTurretTargetPosition( trace[ "position" ] );
|
|
|
|
while( 1 )
|
|
{
|
|
// we will wait till the player enters the tank
|
|
vehicle waittill( "vehicle_mount" );
|
|
fov = GetDvarInt( "cg_fov" );
|
|
SetSavedDvar( "cg_fov", CONST_TANK_FOV );
|
|
vehicle.damageIsFromPlayer = true;
|
|
vehicle.mgturret[ 0 ].damageIsFromPlayer = true;
|
|
vehicle.rumbleon = false;
|
|
|
|
vehicle childthread rg_tank_fire_main_cannon();
|
|
vehicle childthread rg_tank_fire_atbr();
|
|
//vehicle childthread rg_tank_change_main_cannon_fire_mode();
|
|
vehicle childthread rg_tank_machine_gun_update();
|
|
vehicle thread rg_kill_rider_on_death();
|
|
|
|
vehicle waittill( "vehicle_dismount" );
|
|
vehicle notify( "stop_death_cleanup" );
|
|
SetSavedDvar( "cg_fov", fov );
|
|
vehicle.damageIsFromPlayer = false;
|
|
vehicle.mgturret[ 0 ].damageIsFromPlayer = false;
|
|
level._player DisableInvulnerability();
|
|
vehicle.rumbleon = true;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
rg_tank_fire_main_cannon()
|
|
{
|
|
self endon( "vehicle_dismount" );
|
|
|
|
level._player NotifyOnPlayerCommand( "rg_fire_main_gun", "+attack" );
|
|
|
|
while( 1 )
|
|
{
|
|
level._player waittill( "rg_fire_main_gun" );
|
|
|
|
if( 1 == level.rg_tank_cannon_disable )
|
|
{
|
|
self setVehWeapon( "none" );
|
|
}
|
|
else if( 1 == level.rg_tank_cannon_spread )
|
|
{
|
|
self setVehWeapon( "nx_rail_gun_spread" );
|
|
}
|
|
else
|
|
{
|
|
self setVehWeapon( "m1a1_turret_player" );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
rg_tank_machine_gun_update()
|
|
{
|
|
self endon( "vehicle_dismount" );
|
|
|
|
fire_time = WeaponFireTime( "nx_us_tank_turret" );
|
|
last_shot = GetTime();
|
|
allow_fire = 1;
|
|
|
|
while ( 1 )
|
|
{
|
|
trace = get_player_eye_trace();
|
|
|
|
if ( isdefined( trace[ "position" ] ) )
|
|
{
|
|
if ( IsDefined( trace[ "entity" ] ) && IsDefined ( trace[ "entity" ].vehicletype ) && "nx_future_tank" == trace[ "entity" ].vehicletype )
|
|
{
|
|
allow_fire = 0;
|
|
}
|
|
else
|
|
{
|
|
allow_fire = 1;
|
|
}
|
|
|
|
self.mgturret[ 0 ] SetTurretTargetPosition( trace[ "position" ] );
|
|
|
|
// check if player is trying to fire and then fire if we passed our time interval
|
|
if ( 1 == allow_fire )
|
|
{
|
|
if ( level._player ButtonPressed( "BUTTON_RSHLDR" ) || level._player ButtonPressed( "MOUSE2" ) ) // tagMJS<note> this may change if we want the left trigger to do an ADS for the tank
|
|
{
|
|
last_shot_delta = ( GetTime() - last_shot );
|
|
if( fire_time < last_shot_delta )
|
|
{
|
|
self.mgturret[ 0 ] ShootTurret();
|
|
last_shot = GetTime();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
wait ( CONST_TURRET_UPDATE_INTERVAL_SEC );
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
get_player_eye_trace()
|
|
{
|
|
eye = level._player getEye();
|
|
player_angles = level._player getPlayerAngles();
|
|
if ( CONST_TURRET_PITCH_LIMIT < player_angles[0] )
|
|
{
|
|
player_angles = ( CONST_TURRET_PITCH_LIMIT, player_angles[1], player_angles[2] );
|
|
}
|
|
direction_vec = anglesToForward( player_angles );
|
|
trace = bullettrace( eye, eye + ( direction_vec * 8000 ), 0, undefined );
|
|
|
|
return trace;
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
// tagMJS<GOTCHA> most of the code in this func is a mirror of code in common_scripts/_atbr. If that file changes
|
|
// this will need to be updated as well.
|
|
rg_tank_fire_atbr()
|
|
{
|
|
self endon( "vehicle_dismount" );
|
|
|
|
level._player NotifyOnPlayerCommand( "rg_fire_atbr", "+smoke" );
|
|
|
|
while( 1 )
|
|
{
|
|
level._player.attached = false;
|
|
level._player waittill( "rg_fire_atbr" );
|
|
|
|
// remove controls from tank
|
|
level.rg_tank_cannon_disable = 1;
|
|
|
|
atbr_launch_loc = self GetTagOrigin( "tag_atbr" );
|
|
missile = MagicBullet( "atbr_missile", atbr_launch_loc, atbr_launch_loc + ( 0, 0, 2000 ), level._player );
|
|
missile.angles = (-90, self.angles[1], 0);
|
|
|
|
atbr_common_attach_to_bullet( level._player, missile );
|
|
level.rg_tank_cannon_disable = 0;
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
rg_tank_change_main_cannon_fire_mode()
|
|
{
|
|
self endon( "vehicle_dismount" );
|
|
|
|
level._player NotifyOnPlayerCommand( "rg_change_fire_mode", "weapnext" );
|
|
|
|
while( 1 )
|
|
{
|
|
level._player waittill( "rg_change_fire_mode" );
|
|
|
|
if( 1 == level.rg_tank_cannon_spread )
|
|
{
|
|
level.rg_tank_cannon_spread = 0;
|
|
self setVehWeapon( "m1a1_turret_player" );
|
|
}
|
|
else
|
|
{
|
|
level.rg_tank_cannon_spread = 1;
|
|
self setVehWeapon( "nx_rail_gun_spread" );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
rg_kill_rider_on_death()
|
|
{
|
|
// we only want to kill the player if they are currently in the tank
|
|
self endon( "stop_death_cleanup" );
|
|
self waittill( "death" );
|
|
|
|
setdvar( "ui_deadquote", "You failed the mission." );
|
|
maps\_utility::missionFailedWrapper();
|
|
|
|
level._player DisableInvulnerability(); // not too sure why this is needed. maybe from vehicles protect player flag
|
|
level._player Kill();
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
invincible()
|
|
{
|
|
self.maxhealth = 100000;
|
|
while ( 1 )
|
|
{
|
|
self waittill("damage");
|
|
//wait( 0.05 );
|
|
self.health = self.maxhealth;
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
/*QUAKED script_vehicle_nx_future_tank (1 0 0) (-16 -16 -24) (16 16 32) USABLE SPAWNER
|
|
|
|
|
|
maps\_nx_future_tank::main( "nx_vehicle_us_tank", "nx_future_tank" );
|
|
sound,vehicle_armor_exp,vehicle_standard,all_sp
|
|
|
|
|
|
include,nx_vehicle_us_tank
|
|
sound,vehicle_futuretank,,all_sp
|
|
|
|
|
|
defaultmdl="nx_vehicle_us_tank"
|
|
default:"vehicletype" "nx_future_tank"
|
|
default:"script_team" "allies"
|
|
*/
|