‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
init.gsc
Go to the documentation of this file.
1 #using scripts\shared\gameskill_shared;
2 #using scripts\shared\name_shared;
3 #using scripts\shared\util_shared;
4 #using scripts\shared\ai\systems\debug;
5 #using scripts\shared\ai\systems\shared;
6 #using scripts\shared\ai\archetype_utility;
7 #using scripts\shared\ai\systems\weaponList;
8 
9 #insert scripts\shared\shared.gsh;
10 #insert scripts\shared\ai\utility.gsh;
11 
12 
13 #using_animtree("generic");
14 
15 //--------------------------------------------------------------------------------
16 // Weapon Initialization
17 //--------------------------------------------------------------------------------
18 function ‪initWeapon( weapon )
19 {
20  self.weaponInfo[weapon.name] = SpawnStruct();
21 
22  self.weaponInfo[weapon.name].position = "none";
23  self.weaponInfo[weapon.name].hasClip = true;
24 
25  if ( IsDefined( weapon.ClipModel ) )
26  self.weaponInfo[weapon.name].useClip = true;
27  else
28  self.weaponInfo[weapon.name].useClip = false;
29 }
30 
31 //--------------------------------------------------------------------------------
32 // Main
33 //--------------------------------------------------------------------------------
34 function ‪main()
35 {
36  self.a = SpawnStruct();
37  self.a.weaponPos = [];
38 
39  // Init weapons to "none"
40  // This is done here for now, but might be better to
41  // just have the converter set the empty weapon slots to "none" instead of ""
42  if ( self.weapon == level.weaponNone )
43  self ‪AiUtility::setCurrentWeapon( level.weaponNone );
44 
45  // primary weapon
46  self ‪AiUtility::setPrimaryWeapon(self.weapon);
47 
48  // secondary weapon
49  if ( self.secondaryweapon == level.weaponNone )
50  self ‪AiUtility::setSecondaryWeapon( level.weaponNone );
51 
52  self ‪AiUtility::setSecondaryWeapon( self.secondaryweapon );
53  self ‪AiUtility::setCurrentWeapon(self.primaryweapon);
54 
55  self.initial_primaryweapon = self.primaryweapon;
56  self.initial_secondaryweapon = self.secondaryweapon;
57 
58  self ‪initWeapon( self.primaryweapon );
59  self ‪initWeapon( self.secondaryweapon );
60  self ‪initWeapon( self.sidearm );
61 
62  self.weapon_positions = ‪array( "left", "right", "chest", "back" );
63 
64  for (i = 0; i < self.weapon_positions.size; i++)
65  {
66  self.a.weaponPos[self.weapon_positions[i]] = level.weaponNone;
67  }
68 
69  self.lastWeapon = self.weapon;
70 
71  self thread ‪beginGrenadeTracking();
72  self thread ‪globalGrenadeTracking();
73 
74  ‪firstInit();
75 
76  // AI_TODO - Proper ammo tracking for rocketlauncher AI's
77  self.a.rockets = 3;
78  self.a.rocketVisible = true;
79 
80  // Set initial states for poses
81  self.a.pose = "stand";
82  self.a.prevPose = self.a.pose;
83  self.a.movement = "stop";
84  self.a.special = "none";
85  self.a.gunHand = "none"; // Initialize so that PutGunInHand works properly.
86 
87  ‪shared::placeWeaponOn( self.primaryweapon, "right" );
88  if ( isdefined( self.secondaryweaponclass ) && self.secondaryweaponclass != "none" && self.secondaryweaponclass != "pistol" )
89  ‪shared::placeWeaponOn( self.secondaryweapon, "back");
90 
91  self.a.combatEndTime = GetTime();
92  self.a.nextGrenadeTryTime = 0;
93 
94  // set up all the aiming stuff
95  self.a.isAiming = false;
96  self.rightAimLimit = 45;
97  self.leftAimLimit = -45;
98  self.upAimLimit = 45;
99  self.downAimLimit = -45;
100 
101  // setup the speed variables
102  self.walk = false;
103  self.sprint = false;
104 
105  self.a.postScriptFunc = undefined;
106 
107  // use the GDT settings to start with
108  self.baseAccuracy = self.accuracy;
109 
110  // set default accuracy mod
111  if( !isdefined(self.script_accuracy) )
112  self.script_accuracy = 1;
113 
114  // scale baseAccuracy based on number of coop players
115  if( self.team == "axis" || self.team == "team3" )
116  self thread ‪gameskill::axisAccuracyControl();
117  else if (self.team == "allies")
119 
120  self.a.missTime = 0;
121  self.bulletsInClip = self.weapon.clipSize;
122 
123  // state tracking
124  self.lastEnemySightTime = 0; // last time we saw our current enemy
125  self.combatTime = 0; // how long we've been in/out of combat
126 
127  self.suppressed = false; // if we're currently suppressed
128  self.suppressedTime = 0; // how long we've been in/out of suppression
129 
130  if ( self.team == "allies" )
131  self.suppressionThreshold = 0.75;
132  else
133  self.suppressionThreshold = 0.5;
134 
135  // Random range makes the grenades less accurate and do less damage, but also makes it difficult to throw back.
136  if ( self.team == "allies" )
137  self.randomGrenadeRange = 0;
138  else
139  self.randomGrenadeRange = 128;
140 
141  self.reacquire_state = 0;
142 }
143 
145 {
146  self endon ( "death" );
147 
148  self ‪name::get();
149 }
150 
151 function ‪DoNothing()
152 {
153 }
154 
156 {
157  self.animplaybackrate = 0.9 + RandomFloat( 0.2 );
158  self.moveplaybackrate = 1;
159 }
160 
162 {
163  self endon ("death");
164 
165  for (;;)
166  {
167  self.oldOrigin = self.origin;
168  wait (0.2);
169  }
170 }
171 
172 /#
173 function ‪checkApproachAngles( transTypes )
174 {
175  idealTransAngles[1] = 45;
176  idealTransAngles[2] = 0;
177  idealTransAngles[3] = -45;
178  idealTransAngles[4] = 90;
179  idealTransAngles[6] = -90;
180  idealTransAngles[7] = 135;
181  idealTransAngles[8] = 180;
182  idealTransAngles[9] = -135;
183 
184  wait .05;
185 
186  for ( i = 1; i <= 9; i++ )
187  {
188  for ( j = 0; j < transTypes.size; j++ )
189  {
190  trans = transTypes[j];
191 
192  idealAdd = 0;
193  if ( trans == "left" || trans == "left_crouch" )
194  {
195  idealAdd = 90;
196  }
197  else if ( trans == "right" || trans == "right_crouch" )
198  {
199  idealAdd = -90;
200  }
201 
202  if ( isdefined( anim.coverTransAngles[ trans ][i] ) )
203  {
204  correctAngle = AngleClamp180( idealTransAngles[i] + idealAdd );
205  actualAngle = AngleClamp180( anim.coverTransAngles[ trans ][i] );
206  if ( AbsAngleClamp180( actualAngle - correctAngle ) > 7 )
207  {
208  println( "^1Cover approach animation has bad yaw delta: anim.coverTrans[\"" + trans + "\"][" + i + "]; is ^2" + actualAngle + "^1, should be closer to ^2" + correctAngle + "^1." );
209  }
210  }
211  }
212  }
213 
214  for ( i = 1; i <= 9; i++ )
215  {
216  for ( j = 0; j < transTypes.size; j++ )
217  {
218  trans = transTypes[j];
219 
220  idealAdd = 0;
221  if ( trans == "left" || trans == "left_crouch" )
222  {
223  idealAdd = 90;
224  }
225  else if ( trans == "right" || trans == "right_crouch" )
226  {
227  idealAdd = -90;
228  }
229 
230  if ( isdefined( anim.coverExitAngles[ trans ][i] ) )
231  {
232  correctAngle = AngleClamp180( -1 * (idealTransAngles[i] + idealAdd + 180) );
233  actualAngle = AngleClamp180( anim.coverExitAngles[ trans ][i] );
234  if ( AbsAngleClamp180( actualAngle - correctAngle ) > 7 )
235  {
236  println( "^1Cover exit animation has bad yaw delta: anim.coverTrans[\"" + trans + "\"][" + i + "]; is ^2" + actualAngle + "^1, should be closer to ^2" + correctAngle + "^1." );
237  }
238  }
239  }
240  }
241 }
242 #/
243 
244 function ‪getExitSplitTime( approachType, dir )
245 {
246  return anim.coverExitSplit[ approachType ][ dir ];
247 }
248 
249 function ‪getTransSplitTime( approachType, dir )
250 {
251  return anim.coverTransSplit[ approachType ][ dir ];
252 }
253 
254 function ‪firstInit()
255 {
256  // Initialization that should happen once per level
257  if ( IsDefined(anim.NotFirstTime) ) // Use this to trigger the first init
258  {
259  return;
260  }
261 
262  anim.NotFirstTime = true;
263 
264  anim.grenadeTimers["player_frag_grenade_sp"] = randomIntRange( 1000, 20000 );
265  anim.grenadeTimers["player_flash_grenade_sp"] = randomIntRange( 1000, 20000 );
266  anim.grenadeTimers["player_double_grenade"] = randomIntRange( 10000, 60000 );
267  anim.grenadeTimers["AI_frag_grenade_sp"] = randomIntRange( 0, 20000 );
268  anim.grenadeTimers["AI_flash_grenade_sp"] = randomIntRange( 0, 20000 );
269 
270  anim.numGrenadesInProgressTowardsPlayer = 0;
271  anim.lastGrenadeLandedNearPlayerTime = -1000000;
272  anim.lastFragGrenadeToPlayerStart = -1000000;
274 
275  if ( !isdefined( level.flag ) )
276  {
277  level.flag = [];
278  }
279 
280  level.painAI = undefined;
281  anim.coverCrouchLeanPitch = -55;
282 }
283 
284 
286 {
287  player = self;
288 
289  ‪firstInit();
290 
291  player.invul = false;
292 }
293 
295 {
296  waittillframeend;
297  // might not be defined if load::main() wasn't called
298  if ( isdefined( anim.playerGrenadeRangeTime ) )
299  {
300  maxTime = int( anim.playerGrenadeRangeTime * 0.7 );
301  if ( maxTime < 1 )
302  {
303  maxTime = 1;
304  }
305 
306  anim.grenadeTimers["player_frag_grenade_sp"] = randomIntRange( 0, maxTime );
307  anim.grenadeTimers["player_flash_grenade_sp"] = randomIntRange( 0, maxTime );
308  }
309 
310  if ( isdefined( anim.playerDoubleGrenadeTime ) )
311  {
312  maxTime = int( anim.playerDoubleGrenadeTime );
313  minTime = int( maxTime / 2 );
314  if ( maxTime <= minTime )
315  {
316  maxTime = minTime + 1;
317  }
318 
319  anim.grenadeTimers["player_double_grenade"] = randomIntRange( minTime, maxTime );
320  }
321 }
322 
323 function ‪AddToMissiles(grenade)
324 {
325  ‪DEFAULT(level.missileEntities,[]);
326  ‪ARRAY_ADD(level.missileEntities,grenade);
327 
328  while ( IsDefined(grenade) )
329  {
331  }
332 
333  ArrayRemoveValue(level.missileEntities,grenade);
334 }
335 
336 
338 {
339  ‪DEFAULT(level.missileEntities,[]);
340 
341  self endon ( "death" );
342  self thread ‪globalGrenadeLauncherTracking();
343  self thread ‪globalMissileTracking();
344 
345  for ( ;; )
346  {
347  self waittill ( "grenade_fire", grenade, weapon );
348  grenade.owner=self;
349  grenade.weapon = weapon;
350  level thread ‪AddToMissiles(grenade);
351  }
352 }
353 
355 {
356  self endon ( "death" );
357 
358  for ( ;; )
359  {
360  self waittill ( "grenade_launcher_fire", grenade, weapon );
361  grenade.owner=self;
362  grenade.weapon = weapon;
363  level thread ‪AddToMissiles(grenade);
364  }
365 }
366 
368 {
369  self endon ( "death" );
370 
371  for ( ;; )
372  {
373  self waittill ( "missile_fire", grenade, weapon );
374  grenade.owner=self;
375  grenade.weapon = weapon;
376  level thread ‪AddToMissiles(grenade);
377  }
378 }
379 
381 {
382  self endon ( "death" );
383 
384  for ( ;; )
385  {
386  self waittill ( "grenade_fire", grenade, weapon );
387  grenade thread ‪grenade_earthQuake();
388  }
389 }
390 
391 function ‪endOnDeath()
392 {
393  self waittill( "death" );
394  waittillframeend;
395  self notify ( "end_explode" );
396 }
397 
398 function ‪grenade_earthQuake() //self == grenade
399 {
400  self thread ‪endOnDeath();
401  self endon( "end_explode" );
402  self waittill( "explode", position );
403  PlayRumbleOnPosition( "grenade_rumble", position );
404  ‪earthquake( 0.3, 0.5, position, 400 );
405 }
406 
407 
408 //--------------------------------------------------------------------------------
409 // end script
410 //--------------------------------------------------------------------------------
411 
412 function ‪end_script()
413 {
414 }
‪setCurrentWeapon
‪function setCurrentWeapon(weapon)
Definition: archetype_utility.gsc:2152
‪initWeapon
‪function initWeapon(weapon)
Definition: init.gsc:18
‪set_anim_playback_rate
‪function set_anim_playback_rate()
Definition: init.gsc:155
‪endOnDeath
‪function endOnDeath()
Definition: init.gsc:391
‪beginGrenadeTracking
‪function beginGrenadeTracking()
Definition: init.gsc:380
‪globalGrenadeLauncherTracking
‪function globalGrenadeLauncherTracking()
Definition: init.gsc:354
‪setPrimaryWeapon
‪function setPrimaryWeapon(weapon)
Definition: archetype_utility.gsc:2163
‪setSecondaryWeapon
‪function setSecondaryWeapon(weapon)
Definition: archetype_utility.gsc:2172
‪get
‪function get(kvp_value, kvp_key="targetname")
Definition: struct.csc:13
‪grenade_earthQuake
‪function grenade_earthQuake()
Definition: init.gsc:398
‪globalGrenadeTracking
‪function globalGrenadeTracking()
Definition: init.gsc:337
‪DEFAULT
‪#define DEFAULT(__var, __default)
Definition: shared.gsh:270
‪getExitSplitTime
‪function getExitSplitTime(approachType, dir)
Definition: init.gsc:244
‪trackVelocity
‪function trackVelocity()
Definition: init.gsc:161
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪alliesAccuracyControl
‪function alliesAccuracyControl()
Definition: gameskill_shared.gsc:333
‪array
‪function filter array
Definition: array_shared.csc:16
‪earthquake
‪function earthquake()
Definition: exploder_shared.gsc:850
‪firstInit
‪function firstInit()
Definition: init.gsc:254
‪globalMissileTracking
‪function globalMissileTracking()
Definition: init.gsc:367
‪main
‪function main()
Definition: init.gsc:34
‪checkApproachAngles
‪function checkApproachAngles(transTypes)
Definition: init.gsc:173
‪DoNothing
‪function DoNothing()
Definition: init.gsc:151
‪onPlayerConnect
‪function onPlayerConnect()
Definition: init.gsc:285
‪AddToMissiles
‪function AddToMissiles(grenade)
Definition: init.gsc:323
‪axisAccuracyControl
‪function axisAccuracyControl()
Definition: gameskill_shared.gsc:320
‪setNameAndRank
‪function setNameAndRank()
Definition: init.gsc:144
‪setNextPlayerGrenadeTime
‪function setNextPlayerGrenadeTime()
Definition: init.gsc:294
‪placeWeaponOn
‪function placeWeaponOn(weapon, position)
Definition: shared.gsc:58
‪getTransSplitTime
‪function getTransSplitTime(approachType, dir)
Definition: init.gsc:249
‪end_script
‪function end_script()
Definition: init.gsc:412
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265