‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_gadget_armor.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\flagsys_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\weapons\_weaponobjects;
10 
11 #using scripts\shared\abilities\_ability_player;
12 #using scripts\shared\abilities\_ability_power;
13 #using scripts\shared\abilities\_ability_util;
14 
15 #insert scripts\shared\shared.gsh;
16 #insert scripts\shared\version.gsh;
17 #insert scripts\shared\abilities\_ability_util.gsh;
18 
19 #define ARMOR_PROJECTILE_MULTIPLIER GetDvarFloat( "scr_armor_mod_proj_mult", 1 )
20 #define ARMOR_MELEE_MULTIPLIER GetDvarFloat( "scr_armor_mod_melee_mult", 2 )
21 #define ARMOR_EXPLOSIVE_MULTIPLIER GetDvarFloat( "scr_armor_mod_expl_mult", 1 )
22 #define ARMOR_BULLET_MULTIPLIER GetDvarFloat( "scr_armor_mod_bullet_mult", .7 )
23 #define ARMOR_MISC_MULTIPLIER GetDvarFloat( "scr_armor_mod_misc_mult", 1 )
24 #define ARMOR_VIEW_KICK_MULTIPLIER GetDvarFloat( "scr_armor_mod_view_kick_mult", .001 )
25 
26 #namespace armor;
27 
28 ‪REGISTER_SYSTEM( "gadget_armor", &‪__init__, undefined )
29 
30 function ‪__init__()
31 {
37 
38  ‪clientfield::register( "allplayers", "armor_status" , ‪VERSION_SHIP, ‪ARMOR_STATUS_FULL, "int" );
39  ‪clientfield::register( "toplayer", "player_damage_type" , ‪VERSION_SHIP, 1, "int" );
40 
42 }
43 
44 function ‪gadget_armor_is_inuse( slot )
45 {
46  // returns true when local script gadget state is on
47  return self GadgetIsActive( slot );
48 }
49 
51 {
52  // returns true when local script gadget state is flickering
53  return self GadgetFlickering( slot );
54 }
55 
56 function ‪gadget_armor_on_flicker( slot, weapon )
57 {
58  // excuted when the gadget flickers
59  self thread ‪gadget_armor_flicker( slot, weapon );
60 }
61 
62 function ‪gadget_armor_on_give( slot, weapon )
63 {
64  // executed when gadget is added to the players inventory
65 
66  self ‪clientfield::set( "armor_status", ‪ARMOR_STATUS_OFF );
67 
68  self._gadget_armor_slot = slot;
69  self._gadget_armor_weapon = weapon;
70 }
71 
72 function ‪gadget_armor_on_take( slot, weapon )
73 {
74  // executed when gadget is removed from the players inventory
75 
76  self ‪gadget_armor_off( slot, weapon );
77 }
78 
79 //self is the player
81 {
82  // setup up stuff on player connec
83 }
84 
85 function ‪gadget_armor_on( slot, weapon )
86 {
87  if ( IsAlive(self) )
88  {
89  // excecutes when the gadget is turned on
90  self ‪flagsys::set( "gadget_armor_on" );
91 
92  //armor section
93  self.shock_onpain = 0;
94 
95  //set the hitpoints
96  self.gadgetHitPoints = ( ( IsDefined( weapon.gadget_max_hitpoints ) && weapon.gadget_max_hitpoints > 0 ) ? weapon.gadget_max_hitpoints : undefined );
97 
98  if ( isdefined( self.overridePlayerDamage ) )
99  {
100  self.originalOverridePlayerDamage = self.overridePlayerDamage;
101  }
102 
103  self.overridePlayerDamage = &‪armor_player_damage;
104  self thread ‪gadget_armor_status( slot, weapon );
105  }
106 }
107 
108 function ‪gadget_armor_off( slot, weapon )
109 {
110  armorOn = ‪flagsys::get( "gadget_armor_on" );
111 
112  self notify( "gadget_armor_off" );
113 
114  // excecutes when the gadget is turned off
115  self ‪flagsys::clear( "gadget_armor_on" );
116 
117  //armor section
118  self.shock_onpain = 1;
119  self ‪clientfield::set( "armor_status", ‪ARMOR_STATUS_OFF );
120  if ( isdefined( self.originalOverridePlayerDamage ) )
121  {
122  self.overridePlayerDamage = self.originalOverridePlayerDamage;
123  self.originalOverridePlayerDamage = undefined;
124  }
125 
126  if ( armorOn && IsAlive( self ) && isdefined( level.playGadgetSuccess ) )
127  {
128  self [[ level.playGadgetSuccess ]]( weapon );
129  }
130 }
131 
132 function ‪gadget_armor_flicker( slot, weapon )
133 {
134  self endon( "disconnect" );
135 
136  if ( !self ‪gadget_armor_is_inuse( slot ) )
137  {
138  return;
139  }
140 
141  eventTime = self._gadgets_player[slot].gadget_flickertime;
142 
143  self ‪set_gadget_status( "Flickering", eventTime );
144 
145  while( 1 )
146  {
147  if ( !self GadgetFlickering( slot ) )
148  {
149  self ‪set_gadget_status( "Normal" );
150  return;
151  }
152 
153  wait( 0.5 );
154  }
155 }
156 
157 function ‪set_gadget_status( status, time )
158 {
159  timeStr = "";
160 
161  if ( IsDefined( time ) )
162  {
163  timeStr = "^3" + ", time: " + time;
164  }
165 
166  if ( GetDvarInt( "scr_cpower_debug_prints" ) > 0 )
167  self IPrintlnBold( "Gadget Armor: " + status + timeStr );
168 }
169 
170 function ‪armor_damage_type_multiplier( sMeansOfDeath )
171 {
172  switch(sMeansOfDeath)
173  {
174  case "MOD_CRUSH":
175  case "MOD_TELEFRAG":
176  case "MOD_SUICIDE":
177  case "MOD_DROWN":
178  case "MOD_HIT_BY_OBJECT":
179  case "MOD_FALLING":
180  return 0; // no protection - damage will fall through to player
181 
182 
183  case "MOD_PROJECTILE":
185 
186  case "MOD_MELEE":
187  case "MOD_MELEE_WEAPON_BUTT":
189  break;
190 
191  case "MOD_EXPLOSIVE":
192  case "MOD_PROJECTILE_SPLASH":
193  case "MOD_GRENADE":
194  case "MOD_GRENADE_SPLASH":
196  break;
197 
198  case "MOD_PISTOL_BULLET":
199  case "MOD_RIFLE_BULLET":
201  break;
202 
203 
204  case "MOD_BURNED":
205  case "MOD_UNKNOWN":
206  case "MOD_TRIGGER_HURT":
207  default:
209  }
210 }
211 
212 function ‪armor_damage_mod_allowed( weapon, sMeansOfDeath )
213 {
214  switch( weapon.name )
215  {
216  case "hero_lightninggun":
217  case "hero_lightninggun_arc":
218  return false;
219 
220  default:
221  break;
222  }
223 
224  switch(sMeansOfDeath)
225  {
226  case "MOD_CRUSH":
227  case "MOD_TELEFRAG":
228  case "MOD_SUICIDE":
229  case "MOD_DROWN":
230  case "MOD_HIT_BY_OBJECT":
231  case "MOD_FALLING":
232  case "MOD_MELEE":
233  case "MOD_MELEE_WEAPON_BUTT":
234  case "MOD_EXPLOSIVE":
235  case "MOD_PROJECTILE_SPLASH":
236  case "MOD_GRENADE":
237  case "MOD_GRENADE_SPLASH":
238  case "MOD_BURNED":
239  case "MOD_UNKNOWN":
240  case "MOD_TRIGGER_HURT":
241  return false;
242 
243  case "MOD_PISTOL_BULLET":
244  case "MOD_RIFLE_BULLET":
245  return true;
246 
247  case "MOD_PROJECTILE":
248  // if we are using this as a impact damage only projectile then we allow it
249  if (weapon.explosionradius == 0 )
250  {
251  return true;
252  }
253  return false;
254  default:
255  return false;
256 
257  }
258 
259  return false;
260 }
261 
262 function ‪armor_should_take_damage( eAttacker, weapon, sMeansOfDeath, sHitLoc )
263 {
264  if ( isdefined( eAttacker ) && !‪weaponobjects::friendlyFireCheck( self, eAttacker ) )
265  {
266  return false;
267  }
268 
269  if ( !‪armor_damage_mod_allowed( weapon, sMeansOfDeath ) )
270  {
271  return false;
272  }
273 
274  if( isDefined( sHitLoc ) && ( sHitLoc == "head" || sHitLoc == "helmet" ) )
275  {
276  return false;
277  }
278 
279  return true;
280 }
281 
282 function ‪armor_player_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )
283 {
284  ‪damage = iDamage;
285  self.power_armor_took_damage = false;
286  if ( ( self ‪armor_should_take_damage( eAttacker, weapon, sMeansOfDeath, sHitLoc ) ) && isdefined( self._gadget_armor_slot ) )
287  {
288  self ‪clientfield::set_to_player( "player_damage_type", 1 );
289  if ( self ‪gadget_armor_is_inuse( self._gadget_armor_slot ) )
290  {
291  armor_damage = ‪damage * ‪armor_damage_type_multiplier( sMeansOfDeath );
292 
293  ‪damage = 0;
294 
295  if ( armor_damage > 0 )
296  {
297  if( IsDefined( self.gadgetHitPoints ) )
298  {
299  hitPointsLeft = self.gadgetHitPoints;
300  }
301  else
302  {
303  hitPointsLeft = self GadgetPowerChange( self._gadget_armor_slot, 0.0 );
304  }
305 
306  if ( weapon == level.weaponLightningGun || weapon == level.weaponLightningGunArc )
307  {
308  // lightning gun will take all armor but do no damage
309  armor_damage = hitPointsLeft;
310  }
311  else if ( hitPointsLeft < armor_damage )
312  {
313  // will apply rest of damage back to player
314  ‪damage = armor_damage - hitPointsLeft;
315  }
316 
317  if( IsDefined( self.gadgetHitPoints ) )
318  {
319  self ‪hitpoints_loss_event( armor_damage );
320  }
321  else
322  {
323  self ‪ability_power::power_loss_event( self._gadget_armor_slot, eAttacker, armor_damage, "armor damage" );
324  }
325  self.power_armor_took_damage = true;
326  self.power_armor_last_took_damage_time = GetTime();
327  self AddToDamageIndicator( int( armor_damage * ‪ARMOR_VIEW_KICK_MULTIPLIER ), vDir);
328  }
329  }
330  else
331  {
332  self ‪clientfield::set_to_player( "player_damage_type", 0 );
333  }
334  }
335  else
336  {
337  self ‪clientfield::set_to_player( "player_damage_type", 0 );
338  }
339 
340  return ‪damage;
341 }
342 
343 function ‪hitpoints_loss_event( val )
344 {
345  if ( val > 0 )
346  {
347  self.gadgetHitPoints -= val;
348  }
349 }
350 
351 function ‪gadget_armor_status( slot, weapon )
352 {
353  self endon( "disconnect" );
354 
355  maxHitPoints = ( ( IsDefined( weapon.gadget_max_hitpoints ) && weapon.gadget_max_hitpoints > 0 ) ? weapon.gadget_max_hitpoints : 100 );
356 
357  while ( self ‪flagsys::get( "gadget_armor_on" ) )
358  {
359  if( IsDefined( self.gadgetHitPoints ) && self.gadgetHitPoints <= 0 )
360  {
361  self playsoundtoplayer( "wpn_power_armor_destroyed_plr", self );
362  self playsoundtoallbutplayer( "wpn_power_armor_destroyed_npc", self );
363 
364  self GadgetDeactivate( slot, weapon );
365  self GadgetPowerSet( slot, 0.0 );
366  break;
367  }
368  if( IsDefined( self.gadgetHitPoints ) )
369  {
370  hitPointsRatio = self.gadgetHitPoints / maxHitPoints;
371  }
372  else
373  {
374  hitPointsRatio = self GadgetPowerChange( self._gadget_armor_slot, 0.0 ) / maxHitPoints;
375  }
376  stage = 1 + int( hitPointsRatio * ‪ARMOR_STATUS_FULL );
377 
378  if ( stage > ‪ARMOR_STATUS_FULL )
379  {
380  stage = ‪ARMOR_STATUS_FULL;
381  }
382 
383  self ‪clientfield::set( "armor_status", stage );
384 
386  }
387 
388  self ‪clientfield::set( "armor_status", ‪ARMOR_STATUS_OFF );
389 }
‪ARMOR_MISC_MULTIPLIER
‪#define ARMOR_MISC_MULTIPLIER
Definition: _gadget_armor.gsc:23
‪ARMOR_STATUS_FULL
‪#define ARMOR_STATUS_FULL
Definition: _ability_util.gsh:75
‪register_gadget_is_flickering_callbacks
‪function register_gadget_is_flickering_callbacks(type, flickering_func)
Definition: _ability_player.gsc:299
‪ARMOR_MELEE_MULTIPLIER
‪#define ARMOR_MELEE_MULTIPLIER
Definition: _gadget_armor.gsc:20
‪register_gadget_possession_callbacks
‪function register_gadget_possession_callbacks(type, on_give, on_take)
Definition: _ability_player.gsc:221
‪gadget_armor_is_flickering
‪function gadget_armor_is_flickering(slot)
Definition: _gadget_armor.gsc:50
‪armor_should_take_damage
‪function armor_should_take_damage(eAttacker, weapon, sMeansOfDeath, sHitLoc)
Definition: _gadget_armor.gsc:262
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪clear
‪function clear(str_flag)
Definition: flag_shared.csc:130
‪register_gadget_is_inuse_callbacks
‪function register_gadget_is_inuse_callbacks(type, inuse_func)
Definition: _ability_player.gsc:289
‪ARMOR_PROJECTILE_MULTIPLIER
‪#define ARMOR_PROJECTILE_MULTIPLIER
Definition: _gadget_armor.gsc:19
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪armor_player_damage
‪function armor_player_damage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime)
Definition: _gadget_armor.gsc:282
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪power_loss_event
‪function power_loss_event(slot, eAttacker, val, source)
Definition: _ability_power.gsc:199
‪register_gadget_flicker_callbacks
‪function register_gadget_flicker_callbacks(type, on_flicker)
Definition: _ability_player.gsc:253
‪gadget_armor_on_give
‪function gadget_armor_on_give(slot, weapon)
Definition: _gadget_armor.gsc:62
‪damage
‪function damage(trap)
Definition: _zm_trap_electric.gsc:116
‪gadget_armor_on
‪function gadget_armor_on(slot, weapon)
Definition: _gadget_armor.gsc:85
‪gadget_armor_off
‪function gadget_armor_off(slot, weapon)
Definition: _gadget_armor.gsc:108
‪GADGET_TYPE_ARMOR
‪#define GADGET_TYPE_ARMOR
Definition: _ability_util.gsh:8
‪register_gadget_activation_callbacks
‪function register_gadget_activation_callbacks(type, turn_on, turn_off)
Definition: _ability_player.gsc:237
‪ARMOR_EXPLOSIVE_MULTIPLIER
‪#define ARMOR_EXPLOSIVE_MULTIPLIER
Definition: _gadget_armor.gsc:21
‪set_gadget_status
‪function set_gadget_status(status, time)
Definition: _gadget_armor.gsc:157
‪gadget_armor_status
‪function gadget_armor_status(slot, weapon)
Definition: _gadget_armor.gsc:351
‪ARMOR_BULLET_MULTIPLIER
‪#define ARMOR_BULLET_MULTIPLIER
Definition: _gadget_armor.gsc:22
‪ARMOR_VIEW_KICK_MULTIPLIER
‪#define ARMOR_VIEW_KICK_MULTIPLIER
Definition: _gadget_armor.gsc:24
‪gadget_armor_on_flicker
‪function gadget_armor_on_flicker(slot, weapon)
Definition: _gadget_armor.gsc:56
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪gadget_armor_on_connect
‪function gadget_armor_on_connect()
Definition: _gadget_armor.gsc:80
‪hitpoints_loss_event
‪function hitpoints_loss_event(val)
Definition: _gadget_armor.gsc:343
‪ARMOR_STATUS_OFF
‪#define ARMOR_STATUS_OFF
Definition: _ability_util.gsh:70
‪gadget_armor_on_take
‪function gadget_armor_on_take(slot, weapon)
Definition: _gadget_armor.gsc:72
‪__init__
‪function __init__()
Definition: _gadget_armor.gsc:30
‪armor_damage_mod_allowed
‪function armor_damage_mod_allowed(weapon, sMeansOfDeath)
Definition: _gadget_armor.gsc:212
‪gadget_armor_flicker
‪function gadget_armor_flicker(slot, weapon)
Definition: _gadget_armor.gsc:132
‪set
‪function set(str_field_name, n_value)
Definition: clientfield_shared.gsc:34
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪on_connect
‪function on_connect()
Definition: _arena.gsc:20
‪gadget_armor_is_inuse
‪function gadget_armor_is_inuse(slot)
Definition: _gadget_armor.gsc:44
‪friendlyFireCheck
‪function friendlyFireCheck(owner, attacker, forcedFriendlyFireRule)
Definition: _weaponobjects.gsc:2733
‪armor_damage_type_multiplier
‪function armor_damage_type_multiplier(sMeansOfDeath)
Definition: _gadget_armor.gsc:170
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265