‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
zombie_death.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 #using scripts\shared\util_shared;
3 #using scripts\shared\ai\zombie_shared;
4 #using scripts\shared\ai\zombie_utility;
5 #using scripts\shared\ai\systems\gib;
6 
7 #insert scripts\shared\shared.gsh;
8 
9 #precache( "fx", "zombie/fx_blood_torso_explo_zmb" );
10 #precache( "fx", "_t6/trail/fx_trail_blood_streak" );
11 #precache( "fx", "_t6/impacts/fx_flesh_hit_neck_fatal" );
12 
14 {
15  self endon ("death");
16 
17  // about the length of the flame fx
18 
19  if( isdefined(self.flame_fx_timeout) )
20  {
21  wait self.flame_fx_timeout;
22  }
23  else
24  {
25  wait 12;
26  }
27 
28  if (isdefined(self) && IsAlive(self))
29  {
30  self.is_on_fire = false;
31  self notify ("stop_flame_damage");
32  }
33 
34 }
35 
36 
38 {
39  self endon( "death" );
40 
41  if (isdefined(self.is_on_fire) && self.is_on_fire )
42  {
43  return;
44  }
45 
46  if( ‪IS_TRUE(self.disable_flame_fx) )
47  {
48  return;
49  }
50 
51  self.is_on_fire = true;
52 
53  self thread ‪on_fire_timeout();
54 
55  if( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_torso"] ) )
56  {
57  fire_tag = "j_spinelower";
58 
59  fire_death_torso_fx = level._effect["character_fire_death_torso"];
60 
61  if( isDefined( self.weapon_specific_fire_death_torso_fx ))
62  {
63  fire_death_torso_fx = self.weapon_specific_fire_death_torso_fx;
64  }
65 
66  if( !isDefined( self GetTagOrigin( fire_tag))) //allows effect to play on parasite and insanity elementals
67  {
68  fire_tag = "tag_origin";
69  }
70 
71  if ( !isDefined( self.isdog) || !self.isdog )
72  {
73  PlayFxOnTag( fire_death_torso_fx, self, fire_tag );
74  }
75 
76  self.weapon_specific_fire_death_torso_fx = undefined;
77  }
78  else
79  {
80  }
81 
82  if( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_sm"] ) )
83  {
84  if( self.archetype !== "parasite" && self.archetype !== "raps" && self.archetype !== "spider")
85  {
86 
87  fire_death_sm_fx = level._effect["character_fire_death_sm"];
88 
89  if( isDefined( self.weapon_specific_fire_death_sm_fx ))
90  {
91  fire_death_sm_fx = self.weapon_specific_fire_death_sm_fx;
92  }
93 
94  if( isDefined( self.weapon_specific_fire_death_torso_fx ))
95  {
96  fire_death_torso_fx = self.weapon_specific_fire_death_torso_fx;
97  }
98  wait 1;
99 
100  tagArray = [];
101  tagArray[0] = "J_Elbow_LE";
102  tagArray[1] = "J_Elbow_RI";
103  tagArray[2] = "J_Knee_RI";
104  tagArray[3] = "J_Knee_LE";
105  tagArray = ‪randomize_array( tagArray );
106 
107  PlayFxOnTag( fire_death_sm_fx, self, tagArray[0] );
108 
109  wait 1;
110 
111  tagArray[0] = "J_Wrist_RI";
112  tagArray[1] = "J_Wrist_LE";
113  if( !isdefined( self.‪a.gib_ref ) || self.a.gib_ref != "no_legs" )
114  {
115  tagArray[2] = "J_Ankle_RI";
116  tagArray[3] = "J_Ankle_LE";
117  }
118  tagArray = ‪randomize_array( tagArray );
119 
120  PlayFxOnTag( fire_death_sm_fx, self, tagArray[0] );
121  PlayFxOnTag( fire_death_sm_fx, self, tagArray[1] );
122 
123  self.weapon_specific_fire_death_sm_fx = undefined;
124  }
125  }
126  else
127  {
128  }
129 }
130 
131 
132 // MikeD( 9/30/2007 ): Taken from maps\_utility "array_randomize:, for some reason maps\_utility is included in a animscript
133 // somewhere, but I can't call it within in this... So I made a new one.
135 {
136  for( i = 0; i < ‪array.size; i++ )
137  {
138  j = RandomInt( ‪array.size );
139  temp = ‪array[i];
140  ‪array[i] = ‪array[j];
141  ‪array[j] = temp;
142  }
143  return ‪array;
144 }
145 
147 {
148  anim notify( "stop_last_gib_time" );
149  anim endon( "stop_last_gib_time" );
150 
152  anim.lastGibTime = GetTime();
153  anim.totalGibs = RandomIntRange( anim.minGibs, anim.maxGibs );
154 }
155 
156 function ‪get_gib_ref( direction )
157 {
158  // If already set, then use it. Useful for canned gib deaths.
159  if( isdefined( self.‪a.gib_ref ) )
160  {
161  return;
162  }
163 
164  // Don't gib if we haven't taken enough damage by the explosive
165  // Grenade damage usually range from 160 - 250, so we go above teh minimum
166  // so if the splash damage is near it's lowest, don't gib.
167  if( self.damageTaken < 165 )
168  {
169  return;
170  }
171 
172  if( GetTime() > anim.lastGibTime + anim.gibDelay && anim.totalGibs > 0 )
173  {
174  anim.totalGibs--;
175 
176  // MikeD( 5/5/2008 ): Allows multiple guys to GIB at once.
177  anim thread ‪set_last_gib_time();
178 
179  refs = [];
180  switch( direction )
181  {
182  case "right":
183  refs[refs.size] = "left_arm";
184  refs[refs.size] = "left_leg";
185 
186  gib_ref = ‪get_random( refs );
187  break;
188 
189  case "left":
190  refs[refs.size] = "right_arm";
191  refs[refs.size] = "right_leg";
192 
193  gib_ref = ‪get_random( refs );
194  break;
195 
196  case "forward":
197  refs[refs.size] = "right_arm";
198  refs[refs.size] = "left_arm";
199  refs[refs.size] = "right_leg";
200  refs[refs.size] = "left_leg";
201  refs[refs.size] = "guts";
202  refs[refs.size] = "no_legs";
203 
204  gib_ref = ‪get_random( refs );
205  break;
206 
207  case "back":
208  refs[refs.size] = "right_arm";
209  refs[refs.size] = "left_arm";
210  refs[refs.size] = "right_leg";
211  refs[refs.size] = "left_leg";
212  refs[refs.size] = "no_legs";
213 
214  gib_ref = ‪get_random( refs );
215  break;
216 
217  default: // "up"
218  refs[refs.size] = "right_arm";
219  refs[refs.size] = "left_arm";
220  refs[refs.size] = "right_leg";
221  refs[refs.size] = "left_leg";
222  refs[refs.size] = "no_legs";
223  refs[refs.size] = "guts";
224 
225  gib_ref = ‪get_random( refs );
226  break;
227  }
228 
229 
230  self.a.gib_ref = gib_ref;
231  }
232  else
233  {
234  self.a.gib_ref = undefined;
235  }
236 }
237 
238 
240 {
241  return ‪array[RandomInt( ‪array.size )];
242 }
243 
244 
245 function ‪do_gib()
246 {
247  if( !isdefined( self.‪a.gib_ref ) )
248  {
249  return;
250  }
251 
252  if (isdefined(self.is_on_fire) && self.is_on_fire)
253  {
254  return;
255  }
256 
257  switch ( self.‪a.gib_ref )
258  {
259  case "right_arm":
261  break;
262  case "left_arm":
264  break;
265  case "right_leg":
267  break;
268  case "left_leg":
270  break;
271  case "no_legs":
273  break;
274  case "head":
276  break;
277  case "guts":
278  // TODO(David Young 9-17-14): Currently no characters have gut torso models, unsupported.
279  break;
280  default:
281  AssertMsg( "Unknown gib_ref \"" + self.‪a.gib_ref + "\", unable to gib entity." );
282  break;
283  }
284 }
285 
287 {
288  anim._effect["animscript_gib_fx"] = "zombie/fx_blood_torso_explo_zmb";
289  anim._effect["animscript_gibtrail_fx"] = "_t6/trail/fx_trail_blood_streak";
290 
291  // Not gib; split out into another function before this gets out of hand.
292  anim._effect["death_neckgrab_spurt"] = "_t6/impacts/fx_flesh_hit_neck_fatal";
293 }
‪precache_gib_fx
‪function precache_gib_fx()
Definition: zombie_death.gsc:286
‪GibLeftArm
‪function GibLeftArm(entity)
Definition: gib.gsc:450
‪get_random
‪function get_random(array)
Definition: zombie_death.gsc:239
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪a
‪function add_remove_list a
Definition: util_shared.csc:906
‪do_gib
‪function do_gib()
Definition: zombie_death.gsc:245
‪GibRightLeg
‪function GibRightLeg(entity)
Definition: gib.gsc:496
‪flame_death_fx
‪function flame_death_fx()
Definition: zombie_death.gsc:37
‪GibLeftLeg
‪function GibLeftLeg(entity)
Definition: gib.gsc:485
‪randomize_array
‪function randomize_array(array)
Definition: zombie_death.gsc:134
‪get_gib_ref
‪function get_gib_ref(direction)
Definition: zombie_death.gsc:156
‪on_fire_timeout
‪function on_fire_timeout()
Definition: zombie_death.gsc:13
‪array
‪function filter array
Definition: array_shared.csc:16
‪set_last_gib_time
‪function set_last_gib_time()
Definition: zombie_death.gsc:146
‪GibLegs
‪function GibLegs(entity)
Definition: gib.gsc:507
‪GibRightArm
‪function GibRightArm(entity)
Definition: gib.gsc:467
‪GibHead
‪function GibHead(entity)
Definition: gib.gsc:443
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265