‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_pickup_items.gsc
Go to the documentation of this file.
1 #insert scripts\shared\shared.gsh;
2 #using scripts\codescripts\struct;
3 
4 #using scripts\shared\array_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\gameobjects_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\weapons\_weaponobjects;
10 #using scripts\shared\weapons\_weapons;
11 
12 #using scripts\mp\_util;
13 #using scripts\mp\gametypes\_weaponobjects;
14 
15 #insert scripts\mp\_pickup_items.gsh;
16 
17 #namespace pickup_items;
18 
19 ‪REGISTER_SYSTEM( "pickup_items", &‪__init__, undefined )
20 
21 
22 #define PICKUP_ROTATE_RATE 175
23 #define PICKUP_BOB_DISTANCE 4
24 
25 // group 1 - blue
26 #precache( "xmodel", "p7_perk_t7_hud_perk_flakjacket" );
27 #precache( "xmodel", "p7_perk_t7_hud_perk_blind_eye" );
28 #precache( "xmodel", "p7_perk_t7_hud_perk_hardline" );
29 #precache( "xmodel", "p7_perk_t7_hud_perk_ghost" );
30 #precache( "xmodel", "p7_perk_t7_hud_perk_jetsilencer" );
31 #precache( "xmodel", "p7_perk_t7_hud_perk_lightweight" );
32 #precache( "xmodel", "p7_perk_t7_hud_perk_jetcharge" );
33 #precache( "xmodel", "p7_perk_t7_hud_perk_overcharge" );
34 
35 // group 2 - green
36 #precache( "xmodel", "p7_perk_t7_hud_perk_hardwired" );
37 #precache( "xmodel", "p7_perk_t7_hud_perk_scavenger" );
38 #precache( "xmodel", "p7_perk_t7_hud_perk_cold_blooded" );
39 #precache( "xmodel", "p7_perk_t7_hud_perk_fasthands" );
40 #precache( "xmodel", "p7_perk_t7_hud_perk_toughness" );
41 #precache( "xmodel", "p7_perk_t7_hud_perk_tracker" );
42 #precache( "xmodel", "p7_perk_t7_hud_perk_ante_up" );
43 
44 // group 3 - red
45 #precache( "xmodel", "p7_perk_t7_hud_perk_dexterity" );
46 #precache( "xmodel", "p7_perk_t7_hud_perk_engineer" );
47 #precache( "xmodel", "p7_perk_t7_hud_perk_deadsilence" );
48 #precache( "xmodel", "p7_perk_t7_hud_perk_tacticalmask" );
49 #precache( "xmodel", "p7_perk_t7_hud_perk_awareness" );
50 #precache( "xmodel", "p7_perk_t7_hud_perk_sixthsense" );
51 #precache( "xmodel", "p7_perk_t7_hud_perk_marathon" );
52 #precache( "xmodel", "p7_perk_t7_hud_perk_gungho" );
53 
54 #precache( "objective", "pickup_item" );
55 
56 function ‪__init__()
57 {
59 
60  level.nullPrimaryOffhand = GetWeapon( "null_offhand_primary" );
61  level.nullSecondaryOffhand = GetWeapon( "null_offhand_secondary" );
62 
63  level.pickup_items = [];
64 
65  level.pickupItemRespawn = true;
66 }
67 
68 function ‪on_player_spawned() // self == player
69 {
70  self.pickup_damage_scale = undefined;
71  self.pickup_damage_scale_time = undefined;
72 }
73 
75 {
77 
78  pickup_triggers = GetEntArray( "pickup_item", "targetname" );
79  pickup_models = GetEntArray( "pickup_model", "targetname" );
80 
81  visuals = [];
82 
83  foreach( trigger in pickup_triggers )
84  {
85  visuals[0] = ‪get_visual_for_trigger( trigger, pickup_models );
86  assert( isDefined( visuals[0]) );
87 
88  visuals[0] ‪pickup_item_init();
89 
90  pickup_item_object = ‪gameobjects::create_use_object( "neutral", trigger, visuals, (0,0,32), istring("pickup_item") );
91  pickup_item_object ‪gameobjects::allow_use( "any" );
92  pickup_item_object ‪gameobjects::set_use_time( 0 );
93  pickup_item_object.onUse = &‪on_touch;
94 
95 
96  level.pickup_items[level.pickup_items.size] = pickup_item_object;
97  }
98 }
99 
100 function ‪get_visual_for_trigger( trigger, pickup_models )
101 {
102  foreach( model in pickup_models )
103  {
104  if ( model istouchingswept( trigger ) )
105  return model;
106  }
107 
108  return undefined;
109 }
110 
112 {
113  self Bobbing( (0,0,1), ‪PICKUP_BOB_DISTANCE, 1 );
114 }
115 
117 {
118  self ‪Rotate( (0,‪PICKUP_ROTATE_RATE,0) );
119 }
120 
122 {
123  if( self.items.size == 1 )
124  {
125  return self.items[0];
126  }
127 
128  if ( self.items_shuffle.size == 0 )
129  {
130  self.items_shuffle = ArrayCopy( self.items );
131  array::randomize( self.items_shuffle );
132  }
133 
134  return array::pop_front( self.items_shuffle );
135 }
136 
137 function ‪cycle_item()
138 {
139  self.current_item = self ‪get_item_for_pickup();
140 
141  if ( isdefined( self.current_item.model ) )
142  {
143  self SetModel( self.current_item.model );
144  }
145 }
146 
147 function ‪get_item_from_string_ammo(perks_string)
148 {
149  item_struct = SpawnStruct();
150 
151  item_struct.name = "ammo";
152  item_struct.weapon = GetWeapon( "scavenger_item" );
153  item_struct.model = item_struct.weapon.worldmodel;
154  self.angles = ( 0, 0, 90 );
155 
156  self thread ‪weapons::scavenger_think();
157 
158  return item_struct;
159 }
160 
161 function ‪get_item_from_string_damage(perks_string)
162 {
163  item_struct = SpawnStruct();
164 
165  item_struct.name = "damage";
166  item_struct.damage_scale = float(perks_string);
167  item_struct.model = "wpn_t7_igc_bullet_prop";
168  self.angles = ( -45, 0, 0 );
169  self SetScale ( 2 );
170 
171  return item_struct;
172 }
173 
174 function ‪get_item_from_string_health(perks_string)
175 {
176  item_struct = SpawnStruct();
177 
178  item_struct.name = "health";
179  item_struct.extra_health = int(perks_string);
180  item_struct.model = "p7_medical_surgical_tools_syringe";
181  self.angles = ( -45, 0, 45 );
182  self SetScale ( 5 );
183 
184  return item_struct;
185 }
186 
187 function ‪get_item_from_string_perk(perks_string)
188 {
189  item_struct = SpawnStruct();
190 
191  if ( !IsDefined(level.perkSpecialties[ perks_string ]) )
192  {
193  /#
194  println("Invalid perk name " + perks_string + " for pick up item at " + self.origin);
195  #/
196  return;
197  }
198 
199  item_struct.name = perks_string;
200  item_struct.specialties = StrTok( level.perkSpecialties[ perks_string ], "|" );
201  item_struct.model = "p7_perk_" + level.perkIcons[ perks_string ];
202  self SetScale ( 2 );
203 
204  return item_struct;
205 }
206 
207 function ‪get_item_from_string_weapon(weapon_and_attachments_string)
208 {
209  item_struct = SpawnStruct();
210 
211  weapon_and_attachments = strtok(weapon_and_attachments_string, "+");
212  weapon_name = GetSubStr(weapon_and_attachments[0],0,weapon_and_attachments[0].size);
213 
214  attachments = ‪array::remove_index( weapon_and_attachments, 0 );
215 
216  item_struct.name = weapon_name;
217  item_struct.weapon = GetWeapon( weapon_name, attachments );
218  item_struct.model = item_struct.weapon.worldmodel;
219  self SetScale ( 1.5 );
220 
221  return item_struct;
222 }
223 
224 function ‪get_item_from_string( item_string )
225 {
226  switch( self.script_noteworthy )
227  {
228  case "ammo":
229  return self ‪get_item_from_string_ammo( item_string );
230  case "damage":
231  return self ‪get_item_from_string_damage( item_string );
232  case "health":
233  return self ‪get_item_from_string_health( item_string );
234  case "perk":
235  return self ‪get_item_from_string_perk( item_string );
236  case "weapon":
237  return self ‪get_item_from_string_weapon( item_string );
238  }
239 }
240 
242 {
243  items_string = self.script_parameters;
244 
245  items_array = strtok(items_string, " ");
246 
247  items = [];
248 
249  foreach( item_string in items_array )
250  {
251  items[items.size] = self ‪get_item_from_string( item_string );
252  }
253 
254  return items;
255 }
256 
258 {
259  switch( self.script_noteworthy )
260  {
261  case "ammo":
263  case "damage":
265  case "health":
267  case "perk":
269  case "weapon":
271  }
272 }
273 
275 {
276  switch( self.script_noteworthy )
277  {
278  case "ammo":
280  case "damage":
282  case "health":
284  case "perk":
286  case "weapon":
288  }
289 }
290 
292 {
293  switch( self.script_noteworthy )
294  {
295  case "ammo":
297  case "damage":
299  case "health":
301  case "perk":
303  case "weapon":
305  }
306 }
307 
309 {
310  self.items_shuffle = [];
311 
312  // start the bobbing before calling the init functions so we can change the orientation of
313  // the models on items without affecting the bob
314  self ‪set_pickup_bobbing();
315 
316  self.items = self ‪init_items_for_pickup();
317  self.respawn_time = self ‪pickup_item_respawn_time();
318  self.sound_pickup = self ‪pickup_item_sound_pickup();
319  self.sound_respawn = self ‪pickup_item_sound_respawn();
320 
321  self ‪set_pickup_rotation();
322  self ‪cycle_item();
323 }
324 
325 function ‪on_touch( player )
326 {
327  self endon("respawned");
328 
329  pickup_item = self.visuals[0];
330  switch( pickup_item.script_noteworthy )
331  {
332  case "ammo":
333  pickup_item ‪on_touch_ammo( player );
334  break;
335  case "damage":
336  pickup_item ‪on_touch_damage( player );
337  break;
338  case "health":
339  pickup_item ‪on_touch_health( player );
340  break;
341  case "perk":
342  pickup_item ‪on_touch_perk( player );
343  break;
344  case "weapon":
345  if ( !pickup_item ‪on_touch_weapon( player ) )
346  return;
347  break;
348  }
349 
350  pickup_item PlaySound( pickup_item.sound_pickup );
351 
353  self ‪gameobjects::allow_use( "none" );
354 
355  if ( level.pickupItemRespawn )
356  {
357  wait ( pickup_item.respawn_time );
358  self thread ‪respawn_pickup();
359  }
360 }
361 
363 {
364  self notify("respawned");
365  pickup_item = self.visuals[0];
366  pickup_item PlaySound( pickup_item.sound_respawn );
367 
368  pickup_item ‪cycle_item();
369 
371  self ‪gameobjects::allow_use( "any" );
372 }
373 
375 {
376  foreach( item in level.pickup_items )
377  {
378  item ‪respawn_pickup();
379  }
380 }
381 
382 function ‪on_touch_ammo( player )
383 {
384  self notify( "scavenger", player );
385  player PickupAmmoEvent();
386 }
387 
388 function ‪on_touch_damage( player )
389 {
390  damage_scale_length = 15 * 1000;
391  player.pickup_damage_scale = self.current_item.damage_scale;
392  player.pickup_damage_scale_time = GetTime() + damage_scale_length;
393 }
394 
395 function ‪on_touch_health( player )
396 {
397  if ( self.current_item.extra_health <= 100 )
398  {
399  health = player.health + self.current_item.extra_health;
400 
401  if ( health > 100 )
402  health = 100;
403  }
404  else
405  {
406  health = self.current_item.extra_health;
407  }
408 
409  player.health = health;
410 }
411 
412 function ‪on_touch_perk( player )
413 {
414  foreach( specialty in self.current_item.specialties )
415  {
416  player setPerk( specialty );
417  }
418 }
419 
421 {
422  weapons = self GetWeaponsList( true );
423  foreach ( weapon in weapons )
424  {
425  if ( !weapon.isgadget )
426  continue;
427 
428  if ( !weapon.isheroweapon && weapon.offhandslot !== "Gadget" )
429  continue;
430 
431  slot = self GadgetGetSlot( weapon );
432  if ( self GadgetIsActive( slot ) )
433  return true;
434  }
435 
436  return false;
437 }
438 
440 {
441  weapons = self GetWeaponsList( true );
442  foreach ( weapon in weapons )
443  {
444  if ( weapon.isgadget )
445  {
446  self TakeWeapon(weapon);
447  }
448  }
449 }
450 
451 function ‪take_offhand_weapon( offhandSlot )
452 {
453  weapons = self GetWeaponsList( true );
454  foreach ( weapon in weapons )
455  {
456  if ( weapon.offhandSlot == offhandSlot )
457  {
458  self TakeWeapon(weapon);
459  return;
460  }
461  }
462 }
463 
465 {
466  if ( weapon.isgadget )
467  return false;
468 
469  if ( weapon.isgrenadeweapon )
470  return false;
471 
472  return true;
473 }
474 
475 function ‪on_touch_weapon( player )
476 {
477  weapon = self.current_item.weapon;
478  had_weapon = player HasWeapon( weapon );
479 
480 // ammo_in_clip = GetWeaponAmmoClip( weapon );
481  ammo_in_reserve = player GetWeaponAmmoStock( weapon );
482 
483  if ( weapon.isgadget )
484  {
485  if ( player ‪has_active_gadget() )
486  return false;
487 
488  // need to take away what they currently have
489  player ‪take_player_gadgets();
490  }
491 
492  if ( weapon.inventoryType == "offhand" )
493  {
494  player ‪take_offhand_weapon( weapon.offhandslot );
495  }
496 
497  player PickupWeaponEvent(weapon);
498 
499  player GiveWeapon( weapon );
500 
501  // if for some reason we did not get the weapon drop out
502  if ( !player HasWeapon( weapon ) )
503  return false;
504 
505  if ( isDefined(self.script_ammo_clip) && isDefined(self.script_ammo_extra) )
506  {
507  // if they already have the weapon put everything into the reserve
508  if ( had_weapon )
509  {
510  player SetWeaponAmmoStock( weapon, ammo_in_reserve + self.script_ammo_clip + self.script_ammo_extra );
511  }
512  else
513  {
514  if ( self.script_ammo_clip >= 0 )
515  {
516  player SetWeaponAmmoClip( weapon, self.script_ammo_clip );
517  }
518  if ( self.script_ammo_extra >= 0 )
519  {
520  player SetWeaponAmmoStock( weapon, self.script_ammo_extra );
521  }
522  }
523  }
524 
525  if ( weapon.isgadget )
526  {
527  slot = player GadgetGetSlot( weapon );
528  player GadgetPowerSet( slot, 100.0 );
529  }
530 
531  if ( !had_weapon && ‪should_switch_to_pickup_weapon( weapon ) )
532  {
533  player SwitchToWeapon(weapon);
534  }
535 
536  return true;
537 }
‪create_use_object
‪function create_use_object(ownerTeam, trigger, visuals, offset, objectiveName, allowInitialHoldDelay=false, allowWeaponCyclingDuringHold=false)
Definition: gameobjects_shared.gsc:1491
‪set_pickup_rotation
‪function set_pickup_rotation()
Definition: _pickup_items.gsc:116
‪respawn_pickup
‪function respawn_pickup()
Definition: _pickup_items.gsc:362
‪get_item_from_string_health
‪function get_item_from_string_health(perks_string)
Definition: _pickup_items.gsc:174
‪scavenger_think
‪function scavenger_think()
Definition: _weapons.gsc:1471
‪allow_use
‪function allow_use(relativeTeam)
Definition: gameobjects_shared.gsc:3485
‪start_gametype
‪function start_gametype()
Definition: _pickup_items.gsc:74
‪on_touch
‪function on_touch(player)
Definition: _pickup_items.gsc:325
‪take_offhand_weapon
‪function take_offhand_weapon(offhandSlot)
Definition: _pickup_items.gsc:451
‪set_use_time
‪function set_use_time(time)
Definition: gameobjects_shared.gsc:3455
‪respawn_all_pickups
‪function respawn_all_pickups()
Definition: _pickup_items.gsc:374
‪set_pickup_bobbing
‪function set_pickup_bobbing()
Definition: _pickup_items.gsc:111
‪pickup_item_sound_respawn
‪function pickup_item_sound_respawn()
Definition: _pickup_items.gsc:291
‪on_start_gametype
‪function on_start_gametype(func, obj)
Definition: callbacks_shared.csc:285
‪pickup_item_init
‪function pickup_item_init()
Definition: _pickup_items.gsc:308
‪take_player_gadgets
‪function take_player_gadgets()
Definition: _pickup_items.gsc:439
‪remove_index
‪function remove_index(array, index, b_keep_keys)
Definition: array_shared.csc:86
‪PICKUP_ITEM_SOUND_PICKUP_DAMAGE
‪#define PICKUP_ITEM_SOUND_PICKUP_DAMAGE
Definition: _pickup_items.gsh:8
‪on_touch_weapon
‪function on_touch_weapon(player)
Definition: _pickup_items.gsc:475
‪cycle_item
‪function cycle_item()
Definition: _pickup_items.gsc:137
‪on_touch_damage
‪function on_touch_damage(player)
Definition: _pickup_items.gsc:388
‪PICKUP_ITEM_SOUND_RESPAWN_WEAPON
‪#define PICKUP_ITEM_SOUND_RESPAWN_WEAPON
Definition: _pickup_items.gsh:17
‪get_item_for_pickup
‪function get_item_for_pickup()
Definition: _pickup_items.gsc:121
‪pickup_item_respawn_time
‪function pickup_item_respawn_time()
Definition: _pickup_items.gsc:257
‪on_touch_perk
‪function on_touch_perk(player)
Definition: _pickup_items.gsc:412
‪PICKUP_BOB_DISTANCE
‪#define PICKUP_BOB_DISTANCE
Definition: _pickup_items.gsc:23
‪PICKUP_ITEM_SOUND_RESPAWN_HEALTH
‪#define PICKUP_ITEM_SOUND_RESPAWN_HEALTH
Definition: _pickup_items.gsh:15
‪on_touch_ammo
‪function on_touch_ammo(player)
Definition: _pickup_items.gsc:382
‪get_visual_for_trigger
‪function get_visual_for_trigger(trigger, pickup_models)
Definition: _pickup_items.gsc:100
‪on_player_spawned
‪function on_player_spawned()
Definition: _pickup_items.gsc:68
‪has_active_gadget
‪function has_active_gadget()
Definition: _pickup_items.gsc:420
‪set_model_visibility
‪function set_model_visibility(visibility)
Definition: gameobjects_shared.gsc:3503
‪init_items_for_pickup
‪function init_items_for_pickup()
Definition: _pickup_items.gsc:241
‪PICKUP_ITEM_RESPAWN_TIME_AMMO
‪#define PICKUP_ITEM_RESPAWN_TIME_AMMO
Definition: _pickup_items.gsh:1
‪PICKUP_ITEM_SOUND_PICKUP_WEAPON
‪#define PICKUP_ITEM_SOUND_PICKUP_WEAPON
Definition: _pickup_items.gsh:11
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪get_item_from_string_perk
‪function get_item_from_string_perk(perks_string)
Definition: _pickup_items.gsc:187
‪__init__
‪function __init__()
Definition: _pickup_items.gsc:56
‪Rotate
‪function Rotate(duration)
Definition: _satellite.gsc:187
‪PICKUP_ITEM_RESPAWN_TIME_WEAPON
‪#define PICKUP_ITEM_RESPAWN_TIME_WEAPON
Definition: _pickup_items.gsh:5
‪should_switch_to_pickup_weapon
‪function should_switch_to_pickup_weapon(weapon)
Definition: _pickup_items.gsc:464
‪get_item_from_string_weapon
‪function get_item_from_string_weapon(weapon_and_attachments_string)
Definition: _pickup_items.gsc:207
‪pickup_item_sound_pickup
‪function pickup_item_sound_pickup()
Definition: _pickup_items.gsc:274
‪PICKUP_ITEM_SOUND_RESPAWN_AMMO
‪#define PICKUP_ITEM_SOUND_RESPAWN_AMMO
Definition: _pickup_items.gsh:13
‪get_item_from_string
‪function get_item_from_string(item_string)
Definition: _pickup_items.gsc:224
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪PICKUP_ITEM_SOUND_RESPAWN_PERK
‪#define PICKUP_ITEM_SOUND_RESPAWN_PERK
Definition: _pickup_items.gsh:16
‪PICKUP_ITEM_SOUND_PICKUP_PERK
‪#define PICKUP_ITEM_SOUND_PICKUP_PERK
Definition: _pickup_items.gsh:10
‪PICKUP_ITEM_RESPAWN_TIME_HEALTH
‪#define PICKUP_ITEM_RESPAWN_TIME_HEALTH
Definition: _pickup_items.gsh:3
‪PICKUP_ITEM_SOUND_RESPAWN_DAMAGE
‪#define PICKUP_ITEM_SOUND_RESPAWN_DAMAGE
Definition: _pickup_items.gsh:14
‪get_item_from_string_ammo
‪function get_item_from_string_ammo(perks_string)
Definition: _pickup_items.gsc:147
‪get_item_from_string_damage
‪function get_item_from_string_damage(perks_string)
Definition: _pickup_items.gsc:161
‪PICKUP_ITEM_SOUND_PICKUP_HEALTH
‪#define PICKUP_ITEM_SOUND_PICKUP_HEALTH
Definition: _pickup_items.gsh:9
‪PICKUP_ITEM_SOUND_PICKUP_AMMO
‪#define PICKUP_ITEM_SOUND_PICKUP_AMMO
Definition: _pickup_items.gsh:7
‪on_touch_health
‪function on_touch_health(player)
Definition: _pickup_items.gsc:395
‪PICKUP_ITEM_RESPAWN_TIME_DAMAGE
‪#define PICKUP_ITEM_RESPAWN_TIME_DAMAGE
Definition: _pickup_items.gsh:2
‪PICKUP_ITEM_RESPAWN_TIME_PERK
‪#define PICKUP_ITEM_RESPAWN_TIME_PERK
Definition: _pickup_items.gsh:4
‪PICKUP_ROTATE_RATE
‪#define PICKUP_ROTATE_RATE
Definition: _pickup_items.gsc:22