4 #using scripts\shared\ai_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\clientfield_shared;
7 #using scripts\shared\flag_shared;
8 #using scripts\shared\scene_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\util_shared;
11 #using scripts\shared\visionset_mgr_shared;
13 #using scripts\zm\_util;
14 #using scripts\zm\_zm;
15 #using scripts\zm\_zm_audio;
16 #using scripts\zm\_zm_spawner;
17 #using scripts\zm\_zm_utility;
19 #insert scripts\shared\shared.gsh;
20 #insert scripts\shared\version.gsh;
21 #insert scripts\zm\_zm_utility.gsh;
23 #insert scripts\zm\_zm_weap_raygun_mark3.gsh;
26 #define N_RAYGUN_MARK3LH_VORTEX_DURATION 3000 // in ms
27 #define N_RAYGUN_MARK3LH_UPGRADED_VORTEX_DURATION 3000 // in ms
29 #define N_RAYGUN_MARK3LH_SLOWDOWN_RATE 0.7
30 #define N_RAYGUN_MARK3LH_UPGRADED_SLOWDOWN_RATE 0.5
32 #define N_RAYGUN_MARK3LH_SLOWDOWN_DURATION 2.0
33 #define N_RAYGUN_MARK3LH_UPGRADED_SLOWDOWN_DURATION 3.0
35 #define N_RAYGUN_MARK3LH_VORTEX_RANGE_SM 128
36 #define N_RAYGUN_MARK3LH_VORTEX_RANGE_LG 128
38 #define N_RAYGUN_MARK3LH_VORTEX_PULSE_INTERVAL 0.5
40 #define N_RAYGUN_MARK3LH_VORTEX_PULSE_DAMAGE_SM 50
41 #define N_RAYGUN_MARK3LH_VORTEX_PULSE_DAMAGE_LG 1000
42 #define N_RAYGUN_MARK3LH_UPGRADED_VORTEX_PULSE_DAMAGE_SM 100
43 #define N_RAYGUN_MARK3LH_UPGRADED_VORTEX_PULSE_DAMAGE_LG 5000
45 #define N_RAYGUN_MARK3_VORTEX_Z_OFFSET 32 // How far off the ground we should default position the vortex
49 #define N_RAYGUN_MARK3_VORTEX_ENTER_DURATION 0.25
50 #define N_RAYGUN_MARK3_VORTEX_LOOP_DURATION 2.0
51 #define N_RAYGUN_MARK3_VORTEX_EXIT_DURATION 0.25
54 #precache( "model", "p7_fxanim_zm_stal_ray_gun_ball_mod" );
56 #namespace _zm_weap_raygun_mark3;
96 if ( weapon === level.w_raygun_mark3lh || weapon === level.w_raygun_mark3lh_upgraded )
108 if ( weapon === level.w_raygun_mark3 || weapon === level.w_raygun_mark3_upgraded )
120 v_nearest_navmesh_point = GetClosestPointOnNavMesh( v_impact_origin, 50, 32 );
121 if ( isdefined(v_nearest_navmesh_point) )
127 v_vortex_origin = v_impact_origin;
130 return v_vortex_origin;
138 self endon(
"disconnect");
142 self waittill(
"projectile_impact", w_weapon, v_pos, n_radius, e_projectile, v_normal );
149 self thread
start_slow_vortex( w_weapon, v_pos, v_pos_final, n_radius, e_projectile, v_normal );
159 self endon(
"disconnect" );
161 mdl_vortex =
Spawn(
"script_model", v_pos );
162 mdl_vortex SetModel(
"p7_fxanim_zm_stal_ray_gun_ball_mod" );
163 playsoundatposition (
"wpn_mk3_orb_created", mdl_vortex.origin);
164 mdl_vortex.angles = ( 270, 0, 0 );
168 mdl_vortex MoveTo( v_pos_final, 0.1 );
171 mdl_vortex.health = 100000;
172 mdl_vortex.takedamage =
true;
182 self endon(
"death" );
186 self.e_owner = e_owner;
188 if ( w_weapon == level.w_raygun_mark3lh )
194 playsoundatposition (
"wpn_mk3_orb_zark_far",
self.origin);
198 while ( GetTime() <=
self.n_end_time )
205 if ( w_weapon == level.w_raygun_mark3lh )
217 playsoundatposition (
"wpn_mk3_orb_zark_far",
self.origin);
219 if ( w_weapon == level.w_raygun_mark3lh )
230 n_radius_squared = n_radius * n_radius;
231 a_ai = GetAITeamArray(
"axis" );
232 foreach( ai
in a_ai )
234 if (
IS_TRUE( ai.b_ignore_mark3_pulse_damage ) )
239 if ( DistanceSquared(
self.origin, ai.origin ) <= n_radius_squared )
243 if ( ai.health > n_pulse_damage )
245 ai DoDamage( n_pulse_damage,
self.origin, e_owner,
self, undefined,
"MOD_UNKNOWN", 0, w_weapon );
255 foreach( e_player
in level.activeplayers )
257 if( IsDefined(e_player) && !
IS_TRUE( e_player.raygun_mark3_vision_on ) )
260 if( Distance( e_player.origin,
self.origin ) < Float( n_radius / 2 ) )
273 playsoundatposition (
"wpn_mk3_orb_disappear",
self.origin);
282 self notify(
"player_vortex_visionset" );
283 self endon(
"player_vortex_visionset" );
285 self endon(
"death" );
289 self.raygun_mark3_vision_on =
true;
292 self.raygun_mark3_vision_on =
false;
300 self endon(
"death" );
301 self playloopsound (
"wpn_mk3_orb_loop");
304 self waittill(
"damage", n_damage, e_attacker, v_direction, v_point, str_means_of_death, str_tag_name, str_model_name, str_part_name, w_weapon );
308 self stoploopsound();
309 self SetModel(
"tag_origin" );
310 self playloopsound (
"wpn_mk3_orb_loop_activated");
311 self.takedamage =
false;
316 playsoundatposition (
"wpn_mk3_orb_disappear",
self.origin);
322 self.health = 100000;
330 function raygun_mark3_damage_response( str_mod, str_hit_location, v_hit_origin, e_player, n_amount, w_weapon, v_direction, str_tag, str_model, str_part, n_flags, e_inflictor, n_chargeLevel )
332 if ( isdefined( w_weapon ) )
334 if ( w_weapon == level.w_raygun_mark3lh || w_weapon == level.w_raygun_mark3lh_upgraded )
337 if ( isdefined(
self.func_raygun_mark3_damage_response ) )
339 return [[
self.func_raygun_mark3_damage_response ]]( str_mod, str_hit_location, v_hit_origin, e_player, n_amount, w_weapon, v_direction, str_tag, str_model, str_part, n_flags, e_inflictor, n_chargeLevel );
343 if ( w_weapon == level.w_raygun_mark3lh )
348 else if ( w_weapon == level.w_raygun_mark3lh_upgraded )
365 self notify(
"apply_vortex_fx" );
366 self endon(
"apply_vortex_fx" );
367 self endon(
"death" );
369 if ( !
IS_TRUE(
self.b_vortex_fx_applied ) )
371 self.b_vortex_fx_applied =
true;
374 self.b_old_allow_pain =
true;
390 if (
IS_TRUE(
self.b_old_allow_pain ) )
400 self endon(
"death" );
402 if (
IS_TRUE(
self.b_disintegrating ) )
406 self.b_disintegrating =
true;
411 if ( IsVehicle(
self ) )
417 self DoDamage(
self.health,
self.origin, e_attacker, e_inflictor, undefined,
"MOD_UNKNOWN", 0, w_weapon );
421 self scene::play(
"cin_zm_dlc3_zombie_dth_deathray_0" + RandomIntRange( 1, 5 ),
self );
426 self DoDamage(
self.health,
self.origin, e_attacker, e_inflictor, undefined,
"MOD_UNKNOWN", 0, w_weapon );