Пример #1
0
    public virtual long TakeDamage(Creature offender, DamageDesc damageDesc)
    {
        if (m_behaviourType == BehaviourType.Death)
            return 0;

        if (m_buffEffects[(int)DamageDesc.BuffType.Macho].m_run == true)
        {
            DamageText(RefData.Instance.RefTexts(MultiLang.ID.Blocked), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha);
            return 0;
        }

        if (m_buffEffects[(int)DamageDesc.BuffType.Dash].m_run == true)
        {
            DamageText(RefData.Instance.RefTexts(MultiLang.ID.Blocked), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha);
            return 0;
        }

        bool critical = false;
        float criticalDamage = 1f;
        if (offender != null)
        {
            if (Random.Range(0, 1f) < offender.m_creatureProperty.CriticalChance)
            {
                critical = true;
                criticalDamage = 1f+offender.m_creatureProperty.CriticalDamage;
            }
        }

        long dmg = (long)(damageDesc.Damage*criticalDamage);
        dmg -= (long)(dmg*m_creatureProperty.DamageReduction);

        if (dmg <= 0)
        {
            dmg = Random.Range(0, 2);
        }

        if (dmg > 0)
        {
            if (Random.Range(0f, 1f) < m_creatureProperty.Dodge)
            {
                DamageText(RefData.Instance.RefTexts(MultiLang.ID.Dodged), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha);
                return 0;
            }

            if (m_creatureProperty.Shield > 0)
            {
                --m_creatureProperty.Shield;
                DamageText(RefData.Instance.RefTexts(MultiLang.ID.Shielded), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha);
                return 0;
            }
        }

        string strDamage = dmg.ToString();
        if (dmg == 0)
        {
            strDamage = RefData.Instance.RefTexts(MultiLang.ID.Blocked);
            DamageText(strDamage, Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha);
            return 0;
        }

        if (m_ingTakenDamageEffect < Const.MaxShowDamageNumber)
        {
            Vector3 damageTextScale = Vector3.one;
            ++m_ingTakenDamageEffect;
            Color color = Color.white;
            if (critical == true)
            {
                strDamage = dmg.ToString();
                color = Color.red;
                damageTextScale *= 1.1f;
            }
            else if (damageDesc.DamageBuffType == DamageDesc.BuffType.Poison)
            {
                color = Color.magenta;
            }
            else
            {
                if (offender != null && offender.RefMob.mobAI == MobAIType.Follow)
                {
                    damageTextScale *= 0.8f;
                    switch(offender.RefMob.id)
                    {
                    case 30001:
                        color = Color.clear;
                        break;
                    case 30002:
                        color = Color.red;
                        break;
                    case 30003:
                        color = Color.blue;
                        break;
                    case 30004:
                        color = Color.cyan;
                        break;
                    case 30005:
                        color = Color.yellow;
                        break;
                    case 30006:
                        color = Color.magenta;
                        break;
                    case 30007:
                        color = Color.grey;
                        break;
                    }
                }
            }

            DamageText(strDamage, damageTextScale, color, DamageNumberSprite.MovementType.ParabolaAlpha);

            StartCoroutine(BodyRedColoredOnTakenDamage());

            ApplyDamageEffect(damageDesc.DamageType, damageDesc.PrefEffect);
        }

        if (true == m_creatureProperty.BackwardOnDamage && damageDesc.PushbackOnDamage && m_pushbackSpeedOnDamage <= 0f)
        {
            if (Random.Range(0, 10) == 0)
            {
                m_pushbackSpeedOnDamage = 10f / rigidbody.mass;
                rigidbody.AddForce(transform.right*-2f, ForceMode.Impulse);
                rigidbody.AddTorque(transform.forward*2f, ForceMode.Impulse);
                rigidbody.maxAngularVelocity = 2f;

                EnableNavmeshUpdatePos(false);
            }
        }

        ApplyBuff(offender, damageDesc.DamageBuffType, 2f, damageDesc);

        if (offender != null && damageDesc.LifeSteal == true)
        {
            long lifeSteal = (long)(offender.m_creatureProperty.LifeSteal);
            if (lifeSteal > 0)
            {
                offender.DamageText(lifeSteal.ToString() + "L", Vector3.one, Color.green, DamageNumberSprite.MovementType.ParabolaAlpha);
                offender.Heal(lifeSteal);
            }
        }

        m_creatureProperty.HP-=dmg;
        if (m_creatureProperty.HP == 0)
        {
            Const.GetSpawn().SharePotinsChamps(offender, ItemData.Type.XPPotion, m_creatureProperty.RewardExp, false);
            Death();
        }

        if (offender != null && (offender.CreatureType & Type.Champ) > 0)
        {
            Warehouse.Instance.NewGameStats.DealDamages += dmg;
        }
        else if (CreatureType == Type.Champ)
        {
            Warehouse.Instance.NewGameStats.TakenDamages += dmg;
        }

        return dmg;
    }