示例#1
0
    public override void StackEffect(Effect e)
    {
        DotStack t = (DotStack)e;

        duration += t.duration;
        Debug.Log(duration);
    }
示例#2
0
    void Damageable.Dot(DotFrame frame)
    {
        if (Invulnerable)
        {
            return;
        }

        if (Faction != Factions.AgainstAll)
        {
            if (frame.attacker != null)
            {
                if (frame.attacker.Faction != Factions.AgainstAll)
                {
                    if (frame.attacker.Faction == Faction)
                    {
                        return;
                    }
                }
            }
        }

        //these would stick forever
        if (frame.damagePerApplication <= 0)
        {
            return;
        }

        OnDot.Invoke(frame);

        if (frame.attacker != null)
        {
            if (frame.attacker.Faction == Factions.Player)
            {
                frame.totalDamage = (int)System.Math.Round((double)frame.totalDamage * ((double)Difficulty.PlayerDamage / 100d));
            }
            else
            {
                frame.totalDamage = (int)System.Math.Round((double)frame.totalDamage * ((double)Difficulty.EnemyDamage / 100d));
            }
        }

        GameObject ailment = new GameObject("dot");

        ailment.transform.SetParent(transform);
        DotStack d = ailment.AddComponent <DotStack>();

        d.damageType           = frame.damageType;
        d.totalDamage          = frame.totalDamage;
        d.damagePerApplication = frame.damagePerApplication;
    }
示例#3
0
    public override string GetAmount(Character origin, Character target)
    {
        int damage = 0;

        foreach (Effect e in target.statusEffects)
        {
            if (e.GetType() == stack.GetType())
            {
                DotStack s = (DotStack)e;
                damage = s.duration;
                break;
            }
        }
        return(damage.ToString());
    }
示例#4
0
    public override int Apply(Character origin, Character target)
    {
        int damage = 0;

        foreach (Effect e in target.statusEffects)
        {
            if (e.GetType() == stack.GetType())
            {
                DotStack s = (DotStack)e;
                damage = s.duration;
                break;
            }
        }
        target.ChangeHealth(-damage);
        return(0);
    }
示例#5
0
        private void AddDotModBurnDamageFix(GameObject attackerObject, float duration, DotIndex dotIndex, float damageMultiplier, float damageThatProccedIt)
        {
            if (!NetworkServer.active)
            {
                Debug.LogWarning("[Server] function 'System.Void RoR2.DotController::AddDot(UnityEngine.GameObject,System.Single,RoR2.DotController/DotIndex,System.Single)' called on client");
                return;
            }

            if (dotIndex < DotIndex.Bleed || dotIndex >= DotIndex.Count)
            {
                return;
            }

            TeamIndex     teamIndex = TeamIndex.Neutral;
            float         single    = 0f;
            TeamComponent component = attackerObject.GetComponent <TeamComponent>();

            if (component)
            {
                teamIndex = component.teamIndex;
            }

            CharacterBody characterBody = attackerObject.GetComponent <CharacterBody>();

            if (characterBody)
            {
                single = characterBody.damage;
            }

            DotDef   dotDef   = dotDefs[(int)dotIndex];
            DotStack dotStack = new DotStack
            {
                dotIndex       = dotIndex,
                dotDef         = dotDef,
                attackerObject = attackerObject,
                attackerTeam   = teamIndex,
                timer          = duration,
                damageType     = DamageType.Generic
            };

            if (teamIndex != TeamIndex.Monster || damageThatProccedIt == 0f)
            {
                dotStack.damage = dotDef.damageCoefficient * single * damageMultiplier;
            }
            else
            {
                dotStack.damage = dotDef.damageCoefficient * damageThatProccedIt * damageMultiplier * 0.6f;
            }

            if (dotIndex == DotIndex.Helfire)
            {
                if (!characterBody)
                {
                    return;
                }

                HealthComponent healthComponent = characterBody.healthComponent;
                if (!healthComponent)
                {
                    return;
                }

                dotStack.damage = healthComponent.fullHealth * 0.01f * damageMultiplier;
                if (victimObject == attackerObject)
                {
                    DotStack dotStack1 = dotStack;
                    dotStack1.damageType = dotStack1.damageType | DamageType.NonLethal | DamageType.Silent;
                }
                else if (victimTeam != teamIndex)
                {
                    dotStack.damage *= 24f;
                }
                else
                {
                    dotStack.damage *= 0.5f;
                }

                int num   = 0;
                int count = dotStackList.Count;
                while (num < count)
                {
                    if (dotStackList[num].dotIndex == DotIndex.Helfire && dotStackList[num].attackerObject == attackerObject)
                    {
                        dotStackList[num].timer  = Mathf.Max(dotStackList[num].timer, duration);
                        dotStackList[num].damage = dotStack.damage;
                        return;
                    }

                    num++;
                }

                if (victimBody)
                {
                    EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/HelfireIgniteEffect"), new EffectData
                    {
                        origin = victimBody.corePosition
                    }, true);
                }
            }

            dotStackList.Add(dotStack);
        }