Exemplo n.º 1
0
        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);
        }