internal int SetDamage(DamageData damageData, bool byAttack, int actionId, ActionParameter.OnDamageHitDelegate onDamageHit, bool hasEffect, Skill skill, bool energyAdd, Action onDefeat, bool noMotion, float weight, float actionWeightSum, Func <int, float, int> p) { int randomInt = staticBattleManager.Random(); bool critical = false; if (randomInt <= damageData.CriticalRate && damageData.CriticalRate != 0) { critical = true; } if (damageData.ActionType == eActionType.ATTACK) { eDamageType damageType = damageData.DamageType; if ((damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.LOG_ATK_BARRIR)) || (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.LOG_MGC_BARRIR)) || IsAbnormalState(eAbnormalState.LOG_ALL_BARRIR)) { critical = damageData.IsLogBarrierCritical; } } int damage = SetDamageImpl(damageData, byAttack, onDamageHit, hasEffect, skill, energyAdd, critical, onDefeat, noMotion, p); //boss相关代码鸽了 if (damageData.Source != null) { if (damageData.ActionType != eActionType.DESTROY) { if (damageData.ActionType != eActionType.ATTACK_FIELD && (skill == null || skill.IsLifeStealEnabled)) { int lifesteal = damageData.LifeSteal; if (skill != null) { lifesteal += skill.LifeSteal; } if (lifesteal >= 1) { float recovery_value = lifesteal * damage / (lifesteal + UnitData.level + 100); if (recovery_value > 0) { eInhibitHealType eh = damageData.DamageType == eDamageType.MGC ? eInhibitHealType.MAGIC : eInhibitHealType.PHYSICS; SetRecovery((int)recovery_value, eh, damageData.Source, false, false, false,//鸽了 false, true, null); } } } } if (IsOther ^ damageData.Source.IsOther) { UnitCtrl source = damageData.Source; if (damageData.Source.SummonType != eSummonType.NONE) { source = source.SummonSource; } //伤害统计 if (source != null) { //source.UnitDamageinfo.Setdamage(damage + 原伤害) } } } accumulateDamage += damage; //log if (skill != null) { if (damageData.Source != null) { if (skill.SkillId == damageData.Source.UBSkillId) { if (byAttack) { damageData.Target.PassiveUbIsMagic = damageData.DamageType == eDamageType.MGC; } damageData.Target.TotalDamage += damage; } } if (damage >= 1) { if (!skill.DamageedPartsList.Contains(damageData.Target)) { skill.DamageedPartsList.Add(damageData.Target); } } } if (damageData.Source != null) { if (damage >= 1 && DamageSealDataDictionary.ContainsKey(damageData.Source)) { Dictionary <int, AttackSealData> dic = DamageSealDataDictionary[damageData.Source]; foreach (AttackSealData sealData in dic.Values) { if (!sealData.OnlyCritical || critical) { sealData.AddSeal(this); } } } if (damage >= 1 && damageData.Source.DamageOnceOwnerSealDateDictionary.ContainsKey(damageData.Source) && skill != null) { if (!skill.AlreadyAddAttackSelfSeal) { Dictionary <int, AttackSealData> dic2 = DamageOnceOwnerSealDateDictionary[damageData.Source]; foreach (AttackSealData sealData in dic2.Values) { sealData.AddSeal(damageData.Source); } skill.AlreadyAddAttackSelfSeal = true; } } } if (damageData.Source == null || damage < 1 || !damageData.Source.DamageOwnerSealDataDictionary.ContainsKey(damageData.Source)) { if (skill == null) { return(damage); } skill.TotalDamage += damage; return(damage); } foreach (AttackSealData sealData1 in damageData.Source.DamageOwnerSealDataDictionary[damageData.Source].Values) { if (sealData1.OnlyCritical) { if (critical) { sealData1.AddSeal(damageData.Source); } } else { sealData1.AddSeal(damageData.Source); } } if (skill != null) { skill.TotalDamage += damage; } return(damage); }
internal int SetDamageImpl(DamageData damageData, bool byAttack, ActionParameter.OnDamageHitDelegate onDamageHit, bool hasEffect, Skill skill, bool energyAdd, bool critical, Action onDefeat, bool noMotion, Func <int, float, int> p) { if (IdleOnly) { return(0); } if (IsDivisionSourceForDamage) { if (!damageData.IsDivisionDamage) { return(0); } } //boss if (IsAbnormalState(eAbnormalState.NO_DAMAGE_MOTION)) { return(0); } if (IsAbnormalState(eAbnormalState.CONFUSION)) { if (damageData.DamageType == eDamageType.ATK) { SetMissAtk(damageData.Source, eMissLogType.DODGE_BY_NO_DAMAGE_MOTION, eDamageEffectType.NORMAL, damageData.Target, 1); return(0); } } float damage = damageData.Damage; if (critical) { damage *= 2 * damageData.CriticalDamageRate; } eActionType actionType = damageData.ActionType; eDamageType damageType = damageData.DamageType; bool uselog = false; if (actionType == eActionType.ATTACK) { if ((damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.LOG_ATK_BARRIR)) || (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.LOG_MGC_BARRIR)) || IsAbnormalState(eAbnormalState.LOG_ALL_BARRIR)) { uselog = true; damage = damageData.LogBarrieryexpectedDamage; } } if (damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.CUT_ATK_DAMAGE)) { damage *= (1 - GetAbnormalStateMainValue(eAbnormalStateCategory.CUT_ATK_DAMAGE) / 100); } if (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.CUT_MGC_DAMAGE)) { damage *= (1 - GetAbnormalStateMainValue(eAbnormalStateCategory.CUT_MGC_DAMAGE) / 100); } if (IsAbnormalState(eAbnormalState.CUT_ALL_DAMAGE)) { damage *= (1 - GetAbnormalStateMainValue(eAbnormalStateCategory.CUT_ALL_DAMAGE) / 100); } if (uselog) { float m, s; if (damageType == eDamageType.ATK && IsAbnormalState(eAbnormalState.LOG_ATK_BARRIR)) { s = GetAbnormalStateSubValue(eAbnormalStateCategory.LOG_ATK_BARRIR); m = GetAbnormalStateMainValue(eAbnormalStateCategory.LOG_ATK_BARRIR); if (damage > s) { damage = s + m * Mathf.Log10(1 + (damage - s) / m); } } if (damageType == eDamageType.MGC && IsAbnormalState(eAbnormalState.LOG_MGC_BARRIR)) { s = GetAbnormalStateSubValue(eAbnormalStateCategory.LOG_MGC_BARRIR); m = GetAbnormalStateMainValue(eAbnormalStateCategory.LOG_MGC_BARRIR); if (damage > s) { damage = s + m * Mathf.Log10(1 + (damage - s) / m); } } if (IsAbnormalState(eAbnormalState.LOG_ALL_BARRIR)) { s = GetAbnormalStateSubValue(eAbnormalStateCategory.LOG_ALL_BARRIR); m = GetAbnormalStateMainValue(eAbnormalStateCategory.LOG_ALL_BARRIR); if (damage > s) { damage = s + m * Mathf.Log10(1 + (damage - s) / m); } } } if (hasEffect) { //显示特效 } if (!uselog && !damageData.IgnoreDef) { if (damageType == eDamageType.ATK) { float def = damageData.Target.GetDefZero(); damage *= (1.0f - Mathf.Max(0, def - damageData.DefPenetrate) / (100.0f + def)); } else if (damageType == eDamageType.MGC) { float def = damageData.Target.GetMagicDefZero(); damage *= (1.0f - Mathf.Max(0, def - damageData.DefPenetrate) / (100.0f + def)); } } damage = Mathf.Min(1000000, damage); if (actionState == eActionState.DIE) { string mes = UnitName + "受到" + damage + "过量伤害"; BattleUIManager.Instance.LogMessage(mes, eLogMessageType.GET_DAMAGE, isOther); return(0); } if (p != null) { damage = p((int)damage, 1); } if (damageData.Source != null && actionType != eActionType.FORCE_HP_CHANGE) { //反击相关 } if (skill != null) { if (actionType == eActionType.ATTACK) { damage *= skill.AweValue; } } if (energyAdd) { ChargeEnergy(eSetEnergyType.BY_SET_DAMAGE, damage * skillStackValDmg, false, this, false, false, true, false); } if (damage <= 0 && actionType == eActionType.FORCE_HP_CHANGE) { //特效 return(0); } int overRecDamage = 0; if (actionType != eActionType.FORCE_HP_CHANGE && actionType != eActionType.INHIBIT_HEAL) { ExecBarrier(damageData, ref damage, ref overRecDamage); } Hp -= damage - overRecDamage; if (Hp >= 1 && onDamageHit != null) { onDamageHit(damage); } //设置HP条 unitUI.SetHP(Hp / BaseValues.Hp); Ondamage?.Invoke(byAttack, damage, critical); if (!HasUnDeadTime) { if (!noMotion) { bool k = false; if (skill != null) { k = skill.PauseStopState; } PlayDamageWhenIdle(true, k); } if (Hp <= 0 && !isDead && actionState <= eActionState.DAMAGE) { SetState(eActionState.DIE, 0); } } return((int)damage); }