private List <JsonDeathRecap> BuilDeathRecap(Player player) { List <JsonDeathRecap> res = new List <JsonDeathRecap>(); long start = _log.FightData.FightStart; long end = _log.FightData.FightEnd; List <CombatItem> dead = _log.CombatData.GetStates(player.InstID, ParseEnum.StateChange.ChangeDead, start, end); List <CombatItem> down = _log.CombatData.GetStates(player.InstID, ParseEnum.StateChange.ChangeDown, start, end); long lastTime = start; List <DamageLog> damageLogs = player.GetDamageTakenLogs(_log, 0, _log.FightData.FightDuration); foreach (CombatItem c in dead) { JsonDeathRecap recap = new JsonDeathRecap() { Time = (int)(c.Time - start) }; CombatItem downed = down.LastOrDefault(x => x.Time <= c.Time && x.Time >= lastTime); if (downed != null) { List <DamageLog> damageToDown = damageLogs.Where(x => x.Time < downed.Time - start && x.Damage > 0 && x.Time > lastTime - start).ToList(); recap.ToDown = damageToDown.Count > 0 ? new List <JsonDeathRecap.DamageItem>() : null; int damage = 0; for (int i = damageToDown.Count - 1; i > 0; i--) { DamageLog dl = damageToDown[i]; AgentItem ag = _log.AgentData.GetAgentByInstID(dl.SrcInstId, dl.Time + start); JsonDeathRecap.DamageItem item = new JsonDeathRecap.DamageItem() { Time = (int)dl.Time, Condi = dl.IsCondi, Skill = dl.SkillId, Damage = dl.Damage, Src = ag != null?ag.Name.Replace("\u0000", "").Split(':')[0] : "" }; damage += dl.Damage; recap.ToDown.Add(item); if (damage > 20000) { break; } } List <DamageLog> damageToKill = damageLogs.Where(x => x.Time > downed.Time - start && x.Time < c.Time - start && x.Damage > 0 && x.Time > lastTime - start).ToList(); recap.ToKill = damageToKill.Count > 0 ? new List <JsonDeathRecap.DamageItem>() : null; for (int i = damageToKill.Count - 1; i > 0; i--) { DamageLog dl = damageToKill[i]; AgentItem ag = _log.AgentData.GetAgentByInstID(dl.SrcInstId, dl.Time + start); JsonDeathRecap.DamageItem item = new JsonDeathRecap.DamageItem() { Time = (int)dl.Time, Condi = dl.IsCondi, Skill = dl.SkillId, Damage = dl.Damage, Src = ag != null?ag.Name.Replace("\u0000", "").Split(':')[0] : "" }; recap.ToKill.Add(item); } } else { recap.ToDown = null; List <DamageLog> damageToKill = damageLogs.Where(x => x.Time < c.Time - start && x.Damage > 0 && x.Time > lastTime - start).ToList(); recap.ToKill = damageToKill.Count > 0 ? new List <JsonDeathRecap.DamageItem>() : null; int damage = 0; for (int i = damageToKill.Count - 1; i > 0; i--) { DamageLog dl = damageToKill[i]; AgentItem ag = _log.AgentData.GetAgentByInstID(dl.SrcInstId, dl.Time + start); JsonDeathRecap.DamageItem item = new JsonDeathRecap.DamageItem() { Time = (int)dl.Time, Condi = dl.IsCondi, Skill = dl.SkillId, Damage = dl.Damage, Src = ag != null?ag.Name.Replace("\u0000", "").Split(':')[0] : "" }; damage += dl.Damage; recap.ToKill.Add(item); if (damage > 20000) { break; } } } lastTime = c.Time; res.Add(recap); } return(res.Count > 0 ? res : null); }