Guest User

Untitled

a guest
Jun 29th, 2011
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.19 KB | None | 0 0
  1. #include maps\_utility;
  2. #include common_scripts\utility;
  3. #include maps\_zombiemode_utility;
  4. #include maps\_zombiemode_net;
  5. #using_animtree( "generic_human" );
  6. init()
  7. {
  8. if( !maps\_zombiemode_weapons::is_weapon_included( "thundergun_zm" ) )
  9. {
  10. return;
  11. }
  12.  
  13. level._effect["thundergun_viewmodel_power_cell1"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view1");
  14. level._effect["thundergun_viewmodel_power_cell2"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view2");
  15. level._effect["thundergun_viewmodel_power_cell3"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view3");
  16. level._effect["thundergun_viewmodel_steam"] = loadfx("weapon/thunder_gun/fx_thundergun_steam_view");
  17. level._effect["thundergun_viewmodel_power_cell1_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view1");
  18. level._effect["thundergun_viewmodel_power_cell2_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view2");
  19. level._effect["thundergun_viewmodel_power_cell3_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view3");
  20. level._effect["thundergun_viewmodel_steam_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_steam_view");
  21. level._effect["thundergun_knockdown_ground"] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" );
  22. level._effect["thundergun_smoke_cloud"] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" );
  23. set_zombie_var( "thundergun_cylinder_radius", 180 );
  24. set_zombie_var( "thundergun_fling_range", 480 );
  25. set_zombie_var( "thundergun_gib_range", 900 );
  26. set_zombie_var( "thundergun_gib_damage", 75 );
  27. set_zombie_var( "thundergun_knockdown_range", 1200 );
  28. set_zombie_var( "thundergun_knockdown_damage", 15 );
  29. level.thundergun_gib_refs = [];
  30. level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "guts";
  31. level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "right_arm";
  32. level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "left_arm";
  33. level thread thundergun_on_player_connect();
  34. }
  35. thundergun_on_player_connect()
  36. {
  37. for( ;; )
  38. {
  39. level waittill( "connecting", player );
  40. player thread wait_for_thundergun_fired();
  41. }
  42. }
  43. wait_for_thundergun_fired()
  44. {
  45. self endon( "disconnect" );
  46. self waittill( "spawned_player" );
  47. for( ;; )
  48. {
  49. self waittill( "weapon_fired" );
  50. currentweapon = self GetCurrentWeapon();
  51. if( ( currentweapon == "thundergun_zm" ) || ( currentweapon == "thundergun_upgraded_zm" ) )
  52. {
  53. self thread thundergun_fired();
  54. view_pos = self GetTagOrigin( "tag_flash" ) - self GetPlayerViewHeight();
  55. view_angles = self GetTagAngles( "tag_flash" );
  56. playfx( level._effect["thundergun_smoke_cloud"], view_pos, AnglesToForward( view_angles ), AnglesToUp( view_angles ) );
  57. }
  58. }
  59. }
  60. thundergun_network_choke()
  61. {
  62. level.thundergun_network_choke_count++;
  63.  
  64. if ( !(level.thundergun_network_choke_count % 10) )
  65. {
  66. wait_network_frame();
  67. wait_network_frame();
  68. wait_network_frame();
  69. }
  70. }
  71. thundergun_fired()
  72. {
  73.  
  74. PhysicsExplosionCylinder( self.origin, 600, 240, 1 );
  75.  
  76. if ( !IsDefined( level.thundergun_knockdown_enemies ) )
  77. {
  78. level.thundergun_knockdown_enemies = [];
  79. level.thundergun_knockdown_gib = [];
  80. level.thundergun_fling_enemies = [];
  81. level.thundergun_fling_vecs = [];
  82. }
  83. self thundergun_get_enemies_in_range();
  84.  
  85. level.thundergun_network_choke_count = 0;
  86. for ( i = 0; i < level.thundergun_fling_enemies.size; i++ )
  87. {
  88. thundergun_network_choke();
  89. level.thundergun_fling_enemies[i] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[i], i );
  90. }
  91. for ( i = 0; i < level.thundergun_knockdown_enemies.size; i++ )
  92. {
  93. thundergun_network_choke();
  94. level.thundergun_knockdown_enemies[i] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[i] );
  95. }
  96. level.thundergun_knockdown_enemies = [];
  97. level.thundergun_knockdown_gib = [];
  98. level.thundergun_fling_enemies = [];
  99. level.thundergun_fling_vecs = [];
  100. }
  101. thundergun_get_enemies_in_range()
  102. {
  103. view_pos = self GetWeaponMuzzlePoint();
  104. zombies = get_array_of_closest( view_pos, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.zombie_vars["thundergun_knockdown_range"] );
  105. if ( !isDefined( zombies ) )
  106. {
  107. return;
  108. }
  109. knockdown_range_squared = level.zombie_vars["thundergun_knockdown_range"] * level.zombie_vars["thundergun_knockdown_range"];
  110. gib_range_squared = level.zombie_vars["thundergun_gib_range"] * level.zombie_vars["thundergun_gib_range"];
  111. fling_range_squared = level.zombie_vars["thundergun_fling_range"] * level.zombie_vars["thundergun_fling_range"];
  112. cylinder_radius_squared = level.zombie_vars["thundergun_cylinder_radius"] * level.zombie_vars["thundergun_cylinder_radius"];
  113. forward_view_angles = self GetWeaponForwardDir();
  114. end_pos = view_pos + vector_scale( forward_view_angles, level.zombie_vars["thundergun_knockdown_range"] );
  115. for ( i = 0; i < zombies.size; i++ )
  116. {
  117. if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) )
  118. {
  119.  
  120. continue;
  121. }
  122. test_origin = zombies[i] getcentroid();
  123. test_range_squared = DistanceSquared( view_pos, test_origin );
  124. if ( test_range_squared > knockdown_range_squared )
  125. {
  126. zombies[i] thundergun_debug_print( "range", (1, 0, 0) );
  127. return;
  128. }
  129. normal = VectorNormalize( test_origin - view_pos );
  130. dot = VectorDot( forward_view_angles, normal );
  131. if ( 0 > dot )
  132. {
  133.  
  134. zombies[i] thundergun_debug_print( "dot", (1, 0, 0) );
  135. continue;
  136. }
  137.  
  138. radial_origin = PointOnSegmentNearestToPoint( view_pos, end_pos, test_origin );
  139. if ( DistanceSquared( test_origin, radial_origin ) > cylinder_radius_squared )
  140. {
  141.  
  142. zombies[i] thundergun_debug_print( "cylinder", (1, 0, 0) );
  143. continue;
  144. }
  145. if ( 0 == zombies[i] DamageConeTrace( view_pos, self ) )
  146. {
  147.  
  148. zombies[i] thundergun_debug_print( "cone", (1, 0, 0) );
  149. continue;
  150. }
  151. if ( test_range_squared < fling_range_squared )
  152. {
  153. level.thundergun_fling_enemies[level.thundergun_fling_enemies.size] = zombies[i];
  154.  
  155. dist_mult = (fling_range_squared - test_range_squared) / fling_range_squared;
  156. fling_vec = VectorNormalize( test_origin - view_pos );
  157.  
  158. if ( 5000 < test_range_squared )
  159. {
  160. fling_vec = fling_vec + VectorNormalize( test_origin - radial_origin );
  161. }
  162. fling_vec = (fling_vec[0], fling_vec[1], abs( fling_vec[2] ));
  163. fling_vec = vector_scale( fling_vec, 100 + 100 * dist_mult );
  164. level.thundergun_fling_vecs[level.thundergun_fling_vecs.size] = fling_vec;
  165. zombies[i] thread setup_thundergun_vox( self, true, false, false );
  166. }
  167. else if ( test_range_squared < gib_range_squared )
  168. {
  169. level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
  170. level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = true;
  171. zombies[i] thread setup_thundergun_vox( self, false, true, false );
  172. }
  173. else
  174. {
  175. level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
  176. level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = false;
  177. zombies[i] thread setup_thundergun_vox( self, false, false, true );
  178. }
  179. }
  180. }
  181. thundergun_debug_print( msg, color )
  182. {
  183. }
  184. thundergun_fling_zombie( player, fling_vec, index )
  185. {
  186. if( !IsDefined( self ) || !IsAlive( self ) )
  187. {
  188.  
  189. return;
  190. }
  191. if ( IsDefined( self.thundergun_fling_func ) )
  192. {
  193. self [[ self.thundergun_fling_func ]]( player );
  194. return;
  195. }
  196.  
  197. self DoDamage( self.health + 666, player.origin, player );
  198. if ( self.health <= 0 )
  199. {
  200. points = 10;
  201. if ( !index )
  202. {
  203. points = maps\_zombiemode_score::get_zombie_death_player_points();
  204. }
  205. else if ( 1 == index )
  206. {
  207. points = 30;
  208. }
  209. player maps\_zombiemode_score::player_add_points( "thundergun_fling", points );
  210.  
  211. self StartRagdoll();
  212. self LaunchRagdoll( fling_vec );
  213. self.thundergun_death = true;
  214. }
  215. }
  216. thundergun_knockdown_zombie( player, gib )
  217. {
  218. self endon( "death" );
  219. playsoundatposition ("vox_thundergun_forcehit", self.origin);
  220. playsoundatposition ("wpn_thundergun_proj_impact", self.origin);
  221. if( !IsDefined( self ) || !IsAlive( self ) )
  222. {
  223.  
  224. return;
  225. }
  226. if ( IsDefined( self.thundergun_knockdown_func ) )
  227. {
  228. self [[ self.thundergun_knockdown_func ]]( player, gib );
  229. }
  230. else
  231. {
  232.  
  233. self DoDamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player );
  234.  
  235.  
  236. }
  237.  
  238. if ( gib )
  239. {
  240. self.a.gib_ref = random( level.thundergun_gib_refs );
  241. self thread animscripts\zombie_death::do_gib();
  242. }
  243. self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks;
  244. self DoDamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player );
  245. self playsound( "fly_thundergun_forcehit" );
  246.  
  247. }
  248. handle_thundergun_pain_notetracks( note )
  249. {
  250. if ( note == "zombie_knockdown_ground_impact" )
  251. {
  252. playfx( level._effect["thundergun_knockdown_ground"], self.origin, AnglesToForward( self.angles ), AnglesToUp( self.angles ) );
  253. self playsound( "fly_thundergun_forcehit" );
  254. }
  255. }
  256. is_thundergun_damage()
  257. {
  258. return IsDefined( self.damageweapon ) && (self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm") && (self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH");
  259. }
  260. enemy_killed_by_thundergun()
  261. {
  262. return ( IsDefined( self.thundergun_death ) && self.thundergun_death == true );
  263. }
  264. thundergun_sound_thread()
  265. {
  266. self endon( "disconnect" );
  267. self waittill( "spawned_player" );
  268. for( ;; )
  269. {
  270. result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" );
  271. if ( !IsDefined( result ) )
  272. {
  273. continue;
  274. }
  275. if( ( result == "weapon_change" || result == "grenade_fire" ) && self GetCurrentWeapon() == "thundergun_zm" )
  276. {
  277. self PlayLoopSound( "tesla_idle", 0.25 );
  278. }
  279. else
  280. {
  281. self notify ("weap_away");
  282. self StopLoopSound(0.25);
  283. }
  284. }
  285. }
  286. setup_thundergun_vox( player, fling, gib, knockdown )
  287. {
  288. if( !IsDefined( self ) || !IsAlive( self ) )
  289. {
  290. return;
  291. }
  292.  
  293. if( !fling && ( gib || knockdown ) )
  294. {
  295. if( 25 > RandomIntRange( 1, 100 ) )
  296. {
  297.  
  298. }
  299. }
  300.  
  301. if( fling )
  302. {
  303. if( 30 > RandomIntRange( 1, 100 ) )
  304. {
  305.  
  306. player maps\_zombiemode_audio::create_and_play_dialog( "kill", "thundergun" );
  307. }
  308. }
  309. }
Advertisement
Add Comment
Please, Sign In to add comment