‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_killstreakrules.gsc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\popups_shared;
4 #using scripts\shared\util_shared;
5 
6 #insert scripts\shared\shared.gsh;
7 #insert scripts\mp\killstreaks\_killstreaks.gsh;
8 
9 #using scripts\mp\_util;
10 #using scripts\mp\killstreaks\_killstreaks;
11 #using scripts\mp\killstreaks\_emp;
12 #using scripts\mp\gametypes\_globallogic_audio;
13 
14 #namespace killstreakrules;
15 
16 function ‪init()
17 {
18  level.killstreakrules = [];
19  level.killstreaktype = [];
20  level.killstreaks_triggered = [];
21  level.matchRecorderKillstreakKills = [];
22 
23  if( !isdefined( level.globalKillstreaksCalled ) )
24  {
25  level.globalKillstreaksCalled = 0;
26  }
27 
28  // Rule name, max count per team count
29  ‪createRule( "ai_tank", 4, 2);
30  ‪createRule( "airsupport", 1, 1);
31  ‪createRule( "combatrobot", 4, 2);
32  ‪createRule( "chopper", 2, 1);
33  ‪createRule( "chopperInTheAir", 2, 1);
34  ‪createRule( "counteruav", 6, 3);
35  ‪createRule( "dart", 4, 2);
36  ‪createRule( "dogs", 1, 1);
37  ‪createRule( "drone_strike", 1, 1);
38  ‪createRule( "emp", 2, 1);
39  ‪createRule( "firesupport", 1, 1);
40  ‪createRule( "missiledrone", 3, 3);
41  ‪createRule( "missileswarm", 1, 1);
42  ‪createRule( "planemortar", 1, 1);
43  ‪createRule( "playercontrolledchopper", 1, 1);
44  ‪createRule( "qrdrone", 3, 2);
45  ‪createRule( "uav", 10, 5);
46  ‪createRule( "raps" , 2, 1);
47  ‪createRule( "rcxd", 4, 2);
48  ‪createRule( "remote_missile", 2, 1);
49  ‪createRule( "remotemortar", 1, 1);
50  ‪createRule( "satellite", 2, 1);
51  ‪createRule( "sentinel", 4, 2);
52  ‪createRule( "straferun", 1, 1);
53  ‪createRule( "supplydrop", 4, 4);
54  ‪createRule( "targetableent", 32, 32);
55  ‪createRule( "turret", 8, 4);
56  ‪createRule( "vehicle", 7, 7);
57  ‪createRule( "weapon", 12, 6);
58 
59  // KILLSTREAK Rule Name adds checks
60  ‪addKillstreakToRule( "ai_tank_drop", "ai_tank", true, true );
61  ‪addKillstreakToRule( "airstrike", "airsupport", true, true );
62  ‪addKillstreakToRule( "airstrike", "vehicle", true, true );
63  ‪addKillstreakToRule( "artillery", "firesupport", true, true );
64  ‪addKillstreakToRule( "auto_tow", "turret", true, true );
65  ‪addKillstreakToRule( "autoturret", "turret", true, true );
66  ‪addKillstreakToRule( "combat_robot", "combatrobot", true, true );
67  ‪addKillstreakToRule( "counteruav", "counteruav", true, true );
68  ‪addKillstreakToRule( "counteruav", "targetableent", true, true );
69  ‪addKillstreakToRule( "dart", "dart", true, true );
70  ‪addKillstreakToRule( "dogs", "dogs", true, true );
71  ‪addKillstreakToRule( "dogs_lvl2", "dogs", true, true );
72  ‪addKillstreakToRule( "dogs_lvl3", "dogs", true, true );
73  ‪addKillstreakToRule( "drone_strike", "drone_strike", true, true );
74  ‪addKillstreakToRule( "emp", "emp", true, true );
75  ‪addKillstreakToRule( "helicopter", "chopper", true, true );
76  ‪addKillstreakToRule( "helicopter", "chopperInTheAir", true, false );
77  ‪addKillstreakToRule( "helicopter", "playercontrolledchopper", false, true );
78  ‪addKillstreakToRule( "helicopter", "targetableent", true, true );
79  ‪addKillstreakToRule( "helicopter", "vehicle", true, true );
80 
81  ‪addKillstreakToRule( "helicopter_comlink", "chopper", true, true );
82  ‪addKillstreakToRule( "helicopter_comlink", "chopperInTheAir", true, false );
83  ‪addKillstreakToRule( "helicopter_comlink", "targetableent", true, true );
84  ‪addKillstreakToRule( "helicopter_comlink", "vehicle", true, true );
85 
86  ‪addKillstreakToRule( "helicopter_guard", "airsupport", true, true );
87 
88  ‪addKillstreakToRule( "helicopter_gunner", "chopperInTheAir", true, false );
89  ‪addKillstreakToRule( "helicopter_gunner", "playercontrolledchopper", true, true );
90  ‪addKillstreakToRule( "helicopter_gunner", "targetableent", true, true );
91  ‪addKillstreakToRule( "helicopter_gunner", "vehicle", true, true );
92 
93  ‪addKillstreakToRule( "helicopter_gunner_assistant", "chopperInTheAir", true, false );
94  ‪addKillstreakToRule( "helicopter_gunner_assistant", "playercontrolledchopper", true, true );
95  ‪addKillstreakToRule( "helicopter_gunner_assistant", "targetableent", true, true );
96  ‪addKillstreakToRule( "helicopter_gunner_assistant", "vehicle", true, true );
97 
98  ‪addKillstreakToRule( "helicopter_player_firstperson", "vehicle", true, true );
99  ‪addKillstreakToRule( "helicopter_player_firstperson", "chopperInTheAir", true, true );
100  ‪addKillstreakToRule( "helicopter_player_firstperson", "playercontrolledchopper", true, true );
101  ‪addKillstreakToRule( "helicopter_player_firstperson", "targetableent", true, true );
102  ‪addKillstreakToRule( "helicopter_player_gunner", "chopperInTheAir", true, true );
103  ‪addKillstreakToRule( "helicopter_player_gunner", "playercontrolledchopper", true, true );
104  ‪addKillstreakToRule( "helicopter_player_gunner", "targetableent", true, true );
105  ‪addKillstreakToRule( "helicopter_player_gunner", "vehicle", true, true );
106  ‪addKillstreakToRule( "helicopter_x2", "chopper", true, true );
107  ‪addKillstreakToRule( "helicopter_x2", "chopperInTheAir", true, false );
108  ‪addKillstreakToRule( "helicopter_x2", "playercontrolledchopper", false, true );
109  ‪addKillstreakToRule( "helicopter_x2", "targetableent", true, true );
110  ‪addKillstreakToRule( "helicopter_x2", "vehicle", true, true );
111  ‪addKillstreakToRule( "m202_flash", "weapon", true, true );
112  ‪addKillstreakToRule( "m220_tow", "weapon", true, true );
113  ‪addKillstreakToRule( "m220_tow_drop", "supplydrop", true, true );
114  ‪addKillstreakToRule( "m220_tow_drop", "vehicle", true, true );
115  ‪addKillstreakToRule( "m220_tow_killstreak", "weapon", true, true );
116  ‪addKillstreakToRule( "m32", "weapon", true, true );
117  ‪addKillstreakToRule( "m32_drop", "weapon", true, true );
118  ‪addKillstreakToRule( "microwave_turret", "turret", true, true );
119  ‪addKillstreakToRule( "minigun", "weapon", true, true );
120  ‪addKillstreakToRule( "minigun_drop", "weapon", true, true );
121  ‪addKillstreakToRule( "missile_drone", "missiledrone", true, true );
122  ‪addKillstreakToRule( "missile_swarm", "missileswarm", true, true );
123  ‪addKillstreakToRule( "mortar", "firesupport", true, true );
124  ‪addKillstreakToRule( "mp40_drop", "weapon", true, true );
125  ‪addKillstreakToRule( "napalm", "airsupport", true, true );
126  ‪addKillstreakToRule( "napalm", "vehicle", true, true );
127  ‪addKillstreakToRule( "planemortar", "planemortar", true, true );
128  ‪addKillstreakToRule( "qrdrone", "qrdrone", true, true );
129  ‪addKillstreakToRule( "qrdrone", "vehicle", true, true );
130  ‪addKillstreakToRule( "uav", "uav", true, true );
131  ‪addKillstreakToRule( "uav", "targetableent", true, true );
132  ‪addKillstreakToRule( "satellite", "satellite", true, true );
133  ‪addKillstreakToRule( "raps", "raps", true, true );
134  ‪addKillstreakToRule( "rcbomb", "rcxd", true, true );
135  ‪addKillstreakToRule( "remote_missile", "targetableent", true, true );
136  ‪addKillstreakToRule( "remote_missile", "remote_missile", true, true );
137  ‪addKillstreakToRule( "remote_mortar", "remotemortar", true, true );
138  ‪addKillstreakToRule( "remote_mortar", "targetableent", true, true );
139  ‪addKillstreakToRule( "sentinel", "sentinel", true, true );
140  ‪addKillstreakToRule( "straferun", "straferun", true, true );
141  ‪addKillstreakToRule( "supply_drop", "supplydrop", true, true );
142  ‪addKillstreakToRule( "supply_drop", "targetableent", true, true );
143  ‪addKillstreakToRule( "supply_drop", "vehicle", true, true );
144  ‪addKillstreakToRule( "supply_station", "supplydrop", true, true );
145  ‪addKillstreakToRule( "supply_station", "targetableent", true, true );
146  ‪addKillstreakToRule( "supply_station", "vehicle", true, true );
147  ‪addKillstreakToRule( "tow_turret_drop", "supplydrop", true, true );
148  ‪addKillstreakToRule( "tow_turret_drop", "vehicle", true, true );
149  ‪addKillstreakToRule( "turret_drop", "supplydrop", true, true );
150  ‪addKillstreakToRule( "turret_drop", "vehicle", true, true );
151 }
152 
153 function ‪createRule( rule, maxAllowable, maxAllowablePerTeam )
154 {
155  level.killstreakrules[rule] = spawnstruct();
156  level.killstreakrules[rule].cur = 0;
157  level.killstreakrules[rule].curTeam = [];
158  level.killstreakrules[rule].max = maxAllowable;
159  level.killstreakrules[rule].maxPerTeam = maxAllowablePerTeam;
160 }
161 
162 function ‪addKillstreakToRule( killstreak, rule, countTowards, checkAgainst, inventoryVariant )
163 {
164  if ( !isdefined (level.killstreaktype[killstreak] ) )
165  level.killstreaktype[killstreak] = [];
166 
167  keys = GetArrayKeys( level.killstreaktype[killstreak] );
168 
169  // you need to add a rule before adding it to a killstreak
170  assert( isdefined(level.killstreakrules[rule] ) );
171 
172  if ( !isdefined( level.killstreaktype[killstreak][rule] ) )
173  level.killstreaktype[killstreak][rule] = spawnstruct();
174 
175  level.killstreaktype[killstreak][rule].counts = countTowards;
176 
177  level.killstreaktype[killstreak][rule].checks = checkAgainst;
178 
179  if( !‪IS_TRUE( inventoryVariant ) )
180  ‪addKillstreakToRule( "inventory_" + killstreak, rule, countTowards, checkAgainst, true );
181 }
182 
183 // returns killstreakid or if killstreak is not allowed
184 function ‪killstreakStart( hardpointType, team, hacked, displayTeamMessage )
185 {
186  /#
187  assert( isdefined( team ), "team needs to be defined" );
188  #/
189 
190  if ( self ‪isKillstreakAllowed( hardpointType, team ) == false )
192 
193  assert ( isdefined ( hardpointType ) );
194 
195  if( !isdefined( hacked ) )
196  hacked = false;
197 
198  if ( !isdefined( displayTeamMessage ) )
199  displayTeamMessage = true;
200 
201  if( GetDvarInt( "teamOpsEnabled" ) == 1 )
202  displayTeamMessage = false;
203 
204  if ( displayTeamMessage == true )
205  {
206  if ( !hacked )
207  self ‪displayKillstreakStartTeamMessageToAll( hardpointType );
208  }
209 
210  keys = GetArrayKeys( level.killstreaktype[hardpointType] );
211 
212  foreach( key in keys )
213  {
214  // Check if killstreak is counted by this rule
215  if ( !level.killstreaktype[hardpointType][key].counts )
216  continue;
217 
218  assert( isdefined(level.killstreakrules[key] ) );
219  level.killstreakrules[key].cur++;
220  if ( level.teambased )
221  {
222  if ( !isdefined( level.killstreakrules[key].curTeam[team] ) )
223  level.killstreakrules[key].curTeam[team] = 0;
224  level.killstreakrules[key].curTeam[team]++;
225  }
226  }
227 
228  level notify( "killstreak_started", hardpointType, team, self );
229 
230  killstreak_id = level.globalKillstreaksCalled;
231  level.globalKillstreaksCalled++;
232 
233  killstreak_data = [];
234  killstreak_data[ "caller" ] = self GetXUID();
235  killstreak_data[ "spawnid" ] = getplayerspawnid( self );
236  killstreak_data[ "starttime" ] = gettime();
237  killstreak_data[ "type" ] = hardpointType;
238  killstreak_data[ "endtime" ] = 0;
239  level.matchRecorderKillstreakKills[ killstreak_id ] = 0;
240 
241  level.killstreaks_triggered[ killstreak_id ] = killstreak_data;
242 
243  return killstreak_id;
244 }
245 
247 {
248  if( GetDvarInt( "teamOpsEnabled" ) == 1 )
249  return;
250 
251  if ( isdefined( level.killstreaks[hardpointType] ) && isdefined( level.killstreaks[hardpointType].inboundtext ) )
252  level thread ‪popups::DisplayKillstreakTeamMessageToAll( hardpointType, self );
253 }
254 
255 function ‪RecordKillstreakEndDirect(eventIndex, recordStreakIndex, totalKills)
256 {
257  player = self;
258 
259  player RecordKillstreakEndEvent( eventIndex, recordStreakIndex, totalKills );
260 
261  player.killstreakEvents[recordStreakIndex] = undefined;
262 }
263 
264 function ‪RecordKillstreakEnd(recordStreakIndex, totalKills)
265 {
266  player = self;
267 
268  if(!IsPlayer(player))
269  return;
270 
271  if(!IsDefined(totalKills))
272  totalkills = 0;
273 
274  if(!isDefined(player.killstreakEvents))
275  {
276  // This may store an eventIndex or number of kills, depending on whether a killstreak event or an end event happens first, respectively
277  player.killstreakEvents = associativeArray();
278  }
279  eventIndex = player.killstreakEvents[recordStreakIndex];
280  // Note that some killstreaks fire their end before their begin, so we need to check if the eventIndex is defined to determine that
281  // Two cases - 1) KillstreakEvent happens first (correctly)
282  if(isDefined(eventIndex))
283  {
284  player ‪RecordKillstreakEndDirect(eventIndex, recordStreakIndex, totalKills);
285  }
286  else
287  {
288  // KillstreakEndEvent happens first
289  player.killstreakEvents[recordStreakIndex] = totalKills;
290  }
291 }
292 
293 function ‪killstreakStop( hardpointType, team, id )
294 {
295  /#
296  assert( isdefined( team ), "team needs to be defined" );
297  #/
298 
299  assert ( isdefined ( hardpointType ) );
300  //assert( isdefined( id ), "Must provide the associated killstreak_id for " + hardpointType );
301 
302  keys = GetArrayKeys( level.killstreaktype[hardpointType] );
303 
304  foreach( key in keys )
305  {
306  // Check if killstreak is counted by this rule
307  if ( !level.killstreaktype[hardpointType][key].counts )
308  continue;
309 
310  assert( isdefined(level.killstreakrules[key] ) );
311  level.killstreakrules[key].cur--;
312 
313  assert (level.killstreakrules[key].cur >= 0 );
314 
315  if ( level.teambased )
316  {
317  assert( isdefined( team ) );
318  assert( isdefined( level.killstreakrules[key].curTeam[team] ) );
319 
320  level.killstreakrules[key].curTeam[team]--;
321  assert (level.killstreakrules[key].curTeam[team] >= 0 );
322  }
323  }
324 
325  if ( !isdefined(id) || (id == ‪INVALID_KILLSTREAK_ID) )
326  {
327  return;
328  }
329  level.killstreaks_triggered[ id ][ "endtime" ] = GetTime();
330 
331  totalKillsWithThisKillstreak = level.matchRecorderKillstreakKills[ id ];
332 
333  level.killstreaks_triggered[ id ] = undefined;
334  level.matchRecorderKillstreakKills[ id ] = undefined;
335 
336  if( isdefined( level.killstreaks[hardpointType].menuname ) )
337  {
338  recordStreakIndex = level.killstreakindices[level.killstreaks[hardpointType].menuname];
339  if ( isdefined( self ) && isdefined( recordStreakIndex ) && ( !isdefined( self.activatingKillstreak ) || !self.activatingKillstreak ) )
340  {
341  entity = self;
342  if(isDefined(entity.owner) )
343  {
344  entity = entity.owner;
345  }
346 
347  entity ‪RecordKillstreakEnd(recordstreakindex, totalkillswiththiskillstreak);
348  }
349  }
350 }
351 
352 function ‪isKillstreakAllowed( hardpointType, team )
353 {
354  /#
355  assert( isdefined( team ), "team needs to be defined" );
356  #/
357 
358  assert ( isdefined ( hardpointType ) );
359 
360  // general failsafe for all scorestreaks
362  return false;
363 
364  isAllowed = true;
365 
366  keys = GetArrayKeys( level.killstreaktype[hardpointType] );
367 
368  foreach( key in keys )
369  {
370  // Check if killstreak is restricted by this rule
371  if ( !level.killstreaktype[hardpointType][key].checks )
372  continue;
373 
374  if ( level.killstreakrules[key].max != 0 )
375  {
376  if (level.killstreakrules[key].cur >= level.killstreakrules[key].max)
377  {
378  isAllowed = false;
379  break;
380  }
381  }
382 
383  if ( level.teambased && level.killstreakrules[key].maxPerTeam != 0 )
384  {
385  if ( !isdefined( level.killstreakrules[key].curTeam[team] ) )
386  level.killstreakrules[key].curTeam[team] = 0;
387 
388  if (level.killstreakrules[key].curTeam[team] >= level.killstreakrules[key].maxPerTeam)
389  {
390  isAllowed = false;
391  break;
392  }
393  }
394  }
395 
396 
397  if ( isdefined( self.lastStand ) && self.lastStand )
398  {
399  isAllowed = false;
400  }
401 
402  isEMPed = false;
403  // should only be needed in case of a hacked client, the client checks the EMP flag prior to switching to the killstreak weapon
404  if ( self IsEMPJammed() )
405  {
406  isAllowed = false;
407  isEMPed = true;
408  if ( self ‪EMP::EnemyEMPActive() )
409  {
410  if ( isdefined( level.empEndTime ) )
411  {
412  secondsLeft = int( ( level.empendtime - getTime() ) / 1000 );
413  if ( secondsLeft > 0 )
414  {
415  self iprintlnbold( &"KILLSTREAK_NOT_AVAILABLE_EMP_ACTIVE", secondsLeft );
416  return false;
417  }
418  }
419  }
420  }
421 
422  if ( isAllowed == false )
423  {
424  if ( isdefined( level.killstreaks[hardpointType] ) && isdefined( level.killstreaks[hardpointType].notAvailableText ) )
425  {
426  self iprintlnbold( level.killstreaks[hardpointType].notAvailableText );
427 
428  if ( !isdefined( self.currentKillstreakDialog ) && level.killstreaks[hardpointType].utilizesAirspace && isEMPed == false )
429  {
430  self ‪globallogic_audio::play_taacom_dialog( "airspaceFull" );
431  }
432  }
433  }
434 
435  return isAllowed;
436 }
‪addKillstreakToRule
‪function addKillstreakToRule(killstreak, rule, countTowards, checkAgainst, inventoryVariant)
Definition: _killstreakrules.gsc:162
‪init
‪function init()
Definition: _killstreakrules.gsc:16
‪EnemyEMPActive
‪function EnemyEMPActive()
Definition: _emp.gsc:365
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪DisplayKillstreakTeamMessageToAll
‪function DisplayKillstreakTeamMessageToAll(killstreak, player)
Definition: popups_shared.gsc:91
‪displayKillstreakStartTeamMessageToAll
‪function displayKillstreakStartTeamMessageToAll(hardpointType)
Definition: _killstreakrules.gsc:246
‪RecordKillstreakEnd
‪function RecordKillstreakEnd(recordStreakIndex, totalKills)
Definition: _killstreakrules.gsc:264
‪isKillstreakAllowed
‪function isKillstreakAllowed(hardpointType, team)
Definition: _killstreakrules.gsc:352
‪is_killstreak_start_blocked
‪function is_killstreak_start_blocked()
Definition: _killstreaks.gsc:3205
‪INVALID_KILLSTREAK_ID
‪#define INVALID_KILLSTREAK_ID
Definition: _killstreaks.gsh:2
‪RecordKillstreakEndDirect
‪function RecordKillstreakEndDirect(eventIndex, recordStreakIndex, totalKills)
Definition: _killstreakrules.gsc:255
‪createRule
‪function createRule(rule, maxAllowable, maxAllowablePerTeam)
Definition: _killstreakrules.gsc:153
‪killstreakStop
‪function killstreakStop(hardpointType, team, id)
Definition: _killstreakrules.gsc:293
‪killstreakStart
‪function killstreakStart(hardpointType, team, hacked, displayTeamMessage)
Definition: _killstreakrules.gsc:184
‪play_taacom_dialog
‪function play_taacom_dialog(dialogKey, killstreakType, killstreakId)
Definition: _globallogic_audio.gsc:274