From 5755bb3e3fdf707f2b0a23a0812474b61b873b6a Mon Sep 17 00:00:00 2001 From: INeedBots Date: Wed, 30 Sep 2020 15:04:21 -0600 Subject: [PATCH] start --- userraw/maps/mp/killstreaks/_killstreaks.gsc | 188 +++++- userraw/scripts/specialistStalker.gsc | 641 +++++++++++++++++++ 2 files changed, 818 insertions(+), 11 deletions(-) create mode 100644 userraw/scripts/specialistStalker.gsc diff --git a/userraw/maps/mp/killstreaks/_killstreaks.gsc b/userraw/maps/mp/killstreaks/_killstreaks.gsc index d6d6cad..d34995d 100644 --- a/userraw/maps/mp/killstreaks/_killstreaks.gsc +++ b/userraw/maps/mp/killstreaks/_killstreaks.gsc @@ -21,7 +21,7 @@ 1 - use Puffiamo's killstreak HUD 2 - use NoFate's MW3 killstreak HUD - Thanks: H3X1C, Emosewaj, NoFate, Puffiamo + Thanks: H3X1C, Emosewaj, NoFate, Puffiamo, Intricate */ #include maps\mp\_utility; @@ -65,10 +65,25 @@ init() setDvarIfUninitialized( "scr_killstreakHud", false ); setDvarIfUninitialized( "scr_killstreak_mod", 0 ); + setDvarIfUninitialized( "scr_specialist", true ); + setDvarIfUninitialized( "scr_specialist_perks1", "specialty_scavenger,specialty_fastreload,specialty_marathon" ); + setDvarIfUninitialized( "scr_specialist_perks2", "specialty_bulletdamage,specialty_lightweight,specialty_coldblooded,specialty_explosivedamage,specialty_hardline" ); + setDvarIfUninitialized( "scr_specialist_perks3", "specialty_bulletaccuracy,specialty_heartbreaker,specialty_detectexplosive,specialty_extendedmelee,specialty_localjammer" ); + level.killstreaksRollOver = getDvarInt("scr_killstreak_rollover"); level.maxKillstreakRollover = getDvarInt("scr_maxKillstreakRollover"); level.killstreakHud = getDvarInt("scr_killstreakHud"); level.killStreakMod = getDvarInt( "scr_killstreak_mod" ); + + level.allowSpecialist = getDvarInt( "scr_allow_specialist" ); + level.specialistPerk1 = getDvar("scr_specialist_perks1"); + level.specialistPerk2 = getDvar("scr_specialist_perks2"); + level.specialistPerk3 = getDvar("scr_specialist_perks3"); + + if (level.allowSpecialist) + { + initSpecialist(); + } level thread onPlayerConnect(); } @@ -157,11 +172,6 @@ onPlayerSpawned() self waittill( "spawned_player" ); self thread killstreakUseWaiter(); self thread waitForChangeTeam(); - - if (level.killstreakHud == 1) - self thread initKillstreakHud( 145 ); - else if (level.killstreakHud == 2) - self thread initMW3KillstreakHud(); self giveOwnedKillstreakItem( true ); } @@ -175,6 +185,16 @@ onPlayerChangeKit() { self waittill( "changed_kit" ); self giveOwnedKillstreakItem(); + + if (level.allowSpecialist) + { + self startSpecialist(); + } + + if (level.killstreakHud == 1) + self thread initKillstreakHud( 145 ); + else if (level.killstreakHud == 2) + self thread initMW3KillstreakHud(); } } @@ -757,13 +777,13 @@ clearRideIntro( delay ) destroyOnEvents(elem) { - self waittill_either("disconnect", "spawned_player"); + self waittill_either("disconnect", "changed_kit"); elem destroy(); } initKillstreakHud(inity) { - self endon( "death" ); + self endon( "changed_kit" ); self endon( "disconnect" ); streakVals = GetArrayKeys(self.killStreaks); @@ -794,7 +814,7 @@ initKillstreakHud(inity) if (isSubStr(streakName, "-rollover")) continue; - streakShader = maps\mp\killstreaks\_killstreaks::getKillstreakIcon( streakName ); + streakShader = getKillstreakIcon( streakName ); streakCost = streakVal; if (hasHardline) streakCost--; @@ -858,7 +878,7 @@ initKillstreakHud(inity) initMW3KillstreakHud() { - self endon( "death" ); + self endon( "changed_kit" ); self endon( "disconnect" ); streakVals = GetArrayKeys(self.killStreaks); @@ -876,7 +896,7 @@ initMW3KillstreakHud() if (isSubStr(streakName, "-rollover")) continue; - streakShader = maps\mp\killstreaks\_killstreaks::getKillstreakIcon( streakName ); + streakShader = getKillstreakIcon( streakName ); streakCost = streakVal; if (hasHardline) streakCost--; @@ -965,3 +985,149 @@ initMW3KillstreakHud() } } } + +getPerkDescription( perk ) +{ + //Intricate - Thanks to EMZ for the Black Ops variant, changed for MW2. + //Intricate - This function gives the STRING for the PERK DESCRIPTION. + return tableLookUpIString( "mp/perkTable.csv", 1, perk, 4 ); +} + +getPerkMaterial( perk ) +{ + //Intricate - Thanks to EMZ for the Black Ops variant, changed for MW2. + //Intricate - This function gives the MATERIAL for the PERK. (Most of the time in MW2 the name of the perk = shader but other times it's not.) + return tableLookUp( "mp/perkTable.csv", 1, perk, 3 ); +} + +getPerkString( perk ) +{ + //Intricate - Thanks to EMZ for the Black Ops variant, changed for MW2. + //Intricate - This function gives the STRING for the PERK. + return tableLookUpIString( "mp/perkTable.csv", 1, perk, 2 ); +} + +initSpecialist() +{ + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_scavenger", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_fastreload", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_marathon", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_bulletdamage", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_lightweight", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_coldblooded", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_explosivedamage", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_hardline", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_bulletaccuracy", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_heartbreaker", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_detectexplosive", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_extendedmelee", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_localjammer", 8 ))); + PrecacheShader(getPerkMaterial("specialty_scavenger")); + PrecacheShader(getPerkMaterial("specialty_fastreload")); + PrecacheShader(getPerkMaterial("specialty_marathon")); + PrecacheShader(getPerkMaterial("specialty_bulletdamage")); + PrecacheShader(getPerkMaterial("specialty_lightweight")); + PrecacheShader(getPerkMaterial("specialty_coldblooded")); + PrecacheShader(getPerkMaterial("specialty_explosivedamage")); + PrecacheShader(getPerkMaterial("specialty_hardline")); + PrecacheShader(getPerkMaterial("specialty_bulletaccuracy")); + PrecacheShader(getPerkMaterial("specialty_heartbreaker")); + PrecacheShader(getPerkMaterial("specialty_detectexplosive")); + PrecacheShader(getPerkMaterial("specialty_extendedmelee")); + PrecacheShader(getPerkMaterial("specialty_localjammer")); + PrecacheShader("specialty_onemanarmy"); + PrecacheShader("specialty_onemanarmy_upgrade"); + + //Strings + PrecacheString( &"PERKS_MARATHON" ); + PrecacheString( &"PERKS_SLEIGHT_OF_HAND" ); + PrecacheString( &"PERKS_SCAVENGER" ); + //-- + PrecacheString( &"PERKS_STOPPING_POWER" ); + PrecacheString( &"PERKS_LIGHTWEIGHT" ); + PrecacheString( &"PERKS_COLDBLOODED" ); + PrecacheString( &"PERKS_DANGERCLOSE" ); + PrecacheString( &"PERKS_HARDLINE" ); + //-- + PrecacheString( &"PERKS_EXTENDEDMELEE" ); + PrecacheString( &"PERKS_STEADY_AIM" ); + PrecacheString( &"PERKS_LOCALJAMMER" ); + PrecacheString( &"PERKS_BOMB_SQUAD" ); + PrecacheString( &"PERKS_NINJA" ); + //Description + PrecacheString( &"PERKS_DESC_MARATHON" ); + PrecacheString( &"PERKS_FASTER_RELOADING" ); + PrecacheString( &"PERKS_DESC_SCAVENGER" ); + //-- + PrecacheString( &"PERKS_INCREASED_BULLET_DAMAGE" ); + PrecacheString( &"PERKS_DESC_LIGHTWEIGHT" ); + PrecacheString( &"PERKS_DESC_COLDBLOODED" ); + PrecacheString( &"PERKS_HIGHER_EXPLOSIVE_WEAPON" ); + PrecacheString( &"PERKS_DESC_HARDLINE" ); + //-- + PrecacheString( &"PERKS_DESC_EXTENDEDMELEE" ); + PrecacheString( &"PERKS_INCREASED_HIPFIRE_ACCURACY" ); + PrecacheString( &"PERKS_DESC_LOCALJAMMER" ); + PrecacheString( &"PERKS_ABILITY_TO_SEEK_OUT_ENEMY" ); + PrecacheString( &"PERKS_DESC_HEARTBREAKER" ); + + level.specialistData = []; + + perks = []; + perks[perks.size] = strtok(level.specialistPerk1, ","); + perks[perks.size] = strtok(level.specialistPerk2, ","); + perks[perks.size] = strtok(level.specialistPerk3, ","); + + for (i = 0; i < perks.size; i++) + { + for (h = 0; h < perks[i].size; h++) + { + perk = perks[i][h]; + + data = spawnStruct(); + + + level.specialistData[perk] = data; + level.killstreakSetupFuncs[perk] = ::onGetPerkStreak; + } + } +} + +onGetPerkStreak(perk) +{ + data = level.specialistData[perk]; +} + +startSpecialist() +{ + // only start if we have only the nuke killstreak + shouldDoSpecialist = undefined; + streakVals = GetArrayKeys(self.killStreaks); + + for (i = 0; i < streakVals.size; i++) + { + streakVal = streakVals[i]; + streakName = self.killStreaks[streakVal]; + + if (isSubStr(streakName, "-rollover")) + continue; + + if (isDefined(shouldDoSpecialist) && !shouldDoSpecialist) + break; + + if (streakName == "nuke") + shouldDoSpecialist = true; + else + shouldDoSpecialist = false; + } + + if (!isDefined(shouldDoSpecialist) || !shouldDoSpecialist) + return; + + if ( self _hasPerk( "specialty_hardline" ) && ( getDvarInt( "scr_classic" ) != 1 ) ) + modifier = -1; + else + modifier = 0; + + +} diff --git a/userraw/scripts/specialistStalker.gsc b/userraw/scripts/specialistStalker.gsc new file mode 100644 index 0000000..e61c30b --- /dev/null +++ b/userraw/scripts/specialistStalker.gsc @@ -0,0 +1,641 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\perks\_perkfunctions; + +init() +{ + if (true) + return; + preCache(); + setDvarIfUninitialized("scr_allowSpecialist", true); + setDvarIfUninitialized("scr_allowStalkerPerk", true); + setDvarIfUninitialized("scr_allowViewKickPerk", true); + setDvarIfUninitialized("scr_allowArmorvestPerk", true); + + level thread onPlayerConnect(); +} + +onPlayerConnect() +{ + for(;;) + { + level waittill("connected", player); + player thread onPlayerSpawn(); + } +} + +onPlayerSpawn() +{ + self endon("disconnect"); + for(;;) + { + self waittill("spawned_player"); + self thread doPerks(); + self thread startUpSpecialist(); + } +} + +stopOnDeath() +{ + self endon("disconnect"); + self waittill("death"); + self.moveSpeedScaler = 1.0; + /*self setclientdvars("bg_viewkickScale", 0.2, + "bg_viewkickMax", 90, + "bg_viewkickMin", 5, + "bg_viewkickRandom", 0.4, + "bg_shock_viewKickFadeTime", 3, + "bg_shock_viewKickPeriod", 0.75, + "bg_shock_viewKickRadius", 0.05); + */ +} + +doPerks() +{ + self endon("disconnect"); + self endon("death"); + self thread stopOnDeath(); + for(;;) + { + if(getDvarInt("scr_allowStalkerPerk") && self _hasPerk("specialty_delaymine")) + { + switch( WeaponClass( self getCurrentWeapon() ) ) + { + case "rifle": + self.moveSpeedScaler = 1 + (1.2*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + case "smg": + self.moveSpeedScaler = 1 + (0.3*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + case "mg": + self.moveSpeedScaler = 1 + (1*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + case "sniper": + self.moveSpeedScaler = 1 + (0.2*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + case "pistol": + self.moveSpeedScaler = 1 + (0.3*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + case "spread": + self.moveSpeedScaler = 1 + (0.3*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + case "rocketlauncher": + self.moveSpeedScaler = 1 + (1*self playerADS()); + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + default: + self.moveSpeedScaler = 1.0; + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + break; + } + } + else + { + self.moveSpeedScaler = 1.0; + self maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" ); + } + + /*if(getDvarInt("scr_allowViewkickPerk") && self _hasPerk("specialty_secondarybling")) + { + self setclientdvars("bg_viewkickScale", 0.0, + "bg_viewkickMax", 0, + "bg_viewkickMin", 0, + "bg_viewkickRandom", 0.0, + "bg_shock_viewKickFadeTime", 0, + "bg_shock_viewKickPeriod", 0.0, + "bg_shock_viewKickRadius", 0.0); + } + else + { + self setclientdvars("bg_viewkickScale", 0.2, + "bg_viewkickMax", 90, + "bg_viewkickMin", 5, + "bg_viewkickRandom", 0.4, + "bg_shock_viewKickFadeTime", 3, + "bg_shock_viewKickPeriod", 0.75, + "bg_shock_viewKickRadius", 0.05); + }*/ + + if(getDvarInt("scr_allowArmorvestPerk") && self _hasPerk("specialty_rollover")) + { + if(!self _hasPerk("specialty_armorvest")) + self _setPerk("specialty_armorvest"); + } + else + { + if(self _hasPerk("specialty_armorvest")) + self _unSetPerk("specialty_armorvest"); + } + waitframe(); + } +} + +startUpSpecialist() +{ + self endon("disconnect"); + self endon("death"); + + if(self getPlayerData("killstreaks", 0) == "airdrop_mega" && self getPlayerData("killstreaks", 1) == "nuke" && self getPlayerData("killstreaks", 2) == "none" && isSubStr(self.curClass, "custom") && level.killstreakRewards && getdvarint("scr_game_perks") && !self hasWeapon("onemanarmy_mp") && getDvarInt("scr_allowSpecialist")) + { + if(!isDefined(self.pers["specialist"]["class_num"]) || self.pers["specialist"]["class_num"] != self.class_num) + { + self initSpecialist();//init perks + } + self doSpecHUD();//show the HUD + self multiRoundFix();//give perks and stuff on start of new round + self thread specThink();//watches kills and gives bonus + } +} + +initSpecialist() +{ + self.pers["specialist"]["class_num"] = self.class_num; + + self.pers["specialist"]["perks"][0] = getRandomPerk( 0 ); + self.pers["specialist"]["perks"][1] = getRandomPerk( 1 ); + self.pers["specialist"]["perks"][2] = getRandomPerk( 2 ); + + while(self getPlayerData("customClasses", self.pers["specialist"]["class_num"], "perks", 1) == self.pers["specialist"]["perks"][0]) + { + self.pers["specialist"]["perks"][0] = getRandomPerk( 0 ); + } + while(self getPlayerData("customClasses", self.pers["specialist"]["class_num"], "perks", 2) == self.pers["specialist"]["perks"][1]) + { + self.pers["specialist"]["perks"][1] = getRandomPerk( 1 ); + } + while(self getPlayerData("customClasses", self.pers["specialist"]["class_num"], "perks", 3) == self.pers["specialist"]["perks"][2]) + { + self.pers["specialist"]["perks"][2] = getRandomPerk( 2 ); + } +} + +multiRoundFix() +{ + self.specialist_message_1=false; + self.specialist_message_2=false; + self.specialist_message_3=false; + self.specialist_message_4=false; + self.topStreak = 0; + hasHardline = self _hasPerk("specialty_hardline"); + for(i=0;i<=self.pers["cur_kill_streak"];i++) + { + if(hasHardline) + ii = i + 1; + else + ii = i; + + self.topStreak = i; + + switch(ii) + { + case 2: + self.specialist_message_1 = true; + self _setPerk(self.pers["specialist"]["perks"][0]); + upgrade = tablelookup( "mp/perktable.csv", 1, self.pers["specialist"]["perks"][0], 8 ); + if ( self isItemUnlocked( upgrade ) ) + self _setPerk( upgrade ); + + self.ksOneIcon.alpha = 1; + break; + case 4: + self.specialist_message_2 = true; + self _setPerk(self.pers["specialist"]["perks"][1]); + upgrade = tablelookup( "mp/perktable.csv", 1, self.pers["specialist"]["perks"][1], 8 ); + if ( self isItemUnlocked( upgrade ) ) + self _setPerk( upgrade ); + + self.ksTwoIcon.alpha = 1; + break; + case 6: + self.specialist_message_3 = true; + self _setPerk(self.pers["specialist"]["perks"][2]); + upgrade = tablelookup( "mp/perktable.csv", 1, self.pers["specialist"]["perks"][2], 8 ); + if ( self isItemUnlocked( upgrade ) ) + self _setPerk( upgrade ); + + self.ksThrIcon.alpha = 1; + break; + case 8: + self.specialist_message_4 = true; + self setAllPerks(); + self.ksForIcon.alpha = 1; + break; + } + } + self thread maps\mp\gametypes\_class::setKillstreaks( "nuke", "none", "none" );//update for hardline +} + +specThink() +{ + self endon("disconnect"); + self endon("death"); + self thread stopSpecialistPerkOnDeath(); + for(;;) + { + self waittill("killed_enemy"); + hasHardline = self _hasPerk("specialty_hardline"); + for(i=self.topStreak;i<=self.pers["cur_kill_streak"];i++) + { + if(hasHardline) + ii = i + 1; + else + ii = i; + + if(i > self.topStreak) + { + self.topStreak = i; + if(ii%2 == 0) + { + self thread maps\mp\gametypes\_rank::giveRankXP( "specialist_bonus", 50 ); + + if(!level.hardcoreMode) + self thread underScorePopup("Specialist Bonus!", (1, 1, 0.5), 0); + } + } + switch(ii) + { + case 2: + if(!self.specialist_message_1) + { + self.specialist_message_1=true; + self.ksOneIcon.alpha = 1; + self Specialist( self.SpeicliastPerk1S, GetGoodColor(), self.SpecialistPerk1M, self.SpecialistPerk1D, self.pers["specialist"]["perks"][0] ); + self notify( "received_earned_killstreak" ); + } + break; + case 4: + if(!self.specialist_message_2) + { + self.specialist_message_2=true; + self.ksTwoIcon.alpha = 1; + self Specialist( self.SpeicliastPerk2S, GetGoodColor(), self.SpecialistPerk2M, self.SpecialistPerk2D, self.pers["specialist"]["perks"][1] ); + self notify( "received_earned_killstreak" ); + } + break; + case 6: + if(!self.specialist_message_3) + { + self.specialist_message_3=true; + self.ksThrIcon.alpha = 1; + self Specialist( self.SpeicliastPerk3S, GetGoodColor(), self.SpecialistPerk3M, self.SpecialistPerk3D, self.pers["specialist"]["perks"][2] ); + self notify( "received_earned_killstreak" ); + } + break; + case 8: + if(!self.specialist_message_4) + { + self.specialist_message_4=true; + self.ksForIcon.alpha = 1; + self setAllPerks(); + upgrade = tablelookup( "mp/perktable.csv", 1, "specialty_onemanarmy", 8 ); + if ( self isItemUnlocked( upgrade ) ) + self Specialist( "Specialist Bonus", GetGoodColor(), "specialty_onemanarmy_upgrade", "Received all Perks!" ); + else + self Specialist( "Specialist Bonus", GetGoodColor(), "specialty_onemanarmy", "Received all Perks!" ); + + self notify( "received_earned_killstreak" ); + } + break; + } + } + self thread maps\mp\gametypes\_class::setKillstreaks( "nuke", "none", "none" );//update for hardline + } +} + +stopSpecialistPerkOnDeath() +{ + self endon("disconnect"); + self waittill("death"); + self player_recoilScaleOn( 1 ); + self player_recoilScaleOff(); +} + +//spec fuctions - mainly from Intricate +preCache() +{ + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_scavenger", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_fastreload", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_marathon", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_bulletdamage", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_lightweight", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_coldblooded", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_explosivedamage", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_hardline", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_bulletaccuracy", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_heartbreaker", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_detectexplosive", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_extendedmelee", 8 ))); + PrecacheShader(getPerkMaterial(tablelookup( "mp/perktable.csv", 1, "specialty_localjammer", 8 ))); + PrecacheShader(getPerkMaterial("specialty_scavenger")); + PrecacheShader(getPerkMaterial("specialty_fastreload")); + PrecacheShader(getPerkMaterial("specialty_marathon")); + PrecacheShader(getPerkMaterial("specialty_bulletdamage")); + PrecacheShader(getPerkMaterial("specialty_lightweight")); + PrecacheShader(getPerkMaterial("specialty_coldblooded")); + PrecacheShader(getPerkMaterial("specialty_explosivedamage")); + PrecacheShader(getPerkMaterial("specialty_hardline")); + PrecacheShader(getPerkMaterial("specialty_bulletaccuracy")); + PrecacheShader(getPerkMaterial("specialty_heartbreaker")); + PrecacheShader(getPerkMaterial("specialty_detectexplosive")); + PrecacheShader(getPerkMaterial("specialty_extendedmelee")); + PrecacheShader(getPerkMaterial("specialty_localjammer")); + PrecacheShader("specialty_onemanarmy"); + PrecacheShader("specialty_onemanarmy_upgrade"); + + //Strings + PrecacheString( &"PERKS_MARATHON" ); + PrecacheString( &"PERKS_SLEIGHT_OF_HAND" ); + PrecacheString( &"PERKS_SCAVENGER" ); + //-- + PrecacheString( &"PERKS_STOPPING_POWER" ); + PrecacheString( &"PERKS_LIGHTWEIGHT" ); + PrecacheString( &"PERKS_COLDBLOODED" ); + PrecacheString( &"PERKS_DANGERCLOSE" ); + PrecacheString( &"PERKS_HARDLINE" ); + //-- + PrecacheString( &"PERKS_EXTENDEDMELEE" ); + PrecacheString( &"PERKS_STEADY_AIM" ); + PrecacheString( &"PERKS_LOCALJAMMER" ); + PrecacheString( &"PERKS_BOMB_SQUAD" ); + PrecacheString( &"PERKS_NINJA" ); + //Description + PrecacheString( &"PERKS_DESC_MARATHON" ); + PrecacheString( &"PERKS_FASTER_RELOADING" ); + PrecacheString( &"PERKS_DESC_SCAVENGER" ); + //-- + PrecacheString( &"PERKS_INCREASED_BULLET_DAMAGE" ); + PrecacheString( &"PERKS_DESC_LIGHTWEIGHT" ); + PrecacheString( &"PERKS_DESC_COLDBLOODED" ); + PrecacheString( &"PERKS_HIGHER_EXPLOSIVE_WEAPON" ); + PrecacheString( &"PERKS_DESC_HARDLINE" ); + //-- + PrecacheString( &"PERKS_DESC_EXTENDEDMELEE" ); + PrecacheString( &"PERKS_INCREASED_HIPFIRE_ACCURACY" ); + PrecacheString( &"PERKS_DESC_LOCALJAMMER" ); + PrecacheString( &"PERKS_ABILITY_TO_SEEK_OUT_ENEMY" ); + PrecacheString( &"PERKS_DESC_HEARTBREAKER" ); +} + +doSpecHUD() +{ + upgrade = tablelookup( "mp/perktable.csv", 1, self.pers["specialist"]["perks"][0], 8 ); + if ( self isItemUnlocked( upgrade ) ) + { + self.SpecialistPerk1M = getPerkMaterial( upgrade ); + } + else + { + self.SpecialistPerk1M = getPerkMaterial( self.pers["specialist"]["perks"][0] ); + } + + upgrade = tablelookup( "mp/perktable.csv", 1, self.pers["specialist"]["perks"][1], 8 ); + if ( self isItemUnlocked( upgrade ) ) + { + self.SpecialistPerk2M = getPerkMaterial( upgrade ); + } + else + { + self.SpecialistPerk2M = getPerkMaterial( self.pers["specialist"]["perks"][1] ); + } + + upgrade = tablelookup( "mp/perktable.csv", 1, self.pers["specialist"]["perks"][2], 8 ); + if ( self isItemUnlocked( upgrade ) ) + { + self.SpecialistPerk3M = getPerkMaterial( upgrade ); + } + else + { + self.SpecialistPerk3M = getPerkMaterial( self.pers["specialist"]["perks"][2] ); + } + //-- + self.SpeicliastPerk1S = getPerkString( self.pers["specialist"]["perks"][0] ); + self.SpeicliastPerk2S = getPerkString( self.pers["specialist"]["perks"][1] ); + self.SpeicliastPerk3S = getPerkString( self.pers["specialist"]["perks"][2] ); + //-- + self.SpecialistPerk1D = getPerkDescription( self.pers["specialist"]["perks"][0] ); + self.SpecialistPerk2D = getPerkDescription( self.pers["specialist"]["perks"][1] ); + self.SpecialistPerk3D = getPerkDescription( self.pers["specialist"]["perks"][2] ); + //Intricate - They're set so leggo. + if(!level.hardCoreMode) + { + self.ksOneIcon = createKSIcon( self.SpecialistPerk1M, -90 ); + self.ksTwoIcon = createKSIcon( self.SpecialistPerk2M, -115 ); + self.ksThrIcon = createKSIcon( self.SpecialistPerk3M, -140 ); + + upgrade = tablelookup( "mp/perktable.csv", 1, "specialty_onemanarmy", 8 ); + if ( self isItemUnlocked( upgrade ) ) + { + self.ksForIcon = createKSIcon( "specialty_onemanarmy_upgrade", -165 ); + } + else + { + self.ksForIcon = createKSIcon( "specialty_onemanarmy", -165 ); + } + } + + // Create the under score popup element + self.mw3_scorePopup = newClientHudElem( self ); + self.mw3_scorePopup.horzAlign = "center"; + self.mw3_scorePopup.vertAlign = "middle"; + self.mw3_scorePopup.alignX = "center"; + self.mw3_scorePopup.alignY = "middle"; + self.mw3_scorePopup.x = 35; + self.mw3_scorePopup.y = -48; + self.mw3_scorePopup.font = "hudbig"; + self.mw3_scorePopup.fontscale = 0.65; + self.mw3_scorePopup.archived = false; + self.mw3_scorePopup.color = (0.5, 0.5, 0.5); + self.mw3_scorePopup.sort = 10000; + + self thread destorySpecHudOnEnd(); +} + +destorySpecHudOnEnd() +{ + self waittill_either("death", "disconnect"); + + self.ksOneIcon.alpha = 0; + self.ksTwoIcon.alpha = 0; + self.ksThrIcon.alpha = 0; + self.ksForIcon.alpha = 0; + self.ksForIcon destroy(); + self.ksThrIcon destroy(); + self.ksTwoIcon destroy(); + self.ksOneIcon destroy(); + + self.mw3_scorePopup.alpha = 0; + self.mw3_scorePopup destroy(); +} + +Specialist( text, glowColor, shader, description, perk ) +{ + //Intricate - Well since we have for the 8th kill SetAllPerks, I couldn't make a big ass line. + //So instead we'll add an extra property to see if we have a perk to be set. + if( isDefined( perk ) ) + { + self _setPerk( perk ); + upgrade = tablelookup( "mp/perktable.csv", 1, perk, 8 ); + if ( self isItemUnlocked( upgrade ) ) + self _setPerk( upgrade ); + } + + notifyData = spawnStruct(); + + notifyData.glowColor = glowColor; + notifyData.hideWhenInMenu = false; + notifyData.titleText = text; + notifyData.notifyText = description; + notifyData.iconName = shader; + notifyData.sound = "mp_bonus_start"; + + self thread maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); +} + +underScorePopup(string, hudColor, glowAlpha) +{ + // Display text under the score popup + self endon( "disconnect" ); + + if ( string == "" ) + return; + + self notify( "underScorePopup" ); + self endon( "underScorePopup" ); + + self.mw3_scorePopup.color = hudColor; + self.mw3_scorePopup.glowColor = hudColor; + self.mw3_scorePopup.glowAlpha = glowAlpha; + + self.mw3_scorePopup setText(string); + self.mw3_scorePopup.alpha = 0.85; + + wait 1.0; + + self.mw3_scorePopup fadeOverTime( 0.75 ); + self.mw3_scorePopup.alpha = 0; +} + +setAllPerks() +{ + self _setPerk("specialty_marathon"); + if ( self isItemUnlocked( "specialty_fastmantle" ) ) + self _setPerk("specialty_fastmantle"); + + self _setPerk("specialty_fastreload"); + if ( self isItemUnlocked( "specialty_quickdraw" ) ) + self _setPerk("specialty_quickdraw"); + + self _setPerk("specialty_lightweight"); + if ( self isItemUnlocked( "specialty_fastsprintrecovery" ) ) + self _setPerk("specialty_fastsprintrecovery"); + + self _setPerk("specialty_bulletdamage"); + if ( self isItemUnlocked( "specialty_armorpiercing" ) ) + self _setPerk("specialty_armorpiercing"); + + self _setPerk("specialty_coldblooded"); + if ( self isItemUnlocked( "specialty_spygame" ) ) + self _setPerk("specialty_spygame"); + + self _setPerk("specialty_explosivedamage"); + if ( self isItemUnlocked( "specialty_dangerclose" ) ) + self _setPerk("specialty_dangerclose"); + + self _setPerk("specialty_extendedmelee"); + if ( self isItemUnlocked( "specialty_falldamage" ) ) + self _setPerk("specialty_falldamage"); + + self _setPerk("specialty_bulletaccuracy"); + if ( self isItemUnlocked( "specialty_holdbreath" ) ) + self _setPerk("specialty_holdbreath"); + + self _setPerk("specialty_heartbreaker"); + if ( self isItemUnlocked( "specialty_quieter" ) ) + self _setPerk("specialty_quieter"); + + self _setPerk("specialty_detectexplosive"); + if ( self isItemUnlocked( "specialty_selectivehearing" ) ) + self _setPerk("specialty_selectivehearing"); + + if ( self isItemUnlocked( "specialty_delaymine" ) ) + self _setPerk("specialty_delaymine");//stalker + + self _setPerk("specialty_hardline");//no oma, scav pro, laststand (pro), or scramb for less annoyance + if ( self isItemUnlocked( "specialty_rollover" ) ) + self _setPerk("specialty_rollover");//jugs + + self _setPerk("specialty_scavenger"); + + if ( self isItemUnlocked( "specialty_secondarybling" ) ) + self _setPerk("specialty_secondarybling");//no flinch + + self player_recoilScaleOn(0.75);//recoil prof +} + +getRandomPerk( type ) +{ + perks = []; + //Intricate - Much thanks to master131 for showing me arrary's & strTok. + perks[perks.size] = strTok("specialty_scavenger,specialty_fastreload,specialty_marathon", ","); + perks[perks.size] = strTok("specialty_bulletdamage,specialty_lightweight,specialty_coldblooded,specialty_explosivedamage,specialty_hardline", ","); + perks[perks.size] = strTok("specialty_bulletaccuracy,specialty_heartbreaker,specialty_detectexplosive,specialty_extendedmelee,specialty_localjammer", ","); + + return perks[type][randomInt(perks[type].size)]; +} + +getPerkDescription( perk ) +{ + //Intricate - Thanks to EMZ for the Black Ops variant, changed for MW2. + //Intricate - This function gives the STRING for the PERK DESCRIPTION. + return tableLookUpIString( "mp/perkTable.csv", 1, perk, 4 ); +} + +getPerkMaterial( perk ) +{ + //Intricate - Thanks to EMZ for the Black Ops variant, changed for MW2. + //Intricate - This function gives the MATERIAL for the PERK. (Most of the time in MW2 the name of the perk = shader but other times it's not.) + return tableLookUp( "mp/perkTable.csv", 1, perk, 3 ); +} + +getPerkString( perk ) +{ + //Intricate - Thanks to EMZ for the Black Ops variant, changed for MW2. + //Intricate - This function gives the STRING for the PERK. + return tableLookUpIString( "mp/perkTable.csv", 1, perk, 2 ); +} + +getGoodColor() +{ + color = []; + //Intricate - This is momo5502's code, rather interesting way too :D. + for( i = 0; i < 3; i++ ) + { + color[i] = randomint( 2 ); + } + + if( color[0] == color[1] && color[1] == color[2] ) + { + rand = randomint(3); + color[rand] += 1; + color[rand] %= 2; + } + + return ( color[0], color[1], color[2] ); +} + +createKSIcon( ksShader, y ) +{ + ksIcon = createIcon( ksShader, 20, 20 ); + ksIcon setPoint( "BOTTOM RIGHT", "BOTTOM RIGHT", -32, y ); + ksIcon.alpha = 0.5; + ksIcon.hideWhenInMenu = true; + ksIcon.foreground = true; + return ksIcon; +} \ No newline at end of file