1 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\gameskill_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\statemachine_shared;
8 #using scripts\shared\system_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\vehicle_ai_shared;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\statemachine.gsh;
14 #insert scripts\shared\version.gsh;
16 #insert scripts\shared\ai\utility.gsh;
19 #using scripts\shared\vehicle_shared;
20 #using scripts\shared\vehicle_death_shared;
22 #define NUM_DAMAGE_STATES 4
23 #define DAMAGE_STATE_THRESHOLD_PCT_1 0.75
24 #define DAMAGE_STATE_THRESHOLD_PCT_2 0.5
25 #define DAMAGE_STATE_THRESHOLD_PCT_3 0.25
26 #define DAMAGE_STATE_THRESHOLD_PCT_4 0.1
28 #define SCAN_HEIGHT_OFFSET 40
30 #define TURRET_STATE_SCAN_AT_ENEMY 0
31 #define TURRET_STATE_SCAN_FORWARD 1
32 #define TURRET_STATE_SCAN_RIGHT 2
33 #define TURRET_STATE_SCAN_FORWARD2 3
34 #define TURRET_STATE_SCAN_LEFT 4
35 #define NUM_TURRET_STATES 5
37 #define STR_VEHICLETYPE "drone_metalstorm"
39 #precache( "fx", "_t6/destructibles/fx_metalstorm_damagestate00" );
40 #precache( "fx", "_t6/destructibles/fx_metalstorm_damagestate01" );
41 #precache( "fx", "_t6/destructibles/fx_metalstorm_damagestate02" );
42 #precache( "fx", "_t6/destructibles/fx_metalstorm_damagestate03" );
43 #precache( "fx", "_t6/destructibles/fx_metalstorm_damagestate_back01" );
44 #precache( "fx", "_t6/destructibles/fx_metalstorm_death01a" );
45 #precache( "fx", "_t6/impacts/fx_metalstorm_hit01" );
46 #precache( "fx", "_t6/impacts/fx_metalstorm_hit02" );
47 #precache( "fx", "_t6/light/fx_vlight_metalstorm_eye_grn" );
48 #precache( "fx", "_t6/light/fx_vlight_metalstorm_eye_red" );
49 #precache( "fx", "_t6/electrical/fx_elec_sp_emp_stun_metalstorm" );
51 #namespace metal_storm;
60 vehicle::add_main_callback(
"drone_metalstorm",&
main );
61 vehicle::add_main_callback(
"drone_metalstorm_rts",&
main );
62 vehicle::add_main_callback(
"drone_metalstorm_afghan_rts",&
main );
63 vehicle::add_main_callback(
"drone_metalstorm_karma",&
main );
64 vehicle::add_main_callback(
"drone_metalstorm_monsoon",&
main );
68 level.difficultySettings[
"asd_burst_scale" ][
"easy" ] = 1.15;
69 level.difficultySettings[
"asd_burst_scale" ][
"normal" ] = 1;
70 level.difficultySettings[
"asd_burst_scale" ][
"hardened" ] = 0.85;
71 level.difficultySettings[
"asd_burst_scale" ][
"veteran" ] = 0.7;
73 level.difficultySettings[
"asd_health_boost" ][
"easy" ] = -70;
74 level.difficultySettings[
"asd_health_boost" ][
"normal" ] = 0;
75 level.difficultySettings[
"asd_health_boost" ][
"hardened" ] = 70;
76 level.difficultySettings[
"asd_health_boost" ][
"veteran" ] = 140;
83 if ( !isdefined( level.fx_damage_effects ) )
85 level.fx_damage_effects = [];
94 level.fx_damage_effects[
STR_VEHICLETYPE ][i] =
"_t6/destructibles/fx_metalstorm_damagestate0" + ( i + 1 );
97 level._effect[
"metalstorm_busted" ] =
"_t6/destructibles/fx_metalstorm_damagestate_back01";
98 level._effect[
"metalstorm_explo" ] =
"_t6/destructibles/fx_metalstorm_death01a";
100 level._effect[
"metalstorm_hit" ] =
"_t6/impacts/fx_metalstorm_hit01";
101 level._effect[
"metalstorm_hit_back" ] =
"_t6/impacts/fx_metalstorm_hit02";
103 level._effect[
"eye_light_friendly" ] =
"_t6/light/fx_vlight_metalstorm_eye_grn";
104 level._effect[
"eye_light_enemy" ] =
"_t6/light/fx_vlight_metalstorm_eye_red";
106 level._effect[
"metalstorm_stun" ] =
"_t6/electrical/fx_elec_sp_emp_stun_metalstorm";
121 self EnableAimAssist();
122 self SetNearGoalNotifyDist( 35 );
123 self SetSpeed( 5, 5, 5 );
127 self.turret_on_target =
false;
128 self.highlyawareradius = 80;
130 if( !isdefined(
self.goalradius ) )
132 self.goalradius = 600;
135 if( !isdefined(
self.goalpos ) )
137 self.goalpos =
self.origin;
140 self SetVehGoalPos(
self.goalpos,
true );
153 if ( isdefined(
self.script_startstate ) )
156 if(
self.script_startstate ==
"off" )
183 if( !IsAlive(
self ) )
186 driver =
self GetSeatOccupant( 0 );
187 if( isdefined( driver ) )
201 angles =
self GetTagAngles(
"tag_flash" );
202 target_vec =
self.origin + AnglesToForward( ( 0, angles[1], 0 ) ) * 1000;
203 target_vec = target_vec + ( 0, 0, -700 );
204 self SetTargetOrigin( target_vec );
206 if( !isdefined(
self.
emped ) )
208 self DisableAimAssist();
216 self EnableAimAssist();
219 self playsound (
"veh_metalstorm_boot_up");
221 self.off = undefined;
227 for( i = 0; i < 6; i++ )
235 angles =
self GetTagAngles(
"tag_flash" );
236 target_vec =
self.origin + AnglesToForward( ( 0, angles[1], 0 ) ) * 1000;
237 self.turretRotScale = 0.3;
239 driver =
self GetSeatOccupant( 0 );
240 if( !isdefined(driver) )
242 self SetTargetOrigin( target_vec );
245 self.turretRotScale = 1;
250 self endon(
"death" );
251 self endon(
"change_state" );
253 self.turret_on_target =
false;
257 self waittill(
"turret_on_vistarget" );
258 self.turret_on_target =
true;
266 self endon(
"death" );
267 self endon(
"change_state" );
268 self notify(
"turret_on_target_thread" );
270 self endon(
"turret_on_target_thread" );
272 self.turret_on_target =
false;
276 self waittill(
"turret_on_target" );
277 self.turret_on_target =
true;
285 self endon(
"death" );
286 self endon(
"change_state" );
290 self.turretRotScale = 0.35;
292 while( scan_forever || ( !isdefined(
self.enemy ) || !(
self VehCanSee(
self.enemy )) ) )
294 if(
self.turret_on_target )
296 self.turret_on_target =
false;
299 self.turret_state = 0;
302 switch(
self.turret_state )
305 if( isdefined(
self.enemy ) )
307 target_vec = (
self.enemy.origin[0],
self.enemy.origin[1],
self.origin[2] );
312 target_vec =
self.origin + AnglesToForward( ( 0,
self.angles[1], 0 ) ) * 1000;
316 target_vec =
self.origin + AnglesToForward( ( 0,
self.angles[1] + 90, 0 ) ) * 1000;
320 target_vec =
self.origin + AnglesToForward( ( 0,
self.angles[1], 0 ) ) * 1000;
324 target_vec =
self.origin + AnglesToForward( ( 0,
self.angles[1] - 90, 0 ) ) * 1000;
329 self SetTargetOrigin( target_vec );
339 self endon(
"death" );
340 self endon(
"change_state" );
346 level.players[0] waittill(
"grenade_fire", grenade );
348 if (!IsDefined(grenade))
352 vel_towards_me = VectorDot( grenade GetVelocity(), VectorNormalize(
self.origin - grenade.origin) );
353 if( vel_towards_me < 100 || !
self VehCanSee( grenade ) )
359 if( isdefined( grenade ) )
361 distSq = DistanceSquared(
self.origin, grenade.origin );
362 while( isdefined( grenade ) && ( distSq > 650 * 650 || distSq < 150 * 150 ) )
364 distSq = DistanceSquared(
self.origin, grenade.origin );
369 if( !isdefined( grenade ) )
373 vel_towards_me = VectorDot( grenade GetVelocity(), VectorNormalize(
self.origin - grenade.origin) );
374 if( vel_towards_me < 100 )
378 self.turretRotScale = 2;
379 self SetTurretTargetEnt( grenade );
384 for( i = 0; i < 6; i++ )
388 if( RandomInt( 100 ) > 40 &&
self.turret_on_target )
390 if( isdefined( grenade ) )
392 grenade ResetMissileDetonationTime( 0 );
400 self SetSpeed( 5, 5, 5 );
401 self ClearTurretTarget();
407 self endon(
"death" );
408 self endon(
"change_state" );
410 cant_see_enemy_count = 0;
416 enemy_is_tank =
false;
417 enemy_is_hind =
false;
418 if( isdefined(
self.enemy ) && isdefined(
self.enemy.vehicletype ) )
420 enemy_is_tank =
self.enemy.vehicletype ==
"tank_t72_rts" ||
self.enemy.vehicletype ==
"drone_claw_rts";
421 enemy_is_hind =
self.enemy.vehicletype ==
"heli_hind_afghan_rts";
424 if ( isdefined(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
426 self.turretRotScale = 1;
427 self SetTurretTargetEnt(
self.enemy );
429 if( cant_see_enemy_count >= 2 )
432 self ClearVehGoalPos();
433 self notify(
"near_goal" );
435 cant_see_enemy_count = 0;
438 if( IsPlayer(
self.enemy ) )
440 self playsound (
"wpn_metalstorm_lock_on");
447 if ( isdefined(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
449 if( isdefined(
self.enemy ) && DistanceSquared(
self.origin,
self.enemy.origin ) > 800 * 800 || enemy_is_tank )
452 self SetGunnerTargetEnt(
self.enemy, (0,0,-40), 0 );
455 self FireWeapon( 1,
self.enemy );
457 self ClearGunnerTarget( 0 );
467 wait RandomFloatRange( 1.2, 2 );
471 cant_see_enemy_count++;
475 if( cant_see_enemy_count > 2 )
479 else if( cant_see_enemy_count > 1 )
481 self ClearTargetEntity();
489 self endon(
"crash_done" );
490 self endon(
"death" );
492 weapon =
self SeatGetWeapon( 0 );
493 if ( weapon == level.weaponNone )
496 fireTime = weapon.fireTime;
499 while( time < totalFireTime )
501 if( isdefined(
self.enemy ) && isdefined(
self.enemy.attackerAccuracy) &&
self.enemy.attackerAccuracy == 0 )
503 self FireWeapon( 0,
self.enemy );
516 self.goalpos =
self.origin;
518 if ( !isdefined( state ) )
531 while( isdefined(
self.
emped ) )
536 if (isdefined(
self.vMaxAISpeedOverridge))
538 self SetSpeed(
self.vMaxAISpeedOverridge, 5, 5 );
542 self SetSpeed( 5, 5, 5 );
543 self SetVehMaxSpeed( 0 );
553 self endon(
"death" );
558 if( GetDvarInt(
"metalstorm_debug" ) == 0 )
564 if ( isdefined(
self.goalpos ) )
566 DebugStar(
self.goalpos, 10, ( 1, 0, 0 ) );
567 Circle(
self.goalpos,
self.goalradius, ( 1, 0, 0 ),
false, 10 );
570 if ( isdefined(
self.enemy ) )
572 Line(
self.origin + ( 0, 0, 30 ),
self.enemy.origin + ( 0, 0, 30 ), ( 1, 0, 0 ),
true, 1 );
582 results = PhysicsTraceEx(
self.origin, position, (-15,-15,-5), (15,15,5),
self );
584 if( results[
"fraction"] == 1 )
594 self endon(
"death" );
595 self endon(
"change_state" );
596 self endon(
"near_goal" );
597 self endon(
"reached_end_node" );
603 if ( isdefined(
self.enemy ) && isdefined(
self.goal_node ) )
605 if( distance2dSquared(
self.enemy.origin,
self.origin ) < 150 * 150 )
607 self.move_now =
true;
608 self notify(
"near_goal" );
610 if( distance2dSquared(
self.enemy.origin,
self.goal_node.origin ) < 150 * 150 )
612 self.move_now =
true;
613 self notify(
"near_goal" );
617 if( isdefined(
self.goal_node ) )
619 if( distance2dSquared(
self.goal_node.origin,
self.goalpos ) >
self.goalradius *
self.goalradius )
623 self.move_now =
true;
624 self notify(
"near_goal" );
634 self endon(
"death" );
635 self endon(
"change_state" );
642 if ( isdefined(
self.enemy ) )
644 if( distance2dSquared(
self.enemy.origin,
self.origin ) < 150 * 150 )
648 if ( !isdefined(
self.goal_node))
650 if( distance2dSquared(
self.enemy.origin,
self.goal_node.origin ) < 150 * 150 )
660 self endon(
"death" );
661 self endon(
"change_state" );
663 if( distance2dSquared(
self.origin,
self.goalpos ) > 20 * 20 )
664 self SetVehGoalPos(
self.goalpos,
true, 2 );
673 if(
self SetVehGoalPos( goalpos,
false, 2 ) )
680 if( isdefined(
self.move_now ) )
682 self.move_now = undefined;
685 else if( isdefined(
self.enemy ) &&
self VehCanSee(
self.enemy ) )
687 if( Abs( AngleClamp180(
self.angles[0] ) ) > 6 || Abs( AngleClamp180(
self.angles[2] ) ) > 6 )
695 if( Abs( AngleClamp180(
self.angles[0] ) ) > 6 || Abs( AngleClamp180(
self.angles[2] ) ) > 6 )
707 offset = ( RandomFloatRange(-70,70), RandomFloatRange(-70,70), 15 );
708 goalpos =
self.origin + offset;
712 self SetVehGoalPos( goalpos,
false );
713 self waittill(
"near_goal" );
724 const sweet_spot_dist = 350;
726 origin =
self.goalpos;
728 nodes = GetNodesInRadius(
self.goalpos,
self.goalradius, 0, 128,
"Path" );
749 if( nodes.size == 0 )
751 self.goalpos = (
self.goalpos[0],
self.goalpos[1],
self.origin[2] );
752 nodes = GetNodesInRadius(
self.goalpos,
self.goalradius + 500, 0, 500,
"Path" );
755 best_node = undefined;
756 best_score = -999999;
758 if ( isdefined(
self.enemy ) )
762 foreach( node
in nodes )
766 dist_in_front_of_enemy = VectorDot( vec_enemy_to_node, vec_enemy_to_self );
767 dist_away_from_sweet_line = Abs( dist_in_front_of_enemy - sweet_spot_dist );
769 score = 1 + RandomFloat( .15 );
771 if( dist_away_from_sweet_line > 100 )
773 score -=
math::clamp( dist_away_from_sweet_line / 800, 0, 0.5 );
776 if( distance2dSquared( node.origin,
self.enemy.origin ) > 550 * 550 )
781 if( distance2dSquared(
self.origin, node.origin ) < 120 * 120 )
786 if( isdefined( node.metal_storm_previous_goal ) )
789 node.metal_storm_previous_goal--;
790 if( node.metal_storm_previous_goal == 0 )
792 node.metal_storm_previous_goal = undefined;
799 if ( score > best_score )
808 foreach( node
in nodes )
811 score = RandomFloat( 1 );
813 if( distance2dSquared(
self.origin, node.origin ) < 100 )
818 if( isdefined( node.metal_storm_previous_goal ) )
821 node.metal_storm_previous_goal--;
822 if( node.metal_storm_previous_goal == 0 )
824 node.metal_storm_previous_goal = undefined;
828 if( score > best_score )
836 if( isdefined( best_node ) )
838 best_node.metal_storm_previous_goal = 3;
839 origin = best_node.origin;
840 self.goal_node = best_node;
849 self waittill(
"exit_vehicle", player );
851 player.ignoreme =
false;
852 player DisableInvulnerability();
855 self ShowPart(
"tag_pov_hide" );
856 self.goalpos =
self.origin;
861 self endon(
"change_state" );
863 driver =
self GetSeatOccupant( 0 );
864 if( isdefined(driver) )
866 self.turretRotScale = 1;
867 self DisableAimAssist();
868 self HidePart(
"tag_pov_hide" );
871 self SetVehMaxSpeed( (isdefined(
self.vMaxSpeedOverridge)?
self.vMaxSpeedOverridge:7) );
872 driver EnableInvulnerability();
873 driver.ignoreme =
true;
882 self ClearTargetEntity();
884 self ClearVehGoalPos();
889 next_damage_state = 0;
891 max_health =
self.healthdefault;
892 if( isdefined(
self.health_max ) )
894 max_health =
self.health_max;
897 health_pct =
self.health / max_health;
901 next_damage_state = 1;
905 next_damage_state = 2;
909 next_damage_state = 3;
913 next_damage_state = 4;
916 if ( next_damage_state !=
self.current_damage_state )
918 if ( isdefined( level.fx_damage_effects[
STR_VEHICLETYPE ][ next_damage_state - 1 ] ) )
930 self.current_damage_state = next_damage_state;
936 self endon(
"death" );
938 self.current_damage_state = 0;
940 if ( !isdefined( level.fx_damage_effects ) || !isdefined( level.fx_damage_effects[
STR_VEHICLETYPE ] ) )
945 self waittill(
"damage",
damage, attacker, dir, point, mod, model, modelAttachTag, part );
947 if ( !isdefined(
self ) )
950 if( mod ==
"MOD_RIFLE_BULLET" || mod ==
"MOD_PISTOL_BULLET" || mod ==
"MOD_MELEE" )
952 if( part ==
"tag_control_panel" || part ==
"tag_body_panel" )
954 PlayFx( level._effect[
"metalstorm_hit_back" ], point, dir );
958 PlayFx( level._effect[
"metalstorm_hit" ], point, dir );
965 self.turretRotScale = 1.0;
966 self.turret_on_target =
true;
974 if ( isdefined(
self.damage_fx_ent ) )
975 self.damage_fx_ent Delete();
977 self.damage_fx_ent =
Spawn(
"script_model", ( 0, 0, 0 ) );
978 self.damage_fx_ent SetModel(
"tag_origin" );
979 self.damage_fx_ent.origin =
self.origin;
980 self.damage_fx_ent.angles =
self.angles;
981 self.damage_fx_ent LinkTo(
self,
"tag_turret", (0,0,0), (0,0,0) );
983 return self.damage_fx_ent;
988 if( isdefined(
self.damage_fx_ent ) )
990 self.damage_fx_ent
delete();
993 if( isdefined(
self.stun_fx ) )
995 self.stun_fx
delete();
1002 self endon(
"death" );
1021 self endon(
"death" );
1023 level notify(
"asd_freezed" );
1028 goalDist = RandomFloatRange( 350, 450 );
1029 deathGoal =
self.origin + AnglesToForward(
self.angles ) * goalDist;
1030 PlayFXOnTag( level._effect[
"freeze_short_circuit" ],
self,
"tag_origin" );
1031 self SetModel(
"veh_t6_drone_tank_freeze" );
1032 self SetVehGoalPos( deathGoal,
false );
1036 self.turretRotScale = 0.3;
1039 if( !isdefined(
self.stun_fx) )
1041 self.stun_fx =
Spawn(
"script_model",
self.origin );
1042 self.stun_fx SetModel(
"tag_origin" );
1043 self.stun_fx LinkTo(
self,
"tag_turret", (0,0,0), (0,0,0) );
1044 PlayFXOnTag( level._effect[
"metalstorm_stun" ],
self.stun_fx,
"tag_origin" );
1049 self.turretRotScale = 0.1;
1050 self SetSpeed( 0.5 );
1055 self.turretRotScale = 0.01;
1056 self SetSpeed( 0.0 );
1060 self CancelAIMove();
1061 self ClearVehGoalPos();
1062 self ClearTurretTarget();
1067 if( isdefined(
self.stun_fx ) )
1069 self.stun_fx
delete();
1079 self notify(
"nodeath_thread" );
1081 self waittill(
"death", attacker, damageFromUnderneath, weapon, point, dir, mod );
1083 if( isdefined(
self.eye_fx_ent ) )
1085 self.eye_fx_ent
delete();
1095 if ( !isdefined(
self ) )
1102 self DisableAimAssist();
1111 if( isdefined(mod) && mod ==
"MOD_GAS" && isdefined( level.metalstorm_freeze_death ) )
1118 PlayFXOnTag( level._effect[
"metalstorm_explo" ],
fx_ent,
"tag_origin" );
1119 self PlaySound(
"veh_metalstorm_dying" );
1128 if ( isdefined(
self ) )
1132 badplace_box(
"", 40,
self.origin, radius,
"all" );
1138 if ( isdefined(
self ) )
1148 self playsound(
"veh_metalstorm_sparks");
1153 self endon(
"crash_done" );
1154 self endon(
"death" );
1156 self CancelAIMove();
1157 self ClearVehGoalPos();
1159 self.takedamage = 0;
1161 if( !isdefined(
self.off ) )
1164 self.turretRotScale = 1.0;
1166 self PlaySound(
"wpn_turret_alert" );
1171 deathMove = RandomInt( 8 );
1173 if( deathMove == 0 )
1175 goalDist = RandomFloatRange( 350, 450 );
1176 deathGoal =
self.origin + AnglesToForward(
self.angles ) * goalDist;
1178 else if( deathMove == 1 )
1180 goalDist = RandomFloatRange( 350, 450 );
1181 deathGoal =
self.origin + AnglesToForward(
self.angles ) * -goalDist;
1183 else if( deathMove <= 4 )
1189 if( isdefined( attacker ) )
1191 deathGoal = attacker.origin;
1199 if( isdefined( deathGoal ) )
1201 self SetVehGoalPos( deathGoal,
false );
1208 if( !isdefined(
self ) )
1213 self CancelAIMove();
1214 self ClearVehGoalPos();
1215 self ClearTurretTarget();
1230 self LaunchVehicle( ( RandomFloatRange(-20,20), RandomFloatRange(-20,20), 32 ), (RandomFloatRange(-5,5),RandomFloatRange(-5,5),0),
true,
false );
1231 self playsound (
"exp_metalstorm_vehicle");
1233 self notify(
"crash_done" );
1238 self endon(
"crash_done" );
1240 turn_rate = 5 + RandomFloatRange( 0, 20 );
1242 if( RandomInt( 100 ) > 50 )
1249 while( isdefined(
self ) )
1251 deathGoal =
self.origin + AnglesToForward( (0,
self.angles[1] + turn_rate, 0) ) * 300;
1252 self SetVehGoalPos( deathGoal,
false );
1256 if( count % 10 == 0 )
1258 turn_rate += RandomFloatRange( -10, 10 );
1267 self endon(
"crash_done" );
1268 self endon(
"death" );
1270 self.turretRotScale = 1.3;
1274 pitch = RandomFloatRange( -60, 20 );
1275 target_vec =
self.origin + AnglesToForward( ( pitch, RandomFloat( 360 ), 0 ) ) * 1000;
1277 driver =
self GetSeatOccupant( 0 );
1278 if( !isdefined(driver) )
1280 self SetTargetOrigin( target_vec );
1283 wait RandomFloatRange( 0.3, 0.6 );
1285 if( pitch < 0 && RandomInt( 100 ) > 50 )
1287 self FireWeapon( 1 );
1294 self endon(
"death" );
1295 self notify(
"emped" );
1296 self endon(
"emped" );
1299 PlaySoundAtPosition(
"veh_asd_emp_down",
self.origin );
1300 self.turretRotScale = 0.2;
1302 if( !isdefined(
self.stun_fx) )
1304 self.stun_fx =
Spawn(
"script_model",
self.origin );
1305 self.stun_fx SetModel(
"tag_origin" );
1306 self.stun_fx LinkTo(
self,
"tag_turret", (0,0,0), (0,0,0) );
1307 PlayFXOnTag( level._effect[
"metalstorm_stun" ],
self.stun_fx,
"tag_origin" );
1310 wait RandomFloatRange( 4, 8 );
1312 self.stun_fx
delete();
1314 self.emped = undefined;
1316 self playsound (
"veh_qrdrone_boot_asd");
1319 function MetalStormCallback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName )
1321 is_damaged_by_grenade = weapon.weapClass ==
"grenade";
1322 is_damaged_by_god_rod = weapon.name ==
"god_rod";
1323 if ( is_damaged_by_grenade || is_damaged_by_god_rod )
1325 iDamage = Int( iDamage * 3 );
1328 if( sMeansOfDeath ==
"MOD_GAS" )
1330 iDamage =
self.health + 100;
1333 driver =
self GetSeatOccupant( 0 );
1335 if ( weapon.isEmp && sMeansOfDeath !=
"MOD_IMPACT" )
1337 if( !isdefined(driver) )
1343 if( isdefined( driver ) )
1356 if( isdefined(
self.vehmodelenemy ) )
1358 if( team ==
"allies" )
1360 self SetModel(
self.vehmodel );
1364 self SetModel(
self.vehmodelenemy );
1368 if( !isdefined(
self.off ) )
1376 self endon(
"death" );
1389 self endon(
"death" );
1390 self endon(
"recoil_thread" );
1394 self waittill(
"turret_fire" );
1395 angles =
self GetTagAngles(
"tag_barrel" );
1396 dir = AnglesToForward( angles );
1397 self LaunchVehicle( dir * -5,
self.origin + (0,0,30),
false );
1398 Earthquake( 0.2, 0.2, player.origin, 200 );
1404 self notify(
"recoil_thread" );
1405 self endon(
"recoil_thread" );
1406 self endon(
"death" );
1410 player waittill(
"missile_fire" );
1412 angles =
self GetTagAngles(
"tag_barrel" );
1413 dir = AnglesToForward( angles );
1415 self LaunchVehicle( dir * -30,
self.origin + (0,0,70),
false );
1416 Earthquake( 0.4, 0.3, player.origin, 200 );
1424 self notify(
"recoil_thread" );
1425 self endon(
"recoil_thread" );
1426 self endon(
"death" );
1430 self waittill(
"missile_fire" );
1432 angles =
self GetTagAngles(
"tag_barrel" );
1433 dir = AnglesToForward( angles );
1435 self LaunchVehicle( dir * -30,
self.origin + (0,0,70),
false );
1443 self endon(
"exit_vehicle" );
1444 self endon(
"death" );
1448 self waittill(
"touch", enemy );
1450 if( isdefined( enemy ) && IsAI( enemy ) )
1452 self playsound(
"veh_rts_hit_npc" );