Advertisement
Adam445

_killstreakrules.gsc

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