‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
gib.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\util_shared;
4 
5 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
6 #insert scripts\shared\shared.gsh;
7 #insert scripts\shared\version.gsh;
8 #insert scripts\shared\ai\systems\gib.gsh;
9 
10 #namespace GibClientUtils;
11 
12 function autoexec ‪main()
13 {
14 
16  "actor",
24 
26  "playercorpse",
34 
35  gibDefinitions = ‪GET_GIB_BUNDLES();
36 
37  gibPieceLookup = [];
38  gibPieceLookup[‪GIB_ANNIHILATE_FLAG] = "annihilate";
39  gibPieceLookup[‪GIB_TORSO_HEAD_FLAG] = "head";
40  gibPieceLookup[‪GIB_TORSO_RIGHT_ARM_FLAG] = "rightarm";
41  gibPieceLookup[‪GIB_TORSO_LEFT_ARM_FLAG] = "leftarm";
42  gibPieceLookup[‪GIB_LEGS_RIGHT_LEG_FLAG] = "rightleg";
43  gibPieceLookup[‪GIB_LEGS_LEFT_LEG_FLAG] = "leftleg";
44 
45  processedBundles = [];
46 
47  // Process each gib bundle to allow quick access to information in the future.
48  foreach ( definitionName, definition in gibDefinitions )
49  {
50  gibBundle = SpawnStruct();
51  gibBundle.gibs = [];
52  gibBundle.name = definitionName;
53 
54  foreach ( gibPieceFlag, gibPieceName in gibPieceLookup )
55  {
56  gibStruct = SpawnStruct();
57  gibStruct.gibmodel = GetStructField( definition, gibPieceLookup[ gibPieceFlag ] + "_gibmodel" );
58  gibStruct.gibtag = GetStructField( definition, gibPieceLookup[ gibPieceFlag ] + "_gibtag" );
59  gibStruct.gibfx = GetStructField( definition, gibPieceLookup[ gibPieceFlag ] + "_gibfx" );
60  gibStruct.gibfxtag = GetStructField( definition, gibPieceLookup[ gibPieceFlag ] + "_gibeffecttag" );
61  gibStruct.gibdynentfx = GetStructField( definition, gibPieceLookup[ gibPieceFlag ] + "_gibdynentfx" );
62  gibStruct.gibsound = GetStructField( definition, gibPieceLookup[ gibPieceFlag ] + "_gibsound" );
63 
64  gibBundle.gibs[ gibPieceFlag ] = gibStruct;
65  }
66 
67  processedBundles[ definitionName ] = gibBundle;
68  }
69 
70  // Replaces all gib character define bundles with their processed form to free unncessary script variables.
71  level.scriptbundles[ "gibcharacterdef" ] = processedBundles;
72 
73  // Thread that handles any corpse annihilate request.
74  level thread ‪_AnnihilateCorpse();
75 }
76 
77 #define MIN_DISTANCE_SQ ( 120 * 120 )
78 function private ‪_AnnihilateCorpse()
79 {
80  while( true )
81  {
82  level waittill( "corpse_explode", localClientNum, body, origin );
83 
85  {
86  continue;
87  }
88 
89  if ( IsDefined( body ) && ‪_HasGibDef( body ) && body IsRagdoll() )
90  {
91  ‪ClientEntGibHead( localClientNum, body );
92  ‪ClientEntGibRightArm( localClientNum, body );
93  ‪ClientEntGibLeftArm( localClientNum, body );
94  ‪ClientEntGibRightLeg( localClientNum, body );
95  ‪ClientEntGibLeftLeg( localClientNum, body );
96  }
97 
98  // TODO(David Young 6-8-15): Human bodies are currently the only supported gibbable corpse.
99  // Need to add support to the gib definition to flag if a corpse can be annihilated instead.
100  if( IsDefined( body ) && ‪_HasGibDef( body ) && body.archetype == ‪ARCHETYPE_HUMAN )
101  {
102  // Only allow human gibbing at a 50% rate.
103  if ( RandomInt( 100 ) >= 50 )
104  {
105  continue;
106  }
107 
108  if ( IsDefined( origin ) && DistanceSquared( body.origin, origin ) <= ‪MIN_DISTANCE_SQ )
109  {
110  // Toggle hiding the ragdoll.
111  body.ignoreRagdoll = true;
112 
113  body ‪_GibEntity(
114  localClientNum,
119  true );
120  }
121  }
122  }
123 }
124 
125 function private ‪_CloneGibData( localClientNum, entity, clone )
126 {
127  clone.gib_data = SpawnStruct();
128 
129  // Copy gib data.
130  clone.gib_data.gib_state = entity.gib_state;
131  clone.gib_data.gibdef = entity.gibdef;
132 
133  // Copy all model data.
134  clone.gib_data.hatmodel = entity.hatmodel;
135  clone.gib_data.head = entity.head;
136  clone.gib_data.legdmg1 = entity.legdmg1;
137  clone.gib_data.legdmg2 = entity.legdmg2;
138  clone.gib_data.legdmg3 = entity.legdmg3;
139  clone.gib_data.legdmg4 = entity.legdmg4;
140  clone.gib_data.torsodmg1 = entity.torsodmg1;
141  clone.gib_data.torsodmg2 = entity.torsodmg2;
142  clone.gib_data.torsodmg3 = entity.torsodmg3;
143  clone.gib_data.torsodmg4 = entity.torsodmg4;
144  clone.gib_data.torsodmg5 = entity.torsodmg5;
145 }
146 
147 function private ‪_GetGibDef( entity )
148 {
149  if ( entity IsPlayer() || entity IsPlayerCorpse() )
150  {
151  return entity GetPlayerGibDef();
152  }
153  else if ( IsDefined( entity.gib_data ) )
154  {
155  return entity.gib_data.gibdef;
156  }
157 
158  return entity.gibdef;
159 }
160 
161 function private ‪_GetGibbedState( localClientNum, entity )
162 {
163  if ( IsDefined( entity.gib_data ) && IsDefined( entity.gib_data.gib_state ) )
164  {
165  return entity.gib_data.gib_state;
166  }
167  else if ( IsDefined( entity.gib_state ) )
168  {
169  return entity.gib_state;
170  }
171 
172  return ‪GIB_UNDAMAGED_FLAG;
173 }
174 
175 function private ‪_GetGibbedLegModel( localClientNum, entity )
176 {
177  gibState = ‪_GetGibbedState( localClientNum, entity );
178  rightLegGibbed = ‪IS_GIBBED( gibState, ‪GIB_LEGS_RIGHT_LEG_FLAG);
179  leftLegGibbed = ‪IS_GIBBED( gibState, ‪GIB_LEGS_LEFT_LEG_FLAG);
180 
181  if ( rightLegGibbed && leftLegGibbed)
182  {
183  return ‪GIB_LEGS_NO_LEGS_MODEL( entity );
184  }
185  else if ( rightLegGibbed )
186  {
187  return ‪GIB_LEGS_RIGHT_LEG_GONE_MODEL( entity );
188  }
189  else if ( leftLegGibbed )
190  {
191  return ‪GIB_LEGS_LEFT_LEG_GONE_MODEL( entity );
192  }
193 
194  return ‪GIB_LEGS_UNDAMAGED_MODEL( entity );
195 }
196 
197 function private ‪_GetGibExtraModel( localClientNumm, entity, gibFlag )
198 {
199  if ( gibFlag == ‪GIB_HEAD_HAT_FLAG )
200  return ‪GIB_HAT_MODEL( entity );
201  else if ( gibFlag == ‪GIB_TORSO_HEAD_FLAG )
202  return ‪GIB_HEAD_MODEL( entity );
203  else
204  AssertMsg( "Unable to find gib model." );
205 }
206 
207 function private ‪_GetGibbedTorsoModel( localClientNum, entity )
208 {
209  gibState = ‪_GetGibbedState( localClientNum, entity );
210  rightArmGibbed = ‪IS_GIBBED( gibState, ‪GIB_TORSO_RIGHT_ARM_FLAG);
211  leftArmGibbed = ‪IS_GIBBED( gibState, ‪GIB_TORSO_LEFT_ARM_FLAG);
212 
213  if ( rightArmGibbed && leftArmGibbed )
214  {
215  return ‪GIB_TORSO_RIGHT_ARM_GONE_MODEL( entity );
216 
217  // TODO(David Young 5-14-14): Currently AI's don't support both arms getting blown off.
218  // return GIB_TORSO_NO_ARMS_MODEL( entity );
219  }
220  else if ( rightArmGibbed )
221  {
222  return ‪GIB_TORSO_RIGHT_ARM_GONE_MODEL( entity );
223  }
224  else if ( leftArmGibbed )
225  {
226  return ‪GIB_TORSO_LEFT_ARM_GONE_MODEL( entity );
227  }
228 
229  return ‪GIB_TORSO_UNDAMAGED_MODEL( entity );
230 }
231 
232 function private ‪_GibPieceTag( localClientNum, entity, gibFlag )
233 {
234  if ( !‪_HasGibDef( self ) )
235  {
236  return;
237  }
238 
239  gibBundle = ‪GET_GIB_BUNDLE( ‪_GetGibDef( entity ) );
240  gibPiece = gibBundle.gibs[ gibFlag ];
241 
242  if ( IsDefined( gibPiece ) )
243  {
244  return gibPiece.gibfxtag;
245  }
246 }
247 
248 function private ‪_GibEntity( localClientNum, gibFlags, shouldSpawnGibs )
249 {
250  entity = self;
251 
252  if ( !‪_HasGibDef( entity ) )
253  {
254  return;
255  }
256 
257  // Skip the toggle flag, GIB_TOGGLE_GIB_MODEL_FLAG.
258  currentGibFlag = ‪GIB_ANNIHILATE_FLAG;
259  gibDir = undefined;
260 
261  if ( entity IsPlayer() || entity IsPlayerCorpse() )
262  {
263  // TODO(David Young 6-8-15): Add support for yaw bits for AI as well.
264  yaw_bits = ‪GET_GIB_DIR_BITS( gibFlags );
265  yaw = getanglefrombits( yaw_bits, ‪GIB_DIR_BITS );
266  gibDir = AnglesToForward( ( 0, yaw, 0 ) );
267  }
268 
269  gibBundle = ‪GET_GIB_BUNDLE( ‪_GetGibDef( entity ) );
270 
271  // Handles any number of simultaneous gibbings.
272  while ( gibFlags >= currentGibFlag )
273  {
274  if ( gibFlags & currentGibFlag )
275  {
276  gibPiece = gibBundle.gibs[ currentGibFlag ];
277 
278  if ( IsDefined( gibPiece ) )
279  {
280  if ( shouldSpawnGibs )
281  {
282  entity thread ‪_GibPiece( localClientNum, entity, gibPiece.gibmodel, gibPiece.gibtag, gibPiece.gibdynentfx, gibDir );
283  }
284 
285  ‪_PlayGibFX( localClientNum, entity, gibPiece.gibfx, gibPiece.gibfxtag );
286  ‪_PlayGibSound( localClientNum, entity, gibPiece.gibsound );
287 
288  if ( currentGibFlag == ‪GIB_ANNIHILATE_FLAG )
289  {
290  entity Hide();
291  entity.ignoreRagdoll = true;
292  }
293  }
294 
295  ‪_HandleGibCallbacks( localClientNum, entity, currentGibFlag );
296  }
297 
298  currentGibFlag = currentGibFlag << 1;
299  }
300 }
301 
302 function private ‪_SetGibbed( localClientNum, entity, gibFlag )
303 {
304  gib_state = ‪SET_GIBBED( ‪_GetGibbedState( localClientNum, entity ), gibFlag );
305 
306  if ( IsDefined( entity.gib_data ) )
307  {
308  entity.gib_data.gib_state = gib_state;
309  }
310  else
311  {
312  entity.gib_state = gib_state;
313  }
314 }
315 
316 function private ‪_GibClientEntityInternal( localClientNum, entity, gibFlag )
317 {
319  {
320  return;
321  }
322 
323  if ( !IsDefined( entity ) || !‪_HasGibDef( entity ) )
324  {
325  return;
326  }
327 
328  if ( entity.type !== "scriptmover" )
329  {
330  // Clientside gibbing currently only supports script models.
331  return;
332  }
333 
334  if ( ‪IsGibbed( localClientNum, entity, gibFlag ) )
335  {
336  return;
337  }
338 
339  if ( !‪IS_BODY_UNDAMAGED( ‪_GetGibbedState( localClientNum, entity ) ) )
340  {
341  legModel = ‪_GetGibbedLegModel( localClientNum, entity );
342  entity Detach( legModel, "" );
343  }
344 
345  ‪_SetGibbed( localClientNum, entity, gibFlag );
346 
347  entity SetModel( ‪_GetGibbedTorsoModel( localClientNum, entity ) );
348  entity Attach( ‪_GetGibbedLegModel( localClientNum, entity ), "" );
349 
350  entity ‪_GibEntity( localClientNum, gibFlag, true );
351 }
352 
353 function private ‪_GibClientExtraInternal( localClientNum, entity, gibFlag )
354 {
356  {
357  return;
358  }
359 
360  if ( !IsDefined( entity ) )
361  {
362  return;
363  }
364 
365  if ( entity.type !== "scriptmover" )
366  {
367  // Clientside gibbing currently only supports script models.
368  return;
369  }
370 
371  if ( ‪IsGibbed( localClientNum, entity, gibFlag ) )
372  {
373  return;
374  }
375 
376  gibModel = ‪_GetGibExtraModel( localClientNum, entity, gibFlag );
377 
378  if ( IsDefined( gibModel ) && entity IsAttached( gibModel, "" ) )
379  {
380  entity Detach( gibModel, "" );
381  }
382 
383  if ( gibFlag == ‪GIB_TORSO_HEAD_FLAG )
384  {
385  if ( IsDefined( ‪GIB_TORSO_HEAD_GONE_MODEL( entity ) ) )
386  {
387  entity Attach( ‪GIB_TORSO_HEAD_GONE_MODEL( entity ), "" );
388  }
389  }
390 
391  ‪_SetGibbed( localClientNum, entity, gibFlag );
392  entity ‪_GibEntity( localClientNum, gibFlag, true );
393 }
394 
395 function private ‪_GibHandler( localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump )
396 {
397  entity = self;
398 
399  if ( entity IsPlayer() || entity IsPlayerCorpse() )
400  {
402  {
403  return;
404  }
405  }
406  else
407  {
408  if ( IsDefined( entity.maturegib ) && entity.maturegib && !‪util::is_mature() )
409  {
410  return;
411  }
412 
413  if ( IsDefined( entity.restrictedgib ) && entity.restrictedgib && !IsShowGibsEnabled() )
414  {
415  return;
416  }
417  }
418 
419  gibFlags = ‪GET_GIB_FLAG( oldValue, newValue );
420  shouldSpawnGibs = ‪SHOULD_SPAWN_GIBS( newValue );
421 
422  // Don't use the old clientfield value for new entities.
423  if ( bNewEnt )
424  {
425  gibFlags = ‪GET_GIB_FLAG( 0, newValue );
426  }
427 
428  entity ‪_GibEntity( localClientNum, gibFlags, shouldSpawnGibs );
429 
430  entity.gib_state = newValue;
431 }
432 
433 function ‪_GibPiece( localClientNum, entity, gibModel, gibTag, gibFx, gibDir )
434 {
435  if ( !IsDefined( gibTag ) || !IsDefined( gibModel ) )
436  {
437  return;
438  }
439 
440  startPosition = entity GetTagOrigin( gibTag );
441  startAngles = entity GetTagAngles( gibTag );
442  endPosition = startPosition;
443  endAngles = startAngles;
444  forwardVector = undefined;
445 
446  if ( !IsDefined( startPosition ) || !IsDefined( startAngles ) )
447  {
448  return false;
449  }
450 
451  if ( IsDefined( gibDir ) )
452  {
453  startPosition = (0,0,0);
454  forwardVector = gibDir;
455  // TODO: define the scale on the server from the damage
456  forwardVector *= RandomFloatRange( 100.0, 500.0 );
457  }
458  else
459  {
460  // Let a frame pass to approximate the linear and angular velocity of the tag.
462 
463  if ( IsDefined( entity ) )
464  {
465  endPosition = entity GetTagOrigin( gibTag );
466  endAngles = entity GetTagAngles( gibTag );
467  }
468  else
469  {
470  // Entity already removed.
471  endPosition = startPosition + ( AnglesToForward( startAngles ) * 10 );
472  endAngles = startAngles;
473  }
474 
475  if ( !IsDefined( endPosition ) || !IsDefined( endAngles ) )
476  {
477  return false;
478  }
479 
480  forwardVector = VectorNormalize( endPosition - startPosition );
481  forwardVector *= RandomFloatRange( 0.6, 1.0 );
482  forwardVector += ( RandomFloatRange( 0, 0.2 ), RandomFloatRange( 0, 0.2 ), RandomFloatRange( 0.2, 0.7 ) );
483  }
484 
485  if( IsDefined( entity ) )
486  {
487  gibEntity = CreateDynEntAndLaunch( localClientNum, gibModel, endPosition, endAngles, startPosition, forwardVector, gibFx, true );
488  if ( IsDefined( gibEntity ) )
489  {
490  SetDynEntBodyRenderOptionsPacked( gibEntity, entity GetBodyRenderOptionsPacked() );
491  }
492  }
493 }
494 
495 function private ‪_HandleGibCallbacks( localClientNum, entity, gibFlag )
496 {
497  if ( IsDefined( entity._gibCallbacks ) &&
498  IsDefined( entity._gibCallbacks[gibFlag] ) )
499  {
500  foreach ( ‪callback in entity._gibCallbacks[gibFlag] )
501  {
502  [[‪callback]]( localClientNum, entity, gibFlag );
503  }
504  }
505 }
506 
507 function private ‪_HandleGibAnnihilate( localClientNum )
508 {
509  entity = self;
510  entity endon( "entityshutdown" );
511 
512  entity waittillmatch( "_anim_notify_", "gib_annihilate" );
513  ‪GibClientUtils::ClientEntGibAnnihilate( localClientNum, entity );
514 }
515 
516 function private ‪_HandleGibHead( localClientNum )
517 {
518  entity = self;
519  entity endon( "entityshutdown" );
520 
521  entity waittillmatch( "_anim_notify_", "gib = \"head\"" );
522  ‪GibClientUtils::ClientEntGibHead( localClientNum, entity );
523 }
524 
525 function private ‪_HandleGibRightArm( localClientNum )
526 {
527  entity = self;
528  entity endon( "entityshutdown" );
529 
530  entity waittillmatch( "_anim_notify_", "gib = \"arm_right\"" );
531  ‪GibClientUtils::ClientEntGibRightArm( localClientNum, entity );
532 }
533 
534 function private ‪_HandleGibLeftArm( localClientNum )
535 {
536  entity = self;
537  entity endon( "entityshutdown" );
538 
539  entity waittillmatch( "_anim_notify_", "gib = \"arm_left\"" );
540  ‪GibClientUtils::ClientEntGibLeftArm( localClientNum, entity );
541 }
542 
543 function private ‪_HandleGibRightLeg( localClientNum )
544 {
545  entity = self;
546  entity endon( "entityshutdown" );
547 
548  entity waittillmatch( "_anim_notify_", "gib = \"leg_right\"" );
549  ‪GibClientUtils::ClientEntGibRightLeg( localClientNum, entity );
550 }
551 
552 function private ‪_HandleGibLeftLeg( localClientNum )
553 {
554  entity = self;
555  entity endon( "entityshutdown" );
556 
557  entity waittillmatch( "_anim_notify_", "gib = \"leg_left\"" );
558  ‪GibClientUtils::ClientEntGibLeftLeg( localClientNum, entity );
559 }
560 
561 function private ‪_HasGibDef( entity )
562 {
563  return ( IsDefined( entity.gib_data ) && IsDefined( entity.gib_data.gibdef ) ) ||
564  IsDefined( entity.gibdef ) ||
565  ( ( entity GetPlayerGibDef() ) != "unknown" );
566 }
567 
568 function ‪_PlayGibFX( localClientNum, entity, fxFileName, fxTag )
569 {
570  if ( IsDefined( fxFileName ) && IsDefined( fxTag ) && entity hasDobj(localClientNum) )
571  {
572  fx = PlayFxOnTag( localClientNum, fxFileName, entity, fxTag );
573  if(isDefined(fx))
574  {
575  if(isDefined(entity.team))
576  {
577  SetFxTeam( localClientNum, fx, entity.team );
578  }
579 
580  if( ‪IS_TRUE( level.SetGibFXToIgnorePause ) )
581  {
582  SetFXIgnorePause( localClientNum, fx, true );
583  }
584  }
585 
586  return fx;
587  }
588 }
589 
590 function ‪_PlayGibSound( localClientNum, entity, soundAlias )
591 {
592  if ( IsDefined( soundAlias ) )
593  {
594  PlaySound( localClientNum, soundAlias, entity.origin );
595  }
596 }
597 
608 function ‪AddGibCallback( localClientNum, entity, gibFlag, callbackFunction )
609 {
610  assert( IsFunctionPtr( callbackFunction ) );
611 
612  if ( !IsDefined( entity._gibCallbacks ) )
613  {
614  entity._gibCallbacks = [];
615  }
616 
617  if ( !IsDefined( entity._gibCallbacks[gibFlag] ) )
618  {
619  entity._gibCallbacks[gibFlag] = [];
620  }
621 
622  gibCallbacks = entity._gibCallbacks[gibFlag];
623  gibCallbacks[gibCallbacks.size] = callbackFunction;
624  entity._gibCallbacks[gibFlag] = gibCallbacks;
625 }
626 
627 function ‪ClientEntGibAnnihilate( localClientNum, entity )
628 {
630  {
631  return;
632  }
633 
634  // Toggle hiding the ragdoll.
635  entity.ignoreRagdoll = true;
636 
637  entity ‪_GibEntity(
638  localClientNum,
643  true );
644 }
645 
646 function ‪ClientEntGibHead( localClientNum, entity )
647 {
648  ‪_GibClientExtraInternal( localClientNum, entity, ‪GIB_HEAD_HAT_FLAG );
649  ‪_GibClientExtraInternal( localClientNum, entity, ‪GIB_TORSO_HEAD_FLAG );
650 }
651 
652 function ‪ClientEntGibLeftArm( localClientNum, entity )
653 {
654  if ( ‪IsGibbed( localClientNum, entity, ‪GIB_TORSO_RIGHT_ARM_FLAG ) )
655  {
656  return;
657  }
658 
659  ‪_GibClientEntityInternal( localClientNum, entity, ‪GIB_TORSO_LEFT_ARM_FLAG );
660 }
661 
662 function ‪ClientEntGibRightArm( localClientNum, entity )
663 {
664  if ( ‪IsGibbed( localClientNum, entity, ‪GIB_TORSO_LEFT_ARM_FLAG ) )
665  {
666  return;
667  }
668 
669  ‪_GibClientEntityInternal( localClientNum, entity, ‪GIB_TORSO_RIGHT_ARM_FLAG );
670 }
671 
672 function ‪ClientEntGibLeftLeg( localClientNum, entity )
673 {
674  ‪_GibClientEntityInternal( localClientNum, entity, ‪GIB_LEGS_LEFT_LEG_FLAG );
675 }
676 
677 function ‪ClientEntGibRightLeg( localClientNum, entity )
678 {
679  ‪_GibClientEntityInternal( localClientNum, entity, ‪GIB_LEGS_RIGHT_LEG_FLAG );
680 }
681 
682 function ‪CreateScriptModelOfEntity( localClientNum, entity )
683 {
684  clone = ‪Spawn( localClientNum, entity.origin, "script_model" );
685  clone.angles = entity.angles;
686 
687  ‪_CloneGibData( localClientNum, entity, clone );
688  gibState = ‪_GetGibbedState( localClientNum, clone );
689 
691  {
692  // Don't display gibbed entities for non-mature clients.
693  gibState = ‪GIB_UNDAMAGED_FLAG;
694  }
695 
696  if ( !‪IS_BODY_UNDAMAGED( ‪_GetGibbedState( localClientNum, entity ) ) )
697  {
698  // Attach torso or full body model.
699  clone SetModel( ‪_GetGibbedTorsoModel( localClientNum, entity ) );
700  // Only attach separate legs if the body is damage already.
701  clone Attach( ‪_GetGibbedLegModel( localClientNum, entity ), "" );
702  }
703  else
704  {
705  // Attach full body model.
706  clone SetModel( entity.model );
707  }
708 
709  if ( ‪IS_GIBBED( gibState, ‪GIB_TORSO_HEAD_FLAG ) )
710  {
711  // Attach head stump.
712  if ( IsDefined( ‪GIB_TORSO_HEAD_GONE_MODEL( clone ) ) )
713  {
714  clone Attach( ‪GIB_TORSO_HEAD_GONE_MODEL( clone ), "" );
715  }
716  }
717  else
718  {
719  // Attach head.
720  if ( IsDefined( ‪GIB_HEAD_MODEL( clone ) ) )
721  {
722  clone Attach( ‪GIB_HEAD_MODEL( clone ), "" );
723  }
724 
725  if ( !‪IS_GIBBED( gibState, ‪GIB_HEAD_HAT_FLAG ) && IsDefined( ‪GIB_HAT_MODEL( clone ) ) )
726  {
727  clone Attach( ‪GIB_HAT_MODEL( clone ), "" );
728  }
729  }
730 
731  return clone;
732 }
733 
734 function ‪IsGibbed( localClientNum, entity, gibFlag )
735 {
736  return ‪IS_GIBBED( ‪_GetGibbedState( localClientNum, entity ), gibFlag );
737 }
738 
739 function ‪IsUndamaged( localClientNum, entity )
740 {
741  return ‪_GetGibbedState( localClientNum, entity ) == ‪GIB_UNDAMAGED_FLAG;
742 }
743 
744 function ‪GibEntity( localClientNum, gibFlags )
745 {
746  self ‪_GibEntity( localClientNum, gibFlags, true );
747 
748  self.gib_state = ‪SET_GIBBED( ‪_GetGibbedState( localClientNum, self ), gibFlags );
749 }
750 
751 function ‪HandleGibNotetracks( localClientNum )
752 {
753  entity = self;
754 
755  entity thread ‪_HandleGibAnnihilate( localClientNum );
756  entity thread ‪_HandleGibHead( localClientNum );
757  entity thread ‪_HandleGibRightArm( localClientNum );
758  entity thread ‪_HandleGibLeftArm( localClientNum );
759  entity thread ‪_HandleGibRightLeg( localClientNum );
760  entity thread ‪_HandleGibLeftLeg( localClientNum );
761 }
762 
763 function ‪PlayerGibLeftArm( localClientNum )
764 {
765  self ‪GibEntity( localClientNum, ‪GIB_TORSO_LEFT_ARM_FLAG );
766 }
767 
768 function ‪PlayerGibRightArm( localClientNum )
769 {
770  self ‪GibEntity( localClientNum, ‪GIB_TORSO_RIGHT_ARM_FLAG );
771 }
772 
773 function ‪PlayerGibLeftLeg( localClientNum )
774 {
775  self ‪GibEntity( localClientNum, ‪GIB_LEGS_LEFT_LEG_FLAG );
776 }
777 
778 function ‪PlayerGibRightLeg( localClientNum )
779 {
780  self ‪GibEntity( localClientNum, ‪GIB_LEGS_RIGHT_LEG_FLAG );
781 }
782 
783 function ‪PlayerGibLegs( localClientNum )
784 {
785  self ‪GibEntity( localClientNum, ‪GIB_LEGS_RIGHT_LEG_FLAG );
786  self ‪GibEntity( localClientNum, ‪GIB_LEGS_LEFT_LEG_FLAG );
787 }
788 
789 function ‪PlayerGibTag( localClientNum, gibFlag )
790 {
791  return ‪_GibPieceTag( localClientNum, self, gibFlag );
792 }
793 
‪GIB_LEGS_LEFT_LEG_GONE_MODEL
‪#define GIB_LEGS_LEFT_LEG_GONE_MODEL(entity)
Definition: gib.gsh:17
‪GIB_CLIENTFIELD_TYPE
‪#define GIB_CLIENTFIELD_TYPE
Definition: gib.gsh:40
‪_HandleGibLeftLeg
‪function private _HandleGibLeftLeg(localClientNum)
Definition: gib.csc:552
‪_GibClientExtraInternal
‪function private _GibClientExtraInternal(localClientNum, entity, gibFlag)
Definition: gib.csc:353
‪callback
‪function callback(event, localclientnum, params)
Definition: callbacks_shared.csc:13
‪GIB_TORSO_LEFT_ARM_GONE_MODEL
‪#define GIB_TORSO_LEFT_ARM_GONE_MODEL(entity)
Definition: gib.gsh:10
‪GET_GIB_BUNDLES
‪#define GET_GIB_BUNDLES
Definition: gib.gsh:57
‪GIB_LEGS_RIGHT_LEG_FLAG
‪#define GIB_LEGS_RIGHT_LEG_FLAG
Definition: gib.gsh:28
‪is_gib_restricted_build
‪function is_gib_restricted_build()
Definition: util_shared.csc:1305
‪_GetGibbedLegModel
‪function private _GetGibbedLegModel(localClientNum, entity)
Definition: gib.csc:175
‪AddGibCallback
‪function AddGibCallback(localClientNum, entity, gibFlag, callbackFunction)
Definition: gib.csc:608
‪_HasGibDef
‪function private _HasGibDef(entity)
Definition: gib.csc:561
‪ClientEntGibLeftArm
‪function ClientEntGibLeftArm(localClientNum, entity)
Definition: gib.csc:652
‪PlayerGibLeftLeg
‪function PlayerGibLeftLeg(localClientNum)
Definition: gib.csc:773
‪_HandleGibAnnihilate
‪function private _HandleGibAnnihilate(localClientNum)
Definition: gib.csc:507
‪_AnnihilateCorpse
‪function private _AnnihilateCorpse()
Definition: gib.csc:78
‪ClientEntGibAnnihilate
‪function ClientEntGibAnnihilate(localClientNum, entity)
Definition: gib.csc:627
‪GIB_TORSO_RIGHT_ARM_FLAG
‪#define GIB_TORSO_RIGHT_ARM_FLAG
Definition: gib.gsh:25
‪is_mature
‪function is_mature()
Definition: util_shared.csc:1300
‪GIB_TORSO_RIGHT_ARM_GONE_MODEL
‪#define GIB_TORSO_RIGHT_ARM_GONE_MODEL(entity)
Definition: gib.gsh:9
‪GibEntity
‪function GibEntity(localClientNum, gibFlags)
Definition: gib.csc:744
‪GIB_ANNIHILATE_FLAG
‪#define GIB_ANNIHILATE_FLAG
Definition: gib.gsh:22
‪GIB_LEGS_UNDAMAGED_MODEL
‪#define GIB_LEGS_UNDAMAGED_MODEL(entity)
Definition: gib.gsh:15
‪PlayerGibLegs
‪function PlayerGibLegs(localClientNum)
Definition: gib.csc:783
‪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
‪GIB_CLIENTFIELD
‪#define GIB_CLIENTFIELD
Definition: gib.gsh:36
‪_GibHandler
‪function private _GibHandler(localClientNum, oldValue, newValue, bNewEnt, bInitialSnap, fieldName, wasDemoJump)
Definition: gib.csc:395
‪_SetGibbed
‪function private _SetGibbed(localClientNum, entity, gibFlag)
Definition: gib.csc:302
‪_CloneGibData
‪function private _CloneGibData(localClientNum, entity, clone)
Definition: gib.csc:125
‪main
‪function autoexec main()
Definition: gib.csc:12
‪GIB_HEAD_HAT_FLAG
‪#define GIB_HEAD_HAT_FLAG
Definition: gib.gsh:23
‪GET_GIB_DIR_BITS
‪#define GET_GIB_DIR_BITS(gib_state)
Definition: gib.gsh:43
‪GIB_CLIENTFIELD_BITS_ACTOR
‪#define GIB_CLIENTFIELD_BITS_ACTOR
Definition: gib.gsh:38
‪PlayerGibRightArm
‪function PlayerGibRightArm(localClientNum)
Definition: gib.csc:768
‪_GibClientEntityInternal
‪function private _GibClientEntityInternal(localClientNum, entity, gibFlag)
Definition: gib.csc:316
‪_HandleGibCallbacks
‪function private _HandleGibCallbacks(localClientNum, entity, gibFlag)
Definition: gib.csc:495
‪_HandleGibRightArm
‪function private _HandleGibRightArm(localClientNum)
Definition: gib.csc:525
‪PlayerGibTag
‪function PlayerGibTag(localClientNum, gibFlag)
Definition: gib.csc:789
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪GIB_LEGS_BOTH_LEGS_FLAG
‪#define GIB_LEGS_BOTH_LEGS_FLAG
Definition: gib.gsh:30
‪_PlayGibSound
‪function _PlayGibSound(localClientNum, entity, soundAlias)
Definition: gib.csc:590
‪GIB_UNDAMAGED_FLAG
‪#define GIB_UNDAMAGED_FLAG
Definition: gib.gsh:20
‪_GibEntity
‪function private _GibEntity(localClientNum, gibFlags, shouldSpawnGibs)
Definition: gib.csc:248
‪_HandleGibLeftArm
‪function private _HandleGibLeftArm(localClientNum)
Definition: gib.csc:534
‪GIB_DIR_BITS
‪#define GIB_DIR_BITS
Definition: gib.gsh:33
‪GIB_TORSO_HEAD_GONE_MODEL
‪#define GIB_TORSO_HEAD_GONE_MODEL(entity)
Definition: gib.gsh:12
‪IS_BODY_UNDAMAGED
‪#define IS_BODY_UNDAMAGED(gib_state)
Definition: gib.gsh:47
‪CreateScriptModelOfEntity
‪function CreateScriptModelOfEntity(localClientNum, entity)
Definition: gib.csc:682
‪GIB_LEGS_LEFT_LEG_FLAG
‪#define GIB_LEGS_LEFT_LEG_FLAG
Definition: gib.gsh:29
‪CF_HOST_ONLY
‪#define CF_HOST_ONLY
Definition: version.gsh:102
‪_GetGibExtraModel
‪function private _GetGibExtraModel(localClientNumm, entity, gibFlag)
Definition: gib.csc:197
‪ClientEntGibRightLeg
‪function ClientEntGibRightLeg(localClientNum, entity)
Definition: gib.csc:677
‪IsGibbed
‪function IsGibbed(localClientNum, entity, gibFlag)
Definition: gib.csc:734
‪PlayerGibLeftArm
‪function PlayerGibLeftArm(localClientNum)
Definition: gib.csc:763
‪ClientEntGibHead
‪function ClientEntGibHead(localClientNum, entity)
Definition: gib.csc:646
‪_GibPieceTag
‪function private _GibPieceTag(localClientNum, entity, gibFlag)
Definition: gib.csc:232
‪GIB_HEAD_MODEL
‪#define GIB_HEAD_MODEL(entity)
Definition: gib.gsh:5
‪_HandleGibHead
‪function private _HandleGibHead(localClientNum)
Definition: gib.csc:516
‪Spawn
‪function Spawn(parent, onDeathCallback)
Definition: _flak_drone.gsc:427
‪_GibPiece
‪function _GibPiece(localClientNum, entity, gibModel, gibTag, gibFx, gibDir)
Definition: gib.csc:433
‪_GetGibDef
‪function private _GetGibDef(entity)
Definition: gib.csc:147
‪GIB_TORSO_UNDAMAGED_MODEL
‪#define GIB_TORSO_UNDAMAGED_MODEL(entity)
Definition: gib.gsh:8
‪PlayerGibRightLeg
‪function PlayerGibRightLeg(localClientNum)
Definition: gib.csc:778
‪_GetGibbedState
‪function private _GetGibbedState(localClientNum, entity)
Definition: gib.csc:161
‪SHOULD_SPAWN_GIBS
‪#define SHOULD_SPAWN_GIBS(gib_state)
Definition: gib.gsh:53
‪GIB_TORSO_LEFT_ARM_FLAG
‪#define GIB_TORSO_LEFT_ARM_FLAG
Definition: gib.gsh:26
‪GIB_CLIENTFIELD_BITS_PLAYER
‪#define GIB_CLIENTFIELD_BITS_PLAYER
Definition: gib.gsh:39
‪GIB_LEGS_RIGHT_LEG_GONE_MODEL
‪#define GIB_LEGS_RIGHT_LEG_GONE_MODEL(entity)
Definition: gib.gsh:16
‪IS_GIBBED
‪#define IS_GIBBED(gib_state, gib_flag)
Definition: gib.gsh:48
‪IsUndamaged
‪function IsUndamaged(localClientNum, entity)
Definition: gib.csc:739
‪ClientEntGibRightArm
‪function ClientEntGibRightArm(localClientNum, entity)
Definition: gib.csc:662
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪MIN_DISTANCE_SQ
‪#define MIN_DISTANCE_SQ
Definition: gib.csc:77
‪GET_GIB_FLAG
‪#define GET_GIB_FLAG(old_gib_state, current_gib_state)
Definition: gib.gsh:50
‪_GetGibbedTorsoModel
‪function private _GetGibbedTorsoModel(localClientNum, entity)
Definition: gib.csc:207
‪_HandleGibRightLeg
‪function private _HandleGibRightLeg(localClientNum)
Definition: gib.csc:543
‪ClientEntGibLeftLeg
‪function ClientEntGibLeftLeg(localClientNum, entity)
Definition: gib.csc:672
‪ARCHETYPE_HUMAN
‪#define ARCHETYPE_HUMAN
Definition: archetype_shared.gsh:4
‪GET_GIB_BUNDLE
‪#define GET_GIB_BUNDLE(_gib_def)
Definition: gib.gsh:56
‪GIB_LEGS_NO_LEGS_MODEL
‪#define GIB_LEGS_NO_LEGS_MODEL(entity)
Definition: gib.gsh:18
‪SET_GIBBED
‪#define SET_GIBBED(gib_state, gib_flag)
Definition: gib.gsh:51
‪_PlayGibFX
‪function _PlayGibFX(localClientNum, entity, fxFileName, fxTag)
Definition: gib.csc:568
‪WAIT_CLIENT_FRAME
‪#define WAIT_CLIENT_FRAME
Definition: shared.gsh:266
‪GIB_TORSO_HEAD_FLAG
‪#define GIB_TORSO_HEAD_FLAG
Definition: gib.gsh:24
‪GIB_HAT_MODEL
‪#define GIB_HAT_MODEL(entity)
Definition: gib.gsh:4
‪HandleGibNotetracks
‪function HandleGibNotetracks(localClientNum)
Definition: gib.csc:751