//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); }
void SetIncomeDamage(ref IncomeDamageInfo income) { if (!Lived) { return; } OutDamageInfo outInfo; GetOutDamageInfo(ref income, out outInfo); dmgArgs.Output = outInfo; dmgArgs.Income = income; SetOutputDamage(ref outInfo); }
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); }
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); }
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); }