using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; using Agents; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using BepInEx.Unity.IL2CPP.Utils.Collections; using CellMenu; using EndskApi.Api; using EndskApi.Enums.Menus; using EndskApi.Information.EnemyKill; using EndskApi.Information.Menus; using EndskApi.Manager; using EndskApi.Scripts; using Enemies; using FloatingTextAPI; using GTFO.API; using GTFuckingXP.Communication; using GTFuckingXP.Dependencies; using GTFuckingXP.Enums; using GTFuckingXP.Extensions; using GTFuckingXP.Extensions.Information; using GTFuckingXP.Extensions.Information.Level.Json; using GTFuckingXP.Information; using GTFuckingXP.Information.ClassSelector; using GTFuckingXP.Information.Enemies; using GTFuckingXP.Information.Level; using GTFuckingXP.Information.NetworkingInfo; using GTFuckingXP.Managers; using GTFuckingXP.Patches; using GTFuckingXP.Patches.SelectLevelPatches; using GTFuckingXP.Scripts; using GTFuckingXp.Managers; using GTFuckingXp.Patches; using GameData; using Gear; using HarmonyLib; using Il2CppInterop.Runtime.Attributes; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Localization; using MTFO.API; using MTFO.Ext.PartialData; using Microsoft.CodeAnalysis; using ModifierAPI; using Player; using SNetwork; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("GTFuckingXP")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+git069de0e-dirty-master.069de0e831e139cf3e8d6591f4787fd8c341842b")] [assembly: AssemblyProduct("GTFuckingXP")] [assembly: AssemblyTitle("GTFuckingXP")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace GTFuckingXp.Patches { [HarmonyPatch(typeof(Dam_EnemyDamageLimb))] public static class EnemyDamageLimbPatches { [HarmonyPatch("MeleeDamage")] [HarmonyPrefix] public static void MeleePrefix(Dam_EnemyDamageLimb __instance, ref float dam, Agent sourceAgent) { if (((Agent)__instance.m_base.Owner).Alive && (Object)(object)sourceAgent != (Object)null && sourceAgent.IsLocallyOwned) { float num = dam; LogManager.Debug($"Melee damage from local player registered. {num} was scaled up to:"); num *= CacheApiWrapper.GetActiveLevel().MeleeDamageMultiplier; LogManager.Debug($"{num}"); dam = num; } } [HarmonyPatch("BulletDamage")] [HarmonyPrefix] public static void BulletPostfix(Dam_EnemyDamageLimb __instance, ref float dam, Agent sourceAgent) { if (((Agent)__instance.m_base.Owner).Alive && (Object)(object)sourceAgent != (Object)null && sourceAgent.IsLocallyOwned && !SentryGunCheckPatches.SentryShot) { float num = dam; LogManager.Debug($"Bullet damage from local player registered. {num} was scaled to:"); num *= CacheApiWrapper.GetActiveLevel().WeaponDamageMultiplier; LogManager.Debug($"{num}"); dam = num; } } } [HarmonyPatch] internal static class PlayerDamagePatches { [HarmonyPatch(typeof(Dam_PlayerDamageLimb), "BulletDamage")] [HarmonyPrefix] private static void Prefix_BulletDamage(Dam_PlayerDamageLimb __instance, ref float dam, Agent sourceAgent) { PlayerAgent owner = __instance.m_base.Owner; if (((Agent)owner).Alive && CacheApiWrapper.TryGetActiveLevel(owner, out Level level)) { if (level.CustomScaling.TryGetValue(CustomScaling.BulletResistance, out var value)) { dam *= 2f - value; } if (((Agent)owner).IsLocallyOwned && !SentryGunCheckPatches.SentryShot) { float num = dam; LogManager.Debug($"Bullet damage from local player registered. {num} was scaled up to:"); num *= level.WeaponDamageMultiplier; LogManager.Debug($"{num}"); dam = num; } } } [HarmonyPatch(typeof(Dam_SyncedDamageBase), "FireDamage")] [HarmonyPrefix] private static void Prefix_FireDamage(Dam_SyncedDamageBase __instance, ref float dam, Agent sourceAgent) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)__instance.DamageBaseOwner == 0) { PlayerAgent val = ((Il2CppObjectBase)__instance.GetBaseAgent()).Cast(); if (((Agent)val).Alive && ((Agent)val).IsLocallyOwned && CacheApiWrapper.GetActiveLevel().CustomScaling.TryGetValue(CustomScaling.BulletResistance, out var value)) { dam *= 2f - value; } } } [HarmonyPatch(typeof(Dam_SyncedDamageBase), "ExplosionDamage")] [HarmonyPrefix] private static void Prefix_ExplosionDamage(Dam_SyncedDamageBase __instance, ref float dam) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)__instance.DamageBaseOwner == 0 && CacheApiWrapper.TryGetActiveLevel(((Il2CppObjectBase)__instance.GetBaseAgent()).Cast(), out Level level) && level.CustomScaling.TryGetValue(CustomScaling.ExplosionResistance, out var value)) { dam *= 2f - value; } } } [HarmonyPatch(typeof(Dam_PlayerDamageBase))] internal static class PlayerRegenPatches { [HarmonyPatch("OnIncomingDamage")] [HarmonyPostfix] private static void Postfix_OnDamage(Dam_PlayerDamageBase __instance) { PlayerAgent owner = __instance.Owner; if (CacheApiWrapper.TryGetActiveLevel(owner, out Level level) && level.CustomScaling.TryGetValue(CustomScaling.RegenStartDelayMultiplier, out var value)) { __instance.m_nextRegen = Clock.Time + owner.PlayerData.healthRegenStartDelayAfterDamage * value; } } } [HarmonyPatch(typeof(BulletWeapon))] internal static class SentryGunCheckPatches { internal static bool SentryShot { get; private set; } [HarmonyPatch("BulletHit")] [HarmonyBefore(new string[] { "Dinorush.ExtraWeaponCustomization" })] [HarmonyPrefix] private static void Prefix_BulletHit(ref WeaponHitData weaponRayData, bool allowDirectionalBonus) { if (!allowDirectionalBonus || weaponRayData.vfxBulletHit != null) { SentryShot = true; } } [HarmonyPatch("BulletHit")] [HarmonyPostfix] private static void Postfix_BulletHit() { SentryShot = false; } } } namespace GTFuckingXp.Managers { public static class EnemyKillManager { public static void Setup() { EnemyKillApi.AddEnemyKilledCallback((Action)EnemyKilled); } public static void EnemyKilled(EnemyKillDistribution info) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)info.LastHitDealtBy == (Object)null) { GiveXpToEveryone(info.KilledEnemyAgent); return; } EnemyXp enemyXp = GetEnemyXp(info.KilledEnemyAgent); Vector3 position = info.KilledEnemyAgent.Position; position.y += 1f; Enumerator enumerator = SNet.LobbyPlayers.GetEnumerator(); XpHandler xpHandler = default(XpHandler); while (enumerator.MoveNext()) { SNet_Player current = enumerator.Current; if (!((Object)(object)current != (Object)null) || current.IsBot) { continue; } if (info.LastHitDealtBy.Owner.PlayerSlot.index == current.PlayerSlot.index) { if (current.IsLocal) { if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { PlayerReviveManager.AddXP(current.Lookup, ((IXpData)enemyXp).GetXp(isDebuff: false)); xpHandler.AddXp(enemyXp, position); } } else { NetworkApiXpManager.SendReceiveXp(current, enemyXp, position, forceDebuffXp: false); } continue; } float damageDealtBySnet = info.GetDamageDealtBySnet(current); float healthMax = ((Dam_SyncedDamageBase)info.KilledEnemyAgent.Damage).HealthMax; float num = damageDealtBySnet / healthMax; bool flag = info.DidSnetBiotag(current); if (flag) { float biotagXpFrac = enemyXp.BiotagXpFrac; if (biotagXpFrac < 0f) { biotagXpFrac = CacheApiWrapper.GetGlobalValues().BiotagXpFrac; } num = Math.Max(num, biotagXpFrac); flag = biotagXpFrac > 0f; } if (damageDealtBySnet > 0.5f || flag) { LogManager.Debug($"percentageDealt = {num}, damageDealt = {damageDealtBySnet}"); NetworkApiXpManager.SendStaticXpInfo(current, (int)((float)enemyXp.XpGain * num), (int)((float)enemyXp.DebuffXp * num), (int)((float)enemyXp.LevelScalingXpDecrese * num), position); } } } private static void GiveXpToEveryone(EnemyAgent killedEnemy) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) EnemyXp enemyXp = GetEnemyXp(killedEnemy); Vector3 position = killedEnemy.Position; position.y += 1f; XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { xpHandler.AddXp(enemyXp, position, forceDebuffXp: true, "<#F30>"); } NetworkApiXpManager.SendHalfAssedXp(enemyXp, position, forceDebuffXp: true); } private static EnemyXp GetEnemyXp(EnemyAgent killedEnemy) { EnemyAgent killedEnemy2 = killedEnemy; List instance = CacheApi.GetInstance>("GTF_XP"); EnemyXp enemyXp = instance.FirstOrDefault((EnemyXp it) => it.EnemyId == killedEnemy2.EnemyDataID); if (enemyXp == null) { LogManager.Warn($"There was no enemy XP data found for {killedEnemy2.EnemyDataID}!"); enemyXp = new EnemyXp(killedEnemy2.EnemyDataID, ((Object)killedEnemy2).name, 0, 0, 0); instance.Add(enemyXp); CacheApi.SaveInstance>(instance, "GTF_XP"); } LogManager.Debug($"Enemy kill was registered. Enemy XpData was {enemyXp.XpGain}."); return enemyXp; } } } namespace GTFuckingXp.Information { public class DefaultConstants { public const string DoubleJumpExpansion = "[\r\n {\r\n \"LevelLayoutPersistentId\": 13,\r\n \"UnlockAtLevel\": 10,\r\n \"DoubleJumpConfig\": null\r\n },\r\n {\r\n \"LevelLayoutPersistentId\": 14,\r\n \"UnlockAtLevel\": 6,\r\n \"DoubleJumpConfig\": null\r\n },\r\n {\r\n \"LevelLayoutPersistentId\": 7,\r\n \"UnlockAtLevel\": 5,\r\n \"DoubleJumpConfig\": null\r\n },\r\n {\r\n \"LevelLayoutPersistentId\": 8,\r\n \"UnlockAtLevel\": 5,\r\n \"DoubleJumpConfig\": null\r\n },\r\n {\r\n \"LevelLayoutPersistentId\": 15,\r\n \"UnlockAtLevel\": 5,\r\n \"DoubleJumpConfig\": null\r\n }\r\n]"; public const string ExpansionsActive = "\r\n{\r\n \"ExplosionAbility\": false,\r\n \"DoubleJumpAbility\": true\r\n}\r\n"; public const string BoosterEffects = "\r\n[\r\n {\r\n \"ClassLayoutPersistentId\": 2,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.03,\r\n \"ProjectileResistance\": 1.03,\r\n \"InfectionResistance\": 1.03\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.06,\r\n \"InfectionResistance\": 1.06\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.09,\r\n \"ProjectileResistance\": 1.09,\r\n \"InfectionResistance\": 1.09\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.15,\r\n \"ProjectileResistance\": 1.15,\r\n \"InfectionResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.18,\r\n \"InfectionResistance\": 1.18\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.21,\r\n \"ProjectileResistance\": 1.21,\r\n \"InfectionResistance\": 1.21\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.24,\r\n \"ProjectileResistance\": 1.24,\r\n \"InfectionResistance\": 1.24\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.27,\r\n \"ProjectileResistance\": 1.27,\r\n \"InfectionResistance\": 1.27\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.3,\r\n \"ProjectileResistance\": 1.3,\r\n \"InfectionResistance\": 1.3\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 11\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.33,\r\n \"ProjectileResistance\": 1.33,\r\n \"InfectionResistance\": 1.33\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 12\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.36,\r\n \"ProjectileResistance\": 1.36,\r\n \"InfectionResistance\": 1.36\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 13\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.39,\r\n \"ProjectileResistance\": 1.39,\r\n \"InfectionResistance\": 1.39\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 14\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.42,\r\n \"ProjectileResistance\": 1.42,\r\n \"InfectionResistance\": 1.42\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 15\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.45,\r\n \"ProjectileResistance\": 1.45,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35,\r\n \"ReviveSpeedSupport\": 1.25\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.7,\r\n \"ReviveSpeedSupport\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.05,\r\n \"ReviveSpeedSupport\": 1.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.40,\r\n \"ReviveSpeedSupport\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.75,\r\n \"ReviveSpeedSupport\": 2.25,\r\n \"MeleeResistance\": 1.15,\r\n \"ProjectileResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 15,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35,\r\n \"ReviveSpeedSupport\": 1.1,\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04,\r\n \"InfectionResistance\": 1.05\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.7,\r\n \"ReviveSpeedSupport\": 1.2,\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08,\r\n \"InfectionResistance\": 1.1\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.05,\r\n \"ReviveSpeedSupport\": 1.3,\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.40,\r\n \"ReviveSpeedSupport\": 1.4,\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16,\r\n \"InfectionResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.75,\r\n \"ReviveSpeedSupport\": 1.5,\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.55,\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"ComputerProcessingSpeed\": 1.2,\r\n \"FogRepellerEffect\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.1,\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"ComputerProcessingSpeed\": 1.4,\r\n \"FogRepellerEffect\": 1.4\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.65,\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"ComputerProcessingSpeed\": 1.6,\r\n \"FogRepellerEffect\": 1.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 3.2,\r\n \"ScannerRechargeSpeed\": 1.6,\r\n \"SentryGunDamage\": 1.6,\r\n \"GlueEfficiency\": 1.6,\r\n \"TripMineDamage\": 1.6,\r\n \"ComputerProcessingSpeed\": 1.8,\r\n \"FogRepellerEffect\": 1.8\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.8,\r\n \"SentryGunDamage\": 1.75,\r\n \"GlueEfficiency\": 1.75,\r\n \"TripMineDamage\": 1.75,\r\n \"ComputerProcessingSpeed\": 999.0,\r\n \"FogRepellerEffect\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.5,\r\n \"ProjectileResistance\": 0.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.5,\r\n \"MeleeResistance\": 0.46,\r\n \"ProjectileResistance\": 0.46\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.0,\r\n \"MeleeResistance\": 0.42,\r\n \"ProjectileResistance\": 0.42\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.5,\r\n \"MeleeResistance\": 0.38,\r\n \"ProjectileResistance\": 0.38\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 3.0,\r\n \"MeleeResistance\": 0.34,\r\n \"ProjectileResistance\": 0.34\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 3.5,\r\n \"MeleeResistance\": 0.3,\r\n \"ProjectileResistance\": 0.3\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 0\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.55,\r\n \"ProjectileResistance\": 0.55\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.6,\r\n \"ProjectileResistance\": 0.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.65,\r\n \"ProjectileResistance\": 0.65\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.7,\r\n \"ProjectileResistance\": 0.7\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.75,\r\n \"ProjectileResistance\": 0.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.8,\r\n \"ProjectileResistance\": 0.8\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 0\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.6,\r\n \"ProjectileResistance\": 0.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.63,\r\n \"ProjectileResistance\": 0.63\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.66,\r\n \"ProjectileResistance\": 0.66\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.69,\r\n \"ProjectileResistance\": 0.69\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.72,\r\n \"ProjectileResistance\": 0.72\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.75,\r\n \"ProjectileResistance\": 0.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.78,\r\n \"ProjectileResistance\": 0.78\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.81,\r\n \"ProjectileResistance\": 0.81\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.84,\r\n \"ProjectileResistance\": 0.84\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.87,\r\n \"ProjectileResistance\": 0.87\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.9,\r\n \"ProjectileResistance\": 0.9\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.02,\r\n \"ProjectileResistance\": 1.05,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.1,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.15,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.10,\r\n \"ProjectileResistance\": 1.25,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.3,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.14,\r\n \"ProjectileResistance\": 1.35,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.4,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.45,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 11\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.22,\r\n \"ProjectileResistance\": 1.55,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 12\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.24,\r\n \"ProjectileResistance\": 1.6,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 13\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.26,\r\n \"ProjectileResistance\": 1.65,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 14\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.28,\r\n \"ProjectileResistance\": 1.7,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 15\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.3,\r\n \"ProjectileResistance\": 1.75,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"FogRepellerEffect\": 1.6,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"FogRepellerEffect\": 2.2,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"FogRepellerEffect\": 2.8,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.6,\r\n \"SentryGunDamage\": 1.6,\r\n \"GlueEfficiency\": 1.6,\r\n \"TripMineDamage\": 1.6,\r\n \"FogRepellerEffect\": 3.4,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.75,\r\n \"GlueEfficiency\": 1.75,\r\n \"TripMineDamage\": 1.75,\r\n \"FogRepellerEffect\": 15.0,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.1,\r\n \"ScannerRechargeSpeed\": 1.05,\r\n \"SentryGunDamage\": 1.05,\r\n \"GlueEfficiency\": 1.05,\r\n \"TripMineDamage\": 1.05,\r\n \"ComputerProcessingSpeed\": 1.05,\r\n \"FogRepellerEffect\": 1.05,\r\n \"MeleeResistance\": 1.02,\r\n \"ProjectileResistance\": 1.02,\r\n \"InfectionResistance\": 1.02\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.2,\r\n \"ScannerRechargeSpeed\": 1.1,\r\n \"SentryGunDamage\": 1.1,\r\n \"GlueEfficiency\": 1.1,\r\n \"TripMineDamage\": 1.1,\r\n \"ComputerProcessingSpeed\": 1.1,\r\n \"FogRepellerEffect\": 1.1,\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04,\r\n \"InfectionResistance\": 1.04\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.3,\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"ComputerProcessingSpeed\": 1.15,\r\n \"FogRepellerEffect\": 1.15,\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.06,\r\n \"InfectionResistance\": 1.06\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.4,\r\n \"ScannerRechargeSpeed\": 1.2,\r\n \"SentryGunDamage\": 1.2,\r\n \"GlueEfficiency\": 1.2,\r\n \"TripMineDamage\": 1.2,\r\n \"ComputerProcessingSpeed\": 1.2,\r\n \"FogRepellerEffect\": 1.2,\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08,\r\n \"InfectionResistance\": 1.08\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.5,\r\n \"ScannerRechargeSpeed\": 1.25,\r\n \"SentryGunDamage\": 1.25,\r\n \"GlueEfficiency\": 1.25,\r\n \"TripMineDamage\": 1.25,\r\n \"ComputerProcessingSpeed\": 1.25,\r\n \"FogRepellerEffect\": 1.25,\r\n \"MeleeResistance\": 1.1,\r\n \"ProjectileResistance\": 1.1,\r\n \"InfectionResistance\": 1.1\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.6,\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"ComputerProcessingSpeed\": 1.3,\r\n \"FogRepellerEffect\": 1.3,\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.7,\r\n \"ScannerRechargeSpeed\": 1.35,\r\n \"SentryGunDamage\": 1.35,\r\n \"GlueEfficiency\": 1.35,\r\n \"TripMineDamage\": 1.35,\r\n \"ComputerProcessingSpeed\": 1.35,\r\n \"FogRepellerEffect\": 1.35,\r\n \"MeleeResistance\": 1.14,\r\n \"ProjectileResistance\": 1.14,\r\n \"InfectionResistance\": 1.14\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.8,\r\n \"ScannerRechargeSpeed\": 1.4,\r\n \"SentryGunDamage\": 1.4,\r\n \"GlueEfficiency\": 1.4,\r\n \"TripMineDamage\": 1.4,\r\n \"ComputerProcessingSpeed\": 1.4,\r\n \"FogRepellerEffect\": 1.4,\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16,\r\n \"InfectionResistance\": 1.16\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.9,\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"ComputerProcessingSpeed\": 1.45,\r\n \"FogRepellerEffect\": 1.45,\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.18,\r\n \"InfectionResistance\": 1.18\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"ComputerProcessingSpeed\": 1.5,\r\n \"FogRepellerEffect\": 1.5,\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2.0,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2.0,\r\n \"RegenerationSpeed\": 3.5,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n }\r\n]\r\n"; public const string Groups = "\r\n[\r\n {\r\n \"PersistentId\": 0,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Combat\"\r\n },\r\n {\r\n \"PersistentId\": 1,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Survival\"\r\n },\r\n {\r\n \"PersistentId\": 2,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Utility\"\r\n },\r\n {\r\n \"PersistentId\": 3,\r\n \"VisibleForPlayerCount\": [\r\n 1\r\n ],\r\n \"Name\": \"Solo\"\r\n }\r\n]\r\n"; public const string ClassLayouts = "\r\n[\r\n {\r\n \"Header\": \"Generalist\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 13,\r\n \"InfoText\": \"Good at everything, best at nothing.\\nMax LV 10 Bonus: Double Jump\\n\\nBonuses Each LV up:\\n+2% Damage\\n+2% Armor\\n+2% Infection Resist\\n+10% Hack Skill\\n-5% Terminal Delay\\n+5% Tool Power\\n+5% Repeller Power\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\\n1% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 100% -> 102%\\nArmor 100% -> 102%\\nInfect Res. 0% -> 2%\\nHacking 100% - > 110%\\nTerminal Delay 100% -> 95%\\nTool Power 100% -> 105%\\nRepeller 100% -> 105%\\nSpeed 100% -> 101%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 300,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 102% -> 104%\\nArmor 102% -> 104%\\nInfect Res. 2% -> 4%\\nHacking 110% - > 120%\\nTerminal Delay 95% -> 90%\\nTool Power 105% -> 110%\\nRepeller 105% -> 110%\\nSpeed 101% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.02,\r\n \"WeaponDamageMultiplier\": 1.02,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.01\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 104% -> 106%\\nArmor 104% -> 106%\\nInfect Res. 4% -> 6%\\nHacking 120% - > 130%\\nTerminal Delay 90% -> 85%\\nTool Power 110% -> 115%\\nRepeller 110% -> 115%\\nSpeed 102% -> 103%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.04,\r\n \"WeaponDamageMultiplier\": 1.04,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 106% -> 108%\\nArmor 106% -> 108%\\nInfect Res. 6% -> 8%\\nHacking 130% - > 140%\\nTerminal Delay 85% -> 80%\\nTool Power 115% -> 120%\\nRepeller 115% -> 120%\\nSpeed 103% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.06,\r\n \"WeaponDamageMultiplier\": 1.06,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.03\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 108% -> 110%\\nArmor 108% -> 110%\\nInfect Res. 8% -> 10%\\nHacking 140% - > 150%\\nTerminal Delay 80% -> 75%\\nTool Power 120% > 125%\\nRepeller 120% -> 125%\\nSpeed 104% -> 105%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.08,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 3025,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 110% -> 112%\\nArmor 110% -> 112%\\nInfect Res. 10% -> 12%\\nHacking 150% -> 160%\\nTerminal Delay 75% -> 70%\\nTool Power 125% -> 130%\\nRepeller 125% -> 130%\\nSpeed 105% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.1,\r\n \"WeaponDamageMultiplier\": 1.1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.05\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3975,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 112% -> 114%\\nArmor 112% -> 114%\\nInfect Res. 12% -> 14%\\nHacking 160% -> 170%\\nTerminal Delay 70% -> 65%\\nTool Power 130% -> 135%\\nRepeller 130% -> 135%\\nSpeed 106% -> 107%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.12,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 5100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 114% -> 116%\\nArmor 114% -> 116%\\nInfect Res. 14% -> 16%\\nHacking 170% -> 180%\\nTerminal Delay 65% -> 60%\\nTool Power 135% -> 140%\\nRepeller 135% -> 140%\\nSpeed 107% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.14,\r\n \"WeaponDamageMultiplier\": 1.14,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.07\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 6300,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 116% -> 118%\\nArmor 116% -> 118%\\nInfect Res. 16% -> 18%\\nHacking 180% -> 190%\\nTerminal Delay 60% -> 55%\\nTool Power 140% -> 145%\\nRepeller 140% -> 145%\\nSpeed 108% -> 109%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.16,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 7575,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 118% -> 120%\\nArmor 118% -> 120%\\nInfect Res. 18% -> 20%\\nHacking 190% -> 200%\\nTerminal Delay 55% -> 50%\\nTool Power 145% -> 150%\\nRepeller 145% -> 150%\\nSpeed 109% -> 110%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.18,\r\n \"WeaponDamageMultiplier\": 1.18,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.09\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8925,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\n+Double Jump\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 120%\\nArmor 120%\\nInfect Res. 20%\\nHacking 200%\\nTerminal Delay 50%\\nTool Power 150%\\nRepeller 150%\\nSpeed 110%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.2,\r\n \"WeaponDamageMultiplier\": 1.2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Soldier\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 2,\r\n \"InfoText\": \"Specialized in ranged combat. Stronger guns with ammo refunds on each level up.\\nMax LV 10 bonus: +35% HP Regen Speed\\n\\nBonuses Each LV up:\\n+4% Gun Damage\\n+4% Ammo Refill\\n\\nBonus Each 5 LVs:\\n+6% Ammo Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.04,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 116% -> 120%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n10% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 120% -> 124%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.2,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.1\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 124% -> 128%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 128% -> 132%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.28,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 5700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 132% -> 136%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.32,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 6900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 136% -> 140%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.36,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8200,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +4%\\n10% Ammo Refill\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 140%\\nRegen Speed 135%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.4,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.1\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Marine\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 9,\r\n \"InfoText\": \"Specialized in ranged combat. Powerful weapons but with poor Armor.\\nStarting Debuff: -40% Armor\\nMax LV 10\\n\\nBonuses Each LV up:\\n+8% Gun Damage\\n+3% Armor\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 100% -> 108%\\nArmor 60% -> 63%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 85,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 108% -> 116%\\nArmor 63% -> 66%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 510,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 116% -> 124%\\nArmor 66% -> 69%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1020,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 124% -> 132%\\nArmor 69% -> 72%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1615,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 132% -> 140%\\nArmor 72% -> 75%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.32,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2295,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 140% -> 148%\\nArmor 75% -> 78%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.4,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3060,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 148% -> 156%\\nArmor 78% -> 81%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.48,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 3910,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 156% -> 164%\\nArmor 81% -> 84%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.56,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4845,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 164% -> 172%\\nArmor 84% -> 87%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.64,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5865,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 172% -> 180%\\nArmor 87% -> 90%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.72,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6970,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 180%\\nArmor 90%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.8,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Hunter\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 7,\r\n \"InfoText\": \"Specialized in melee combat. Deal high melee damage while gaining light Armor for survivability.\\nMax LV 5 bonus: Double Jump\\nLV 1 bonus: 125% Melee Damage\\n\\nBonuses Each LV up:\\n+4% Armor\\n+4% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 100% -> 225%\\nArmor 100% -> 104%\\nSpeed 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee +125%\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 104% -> 108%\\nSpeed 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 108% -> 112%\\nSpeed 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 112% -> 116%\\nSpeed 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 116% -> 120%\\nSpeed 116% -> 120%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +4%\\nSpeed +4%\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 120%\\nSpeed 120%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Assassin\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 8,\r\n \"InfoText\": \"Specialized in melee combat. Devastating in stealth and combat but with very poor survivability.\\nStarting Debuff: -45% Armor\\nMax LV 5 bonus: Double Jump\\nLV 1 bonus: 215% Melee Damage\\n\\nBonuses Each LV up:\\n+5% Armor\\n+4% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 100% -> 315%\\nArmor 55% -> 60%\\nSpeed 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.0\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee +215%\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 60% -> 65%\\nSpeed 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 65% -> 70%\\nSpeed 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 70% -> 75%\\nSpeed 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.12\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 75% -> 80%\\nSpeed 116% -> 120%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +5%\\nSpeed +4%\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 80%\\nSpeed 120%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Fighter\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 10,\r\n \"InfoText\": \"Specialized in general combat. Improved damage with all guns and melee.\\nMax LV 10\\n\\nBonuses Each LV up:\\n+3% Gun Damage\\n+6% Melee Damage\\n+1% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 100% -> 103%\\nMelee Damage 100% -> 106%\\nSpeed 100% -> 101%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +6%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 103% -> 106%\\nMelee Damage 106% -> 112%\\nSpeed 101% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.06,\r\n \"WeaponDamageMultiplier\": 1.03,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.01\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 106% -> 109%\\nMelee Damage 112% -> 118%\\nSpeed 102% -> 103%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.12,\r\n \"WeaponDamageMultiplier\": 1.06,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 109% -> 112%\\nMelee Damage 118% -> 124%\\nSpeed 103% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.18,\r\n \"WeaponDamageMultiplier\": 1.09,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.03\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 112% -> 115%\\nMelee Damage 124% -> 130%\\nSpeed 104% -> 105%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.24,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 115% -> 118%\\nMelee Damage 130% -> 136%\\nSpeed 105% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.3,\r\n \"WeaponDamageMultiplier\": 1.15,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.05\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 118% -> 121%\\nMelee Damage 136% -> 142%\\nSpeed 106% -> 107%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.36,\r\n \"WeaponDamageMultiplier\": 1.18,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 121% -> 124%\\nMelee Damage 142% -> 148%\\nSpeed 107% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.42,\r\n \"WeaponDamageMultiplier\": 1.21,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.07\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 5700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 124% -> 127%\\nMelee Damage 148% -> 154%\\nSpeed 108% -> 109%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.48,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 6900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 127% -> 130%\\nMelee Damage 154% -> 160%\\nSpeed 109% -> 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.54,\r\n \"WeaponDamageMultiplier\": 1.27,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.09\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8200,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 130%\\nMelee Damage 160%\\nSpeed 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.6,\r\n \"WeaponDamageMultiplier\": 1.3,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Survivalist\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 3,\r\n \"InfoText\": \"Increased odds of survival in extreme conditions. Endure any scenario.\\nMax LV 15 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+3% Armor\\n+3% Infect Resist\\n10% Heal\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 100% -> 103%\\nInfect Res. 0% -> 3%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 103% -> 106%\\nInfect Res. 0% -> 3%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 106% -> 109%\\nInfect Res. 3% -> 6%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 109% -> 112%\\nInfect Res. 6% -> 9%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 112% -> 115%\\nInfect Res. 9% -> 12%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2550,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 115% -> 118%\\nInfect Res. 12% -> 15%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3300, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 118% -> 121%\\nInfect Res. 15% -> 18%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4100, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 121% -> 124%\\nInfect Res. 18% -> 21%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4950, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 124% -> 127%\\nInfect Res. 21% -> 24%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 127% -> 130%\\nInfect Res. 24% -> 27%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 130% -> 133%\\nInfect Res. 27% -> 30%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 11,\r\n \"TotalXpRequired\": 7950,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 133% -> 136%\\nInfect Res. 30% -> 33%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 12,\r\n \"TotalXpRequired\": 9150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 136% -> 139%\\nInfect Res. 33% -> 36%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 13,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 139% -> 142%\\nInfect Res. 36% -> 39%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 14,\r\n \"TotalXpRequired\": 11850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 142% -> 145%\\nInfect Res. 39% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 15,\r\n \"TotalXpRequired\": 13350,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +3%\\nInfection Res. +61%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 145%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Outlander\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 11,\r\n \"InfoText\": \"Specialized for surviving on the run. Greatly improved Projectile Armor and Infect Resist.\\nMax LV 15\\nLV 1 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+2% Melee Armor\\n+5% Projectile Armor\\n10% Heal\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 100% -> 102%\\nProjectile Armor 100% -> 105%\\nInfect Res. 0% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 102% -> 104%\\nProjectile Armor 105% -> 110%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 104% -> 106%\\nProjectile Armor 110% -> 115%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 106% -> 108%\\nProjectile Armor 115% -> 120%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 108% -> 110%\\nProjectile Armor 120% -> 125%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2550,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 110% -> 112%\\nProjectile Armor 125% -> 130%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3300, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 112% -> 114%\\nProjectile Armor 130% -> 135%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4100, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 114% -> 116%\\nProjectile Armor 135% -> 140%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4950, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 116% -> 118%\\nProjectile Armor 140% -> 145%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 118% -> 120%\\nProjectile Armor 145% -> 150%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 120% -> 122%\\nProjectile Armor 150% -> 155%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 11,\r\n \"TotalXpRequired\": 7950,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 122% -> 124%\\nProjectile Armor 155% -> 160%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 12,\r\n \"TotalXpRequired\": 9150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 124% -> 126%\\nProjectile Armor 160% -> 165%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 13,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 126% -> 128%\\nProjectile Armor 165% -> 170%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 14,\r\n \"TotalXpRequired\": 11850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 128% -> 130%\\nProjectile Armor 170% -> 175%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 15,\r\n \"TotalXpRequired\": 13350,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 130%\\nProjectile Armor 175%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Doctor\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 4,\r\n \"InfoText\": \"Specialized in keeping the team alive. Ensures that the team recovers quickly in bad scenarios.\\nMax LV 5 bonus: +15% Armor\\n\\nBonuses Each LV up:\\n+25% Revive Speed\\n+35% HP Regen Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 4 -> 3.2 sec.\\nRegen Speed 100% -> 135%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.8 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 3.2 -> 2.7 sec.\\nRegen Speed 135% -> 170%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.5 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2.7 -> 2.3 sec.\\nRegen Speed 170% -> 205%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.4 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2.3 -> 2 sec.\\nRegen Speed 205% -> 240%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2 -> 1.8 sec.\\nRegen Speed 240% -> 275%\\nArmor 100% -> 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRevive -0.2 sec.\\nRegen Speed +35%\\nArmor +15%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 1.8 sec.\\nRegen Speed 275%\\nArmor 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Field Medic\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 12,\r\n \"InfoText\": \"Specialized in keeping the team alive. Great survivability and team support.\\nMax LV 5 Bonus: +50% Infect Resist\\n\\nBonuses Each LV up:\\n+10% Revive Speed\\n+35% HP Regen Speed\\n+4% Armor\\n+5% Infect Resist\\n+2% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 4 -> 3.6 sec.\\nRegen Speed 100% -> 135%\\nArmor 100% -> 104%\\nInfect Res. 0% -> 5%\\nSpeed 100% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.4 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3.6 -> 3.3 sec.\\nRegen Speed 135% -> 170%\\nArmor 104% -> 108%\\nInfect Res. 5% -> 10%\\nSpeed 102% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3.3 -> 3 sec.\\nRegen Speed 170% -> 205%\\nArmor 108% -> 112%\\nInfect Res. 10% -> 15%\\nSpeed 104% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3 -> 2.8 sec.\\nRegen Speed 205% -> 240%\\nArmor 112% -> 116%\\nInfect Res. 15% -> 20%\\nSpeed 106% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.2 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 2.8 -> 2.7 sec.\\nRegen Speed 240% -> 275%\\nArmor 116% -> 120%\\nInfect Res. 20% -> 75%\\nSpeed 108% -> 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRevive -0.1 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +55%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 2.7 sec.\\nRegen Speed 275%\\nArmor 120%\\nInfect Res. 75%\\nSpeed 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Trailblazer\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 15,\r\n \"InfoText\": \"Specialized in leaving everyone else in the dust. Superior mobility ensures survival when all else fails.\\nMax LV 5 Bonus: Infect Immune, Double Jump\\n\\nBonuses Each LV up:\\n+20% HP Regen Speed\\n+8% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 100% -> 120%\\nSpeed 100% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 120% -> 140%\\nSpeed 108% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 140% -> 160%\\nSpeed 116% -> 124%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 160% -> 180%\\nSpeed 124% -> 132%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.24\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 180% -> 200%\\nInfect Resist 0% -> Immune\\nSpeed 132% -> 140%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.32\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRegen Speed +20%\\nInfect Immune\\n+8% Speed\\nDouble Jump\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 200%\\nInfect Immune\\nSpeed 140%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.4\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Technician\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 5,\r\n \"InfoText\": \"Specialized in supporting the team and resourcing. Keeps the team informed in more scenarios.\\nMax LV 5 bonus: EZ Hack, Instant Terminals\\n\\nBonuses Each LV up:\\n+55% Hack Skill\\n-20% Terminal Delay\\n+15% Tool Power\\n+20% Repeller Power\\n+8% Tool Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 100% - > 155%\\nTerminal Delay 100% -> 80%\\nTool Power 100% -> 115%\\nRepeller 100% -> 120%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 400,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 155% - > 210%\\nTerminal Delay 80% -> 60%\\nTool Power 115% -> 130%\\nRepeller 120% -> 140%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1000,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 210% - > 265%\\nTerminal Delay 60% -> 40%\\nTool Power 130% -> 145%\\nRepeller 140% -> 160%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 265% - > 320%\\nTerminal Delay 40% -> 20%\\nTool Power 145% -> 160%\\nRepeller 160% -> 180%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 320% - > EZ\\nTerminal Delay 20% -> Instant\\nTool Power 160% > 175%\\nRepeller 180% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4000,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nEZ Hacking\\nInstant Terminal Delay\\n+15% Tool Power\\n+20% Repeller\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nEZ Hacking\\nInstant Terminals\\nTool Power 175%\\nRepeller 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Gas Breather\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 16,\r\n \"InfoText\": \"Specialized in traversing infectious environments. Utilizes heavily modified fog repellers to devastating effect.\\nMax LV 5 bonus: Global Fog Repeller\\nLV 1 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+15% Tool Power\\n+60% Repeller Power\\n+8% Tool Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 100% -> 115%\\nRepeller 100% -> 160%\\nInfect Resist 0% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 400,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 115% -> 130%\\nRepeller 160% -> 220%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1000,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 130% -> 145%\\nRepeller 220% -> 280%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 145% -> 160%\\nRepeller 280% -> 340%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 160% > 175%\\nRepeller 340% -> Global\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4000,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\n+15% Tool Power\\nGlobal Fog Repeller\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 175%\\nGlobal Fog Repeller\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Masochist\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 6,\r\n \"InfoText\": \"Specialized in suffering. Struggles for a long time, then becomes the strongest.\\nStarting Debuff: -50% Armor\\nMax LV 5 bonus: +80% Damage,\\n+50% Max HP +50% Med Eff.\\n\\nBonuses Each LV up:\\n-4% Armor\\n+50% HP Regen Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 50% -> 46%\\nRegen Speed 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 440,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 46% -> 42%\\nRegen Speed 150% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 42% -> 38%\\nRegen Speed 200% -> 250%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1980,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 38% -> 34%\\nRegen Speed 250% -> 300%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3080,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 34% -> 30%\\nRegen Speed 300% -> 0%\\nDamage 100% -> 180%\\nMax HP 20 -> 30\\nMed Eff. 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4400,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nDamage +80%\\nArmor -4%\\n+10 Max HP\\n+50% Med Eff.\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 30%\\nDamage 180%\\nMax HP +50%\\nMed Eff. 150%\",\r\n \"HealthMultiplier\": 1.5,\r\n \"MeleeDamageMultiplier\": 1.8,\r\n \"WeaponDamageMultiplier\": 1.8,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Isolated\",\r\n \"GroupPersistentId\": 3,\r\n \"PersistentId\": 14,\r\n \"InfoText\": \"You are the last alive. Stay alive at all costs and complete the mission.\\nLV 5 & Max LV 10 bonus: +40% Ammo Refill, +40% Tool Refill, +40% Heal\\n\\nPerks Each Level:\\nLV1: Speed Demon\\nLV2: Damage Amp\\nLV3: Endurance\\nLV4: Regeneration\\nLV5: Technician\\nLV6: Double Jump\\nLV7: +50% Bioscan Speed\\nLV8: Speed Demon II\\nLV9: Gas Breather\\nLV10: Godlike Regeneration\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 100% -> 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nSpeed +15%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 100% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nDamage +100%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 100% -> 150%\\nInfect Res. 0% -> 50%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +50%\\nInfect Res. +50%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 100% -> 200%\\nRegen Cap 25 -> 50\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +100%\\nRegen Cap +25\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 100% -> 150%\\nHacking 100% -> EZ\\nTerminal Delay 100% -> Instant\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+50% Tool Power\\nEZ Hack\\nInstant Terminals\\n40% Ammo Refill\\n40% Tool Refill\\n40% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.4\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 8050,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+50% Bioscan Speed\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115% -> 130%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 12850,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+15% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50% -> Immune\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 15250,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\nInfect Immune\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Immune\\nRegen Speed 200% -> 350%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 17650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGodlike Regeneration\\n40% Ammo Refill\\n40% Tool Refill\\n40% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Legendary\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Immune\\nRegen Speed 350%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.4\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n]\r\n"; } } namespace GTFuckingXP { [BepInPlugin("Endskill.GTFuckingXP", "GTFuckingXP", "2.7.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class BepInExLoader : BasePlugin { public const string MODNAME = "GTFuckingXP"; public const string AUTHOR = "Endskill"; public const string GUID = "Endskill.GTFuckingXP"; public const string VERSION = "2.7.0"; public static bool RundownDevMode { get; private set; } public static ConfigEntry DebugMessages { get; private set; } public static ConfigEntry LvlUpPopups { get; private set; } public static ConfigEntry XpPopups { get; private set; } public static ConfigEntry TermsOfUsage { get; internal set; } public static ConfigEntry ShowPlayerLevels { get; private set; } public static ConfigEntry LevelColor { get; internal set; } public static TermsOfUsage TermsOfUsageState { get; private set; } public static Harmony Harmony { get; private set; } public override void Load() { //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Expected O, but got Unknown RundownDevMode = ((BasePlugin)this).Config.Bind("Dev Settings", "RundownDev Mode", false, "This will activate the xp dev tool while in an expedition \nPress \"Delete\" to hide/show it").Value; DebugMessages = ((BasePlugin)this).Config.Bind("Dev Settings", "DebugMessages", false, "This settings activates/deactivates debug messages in the console for this specific plugin."); LvlUpPopups = ((BasePlugin)this).Config.Bind("Popups", "Lvl up popups", true, "If Lvl UP popups should be shown."); XpPopups = ((BasePlugin)this).Config.Bind("Popups", "XP gain popups", true, "If XP gain popups should be shown"); ShowPlayerLevels = ((BasePlugin)this).Config.Bind("Player Level Text", "Show Player Levels", true, "If levels should be shown above other players' names."); LevelColor = ((BasePlugin)this).Config.Bind("Player Level Text", "Level Text Color", "F80", "The color used for player levels."); TermsOfUsageState = GTFuckingXP.Information.TermsOfUsage.Declined; ClassInjector.RegisterTypeInIl2Cpp(); ClassInjector.RegisterTypeInIl2Cpp(); ClassInjector.RegisterTypeInIl2Cpp(); ClassInjector.RegisterTypeInIl2Cpp(); ScriptManager.Instance = new ScriptManager(); BoosterBuffManager.Instance = new BoosterBuffManager(); NetworkApiXpManager.Setup(); PlayerReviveManager.Init(); Harmony = new Harmony("Endskill.GTFuckingXP"); FasterPatching(); CacheApiWrapper.SetLvlUpCallBackList(new List>()); CacheApiWrapper.SetScriptsStartedCallBackList(new List>()); InitApi.AddInitCallback((Action)delegate { ScriptManager.Instance.Initialize(); }); } private void FasterPatching() { Harmony.PatchAll(typeof(PlayerLobbyBarPatches)); Harmony.PatchAll(typeof(GS_InLevelPatches)); Harmony.PatchAll(typeof(EnemyDamageLimbPatches)); Harmony.PatchAll(typeof(PlayerDamagePatches)); Harmony.PatchAll(typeof(SentryGunCheckPatches)); Harmony.PatchAll(typeof(SentryGunFiringPatches)); Harmony.PatchAll(typeof(GS_AfterLevelPatches)); if (ShowPlayerLevels.Value) { Harmony.PatchAll(typeof(PlaceNavMarkerOnGoPatches)); } Harmony.PatchAll(typeof(SnetSessionHubPatches)); Harmony.PatchAll(typeof(PlayerRegenPatches)); Harmony.PatchAll(typeof(FogTurbinePatches)); Harmony.PatchAll(typeof(PlayerAmmoPatches)); Harmony.PatchAll(typeof(PlayerRevivePatches)); AmmoFix.TryApplyPatches(Harmony); } private void TermsOfUsageChanged(object sender, EventArgs e) { LogManager.Debug("Accepting terms of usage while ingame."); UpdateTermsOfUsage(); TermsOfUsage.SettingChanged -= TermsOfUsageChanged; } private void UpdateTermsOfUsage() { Enum.TryParse(TermsOfUsage.Value, out var result); TermsOfUsageState = result; } } [GeneratedCode("VersionInfoGenerator", "2.1.3+git35c0c2a-master")] [CompilerGenerated] internal static class VersionInfo { public const string RootNamespace = "GTFuckingXP"; public const string Version = "1.0.0"; public const string VersionPrerelease = null; public const string VersionMetadata = "git069de0e-dirty-master"; public const string SemVer = "1.0.0+git069de0e-dirty-master"; public const string GitRevShort = "069de0e-dirty"; public const string GitRevLong = "069de0e831e139cf3e8d6591f4787fd8c341842b-dirty"; public const string GitBranch = "master"; public const string GitTag = null; public const int GitCommitsSinceTag = 0; public const bool GitIsDirty = true; } } namespace GTFuckingXP.StolenCode { public static class MtfoUtils { public static bool PluginExists; public static bool DataLoaded; public static string CustomPath { get; private set; } public static string Version { get; private set; } static MtfoUtils() { CustomPath = string.Empty; Version = string.Empty; PluginExists = false; DataLoaded = false; if (!((BaseChainloader)(object)IL2CPPChainloader.Instance).Plugins.TryGetValue("com.dak.MTFO", out var info)) { return; } PluginExists = true; try { Assembly? assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly x) => !x.IsDynamic && x.Location == info.Location); if (assembly == null) { throw new Exception("couldn't locate the MTFO assembly"); } Type[] types = assembly.GetTypes(); Type type = types.FirstOrDefault((Type x) => x.Name == "ConfigManager"); Type? type2 = types.FirstOrDefault((Type x) => x.Name == "MTFO"); if (type2 == null) { throw new Exception("couldn't locate MTFO's EntryPoint"); } if (type == null) { throw new Exception("couldn't locate MTFO's ConfigManager"); } FieldInfo? field = type2.GetField("VERSION", BindingFlags.Static | BindingFlags.Public); FieldInfo field2 = type.GetField("CustomPath", BindingFlags.Static | BindingFlags.Public); if (field == null) { throw new Exception("couldn't locate MTFO's Version"); } if (field2 == null) { throw new Exception("couldn't locate MTFO's CustomPath"); } CustomPath = (string)field2.GetValue(null); Version = (string)field.GetValue(null); DataLoaded = true; types.FirstOrDefault((Type x) => x.Name == "HotReloader"); } catch (Exception ex) { LogManager.Error(ex.ToString()); } } } } namespace GTFuckingXP.Scripts { public class BlinkKnife : MonoBehaviour { public void Update() { } } public class DevModeTools : MonoBehaviour { private static bool _guiInitialized; private static GUIStyle _normalStyle; private readonly float _xPos = 30f; private readonly float _yPos = (float)(Screen.height / 2) - 300f; private bool _active = true; private string _addXpNumber; private float _timeTillXpNumberInvalid; public DevModeTools(IntPtr intPtr) : base(intPtr) { } public void Update() { if (Input.GetKeyDown((KeyCode)127)) { _active = !_active; } if (!_active) { return; } if (Input.GetKeyDown((KeyCode)270) && XpApi.SetCurrentLevel(CacheApiWrapper.GetActiveLevel().LevelNumber + 1, out var cheatedXp)) { CheatedXpMessage(cheatedXp); } if (Input.GetKeyDown((KeyCode)269) && XpApi.SetCurrentLevel(CacheApiWrapper.GetActiveLevel().LevelNumber - 1, out var cheatedXp2)) { CheatedXpMessage(cheatedXp2); } if (Input.GetKeyDown((KeyCode)268)) { XpApi.ReloadData(); } if (Input.GetKeyDown((KeyCode)267)) { List instance = CacheApi.GetInstance>("GTF_XP"); LevelLayout currentLevelLayout = CacheApiWrapper.GetCurrentLevelLayout(); int num = instance.IndexOf(currentLevelLayout); if (instance.Count <= num + 1) { XpApi.ChangeCurrentLevelLayout(instance[0]); } else { XpApi.ChangeCurrentLevelLayout(instance[num + 1]); } } if (Input.GetKeyDown((KeyCode)256)) { AddCharToXpNumber("0"); } if (Input.GetKeyDown((KeyCode)257)) { AddCharToXpNumber("1"); } if (Input.GetKeyDown((KeyCode)258)) { AddCharToXpNumber("2"); } if (Input.GetKeyDown((KeyCode)259)) { AddCharToXpNumber("3"); } if (Input.GetKeyDown((KeyCode)260)) { AddCharToXpNumber("4"); } if (Input.GetKeyDown((KeyCode)261)) { AddCharToXpNumber("5"); } if (Input.GetKeyDown((KeyCode)262)) { AddCharToXpNumber("6"); } if (Input.GetKeyDown((KeyCode)263)) { AddCharToXpNumber("7"); } if (Input.GetKeyDown((KeyCode)264)) { AddCharToXpNumber("8"); } if (Input.GetKeyDown((KeyCode)265)) { AddCharToXpNumber("9"); } if (Input.GetKeyDown((KeyCode)271) && !string.IsNullOrEmpty(_addXpNumber)) { XpApi.AddXp(Convert.ToInt32(_addXpNumber)); PlayerChatManager.WantToSentTextMessage(PlayerManager.GetLocalPlayerAgent(), "Cheated " + _addXpNumber + "XP", (PlayerAgent)null); } } public void OnGUI() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown if (_active) { if (!_guiInitialized) { _normalStyle = new GUIStyle(GUI.skin.GetStyle("label")) { fontSize = 22 }; _guiInitialized = true; } GUI.contentColor = Color.white; GUI.Label(new Rect(_xPos, _yPos, 400f, 30f), "Xp dev tools:", _normalStyle); GUI.Label(new Rect(_xPos, _yPos + 25f, 400f, 30f), "Reload xp data : Keypad*", _normalStyle); GUI.Label(new Rect(_xPos, _yPos + 50f, 400f, 30f), "Change class : Keypad/", _normalStyle); GUI.Label(new Rect(_xPos, _yPos + 75f, 400f, 30f), "Level up : Keypad+", _normalStyle); GUI.Label(new Rect(_xPos, _yPos + 100f, 400f, 30f), "Level down : Keypad-", _normalStyle); GUI.Label(new Rect(_xPos, _yPos + 125f, 400f, 30f), "AddXP \"" + _addXpNumber + "\" KeypadEnter to add XP", _normalStyle); } } private void AddCharToXpNumber(string number) { if (Time.time > _timeTillXpNumberInvalid) { _addXpNumber = string.Empty; } _addXpNumber += number; _timeTillXpNumberInvalid = Time.time + 2f; } private void CheatedXpMessage(float xpAmount) { PlayerChatManager.WantToSentTextMessage(PlayerManager.GetLocalPlayerAgent(), $"Cheated {xpAmount}XP", (PlayerAgent)null); } } internal class DevTools : BaseMenu { public DevTools(IntPtr intPtr) : base(intPtr) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown ((BaseMenu)this).PageTitle = "Xp dev tools"; base._currentState = (MenuStates)2; base._tools.Add(new Tool("Reload xp data", MenuInputProvider.F1, false, (Action)ReloadData, (Action)null, false)); base._tools.Add(new Tool("Change class", MenuInputProvider.F2, false, (Action)ChangeClass, (Action)null, false)); base._tools.Add(new Tool("Level up", MenuInputProvider.F3, false, (Action)LevelUp, (Action)null, false)); base._tools.Add(new Tool("Level down", MenuInputProvider.F4, false, (Action)LevelDown, (Action)null, false)); } protected override void Update() { ((BaseMenu)this).Update(); } [HideFromIl2Cpp] public void ReloadData(Tool _) { XpApi.ReloadData(); } [HideFromIl2Cpp] public void LevelUp(Tool _) { if (XpApi.SetCurrentLevel(CacheApiWrapper.GetActiveLevel().LevelNumber + 1, out var cheatedXp)) { CheatedXpMessage(cheatedXp); } } [HideFromIl2Cpp] public void LevelDown(Tool _) { if (XpApi.SetCurrentLevel(CacheApiWrapper.GetActiveLevel().LevelNumber - 1, out var cheatedXp)) { CheatedXpMessage(cheatedXp); } } [HideFromIl2Cpp] public void ChangeClass(Tool _) { List instance = CacheApi.GetInstance>("GTF_XP"); LevelLayout currentLevelLayout = CacheApiWrapper.GetCurrentLevelLayout(); int num = instance.IndexOf(currentLevelLayout); if (instance.Count <= num + 1) { XpApi.ChangeCurrentLevelLayout(instance[0]); } else { XpApi.ChangeCurrentLevelLayout(instance[num + 1]); } } private void CheatedXpMessage(float xpAmount) { PlayerChatManager.WantToSentTextMessage(PlayerManager.GetLocalPlayerAgent(), $"Cheated {xpAmount}XP", (PlayerAgent)null); } } internal class XpBar : MonoBehaviour { private RectTransform _xpBar; private SpriteRenderer _xpProgressBar; private TextMeshPro _textUi; public XpBar(IntPtr intPtr) : base(intPtr) { XpBarStuff(); } [HideFromIl2Cpp] public void UpdateUiString(Level currentLevel, Level? nextLevel, uint currentTotalXp, string header) { //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) StringBuilder stringBuilder = new StringBuilder(); string text; if (string.IsNullOrEmpty(currentLevel.CustomLevelStatsText)) { if (nextLevel != null) { uint num = currentTotalXp - currentLevel.TotalXpRequired; uint value = nextLevel.TotalXpRequired - currentLevel.TotalXpRequired; StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(11, 1, stringBuilder2); handler.AppendLiteral("Classname: "); handler.AppendFormatted(header); stringBuilder3.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder4 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(10, 2, stringBuilder2); handler.AppendLiteral("MaxHP "); handler.AppendFormatted(currentLevel.HealthMultiplier * CacheApiWrapper.GetDefaultMaxHp()); handler.AppendLiteral(" => "); handler.AppendFormatted(nextLevel.HealthMultiplier * CacheApiWrapper.GetDefaultMaxHp()); stringBuilder4.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder5 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(7, 2, stringBuilder2); handler.AppendLiteral("MD "); handler.AppendFormatted(currentLevel.MeleeDamageMultiplier); handler.AppendLiteral(" => "); handler.AppendFormatted(nextLevel.MeleeDamageMultiplier); stringBuilder5.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder6 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(7, 2, stringBuilder2); handler.AppendLiteral("WD "); handler.AppendFormatted(currentLevel.WeaponDamageMultiplier); handler.AppendLiteral(" => "); handler.AppendFormatted(nextLevel.WeaponDamageMultiplier); stringBuilder6.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder7 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(13, 3, stringBuilder2); handler.AppendLiteral("Level "); handler.AppendFormatted(currentLevel.LevelNumber); handler.AppendLiteral(" => "); handler.AppendFormatted(num); handler.AppendLiteral(" / "); handler.AppendFormatted(value); stringBuilder7.AppendLine(ref handler); ((Component)_xpProgressBar).gameObject.SetActive(false); double num2 = (double)num / Convert.ToDouble(value); _xpProgressBar.size = new Vector2((float)(num2 * 300.0), 20f); } else { StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder8 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(11, 1, stringBuilder2); handler.AppendLiteral("Classname: "); handler.AppendFormatted(header); stringBuilder8.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder9 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(6, 1, stringBuilder2); handler.AppendLiteral("MaxHP "); handler.AppendFormatted(currentLevel.HealthMultiplier * CacheApiWrapper.GetDefaultMaxHp()); stringBuilder9.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder10 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(3, 1, stringBuilder2); handler.AppendLiteral("MD "); handler.AppendFormatted(currentLevel.MeleeDamageMultiplier); stringBuilder10.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder11 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(3, 1, stringBuilder2); handler.AppendLiteral("WD "); handler.AppendFormatted(currentLevel.WeaponDamageMultiplier); stringBuilder11.AppendLine(ref handler); stringBuilder2 = stringBuilder; StringBuilder stringBuilder12 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(6, 1, stringBuilder2); handler.AppendLiteral("Level "); handler.AppendFormatted(currentLevel.LevelNumber); stringBuilder12.AppendLine(ref handler); ((Component)_xpProgressBar).gameObject.SetActive(false); } text = stringBuilder.ToString(); } else { stringBuilder.Append(currentLevel.CustomLevelStatsText); text = stringBuilder.ToString(); if (nextLevel == null) { ((Component)_xpProgressBar).gameObject.SetActive(false); text = string.Format(text, $"Level {currentLevel.LevelNumber}"); } else { int num3 = (int)(currentTotalXp - currentLevel.TotalXpRequired); uint value2 = nextLevel.TotalXpRequired - currentLevel.TotalXpRequired; double num4 = Math.Max(0.0, (double)num3 / Convert.ToDouble(value2)); _xpProgressBar.size = new Vector2((float)(num4 * 300.0), 20f); text = string.Format(text, $"Level {currentLevel.LevelNumber} => {num3} / {value2}"); } } ((TMP_Text)_textUi).text = text; ((TMP_Text)_textUi).ForceMeshUpdate(false, false); } public void HideTextUi() { ((TMP_Text)_textUi).text = ""; ((TMP_Text)_textUi).ForceMeshUpdate(false, false); } public void XpBarStuff() { //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) if (!CacheApi.TryGetInstance(ref _xpBar, "GTF_XP", false) || !CacheApi.TryGetInstance(ref _xpProgressBar, "GTF_XP", false) || !CacheApi.TryGetInstance(ref _textUi, "GTF_XP", false)) { PUI_LocalPlayerStatus playerStatus = GuiManager.Current.m_playerLayer.m_playerStatus; _xpBar = ((Component)((Component)playerStatus.m_health2).gameObject.transform.parent).gameObject.Instantiate("XpBarRenderer"); ((Component)_xpBar).transform.Translate(0f, (float)Screen.height * 50f / 2560f, 0f); ((Transform)_xpBar).Rotate(0f, 180f, 0f); ((Renderer)((Component)((Transform)_xpBar).GetChild(2)).GetComponent()).enabled = false; _xpProgressBar = ((Component)((Transform)_xpBar).GetChild(1)).GetComponent(); _xpProgressBar.size = new Vector2(3f, 10f); _xpProgressBar.color = new Color(1f, 64f / 85f, 0.79607844f); _textUi = ((Component)GuiManager.Current.m_watermarkLayer.m_watermark.m_watermarkText).gameObject.Instantiate("XpText"); _textUi.transform.parent = ((GuiLayer)GuiManager.Current.m_playerLayer).CustomComponentRoot; _textUi.transform.Translate(new Vector3(-120f, 25f, 0f)); CacheApi.SaveInstance(_textUi, "GTF_XP"); CacheApi.SaveInstance(_xpBar, "GTF_XP"); CacheApi.SaveInstance(_xpProgressBar, "GTF_XP"); ((Component)_xpBar).gameObject.SetActive(false); } } } internal class XpHandler : MonoBehaviour { private bool _hasDebuff; private float _nextUpdate; public uint CurrentTotalXp { get; internal set; } [HideFromIl2Cpp] public Level? NextLevel { get; internal set; } public bool IsMaxLevel => NextLevel == null; public XpHandler(IntPtr intPtr) : base(intPtr) { } public void Awake() { if (CacheApiWrapper.TryGetXpStorageData(out (LevelLayout, uint) checkpointData)) { CacheApiWrapper.SetCurrentLevelLayout(checkpointData.Item1); SkipToXp(checkpointData.Item2); } else { if (!CacheApiWrapper.TryGetCurrentLevelLayout(out LevelLayout levelLayout) || !SaveManager.CheckValidLayout(levelLayout)) { levelLayout = CacheApiWrapper.GetDefaultLayout(); CacheApiWrapper.SetCurrentLevelLayout(levelLayout); } Level level = levelLayout.Levels[0]; NextLevel = levelLayout.GetLevel(level.LevelNumber + 1); CurrentTotalXp = 0u; ChangeCurrentLevel(level, BoosterBuffManager.Instance.GetFittingBoosterBuff(levelLayout.PersistentId, level.LevelNumber)); CacheApi.GetInstance("GTF_XP").UpdateUiString(CacheApiWrapper.GetActiveLevel(), NextLevel, CurrentTotalXp, levelLayout.Header); if (!SNet.IsMaster) { NetworkApiXpManager.SendRequestXp(); } } _nextUpdate = Time.time + 300f; } public void Update() { if (_nextUpdate < Time.time) { _nextUpdate = Time.time + 300f; } } [HideFromIl2Cpp] public void AddXp(IXpData xpData, Vector3 xpTextPosition, bool forceDebuffXp = false, string xpPopupColor = "<#F80>") { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) int xp = xpData.GetXp(forceDebuffXp || _hasDebuff); CurrentTotalXp = (uint)Math.Max(0L, CurrentTotalXp + xp); LogManager.Debug($"Giving xp Amount {xp}, new total Xp is {CurrentTotalXp}"); if (!CheckForLevelThresholdReached(xpTextPosition, out string currentClassName) && BepInExLoader.XpPopups.Value && NextLevel != null) { DamageNumberFactory.CreateFloatingText((IFloatingTextInfo)(object)new FloatingXpTextInfo(xpTextPosition, $"{xpPopupColor}{xp}XP")); } CacheApi.GetInstance("GTF_XP").UpdateUiString(CacheApiWrapper.GetActiveLevel(), NextLevel, CurrentTotalXp, currentClassName); } public bool CheckForLevelThresholdReached(Vector3 xpTextPosition, out string currentClassName) { //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) LevelLayout currentLevelLayout = CacheApiWrapper.GetCurrentLevelLayout(); currentClassName = currentLevelLayout.Header; if (IsMaxLevel) { return false; } Level activeLevel = CacheApiWrapper.GetActiveLevel(); if (NextLevel.TotalXpRequired <= CurrentTotalXp) { Level nextLevel = NextLevel; while (NextLevel != null && NextLevel.TotalXpRequired <= CurrentTotalXp) { ApplySingleUseBuffs(NextLevel); nextLevel = NextLevel; NextLevel = currentLevelLayout.GetLevel(nextLevel.LevelNumber + 1); } ChangeCurrentLevel(nextLevel, BoosterBuffManager.Instance.GetFittingBoosterBuff(currentLevelLayout.PersistentId, nextLevel.LevelNumber)); if (BepInExLoader.LvlUpPopups.Value) { if (string.IsNullOrEmpty(nextLevel.CustomLevelUpPopupText)) { DamageNumberFactory.CreateFloatingText((IFloatingTextInfo)(object)new FloatingXpTextInfo(xpTextPosition, $"<#f00>LV {nextLevel.LevelNumber}\nHP: +<#f80>{Math.Round(nextLevel.HealthMultiplier * CacheApiWrapper.GetDefaultMaxHp() - activeLevel.HealthMultiplier * CacheApiWrapper.GetDefaultMaxHp(), 1)}\n<#f00>MD: <#f80>{Math.Round(nextLevel.MeleeDamageMultiplier - activeLevel.MeleeDamageMultiplier, 2)}x \n<#f00>WD: <#f80>{Math.Round(nextLevel.WeaponDamageMultiplier - activeLevel.WeaponDamageMultiplier, 2)}x", 4f)); } else { DamageNumberFactory.CreateFloatingText((IFloatingTextInfo)(object)new FloatingXpTextInfo(xpTextPosition, nextLevel.CustomLevelUpPopupText, 4f)); } } return true; } return false; } internal void SkipToXp(uint totalXp) { LevelLayout currentLevelLayout = CacheApiWrapper.GetCurrentLevelLayout(); CurrentTotalXp = totalXp; Level level = currentLevelLayout.Levels.OrderByDescending((Level it) => it.LevelNumber).First((Level it) => it.TotalXpRequired <= CurrentTotalXp); NextLevel = currentLevelLayout.GetLevel(level.LevelNumber + 1); BoosterBuffs fittingBoosterBuff = BoosterBuffManager.Instance.GetFittingBoosterBuff(currentLevelLayout.PersistentId, level.LevelNumber); ChangeCurrentLevel(level, fittingBoosterBuff, applyLevelBonuses: false); CacheApi.GetInstance("GTF_XP").UpdateUiString(CacheApiWrapper.GetActiveLevel(), NextLevel, CurrentTotalXp, currentLevelLayout.Header); } [HideFromIl2Cpp] internal void ChangeCurrentLevel(Level newLevel, BoosterBuffs newBoosterBuff = null, bool applyLevelBonuses = true) { CacheApiWrapper.SetActiveLevel(newLevel); CacheApiWrapper.SetCurrentBoosterBuff(newBoosterBuff); LogManager.Debug("saved information."); BoosterBuffManager.Instance.ApplyBoosterEffects(PlayerManager.GetLocalPlayerAgent(), newBoosterBuff); NetworkApiXpManager.SendBoosterStatsReached(newBoosterBuff); Dam_PlayerDamageBase damage = PlayerManager.GetLocalPlayerAgent().Damage; float healthMax = ((Dam_SyncedDamageBase)damage).HealthMax; float num2 = (((Dam_SyncedDamageBase)damage).HealthMax = CacheApiWrapper.GetDefaultMaxHp() * newLevel.HealthMultiplier); if (applyLevelBonuses) { ((Dam_SyncedDamageBase)damage).Health = ((Dam_SyncedDamageBase)damage).Health + (num2 - healthMax); } ((Il2CppObjectBase)damage).Cast().UpdateHealthGui(); if (applyLevelBonuses) { ApplySingleUseBuffs(newLevel); } LogManager.Debug("Pre applying custom scaling effects."); CustomScalingBuffManager.ApplyCustomScalingEffects(newLevel.CustomScaling); } [HideFromIl2Cpp] private void ApplySingleUseBuffs(Level reachedLevel) { PlayerAgent localPlayerAgent = PlayerManager.GetLocalPlayerAgent(); foreach (var (singleBuff2, num2) in reachedLevel.LevelUpBonus) { switch (singleBuff2) { case SingleBuff.Heal: localPlayerAgent.GiveHealth(localPlayerAgent, num2); break; case SingleBuff.Disinfect: localPlayerAgent.GiveDisinfection(localPlayerAgent, num2); break; case SingleBuff.AmmunitionMain: GiveAmmoRel(localPlayerAgent, num2, (InventorySlot)1); break; case SingleBuff.AmmunitionSpecial: GiveAmmoRel(localPlayerAgent, num2, (InventorySlot)2); break; case SingleBuff.AmmunitionTool: GiveAmmoRel(localPlayerAgent, num2, (InventorySlot)3); break; } } } private static void GiveAmmoRel(PlayerAgent player, float ammoRel, InventorySlot slot) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected I4, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) PlayerDataBlock playerData = player.PlayerData; PlayerAmmoStorage ammoStorage = PlayerBackpackManager.LocalBackpack.AmmoStorage; if (!ammoStorage.GetInventorySlotAmmo(slot).IsFull) { float num = (slot - 1) switch { 0 => playerData.AmmoStandardResourcePackMaxCap, 1 => playerData.AmmoSpecialResourcePackMaxCap, 2 => playerData.AmmoClassResourcePackMaxCap, _ => 0, }; ammoStorage.PickupAmmo(slot.ToAmmoType(), ammoRel * num); PlayerBackpackManager.ForceLocalAmmoStorageUpdate(); } } } } namespace GTFuckingXP.Patches { [HarmonyPatch(typeof(HeavyFogRepellerGlobalState))] public class FogTurbinePatches { [HarmonyPatch("OnStateChange")] [HarmonyPrefix] public static void OnStateChangePostfix(HeavyFogRepellerGlobalState __instance, pCarryItemWithGlobalState_State newState, bool isDropinState) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 SNet_Player val = default(SNet_Player); if (!isDropinState && newState.status == 1 && (int)newState.owner == 1 && ((pPlayer)(ref newState.player)).TryGetPlayer(ref val) && val.HasPlayerAgent) { __instance.m_repellerSphere.Range = AgentModifierManager.ApplyModifier((Agent)(object)((Il2CppObjectBase)val.PlayerAgent).Cast(), (AgentModifier)155, 7f); } } } [HarmonyPatch(typeof(GS_InLevel))] public class GS_InLevelPatches { [HarmonyPatch("Enter")] [HarmonyPostfix] public static void EnterLevelPostfix() { LogManager.Debug("Level Enter"); ScriptManager.Instance.StartLevelScripts(); UI_Apply.SetSkewing(0f); } } [HarmonyPatch(typeof(GS_AfterLevel))] public class GS_AfterLevelPatches { [HarmonyPatch("CleanupAfterExpedition")] [HarmonyPrefix] public static void EnterLevelPostfix() { ScriptManager.Instance.EndLevelScripts(); } } [HarmonyPatch(typeof(PlaceNavMarkerOnGO))] public class PlaceNavMarkerOnGoPatches { [HarmonyPatch("UpdateName")] [HarmonyPrefix] public static void UpdateNamePrefix(PlaceNavMarkerOnGO __instance, ref string name, string extraInfo) { PlayerAgent player = __instance.m_player; if (!((Object)(object)player == (Object)null) && !player.Owner.IsBot && CacheApiWrapper.TryGetFullActiveLevel(player, out var activeLevel)) { if (!string.IsNullOrEmpty(extraInfo)) { name = $"{name}\n{activeLevel.Layout.Header} Lv.{activeLevel.LevelNumber}"; } else { name = $"Lv.{activeLevel.LevelNumber} {name}"; } } } } [HarmonyPatch(typeof(PlayerAmmoStorage))] internal class PlayerAmmoPatches { [HarmonyPatch("AddLevelDefaultAmmoModifications")] [HarmonyWrapSafe] [HarmonyPostfix] private static void Post_SetStorage(PlayerAmmoStorage __instance, PlayerAgent owner) { if (RundownManager.ActiveExpedition == null || !((Agent)owner).IsLocallyOwned || !CacheApiWrapper.TryGetCurrentLevelLayout(out LevelLayout levelLayout) || levelLayout.StartingBuffs == null) { return; } float[] array = new float[3] { levelLayout.StartingBuffs.GetValueOrDefault(StartBuff.AmmunitionMainMultiplier, 1f), levelLayout.StartingBuffs.GetValueOrDefault(StartBuff.AmmunitionSpecialMultiplier, 1f), levelLayout.StartingBuffs.GetValueOrDefault(StartBuff.AmmunitionToolMultiplier, 1f) }; if (!array.All((float mod) => mod == 1f)) { Il2CppStructArray ammoModificationIDs = __instance.m_ammoModificationIDs; _ = RundownManager.ActiveExpedition.SpecialOverrideData; ModifierInstance val = default(ModifierInstance); if (!AgentModifierManager.TryGetModifierInstance((Agent)(object)owner, ref val)) { AgentModifierManager.AddModifierValue((Agent)(object)owner, (AgentModifier)152, 0f, 0f); AgentModifierManager.TryGetModifierInstance((Agent)(object)owner, ref val); } float num = val.GetModifierValue((AgentModifier)152) + 1f; AgentModifierManager.ClearModifierChange(((Il2CppArrayBase)(object)ammoModificationIDs)[0]); ((Il2CppArrayBase)(object)ammoModificationIDs)[0] = AgentModifierManager.AddModifierValue((Agent)(object)owner, (AgentModifier)152, num * array[0] - 1f, 0f); num = val.GetModifierValue((AgentModifier)153) + 1f; AgentModifierManager.ClearModifierChange(((Il2CppArrayBase)(object)ammoModificationIDs)[1]); ((Il2CppArrayBase)(object)ammoModificationIDs)[1] = AgentModifierManager.AddModifierValue((Agent)(object)owner, (AgentModifier)153, num * array[1] - 1f, 0f); num = val.GetModifierValue((AgentModifier)154) + 1f; AgentModifierManager.ClearModifierChange(((Il2CppArrayBase)(object)ammoModificationIDs)[2]); ((Il2CppArrayBase)(object)ammoModificationIDs)[2] = AgentModifierManager.AddModifierValue((Agent)(object)owner, (AgentModifier)154, num * array[2] - 1f, 0f); } } [HarmonyPatch(typeof(PlayerAmmoStorage), "PickupAmmo")] [HarmonyWrapSafe] [HarmonyPrefix] private static void AmmoPackCallback(AmmoType ammoType, ref float ammoAmount) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Invalid comparison between Unknown and I4 //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Invalid comparison between Unknown and I4 CustomScaling customScaling = (((int)ammoType <= 1) ? CustomScaling.AmmoGainEfficiency : (((int)ammoType != 2) ? CustomScaling.Invalid : CustomScaling.ToolGainEfficiency)); CustomScaling customScaling2 = customScaling; Level activeLevel = CacheApiWrapper.GetActiveLevel(); float num = 1f; if (customScaling2 != CustomScaling.Invalid && activeLevel.CustomScaling.TryGetValue(customScaling2, out var value)) { num *= value; } customScaling = (((int)ammoType <= 1) ? CustomScaling.AmmoCapacity : (((int)ammoType != 2) ? CustomScaling.Invalid : CustomScaling.ToolCapacity)); customScaling2 = customScaling; if (customScaling2 != CustomScaling.Invalid && activeLevel.CustomScaling.TryGetValue(customScaling2, out var value2)) { num /= value2; } if (num != 1f) { ammoAmount *= num; } } } [HarmonyPatch] public class PlayerRevivePatches { [HarmonyPatch(typeof(AgentReplicatedActions), "DoPlayerReviveValidation")] [HarmonyPrefix] public static void RevivePostfix(pPlayerReviveAction data) { PlayerAgent val = default(PlayerAgent); PlayerAgent reviver = default(PlayerAgent); if (((pPlayerAgent)(ref data.TargetPlayer)).TryGet(ref val) && ((pPlayerAgent)(ref data.SourcePlayer)).TryGet(ref reviver) && !val.Locomotion.Downed.m_isRevived) { PlayerReviveManager.OnRevive(val, reviver); } } } [HarmonyPatch(typeof(SentryGunInstance_Firing_Bullets))] internal static class SentryGunFiringPatches { [HarmonyPatch("UpdateAmmo")] [HarmonyWrapSafe] [HarmonyPrefix] private static void PrefixSentryAmmo(SentryGunInstance_Firing_Bullets __instance) { if (CacheApiWrapper.TryGetActiveLevel(__instance.m_core.Owner, out Level level)) { float num = 1f; if (level.CustomScaling.TryGetValue(CustomScaling.ToolEfficiency, out var value)) { num *= value; } if (level.CustomScaling.TryGetValue(CustomScaling.ToolCapacity, out value)) { num *= value; } if (num != 1f) { SentryGunInstance obj = ((Il2CppObjectBase)__instance.m_core).Cast(); obj.CostOfBullet /= num; } } } [HarmonyPatch(typeof(SentryGunInstance), "GiveAmmoRel")] [HarmonyWrapSafe] [HarmonyPrefix] private static void PrefixSentryAmmo(SentryGunInstance __instance, ref float ammoClassRel) { if (CacheApiWrapper.TryGetActiveLevel(((Item)__instance).Owner, out Level level)) { float num = 1f; if (level.CustomScaling.TryGetValue(CustomScaling.ToolGainEfficiency, out var value)) { num *= value; } if (level.CustomScaling.TryGetValue(CustomScaling.ToolCapacity, out value)) { num /= value; } ammoClassRel *= num; } } } [HarmonyPatch(typeof(SNet_SessionHub))] public class SnetSessionHubPatches { [HarmonyPatch("AddPlayerToSession")] [HarmonyWrapSafe] [HarmonyPostfix] public static void AddPlayerToSessionPostfix(SNet_SessionHub __instance) { //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Invalid comparison between Unknown and I4 if (!CacheApiWrapper.TryGetCurrentLevelLayout(out LevelLayout classLayout) || !SNet.HasLocalPlayer) { return; } Group group = CacheApi.GetInstance>("GTF_XP").FirstOrDefault((Group it) => it.PersistentId == classLayout.GroupPersistentId); if (group == null) { LogManager.Warn($"Found no valid group for class {classLayout.Header}, id {classLayout.PersistentId}, group id {classLayout.GroupPersistentId}"); } else { if (group.AllowedForCount(__instance.PlayersInSession.Count)) { return; } if ((int)GameStateManager.Current.m_currentStateName == 5) { foreach (CM_PlayerLobbyBar item in (Il2CppArrayBase)(object)CM_PageLoadout.Current.m_playerLobbyBars) { if (item.m_player.Lookup == SNet.LocalPlayer.Lookup) { CacheApiWrapper.SetCurrentLevelLayout(CacheApiWrapper.GetDefaultLayout()); PlayerLobbyBarPatches.ShowClassesSelector(item); break; } } return; } XpApi.ChangeCurrentLevelLayout(CacheApiWrapper.GetDefaultLayout()); } } } } namespace GTFuckingXP.Patches.SelectLevelPatches { [HarmonyPatch(typeof(CM_PlayerLobbyBar))] public class PlayerLobbyBarPatches { [HarmonyPatch("SetupFromPage")] [HarmonyPostfix] public static void SetupFromPagePostfix(CM_PlayerLobbyBar __instance) { //IL_009b: Unknown result type (might be due to invalid IL or missing references) CM_PlayerLobbyBar __instance2 = __instance; LogManager.Debug($"SetupFromPage Postfix on {((Object)__instance2).GetInstanceID()}"); CM_LobbyScrollItem classButton = ((Component)__instance2.m_clothesButton).gameObject.Instantiate("ClassSelectorButton"); CacheApi.SaveInformation((object)((Object)__instance2).GetInstanceID(), (object)classButton, "GTF_XP"); ((Component)classButton).transform.Translate(new Vector3(0f, -70f, 0f)); ((CM_Item)classButton).SetOnBtnPressCallback(Action.op_Implicit((Action)delegate(int test) { LogManager.Debug($"Button pressed with {test} as parameter"); __instance2.Select(); classButton.IsSelected = true; ShowClassesSelector(__instance2); })); } [HarmonyPatch("HideLoadoutUI")] [HarmonyPostfix] public static void HideLoadoutUiPostfix(CM_PlayerLobbyBar __instance, bool hide) { if (!__instance.m_introDone || __instance.m_player == null) { return; } CM_LobbyScrollItem information = CacheApi.GetInformation((object)((Object)__instance).GetInstanceID(), "GTF_XP"); if (__instance.m_player.IsLocal) { LevelLayout levelLayout; string text = (CacheApiWrapper.TryGetCurrentLevelLayout(out levelLayout) ? ((string)levelLayout.Header) : "Default"); ((Component)information).gameObject.SetActive(!hide); foreach (TextMeshPro item in (Il2CppArrayBase)(object)((CM_Item)information).GetTexts()) { ((TMP_Text)item).text = "Class: " + text; ((TMP_Text)item).ForceMeshUpdate(false, false); } } _ = __instance.m_player.IsBot; } internal static void ShowClassesSelector(CM_PlayerLobbyBar lobbyBar) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) LogManager.Debug("Calling ShowClass Selector method."); lobbyBar.HidePopup(); lobbyBar.m_popupVisible = true; lobbyBar.m_popupScrollWindow.m_infoBoxWidth = 700f; ((RectTransformComp)lobbyBar.m_popupScrollWindow).SetSize(new Vector2(1600f, 700f)); lobbyBar.m_popupScrollWindow.ResetHeaders(); List instance = CacheApi.GetInstance>("GTF_XP"); AddHeaders(lobbyBar, instance); ((RectTransformComp)lobbyBar.m_popupScrollWindow).SetPosition(new Vector2(0f, 350f)); lobbyBar.m_popupScrollWindow.RespawnInfoBoxFromPrefab(lobbyBar.m_popupInfoBoxWeaponPrefab); ChangeClassHeader(instance[0].Name, 0, lobbyBar); lobbyBar.ShowPopup(); CM_ScrollWindowInfoBox infoBox = lobbyBar.m_popupScrollWindow.InfoBox; if (!CacheApiWrapper.TryGetAnchorDifference(out var anchorDifference)) { anchorDifference = ((TMP_Text)infoBox.m_infoMainTitleText).rectTransform.anchoredPosition.y * -1f - 40f; CacheApiWrapper.SetAnchorDifference(anchorDifference); } ((TMP_Text)infoBox.m_infoMainTitleText).rectTransform.anchoredPosition = new Vector2(0f, ((TMP_Text)infoBox.m_infoMainTitleText).rectTransform.anchoredPosition.y + anchorDifference); ((TMP_Text)infoBox.m_infoDescriptionText).rectTransform.anchoredPosition = new Vector2(0f, ((TMP_Text)infoBox.m_infoDescriptionText).rectTransform.anchoredPosition.y + anchorDifference); ((TMP_Text)infoBox.m_infoDescriptionText).fontSizeMin = ((TMP_Text)infoBox.m_infoDescriptionText).fontSizeMax; } private static void ChangeClassHeader(string groupName, int key, CM_PlayerLobbyBar lobbyBar) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) CM_PlayerLobbyBar lobbyBar2 = lobbyBar; LogManager.Debug("Showing groupname " + groupName); List val = new List(); List instance = CacheApi.GetInstance>("GTF_XP"); LevelLayout levelLayout; int num = (CacheApiWrapper.TryGetCurrentLevelLayout(out levelLayout) ? levelLayout.PersistentId : 0); CM_ScrollWindowInfoBox infoBox = lobbyBar2.m_popupScrollWindow.InfoBox; _ = infoBox.m_infoMainIcon.size; ((Component)infoBox.m_infoMainIcon).gameObject.SetActive(false); ((Renderer)infoBox.m_infoMainIcon).enabled = false; CM_LobbyScrollItem selected = null; foreach (LevelLayout layout in instance) { if (layout.GroupPersistentId != key) { continue; } CM_LobbyScrollItem content = GOUtil.SpawnChildAndGetComp(lobbyBar2.m_clothesCardPrefab, ((Component)lobbyBar2).transform); ((CM_Item)content).TextMeshRoot = ((Component)lobbyBar2.m_parentPage).transform; content.SetupFromLobby(((Component)lobbyBar2).transform, lobbyBar2, true); ((RectTransformComp)content).ForcePopupLayer(true, (GameObject)null); ((TMP_Text)content.m_descText).text = ""; ((TMP_Text)content.m_subTitleText).text = ""; if (layout.PersistentId == num) { selected = content; selected.IsSelected = true; SelectItem(content, selected); } ((TMP_Text)content.m_nameText).text = layout.Header; ((CM_Item)content).OnBtnPressCallback += Action.op_Implicit((Action)delegate { //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown LogManager.Debug($"LayoutName {layout.Header} and Id is {layout.PersistentId}"); if ((Object)(object)selected != (Object)null) { selected.IsSelected = false; } content.IsSelected = true; SelectItem(content, selected); selected = content; CM_LobbyScrollItem information = CacheApi.GetInformation((object)((Object)lobbyBar2).GetInstanceID(), "GTF_XP"); LocaleText header = layout.Header; foreach (TextMeshPro item in (Il2CppArrayBase)(object)((CM_Item)information).GetTexts()) { ((TMP_Text)item).text = $"Class: {header}"; ((TMP_Text)item).ForceMeshUpdate(false, false); } CoroutineManager.BlinkIn(((Component)content).gameObject, 0f); infoBox.SetInfoBox((string)layout.Header, "", (string)layout.InfoText, "", "", new Sprite()); CacheApiWrapper.SetCurrentLevelLayout(layout); SaveManager.SaveLayout(layout); }); ((CM_Item)content).m_alphaSpriteOnHover = true; ((CM_Item)content).m_alphaTextOnHover = true; val.Add(((Il2CppObjectBase)content).Cast()); } lobbyBar2.m_popupScrollWindow.SetContentItems(val, 0f); Enumerator enumerator2 = val.GetEnumerator(); while (enumerator2.MoveNext()) { ((Il2CppObjectBase)enumerator2.Current).Cast().UpdateSizesAndOffsets(); } lobbyBar2.ShowPopup(); lobbyBar2.m_popupScrollWindow.SelectHeader(key); Transform val2 = ((Component)infoBox).transform.FindChild("InfoBox/IconBackground"); LogManager.Debug($"Child is null {val2 == null}"); ((Component)val2).gameObject.SetActive(false); } private static void SelectItem(CM_LobbyScrollItem newSelectItem, CM_LobbyScrollItem oldSelectItem) { if ((Object)(object)oldSelectItem != (Object)null) { ((TMP_Text)oldSelectItem.m_subTitleText).text = ""; CacheApi.SaveInstance((CM_LobbyScrollItem)null, "GTF_XP"); } if ((Object)(object)newSelectItem != (Object)null) { ((TMP_Text)newSelectItem.m_subTitleText).text = "" + Text.Get(492u) + ""; CacheApi.SaveInstance(newSelectItem, "GTF_XP"); } } private static void AddHeaders(CM_PlayerLobbyBar lobbyBar, List groups) { CM_PlayerLobbyBar lobbyBar2 = lobbyBar; int num = 0; int count = SNet.SessionHub.PlayersInSession.Count; foreach (Group group in groups) { if (num <= 5 && group.AllowedForCount(count)) { lobbyBar2.m_popupScrollWindow.AddHeader((string)group.Name, group.PersistentId, Action.op_Implicit((Action)delegate(int headerIndex) { LogManager.Debug($"Header select call. HeaderIndex was {headerIndex}, or {group.PersistentId}"); ChangeClassHeader(group.Name, group.PersistentId, lobbyBar2); })); num++; } } if (num > 0) { return; } Group group2 = groups.FirstOrDefault((Group it) => it.PersistentId == 0); Group group3 = groups.FirstOrDefault((Group it) => it.PersistentId == 1); Group group4 = groups.FirstOrDefault((Group it) => it.PersistentId == 2); Group group5 = groups.FirstOrDefault((Group it) => it.PersistentId == 3); if (group2 != null) { lobbyBar2.m_popupScrollWindow.AddHeader((string)group2.Name, 0, Action.op_Implicit((Action)delegate(int headerIndex) { LogManager.Debug($"Header select call. HeaderIndex was {headerIndex}, or 0"); ChangeClassHeader(group2.Name, 0, lobbyBar2); })); } if (group3 != null) { lobbyBar2.m_popupScrollWindow.AddHeader((string)group3.Name, 1, Action.op_Implicit((Action)delegate(int headerIndex) { LogManager.Debug($"Header select call. HeaderIndex was {headerIndex}, or 1"); ChangeClassHeader(group3.Name, 1, lobbyBar2); })); } if (group4 != null) { lobbyBar2.m_popupScrollWindow.AddHeader((string)group4.Name, 2, Action.op_Implicit((Action)delegate(int headerIndex) { LogManager.Debug($"Header select call. HeaderIndex was {headerIndex}, or 2"); ChangeClassHeader(group4.Name, 2, lobbyBar2); })); } if (group5 != null) { lobbyBar2.m_popupScrollWindow.AddHeader((string)group5.Name, 3, Action.op_Implicit((Action)delegate(int headerIndex) { LogManager.Debug($"Header select call. HeaderIndex was {headerIndex}, or 3"); ChangeClassHeader(group5.Name, 3, lobbyBar2); })); } } } } namespace GTFuckingXP.Managers { public class BoosterBuffManager { public static BoosterBuffManager Instance { get; set; } public void ApplyBoosterEffects(PlayerAgent targetAgent, BoosterBuffs buffs) { //IL_0085: Unknown result type (might be due to invalid IL or missing references) List list = default(List); if (!CacheApi.TryGetInformation>((object)targetAgent.Owner.Lookup, ref list, "GTF_XP", false)) { list = new List(); } foreach (uint item in list) { AgentModifierManager.ClearModifierChange(item); } list = new List(); if (buffs != null) { foreach (KeyValuePair valueToBoosterEffect in buffs.ValueToBoosterEffects) { if (valueToBoosterEffect.Value != 0f) { list.Add(AgentModifierManager.AddModifierValue((Agent)(object)targetAgent, valueToBoosterEffect.Key, valueToBoosterEffect.Value - 1f, 0f)); } } } CacheApi.SaveInformation((object)targetAgent.Owner.Lookup, (object)list, "GTF_XP"); } public BoosterBuffs GetFittingBoosterBuff(int levelLayoutPersistendId, int levelNumber) { BoosterBuffs boosterBuffs = CacheApi.GetInstance>("GTF_XP").FirstOrDefault((BoosterBuffs it) => it.ClassLayoutPersistentId == levelLayoutPersistendId && it.ActiveLevels.Contains(levelNumber)); LogManager.Debug($"GetfittingBoosterBuff call with {levelLayoutPersistendId} as ID and {levelNumber} as levelNumber. {((boosterBuffs != null) ? "buff found" : "Buff is null")}"); return boosterBuffs; } } public static class CustomScalingBuffManager { public static void ApplyCustomScalingEffects(Dictionary buffs) { if (buffs == null) { return; } ResetCustomBuffs(); foreach (var (customBuff, value) in buffs) { SetCustomBuff(customBuff, value); } UpdateAmmoEfficiencies(buffs); } private static MeleeWeaponFirstPerson GetLocalMeleeWeapon() { BackpackItem val = default(BackpackItem); if (PlayerBackpackManager.LocalBackpack.TryGetBackpackItem((InventorySlot)10, ref val)) { LogManager.Debug("Found Melee"); return ((Il2CppObjectBase)val.Instance).Cast(); } LogManager.Warn("No melee weapon found o.O?"); throw new Exception($"There is no {typeof(MeleeWeaponFirstPerson)} item in the local backpack!"); } private static void SetCustomBuff(CustomScaling customBuff, float value) { PlayerDataBlock block = GameDataBlockBase.GetBlock(1u); switch (customBuff) { case CustomScaling.MeleeRangeMultiplier: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info2)) { if (value != 1f) { info2 = MeleeRangeAPI.AddModifier(value, (StackLayer)0, "Default"); CacheApiWrapper.SetDefaultCustomScaling(customBuff, info2); } } else if (value == 1f) { info2.Disable(); } else { info2.Enable(value); } break; } case CustomScaling.MeleeHitBoxSizeMultiplier: { MeleeArchetypeDataBlock meleeArchetypeData = ((ItemEquippable)GetLocalMeleeWeapon()).MeleeArchetypeData; if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info5)) { info5 = meleeArchetypeData.AttackSphereRadius; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info5); } meleeArchetypeData.AttackSphereRadius = info5 * value; break; } case CustomScaling.MovementSpeedMultiplier: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info3)) { if (value != 1f) { info3 = MoveSpeedAPI.AddModifier(value, (StackLayer)0, "Default"); CacheApiWrapper.SetDefaultCustomScaling(customBuff, info3); } } else if (value == 1f) { info3.Disable(); } else { info3.Enable(value); } break; } case CustomScaling.MeleeAttackSpeedMultiplier: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info9)) { if (value != 1f) { info9 = MeleeAttackSpeedAPI.AddModifier(value, (StackLayer)0, "Default"); CacheApiWrapper.SetDefaultCustomScaling(customBuff, info9); } } else if (value == 1f) { info9.Disable(); } else { info9.Enable(value); } break; } case CustomScaling.JumpVelInitialPlus: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info8)) { info8 = block.jumpVelInitial; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info8); } block.jumpVelInitial = info8 + value; break; } case CustomScaling.JumpGravityMulDefaultPlus: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info6)) { info6 = block.jumpGravityMulDefault; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info6); } block.jumpGravityMulDefault = info6 + value; break; } case CustomScaling.JumpGravityMulButtonReleased: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info10)) { info10 = block.jumpGravityMulButtonReleased; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info10); } block.jumpGravityMulButtonReleased = info10 + value; break; } case CustomScaling.JumpGravityMulAfterPeakPlus: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info7)) { info7 = block.jumpGravityMulAfterPeak; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info7); } block.jumpGravityMulAfterPeak = info7 + value; break; } case CustomScaling.JumpGravityMulFallingPlus: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info4)) { info4 = block.jumpGravityMulFalling; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info4); } block.jumpGravityMulFalling = info4 + value; break; } case CustomScaling.JumpVerticalVelocityMaxPlus: { if (!CacheApiWrapper.TryGetDefaultCustomScaling(customBuff, out var info)) { info = block.jumpVerticalVelocityMax; CacheApiWrapper.SetDefaultCustomScaling(customBuff, info); } block.jumpVerticalVelocityMax = info + value; break; } } } public static void ResetCustomBuffs() { foreach (CustomScaling value in Enum.GetValues(typeof(CustomScaling))) { if (CacheApiWrapper.HasDefaultCustomScaling(value)) { SetCustomBuff(value, GetResetModifier(value)); } } UpdateAmmoEfficiencies(); } public static void ClearDefaultCustomBuffs() { CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.MeleeRangeMultiplier); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.MeleeHitBoxSizeMultiplier); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.AmmoEfficiency); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.ToolEfficiency); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.AmmoGainEfficiency); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.ToolGainEfficiency); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.AmmoCapacity); CacheApiWrapper.RemoveDefaultCustomScaling(CustomScaling.ToolCapacity); } private static float GetResetModifier(CustomScaling customBuff) { if ((uint)(customBuff - 4) <= 5u) { return 0f; } return 1f; } private static void UpdateAmmoEfficiencies(Dictionary? buffs = null) { UpdateAmmoEfficiencies(isAmmo: true, buffs); UpdateAmmoEfficiencies(isAmmo: false, buffs); } private static void UpdateAmmoEfficiencies(bool isAmmo, Dictionary? buffs = null) { CustomScaling customScaling = (isAmmo ? CustomScaling.AmmoCapacity : CustomScaling.ToolCapacity); CustomScaling customScaling2 = (isAmmo ? CustomScaling.AmmoGainEfficiency : CustomScaling.ToolGainEfficiency); CustomScaling key = (isAmmo ? CustomScaling.AmmoEfficiency : CustomScaling.ToolEfficiency); if (!CacheApiWrapper.TryGetDefaultCustomScaling(customScaling, out var oldCap)) { oldCap = 1f; } if (!CacheApiWrapper.TryGetDefaultCustomScaling(customScaling2, out var oldGain)) { oldGain = 1f; } float cap; float gain; if (buffs != null) { cap = buffs.GetValueOrDefault(customScaling, 1f); gain = buffs.GetValueOrDefault(customScaling2, 1f); if (buffs.TryGetValue(key, out var value)) { cap *= value; gain *= value; } } else { cap = 1f; gain = 1f; } PlayerAmmoStorage ammoStorage; if (cap != oldCap || gain != oldGain) { ammoStorage = PlayerBackpackManager.LocalBackpack.AmmoStorage; if (isAmmo) { ChangeAmmoEfficiency((InventorySlot)1); ChangeAmmoEfficiency((InventorySlot)2); } else { ChangeAmmoEfficiency((InventorySlot)3); } ammoStorage.NeedsSync = true; CacheApiWrapper.SetDefaultCustomScaling(customScaling, cap); CacheApiWrapper.SetDefaultCustomScaling(customScaling2, gain); } void ChangeAmmoEfficiency(InventorySlot slot) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) BackpackItem val = default(BackpackItem); if (ammoStorage.m_playerBackpack.TryGetBackpackItem(slot, ref val)) { InventorySlotAmmo inventorySlotAmmo = ammoStorage.GetInventorySlotAmmo(slot); int num = 0; float num2 = oldCap / cap; float num3 = gain / oldGain * num2; if (inventorySlotAmmo.BulletClipSize > 0) { ItemEquippable val2 = ((Il2CppObjectBase)val.Instance).Cast(); inventorySlotAmmo.AmmoInPack = (inventorySlotAmmo.AmmoInPack + (float)val2.GetCurrentClip() * inventorySlotAmmo.CostOfBullet) * num3; inventorySlotAmmo.Setup(inventorySlotAmmo.CostOfBullet * num2, inventorySlotAmmo.BulletClipSize, -1f); num = Math.Min(inventorySlotAmmo.BulletsInPack, val2.GetCurrentClip()); val2.SetCurrentClip(num); inventorySlotAmmo.AmmoInPack -= (float)num * inventorySlotAmmo.CostOfBullet; } else { inventorySlotAmmo.AmmoInPack *= num3; float num5 = (inventorySlotAmmo.CostOfBullet *= num2); inventorySlotAmmo.Setup(num5, inventorySlotAmmo.BulletClipSize, -1f); } inventorySlotAmmo.OnBulletsUpdateCallback?.Invoke(inventorySlotAmmo.BulletsInPack); ammoStorage.UpdateSlotAmmoUI(inventorySlotAmmo, num); } } } } internal class LogManager { private static readonly ManualLogSource logger; private static readonly bool _debugMessagesActive; static LogManager() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown _debugMessagesActive = BepInExLoader.DebugMessages.Value; logger = new ManualLogSource("GTFuckingXP"); Logger.Sources.Add((ILogSource)(object)logger); } public static void Verbose(object msg) { if (_debugMessagesActive) { logger.LogInfo(msg); } } public static void Debug(object msg) { if (_debugMessagesActive) { logger.LogDebug(msg); } } public static void Message(object msg) { if (_debugMessagesActive) { logger.LogMessage(msg); } } public static void Error(object msg) { logger.LogError(msg); } public static void Warn(object msg) { logger.LogWarning(msg); } } public static class NetworkApiXpManager { private static readonly Dictionary _clientXP = new Dictionary(); private static readonly Dictionary _checkpointXP = new Dictionary(); private const string _sendXpString = "ThisSeemsLikeItComesFromTheRandomXpMod..."; private const string _initXpString = "XpModJoinClientXP"; private const string _requestXpString = "XpModClientRequestXP"; private const string _levelStatsDistribution = "ReachedSentLevel_XP"; private const string _receiveStaticXp = "XpModTriesToGiveYouSomeHalfAssedXP"; private const string _undistributedXp = "XpModGivesYouSomeXpWhereYouHadNotToDoAnything"; private const string _sendBoosterNetworkString = "MyNewBoostersEffectFromTheXpMod"; public static void Setup() { NetworkAPI.RegisterEvent("ThisSeemsLikeItComesFromTheRandomXpMod...", (Action)ReceiveXp); NetworkAPI.RegisterEvent("ReachedSentLevel_XP", (Action)ReceiveLevelReached); NetworkAPI.RegisterEvent("XpModTriesToGiveYouSomeHalfAssedXP", (Action)ReceiveStaticXp); NetworkAPI.RegisterEvent("MyNewBoostersEffectFromTheXpMod", (Action)ReceiveBoosterBuffs); NetworkAPI.RegisterEvent("XpModGivesYouSomeXpWhereYouHadNotToDoAnything", (Action)ReceiveHalfAssedXp); NetworkAPI.RegisterEvent("XpModJoinClientXP", (Action)ReceiveInitXp); NetworkAPI.RegisterEvent("XpModClientRequestXP", (Action)ReceiveRequestXp); CheckpointApi.AddCheckpointReachedCallback((Action)OnCheckpointReached); CheckpointApi.AddCheckpointReloadedCallback((Action)OnCheckpointReloaded); LevelAPI.OnLevelCleanup += OnLevelCleanup; } private static void OnLevelCleanup() { _clientXP.Clear(); _checkpointXP.Clear(); } private static void OnCheckpointReached() { _checkpointXP.Clear(); foreach (KeyValuePair item in _clientXP) { _checkpointXP.Add(item.Key, item.Value); } } private static void OnCheckpointReloaded() { _clientXP.Clear(); foreach (KeyValuePair item in _checkpointXP) { _clientXP.Add(item.Key, item.Value); } } public static void ReceiveXp(ulong snetPlayer, GtfoApiXpInfo xpData) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) LogManager.Debug("Received xp networking package"); XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { xpHandler.AddXp(xpData, new Vector3(xpData.PositionX, xpData.PositionY, xpData.PositionZ)); } } public static void ReceiveHalfAssedXp(ulong snetPlayer, GtfoApiXpInfo xpData) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { xpHandler.AddXp(xpData, new Vector3(xpData.PositionX, xpData.PositionY, xpData.PositionZ), xpData.ForceDebuffXp, "<#888>"); } } public static void ReceiveStaticXp(ulong snetPlayer, StaticXpInfo xpInfo) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) LogManager.Debug("Received static xp networking pckage"); XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { xpHandler.AddXp(xpInfo, xpInfo.Position, forceDebuffXp: false, "<#F30>"); } } public static void ReceiveInitXp(ulong snetPlayer, InitXpInfo xpInfo) { XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { xpHandler.SkipToXp(xpInfo.Xp); if (xpInfo.CheckpointXp != 0) { CacheApiWrapper.SetXpStorageData(xpInfo.CheckpointXp); } } } public static void ReceiveRequestXp(ulong lookup, bool _) { SNet_Player val = default(SNet_Player); if (_clientXP.TryGetValue(lookup, out var value) && value != 0 && SNet.TryGetPlayer(lookup, ref val)) { if (!_checkpointXP.TryGetValue(lookup, out var value2)) { value2 = 0u; } NetworkAPI.InvokeEvent("XpModJoinClientXP", new InitXpInfo(value, value2), val, (SNet_ChannelType)2); } } public static void ReceiveLevelReached(ulong snetPlayer, LevelReachedInfo levelData) { LogManager.Debug("Receive level reached info"); SNet_Player val = default(SNet_Player); if (!SNet.TryGetPlayer(snetPlayer, ref val)) { return; } Enumerator enumerator = PlayerManager.PlayerAgentsInLevel.GetEnumerator(); while (enumerator.MoveNext()) { PlayerAgent current = enumerator.Current; if (current.PlayerSlotIndex == val.PlayerSlotIndex()) { Level level; if (!CacheApiWrapper.TryGetLevelLayout(levelData.LayoutID, out LevelLayout layout)) { LogManager.Warn("Unable to retrieve level layout for " + val.NickName + "!"); layout = CacheApiWrapper.GetLevelLayouts()[0]; level = layout.Levels[0]; } else { level = layout.GetLevel(levelData.LevelNumber) ?? layout.Levels[0]; } float num = level.HealthMultiplier * CacheApiWrapper.GetDefaultMaxHp(); LogManager.Debug($"Setting HP of {((Object)current).name} to {num}"); ((Dam_SyncedDamageBase)current.Damage).HealthMax = num; CacheApiWrapper.SetPlayerActiveLevel(current.PlayerSlotIndex, new ActiveLevel(layout, level.LevelNumber)); } } } internal static void ReceiveBoosterBuffs(ulong snetPlayer, BoosterInfo newInfo) { SNet_Player val = default(SNet_Player); if (!SNet.TryGetPlayer(snetPlayer, ref val)) { return; } Enumerator enumerator = PlayerManager.PlayerAgentsInLevel.GetEnumerator(); while (enumerator.MoveNext()) { PlayerAgent current = enumerator.Current; if (current.PlayerSlotIndex == val.PlayerSlotIndex()) { BoosterBuffManager.Instance.ApplyBoosterEffects(current, newInfo); } } } public static void SendReceiveXp(SNet_Player receiver, EnemyXp xpData, Vector3 position, bool forceDebuffXp) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) TrackXp(receiver, xpData, forceDebuffXp); NetworkAPI.InvokeEvent("ThisSeemsLikeItComesFromTheRandomXpMod...", new GtfoApiXpInfo(xpData.XpGain, xpData.DebuffXp, xpData.LevelScalingXpDecrese, position, forceDebuffXp), receiver, (SNet_ChannelType)2); } public static void SendHalfAssedXp(EnemyXp xpData, Vector3 position, bool forceDebuffXp) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) Enumerator enumerator = PlayerManager.PlayerAgentsInLevel.GetEnumerator(); while (enumerator.MoveNext()) { PlayerAgent current = enumerator.Current; if (!((Agent)current).IsLocallyOwned) { TrackXp(current.Owner, xpData, forceDebuffXp); } } NetworkAPI.InvokeEvent("XpModGivesYouSomeXpWhereYouHadNotToDoAnything", new GtfoApiXpInfo(xpData.XpGain, xpData.DebuffXp, xpData.LevelScalingXpDecrese, position, forceDebuffXp), (SNet_ChannelType)2); } public static void SendNewLevelActive(Level newLevel) { NetworkAPI.InvokeEvent("ReachedSentLevel_XP", new LevelReachedInfo(CacheApiWrapper.GetCurrentLevelLayout().PersistentId, newLevel.LevelNumber), (SNet_ChannelType)2); } public static void SendBoosterStatsReached(BoosterInfo boosterInfo) { NetworkAPI.InvokeEvent("MyNewBoostersEffectFromTheXpMod", boosterInfo, (SNet_ChannelType)2); } public static void SendStaticXpInfo(SNet_Player receiver, int xpGain, int debuffXp, int levelScalingDecrease, Vector3 position) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) StaticXpInfo staticXpInfo = new StaticXpInfo(xpGain, debuffXp, levelScalingDecrease, position); TrackXp(receiver, staticXpInfo, forceDebuffXp: false); NetworkAPI.InvokeEvent("XpModTriesToGiveYouSomeHalfAssedXP", staticXpInfo, receiver, (SNet_ChannelType)2); } public static void SendRequestXp() { NetworkAPI.InvokeEvent("XpModClientRequestXP", false, SNet.Master, (SNet_ChannelType)2); } private static void TrackXp(SNet_Player receiver, IXpData xpData, bool forceDebuffXp) { int xp = xpData.GetXp(forceDebuffXp); if (!receiver.IsLocal) { _clientXP.TryAdd(receiver.Lookup, 0u); _clientXP[receiver.Lookup] = (uint)(_clientXP[receiver.Lookup] + xp); } PlayerReviveManager.AddXP(receiver.Lookup, xp); } } public static class PlayerReviveManager { private static readonly Dictionary _storedXP = new Dictionary(); private static readonly Dictionary _totalXP = new Dictionary(); private static readonly Dictionary _checkpointXP = new Dictionary(); internal static void Init() { CheckpointApi.AddCheckpointReachedCallback((Action)OnCheckpointReached); CheckpointApi.AddCheckpointReloadedCallback((Action)OnCheckpointReloaded); LevelAPI.OnLevelCleanup += OnLevelCleanup; } private static void OnLevelCleanup() { _totalXP.Clear(); _storedXP.Clear(); _checkpointXP.Clear(); } private static void OnCheckpointReached() { _checkpointXP.Clear(); foreach (KeyValuePair item in _storedXP) { _checkpointXP.Add(item.Key, (item.Value, _totalXP[item.Key])); } } private static void OnCheckpointReloaded() { _storedXP.Clear(); foreach (KeyValuePair item in _checkpointXP) { _storedXP.Add(item.Key, item.Value.Item1); } _totalXP.Clear(); foreach (KeyValuePair item2 in _checkpointXP) { _totalXP.Add(item2.Key, item2.Value.Item2); } } public static void AddXP(ulong playerLookup, int xpChange) { _storedXP.TryAdd(playerLookup, 0); _storedXP[playerLookup] += xpChange; _totalXP.TryAdd(playerLookup, 0); _totalXP[playerLookup] += xpChange; } public static void OnRevive(PlayerAgent downed, PlayerAgent reviver) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) SNet_Player owner = downed.Owner; if (_storedXP.TryGetValue(owner.Lookup, out var value)) { GlobalValues globalValues = CacheApiWrapper.GetGlobalValues(); value = (int)Math.Min((float)_totalXP[owner.Lookup] * globalValues.ReviveXpTransferCapFrac, (float)value * globalValues.ReviveXpStoredFrac); if (value > 0) { NetworkApiXpManager.SendStaticXpInfo(reviver.Owner, value, value, 0, ((Agent)downed).Position + Vector3.up * 1.5f); Vector3 val = ((Agent)downed).Position + Vector3.up * 1.5f; RaycastHit val2 = default(RaycastHit); val = ((!Physics.Raycast(val, ((Agent)downed).Forward, ref val2, 2f, LayerManager.MASK_WORLD)) ? (val + ((Agent)downed).Forward * 2f) : (((RaycastHit)(ref val2)).point - ((Agent)downed).Forward * 0.5f)); NetworkApiXpManager.SendStaticXpInfo(owner, -value, -value, 0, val); _storedXP[owner.Lookup] = 0; } } } } public static class SaveManager { private class SaveData { public string Version { get; } = "1.0.0"; public int LayoutID { get; set; } public SaveData() { } public SaveData(LevelLayout layout) { LayoutID = layout.PersistentId; } } private static readonly JsonSerializerOptions _settings; public static readonly string SavePath; private static LevelLayout? _loadedLayout; private static bool _hasLoaded; static SaveManager() { _settings = new JsonSerializerOptions { ReadCommentHandling = JsonCommentHandling.Skip, IncludeFields = true, PropertyNameCaseInsensitive = true, WriteIndented = true }; _hasLoaded = false; string text = Path.Combine(Paths.BepInExRootPath, "GameData/Favorites"); SavePath = Path.Combine(text, "XPData.json"); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } } public static void SaveLayout(LevelLayout layout) { if (layout.PersistentId != _loadedLayout?.PersistentId) { _loadedLayout = layout; SaveData value = new SaveData(layout); File.WriteAllText(SavePath, JsonSerializer.Serialize(value, _settings)); } } public static bool TryLoadLayout([MaybeNullWhen(false)] out LevelLayout layout) { if (_hasLoaded) { layout = _loadedLayout; return CheckValidLayout(); } _hasLoaded = true; if (!File.Exists(SavePath)) { layout = null; return false; } string json; try { json = File.ReadAllText(SavePath); } catch { layout = null; return false; } SaveData saveData = JsonSerializer.Deserialize(json, _settings); if (saveData == null) { layout = null; return false; } Dictionary instance = CacheApi.GetInstance>("GTF_XP"); layout = (_loadedLayout = instance.GetValueOrDefault(saveData.LayoutID)); return CheckValidLayout(); } private static bool CheckValidLayout() { return CheckValidLayout(_loadedLayout); } public static bool CheckValidLayout(LevelLayout? layout) { if (layout == null) { return false; } int groupID = layout.GroupPersistentId; return CacheApi.GetInstance>("GTF_XP").Find((Group group) => group.PersistentId == groupID)?.AllowedForCount(SNet.SessionHub.PlayersInSession.Count) ?? false; } } public class ScriptManager { [CompilerGenerated] private sealed class d__19 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__19(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if (!PlayerManager.HasLocalPlayerAgent()) { <>2__current = null; <>1__state = 1; return true; } CacheApi.SaveInstance(((Component)GuiManager.Current.m_playerLayer.m_playerStatus).gameObject.AddComponent(), "GTF_XP"); CacheApiWrapper.DestroyOldCreateRegisterAndReturnComponent(); foreach (Action scriptsStartedCallback in CacheApiWrapper.GetScriptsStartedCallbackList()) { scriptsStartedCallback(CacheApiWrapper.GetActiveLevel()); } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string EnemyXpFileName = "EnemyXp.json"; public const string ExpeditionLvlLayoutMappingFileName = "ExpeditionLvlLayouts.json"; public const string LevelLayoutFileName = "ClassLayouts.json"; public const string BoosterLayoutFileName = "BoosterEffects.json"; public const string GroupFileName = "Groups.json"; public const string GlobalFileName = "Globals.json"; private string _folderPath; private bool _initialized; public static ScriptManager Instance { get; set; } public bool IsInitialized { get; private set; } public void Initialize() { if (!_initialized) { _initialized = true; CacheApiWrapper.InitPlayerMapping(); CacheApiWrapper.SetDefaultMaxHp(GameDataBlockBase.GetBlock(1u).health); _folderPath = Path.Combine(MTFOPathAPI.CustomPath, "GtfXP"); if (!MTFOPathAPI.HasCustomPath) { LogManager.Warn("No custom MTFO folder found, using assembly path..."); _folderPath = Path.Combine(Paths.PluginPath, "XpJson"); } WriteDefaultJsonBlocks(); UpdateEverything(); EnemyKillManager.Setup(); if (SaveManager.TryLoadLayout(out LevelLayout layout)) { CacheApiWrapper.SetCurrentLevelLayout(layout); } CheckpointApi.AddCheckpointReachedCallback((Action)CreateCheckpointData); CheckpointApi.AddCheckpointCleanupCallback((Action)CheckpointsCleanup); if (BepInExLoader.RundownDevMode) { MenuApi.AddMenu("Xp dev tools"); } } } public void StartLevelScripts() { CoroutineManager.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(StartWhenPlayerExists()), (Action)null); } [IteratorStateMachine(typeof(d__19))] private IEnumerator StartWhenPlayerExists() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__19(0); } public void EndLevelScripts() { CacheApi.GetInstance("GTF_XP").HideTextUi(); CacheApiWrapper.KillScript(); CacheApiWrapper.KillScript(); CacheApiWrapper.KillScript(); CacheApiWrapper.InitPlayerMapping(); CustomScalingBuffManager.ResetCustomBuffs(); CustomScalingBuffManager.ClearDefaultCustomBuffs(); } public (List enemyXpList, List levelLayouts, List boosterBuffs, List groups, GlobalValues globals) ReadJsonBlocks() { bool flag = _folderPath.Contains("BepInEx"); List list = (flag ? BuffJson.Deserialize>(File.ReadAllText(Path.Combine(_folderPath, "EnemyXp.json"))) : DefaultXpData.GetDefaultEnemyXp()); if (list == null || list.Count == 0) { LogManager.Warn("No Data received for enemies!"); } List list2 = BuffJson.Deserialize>(flag ? File.ReadAllText(Path.Combine(_folderPath, "ClassLayouts.json")) : "\r\n[\r\n {\r\n \"Header\": \"Generalist\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 13,\r\n \"InfoText\": \"Good at everything, best at nothing.\\nMax LV 10 Bonus: Double Jump\\n\\nBonuses Each LV up:\\n+2% Damage\\n+2% Armor\\n+2% Infection Resist\\n+10% Hack Skill\\n-5% Terminal Delay\\n+5% Tool Power\\n+5% Repeller Power\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\\n1% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 100% -> 102%\\nArmor 100% -> 102%\\nInfect Res. 0% -> 2%\\nHacking 100% - > 110%\\nTerminal Delay 100% -> 95%\\nTool Power 100% -> 105%\\nRepeller 100% -> 105%\\nSpeed 100% -> 101%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 300,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 102% -> 104%\\nArmor 102% -> 104%\\nInfect Res. 2% -> 4%\\nHacking 110% - > 120%\\nTerminal Delay 95% -> 90%\\nTool Power 105% -> 110%\\nRepeller 105% -> 110%\\nSpeed 101% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.02,\r\n \"WeaponDamageMultiplier\": 1.02,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.01\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 104% -> 106%\\nArmor 104% -> 106%\\nInfect Res. 4% -> 6%\\nHacking 120% - > 130%\\nTerminal Delay 90% -> 85%\\nTool Power 110% -> 115%\\nRepeller 110% -> 115%\\nSpeed 102% -> 103%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.04,\r\n \"WeaponDamageMultiplier\": 1.04,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 106% -> 108%\\nArmor 106% -> 108%\\nInfect Res. 6% -> 8%\\nHacking 130% - > 140%\\nTerminal Delay 85% -> 80%\\nTool Power 115% -> 120%\\nRepeller 115% -> 120%\\nSpeed 103% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.06,\r\n \"WeaponDamageMultiplier\": 1.06,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.03\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 108% -> 110%\\nArmor 108% -> 110%\\nInfect Res. 8% -> 10%\\nHacking 140% - > 150%\\nTerminal Delay 80% -> 75%\\nTool Power 120% > 125%\\nRepeller 120% -> 125%\\nSpeed 104% -> 105%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.08,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 3025,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 110% -> 112%\\nArmor 110% -> 112%\\nInfect Res. 10% -> 12%\\nHacking 150% -> 160%\\nTerminal Delay 75% -> 70%\\nTool Power 125% -> 130%\\nRepeller 125% -> 130%\\nSpeed 105% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.1,\r\n \"WeaponDamageMultiplier\": 1.1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.05\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3975,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 112% -> 114%\\nArmor 112% -> 114%\\nInfect Res. 12% -> 14%\\nHacking 160% -> 170%\\nTerminal Delay 70% -> 65%\\nTool Power 130% -> 135%\\nRepeller 130% -> 135%\\nSpeed 106% -> 107%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.12,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 5100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 114% -> 116%\\nArmor 114% -> 116%\\nInfect Res. 14% -> 16%\\nHacking 170% -> 180%\\nTerminal Delay 65% -> 60%\\nTool Power 135% -> 140%\\nRepeller 135% -> 140%\\nSpeed 107% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.14,\r\n \"WeaponDamageMultiplier\": 1.14,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.07\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 6300,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 116% -> 118%\\nArmor 116% -> 118%\\nInfect Res. 16% -> 18%\\nHacking 180% -> 190%\\nTerminal Delay 60% -> 55%\\nTool Power 140% -> 145%\\nRepeller 140% -> 145%\\nSpeed 108% -> 109%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.16,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 7575,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 118% -> 120%\\nArmor 118% -> 120%\\nInfect Res. 18% -> 20%\\nHacking 190% -> 200%\\nTerminal Delay 55% -> 50%\\nTool Power 145% -> 150%\\nRepeller 145% -> 150%\\nSpeed 109% -> 110%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.18,\r\n \"WeaponDamageMultiplier\": 1.18,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.09\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8925,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\n+Double Jump\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 120%\\nArmor 120%\\nInfect Res. 20%\\nHacking 200%\\nTerminal Delay 50%\\nTool Power 150%\\nRepeller 150%\\nSpeed 110%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.2,\r\n \"WeaponDamageMultiplier\": 1.2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Soldier\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 2,\r\n \"InfoText\": \"Specialized in ranged combat. Stronger guns with ammo refunds on each level up.\\nMax LV 10 bonus: +35% HP Regen Speed\\n\\nBonuses Each LV up:\\n+4% Gun Damage\\n+4% Ammo Refill\\n\\nBonus Each 5 LVs:\\n+6% Ammo Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.04,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 116% -> 120%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n10% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 120% -> 124%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.2,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.1\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 124% -> 128%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 128% -> 132%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.28,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 5700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 132% -> 136%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.32,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 6900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 136% -> 140%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.36,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8200,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +4%\\n10% Ammo Refill\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 140%\\nRegen Speed 135%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.4,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.1\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Marine\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 9,\r\n \"InfoText\": \"Specialized in ranged combat. Powerful weapons but with poor Armor.\\nStarting Debuff: -40% Armor\\nMax LV 10\\n\\nBonuses Each LV up:\\n+8% Gun Damage\\n+3% Armor\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 100% -> 108%\\nArmor 60% -> 63%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 85,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 108% -> 116%\\nArmor 63% -> 66%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 510,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 116% -> 124%\\nArmor 66% -> 69%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1020,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 124% -> 132%\\nArmor 69% -> 72%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1615,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 132% -> 140%\\nArmor 72% -> 75%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.32,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2295,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 140% -> 148%\\nArmor 75% -> 78%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.4,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3060,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 148% -> 156%\\nArmor 78% -> 81%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.48,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 3910,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 156% -> 164%\\nArmor 81% -> 84%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.56,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4845,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 164% -> 172%\\nArmor 84% -> 87%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.64,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5865,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 172% -> 180%\\nArmor 87% -> 90%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.72,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6970,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 180%\\nArmor 90%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.8,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Hunter\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 7,\r\n \"InfoText\": \"Specialized in melee combat. Deal high melee damage while gaining light Armor for survivability.\\nMax LV 5 bonus: Double Jump\\nLV 1 bonus: 125% Melee Damage\\n\\nBonuses Each LV up:\\n+4% Armor\\n+4% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 100% -> 225%\\nArmor 100% -> 104%\\nSpeed 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee +125%\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 104% -> 108%\\nSpeed 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 108% -> 112%\\nSpeed 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 112% -> 116%\\nSpeed 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 116% -> 120%\\nSpeed 116% -> 120%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +4%\\nSpeed +4%\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 120%\\nSpeed 120%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Assassin\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 8,\r\n \"InfoText\": \"Specialized in melee combat. Devastating in stealth and combat but with very poor survivability.\\nStarting Debuff: -45% Armor\\nMax LV 5 bonus: Double Jump\\nLV 1 bonus: 215% Melee Damage\\n\\nBonuses Each LV up:\\n+5% Armor\\n+4% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 100% -> 315%\\nArmor 55% -> 60%\\nSpeed 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.0\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee +215%\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 60% -> 65%\\nSpeed 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 65% -> 70%\\nSpeed 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 70% -> 75%\\nSpeed 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.12\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 75% -> 80%\\nSpeed 116% -> 120%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +5%\\nSpeed +4%\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 80%\\nSpeed 120%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Fighter\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 10,\r\n \"InfoText\": \"Specialized in general combat. Improved damage with all guns and melee.\\nMax LV 10\\n\\nBonuses Each LV up:\\n+3% Gun Damage\\n+6% Melee Damage\\n+1% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 100% -> 103%\\nMelee Damage 100% -> 106%\\nSpeed 100% -> 101%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +6%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 103% -> 106%\\nMelee Damage 106% -> 112%\\nSpeed 101% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.06,\r\n \"WeaponDamageMultiplier\": 1.03,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.01\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 106% -> 109%\\nMelee Damage 112% -> 118%\\nSpeed 102% -> 103%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.12,\r\n \"WeaponDamageMultiplier\": 1.06,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 109% -> 112%\\nMelee Damage 118% -> 124%\\nSpeed 103% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.18,\r\n \"WeaponDamageMultiplier\": 1.09,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.03\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 112% -> 115%\\nMelee Damage 124% -> 130%\\nSpeed 104% -> 105%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.24,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 115% -> 118%\\nMelee Damage 130% -> 136%\\nSpeed 105% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.3,\r\n \"WeaponDamageMultiplier\": 1.15,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.05\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 118% -> 121%\\nMelee Damage 136% -> 142%\\nSpeed 106% -> 107%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.36,\r\n \"WeaponDamageMultiplier\": 1.18,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 121% -> 124%\\nMelee Damage 142% -> 148%\\nSpeed 107% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.42,\r\n \"WeaponDamageMultiplier\": 1.21,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.07\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 5700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 124% -> 127%\\nMelee Damage 148% -> 154%\\nSpeed 108% -> 109%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.48,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 6900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 127% -> 130%\\nMelee Damage 154% -> 160%\\nSpeed 109% -> 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.54,\r\n \"WeaponDamageMultiplier\": 1.27,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.09\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8200,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 130%\\nMelee Damage 160%\\nSpeed 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.6,\r\n \"WeaponDamageMultiplier\": 1.3,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Survivalist\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 3,\r\n \"InfoText\": \"Increased odds of survival in extreme conditions. Endure any scenario.\\nMax LV 15 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+3% Armor\\n+3% Infect Resist\\n10% Heal\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 100% -> 103%\\nInfect Res. 0% -> 3%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 103% -> 106%\\nInfect Res. 0% -> 3%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 106% -> 109%\\nInfect Res. 3% -> 6%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 109% -> 112%\\nInfect Res. 6% -> 9%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 112% -> 115%\\nInfect Res. 9% -> 12%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2550,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 115% -> 118%\\nInfect Res. 12% -> 15%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3300, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 118% -> 121%\\nInfect Res. 15% -> 18%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4100, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 121% -> 124%\\nInfect Res. 18% -> 21%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4950, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 124% -> 127%\\nInfect Res. 21% -> 24%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 127% -> 130%\\nInfect Res. 24% -> 27%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 130% -> 133%\\nInfect Res. 27% -> 30%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 11,\r\n \"TotalXpRequired\": 7950,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 133% -> 136%\\nInfect Res. 30% -> 33%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 12,\r\n \"TotalXpRequired\": 9150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 136% -> 139%\\nInfect Res. 33% -> 36%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 13,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 139% -> 142%\\nInfect Res. 36% -> 39%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 14,\r\n \"TotalXpRequired\": 11850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 142% -> 145%\\nInfect Res. 39% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 15,\r\n \"TotalXpRequired\": 13350,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +3%\\nInfection Res. +61%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 145%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Outlander\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 11,\r\n \"InfoText\": \"Specialized for surviving on the run. Greatly improved Projectile Armor and Infect Resist.\\nMax LV 15\\nLV 1 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+2% Melee Armor\\n+5% Projectile Armor\\n10% Heal\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 100% -> 102%\\nProjectile Armor 100% -> 105%\\nInfect Res. 0% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 102% -> 104%\\nProjectile Armor 105% -> 110%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 104% -> 106%\\nProjectile Armor 110% -> 115%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 106% -> 108%\\nProjectile Armor 115% -> 120%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 108% -> 110%\\nProjectile Armor 120% -> 125%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2550,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 110% -> 112%\\nProjectile Armor 125% -> 130%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3300, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 112% -> 114%\\nProjectile Armor 130% -> 135%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4100, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 114% -> 116%\\nProjectile Armor 135% -> 140%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4950, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 116% -> 118%\\nProjectile Armor 140% -> 145%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 118% -> 120%\\nProjectile Armor 145% -> 150%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 120% -> 122%\\nProjectile Armor 150% -> 155%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 11,\r\n \"TotalXpRequired\": 7950,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 122% -> 124%\\nProjectile Armor 155% -> 160%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 12,\r\n \"TotalXpRequired\": 9150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 124% -> 126%\\nProjectile Armor 160% -> 165%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 13,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 126% -> 128%\\nProjectile Armor 165% -> 170%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 14,\r\n \"TotalXpRequired\": 11850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 128% -> 130%\\nProjectile Armor 170% -> 175%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 15,\r\n \"TotalXpRequired\": 13350,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 130%\\nProjectile Armor 175%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Doctor\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 4,\r\n \"InfoText\": \"Specialized in keeping the team alive. Ensures that the team recovers quickly in bad scenarios.\\nMax LV 5 bonus: +15% Armor\\n\\nBonuses Each LV up:\\n+25% Revive Speed\\n+35% HP Regen Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 4 -> 3.2 sec.\\nRegen Speed 100% -> 135%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.8 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 3.2 -> 2.7 sec.\\nRegen Speed 135% -> 170%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.5 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2.7 -> 2.3 sec.\\nRegen Speed 170% -> 205%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.4 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2.3 -> 2 sec.\\nRegen Speed 205% -> 240%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2 -> 1.8 sec.\\nRegen Speed 240% -> 275%\\nArmor 100% -> 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRevive -0.2 sec.\\nRegen Speed +35%\\nArmor +15%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 1.8 sec.\\nRegen Speed 275%\\nArmor 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Field Medic\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 12,\r\n \"InfoText\": \"Specialized in keeping the team alive. Great survivability and team support.\\nMax LV 5 Bonus: +50% Infect Resist\\n\\nBonuses Each LV up:\\n+10% Revive Speed\\n+35% HP Regen Speed\\n+4% Armor\\n+5% Infect Resist\\n+2% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 4 -> 3.6 sec.\\nRegen Speed 100% -> 135%\\nArmor 100% -> 104%\\nInfect Res. 0% -> 5%\\nSpeed 100% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.4 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3.6 -> 3.3 sec.\\nRegen Speed 135% -> 170%\\nArmor 104% -> 108%\\nInfect Res. 5% -> 10%\\nSpeed 102% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3.3 -> 3 sec.\\nRegen Speed 170% -> 205%\\nArmor 108% -> 112%\\nInfect Res. 10% -> 15%\\nSpeed 104% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3 -> 2.8 sec.\\nRegen Speed 205% -> 240%\\nArmor 112% -> 116%\\nInfect Res. 15% -> 20%\\nSpeed 106% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.2 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 2.8 -> 2.7 sec.\\nRegen Speed 240% -> 275%\\nArmor 116% -> 120%\\nInfect Res. 20% -> 75%\\nSpeed 108% -> 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRevive -0.1 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +55%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 2.7 sec.\\nRegen Speed 275%\\nArmor 120%\\nInfect Res. 75%\\nSpeed 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Trailblazer\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 15,\r\n \"InfoText\": \"Specialized in leaving everyone else in the dust. Superior mobility ensures survival when all else fails.\\nMax LV 5 Bonus: Infect Immune, Double Jump\\n\\nBonuses Each LV up:\\n+20% HP Regen Speed\\n+8% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 100% -> 120%\\nSpeed 100% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 120% -> 140%\\nSpeed 108% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 140% -> 160%\\nSpeed 116% -> 124%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 160% -> 180%\\nSpeed 124% -> 132%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.24\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 180% -> 200%\\nInfect Resist 0% -> Immune\\nSpeed 132% -> 140%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.32\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRegen Speed +20%\\nInfect Immune\\n+8% Speed\\nDouble Jump\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 200%\\nInfect Immune\\nSpeed 140%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.4\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Technician\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 5,\r\n \"InfoText\": \"Specialized in supporting the team and resourcing. Keeps the team informed in more scenarios.\\nMax LV 5 bonus: EZ Hack, Instant Terminals\\n\\nBonuses Each LV up:\\n+55% Hack Skill\\n-20% Terminal Delay\\n+15% Tool Power\\n+20% Repeller Power\\n+8% Tool Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 100% - > 155%\\nTerminal Delay 100% -> 80%\\nTool Power 100% -> 115%\\nRepeller 100% -> 120%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 400,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 155% - > 210%\\nTerminal Delay 80% -> 60%\\nTool Power 115% -> 130%\\nRepeller 120% -> 140%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1000,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 210% - > 265%\\nTerminal Delay 60% -> 40%\\nTool Power 130% -> 145%\\nRepeller 140% -> 160%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 265% - > 320%\\nTerminal Delay 40% -> 20%\\nTool Power 145% -> 160%\\nRepeller 160% -> 180%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 320% - > EZ\\nTerminal Delay 20% -> Instant\\nTool Power 160% > 175%\\nRepeller 180% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4000,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nEZ Hacking\\nInstant Terminal Delay\\n+15% Tool Power\\n+20% Repeller\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nEZ Hacking\\nInstant Terminals\\nTool Power 175%\\nRepeller 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Gas Breather\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 16,\r\n \"InfoText\": \"Specialized in traversing infectious environments. Utilizes heavily modified fog repellers to devastating effect.\\nMax LV 5 bonus: Global Fog Repeller\\nLV 1 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+15% Tool Power\\n+60% Repeller Power\\n+8% Tool Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 100% -> 115%\\nRepeller 100% -> 160%\\nInfect Resist 0% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 400,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 115% -> 130%\\nRepeller 160% -> 220%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1000,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 130% -> 145%\\nRepeller 220% -> 280%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 145% -> 160%\\nRepeller 280% -> 340%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 160% > 175%\\nRepeller 340% -> Global\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4000,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\n+15% Tool Power\\nGlobal Fog Repeller\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 175%\\nGlobal Fog Repeller\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Masochist\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 6,\r\n \"InfoText\": \"Specialized in suffering. Struggles for a long time, then becomes the strongest.\\nStarting Debuff: -50% Armor\\nMax LV 5 bonus: +80% Damage,\\n+50% Max HP +50% Med Eff.\\n\\nBonuses Each LV up:\\n-4% Armor\\n+50% HP Regen Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 50% -> 46%\\nRegen Speed 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 440,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 46% -> 42%\\nRegen Speed 150% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 42% -> 38%\\nRegen Speed 200% -> 250%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1980,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 38% -> 34%\\nRegen Speed 250% -> 300%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3080,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 34% -> 30%\\nRegen Speed 300% -> 0%\\nDamage 100% -> 180%\\nMax HP 20 -> 30\\nMed Eff. 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4400,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nDamage +80%\\nArmor -4%\\n+10 Max HP\\n+50% Med Eff.\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 30%\\nDamage 180%\\nMax HP +50%\\nMed Eff. 150%\",\r\n \"HealthMultiplier\": 1.5,\r\n \"MeleeDamageMultiplier\": 1.8,\r\n \"WeaponDamageMultiplier\": 1.8,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Isolated\",\r\n \"GroupPersistentId\": 3,\r\n \"PersistentId\": 14,\r\n \"InfoText\": \"You are the last alive. Stay alive at all costs and complete the mission.\\nLV 5 & Max LV 10 bonus: +40% Ammo Refill, +40% Tool Refill, +40% Heal\\n\\nPerks Each Level:\\nLV1: Speed Demon\\nLV2: Damage Amp\\nLV3: Endurance\\nLV4: Regeneration\\nLV5: Technician\\nLV6: Double Jump\\nLV7: +50% Bioscan Speed\\nLV8: Speed Demon II\\nLV9: Gas Breather\\nLV10: Godlike Regeneration\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 100% -> 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nSpeed +15%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 100% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nDamage +100%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 100% -> 150%\\nInfect Res. 0% -> 50%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +50%\\nInfect Res. +50%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 100% -> 200%\\nRegen Cap 25 -> 50\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +100%\\nRegen Cap +25\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 100% -> 150%\\nHacking 100% -> EZ\\nTerminal Delay 100% -> Instant\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+50% Tool Power\\nEZ Hack\\nInstant Terminals\\n40% Ammo Refill\\n40% Tool Refill\\n40% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.4\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 8050,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+50% Bioscan Speed\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115% -> 130%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 12850,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+15% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50% -> Immune\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 15250,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\nInfect Immune\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Immune\\nRegen Speed 200% -> 350%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 17650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGodlike Regeneration\\n40% Ammo Refill\\n40% Tool Refill\\n40% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Legendary\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Immune\\nRegen Speed 350%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.4\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n]\r\n"); if (list2 == null || list2.Count == 0) { LogManager.Warn("No Data found for XpLayouts/LevelLayouts!"); } else { foreach (LevelLayout item in list2) { item.OnReadDone(); } } List list3 = BuffJson.Deserialize>(flag ? File.ReadAllText(Path.Combine(_folderPath, "BoosterEffects.json")) : "\r\n[\r\n {\r\n \"ClassLayoutPersistentId\": 2,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.03,\r\n \"ProjectileResistance\": 1.03,\r\n \"InfectionResistance\": 1.03\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.06,\r\n \"InfectionResistance\": 1.06\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.09,\r\n \"ProjectileResistance\": 1.09,\r\n \"InfectionResistance\": 1.09\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.15,\r\n \"ProjectileResistance\": 1.15,\r\n \"InfectionResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.18,\r\n \"InfectionResistance\": 1.18\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.21,\r\n \"ProjectileResistance\": 1.21,\r\n \"InfectionResistance\": 1.21\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.24,\r\n \"ProjectileResistance\": 1.24,\r\n \"InfectionResistance\": 1.24\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.27,\r\n \"ProjectileResistance\": 1.27,\r\n \"InfectionResistance\": 1.27\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.3,\r\n \"ProjectileResistance\": 1.3,\r\n \"InfectionResistance\": 1.3\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 11\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.33,\r\n \"ProjectileResistance\": 1.33,\r\n \"InfectionResistance\": 1.33\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 12\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.36,\r\n \"ProjectileResistance\": 1.36,\r\n \"InfectionResistance\": 1.36\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 13\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.39,\r\n \"ProjectileResistance\": 1.39,\r\n \"InfectionResistance\": 1.39\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 14\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.42,\r\n \"ProjectileResistance\": 1.42,\r\n \"InfectionResistance\": 1.42\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 15\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.45,\r\n \"ProjectileResistance\": 1.45,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35,\r\n \"ReviveSpeedSupport\": 1.25\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.7,\r\n \"ReviveSpeedSupport\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.05,\r\n \"ReviveSpeedSupport\": 1.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.40,\r\n \"ReviveSpeedSupport\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.75,\r\n \"ReviveSpeedSupport\": 2.25,\r\n \"MeleeResistance\": 1.15,\r\n \"ProjectileResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 15,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35,\r\n \"ReviveSpeedSupport\": 1.1,\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04,\r\n \"InfectionResistance\": 1.05\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.7,\r\n \"ReviveSpeedSupport\": 1.2,\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08,\r\n \"InfectionResistance\": 1.1\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.05,\r\n \"ReviveSpeedSupport\": 1.3,\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.40,\r\n \"ReviveSpeedSupport\": 1.4,\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16,\r\n \"InfectionResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.75,\r\n \"ReviveSpeedSupport\": 1.5,\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.55,\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"ComputerProcessingSpeed\": 1.2,\r\n \"FogRepellerEffect\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.1,\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"ComputerProcessingSpeed\": 1.4,\r\n \"FogRepellerEffect\": 1.4\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.65,\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"ComputerProcessingSpeed\": 1.6,\r\n \"FogRepellerEffect\": 1.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 3.2,\r\n \"ScannerRechargeSpeed\": 1.6,\r\n \"SentryGunDamage\": 1.6,\r\n \"GlueEfficiency\": 1.6,\r\n \"TripMineDamage\": 1.6,\r\n \"ComputerProcessingSpeed\": 1.8,\r\n \"FogRepellerEffect\": 1.8\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.8,\r\n \"SentryGunDamage\": 1.75,\r\n \"GlueEfficiency\": 1.75,\r\n \"TripMineDamage\": 1.75,\r\n \"ComputerProcessingSpeed\": 999.0,\r\n \"FogRepellerEffect\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.5,\r\n \"ProjectileResistance\": 0.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.5,\r\n \"MeleeResistance\": 0.46,\r\n \"ProjectileResistance\": 0.46\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.0,\r\n \"MeleeResistance\": 0.42,\r\n \"ProjectileResistance\": 0.42\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.5,\r\n \"MeleeResistance\": 0.38,\r\n \"ProjectileResistance\": 0.38\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 3.0,\r\n \"MeleeResistance\": 0.34,\r\n \"ProjectileResistance\": 0.34\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 3.5,\r\n \"MeleeResistance\": 0.3,\r\n \"ProjectileResistance\": 0.3\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 0\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.55,\r\n \"ProjectileResistance\": 0.55\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.6,\r\n \"ProjectileResistance\": 0.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.65,\r\n \"ProjectileResistance\": 0.65\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.7,\r\n \"ProjectileResistance\": 0.7\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.75,\r\n \"ProjectileResistance\": 0.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.8,\r\n \"ProjectileResistance\": 0.8\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 0\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.6,\r\n \"ProjectileResistance\": 0.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.63,\r\n \"ProjectileResistance\": 0.63\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.66,\r\n \"ProjectileResistance\": 0.66\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.69,\r\n \"ProjectileResistance\": 0.69\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.72,\r\n \"ProjectileResistance\": 0.72\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.75,\r\n \"ProjectileResistance\": 0.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.78,\r\n \"ProjectileResistance\": 0.78\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.81,\r\n \"ProjectileResistance\": 0.81\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.84,\r\n \"ProjectileResistance\": 0.84\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.87,\r\n \"ProjectileResistance\": 0.87\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.9,\r\n \"ProjectileResistance\": 0.9\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.02,\r\n \"ProjectileResistance\": 1.05,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.1,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.15,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.10,\r\n \"ProjectileResistance\": 1.25,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.3,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.14,\r\n \"ProjectileResistance\": 1.35,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.4,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.45,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 11\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.22,\r\n \"ProjectileResistance\": 1.55,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 12\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.24,\r\n \"ProjectileResistance\": 1.6,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 13\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.26,\r\n \"ProjectileResistance\": 1.65,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 14\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.28,\r\n \"ProjectileResistance\": 1.7,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 15\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.3,\r\n \"ProjectileResistance\": 1.75,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"FogRepellerEffect\": 1.6,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"FogRepellerEffect\": 2.2,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"FogRepellerEffect\": 2.8,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.6,\r\n \"SentryGunDamage\": 1.6,\r\n \"GlueEfficiency\": 1.6,\r\n \"TripMineDamage\": 1.6,\r\n \"FogRepellerEffect\": 3.4,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.75,\r\n \"GlueEfficiency\": 1.75,\r\n \"TripMineDamage\": 1.75,\r\n \"FogRepellerEffect\": 15.0,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.1,\r\n \"ScannerRechargeSpeed\": 1.05,\r\n \"SentryGunDamage\": 1.05,\r\n \"GlueEfficiency\": 1.05,\r\n \"TripMineDamage\": 1.05,\r\n \"ComputerProcessingSpeed\": 1.05,\r\n \"FogRepellerEffect\": 1.05,\r\n \"MeleeResistance\": 1.02,\r\n \"ProjectileResistance\": 1.02,\r\n \"InfectionResistance\": 1.02\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.2,\r\n \"ScannerRechargeSpeed\": 1.1,\r\n \"SentryGunDamage\": 1.1,\r\n \"GlueEfficiency\": 1.1,\r\n \"TripMineDamage\": 1.1,\r\n \"ComputerProcessingSpeed\": 1.1,\r\n \"FogRepellerEffect\": 1.1,\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04,\r\n \"InfectionResistance\": 1.04\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.3,\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"ComputerProcessingSpeed\": 1.15,\r\n \"FogRepellerEffect\": 1.15,\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.06,\r\n \"InfectionResistance\": 1.06\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.4,\r\n \"ScannerRechargeSpeed\": 1.2,\r\n \"SentryGunDamage\": 1.2,\r\n \"GlueEfficiency\": 1.2,\r\n \"TripMineDamage\": 1.2,\r\n \"ComputerProcessingSpeed\": 1.2,\r\n \"FogRepellerEffect\": 1.2,\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08,\r\n \"InfectionResistance\": 1.08\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.5,\r\n \"ScannerRechargeSpeed\": 1.25,\r\n \"SentryGunDamage\": 1.25,\r\n \"GlueEfficiency\": 1.25,\r\n \"TripMineDamage\": 1.25,\r\n \"ComputerProcessingSpeed\": 1.25,\r\n \"FogRepellerEffect\": 1.25,\r\n \"MeleeResistance\": 1.1,\r\n \"ProjectileResistance\": 1.1,\r\n \"InfectionResistance\": 1.1\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.6,\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"ComputerProcessingSpeed\": 1.3,\r\n \"FogRepellerEffect\": 1.3,\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.7,\r\n \"ScannerRechargeSpeed\": 1.35,\r\n \"SentryGunDamage\": 1.35,\r\n \"GlueEfficiency\": 1.35,\r\n \"TripMineDamage\": 1.35,\r\n \"ComputerProcessingSpeed\": 1.35,\r\n \"FogRepellerEffect\": 1.35,\r\n \"MeleeResistance\": 1.14,\r\n \"ProjectileResistance\": 1.14,\r\n \"InfectionResistance\": 1.14\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.8,\r\n \"ScannerRechargeSpeed\": 1.4,\r\n \"SentryGunDamage\": 1.4,\r\n \"GlueEfficiency\": 1.4,\r\n \"TripMineDamage\": 1.4,\r\n \"ComputerProcessingSpeed\": 1.4,\r\n \"FogRepellerEffect\": 1.4,\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16,\r\n \"InfectionResistance\": 1.16\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.9,\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"ComputerProcessingSpeed\": 1.45,\r\n \"FogRepellerEffect\": 1.45,\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.18,\r\n \"InfectionResistance\": 1.18\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"ComputerProcessingSpeed\": 1.5,\r\n \"FogRepellerEffect\": 1.5,\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2.0,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2.0,\r\n \"RegenerationSpeed\": 3.5,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n }\r\n]\r\n"); if (list3 == null || list3.Count == 0) { LogManager.Warn("No Data found for BoosterEffectLayouts!"); } List list4 = BuffJson.Deserialize>(flag ? File.ReadAllText(Path.Combine(_folderPath, "Groups.json")) : "\r\n[\r\n {\r\n \"PersistentId\": 0,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Combat\"\r\n },\r\n {\r\n \"PersistentId\": 1,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Survival\"\r\n },\r\n {\r\n \"PersistentId\": 2,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Utility\"\r\n },\r\n {\r\n \"PersistentId\": 3,\r\n \"VisibleForPlayerCount\": [\r\n 1\r\n ],\r\n \"Name\": \"Solo\"\r\n }\r\n]\r\n"); if (list4 == null || list4.Count == 0) { LogManager.Warn("No data found for Groups!"); } GlobalValues globalValues = (flag ? BuffJson.Deserialize(File.ReadAllText(Path.Combine(_folderPath, "Globals.json"))) : new GlobalValues()); if (globalValues == null) { LogManager.Warn("No data found for Globals!"); } return (list, list2, list3, list4, globalValues); } public void UpdateEverything() { (List, List, List, List, GlobalValues) tuple = ReadJsonBlocks(); LogManager.Debug($"Received: {tuple.Item1.Count} enemies, {tuple.Item2.Count} levelLayouts, {tuple.Item3.Count} BoosterLayouts, {tuple.Item4.Count} Groups"); CacheApi.SaveInstance>(tuple.Item1, "GTF_XP"); CacheApi.SaveInstance>(tuple.Item2, "GTF_XP"); CacheApi.SaveInstance>(tuple.Item3, "GTF_XP"); CacheApi.SaveInstance>(tuple.Item4, "GTF_XP"); CacheApi.SaveInstance(tuple.Item5, "GTF_XP"); Dictionary dictionary = new Dictionary(tuple.Item2.Count); foreach (LevelLayout item in tuple.Item2) { if (!dictionary.TryAdd(item.PersistentId, item)) { LogManager.Warn($"Detected duplicate level layout ID {item.PersistentId} - {item.Header} & {dictionary[item.PersistentId].Header}"); } } CacheApi.SaveInstance>(dictionary, "GTF_XP"); } public string GetFolderPath() { return _folderPath; } private void WriteDefaultJsonBlocks() { LogManager.Debug("Writing default JsonBlocks..."); if (!_folderPath.Contains("BepInEx")) { return; } if (!Directory.Exists(_folderPath)) { Directory.CreateDirectory(_folderPath); } JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { IncludeFields = true, ReadCommentHandling = JsonCommentHandling.Skip, PropertyNameCaseInsensitive = true, WriteIndented = true }; jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); string path = Path.Combine(_folderPath, "EnemyXp.json"); if (!File.Exists(path)) { File.WriteAllText(path, JsonSerializer.Serialize(DefaultXpData.GetDefaultEnemyXp(), jsonSerializerOptions)); } string path2 = Path.Combine(_folderPath, "ClassLayouts.json"); if (!File.Exists(path2)) { File.WriteAllText(path2, "\r\n[\r\n {\r\n \"Header\": \"Generalist\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 13,\r\n \"InfoText\": \"Good at everything, best at nothing.\\nMax LV 10 Bonus: Double Jump\\n\\nBonuses Each LV up:\\n+2% Damage\\n+2% Armor\\n+2% Infection Resist\\n+10% Hack Skill\\n-5% Terminal Delay\\n+5% Tool Power\\n+5% Repeller Power\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\\n1% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 100% -> 102%\\nArmor 100% -> 102%\\nInfect Res. 0% -> 2%\\nHacking 100% - > 110%\\nTerminal Delay 100% -> 95%\\nTool Power 100% -> 105%\\nRepeller 100% -> 105%\\nSpeed 100% -> 101%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 300,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 102% -> 104%\\nArmor 102% -> 104%\\nInfect Res. 2% -> 4%\\nHacking 110% - > 120%\\nTerminal Delay 95% -> 90%\\nTool Power 105% -> 110%\\nRepeller 105% -> 110%\\nSpeed 101% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.02,\r\n \"WeaponDamageMultiplier\": 1.02,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.01\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 104% -> 106%\\nArmor 104% -> 106%\\nInfect Res. 4% -> 6%\\nHacking 120% - > 130%\\nTerminal Delay 90% -> 85%\\nTool Power 110% -> 115%\\nRepeller 110% -> 115%\\nSpeed 102% -> 103%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.04,\r\n \"WeaponDamageMultiplier\": 1.04,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 106% -> 108%\\nArmor 106% -> 108%\\nInfect Res. 6% -> 8%\\nHacking 130% - > 140%\\nTerminal Delay 85% -> 80%\\nTool Power 115% -> 120%\\nRepeller 115% -> 120%\\nSpeed 103% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.06,\r\n \"WeaponDamageMultiplier\": 1.06,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.03\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 108% -> 110%\\nArmor 108% -> 110%\\nInfect Res. 8% -> 10%\\nHacking 140% - > 150%\\nTerminal Delay 80% -> 75%\\nTool Power 120% > 125%\\nRepeller 120% -> 125%\\nSpeed 104% -> 105%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.08,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 3025,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 110% -> 112%\\nArmor 110% -> 112%\\nInfect Res. 10% -> 12%\\nHacking 150% -> 160%\\nTerminal Delay 75% -> 70%\\nTool Power 125% -> 130%\\nRepeller 125% -> 130%\\nSpeed 105% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.1,\r\n \"WeaponDamageMultiplier\": 1.1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.05\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3975,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 112% -> 114%\\nArmor 112% -> 114%\\nInfect Res. 12% -> 14%\\nHacking 160% -> 170%\\nTerminal Delay 70% -> 65%\\nTool Power 130% -> 135%\\nRepeller 130% -> 135%\\nSpeed 106% -> 107%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.12,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 5100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 114% -> 116%\\nArmor 114% -> 116%\\nInfect Res. 14% -> 16%\\nHacking 170% -> 180%\\nTerminal Delay 65% -> 60%\\nTool Power 135% -> 140%\\nRepeller 135% -> 140%\\nSpeed 107% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.14,\r\n \"WeaponDamageMultiplier\": 1.14,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.07\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 6300,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 116% -> 118%\\nArmor 116% -> 118%\\nInfect Res. 16% -> 18%\\nHacking 180% -> 190%\\nTerminal Delay 60% -> 55%\\nTool Power 140% -> 145%\\nRepeller 140% -> 145%\\nSpeed 108% -> 109%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.16,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 7575,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 118% -> 120%\\nArmor 118% -> 120%\\nInfect Res. 18% -> 20%\\nHacking 190% -> 200%\\nTerminal Delay 55% -> 50%\\nTool Power 145% -> 150%\\nRepeller 145% -> 150%\\nSpeed 109% -> 110%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.18,\r\n \"WeaponDamageMultiplier\": 1.18,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.09\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8925,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\n+Double Jump\\n2% Ammo Refill\\n2% Tool Refill\\n4% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Generalist\\n{0}\\nDamage 120%\\nArmor 120%\\nInfect Res. 20%\\nHacking 200%\\nTerminal Delay 50%\\nTool Power 150%\\nRepeller 150%\\nSpeed 110%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.2,\r\n \"WeaponDamageMultiplier\": 1.2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.02\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.02\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Soldier\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 2,\r\n \"InfoText\": \"Specialized in ranged combat. Stronger guns with ammo refunds on each level up.\\nMax LV 10 bonus: +35% HP Regen Speed\\n\\nBonuses Each LV up:\\n+4% Gun Damage\\n+4% Ammo Refill\\n\\nBonus Each 5 LVs:\\n+6% Ammo Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.04,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 116% -> 120%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n10% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 120% -> 124%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.2,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.1\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 124% -> 128%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 128% -> 132%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.28,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 5700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 132% -> 136%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.32,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 6900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +4%\\n4% Ammo Refill\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 136% -> 140%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.36,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.04\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.04\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8200,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +4%\\n10% Ammo Refill\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Soldier\\n{0}\\nGun Damage 140%\\nRegen Speed 135%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.4,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.1\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Marine\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 9,\r\n \"InfoText\": \"Specialized in ranged combat. Powerful weapons but with poor Armor.\\nStarting Debuff: -40% Armor\\nMax LV 10\\n\\nBonuses Each LV up:\\n+8% Gun Damage\\n+3% Armor\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 100% -> 108%\\nArmor 60% -> 63%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 85,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 108% -> 116%\\nArmor 63% -> 66%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.08,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 510,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 116% -> 124%\\nArmor 66% -> 69%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.16,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1020,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 124% -> 132%\\nArmor 69% -> 72%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1615,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 132% -> 140%\\nArmor 72% -> 75%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.32,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2295,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 140% -> 148%\\nArmor 75% -> 78%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.4,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3060,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 148% -> 156%\\nArmor 78% -> 81%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.48,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 3910,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 156% -> 164%\\nArmor 81% -> 84%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.56,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4845,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 164% -> 172%\\nArmor 84% -> 87%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.64,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5865,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 172% -> 180%\\nArmor 87% -> 90%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.72,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6970,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +8%\\nArmor +3%\",\r\n \"CustomLevelStatsText\": \"Class: Marine\\n{0}\\nGun Damage 180%\\nArmor 90%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1.8,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Hunter\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 7,\r\n \"InfoText\": \"Specialized in melee combat. Deal high melee damage while gaining light Armor for survivability.\\nMax LV 5 bonus: Double Jump\\nLV 1 bonus: 125% Melee Damage\\n\\nBonuses Each LV up:\\n+4% Armor\\n+4% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 100% -> 225%\\nArmor 100% -> 104%\\nSpeed 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee +125%\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 104% -> 108%\\nSpeed 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 108% -> 112%\\nSpeed 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 112% -> 116%\\nSpeed 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +4%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 116% -> 120%\\nSpeed 116% -> 120%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +4%\\nSpeed +4%\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Hunter\\n{0}\\nMelee 225%\\nArmor 120%\\nSpeed 120%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2.25,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Assassin\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 8,\r\n \"InfoText\": \"Specialized in melee combat. Devastating in stealth and combat but with very poor survivability.\\nStarting Debuff: -45% Armor\\nMax LV 5 bonus: Double Jump\\nLV 1 bonus: 215% Melee Damage\\n\\nBonuses Each LV up:\\n+5% Armor\\n+4% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 100% -> 315%\\nArmor 55% -> 60%\\nSpeed 100% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.0,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.0\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee +215%\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 60% -> 65%\\nSpeed 104% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 65% -> 70%\\nSpeed 108% -> 112%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 70% -> 75%\\nSpeed 112% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.12\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +5%\\nSpeed +4%\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 75% -> 80%\\nSpeed 116% -> 120%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +5%\\nSpeed +4%\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Assassin\\n{0}\\nMelee 315%\\nArmor 80%\\nSpeed 120%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 3.15,\r\n \"WeaponDamageMultiplier\": 1.0,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.2\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Fighter\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 10,\r\n \"InfoText\": \"Specialized in general combat. Improved damage with all guns and melee.\\nMax LV 10\\n\\nBonuses Each LV up:\\n+3% Gun Damage\\n+6% Melee Damage\\n+1% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 100% -> 103%\\nMelee Damage 100% -> 106%\\nSpeed 100% -> 101%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +6%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 103% -> 106%\\nMelee Damage 106% -> 112%\\nSpeed 101% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.06,\r\n \"WeaponDamageMultiplier\": 1.03,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.01\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 106% -> 109%\\nMelee Damage 112% -> 118%\\nSpeed 102% -> 103%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.12,\r\n \"WeaponDamageMultiplier\": 1.06,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 109% -> 112%\\nMelee Damage 118% -> 124%\\nSpeed 103% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.18,\r\n \"WeaponDamageMultiplier\": 1.09,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.03\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 112% -> 115%\\nMelee Damage 124% -> 130%\\nSpeed 104% -> 105%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.24,\r\n \"WeaponDamageMultiplier\": 1.12,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 115% -> 118%\\nMelee Damage 130% -> 136%\\nSpeed 105% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.3,\r\n \"WeaponDamageMultiplier\": 1.15,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.05\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 118% -> 121%\\nMelee Damage 136% -> 142%\\nSpeed 106% -> 107%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.36,\r\n \"WeaponDamageMultiplier\": 1.18,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 121% -> 124%\\nMelee Damage 142% -> 148%\\nSpeed 107% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.42,\r\n \"WeaponDamageMultiplier\": 1.21,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.07\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 5700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 124% -> 127%\\nMelee Damage 148% -> 154%\\nSpeed 108% -> 109%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.48,\r\n \"WeaponDamageMultiplier\": 1.24,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 6900,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 127% -> 130%\\nMelee Damage 154% -> 160%\\nSpeed 109% -> 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.54,\r\n \"WeaponDamageMultiplier\": 1.27,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.09\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 8200,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGun Damage +3%\\nMelee Damage +7%\\nSpeed +1%\",\r\n \"CustomLevelStatsText\": \"Class: Fighter\\n{0}\\nGun Damage 130%\\nMelee Damage 160%\\nSpeed 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1.6,\r\n \"WeaponDamageMultiplier\": 1.3,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Survivalist\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 3,\r\n \"InfoText\": \"Increased odds of survival in extreme conditions. Endure any scenario.\\nMax LV 15 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+3% Armor\\n+3% Infect Resist\\n10% Heal\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 100% -> 103%\\nInfect Res. 0% -> 3%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 103% -> 106%\\nInfect Res. 0% -> 3%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 106% -> 109%\\nInfect Res. 3% -> 6%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 109% -> 112%\\nInfect Res. 6% -> 9%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 112% -> 115%\\nInfect Res. 9% -> 12%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2550,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 115% -> 118%\\nInfect Res. 12% -> 15%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3300, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 118% -> 121%\\nInfect Res. 15% -> 18%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4100, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 121% -> 124%\\nInfect Res. 18% -> 21%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4950, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 124% -> 127%\\nInfect Res. 21% -> 24%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 127% -> 130%\\nInfect Res. 24% -> 27%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 130% -> 133%\\nInfect Res. 27% -> 30%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 11,\r\n \"TotalXpRequired\": 7950,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 133% -> 136%\\nInfect Res. 30% -> 33%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 12,\r\n \"TotalXpRequired\": 9150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 136% -> 139%\\nInfect Res. 33% -> 36%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 13,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 139% -> 142%\\nInfect Res. 36% -> 39%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 14,\r\n \"TotalXpRequired\": 11850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +3%\\nInfection Res. +3%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 142% -> 145%\\nInfect Res. 39% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 15,\r\n \"TotalXpRequired\": 13350,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nArmor +3%\\nInfection Res. +61%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Survivalist\\n{0}\\nArmor 145%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Outlander\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 11,\r\n \"InfoText\": \"Specialized for surviving on the run. Greatly improved Projectile Armor and Infect Resist.\\nMax LV 15\\nLV 1 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+2% Melee Armor\\n+5% Projectile Armor\\n10% Heal\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 100% -> 102%\\nProjectile Armor 100% -> 105%\\nInfect Res. 0% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 102% -> 104%\\nProjectile Armor 105% -> 110%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 600,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 104% -> 106%\\nProjectile Armor 110% -> 115%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 106% -> 108%\\nProjectile Armor 115% -> 120%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 1850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 108% -> 110%\\nProjectile Armor 120% -> 125%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 2550,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 110% -> 112%\\nProjectile Armor 125% -> 130%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 3300, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 112% -> 114%\\nProjectile Armor 130% -> 135%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 4100, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 114% -> 116%\\nProjectile Armor 135% -> 140%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 4950, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 116% -> 118%\\nProjectile Armor 140% -> 145%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 5850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 118% -> 120%\\nProjectile Armor 145% -> 150%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 6850, \r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 120% -> 122%\\nProjectile Armor 150% -> 155%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 11,\r\n \"TotalXpRequired\": 7950,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 122% -> 124%\\nProjectile Armor 155% -> 160%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 12,\r\n \"TotalXpRequired\": 9150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 124% -> 126%\\nProjectile Armor 160% -> 165%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 13,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 126% -> 128%\\nProjectile Armor 165% -> 170%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 14,\r\n \"TotalXpRequired\": 11850,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nMelee Armor +2%\\nProjectile Armor +5%\\n10% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 128% -> 130%\\nProjectile Armor 170% -> 175%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.1\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 15,\r\n \"TotalXpRequired\": 13350,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nMelee Armor +2%\\nProjectile Armor +5%\\n20% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Outlander\\n{0}\\nMelee Armor 130%\\nProjectile Armor 175%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.2\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Doctor\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 4,\r\n \"InfoText\": \"Specialized in keeping the team alive. Ensures that the team recovers quickly in bad scenarios.\\nMax LV 5 bonus: +15% Armor\\n\\nBonuses Each LV up:\\n+25% Revive Speed\\n+35% HP Regen Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 4 -> 3.2 sec.\\nRegen Speed 100% -> 135%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.8 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 3.2 -> 2.7 sec.\\nRegen Speed 135% -> 170%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.5 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2.7 -> 2.3 sec.\\nRegen Speed 170% -> 205%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.4 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2.3 -> 2 sec.\\nRegen Speed 205% -> 240%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 2 -> 1.8 sec.\\nRegen Speed 240% -> 275%\\nArmor 100% -> 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRevive -0.2 sec.\\nRegen Speed +35%\\nArmor +15%\",\r\n \"CustomLevelStatsText\": \"Class: Doctor\\n{0}\\nRevive 1.8 sec.\\nRegen Speed 275%\\nArmor 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Field Medic\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 12,\r\n \"InfoText\": \"Specialized in keeping the team alive. Great survivability and team support.\\nMax LV 5 Bonus: +50% Infect Resist\\n\\nBonuses Each LV up:\\n+10% Revive Speed\\n+35% HP Regen Speed\\n+4% Armor\\n+5% Infect Resist\\n+2% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 4 -> 3.6 sec.\\nRegen Speed 100% -> 135%\\nArmor 100% -> 104%\\nInfect Res. 0% -> 5%\\nSpeed 100% -> 102%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.4 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3.6 -> 3.3 sec.\\nRegen Speed 135% -> 170%\\nArmor 104% -> 108%\\nInfect Res. 5% -> 10%\\nSpeed 102% -> 104%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.02\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3.3 -> 3 sec.\\nRegen Speed 170% -> 205%\\nArmor 108% -> 112%\\nInfect Res. 10% -> 15%\\nSpeed 104% -> 106%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.04\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.3 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 3 -> 2.8 sec.\\nRegen Speed 205% -> 240%\\nArmor 112% -> 116%\\nInfect Res. 15% -> 20%\\nSpeed 106% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.06\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRevive -0.2 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +5%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 2.8 -> 2.7 sec.\\nRegen Speed 240% -> 275%\\nArmor 116% -> 120%\\nInfect Res. 20% -> 75%\\nSpeed 108% -> 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRevive -0.1 sec.\\nRegen Speed +35%\\nArmor +4%\\nInfect Res. +55%\\n+2% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Field Medic\\n{0}\\nRevive 2.7 sec.\\nRegen Speed 275%\\nArmor 120%\\nInfect Res. 75%\\nSpeed 110%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.1\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Trailblazer\",\r\n \"GroupPersistentId\": 1,\r\n \"PersistentId\": 15,\r\n \"InfoText\": \"Specialized in leaving everyone else in the dust. Superior mobility ensures survival when all else fails.\\nMax LV 5 Bonus: Infect Immune, Double Jump\\n\\nBonuses Each LV up:\\n+20% HP Regen Speed\\n+8% Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 100% -> 120%\\nSpeed 100% -> 108%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 120% -> 140%\\nSpeed 108% -> 116%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.08\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 140% -> 160%\\nSpeed 116% -> 124%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.16\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 160% -> 180%\\nSpeed 124% -> 132%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.24\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +20%\\n+8% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 180% -> 200%\\nInfect Resist 0% -> Immune\\nSpeed 132% -> 140%\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.32\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nRegen Speed +20%\\nInfect Immune\\n+8% Speed\\nDouble Jump\",\r\n \"CustomLevelStatsText\": \"Class: Trailblazer\\n{0}\\nRegen Speed 200%\\nInfect Immune\\nSpeed 140%\\nDouble Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.4\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Technician\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 5,\r\n \"InfoText\": \"Specialized in supporting the team and resourcing. Keeps the team informed in more scenarios.\\nMax LV 5 bonus: EZ Hack, Instant Terminals\\n\\nBonuses Each LV up:\\n+55% Hack Skill\\n-20% Terminal Delay\\n+15% Tool Power\\n+20% Repeller Power\\n+8% Tool Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 100% - > 155%\\nTerminal Delay 100% -> 80%\\nTool Power 100% -> 115%\\nRepeller 100% -> 120%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 400,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 155% - > 210%\\nTerminal Delay 80% -> 60%\\nTool Power 115% -> 130%\\nRepeller 120% -> 140%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1000,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 210% - > 265%\\nTerminal Delay 60% -> 40%\\nTool Power 130% -> 145%\\nRepeller 140% -> 160%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 265% - > 320%\\nTerminal Delay 40% -> 20%\\nTool Power 145% -> 160%\\nRepeller 160% -> 180%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nHacking +35%\\nTerminal Delay -15%\\nTool Power +15%\\nRepeller +20%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nHacking 320% - > EZ\\nTerminal Delay 20% -> Instant\\nTool Power 160% > 175%\\nRepeller 180% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4000,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nEZ Hacking\\nInstant Terminal Delay\\n+15% Tool Power\\n+20% Repeller\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Technician\\n{0}\\nEZ Hacking\\nInstant Terminals\\nTool Power 175%\\nRepeller 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Gas Breather\",\r\n \"GroupPersistentId\": 2,\r\n \"PersistentId\": 16,\r\n \"InfoText\": \"Specialized in traversing infectious environments. Utilizes heavily modified fog repellers to devastating effect.\\nMax LV 5 bonus: Global Fog Repeller\\nLV 1 bonus: Infect Immune\\n\\nBonuses Each LV up:\\n+15% Tool Power\\n+60% Repeller Power\\n+8% Tool Refill\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 100% -> 115%\\nRepeller 100% -> 160%\\nInfect Resist 0% -> Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 400,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 115% -> 130%\\nRepeller 160% -> 220%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1000,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 130% -> 145%\\nRepeller 220% -> 280%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 145% -> 160%\\nRepeller 280% -> 340%\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 2800,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nTool Power +15%\\nRepeller +60%\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 160% > 175%\\nRepeller 340% -> Global\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4000,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\n+15% Tool Power\\nGlobal Fog Repeller\\n8% Tool Refill\",\r\n \"CustomLevelStatsText\": \"Class: Gas Breather\\n{0}\\nTool Power 175%\\nGlobal Fog Repeller\\nInfect Immune\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionTool\",\r\n \"Value\": 0.08\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Masochist\",\r\n \"GroupPersistentId\": 0,\r\n \"PersistentId\": 6,\r\n \"InfoText\": \"Specialized in suffering. Struggles for a long time, then becomes the strongest.\\nStarting Debuff: -50% Armor\\nMax LV 5 bonus: +80% Damage,\\n+50% Max HP +50% Med Eff.\\n\\nBonuses Each LV up:\\n-4% Armor\\n+50% HP Regen Speed\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 50% -> 46%\\nRegen Speed 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 440,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 46% -> 42%\\nRegen Speed 150% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1100,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 42% -> 38%\\nRegen Speed 200% -> 250%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 1980,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 38% -> 34%\\nRegen Speed 250% -> 300%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3080,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor -4%\\nRegen Speed +50%\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 34% -> 30%\\nRegen Speed 300% -> 0%\\nDamage 100% -> 180%\\nMax HP 20 -> 30\\nMed Eff. 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 4400,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nDamage +80%\\nArmor -4%\\n+10 Max HP\\n+50% Med Eff.\",\r\n \"CustomLevelStatsText\": \"Class: Masochist\\n{0}\\nArmor 30%\\nDamage 180%\\nMax HP +50%\\nMed Eff. 150%\",\r\n \"HealthMultiplier\": 1.5,\r\n \"MeleeDamageMultiplier\": 1.8,\r\n \"WeaponDamageMultiplier\": 1.8,\r\n \"CustomScaling\": [],\r\n \"LevelUpBonus\": []\r\n }\r\n ]\r\n },\r\n {\r\n \"Header\": \"Isolated\",\r\n \"GroupPersistentId\": 3,\r\n \"PersistentId\": 14,\r\n \"InfoText\": \"You are the last alive. Stay alive at all costs and complete the mission.\\nLV 5 & Max LV 10 bonus: +40% Ammo Refill, +40% Tool Refill, +40% Heal\\n\\nPerks Each Level:\\nLV1: Speed Demon\\nLV2: Damage Amp\\nLV3: Endurance\\nLV4: Regeneration\\nLV5: Technician\\nLV6: Double Jump\\nLV7: +50% Bioscan Speed\\nLV8: Speed Demon II\\nLV9: Gas Breather\\nLV10: Godlike Regeneration\",\r\n \"StartingBuffs\": [],\r\n \"Levels\": [\r\n {\r\n \"LevelNumber\": 0,\r\n \"TotalXpRequired\": 0,\r\n \"CustomLevelUpPopupText\": null,\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 100% -> 115%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 1,\r\n \"TotalXpRequired\": 450,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nSpeed +15%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 100% -> 200%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 1,\r\n \"WeaponDamageMultiplier\": 1,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 2,\r\n \"TotalXpRequired\": 1150,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nDamage +100%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 100% -> 150%\\nInfect Res. 0% -> 50%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 3,\r\n \"TotalXpRequired\": 2200,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nArmor +50%\\nInfect Res. +50%\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 100% -> 200%\\nRegen Cap 25 -> 50\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 4,\r\n \"TotalXpRequired\": 3700,\r\n \"CustomLevelUpPopupText\": \"Lv Up!\\nRegen Speed +100%\\nRegen Cap +25\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 100% -> 150%\\nHacking 100% -> EZ\\nTerminal Delay 100% -> Instant\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 5,\r\n \"TotalXpRequired\": 5650,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+50% Tool Power\\nEZ Hack\\nInstant Terminals\\n40% Ammo Refill\\n40% Tool Refill\\n40% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nJump -> Double Jump\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.4\r\n }\r\n ]\r\n },\r\n {\r\n \"LevelNumber\": 6,\r\n \"TotalXpRequired\": 8050,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+Double Jump\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 100% -> 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 7,\r\n \"TotalXpRequired\": 10450,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+50% Bioscan Speed\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 115% -> 130%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50%\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.15\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 8,\r\n \"TotalXpRequired\": 12850,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\n+15% Speed\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Res. 50% -> Immune\\nRegen Speed 200%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 9,\r\n \"TotalXpRequired\": 15250,\r\n \"CustomLevelUpPopupText\": \"LV Up!\\nInfect Immune\",\r\n \"CustomLevelStatsText\": \"Class: Isolated\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Immune\\nRegen Speed 200% -> 350%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": []\r\n },\r\n {\r\n \"LevelNumber\": 10,\r\n \"TotalXpRequired\": 17650,\r\n \"CustomLevelUpPopupText\": \"MAX LV!\\nGodlike Regeneration\\n40% Ammo Refill\\n40% Tool Refill\\n40% Heal\",\r\n \"CustomLevelStatsText\": \"Class: Legendary\\n{0}\\nSpeed 130%\\nDamage 200%\\nArmor 150%\\nInfect Immune\\nRegen Speed 350%\\nRegen Cap 50\\nTool Power 150%\\nEZ Hack\\nInstant Terminals\\nDouble Jump\\nBioscan Speed 150%\",\r\n \"HealthMultiplier\": 1,\r\n \"MeleeDamageMultiplier\": 2,\r\n \"WeaponDamageMultiplier\": 2,\r\n \"CustomScaling\": [\r\n {\r\n \"CustomBuff\": \"MovementSpeedMultiplier\",\r\n \"Value\": 1.3\r\n }\r\n ],\r\n \"LevelUpBonus\": [\r\n {\r\n \"SingleBuff\": \"AmmunitionMain\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"AmmunitionSpecial\",\r\n \"Value\": 0.4\r\n },\r\n {\r\n \"SingleBuff\": \"Heal\",\r\n \"Value\": 0.4\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n]\r\n"); } string path3 = Path.Combine(_folderPath, "BoosterEffects.json"); if (!File.Exists(path3)) { File.WriteAllText(path3, "\r\n[\r\n {\r\n \"ClassLayoutPersistentId\": 2,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.03,\r\n \"ProjectileResistance\": 1.03,\r\n \"InfectionResistance\": 1.03\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.06,\r\n \"InfectionResistance\": 1.06\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.09,\r\n \"ProjectileResistance\": 1.09,\r\n \"InfectionResistance\": 1.09\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.15,\r\n \"ProjectileResistance\": 1.15,\r\n \"InfectionResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.18,\r\n \"InfectionResistance\": 1.18\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.21,\r\n \"ProjectileResistance\": 1.21,\r\n \"InfectionResistance\": 1.21\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.24,\r\n \"ProjectileResistance\": 1.24,\r\n \"InfectionResistance\": 1.24\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.27,\r\n \"ProjectileResistance\": 1.27,\r\n \"InfectionResistance\": 1.27\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.3,\r\n \"ProjectileResistance\": 1.3,\r\n \"InfectionResistance\": 1.3\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 11\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.33,\r\n \"ProjectileResistance\": 1.33,\r\n \"InfectionResistance\": 1.33\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 12\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.36,\r\n \"ProjectileResistance\": 1.36,\r\n \"InfectionResistance\": 1.36\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 13\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.39,\r\n \"ProjectileResistance\": 1.39,\r\n \"InfectionResistance\": 1.39\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 14\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.42,\r\n \"ProjectileResistance\": 1.42,\r\n \"InfectionResistance\": 1.42\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 3,\r\n \"ActiveLevels\": [\r\n 15\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.45,\r\n \"ProjectileResistance\": 1.45,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35,\r\n \"ReviveSpeedSupport\": 1.25\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.7,\r\n \"ReviveSpeedSupport\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.05,\r\n \"ReviveSpeedSupport\": 1.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.40,\r\n \"ReviveSpeedSupport\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 4,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.75,\r\n \"ReviveSpeedSupport\": 2.25,\r\n \"MeleeResistance\": 1.15,\r\n \"ProjectileResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 15,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.35,\r\n \"ReviveSpeedSupport\": 1.1,\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04,\r\n \"InfectionResistance\": 1.05\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.7,\r\n \"ReviveSpeedSupport\": 1.2,\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08,\r\n \"InfectionResistance\": 1.1\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.05,\r\n \"ReviveSpeedSupport\": 1.3,\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.15\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.40,\r\n \"ReviveSpeedSupport\": 1.4,\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16,\r\n \"InfectionResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 12,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.75,\r\n \"ReviveSpeedSupport\": 1.5,\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.55,\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"ComputerProcessingSpeed\": 1.2,\r\n \"FogRepellerEffect\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.1,\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"ComputerProcessingSpeed\": 1.4,\r\n \"FogRepellerEffect\": 1.4\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.65,\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"ComputerProcessingSpeed\": 1.6,\r\n \"FogRepellerEffect\": 1.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 3.2,\r\n \"ScannerRechargeSpeed\": 1.6,\r\n \"SentryGunDamage\": 1.6,\r\n \"GlueEfficiency\": 1.6,\r\n \"TripMineDamage\": 1.6,\r\n \"ComputerProcessingSpeed\": 1.8,\r\n \"FogRepellerEffect\": 1.8\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 5,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.8,\r\n \"SentryGunDamage\": 1.75,\r\n \"GlueEfficiency\": 1.75,\r\n \"TripMineDamage\": 1.75,\r\n \"ComputerProcessingSpeed\": 999.0,\r\n \"FogRepellerEffect\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.5,\r\n \"ProjectileResistance\": 0.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 1.5,\r\n \"MeleeResistance\": 0.46,\r\n \"ProjectileResistance\": 0.46\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.0,\r\n \"MeleeResistance\": 0.42,\r\n \"ProjectileResistance\": 0.42\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 2.5,\r\n \"MeleeResistance\": 0.38,\r\n \"ProjectileResistance\": 0.38\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 3.0,\r\n \"MeleeResistance\": 0.34,\r\n \"ProjectileResistance\": 0.34\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 6,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"RegenerationSpeed\": 3.5,\r\n \"MeleeResistance\": 0.3,\r\n \"ProjectileResistance\": 0.3\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 7,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 0\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.55,\r\n \"ProjectileResistance\": 0.55\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.6,\r\n \"ProjectileResistance\": 0.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.65,\r\n \"ProjectileResistance\": 0.65\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.7,\r\n \"ProjectileResistance\": 0.7\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.75,\r\n \"ProjectileResistance\": 0.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 8,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.8,\r\n \"ProjectileResistance\": 0.8\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 0\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.6,\r\n \"ProjectileResistance\": 0.6\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.63,\r\n \"ProjectileResistance\": 0.63\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.66,\r\n \"ProjectileResistance\": 0.66\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.69,\r\n \"ProjectileResistance\": 0.69\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.72,\r\n \"ProjectileResistance\": 0.72\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.75,\r\n \"ProjectileResistance\": 0.75\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.78,\r\n \"ProjectileResistance\": 0.78\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.81,\r\n \"ProjectileResistance\": 0.81\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.84,\r\n \"ProjectileResistance\": 0.84\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.87,\r\n \"ProjectileResistance\": 0.87\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 9,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 0.9,\r\n \"ProjectileResistance\": 0.9\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.02,\r\n \"ProjectileResistance\": 1.05,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.1,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.15,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.10,\r\n \"ProjectileResistance\": 1.25,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.3,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.14,\r\n \"ProjectileResistance\": 1.35,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.4,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.45,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 11\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.22,\r\n \"ProjectileResistance\": 1.55,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 12\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.24,\r\n \"ProjectileResistance\": 1.6,\r\n \"InfectionResistance\": 2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 13\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.26,\r\n \"ProjectileResistance\": 1.65,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 14\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.28,\r\n \"ProjectileResistance\": 1.7,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 11,\r\n \"ActiveLevels\": [\r\n 15\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.3,\r\n \"ProjectileResistance\": 1.75,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"FogRepellerEffect\": 1.6,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"FogRepellerEffect\": 2.2,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"FogRepellerEffect\": 2.8,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.6,\r\n \"SentryGunDamage\": 1.6,\r\n \"GlueEfficiency\": 1.6,\r\n \"TripMineDamage\": 1.6,\r\n \"FogRepellerEffect\": 3.4,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 16,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.75,\r\n \"GlueEfficiency\": 1.75,\r\n \"TripMineDamage\": 1.75,\r\n \"FogRepellerEffect\": 15.0,\r\n \"InfectionResistance\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 1\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.1,\r\n \"ScannerRechargeSpeed\": 1.05,\r\n \"SentryGunDamage\": 1.05,\r\n \"GlueEfficiency\": 1.05,\r\n \"TripMineDamage\": 1.05,\r\n \"ComputerProcessingSpeed\": 1.05,\r\n \"FogRepellerEffect\": 1.05,\r\n \"MeleeResistance\": 1.02,\r\n \"ProjectileResistance\": 1.02,\r\n \"InfectionResistance\": 1.02\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 2\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.2,\r\n \"ScannerRechargeSpeed\": 1.1,\r\n \"SentryGunDamage\": 1.1,\r\n \"GlueEfficiency\": 1.1,\r\n \"TripMineDamage\": 1.1,\r\n \"ComputerProcessingSpeed\": 1.1,\r\n \"FogRepellerEffect\": 1.1,\r\n \"MeleeResistance\": 1.04,\r\n \"ProjectileResistance\": 1.04,\r\n \"InfectionResistance\": 1.04\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.3,\r\n \"ScannerRechargeSpeed\": 1.15,\r\n \"SentryGunDamage\": 1.15,\r\n \"GlueEfficiency\": 1.15,\r\n \"TripMineDamage\": 1.15,\r\n \"ComputerProcessingSpeed\": 1.15,\r\n \"FogRepellerEffect\": 1.15,\r\n \"MeleeResistance\": 1.06,\r\n \"ProjectileResistance\": 1.06,\r\n \"InfectionResistance\": 1.06\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.4,\r\n \"ScannerRechargeSpeed\": 1.2,\r\n \"SentryGunDamage\": 1.2,\r\n \"GlueEfficiency\": 1.2,\r\n \"TripMineDamage\": 1.2,\r\n \"ComputerProcessingSpeed\": 1.2,\r\n \"FogRepellerEffect\": 1.2,\r\n \"MeleeResistance\": 1.08,\r\n \"ProjectileResistance\": 1.08,\r\n \"InfectionResistance\": 1.08\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.5,\r\n \"ScannerRechargeSpeed\": 1.25,\r\n \"SentryGunDamage\": 1.25,\r\n \"GlueEfficiency\": 1.25,\r\n \"TripMineDamage\": 1.25,\r\n \"ComputerProcessingSpeed\": 1.25,\r\n \"FogRepellerEffect\": 1.25,\r\n \"MeleeResistance\": 1.1,\r\n \"ProjectileResistance\": 1.1,\r\n \"InfectionResistance\": 1.1\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.6,\r\n \"ScannerRechargeSpeed\": 1.3,\r\n \"SentryGunDamage\": 1.3,\r\n \"GlueEfficiency\": 1.3,\r\n \"TripMineDamage\": 1.3,\r\n \"ComputerProcessingSpeed\": 1.3,\r\n \"FogRepellerEffect\": 1.3,\r\n \"MeleeResistance\": 1.12,\r\n \"ProjectileResistance\": 1.12,\r\n \"InfectionResistance\": 1.12\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.7,\r\n \"ScannerRechargeSpeed\": 1.35,\r\n \"SentryGunDamage\": 1.35,\r\n \"GlueEfficiency\": 1.35,\r\n \"TripMineDamage\": 1.35,\r\n \"ComputerProcessingSpeed\": 1.35,\r\n \"FogRepellerEffect\": 1.35,\r\n \"MeleeResistance\": 1.14,\r\n \"ProjectileResistance\": 1.14,\r\n \"InfectionResistance\": 1.14\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.8,\r\n \"ScannerRechargeSpeed\": 1.4,\r\n \"SentryGunDamage\": 1.4,\r\n \"GlueEfficiency\": 1.4,\r\n \"TripMineDamage\": 1.4,\r\n \"ComputerProcessingSpeed\": 1.4,\r\n \"FogRepellerEffect\": 1.4,\r\n \"MeleeResistance\": 1.16,\r\n \"ProjectileResistance\": 1.16,\r\n \"InfectionResistance\": 1.16\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 1.9,\r\n \"ScannerRechargeSpeed\": 1.45,\r\n \"SentryGunDamage\": 1.45,\r\n \"GlueEfficiency\": 1.45,\r\n \"TripMineDamage\": 1.45,\r\n \"ComputerProcessingSpeed\": 1.45,\r\n \"FogRepellerEffect\": 1.45,\r\n \"MeleeResistance\": 1.18,\r\n \"ProjectileResistance\": 1.18,\r\n \"InfectionResistance\": 1.18\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 13,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"HackingProficiency\": 2.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"ComputerProcessingSpeed\": 1.5,\r\n \"FogRepellerEffect\": 1.5,\r\n \"MeleeResistance\": 1.2,\r\n \"ProjectileResistance\": 1.2,\r\n \"InfectionResistance\": 1.2\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 3\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 4\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 5\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 6\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 7\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 8\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 1.5,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 9\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2.0,\r\n \"RegenerationSpeed\": 2.0,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n },\r\n {\r\n \"ClassLayoutPersistentId\": 14,\r\n \"ActiveLevels\": [\r\n 10\r\n ],\r\n \"ValueToBoosterEffects\": {\r\n \"MeleeResistance\": 1.5,\r\n \"ProjectileResistance\": 1.5,\r\n \"InfectionResistance\": 2.0,\r\n \"RegenerationSpeed\": 3.5,\r\n \"RegenerationCap\": 2.0,\r\n \"ComputerProcessingSpeed\": 999,\r\n \"HackingProficiency\": 999.0,\r\n \"ScannerRechargeSpeed\": 1.5,\r\n \"SentryGunDamage\": 1.5,\r\n \"GlueEfficiency\": 1.5,\r\n \"TripMineDamage\": 1.5,\r\n \"BioscanSpeed\": 1.5\r\n }\r\n }\r\n]\r\n"); } string path4 = Path.Combine(_folderPath, "Groups.json"); if (!File.Exists(path4)) { File.WriteAllText(path4, "\r\n[\r\n {\r\n \"PersistentId\": 0,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Combat\"\r\n },\r\n {\r\n \"PersistentId\": 1,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Survival\"\r\n },\r\n {\r\n \"PersistentId\": 2,\r\n \"VisibleForPlayerCount\": [\r\n 1,\r\n 2,\r\n 3,\r\n 4\r\n ],\r\n \"Name\": \"Utility\"\r\n },\r\n {\r\n \"PersistentId\": 3,\r\n \"VisibleForPlayerCount\": [\r\n 1\r\n ],\r\n \"Name\": \"Solo\"\r\n }\r\n]\r\n"); } string path5 = Path.Combine(_folderPath, "Globals.json"); if (!File.Exists(path5)) { File.WriteAllText(path5, JsonSerializer.Serialize(new GlobalValues(), jsonSerializerOptions)); } string path6 = Path.Combine(_folderPath, "LevelUpBonus_EnumNames.txt"); if (!File.Exists(path6)) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("--This file is auto-generated. It's not for editing!--"); stringBuilder.AppendLine(); foreach (object value in Enum.GetValues(typeof(SingleBuff))) { stringBuilder.AppendLine(value.ToString()); } File.WriteAllText(path6, stringBuilder.ToString()); } string path7 = Path.Combine(_folderPath, "BoosterEffects_EnumNames.txt"); if (!File.Exists(path7)) { StringBuilder stringBuilder2 = new StringBuilder(); stringBuilder2.AppendLine("--This file is auto-generated. It's not for editing!--"); stringBuilder2.AppendLine(); foreach (object value2 in Enum.GetValues(typeof(AgentModifier))) { stringBuilder2.AppendLine(value2.ToString()); } File.WriteAllText(path7, stringBuilder2.ToString()); } string path8 = Path.Combine(_folderPath, "CustomScaling_EnumNames.txt"); if (!File.Exists(path8)) { StringBuilder stringBuilder3 = new StringBuilder(); stringBuilder3.AppendLine("--This file is auto-generated. It's not for editing!--"); stringBuilder3.AppendLine(); foreach (object value3 in Enum.GetValues(typeof(CustomScaling))) { stringBuilder3.AppendLine(value3.ToString()); } File.WriteAllText(path8, stringBuilder3.ToString()); } string path9 = Path.Combine(_folderPath, "StartingBuffs_EnumNames.txt"); if (File.Exists(path9)) { return; } StringBuilder stringBuilder4 = new StringBuilder(); stringBuilder4.AppendLine("--This file is auto-generated. It's not for editing!--"); stringBuilder4.AppendLine(); foreach (object value4 in Enum.GetValues(typeof(StartBuff))) { stringBuilder4.AppendLine(value4.ToString()); } File.WriteAllText(path9, stringBuilder4.ToString()); } private void CreateCheckpointData() { XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { CacheApiWrapper.SetXpStorageData(xpHandler.CurrentTotalXp); } else { LogManager.Error("No XpHandler was found, while trying to store the Checkpoint!"); } } private void CheckpointsCleanup() { CacheApi.RemoveInformation((object)"XpCheckpointData", "GTF_XP"); } } } namespace GTFuckingXP.Information { public static class DefaultXpData { public static List GetDefaultEnemyXp() { List list = new List(); Il2CppArrayBase allBlocks = GameDataBlockBase.GetAllBlocks(); foreach (EnemyDataBlock enemy in GameDataBlockBase.GetAllBlocks()) { EnemyBalancingDataBlock val = ((IEnumerable)allBlocks).FirstOrDefault((Func)((EnemyBalancingDataBlock it) => ((GameDataBlockBase)(object)it).persistentID == enemy.BalancingDataId)); float num; if (val == null) { LogManager.Warn($"No balance datablock found for balance id {enemy.BalancingDataId} ({((GameDataBlockBase)(object)enemy).name})!"); num = 20f; } else { num = val.Health.HealthMax; } int num2 = (int)(num / 35f); num2 = ((num2 <= 0) ? 1 : num2); list.Add(new EnemyXp(((GameDataBlockBase)(object)enemy).persistentID, ((GameDataBlockBase)(object)enemy).name, (int)((double)num / 2.5), (int)(num / 5f), num2)); } return list; } } internal class DummyXp : IXpData { public int XpGain { get; set; } public int DebuffXp { get; set; } public int LevelScalingXpDecrese { get; set; } public DummyXp(int xpGain, int debuffXp) { XpGain = xpGain; DebuffXp = debuffXp; LevelScalingXpDecrese = 0; } } public class FloatingXpTextInfo : IFloatingTextInfo { public Vector3 Velocity { get; } public Vector3 SpawnPosition { get; } public float Gravity => 0f; public float LifeTime { get; } public string Text { get; } public FloatingXpTextInfo(Vector3 position, string text, float lifeTime = 2f) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) Velocity = new Vector3(0f, 0.1f, 0f); SpawnPosition = position; Text = text; LifeTime = lifeTime; } public void OnUpdate(TextMeshPro tmp, FloatingTextBase textBase) { } public void UpdateTextMesh(TextMeshPro tmp) { } } public interface IXpData { int XpGain { get; set; } int DebuffXp { get; set; } int LevelScalingXpDecrese { get; set; } int GetXp(bool isDebuff) { int num = (isDebuff ? DebuffXp : XpGain); bool num2 = num < 0; if (num2) { num *= -1; } int num3 = LevelScalingXpDecrese * CacheApiWrapper.GetActiveLevel().LevelNumber; num = ((num <= num3) ? 1 : (num - num3)); if (num2) { num *= -1; } return num; } } public enum TermsOfUsage { Undecided, Accepted, Declined, Anonymized } } namespace GTFuckingXP.Information.WebModels { public class XpWebModel { public string SteamId { get; set; } public string PlayFabId { get; set; } public string NickName { get; set; } public XpWebModel(TermsOfUsage howToHandleData) { switch (howToHandleData) { case TermsOfUsage.Accepted: SteamId = SteamManager.LocalPlayerID.ToString(); PlayFabId = PlayFabManager.EntityID; NickName = SteamManager.LocalPlayerName; break; case TermsOfUsage.Anonymized: SteamId = "Unknown"; PlayFabId = "Unknown"; NickName = "Unknown"; break; default: throw new Exception("You should not create a data package if there is no consent!"); } } } } namespace GTFuckingXP.Information.NetworkingInfo { public struct BoosterInfo { public float F1; public float F2; public float F3; public float F4; public float F5; public float F6; public float F7; public float F8; public float F9; public float F10; public float F11; public float F12; public float F13; public float F14; public float F15; public float F16; public float F17; public float F18; public float F19; public float F20; public float F21; public float F22; public float F23; public float F24; public float F25; public float F26; public float F27; public float F28; public float F29; public float F30; public float F31; public float F32; public float F33; public float F34; public float F35; public float F36; public float F37; public float F38; public float F39; public float F40; public float F41; public float F42; public float F43; public float F44; public float F45; public float F46; public float F47; public float F48; public float F49; public float F50; public float F51; public float F52; public float F53; public float F54; public BoosterInfo(float[] boosterValues) { if (boosterValues.Length > 54) { LogManager.Error("There are more values in Boosters values, than supported.\nPlease message \"Endskill\" about that issue!"); } else if (boosterValues.Length < 54) { LogManager.Error("There are less than 47 Booster values!"); } F1 = boosterValues[0]; F2 = boosterValues[1]; F3 = boosterValues[2]; F4 = boosterValues[3]; F5 = boosterValues[4]; F6 = boosterValues[5]; F7 = boosterValues[6]; F8 = boosterValues[7]; F9 = boosterValues[8]; F10 = boosterValues[9]; F11 = boosterValues[10]; F12 = boosterValues[11]; F13 = boosterValues[12]; F14 = boosterValues[13]; F15 = boosterValues[14]; F16 = boosterValues[15]; F17 = boosterValues[16]; F18 = boosterValues[17]; F19 = boosterValues[18]; F20 = boosterValues[19]; F21 = boosterValues[20]; F22 = boosterValues[21]; F23 = boosterValues[22]; F24 = boosterValues[23]; F25 = boosterValues[24]; F26 = boosterValues[25]; F27 = boosterValues[26]; F28 = boosterValues[27]; F29 = boosterValues[28]; F30 = boosterValues[29]; F31 = boosterValues[30]; F32 = boosterValues[31]; F33 = boosterValues[32]; F34 = boosterValues[33]; F35 = boosterValues[34]; F36 = boosterValues[35]; F37 = boosterValues[36]; F38 = boosterValues[37]; F39 = boosterValues[38]; F40 = boosterValues[39]; F41 = boosterValues[40]; F42 = boosterValues[41]; F43 = boosterValues[42]; F44 = boosterValues[43]; F45 = boosterValues[44]; F46 = boosterValues[45]; F47 = boosterValues[46]; F48 = boosterValues[47]; F49 = boosterValues[48]; F50 = boosterValues[49]; F51 = boosterValues[50]; F52 = boosterValues[51]; F53 = boosterValues[52]; F54 = boosterValues[53]; } public float[] GetBoosterValues() { return new float[54] { F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, F25, F26, F27, F28, F29, F30, F31, F32, F33, F34, F35, F36, F37, F38, F39, F40, F41, F42, F43, F44, F45, F46, F47, F48, F49, F50, F51, F52, F53, F54 }; } public static implicit operator BoosterInfo(BoosterBuffs buff) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) Array values = Enum.GetValues(typeof(AgentModifier)); float[] array = new float[values.Length]; for (int i = 0; i < values.Length; i++) { AgentModifier key = (AgentModifier)values.GetValue(i); if (buff != null && buff.ValueToBoosterEffects.TryGetValue(key, out var value)) { array[i] = value; } else { array[i] = 0f; } } return new BoosterInfo(array); } } public struct GtfoApiXpInfo : IXpData { public bool ForceDebuffXp { get; set; } public int XpGain { get; set; } public int DebuffXp { get; set; } public int LevelScalingXpDecrese { get; set; } public float PositionX { get; set; } public float PositionY { get; set; } public float PositionZ { get; set; } public GtfoApiXpInfo(int xpGain, int debuffXp, int levelScaling, Vector3 position, bool forceDebuffXp = false) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) XpGain = xpGain; DebuffXp = debuffXp; LevelScalingXpDecrese = levelScaling; ForceDebuffXp = forceDebuffXp; PositionX = position.x; PositionY = position.y; PositionZ = position.z; } } public struct InitXpInfo { public uint Xp { get; set; } public uint CheckpointXp { get; set; } public InitXpInfo(uint xp, uint checkpointXp) { Xp = xp; CheckpointXp = checkpointXp; } } public struct LevelReachedInfo { public int LevelNumber; public int LayoutID; public LevelReachedInfo(int layoutID, int levelNumber) { LayoutID = layoutID; LevelNumber = levelNumber; } } public struct StaticXpInfo : IXpData { public int XpGain { get; set; } public int DebuffXp { get; set; } public int LevelScalingXpDecrese { get; set; } public Vector3 Position { get; set; } public StaticXpInfo(int xpGain, int debuffXp, int levelScaling, Vector3 position) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) XpGain = xpGain; DebuffXp = debuffXp; LevelScalingXpDecrese = levelScaling; Position = position; } } } namespace GTFuckingXP.Information.Level { public struct ActiveLevel { public LevelLayout Layout; public Level Level; public int LevelNumber; public ActiveLevel(LevelLayout layout, int levelNumber) { Layout = layout; Level = layout.Levels[levelNumber]; LevelNumber = levelNumber; } } public class BoosterBuffs { public int ClassLayoutPersistentId { get; set; } public List ActiveLevels { get; set; } public Dictionary ValueToBoosterEffects { get; set; } public BoosterBuffs(int classLayoutPersistentId, List activeLevels, Dictionary valueToBoosterEffects) { ClassLayoutPersistentId = classLayoutPersistentId; ActiveLevels = activeLevels; ValueToBoosterEffects = valueToBoosterEffects; } public static implicit operator BoosterBuffs(BoosterInfo boosterInfo) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) Array values = Enum.GetValues(typeof(AgentModifier)); Dictionary dictionary = new Dictionary(); float[] boosterValues = boosterInfo.GetBoosterValues(); for (int i = 0; i < values.Length; i++) { if (boosterValues[i] != 0f) { AgentModifier key = (AgentModifier)values.GetValue(i); dictionary[key] = boosterValues[i]; } } return new BoosterBuffs(0, null, dictionary); } } public class CustomScalingBuff { public CustomScaling CustomBuff { get; set; } = CustomScaling.Invalid; public float Value { get; set; } public CustomScalingBuff(CustomScaling customBuff, float value) { CustomBuff = customBuff; Value = value; } } public class Level { public int LevelNumber { get; set; } public uint TotalXpRequired { get; set; } public LocaleText CustomLevelUpPopupText { get; set; } public LocaleText CustomLevelStatsText { get; set; } public float HealthMultiplier { get; set; } public float MeleeDamageMultiplier { get; set; } public float WeaponDamageMultiplier { get; set; } public Dictionary CustomScaling { get; set; } public Dictionary LevelUpBonus { get; set; } public Level() { LevelNumber = 0; TotalXpRequired = 0u; CustomLevelUpPopupText = default(LocaleText); CustomLevelStatsText = default(LocaleText); HealthMultiplier = 1f; WeaponDamageMultiplier = 1f; MeleeDamageMultiplier = 1f; CustomScaling = new Dictionary(); LevelUpBonus = new Dictionary(); } public Level(int levelNumber, uint totalXp, float healthMultiplier, float meleeMultiplier, float weaponMultiplier, Dictionary singleUseBuffs, Dictionary customScaling, LocaleText customLevelUpPopupText = default(LocaleText), LocaleText customLevelStatsText = default(LocaleText)) { LevelNumber = levelNumber; TotalXpRequired = totalXp; HealthMultiplier = healthMultiplier; MeleeDamageMultiplier = meleeMultiplier; WeaponDamageMultiplier = weaponMultiplier; LevelUpBonus = singleUseBuffs; CustomScaling = customScaling; CustomLevelStatsText = customLevelStatsText; CustomLevelUpPopupText = customLevelUpPopupText; } public override string ToString() { return $"LevelNumber {LevelNumber}"; } } public class LevelLayout { public LocaleText Header { get; set; } public int GroupPersistentId { get; set; } public int PersistentId { get; set; } public LocaleText InfoText { get; set; } public Dictionary? StartingBuffs { get; set; } public List Levels { get; set; } public LevelLayout(int persistentId, LocaleText header, int groupPersistentId, LocaleText infoText, Dictionary startingBuffs, List levels) { PersistentId = persistentId; GroupPersistentId = groupPersistentId; Header = header; InfoText = infoText; StartingBuffs = startingBuffs; Levels = levels; } public void OnReadDone() { Levels.Sort((Level a, Level b) => (a.LevelNumber != b.LevelNumber) ? ((a.LevelNumber >= b.LevelNumber) ? 1 : (-1)) : 0); for (int i = 0; i < Levels.Count; i++) { Levels[i].LevelNumber = i; } } public Level? GetLevel(int index) { if (index < Levels.Count) { return Levels[index]; } return null; } } public class SingleUseBuff { public SingleBuff SingleBuff { get; set; } = SingleBuff.Invalid; public float Value { get; set; } public SingleUseBuff(SingleBuff singleBuff, float value) { SingleBuff = singleBuff; Value = value; } } public class StartingBuff { public StartBuff StartBuff { get; set; } = StartBuff.Invalid; public float Value { get; set; } public StartingBuff(StartBuff startBuff, float value) { StartBuff = startBuff; Value = value; } } } namespace GTFuckingXP.Information.Enemies { public class EnemyXp : IXpData { public uint EnemyId { get; set; } public string EnemyName { get; set; } public int XpGain { get; set; } public int DebuffXp { get; set; } public int LevelScalingXpDecrese { get; set; } public float BiotagXpFrac { get; set; } = -1f; public EnemyXp() { } public EnemyXp(uint enemyId, string enemyName, int killXp, int debuffXp, int levelScalingXpDecrease, float biotagXpFrac = -1f) { EnemyId = enemyId; EnemyName = enemyName; XpGain = killXp; DebuffXp = debuffXp; BiotagXpFrac = biotagXpFrac; LevelScalingXpDecrese = levelScalingXpDecrease; } } } namespace GTFuckingXP.Information.Enemies.Scaling { public class EnemyDefaultZoneLevel { public int SpawningZone { get; set; } public string TagText { get; set; } public float MaxHealthMultiplier { get; set; } public float ShooterDamageMultiplier { get; set; } public float MeleeDamageMultiplier { get; set; } public float PushDamageMutliplier { get; set; } public EnemyDefaultZoneLevel(int spawningZone, string tagText, float hpMultiplier, float shooterDamageMultiplier, float meleeDamageMultiplier, float pushDamageMultiplier) { SpawningZone = spawningZone; MaxHealthMultiplier = hpMultiplier; ShooterDamageMultiplier = shooterDamageMultiplier; MeleeDamageMultiplier = meleeDamageMultiplier; PushDamageMutliplier = pushDamageMultiplier; } } public class EnemyLevel { public uint EnemyId { get; set; } public int SpawningZone { get; set; } public string TagText { get; set; } public float MaxHealthMultiplier { get; set; } public float ShooterDamageMultiplier { get; set; } public float MeleeDamageMultiplier { get; set; } public float PushDamageMutliplier { get; set; } public EnemyLevel(uint enemyId, int spawningZone, string tagText, float hpMultiplier, float shooterDamageMultiplier, float meleeDamageMultiplier, float pushDamageMultiplier) { EnemyId = enemyId; SpawningZone = spawningZone; MaxHealthMultiplier = hpMultiplier; ShooterDamageMultiplier = shooterDamageMultiplier; MeleeDamageMultiplier = meleeDamageMultiplier; PushDamageMutliplier = pushDamageMultiplier; } } public class EnemyScaling { public eRundownTier Tier { get; set; } public int ExpeditionIndex { get; set; } public List DefaultScale { get; set; } public List EnemyLevels { get; set; } public EnemyScaling(eRundownTier tier, int expeditionIndex, List zoneLevels, List enemyLevels) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) Tier = tier; ExpeditionIndex = expeditionIndex; } } } namespace GTFuckingXP.Information.Enemies.Scale { public class EnemyLevels { public uint PersistendId { get; set; } public int EnemyId { get; set; } public int LevelNumber { get; set; } public string TagText { get; set; } public float MaxHealthMultiplier { get; set; } public float ShooterDamageMultiplier { get; set; } public float MeleeDamageMultiplier { get; set; } public float PushDamageMutliplier { get; set; } public EnemyLevels(uint persistentId, int enemyId, int levelNumber, string tagText, float hpMultiplier, float shooterDamageMultiplier, float meleeDamageMultiplier, float pushDamageMultiplier) { PersistendId = persistentId; LevelNumber = levelNumber; TagText = tagText; MaxHealthMultiplier = hpMultiplier; ShooterDamageMultiplier = shooterDamageMultiplier; MeleeDamageMultiplier = meleeDamageMultiplier; PushDamageMutliplier = pushDamageMultiplier; } } public class LevelEnemyScaler { public eRundownTier Tier { get; set; } public int ExpeditionIndex { get; set; } public List ZoneToEnemyIds { get; set; } public LevelEnemyScaler(eRundownTier tier, int expeditionIndex, List zoneToEnemyIds) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) Tier = tier; ExpeditionIndex = expeditionIndex; ZoneToEnemyIds = zoneToEnemyIds; } } public class ZoneToEnemyId { public int Zone { get; set; } public List EnemyLevelIds { get; set; } public ZoneToEnemyId(int zone, List enemyLevelIds) { Zone = zone; EnemyLevelIds = enemyLevelIds; } } } namespace GTFuckingXP.Information.ClassSelector { public class Group { public int PersistentId { get; set; } public List VisibleForPlayerCount { get; set; } public bool ExpandAboveFourCount { get; set; } = true; public LocaleText Name { get; set; } public bool AllowedForCount(int playerCount) { if (playerCount == 0) { return true; } if (VisibleForPlayerCount == null) { return false; } if (!VisibleForPlayerCount.Contains(playerCount)) { if (ExpandAboveFourCount) { return VisibleForPlayerCount.Max() >= 4; } return false; } return true; } } } namespace GTFuckingXP.Extensions { public static class CacheApiWrapper { public const string XpModCacheName = "GTF_XP"; internal const string LevelLayoutKey = "LevelLayout"; internal const string CheckpointData = "XpCheckpointData"; private const string ActiveLevelKey = "ActiveLevel"; private const string DefaultDataBlockMaxHpKey = "MaxHpDefault"; private const string PlayerSlotToLevelIndexMappingKey = "PlayerLevelIndexMapping"; private const string BoosterBuffKey = "BoosterBuffKey"; private const string AnchorDifferenceKey = "AnchorDifferenceKey"; private const string LvlUpCallbackKey = "LvlUpCallbackKey"; private const string ScriptsStartedCallbackKey = "ScriptsStartedCallback"; private static readonly Dictionary DefaultLayouts = new Dictionary(); private static ActiveLevel ActiveLocalLevel; private static readonly Dictionary ActiveClientLevels = new Dictionary(); public static Tscript DestroyOldCreateRegisterAndReturnComponent() where Tscript : Component { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown Tscript val = default(Tscript); if (CacheApi.TryGetInstance(ref val, "GTF_XP", false)) { ((Component)val).gameObject.SetActive(false); Object.Destroy((Object)(object)val); CacheApi.RemoveInstance("GTF_XP"); } GameObject val2 = new GameObject("GetTheFuckingXp_Endskill"); Object.DontDestroyOnLoad((Object)val2); val = val2.AddComponent(); CacheApi.SaveInstance(val, "GTF_XP"); return val; } public static Tscript CreateRegisterAndReturnComponent() where Tscript : Component { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown Tscript val = default(Tscript); if (CacheApi.TryGetInstance(ref val, "GTF_XP", false)) { ((Component)val).gameObject.SetActive(true); return val; } GameObject val2 = new GameObject("GetTheFuckingXp_Endskill"); Object.DontDestroyOnLoad((Object)val2); val = val2.AddComponent(); CacheApi.SaveInstance(val, "GTF_XP"); return val; } public static void KillScript() where Tscript : Component { Tscript val = default(Tscript); if (CacheApi.TryGetInstance(ref val, "GTF_XP", false)) { ((Component)val).gameObject.SetActive(false); Object.Destroy((Object)(object)val); CacheApi.RemoveInstance("GTF_XP"); } } public static LevelLayout LoadOrGetDefaultLayout() { if (SaveManager.TryLoadLayout(out LevelLayout layout)) { return layout; } return GetDefaultLayout(); } public static LevelLayout GetDefaultLayout() { int count = SNet.SessionHub.PlayersInSession.Count; if (DefaultLayouts.TryGetValue(count, out LevelLayout value)) { return value; } List levelLayouts = GetLevelLayouts(); if (count == 0) { return DefaultLayouts[count] = levelLayouts[0]; } List instance = CacheApi.GetInstance>("GTF_XP"); Group bestGroup = instance[0]; int num = bestGroup.VisibleForPlayerCount.Max(); foreach (Group item in instance) { if (item.AllowedForCount(count) && item.VisibleForPlayerCount.Max() < num) { bestGroup = item; num = item.VisibleForPlayerCount.Max(); if (num == count) { break; } } } return DefaultLayouts[count] = levelLayouts.Find((LevelLayout layout) => layout.GroupPersistentId == bestGroup.PersistentId); } public static void SetCurrentLevelLayout(LevelLayout levelLayout) { LogManager.Debug($"Set current level layout to {levelLayout.Header}."); CacheApi.SaveInformation((object)"LevelLayout", (object)levelLayout, "GTF_XP"); ActiveLocalLevel.Layout = levelLayout; } public static LevelLayout GetCurrentLevelLayout() { return CacheApi.GetInformation((object)"LevelLayout", "GTF_XP"); } public static LevelLayout GetLevelLayout(int id) { return CacheApi.GetInstance>("GTF_XP")[id]; } public static bool TryGetLevelLayout(int id, [MaybeNullWhen(false)] out LevelLayout layout) { return CacheApi.GetInstance>("GTF_XP").TryGetValue(id, out layout); } public static List GetLevelLayouts() { return CacheApi.GetInstance>("GTF_XP"); } public static bool TryGetCurrentLevelLayout(out LevelLayout levelLayout) { return CacheApi.TryGetInformation((object)"LevelLayout", ref levelLayout, "GTF_XP", false); } public static void SetActiveLevel(Level newLevel, bool sendToOtherPeople = true) { ActiveLocalLevel.Level = newLevel; ActiveLocalLevel.LevelNumber = newLevel.LevelNumber; LogManager.Debug($"Setting new level to {newLevel.LevelNumber}."); CacheApi.SaveInformation((object)"ActiveLevel", (object)newLevel, "GTF_XP"); if (sendToOtherPeople) { NetworkApiXpManager.SendNewLevelActive(newLevel); } foreach (Action lvlUpCallBack in GetLvlUpCallBackList()) { lvlUpCallBack(newLevel); } } public static bool TryGetFullActiveLevel(PlayerAgent? player, [MaybeNullWhen(false)] out ActiveLevel activeLevel) { if ((Object)(object)player == (Object)null) { activeLevel = default(ActiveLevel); return false; } if (((Agent)player).IsLocallyOwned) { activeLevel = ActiveLocalLevel; return true; } if (ActiveClientLevels.TryGetValue(player.PlayerSlotIndex, out activeLevel)) { return true; } return false; } public static Level GetActiveLevel() { return CacheApi.GetInformation((object)"ActiveLevel", "GTF_XP"); } public static bool TryGetActiveLevel(PlayerAgent? player, [MaybeNullWhen(false)] out Level level) { if ((Object)(object)player == (Object)null) { level = null; return false; } if (((Agent)player).IsLocallyOwned && CacheApi.TryGetInformation((object)"ActiveLevel", ref level, "GTF_XP", false)) { return true; } if (GetPlayerToLevelMapping().TryGetValue(player.PlayerSlotIndex, out level)) { return true; } return false; } public static Level? GetActiveLevel(PlayerAgent player) { if ((Object)(object)player == (Object)null) { return null; } if (((Agent)player).IsLocallyOwned) { return GetActiveLevel(); } return GetPlayerToLevelMapping().GetValueOrDefault(player.PlayerSlotIndex); } public static float GetDefaultMaxHp() { return CacheApi.GetInformation((object)"MaxHpDefault", "GTF_XP"); } public static void SetDefaultMaxHp(float defaultMaxHp) { CacheApi.SaveInformation((object)"MaxHpDefault", (object)defaultMaxHp, "GTF_XP"); } public static void InitPlayerMapping() { CacheApi.SaveInformation((object)"PlayerLevelIndexMapping", (object)new Dictionary(), "GTF_XP"); ActiveClientLevels.Clear(); } public static Dictionary GetPlayerToLevelMapping() { return CacheApi.GetInformation>((object)"PlayerLevelIndexMapping", "GTF_XP"); } public static Dictionary GetPlayerToActiveLevelMapping() { return ActiveClientLevels; } public static void SetPlayerActiveLevel(int slot, ActiveLevel activeLevel) { GetPlayerToLevelMapping()[slot] = activeLevel.Level; ActiveClientLevels[slot] = activeLevel; } public static void SetXpStorageData(uint knownXpState) { CacheApi.SaveInformation((object)"XpCheckpointData", (object)(GetCurrentLevelLayout(), knownXpState), "GTF_XP"); } public static bool TryGetXpStorageData(out (LevelLayout levelLayout, uint totalXp) checkpointData) { return CacheApi.TryGetInformation<(LevelLayout, uint)>((object)"XpCheckpointData", ref checkpointData, "GTF_XP", false); } public static BoosterBuffs GetCurrentBoosterBuffs() { return CacheApi.GetInformation((object)"BoosterBuffKey", "GTF_XP"); } public static void SetCurrentBoosterBuff(BoosterBuffs boosterBuff) { CacheApi.SaveInformation((object)"BoosterBuffKey", (object)boosterBuff, "GTF_XP"); } public static void SetAnchorDifference(float anchorDifference) { CacheApi.SaveInformation((object)"AnchorDifferenceKey", (object)anchorDifference, "GTF_XP"); } public static bool TryGetAnchorDifference(out float anchorDifference) { return CacheApi.TryGetInformation((object)"AnchorDifferenceKey", ref anchorDifference, "GTF_XP", false); } public static void SetLvlUpCallBackList(List> lvlUpCallbacks) { CacheApi.SaveInformation((object)"LvlUpCallbackKey", (object)lvlUpCallbacks, "GTF_XP"); } public static void AddLvlUpCallback(Action lvlUpCallback) { CacheApi.GetInformation>>((object)"LvlUpCallbackKey", "GTF_XP").Add(lvlUpCallback); } public static void SetScriptsStartedCallBackList(List> lvlUpCallbacks) { CacheApi.SaveInformation((object)"ScriptsStartedCallback", (object)lvlUpCallbacks, "GTF_XP"); } public static void AddScriptsStartedCallback(Action lvlUpCallback) { CacheApi.GetInformation>>((object)"ScriptsStartedCallback", "GTF_XP").Add(lvlUpCallback); } public static List> GetLvlUpCallBackList() { return CacheApi.GetInformation>>((object)"LvlUpCallbackKey", "GTF_XP"); } public static List> GetScriptsStartedCallbackList() { return CacheApi.GetInformation>>((object)"ScriptsStartedCallback", "GTF_XP"); } public static void SetDefaultCustomScaling(CustomScaling customScaling, T info) where T : notnull { CacheApi.SaveInformation((object)customScaling, (object)info, "GTF_XP"); } public static bool TryGetDefaultCustomScaling(CustomScaling customScaling, out T info) { return CacheApi.TryGetInformation((object)customScaling, ref info, "GTF_XP", false); } public static bool HasDefaultCustomScaling(CustomScaling customScaling) { return CacheApi.ContainsKey((object)customScaling, "GTF_XP"); } public static void RemoveDefaultCustomScaling(CustomScaling customScaling) { CacheApi.RemoveInformation((object)customScaling, "GTF_XP"); } public static GlobalValues GetGlobalValues() { return CacheApi.GetInstance("GTF_XP"); } } internal static class GameObjectExtensions { public static T Instantiate(this GameObject gameObject, string name) where T : Component { GameObject obj = Object.Instantiate(gameObject, gameObject.transform.parent, false); ((Object)obj).name = name; return obj.GetComponent(); } } internal static class SlotExtensions { public static InventorySlot ToInventorySlot(this AmmoType ammo) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected I4, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) return (InventorySlot)((int)ammo switch { 0 => 1, 1 => 2, 2 => 3, 3 => 4, _ => 0, }); } public static AmmoType ToAmmoType(this InventorySlot slot) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected I4, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) return (AmmoType)((slot - 1) switch { 0 => 0, 1 => 1, 2 => 2, 3 => 3, _ => 4, }); } } } namespace GTFuckingXP.Extensions.Information { public class GlobalValues { public float BiotagXpFrac { get; set; } public float ReviveXpStoredFrac { get; set; } public float ReviveXpTransferCapFrac { get; set; } } } namespace GTFuckingXP.Extensions.Information.Level.Json { internal static class BuffJson { private static readonly JsonSerializerOptions _setting; static BuffJson() { _setting = new JsonSerializerOptions { ReadCommentHandling = JsonCommentHandling.Skip, IncludeFields = true, PropertyNameCaseInsensitive = true, WriteIndented = true, IgnoreReadOnlyProperties = true }; _setting.Converters.Add(new JsonStringEnumConverter()); _setting.Converters.Add(new LegacyBuffConverter()); _setting.Converters.Add(new LegacyBuffConverter()); _setting.Converters.Add(new LegacyBuffConverter()); } public static T? Deserialize(string json) { return JsonSerializer.Deserialize(json, _setting); } public static string Serialize(T value) { return JsonSerializer.Serialize(value, _setting); } } public sealed class LegacyBuffConverter : JsonConverter> where T : struct, Enum { private static readonly string TypeName = typeof(T).Name; private static readonly T InvalidValue = (T)Enum.ToObject(typeof(T), -1); public override Dictionary? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (TryLegacyRead(ref reader, out Dictionary result)) { return result; } return JsonSerializer.Deserialize>(ref reader, GetExcludedOptions(options)); } private static bool TryLegacyRead(ref Utf8JsonReader reader, out Dictionary result) { if (reader.TokenType != JsonTokenType.StartArray) { result = null; return false; } result = new Dictionary(); while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndArray) { return true; } if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException($"LegacyFormat: Expected {TypeName} to be an object, found {reader.TokenType}"); } reader.Read(); if (reader.TokenType == JsonTokenType.EndObject) { continue; } if (reader.TokenType != JsonTokenType.PropertyName) { throw new JsonException($"LegacyFormat: Expected {TypeName} name or object property, found {reader.TokenType}"); } string @string = reader.GetString(); float value = 1f; if (@string.TryToEnum(out var enumValue)) { reader.Read(); if (reader.TokenType != JsonTokenType.Number) { throw new JsonException($"LegacyFormat: Expected {TypeName} name to be followed by a value, found {reader.TokenType}"); } value = reader.GetSingle(); reader.Read(); } else { do { if (reader.TokenType != JsonTokenType.PropertyName) { throw new JsonException($"LegacyFormat: Expected {TypeName} object property, found {reader.TokenType}"); } @string = reader.GetString(); reader.Read(); if (@string == "Value") { value = reader.GetSingle(); } else if (!@string.EndsWith("Buff")) { LogManager.Warn($"LegacyFormat: Expected {TypeName}:Value format or \"---Buff\" field for {TypeName} object format, found \"{@string}\"! Skipping..."); enumValue = InvalidValue; } else if (reader.TokenType != JsonTokenType.String) { if (!reader.TryGetInt32(out var value2)) { throw new JsonException($"LegacyFormat: Unable to read int enum value from \"{reader.GetString()}\" when parsing {TypeName}! (Field name: \"{@string}\")"); } enumValue = (T)Enum.ToObject(typeof(T), value2); } else if (!reader.GetString().TryToEnum(out enumValue)) { LogManager.Warn($"LegacyFormat: Unable to get {TypeName} type for \"{reader.GetString()}\"! Skipping..."); enumValue = InvalidValue; } } while (reader.Read() && reader.TokenType != JsonTokenType.EndObject); } if (reader.TokenType == JsonTokenType.EndObject) { result.TryAdd(enumValue, value); continue; } throw new JsonException($"LegacyFormat: Expected EndObject token when parsing {TypeName}, found {reader.TokenType}"); } throw new JsonException($"LegacyFormat: Expected EndArray token when parsing {TypeName}, found {reader.TokenType}"); } public override void Write(Utf8JsonWriter writer, Dictionary value, JsonSerializerOptions options) { JsonSerializer.Serialize(writer, value, GetExcludedOptions(options)); } private static JsonSerializerOptions GetExcludedOptions(JsonSerializerOptions options) { JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions(options); IList converters = jsonSerializerOptions.Converters; for (int i = 0; i < converters.Count; i++) { if (converters[i] is LegacyBuffConverter) { converters.RemoveAt(i); break; } } return jsonSerializerOptions; } } [JsonConverter(typeof(LocaleTextConverter))] public struct LocaleText : IEquatable { public uint ID; public string RawText; public static readonly LocaleText Empty = new LocaleText(string.Empty); private readonly string TextFallback { get { if (ID != 0) { return Text.Get(ID); } return RawText; } } public LocaleText(LocalizedText baseText) { ID = 0u; RawText = string.Empty; RawText = LocalizedToText(baseText); ID = baseText.Id; } public LocaleText(string text) { ID = 0u; RawText = string.Empty; if (PartialData.TryGetGUID(text, out var guid)) { RawText = string.Empty; ID = guid; } else { RawText = text; ID = 0u; } } public LocaleText(uint id) { ID = 0u; RawText = string.Empty; RawText = string.Empty; ID = id; } public readonly LocalizedText ToLocalizedText() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown return new LocalizedText { Id = ID, UntranslatedText = TextFallback }; } public override readonly string ToString() { return TextFallback; } public static string LocalizedToText(LocalizedText text) { if (!text.HasTranslation) { return text.UntranslatedText; } return Text.Get(text.Id); } public static explicit operator LocaleText(LocalizedText localizedText) { return new LocaleText(localizedText); } public static explicit operator LocaleText(string text) { return new LocaleText(text); } public static implicit operator LocalizedText(LocaleText localeText) { return localeText.ToLocalizedText(); } public static implicit operator string(LocaleText localeText) { return localeText.ToString(); } public readonly bool Equals(LocaleText other) { if (ID == other.ID) { return string.Equals(RawText, other.RawText, StringComparison.Ordinal); } return false; } public override readonly bool Equals(object? obj) { if (obj is LocaleText other) { return Equals(other); } return false; } public override readonly int GetHashCode() { return HashCode.Combine(ID, RawText); } public static bool operator ==(LocaleText left, LocaleText right) { return left.Equals(right); } public static bool operator !=(LocaleText left, LocaleText right) { return !(left == right); } } public class LocaleTextConverter : JsonConverter { public override bool HandleNull => true; public override LocaleText Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TokenType switch { JsonTokenType.String => new LocaleText(reader.GetString()), JsonTokenType.Number => new LocaleText(reader.GetUInt32()), JsonTokenType.Null => LocaleText.Empty, _ => throw new JsonException($"LocaleTextJson type: {reader.TokenType} is not implemented!"), }; } public override void Write(Utf8JsonWriter writer, LocaleText value, JsonSerializerOptions options) { if (value.ID != 0) { writer.WriteNumberValue(value.ID); } else { writer.WriteStringValue(value.RawText); } } } internal static class StringExtensions { public static T ToEnum(this string? value, T defaultValue) where T : struct { if (string.IsNullOrEmpty(value)) { return defaultValue; } if (!Enum.TryParse(value.Replace(" ", null), ignoreCase: true, out var result)) { return defaultValue; } return result; } public static bool TryToEnum(this string? value, out T enumValue) where T : struct { enumValue = default(T); if (string.IsNullOrEmpty(value)) { return false; } return Enum.TryParse(value.Replace(" ", null), ignoreCase: true, out enumValue); } } } namespace GTFuckingXP.Enums { public enum CustomScaling { Invalid = -1, MeleeRangeMultiplier, MeleeHitBoxSizeMultiplier, MeleeAttackSpeedMultiplier, MovementSpeedMultiplier, JumpVelInitialPlus, JumpGravityMulDefaultPlus, JumpGravityMulButtonReleased, JumpGravityMulAfterPeakPlus, JumpGravityMulFallingPlus, JumpVerticalVelocityMaxPlus, RegenStartDelayMultiplier, BleedResistance, AmmoEfficiency, AmmoGainEfficiency, AmmoCapacity, ToolEfficiency, ToolGainEfficiency, ToolCapacity, ExplosionResistance, BulletResistance, Count } public enum PlayerBuff { Invalid = -1, MaxHP, HammerDamage, WeaponDamage } public enum SingleBuff { Invalid = -1, Heal = 0, Disinfect = 1, Desinfect = 1, AmmunitionMain = 2, AmmunitionSpecial = 3, AmmunitionTool = 4 } public enum StartBuff { Invalid = -1, AmmunitionMainMultiplier, AmmunitionSpecialMultiplier, AmmunitionToolMultiplier } } namespace GTFuckingXP.Dependencies { internal static class AmmoFix { [HarmonyPatch(typeof(InventorySlotAmmo))] private class SSA_InventorySlotPatches { [HarmonyPatch("AddAmmo")] [HarmonyWrapSafe] [HarmonyPrefix] private static bool FixAmmoOverflow(InventorySlotAmmo __instance, float ammoAmount) { float ammoInPack = __instance.AmmoInPack; float ammoMaxCap = __instance.AmmoMaxCap; if (ammoInPack + ammoAmount < ammoMaxCap) { return true; } if (ammoAmount > 0f && ammoInPack > 0f) { if (ammoInPack >= ammoMaxCap) { return false; } __instance.AmmoInPack = ammoMaxCap; } else { __instance.AmmoInPack += ammoAmount; } __instance.OnBulletsUpdateCallback?.Invoke(__instance.BulletsInPack); return false; } } [HarmonyPatch(typeof(PlayerAmmoStorage))] private static class ETC_ToolAmmoPatches { [HarmonyPatch("UpdateBulletsInPack")] [HarmonyWrapSafe] [HarmonyPrefix] private static bool Unclamp_UpdateBullets(PlayerAmmoStorage __instance, AmmoType ammoType, int bulletCount, ref float __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0007: Unknown result type (might be due to invalid IL or missing references) if ((int)ammoType != 2) { return true; } InventorySlotAmmo inventorySlotAmmo = __instance.GetInventorySlotAmmo(ammoType); float ammoInPack = inventorySlotAmmo.AmmoInPack; float ammoMaxCap = inventorySlotAmmo.AmmoMaxCap; float num = (float)bulletCount * inventorySlotAmmo.CostOfBullet; if (ammoInPack + num < ammoMaxCap) { return true; } float num4; if (num > 0f && ammoInPack > 0f) { if (ammoInPack >= ammoMaxCap || num >= ammoMaxCap) { float num3 = (inventorySlotAmmo.AmmoInPack = Math.Max(ammoInPack, num)); num4 = num3; } else { float num3 = (inventorySlotAmmo.AmmoInPack = ammoMaxCap); num4 = num3; } } else { float num3 = (inventorySlotAmmo.AmmoInPack += num); num4 = num3; } inventorySlotAmmo.OnBulletsUpdateCallback?.Invoke(inventorySlotAmmo.BulletsInPack); __instance.NeedsSync = true; __instance.UpdateSlotAmmoUI(inventorySlotAmmo, 0); __result = num4; return false; } [HarmonyPatch("UpdateAmmoInPack")] [HarmonyWrapSafe] [HarmonyPrefix] private static bool Unclamp_UpdateAmmo(PlayerAmmoStorage __instance, AmmoType ammoType, float delta, ref float __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0007: Unknown result type (might be due to invalid IL or missing references) if ((int)ammoType != 2) { return true; } InventorySlotAmmo inventorySlotAmmo = __instance.GetInventorySlotAmmo(ammoType); float ammoInPack = inventorySlotAmmo.AmmoInPack; float ammoMaxCap = inventorySlotAmmo.AmmoMaxCap; if (ammoInPack + delta < ammoMaxCap) { return true; } float num3; if (delta > 0f && ammoInPack > 0f) { if (ammoInPack >= ammoMaxCap || delta >= ammoMaxCap) { float num2 = (inventorySlotAmmo.AmmoInPack = Math.Max(ammoInPack, delta)); num3 = num2; } else { float num2 = (inventorySlotAmmo.AmmoInPack = ammoMaxCap); num3 = num2; } } else { float num2 = (inventorySlotAmmo.AmmoInPack += delta); num3 = num2; } inventorySlotAmmo.OnBulletsUpdateCallback?.Invoke(inventorySlotAmmo.BulletsInPack); __instance.NeedsSync = true; __instance.UpdateSlotAmmoUI(inventorySlotAmmo, 0); __result = num3; return false; } } public const string ETC_GUID = "Dinorush.ExtraToolCustomization"; public const string SSA_GUID = "Dinorush.SpreadStartingAmmo"; public static readonly bool HasETC; public static readonly bool HasSSA; static AmmoFix() { HasETC = ((BaseChainloader)(object)IL2CPPChainloader.Instance).Plugins.ContainsKey("Dinorush.ExtraToolCustomization"); HasSSA = ((BaseChainloader)(object)IL2CPPChainloader.Instance).Plugins.ContainsKey("Dinorush.SpreadStartingAmmo"); } public static void TryApplyPatches(Harmony harmony) { if (!HasSSA) { harmony.PatchAll(typeof(SSA_InventorySlotPatches)); if (!HasETC) { harmony.PatchAll(typeof(ETC_ToolAmmoPatches)); } } } } internal static class PartialData { public const string PLUGIN_GUID = "MTFO.Extension.PartialBlocks"; public static readonly bool HasPData; static PartialData() { HasPData = ((BaseChainloader)(object)IL2CPPChainloader.Instance).Plugins.ContainsKey("MTFO.Extension.PartialBlocks"); } public static bool TryGetGUID(string text, out uint guid) { if (!HasPData) { guid = 0u; return false; } return TryGetGUID_Internal(text, out guid); } [MethodImpl(MethodImplOptions.NoInlining)] private static bool TryGetGUID_Internal(string text, out uint guid) { return PersistentIDManager.TryGetId(text, ref guid); } } } namespace GTFuckingXP.Communication { public static class XpApi { public static bool ReloadData() { try { ScriptManager.Instance.UpdateEverything(); LevelLayout levelLayout = default(LevelLayout); if (CacheApi.TryGetInformation((object)"LevelLayout", ref levelLayout, "GTF_XP", false)) { LevelLayout levelLayout2 = CacheApiWrapper.GetLevelLayout(levelLayout.PersistentId); Level activeLevel = CacheApiWrapper.GetActiveLevel(); CacheApiWrapper.SetCurrentLevelLayout(levelLayout2); SetCurrentLevel(activeLevel.LevelNumber, out var _); } return true; } catch (Exception msg) { LogManager.Error(msg); return false; } } public static bool AddXp(int xpAmount) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) try { CacheApi.GetInstance("GTF_XP").AddXp(new EnemyXp(0u, "", xpAmount, xpAmount, 0), default(Vector3)); return true; } catch (Exception msg) { LogManager.Error(msg); return false; } } public static bool SetCurrentTotalXp(uint newTotalXpAmount, out int cheatedXp) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) try { XpHandler instance = CacheApi.GetInstance("GTF_XP"); cheatedXp = (int)(newTotalXpAmount - instance.CurrentTotalXp); instance.CurrentTotalXp = newTotalXpAmount; instance.CheckForLevelThresholdReached(default(Vector3), out string currentClassName); CacheApi.GetInstance("GTF_XP").UpdateUiString(CacheApiWrapper.GetActiveLevel(), instance.NextLevel, instance.CurrentTotalXp, currentClassName); return true; } catch (Exception msg) { LogManager.Error(msg); cheatedXp = 0; return false; } } public static bool SetCurrentLevel(int levelNumber, out int cheatedXp) { try { LevelLayout currentLevelLayout = CacheApiWrapper.GetCurrentLevelLayout(); XpHandler instance = CacheApi.GetInstance("GTF_XP"); Level level = currentLevelLayout.Levels[levelNumber]; instance.ChangeCurrentLevel(level, BoosterBuffManager.Instance.GetFittingBoosterBuff(currentLevelLayout.PersistentId, level.LevelNumber)); cheatedXp = (int)(level.TotalXpRequired - instance.CurrentTotalXp); instance.CurrentTotalXp = level.TotalXpRequired + 1; instance.NextLevel = currentLevelLayout.GetLevel(levelNumber + 1); CacheApi.GetInstance("GTF_XP").UpdateUiString(CacheApiWrapper.GetActiveLevel(), instance.NextLevel, instance.CurrentTotalXp, currentLevelLayout.Header); } catch (Exception msg) { LogManager.Error(msg); cheatedXp = 0; return false; } return true; } public static bool ChangeCurrentLevelLayout(string header) { string header2 = header; try { return ChangeCurrentLevelLayout(CacheApiWrapper.GetLevelLayouts().First((LevelLayout it) => it.Header == header2)); } catch (Exception msg) { LogManager.Error(msg); return false; } } public static bool ChangeCurrentLevelLayout(LevelLayout newActiveLevelLayout) { try { CacheApiWrapper.SetCurrentLevelLayout(newActiveLevelLayout); XpHandler xpHandler = default(XpHandler); if (CacheApi.TryGetInstance(ref xpHandler, "GTF_XP", true)) { xpHandler.SkipToXp(xpHandler.CurrentTotalXp); } return true; } catch (Exception msg) { LogManager.Error(msg); return false; } } public static void AddOnLevelUpCallback(Action lvlUpCallback) { CacheApiWrapper.AddLvlUpCallback(lvlUpCallback); } public static void AddScriptsLoaded(Action scriptsLoadedCallback) { CacheApiWrapper.AddScriptsStartedCallback(scriptsLoadedCallback); } } }