/// <summary> /// ログ行を返す /// </summary> /// <returns>ログ行の配列</returns> public IReadOnlyList <XIVLog> GetLogLines() { if (this.logInfoQueue.IsEmpty) { return(EmptyLogLineList); } // プレイヤー情報を取得する var player = FFXIVPlugin.Instance.GetPlayer(); // プレイヤーが召喚士か? var palyerIsSummoner = false; if (player != null) { var job = player.AsJob(); if (job != null) { palyerIsSummoner = job.IsSummoner(); } } // マッチング用のログリスト var list = new List <XIVLog>(logInfoQueue.Count); var summoned = false; var doneCommand = false; var preLog = new string[3]; var preLogIndex = 0; #if DEBUG var sw = System.Diagnostics.Stopwatch.StartNew(); #endif while (logInfoQueue.TryDequeue( out LogLineEventArgs logInfo)) { var logLine = logInfo.logLine; // 直前とまったく同じ行はカットする if (preLog[0] == logLine || preLog[1] == logLine || preLog[2] == logLine) { continue; } preLog[preLogIndex++] = logLine; if (preLogIndex >= 3) { preLogIndex = 0; } // 無効なログ行をカットする if (IgnoreLogKeywords.Any(x => logLine.Contains(x))) { continue; } // ダメージ系ログをカットする if (Settings.Default.IgnoreDamageLogs && DamageLogPattern.IsMatch(logLine)) { continue; } // 詳細なログをカット if (Settings.Default.IgnoreDetailLogs && IgnoreDetailLogKeywords.Any(x => logLine.Contains(x))) { continue; } // エフェクトに付与されるツールチップ文字を除去する if (Settings.Default.RemoveTooltipSymbols) { // 4文字分のツールチップ文字を除去する int index; if ((index = logLine.IndexOf( TooltipSuffix, 0, StringComparison.Ordinal)) > -1) { logLine = logLine.Remove(index - 1, 4); } // 残ったReplacementCharを除去する logLine = logLine.Replace(TooltipReplacementChar, string.Empty); } // ペットジョブで召喚をしたか? if (!summoned && palyerIsSummoner) { summoned = isSummoned(logLine); } // コマンドとマッチングする doneCommand |= TextCommandController.MatchCommandCore(logLine); list.Add(new XIVLog(logLine)); } if (summoned) { TableCompiler.Instance.RefreshPetPlaceholder(); } if (doneCommand) { SystemSounds.Asterisk.Play(); } // ログファイルに出力する if (Settings.Default.SaveLogEnabled) { ChatLogWorker.Instance.AppendLinesAsync(list); } #if DEBUG sw.Stop(); System.Diagnostics.Debug.WriteLine($"★GetLogLines {sw.Elapsed.TotalMilliseconds:N1} ms"); #endif // 冒頭のタイムスタンプを除去して返す return(list); // 召喚したか? bool isSummoned(string logLine) { var r = false; if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase)) { r = true; } else { if (!string.IsNullOrEmpty(player.Name)) { r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameFI)) { r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameIF)) { r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameII)) { r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase); } } return(r); } }
/// <summary> /// ログ行を返す /// </summary> /// <returns>ログ行の配列</returns> public IReadOnlyList <XIVLog> GetLogLines() { if (this.logInfoQueue.IsEmpty) { return(EmptyLogLineList); } // プレイヤー情報を取得する var player = FFXIVPlugin.Instance.GetPlayer(); // プレイヤーが召喚士か? var palyerIsSummoner = false; if (player != null) { var job = player.AsJob(); if (job != null) { palyerIsSummoner = job.IsSummoner(); } } // マッチング用のログリスト var list = new List <XIVLog>(logInfoQueue.Count); var partyChangedAtDQX = false; var summoned = false; var doneCommand = false; #if DEBUG var sw = System.Diagnostics.Stopwatch.StartNew(); #endif while (logInfoQueue.TryDequeue( out LogLineEventArgs logInfo)) { var logLine = logInfo.logLine; // エフェクトに付与されるツールチップ文字を除去する if (Settings.Default.RemoveTooltipSymbols) { // 4文字分のツールチップ文字を除去する int index; if ((index = logLine.IndexOf( TooltipSuffix, 0, StringComparison.Ordinal)) > -1) { logLine = logLine.Remove(index - 1, 4); } // 残ったReplacementCharを除去する logLine = logLine.Replace(TooltipReplacementChar, string.Empty); } // FFXIVでの使用? if (!Settings.Default.UseOtherThanFFXIV && !summoned && palyerIsSummoner) { summoned = isSummoned(logLine); } // パーティに変化があるか?(対DQX) if (!partyChangedAtDQX) { partyChangedAtDQX = DQXUtility.IsPartyChanged(logLine); } // コマンドとマッチングする doneCommand |= TextCommandController.MatchCommandCore(logLine); list.Add(new XIVLog(logLine)); } if (summoned) { TableCompiler.Instance.RefreshPetPlaceholder(); } if (partyChangedAtDQX) { Task.Run(() => { Thread.Sleep(TimeSpan.FromSeconds(1)); DQXUtility.RefeshKeywords(); }); } if (doneCommand) { SystemSounds.Asterisk.Play(); } // ログファイルに出力する if (Settings.Default.SaveLogEnabled) { Task.Run(() => ChatLogWorker.Instance.AppendLines(list)); } #if DEBUG sw.Stop(); System.Diagnostics.Debug.WriteLine($"★GetLogLines {sw.Elapsed.TotalMilliseconds:N1} ms"); #endif // 冒頭のタイムスタンプを除去して返す return(list); // 召喚したか? bool isSummoned(string logLine) { var r = false; if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase)) { r = true; } else { if (!string.IsNullOrEmpty(player.Name)) { r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameFI)) { r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameIF)) { r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameII)) { r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase); } } return(r); } }
/// <summary> /// ログ行を返す /// </summary> /// <returns>ログ行の配列</returns> public IReadOnlyList <XIVLog> GetLogLines() { if (this.XIVLogQueue.IsEmpty) { return(EmptyLogLineList); } // プレイヤー情報を取得する var player = CombatantsManager.Instance.Player; // プレイヤーが召喚士か? var palyerIsSummoner = false; if (player != null) { var job = player.JobInfo; if (job != null) { palyerIsSummoner = job.IsSummoner(); } } // マッチング用のログリスト var list = new List <XIVLog>(this.XIVLogQueue.Count); var summoned = false; var doneCommand = false; var isDefeated = false; var isCombatEnd = false; var preLog = new string[3]; var preLogIndex = 0; #if DEBUG var sw = System.Diagnostics.Stopwatch.StartNew(); #endif while (this.XIVLogQueue.TryDequeue( out XIVLog xivlog)) { var logLine = xivlog.LogLine; // 直前とまったく同じ行はカットする if (preLog[0] == logLine || preLog[1] == logLine || preLog[2] == logLine) { continue; } preLog[preLogIndex++] = logLine; if (preLogIndex >= 3) { preLogIndex = 0; } if (IsAutoIgnoreLog(logLine)) { continue; } // ツールチップシンボル, ワールド名を除去する logLine = RemoveTooltipSynbols(logLine); logLine = RemoveWorldName(logLine); xivlog.LogLine = logLine; // ペットジョブで召喚をしたか? if (!summoned && palyerIsSummoner) { summoned = isSummoned(logLine); } // 誰かが倒された? if (!isDefeated) { isDefeated = this.IsDefeated(logLine); } // 戦闘終了? if (!isCombatEnd) { isCombatEnd = this.IsCombatEnd(logLine); } // コマンドとマッチングする doneCommand |= TextCommandController.MatchCommandCore(logLine); doneCommand |= TextCommandBridge.Instance.TryExecute(logLine); list.Add(xivlog); } if (summoned) { TableCompiler.Instance.RefreshPetPlaceholder(); } if (isDefeated) { PluginMainWorker.Instance.ResetCountAtRestart(); } if (isCombatEnd) { PluginMainWorker.Instance.Wipeout(); } if (doneCommand) { CommonSounds.Instance.PlayAsterisk(); } // ログファイルに出力する if (Settings.Default.SaveLogEnabled) { ChatLogWorker.Instance.AppendLinesAsync(list); } #if DEBUG sw.Stop(); System.Diagnostics.Debug.WriteLine($"★GetLogLines {sw.Elapsed.TotalMilliseconds:N1} ms"); #endif // 冒頭のタイムスタンプを除去して返す return(list); // 召喚したか? bool isSummoned(string logLine) { var r = false; if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase)) { r = true; } else { if (!string.IsNullOrEmpty(player.Name)) { r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameFI)) { r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameIF)) { r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameII)) { r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase); } } return(r); } }
public IEnumerable <XIVLog> GetLogLines() { var player = FFXIVPlugin.Instance.GetPlayer(); var palyerIsSummoner = player? .AsJob()? .IsSummoner() ?? false; var summoned = false; var doneCommand = false; var logs = this.GetLogs(); foreach (var xlvLog in logs) { // ペットジョブで召喚をしたか? if (!summoned && palyerIsSummoner) { summoned = isSummoned(xlvLog.LogLine); } // コマンドとマッチングする doneCommand |= TextCommandController.MatchCommandCore(xlvLog.LogLine); yield return(xlvLog); } if (summoned) { TableCompiler.Instance.RefreshPetPlaceholder(); } if (doneCommand) { SystemSounds.Asterisk.Play(); } // ログファイルに出力する if (Settings.Default.SaveLogEnabled) { ChatLogWorker.Instance.AppendLinesAsync(logs); } // 召喚したか? bool isSummoned(string logLine) { var r = false; if (logLine.Contains("You cast Summon", StringComparison.OrdinalIgnoreCase)) { r = true; } else { if (!string.IsNullOrEmpty(player.Name)) { r = logLine.Contains(player.Name + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameFI)) { r = logLine.Contains(player.NameFI + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameIF)) { r = logLine.Contains(player.NameIF + "の「サモン", StringComparison.OrdinalIgnoreCase); } if (!string.IsNullOrEmpty(player.NameII)) { r = logLine.Contains(player.NameII + "の「サモン", StringComparison.OrdinalIgnoreCase); } } return(r); } }