‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
damagefeedback_shared.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\flagsys_shared;
5 #using scripts\shared\weapons_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\killstreaks_shared;
8 #using scripts\shared\abilities\gadgets\_gadget_armor;
9 
10 #insert scripts\shared\shared.gsh;
11 
12 #precache( "material", "damage_feedback" );
13 #precache( "material", "damage_feedback_flak" );
14 #precache( "material", "damage_feedback_tac" );
15 #precache( "material", "damage_feedback_armor" );
16 #precache( "material", "damage_feedback_glow_orange" );
17 
18 #namespace damagefeedback;
19 
20 ‪REGISTER_SYSTEM( "damagefeedback", &‪__init__, undefined )
21 
22 function ‪__init__()
23 {
26 }
27 
28 function ‪init()
29 {
30 }
31 
33 {
34  // MP has a new damage feedback indicator in LUI
35  if ( !SessionModeIsMultiplayerGame() )
36  {
37  self.hud_damagefeedback = newdamageindicatorhudelem(self);
38  self.hud_damagefeedback.horzAlign = "center";
39  self.hud_damagefeedback.vertAlign = "middle";
40  self.hud_damagefeedback.x = -11;
41  self.hud_damagefeedback.y = -11;
42  self.hud_damagefeedback.alpha = 0;
43  self.hud_damagefeedback.archived = true;
44  self.hud_damagefeedback setShader( "damage_feedback", 22, 44 );
45 
46  self.hud_damagefeedback_additional = newdamageindicatorhudelem(self);
47  self.hud_damagefeedback_additional.horzAlign = "center";
48  self.hud_damagefeedback_additional.vertAlign = "middle";
49  self.hud_damagefeedback_additional.x = -12;
50  self.hud_damagefeedback_additional.y = -12;
51  self.hud_damagefeedback_additional.alpha = 0;
52  self.hud_damagefeedback_additional.archived = true;
53  self.hud_damagefeedback_additional setShader( "damage_feedback", 24, 48 );
54  }
55 }
56 
57 function ‪should_play_sound( mod )
58 {
59  if ( !isdefined( mod ) )
60  return false;
61 
62  switch( mod )
63  {
64  case "MOD_CRUSH":
65  case "MOD_GRENADE_SPLASH":
66  case "MOD_HIT_BY_OBJECT":
67  case "MOD_MELEE_ASSASSINATE":
68  case "MOD_MELEE":
69  case "MOD_MELEE_WEAPON_BUTT":
70  return false;
71  };
72 
73  return true;
74 }
75 
76 function ‪update( mod, inflictor, perkFeedback, weapon, victim, psOffsetTime, sHitLoc )
77 {
78  if ( !isPlayer( self ) )
79  return;
80  if ( ‪IS_TRUE(self.noHitMarkers) )
81  return false;
82 
83  if (isDefined(weapon) && ‪IS_TRUE(weapon.nohitmarker) )
84  return;
85 
86  if ( !isDefined( self.lastHitMarkerTime ) )
87  {
88  self.lastHitMarkerTimes = [];
89  self.lastHitMarkerTime = 0;
90  self.lastHitMarkerOffsetTime = 0;
91  }
92 
93  if ( isdefined( psOffsetTime ) )
94  {
95  victim_id = victim GetEntityNumber();
96 
97  if ( !IsDefined( self.lastHitMarkerTimes[ victim_id ] ) )
98  {
99  self.lastHitMarkerTimes[ victim_id ] = 0;
100  }
101 
102  if ( self.lastHitMarkerTime == GetTime() )
103  {
104  if ( self.lastHitMarkerTimes[ victim_id ] === psOffsetTime )
105  return;
106  }
107  self.lastHitMarkerOffsetTime = psOffsetTime;
108  self.lastHitMarkerTimes[ victim_id ] = psOffsetTime;
109  }
110  else
111  {
112  if ( self.lastHitMarkerTime == GetTime() )
113  return;
114  }
115 
116  self.lastHitMarkerTime = GetTime();
117  hitAlias = undefined;
118 
119  if ( ‪should_play_sound( mod ) )
120  {
121  if ( isdefined( victim ) && isdefined( victim.victimSoundMod ) )
122  {
123  switch( victim.victimSoundMod )
124  {
125  case "safeguard_robot":
126  hitAlias = "mpl_hit_alert_escort";
127  break;
128  default:
129  hitAlias = "mpl_hit_alert";
130  break;
131  }
132  }
133  else if ( isdefined( inflictor ) && isdefined( inflictor.soundMod ))
134  {
135  //Add sound stuff here for specific inflictor types
136  switch ( inflictor.soundMod )
137  {
138  case "player":
139  if( isdefined( victim ) && ‪IS_TRUE( victim.isAiClone ) )
140  {
141  hitAlias = "mpl_hit_alert_clone";
142  }
143  else if ( isdefined( victim ) && isPlayer( victim ) && victim ‪flagsys::get( "gadget_armor_on" ) && ‪armor::armor_should_take_damage( inflictor, weapon, mod, sHitLoc ) )
144  {
145  hitAlias = "mpl_hit_alert_armor";
146  }
147  else if( isdefined( victim ) && isPlayer( victim ) && isDefined( victim.carryObject ) && isDefined( victim.carryObject.hitSound ) && isDefined( perkfeedback ) && ( perkfeedback == "armor" ) )
148  {
149  hitAlias = victim.carryObject.hitSound;
150  }
151  else if ( mod == "MOD_BURNED" )
152  {
153  hitAlias = "mpl_hit_alert_burn";
154  }
155  else
156  {
157  hitAlias = "mpl_hit_alert";
158  }
159  break;
160 
161  case "heatwave":
162  hitAlias = "mpl_hit_alert_heatwave";
163  break;
164 
165  case "heli":
166  hitAlias = "mpl_hit_alert_air";
167  break;
168 
169  case "hpm":
170  hitAlias = "mpl_hit_alert_hpm";
171  break;
172 
173  case "taser_spike":
174  hitAlias = "mpl_hit_alert_taser_spike";
175  break;
176 
177  case "straferun":
178  case "dog":
179  break;
180 
181  case "firefly":
182  hitAlias = "mpl_hit_alert_firefly";
183  break;
184 
185  case "drone_land":
186  hitAlias = "mpl_hit_alert_air";
187  break;
188 
189  case "raps":
190  hitAlias = "mpl_hit_alert_air";
191  break;
192 
193  case "default_loud":
194  hitAlias = "mpl_hit_heli_gunner";
195  break;
196 
197  default:
198  hitAlias = "mpl_hit_alert";
199  break;
200  }
201  }
202  else if ( mod == "MOD_BURNED" )
203  {
204  hitAlias = "mpl_hit_alert_burn";
205  }
206  else
207  {
208  hitAlias = "mpl_hit_alert";
209  }
210  }
211 
212  if( isdefined( victim ) && ‪IS_TRUE( victim.isAiClone ) )
213  {
214  self PlayHitMarker( hitAlias );
215  return;
216  }
217 
218  damageStage = 1; // always show at least stage 1 hit marker, per design
219  if ( isdefined(level.growing_hitmarker) && isdefined(victim) && isplayer(victim) )
220  {
221  damageStage = ‪damage_feedback_get_stage( victim );
222  }
223  self PlayHitMarker( hitAlias, damageStage, perkFeedback, ‪damage_feedback_get_dead( victim, mod, weapon, damageStage ) );
224 
225  if ( isdefined( perkFeedback ) )
226  {
227  if ( isDefined( self.hud_damagefeedback_additional ) )
228  {
229  switch( perkFeedback )
230  {
231  case "flakjacket":
232  self.hud_damagefeedback_additional setShader( "damage_feedback_flak", 24, 48 );
233  break;
234  case "tacticalMask":
235  self.hud_damagefeedback_additional setShader( "damage_feedback_tac", 24, 48 );
236  break;
237  case "armor":
238  self.hud_damagefeedback_additional setShader( "damage_feedback_armor", 24, 48 );
239  break;
240  }
241  self.hud_damagefeedback_additional.alpha = 1;
242  self.hud_damagefeedback_additional fadeovertime(1);
243  self.hud_damagefeedback_additional.alpha = 0;
244  }
245  }
246  else
247  {
248  if (isDefined(self.hud_damagefeedback))
249  {
250  self.hud_damagefeedback setShader( "damage_feedback", 24, 48 );
251  }
252  }
253 
254  if (isDefined(self.hud_damagefeedback) && isdefined(level.growing_hitmarker) && isdefined(victim) && isplayer(victim) )
255  {
256  self thread ‪damage_feedback_growth(victim, mod, weapon);
257  }
258  else if ( isDefined(self.hud_damagefeedback))
259  {
260  self.hud_damagefeedback.x = -12;
261  self.hud_damagefeedback.y = -12;
262  self.hud_damagefeedback.alpha = 1;
263  self.hud_damagefeedback fadeOverTime(1);
264  self.hud_damagefeedback.alpha = 0;
265  }
266 }
267 
269 {
270  if( isDefined( victim.laststand) && victim.laststand )
271  return 5;
272  else if ( (victim.health/victim.maxhealth) > .74 )
273  return 1;
274  else if ( (victim.health/victim.maxhealth) > .49 )
275  return 2;
276  else if ( (victim.health/victim.maxhealth) > .24 )
277  return 3;
278  else if ( (victim.health) > 0 )
279  return 4;
280  else
281  return 5;
282 }
283 
284 function ‪damage_feedback_get_dead( victim, mod, weapon, stage )
285 {
286  return ( stage == 5 && (mod == "MOD_BULLET" || mod == "MOD_RIFLE_BULLET" || mod == "MOD_PISTOL_BULLET" || mod == "MOD_HEAD_SHOT") && (isdefined(weapon.isheroweapon) && !weapon.isheroweapon) && !‪killstreaks::is_killstreak_weapon( weapon ) && !( weapon.name === "siegebot_gun_turret" ) && !( weapon.name === "siegebot_launcher_turret" ) );
287 }
288 
289 function ‪damage_feedback_growth(victim, mod, weapon)
290 {
291  if ( isdefined( self.hud_damagefeedback ) )
292  {
293  stage = ‪damage_feedback_get_stage( victim );
294 
295  self.hud_damagefeedback.x = -11 + (-1 * (stage));
296  self.hud_damagefeedback.y = -11 + (-1 * (stage));
297  size_x = 22 + (2 * (stage) );
298  size_y = size_x * 2;
299  self.hud_damagefeedback setShader( "damage_feedback", size_x, size_y );
300 
301  if ( ‪damage_feedback_get_dead( victim, mod, weapon, stage ) )
302  {
303  self.hud_damagefeedback setShader( "damage_feedback_glow_orange", size_x, size_y );
304  self thread ‪kill_hitmarker_fade ();
305  }
306  else
307  {
308  self.hud_damagefeedback setShader( "damage_feedback", size_x, size_y );
309  self.hud_damagefeedback.alpha = 1;
310  self.hud_damagefeedback fadeOverTime(1);
311  self.hud_damagefeedback.alpha = 0;
312  }
313  }
314 }
315 
317 {
318  self notify("kill_hitmarker_fade");
319  self endon ("kill_hitmarker_fade");
320  self endon ("disconnect");
321  self.hud_damagefeedback.alpha = 1;
322  wait 0.25;
323  self.hud_damagefeedback fadeOverTime(0.3);
324  self.hud_damagefeedback.alpha = 0;
325 }
326 
327 function ‪update_override( icon, sound, additional_icon )
328 {
329  if ( !IsPlayer( self ) )
330  return;
331 
332  self PlayLocalSound( sound );
333 
334  if ( IsDefined( self.hud_damagefeedback ) )
335  {
336  self.hud_damagefeedback setShader( icon, 24, 48 );
337  self.hud_damagefeedback.alpha = 1;
338  self.hud_damagefeedback fadeOverTime(1);
339  self.hud_damagefeedback.alpha = 0;
340  }
341 
342  if ( isDefined( self.hud_damagefeedback_additional ) )
343  {
344  if ( !IsDefined( additional_icon ) )
345  {
346  self.hud_damagefeedback_additional.alpha = 0;
347  }
348  else
349  {
350  self.hud_damagefeedback_additional setShader( additional_icon, 24, 48 );
351  self.hud_damagefeedback_additional.alpha = 1;
352  self.hud_damagefeedback_additional fadeOverTime(1);
353  self.hud_damagefeedback_additional.alpha = 0;
354  }
355  }
356 }
357 
358 function ‪update_special( hitEnt )
359 {
360  if ( !isPlayer( self ) )
361  return;
362 
363  if ( !isdefined(hitEnt) )
364  return;
365 
366  if ( !isPlayer( hitEnt ) )
367  return;
368 
370  if ( !isdefined( self.directionalHitArray ) )
371  {
372  self.directionalHitArray = [];
373  hitEntNum = hitEnt getEntityNumber();
374  self.directionalHitArray[hitEntNum] = 1;
375  self thread ‪send_hit_special_event_at_frame_end(hitEnt);
376  }
377  else
378  {
379  hitEntNum = hitEnt getEntityNumber();
380  self.directionalHitArray[hitEntNum] = 1;
381  }
382 }
383 
385 {
386  self endon ("disconnect");
387  waittillframeend;
388 
389  enemysHit = 0;
390  value = 1;
391 
392  entBitArray0 = 0;
393  for ( i = 0; i < 32; i++ )
394  {
395  if (isdefined (self.directionalHitArray[i]) && self.directionalHitArray[i] != 0 )
396  {
397  entBitArray0 += value;
398  enemysHit++;
399  }
400  value *= 2;
401  }
402  entBitArray1 = 0;
403  for ( i = 33; i < 64; i++ )
404  {
405  if (isdefined (self.directionalHitArray[i]) && self.directionalHitArray[i] != 0 )
406  {
407  entBitArray1 += value;
408  enemysHit++;
409  }
410  value *= 2;
411  }
412 
413 
414  if ( enemysHit )
415  {
416  self directionalHitIndicator( entBitArray0, entBitArray1 );
417  }
418  self.directionalHitArray = undefined;
419  entBitArray0 = 0;
420  entBitArray1 = 0;
421 }
422 
423 function ‪doDamageFeedback( weapon, eInflictor, iDamage, sMeansOfDeath )
424 {
425  if ( !isdefined( weapon ) )
426  return false;
427 
428  if (‪IS_TRUE(weapon.nohitmarker) )
429  return false;
430 
431  if ( level.allowHitMarkers == 0 )
432  return false;
433 
434  if ( level.allowHitMarkers == 1 ) // no tac grenades
435  {
436  if ( isdefined( sMeansOfDeath ) && isdefined( iDamage ) )
437  {
438  if ( ‪isTacticalHitMarker( weapon, sMeansOfDeath, iDamage ) )
439  {
440  return false;
441  }
442  }
443  }
444 
445  return true;
446 }
447 
448 
449 function ‪isTacticalHitMarker( weapon, sMeansOfDeath, iDamage )
450 {
451  if ( ‪weapons::is_grenade( weapon ) )
452  {
453  if ( "Smoke Grenade" == weapon.offhandClass )
454  {
455  if ( sMeansOfDeath == "MOD_GRENADE_SPLASH" )
456  return true;
457  }
458  else if ( iDamage == 1 )
459  {
460  return true;
461  }
462  }
463  return false;
464 }
‪update_special
‪function update_special(hitEnt)
Definition: damagefeedback_shared.gsc:358
‪kill_hitmarker_fade
‪function kill_hitmarker_fade()
Definition: damagefeedback_shared.gsc:316
‪on_player_connect
‪function on_player_connect()
Definition: damagefeedback_shared.gsc:32
‪armor_should_take_damage
‪function armor_should_take_damage(eAttacker, weapon, sMeansOfDeath, sHitLoc)
Definition: _gadget_armor.gsc:262
‪damage_feedback_get_stage
‪function damage_feedback_get_stage(victim)
Definition: damagefeedback_shared.gsc:268
‪on_start_gametype
‪function on_start_gametype(func, obj)
Definition: callbacks_shared.csc:285
‪damage_feedback_get_dead
‪function damage_feedback_get_dead(victim, mod, weapon, stage)
Definition: damagefeedback_shared.gsc:284
‪isTacticalHitMarker
‪function isTacticalHitMarker(weapon, sMeansOfDeath, iDamage)
Definition: damagefeedback_shared.gsc:449
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪update
‪function update(mod, inflictor, perkFeedback, weapon, victim, psOffsetTime, sHitLoc)
Definition: damagefeedback_shared.gsc:76
‪__init__
‪function __init__()
Definition: damagefeedback_shared.gsc:22
‪send_hit_special_event_at_frame_end
‪function send_hit_special_event_at_frame_end(hitEnt)
Definition: damagefeedback_shared.gsc:384
‪update_override
‪function update_override(icon, sound, additional_icon)
Definition: damagefeedback_shared.gsc:327
‪init
‪function init()
Definition: damagefeedback_shared.gsc:28
‪is_killstreak_weapon
‪function is_killstreak_weapon(weapon)
Definition: killstreaks_shared.gsc:16
‪doDamageFeedback
‪function doDamageFeedback(weapon, eInflictor, iDamage, sMeansOfDeath)
Definition: damagefeedback_shared.gsc:423
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪damage_feedback_growth
‪function damage_feedback_growth(victim, mod, weapon)
Definition: damagefeedback_shared.gsc:289
‪is_grenade
‪function is_grenade(weapon)
Definition: weapons_shared.gsc:30
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪should_play_sound
‪function should_play_sound(mod)
Definition: damagefeedback_shared.gsc:57
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265