1 #using scripts\codescripts\struct;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\system_shared;
5 #using scripts\shared\array_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\version.gsh;
10 #insert scripts\zm\_zm_weap_gravityspikes.gsh;
11 #insert scripts\shared\ai\zombie_vortex.gsh;
13 #using scripts\shared\ai\zombie_vortex;
15 #define STR_GRAVITY_TRAP_BEAM "electric_arc_sm_tesla_beam_pap"
17 #precache( "client_fx", "electric/fx_elec_burst_lg_z270_os" );
18 #precache( "client_fx", "dlc1/castle/fx_weapon_gravityspike_location_glow" );
19 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_trap_start" );
20 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_trap_loop" );
21 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_trap_end" );
22 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_grnd_hit" );
23 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_grnd_hit_1p" );
24 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_trap_handle_sparks" );
25 #precache( "client_fx", "electric/fx_ability_elec_surge_short_robot_optim" );
26 #precache( "client_fx", "light/fx_light_spark_chest_zombie_optim" );
27 #precache( "client_fx", "dlc1/zmb_weapon/fx_wpn_spike_torso_trail" );
28 #precache( "client_fx", "dlc1/castle/fx_tesla_trap_body_exp");
36 level._effect[
"gravityspikes_destroy"] =
"electric/fx_elec_burst_lg_z270_os";
37 level._effect[
"gravityspikes_location"] =
"dlc1/castle/fx_weapon_gravityspike_location_glow";
39 level._effect[
"gravityspikes_slam"] =
"dlc1/zmb_weapon/fx_wpn_spike_grnd_hit";
40 level._effect[
"gravityspikes_slam_1p"] =
"dlc1/zmb_weapon/fx_wpn_spike_grnd_hit_1p";
41 level._effect[
"gravityspikes_trap_start"] =
"dlc1/zmb_weapon/fx_wpn_spike_trap_start";
42 level._effect[
"gravityspikes_trap_loop"] =
"dlc1/zmb_weapon/fx_wpn_spike_trap_loop";
43 level._effect[
"gravityspikes_trap_end"] =
"dlc1/zmb_weapon/fx_wpn_spike_trap_end";
45 level._effect[
"gravity_trap_spike_spark"] =
"dlc1/zmb_weapon/fx_wpn_spike_trap_handle_sparks";
47 level._effect[
"zombie_sparky"] =
"electric/fx_ability_elec_surge_short_robot_optim";
48 level._effect[
"zombie_spark_light"] =
"light/fx_light_spark_chest_zombie_optim";
49 level._effect[
"zombie_spark_trail"] =
"dlc1/zmb_weapon/fx_wpn_spike_torso_trail";
51 level._effect[
"gravity_spike_zombie_explode"] =
"dlc1/castle/fx_tesla_trap_body_exp";
71 function gravity_slam_down( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
79 function gravity_slam_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
83 if ( IsDefined(
self.slam_fx ) )
85 DeleteFX( localClientNum,
self.slam_fx,
true );
87 PlayFxOnTag( localClientNum, level._effect[
"gravityspikes_slam"],
self,
"tag_origin" );
93 PlayFXOnCamera(localClientNum, level._effect[
"gravityspikes_slam_1p"]);
96 function gravity_trap_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
100 self.b_gravity_trap_fx =
true;
102 if ( !isdefined( level.a_mdl_gravity_traps ) )
104 level.a_mdl_gravity_traps = [];
107 if ( !IsInArray( level.a_mdl_gravity_traps,
self ) )
109 ARRAY_ADD( level.a_mdl_gravity_traps,
self );
112 PlayFxOnTag( localClientNum, level._effect[
"gravityspikes_trap_start"],
self,
"tag_origin" );
116 if(
IS_TRUE(
self.b_gravity_trap_fx ) )
118 self.n_gravity_trap_fx = PlayFxOnTag( localClientNum, level._effect[
"gravityspikes_trap_loop"],
self,
"tag_origin" );
123 self.b_gravity_trap_fx = undefined;
125 if ( isdefined(
self.n_gravity_trap_fx ) )
127 DeleteFx( localClientNum,
self.n_gravity_trap_fx,
true );
129 self.n_gravity_trap_fx = undefined;
132 ArrayRemoveValue( level.a_mdl_gravity_traps,
self );
134 PlayFxOnTag( localClientNum, level._effect[
"gravityspikes_trap_end"],
self,
"tag_origin" );
142 self.spark_fx_id = PlayFxOnTag( localClientNum, level._effect[
"gravity_trap_spike_spark"],
self,
"tag_origin" );
146 if ( isdefined(
self.spark_fx_id ) )
148 DeleteFx( localClientNum,
self.spark_fx_id,
true );
157 self.fx_id_location = PlayFxOnTag( localClientNum, level._effect[
"gravityspikes_location"],
self,
"tag_origin" );
161 if ( isdefined(
self.fx_id_location ) )
163 DeleteFx( localClientNum,
self.fx_id_location,
true );
164 self.fx_id_location = undefined;
171 PlayFx( localClientNum, level._effect[
"gravityspikes_destroy"],
self.origin );
188 self endon(
"entityshutdown");
190 self.v_start_pos =
self.origin;
195 v_prev_origin =
self.origin;
196 waitrealtime( n_wait_time );
198 v_prev_vel =
self.origin - v_prev_origin;
199 n_prev_speed = length( v_prev_vel );
200 v_prev_origin =
self.origin;
201 waitrealtime( n_wait_time );
207 v_vel =
self.origin - v_prev_origin;
208 n_speed = length( v_vel );
210 if( n_speed < n_prev_speed * 0.5 && n_speed <= n_gib_speed && !b_first_loop )
212 if(
self.origin[2] > (
self.v_start_pos[2] + 128 ) )
214 if ( isdefined( level._effect[
"zombie_guts_explosion" ] ) &&
util::is_mature() )
216 PlayFX( localClientNum, level._effect[
"zombie_guts_explosion"],
self.origin, AnglesToForward(
self.angles ) );
225 v_prev_origin =
self.origin;
226 n_prev_speed = n_speed;
227 b_first_loop =
false;
229 waitrealtime( n_wait_time );
244 self notify(
"vortex_stop" );
250 level endon(
"demo_jump");
251 self endon(
"vortex_stop" );
252 self endon(
"death" );
254 while( isdefined(
self) )
264 function play_sparky_beam_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
270 a_sparky_tags = Array(
"J_Spine4",
"J_SpineUpper",
"J_Spine1" );
271 str_tag = array::random( a_sparky_tags );
273 if ( isdefined( level.a_mdl_gravity_traps ) )
275 mdl_gravity_trap = ArrayGetClosest(
self.origin, level.a_mdl_gravity_traps );
278 if( isdefined( mdl_gravity_trap ) )
280 self.e_sparky_beam = BeamLaunch( localClientNum, mdl_gravity_trap,
"tag_origin", ai_zombie, str_tag,
STR_GRAVITY_TRAP_BEAM );
285 if( isdefined(
self.e_sparky_beam ) )
287 BeamKill( localclientnum,
self.e_sparky_beam );
296 if( !isdefined(
self.sparky_loop_snd ) )
298 self.sparky_loop_snd =
self PlayLoopSound(
"zmb_electrozomb_lp", 0.2 );
301 self.n_sparky_fx = PlayFXOnTag( localClientNum, level._effect[
"zombie_sparky"],
self,
"J_SpineUpper" );
302 SetFXIgnorePause( localClientNum,
self.n_sparky_fx,
true );
304 self.n_sparky_fx = PlayFXOnTag( localClientNum, level._effect[
"zombie_spark_light"],
self,
"J_SpineUpper" );
305 SetFXIgnorePause( localClientNum,
self.n_sparky_fx,
true );
309 if ( isdefined(
self.n_sparky_fx ) )
311 DeleteFx( localClientNum,
self.n_sparky_fx,
true );
313 self.n_sparky_fx = undefined;
321 self.n_trail_fx = PlayFXOnTag( localClientNum, level._effect[
"zombie_spark_trail"],
self,
"J_SpineUpper" );
322 SetFXIgnorePause( localClientNum,
self.n_trail_fx,
true );
326 if ( isdefined(
self.n_trail_fx ) )
328 DeleteFx( localClientNum,
self.n_trail_fx,
true );
330 self.n_trail_fx = undefined;
336 self endon(
"entityshutdown" );
341 PlayFxOnTag( localClientNum, level._effect[
"gravity_spike_zombie_explode" ],
self,
"j_spine4" );