void SetOutputDamage(ref OutDamageInfo dmg) { OnPreTakenDamage(ref dmg); bool isCallEvent = false; var prev = m_Armor; bool res = AddTo(ref m_Armor, -dmg.DmgToArmor); isCallEvent = res; if (res) { ArmorEventStack(prev); } prev = m_Health; res = AddTo(ref m_Health, -dmg.DmgToHealth); if (res) { InnerBeforeChangeHealth(); HealthEventCall(prev); } isCallEvent = isCallEvent || res; if (isCallEvent) { CallChangeEvent(); } OnAfterTakenDamage(ref dmg); OnCheckedDeathOrResurrect(); }
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); }
void OnAfterTakenDamage(ref OutDamageInfo outInfo) { AfterTakenDamage(this, dmgArgs); //UnitStaticEvents.GlobalTakenDamage(this, dmgArgs);//Костыль }