private static SkillLogEntry FindPrevLogEntry(SkillLogEntry fromEntry, SkillLogType logType = 6) { if (fromEntry == null) { return(null); } SkillLog log = fromEntry.get_Log(); if (log == null || log.get_Entries() == null) { return(null); } SkillLogEntry result = null; using (List <SkillLogEntry> .Enumerator enumerator = log.get_Entries().GetEnumerator()) { while (enumerator.MoveNext()) { SkillLogEntry current = enumerator.get_Current(); if (current == fromEntry) { break; } if (current.get_LogType() == logType) { result = current; } } } return(result); }
public TrackLine(int startFrame, int frameLength) { SkillLog.Assert(startFrame >= 0 && frameLength >= 0, "序列中的通道帧数据不合格,起始帧数:[{0}],长度:[{1}]", startFrame, frameLength); _sFrame = startFrame; _frameLength = frameLength; _eFrame = _sFrame + _frameLength; }
public void RaiseEvent(E_EntityInTrigger key, EventSetData objInfo) { SkillLog.Assert(_context != null && _context._owner != null, "SequenceLeafNode RaiseEvent:[{0}] Fail", key); if (_context == null || _context._owner == null) { return; } _context._owner.RaiseEvent(key, objInfo); EventDataFactory.Push(objInfo); }
private void DoTimelineBar(Skill fsm, Rect area) { if (!Application.get_isPlaying()) { return; } if (fsm == null) { return; } SkillLog myLog = fsm.get_MyLog(); if (myLog == null || myLog.get_Entries() == null) { return; } GUI.BeginGroup(area); float startTime = 0f; SkillState fsmState = null; for (int i = 0; i < myLog.get_Entries().get_Count(); i++) { SkillLogEntry fsmLogEntry = myLog.get_Entries().get_Item(i); if (fsmLogEntry.get_LogType() == 5) { if (fsmLogEntry.get_Time() > this.timelineControl.VisibleRangeStart) { this.DrawTimelineBar(startTime, fsmLogEntry.get_Time(), fsmState); } fsmState = null; } if (fsmLogEntry.get_LogType() == 6) { if (fsmLogEntry.get_Time() > this.timelineControl.VisibleRangeEnd) { GUI.EndGroup(); return; } fsmState = fsmLogEntry.get_State(); startTime = fsmLogEntry.get_Time(); } SkillLogType arg_AE_0 = fsmLogEntry.get_LogType(); SkillLogType arg_B8_0 = fsmLogEntry.get_LogType(); } if (fsmState != null) { this.DrawTimelineBar(startTime, SkillTime.get_RealtimeSinceStartup(), fsmState); } GUI.EndGroup(); }
private static void DoDebugMenu() { GenericMenu genericMenu = new GenericMenu(); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Enable_Breakpoints()), FsmEditorSettings.BreakpointsEnabled, new GenericMenu.MenuFunction(DebugToolbar.ToggleEnableBreakpoints)); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Clear_Breakpoints()), false, new GenericMenu.MenuFunction(EditorCommands.ClearBreakpoints)); genericMenu.AddSeparator(""); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Show_State_Labels_in_Game_View()), FsmEditorSettings.ShowStateLabelsInGameView, new GenericMenu.MenuFunction(DebugToolbar.ToggleShowStateLabels)); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Show_State_Loop_Counts()), FsmEditorSettings.ShowStateLoopCounts, new GenericMenu.MenuFunction(DebugToolbar.ToggleShowStateLoopCounts)); genericMenu.AddSeparator(""); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Step_Single_Frame()), FsmDebugger.Instance.StepMode == FsmDebugger.FsmStepMode.StepFrame, new GenericMenu.MenuFunction(DebugToolbar.SetDebuggerStepFrame)); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Step_To_Next_State_Change_in_this_FSM()), FsmDebugger.Instance.StepMode == FsmDebugger.FsmStepMode.StepToStateChange, new GenericMenu.MenuFunction(DebugToolbar.SetDebuggerStepToStateChange)); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Step_To_Next_State_Change_in_any_FSM()), FsmDebugger.Instance.StepMode == FsmDebugger.FsmStepMode.StepToAnyStateChange, new GenericMenu.MenuFunction(DebugToolbar.SetDebuggerStepToAnyStateChange)); genericMenu.AddSeparator(""); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Open_Log_Window()), false, new GenericMenu.MenuFunction(SkillEditor.OpenFsmLogWindow)); genericMenu.AddItem(new GUIContent(Strings.get_Menu_Enable_Logging()), SkillLog.get_LoggingEnabled(), new GenericMenu.MenuFunction(EditorCommands.ToggleLogging)); genericMenu.ShowAsContext(); }
public static SequenceLeafNode CreateLeftNode(EdNode node) { Type type = Type.GetType("Summer.Sequence." + node.Name); SkillLog.Assert(type != null, "SkillFactory CreateLeftNode 找不到对应的技能节点类型:[{0}]", node.Name); if (type == null) { return(null); } SequenceLeafNode leaf = Activator.CreateInstance(type) as SequenceLeafNode; SkillLog.Assert(leaf != null, "SkillFactory CreateLeftNode 实例化失败:[{0}]", node.Name); if (leaf != null) { leaf.SetConfigInfo(node); } return(leaf); }
private static SkillLogEntry FindClosestLogEntry(SkillLog fsmLog, float time) { SkillLogEntry result = null; using (List <SkillLogEntry> .Enumerator enumerator = fsmLog.get_Entries().GetEnumerator()) { while (enumerator.MoveNext()) { SkillLogEntry current = enumerator.get_Current(); if (current.get_Time() > time) { break; } if (current.get_LogType() == 6) { result = current; } } } return(result); }
private static SkillLogEntry FindMostRecentLogEntry(SkillLog fsmLog, int fromFrame) { if (fsmLog == null || fsmLog.get_Entries() == null) { return(null); } SkillLogEntry result = null; using (List <SkillLogEntry> .Enumerator enumerator = fsmLog.get_Entries().GetEnumerator()) { while (enumerator.MoveNext()) { SkillLogEntry current = enumerator.get_Current(); if (current.get_LogType() == 6 || current.get_LogType() == 8 || current.get_LogType() == 7) { result = current; } } } return(result); }
private static SkillLogEntry FindNextLogEntry(SkillLogEntry fromEntry, params SkillLogType[] logTypes) { SkillLog log = fromEntry.get_Log(); if (log == null) { return(null); } int num = DebugFlow.SelectedLog.get_Entries().IndexOf(fromEntry); for (int i = num + 1; i < log.get_Entries().get_Count(); i++) { SkillLogEntry fsmLogEntry = log.get_Entries().get_Item(i); for (int j = 0; j < logTypes.Length; j++) { SkillLogType fsmLogType = logTypes[j]; if (fsmLogEntry.get_LogType() == fsmLogType) { return(fsmLogEntry); } } } return(null); }
public virtual void OnExit() { SkillLog.Log("Sequence:[{0}] Exit", Id); _runing = E_Runing.none; InitInfo(); }
private static ExtendedStats GenerateStats(NpcEntity entity, AbnormalityStorage abnormals) { if (!entity.Info.Boss) { return(null); } var timedEncounter = false; /* * modify timedEncounter depending on teradps.io need * */ var entityInfo = Database.Database.Instance.GlobalInformationEntity(entity, timedEncounter); var skills = Database.Database.Instance.GetSkills(entityInfo.BeginTime, entityInfo.EndTime); var playersInfo = timedEncounter ? Database.Database.Instance.PlayerDamageInformation(entityInfo.BeginTime, entityInfo.EndTime) : Database.Database.Instance.PlayerDamageInformation(entity); var heals = Database.Database.Instance.PlayerHealInformation(entityInfo.BeginTime, entityInfo.EndTime); playersInfo.RemoveAll(x => x.Amount == 0); var firstTick = entityInfo.BeginTime; var lastTick = entityInfo.EndTime; var interTick = lastTick - firstTick; var interval = interTick / TimeSpan.TicksPerSecond; if (interval == 0) { return(null); } var totaldamage = entityInfo.TotalDamage; var partyDps = TimeSpan.TicksPerSecond * totaldamage / interTick; var teradpsData = new EncounterBase(); var extendedStats = new ExtendedStats(); var _abnormals = abnormals.Clone(entity, firstTick, lastTick); extendedStats.Entity = entity; extendedStats.BaseStats = teradpsData; extendedStats.FirstTick = firstTick; extendedStats.LastTick = lastTick; teradpsData.areaId = entity.Info.HuntingZoneId + ""; teradpsData.bossId = entity.Info.TemplateId + ""; teradpsData.fightDuration = interval + ""; teradpsData.partyDps = partyDps + ""; extendedStats.Debuffs = _abnormals.Get(entity); foreach (var debuff in extendedStats.Debuffs) { var percentage = debuff.Value.Duration(firstTick, lastTick) * 100 / interTick; if (percentage == 0) { continue; } teradpsData.debuffUptime.Add(new KeyValuePair <string, string>( debuff.Key.Id + "", percentage + "" )); } foreach (var user in playersInfo) { var teradpsUser = new Members(); var damage = user.Amount; teradpsUser.playerTotalDamage = damage + ""; if (damage <= 0) { continue; } var buffs = _abnormals.Get(user.Source); teradpsUser.playerClass = user.Source.Class.ToString(); teradpsUser.playerName = user.Source.Name; teradpsUser.playerServer = BasicTeraData.Instance.Servers.GetServerName(user.Source.ServerId); teradpsUser.playerAverageCritRate = Math.Round(user.CritRate, 1) + ""; teradpsUser.healCrit = user.Source.IsHealer ? heals.FirstOrDefault(x => x.Source == user.Source)?.CritRate + "" : null; teradpsUser.playerDps = TimeSpan.TicksPerSecond * damage / interTick + ""; teradpsUser.playerTotalDamagePercentage = user.Amount * 100 / entityInfo.TotalDamage + ""; extendedStats.PlayerReceived.Add(user.Source.Name, Tuple.Create(skills.HitsReceived(user.Source.User.Id, entity, timedEncounter), skills.DamageReceived(user.Source.User.Id, entity, timedEncounter))); var death = buffs.Death; teradpsUser.playerDeaths = death.Count(firstTick, lastTick) + ""; teradpsUser.playerDeathDuration = death.Duration(firstTick, lastTick) / TimeSpan.TicksPerSecond + ""; var aggro = buffs.Aggro(entity); teradpsUser.aggro = 100 * aggro.Duration(firstTick, lastTick) / interTick + ""; foreach (var buff in buffs.Times) { var percentage = buff.Value.Duration(firstTick, lastTick) * 100 / interTick; if (percentage == 0) { continue; } teradpsUser.buffUptime.Add(new KeyValuePair <string, string>( buff.Key.Id + "", percentage + "" )); } var serverPlayerName = $"{teradpsUser.playerServer}_{teradpsUser.playerName}"; extendedStats.PlayerSkills.Add(serverPlayerName, skills.GetSkillsDealt(user.Source.User.Id, entity, timedEncounter)); extendedStats.PlayerBuffs.Add(serverPlayerName, buffs); var skillsId = SkillAggregate.GetAggregate(user, entityInfo.Entity, skills, timedEncounter, Database.Database.Type.Damage); extendedStats.PlayerSkillsAggregated[teradpsUser.playerServer + "/" + teradpsUser.playerName] = skillsId; foreach (var skill in skillsId) { var skillLog = new SkillLog(); var skilldamage = skill.Amount(); skillLog.skillAverageCrit = Math.Round(skill.AvgCrit()) + ""; skillLog.skillAverageWhite = Math.Round(skill.AvgWhite()) + ""; skillLog.skillCritRate = skill.CritRate() + ""; skillLog.skillDamagePercent = skill.DamagePercent() + ""; skillLog.skillHighestCrit = skill.BiggestCrit() + ""; skillLog.skillHits = skill.Hits() + ""; skillLog.skillId = skill.Skills.First().Key.Id + ""; skillLog.skillLowestCrit = skill.LowestCrit() + ""; skillLog.skillTotalDamage = skilldamage + ""; if (skilldamage == 0) { continue; } teradpsUser.skillLog.Add(skillLog); } teradpsData.members.Add(teradpsUser); } return(extendedStats); }
public void LogSkillUsage(SkillResult result) { SkillLog.Add(result); }
private static ExtendedStats GenerateStats(NpcEntity entity, AbnormalityStorage abnormals) { if (!entity.Info.Boss) { return(null); } var timedEncounter = false; /* * modify timedEncounter depending on teradps.io need * */ var entityInfo = Database.Database.Instance.GlobalInformationEntity(entity, timedEncounter); var skills = Database.Database.Instance.GetSkills(entityInfo.BeginTime, entityInfo.EndTime); var playersInfo = timedEncounter ? Database.Database.Instance.PlayerDamageInformation(entityInfo.BeginTime, entityInfo.EndTime) : Database.Database.Instance.PlayerDamageInformation(entity); var heals = Database.Database.Instance.PlayerHealInformation(entityInfo.BeginTime, entityInfo.EndTime); playersInfo.RemoveAll(x => x.Amount == 0); var firstTick = entityInfo.BeginTime; var lastTick = entityInfo.EndTime; var interTick = lastTick - firstTick; var interval = interTick / TimeSpan.TicksPerSecond; if (interval == 0) { return(null); } var totaldamage = entityInfo.TotalDamage; var partyDps = TimeSpan.TicksPerSecond * totaldamage / interTick; var teradpsData = new EncounterBase(); var extendedStats = new ExtendedStats(); var _abnormals = abnormals.Clone(entity, firstTick, lastTick); teradpsData.encounterUnixEpoch = new DateTimeOffset(new DateTime(lastTick, DateTimeKind.Utc)).ToUnixTimeSeconds(); extendedStats.Entity = entity; extendedStats.BaseStats = teradpsData; extendedStats.FirstTick = firstTick; extendedStats.LastTick = lastTick; teradpsData.areaId = entity.Info.HuntingZoneId + ""; teradpsData.bossId = entity.Info.TemplateId + ""; teradpsData.fightDuration = interval + ""; teradpsData.partyDps = partyDps + ""; extendedStats.Debuffs = _abnormals.Get(entity); foreach (var debuff in extendedStats.Debuffs.OrderByDescending(x => x.Value.Duration(firstTick, lastTick))) { var percentage = debuff.Value.Duration(firstTick, lastTick) * 100 / interTick; if (percentage == 0) { continue; } teradpsData.debuffUptime.Add(new KeyValuePair <string, string>( debuff.Key.Id + "", percentage + "" )); var stacks = new List <List <int> > { new List <int> { 0, (int)percentage } }; var stackList = debuff.Value.Stacks(firstTick, lastTick).OrderBy(x => x); teradpsData.debuffDetail.Add(new List <object> { debuff.Key.Id, stacks }); if (stackList.Any() && stackList.Max() == 1) { continue; } foreach (var stack in stackList) { percentage = debuff.Value.Duration(firstTick, lastTick, stack) * 100 / interTick; if (percentage == 0) { continue; } stacks.Add(new List <int> { stack, (int)percentage }); } } foreach (var user in playersInfo.OrderByDescending(x => x.Amount)) { var teradpsUser = new Members(); var damage = user.Amount; teradpsUser.playerTotalDamage = damage + ""; if (damage <= 0) { continue; } var buffs = _abnormals.Get(user.Source); teradpsUser.guild = string.IsNullOrWhiteSpace(user.Source.GuildName) ? null : user.Source.GuildName; teradpsUser.playerClass = user.Source.Class.ToString(); teradpsUser.playerName = user.Source.Name; teradpsUser.playerId = user.Source.PlayerId; teradpsUser.playerServer = BasicTeraData.Instance.Servers.GetServerName(user.Source.ServerId); teradpsUser.playerAverageCritRate = Math.Round(user.CritRate, 1) + ""; teradpsUser.healCrit = user.Source.IsHealer ? heals.FirstOrDefault(x => x.Source == user.Source)?.CritRate + "" : null; teradpsUser.playerDps = TimeSpan.TicksPerSecond * damage / interTick + ""; teradpsUser.playerTotalDamagePercentage = user.Amount * 100 / entityInfo.TotalDamage + ""; extendedStats.PlayerReceived.Add(user.Source.Name, Tuple.Create(skills.HitsReceived(user.Source.User, entity, timedEncounter), skills.DamageReceived(user.Source.User, entity, timedEncounter))); extendedStats.PlayerCritDamageRate.Add(user.Source.Name, user.CritDamageRate); var death = buffs.Death; teradpsUser.playerDeaths = death.Count(firstTick, lastTick) + ""; teradpsUser.playerDeathDuration = death.Duration(firstTick, lastTick) / TimeSpan.TicksPerSecond + ""; var aggro = buffs.Aggro(entity); teradpsUser.aggro = 100 * aggro.Duration(firstTick, lastTick) / interTick + ""; foreach (var buff in buffs.Times.OrderByDescending(x => x.Value.Duration(firstTick, lastTick))) { var percentage = buff.Value.Duration(firstTick, lastTick) * 100 / interTick; if (percentage == 0) { continue; } teradpsUser.buffUptime.Add(new KeyValuePair <string, string>( buff.Key.Id + "", percentage + "" )); var stacks = new List <List <int> > { new List <int> { 0, (int)percentage } }; var stackList = buff.Value.Stacks(firstTick, lastTick).OrderBy(x => x); teradpsUser.buffDetail.Add(new List <object> { buff.Key.Id, stacks }); if (stackList.Any() && stackList.Max() == 1) { continue; } foreach (var stack in buff.Value.Stacks(firstTick, lastTick).OrderBy(x => x)) { percentage = buff.Value.Duration(firstTick, lastTick, stack) * 100 / interTick; if (percentage == 0) { continue; } stacks.Add(new List <int> { stack, (int)percentage }); } } var serverPlayerName = $"{teradpsUser.playerServer}_{teradpsUser.playerName}"; extendedStats.PlayerSkills.Add(serverPlayerName, skills.GetSkillsDealt(user.Source.User, entity, timedEncounter)); extendedStats.PlayerBuffs.Add(serverPlayerName, buffs); var skillsId = SkillAggregate.GetAggregate(user, entityInfo.Entity, skills, timedEncounter, Database.Database.Type.Damage); extendedStats.PlayerSkillsAggregated[teradpsUser.playerServer + "/" + teradpsUser.playerName] = skillsId; foreach (var skill in skillsId.OrderByDescending(x => x.Amount())) { var skillLog = new SkillLog(); var skilldamage = skill.Amount(); skillLog.skillAverageCrit = Math.Round(skill.AvgCrit()) + ""; skillLog.skillAverageWhite = Math.Round(skill.AvgWhite()) + ""; skillLog.skillCritRate = skill.CritRate() + ""; skillLog.skillDamagePercent = skill.DamagePercent() + ""; skillLog.skillHighestCrit = skill.BiggestCrit() + ""; skillLog.skillHits = skill.Hits() + ""; var skillKey = skill.Skills.First().Key; skillLog.skillId = BasicTeraData.Instance.SkillDatabase.GetSkillByPetName(skillKey.NpcInfo?.Name, user.Source.RaceGenderClass)?.Id.ToString() ?? skillKey.Id.ToString(); skillLog.skillLowestCrit = skill.LowestCrit() + ""; skillLog.skillTotalDamage = skilldamage + ""; if (skilldamage == 0) { continue; } teradpsUser.skillLog.Add(skillLog); } if (NetworkController.Instance.MeterPlayers.Contains(user.Source)) { teradpsData.uploader = teradpsData.members.Count.ToString(); } teradpsData.members.Add(teradpsUser); } return(extendedStats); }
public static void ToTeraDpsApi(SDespawnNpc despawnNpc, AbnormalityStorage abnormals) { if (!BasicTeraData.Instance.WindowData.Excel && (string.IsNullOrEmpty(BasicTeraData.Instance.WindowData.TeraDpsToken) || string.IsNullOrEmpty(BasicTeraData.Instance.WindowData.TeraDpsUser))) { return; } if (!despawnNpc.Dead) { return; } var entity = DamageTracker.Instance.GetEntity(despawnNpc.Npc); if (!entity.IsBoss) { return; } bool timedEncounter = false; //Nightmare desolarus if (entity.NpcE.Info.HuntingZoneId == 759 && entity.NpcE.Info.TemplateId == 1003) { timedEncounter = true; } var interval = DamageTracker.Instance.Interval(entity); if (interval == 0) { return; } var stats = DamageTracker.Instance.GetPlayerStats(); var firstHit = DamageTracker.Instance.FirstHit(entity); var lastHit = DamageTracker.Instance.LastHit(entity); var entities = DamageTracker.Instance.GetEntityStats(); var totaldamage = DamageTracker.Instance.TotalDamage(entity, timedEncounter); var partyDps = DamageTracker.Instance.PartyDps(entity, timedEncounter); var teradpsData = new EncounterBase(); teradpsData.areaId = entity.NpcE.Info.HuntingZoneId + ""; teradpsData.bossId = entity.NpcE.Info.TemplateId + ""; teradpsData.fightDuration = interval + ""; teradpsData.partyDps = partyDps + ""; foreach (var debuff in abnormals.Get(entity.NpcE)) { long percentage = (debuff.Value.Duration(firstHit, lastHit) * 100 / interval); if (percentage == 0) { continue; } teradpsData.debuffUptime.Add(new KeyValuePair <string, string>( debuff.Key.Id + "", percentage + "" )); } foreach (var user in stats) { var teradpsUser = new Members(); var damage = user.Dealt.Damage(entity, timedEncounter); teradpsUser.playerTotalDamage = damage + ""; if (damage <= 0) { continue; } var buffs = abnormals.Get(user.Player); teradpsUser.playerClass = user.Class.ToString(); teradpsUser.playerName = user.Name; teradpsUser.playerServer = BasicTeraData.Instance.Servers.GetServerName(user.Player.ServerId); teradpsUser.playerAverageCritRate = user.Dealt.CritRate(entity, timedEncounter) + ""; teradpsUser.playerDps = user.Dealt.GlobalDps(entity, timedEncounter, interval) + ""; teradpsUser.playerTotalDamagePercentage = user.Dealt.DamageFraction(entity, totaldamage, timedEncounter) + ""; var death = buffs.Death; teradpsUser.playerDeaths = death.Count(firstHit, lastHit) + ""; teradpsUser.playerDeathDuration = death.Duration(firstHit, lastHit) + ""; foreach (var buff in buffs.Times) { long percentage = (buff.Value.Duration(user.Dealt.GetFirstHit(entity), user.Dealt.GetLastHit(entity)) * 100 / interval); if (percentage == 0) { continue; } teradpsUser.buffUptime.Add(new KeyValuePair <string, string>( buff.Key.Id + "", percentage + "" )); } Dictionary <Skills.Skill.Skill, SkillStats> notimedskills; if (timedEncounter) { notimedskills = NoTimedSkills(user.Dealt.GetSkillsByTime(entity)); } else { notimedskills = NoTimedSkills(user.Dealt.GetSkills(entity)); } foreach (var skill in notimedskills) { var skillLog = new SkillLog(); var skilldamage = skill.Value.Damage; skillLog.skillAverageCrit = skill.Value.DmgAverageCrit + ""; skillLog.skillAverageWhite = skill.Value.DmgAverageHit + ""; skillLog.skillCritRate = skill.Value.CritRateDmg + ""; skillLog.skillDamagePercent = skill.Value.DamagePercentage(entity, timedEncounter) + ""; skillLog.skillHighestCrit = skill.Value.DmgBiggestCrit + ""; skillLog.skillHits = skill.Value.HitsDmg + ""; skillLog.skillId = skill.Key.SkillId.ElementAt(0) + ""; skillLog.skillLowestCrit = skill.Value.DmgLowestCrit + ""; skillLog.skillTotalDamage = skilldamage + ""; if (skilldamage == 0) { continue; } teradpsUser.skillLog.Add(skillLog); } teradpsData.members.Add(teradpsUser); } if (BasicTeraData.Instance.WindowData.Excel) { var excelThread = new Thread(() => ExcelExport.ExcelSave(teradpsData)); excelThread.Start(); } if (string.IsNullOrEmpty(BasicTeraData.Instance.WindowData.TeraDpsToken) || string.IsNullOrEmpty(BasicTeraData.Instance.WindowData.TeraDpsUser)) { return; } string json = JsonConvert.SerializeObject(teradpsData); var sendThread = new Thread(() => Send(entity, json, 3)); sendThread.Start(); var jsonThread = new Thread(() => JsonExport(json)); jsonThread.Start(); }
public static void ToggleLogging() { FsmEditorSettings.EnableLogging = !FsmEditorSettings.EnableLogging; SkillLog.set_LoggingEnabled(FsmEditorSettings.EnableLogging); FsmEditorSettings.SaveSettings(); }
public void LogEnter() { SkillLog.Log("Time: {0} Enter [{1}] Leaf Action", TimeModule.FrameCount, ToDes()); }
private static ExtendedStats GenerateStats(SDespawnNpc despawnNpc, AbnormalityStorage abnormals) { if (!despawnNpc.Dead) { return(null); } var entity = DamageTracker.Instance.GetEntity(despawnNpc.Npc); if (!entity.IsBoss || !DamageTracker.Instance.EntitiesStats.ContainsKey(entity)) { return(null); } bool timedEncounter = false; //Nightmare desolarus if (entity.NpcE.Info.HuntingZoneId == 759 && entity.NpcE.Info.TemplateId == 1003) { timedEncounter = true; } var firstTick = DamageTracker.Instance.EntitiesStats[entity].FirstHit; var lastTick = DamageTracker.Instance.EntitiesStats[entity].LastHit; var interTick = lastTick - firstTick; var interval = interTick / TimeSpan.TicksPerSecond; if (interval == 0) { return(null); } var totaldamage = DamageTracker.Instance.TotalDamage(entity, timedEncounter); var partyDps = TimeSpan.TicksPerSecond * totaldamage / interTick; var teradpsData = new EncounterBase(); var extendedStats = new ExtendedStats(); var stats = DamageTracker.Instance.GetPlayerStats(); var _abnormals = abnormals.Clone(entity.NpcE, firstTick, lastTick); extendedStats.Entity = entity.NpcE; extendedStats.BaseStats = teradpsData; extendedStats.FirstTick = firstTick; extendedStats.LastTick = lastTick; teradpsData.areaId = entity.NpcE.Info.HuntingZoneId + ""; teradpsData.bossId = entity.NpcE.Info.TemplateId + ""; teradpsData.fightDuration = interval + ""; teradpsData.partyDps = partyDps + ""; extendedStats.Debuffs = _abnormals.Get(entity.NpcE); foreach (var debuff in extendedStats.Debuffs) { long percentage = (debuff.Value.Duration(firstTick, lastTick) * 100 / interTick); if (percentage == 0) { continue; } teradpsData.debuffUptime.Add(new KeyValuePair <string, string>( debuff.Key.Id + "", percentage + "" )); } foreach (var user in stats) { var teradpsUser = new Members(); var damage = user.Dealt.Damage(entity, timedEncounter); teradpsUser.playerTotalDamage = damage + ""; if (damage <= 0) { continue; } var buffs = _abnormals.Get(user.Player); teradpsUser.playerClass = user.Class.ToString(); teradpsUser.playerName = user.Name; teradpsUser.playerServer = BasicTeraData.Instance.Servers.GetServerName(user.Player.ServerId); teradpsUser.playerAverageCritRate = user.Dealt.CritRate(entity, timedEncounter) + ""; teradpsUser.healCrit = user.IsHealer ? user.Dealt.CritRateHeal(entity, timedEncounter) + "" : null; teradpsUser.playerDps = TimeSpan.TicksPerSecond * damage / interTick + ""; teradpsUser.playerTotalDamagePercentage = user.Dealt.DamageFraction(entity, totaldamage, timedEncounter) + ""; var death = buffs.Death; teradpsUser.playerDeaths = death.Count(firstTick, lastTick) + ""; teradpsUser.playerDeathDuration = death.Duration(firstTick, lastTick) / TimeSpan.TicksPerSecond + ""; var aggro = buffs.Aggro(entity.NpcE); teradpsUser.aggro = 100 * aggro.Duration(firstTick, lastTick) / interTick + ""; foreach (var buff in buffs.Times) { long percentage = (buff.Value.Duration(firstTick, lastTick) * 100 / interTick); if (percentage == 0) { continue; } teradpsUser.buffUptime.Add(new KeyValuePair <string, string>( buff.Key.Id + "", percentage + "" )); } var serverPlayerName = $"{teradpsUser.playerServer}_{teradpsUser.playerName}"; extendedStats.PlayerSkills.Add(serverPlayerName, timedEncounter ? user.Dealt.GetSkillsByTime(entity) : user.Dealt.GetSkills(entity)); extendedStats.PlayerBuffs.Add(serverPlayerName, buffs); var notimedskills = NoTimedSkills(extendedStats.PlayerSkills[serverPlayerName]); foreach (var skill in notimedskills) { var skillLog = new SkillLog(); var skilldamage = skill.Value.Damage; skillLog.skillAverageCrit = skill.Value.DmgAverageCrit + ""; skillLog.skillAverageWhite = skill.Value.DmgAverageHit + ""; skillLog.skillCritRate = skill.Value.CritRateDmg + ""; skillLog.skillDamagePercent = skill.Value.DamagePercentage(entity, timedEncounter) + ""; skillLog.skillHighestCrit = skill.Value.DmgBiggestCrit + ""; skillLog.skillHits = skill.Value.HitsDmg + ""; skillLog.skillId = BasicTeraData.Instance.SkillDatabase.GetSkillByPetName(skill.Key.NpcInfo?.Name, user.Player.RaceGenderClass)?.Id.ToString() ?? skill.Key.SkillId.ElementAt(0).ToString(); skillLog.skillLowestCrit = skill.Value.DmgLowestCrit + ""; skillLog.skillTotalDamage = skilldamage + ""; if (skilldamage == 0) { continue; } teradpsUser.skillLog.Add(skillLog); } teradpsData.members.Add(teradpsUser); } return(extendedStats); }