1 #using scripts\codescripts\struct;
3 #using scripts\shared\challenges_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\scoreevents_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\weapons\_heatseekingmissile;
8 #using scripts\shared\weapons\_weaponobjects;
10 #using scripts\mp\gametypes\_battlechatter;
11 #using scripts\mp\_challenges;
12 #using scripts\mp\_util;
13 #using scripts\mp\_vehicle;
14 #using scripts\mp\killstreaks\_airsupport;
15 #using scripts\mp\killstreaks\_dogs;
16 #using scripts\mp\killstreaks\_killstreakrules;
17 #using scripts\mp\killstreaks\_killstreaks;
19 #insert scripts\mp\_hacker_tool.gsh;
20 #insert scripts\shared\shared.gsh;
22 #define STRAFERUN_MAX_HEALTH 1000
24 #precache( "string", "MP_EARNED_STRAFERUN" );
25 #precache( "string", "KILLSTREAK_STRAFERUN_NOT_AVAILABLE" );
26 #precache( "string", "MP_WAR_STRAFERUN_INBOUND" );
27 #precache( "string", "MP_WAR_STRAFERUN_INBOUND_NEAR_YOUR_POSITION" );
28 #precache( "string", "KILLSTREAK_STRAFERUN_HACKED" );
29 #precache( "eventstring", "mpl_killstreak_straferun" );
30 #precache( "fx", "killstreaks/fx_wh_contrail" );
31 #precache( "fx", "killstreaks/fx_vtol_exp" );
37 level.strafeRunNumRockets = 8;
38 level.strafeRunRocketDelay = 0.35;
39 level.strafeRunGunLookahead = 4000;
40 level.strafeRunGunOffset = -800;
41 level.strafeRunGunRadius = 500;
42 level.strafeRunExitUnits = 20000;
43 level.strafeRunMaxStrafes = 6;
44 level.strafeRunFlareDelay = 2;
45 level.strafeRunShellShockDuration = 2.5;
46 level.strafeRunShellShockRadius = 512;
47 level.strafeRunKillsBeforeExit = 10;
48 level.strafeRunNumKillcams = 5;
50 level.strafeRunModel =
"veh_t6_air_a10f";
51 level.strafeRunModelEnemy =
"veh_t6_air_a10f_alt";
52 level.strafeRunVehicle =
"vehicle_straferun_mp";
53 level.strafeRunGunWeapon = GetWeapon(
"straferun_gun" );
54 level.strafeRunGunSound =
"wpn_a10_shot_loop_npc";
55 level.strafeRunRocketWeapon = GetWeapon(
"straferun_rockets" );
56 level.strafeRunRocketTags = [];
57 level.strafeRunRocketTags[0] =
"tag_rocket_left";
58 level.strafeRunRocketTags[1] =
"tag_rocket_right";
59 level.strafeRunContrailFX =
"killstreaks/fx_wh_contrail";
60 level.strafeRunChaffFX =
"killstreaks/fx_wh_chaff_trail";
61 level.strafeRunExplodeFX =
"killstreaks/fx_vtol_exp";
62 level.strafeRunExplodeSound =
"evt_helicopter_midair_exp";
63 level.strafeRunShellShock =
"straferun";
74 createKillcams( level.strafeRunNumKillcams, level.strafeRunNumRockets );
80 soundAlias = level.teamPrefix[
self.team] +
self.pilotVoiceNumber +
"_" + dialog;
82 while( isdefined(
self.owner ) &&
self.owner.pilotisSpeaking )
87 if ( isdefined(
self.owner ) )
89 self.owner playLocalSound(soundAlias);
90 self.owner.pilotisSpeaking =
true;
93 if ( isdefined(
self.owner ) )
95 self.owner.pilotisSpeaking =
false;
104 startNode = GetVehicleNode(
"warthog_start",
"targetname" );
105 if ( !isdefined( startNode ) )
107 /# println(
"ERROR: Strafe run vehicle spline not found!" ); #/
112 if ( killstreak_id == -1 )
119 plane = SpawnVehicle( level.strafeRunVehicle, startNode.origin, (0,0,0),
"straferun" );
121 if( GetDvarInt(
"teamOpsEnabled" ) == 1 )
122 plane.teamops =
true;
124 plane.attackers = [];
125 plane.attackerData = [];
126 plane.attackerDamage = [];
127 plane.flareAttackerDamage = [];
128 plane SetTeam(
self.team );
129 plane SetEnemyModel( level.strafeRunModelEnemy );
130 plane.team =
self.team;
131 plane MakeVehicleUnusable();
133 plane.health = 999999;
134 plane.maxhealth = 999999;
137 plane SetOwner(
self );
141 plane.numStrafes = 0;
142 plane.killstreak_id = killstreak_id;
145 plane.soundMod =
"straferun";
146 plane SetDrawInfrared(
true );
148 if( GetDvarInt(
"teamOpsEnabled" ) == 1 )
150 plane.straferunKills = 0;
151 plane.strafeRunbda = 0;
155 self.straferunKills = 0;
156 self.strafeRunbda = 0;
159 self.pilotisSpeaking =
false;
160 plane.pilotVoiceNumber =
self.bcVoiceNumber + 1;
161 if (plane.pilotVoiceNumber > 3)
163 plane.pilotVoiceNumber = 0;
166 self AddWeaponStat( GetWeapon(
"straferun" ),
"used", 1 );
172 Target_Set( plane, (0,0,0) );
173 Target_SetTurretAquire( plane,
false );
179 plane.gunSoundEntity =
spawn(
"script_model", plane GetTagOrigin(
"tag_flash" ) );
180 plane.gunSoundEntity LinkTo( plane,
"tag_flash", (0,0,0), (0,0,0) );
187 if( GetDvarInt(
"teamOpsEnabled" ) == 0 )
196 if( GetDvarInt(
"teamOpsEnabled" ) == 0 )
204 self endon(
"death" );
207 PlayFXOnTag( level.strafeRunContrailFX,
self,
"tag_origin" );
208 self playloopsound (
"veh_a10_engine_loop", 1);
213 self waittill(
"death" );
217 if( isdefined(
self.gunSoundEntity ) )
219 self.gunSoundEntity StopLoopSound();
220 self.gunSoundEntity Delete();
221 self.gunSoundEntity = undefined;
227 self endon(
"death" );
229 self.maxhealth = 999999;
230 self.health =
self.maxhealth;
238 self waittill(
"damage",
damage, attacker, dir, point, mod, model, tag, part, weapon, flags );
240 if( !isdefined( attacker ) || !isplayer( attacker ) )
244 self.damage_debug = (
damage +
" (" + weapon.name +
")" );
247 if ( mod ==
"MOD_PROJECTILE" || mod ==
"MOD_PROJECTILE_SPLASH" || mod ==
"MOD_EXPLOSIVE" )
252 self.attacker = attacker;
261 if( GetDvarInt(
"teamOpsEnabled" ) == 0 )
280 self endon(
"death" );
284 level waittill(
"killstreak_started", hardpointType, teamName, attacker );
285 if ( !isdefined (
self.owner ) )
291 if ( hardpointType ==
"emp" )
300 else if ( hardpointType ==
"missile_swarm" )
304 self.leaveNextTime =
true;
312 self endon(
"death" );
316 self waittill(
"killed", player );
317 if ( IsPlayer( player ) )
332 self endon(
"death" );
335 self.leaveNextTime =
true;
340 if ( !isdefined(
self.straferunKills ) )
342 self.straferunKills = 0;
344 self.straferunKills++;
349 self endon(
"death" );
355 self waittill(
"noteworthy", noteworthy, noteworthyNode );
356 if ( noteworthy ==
"strafe_start" )
358 self.strafeRunGunLookahead = level.strafeRunGunLookahead;
359 self.strafeRunGunRadius = level.strafeRunGunRadius;
360 self.strafeRunGunOffset = level.strafeRunGunOffset;
363 self.strafeRunGunLookahead = GetDvarInt( #
"scr_straferunlookahead", level.strafeRunGunLookahead );
364 self.strafeRunGunRadius = GetDvarInt( #
"scr_straferunradius", level.strafeRunGunRadius ); ;
365 self.strafeRunGunOffset = GetDvarInt( #
"scr_straferunoffset", level.strafeRunGunOffset ); ;
368 if ( isdefined( noteworthyNode ) )
370 if ( isdefined( noteworthyNode.script_parameters ) )
372 self.strafeRunGunLookahead = float( noteworthyNode.script_parameters );
375 if ( isdefined( noteworthyNode.script_radius ) )
377 self.strafeRunGunRadius = float( noteworthyNode.script_radius );
380 if ( isdefined( noteworthyNode.script_float ) )
382 self.strafeRunGunOffset = float( noteworthyNode.script_float );
385 if( isdefined(
self.owner ) )
390 else if ( noteworthy ==
"strafe_stop" )
395 else if ( noteworthy ==
"strafe_leave" )
415 self endon(
"death" );
416 self endon(
"strafe_start" );
422 chaff_fx =
spawn(
"script_model",
self.origin );
423 chaff_fx.angles = (0,180,0);
424 chaff_fx SetModel(
"tag_origin" );
425 chaff_fx LinkTo(
self ,
"tag_origin", (0,0,0), (0,0,0) );
429 PlayFXOnTag( level.strafeRunChaffFX, chaff_fx,
"tag_origin" );
430 chaff_fx playsound (
"wpn_a10_drop_chaff");
434 wait( level.strafeRunFlareDelay );
440 self endon(
"death" );
441 self endon(
"strafe_stop" );
443 if ( isdefined(
self.strafing ) )
445 IPrintLnBold(
"TRYING TO STRAFE WHEN ALREADY STRAFING!\n" );
448 self.strafing =
true;
454 if (
self.numStrafes == 0 )
466 weaponShootTime = level.strafeRunGunWeapon.fireTime;
469 gunOrigin =
self GetTagOrigin(
"tag_flash" );
470 gunOrigin += ( 0, 0,
self.strafeRunGunOffset );
471 forward = AnglesToForward(
self.angles );
472 forwardNoZ = VectorNormalize( (forward[0],forward[1],0) );
473 right = VectorCross( forwardNoZ, (0,0,1) );
474 perfectAttackStartVector = gunOrigin + VectorScale( forwardNoZ,
self.strafeRunGunLookahead );
475 attackStartVector = perfectAttackStartVector + VectorScale( right, RandomFloatRange( 0-
self.strafeRunGunRadius,
self.strafeRunGunRadius ) );
477 trace = BulletTrace( attackStartVector, (attackStartVector[0],attackStartVector[1],-500),
false,
self,
false,
true );
478 self SetTurretTargetVec(
trace[
"position"] );
484 if ( GetDvarInt( #
"scr_devStrafeRunBulletsDebugDraw", 0 ) )
488 if( count % 30 == 0 )
490 trace = BulletTrace( perfectAttackStartVector, (perfectAttackStartVector[0],perfectAttackStartVector[1],-100000),
false,
self,
false,
true );
491 airsupport::debug_line(
trace[
"position"] + ( 0,0,20 ),
trace[
"position"] - ( 0,0,20 ), (0,0,1), time,
false );
496 wait weaponShootTime;
509 self notify(
"firing_rockets" );
511 self endon(
"death" );
512 self endon(
"strafe_stop" );
513 self endon(
"firing_rockets" );
515 if( GetDvarInt(
"teamOpsEnabled" ) == 0 )
516 self.owner endon(
"disconnect" );
518 forward = anglesToForward(
self.angles );
520 self.firedRocketTargets = [];
522 for ( rocketIndex = 0 ; rocketIndex < level.strafeRunNumRockets ; rocketIndex++ )
524 rocketTag = level.strafeRunRocketTags[rocketIndex%level.strafeRunRocketTags.size];
528 rocketOrigin =
self GetTagOrigin( rocketTag );
529 targetOrigin = rocketOrigin + forward * 10000;
530 if ( targets.size > 0 )
532 selectedTarget = undefined;
533 foreach( target
in targets )
535 alreadyAttacked =
false;
536 foreach( oldTarget
in self.firedRocketTargets )
538 if ( oldTarget == target )
540 alreadyAttacked =
true;
544 if ( !alreadyAttacked )
546 selectedTarget = target;
551 if ( isdefined( selectedTarget ) )
553 self.firedRocketTargets[
self.firedRocketTargets.size] = selectedTarget;
560 rocketOrigin =
self GetTagOrigin( rocketTag );
562 rocket = MagicBullet( level.strafeRunRocketWeapon, rocketOrigin, rocketOrigin + forward,
self.owner );
563 if( GetDvarInt(
"teamOpsEnabled" ) == 1 )
564 rocket.teamops =
true;
566 if ( isdefined( selectedTarget ) )
568 rocket missile_settarget( selectedTarget, (0,0,0) );
570 rocket.soundMod =
"straferun";
572 rocket
attachKillcamToRocket( level.strafeRunKillcams.rockets[rocketIndex], selectedTarget, targetOrigin );
575 if ( GetDvarInt( #
"scr_devStrafeRunKillcamsDebugDraw", 0 ) )
579 wait level.strafeRunRocketDelay;
585 self notify(
"strafe_stop" );
587 self.strafing = undefined;
592 self ClearTurretTarget();
594 if( GetDvarInt(
"teamOpsEnabled" ) == 1 )
599 if( !isdefined( owner ) )
605 if( GetDvarInt(
"teamOpsEnabled" ) == 0 )
607 if (owner.strafeRunbda == 0)
609 bdaDialog =
"kls_killn";
611 if (owner.strafeRunbda == 1)
613 bdaDialog =
"kls_kill1";
615 if (owner.strafeRunbda == 2)
617 bdaDialog =
"kls_kill2";
619 if (owner.strafeRunbda == 3)
621 bdaDialog =
"kls_kill3";
623 if (owner.strafeRunbda > 3)
625 bdaDialog =
"kls_killm";
628 if (isdefined(bdaDialog))
635 owner.strafeRunbda = 0;
637 self.gunSoundEntity StopLoopSound();
638 self.gunSoundEntity playsound (
"wpn_a10_shot_decay_npc");
644 self endon(
"death" );
650 if( GetDvarInt(
"teamOpsEnabled" ) == 0 )
656 if ( isdefined(
self.leaveNextTime ) &&
self.leaveNextTime )
664 if (
self.numStrafes >= level.strafeRunMaxStrafes )
669 if( GetDvarInt(
"teamOpsEnabled" ) == 1)
671 if(
self.straferunKills >= level.strafeRunKillsBeforeExit )
678 if(
self.owner.straferunKills >= level.strafeRunKillsBeforeExit )
691 exitOrigin =
self.origin + VectorScale( AnglesToForward(
self.angles ), level.strafeRunExitUnits );
695 self SetYawSpeed( 5, 999, 999 );
696 self SetVehGoalPos( exitOrigin, 1 );
699 if ( isdefined (
self ) )
707 self endon(
"delete" );
709 forward = (
self.origin + ( 0, 0, 100 ) ) -
self.origin;
710 PlayFX( level.strafeRunExplodeFX,
self.origin, forward );
713 self PlaySound( level.strafeRunExplodeSound );
717 if ( IsDefined(
self ) )
730 heli_centroid =
self.origin + ( 0, 0, -160 );
731 heli_forward_norm = anglestoforward(
self.angles );
732 heli_turret_point = heli_centroid + 144*heli_forward_norm;
734 visible_amount = entity sightConeTrace( heli_turret_point,
self );
736 if ( visible_amount < level.heli_target_recognition )
746 if ( !IsAlive( player ) || player.sessionstate !=
"playing" )
751 if ( player ==
self.owner )
761 if ( !isdefined( player.team ) )
766 if ( level.teamBased && player.team ==
self.team )
771 if ( player.team ==
"spectator" )
776 if ( isdefined( player.spawntime ) && ( GetTime() - player.spawntime )/1000 <= level.heli_target_spawnprotection )
786 if ( player IsInMoveMode(
"noclip" ))
796 if ( !isdefined( actor ) )
801 if ( level.teamBased && ( actor.team ==
self.team ) )
806 if ( isdefined( actor.script_owner ) &&
self.owner == actor.script_owner )
821 forward_dir = AnglesToForward(
self.angles);
822 target_delta = VectorNormalize( target.origin -
self.origin );
823 dot = VectorDot( forward_dir, target_delta );
835 foreach( player
in level.players )
839 if( isdefined( player ) )
840 targets[targets.size] = player;
847 foreach( dog
in dogs )
851 targets[targets.size] = dog;
855 tanks = GetEntArray(
"talon",
"targetname" );
857 foreach( tank
in tanks )
861 targets[targets.size] = tank;
870 target_velocity = target GetVelocity();
873 missile_speed = 7000;
875 target_delta = target.origin - rocket_start;
877 target_dist = Length( target_delta );
879 time_to_target = target_dist / missile_speed;
881 return target.origin + target_velocity * time_to_target;
886 foreach( player
in level.players )
888 if ( !IsAlive( player ) )
893 if ( player ==
self.owner )
898 if ( !isdefined( player.team ) )
903 if ( level.teamBased && player.team ==
self.team )
908 if ( DistanceSquared( player.origin, origin ) <= level.strafeRunShellShockRadius * level.strafeRunShellShockRadius )
917 self endon(
"disconnect" );
919 if ( isdefined(
self.beingStrafeRunShellShocked ) &&
self.beingStrafeRunShellShocked )
924 self.beingStrafeRunShellShocked =
true;
926 self ShellShock( level.strafeRunShellShock, level.strafeRunShellShockDuration );
927 wait( level.strafeRunShellShockDuration + 1 );
929 self.beingStrafeRunShellShocked =
false;
935 if ( !isdefined(level.strafeRunKillcams) )
937 level.strafeRunKillcams = SpawnStruct();
939 level.strafeRunKillcams.rockets = [];
940 for ( i = 0; i < numRockets; i++ )
942 level.strafeRunKillcams.rockets[level.strafeRunKillcams.rockets.size] =
createKillcamEnt( );
945 level.strafeRunKillcams.strafes = [];
946 for ( i = 0; i < numKillcams; i++ )
948 level.strafeRunKillcams.strafes[level.strafeRunKillcams.strafes.size] =
createKillcamEnt( );
950 if ( GetDvarInt( #
"scr_devStrafeRunKillcamsDebugDraw", 0 ) )
960 self endon(
"death" );
962 if ( isdefined( time ) )
965 for ( i = 0; i < level.strafeRunKillcams.rockets.size; i++ )
970 for ( i = 0; i < level.strafeRunKillcams.strafes.size; i++ )
978 for ( i = 0; i < level.strafeRunKillcams.rockets.size; i++ )
980 level.strafeRunKillcams.rockets[i] unlink();
983 for ( i = 0; i < level.strafeRunKillcams.strafes.size; i++ )
985 level.strafeRunKillcams.strafes[i] unlink();
991 killCamEnt =
spawn(
"script_model", (0,0,0) );
994 killCamEnt SetFOVForKillcam( 25 );
1001 self notify(
"reset" );
1002 parent endon(
"death" );
1004 offset_x = GetDvarInt( #
"scr_killcamplaneoffsetx", -3000 );
1005 offset_y = GetDvarInt( #
"scr_killcamplaneoffsety", 0 );
1006 offset_z = GetDvarInt( #
"scr_killcamplaneoffsetz", 740 );
1008 self linkto( parent,
"tag_origin", (offset_x, offset_y, offset_z), (10,0,0) );
1014 self notify(
"reset" );
1015 parent endon(
"death" );
1017 offset_x = GetDvarInt( #
"scr_killcamplaneoffsetx", -3000 );
1018 offset_y = GetDvarInt( #
"scr_killcamplaneoffsety", 0 );
1019 offset_z = GetDvarInt( #
"scr_killcamplaneoffsetz", 740 );
1021 rocketTag = level.strafeRunRocketTags[rocketIndex%level.strafeRunRocketTags.size];
1023 self linkto( parent, rocketTag, (offset_x, offset_y, offset_z), (10,0,0) );
1029 parent waittill(
"death");
1036 self endon(
"reset");
1037 self endon(
"unlink");
1039 parent waittill(
"death");
1046 offset_x = GetDvarInt( #
"scr_killcamrocketoffsetx", -400 );
1047 offset_y = GetDvarInt( #
"scr_killcamrocketoffsety", 0 );
1048 offset_z = GetDvarInt( #
"scr_killcamrocketoffsetz", 110 );
1050 self.killCamEnt = killCamEnt;
1052 forward = VectorScale( AnglesToForward(
self.angles ), offset_x );
1053 right = VectorScale( AnglesToRight(
self.angles ), offset_y );
1054 up = VectorScale( AnglesToUp(
self.angles ), offset_z );
1056 killCamEnt unlink();
1057 killCamEnt.angles = (0,0,0);
1058 killCamEnt.origin =
self.origin;
1060 killCamEnt linkto(
self,
"", (offset_x,offset_y,offset_z), (9, 0, 0) );
1067 plane endon(
"death" );
1068 self notify(
"unlink_when_close" );
1069 self endon(
"unlink_when_close" );
1071 distSqr = 1000 * 1000;
1075 if ( isdefined( selectedTarget ) )
1077 if ( DistanceSquared(
self.origin, selectedTarget.origin ) < distSqr )
1080 self.angles = (0,0,0);
1086 if ( DistanceSquared(
self.origin, targetOrigin ) < distSqr )
1089 self.angles = (0,0,0);
1099 delta = next_origin - previous_origin;
1100 forwardNoZ = VectorNormalize( (delta[0],delta[1],0) );
1101 origin = next_origin + VectorScale( forwardNoZ, lookAhead );
1107 parent endon(
"death");
1108 self endon(
"reset" );
1113 self notify(
"unlink" );
1115 self.angles = (0,0,0);
1120 start_height_offset = -800;
1121 stop_height = level.mapCenter[2] - 500;
1124 start_origin = start_origin_struct.origin;
1125 node = start_origin_struct.node;
1127 previous_origin =
self.origin;
1129 start_origin =
getLookaheadOrigin( previous_origin, start_origin, parent.strafeRunGunLookahead + 1000);
1131 trace = BulletTrace( (start_origin[0], start_origin[1], start_origin[2] + start_height_offset), (start_origin[0], start_origin[1], stop_height),
false, parent,
false,
true );
1133 pathHeight =
trace[
"position"][2];
1139 while( isdefined(node) )
1141 previous_origin = node.origin;
1142 node = GetVehicleNode( node.target,
"targetname" );
1144 start_origin =
getLookaheadOrigin( previous_origin, node.origin, parent.strafeRunGunLookahead + 1000 );
1146 trace = BulletTrace( (start_origin[0], start_origin[1], start_origin[2] + start_height_offset), (start_origin[0], start_origin[1], stop_height),
false, parent,
false,
true );
1153 self endon(
"reset" );
1155 height_offset = RandomIntRange(350,450);
1156 origin = (goal[0], goal[1], goal[2] + height_offset );
1157 dist = Distance( origin,
self.origin );
1158 time = dist / speed ;
1163 self MoveTo( origin, time, accel, 0 );
1164 self waittill(
"movedone" );
1169 node = GetVehicleNode(
self.currentNode.target,
"targetname" );
1172 strafe_increment = strafe_dist / (level.strafeRunKillcams.strafes.size + 1);
1175 for ( i = 0; i < level.strafeRunKillcams.strafes.size; i++ )
1177 level.strafeRunKillcams.strafes[i] thread
strafeKillcam(
self, node, current_dist );
1178 current_dist += strafe_increment;
1185 previous_node = node;
1186 next_node = GetVehicleNode( previous_node.target,
"targetname" );
1192 while ( (!isdefined(previous_node.script_noteworthy) || previous_node.script_noteworthy !=
"strafe_stop") && next_node != node )
1194 dist += Distance( (previous_node.origin[0], previous_node.origin[1], 0) , ( next_node.origin[0], next_node.origin[1], 0 ) );
1196 previous_node = next_node;
1197 next_node = GetVehicleNode( previous_node.target,
"targetname" );
1205 origin_node = SpawnStruct();
1212 seg_dist = Distance( (start_origin[0], start_origin[1], 0) , ( node.origin[0], node.origin[1], 0 ) );
1216 if ( (dist + seg_dist) > distance_along )
1218 forwardVec = VectorNormalize( ( node.origin[0], node.origin[1], 0 ) - (start_origin[0], start_origin[1], 0) );
1219 origin_node.origin = start_origin + forwardVec * ( distance_along - dist );
1220 origin_node.node = node;
1226 previous_node = node;
1227 next_node = GetVehicleNode( previous_node.target,
"targetname" );
1229 while ( (!isdefined(previous_node.script_noteworthy) || previous_node.script_noteworthy !=
"strafe_stop") && next_node != node )
1231 seg_dist = Distance( (previous_node.origin[0], previous_node.origin[1], 0) , ( next_node.origin[0], next_node.origin[1], 0 ) );
1233 if ( (dist + seg_dist) > distance_along )
1235 forwardVec = VectorNormalize( next_node.origin - previous_node.origin );
1236 origin_node.origin = previous_node.origin + forwardVec * ( distance_along - dist );
1237 origin_node.node = previous_node;
1242 previous_node = next_node;
1243 next_node = GetVehicleNode( previous_node.target,
"targetname" );