コード例 #1
0
    //TODO: Простенько сделаем нанесение урона
    void OnCreateHit(HitInfo projHit)
    {
        if (projHit.Subject == null || projHit.Target == null)
        {
            return;
        }
        var proj = projHit.Subject.GetComponentInChildren <IProjectile>();

        if (proj == null)
        {
            return;
        }
        var receiver = projHit.Target.GetComponentInChildren <IDamageReceiver>();

        if (receiver == null)
        {
            return;
        }
        var dmg = proj.GetData.Damage;

        if (dmg == 0f)
        {
            return;
        }
        //Если надо будет узнать кто кого убил, надо протягивать Owner из Projectile Data
        var dmgInfo = new IncomeDamageInfo()
        {
            Damage = dmg,
            Owner  = proj.GetData.Owner,
            Source = proj
        };

        receiver.SetDamage(dmgInfo);
    }
コード例 #2
0
    void SetIncomeDamage(ref IncomeDamageInfo income)
    {
        if (!Lived)
        {
            return;
        }
        OutDamageInfo outInfo;

        GetOutDamageInfo(ref income, out outInfo);
        dmgArgs.Output = outInfo;
        dmgArgs.Income = income;
        SetOutputDamage(ref outInfo);
    }
コード例 #3
0
    public bool Kill(GameObject source = null, bool force = false)
    {
        if (!force && (Immortal || m_Invulnerable))
        {
            return(false);
        }
        var income = new IncomeDamageInfo()
        {
            Source = source
        };

        income.Kill = true;
        SetIncomeDamage(ref income);
        return(true);
    }
コード例 #4
0
 public void SetDamage(IncomeDamageInfo income)
 {
     if (m_Invulnerable)
     {
         return;
     }
     if (income.DamageType == TypeDamage.Explosion && m_DamageExplosionImmune)
     {
         income.Damage = 0f;
     }
     else if (m_Immortal || income.Damage < 0f)
     {
         income.Damage = 0f;
     }
     SetIncomeDamage(ref income);
 }
コード例 #5
0
    void GetOutDamageInfo(ref IncomeDamageInfo inDmg, out OutDamageInfo outDmg)
    {
        float curArmor      = CurrentArmor;
        float curHp         = CurrentHealth;
        float armorReceiver = 0f;
        float hpReceiver    = 0f;
        float receiver      = 0f;//реально полученный общий урон

        if (inDmg.Kill)
        {
            float fullArmor = inDmg.IgnoreArmor ? 0f : curArmor;
            receiver      = curHp + fullArmor;
            inDmg.Damage  = receiver;
            armorReceiver = fullArmor;
            hpReceiver    = curHp;
        }
        else
        {
            float dmg        = inDmg.Damage; //Заменить на ReceivedDamage
            float deltaHpDmg = dmg;          //урон котоырй пойдет, когда кончится броня
            float realDmg;                   //реальный урон для текущего типа(броня/хп)
            if (!inDmg.IgnoreArmor)
            {
                if (curArmor > 0f)
                {
                    realDmg       = (dmg > curArmor ? curArmor : dmg);
                    receiver     += realDmg;
                    deltaHpDmg    = dmg - realDmg;
                    armorReceiver = realDmg;
                }
            }
            if (deltaHpDmg > 0f)
            {
                realDmg    = (deltaHpDmg > curHp ? curHp : deltaHpDmg);
                hpReceiver = realDmg;
                receiver  += realDmg;
            }
        }
        outDmg             = new OutDamageInfo();
        outDmg.ReceiverDmg = receiver;
        outDmg.SetSpecificDamage(armorReceiver, hpReceiver);
    }