-- Shared, server-authoritative progression configuration. -- Prices and rewards are only acted upon by sv_progression.lua. Clients receive -- this file so the shop can render the same catalogue without duplicating it. CustomCoopProgression = CustomCoopProgression or {} local Progression = CustomCoopProgression Progression.KillReward = 1 Progression.DeathCreditCost = 5 Progression.DefaultModelID = "kleiner" Progression.DefaultWeaponID = "none" Progression.Ranks = { { score = 0, name = "Newbie" }, { score = 10, name = "Survivor" }, { score = 50, name = "Hunter" }, { score = 150, name = "Slayer" }, { score = 500, name = "Veteran" }, { score = 1500, name = "Exterminator" }, { score = 5000, name = "Legend" } } Progression.Models = { { id = "kleiner", name = "Dr. Kleiner", model = "models/player/kleiner.mdl", price = 0, description = "The free default model." }, { id = "male_citizen", name = "Male Citizen", model = "models/player/group01/male_07.mdl", price = 5, description = "A survivor from City 17." }, { id = "female_citizen", name = "Female Citizen", model = "models/player/group01/female_04.mdl", price = 5, description = "A survivor from City 17." }, { id = "barney", name = "Barney Calhoun", model = "models/player/barney.mdl", price = 10, description = "Civil Protection's least loyal officer." }, { id = "alyx", name = "Alyx Vance", model = "models/player/alyx.mdl", price = 15, description = "Resistance fighter and engineer." }, { id = "monk", name = "Father Grigori", model = "models/player/monk.mdl", price = 25, description = "A familiar face from Ravenholm." }, { id = "combine", name = "Combine Soldier", model = "models/player/combine_soldier.mdl", price = 50, description = "Standard Combine infantry." }, { id = "combine_elite", name = "Combine Elite", model = "models/player/combine_super_soldier.mdl", price = 100, description = "An elite Overwatch soldier." } } Progression.Weapons = { { id = "none", name = "No Bonus Weapon", weaponClass = "", price = 0, description = "Use only weapons supplied by the map." }, { id = "glock", name = "Glock", weaponClass = "coop_glock", price = 15, description = "A reliable permanent sidearm unlock." }, { id = "mp5", name = "MP5", weaponClass = "coop_mp5", price = 40, description = "A permanent compact SMG unlock." }, { id = "pumpshotgun", name = "Pump Shotgun", weaponClass = "coop_pumpshotgun", price = 75, description = "A permanent close-range weapon unlock." }, { id = "m4", name = "M4", weaponClass = "coop_m4", price = 125, description = "A permanent rifle unlock." }, { id = "nyan_gun", name = "Nyan Gun", weaponClass = "weapon_nyangun", price = 1000, description = "Rainbows, music and extremely colourful destruction." }, { id = "lightsaber", name = "Lightsaber", weaponClass = "weapon_lightsaber", price = 1000, description = "A permanent weapon from a galaxy far, far away." }, { id = "orbital_friendship_cannon", name = "Orbital Friendship Cannon", weaponClass = "orbital_friendship_cannon", price = 5000, description = "Deliver friendship from orbit." }, { id = "sexyness", name = "Sexyness (2-bit)", weaponClass = "pist_weagon", price = 100000, description = "The absurdly powerful Ultimate Admin Gun." } } -- Only these combat NPC classes award points. Keeping an allow-list avoids -- rewards for friendly citizens, scripted targets and manually invented entity -- classes. Add a class here if a future coop map uses another real monster. Progression.MonsterClasses = { npc_advisor = true, npc_antlion = true, npc_antlionguard = true, npc_antlion_worker = true, npc_barnacle = true, npc_clawscanner = true, npc_combine_s = true, npc_combinedropship = true, npc_combinegunship = true, npc_cscanner = true, npc_fastzombie = true, npc_fastzombie_torso = true, npc_headcrab = true, npc_headcrab_black = true, npc_headcrab_fast = true, npc_headcrab_poison = true, npc_helicopter = true, npc_hunter = true, npc_manhack = true, npc_metropolice = true, npc_poisonzombie = true, npc_rollermine = true, npc_sniper = true, npc_stalker = true, npc_strider = true, npc_turret_ceiling = true, npc_turret_floor = true, npc_turret_ground = true, npc_vortigaunt = true, npc_zombie = true, npc_zombie_torso = true, npc_zombine = true, monster_alien_controller = true, monster_alien_grunt = true, monster_alien_slave = true, monster_apache = true, monster_barnacle = true, monster_bigmomma = true, monster_bullchicken = true, monster_gargantua = true, monster_headcrab = true, monster_houndeye = true, monster_human_assassin = true, monster_human_grunt = true, monster_ichthyosaur = true, monster_leech = true, monster_nihilanth = true, monster_osprey = true, monster_snark = true, monster_tentacle = true, monster_zombie = true } local function FindByID(items, id) for _, item in ipairs(items) do if item.id == id then return item end end end function Progression.GetModel(id) return FindByID(Progression.Models, id) end function Progression.GetWeapon(id) return FindByID(Progression.Weapons, id) end function Progression.GetRank(score) local result = Progression.Ranks[1].name score = math.max(tonumber(score) or 0, 0) for _, rank in ipairs(Progression.Ranks) do if score < rank.score then break end result = rank.name end return result end