Advertisement
Guest User

_scrambler - Notesblok

a guest
Nov 19th, 2011
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.15 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include common_scripts\utility;
  3.  
  4. setScrambler()
  5. {
  6. self SetOffhandSecondaryClass( "flash" );
  7. self _giveWeapon( "scrambler_mp", 0 );
  8. self giveStartAmmo( "scrambler_mp" );
  9.  
  10. self thread monitorScramblerUse();
  11. }
  12.  
  13. unsetScrambler()
  14. {
  15. self notify( "end_monitorScramblerUse" );
  16. }
  17.  
  18. deleteScrambler( scrambler )
  19. {
  20. if ( !isDefined( scrambler ) )
  21. return;
  22.  
  23. foreach( player in level.players )
  24. {
  25. if( IsDefined( player ) )
  26. player.inPlayerScrambler = undefined;
  27. }
  28.  
  29. scrambler notify( "death" );
  30. scrambler Delete();
  31.  
  32. self.deployedScrambler = undefined;
  33. tempArray = [];
  34.  
  35. tempArray = cleanArray( level.scramblers );
  36. level.scramblers = tempArray;
  37.  
  38. }
  39.  
  40. monitorScramblerUse()
  41. {
  42. self notify ( "end_monitorScramblerUse" );
  43. self endon ( "end_monitorScramblerUse" );
  44. self endon ( "disconnect" );
  45. level endon ( "game_ended" );
  46.  
  47. for ( ;; )
  48. {
  49. // grenade is the entity spawned by the G_FireGrenade() since we want this to be
  50. // script controlled, we won't actually use this entity
  51. self waittill( "grenade_fire", grenade, weapName );
  52. if ( weapname == "scrambler" || weapname == "scrambler_mp" )
  53. {
  54. if( !IsAlive( self ) )
  55. {
  56. grenade delete();
  57. return;
  58. }
  59.  
  60. // need to see if this is being placed far away from the player and not let it do that
  61. // this will fix a legacy bug where you can stand on a ledge and plant a claymore down on the ground far below you
  62. grenade Hide();
  63. grenade waittill( "missile_stuck" );
  64. distanceZ = 40;
  65.  
  66. if( distanceZ * distanceZ < DistanceSquared( grenade.origin, self.origin ) )
  67. {
  68. secTrace = bulletTrace( self.origin, self.origin - (0, 0, distanceZ), false, self );
  69.  
  70. if( secTrace["fraction"] == 1 )
  71. {
  72. // there's nothing under us so don't place the grenade up in the air
  73. grenade delete();
  74. self SetWeaponAmmoStock( "scrambler_mp", self GetWeaponAmmoStock( "trophy_mp" ) + 1 );
  75. continue;
  76. }
  77.  
  78. grenade.origin = secTrace["position"];
  79. }
  80.  
  81. grenade Show();
  82.  
  83. if( isDefined( self.deployedScrambler ) )
  84. deleteScrambler( self.deployedScrambler );
  85.  
  86. GroundPosition = grenade.origin;
  87.  
  88. scrambler = spawn( "script_model", GroundPosition );
  89. scrambler.health = 100;
  90. scrambler.team = self.team;
  91. scrambler.owner = self;
  92.  
  93. scrambler setCanDamage( true );
  94.  
  95. scrambler makeScrambler( self );
  96. scrambler scramblerSetup( self );
  97. scrambler thread maps\mp\gametypes\_weapons::createBombSquadModel( "weapon_jammer", "tag_origin", level.otherTeam[self.team], self );
  98.  
  99. level.scramblers[ level.scramblers.size ] = scrambler;
  100. self.deployedScrambler = scrambler;
  101.  
  102. // need to clear the changing weapon because it'll get stuck on c4_mp and player will stop spawning because we get locked in isChangingWeapon() loop when a killstreak is earned
  103. self.changingWeapon = undefined;
  104.  
  105. wait(0.05); // allows for the plant sound to play
  106. if( IsDefined( grenade ) )
  107. grenade Delete();
  108. }
  109. }
  110. }
  111.  
  112. scramblerSetup( owner )
  113. {
  114. // JCC temp until we get our model
  115. self setModel( "weapon_jammer" );
  116.  
  117. // setup icons for item so friendlies see it
  118. if ( level.teamBased )
  119. self maps\mp\_entityheadIcons::setTeamHeadIcon( self.team , (0,0,20) );
  120. else
  121. self maps\mp\_entityheadicons::setPlayerHeadIcon( owner, (0,0,20) );
  122.  
  123. self thread scramblerDamageListener( owner );
  124. self thread scramblerUseListener( owner );
  125. owner thread scramblerWatchOwner( self );
  126. self thread scramblerBeepSounds();
  127. self thread notUsableForJoiningPlayers( owner );
  128. }
  129.  
  130. scramblerWatchOwner( scrambler )
  131. {
  132. scrambler endon( "death" );
  133. level endon ( "game_ended" );
  134.  
  135. self waittill_any( "disconnect", "joined_team", "joined_spectators", "death" );
  136.  
  137. level thread deleteScrambler( scrambler );
  138. }
  139.  
  140. scramblerBeepSounds()
  141. {
  142. self endon( "death" );
  143. level endon ( "game_ended" );
  144.  
  145. for ( ;; )
  146. {
  147. wait ( 3.0 );
  148. self playSound( "scrambler_beep" );
  149. }
  150. }
  151.  
  152. scramblerDamageListener( owner )
  153. {
  154. self endon ( "death" );
  155.  
  156. // use a health buffer to prevent dying to friendly fire
  157. self.health = 999999; // keep it from dying anywhere in code
  158. self.maxHealth = 100; // this is the health we'll check
  159. self.damageTaken = 0; // how much damage has it taken
  160.  
  161. for ( ;; )
  162. {
  163. self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags, weapon );
  164.  
  165. // don't allow people to destroy equipment on their team if FF is off
  166. if ( !maps\mp\gametypes\_weapons::friendlyFireCheck( self.owner, attacker ) )
  167. continue;
  168.  
  169. if( IsDefined( weapon ) )
  170. {
  171. switch( weapon )
  172. {
  173. case "concussion_grenade_mp":
  174. case "flash_grenade_mp":
  175. case "smoke_grenade_mp":
  176. continue;
  177. }
  178. }
  179.  
  180. if ( !isdefined( self ) )
  181. return;
  182.  
  183. if ( type == "MOD_MELEE" )
  184. self.damageTaken += self.maxHealth;
  185.  
  186. if ( isDefined( iDFlags ) && ( iDFlags & level.iDFLAGS_PENETRATION ) )
  187. self.wasDamagedFromBulletPenetration = true;
  188.  
  189. self.wasDamaged = true;
  190.  
  191. self.damageTaken += damage;
  192.  
  193. if( isPlayer( attacker ) )
  194. {
  195. attacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "scrambler" );
  196. }
  197.  
  198. if ( self.damageTaken >= self.maxHealth )
  199. {
  200. if ( isDefined( owner ) && attacker != owner )
  201. {
  202. // JCC commented out
  203. //attacker notify ( "destroyed_insertion", owner );
  204. attacker notify( "destroyed_explosive" ); // count towards SitRep Pro challenge
  205.  
  206. // JCC commented out
  207. //owner thread leaderDialogOnPlayer( "ti_destroyed" );
  208. }
  209.  
  210. // TODO: get sound and fx
  211. self playsound( "sentry_explode" );
  212. self.deathEffect = PlayFX( getfx( "equipment_explode" ), self.origin );
  213. attacker thread deleteScrambler( self );
  214. }
  215. }
  216. }
  217.  
  218. scramblerUseListener( owner )
  219. {
  220. self endon ( "death" );
  221. level endon ( "game_ended" );
  222. owner endon ( "disconnect" );
  223.  
  224. self setCursorHint( "HINT_NOICON" );
  225. self setHintString( &"MP_PICKUP_SCRAMBLER" );
  226. self setSelfUsable( owner );
  227.  
  228. for ( ;; )
  229. {
  230. self waittill ( "trigger", player );
  231.  
  232. player playLocalSound( "scavenger_pack_pickup" );
  233.  
  234. // give item to user (only if they haven't restocked from scavenger pickup since dropping)
  235. if ( player getAmmoCount( "scrambler_mp" ) == 0 )
  236. player setScrambler();
  237.  
  238. player thread deleteScrambler( self );
  239. }
  240. }
  241.  
  242. // called from _perks::onPlayerSpawned()
  243. scramblerProximityTracker() // self == spawned player
  244. {
  245. self endon( "disconnect" );
  246. self endon( "death" );
  247. level endon( "game_ended" );
  248.  
  249. self.scramProxyActive = false;
  250.  
  251. scramblerProximity = 512;
  252.  
  253. for( ;; )
  254. {
  255. wait (0.05);
  256.  
  257. self.scramProxyActive = false;
  258. foreach( scrambler in level.scramblers )
  259. {
  260. if ( !isDefined( scrambler ) )
  261. continue;
  262.  
  263. if ( !isReallyAlive(self) )
  264. continue;
  265.  
  266. /#
  267. //maps\mp\killstreaks\_ac130::debug_circle( scrambler.origin, scramblerProximity, 0.05, ( 0, 0, 1 ) );
  268. #/
  269.  
  270. scramDistance = DistanceSquared( scrambler.origin, self.origin );
  271.  
  272. if( ( level.teambased && scrambler.team != self.team ) ||
  273. ( !level.teambased && IsDefined( scrambler.owner ) && scrambler.owner != self ) )
  274. {
  275. // this player is not on the same team but we still need to know if they are within the proximity
  276. if ( scramDistance < scramblerProximity * scramblerProximity )
  277. self.inPlayerScrambler = scrambler.owner;
  278. else
  279. self.inPlayerScrambler = undefined;
  280.  
  281. // continue because everything below here is for teammates/owner
  282. continue;
  283. }
  284.  
  285. if( scramDistance < scramblerProximity * scramblerProximity )
  286. {
  287. self.scramProxyActive = true;
  288. break;
  289. }
  290. }
  291.  
  292. if ( self.scramProxyActive )
  293. {
  294. if( !self _hasPerk("specialty_blindeye" ) )
  295. {
  296. self givePerk( "specialty_blindeye", false );
  297. self.scramProxyPerk = true;
  298. }
  299. }
  300. else
  301. {
  302. // did we get the perk from the scram proxy
  303. if( IsDefined( self.scramProxyPerk ) && self.scramProxyPerk )
  304. {
  305. // now make sure they didn't earn it using the specialist strike package
  306. if( !self maps\mp\killstreaks\_perkstreaks::isPerkStreakOn( "specialty_blindeye_ks" ) )
  307. self _unsetPerk( "specialty_blindeye" );
  308.  
  309. self.scramProxyPerk = false;
  310. }
  311. }
  312. }
  313.  
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement