1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\system_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\shared.gsh;
10 #using scripts\shared\ai\zombie_death;
11 #using scripts\shared\ai\zombie_shared;
12 #using scripts\shared\ai\zombie_utility;
14 #using scripts\zm\_util;
15 #using scripts\zm\_zm_audio;
16 #using scripts\zm\_zm_score;
17 #using scripts\zm\_zm_utility;
18 #using scripts\zm\_zm_weapons;
20 #insert scripts\zm\_zm_weap_thundergun.gsh;
22 #precache( "fx", STR_KNOCKBACK_GROUND );
23 #precache( "fx", STR_SMOKE_CLOUD );
25 #namespace zm_weap_thundergun;
31 level.weaponZMThunderGun = GetWeapon(
"thundergun" );
32 level.weaponZMThunderGunUpgraded = GetWeapon(
"thundergun_upgraded" );
48 level.thundergun_gib_refs = [];
49 level.thundergun_gib_refs[level.thundergun_gib_refs.size] =
"guts";
50 level.thundergun_gib_refs[level.thundergun_gib_refs.size] =
"right_arm";
51 level.thundergun_gib_refs[level.thundergun_gib_refs.size] =
"left_arm";
70 self endon(
"disconnect" );
71 self waittill(
"spawned_player" );
75 self waittill(
"weapon_fired" );
76 currentweapon =
self GetCurrentWeapon();
77 if( ( currentweapon == level.weaponZMThunderGun ) || ( currentweapon == level.weaponZMThunderGunUpgraded ) )
81 view_pos =
self GetTagOrigin(
"tag_flash" ) -
self GetPlayerViewHeight();
82 view_angles =
self GetTagAngles(
"tag_flash" );
84 PlayFx( level._effect[
"thundergun_smoke_cloud"], view_pos, AnglesToForward( view_angles ), AnglesToUp( view_angles ) );
92 level.thundergun_network_choke_count++;
94 if ( !(level.thundergun_network_choke_count % 10) )
106 PhysicsExplosionCylinder(
self.origin, 600, 240, 1 );
113 if ( !IsDefined( level.thundergun_knockdown_enemies ) )
115 level.thundergun_knockdown_enemies = [];
116 level.thundergun_knockdown_gib = [];
117 level.thundergun_fling_enemies = [];
118 level.thundergun_fling_vecs = [];
123 level.thundergun_network_choke_count = 0;
124 for ( i = 0; i < level.thundergun_fling_enemies.size; i++ )
129 for ( i = 0; i < level.thundergun_knockdown_enemies.size; i++ )
134 level.thundergun_knockdown_enemies = [];
135 level.thundergun_knockdown_gib = [];
136 level.thundergun_fling_enemies = [];
137 level.thundergun_fling_vecs = [];
143 view_pos =
self GetWeaponMuzzlePoint();
144 zombies = array::get_all_closest( view_pos, GetAITeamArray( level.zombie_team ), undefined, undefined, level.zombie_vars[
"thundergun_knockdown_range"] );
145 if ( !isDefined( zombies ) )
150 knockdown_range_squared = level.zombie_vars[
"thundergun_knockdown_range"] * level.zombie_vars[
"thundergun_knockdown_range"];
151 gib_range_squared = level.zombie_vars[
"thundergun_gib_range"] * level.zombie_vars[
"thundergun_gib_range"];
152 fling_range_squared = level.zombie_vars[
"thundergun_fling_range"] * level.zombie_vars[
"thundergun_fling_range"];
153 cylinder_radius_squared = level.zombie_vars[
"thundergun_cylinder_radius"] * level.zombie_vars[
"thundergun_cylinder_radius"];
155 forward_view_angles =
self GetWeaponForwardDir();
156 end_pos = view_pos + VectorScale( forward_view_angles, level.zombie_vars[
"thundergun_knockdown_range"] );
158 for ( i = 0; i < zombies.size; i++ )
160 if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) )
166 test_origin = zombies[i] getcentroid();
167 test_range_squared = DistanceSquared( view_pos, test_origin );
168 if ( test_range_squared > knockdown_range_squared )
174 normal = VectorNormalize( test_origin - view_pos );
175 dot = VectorDot( forward_view_angles, normal );
183 radial_origin = PointOnSegmentNearestToPoint( view_pos, end_pos, test_origin );
184 if ( DistanceSquared( test_origin, radial_origin ) > cylinder_radius_squared )
191 if ( 0 == zombies[i] DamageConeTrace( view_pos,
self ) )
198 if ( test_range_squared < fling_range_squared )
200 level.thundergun_fling_enemies[level.thundergun_fling_enemies.size] = zombies[i];
203 dist_mult = (fling_range_squared - test_range_squared) / fling_range_squared;
204 fling_vec = VectorNormalize( test_origin - view_pos );
207 if ( 5000 < test_range_squared )
209 fling_vec = fling_vec + VectorNormalize( test_origin - radial_origin );
211 fling_vec = (fling_vec[0], fling_vec[1], abs( fling_vec[2] ));
212 fling_vec = VectorScale( fling_vec, 100 + 100 * dist_mult );
213 level.thundergun_fling_vecs[level.thundergun_fling_vecs.size] = fling_vec;
217 else if ( test_range_squared < gib_range_squared )
219 level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
220 level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] =
true;
226 level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i];
227 level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] =
false;
242 if( !IsDefined(
self ) || !IsAlive(
self ) )
248 if ( IsDefined(
self.thundergun_fling_func ) )
250 self [[
self.thundergun_fling_func ]]( player );
254 self.deathpoints_already_given =
true;
256 self DoDamage(
self.health + 666, player.origin, player );
258 if (
self.health <= 0 )
260 if( isdefined(player) && isdefined(level.hero_power_update))
262 level thread [[level.hero_power_update]](player,
self);
270 else if ( 1 == index )
277 self LaunchRagdoll( fling_vec );
279 self.thundergun_death =
true;
286 if (
gib && !
self.gibbed )
288 self.a.gib_ref = array::random( level.thundergun_gib_refs );
292 if(isDefined(level.override_thundergun_damage_func))
294 self[[level.override_thundergun_damage_func]](player,
gib);
298 damage = level.zombie_vars[
"thundergun_knockdown_damage"];
299 self playsound(
"fly_thundergun_forcehit" );
301 self DoDamage(
damage, player.origin, player );
308 self notify(
"end_play_thundergun_pain_anim" );
309 self endon(
"killanimscript" );
310 self endon(
"death" );
311 self endon(
"end_play_thundergun_pain_anim" );
313 if( isDefined(
self.marked_for_death ) &&
self.marked_for_death )
318 if (
self.damageYaw <= -135 || self.damageYaw >= 135 )
320 if (
self.missingLegs )
322 fallAnim =
"zm_thundergun_fall_front_crawl";
326 fallAnim =
"zm_thundergun_fall_front";
329 getupAnim =
"zm_thundergun_getup_belly_early";
331 else if (
self.damageYaw > -135 &&
self.damageYaw < -45 )
333 fallAnim =
"zm_thundergun_fall_left";
334 getupAnim =
"zm_thundergun_getup_belly_early";
336 else if (
self.damageYaw > 45 &&
self.damageYaw < 135 )
338 fallAnim =
"zm_thundergun_fall_right";
339 getupAnim =
"zm_thundergun_getup_belly_early";
343 fallAnim =
"zm_thundergun_fall_back";
345 if( RandomInt(100) < 50 )
347 getupAnim =
"zm_thundergun_getup_back_early";
351 getupAnim =
"zm_thundergun_getup_back_late";
355 self SetAnimStateFromASD( fallAnim );
358 if( !IsDefined(
self ) || !IsAlive(
self ) ||
self.missingLegs || (isDefined(
self.marked_for_death ) &&
self.marked_for_death) )
364 self SetAnimStateFromASD( getupAnim );
370 self endon(
"death" );
372 playsoundatposition (
"wpn_thundergun_proj_impact",
self.origin);
375 if( !IsDefined(
self ) || !IsAlive(
self ) )
381 if ( IsDefined(
self.thundergun_knockdown_func ) )
383 self [[
self.thundergun_knockdown_func ]]( player,
gib );
390 if ( note ==
"zombie_knockdown_ground_impact" )
392 PlayFx( level._effect[
"thundergun_knockdown_ground"],
self.origin, AnglesToForward(
self.angles ), AnglesToUp(
self.angles ) );
393 self playsound(
"fly_thundergun_forcehit" );
400 return (
self.damageweapon == level.weaponZMThunderGun ||
self.damageweapon == level.weaponZMThunderGunUpgraded) && (
self.damagemod !=
"MOD_GRENADE" &&
self.damagemod !=
"MOD_GRENADE_SPLASH");
406 return IS_TRUE(
self.thundergun_death );
412 self endon(
"disconnect" );
413 self waittill(
"spawned_player" );
425 if( (
result ==
"weapon_change" ||
result ==
"grenade_fire" ) &&
self GetCurrentWeapon() == level.weaponZMThunderGun )
427 self PlayLoopSound(
"tesla_idle", 0.25 );
432 self notify (
"weap_away");
433 self StopLoopSound(0.25);
443 if( !IsDefined(
self ) || !IsAlive(
self ) )
448 if( !fling && (
gib || knockdown ) )
450 if( 25 > RandomIntRange( 1, 100 ) )
458 if( 30 > RandomIntRange( 1, 100 ) )