Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.38 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include common_scripts\utility;
  3.  
  4. /*******************************************************************
  5. // _littleBird.gsc
  6. //
  7. // Holds all the littlebird specific functions
  8. //
  9. // Jordan Hirsh Jan. 6th 2009
  10. ********************************************************************/
  11.  
  12.  
  13. init()
  14. {
  15. precacheString( &"MP_CIVILIAN_AIR_TRAFFIC" );
  16. precacheString( &"MP_AIR_SPACE_TOO_CROWDED" );
  17.  
  18. return;
  19. //precacheString( &"MP_WAR_AIRSTRIKE_INBOUND_NEAR_YOUR_POSITION" );
  20. //precacheString( &"MP_WAR_AIRSTRIKE_INBOUND" );
  21.  
  22. //precacheTurret( "minigun_littlebird_mp" );
  23. //precacheModel( "vehicle_little_bird_minigun_left" );
  24. //precacheModel( "vehicle_little_bird_minigun_right" );
  25.  
  26. //level.attackLB = [];
  27. //level.lbStrike = 0;
  28.  
  29. //level.killStreakFuncs["littlebird_support"] = ::tryUseLbStrike;
  30. }
  31.  
  32.  
  33. tryUseLbStrike( lifeId )
  34. {
  35. if ( isDefined( level.civilianJetFlyBy ) )
  36. {
  37. self iPrintLnBold( &"MP_CIVILIAN_AIR_TRAFFIC" );
  38. return false;
  39. }
  40.  
  41. if ( self isUsingRemote() )
  42. {
  43. return false;
  44. }
  45.  
  46. if ( level.lbStrike >= 1 )
  47. {
  48. self iPrintLnBold( &"MP_AIR_SPACE_TOO_CROWDED" );
  49. return false;
  50. }
  51.  
  52. result = self selectLbStrikeLocation( lifeId );
  53.  
  54. if ( !isDefined( result ) || !result )
  55. return false;
  56.  
  57. level.lbStrike++;
  58. return true;
  59. }
  60.  
  61.  
  62. startLBStrike( lifeId, origin, owner, team, yawDir )
  63. {
  64. while ( isDefined( level.airstrikeInProgress ) )
  65. {
  66. level waittill ( "begin_airstrike" );
  67. }
  68.  
  69. level.airstrikeInProgress = true;
  70.  
  71. num = 17 + randomint(3);
  72. trace = bullettrace(origin, origin + (0,0,-1000000), false, undefined);
  73. targetpos = trace["position"];
  74.  
  75. //yaw = getBestLbDirection( targetpos );
  76.  
  77. //yaw = 90;
  78. yaw = yawDir;
  79.  
  80. if ( level.teambased )
  81. {
  82. players = level.players;
  83.  
  84. for ( i = 0; i < level.players.size; i++ )
  85. {
  86. player = level.players[i];
  87. playerteam = player.pers["team"];
  88. if ( isdefined( playerteam ) )
  89. {
  90. if ( playerteam == team )
  91. player iprintln( &"MP_WAR_AIRSTRIKE_INBOUND", owner );
  92. }
  93. }
  94. }
  95.  
  96. // buffer between airstrikes
  97. level.airstrikeInProgress = undefined;
  98.  
  99. owner notify ( "begin_airstrike" );
  100. level notify ( "begin_airstrike" );
  101.  
  102. if ( !isDefined( owner ) )
  103. return;
  104.  
  105. callStrike( lifeId, owner, targetpos, yaw );
  106. }
  107.  
  108.  
  109. clearProgress( delay )
  110. {
  111. if( !isDefined( delay ) )
  112. delay = 0;
  113.  
  114. wait ( delay );
  115. level.lbStrike = 0;
  116. }
  117.  
  118.  
  119. doLbStrike( lifeId, owner, requiredDeathCount, coord, startPoint, endPoint, direction )
  120. {
  121. self endon( "death" );
  122.  
  123. if ( !isDefined( owner ) )
  124. return;
  125.  
  126. lb = spawnAttackLittleBird( owner, startPoint, endPoint, coord );
  127. lb.lifeId = lifeId;
  128.  
  129. lb thread watchDeath();
  130. lb thread waitTillGone();
  131.  
  132. lb endon( "death" );
  133.  
  134. totalDist = Distance2d( startPoint, coord );
  135. midTime = ( totalDist / lb.speed ) / 2 * .1 + 2.5;
  136.  
  137. assert ( isDefined( lb ) );
  138.  
  139. lb SetMaxPitchRoll( 45, 45 );
  140. //moving to end point
  141. lb setVehGoalPos( endPoint, 1 );
  142. wait( midTime - 1 );
  143.  
  144. //slowing down and firing
  145. lb Vehicle_SetSpeed( 45, 60 );
  146. wait( 1 );
  147. lb SetMaxPitchRoll( 200, 200 );
  148. wait ( 5 );
  149. lb thread startLbFiring();
  150. wait ( 7 );
  151.  
  152. //stops firing and turns around
  153. lb notify ( "stopFiring" );
  154. lb Vehicle_SetSpeed( 75, 60 );
  155. lb SetMaxPitchRoll( 65, 65 );
  156. wait(2.5);
  157. lb setVehGoalPos( startPoint, 1 );
  158. wait ( 4 );
  159. lb SetMaxPitchRoll( 180, 180 );
  160. wait ( .75 );
  161.  
  162. //slows down firing opposite direction
  163. lb Vehicle_SetSpeed( 45, 60 );
  164. lb thread startLbFiring();
  165. wait ( 6 );
  166.  
  167. //off into the sunset
  168. lb Vehicle_SetSpeed( lb.speed, 60 );
  169. lb notify ( "stopFiring" );
  170. lb SetMaxPitchRoll( 75, 180 );
  171.  
  172. lb waittill ( "goal" );
  173. lb notify( "gone" );
  174. lb delete();
  175.  
  176. }
  177.  
  178. waitTillGone()
  179. {
  180. self waittill( "gone" );
  181. clearProgress( 0 );
  182. }
  183.  
  184.  
  185. // spawn helicopter at a start node and monitors it
  186. spawnAttackLittleBird( owner, pathStart, pathGoal, coord )
  187. {
  188.  
  189. forward = vectorToAngles( pathGoal - pathStart );
  190. lb = spawnHelicopter( owner, pathStart, forward, "littlebird_mp" , "vehicle_little_bird_armed" );
  191.  
  192. if ( !isDefined( lb ) )
  193. return;
  194. lb.speed = 400;
  195. lb.health = 350;
  196. lb setCanDamage( true );
  197. lb.owner = owner;
  198. lb.team = owner.team;
  199. lb SetMaxPitchRoll( 45, 45 );
  200. lb Vehicle_SetSpeed( lb.speed, 60 );
  201.  
  202. lb.damageCallback = ::Callback_VehicleDamage;
  203.  
  204. mgTurret1 = spawnTurret( "misc_turret", lb.origin, "minigun_littlebird_mp" );
  205. mgTurret1 linkTo( lb, "tag_minigun_attach_right", (0,0,0), (0,0,0) );
  206. mgTurret1 setModel( "vehicle_little_bird_minigun_right" );
  207. mgTurret1.angles = lb.angles;
  208. mgTurret1.owner = lb.owner;
  209. mgTurret1.team = mgTurret1.owner.team;
  210.  
  211. mgTurret1 SetPlayerSpread( .65 );
  212. mgTurret1 makeTurretInoperable();
  213. lb.mgTurret1 = mgTurret1;
  214. lb.mgTurret1 SetDefaultDropPitch( 0 );
  215.  
  216. mgTurret2 = spawnTurret( "misc_turret", lb.origin, "minigun_littlebird_mp" );
  217. mgTurret2 linkTo( lb, "tag_minigun_attach_left", (0,0,0), (0,0,0) );
  218. mgTurret2 setModel( "vehicle_little_bird_minigun_right" );
  219. mgTurret2 SetPlayerSpread( .65 );
  220. mgTurret2.angles = lb.angles;
  221. mgTurret2.owner = lb.owner;
  222. mgTurret2.team = mgTurret2.owner.team;
  223.  
  224. mgTurret2 makeTurretInoperable();
  225. lb.mgTurret2 = mgTurret2;
  226. lb.mgTurret2 SetDefaultDropPitch( 0 );
  227.  
  228. level.littlebird[level.littlebird.size] = lb;
  229.  
  230. return lb;
  231. }
  232.  
  233. startLbFiring( )
  234. {
  235. self endon( "gone" );
  236. self endon( "death" );
  237. self endon( "stopFiring" );
  238.  
  239. i = 0;
  240.  
  241. for( ;; )
  242. {
  243. self.mgTurret1 ShootTurret();
  244. self.mgTurret2 ShootTurret();
  245. wait ( 0.05 );
  246. }
  247. }
  248.  
  249. getBestLbDirection( hitpos )
  250. {
  251. //if ( !self.precisionAirstrike )
  252. // return randomFloat( 360 );
  253.  
  254. checkPitch = -25;
  255.  
  256. numChecks = 15;
  257.  
  258. startpos = hitpos + (0,0,64);
  259.  
  260. bestangle = randomfloat( 360 );
  261. bestanglefrac = 0;
  262.  
  263. fullTraceResults = [];
  264.  
  265. for ( i = 0; i < numChecks; i++ )
  266. {
  267. yaw = ((i * 1.0 + randomfloat(1)) / numChecks) * 360.0;
  268. angle = (checkPitch, yaw + 180, 0);
  269. dir = anglesToForward( angle );
  270.  
  271. endpos = startpos + dir * 1500;
  272.  
  273. trace = bullettrace( startpos, endpos, false, undefined );
  274.  
  275. if ( trace["fraction"] > bestanglefrac )
  276. {
  277. bestanglefrac = trace["fraction"];
  278. bestangle = yaw;
  279.  
  280. if ( trace["fraction"] >= 1 )
  281. fullTraceResults[ fullTraceResults.size ] = yaw;
  282. }
  283.  
  284. if ( i % 3 == 0 )
  285. wait .05;
  286. }
  287.  
  288. if ( fullTraceResults.size > 0 )
  289. return fullTraceResults[ randomint( fullTraceResults.size ) ];
  290.  
  291. return bestangle;
  292. }
  293.  
  294.  
  295. callStrike( lifeId, owner, coord, yaw )
  296. {
  297. // Get starting and ending point for the plane
  298. direction = ( 0, yaw, 0 );
  299. planeHalfDistance = 24000;
  300. planeFlyHeight = 850;
  301. planeFlySpeed = 7000;
  302.  
  303. if ( isdefined( level.airstrikeHeightScale ) )
  304. planeFlyHeight *= level.airstrikeHeightScale;
  305.  
  306. startPoint = coord + vector_multiply( anglestoforward( direction ), -1 * planeHalfDistance );
  307. startPoint += ( 0, 0, planeFlyHeight );
  308.  
  309. endPoint = coord + vector_multiply( anglestoforward( direction ), planeHalfDistance );
  310. endPoint += ( 0, 0, planeFlyHeight );
  311.  
  312. owner endon("disconnect");
  313.  
  314. requiredDeathCount = owner.lifeId;
  315.  
  316. level thread doLbStrike( lifeId, owner, requiredDeathCount, coord, startPoint, endPoint, direction );
  317.  
  318. }
  319.  
  320.  
  321. waitForLbStrikeCancel()
  322. {
  323. self waittill( "cancel_location" );
  324. self setblurforplayer( 0, 0.3 );
  325. }
  326.  
  327.  
  328. selectLbStrikeLocation( lifeId )
  329. {
  330. self setClientDvar( "ui_selecting_location", "1");
  331. self beginLocationSelection( "map_artillery_selector", true, 500 );
  332. self.selectingLocation = true;
  333.  
  334. self setblurforplayer( 10.3, 0.3 );
  335. self thread waitForLbStrikeCancel();
  336.  
  337. self thread endSelectionOn( "cancel_location" );
  338. self thread endSelectionOn( "death" );
  339. self thread endSelectionOn( "disconnect" );
  340. self thread endSelectionOn( "used" );
  341. self thread endSelectionOnGameEnd();
  342.  
  343. self endon( "stop_location_selection" );
  344.  
  345. // wait for the selection. randomize the yaw if we ever stop doing a precision selection
  346. self waittill( "confirm_location", location, locationYaw);
  347.  
  348. self setblurforplayer( 0, 0.3 );
  349.  
  350. self thread finishLbStrikeUsage( lifeId, location, ::useLbStrike, locationYaw );
  351. return true;
  352. }
  353.  
  354.  
  355. finishLbStrikeUsage( lifeId, location, usedCallback, locationYaw )
  356. {
  357. self notify( "used" );
  358. wait ( 0.05 );
  359. self thread stopLbStrikeLocationSelection( false );
  360. self thread [[usedCallback]]( lifeId, location, locationYaw );
  361. return true;
  362. }
  363.  
  364.  
  365. endSelectionOn( waitfor )
  366. {
  367. self endon( "stop_location_selection" );
  368. self waittill( waitfor );
  369. self thread stopLbStrikeLocationSelection( (waitfor == "disconnect") );
  370. }
  371.  
  372.  
  373. endSelectionOnGameEnd()
  374. {
  375. self endon( "stop_location_selection" );
  376. level waittill( "game_ended" );
  377. self thread stopLbStrikeLocationSelection( false );
  378. }
  379.  
  380.  
  381. stopLbStrikeLocationSelection( disconnected )
  382. {
  383. if ( !disconnected )
  384. {
  385. self setblurforplayer( 0, 0.3 );
  386. self endLocationSelection();
  387. self.selectingLocation = undefined;
  388. }
  389. self notify( "stop_location_selection" );
  390. }
  391.  
  392. useLbStrike( lifeId, pos, yawDir )
  393. {
  394. // find underside of top of skybox
  395. trace = bullettrace( level.mapCenter + (0,0,1000000), level.mapCenter, false, undefined );
  396. pos = (pos[0], pos[1], trace["position"][2] - 514);
  397.  
  398. thread startLBStrike( lifeId, pos, self, self.pers["team"], yawDir );
  399. }
  400.  
  401. Callback_VehicleDamage( inflictor, attacker, damage, dFlags, meansOfDeath, weapon, point, dir, hitLoc, timeOffset, modelIndex, partName )
  402. {
  403. if ( ( attacker == self || ( isDefined( attacker.pers ) && attacker.pers["team"] == self.team ) ) && ( attacker != self.owner || meansOfDeath == "MOD_MELEE" ) )
  404. return;
  405.  
  406.  
  407. self Vehicle_FinishDamage( inflictor, attacker, damage, dFlags, meansOfDeath, weapon, point, dir, hitLoc, timeOffset, modelIndex, partName );
  408. }
  409.  
  410. watchDeath()
  411. {
  412. self endon( "gone" );
  413.  
  414. self waittill( "death" );
  415. self thread heliDestroyed();
  416.  
  417. level.littleBirds--;
  418. clearProgress( 0.05 );
  419.  
  420. return;
  421. }
  422.  
  423. heliDestroyed()
  424. {
  425. self endon( "gone" );
  426.  
  427. if (! isDefined(self) )
  428. return;
  429.  
  430. //self trimActiveBirdList();
  431. self Vehicle_SetSpeed( 25, 5 );
  432. self thread lbSpin( RandomIntRange(180, 220) );
  433.  
  434. wait( RandomFloatRange( .5, 1.5 ) );
  435.  
  436. lbExplode();
  437. }
  438.  
  439. lbExplode()
  440. {
  441. forward = ( self.origin + ( 0, 0, 1 ) ) - self.origin;
  442. playfx ( level.chopper_fx["explode"]["air_death"], self.origin, forward );
  443.  
  444. deathAngles = self getTagAngles( "tag_deathfx" );
  445. playFx( level.chopper_fx["explode"]["air_death"]["littlebird"], self getTagOrigin( "tag_deathfx" ), anglesToForward( deathAngles ), anglesToUp( deathAngles ) );
  446.  
  447. self playSound( "cobra_helicopter_crash" );
  448. self notify ( "explode" );
  449.  
  450. if ( isDefined( self.mgTurret1 ) )
  451. self.mgTurret1 delete();
  452.  
  453. if ( isDefined( self.mgTurret2 ) )
  454. self.mgTurret2 delete();
  455.  
  456. self clearProgress( 0 );
  457.  
  458. self delete();
  459. }
  460.  
  461. lbSpin( speed )
  462. {
  463. self endon( "explode" );
  464.  
  465. // tail explosion that caused the spinning
  466. playfxontag( level.chopper_fx["explode"]["medium"], self, "tail_rotor_jnt" );
  467. self thread trail_fx( level.chopper_fx["smoke"]["trail"], "tail_rotor_jnt", "stop tail smoke" );
  468.  
  469. self setyawspeed( speed, speed, speed );
  470. while ( isdefined( self ) )
  471. {
  472. self settargetyaw( self.angles[1]+(speed*0.9) );
  473. wait ( 1 );
  474. }
  475. }
  476.  
  477. trail_fx( trail_fx, trail_tag, stop_notify )
  478. {
  479. // only one instance allowed
  480. self notify( stop_notify );
  481. self endon( stop_notify );
  482. self endon( "death" );
  483.  
  484. for ( ;; )
  485. {
  486. playfxontag( trail_fx, self, trail_tag );
  487. wait( 0.05 );
  488. }
  489. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement