‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_driving_fx.csc
Go to the documentation of this file.
1 #insert scripts\shared\shared.gsh;
2 
3 #using scripts\shared\audio_shared;
4 
5 #namespace driving_fx;
6 
8 {
9  var ‪id ;
10  var ‪handle;
11 
13  {
14  id = undefined;
15  ‪handle = -1;
16  }
17 
19  {
20  }
21 
22  function ‪play( localClientNum, vehicle, fx_id, fx_tag )
23  {
24  if ( !isdefined(fx_id ) )
25  {
26  //stop( localClientNum );
27 
28  if ( ‪handle > 0 )
29  {
30  StopFx( localClientNum, ‪handle );
31  }
32 
33  id = undefined;
34  ‪handle = -1;
35 
36  return;
37  }
38 
39  if ( !isdefined( id ) )
40  {
41  id = fx_id;
42  ‪handle = PlayFxOnTag( localClientNum, id, vehicle, fx_tag );
43  }
44  else
45  {
46  if ( !isdefined( id ) || id != fx_id )
47  {
48  if ( ‪handle > 0 )
49  {
50  StopFx( localClientNum, ‪handle );
51  }
52 
53  id = fx_id;
54  ‪handle = PlayFxOnTag( localClientNum, id, vehicle, fx_tag );
55  }
56  }
57  }
58 
59  function ‪stop( localClientNum )
60  {
61  if ( ‪handle > 0 )
62  {
63  StopFx( localClientNum, ‪handle );
64  }
65 
66  id = undefined;
67  ‪handle = -1;
68  }
69 }
70 
71 class VehicleWheelFx
72 {
73  var ‪name;
76 
78  {
79  ‪name = "";
80  ‪tag_name = "";
81  }
82 
84  {
85  }
86 
87  function ‪init( _name, _tag_name )
88  {
89  ‪name = _name;
90  ‪tag_name = _tag_name;
91 
92  ‪ground_fx = [];
93  ‪ground_fx[ "skid" ] = new ‪GroundFx();
94  ‪ground_fx[ "tread" ] = new ‪GroundFx();
95 
96  ‪ground_fx[ "tread" ].id = "";
97  ‪ground_fx[ "tread" ].handle = -1;
98  }
99 
100  function ‪update( localClientNum, vehicle, speed_fraction )
101  {
102  if ( vehicle.vehicleclass === "boat" )
103  {
104  peelingout = false;
105  sliding = false;
106  ‪trace = bullettrace( vehicle.origin + ( 0, 0, 60 ), vehicle.origin - ( 0, 0, 200 ), false, vehicle );
107 
108  if( ‪trace["fraction"] < 1.0 )
109  {
110  surface = ‪trace["surfacetype"];
111  }
112  else
113  {
114  [[ ‪ground_fx[ "skid" ] ]]->stop( localClientNum );
115  [[ ‪ground_fx[ "tread" ] ]]->stop( localClientNum );
116  return;
117  }
118  }
119  else
120  {
121  // If we are not colliding stop all fx
122  if ( !vehicle IsWheelColliding( ‪name ) )
123  {
124  [[ ‪ground_fx[ "skid" ] ]]->stop( localClientNum );
125  [[ ‪ground_fx[ "tread" ] ]]->stop( localClientNum );
126  return;
127  }
128 
129  peelingout = vehicle IsWheelPeelingOut( ‪name );
130  sliding = vehicle IsWheelSliding( ‪name );
131  surface = vehicle GetWheelSurface( ‪name );
132  }
133 
134  origin = vehicle GetTagOrigin( ‪tag_name ) + ( 0, 0, 1 );
135  angles = vehicle GetTagAngles( ‪tag_name );
136 
137  fwd = AnglesToForward( angles );
138  right = AnglesToRight( angles );
139 
140  ‪rumble = false;
141 
142  if ( peelingout )
143  {
144  peel_fx = vehicle ‪driving_fx::get_wheel_fx( "peel", surface );
145 
146  if ( isdefined( peel_fx ) )
147  {
148  ‪PlayFx( localClientNum, peel_fx, origin, fwd * -1 );
149  ‪rumble = true;
150  }
151  }
152 
153  if ( sliding )
154  {
155  skid_fx = vehicle ‪driving_fx::get_wheel_fx( "skid", surface );
156 
157  [[ ‪ground_fx[ "skid" ] ]]->play( localClientNum, vehicle, skid_fx, ‪tag_name );
158 
159  vehicle.skidding = true;
160  ‪rumble = true;
161  }
162  else
163  {
164  [[ ‪ground_fx[ "skid" ] ]]->stop( localClientNum );
165  }
166 
167  if ( speed_fraction > 0.1 )
168  {
169  tread_fx = vehicle ‪driving_fx::get_wheel_fx( "tread", surface );
170 
171  [[ ‪ground_fx[ "tread" ] ]]->play( localClientNum, vehicle, tread_fx, ‪tag_name );
172  }
173  else
174  {
175  [[ ‪ground_fx[ "tread" ] ]]->stop( localClientNum );
176  }
177 
178  if ( ‪rumble )
179  {
180  if ( vehicle IsLocalClientDriver( localClientNum ) )
181  {
182  player = GetLocalPlayer( localClientNum );
183  player PlayRumbleOnEntity( localClientNum, "reload_small" );
184  }
185  }
186  }
187 }
188 
190 {
196 
198  {
199  ‪quake_time_min = 0.5;
200  ‪quake_time_max = 1.0;
201  ‪quake_strength_min = 0.1;
202  ‪quake_strength_max = 0.115;
203  ‪rumble_name = "";
204  }
205 
207  {
208  }
209 
210  function ‪init( t_min, t_max, s_min, s_max, ‪rumble = "" )
211  {
212  ‪quake_time_min = t_min;
213  ‪quake_time_max = t_max;
214  ‪quake_strength_min = s_min;
215  ‪quake_strength_max = s_max;
217  }
218 
219  function ‪update( localClientNum, vehicle, speed_fraction )
220  {
221  if ( vehicle IsLocalClientDriver( localClientNum ) )
222  {
223  player = getlocalplayer( localClientNum );
224 
225  if ( speed_fraction > 0 )
226  {
227  strength = RandomFloatRange( ‪quake_strength_min, ‪quake_strength_max ) * speed_fraction;
228  time = RandomFloatRange( ‪quake_time_min, ‪quake_time_max );
229 
230  player Earthquake( strength, time, player.origin, 500 );
231 
232  if ( ‪rumble_name != "" && speed_fraction > 0.5 )
233  {
234  if ( RandomInt( 100 ) < 10 )
235  {
236  player PlayRumbleOnEntity( localClientNum, ‪rumble_name );
237  }
238  }
239  }
240  }
241  }
242 }
243 
244 /* DEAD CODE REMOVAL
245 function play_driving_fx_thirdperson( localClientNum, speed, speed_fraction )
246 {
247  // SP uses _treadfx.csc
248 }
249 */
250 
251 function ‪vehicle_enter( localClientNum )
252 {
253  self endon( "entityshutdown" );
254 
255  while ( 1 )
256  {
257  self waittill( "enter_vehicle", user );
258 
259  if ( isdefined( user ) && user isplayer() )
260  {
261  self thread ‪driving_fx::collision_thread( localClientNum );
262  self thread ‪driving_fx::jump_landing_thread( localClientNum );
263 // self thread driving_fx::speed_fx( localClientNum );
264  }
265  }
266 }
267 
268 function ‪speed_fx( localClientNum )
269 {
270  self endon( "entityshutdown" );
271  self endon( "exit_vehicle" );
272 
273  while ( 1 )
274  {
275  curspeed = self GetSpeed();
276  curspeed = 0.0005 * curspeed;
277  curspeed = Abs(curspeed);
278  if (curspeed>0.001)
279  {
280  SetSavedDvar("r_speedBlurFX_enable","1");
281  SetSavedDvar("r_speedBlurAmount",curspeed);
282  }
283  else
284  {
285  SetSavedDvar("r_speedBlurFX_enable","0");
286  }
287  wait 0.05;
288  }
289 }
290 
291 function ‪play_driving_fx( localClientNum )
292 {
293  self endon( "entityshutdown" );
294 
295  self thread ‪vehicle_enter( localClientNum );
296 
297  if ( self.surfacefxdeftype == "" )
298  return;
299 
300  if ( !isdefined( self.wheel_fx ) )
301  {
302  wheel_names = ‪array( "front_left", "front_right", "back_left", "back_right" );
303  wheel_tag_names = ‪array( "tag_wheel_front_left", "tag_wheel_front_right", "tag_wheel_back_left", "tag_wheel_back_right" );
304 
305  // temp hack for RAPS vehicle
306  if( isdefined( self.scriptvehicletype ) && self.scriptvehicletype == "raps" )
307  {
308  wheel_names = ‪array( "front_left" );
309  wheel_tag_names = ‪array( "tag_origin" );
310  }
311  else if( self.vehicleclass == "boat" )
312  {
313  wheel_names = ‪array( "tag_origin" );
314  wheel_tag_names = ‪array( "tag_origin" );
315  }
316 
317  self.wheel_fx = [];
318  for ( i = 0; i < wheel_names.size; i++ )
319  {
320  self.wheel_fx[i] = new VehicleWheelFx();
321  [[ self.wheel_fx[i] ]]->init( wheel_names[i], wheel_tag_names[i] );
322  }
323 
324  self.camera_fx = [];
325  self.camera_fx[ "speed" ] = new ‪vehicle_camera_fx();
326  [[ self.camera_fx[ "speed" ] ]]->init( 0.5, 1.0, 0.1, 0.115, "reload_small" );
327 
328  self.camera_fx[ "skid" ] = new ‪vehicle_camera_fx();
329  [[ self.camera_fx[ "skid" ] ]]->init( 0.25, 0.35, 0.1, 0.115 );
330  }
331 
332  self.last_screen_dirt = 0;
333  self.screen_dirt_delay = 0;
334 
335  speed_fraction = 0;
336 
337  while ( 1 )
338  {
339  speed = Length( self GetVelocity() );
340  max_speed = ( speed < 0 ? self GetMaxReverseSpeed() : self GetMaxSpeed() );
341  speed_fraction = ( max_speed > 0 ? Abs(speed) / max_speed : 0 );
342 
343  self.skidding = false;
344 
345  for ( i = 0; i < self.wheel_fx.size; i++ )
346  {
347  [[ self.wheel_fx[i] ]]->update( localClientNum, self, speed_fraction );
348  }
349 
350 // [[ self.camera_fx[ "speed" ] ]]->update( localClientNum, self, speed_fraction );
351 //
352 // if ( self.skidding )
353 // {
354 // [[ self.camera_fx[ "skid" ] ]]->update( localClientNum, self, ( speed_fraction < 0.25 ? 0.25 : 1 ) );
355 // }
356 
357  wait( 0.1 );
358  }
359 }
360 
361 
362 function ‪get_wheel_fx( type, surface )
363 {
364  fxarray = undefined;
365 
366  if ( type == "tread" )
367  {
368  fxarray = self.treadfxnamearray;
369  }
370  else if ( type == "peel" )
371  {
372  fxarray = self.peelfxnamearray;
373  }
374  else if ( type == "skid" )
375  {
376  fxarray = self.skidfxnamearray;
377  }
378 
379  if( isdefined( fxarray ) )
380  {
381  return fxarray[ surface ];
382  }
383 
384  return undefined;
385 }
386 
387 function ‪play_driving_fx_firstperson( localClientNum, speed, speed_fraction )
388 {
389  const normal_speed_fraction = 0.25;
390 
391  // in yo face!
392  if ( speed > 0 && speed_fraction >= normal_speed_fraction )
393  {
394  viewangles = getlocalclientangles( localClientNum );
395  pitch = angleclamp180( viewangles[0] );
396 
397  const max_additional_time = 1000;
398  const no_effects_pitch = -10.0; // 10 degress up, no dirt
399  const full_effects_pitch = 10.0; // 10 down, full dirt
400 
401  if ( pitch > no_effects_pitch )
402  {
403  current_additional_time = 0;
404  if ( pitch < full_effects_pitch )
405  {
406  current_additional_time = max_additional_time * ( ( (pitch - full_effects_pitch) / ( no_effects_pitch - full_effects_pitch ) ) );
407  }
408 
409  if ( self.last_screen_dirt + self.screen_dirt_delay + current_additional_time < getrealtime() )
410  {
411  screen_fx_type = self ‪correct_surface_type_for_screen_fx();
412  if ( screen_fx_type == "dirt" )
413  {
414  ‪play_screen_fx_dirt( localClientNum );
415  }
416  else
417  {
418  ‪play_screen_fx_dust( localClientNum );
419  }
420  self.last_screen_dirt = getrealtime();
421  self.screen_dirt_delay = RandomIntRange( 250, 500 );
422  }
423  }
424  }
425 }
426 
427 function ‪collision_thread( localClientNum )
428 {
429  self endon( "entityshutdown" );
430  self endon( "exit_vehicle" );
431 
432  while( 1 )
433  {
434  self waittill( "veh_collision", hip, hitn, hit_intensity );
435 
436  if ( self IsLocalClientDriver( localClientNum ) )
437  {
438  //println( "veh_collision " + hit_intensity );
439 
440  player = getlocalplayer( localClientNum );
441 
442  if ( isdefined( self.driving_fx_collision_override ) )
443  {
444  self [[ self.driving_fx_collision_override ]]( localClientNum, player, hip, hitn, hit_intensity );
445  }
446  else
447  {
448  if( isdefined( player ) && isdefined( hit_intensity ) )
449  {
450  if( hit_intensity > self.heavyCollisionSpeed )
451  {
452  volume = ‪get_impact_vol_from_speed();
453 
454  if (isdefined (self.sounddef))
455  {
456  alias = self.sounddef + "_suspension_lg_hd";
457  }
458  else
459  {
460  alias = "veh_default_suspension_lg_hd";
461  }
462 
463  id = PlaySound( 0, alias, self.origin, volume);
464 
465  if( isdefined( self.heavyCollisionRumble ) )
466  {
467  player PlayRumbleOnEntity( localClientNum, self.heavyCollisionRumble );
468  }
469  }
470  else if( hit_intensity > self.lightCollisionSpeed )
471  {
472  volume = ‪get_impact_vol_from_speed();
473 
474  if (isdefined (self.sounddef))
475  {
476  alias = self.sounddef + "_suspension_lg_lt";
477  }
478  else
479  {
480  alias = "veh_default_suspension_lg_lt";
481  }
482 
483  id = PlaySound( 0, alias, self.origin, volume );
484 
485  if( isdefined( self.lightCollisionRumble ) )
486  {
487  player PlayRumbleOnEntity( localClientNum, self.lightCollisionRumble );
488  }
489  }
490  }
491  }
492  }
493  }
494 }
495 
496 function ‪jump_landing_thread( localClientNum )
497 {
498  self endon( "entityshutdown" );
499  self endon( "exit_vehicle" );
500 
501  while( 1 )
502  {
503  self waittill( "veh_landed" );
504 
505  if ( self IsLocalClientDriver( localClientNum ) )
506  {
507  player = getlocalplayer( localClientNum );
508 
509  if( isdefined( player ) )
510  {
511  if ( isdefined( self.driving_fx_jump_landing_override ) )
512  {
513  self [[ self.driving_fx_jump_landing_override ]]( localClientNum, player );
514  }
515  else
516  {
517  volume = ‪get_impact_vol_from_speed();
518 
519  if (isdefined (self.sounddef))
520  {
521  alias = self.sounddef + "_suspension_lg_hd";
522  }
523  else
524  {
525  alias = "veh_default_suspension_lg_hd";
526  }
527 
528  id = PlaySound( 0, alias, self.origin, volume);
529  if( isdefined( self.jumpLandingRumble ) )
530  {
531  player PlayRumbleOnEntity( localClientNum, self.jumpLandingRumble );
532  }
533  }
534  }
535  }
536  }
537 }
538 
539 function ‪suspension_thread( localClientNum )
540 {
541  self endon( "entityshutdown" );
542  self endon( "exit_vehicle" );
543 
544  while( 1 )
545  {
546  self waittill( "veh_suspension_limit_activated" );
547 
548  if ( self IsLocalClientDriver( localClientNum ) )
549  {
550  player = getlocalplayer( localClientNum );
551 
552  if( isdefined( player ) )
553  {
554  volume = ‪get_impact_vol_from_speed();
555 
556  if (isdefined (self.sounddef))
557  {
558  alias = self.sounddef + "_suspension_lg_lt";
559  }
560  else
561  {
562  alias = "veh_default_suspension_lg_lt";
563  }
564 
565  id = PlaySound( 0, alias, self.origin, volume);
566  player PlayRumbleOnEntity( localClientNum, "damage_light" );
567  }
568  }
569  }
570 }
572 {
573  // values to map to a linear scale
574  curspeed = self GetSpeed();
575  maxSpeed = self GetMaxSpeed();
576 
577  volume = ‪audio::scale_speed( 0, maxSpeed, 0, 1, curspeed );
578 
579  volume = volume * volume * volume;
580 
581  return volume;
582 }
583 
585 {
586  return ( self iswheelcolliding( "front_left" ) || self iswheelcolliding( "front_right" ) ||
587  self iswheelcolliding( "back_left" ) || self iswheelcolliding( "back_right" ) );
588 }
589 
590 function ‪dirt_surface_type( surface_type )
591 {
592  switch( surface_type )
593  {
594  case "dirt":
595  case "mud":
596  case "gravel":
597  case "grass":
598  case "foliage":
599  case "sand":
600  case "snow":
601  case "water":
602  return true;
603  }
604 
605  return false;
606 }
607 
609 {
610  right_rear = self GetWheelSurface("back_right");
611  left_rear = self GetWheelSurface("back_left");
612 
613 // PrintLn("surfacetypes: " + left_rear + " " + right_rear );
614  if ( ‪dirt_surface_type( right_rear ) )
615  return "dirt";
616 
617  if ( ‪dirt_surface_type( left_rear ) )
618  return "dirt";
619 
620  return "dust";
621 }
622 
623 function ‪play_screen_fx_dirt(localClientNum)
624 {
625  // support for this has been removed with the .menu system
626  /*
627  pick_one = RandomIntRange(0,4);
628  if ( pick_one == 0 )
629  {
630  AnimateUI( localClientNum, "fullscreen_dirt", "dirt", "in", 0 );
631  }
632  else if ( pick_one == 1 )
633  {
634  AnimateUI( localClientNum, "fullscreen_dirt", "dirt_right_splash", "in", 0 );
635  }
636  else if ( pick_one == 2 )
637  {
638  AnimateUI( localClientNum, "fullscreen_dirt", "dirt_left_splash", "in", 0 );
639  }
640  else
641  {
642  AnimateUI( localClientNum, "fullscreen_dirt", "blurred_dirt_random", "in", 0 );
643  }
644  */
645 }
646 
647 function ‪play_screen_fx_dust(localClientNum)
648 {
649  // support for this has been removed with the .menu system
650  /*
651  pick_one = RandomIntRange(0,4);
652  if ( pick_one == 0 )
653  {
654  AnimateUI( localClientNum, "fullscreen_dust", "dust", "in", 0 );
655  }
656  else if ( pick_one == 1 )
657  {
658  AnimateUI( localClientNum, "fullscreen_dust", "dust_right_splash", "in", 0 );
659  }
660  else if ( pick_one == 2 )
661  {
662  AnimateUI( localClientNum, "fullscreen_dust", "dust_left_splash", "in", 0 );
663  }
664  else
665  {
666  AnimateUI( localClientNum, "fullscreen_dust", "blurred_dust_random", "in", 0 );
667  }
668  */
669 }
‪GroundFx::stop
‪function stop(localClientNum)
Definition: _driving_fx.csc:59
‪speed_fx
‪function speed_fx(localClientNum)
Definition: _driving_fx.csc:268
‪GroundFx::handle
‪var handle
Definition: _driving_fx.csc:10
‪ground_fx
‪var ground_fx
Definition: _driving_fx.csc:75
‪vehicle_camera_fx::update
‪function update(localClientNum, vehicle, speed_fraction)
Definition: _driving_fx.csc:219
‪GroundFx
Definition: _driving_fx.csc:7
‪vehicle_camera_fx::destructor
‪destructor()
Definition: _driving_fx.csc:206
‪correct_surface_type_for_screen_fx
‪function correct_surface_type_for_screen_fx()
Definition: _driving_fx.csc:608
‪vehicle_camera_fx::init
‪function init(t_min, t_max, s_min, s_max, rumble="")
Definition: _driving_fx.csc:210
‪play_driving_fx_firstperson
‪function play_driving_fx_firstperson(localClientNum, speed, speed_fraction)
Definition: _driving_fx.csc:387
‪rumble
‪function rumble()
Definition: exploder_shared.gsc:862
‪suspension_thread
‪function suspension_thread(localClientNum)
Definition: _driving_fx.csc:539
‪get_wheel_fx
‪function get_wheel_fx(type, surface)
Definition: _driving_fx.csc:362
‪init
‪function init(_name, _tag_name)
Definition: _driving_fx.csc:87
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪collision_thread
‪function collision_thread(localClientNum)
Definition: _driving_fx.csc:427
‪scale_speed
‪function scale_speed(x1, x2, y1, y2, z)
Definition: audio_shared.csc:752
‪play_screen_fx_dust
‪function play_screen_fx_dust(localClientNum)
Definition: _driving_fx.csc:647
‪dirt_surface_type
‪function dirt_surface_type(surface_type)
Definition: _driving_fx.csc:590
‪GroundFx::destructor
‪destructor()
Definition: _driving_fx.csc:18
‪any_wheel_colliding
‪function any_wheel_colliding()
Definition: _driving_fx.csc:584
‪update
‪function update(localClientNum, vehicle, speed_fraction)
Definition: _driving_fx.csc:100
‪vehicle_camera_fx::constructor
‪constructor()
Definition: _driving_fx.csc:197
‪vehicle_camera_fx::quake_strength_max
‪var quake_strength_max
Definition: _driving_fx.csc:194
‪GroundFx::id
‪var id
Definition: _driving_fx.csc:9
‪play_driving_fx
‪function play_driving_fx(localClientNum)
Definition: _driving_fx.csc:291
‪array
‪function filter array
Definition: array_shared.csc:16
‪destructor
‪destructor()
Definition: _driving_fx.csc:83
‪vehicle_enter
‪class vehicle_camera_fx vehicle_enter(localClientNum)
Definition: _driving_fx.csc:251
‪GroundFx::constructor
‪constructor()
Definition: _driving_fx.csc:12
‪vehicle_camera_fx
Definition: _driving_fx.csc:189
‪get_impact_vol_from_speed
‪function get_impact_vol_from_speed()
Definition: _driving_fx.csc:571
‪vehicle_camera_fx::quake_strength_min
‪var quake_strength_min
Definition: _driving_fx.csc:193
‪constructor
‪constructor()
Definition: _driving_fx.csc:77
‪vehicle_camera_fx::quake_time_min
‪var quake_time_min
Definition: _driving_fx.csc:191
‪GroundFx::play
‪function play(localClientNum, vehicle, fx_id, fx_tag)
Definition: _driving_fx.csc:22
‪play_screen_fx_dirt
‪function play_screen_fx_dirt(localClientNum)
Definition: _driving_fx.csc:623
‪name
‪class GroundFx name
‪tag_name
‪var tag_name
Definition: _driving_fx.csc:74
‪vehicle_camera_fx::quake_time_max
‪var quake_time_max
Definition: _driving_fx.csc:192
‪jump_landing_thread
‪function jump_landing_thread(localClientNum)
Definition: _driving_fx.csc:496
‪vehicle_camera_fx::rumble_name
‪var rumble_name
Definition: _driving_fx.csc:195
‪PlayFx
‪function PlayFx(name)
Definition: _counteruav.gsc:390