#include maps/mp/gametypes/_class; #include maps/mp/_popups; #include maps/mp/gametypes/_weapons; #include maps/mp/killstreaks/_killstreakrules; #include maps/mp/killstreaks/_supplydrop; #include maps/mp/gametypes/_globallogic_utils; #include maps/mp/killstreaks/_killstreaks; #include maps/mp/gametypes/_hud_util; #include maps/mp/_utility; #include common_scripts/utility; init() { precacheshader( "hud_ks_minigun" ); precacheshader( "hud_ks_m32" ); maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_minigun_mp", "inventory_minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" ); maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" ); maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" ); maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_minigun_mp", "scr_giveminigun_drop" ); maps/mp/killstreaks/_killstreaks::registerkillstreak( "minigun_mp", "minigun_mp", "killstreak_minigun", "minigun_used", ::usecarriedkillstreakweapon, 0, 1, "MINIGUN_USED" ); maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "minigun_mp", &"KILLSTREAK_EARNED_MINIGUN", &"KILLSTREAK_MINIGUN_NOT_AVAILABLE", &"KILLSTREAK_MINIGUN_INBOUND" ); maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "minigun_mp", "mpl_killstreak_minigun", "kls_death_used", "", "kls_death_enemy", "", "kls_death_ready" ); maps/mp/killstreaks/_killstreaks::registerkillstreak( "inventory_m32_mp", "inventory_m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" ); maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "inventory_m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" ); maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "inventory_m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" ); maps/mp/killstreaks/_killstreaks::registerkillstreakdevdvar( "inventory_m32_mp", "scr_givem32_drop" ); maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "inventory_m32_mp", 1 ); maps/mp/killstreaks/_killstreaks::registerkillstreak( "m32_mp", "m32_mp", "killstreak_m32", "m32_used", ::usecarriedkillstreakweapon, 0, 1, "M32_USED" ); maps/mp/killstreaks/_killstreaks::registerkillstreakstrings( "m32_mp", &"KILLSTREAK_EARNED_M32", &"KILLSTREAK_M32_NOT_AVAILABLE", &"KILLSTREAK_M32_INBOUND" ); maps/mp/killstreaks/_killstreaks::registerkillstreakdialog( "m32_mp", "mpl_killstreak_m32", "kls_mgl_used", "", "kls_mgl_enemy", "", "kls_mgl_ready" ); maps/mp/killstreaks/_killstreaks::overrideentitycameraindemo( "m32_mp", 1 ); level.killstreakicons[ "killstreak_minigun" ] = "hud_ks_minigun"; level.killstreakicons[ "killstreak_m32" ] = "hud_ks_m32"; level.killstreakicons[ "killstreak_m202_flash_mp" ] = "hud_ks_m202"; level.killstreakicons[ "killstreak_m220_tow_drop_mp" ] = "hud_ks_tv_guided_marker"; level.killstreakicons[ "killstreak_m220_tow_mp" ] = "hud_ks_tv_guided_missile"; level thread onplayerconnect(); setdvar( "scr_HeldKillstreak_Penalty", 0 ); } onplayerconnect() { for ( ;; ) { level waittill( "connecting", player ); player thread onplayerspawned(); } } onplayerspawned() { self endon( "disconnect" ); for ( ;; ) { self waittill( "spawned_player" ); self.firedkillstreakweapon = 0; self.usingkillstreakheldweapon = undefined; if ( !isfirstround() && !isoneround() ) { if ( level.roundstartkillstreakdelay > ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ) { self thread watchkillstreakweapondelay(); } } } } watchkillstreakweapondelay() { self endon( "disconnect" ); self endon( "death" ); while ( 1 ) { currentweapon = self getcurrentweapon(); self waittill( "weapon_change", newweapon ); if ( level.roundstartkillstreakdelay < ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ) { return; } while ( !maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) ) { wait 0,5; } if ( maps/mp/killstreaks/_killstreaks::isdelayablekillstreak( newweapon ) && isheldkillstreakweapon( newweapon ) ) { timeleft = int( level.roundstartkillstreakdelay - ( maps/mp/gametypes/_globallogic_utils::gettimepassed() / 1000 ) ); if ( !timeleft ) { timeleft = 1; } self iprintlnbold( &"MP_UNAVAILABLE_FOR_N", " " + timeleft + " ", &"EXE_SECONDS" ); self switchtoweapon( currentweapon ); wait 0,5; } } } usekillstreakweapondrop( hardpointtype ) { if ( self maps/mp/killstreaks/_supplydrop::issupplydropgrenadeallowed( hardpointtype ) == 0 ) { return 0; } result = self maps/mp/killstreaks/_supplydrop::usesupplydropmarker(); self notify( "supply_drop_marker_done" ); if ( !isDefined( result ) || !result ) { return 0; } return result; } usecarriedkillstreakweapon( hardpointtype ) { if ( self maps/mp/killstreaks/_killstreakrules::iskillstreakallowed( hardpointtype, self.team ) == 0 ) { self switchtoweapon( self.lastdroppableweapon ); return 0; } if ( !isDefined( hardpointtype ) ) { return 0; } currentweapon = self getcurrentweapon(); if ( hardpointtype == "none" ) { return 0; } level maps/mp/gametypes/_weapons::addlimitedweapon( hardpointtype, self, 3 ); if ( issubstr( hardpointtype, "inventory" ) ) { isfrominventory = 1; } else { isfrominventory = 0; } currentammo = self getammocount( hardpointtype ); if ( hardpointtype != "minigun_mp" && hardpointtype == "inventory_minigun_mp" && isDefined( self.minigunstart ) || self.minigunstart == 0 && hardpointtype != "m32_mp" && hardpointtype == "inventory_m32_mp" || !isDefined( self.m32start ) && self.m32start == 0 ) { if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) { self.minigunstart = 1; } else { self.m32start = 1; } self maps/mp/killstreaks/_killstreaks::playkillstreakstartdialog( hardpointtype, self.team, 1 ); level.globalkillstreakscalled++; self addweaponstat( hardpointtype, "used", 1 ); level thread maps/mp/_popups::displayteammessagetoall( level.killstreaks[ hardpointtype ].inboundtext, self ); if ( weaponclipsize( hardpointtype ) > currentammo ) { } else { } self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = weaponclipsize( hardpointtype ); if ( isfrominventory == 0 ) { if ( self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 ) { ammopool = weaponmaxammo( hardpointtype ); } else { ammopool = self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ]; } self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); self setweaponammostock( hardpointtype, ammopool - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); } } if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) { if ( !isDefined( self.minigunactive ) || !self.minigunactive ) { killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); if ( hardpointtype == "inventory_minigun_mp" ) { killstreak_id = self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ]; } self.minigunid = killstreak_id; self.minigunactive = 1; } else { killstreak_id = self.minigunid; } } else { if ( !isDefined( self.m32active ) || !self.m32active ) { killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); if ( hardpointtype == "inventory_m32_mp" ) { killstreak_id = self.pers[ "killstreak_unique_id" ][ self.pers[ "killstreak_unique_id" ].size - 1 ]; } self.m32id = killstreak_id; self.m32active = 1; } else { killstreak_id = self.m32id; } } /# assert( killstreak_id != -1 ); #/ self.firedkillstreakweapon = 0; self setblockweaponpickup( hardpointtype, 1 ); if ( isfrominventory ) { self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); self setweaponammostock( hardpointtype, self.pers[ "killstreak_ammo_count" ][ self.pers[ "killstreak_ammo_count" ].size - 1 ] - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); } notifystring = "killstreakWeapon_" + hardpointtype; self notify( notifystring ); self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory ); self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ); self thread watchkillstreakroundchange( isfrominventory, killstreak_id ); self thread watchplayerdeath( hardpointtype ); if ( isfrominventory ) { self thread watchkillstreakremoval( hardpointtype, killstreak_id ); } self.usingkillstreakheldweapon = 1; return 0; } usekillstreakweaponfromcrate( hardpointtype ) { if ( !isDefined( hardpointtype ) ) { return 0; } if ( hardpointtype == "none" ) { return 0; } self.firedkillstreakweapon = 0; self setblockweaponpickup( hardpointtype, 1 ); killstreak_id = self maps/mp/killstreaks/_killstreakrules::killstreakstart( hardpointtype, self.team, 0, 0 ); /# assert( killstreak_id != -1 ); #/ if ( issubstr( hardpointtype, "inventory" ) ) { isfrominventory = 1; } else { isfrominventory = 0; } self thread watchkillstreakweaponswitch( hardpointtype, killstreak_id, isfrominventory ); self thread watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ); if ( isfrominventory ) { self thread watchkillstreakremoval( hardpointtype, killstreak_id ); } self.usingkillstreakheldweapon = 1; return 1; } watchkillstreakweaponswitch( killstreakweapon, killstreak_id, isfrominventory ) { self endon( "disconnect" ); self endon( "death" ); while ( 1 ) { currentweapon = self getcurrentweapon(); self waittill( "weapon_change", newweapon ); while ( level.infinalkillcam ) { continue; } while ( newweapon == "none" ) { continue; } currentammo = self getammocount( killstreakweapon ); currentammoinclip = self getweaponammoclip( killstreakweapon ); if ( isfrominventory && currentammo > 0 ) { killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id ); if ( isDefined( killstreakindex ) ) { self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = currentammo; self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammoinclip; } } if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) && !isheldkillstreakweapon( newweapon ) ) { continue; } while ( isgameplayweapon( newweapon ) ) { continue; } if ( isheldkillstreakweapon( newweapon ) && newweapon == self.lastnonkillstreakweapon ) { continue; } killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid(); self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] = currentammo; self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammoinclip; if ( killstreak_id != -1 ) { self notify( "killstreak_weapon_switch" ); } self.firedkillstreakweapon = 0; self.usingkillstreakheldweapon = undefined; waittillframeend; if ( currentammo != 0 || self.pers[ "killstreak_quantity" ][ killstreakweapon ] > 0 && isfrominventory && isDefined( killstreakid ) && killstreakid != killstreak_id ) { maps/mp/killstreaks/_killstreakrules::killstreakstop( killstreakweapon, self.team, killstreak_id ); if ( killstreakweapon == "minigun_mp" || killstreakweapon == "inventory_minigun_mp" ) { self.minigunstart = 0; self.minigunactive = 0; } else { self.m32start = 0; self.m32active = 0; } if ( self.pers[ "killstreak_quantity" ][ killstreakweapon ] > 0 ) { self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] = weaponmaxammo( killstreakweapon ); self maps/mp/gametypes/_class::setweaponammooverall( killstreakweapon, self.pers[ "held_killstreak_ammo_count" ][ killstreakweapon ] ); self.pers[ "killstreak_quantity" ][ killstreakweapon ]--; } } if ( isfrominventory && currentammo == 0 ) { self takeweapon( killstreakweapon ); self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreakweapon, killstreak_id ); self maps/mp/killstreaks/_killstreaks::activatenextkillstreak(); } return; } } watchkillstreakweapondeath( hardpointtype, killstreak_id, isfrominventory ) { self endon( "disconnect" ); self endon( "killstreak_weapon_switch" ); if ( killstreak_id == -1 ) { return; } oldteam = self.team; self waittill( "death" ); penalty = getdvarfloatdefault( "scr_HeldKillstreak_Penalty", 0,5 ); maxammo = weaponmaxammo( hardpointtype ); currentammo = self getammocount( hardpointtype ); currentammoinclip = self getweaponammoclip( hardpointtype ); if ( self.pers[ "killstreak_quantity" ].size == 0 ) { currentammo = 0; currentammoinclip = 0; } maxclipsize = weaponclipsize( hardpointtype ); newammo = int( currentammo - ( maxammo * penalty ) ); killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid(); if ( self.lastnonkillstreakweapon == hardpointtype ) { if ( newammo < 0 ) { self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = 0; self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = 0; } else { self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = newammo; if ( maxclipsize <= newammo ) { } else { } self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = newammo; } } self.usingkillstreakheldweapon = 0; if ( newammo <= 0 || self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 && isfrominventory && isDefined( killstreakid ) && killstreakid != killstreak_id ) { maps/mp/killstreaks/_killstreakrules::killstreakstop( hardpointtype, oldteam, killstreak_id ); if ( hardpointtype == "minigun_mp" || hardpointtype == "inventory_minigun_mp" ) { self.minigunstart = 0; self.minigunactive = 0; } else { self.m32start = 0; self.m32active = 0; } if ( isDefined( self.pers[ "killstreak_quantity" ][ hardpointtype ] ) && self.pers[ "killstreak_quantity" ][ hardpointtype ] > 0 ) { self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] = maxammo; self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] = maxclipsize; self setweaponammoclip( hardpointtype, self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); self setweaponammostock( hardpointtype, self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ] - self.pers[ "held_killstreak_clip_count" ][ hardpointtype ] ); self.pers[ "killstreak_quantity" ][ hardpointtype ]--; } } if ( isfrominventory && newammo <= 0 ) { self takeweapon( hardpointtype ); self maps/mp/killstreaks/_killstreaks::removeusedkillstreak( hardpointtype, killstreak_id ); self maps/mp/killstreaks/_killstreaks::activatenextkillstreak(); } else { if ( isfrominventory ) { killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id ); if ( isDefined( killstreakindex ) ) { self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = self.pers[ "held_killstreak_ammo_count" ][ hardpointtype ]; } } } return; } watchplayerdeath( killstreakweapon ) { self endon( "disconnect" ); endonweaponstring = "killstreakWeapon_" + killstreakweapon; self endon( endonweaponstring ); self waittill( "death" ); currentammo = self getammocount( killstreakweapon ); if ( weaponclipsize( killstreakweapon ) <= currentammo ) { } else { } self.pers[ "held_killstreak_clip_count" ][ killstreakweapon ] = currentammo; } watchkillstreakremoval( killstreakweapon, killstreak_id ) { self endon( "disconnect" ); self endon( "death" ); self endon( "killstreak_weapon_switch" ); self waittill( "oldest_killstreak_removed", removedkillstreakweapon, removed_id ); if ( killstreakweapon == removedkillstreakweapon && killstreak_id == removed_id ) { if ( removedkillstreakweapon == "inventory_minigun_mp" ) { self.minigunstart = 0; self.minigunactive = 0; return; } else { self.m32start = 0; self.m32active = 0; } } } watchkillstreakroundchange( isfrominventory, killstreak_id ) { self endon( "disconnect" ); self endon( "death" ); self endon( "killstreak_weapon_switch" ); self waittill( "round_ended" ); currentweapon = self getcurrentweapon(); if ( !isheldkillstreakweapon( currentweapon ) ) { return; } currentammo = self getammocount( currentweapon ); maxclipsize = weaponclipsize( currentweapon ); if ( isfrominventory && currentammo > 0 ) { killstreakindex = self maps/mp/killstreaks/_killstreaks::getkillstreakindexbyid( killstreak_id ); if ( isDefined( killstreakindex ) ) { self.pers[ "killstreak_ammo_count" ][ killstreakindex ] = currentammo; if ( maxclipsize <= currentammo ) { } else { } self.pers[ "held_killstreak_clip_count" ][ currentweapon ] = currentammo; } } else { self.pers[ "held_killstreak_ammo_count" ][ currentweapon ] = currentammo; if ( maxclipsize <= currentammo ) { } else { } self.pers[ "held_killstreak_clip_count" ][ currentweapon ] = currentammo; } } checkifswitchableweapon( currentweapon, newweapon, killstreakweapon, currentkillstreakid ) { switchableweapon = 1; topkillstreak = maps/mp/killstreaks/_killstreaks::gettopkillstreak(); killstreakid = maps/mp/killstreaks/_killstreaks::gettopkillstreakuniqueid(); if ( !isDefined( killstreakid ) ) { killstreakid = -1; } if ( self hasweapon( killstreakweapon ) && !self getammocount( killstreakweapon ) ) { switchableweapon = 1; } else { if ( self.firedkillstreakweapon && newweapon == killstreakweapon && isheldkillstreakweapon( currentweapon ) ) { switchableweapon = 1; } else { if ( isweaponequipment( newweapon ) ) { switchableweapon = 1; } else if ( isDefined( level.grenade_array[ newweapon ] ) ) { switchableweapon = 0; } else if ( isheldkillstreakweapon( newweapon ) && isheldkillstreakweapon( currentweapon ) || !isDefined( currentkillstreakid ) && currentkillstreakid != killstreakid ) { switchableweapon = 1; } else { if ( maps/mp/killstreaks/_killstreaks::iskillstreakweapon( newweapon ) ) { switchableweapon = 0; } else if ( isgameplayweapon( newweapon ) ) { switchableweapon = 0; } else if ( self.firedkillstreakweapon ) { switchableweapon = 1; } else if ( self.lastnonkillstreakweapon == killstreakweapon ) { switchableweapon = 0; } else { if ( isDefined( topkillstreak ) && topkillstreak == killstreakweapon && currentkillstreakid == killstreakid ) { switchableweapon = 0; } } } } } return switchableweapon; } watchkillstreakweaponusage() { self endon( "disconnect" ); self endon( "death" ); while ( 1 ) { self waittill( "weapon_fired", killstreakweapon ); while ( !isheldkillstreakweapon( killstreakweapon ) ) { wait 0,1; } while ( self.firedkillstreakweapon ) { continue; } maps/mp/killstreaks/_killstreaks::removeusedkillstreak( killstreakweapon ); self.firedkillstreakweapon = 1; self setactionslot( 4, "" ); waittillframeend; maps/mp/killstreaks/_killstreaks::activatenextkillstreak(); } } isheldkillstreakweapon( killstreaktype ) { switch( killstreaktype ) { case "inventory_m32_mp": case "inventory_minigun_mp": case "m32_mp": case "minigun_mp": return 1; } return 0; } isheldinventorykillstreakweapon( killstreaktype ) { switch( killstreaktype ) { case "inventory_m32_mp": case "inventory_minigun_mp": return 1; } return 0; } isgameplayweapon( weapon ) { switch( weapon ) { case "briefcase_bomb_defuse_mp": case "briefcase_bomb_mp": case "syrette_mp": return 1; default: return 0; } return 0; }