/// <summary> /// 分析用のキーワードを取得する /// </summary> /// <returns> /// キーワードコレクション</returns> private IReadOnlyCollection <AnalyzeKeyword> GetKeywords() { var list = Keywords.ToList(); // プレイヤ情報とパーティリストを取得する var player = FF14PluginHelper.GetPlayer(); var ptlist = LogBuffer.PartyList; if (player != null) { list.Insert(0, new AnalyzeKeyword() { Keyword = player.Name, Category = AnalyzeKeywordCategory.Me, }); } if (ptlist != null) { foreach (var name in ptlist) { list.Insert(0, new AnalyzeKeyword() { Keyword = name, Category = AnalyzeKeywordCategory.PartyMember, }); } } return(list); }
/// <summary> /// 表示切り替えボタン(スペスペボタン)の状態を切り替える /// </summary> /// <param name="visible"> /// 切り替える状態</param> public static void ChangeSwitchVisibleButton( bool visible) { Settings.Default.OverlayVisible = visible; Settings.Default.Save(); SpellTimerCore.Default.ClosePanels(); OnePointTelopController.CloseTelops(); FF14PluginHelper.RefreshPlayer(); LogBuffer.RefreshPartyList(); LogBuffer.RefreshPetID(); if (Settings.Default.OverlayVisible) { SpellTimerCore.Default.ActivatePanels(); OnePointTelopController.ActivateTelops(); } ActInvoker.Invoke(() => { if (Settings.Default.OverlayVisible) { SwitchVisibleButton.BackColor = Color.OrangeRed; SwitchVisibleButton.ForeColor = Color.WhiteSmoke; } else { SwitchVisibleButton.BackColor = SystemColors.Control; SwitchVisibleButton.ForeColor = Color.Black; } }); }
/// <summary> /// パーティの戦闘メンバリストを取得する /// </summary> /// <returns>パーティの戦闘メンバリスト</returns> public static List <Combatant> GetCombatantListParty() { // 総戦闘メンバリストを取得する(周囲のPC, NPC, MOB等すべて) var combatListAll = FF14PluginHelper.GetCombatantList(); // パーティメンバのIDリストを取得する int partyCount; var partyListById = FF14PluginHelper.GetCurrentPartyList(out partyCount); var combatListParty = new List <Combatant>(); foreach (var partyMemberId in partyListById) { if (partyMemberId == 0) { continue; } var partyMember = ( from x in combatListAll where x.ID == partyMemberId select x).FirstOrDefault(); if (partyMember != null) { combatListParty.Add(partyMember); Debug.WriteLine("<" + combatListParty.Count().ToString() + "> " + partyMember.Name); } } return(combatListParty); }
/// <summary> /// ペットIDを更新する /// </summary> public static void RefreshPetID() { // Combatantリストを取得する var combatant = FF14PluginHelper.GetCombatantList(); if (combatant != null && combatant.Count > 0) { var pet = ( from x in combatant where x.OwnerID == combatant[0].ID && ( x.Name.Contains("フェアリー・") || x.Name.Contains("・エギ") || x.Name.Contains("カーバンクル・") ) select x).FirstOrDefault(); if (pet != null) { petid = Convert.ToString((long)((ulong)pet.ID), 16).ToUpper(); petidZone = ActGlobals.oFormActMain.CurrentZone; } } }
/// <summary> /// ペットIDを更新する /// </summary> public static void RefreshPetID() { // Combatantリストを取得する var combatant = FF14PluginHelper.GetCombatantList(); if (combatant != null && combatant.Count > 0) { var pet = ( from x in combatant where x.OwnerID == combatant[0].ID && ( x.Name.Contains("フェアリー・") || x.Name.Contains("・エギ") || x.Name.Contains("カーバンクル・") ) select x).FirstOrDefault(); if (pet != null) { petid = Convert.ToString((long)((ulong)pet.ID), 16).ToUpper(); petidZone = ActGlobals.oFormActMain.CurrentZone; // 置換後のマッチングキーワードを消去する SpellTimerTable.ClearReplacedKeywords(); OnePointTelopTable.Default.ClearReplacedKeywords(); } } }
/// <summary> /// マッチングキーワードを生成する /// </summary> /// <param name="keyword">元のキーワード</param> /// <returns>生成したキーワード</returns> public static string MakeKeyword( string keyword) { if (string.IsNullOrWhiteSpace(keyword)) { return(keyword.Trim()); } if (!keyword.Contains("<") || !keyword.Contains(">")) { return(keyword.Trim()); } keyword = keyword.Trim(); var player = FF14PluginHelper.GetPlayer(); if (player != null) { keyword = keyword.Replace("<me>", player.Name.Trim()); } if (enabledPartyMemberPlaceHolder) { if (ptmember != null) { for (int i = 0; i < ptmember.Count; i++) { keyword = keyword.Replace( "<" + (i + 2).ToString() + ">", ptmember[i].Trim()); } } } if (!string.IsNullOrWhiteSpace(petid)) { keyword = keyword.Replace("<petid>", petid); } // ジョブ名プレースホルダを置換する // ex. <PLD>, <PLD1> ... if (replacementsByJobs != null) { foreach (var replacement in replacementsByJobs) { keyword = keyword.Replace(replacement.Key, replacement.Value); } } // カスタムプレースホルダを置換する // ex. <C1>, <C2> <focus> <ターゲット>... foreach (var p in customPlaceholders) { keyword = keyword.Replace("<" + p.Key + ">", p.Value); } return(keyword); }
/// <summary> /// マッチングキーワードを生成する /// </summary> /// <param name="keyword">元のキーワード</param> /// <returns>生成したキーワード</returns> public static string MakeKeyword(string keyword) { if (string.IsNullOrEmpty(keyword)) { return(string.Empty); } keyword = keyword.Trim(); if (keyword.Length == 0 || !keyword.Contains("<") || !keyword.Contains(">")) { return(keyword); } // カスタムプレスホルダを置換する keyword = ReplaceCustomPlaceholders(keyword); // 対DQX用のキーワードを置換する keyword = DQXUtility.MakeKeyword(keyword); // FFXIV以外での使用? if (Settings.Default.UseOtherThanFFXIV) { return(keyword); } var player = FF14PluginHelper.GetPlayer(); if (player != null) { keyword = keyword.Replace("<me>", player.Name.Trim()); } if (enabledPartyMemberPlaceHolder && PartyList.Any()) { foreach (var t in PartyList.Zip(PARTY_PLACEHOLDERS, (name, placeholder) => Tuple.Create(placeholder, name))) { keyword = keyword.Replace(t.Item1, t.Item2); } } if (!string.IsNullOrWhiteSpace(currentPetId)) { keyword = keyword.Replace("<petid>", currentPetId); } // ジョブ名プレースホルダを置換する // ex. <PLD>, <PLD1> ... foreach (var replacement in PlaceholderToJobNameDictionaly) { keyword = keyword.Replace(replacement.Key, replacement.Value); } return(keyword); }
/// <summary> /// プレイヤ情報をリフレッシュする /// </summary> public static void RefreshPlayer() { var list = FF14PluginHelper.GetCombatantList(); if (list.Count > 0) { player = list[0]; lastPlayerDateTime = DateTime.Now; } }
/// <summary> /// ロード /// </summary> /// <param name="sender">イベント発生元</param> /// <param name="e">イベント引数</param> private void FormLoad(object sender, EventArgs e) { var items = this.ZoneFilter.Split(','); this.ZonesCheckedListBox.Items.Clear(); foreach (var item in FF14PluginHelper.GetZoneList()) { this.ZonesCheckedListBox.Items.Add( item, items.Any(x => x == item.ID.ToString())); } }
/// <summary> /// 表示切り替えボタンを配置する /// </summary> private void SetSwitchVisibleButton() { var changeColor = new Action <Button>((button) => { if (Settings.Default.OverlayVisible) { button.BackColor = Color.OrangeRed; button.ForeColor = Color.WhiteSmoke; } else { button.BackColor = SystemColors.Control; button.ForeColor = Color.Black; } }); SwitchVisibleButton = new Button(); SwitchVisibleButton.Name = "SpecialSpellTimerSwitchVisibleButton"; SwitchVisibleButton.Size = new Size(90, 24); SwitchVisibleButton.Text = Utility.Translate.Get("SupeSupe"); SwitchVisibleButton.TextAlign = ContentAlignment.MiddleCenter; SwitchVisibleButton.UseVisualStyleBackColor = true; SwitchVisibleButton.Click += (s, e) => { var button = s as Button; Settings.Default.OverlayVisible = !Settings.Default.OverlayVisible; Settings.Default.Save(); SpellTimerCore.Default.ClosePanels(); OnePointTelopController.CloseTelops(); FF14PluginHelper.RefreshPlayer(); LogBuffer.RefreshPartyList(); LogBuffer.RefreshPetID(); if (Settings.Default.OverlayVisible) { SpellTimerCore.Default.ActivatePanels(); OnePointTelopController.ActivateTelops(); } changeColor(s as Button); }; changeColor(SwitchVisibleButton); ActGlobals.oFormActMain.Resize += this.oFormActMain_Resize; ActGlobals.oFormActMain.Controls.Add(SwitchVisibleButton); ActGlobals.oFormActMain.Controls.SetChildIndex(SwitchVisibleButton, 1); this.oFormActMain_Resize(this, null); }
/// <summary> /// リスタートのときスペルのカウントをリセットする /// </summary> private void ResetCountAtRestart() { // FFXIV以外での使用ならば何もしない if (Settings.Default.UseOtherThanFFXIV) { return; } // 無効? if (!Settings.Default.ResetOnWipeOut) { return; } // Combatantsを頻繁に取得したくないので5秒に1回だけ判定する if ((DateTime.Now - this.LastCheckWipeOutDateTime).TotalSeconds <= 5d) { this.LastCheckWipeOutDateTime = DateTime.Now; return; } this.LastCheckWipeOutDateTime = DateTime.Now; var combatants = FF14PluginHelper.GetCombatantListParty(); if (combatants == null || combatants.Count < 1) { return; } // 関係者が全員死んでる? if (combatants.Count == combatants.Count(x => x.CurrentHP <= 0)) { // リセットするのは15秒に1回にする // 暗転中もずっとリセットし続けてしまうので if ((DateTime.Now - this.LastWipeOutDateTime).TotalSeconds >= 15.0) { Logger.Write("Party was wiped out. Reset spells and tickers."); // スペルのカウントをリセットする SpellTimerTable.ResetCount(); // テロップのカウントをリセットする OnePointTelopTable.Default.ResetCount(); this.LastWipeOutDateTime = DateTime.Now; } } }
/// <summary> /// パーティリストを更新する /// </summary> public static void RefreshPTList() { if (ptmember == null) { ptmember = new List <string>(); } else { ptmember.Clear(); } if (Settings.Default.EnabledPartyMemberPlaceholder) { Debug.WriteLine("PT: Refresh"); // プレイヤー情報を取得する var player = FF14PluginHelper.GetPlayer(); if (player == null) { return; } // PTメンバの名前を記録しておく if (Settings.Default.EnabledPartyMemberPlaceholder) { var partyList = FF14PluginHelper.GetCombatantListParty(); // FF14内部のPTメンバ自動ソート順で並び替える var sorted = from x in partyList join y in Job.GetJobList() on x.Job equals y.JobId where x.ID != player.ID orderby y.Role, x.Job, x.ID select x.Name.Trim(); foreach (var name in sorted) { ptmember.Add(name); Debug.WriteLine("<- " + name); } } } }
/// <summary> /// 分析用のキーワードを取得する /// </summary> /// <returns>キーワードコレクション</returns> private IReadOnlyCollection <string> GetPartyMemberNames() { var names = new List <string>(); // プレイヤ情報とパーティリストを取得する var player = FF14PluginHelper.GetPlayer(); var ptlist = LogBuffer.PartyList; if (player != null) { names.Add(player.Name); } if (ptlist != null) { names.AddRange(ptlist); } return(names); }
public void UpdateMonitor() { if (!MonitorTabSelected) { InvalidatePlaceholders(); return; } if (Interlocked.CompareExchange(ref placeholderIsValid, VALID, INVALID) != INVALID) { return; } var player = FF14PluginHelper.GetPlayer(); RefreshPlaceholders( player != null ? player.Name : "", LogBuffer.PartyList, LogBuffer.PlaceholderToJobNameDictionaly); }
/// <summary> /// マッチングキーワードを生成する /// </summary> /// <param name="keyword">元のキーワード</param> /// <returns>生成したキーワード</returns> public static string MakeKeyword( string keyword) { if (string.IsNullOrWhiteSpace(keyword)) { return(keyword.Trim()); } keyword = keyword.Trim(); var player = FF14PluginHelper.GetPlayer(); if (player != null) { keyword = keyword.Replace("<me>", player.Name.Trim()); } if (Settings.Default.EnabledPartyMemberPlaceholder) { if (ptmember != null) { for (int i = 0; i < ptmember.Count; i++) { keyword = keyword.Replace( "<" + (i + 2).ToString() + ">", ptmember[i].Trim()); } } } if (!string.IsNullOrWhiteSpace(petid)) { keyword = keyword.Replace("<petid>", petid); } return(keyword); }
/// <summary> /// ログ行を返す /// </summary> /// <returns> /// ログ行の配列</returns> public IReadOnlyList <string> GetLogLines() { var playerRefreshed = false; var partyRefreshed = false; // 最後のログから1min間が空いた? if ((DateTime.Now - this.lastLogineTimestamp).TotalMinutes >= 1.0d) { FF14PluginHelper.RefreshPlayer(); playerRefreshed = true; RefreshPartyList(); partyRefreshed = true; } if (logInfoQueue.IsEmpty) { return(EMPTY_STRING_LIST); } var list = new List <string>(logInfoQueue.Count); var partyChanged = false; var jobChanged = false; var summoned = false; var zoneChanged = false; LogLineEventArgs logInfo; while (logInfoQueue.TryDequeue(out logInfo)) { string logLine = logInfo.logLine.Trim(); // ジョブに変化あり? if (!jobChanged) { if (IsJobChanged(logLine)) { jobChanged = true; if (!playerRefreshed) { FF14PluginHelper.RefreshPlayer(); playerRefreshed = true; } if (!partyRefreshed) { RefreshPartyList(); partyRefreshed = true; } } } // パーティに変化あり if (!partyChanged) { if (IsPartyChanged(logLine)) { partyChanged = true; } } if (!(summoned && zoneChanged)) { // ペットIDのCacheを更新する var player = FF14PluginHelper.GetPlayer(); if (player != null) { var jobName = Job.GetJobName(player.Job); if (player.AsJob().IsSummoner()) { if (logLine.Contains(player.Name + "の「サモン") || logLine.Contains("You cast Summon")) { summoned = true; } if (petIdCheckedZone != ActGlobals.oFormActMain.CurrentZone) { zoneChanged = true; } } } } list.Add(logLine); // ログファイルに出力する this.AppendLogFile(logLine); } if (partyChanged) { Task.Run(async() => { await Task.Delay(TimeSpan.FromSeconds(5)); RefreshPartyList(); }); } if (summoned) { Task.Run(async() => { await Task.Delay(TimeSpan.FromSeconds(5)); RefreshPetID(); }); } if (zoneChanged) { var oldSource = petIdRefreshTaskCancelTokenSource; if (oldSource != null) { lock (oldSource) { if (!oldSource.IsCancellationRequested) { try { oldSource.Cancel(); } catch { } } } } var newSource = petIdRefreshTaskCancelTokenSource = new CancellationTokenSource(); var token = newSource.Token; var count = 0; Task.Run(async() => { while (petIdCheckedZone != ActGlobals.oFormActMain.CurrentZone) { await Task.Delay(TimeSpan.FromSeconds(15)); RefreshPetID(); count++; if (count >= 6) { return; } } }, token); } // ログのタイムスタンプを記録する this.lastLogineTimestamp = DateTime.Now; return(list); }
/// <summary> /// ログを一行読取った /// </summary> /// <param name="isImport">Importか?</param> /// <param name="logInfo">ログ情報</param> private void oFormActMain_OnLogLineRead(bool isImport, LogLineEventArgs logInfo) { if (isImport) { return; } #if false Debug.WriteLine(logInfo.logLine); #endif var logLine = logInfo.logLine.Trim(); // 最後のログから1min間が空いた? if ((DateTime.Now - this.lastLogineTimestamp).TotalMinutes >= 1.0d) { FF14PluginHelper.RefreshPlayer(); RefreshPTList(); } // ジョブに変化あり? if (logLine.Contains("にチェンジした。") || logLine.Contains("You change to ")) { FF14PluginHelper.RefreshPlayer(); RefreshPTList(); } // パーティに変化あり? if (enabledPartyMemberPlaceHolder) { if (ptmember == null || replacementsByJobs == null || logLine.Contains("パーティを解散しました。") || logLine.Contains("がパーティに参加しました。") || logLine.Contains("がパーティから離脱しました。") || logLine.Contains("をパーティから離脱させました。") || logLine.Contains("の攻略を開始した。") || logLine.Contains("の攻略を終了した。") || (logLine.Contains("You join ") && logLine.Contains("'s party.")) || logLine.Contains("You left the party.") || logLine.Contains("You dissolve the party.") || logLine.Contains("The party has been disbanded.") || logLine.Contains("joins the party.") || logLine.Contains("has left the party.") || logLine.Contains("was removed from the party.")) { Task.Run(() => { Thread.Sleep(5 * 1000); RefreshPTList(); }); } } // ペットIDのCacheを更新する var player = FF14PluginHelper.GetPlayer(); if (player != null) { var jobName = Job.GetJobName(player.Job); #if DEBUG Debug.WriteLine("JOB NAME!! " + jobName); #endif if (jobName == "巴術士" || jobName == "ARC" || jobName == "学者" || jobName == "SCH" || jobName == "召喚士" || jobName == "SMN") { if (logLine.Contains(player.Name + "の「サモン") || logLine.Contains("You cast Summon")) { Task.Run(() => { Thread.Sleep(5 * 1000); RefreshPetID(); }); } if (petidZone != ActGlobals.oFormActMain.CurrentZone) { Task.Run(() => { lock (lockPetidObject) { var count = 0; while (petidZone != ActGlobals.oFormActMain.CurrentZone) { Thread.Sleep(15 * 1000); RefreshPetID(); count++; if (count >= 6) { petidZone = ActGlobals.oFormActMain.CurrentZone; break; } } } }); } } } lock (this.buffer) { this.buffer.Add(logLine); // ログのタイムスタンプを記録する this.lastLogineTimestamp = DateTime.Now; } // ログファイルに出力する this.AppendLogFile(logLine); }
/// <summary> /// ログを1行読取った /// </summary> /// <param name="isImport">Importか?</param> /// <param name="logInfo">ログ情報</param> private void oFormActMain_OnLogLineRead( bool isImport, LogLineEventArgs logInfo) { if (!Settings.Default.CombatLogEnabled) { return; } if (this.CurrentCombatLogList == null) { return; } // ログにペットが含まれている? if (logInfo.logLine.Contains("・エギ") || logInfo.logLine.Contains("フェアリー・") || logInfo.logLine.Contains("カーバンクル・")) { return; } // インポートログではない? if (!isImport) { // プレイヤ情報とパーティリストを取得する var player = FF14PluginHelper.GetPlayer(); var ptlist = LogBuffer.PartyList; if (player == null || ptlist == null) { return; } // ログにプレイヤ名が含まれている? if (logInfo.logLine.Contains(player.Name)) { return; } // ログにパーティメンバ名が含まれている? foreach (var name in ptlist) { if (logInfo.logLine.Contains(name)) { return; } } } // キャストのキーワードが含まれている? foreach (var keyword in CastKeywords) { if (logInfo.logLine.Contains(keyword)) { this.StoreCastLog(logInfo); return; } } // アクションのキーワードが含まれている? foreach (var keyword in ActionKeywords) { if (logInfo.logLine.Contains(keyword)) { this.StoreActionLog(logInfo); return; } } // 残HP率のキーワードが含まれている? foreach (var keyword in HPRateKeywords) { if (logInfo.logLine.Contains(keyword)) { this.StoreHPRateLog(logInfo); return; } } // Addedのキーワードが含まれている? foreach (var keyword in AddedKeywords) { if (logInfo.logLine.Contains(keyword)) { this.StoreAddedLog(logInfo); return; } } }
/// <summary> /// ログを一行読取った /// </summary> /// <param name="isImport">Importか?</param> /// <param name="logInfo">ログ情報</param> private void oFormActMain_OnLogLineRead(bool isImport, LogLineEventArgs logInfo) { if (isImport) { return; } #if false Debug.WriteLine(logInfo.logLine); #endif var logLine = logInfo.logLine.Trim(); // ジョブに変化あり? if (logLine.Contains("にチェンジした。") || logLine.Contains("You change to ")) { FF14PluginHelper.RefreshPlayer(); } // パーティに変化あり? if (ptmember == null || logLine.Contains("パーティを解散しました。") || logLine.Contains("がパーティに参加しました。") || logLine.Contains("がパーティから離脱しました。") || logLine.Contains("をパーティから離脱させました。") || logLine.Contains("の攻略を開始した。") || logLine.Contains("の攻略を終了した。") || (logLine.Contains("You join ") && logLine.Contains("'s party.")) || logLine.Contains("You left the party.") || logLine.Contains("You dissolve the party.") || logLine.Contains("The party has been disbanded.") || logLine.Contains("joins the party.") || logLine.Contains("has left the party.") || logLine.Contains("was removed from the party.")) { Task.Run(() => { Thread.Sleep(5 * 1000); RefreshPTList(); }).ContinueWith((t) => { t.Dispose(); }); } // ペットIDのCacheを更新する var player = FF14PluginHelper.GetPlayer(); if (player != null) { var jobName = Job.GetJobName(player.Job); Debug.WriteLine("JOB NAME!! " + jobName); if (jobName == "巴術士" || jobName == "ARC" || jobName == "学者" || jobName == "SCH" || jobName == "召喚士" || jobName == "SMN") { if (logLine.Contains(player.Name + "の「サモン") || logLine.Contains("You cast Summon")) { Task.Run(() => { Thread.Sleep(5 * 1000); RefreshPetID(); }).ContinueWith((t) => { t.Dispose(); }); } if (petidZone != ActGlobals.oFormActMain.CurrentZone) { Task.Run(() => { lock (lockPetidObject) { var count = 0; while (petidZone != ActGlobals.oFormActMain.CurrentZone) { Thread.Sleep(15 * 1000); RefreshPetID(); count++; if (count >= 6) { petidZone = ActGlobals.oFormActMain.CurrentZone; break; } } } }).ContinueWith((t) => { t.Dispose(); }); } } } lock (this.buffer) { this.buffer.Add(logLine); } }
/// <summary> /// パーティリストを更新する /// </summary> public static void RefreshPartyList() { // プレイヤー情報を取得する var player = FF14PluginHelper.GetPlayer(); if (player == null) { return; } if (enabledPartyMemberPlaceHolder) { #if DEBUG Debug.WriteLine("PT: Refresh"); #endif // PTメンバの名前を記録しておく var combatants = FF14PluginHelper.GetCombatantListParty(); // FF14内部のPTメンバ自動ソート順で並び替える var sorted = from x in combatants join y in Job.JobList on x.Job equals y.JobId where x.ID != player.ID orderby y.Role, x.Job, x.ID descending select x.Name.Trim(); partyList = new List <string>(sorted); // パーティメンバが空だったら自分を補完しておく if (!combatants.Any()) { combatants.Add(player); } var newList = new Dictionary <string, string>(); // ジョブ名によるプレースホルダを登録する foreach (var job in Job.JobList) { // このジョブに該当するパーティメンバを抽出する var combatantsByJob = ( from x in combatants where x.Job == job.JobId orderby x.ID == player.ID ? 0 : 1, x.ID descending select x).ToArray(); if (!combatantsByJob.Any()) { continue; } // <JOBn>形式を置換する // ex. <PLD1> → Taro Paladin // ex. <PLD2> → Jiro Paladin for (int i = 0; i < combatantsByJob.Length; i++) { var placeholder = string.Format( "<{0}{1}>", job.JobName, i + 1); newList.Add(placeholder.ToUpper(), combatantsByJob[i].Name); } // <JOB>形式を置換する // ただし、この場合は正規表現のグループ形式とする // また、グループ名にはジョブの略称を設定する // ex. <PLD> → (?<PLDs>Taro Paladin|Jiro Paladin) var names = string.Join("|", combatantsByJob.Select(x => x.Name).ToArray()); var oldValue = string.Format("<{0}>", job.JobName); var newValue = string.Format( "(?<{0}s>{1})", job.JobName.ToUpper(), names); newList.Add(oldValue.ToUpper(), newValue); } placeholderToJobNameDictionaly = newList; } else { partyList = EMPTY_STRING_LIST; placeholderToJobNameDictionaly = EMPTY_STRING_PAIR_MAP; } // 置換後のマッチングキーワードを消去する SpellTimerTable.ClearReplacedKeywords(); OnePointTelopTable.Default.ClearReplacedKeywords(); // スペルタイマーの再描画を行う SpellTimerTable.ClearUpdateFlags(); // モニタタブの情報を無効にする SpecialSpellTimerPlugin.ConfigPanel.InvalidatePlaceholders(); }
/// <summary> /// Commandとマッチングする /// </summary> /// <param name="logLines"> /// ログ行</param> public static void MatchCommand( IReadOnlyList <string> logLines) { var commandDone = false; foreach (var log in logLines) { // 正規表現の前にキーワードがなければ抜けてしまう if (!log.ToLower().Contains("/spespe")) { continue; } var match = regexCommand.Match(log); if (!match.Success) { continue; } var command = match.Groups["command"].ToString().ToLower(); var target = match.Groups["target"].ToString().ToLower(); var windowname = match.Groups["windowname"].ToString().Replace(@"""", string.Empty); var valueAsText = match.Groups["value"].ToString(); var value = false; if (!bool.TryParse(valueAsText, out value)) { value = false; } switch (command) { case "analyze": switch (target) { case "on": SpecialSpellTimerPlugin.ConfigPanel.CombatAnalyzerEnabled = true; commandDone = true; break; case "off": SpecialSpellTimerPlugin.ConfigPanel.CombatAnalyzerEnabled = false; commandDone = true; break; } break; case "refresh": switch (target) { case "spells": SpellTimerCore.Default.ClosePanels(); commandDone = true; break; case "telops": OnePointTelopController.CloseTelops(); commandDone = true; break; case "me": FF14PluginHelper.RefreshPlayer(); commandDone = true; break; case "pt": LogBuffer.RefreshPartyList(); commandDone = true; break; case "pet": LogBuffer.RefreshPetID(); commandDone = true; break; } break; case "changeenabled": var changed = false; switch (target) { case "spells": foreach (var spell in SpellTimerTable.Table) { if (spell.Panel.Trim().ToLower() == windowname.Trim().ToLower() || spell.SpellTitle.Trim().ToLower() == windowname.Trim().ToLower() || windowname.Trim().ToLower() == "all") { changed = true; spell.Enabled = value; } } if (changed) { ActInvoker.Invoke(() => { SpecialSpellTimerPlugin.ConfigPanel.LoadSpellTimerTable(); }); commandDone = true; } break; case "telops": foreach (var telop in OnePointTelopTable.Default.Table) { if (telop.Title.Trim().ToLower() == windowname.Trim().ToLower() || windowname.Trim().ToLower() == "all") { changed = true; telop.Enabled = value; } } if (changed) { ActInvoker.Invoke(() => { SpecialSpellTimerPlugin.ConfigPanel.LoadTelopTable(); }); commandDone = true; } break; } break; case "set": switch (target) { case "placeholder": if (windowname.Trim().ToLower() != "all" && windowname.Trim() != string.Empty && valueAsText.Trim() != string.Empty) { LogBuffer.SetCustomPlaceholder(windowname.Trim(), valueAsText.Trim()); commandDone = true; } break; } break; case "clear": switch (target) { case "placeholder": if (windowname.Trim().ToLower() == "all") { LogBuffer.ClearCustomPlaceholderAll(); commandDone = true; } else if (windowname.Trim() != string.Empty) { LogBuffer.ClearCustomPlaceholder(windowname.Trim()); commandDone = true; } break; } break; case "on": SpecialSpellTimerPlugin.ChangeSwitchVisibleButton(true); commandDone = true; break; case "off": SpecialSpellTimerPlugin.ChangeSwitchVisibleButton(false); commandDone = true; break; } } // loop end logLines // コマンドを実行したらシステム音を鳴らす if (commandDone) { SystemSounds.Asterisk.Play(); } } // method end
/// <summary> /// ログ行を返す /// </summary> /// <returns>ログ行の配列</returns> public IReadOnlyList <string> GetLogLines() { var playerRefreshed = false; var partyRefreshed = false; // 最後のログから1min間が空いた? if ((DateTime.Now - this.lastLogineTimestamp).TotalMinutes >= 1.0d) { FF14PluginHelper.RefreshPlayer(); playerRefreshed = true; RefreshPartyList(); partyRefreshed = true; } if (logInfoQueue.IsEmpty) { return(EMPTY_STRING_LIST); } var list = new List <string>(logInfoQueue.Count); var playerChanged = false; var partyChanged = false; var jobChanged = false; var summoned = false; var zoneChanged = false; var partyChangedAtDQX = false; LogLineEventArgs logInfo; while (logInfoQueue.TryDequeue(out logInfo)) { var logLine = logInfo.logLine.Trim(); // エフェクトに付与されるツールチップ文字を除去する if (Settings.Default.RemoveTooltipSymbols) { logLine = TooltipCharsRegex.Replace(logLine, string.Empty); } // FFXIVでの使用? if (!Settings.Default.UseOtherThanFFXIV) { // プレイヤーに変化あり? if (!playerChanged) { if (IsPlayerChanged(logInfo.logLine)) { if (!playerRefreshed) { FF14PluginHelper.RefreshPlayer(); playerRefreshed = true; } if (!partyRefreshed) { RefreshPartyList(); partyRefreshed = true; } Logger.Write("primary player changed."); playerChanged = true; } } // ジョブに変化あり? if (!jobChanged) { if (IsJobChanged(logLine)) { jobChanged = true; if (!playerRefreshed) { FF14PluginHelper.RefreshPlayer(); playerRefreshed = true; } if (!partyRefreshed) { RefreshPartyList(); partyRefreshed = true; } } } // パーティに変化あり if (!partyChanged) { if (IsPartyChanged(logLine)) { partyChanged = true; } } if (!(summoned && zoneChanged)) { // ペットIDのCacheを更新する var player = FF14PluginHelper.GetPlayer(); if (player != null) { var job = player.AsJob(); if (job != null) { if (player.AsJob().IsSummoner()) { if (logLine.Contains(player.Name + "の「サモン") || logLine.Contains("You cast Summon")) { summoned = true; } if (petIdCheckedZone != ActGlobals.oFormActMain.CurrentZone) { zoneChanged = true; } } } } } } // パーティに変化があるか?(対DQX) var r = DQXUtility.IsPartyChanged(logLine); if (!partyChangedAtDQX) { partyChangedAtDQX = r; } list.Add(logLine); // ログファイルに出力する this.AppendLogFile(logLine); } if (partyChanged) { Task.Run(async() => { await Task.Delay(TimeSpan.FromSeconds(5)); RefreshPartyList(); }); } if (partyChangedAtDQX) { Task.Run(async() => { await Task.Delay(TimeSpan.FromSeconds(1)); DQXUtility.RefeshKeywords(); }); } if (summoned) { Task.Run(async() => { await Task.Delay(TimeSpan.FromSeconds(5)); RefreshPetID(); }); } if (zoneChanged) { var oldSource = petIdRefreshTaskCancelTokenSource; if (oldSource != null) { lock (oldSource) { if (!oldSource.IsCancellationRequested) { try { oldSource.Cancel(); } catch { } } } } var newSource = petIdRefreshTaskCancelTokenSource = new CancellationTokenSource(); var token = newSource.Token; var count = 0; Task.Run(async() => { while (petIdCheckedZone != ActGlobals.oFormActMain.CurrentZone) { await Task.Delay(TimeSpan.FromSeconds(15)); RefreshPetID(); count++; if (count >= 6) { return; } } }, token); } // ログのタイムスタンプを記録する this.lastLogineTimestamp = DateTime.Now; return(list); }