‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
animation_shared.csc
Go to the documentation of this file.
1 #using scripts\shared\animation_debug_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\flag_shared;
4 #using scripts\shared\flagsys_shared;
5 #using scripts\shared\postfx_shared;
6 #using scripts\shared\shaderanim_shared;
7 #using scripts\shared\system_shared;
8 
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\version.gsh;
11 
12 #namespace animation;
13 
14 #define ANIM_NOTIFY "_anim_notify_"
15 
16 ‪REGISTER_SYSTEM( "animation", &‪__init__, undefined )
17 
18 function ‪__init__()
19 {
20  ‪clientfield::register( "scriptmover", "cracks_on", ‪VERSION_SHIP, GetMinBitCountForNum( 4 ), "int", &‪cf_cracks_on, !‪CF_HOST_ONLY, !‪CF_CALLBACK_ZERO_ON_NEW_ENT );
21  ‪clientfield::register( "scriptmover", "cracks_off", ‪VERSION_SHIP, GetMinBitCountForNum( 4 ), "int", &‪cf_cracks_off, !‪CF_HOST_ONLY, !‪CF_CALLBACK_ZERO_ON_NEW_ENT );
22 
24 }
25 
39 function ‪first_frame( animation, v_origin_or_ent, v_angles_or_tag )
40 {
41  self thread ‪play( animation, v_origin_or_ent, v_angles_or_tag, 0 );
42 }
43 
44 function ‪play( animation, v_origin_or_ent, v_angles_or_tag, n_rate = 1, n_blend_in = .2, n_blend_out = .2, n_lerp, b_link = false )
45 {
46  self endon( "entityshutdown" );
47  self thread ‪_play( animation, v_origin_or_ent, v_angles_or_tag, n_rate, n_blend_in, n_blend_out, n_lerp, b_link );
48  self waittill( "scriptedanim" );
49 }
50 
51 function ‪_play( animation, v_origin_or_ent, v_angles_or_tag, n_rate = 1, n_blend_in = .2, n_blend_out = .2, n_lerp, b_link = false )
52 {
53  self endon( "entityshutdown" );
54 
55  self notify( "new_scripted_anim" );
56  self endon( "new_scripted_anim" );
57 
58  ‪flagsys::set_val( "firstframe", n_rate == 0 );
59  ‪flagsys::set( "scripted_anim_this_frame" );
60  ‪flagsys::set( "scriptedanim" );
61 
62  ‪DEFAULT( v_origin_or_ent, self );
63 
64  if ( IsVec( v_origin_or_ent ) && IsVec( v_angles_or_tag ) )
65  {
66  self AnimScripted( ‪ANIM_NOTIFY, v_origin_or_ent, v_angles_or_tag, animation, n_blend_in, n_rate );
67  }
68  else
69  {
70  if ( IsString( v_angles_or_tag ) )
71  {
72  Assert( isdefined( v_origin_or_ent.model ), "Cannot align animation '" + animation + "' to tag '" + v_angles_or_tag + "' because the animation is not aligned to a model." );
73 
74  v_pos = v_origin_or_ent GetTagOrigin( v_angles_or_tag );
75  v_ang = v_origin_or_ent GetTagAngles( v_angles_or_tag );
76 
77  self.origin = v_pos;
78  self.angles = v_ang;
79 
80  b_link = true;
81 
82 // self LinkTo( v_origin_or_ent, v_angles_or_tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); // TODO: LinkTo with animation is broken client side and will mis-align the entities
83  self AnimScripted( ‪ANIM_NOTIFY, self.origin, self.angles, animation, n_blend_in, n_rate );
84  }
85  else
86  {
87  v_angles = ( isdefined( v_origin_or_ent.angles ) ? v_origin_or_ent.angles : ( 0, 0, 0 ) );
88  self AnimScripted( ‪ANIM_NOTIFY, v_origin_or_ent.origin, v_angles, animation, n_blend_in, n_rate );
89  }
90  }
91 
92  if ( !b_link )
93  {
94  self Unlink();
95  }
96 
97  self thread ‪handle_notetracks();
98 
99  self ‪waittill_end();
100 
101  if ( b_link )
102  {
103  self Unlink();
104  }
105 
106  ‪flagsys::clear( "scriptedanim" );
107  ‪flagsys::clear( "firstframe" );
108 
109  waittillframeend;
110 
111  ‪flagsys::clear( "scripted_anim_this_frame" );
112 }
113 
114 function private ‪waittill_end()
115 {
116  level endon("demo_jump"); // end when theater mode rewinds
117 
118  self waittillmatch( ‪ANIM_NOTIFY, "end" );
119 }
120 
121 function ‪_get_align_ent( e_align )
122 {
123  e = self;
124  if ( isdefined( e_align ) )
125  {
126  e = e_align;
127  }
128 
129  ‪DEFAULT( e.angles, ( 0, 0, 0 ) );
130  return e;
131 }
132 
133 function ‪_get_align_pos( v_origin_or_ent, v_angles_or_tag )
134 {
135  ‪DEFAULT( v_origin_or_ent, self.origin );
136  ‪DEFAULT2( v_angles_or_tag, self.angles, ( 0, 0, 0 ) );
137 
138  s = SpawnStruct();
139 
140  if ( IsVec( v_origin_or_ent ) )
141  {
142  Assert( IsVec( v_angles_or_tag ), "Angles must be a vector if origin is." );
143 
144  s.origin = v_origin_or_ent;
145  s.angles = v_angles_or_tag;
146  }
147  else
148  {
149  e_align = ‪_get_align_ent( v_origin_or_ent );
150 
151  if ( IsString( v_angles_or_tag ) )
152  {
153  s.origin = e_align GetTagOrigin( v_angles_or_tag );
154  s.angles = e_align GetTagAngles( v_angles_or_tag );
155  }
156  else
157  {
158  s.origin = e_align.origin;
159  s.angles = e_align.angles;
160  }
161  }
162 
163  ‪DEFAULT( s.angles, ( 0, 0, 0 ) );
164 
165  return s;
166 }
167 
168 function ‪play_siege( str_anim, str_shot = "default", n_rate = 1, b_loop = false )
169 {
170  level endon("demo_jump"); // end when theater mode rewinds
171  self endon( "entityshutdown" );
172 
173  ‪DEFAULT( str_shot, "default" );
174 
175  if ( n_rate == 0 )
176  {
177  self SiegeCmd( "set_anim", str_anim, "set_shot", str_shot, "pause", "goto_start" );
178  }
179  else
180  {
181  self SiegeCmd( "set_anim", str_anim, "set_shot", str_shot, "unpause", "set_playback_speed", n_rate, "send_end_events", true, ( b_loop ? "loop" : "unloop" ) );
182  }
183 
184  self waittill( "end" );
185 }
186 
188 // Notetrack Handling
190 function ‪add_notetrack_func( funcname, func )
191 {
192  ‪DEFAULT( level._animnotifyfuncs, [] );
193 
194  Assert( !isdefined( level._animnotifyfuncs[ funcname ] ), "Notetrack function already exists." );
195 
196  level._animnotifyfuncs[ funcname ] = func;
197 }
198 
199 function ‪add_global_notetrack_handler( str_note, func, ... )
200 {
201  ‪DEFAULT( level._animnotetrackhandlers, [] );
202  ‪DEFAULT( level._animnotetrackhandlers[ str_note ], [] );
203 
204  ‪ARRAY_ADD( level._animnotetrackhandlers[ str_note ], ‪array( func, vararg ) );
205 }
206 
207 function ‪call_notetrack_handler( str_note )
208 {
209  if ( isdefined( level._animnotetrackhandlers ) && isdefined( level._animnotetrackhandlers[ str_note ] ) )
210  {
211  foreach ( handler in level._animnotetrackhandlers[ str_note ] )
212  {
213  func = handler[0];
214  args = handler[1];
215 
216  switch ( args.size )
217  {
218  case 6:
219  self [[ func ]]( args[0], args[1], args[2], args[3], args[4], args[5] );
220  break;
221  case 5:
222  self [[ func ]]( args[0], args[1], args[2], args[3], args[4] );
223  break;
224  case 4:
225  self [[ func ]]( args[0], args[1], args[2], args[3] );
226  break;
227  case 3:
228  self [[ func ]]( args[0], args[1], args[2] );
229  break;
230  case 2:
231  self [[ func ]]( args[0], args[1] );
232  break;
233  case 1:
234  self [[ func ]]( args[0] );
235  break;
236  case 0:
237  self [[ func ]]();
238  break;
239  default: AssertMsg( "Too many args passed to notetrack handler." );
240  }
241  }
242  }
243 }
244 
246 {
247  ‪add_notetrack_func( "flag::set", &‪flag::set );
248  ‪add_notetrack_func( "flag::clear", &‪flag::clear );
249 
250  ‪add_notetrack_func( "postfx::PlayPostFxBundle", &postfx::PlayPostFxBundle );
251  ‪add_notetrack_func( "postfx::StopPostFxBundle", &postfx::StopPostFxBundle );
252 
253  ‪add_global_notetrack_handler( "red_cracks_on", &‪cracks_on, "red" );
254  ‪add_global_notetrack_handler( "green_cracks_on", &‪cracks_on, "green" );
255  ‪add_global_notetrack_handler( "blue_cracks_on", &‪cracks_on, "blue" );
256  ‪add_global_notetrack_handler( "all_cracks_on", &‪cracks_on, "all" );
257 
258  ‪add_global_notetrack_handler( "red_cracks_off", &‪cracks_off, "red" );
259  ‪add_global_notetrack_handler( "green_cracks_off", &‪cracks_off, "green" );
260  ‪add_global_notetrack_handler( "blue_cracks_off", &‪cracks_off, "blue" );
261  ‪add_global_notetrack_handler( "all_cracks_off", &‪cracks_off, "all" );
262 }
263 
265 {
266  level endon("demo_jump"); // end when theater mode rewinds
267  self endon( "entityshutdown" );
268 
269  while ( true )
270  {
271  self waittill( ‪ANIM_NOTIFY, str_note );
272 
273  if ( str_note != "end" && str_note != "loop_end" )
274  {
275  self thread ‪call_notetrack_handler( str_note );
276  }
277  else
278  {
279  return;
280  }
281  }
282 }
283 
284 #define CF_CRACKS_RED 1
285 #define CF_CRACKS_BLUE 2
286 #define CF_CRACKS_GREEN 3
287 #define CF_CRACKS_ALL 4
288 
289 #define SHADER_VEC_RED "scriptVector1"
290 #define SHADER_VEC_GREEN "scriptVector2"
291 #define SHADER_VEC_BLUE "scriptVector3"
292 
293 function ‪cracks_on( str_type )
294 {
295  switch ( str_type )
296  {
297  case "red":
298  ‪cf_cracks_on( self.localClientNum, 0, ‪CF_CRACKS_RED );
299  break;
300  case "green":
301  ‪cf_cracks_on( self.localClientNum, 0, ‪CF_CRACKS_GREEN );
302  break;
303  case "blue":
304  ‪cf_cracks_on( self.localClientNum, 0, ‪CF_CRACKS_BLUE );
305  break;
306  case "all":
307  ‪cf_cracks_on( self.localClientNum, 0, ‪CF_CRACKS_ALL );
308  break;
309  }
310 }
311 
312 function ‪cracks_off( str_type )
313 {
314  switch ( str_type )
315  {
316  case "red":
317  ‪cf_cracks_off( self.localClientNum, 0, ‪CF_CRACKS_RED );
318  break;
319  case "green":
320  ‪cf_cracks_off( self.localClientNum, 0, ‪CF_CRACKS_GREEN );
321  break;
322  case "blue":
323  ‪cf_cracks_off( self.localClientNum, 0, ‪CF_CRACKS_BLUE );
324  break;
325  case "all":
326  ‪cf_cracks_off( self.localClientNum, 0, ‪CF_CRACKS_ALL );
327  break;
328  }
329 }
330 
331 function ‪cf_cracks_on( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
332 {
333  const ‪delay = 0;
334  const duration = 3;
335  const start = 0;
336  const ‪end = 1;
337 
338  switch ( newVal )
339  {
340  case ‪CF_CRACKS_RED:
341  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_RED, ‪delay, duration, start, ‪end );
342  break;
343  case ‪CF_CRACKS_GREEN:
344  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_GREEN, ‪delay, duration, start, ‪end );
345  break;
346  case ‪CF_CRACKS_BLUE:
347  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_BLUE, ‪delay, duration, start, ‪end );
348  break;
349  case ‪CF_CRACKS_ALL:
350  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_RED, ‪delay, duration, start, ‪end );
351  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_GREEN, ‪delay, duration, start, ‪end );
352  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_BLUE, ‪delay, duration, start, ‪end );
353  }
354 }
355 
356 function ‪cf_cracks_off( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
357 {
358  const ‪delay = 0;
359  const duration = 0;
360  const start = 1;
361  const ‪end = 0;
362 
363  switch ( newVal )
364  {
365  case ‪CF_CRACKS_RED:
366  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_RED, ‪delay, duration, start, ‪end );
367  break;
368  case ‪CF_CRACKS_GREEN:
369  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_GREEN, ‪delay, duration, start, ‪end );
370  break;
371  case ‪CF_CRACKS_BLUE:
372  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_BLUE, ‪delay, duration, start, ‪end );
373  break;
374  case ‪CF_CRACKS_ALL:
375  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_RED, ‪delay, duration, start, ‪end );
376  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_GREEN, ‪delay, duration, start, ‪end );
377  ‪shaderanim::animate_crack( localClientNum, ‪SHADER_VEC_BLUE, ‪delay, duration, start, ‪end );
378  }
379 }
380 
382 // !Notetrack Handling
‪add_global_notetrack_handler
‪function add_global_notetrack_handler(str_note, func,...)
Definition: animation_shared.csc:199
‪first_frame
‪function first_frame(animation, v_origin_or_ent, v_angles_or_tag)
Definition: animation_shared.csc:39
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪play_siege
‪function play_siege(str_anim, str_shot="default", n_rate=1, b_loop=false)
Definition: animation_shared.csc:168
‪play
‪function play(animation, v_origin_or_ent, v_angles_or_tag, n_rate=1, n_blend_in=.2, n_blend_out=.2, n_lerp, b_link=false)
Definition: animation_shared.csc:44
‪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
‪CF_CRACKS_BLUE
‪#define CF_CRACKS_BLUE
Definition: animation_shared.csc:285
‪SHADER_VEC_GREEN
‪#define SHADER_VEC_GREEN
Definition: animation_shared.csc:290
‪DEFAULT2
‪#define DEFAULT2(__var, __default1, __default2)
Definition: shared.gsh:271
‪CF_CRACKS_ALL
‪#define CF_CRACKS_ALL
Definition: animation_shared.csc:287
‪delay
‪function delay(time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6)
Definition: util_shared.csc:784
‪handle_notetracks
‪function handle_notetracks()
Definition: animation_shared.csc:264
‪cf_cracks_on
‪function cf_cracks_on(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: animation_shared.csc:331
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪CF_CRACKS_GREEN
‪#define CF_CRACKS_GREEN
Definition: animation_shared.csc:286
‪SHADER_VEC_RED
‪#define SHADER_VEC_RED
Definition: animation_shared.csc:289
‪_get_align_pos
‪function _get_align_pos(v_origin_or_ent, v_angles_or_tag)
Definition: animation_shared.csc:133
‪end
‪function end(final)
Definition: _killcam.gsc:511
‪add_notetrack_func
‪function add_notetrack_func(funcname, func)
Definition: animation_shared.csc:190
‪setup_notetracks
‪function setup_notetracks()
Definition: animation_shared.csc:245
‪CF_HOST_ONLY
‪#define CF_HOST_ONLY
Definition: version.gsh:102
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪waittill_end
‪function private waittill_end()
Definition: animation_shared.csc:114
‪animate_crack
‪function animate_crack(localClientNum, vectorName, delay, duration, start, end)
Definition: shaderanim_shared.csc:25
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪_get_align_ent
‪function _get_align_ent(e_align)
Definition: animation_shared.csc:121
‪cf_cracks_off
‪function cf_cracks_off(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump)
Definition: animation_shared.csc:356
‪array
‪function filter array
Definition: array_shared.csc:16
‪ANIM_NOTIFY
‪#define ANIM_NOTIFY
Definition: animation_shared.csc:14
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪__init__
‪function __init__()
Definition: animation_shared.csc:18
‪set_val
‪function set_val(str_flag, b_val)
Definition: flag_shared.gsc:123
‪SHADER_VEC_BLUE
‪#define SHADER_VEC_BLUE
Definition: animation_shared.csc:291
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪cracks_on
‪function cracks_on(str_type)
Definition: animation_shared.csc:293
‪CF_CRACKS_RED
‪#define CF_CRACKS_RED
Definition: animation_shared.csc:284
‪cracks_off
‪function cracks_off(str_type)
Definition: animation_shared.csc:312
‪_play
‪function _play(animation, v_origin_or_ent, v_angles_or_tag, n_rate=1, n_blend_in=.2, n_blend_out=.2, n_lerp, b_link=false)
Definition: animation_shared.csc:51
‪call_notetrack_handler
‪function call_notetrack_handler(str_note)
Definition: animation_shared.csc:207