示例#1
0
        /// <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);
        }
示例#2
0
        /// <summary>
        /// ログを読取った
        /// </summary>
        /// <param name="isImport">インポートログか?</param>
        /// <param name="logInfo">ログ情報</param>
        private void oFormActMain_OnLogLineRead(bool isImport, LogLineEventArgs logInfo)
        {
            if (isImport)
            {
                return;
            }

            var player = FF14PluginHelper.GetPlayer();

            if (player == null)
            {
                return;
            }

            if (logInfo.logLine.Contains(player.Name + "に「アストラルファイア」の効果。") ||
                logInfo.logLine.Contains(player.Name + "に「アストラルファイアII」の効果。") ||
                logInfo.logLine.Contains(player.Name + "に「アストラルファイアIII」の効果。"))
            {
                this.CurrentMPRecoveryStatus = MPRecoveryStatus.AstralFire;
            }

            if (logInfo.logLine.Contains(player.Name + "に「アンブラルブリザード」の効果。"))
            {
                this.CurrentMPRecoveryStatus = MPRecoveryStatus.UmbralIce1;
            }

            if (logInfo.logLine.Contains(player.Name + "に「アンブラルブリザードII」の効果。"))
            {
                this.CurrentMPRecoveryStatus = MPRecoveryStatus.UmbralIce2;
            }

            if (logInfo.logLine.Contains(player.Name + "に「アンブラルブリザードIII」の効果。"))
            {
                this.CurrentMPRecoveryStatus = MPRecoveryStatus.UmbralIce3;
            }

            if (logInfo.logLine.Contains(player.Name + "に「賢人のバラード」の効果。"))
            {
                this.BalladEnabled = true;
            }

            if (logInfo.logLine.Contains(player.Name + "の「アストラルファイア」が切れた。") ||
                logInfo.logLine.Contains(player.Name + "の「アストラルファイアII」が切れた。") ||
                logInfo.logLine.Contains(player.Name + "の「アストラルファイアIII」が切れた。") ||
                logInfo.logLine.Contains(player.Name + "の「アンブラルブリザード」が切れた。") ||
                logInfo.logLine.Contains(player.Name + "の「アンブラルブリザードII」が切れた。") ||
                logInfo.logLine.Contains(player.Name + "の「アンブラルブリザードIII」が切れた。"))
            {
                this.CurrentMPRecoveryStatus = MPRecoveryStatus.Normal;
            }

            if (logInfo.logLine.Contains(player.Name + "の「賢人のバラード」が切れた。"))
            {
                this.BalladEnabled = false;
            }
        }
示例#3
0
        /// <summary>
        /// プレイヤ情報をリフレッシュする
        /// </summary>
        public static void RefreshPlayer()
        {
            var list = FF14PluginHelper.GetCombatantList();

            if (list.Count > 0)
            {
                player             = list[0];
                lastPlayerDateTime = DateTime.Now;
            }
        }
        /// <summary>
        /// MP回復スパンを監視する
        /// </summary>
        public void WacthMPRecovery()
        {
            var vm = MPTimerWindow.Default.ViewModel;

            var player = FF14PluginHelper.GetCombatantPlayer();

            if (player == null)
            {
                vm.Visible = false;
                return;
            }
            else
            {
                // プレイヤー情報を保存する
                this.LastPlayerInfo = player;
            }

            // MPTimerが無効?
            if (!Settings.Default.EnabledMPTimer)
            {
                vm.Visible = false;
                return;
            }

            // ジョブ指定を設定する
            vm.Visible = this.EnabledByJobFilter;
            if (!vm.Visible)
            {
                return;
            }

            // 戦闘中のみ稼働させる?
            if (Settings.Default.CountInCombat)
            {
                // MPが満タンになった?
                if (player.CurrentMP > this.PreviousMP &&
                    player.CurrentMP >= player.MaxMP)
                {
                    this.LastMPFullDateTime = DateTime.Now;
                }

                // 現在がMP満タン状態?
                if (player.CurrentMP >= player.MaxMP ||
                    this.PreviousMP < 0)
                {
                    // 前回の満タンからn秒以上経過した?
                    if ((DateTime.Now - this.LastMPFullDateTime).TotalSeconds >=
                        Settings.Default.CountInCombatSpan)
                    {
                        vm.InCombat = false;
                    }
                }
                else
                {
                    vm.InCombat = true;
                }
            }

            // 自然回復による回復量を求める
            if (!this.MPRecoveryAmounts.ContainsKey(player.MaxMP))
            {
                var mpRecoveryValueNorml    = (int)Math.Floor(player.MaxMP * Constants.MPRecoveryRate.Normal);
                var mpRecoveryValueInCombat = (int)Math.Floor(player.MaxMP * Constants.MPRecoveryRate.InCombat);
                var mpRecoveryValueUI1      = (int)Math.Floor(player.MaxMP * Constants.MPRecoveryRate.UmbralIce1);
                var mpRecoveryValueUI2      = (int)Math.Floor(player.MaxMP * Constants.MPRecoveryRate.UmbralIce2);
                var mpRecoveryValueUI3      = (int)Math.Floor(player.MaxMP * Constants.MPRecoveryRate.UmbralIce3);

                this.MPRecoveryAmounts[player.MaxMP] = new int[]
                {
                    mpRecoveryValueNorml,
                    mpRecoveryValueNorml + mpRecoveryValueUI1,
                    mpRecoveryValueNorml + mpRecoveryValueUI2,
                    mpRecoveryValueNorml + mpRecoveryValueUI3,
                    mpRecoveryValueInCombat,
                    mpRecoveryValueInCombat + mpRecoveryValueUI1,
                    mpRecoveryValueInCombat + mpRecoveryValueUI2,
                    mpRecoveryValueInCombat + mpRecoveryValueUI3,
                };
            }

            var mpRecoveryAmounts = this.MPRecoveryAmounts[player.MaxMP];

            var now = DateTime.Now;

            // MPが回復している?
            if (this.PreviousMP > -1 &&
                player.CurrentMP > this.PreviousMP)
            {
                // 今回の回復量を算出する
                var mpRecoveryValue = player.CurrentMP - this.PreviousMP;

                // 算出した回復量と一致する?
                if (mpRecoveryAmounts.Any(x => x == mpRecoveryValue))
                {
#if DEBUG
                    var interval = (now - this.LastRecoveryDateTime).TotalMilliseconds;
#endif
                    this.LastRecoveryDateTime = now;
                    this.NextRecoveryDateTime = this.LastRecoveryDateTime.AddSeconds(Constants.MPRecoverySpan);

#if DEBUG
                    Trace.WriteLine(string.Format("MPRecovery matched. MP={0:N0}, Interval={1:N0}", mpRecoveryValue, interval));
#endif
                }

                #region Logger

                // ログを出力する
                if ((now - this.lastLoggingDateTime).TotalMinutes >= 30.0d)
                {
                    var message = string.Empty;

                    message += "MaxMP " + player.MaxMP.ToString("N0") + Environment.NewLine;
                    message += "通常回復       : " + mpRecoveryAmounts[0].ToString("N0") + Environment.NewLine;
                    message += "通常回復+UB1   : " + mpRecoveryAmounts[1].ToString("N0") + Environment.NewLine;
                    message += "通常回復+UB2   : " + mpRecoveryAmounts[2].ToString("N0") + Environment.NewLine;
                    message += "通常回復+UB3   : " + mpRecoveryAmounts[3].ToString("N0") + Environment.NewLine;
                    message += "戦闘時回復     : " + mpRecoveryAmounts[4].ToString("N0") + Environment.NewLine;
                    message += "戦闘時回復+UB1 : " + mpRecoveryAmounts[5].ToString("N0") + Environment.NewLine;
                    message += "戦闘時回復+UB2 : " + mpRecoveryAmounts[6].ToString("N0") + Environment.NewLine;
                    message += "戦闘時回復+UB3 : " + mpRecoveryAmounts[7].ToString("N0") + Environment.NewLine;
                    message += "今回の回復量   : " + (player.CurrentMP - this.PreviousMP).ToString("N0");

                    Trace.WriteLine(message);
                    this.lastLoggingDateTime = now;
                }

                #endregion
            }

            if (this.NextRecoveryDateTime <= DateTime.MinValue)
            {
                this.NextRecoveryDateTime = now.AddSeconds(Constants.MPRecoverySpan);
            }

            // 回復までの残り時間を算出する
            var remain = (this.NextRecoveryDateTime - now).TotalMilliseconds;

            // 回復までの時間が過ぎている?
            if (remain <= 0.0d)
            {
                this.LastRecoveryDateTime = now.AddMilliseconds(remain);
                this.NextRecoveryDateTime = this.LastRecoveryDateTime.AddSeconds(Constants.MPRecoverySpan);

#if DEBUG
                Trace.WriteLine(string.Format("MPRecovery was over. {0:N0}", remain));
#endif
            }

            if (remain < 0d)
            {
                remain = 0d;
            }

            // ViewModelにセットする
            vm.TimeToRecovery = remain;

            // 現在のMPを保存する
            this.PreviousMP = player.CurrentMP;
        }
        /// <summary>
        /// エノキアンタイマー向けにログを分析する
        /// </summary>
        /// <param name="log">ログ</param>
        private void AnalyzeLogLineToEnochian(
            string log)
        {
            if (string.IsNullOrWhiteSpace(log))
            {
                return;
            }

            if (log.Contains("Welcome to") ||
                log.Contains("Willkommen auf"))
            {
                // プレイヤ情報を取得する
                var player = FF14PluginHelper.GetCombatantPlayer();
                if (player != null)
                {
                    this.playerName = player.Name;
                    Trace.WriteLine("Player name is " + this.playerName);
                }
            }

            if (string.IsNullOrWhiteSpace(this.playerName))
            {
                Trace.WriteLine("Player name is empty.");
                return;
            }

            // イニシャル版のプレイヤー名を生成する
            var names      = this.playerName.Split(' ');
            var firstName  = names.Length > 0 ? names[0].Trim() : string.Empty;
            var familyName = names.Length > 1 ? names[1].Trim() : string.Empty;

            var playerNameSaL =
                firstName.Substring(0, 1) + "." +
                " " +
                familyName;

            var playerNameLaS =
                firstName +
                " " +
                familyName.Substring(0, 1) + ".";

            var playerNameSaS =
                firstName.Substring(0, 1) + "." +
                " " +
                familyName.Substring(0, 1) + ".";

            // 各種マッチング用の文字列を生成する
            var machingTextToEnochianOn = new string[]
            {
                this.playerName + "の「エノキアン」",
                playerNameSaL + "の「エノキアン」",
                playerNameLaS + "の「エノキアン」",
                playerNameSaS + "の「エノキアン」",
                "You use Enochian.",
                "Vous utilisez Énochien.",
                "Du setzt Henochisch ein.",
            };

            var machingTextToEnochianOff = new string[]
            {
                this.playerName + "の「エノキアン」が切れた。",
                playerNameSaL + "の「エノキアン」が切れた。",
                playerNameLaS + "の「エノキアン」が切れた。",
                playerNameSaS + "の「エノキアン」が切れた。",
                "You lose the effect of Enochian.",
                "Vous perdez l'effet Énochien.",
                "Du verlierst den Effekt von Henochisch.",
            };

            var machingTextToUmbralIceOn = new string[]
            {
                this.playerName + "に「アンブラルブリザード」の効果。",
                this.playerName + "に「アンブラルブリザードII」の効果。",
                this.playerName + "に「アンブラルブリザードIII」の効果。",
                playerNameSaL + "に「アンブラルブリザード」の効果。",
                playerNameSaL + "に「アンブラルブリザードII」の効果。",
                playerNameSaL + "に「アンブラルブリザードIII」の効果。",
                playerNameLaS + "に「アンブラルブリザード」の効果。",
                playerNameLaS + "に「アンブラルブリザードII」の効果。",
                playerNameLaS + "に「アンブラルブリザードIII」の効果。",
                playerNameSaS + "に「アンブラルブリザード」の効果。",
                playerNameSaS + "に「アンブラルブリザードII」の効果。",
                playerNameSaS + "に「アンブラルブリザードIII」の効果。",
                "You gain the effect of Umbral Ice.",
                "You gain the effect of Umbral Ice II.",
                "You gain the effect of Umbral Ice III.",
                "Vous bénéficiez de l'effet Glace ombrale.",
                "Vous bénéficiez de l'effet Glace ombrale II.",
                "Vous bénéficiez de l'effet Glace ombrale III.",
                "Du erhältst den Effekt von Schatteneis.",
                "Du erhältst den Effekt von Schatteneis II.",
                "Du erhältst den Effekt von Schatteneis III.",
            };

            var machingTextToUmbralIceOff = new string[]
            {
                this.playerName + "の「アンブラルブリザード」が切れた。",
                this.playerName + "の「アンブラルブリザードII」が切れた。",
                this.playerName + "の「アンブラルブリザードIII」が切れた。",
                playerNameSaL + "の「アンブラルブリザード」が切れた。",
                playerNameSaL + "の「アンブラルブリザードII」が切れた。",
                playerNameSaL + "の「アンブラルブリザードIII」が切れた。",
                playerNameLaS + "の「アンブラルブリザード」が切れた。",
                playerNameLaS + "の「アンブラルブリザードII」が切れた。",
                playerNameLaS + "の「アンブラルブリザードIII」が切れた。",
                playerNameSaS + "の「アンブラルブリザード」が切れた。",
                playerNameSaS + "の「アンブラルブリザードII」が切れた。",
                playerNameSaS + "の「アンブラルブリザードIII」が切れた。",
                "You lose the effect of Umbral Ice.",
                "You lose the effect of Umbral Ice II.",
                "You lose the effect of Umbral Ice III.",
                "Vous perdez l'effet Glace ombrale.",
                "Vous perdez l'effet Glace ombrale II.",
                "Vous perdez l'effet Glace ombrale III.",
                "Du verlierst den Effekt von Schatteneis.",
                "Du verlierst den Effekt von Schatteneis II.",
                "Du verlierst den Effekt von Schatteneis III.",
            };

            var machingTextToBlizzard4 = new string[]
            {
                this.playerName + "の「ブリザジャ」",
                playerNameSaL + "の「ブリザジャ」",
                playerNameLaS + "の「ブリザジャ」",
                playerNameSaS + "の「ブリザジャ」",
                "You cast Blizzard IV.",
                "Vous lancez Giga Glace.",
                "Du wirkst Eiska.",
            };

            // エノキアンON?
            foreach (var text in machingTextToEnochianOn)
            {
                if (log.EndsWith(text))
                {
                    this.inEnochian         = true;
                    this.updateEnchianCount = 0;
                    this.UpdateEnochian(log);
                    this.lastRemainingTimeOfEnochian = string.Empty;

                    Trace.WriteLine("Enochian On. -> " + log);
                    return;
                }
            }

            // エノキアンOFF?
            foreach (var text in machingTextToEnochianOff)
            {
                if (log.Contains(text))
                {
                    // エノキアンの更新猶予期間をセットする
                    this.inGraceToUpdate    = true;
                    this.updatedDuringGrace = false;

                    Task.Run(() =>
                    {
                        Thread.Sleep(GraceToUpdateEnochian + Settings.Default.ParameterRefreshRate);

                        // 更新猶予期間中?
                        if (this.inGraceToUpdate)
                        {
                            // 期間中に更新されていない?
                            if (!this.updatedDuringGrace)
                            {
                                this.inEnochian         = false;
                                this.updateEnchianCount = 0;
                                Trace.WriteLine("Enochian Off. -> " + log);
                            }

                            this.inGraceToUpdate = false;
                            return;
                        }

                        this.inEnochian         = false;
                        this.updateEnchianCount = 0;
                        Trace.WriteLine("Enochian Off. -> " + log);
                    });

                    return;
                }
            }

            // アンブラルアイスON?
            foreach (var text in machingTextToUmbralIceOn)
            {
                if (log.Contains(text))
                {
                    this.inUmbralIce = true;

                    Trace.WriteLine("Umbral Ice On. -> " + log);
                    return;
                }
            }

            // アンブラルアイスOFF?
            foreach (var text in machingTextToUmbralIceOff)
            {
                if (log.Contains(text))
                {
                    Task.Run(() =>
                    {
                        Thread.Sleep(GraceToUpdateEnochian + Settings.Default.ParameterRefreshRate);

                        this.inUmbralIce = false;
                        Trace.WriteLine("Umbral Ice Off. -> " + log);
                    });

                    return;
                }
            }

            // ブリザジャ?
            foreach (var text in machingTextToBlizzard4)
            {
                if (log.EndsWith(text))
                {
                    if (this.inEnochian &&
                        this.inUmbralIce)
                    {
                        // 猶予期間中?
                        if (this.inGraceToUpdate)
                        {
                            this.updatedDuringGrace = true;
                        }

                        this.updateEnchianCount++;
                        this.UpdateEnochian(log);
                    }

                    return;
                }
            }
        }
        /// <summary>
        /// エノキアンタイマー向けにログを分析する
        /// </summary>
        /// <param name="log">ログ</param>
        private void AnalyzeLogLineToEnochian(
            string log)
        {
            if (string.IsNullOrWhiteSpace(log))
            {
                return;
            }

            if (log.Contains("Welcome to") ||
                log.Contains("Willkommen auf"))
            {
                // プレイヤ情報を取得する
                var player = FF14PluginHelper.GetCombatantPlayer();
                if (player != null)
                {
                    this.playerName = player.Name;
                    Trace.WriteLine("Player name is " + this.playerName);
                }
            }

            if (string.IsNullOrWhiteSpace(this.playerName))
            {
                Trace.WriteLine("Player name is empty.");
                return;
            }

            // エノキアンON?
            Match m;

            foreach (var text in machingTextToEnochianOn)
            {
                m = Regex.Match(log, text);
                if (m.Success)
                {
                    this.inEnochian = true;
                    this.UpdateEnochian(double.Parse(m.Groups[1].Value), log);
                    this.lastRemainingTimeOfEnochian = string.Empty;

                    Trace.WriteLine("Enochian On. -> " + log);
                    return;
                }
            }

            // エノキアンOFF?
            foreach (var text in machingTextToEnochianOff)
            {
                if (log.Contains(text))
                {
                    // エノキアンの更新猶予期間をセットする
                    this.inGraceToUpdate    = true;
                    this.updatedDuringGrace = false;

                    Task.Run(() =>
                    {
                        Thread.Sleep(GraceToUpdateEnochian + Settings.Default.ParameterRefreshRate);

                        // 更新猶予期間中?
                        if (this.inGraceToUpdate)
                        {
                            // 期間中に更新されていない?
                            if (!this.updatedDuringGrace)
                            {
                                this.inEnochian = false;
                                Trace.WriteLine("Enochian Off. -> " + log);
                            }

                            this.inGraceToUpdate = false;
                            return;
                        }

                        this.inEnochian = false;
                        Trace.WriteLine("Enochian Off. -> " + log);
                    });

                    return;
                }
            }

            // アンブラルアイスON?
            foreach (var text in machingTextToUmbralIceOn)
            {
                if (log.Contains(text))
                {
                    this.inUmbralIce = true;

                    Trace.WriteLine("Umbral Ice On. -> " + log);
                    return;
                }
            }

            // アンブラルアイスOFF?
            foreach (var text in machingTextToUmbralIceOff)
            {
                if (log.Contains(text))
                {
                    Task.Run(() =>
                    {
                        Thread.Sleep(GraceToUpdateEnochian + Settings.Default.ParameterRefreshRate);

                        this.inUmbralIce = false;
                        Trace.WriteLine("Umbral Ice Off. -> " + log);
                    });

                    return;
                }
            }
        }
示例#7
0
        /// <summary>
        /// MP回復スパンを監視する
        /// </summary>
        public void WacthMPRecovery()
        {
            FF14PluginHelper.RefreshPlayer();
            var player = FF14PluginHelper.GetPlayer();

            if (player == null)
            {
                this.ExistPlayer = false;
                return;
            }

            this.ExistPlayer = true;

            // ジョブ指定?
            if (Settings.Default.TargetJobId != 0)
            {
                this.ExistPlayer = player.Job == Settings.Default.TargetJobId;
                if (!this.ExistPlayer)
                {
                    return;
                }
            }

            // 戦闘中のみ稼働させる?
            if (Settings.Default.CountInCombat)
            {
                // MPが満タンになった?
                if (player.CurrentMP > this.PreviousMP &&
                    player.CurrentMP >= player.MaxMP)
                {
                    this.LastMPFullDateTime = DateTime.Now;
                }

                // 現在がMP満タン状態?
                if (player.CurrentMP >= player.MaxMP ||
                    this.PreviousMP < 0)
                {
                    // 前回の満タンから20秒以上経過した?
                    if ((DateTime.Now - this.LastMPFullDateTime).TotalSeconds >=
                        Settings.Default.CountInCombatSpan)
                    {
                        this.InCombat = false;
                    }
                }
                else
                {
                    this.InCombat = true;
                }
            }

            // プレイヤーのステータスを取得する
            var playerStatus = FF14PluginHelper.GetPlayerData();

            var now = DateTime.Now;

            // MPが回復している?
            if (player.CurrentMP > this.PreviousMP)
            {
                // 現在のプレイヤー状態を辞書向けのキーに変換する
                var key = playerStatus.Pie.ToString() + "-" + this.CurrentMPRecoveryStatus.ToString();

                // 今回で満タンではない?
                if (this.PreviousMP > -1 &&
                    player.CurrentMP < player.MaxMP)
                {
                    // 回復量を算出する
                    var mpRecoveryValue = player.CurrentMP - this.PreviousMP;

                    // バラード中ではなくアストラルファイア中でもない?
                    if (!this.BalladEnabled &&
                        this.CurrentMPRecoveryStatus != MPRecoveryStatus.AstralFire)
                    {
                        // 現在の状態の回復量を記録する
                        this.MPRecoveryValueDictionary[key] = mpRecoveryValue;
                    }

                    // 今の状態の回復量の辞書がある?
                    if (this.MPRecoveryValueDictionary.ContainsKey(key))
                    {
                        // アストラファイア中ではない?
                        if (this.CurrentMPRecoveryStatus != MPRecoveryStatus.AstralFire)
                        {
                            // 記録された回復量と今回の回復量が一致する?
                            if (mpRecoveryValue == this.MPRecoveryValueDictionary[key])
                            {
                                this.LastRecoveryDateTime = now;
                                this.NextRecoveryDateTime = this.LastRecoveryDateTime.AddSeconds(3d);
                            }
                        }
                    }
                }
            }

            // 回復までの残り時間を算出する
            var remain = (this.NextRecoveryDateTime - now).TotalMilliseconds;

            // 回復までの時間が過ぎている?
            if (remain <= 0.0d)
            {
                this.LastRecoveryDateTime = now.AddMilliseconds(remain);
                this.NextRecoveryDateTime = this.LastRecoveryDateTime.AddSeconds(3d);
            }

            if (remain < 0d)
            {
                remain = 0d;
            }

            this.TimeOfRecovery = Convert.ToInt32(remain);

            // 回復までの残り時間の割合を算出する
            this.RateOfRecovery = (decimal)(3000 - this.TimeOfRecovery) / 3000m;

            // 現在のMPを保存する
            this.PreviousMP = player.CurrentMP;
        }