public static BattleCalculator.DamageResult CalculateDamage(BattleBaseAttrs caster, BattleBaseAttrs target, bool isCasterPlayer, bool isTargetPlayer, XDict <GameData.AttrType, long> casterTempAttrs, XDict <GameData.AttrType, long> targetTempAttrs) { FileStream fileStream = null; StreamWriter streamWriter = null; StringBuilder stringBuilder = null; if (ClientApp.Instance.isShowFightLog) { string text = Application.get_dataPath() + "/../BattleLog.txt"; try { fileStream = new FileStream(text, 4, 3); streamWriter = new StreamWriter(fileStream, Encoding.get_UTF8()); stringBuilder = new StringBuilder(); } catch (Exception ex) { Debug.LogError("Can't Write Log File!\n" + ex.get_Message()); return(null); } stringBuilder.Append("Caster: \n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.Atk, caster.Atk) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.Defence, caster.Defence) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PveAtk, caster.PveAtk) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PvpAtk, caster.PvpAtk) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.HitRatio, caster.HitRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.CritRatio, caster.CritRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.CritHurtAddRatio, caster.CritHurtAddRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.DeparryRatio, caster.DeparryRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.SuckBloodScale, caster.SuckBloodScale) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.HurtAddRatio, caster.HurtAddRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PveHurtAddRatio, caster.PveHurtAddRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PvpHurtAddRatio, caster.PvpHurtAddRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.AtkMulAmend, caster.AtkMulAmend) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PveAtkMulAmend, caster.PveAtkMulAmend) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PvpAtkMulAmend, caster.PvpAtkMulAmend) + "\n"); stringBuilder.Append("Target: \n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.Defence, target.Defence) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.HpLmt, target.HpLmt) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.DodgeRatio, target.DodgeRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.DecritRatio, target.DecritRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.ParryRatio, target.ParryRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.ParryHurtDeRatio, target.ParryHurtDeRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.HurtDeRatio, target.ParryHurtDeRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PveHurtDeRatio, target.PveHurtDeRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.PvpHurtDeRatio, target.PvpHurtDeRatio) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.DefMulAmend, target.DefMulAmend) + "\n"); stringBuilder.Append(AttrUtility.GetStandardDesc(GameData.AttrType.HpLmtMulAmend, target.HpLmtMulAmend) + "\n"); stringBuilder.Append("Calculate: \n"); } BattleCalculator.DamageResult damageResult = new BattleCalculator.DamageResult(); if (BattleCalculator.CheckHit(caster, target, stringBuilder)) { if (ClientApp.Instance.isShowFightLog) { stringBuilder.Append("IsHit: " + true + "\n"); } bool flag = BattleCalculator.CheckParry(caster, target, out damageResult.parryRandomIndex, stringBuilder); double finalParryAddRatio = BattleCalculator.GetFinalParryAddRatio(target, flag); if (ClientApp.Instance.isShowFightLog) { stringBuilder.Append("IsParry: " + flag + "\n"); } bool flag2 = BattleCalculator.CheckCrit(caster, target, out damageResult.critRandomIndex, stringBuilder); double finalCritAddRatio = BattleCalculator.GetFinalCritAddRatio(caster, flag2); if (ClientApp.Instance.isShowFightLog) { stringBuilder.Append("IsCrit: " + flag2 + "\n"); } double tempDamage = BattleCalculator.GetTempDamage(caster, target, isTargetPlayer); double holyDamage = BattleCalculator.GetHolyDamage(caster, target, casterTempAttrs); double ignoreTargetDamage = BattleCalculator.GetIgnoreTargetDamage(caster, isTargetPlayer, casterTempAttrs); double num = (double)BattleCalculator.GetCritAddDamage(caster, flag2); List <double> list = new List <double>(); list.Add(tempDamage * (double)caster.TryAddValue(GameData.AttrType.SkillNmlDmgScale, casterTempAttrs) * 0.001 + (double)caster.TryAddValue(GameData.AttrType.SkillNmlDmgAddAmend, casterTempAttrs)); list.Add(finalCritAddRatio); list.Add(finalParryAddRatio); list.Add((!isCasterPlayer || !isTargetPlayer) ? Math.Max(0.0, (1000.0 + (double)caster.PveHurtAddRatio - (double)target.PveHurtDeRatio) * 0.001) : Math.Max(0.0, (1000.0 + (double)caster.PvpHurtAddRatio - (double)target.PvpHurtDeRatio) * 0.001)); list.Add(Math.Max(0.0, (double)(1000 + caster.HurtAddRatio - target.HurtDeRatio) * 0.001)); double num2 = BattleCalculator.GetMultipleResult(list) + holyDamage + ignoreTargetDamage + num; double num3 = Math.Max(1.0, num2 * (double)BattleCalculator.serverRandom.Next(9500, 10500, out damageResult.damageRandomIndex) * 9.9999997473787516E-05); double num4 = BattleCalculator.CalculateLifeSteal(caster, (int)num3); damageResult.IsMiss = false; damageResult.IsCrit = flag2; damageResult.IsParry = flag; damageResult.Damage = (long)num3; damageResult.Lifesteal = (long)num4; if (ClientApp.Instance.isShowFightLog) { stringBuilder.Append("TempDamage: " + tempDamage + "\n"); stringBuilder.Append("HolyDamage: " + holyDamage + "\n"); stringBuilder.Append("SkillNmlDmgScale: " + caster.TryAddValue(GameData.AttrType.SkillNmlDmgScale, casterTempAttrs) + "\n"); stringBuilder.Append("SkillNmlDmgAddAmend: " + caster.TryAddValue(GameData.AttrType.SkillNmlDmgAddAmend, casterTempAttrs) + "\n"); stringBuilder.Append("FixFinalDamage: " + num3 + "\n"); stringBuilder.Append("Lifesteal: " + num4 + "\n"); } } else { damageResult.parryRandomIndex = 0; damageResult.critRandomIndex = 0; damageResult.damageRandomIndex = 0; damageResult.IsMiss = true; damageResult.IsParry = false; damageResult.IsCrit = false; damageResult.Damage = 0L; damageResult.Lifesteal = 0L; if (ClientApp.Instance.isShowFightLog) { stringBuilder.Append("IsHit: " + false + "\n"); } } if (ClientApp.Instance.isShowFightLog) { stringBuilder.Append("================================================================\n\n"); Debug.LogError(stringBuilder.ToString()); streamWriter.Write(stringBuilder.ToString()); streamWriter.Close(); fileStream.Close(); } return(damageResult); }
protected static void AppDamage(Buff buffData, EntityParent caster, EntityParent target, int fromSkillID, int fromSkillLevel, XDict <GameData.AttrType, BattleSkillAttrAdd> fromSkillAttrChange, bool isCommunicateMix) { if (!LocalAgent.GetEntityCalculatable(caster, isCommunicateMix)) { return; } if (!LocalAgent.GetEntityCalculatable(target, isCommunicateMix)) { return; } if (target.IsUnconspicuous && buffData.forceHandle == 0) { return; } if (target.IsIgnoreFormula) { return; } XDict <GameData.AttrType, long> buffCasterTempAttr = LocalBattleBuffCalculatorHandler.GetBuffCasterTempAttr(buffData, caster, fromSkillLevel, fromSkillAttrChange); XDict <GameData.AttrType, long> buffTargetTempAttr = LocalBattleBuffCalculatorHandler.GetBuffTargetTempAttr(buffData, caster, fromSkillLevel, fromSkillAttrChange); BattleCalculator.DamageResult damageResult = BattleCalculator.CalculateDamage(caster.BattleBaseAttrs, target.BattleBaseAttrs, caster.IsEntitySelfType || caster.IsEntityPlayerType || caster.IsEntityPetType, target.IsEntitySelfType || target.IsEntityPlayerType, buffCasterTempAttr, buffTargetTempAttr); List <ClientDrvBuffInfo> casterBuffInfo = null; List <ClientDrvBuffInfo> targetBuffInfo = null; if (isCommunicateMix) { casterBuffInfo = LocalAgent.MakeClientDrvBuffInfo(caster.ID); targetBuffInfo = LocalAgent.MakeClientDrvBuffInfo(target.ID); } if (damageResult.Lifesteal > 0L && !damageResult.IsMiss && LocalAgent.GetEntityIsCurable(caster, isCommunicateMix)) { long num = LocalAgent.GetSpiritCurHp(caster, isCommunicateMix) + damageResult.Lifesteal; if (num > caster.RealHpLmt) { num = caster.RealHpLmt; } Pos pos = null; if (caster.Actor) { pos = new Pos(); pos.x = caster.Actor.FixTransform.get_position().x * 100f; pos.y = caster.Actor.FixTransform.get_position().z * 100f; } LocalAgent.SetSpiritCurHp(caster, num, isCommunicateMix); LocalBattleProtocolSimulator.SendTreat(caster.ID, (GameObjectType.ENUM)caster.WrapType, caster.ID, (GameObjectType.ENUM)caster.WrapType, BattleAction_Treat.TreatSrcType.SuckBlood, damageResult.Lifesteal, num, pos); } long num2 = LocalAgent.GetSpiritCurHp(target, isCommunicateMix) - damageResult.Damage; if (damageResult.IsMiss) { CauseMissAnnouncer.Announce(caster, target); UnderMissAnnouncer.Announce(target, caster); } else if (num2 <= 0L) { num2 = 0L; LocalBattleHitHandler.AppDead(target.ID); GlobalBattleNetwork.Instance.SendClientDrvBattleDeathNty(target.ID); } else { if (damageResult.IsCrit) { CauseCritAnnouncer.Announce(caster, target); UnderCritAnnouncer.Announce(target, caster); } if (damageResult.IsParry) { CauseParryAnnouncer.Announce(caster, target); UnderParryAnnouncer.Announce(target, caster); } LocalBattleHitHandler.AppWeakCalculate(caster, target, buffCasterTempAttr); } LocalAgent.SetSpiritCurHp(target, num2, isCommunicateMix); List <long> list = new List <long>(); if (isCommunicateMix && !damageResult.IsMiss) { list.Add((long)damageResult.parryRandomIndex); list.Add((long)damageResult.critRandomIndex); list.Add((long)damageResult.damageRandomIndex); GlobalBattleNetwork.Instance.SendClientDriveBattleBuffDamage(caster.ID, target.ID, caster.Hp, num2, damageResult.Damage, buffData.id, true, casterBuffInfo, targetBuffInfo, list, string.Concat(new object[] { caster.TryAddValue(GameData.AttrType.SkillNmlDmgScale, buffCasterTempAttr), "_", caster.TryAddValue(GameData.AttrType.SkillNmlDmgAddAmend, buffCasterTempAttr), "_", target.DefMulAmend, "_", caster.TryAddValue(GameData.AttrType.SkillIgnoreDefenceHurt, buffCasterTempAttr) })); } if (list.get_Count() == 3) { } LocalBattleProtocolSimulator.SendBleed(target.ID, (GameObjectType.ENUM)target.WrapType, caster.ID, (GameObjectType.ENUM)caster.WrapType, BattleAction_Bleed.DmgSrcType.Attack, ElemType.ENUM.Normal, damageResult.Damage, num2, damageResult.IsCrit, damageResult.IsParry, damageResult.IsMiss); }
public static void AppDamage(Effect effectData, EntityParent caster, List <long> effectTargetIDs, XPoint basePoint, int skillID, bool isAddEffect, bool isCommunicateMix) { if (!LocalAgent.GetEntityCalculatable(caster, isCommunicateMix)) { return; } XDict <GameData.AttrType, long> effectCasterTempAttr = LocalBattleEffectCalculatorHandler.GetEffectCasterTempAttr(effectData, caster, skillID); bool flag = isAddEffect && isCommunicateMix; for (int i = 0; i < effectTargetIDs.get_Count(); i++) { if (LocalAgent.GetEntityCalculatable(caster, isCommunicateMix)) { EntityParent entityByID = LocalAgent.GetEntityByID(effectTargetIDs.get_Item(i)); if (LocalAgent.GetEntityCalculatable(entityByID, isCommunicateMix)) { if (!entityByID.IsUnconspicuous || effectData.forcePickup != 0) { if (!entityByID.IsIgnoreFormula) { CauseDamageEffectAnnouncer.Announce(caster, entityByID, effectData.id); UnderDamageEffectAnnouncer.Announce(entityByID, caster, effectData.id); BattleCalculator.DamageResult damageResult = BattleCalculator.CalculateDamage(caster.BattleBaseAttrs, entityByID.BattleBaseAttrs, caster.IsEntitySelfType || caster.IsEntityPlayerType || caster.IsEntityPetType, entityByID.IsEntitySelfType || entityByID.IsEntityPlayerType, effectCasterTempAttr, null); List <ClientDrvBuffInfo> casterBuffInfo = null; List <ClientDrvBuffInfo> targetBuffInfo = null; if (isCommunicateMix) { casterBuffInfo = LocalAgent.MakeClientDrvBuffInfo(caster.ID); targetBuffInfo = LocalAgent.MakeClientDrvBuffInfo(effectTargetIDs.get_Item(i)); } if (damageResult.Lifesteal > 0L && !damageResult.IsMiss && LocalAgent.GetEntityIsCurable(caster, isCommunicateMix)) { long num = LocalAgent.GetSpiritCurHp(caster, isCommunicateMix) + damageResult.Lifesteal; if (num > caster.RealHpLmt) { num = caster.RealHpLmt; } Pos pos = null; if (caster.Actor) { pos = new Pos(); pos.x = caster.Actor.FixTransform.get_position().x * 100f; pos.y = caster.Actor.FixTransform.get_position().z * 100f; } LocalAgent.SetSpiritCurHp(caster, num, isCommunicateMix); LocalBattleProtocolSimulator.SendTreat(caster.ID, (GameObjectType.ENUM)caster.WrapType, caster.ID, (GameObjectType.ENUM)caster.WrapType, BattleAction_Treat.TreatSrcType.SuckBlood, damageResult.Lifesteal, num, pos); } long num2 = LocalAgent.GetSpiritCurHp(entityByID, isCommunicateMix) - damageResult.Damage; if (damageResult.IsMiss) { CauseMissAnnouncer.Announce(caster, entityByID); UnderMissAnnouncer.Announce(entityByID, caster); } else if (num2 <= 0L) { num2 = 0L; LocalBattleHitHandler.AppDead(effectTargetIDs.get_Item(i)); GlobalBattleNetwork.Instance.SendClientDrvBattleDeathNty(effectTargetIDs.get_Item(i)); } else { if (damageResult.IsCrit) { CauseCritAnnouncer.Announce(caster, entityByID); UnderCritAnnouncer.Announce(entityByID, caster); } if (damageResult.IsParry) { CauseParryAnnouncer.Announce(caster, entityByID); UnderParryAnnouncer.Announce(entityByID, caster); LocalBattleHitHandler.AppParryFx(entityByID); } else { LocalBattleHitHandler.AppHit(effectData, caster, entityByID, basePoint, isAddEffect); } LocalBattleHitHandler.AppHitAudio(effectData, entityByID); LocalBattleHitHandler.AppWeakCalculate(caster, entityByID, effectCasterTempAttr); } LocalAgent.SetSpiritCurHp(entityByID, num2, isCommunicateMix); List <long> list = new List <long>(); if (isCommunicateMix && !damageResult.IsMiss) { list.Add((long)damageResult.parryRandomIndex); list.Add((long)damageResult.critRandomIndex); list.Add((long)damageResult.damageRandomIndex); GlobalBattleNetwork.Instance.SendClientDriveBattleEffectDamage(caster.ID, effectTargetIDs.get_Item(i), caster.Hp, num2, damageResult.Damage, skillID, effectData.id, flag, true, casterBuffInfo, targetBuffInfo, basePoint, list, string.Concat(new object[] { caster.TryAddValue(GameData.AttrType.SkillNmlDmgScale, effectCasterTempAttr), "_", caster.TryAddValue(GameData.AttrType.SkillNmlDmgAddAmend, effectCasterTempAttr), "_", entityByID.DefMulAmend, "_", caster.TryAddValue(GameData.AttrType.SkillIgnoreDefenceHurt, effectCasterTempAttr) }), false); } if (list.get_Count() == 3) { } LocalBattleProtocolSimulator.SendBleed(effectTargetIDs.get_Item(i), (GameObjectType.ENUM)entityByID.WrapType, caster.ID, (GameObjectType.ENUM)caster.WrapType, BattleAction_Bleed.DmgSrcType.Attack, ElemType.ENUM.Normal, damageResult.Damage, num2, damageResult.IsCrit, damageResult.IsParry, damageResult.IsMiss); if (flag) { flag = false; } } } } } } }