public static void UpgradePlayer(Scp914Machine instance, CharacterClassManager player, IEnumerable <CharacterClassManager> players) { var c = PluginConfig.Cfg; if (!c.RoughCoarseDamageSCP && player.IsScpButNotZombie()) { TeleportPlayer(instance, player); return; } if (CheckPercent(c.InvUpgradeChance) && !player.IsAnyScp()) { Inventory inv = player.GetComponent <Inventory>(); if (inv.items.Count > 0) { var index = inv.items.Count > 1 ? Random.Range(0, inv.items.Count - 1) : 0; var itemInfo = inv.items[index]; var item = GetItem(instance.knobState, itemInfo.id); if (item < 0) { inv.items.RemoveAt(index); } else { itemInfo.id = item; inv.items[index] = itemInfo; Scp914Machine.TryFriendshipAchievement(item, player, players); } } } if (c.ChangePlayerHealth) { if (!player.GodMode && player.CurClass != RoleType.Spectator) { HealthChangedComponent component = player.GetComponent <HealthChangedComponent>(); var stats = player.GetComponent <PlayerStats>(); if (component == null) { component = player.gameObject.AddComponent <HealthChangedComponent>(); component.OriginalHealthAmmount = stats.maxHP; component.ActualHealthPercentage = 100; } var newPercent = component.ActualHealthPercentage; if (instance.knobState == Scp914Knob.Rough) { if (CheckPercent(c.RoughDamageChance) || (CheckPercent(c.RoughDamageChance * c.SCPDamageChanceMultiplier) && player.IsScpButNotZombie())) { if (player.IsScpButNotZombie()) { HurtPlayer(stats.maxHP * ((c.RoughDamageAmmout / 2) / 100), stats, player); } else { newPercent -= c.RoughDamageAmmout; } } } else if (instance.knobState == Scp914Knob.Coarse) { if (CheckPercent(c.CoarseDamageChance) || (CheckPercent(c.CoarseDamageChance * c.SCPDamageChanceMultiplier) && player.IsScpButNotZombie())) { if (player.IsScpButNotZombie()) { HurtPlayer(stats.maxHP * ((c.CoarseDamageAmmout / 2) / 100), stats, player); } else { newPercent -= c.CoarseDamageAmmout; } } } else if (instance.knobState == Scp914Knob.Fine && !player.IsScpButNotZombie()) { if (CheckPercent(c.FineHealChance)) { newPercent += c.FineHealAmmout; } } else if (instance.knobState == Scp914Knob.VeryFine && !player.IsScpButNotZombie()) { if (CheckPercent(c.VeryFineHealChance)) { newPercent += c.VeryFineHealAmmout; } } newPercent = Constrain(newPercent, 100 - c.RoughDamageAmmout, 100 + c.VeryFineHealAmmout); Log.Info("newPercent: " + newPercent + "%"); if (newPercent <= 0) { HurtPlayer(stats.maxHP + 1f, stats, player); if (stats.health > 0) { newPercent = 5f; } else { Object.Destroy(component); } } if (newPercent >= 100) { var prev = stats.maxHP; stats.maxHP = Mathf.RoundToInt(component.OriginalHealthAmmount * (newPercent / 100)); if (prev > stats.maxHP) { stats.health = stats.maxHP < stats.health ? stats.maxHP : stats.health; } else if (!player.IsScpButNotZombie()) { stats.HealHPAmount(999999f); } } component.ActualHealthPercentage = newPercent; Log.Info(component.ActualHealthPercentage + "% " + stats.maxHP + "HP " + stats.health + "health"); } } TeleportPlayer(instance, player); }