/// <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> 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(); }