Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.50 KB | None | 0 0
  1. #include common_scripts\utility;
  2.  
  3. //////////////////////////////////////////////////////////////////////////////
  4. // CONSTANTS //
  5. //////////////////////////////////////////////////////////////////////////////
  6. level_limit_pipe_fx = 8;
  7. max_fires_from_entity = 4;
  8. level_pipe_fx_chance = 33;
  9.  
  10.  
  11. //////////////////////////////////////////////////////////////////////////////
  12. // LOGIC //
  13. //////////////////////////////////////////////////////////////////////////////
  14. main()
  15. {
  16. level._pipe_fx_time = 25;
  17. pipes = GetEntArray( "pipe_shootable", "targetname" );
  18. if ( !pipes.size )
  19. return;
  20. level._pipes = SpawnStruct();
  21. level._pipes.num_pipe_fx = 0;
  22.  
  23. pipes thread precacheFX();
  24. pipes thread methodsInit();
  25.  
  26. waittillframeend;// insure that structs are initialized
  27. array_thread( pipes, ::pipesetup );
  28. }
  29.  
  30. pipesetup()
  31. {
  32. self SetCanDamage( true );
  33. self SetCanRadiusDamage( false ); // optimization
  34. self.pipe_fx_array = [];
  35.  
  36. node = undefined;
  37.  
  38. if ( IsDefined( self.target ) )
  39. {
  40. node = getstruct( self.target, "targetname" );
  41. self.A = node.origin;
  42. vec = AnglesToForward( node.angles );
  43. vec = vector_multiply( vec, 128 );
  44. self.B = self.A + vec;
  45. }
  46. else
  47. {
  48. vec = AnglesToForward( self.angles );
  49. vec1 = vector_multiply( vec, 64 );
  50. self.A = self.origin + vec1;
  51. vec1 = vector_multiply( vec, -64 );
  52. self.B = self.origin + vec1;
  53. }
  54.  
  55. self thread pipe_wait_loop();
  56. }
  57.  
  58. pipe_wait_loop()
  59. {
  60. P = ( 0, 0, 0 );// just to initialize P as a vector
  61.  
  62. hasTakenDamage = false;
  63. remaining = max_fires_from_entity;
  64.  
  65. while ( 1 )
  66. {
  67. self waittill( "damage", damage, other, direction_vec, P, type );
  68.  
  69. // random so we don't get so many fx, but the very first time is guarenteed
  70. if ( hasTakenDamage )
  71. {
  72. if ( randomint( 100 ) <= level_pipe_fx_chance )
  73. continue;
  74. }
  75. hasTakenDamage = true;
  76.  
  77. result = self pipe_logic( direction_vec, P, type, other );
  78. if ( result )
  79. remaining--;
  80.  
  81. if ( remaining <= 0 )
  82. break;
  83. }
  84.  
  85. self SetCanDamage( false );
  86. }
  87.  
  88. pipe_logic( direction_vec, P, type, damageOwner )
  89. {
  90. if ( level._pipes.num_pipe_fx > level_limit_pipe_fx )
  91. return false;
  92.  
  93. if ( !isDefined( level._pipes._pipe_methods[ type ] ) )
  94. P = self pipe_calc_nofx( P, type );
  95. else
  96. P = self [[ level._pipes._pipe_methods[ type ] ]]( P, type );
  97.  
  98. if ( !isdefined( P ) )
  99. return false;
  100.  
  101. if ( IsDefined( damageOwner.classname ) && damageOwner.classname == "worldspawn" )
  102. return false;
  103.  
  104. foreach ( value in self.pipe_fx_array )
  105. {
  106. if ( DistanceSquared( P, value.origin ) < 25 )
  107. return false;
  108. }
  109.  
  110. //calculate the vector derived from the center line of our pipe and the point of damage
  111. vec = VectorFromLineToPoint( self.A, self.B, P );
  112. self thread pipefx( P, vec, damageOwner );
  113. return true;
  114. }
  115.  
  116. pipefx( P, vec, damageOwner )
  117. {
  118. time = level._pipes.fx_time[ self.script_noteworthy ] ;
  119. intervals = Int( level._pipe_fx_time / time );// loops for 25 seconds
  120. hitsnd = level._pipes._sound[ self.script_noteworthy + "_hit" ];
  121. loopsnd = level._pipes._sound[ self.script_noteworthy + "_loop" ];
  122. endsnd = level._pipes._sound[ self.script_noteworthy + "_end" ];
  123.  
  124. snd = Spawn( "script_origin", P );
  125. snd Hide();
  126. snd PlaySound( hitsnd );
  127. snd PlayLoopSound( loopsnd );
  128. self.pipe_fx_array[ self.pipe_fx_array.size ] = snd;
  129.  
  130. level._pipes.num_pipe_fx++;
  131.  
  132. if ( isSP() || self.script_noteworthy != "steam" )
  133. self thread pipe_damage( P, vec, damageOwner, snd );
  134.  
  135. //do it once without checking for newer fx being played ( we're the newest )
  136. PlayFX( level._pipes._effect[ self.script_noteworthy ], P, vec );
  137. wait time;
  138. intervals--;
  139.  
  140. //now check for other fx and rest of intervals
  141. while ( level._pipes.num_pipe_fx <= level_limit_pipe_fx && intervals > 0 )
  142. {
  143. PlayFX( level._pipes._effect[ self.script_noteworthy ], P, vec );
  144. wait time;
  145. intervals--;
  146. }
  147. snd PlaySound( endsnd );
  148. wait( .5 );
  149. snd StopLoopSound( loopsnd );
  150. snd Delete();
  151. self.pipe_fx_array = array_removeUndefined( self.pipe_fx_array );
  152.  
  153. level._pipes.num_pipe_fx--;
  154. }
  155.  
  156. pipe_damage( P, vec, damageOwner, fx )
  157. {
  158. if ( !allow_pipe_damage() )
  159. return;
  160.  
  161. fx endon( "death" );
  162.  
  163. origin = fx.origin + vector_multiply( VectorNormalize( vec ), 40 );
  164. dmg = level._pipes._dmg[ self.script_noteworthy ];
  165.  
  166. while ( 1 )
  167. {
  168. // do not pass damage owner if they have disconnected before the barrels explode.. the barrels?
  169. if ( !isdefined( self.damageOwner ) )
  170. {
  171. // MOD_TRIGGER_HURT so they dont do dirt on the player's screen
  172. self RadiusDamage( origin, 36, dmg, dmg * 0.75, undefined, "MOD_TRIGGER_HURT" );
  173. }
  174. else
  175. {
  176. // MOD_TRIGGER_HURT so they dont do dirt on the player's screen
  177. self RadiusDamage( origin, 36, dmg, dmg * 0.75, damageOwner, "MOD_TRIGGER_HURT" );
  178. }
  179.  
  180. wait( 0.4 );
  181. }
  182. }
  183.  
  184. allow_pipe_damage()
  185. {
  186. if( !isSP() )
  187. return false;
  188.  
  189. if ( !isDefined( level.pipesDamage ) )
  190. return true;
  191.  
  192. return ( level.pipesDamage );
  193. }
  194.  
  195. //////////////////////////////////////////////////////////////////////////////
  196. // CALCULATIONS / SETUP //
  197. //////////////////////////////////////////////////////////////////////////////
  198.  
  199. methodsInit()
  200. {
  201. level._pipes._pipe_methods = [];
  202. level._pipes._pipe_methods[ "MOD_UNKNOWN" ] = ::pipe_calc_splash;
  203. level._pipes._pipe_methods[ "MOD_PISTOL_BULLET" ] = ::pipe_calc_ballistic;
  204. level._pipes._pipe_methods[ "MOD_RIFLE_BULLET" ] = ::pipe_calc_ballistic;
  205. level._pipes._pipe_methods[ "MOD_GRENADE" ] = ::pipe_calc_splash;
  206. level._pipes._pipe_methods[ "MOD_GRENADE_SPLASH" ] = ::pipe_calc_splash;
  207. level._pipes._pipe_methods[ "MOD_PROJECTILE" ] = ::pipe_calc_splash;
  208. level._pipes._pipe_methods[ "MOD_PROJECTILE_SPLASH" ] = ::pipe_calc_splash;
  209. level._pipes._pipe_methods[ "MOD_TRIGGER_HURT" ] = ::pipe_calc_splash;
  210. level._pipes._pipe_methods[ "MOD_EXPLOSIVE" ] = ::pipe_calc_splash;
  211. level._pipes._pipe_methods[ "MOD_EXPLOSIVE_BULLET" ] = ::pipe_calc_splash;
  212. }
  213.  
  214. pipe_calc_ballistic( P, type )
  215. {
  216. return P;
  217. }
  218.  
  219. pipe_calc_splash( P, type )
  220. {
  221. vec = VectorNormalize( VectorFromLineToPoint( self.A, self.B, P ) );
  222. P = PointOnSegmentNearestToPoint( self.A, self.B, P );
  223. return( P + vector_multiply( vec, 4 ) );
  224. }
  225.  
  226. pipe_calc_nofx( P, type )
  227. {
  228. return undefined;
  229. }
  230.  
  231. precacheFX()
  232. {
  233. steam = false;
  234. fire = false;
  235. foreach ( value in self )
  236. {
  237. if ( value.script_noteworthy == "water" )
  238. value.script_noteworthy = "steam";
  239.  
  240. if ( value.script_noteworthy == "steam" )
  241. {
  242. value willNeverChange();
  243. steam = true;
  244. }
  245. else if ( value.script_noteworthy == "fire" )
  246. {
  247. value willNeverChange();
  248. fire = true;
  249. }
  250. else
  251. {
  252. println( "Unknown 'pipe_shootable' script_noteworthy type '%s'\n", value.script_noteworthy );
  253. }
  254. }
  255.  
  256. if ( steam )
  257. {
  258. level._pipes._effect[ "steam" ] = LoadFX( "impacts/pipe_steam" );
  259. level._pipes._sound[ "steam_hit" ] = "mtl_steam_pipe_hit";
  260. level._pipes._sound[ "steam_loop" ] = "mtl_steam_pipe_hiss_loop";
  261. level._pipes._sound[ "steam_end" ] = "mtl_steam_pipe_hiss_loop_end";
  262. level._pipes.fx_time[ "steam" ] = 3;
  263. level._pipes._dmg[ "steam" ] = 5;
  264. }
  265.  
  266. if ( fire )
  267. {
  268. level._pipes._effect[ "fire" ] = LoadFX( "impacts/pipe_fire" );
  269. level._pipes._sound[ "fire_hit" ] = "mtl_gas_pipe_hit";
  270. level._pipes._sound[ "fire_loop" ] = "mtl_gas_pipe_flame_loop";
  271. level._pipes._sound[ "fire_end" ] = "mtl_gas_pipe_flame_end";
  272. level._pipes.fx_time[ "fire" ] = 3;
  273. level._pipes._dmg[ "fire" ] = 5;
  274. }
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement