1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\killstreaks_shared;
5 #using scripts\shared\popups_shared;
6 #using scripts\shared\util_shared;
7 #using scripts\shared\weapons\_weapons;
9 #insert scripts\shared\shared.gsh;
11 #using scripts\mp\gametypes\_globallogic_utils;
12 #using scripts\mp\gametypes\_loadout;
15 #using scripts\mp\_util;
16 #using scripts\mp\killstreaks\_killstreakrules;
17 #using scripts\mp\killstreaks\_killstreaks;
18 #using scripts\mp\killstreaks\_supplydrop;
20 #precache( "material", "hud_ks_minigun" );
21 #precache( "material", "hud_ks_m32" );
22 #precache( "string", "KILLSTREAK_EARNED_MINIGUN" );
23 #precache( "string", "KILLSTREAK_MINIGUN_NOT_AVAILABLE" );
24 #precache( "string", "KILLSTREAK_MINIGUN_INBOUND" );
25 #precache( "eventstring", "mpl_killstreak_minigun" );
26 #precache( "eventstring", "mpl_killstreak_m32" );
28 #namespace killstreak_weapons;
33 killstreaks::register_strings(
"minigun", &
"KILLSTREAK_EARNED_MINIGUN", &
"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &
"KILLSTREAK_MINIGUN_INBOUND", undefined, &
"KILLSTREAK_MINIGUN_HACKED" );
37 killstreaks::register_strings(
"m32", &
"KILLSTREAK_EARNED_M32", &
"KILLSTREAK_M32_NOT_AVAILABLE", &
"KILLSTREAK_M32_INBOUND", undefined, &
"KILLSTREAK_M32_HACKED" );
41 level.killStreakIcons[
"killstreak_minigun"] =
"hud_ks_minigun";
42 level.killStreakIcons[
"killstreak_m32"] =
"hud_ks_m32";
43 level.killStreakIcons[
"killstreak_m202_flash"] =
"hud_ks_m202";
44 level.killStreakIcons[
"killstreak_m220_tow_drop"] =
"hud_ks_tv_guided_marker";
45 level.killStreakIcons[
"killstreak_m220_tow"] =
"hud_ks_tv_guided_missile";
50 SetDvar(
"scr_HeldKillstreak_Penalty", 0 );
55 self endon(
"disconnect" );
57 self.firedKillstreakWeapon =
false;
58 self.usingKillstreakHeldWeapon = undefined;
71 self endon(
"disconnect" );
72 self endon(
"death" );
76 currentWeapon =
self GetCurrentWeapon();
77 self waittill(
"weapon_change", newWeapon );
96 self iPrintLnBold( &
"MP_UNAVAILABLE_FOR_N",
" " + timeLeft +
" ", &
"EXE_SECONDS" );
98 self switchToWeapon( currentWeapon );
111 self notify(
"supply_drop_marker_done" );
123 if( !isdefined(hardpointType) )
128 self switchToWeapon(
self.lastDroppableWeapon );
132 currentWeapon =
self GetCurrentWeapon();
135 if ( killstreakWeapon == level.weaponNone )
140 if ( issubstr( killstreakWeapon.name,
"inventory" ) )
141 isFromInventory =
true;
143 isFromInventory =
false;
145 currentAmmo =
self getammocount( killstreakWeapon );
146 if ( ( ( hardpointType ==
"minigun" || hardpointType ==
"inventory_minigun" ) && !
IS_TRUE(
self.minigunStart ) ) ||
147 ( ( hardpointType ==
"m32" || hardpointType ==
"inventory_m32" ) && !
IS_TRUE(
self.m32Start ) ) )
149 if ( hardpointType ==
"minigun" || hardpointType ==
"inventory_minigun" )
151 self.minigunStart =
true;
155 self.m32Start =
true;
158 self AddWeaponStat( killstreakWeapon,
"used", 1 );
161 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = ( killstreakWeapon.clipSize > currentAmmo ? currentAmmo : killstreakWeapon.clipSize );
164 if ( isFromInventory ==
false )
166 if(
self.pers[
"killstreak_quantity"][killstreakWeapon] > 0 )
167 ammoPool = killstreakWeapon.maxAmmo;
169 ammoPool =
self.pers[
"held_killstreak_ammo_count"][killstreakWeapon];
171 self setWeaponAmmoClip( killstreakWeapon,
self.pers[
"held_killstreak_clip_count"][killstreakWeapon] );
172 self setWeaponAmmoStock( killstreakWeapon, ammoPool -
self.pers[
"held_killstreak_clip_count"][killstreakWeapon] );
175 if ( hardpointType ==
"minigun" || hardpointType ==
"inventory_minigun" )
177 if ( !
IS_TRUE(
self.minigunActive ) )
181 if( hardpointType ==
"inventory_minigun" )
182 killstreak_id =
self.pers[
"killstreak_unique_id"][
self.pers[
"killstreak_unique_id"].size-1];
184 self.minigunId = killstreak_id;
185 self.minigunActive =
true;
189 killstreak_id =
self.minigunId;
198 if( hardpointType ==
"inventory_m32" )
199 killstreak_id =
self.pers[
"killstreak_unique_id"][
self.pers[
"killstreak_unique_id"].size-1];
201 self.m32Id = killstreak_id;
202 self.m32Active =
true;
206 killstreak_id =
self.m32Id;
210 assert ( killstreak_id != -1 );
211 self.firedKillstreakWeapon =
false;
213 self setBlockWeaponPickup( killstreakWeapon,
true );
215 if( isFromInventory )
217 self setWeaponAmmoClip( killstreakWeapon,
self.pers[
"held_killstreak_clip_count"][killstreakWeapon] );
218 self setWeaponAmmoStock( killstreakWeapon,
self.pers[
"killstreak_ammo_count"][
self.pers[
"killstreak_ammo_count"].size - 1] -
self.pers[
"held_killstreak_clip_count"][killstreakWeapon] );
221 notifyString =
"killstreakWeapon_" + killstreakWeapon.name;
222 self notify( notifyString );
229 if( isFromInventory )
232 self.usingKillstreakHeldWeapon =
true;
238 if( !isdefined(hardpointType) )
242 if ( killstreakWeapon == level.weaponNone )
245 self.firedKillstreakWeapon =
false;
247 self setBlockWeaponPickup( killstreakWeapon,
true );
251 assert ( killstreak_id != -1 );
253 if( issubstr( killstreakWeapon.name,
"inventory" ) )
254 isFromInventory =
true;
256 isFromInventory =
false;
261 if( isFromInventory )
264 self.usingKillstreakHeldWeapon =
true;
271 self endon(
"disconnect" );
272 self endon(
"death" );
273 noneWeapon = getWeapon(
"none" );
274 minigunWeapon = getWeapon(
"minigun" );
275 minigunInventoryWeapon = getWeapon(
"inventory_minigun" );
280 currentWeapon =
self GetCurrentWeapon();
281 self waittill(
"weapon_change", newWeapon );
283 if ( level.inFinalKillcam )
286 if( newWeapon == noneWeapon )
289 currentAmmo =
self getammocount( killstreakWeapon );
290 currentAmmoInClip =
self GetWeaponAmmoClip( killstreakWeapon );
293 if( isFromInventory && currentAmmo > 0 )
297 if( isdefined( killstreakIndex ) )
299 self.pers[
"killstreak_ammo_count"][killstreakIndex] = currentAmmo;
300 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = currentAmmoInClip;
307 if( newWeapon.isGameplayWeapon )
310 if( newWeapon ==
self.lastNonKillstreakWeapon && newWeapon.isCarriedKillstreak )
315 self.pers[
"held_killstreak_ammo_count"][killstreakWeapon] = currentAmmo;
316 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = currentAmmoInClip;
318 if ( killstreak_id != -1 )
320 self notify(
"killstreak_weapon_switch" );
322 self.firedKillstreakWeapon =
false;
323 self.usingKillstreakHeldWeapon = undefined;
327 if ( currentAmmo == 0 ||
self.pers[
"killstreak_quantity"][killstreakWeapon] > 0 || ( isFromInventory && isdefined(KillstreakId) && KillstreakId != killstreak_id ) )
330 if ( killstreakWeapon == minigunInventoryWeapon || killstreakWeapon == minigunWeapon )
332 self.minigunStart =
false;
333 self.minigunActive =
false;
337 self.m32Start =
false;
338 self.m32Active =
false;
342 if(
self.pers[
"killstreak_quantity"][killstreakWeapon] > 0 )
344 self.pers[
"held_killstreak_ammo_count"][killstreakWeapon] = killstreakWeapon.maxAmmo;
346 self.pers[
"killstreak_quantity"][killstreakWeapon]--;
350 if( isFromInventory && currentAmmo == 0 )
352 self TakeWeapon( killstreakWeapon );
363 self endon(
"disconnect" );
364 self endon(
"killstreak_weapon_switch" );
366 if( killstreak_id == -1 )
372 self waittill(
"death" );
374 penalty = GetDvarFloat(
"scr_HeldKillstreak_Penalty", 0.5 );
375 maxAmmo = killstreakWeapon.maxAmmo;
376 currentAmmo =
self getammocount( killstreakWeapon );
377 currentAmmoInClip =
self GetWeaponAmmoClip( killstreakWeapon );
379 if (
self.pers[
"killstreak_quantity"].size == 0 )
382 currentAmmoInClip = 0;
385 maxClipSize = killstreakWeapon.clipSize;
386 newAmmo = int( currentAmmo - (maxAmmo * penalty) );
391 if(
self.lastNonKillstreakWeapon == killstreakWeapon )
395 self.pers[
"held_killstreak_ammo_count"][killstreakWeapon] = 0;
396 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = 0;
400 self.pers[
"held_killstreak_ammo_count"][killstreakWeapon] = newAmmo;
401 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = ( maxClipSize <= newAmmo ? maxClipSize : newAmmo );
405 self.usingKillstreakHeldWeapon =
false;
407 if ( newAmmo <= 0 ||
self.pers[
"killstreak_quantity"][killstreakWeapon] > 0 || ( isFromInventory && isdefined(KillstreakId) && KillstreakId != killstreak_id ) )
410 if ( killstreakType ==
"minigun" || killstreakType ==
"inventory_minigun" )
412 self.minigunStart =
false;
413 self.minigunActive =
false;
417 self.m32Start =
false;
418 self.m32Active =
false;
421 if( isdefined(
self.pers[
"killstreak_quantity"][killstreakWeapon] ) &&
self.pers[
"killstreak_quantity"][killstreakWeapon] > 0 )
423 self.pers[
"held_killstreak_ammo_count"][killstreakWeapon] = maxAmmo;
424 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = maxClipSize;
425 self setWeaponAmmoClip( killstreakWeapon,
self.pers[
"held_killstreak_clip_count"][killstreakWeapon] );
426 self setWeaponAmmoStock( killstreakWeapon,
self.pers[
"held_killstreak_ammo_count"][killstreakWeapon] -
self.pers[
"held_killstreak_clip_count"][killstreakWeapon] );
427 self.pers[
"killstreak_quantity"][killstreakWeapon]--;
430 if( isFromInventory && newAmmo <= 0 )
432 self TakeWeapon( killstreakWeapon );
436 else if( isFromInventory )
440 if( isdefined( killstreakIndex ) )
442 self.pers[
"killstreak_ammo_count"][killstreakIndex] =
self.pers[
"held_killstreak_ammo_count"][killstreakWeapon];
449 self endon(
"disconnect" );
451 endonWeaponString =
"killstreakWeapon_" + killstreakWeapon.name;
452 self endon( endonWeaponString );
454 self waittill(
"death" );
456 currentAmmo =
self getammocount( killstreakWeapon );
458 self.pers[
"held_killstreak_clip_count"][killstreakWeapon] = ( killstreakWeapon.clipSize <= currentAmmo ? killstreakWeapon.clipSize : currentAmmo );
463 self endon(
"disconnect" );
464 self endon(
"death" );
465 self endon(
"killstreak_weapon_switch" );
467 self waittill(
"oldest_killstreak_removed", removedKillstreakType, removed_id );
469 if ( killstreakType == removedKillstreakType && killstreak_id == removed_id )
472 if ( removedKillstreakWeapon.name ==
"inventory_minigun" )
474 self.minigunStart =
false;
475 self.minigunActive =
false;
479 self.m32Start =
false;
480 self.m32Active =
false;
487 self endon(
"disconnect" );
488 self endon(
"death" );
489 self endon(
"killstreak_weapon_switch" );
491 self waittill(
"round_ended" );
493 currentWeapon =
self getCurrentWeapon();
495 if( !currentWeapon.isCarriedKillstreak )
498 currentAmmo =
self getammocount( currentWeapon );
499 maxClipSize = currentWeapon.clipSize;
502 if( isFromInventory && currentAmmo > 0 )
506 if( isDefined( killstreakIndex ) )
508 self.pers[
"killstreak_ammo_count"][killstreakIndex] = currentAmmo;
509 self.pers[
"held_killstreak_clip_count"][currentWeapon] = ( maxClipSize <= currentAmmo ? maxClipSize : currentAmmo );
514 self.pers[
"held_killstreak_ammo_count"][currentWeapon] = currentAmmo;
515 self.pers[
"held_killstreak_clip_count"][currentWeapon] = ( maxClipSize <= currentAmmo ? maxClipSize : currentAmmo );
521 switchableWeapon =
true;
525 if( !isdefined(killstreakId) )
528 if (
self HasWeapon( killstreakWeapon ) && !
self GetAmmoCount( killstreakWeapon ) )
529 switchableWeapon =
true;
530 else if(
self.firedKillstreakWeapon && newWeapon == killstreakWeapon && currentWeapon.isCarriedKillstreak )
531 switchableWeapon =
true;
532 else if( newWeapon.isEquipment )
533 switchableWeapon =
true;
534 else if( isdefined( level.grenade_array[newWeapon] ) )
535 switchableWeapon =
false;
536 else if( newWeapon.isCarriedKillstreak && currentWeapon.isCarriedKillstreak && (!isdefined(currentKillstreakID) || currentKillstreakId != killstreakId) )
537 switchableWeapon =
true;
539 switchableWeapon =
false;
540 else if( newWeapon.isGameplayWeapon )
541 switchableWeapon =
false;
542 else if(
self.firedKillstreakWeapon )
543 switchableWeapon =
true;
544 else if(
self.lastNonKillstreakWeapon == killstreakWeapon )
545 switchableWeapon =
false;
546 else if( isdefined(topKillstreak) && topKillstreak == killstreakWeapon && currentKillstreakId == killstreakId )
547 switchableWeapon =
false;
550 return switchableWeapon;