diff --git a/server/gameserver/netdata.cc b/server/gameserver/netdata.cc index 05134e20..fe66aaef 100644 --- a/server/gameserver/netdata.cc +++ b/server/gameserver/netdata.cc @@ -842,7 +842,37 @@ float BattleDataContext::CalcReceiveDmg(Creature* sender, float normal_dmg) float BattleDataContext::CalcSkillReceiveDmg(Creature* sender, float normal_dmg) { + g_calc_dmg_context = {0}; + g_calc_dmg_context.is_crit = 0; + float vEbc = 1.0f; + float vEd = 1 - GetDef(); + float X = (1 + sender->GetNetData()->GetHeroAbility()->GetCrit()) * (1 - GetBlock()) - 1; + if (X > 0.00001f) { + //触发暴击 + float vCritBon = sender->GetNetData()->GetHeroAbility()->hero_meta->GetBasicMeta()->vOrigCriBon(); + float E = ProEffect(X, vCritBon); //E >= 0 + if (E > 0.00001f) { + vEbc = 1 + E; + } + } else { + //触发格挡 0,-1 + float vBlock = GetHeroAbility()->hero_meta->GetBasicMeta()->vOrigBloDef(); + float E = ProEffect(X, -vBlock); //E >= 0 + if (E < 0.00001f) { + vEbc = 1 + E; + } + } + float BDM = 100; + + float vSkillDamageDealtRateIn = 0.0f; + float vSkillDamageTakenRateIn = 0.0f; + float vDmg = normal_dmg * (1 + vSkillDamageDealtRateIn) * (1 + vSkillDamageTakenRateIn); + + float DDR = 0.0f; + float DTR = 0.0f; + float finaly_dmg = vDmg * vEbc * vEd * (1 + DDR) * (1 + DTR); + return std::max(1.0f, std::round(finaly_dmg)); } float BattleDataContext::CalcDmg(Explosion* e)