‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
player_shared.gsc
Go to the documentation of this file.
1 #using scripts\shared\clientfield_shared;
2 #using scripts\shared\flag_shared;
3 #using scripts\shared\util_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\callbacks_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\flagsys_shared;
8 
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\version.gsh;
11 #insert scripts\shared\ai\zombie.gsh;
12 
13 #namespace player;
14 
15 #define PLAYER_RADIUS 15
16 #define PLAYER_HALF_HEIGHT 16
17 #define PLAYER_POS_SEARCH_RADIUS 100
18 #define LARGE_SEARCH_RADIUS 2048
19 
20 ‪REGISTER_SYSTEM( "player", &‪__init__, undefined )
21 
22 function ‪__init__()
23 {
25 
26  ‪clientfield::register( "world", "gameplay_started", ‪VERSION_TU4, 1, "int" );
27 }
28 
30 {
31  // No need of this callback in frontend
32  mapname = GetDvarString( "mapname" );
33 
34  if( mapname === "core_frontend" )
35  {
36  return;
37  }
38 
39  if( SessionModeIsZombiesGame() || SessionModeIsCampaignGame() )
40  {
41  snappedOrigin = self ‪get_snapped_spot_origin( self.origin );
42 
43  if( !(self ‪flagsys::get( "shared_igc" )) )
44  {
45  self SetOrigin( snappedOrigin );
46  }
47  }
48 
49  isMultiplayer = !SessionModeIsZombiesGame() && !SessionModeIsCampaignGame();
50 
51  if ( !isMultiplayer || ‪IS_TRUE( level._enableLastValidPosition ) )
52  {
53  self thread ‪last_valid_position();
54  }
55 }
56 
57 // cached navmesh position for player
59 {
60  self endon( "disconnect" );
61 
62  self notify( "stop_last_valid_position" );
63  self endon( "stop_last_valid_position" );
64 
65  // try to at least get a valid position
66  while ( !isdefined( self.‪last_valid_position ) )
67  {
68  self.last_valid_position = GetClosestPointOnNavMesh( self.origin, ‪LARGE_SEARCH_RADIUS, 0 );
69  wait 0.1;
70  }
71 
72  while ( 1 )
73  {
74  // if haven't moved very far, don't bother
75  if ( Distance2DSquared( self.origin, self.‪last_valid_position ) < ‪SQR( ‪PLAYER_RADIUS ) &&
76  ‪SQR( self.origin[2] - self.‪last_valid_position[2] ) < ‪SQR( ‪PLAYER_HALF_HEIGHT ) )
77  {
78  wait 0.1;
79  continue;
80  }
81 
82  // position is already good
83  if ( IsDefined( level.last_valid_position_override ) && self [[ level.last_valid_position_override ]]() )
84  {
85  wait 0.1;
86  continue;
87  }
88  else if ( IsPointOnNavMesh( self.origin, self ) )
89  {
90  self.last_valid_position = self.origin;
91  }
92  else if( !IsPointOnNavmesh( self.origin, self )
93  && IsPointOnNavMesh( self.‪last_valid_position, self )
94  && ( Distance2DSquared( self.origin, self.‪last_valid_position ) < ‪SQR( ‪ZM_MELEE_DIST / 2 ) )
95  )
96  {
97  // dont update the self.last_valid_position
98  wait 0.1;
99  continue;
100  }
101  else
102  {
103  position = GetClosestPointOnNavMesh( self.origin, ‪PLAYER_POS_SEARCH_RADIUS, ‪PLAYER_RADIUS );
104  if ( isdefined( position ) )
105  {
106  self.last_valid_position = position;
107  }
108  }
109 
110  wait( 0.1 );
111  }
112 }
113 
114 function ‪take_weapons()
115 {
116  if ( !‪IS_TRUE( self.gun_removed ) )
117  {
118  self.gun_removed = true;
119 
120  self._weapons = [];
121 
122  // Update current weapon only if a valid weapon is returned from code.
123  // If the player is in the proccess of switching weapons, it will be "none"
124  // and we don't want to save that as the player's weapon.
125 
126  ‪DEFAULT( self._current_weapon, level.weaponNone );
127 
128  w_current = self GetCurrentWeapon();
129  if ( w_current != level.weaponNone )
130  {
131  self._current_weapon = w_current;
132  }
133 
134  a_weapon_list = self GetWeaponsList();
135 
136  // If we still don't have a valid weapon saved off for current weapon, use the first weapon
137  // in the player's weapon list
138 
139  if ( self._current_weapon == level.weaponNone )
140  {
141  if ( isdefined( a_weapon_list[ 0 ] ) )
142  {
143  self._current_weapon = a_weapon_list[ 0 ];
144  }
145  }
146 
147  foreach ( weapon in a_weapon_list )
148  {
149  if(‪IS_TRUE(weapon.dniweapon)) //DT#93790
150  continue;
151 
152 
153  ‪ARRAY_ADD( self._weapons, ‪get_weapondata( weapon ) );
154 
155  self TakeWeapon( weapon );
156  }
157  }
158 }
159 
161 {
162  self._generated_weapons = [];
163 
164  ‪DEFAULT( self._generated_current_weapon, level.weaponNone );
165 
166  if( ‪IS_TRUE( self.gun_removed ) && IsDefined( self._weapons ) )
167  {
168  self._generated_weapons = ArrayCopy( self._weapons );
169  self._generated_current_weapon = self._current_weapon;
170  }
171  else
172  {
173  w_current = self GetCurrentWeapon();
174  if ( w_current != level.weaponNone )
175  {
176  self._generated_current_weapon = w_current;
177  }
178 
179  a_weapon_list = self GetWeaponsList();
180 
181  // If we still don't have a valid weapon saved off for current weapon, use the first weapon
182  // in the player's weapon list
183 
184  if ( self._generated_current_weapon == level.weaponNone )
185  {
186  if ( isdefined( a_weapon_list[ 0 ] ) )
187  {
188  self._generated_current_weapon = a_weapon_list[ 0 ];
189  }
190  }
191 
192  foreach ( weapon in a_weapon_list )
193  {
194  if(‪IS_TRUE(weapon.dniweapon)) //DT#93790
195  continue;
196 
197 
198  ‪ARRAY_ADD( self._generated_weapons, ‪get_weapondata( weapon ) );
199  }
200  }
201 }
202 
203 function ‪give_back_weapons( b_immediate = false )
204 {
205  if ( isdefined( self._weapons ) )
206  {
207  foreach ( weapondata in self._weapons )
208  {
209  ‪weapondata_give( weapondata );
210  }
211 
212  if ( isdefined( self._current_weapon ) && ( self._current_weapon != level.weaponNone ) )
213  {
214  if ( b_immediate )
215  {
216  self SwitchToWeaponImmediate( self._current_weapon );
217  }
218  else
219  {
220  self SwitchToWeapon( self._current_weapon );
221  }
222  }
223  else if ( isdefined( self.primaryloadoutweapon ) && self HasWeapon( self.primaryloadoutweapon ) ) //If current weapon is not set, let's try to switch to primary
224  {
225  ‪switch_to_primary_weapon( b_immediate );
226  }
227  }
228 
229  self._weapons = undefined;
230  self.gun_removed = undefined;
231 }
232 
233 function ‪get_weapondata( weapon )
234 {
235  weapondata = [];
236 
237  if ( !isdefined( weapon ) )
238  {
239  weapon = self GetCurrentWeapon();
240  }
241 
242  weapondata[ "weapon" ] = weapon.name;
243 
244  if ( weapon != level.weaponNone )
245  {
246  weapondata[ "clip" ] = self GetWeaponAmmoClip( weapon );
247  weapondata[ "stock" ] = self GetWeaponAmmoStock( weapon );
248  weapondata[ "fuel" ] = self GetWeaponAmmoFuel( weapon );
249  weapondata[ "heat" ] = self IsWeaponOverheating( 1, weapon );
250  weapondata[ "overheat" ] = self IsWeaponOverheating( 0, weapon );
251  weapondata[ "renderOptions" ] = self GetWeaponOptions( weapon );
252  weapondata[ "acvi" ] = self GetPlayerAttachmentCosmeticVariantIndexes( weapon );
253 
254  if ( weapon.isRiotShield )
255  {
256  weapondata[ "health" ] = self.weaponHealth;
257  }
258  }
259  else
260  {
261  weapondata[ "clip" ] = 0;
262  weapondata[ "stock" ] = 0;
263  weapondata[ "fuel" ] = 0;
264  weapondata[ "heat" ] = 0;
265  weapondata[ "overheat" ] = 0;
266  }
267 
268  if ( weapon.dualWieldWeapon != level.weaponNone )
269  {
270  weapondata[ "lh_clip" ] = self GetWeaponAmmoClip( weapon.dualWieldWeapon );
271  }
272  else
273  {
274  weapondata[ "lh_clip" ] = 0;
275  }
276 
277  if ( weapon.altWeapon != level.weaponNone )
278  {
279  weapondata[ "alt_clip" ] = self GetWeaponAmmoClip( weapon.altWeapon );
280  weapondata[ "alt_stock" ] = self GetWeaponAmmoStock( weapon.altWeapon );
281  }
282  else
283  {
284  weapondata[ "alt_clip" ] = 0;
285  weapondata[ "alt_stock" ] = 0;
286  }
287 
288  return weapondata;
289 }
290 
291 function ‪weapondata_give( weapondata )
292 {
293  weapon = ‪util::get_weapon_by_name( weapondata[ "weapon" ] );
294 
295  self GiveWeapon( weapon, weapondata[ "renderOptions" ], weapondata[ "acvi" ] );
296 
297  if ( weapon != level.weaponNone )
298  {
299  self SetWeaponAmmoClip( weapon, weapondata[ "clip" ] );
300  self SetWeaponAmmoStock( weapon, weapondata[ "stock" ] );
301 
302  if ( IsDefined( weapondata[ "fuel" ] ) )
303  {
304  self SetWeaponAmmoFuel( weapon, weapondata[ "fuel" ] );
305  }
306 
307  if ( IsDefined( weapondata[ "heat" ] ) && IsDefined( weapondata[ "overheat" ] ) )
308  {
309  self SetWeaponOverheating( weapondata[ "overheat" ], weapondata[ "heat" ], weapon );
310  }
311 
312  if ( weapon.isRiotShield && IsDefined( weapondata[ "health" ] ) )
313  {
314  self.weaponHealth = weapondata[ "health" ];
315  }
316  }
317 
318  if ( weapon.dualWieldWeapon != level.weaponNone )
319  {
320  self SetWeaponAmmoClip( weapon.dualWieldWeapon, weapondata[ "lh_clip" ] );
321  }
322 
323  if ( weapon.altWeapon != level.weaponNone )
324  {
325  self SetWeaponAmmoClip( weapon.altWeapon, weapondata[ "alt_clip" ] );
326  self SetWeaponAmmoStock( weapon.altWeapon, weapondata[ "alt_stock" ] );
327  }
328 }
329 
330 function ‪switch_to_primary_weapon( b_immediate = false )
331 {
332  if ( ‪is_valid_weapon( self.primaryloadoutweapon ) )
333  {
334  if ( b_immediate )
335  {
336  self SwitchToWeaponImmediate( self.primaryloadoutweapon );
337  }
338  else
339  {
340  self SwitchToWeapon( self.primaryloadoutweapon );
341  }
342  }
343 }
344 
345 function ‪fill_current_clip() //self = player
346 {
347  w_current = self GetCurrentWeapon();
348  if ( w_current.isheroweapon ) //We don't want to give the player more hero ammo
349  {
350  w_current = self.primaryloadoutweapon; //Let's give them primary weapon ammo instead
351  }
352 
353  if ( isdefined( w_current ) && self HasWeapon( w_current ) ) // with "copycat" ability, the player might not have their primary loadout weapon
354  {
355  self SetWeaponAmmoClip( w_current, w_current.clipsize );
356  }
357 }
358 
359 function ‪is_valid_weapon( weaponObject )
360 {
361  return ( isdefined( weaponObject ) && ( weaponObject != level.weaponNone ) );
362 }
363 
365 {
366  return ( GetTime() - ‪VAL( self.spawntime, 0 ) <= level.spawnProtectionTimeMS );
367 }
368 
377 {
378  self [[ level.onSpawnPlayer ]]( false );
379 }
380 
381 function ‪get_snapped_spot_origin( spot_position )
382 {
383  snap_max_height = 100;
384  size = 15;
385  height = size * 2;
386  mins = (-1 * size, -1 * size, 0 );
387  maxs = ( size, size, height );
388 
389  spot_position = (spot_position[0], spot_position[1], spot_position[2] + 5);
390  new_spot_position = ( spot_position[0], spot_position[1], spot_position[2] - snap_max_height);
391 
392  ‪trace = physicstrace( spot_position, new_spot_position, mins, maxs, self);
393 
394  if ( ‪trace["fraction"] < 1 )
395  {
396  return ‪trace["position"];
397  }
398 
399  return spot_position;
400 }
401 
402 function ‪allow_stance_change( b_allow = true )
403 {
404  if ( b_allow )
405  {
406  self AllowProne( true );
407  self AllowCrouch( true );
408  self AllowStand( true );
409  }
410  else
411  {
412  str_stance = self GetStance();
413 
414  switch ( str_stance )
415  {
416  case "prone":
417 
418  self AllowProne( true );
419  self AllowCrouch( false );
420  self AllowStand( false );
421 
422  break;
423 
424  case "crouch":
425 
426  self AllowProne( false );
427  self AllowCrouch( true );
428  self AllowStand( false );
429 
430  break;
431 
432  case "stand":
433 
434  self AllowProne( false );
435  self AllowCrouch( false );
436  self AllowStand( true );
437 
438  break;
439  }
440  }
441 }
‪LARGE_SEARCH_RADIUS
‪#define LARGE_SEARCH_RADIUS
Definition: player_shared.gsc:18
‪switch_to_primary_weapon
‪function switch_to_primary_weapon(b_immediate=false)
Definition: player_shared.gsc:330
‪get_weapondata
‪function get_weapondata(weapon)
Definition: player_shared.gsc:233
‪take_weapons
‪function take_weapons()
Definition: player_shared.gsc:114
‪VAL
‪#define VAL(__var, __default)
Definition: shared.gsh:272
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪get_weapon_by_name
‪function get_weapon_by_name(weapon_name)
Definition: util_shared.gsc:3409
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪SQR
‪#define SQR(__var)
Definition: shared.gsh:293
‪allow_stance_change
‪function allow_stance_change(b_allow=true)
Definition: player_shared.gsc:402
‪get_snapped_spot_origin
‪function get_snapped_spot_origin(spot_position)
Definition: player_shared.gsc:381
‪on_player_spawned
‪function on_player_spawned()
Definition: player_shared.gsc:29
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪VERSION_TU4
‪#define VERSION_TU4
Definition: version.gsh:45
‪on_spawned
‪function on_spawned(func, obj)
Definition: callbacks_shared.csc:245
‪give_back_weapons
‪function give_back_weapons(b_immediate=false)
Definition: player_shared.gsc:203
‪PLAYER_POS_SEARCH_RADIUS
‪#define PLAYER_POS_SEARCH_RADIUS
Definition: player_shared.gsc:17
‪is_valid_weapon
‪function is_valid_weapon(weaponObject)
Definition: player_shared.gsc:359
‪PLAYER_RADIUS
‪#define PLAYER_RADIUS
Definition: player_shared.gsc:15
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪is_spawn_protected
‪function is_spawn_protected()
Definition: player_shared.gsc:364
‪simple_respawn
‪function simple_respawn()
Definition: player_shared.gsc:376
‪weapondata_give
‪function weapondata_give(weapondata)
Definition: player_shared.gsc:291
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪generate_weapon_data
‪function generate_weapon_data()
Definition: player_shared.gsc:160
‪__init__
‪function __init__()
Definition: player_shared.gsc:22
‪PLAYER_HALF_HEIGHT
‪#define PLAYER_HALF_HEIGHT
Definition: player_shared.gsc:16
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪fill_current_clip
‪function fill_current_clip()
Definition: player_shared.gsc:345
‪ZM_MELEE_DIST
‪#define ZM_MELEE_DIST
Definition: skeleton.gsh:3
‪last_valid_position
‪function last_valid_position()
Definition: player_shared.gsc:58