1 #using scripts\shared\system_shared;
2 #using scripts\codescripts\struct;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\visionset_mgr_shared;
5 #using scripts\shared\audio_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\array_shared;
8 #using scripts\shared\vehicle_ai_shared;
9 #using scripts\shared\vehicle_death_shared;
11 #insert scripts\shared\shared.gsh;
12 #insert scripts\shared\ai\zombie_vortex.gsh;
13 #insert scripts\shared\version.gsh;
14 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
16 #namespace zombie_vortex;
32 level.vortex_manager = SpawnStruct();
33 level.vortex_manager.count = 0;
34 level.vortex_manager.a_vorticies = [];
35 level.vortex_manager.a_active_vorticies = [];
53 sVortex =
Spawn(
"script_model", (0,0,0) );
54 ARRAY_ADD( level.vortex_manager.a_vorticies, sVortex );
61 foreach( vortex
in level.vortex_manager.a_vorticies )
68 return level.vortex_manager.a_vorticies[0];
74 foreach( vortex
in level.vortex_manager.a_vorticies )
87 n_starttime = GetTime();
88 n_curtime = GetTime() - n_starttime;
90 while( n_curtime < n_vortex_time )
93 n_curtime = GetTime() - n_starttime;
122 function start_timed_vortex( v_vortex_origin, n_vortex_radius, vortex_pull_duration, vortex_effect_duration, n_vortex_explosion_radius, eAttacker, weapon, should_shellshock_player =
false, visionset_func = undefined, should_shield =
false, effect_version =
VORTEX_EFFECT_VERSION_NONE, should_explode =
true, vortex_projectile = undefined )
125 self endon(
"disconnect");
127 assert( IsDefined( v_vortex_origin ),
"Tried to create a vortex without an origin" );
128 assert( IsDefined( n_vortex_radius ),
"Tried to create a vortex without a radius" );
129 assert( IsDefined( vortex_pull_duration ),
"Tried to create a vortex without a duration" );
131 n_starttime = GetTime();
132 n_currtime = GetTime() - n_starttime;
134 a_e_players = GetPlayers();
136 if( !isDefined( n_vortex_explosion_radius ) )
138 n_vortex_explosion_radius = n_vortex_radius * 1.5;
142 sVortex.in_use =
true;
143 sVortex.attacker = eAttacker;
144 sVortex.weapon = weapon;
145 sVortex.angles = (0,0,0);
146 sVortex.origin = v_vortex_origin;
148 sVortex DontInterpolate();
153 s_active_vortex.weapon = weapon;
154 s_active_vortex.attacker = eAttacker;
156 ARRAY_ADD( level.vortex_manager.a_active_vorticies, s_active_vortex );
158 n_vortex_time_sv = vortex_pull_duration;
159 n_vortex_time_cl = ( IsDefined( vortex_effect_duration ) ? vortex_effect_duration : vortex_pull_duration );
161 n_vortex_time = n_vortex_time_sv * 1000;
165 if( IsDefined( level.zombie_team ) )
167 team = level.zombie_team;
170 while( n_currtime <= n_vortex_time )
172 a_ai_zombies = array::get_all_closest( v_vortex_origin, getAITeamArray( team ), undefined, undefined, n_vortex_radius );
175 a_ai_zombies = ArrayCombine( a_ai_zombies,
vortex_z_extension( a_ai_zombies, v_vortex_origin, n_vortex_radius ),
false,
false );
177 sVortex.zombies = a_ai_zombies;
179 if(
IS_TRUE( level.idgun_draw_debug ) )
182 Circle( v_vortex_origin, n_vortex_radius, ( 0, 0, 1 ),
false,
true, 1 );
187 foreach( ai_zombie
in a_ai_zombies )
189 if( IsVehicle( ai_zombie ) )
192 IsAlive( ai_zombie ) &&
195 !ai_zombie.ignorevortices
198 params = SpawnStruct();
199 params.vpoint = v_vortex_origin;
200 params.attacker = eAttacker;
201 params.weapon = weapon;
202 if ( IsDefined( ai_zombie.idgun_death_speed ) )
204 params.idgun_death_speed = ai_zombie.idgun_death_speed;
211 if( !
IS_TRUE( ai_zombie.interdimensional_gun_kill ) && !ai_zombie.ignorevortices )
213 ai_zombie.damageOrigin = v_vortex_origin;
216 ai_zombie.allowdeath =
false;
217 ai_zombie.magic_bullet_shield =
true;
219 ai_zombie.interdimensional_gun_kill =
true;
220 ai_zombie.interdimensional_gun_attacker = eAttacker;
221 ai_zombie.interdimensional_gun_inflictor = eAttacker;
222 ai_zombie.interdimensional_gun_weapon = weapon;
223 ai_zombie.interdimensional_gun_projectile = vortex_projectile;
228 if( should_shellshock_player )
230 foreach( e_player
in a_e_players )
232 if( IsDefined( visionset_func ) )
234 e_player thread [[visionset_func]](v_vortex_origin, n_vortex_radius, n_starttime, n_vortex_time_sv, n_vortex_time_cl );
238 if( IsDefined(e_player) && !
IS_TRUE( e_player.idgun_vision_on ) )
241 if( Distance( e_player.origin, v_vortex_origin ) < Float( n_vortex_radius / 2 ) )
251 n_currtime = GetTime() - n_starttime;
256 n_time_to_wait_for_explosion = ( n_vortex_time_cl - n_vortex_time_sv ) + 0.35;
258 wait( n_time_to_wait_for_explosion );
260 sVortex.in_use =
false;
261 ArrayRemoveValue( level.vortex_manager.a_active_vorticies, s_active_vortex );
268 foreach( zombie
in sVortex.zombies )
270 if( !IsDefined( zombie ) || !IsAlive( zombie ) )
274 if( IsDefined( level.vortexResetCondition ) && [[level.vortexResetCondition]]( zombie ) )
279 zombie.interdimensional_gun_kill = undefined;
280 zombie.interdimensional_gun_attacker = undefined;
281 zombie.interdimensional_gun_inflictor = undefined;
282 zombie.interdimensional_gun_weapon = undefined;
283 zombie.interdimensional_gun_projectile = undefined;
285 zombie PathMode(
"move allowed" );
288 sVortex.in_use =
false;
289 ArrayRemoveValue( level.vortex_manager.a_active_vorticies, s_active_vortex );
296 a_ai_zombies_extended = array::get_all_closest( v_vortex_origin, getAITeamArray(
"axis" ), undefined, undefined, n_vortex_radius + 72 );
297 a_ai_zombies_extended_filtered = array::exclude( a_ai_zombies_extended, a_ai_zombies );
300 while ( i < a_ai_zombies_extended_filtered.size )
302 if ( ( a_ai_zombies_extended_filtered[ i ].origin[2] < v_vortex_origin[2] )
303 && BulletTracePassed( a_ai_zombies_extended_filtered[ i ].origin + ( 0, 0, 5 ), v_vortex_origin + ( 0, 0, 20 ),
false,
self, undefined,
false,
false ) )
309 ArrayRemoveValue( a_ai_zombies_extended_filtered, a_ai_zombies_extended_filtered[i]);
313 return a_ai_zombies_extended_filtered;
321 if( IsDefined( level.zombie_team ) )
323 team = level.zombie_team;
326 a_ai_zombies = array::get_all_closest( v_vortex_explosion_origin, getAITeamArray( team), undefined, undefined, n_vortex_radius );
328 if(
IS_TRUE( level.idgun_draw_debug ) )
331 Circle( v_vortex_explosion_origin, n_vortex_radius, ( 1, 0, 0 ),
false,
true, 1000 );
334 foreach( ai_zombie
in a_ai_zombies )
336 if( !ai_zombie.ignorevortices )
338 if(
IS_TRUE( ai_zombie.interdimensional_gun_kill ) )
345 ai_zombie.interdimensional_gun_kill = undefined;
346 ai_zombie.interdimensional_gun_kill_vortex_explosion = 1;
347 ai_zombie.veh_idgun_allow_damage =
true;
348 if( IsDefined( eAttacker ) )
350 ai_zombie DoDamage( ai_zombie.health + 10000, ai_zombie.origin, eAttacker, undefined, undefined,
"MOD_EXPLOSIVE" );
354 ai_zombie DoDamage( ai_zombie.health + 10000, ai_zombie.origin, undefined, undefined, undefined,
"MOD_EXPLOSIVE" );
357 n_radius_sqr = n_vortex_radius * n_vortex_radius;
358 n_distance_sqr = DistanceSquared( ai_zombie.origin, v_vortex_explosion_origin );
360 n_dist_mult = n_distance_sqr / n_radius_sqr;
362 v_fling = VectorNormalize( ai_zombie.origin - v_vortex_explosion_origin );
364 v_fling = (v_fling[0], v_fling[1], abs( v_fling[2] ));
365 v_fling = VectorScale( v_fling, 100 + 100 * n_dist_mult);
367 if ( !
IS_TRUE( level.ignore_vortex_ragdoll ) )
369 ai_zombie StartRagdoll();
370 ai_zombie LaunchRagdoll( v_fling );
383 self.idgun_vision_on =
true;
385 self.idgun_vision_on =
false;
391 if( IsAirborne(
self ) )
421 entToWatch waittill(
"death");
427 self endon(
"death" );
429 const veh_idgun_move_speed = 8.0;
430 const veh_idgun_crush_dist_sqr = 40.0 * 40.0;
432 black_hole_center = params.vpoint;
433 attacker = params.attacker;
434 weapon = params.weapon;
438 crush_anim =
"ai_zombie_zod_raps_dth_f_id_gun_crush";
442 veh_to_black_hole_vec = VectorNormalize( black_hole_center -
self.origin );
444 fly_ent =
Spawn(
"script_origin",
self.origin );
446 self LinkTo( fly_ent );
450 veh_to_black_hole_dist_sqr = DistanceSquared(
self.origin, black_hole_center );
454 self.veh_idgun_allow_damage =
true;
455 self DoDamage(
self.health + 666,
self.origin, attacker, undefined,
"none",
"MOD_UNKNOWN", 0, weapon );
458 else if( !
IS_TRUE(
self.crush_anim_started ) && veh_to_black_hole_dist_sqr < veh_idgun_crush_dist_sqr )
460 if(isDefined(crush_anim) )
462 self AnimScripted(
"anim_notify",
self.origin,
self.angles, crush_anim,
"normal", undefined, undefined, 0.2 );
464 self.crush_anim_started =
true;
467 fly_ent.origin += veh_to_black_hole_vec * veh_idgun_move_speed;
477 self SetNearGoalNotifyDist( 4 );
478 self.vehAirCraftCollisionEnabled =
false;
483 self endon(
"death" );
485 black_hole_center = params.vpoint;
486 attacker = params.attacker;
487 weapon = params.weapon;
490 if ( IsDefined( params.idgun_death_speed ) )
492 death_speed = params.idgun_death_speed;
495 self SetSpeed( death_speed );
497 self ASMRequestSubstate(
"idgun@movement" );
500 self SetVehGoalPos( black_hole_center,
false,
false );
501 self waittill(
"near_goal" );
504 self.veh_idgun_allow_damage =
true;
505 self DoDamage(
self.health + 666,
self.origin, attacker, undefined,
"none",
"MOD_UNKNOWN", 0, weapon );
510 self endon(
"death" );
511 const veh_idgun_crush_dist_sqr = 30.0 * 30.0;
515 if( DistanceSquared(
self.origin, black_hole_center ) < veh_idgun_crush_dist_sqr )
517 self ASMRequestSubstate(
"idgun_crush@movement" );
526 self endon(
"death" );
528 if( IsDefined(
self.parasiteEnemy ) && IsDefined(
self.parasiteEnemy.hunted_by ) )
530 self.parasiteEnemy.hunted_by--;
533 self playsound(
"zmb_parasite_explo" );