Advertisement
NachosEater

_equipment.gsc

Nov 19th, 2011
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.93 KB | None | 0 0
  1. /*******************************************************************
  2. // _equipment.gsc
  3. //
  4. // Holds all the IW5 equipment specific functions
  5. //
  6. // Jordan Hirsh Aug. 3rd 2010
  7. //
  8. // * function entrance via _weapons.gsc *
  9. ********************************************************************/
  10.  
  11.  
  12. #include common_scripts\utility;
  13. #include maps\mp\_utility;
  14. #include maps\mp\gametypes\_weapons;
  15.  
  16. watchTrophyUsage()
  17. {
  18. self endon( "spawned_player" );
  19. self endon( "disconnect" );
  20.  
  21. self.trophyArray = [];
  22. while ( 1 )
  23. {
  24. self waittill( "grenade_fire", grenade, weapname );
  25. if ( weapname == "trophy" || weapname == "trophy_mp" )
  26. {
  27. if( !IsAlive( self ) )
  28. {
  29. grenade delete();
  30. return;
  31. }
  32.  
  33. // need to see if this is being placed far away from the player and not let it do that
  34. // this will fix a legacy bug where you can stand on a ledge and plant a claymore down on the ground far below you
  35. grenade Hide();
  36. grenade waittill( "missile_stuck" );
  37. distanceZ = 40;
  38. if( distanceZ * distanceZ < DistanceSquared( grenade.origin, self.origin ) )
  39. {
  40. secTrace = bulletTrace( self.origin, self.origin - (0, 0, distanceZ), false, self );
  41.  
  42. if( secTrace["fraction"] == 1 )
  43. {
  44. // there's nothing under us so don't place the grenade up in the air
  45. grenade delete();
  46. self SetWeaponAmmoStock( "trophy_mp", self GetWeaponAmmoStock( "trophy_mp" ) + 1 );
  47. continue;
  48. }
  49.  
  50. grenade.origin = secTrace["position"];
  51. }
  52. grenade Show();
  53.  
  54. self.trophyArray = array_removeUndefined( self.trophyArray );
  55.  
  56. if( self.trophyArray.size >= level.maxPerPlayerExplosives )
  57. self.trophyArray[0] detonate();
  58.  
  59. // need to spawn in a model and delete the "grenade" so we can damage it properly
  60. trophy = Spawn( "script_model", grenade.origin );
  61. assert( IsDefined( trophy ) );
  62.  
  63. //trophy maketrophysystem( self );
  64. trophy SetModel( "mp_trophy_system" );
  65. trophy thread maps\mp\gametypes\_weapons::createBombSquadModel( "mp_trophy_system", "tag_origin", level.otherTeam[self.team], self );
  66. trophy.angles = grenade.angles;
  67.  
  68. self.trophyArray[ self.trophyArray.size ] = trophy;
  69. trophy.owner = self;
  70. trophy.team = self.team;
  71. trophy.weaponName = weapname;
  72.  
  73. if ( isDefined ( self.trophyRemainingAmmo ) && self.trophyRemainingAmmo > 0 )
  74. trophy.ammo = self.trophyRemainingAmmo;
  75. else
  76. trophy.ammo = 2;
  77.  
  78. trophy.trigger = spawn( "script_origin", trophy.origin );
  79.  
  80. trophy thread trophyDamage( self );
  81. trophy thread trophyActive( self );
  82. trophy thread trophyDisconnectWaiter( self );
  83. trophy thread trophyPlayerSpawnWaiter( self );
  84. trophy thread trophyUseListener( self );
  85.  
  86.  
  87. //trophy thread EMPDamage();
  88. trophy thread c4EMPKillstreakWait();
  89.  
  90. if ( level.teamBased )
  91. trophy maps\mp\_entityheadicons::setTeamHeadIcon( trophy.team, (0,0,65) );
  92. else
  93. trophy maps\mp\_entityheadicons::setPlayerHeadIcon( trophy.owner, (0,0,65) );
  94.  
  95. wait(0.05); // allows for the plant sound to play
  96. if( IsDefined( grenade ) )
  97. grenade Delete();
  98. }
  99. }
  100. }
  101.  
  102. //waittillStopMoving( timeout )
  103. //{
  104. // self endon( "death" );
  105. //
  106. // prevOrigin = undefined;
  107. // while( true )
  108. // {
  109. // if( !IsDefined( prevOrigin ) )
  110. // prevOrigin = self.origin;
  111. // else if( prevOrigin == self.origin )
  112. // break;
  113. // else
  114. // prevOrigin = self.origin;
  115. //
  116. // wait(0.05);
  117. //
  118. // timeout -= 0.05;
  119. // if( timeout <= 0 )
  120. // return false;
  121. // }
  122. //
  123. // return true;
  124. //}
  125.  
  126. trophyUseListener( owner )
  127. {
  128. self endon ( "death" );
  129. level endon ( "game_ended" );
  130. owner endon ( "disconnect" );
  131. owner endon ( "death" );
  132.  
  133. self.trigger setCursorHint( "HINT_NOICON" );
  134. self.trigger setHintString( &"MP_PICKUP_TROPHY" );
  135. self.trigger setSelfUsable( owner );
  136. self.trigger thread notUsableForJoiningPlayers( owner );
  137.  
  138. for ( ;; )
  139. {
  140. self.trigger waittill ( "trigger", owner );
  141.  
  142. owner playLocalSound( "scavenger_pack_pickup" );
  143.  
  144. // give item to user
  145. owner givePerk( "trophy_mp", false );
  146. owner.trophyRemainingAmmo = self.ammo;
  147. self.trigger delete();
  148. self delete();
  149. self notify( "death" );
  150. }
  151. }
  152.  
  153. trophyPlayerSpawnWaiter( owner )
  154. {
  155. self endon ( "disconnect" );
  156. self endon ( "death" );
  157.  
  158. owner waittill( "spawned" );
  159. self thread trophyBreak();
  160. }
  161.  
  162. trophyDisconnectWaiter( owner )
  163. {
  164. self endon ( "death" );
  165.  
  166. owner waittill( "disconnect" );
  167. self thread trophyBreak();
  168. }
  169.  
  170. trophyActive( owner )
  171. {
  172. owner endon( "disconnect" );
  173. self endon ( "death" );
  174.  
  175. position = self.origin;
  176.  
  177. for( ;; )
  178. {
  179. if ( !isDefined( level.grenades ) || ( level.grenades.size < 1 && level.missiles.size < 1 ) || isDefined( self.disabled ) )
  180. {
  181. wait( .05 );
  182. continue;
  183. }
  184.  
  185. sentryTargets = combineArrays ( level.grenades, level.missiles );
  186.  
  187. foreach ( grenade in sentryTargets )
  188. {
  189. wait( .05 );
  190.  
  191. if ( !isDefined(grenade) )
  192. continue;
  193.  
  194. if ( grenade == self )
  195. continue;
  196.  
  197. if ( isDefined( grenade.weaponName) )
  198. {
  199. switch( grenade.weaponName )
  200. {
  201. case "claymore_mp":
  202. continue;
  203. }
  204. }
  205.  
  206. switch( grenade.model )
  207. {
  208. case "mp_trophy_system":
  209. case "weapon_radar":
  210. case "weapon_jammer":
  211. case "weapon_parabolic_knife":
  212. continue;
  213. }
  214.  
  215. if ( !isDefined( grenade.owner ) )
  216. grenade.owner = GetMissileOwner( grenade );
  217.  
  218. //assertEx( isDefined( grenade.owner ), "grenade has no owner" );
  219. //grenades owner may have disconnected by now if they do we should just assume enemy and detonate it.
  220.  
  221. if ( isDefined( grenade.owner ) && level.teamBased && grenade.owner.team == owner.team )
  222. continue;
  223.  
  224. //dont blow up owners grenades in FFA
  225. if ( isDefined( grenade.owner ) && grenade.owner == owner )
  226. continue;
  227.  
  228. grenadeDistanceSquared = DistanceSquared( grenade.origin, self.origin );
  229.  
  230. if ( grenadeDistanceSquared < 147456 )
  231. {
  232. if ( BulletTracePassed( grenade.origin, self.origin, false, self ) )
  233. {
  234. playFX( level.sentry_fire, self.origin + (0,0,32) , ( grenade.origin - self.origin ), AnglesToUp( self.angles ) );
  235. self playSound( "trophy_detect_projectile" );
  236.  
  237. owner thread projectileExplode( grenade, self );
  238. owner maps\mp\gametypes\_missions::processChallenge( "ch_noboomforyou" );
  239.  
  240. self.ammo--;
  241.  
  242. if ( self.ammo <= 0 )
  243. self thread trophyBreak();
  244. }
  245. }
  246. }
  247. }
  248.  
  249. }
  250.  
  251. projectileExplode( projectile, trophy )
  252. {
  253. self endon( "death" );
  254.  
  255. projPosition = projectile.origin;
  256. projType = projectile.model;
  257. projAngles = projectile.angles;
  258.  
  259. if ( projType == "weapon_light_marker" )
  260. {
  261. playFX( level.empGrenadeExplode, projPosition, AnglesToForward( projAngles ), AnglesToUp( projAngles ) );
  262.  
  263. trophy thread trophyBreak();
  264.  
  265. projectile delete();
  266. return;
  267. }
  268.  
  269. projectile delete();
  270. trophy playSound( "trophy_fire" );
  271. playFX( level.mine_explode, projPosition, AnglesToForward( projAngles ), AnglesToUp( projAngles ) );
  272. RadiusDamage( projPosition, 128, 105, 10, self );
  273. }
  274.  
  275. trophyDamage( owner )
  276. {
  277. self endon( "death" );
  278. owner endon( "death" );
  279.  
  280. self setcandamage( true );
  281. // use a health buffer to prevent dying to friendly fire
  282. self.health = 999999; // keep it from dying anywhere in code
  283. self.maxHealth = 100; // this is the health we'll check
  284. self.damageTaken = 0; // how much damage has it taken
  285.  
  286. while( true )
  287. {
  288. self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags, weapon );
  289.  
  290. if ( !isPlayer( attacker ) )
  291. continue;
  292.  
  293. // don't allow people to destroy equipment on their team if FF is off
  294. if ( !friendlyFireCheck( self.owner, attacker ) )
  295. continue;
  296.  
  297. if( IsDefined( weapon ) )
  298. {
  299. switch( weapon )
  300. {
  301. case "concussion_grenade_mp":
  302. case "flash_grenade_mp":
  303. case "smoke_grenade_mp":
  304. continue;
  305. }
  306. }
  307.  
  308. if ( !isdefined( self ) )
  309. return;
  310.  
  311. if ( type == "MOD_MELEE" )
  312. self.damageTaken += self.maxHealth;
  313.  
  314. if ( isDefined( iDFlags ) && ( iDFlags & level.iDFLAGS_PENETRATION ) )
  315. self.wasDamagedFromBulletPenetration = true;
  316.  
  317. self.wasDamaged = true;
  318.  
  319. if ( isDefined(weapon) && weapon == "emp_grenade_mp" )
  320. self.damageTaken += self.maxHealth;
  321.  
  322. self.damageTaken += damage;
  323.  
  324. if( isPlayer( attacker ) )
  325. {
  326. attacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "trophy" );
  327. }
  328.  
  329. if ( self.damageTaken >= self.maxHealth )
  330. {
  331. self thread trophyBreak();
  332. }
  333. }
  334. }
  335.  
  336. trophyBreak()
  337. {
  338. playfxOnTag( getfx( "sentry_explode_mp" ), self, "tag_origin" );
  339. playfxOnTag( getfx( "sentry_smoke_mp" ), self, "tag_origin" );
  340. self playsound( "sentry_explode" );
  341.  
  342. self notify( "death" );
  343.  
  344. placement = self.origin;
  345.  
  346. self.trigger MakeUnusable();
  347.  
  348. wait(3);//timer for trophy to self delete
  349.  
  350. if( IsDefined( self.trigger ) )
  351. self.trigger delete();
  352.  
  353. if( IsDefined( self ) )
  354. self delete();
  355. }
  356.  
  357.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement