Guest User

Untitled

a guest
Mar 31st, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.34 KB | None | 0 0
  1. #include maps\_utility;
  2. #include maps\_hud_util;
  3.  
  4. init()
  5. {
  6. PrecacheItem( "syrette" );
  7. PrecacheItem( "colt_dirty_harry" );
  8. precachestring( &"GAME_BUTTON_TO_REVIVE_PLAYER" );
  9. precachestring( &"GAME_PLAYER_NEEDS_TO_BE_REVIVED" );
  10. precachestring( &"GAME_PLAYER_IS_REVIVING_YOU" );
  11. precachestring( &"GAME_REVIVING" );
  12.  
  13. if( !IsDefined( level.laststandpistol ) )
  14. {
  15. level.laststandpistol = "colt";
  16. PrecacheItem( level.laststandpistol );
  17. }
  18.  
  19. //CODER_MOD: TOMMYK 07/13/2008 - Revive text
  20. if( !arcadeMode() )
  21. {
  22. level thread revive_hud_think();
  23. }
  24.  
  25. level.primaryProgressBarX = 0;
  26. level.primaryProgressBarY = 110;
  27. level.primaryProgressBarHeight = 4;
  28. level.primaryProgressBarWidth = 120;
  29.  
  30. if ( IsSplitScreen() )
  31. {
  32. level.primaryProgressBarY = 280;
  33. }
  34.  
  35. if( GetDvar( "revive_trigger_radius" ) == "" )
  36. {
  37. SetDvar( "revive_trigger_radius", "40" );
  38. }
  39. }
  40.  
  41.  
  42. player_is_in_laststand()
  43. {
  44. return ( IsDefined( self.revivetrigger ) );
  45. }
  46.  
  47.  
  48. player_num_in_laststand()
  49. {
  50. num = 0;
  51. players = get_players();
  52.  
  53. for ( i = 0; i < players.size; i++ )
  54. {
  55. if ( players[i] player_is_in_laststand() )
  56. num++;
  57. }
  58.  
  59. return num;
  60. }
  61.  
  62.  
  63. player_all_players_in_laststand()
  64. {
  65. return ( player_num_in_laststand() == get_players().size );
  66. }
  67.  
  68.  
  69. player_any_player_in_laststand()
  70. {
  71. return ( player_num_in_laststand() > 0 );
  72. }
  73.  
  74.  
  75. PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
  76. {
  77. if( sMeansOfDeath == "MOD_CRUSH" ) // if getting run over by a tank then kill the guy even if in laststand
  78. {
  79. if( self player_is_in_laststand() )
  80. {
  81. self mission_failed_during_laststand( self );
  82. }
  83. return;
  84. }
  85.  
  86. if( self player_is_in_laststand() )
  87. {
  88. return;
  89. }
  90.  
  91. //CODER_MOD: TOMMYK 06/26/2008 - For coop scoreboards
  92. self.downs++;
  93. //stat tracking
  94. self.stats["downs"] = self.downs;
  95. dvarName = "player" + self GetEntityNumber() + "downs";
  96. setdvar( dvarName, self.downs );
  97.  
  98. //PI CHANGE: player shouldn't be able to jump while in last stand mode (only was a problem in water) - specifically disallow this
  99. if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf")
  100. self AllowJump(false);
  101. //END PI CHANGE
  102. if( IsDefined( level.playerlaststand_func ) )
  103. {
  104. // [[level.playerlaststand_func]]();
  105. }
  106. //CODER_MOD: Jay (6/18/2008): callback to challenge system
  107. maps\_challenges_coop::doMissionCallback( "playerDied", self );
  108.  
  109. if ( !laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc ) )
  110. {
  111. self mission_failed_during_laststand( self );
  112. return;
  113. }
  114.  
  115. // check for all players being in last stand
  116. if ( player_all_players_in_laststand() )
  117. {
  118. // self mission_failed_during_laststand( self );
  119. // return;
  120. }
  121.  
  122. // vision set
  123. self VisionSetLastStand( "laststand", 1 );
  124.  
  125. self.health = 1;
  126.  
  127. self thread maps\_arcademode::arcadeMode_player_laststand();
  128.  
  129. // revive trigger
  130. self revive_trigger_spawn();
  131. // laststand weapons
  132. self laststand_take_player_weapons();
  133. self laststand_give_pistol();
  134. self thread laststand_give_grenade();
  135.  
  136. // AI
  137. self.ignoreme = true;
  138.  
  139. // bleed out timer
  140. // if ( !self hasPerk( "specialty_shades" ) )
  141. self thread laststand_bleedout( GetDvarFloat( "player_lastStandBleedoutTime" ) );
  142.  
  143. self notify( "player_downed" );
  144. }
  145.  
  146. PlayerLastStand2( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
  147. {
  148. self unlink();
  149. if( sMeansOfDeath == "MOD_CRUSH" ) // if getting run over by a tank then kill the guy even if in laststand
  150. {
  151. if( self player_is_in_laststand() )
  152. {
  153. self mission_failed_during_laststand( self );
  154. }
  155. return;
  156. }
  157.  
  158. if( self player_is_in_laststand() )
  159. {
  160. return;
  161. }
  162.  
  163. //CODER_MOD: TOMMYK 06/26/2008 - For coop scoreboards
  164. self.downs++;
  165. //stat tracking
  166. self.stats["downs"] = self.downs;
  167. dvarName = "player" + self GetEntityNumber() + "downs";
  168. setdvar( dvarName, self.downs );
  169.  
  170. //CODER_MOD: Jay (6/18/2008): callback to challenge system
  171. // maps\_challenges_coop::doMissionCallback( "playerDied", self );
  172.  
  173. if ( !laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc ) )
  174. {
  175. self mission_failed_during_laststand( self );
  176. return;
  177. }
  178.  
  179. // self.health = 1;
  180.  
  181. self thread maps\_arcademode::arcadeMode_player_laststand();
  182.  
  183. // AI
  184. self.ignoreme = true;
  185. self revive_trigger_spawn();
  186.  
  187. // if( IsDefined( level.fake_death_override_func ) )
  188. // {
  189. // self [[ level.fake_death_override_func ]]();
  190. // }
  191.  
  192. /*
  193. if ( !isDefined( self.whos_who_active ) && !isDefined( self.tombstone_last_stand ) || !isDefined( self.revive_last_stand ) )
  194. {
  195. self thread laststand_bleedout( GetDvarFloat( "player_lastStandBleedoutTime" ) );
  196. self laststand_give_pistol();
  197. self thread laststand_give_grenade();
  198. self VisionSetLastStand( "laststand", 1 );
  199. }
  200. */
  201. // check for all players being in last stand
  202. if ( player_all_players_in_laststand() )
  203. {
  204. self mission_failed_during_laststand( self );
  205. return;
  206. }
  207.  
  208. self notify( "player_downed" );
  209. }
  210.  
  211.  
  212. laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc )
  213. {
  214. //MOD TK, loads of stuff will now send u into laststand
  215. if ( sMeansOfDeath != "MOD_PISTOL_BULLET"
  216. && sMeansOfDeath != "MOD_RIFLE_BULLET"
  217. && sMeansOfDeath != "MOD_HEAD_SHOT"
  218. && sMeansOfDeath != "MOD_MELEE"
  219. && sMeansOfDeath != "MOD_BAYONET"
  220. && sMeansOfDeath != "MOD_GRENADE"
  221. && sMeansOfDeath != "MOD_GRENADE_SPLASH"
  222. && sMeansOfDeath != "MOD_PROJECTILE"
  223. && sMeansOfDeath != "MOD_PROJECTILE_SPLASH"
  224. && sMeansOfDeath != "MOD_EXPLOSIVE"
  225. && sMeansOfDeath != "MOD_BURNED")
  226. {
  227. return false;
  228. }
  229.  
  230. if( level.laststandpistol == "none" )
  231. {
  232. return false;
  233. }
  234.  
  235. return true;
  236. }
  237.  
  238.  
  239. // self = a player
  240. laststand_take_player_weapons()
  241. {
  242. self.weaponInventory = self GetWeaponsList();
  243. self.lastActiveWeapon = self GetCurrentWeapon();
  244. self.laststandpistol = undefined;
  245.  
  246. //ASSERTEX( self.lastActiveWeapon != "none", "Last active weapon is 'none,' an unexpected result." );
  247.  
  248. self.weaponAmmo = [];
  249.  
  250. for( i = 0; i < self.weaponInventory.size; i++ )
  251. {
  252. weapon = self.weaponInventory[i];
  253.  
  254. if ( WeaponClass( weapon ) == "pistol" && !IsDefined( self.laststandpistol ) )
  255. {
  256. self.laststandpistol = weapon;
  257. }
  258.  
  259. switch( weapon )
  260. {
  261. // this player was killed while reviving another player
  262. case "syrette":
  263. // player was killed drinking perks-a-cola
  264. case "zombie_perk_bottle_doubletap":
  265. case "zombie_perk_bottle_revive":
  266. case "zombie_perk_bottle_jugg":
  267. case "zombie_perk_bottle_sleight":
  268. case "zombie_bowie_flourish":
  269. case "zombie_knuckle_crack":
  270. self.lastActiveWeapon = "none";
  271. continue;
  272. }
  273.  
  274. self.weaponAmmo[weapon]["clip"] = self GetWeaponAmmoClip( weapon );
  275. self.weaponAmmo[weapon]["stock"] = self GetWeaponAmmoStock( weapon );
  276. }
  277.  
  278. self TakeAllWeapons();
  279.  
  280. if ( !IsDefined( self.laststandpistol ) )
  281. {
  282. self.laststandpistol = level.laststandpistol;
  283. }
  284.  
  285. if ( maps\_collectibles::has_collectible( "collectible_dirtyharry" ) )
  286. {
  287. self.laststandpistol = "colt_dirty_harry";
  288. }
  289.  
  290. }
  291.  
  292.  
  293. // self = a player
  294. laststand_giveback_player_weapons()
  295. {
  296. ASSERTEX( IsDefined( self.weaponInventory ), "player.weaponInventory is not defined - did you run laststand_take_player_weapons() first?" );
  297.  
  298. self TakeAllWeapons();
  299.  
  300. for( i = 0; i < self.weaponInventory.size; i++ )
  301. {
  302. weapon = self.weaponInventory[i];
  303.  
  304. switch( weapon )
  305. {
  306. // this player was killed while reviving another player
  307. case "syrette":
  308. // player was killed drinking perks-a-cola
  309. case "zombie_perk_bottle_doubletap":
  310. case "zombie_perk_bottle_revive":
  311. case "zombie_perk_bottle_jugg":
  312. case "zombie_perk_bottle_sleight":
  313. case "zombie_bowie_flourish":
  314. case "zombie_knuckle_crack":
  315. continue;
  316. }
  317.  
  318. self GiveWeapon( weapon );
  319. self SetWeaponAmmoClip( weapon, self.weaponAmmo[weapon]["clip"] );
  320.  
  321. if ( WeaponType( weapon ) != "grenade" )
  322. self SetWeaponAmmoStock( weapon, self.weaponAmmo[weapon]["stock"] );
  323. }
  324.  
  325. // if we can't figure out what the last active weapon was, try to switch a primary weapon
  326. //CHRIS_P: - don't try to give the player back the mortar_round weapon ( this is if the player killed himself with a mortar round)
  327.  
  328. for ( i = 2; i < self.inventory.size; i++ )
  329. {
  330. if ( self.lastActiveWeapon == self.inventory[ i ] )
  331. self.lastActiveWeapon = self.inventory[ 0 ];
  332.  
  333. self takeWeapon( self.inventory[ i ] );
  334. self.inventory[ i ] = undefined;
  335. }
  336. new_array = [];
  337. for ( i = 0; i < 2; i++ )
  338. new_array[ i ] = self.inventory[ i ];
  339.  
  340. self.inventory = new_array;
  341.  
  342. if( self.lastActiveWeapon != "none" && self.lastActiveWeapon != "mortar_round" && self.lastActiveWeapon != "mine_bouncing_betty" )
  343. {
  344. self SwitchToWeapon( self.lastActiveWeapon );
  345. }
  346. else
  347. {
  348. primaryWeapons = self GetWeaponsListPrimaries();
  349. if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 )
  350. {
  351. self SwitchToWeapon( primaryWeapons[0] );
  352. }
  353. }
  354. }
  355.  
  356. laststand_clean_up_on_disconnect( playerBeingRevived, reviverGun )
  357. {
  358. reviveTrigger = playerBeingRevived.revivetrigger;
  359.  
  360. playerBeingRevived waittill("disconnect");
  361.  
  362. if( isdefined( reviveTrigger ) )
  363. {
  364. reviveTrigger delete();
  365. }
  366.  
  367. if( isdefined( self.reviveProgressBar ) )
  368. {
  369. self.reviveProgressBar destroyElem();
  370. }
  371.  
  372. if( isdefined( self.reviveTextHud ) )
  373. {
  374. self.reviveTextHud destroy();
  375. }
  376.  
  377. self revive_give_back_weapons( reviverGun );
  378. }
  379.  
  380. laststand_give_pistol()
  381. {
  382. assert( IsDefined( self.laststandpistol ) );
  383. assert( self.laststandpistol != "none" );
  384. //assert( WeaponClass( self.laststandpistol ) == "pistol" );
  385.  
  386. if( GetDvar( "zombiemode" ) == "1" ) // CODER_MOD (Austin 5/4/08): zombiemode loadout setup
  387. {
  388. self GiveWeapon( self.laststandpistol );
  389. ammoclip = WeaponClipSize( self.laststandpistol );
  390.  
  391. if (self.laststandpistol == "ray_gun")
  392. {
  393. self SetWeaponAmmoClip( self.laststandpistol, ammoclip );
  394. self SetWeaponAmmoStock( self.laststandpistol, 0 );
  395.  
  396. }
  397. else
  398. {
  399. self SetWeaponAmmoStock( self.laststandpistol, ammoclip * 2 );
  400. }
  401.  
  402. self SwitchToWeapon( self.laststandpistol );
  403. }
  404. else
  405. {
  406. self GiveWeapon( self.laststandpistol );
  407. self GiveMaxAmmo( self.laststandpistol );
  408. self SwitchToWeapon( self.laststandpistol );
  409. }
  410. }
  411.  
  412.  
  413. laststand_give_grenade()
  414. {
  415. self endon ("player_revived");
  416. self endon ("disconnect");
  417.  
  418. while( self isThrowingGrenade() )
  419. {
  420. wait( 0.05 );
  421. }
  422. // needed to throw back grenades while in last stand
  423. if( level.campaign == "russian" )
  424. {
  425. grenade_choice = "stick_grenade";
  426. }
  427. // MM (7/8/9) - give the player german grenades because that's the only kind we're using
  428. else if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) )
  429. {
  430. grenade_choice = "stielhandgranate";
  431. }
  432. else
  433. {
  434. grenade_choice = "fraggrenade";
  435. }
  436. self GiveWeapon( grenade_choice );
  437. self SetWeaponAmmoClip( grenade_choice, 0 );
  438. self SwitchToOffhand( grenade_choice );
  439. }
  440.  
  441.  
  442. laststand_bleedout( delay )
  443. {
  444. self endon ("player_revived");
  445. self endon ("end_bleedout");
  446. self endon ("disconnect");
  447.  
  448. //self PlayLoopSound("heart_beat",delay); // happens on client now DSL
  449.  
  450. // Notify client that we're in last stand.
  451.  
  452. setClientSysState("lsm", "1", self);
  453.  
  454. self.bleedout_time = delay;
  455.  
  456. while ( self.bleedout_time > Int( delay * 0.5 ) )
  457. {
  458. self.bleedout_time -= 1;
  459. wait( 1 );
  460. }
  461.  
  462. self VisionSetLastStand( "death", delay * 0.5 );
  463.  
  464. while ( self.bleedout_time > 0 )
  465. {
  466. self.bleedout_time -= 1;
  467. wait( 1 );
  468. }
  469.  
  470. //CODER_MOD: TOMMYK 07/13/2008
  471. while( self.revivetrigger.beingRevived == 1 )
  472. {
  473. wait( 0.1 );
  474. }
  475.  
  476. setClientSysState("lsm", "0", self); // Notify client last stand ended.
  477. // HARRYBO21 - SHIELD
  478. self.zombie_shield_health = 0;
  479. // HARRYBO21 - SHIELD
  480. if (isdefined(level.is_zombie_level ) && level.is_zombie_level)
  481. {
  482. self [[level.player_becomes_zombie]]();
  483. }
  484. else
  485. {
  486. self.ignoreme = false;
  487. self mission_failed_during_laststand( self );
  488. }
  489.  
  490. self notify( "player_died" );
  491. }
  492.  
  493.  
  494. // spawns the trigger used for the player to get revived
  495. revive_trigger_spawn()
  496. {
  497. radius = GetDvarInt( "revive_trigger_radius" );
  498.  
  499. self.revivetrigger = spawn( "trigger_radius", self.origin, 0, radius, radius );
  500. self.revivetrigger setHintString( "" ); // only show the hint string if the triggerer is facing me
  501. self.revivetrigger setCursorHint( "HINT_NOICON" );
  502.  
  503. self.revivetrigger EnableLinkTo();
  504. self.revivetrigger LinkTo( self );
  505.  
  506. //CODER_MOD: TOMMYK 07/13/2008 - Revive text
  507. self.revivetrigger.beingRevived = 0;
  508. self.revivetrigger.createtime = gettime();
  509.  
  510. if ( maps\_collectibles::has_collectible( "collectible_morphine" ) )
  511. {
  512. self maps\_collectibles_game::morphine_think();
  513. }
  514. else
  515. {
  516. self thread revive_trigger_think();
  517. }
  518.  
  519. //self.revivetrigger thread revive_debug();
  520. }
  521.  
  522. revive_debug()
  523. {
  524. for ( ;; )
  525. {
  526. self waittill( "trigger", player );
  527.  
  528. if ( !player player_is_in_laststand() )
  529. {
  530. }
  531.  
  532. wait( 0.05 );
  533. }
  534. }
  535.  
  536. // logic for the revive trigger
  537. revive_trigger_think()
  538. {
  539. self endon ( "disconnect" );
  540. self endon ( "zombified" );
  541. self endon ( "chugabud_bleedout" );
  542. while ( 1 )
  543. {
  544. wait ( 0.1 );
  545.  
  546. //assert( DistanceSquared( self.origin, self.revivetrigger.origin ) <= 25 );
  547. //drawcylinder( self.revivetrigger.origin, 32, 32 );
  548.  
  549. players = get_players();
  550.  
  551. self.revivetrigger setHintString( "" );
  552.  
  553. for ( i = 0; i < players.size; i++ )
  554. {
  555. //PI CHANGES - revive should work in deep water for nazi_zombie_sumpf
  556. is_sumpf = 0;
  557. d = 0;
  558. if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf")
  559. {
  560. is_sumpf = 1;
  561. d = self depthinwater();
  562. }
  563.  
  564. if ( players[i] can_revive( self ) ||
  565. (is_sumpf == 1 && d > 20))
  566. //END PI CHANGES
  567. {
  568. // TODO: This will turn on the trigger hint for every player within
  569. // the radius once one of them faces the revivee, even if the others
  570. // are facing away. Either we have to display the hints manually here
  571. // (making sure to prioritize against any other hints from nearby objects),
  572. // or we need a new combined radius+lookat trigger type.
  573. self.revivetrigger setHintString( &"GAME_BUTTON_TO_REVIVE_PLAYER" );
  574. break;
  575. }
  576. }
  577.  
  578. for ( i = 0; i < players.size; i++ )
  579. {
  580. reviver = players[i];
  581.  
  582. if ( !reviver is_reviving( self ) )
  583. continue;
  584.  
  585. // give the syrette
  586. gun = reviver GetCurrentWeapon();
  587. assert( IsDefined( gun ) );
  588. //assert( gun != "none" );
  589. if ( gun == "syrette" )
  590. continue;
  591.  
  592. reviver GiveWeapon( "syrette" );
  593. reviver SwitchToWeapon( "syrette" );
  594. reviver DisableWeaponCycling();
  595. reviver DisableOffhandWeapons();
  596. reviver SetWeaponAmmoStock( "syrette", 1 );
  597.  
  598. //CODER_MOD: TOMMY K
  599. revive_success = reviver revive_do_revive( self, gun );
  600. reviver revive_give_back_weapons( gun );
  601.  
  602. //PI CHANGE: player couldn't jump - allow this again now that they are revived
  603. if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf")
  604. self AllowJump(true);
  605. //END PI CHANGE
  606.  
  607. if ( revive_success )
  608. {
  609. self thread revive_success( reviver );
  610. return;
  611. }
  612. }
  613. }
  614. }
  615.  
  616. revive_give_back_weapons( gun )
  617. {
  618. // take the syrette
  619. self TakeWeapon( "syrette" );
  620. self EnableWeaponCycling();
  621. self EnableOffhandWeapons();
  622.  
  623. if ( gun != "none" && gun != "mine_bouncing_betty" )
  624. {
  625. self SwitchToWeapon( gun );
  626. }
  627. else
  628. {
  629. // try to switch to first primary weapon
  630. primaryWeapons = self GetWeaponsListPrimaries();
  631. if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 )
  632. {
  633. self SwitchToWeapon( primaryWeapons[0] );
  634. }
  635. }
  636. }
  637.  
  638.  
  639. can_revive( revivee )
  640. {
  641. if ( !isAlive( self ) )
  642. return false;
  643.  
  644. if ( self player_is_in_laststand() )
  645. return false;
  646.  
  647. if( !isDefined( revivee.revivetrigger ) )
  648. return false;
  649.  
  650. if ( !self IsTouching( revivee.revivetrigger ) )
  651. return false;
  652.  
  653. //PI CHANGE: can revive in deep water in sumpf
  654. if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf" && (revivee depthinwater() > 10))
  655. return true;
  656. //END PI CHANGE
  657.  
  658. if ( !self is_facing( revivee ) )
  659. return false;
  660.  
  661. if( !SightTracePassed( self.origin + ( 0, 0, 50 ), revivee.origin + ( 0, 0, 30 ), false, undefined ) )
  662. return false;
  663.  
  664. //chrisp - fix issue where guys can sometimes revive thru a wall
  665. if(!bullettracepassed(self.origin + (0,0,50), revivee.origin + ( 0, 0, 30 ), false, undefined) )
  666. {
  667. return false;
  668. }
  669.  
  670. // SRS 9/2/2008: in zombie mode, disallow revive if potential reviver is a zombie
  671. if( IsDefined( level.is_zombie_level ) && level.is_zombie_level )
  672. {
  673. if( IsDefined( self.is_zombie ) && self.is_zombie )
  674. {
  675. return false;
  676. }
  677. }
  678.  
  679. //if the level is nazi_zombie_asylum and playeris drinking, disable the trigger
  680. if(level.script == "nazi_zombie_asylum" && isdefined(self.is_drinking))
  681. return false;
  682.  
  683. if(level.script == "nazi_zombie_sumpf" && isdefined(self.is_drinking))
  684. return false;
  685.  
  686. return true;
  687. }
  688.  
  689. is_reviving( revivee )
  690. {
  691. return ( can_revive( revivee ) && self UseButtonPressed() );
  692. }
  693.  
  694. is_facing( facee )
  695. {
  696. orientation = self getPlayerAngles();
  697. forwardVec = anglesToForward( orientation );
  698. forwardVec2D = ( forwardVec[0], forwardVec[1], 0 );
  699. unitForwardVec2D = VectorNormalize( forwardVec2D );
  700. toFaceeVec = facee.origin - self.origin;
  701. toFaceeVec2D = ( toFaceeVec[0], toFaceeVec[1], 0 );
  702. unitToFaceeVec2D = VectorNormalize( toFaceeVec2D );
  703.  
  704. dotProduct = VectorDot( unitForwardVec2D, unitToFaceeVec2D );
  705. return ( dotProduct > 0.9 ); // reviver is facing within a ~52-degree cone of the player
  706. }
  707.  
  708. // self = reviver
  709. revive_do_revive( playerBeingRevived, reviverGun )
  710. {
  711. assert( self is_reviving( playerBeingRevived ) );
  712. // reviveTime used to be set from a Dvar, but this can no longer be tunable:
  713. // it has to match the length of the third-person revive animations for
  714. // co-op gameplay to run smoothly.
  715. reviveTime = 3;
  716.  
  717. if ( self HasPerk( "specialty_quickrevive" ) )
  718. {
  719. reviveTime = reviveTime / 2;
  720. }
  721.  
  722. timer = 0;
  723. revived = false;
  724.  
  725. //CODER_MOD: TOMMYK 07/13/2008
  726. playerBeingRevived.revivetrigger.beingRevived = 1;
  727. playerBeingRevived.revive_hud setText( &"GAME_PLAYER_IS_REVIVING_YOU", self );
  728. playerBeingRevived revive_hud_show_n_fade( 3.0 );
  729.  
  730. playerBeingRevived.revivetrigger setHintString( "" );
  731.  
  732. playerBeingRevived startrevive( self );
  733.  
  734. if( !isdefined(self.reviveProgressBar) )
  735. self.reviveProgressBar = self createPrimaryProgressBar();
  736.  
  737. if( !isdefined(self.reviveTextHud) )
  738. self.reviveTextHud = newclientHudElem( self );
  739.  
  740. self thread laststand_clean_up_on_disconnect( playerBeingRevived, reviverGun );
  741.  
  742. self.reviveProgressBar updateBar( 0.01, 1 / reviveTime );
  743.  
  744. self.reviveTextHud.alignX = "center";
  745. self.reviveTextHud.alignY = "middle";
  746. self.reviveTextHud.horzAlign = "center";
  747. self.reviveTextHud.vertAlign = "bottom";
  748. self.reviveTextHud.y = -148;
  749. if ( IsSplitScreen() )
  750. self.reviveTextHud.y = -107;
  751. self.reviveTextHud.foreground = true;
  752. self.reviveTextHud.font = "default";
  753. self.reviveTextHud.fontScale = 1.8;
  754. self.reviveTextHud.alpha = 1;
  755. self.reviveTextHud.color = ( 1.0, 1.0, 1.0 );
  756. self.reviveTextHud setText( &"GAME_REVIVING" );
  757.  
  758. //chrisp - zombiemode addition for reviving vo
  759. // cut , but leave the script just in case
  760. //self thread say_reviving_vo();
  761.  
  762. while( self is_reviving( playerBeingRevived ) )
  763. {
  764. wait( 0.05 );
  765. timer += 0.05;
  766.  
  767. if ( self player_is_in_laststand() )
  768. break;
  769.  
  770. if( timer >= reviveTime)
  771. {
  772. revived = true;
  773. break;
  774. }
  775. }
  776.  
  777. if( isdefined( self.reviveProgressBar ) )
  778. {
  779. self.reviveProgressBar destroyElem();
  780. }
  781.  
  782. if( isdefined( self.reviveTextHud ) )
  783. {
  784. self.reviveTextHud destroy();
  785. }
  786.  
  787. if ( !revived )
  788. {
  789. playerBeingRevived stoprevive( self );
  790. }
  791.  
  792. //CODER_MOD: TOMMYK 07/13/2008
  793. playerBeingRevived.revivetrigger setHintString( &"GAME_BUTTON_TO_REVIVE_PLAYER" );
  794. playerBeingRevived.revivetrigger.beingRevived = 0;
  795.  
  796. return revived;
  797. }
  798.  
  799.  
  800. say_reviving_vo()
  801. {
  802. if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) ) // CODER_MOD (Austin 5/4/08): zombiemode loadout setup
  803. {
  804.  
  805. players = get_players();
  806. for(i=0; i<players.size; i++)
  807. {
  808. if (players[i] == self)
  809. {
  810. self playsound("plr_" + i + "_vox_reviving" + "_" + randomintrange(0, 2));
  811.  
  812. }
  813. }
  814. }
  815. }
  816.  
  817. say_revived_vo()
  818. {
  819. if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) ) // CODER_MOD (Austin 5/4/08): zombiemode loadout setup
  820. {
  821. players = get_players();
  822. for(i=0; i<players.size; i++)
  823. {
  824. if (players[i] == self)
  825. {
  826. self playsound("plr_" + i + "_vox_revived" + "_" + randomintrange(0, 2));
  827. }
  828. }
  829. }
  830. }
  831.  
  832. enable_player_move_states()
  833. {
  834. self EnableOffhandWeapons();
  835. self EnableWeaponCycling();
  836. self AllowStand( true );
  837. self AllowCrouch( true );
  838. self AllowProne( true );
  839. self AllowSprint( true );
  840. self freezecontrols( false );
  841. }
  842.  
  843. revive_success( reviver )
  844. {
  845. self notify ( "player_revived", reviver );
  846. self reviveplayer();
  847.  
  848. //CODER_MOD: TOMMYK 06/26/2008 - For coop scoreboards
  849. reviver.revives++;
  850. //stat tracking
  851. reviver.stats["revives"] = reviver.revives;
  852.  
  853. // CODER MOD: TOMMY K - 07/30/08
  854. reviver thread maps\_arcademode::arcadeMode_player_revive();
  855.  
  856. //CODER_MOD: Jay (6/17/2008): callback to revive challenge
  857. if( isdefined( level.missionCallbacks ) )
  858. {
  859. maps\_challenges_coop::doMissionCallback( "playerRevived", reviver );
  860. }
  861.  
  862. self.revivetrigger delete();
  863. self.revivetrigger = undefined;
  864.  
  865. if ( isDefined( self.script_noteworthy ) && self.script_noteworthy == "corpse_clone" )
  866. return;
  867.  
  868. self laststand_giveback_player_weapons();
  869.  
  870. self.ignoreme = false;
  871.  
  872. self thread say_revived_vo();
  873. self maps\_zombiemode_perks::harrybo21_perks_player_revive();
  874.  
  875. }
  876.  
  877. revive_force_revive( reviver )
  878. {
  879. assert( IsDefined( self ) );
  880. assert( IsPlayer( self ) );
  881. assert( self player_is_in_laststand() );
  882.  
  883. self thread revive_success( reviver );
  884. }
  885.  
  886. // the text that tells players that others are in need of a revive
  887. revive_hud_create()
  888. {
  889. players = get_players();
  890. self.revive_hud = newclientHudElem( self );
  891. self.revive_hud.alignX = "center";
  892. self.revive_hud.alignY = "middle";
  893. self.revive_hud.horzAlign = "center";
  894. self.revive_hud.vertAlign = "bottom";
  895. self.revive_hud.y = -50;
  896. self.revive_hud.foreground = true;
  897. self.revive_hud.font = "default";
  898. self.revive_hud.fontScale = 1.5;
  899. self.revive_hud.alpha = 0;
  900. self.revive_hud.color = ( 1.0, 1.0, 1.0 );
  901. self.revive_hud setText( "" );
  902.  
  903. if( GetDvar( "zombiemode" ) == "1" )
  904. {
  905. y = -80;
  906. if ( players.size == 1 )
  907. y = -180;
  908.  
  909. self.revive_hud.y = y;
  910. }
  911. }
  912.  
  913. //CODER_MOD: TOMMYK 07/13/2008
  914. revive_hud_think()
  915. {
  916. self endon ( "disconnect" );
  917.  
  918. while ( 1 )
  919. {
  920. wait( 0.1 );
  921.  
  922. if ( !player_any_player_in_laststand() )
  923. {
  924. continue;
  925. }
  926.  
  927. players = get_players();
  928. playerToRevive = undefined;
  929.  
  930. for( i = 0; i < players.size; i++ )
  931. {
  932. if( !players[i] player_is_in_laststand() || !isDefined( players[i].revivetrigger.createtime ) )
  933. continue;
  934.  
  935. if( !isDefined(playerToRevive) || playerToRevive.revivetrigger.createtime > players[i].revivetrigger.createtime )
  936. {
  937. playerToRevive = players[i];
  938. }
  939. }
  940.  
  941. if( isDefined( playerToRevive ) )
  942. {
  943. for( i = 0; i < players.size; i++ )
  944. {
  945. if( players[i] player_is_in_laststand() )
  946. continue;
  947.  
  948. players[i] thread fadeReviveMessageOver( playerToRevive, 3.0 );
  949. }
  950.  
  951. playerToRevive.revivetrigger.createtime = undefined;
  952. wait( 3.5 );
  953. }
  954. }
  955. }
  956.  
  957. //CODER_MOD: TOMMYK 07/13/2008
  958. fadeReviveMessageOver( playerToRevive, time )
  959. {
  960. revive_hud_show();
  961. self.revive_hud setText( &"GAME_PLAYER_NEEDS_TO_BE_REVIVED", playerToRevive );
  962. self.revive_hud fadeOverTime( time );
  963. self.revive_hud.alpha = 0;
  964. }
  965.  
  966. revive_hud_hide()
  967. {
  968. assert( IsDefined( self ) );
  969. assert( IsDefined( self.revive_hud ) );
  970.  
  971. self.revive_hud.alpha = 0;
  972. }
  973.  
  974. revive_hud_show()
  975. {
  976. assert( IsDefined( self ) );
  977. assert( IsDefined( self.revive_hud ) );
  978.  
  979. self.revive_hud.alpha = 1;
  980. }
  981.  
  982. //CODER_MOD: TOMMYK 07/13/2008
  983. revive_hud_show_n_fade(time)
  984. {
  985. revive_hud_show();
  986.  
  987. self.revive_hud fadeOverTime( time );
  988. self.revive_hud.alpha = 0;
  989. }
  990.  
  991. drawcylinder(pos, rad, height)
  992. {
  993. currad = rad;
  994. curheight = height;
  995.  
  996. for (r = 0; r < 20; r++)
  997. {
  998. theta = r / 20 * 360;
  999. theta2 = (r + 1) / 20 * 360;
  1000.  
  1001. line(pos + (cos(theta) * currad, sin(theta) * currad, 0), pos + (cos(theta2) * currad, sin(theta2) * currad, 0));
  1002. line(pos + (cos(theta) * currad, sin(theta) * currad, curheight), pos + (cos(theta2) * currad, sin(theta2) * currad, curheight));
  1003. line(pos + (cos(theta) * currad, sin(theta) * currad, 0), pos + (cos(theta) * currad, sin(theta) * currad, curheight));
  1004. }
  1005. }
  1006.  
  1007. mission_failed_during_laststand( dead_player )
  1008. {
  1009. if( IsDefined( level.no_laststandmissionfail ) && level.no_laststandmissionfail )
  1010. {
  1011. return;
  1012. }
  1013.  
  1014. players = get_players();
  1015. for( i = 0; i < players.size; i++ )
  1016. {
  1017. if( isDefined( players[i] ) )
  1018. {
  1019. players[i] thread maps\_quotes::displayMissionFailed();
  1020. if( players[i] == self )
  1021. {
  1022. players[i] thread maps\_quotes::displayPlayerDead();
  1023. println( "Player #"+i+" is dead" );
  1024. }
  1025. else
  1026. {
  1027. players[i] thread maps\_quotes::displayTeammateDead( dead_player );
  1028. println( "Player #"+i+" is alive" );
  1029. }
  1030. }
  1031. }
  1032. missionfailed();
  1033. }
Add Comment
Please, Sign In to add comment