‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_zm_weap_gravityspikes.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\system_shared;
4 
5 #using scripts\shared\array_shared;
6 #using scripts\shared\util_shared;
7 
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;
12 
13 #using scripts\shared\ai\zombie_vortex;
14 
15 #define STR_GRAVITY_TRAP_BEAM "electric_arc_sm_tesla_beam_pap"
16 
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");
29 
30 ‪REGISTER_SYSTEM( "zm_weap_gravityspikes", &‪__init__, undefined )
31 
32 function ‪__init__( localClientNum )
33 {
35 
36  level._effect["gravityspikes_destroy"] = "electric/fx_elec_burst_lg_z270_os";
37  level._effect["gravityspikes_location"] = "dlc1/castle/fx_weapon_gravityspike_location_glow";
38 
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";
44 
45  level._effect["gravity_trap_spike_spark"] = "dlc1/zmb_weapon/fx_wpn_spike_trap_handle_sparks";
46 
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";
50 
51  level._effect["gravity_spike_zombie_explode"] = "dlc1/castle/fx_tesla_trap_body_exp";
52 }
53 
55 {
59  ‪clientfield::register( "scriptmover", "gravity_trap_destroy", ‪VERSION_SHIP, 1, "counter", &‪gravity_trap_destroy, !‪CF_HOST_ONLY, !‪CF_CALLBACK_ZERO_ON_NEW_ENT );
68  ‪clientfield::register("actor", "gravity_spike_zombie_explode_fx", ‪VERSION_TU12, 1, "counter", &‪gravity_spike_zombie_explode, !!‪CF_HOST_ONLY, !‪CF_CALLBACK_ZERO_ON_NEW_ENT );
69 }
70 
71 function ‪gravity_slam_down( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
72 {
73  if( newVal )
74  {
75  self LaunchRagdoll( ( 0, 0, -‪GRAVITY_SLAM_SPEED ) );
76  }
77 }
78 
79 function ‪gravity_slam_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
80 {
81  if( newVal )
82  {
83  if ( IsDefined( self.slam_fx ) )
84  {
85  DeleteFX( localClientNum, self.slam_fx, true );
86  }
87  PlayFxOnTag( localClientNum, level._effect["gravityspikes_slam"], self, "tag_origin" );
88  }
89 }
90 
91 function ‪gravity_slam_player_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump ) // self = player
92 {
93  PlayFXOnCamera(localClientNum, level._effect["gravityspikes_slam_1p"]);
94 }
95 
96 function ‪gravity_trap_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump ) // self = tag model for gravity trap
97 {
98  if( newVal == 1 )
99  {
100  self.b_gravity_trap_fx = true;
101 
102  if ( !isdefined( level.a_mdl_gravity_traps ) )
103  {
104  level.a_mdl_gravity_traps = []; // create array to track all gravity spikes. used for beam source in zombie beam fx
105  }
106 
107  if ( !IsInArray( level.a_mdl_gravity_traps, self ) )
108  {
109  ‪ARRAY_ADD( level.a_mdl_gravity_traps, self ); // if this gravity spike is not listed in array, add it
110  }
111 
112  PlayFxOnTag( localClientNum, level._effect["gravityspikes_trap_start"], self, "tag_origin" );
113 
114  wait 0.5; // wait to start up looping effect.
115 
116  if( ‪IS_TRUE( self.b_gravity_trap_fx ) ) // won't start if already expired
117  {
118  self.n_gravity_trap_fx = PlayFxOnTag( localClientNum, level._effect["gravityspikes_trap_loop"], self, "tag_origin" );
119  }
120  }
121  else
122  {
123  self.b_gravity_trap_fx = undefined;
124 
125  if ( isdefined( self.n_gravity_trap_fx ) )
126  {
127  DeleteFx( localClientNum, self.n_gravity_trap_fx, true );
128 
129  self.n_gravity_trap_fx = undefined;
130  }
131 
132  ArrayRemoveValue( level.a_mdl_gravity_traps, self ); // gravity trap done, stop tracking this model
133 
134  PlayFxOnTag( localClientNum, level._effect["gravityspikes_trap_end"], self, "tag_origin" );
135  }
136 }
137 
138 function ‪gravity_trap_spike_spark( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
139 {
140  if( newVal )
141  {
142  self.spark_fx_id = PlayFxOnTag( localClientNum, level._effect["gravity_trap_spike_spark"], self, "tag_origin" );
143  }
144  else
145  {
146  if ( isdefined( self.spark_fx_id ) )
147  {
148  DeleteFx( localClientNum, self.spark_fx_id, true );
149  }
150  }
151 }
152 
153 function ‪gravity_trap_location( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
154 {
155  if( newVal == 1 )
156  {
157  self.fx_id_location = PlayFxOnTag( localClientNum, level._effect["gravityspikes_location"], self, "tag_origin" );
158  }
159  else
160  {
161  if ( isdefined( self.fx_id_location ) )
162  {
163  DeleteFx( localClientNum, self.fx_id_location, true );
164  self.fx_id_location = undefined;
165  }
166  }
167 }
168 
169 function ‪gravity_trap_destroy( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
170 {
171  ‪PlayFx( localClientNum, level._effect["gravityspikes_destroy"], self.origin );
172 }
173 
174 // ------------------------------------------------------------------------------------------------------------
175 // Ragdoll impact watcher
176 // wait till impact to check height difference
177 // ------------------------------------------------------------------------------------------------------------
178 function ‪ragdoll_impact_watch_start( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasDemoJump ) // self = zombie
179 {
180  if( newVal == 1 )
181  {
182  self thread ‪ragdoll_impact_watch(localClientNum);
183  }
184 }
185 
186 function ‪ragdoll_impact_watch(localClientNum) // self = zombie
187 {
188  self endon("entityshutdown");
189 
190  self.v_start_pos = self.origin;
191 
192  n_wait_time = .05; //update rate (seconds)
193  n_gib_speed = 20; //units/sec
194 
195  v_prev_origin = self.origin;
196  waitrealtime( n_wait_time );
197 
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 );
202 
203  b_first_loop = true;
204 
205  while( true )
206  {
207  v_vel = self.origin - v_prev_origin;
208  n_speed = length( v_vel );
209 
210  if( n_speed < n_prev_speed * 0.5 && n_speed <= n_gib_speed && !b_first_loop )
211  {
212  if( self.origin[2] > ( self.v_start_pos[2] + 128 ) )
213  {
214  if ( isdefined( level._effect[ "zombie_guts_explosion" ] ) && ‪util::is_mature() )
215  {
216  PlayFX( localClientNum, level._effect["zombie_guts_explosion"], self.origin, AnglesToForward( self.angles ) );
217  }
218 
219  self Hide();
220  }
221 
222  break;
223  }
224 
225  v_prev_origin = self.origin;
226  n_prev_speed = n_speed;
227  b_first_loop = false;
228 
229  waitrealtime( n_wait_time );
230  }
231 }
232 
233 // ------------------------------------------------------------------------------------------------------------
234 // VORTEX RUMBLE ON PLAYER
235 // ------------------------------------------------------------------------------------------------------------
236 function ‪gravity_trap_rumble_callback( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump ) // self = player
237 {
238  if( newVal == 1 )
239  {
240  self thread ‪gravity_trap_rumble( localClientNum );
241  }
242  else
243  {
244  self notify( "vortex_stop" );
245  }
246 }
247 
248 function ‪gravity_trap_rumble( localClientNum ) // self = player
249 {
250  level endon("demo_jump"); // end when theater mode rewinds
251  self endon( "vortex_stop" );
252  self endon( "death" );
253 
254  while( isdefined(self) )
255  {
256  self PlayRumbleOnEntity( localClientNum, ‪VORTEX_RUMBLE_INTERIOR );
257  wait 0.075;
258  }
259 }
260 
261 // ------------------------------------------------------------------------------------------------------------
262 // Beam for Spike planted
263 // ------------------------------------------------------------------------------------------------------------
264 function ‪play_sparky_beam_fx( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump ) // self = zombie
265 {
266  if( newVal == 1 )
267  {
268  ai_zombie = self;
269 
270  a_sparky_tags = Array( "J_Spine4", "J_SpineUpper", "J_Spine1" );
271  str_tag = array::random( a_sparky_tags );
272 
273  if ( isdefined( level.a_mdl_gravity_traps ) )
274  {
275  mdl_gravity_trap = ArrayGetClosest( self.origin, level.a_mdl_gravity_traps ); // search all deployed gravity traps for the closest one
276  }
277 
278  if( isdefined( mdl_gravity_trap ) ) // use closest gravity trap for the beam source
279  {
280  self.e_sparky_beam = BeamLaunch( localClientNum, mdl_gravity_trap, "tag_origin", ai_zombie, str_tag, ‪STR_GRAVITY_TRAP_BEAM );
281  }
282  }
283  else
284  {
285  if( isdefined( self.e_sparky_beam ) )
286  {
287  BeamKill( localclientnum, self.e_sparky_beam );
288  }
289  }
290 }
291 
292 function ‪sparky_zombie_fx_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump) // self = zombie
293 {
294  if( newVal == 1 ) // sparks while running around
295  {
296  if( !isdefined( self.sparky_loop_snd ) )
297  {
298  self.sparky_loop_snd = self PlayLoopSound( "zmb_electrozomb_lp", 0.2 );
299  }
300 
301  self.n_sparky_fx = PlayFXOnTag( localClientNum, level._effect["zombie_sparky"], self, "J_SpineUpper" );
302  SetFXIgnorePause( localClientNum, self.n_sparky_fx, true );
303 
304  self.n_sparky_fx = PlayFXOnTag( localClientNum, level._effect["zombie_spark_light"], self, "J_SpineUpper" );
305  SetFXIgnorePause( localClientNum, self.n_sparky_fx, true );
306  }
307  else
308  {
309  if ( isdefined( self.n_sparky_fx ) )
310  {
311  DeleteFx( localClientNum, self.n_sparky_fx, true );
312  }
313  self.n_sparky_fx = undefined;
314  }
315 }
316 
317 function ‪sparky_zombie_trail_fx_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump) // self = zombie
318 {
319  if( newVal == 1 ) // sparks while running around
320  {
321  self.n_trail_fx = PlayFXOnTag( localClientNum, level._effect["zombie_spark_trail"], self, "J_SpineUpper" );
322  SetFXIgnorePause( localClientNum, self.n_trail_fx, true );
323  }
324  else
325  {
326  if ( isdefined( self.n_trail_fx ) )
327  {
328  DeleteFx( localClientNum, self.n_trail_fx, true );
329  }
330  self.n_trail_fx = undefined;
331  }
332 }
333 
334 function ‪gravity_spike_zombie_explode(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
335 {
336  self endon( "entityshutdown" );
337 
338  self ‪util::waittill_dobj( localClientNum );
339 
340  // one shot body explosion
341  PlayFxOnTag( localClientNum, level._effect[ "gravity_spike_zombie_explode" ], self, "j_spine4" );
342 }
‪gravity_trap_spike_spark
‪function gravity_trap_spike_spark(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:138
‪play_sparky_beam_fx
‪function play_sparky_beam_fx(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:264
‪sparky_zombie_fx_cb
‪function sparky_zombie_fx_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:292
‪gravity_slam_fx
‪function gravity_slam_fx(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:79
‪is_mature
‪function is_mature()
Definition: util_shared.csc:1300
‪gravity_slam_player_fx
‪function gravity_slam_player_fx(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:91
‪gravity_spike_zombie_explode
‪function gravity_spike_zombie_explode(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:334
‪CF_CALLBACK_ZERO_ON_NEW_ENT
‪#define CF_CALLBACK_ZERO_ON_NEW_ENT
Definition: version.gsh:103
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪gravity_trap_rumble_callback
‪function gravity_trap_rumble_callback(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:236
‪sparky_zombie_trail_fx_cb
‪function sparky_zombie_trail_fx_cb(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:317
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪gravity_slam_down
‪function gravity_slam_down(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:71
‪GRAVITY_SLAM_SPEED
‪#define GRAVITY_SLAM_SPEED
Definition: _zm_weap_gravityspikes.gsh:11
‪__init__
‪function __init__(localClientNum)
Definition: _zm_weap_gravityspikes.csc:32
‪STR_GRAVITY_TRAP_BEAM
‪#define STR_GRAVITY_TRAP_BEAM
Definition: _zm_weap_gravityspikes.csc:15
‪register_clientfields
‪function register_clientfields()
Definition: _zm_weap_gravityspikes.csc:54
‪CF_HOST_ONLY
‪#define CF_HOST_ONLY
Definition: version.gsh:102
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪VERSION_TU12
‪#define VERSION_TU12
Definition: version.gsh:64
‪gravity_trap_rumble
‪function gravity_trap_rumble(localClientNum)
Definition: _zm_weap_gravityspikes.csc:248
‪waittill_dobj
‪function waittill_dobj(localClientNum)
Definition: util_shared.csc:1117
‪gravity_trap_destroy
‪function gravity_trap_destroy(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:169
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪gravity_trap_fx
‪function gravity_trap_fx(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:96
‪ragdoll_impact_watch_start
‪function ragdoll_impact_watch_start(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasDemoJump)
Definition: _zm_weap_gravityspikes.csc:178
‪VORTEX_RUMBLE_INTERIOR
‪#define VORTEX_RUMBLE_INTERIOR
Definition: zombie_vortex.gsh:25
‪gravity_trap_location
‪function gravity_trap_location(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: _zm_weap_gravityspikes.csc:153
‪ragdoll_impact_watch
‪function ragdoll_impact_watch(localClientNum)
Definition: _zm_weap_gravityspikes.csc:186
‪PlayFx
‪function PlayFx(name)
Definition: _counteruav.gsc:390