Beispiel #1
0
        public static void Process(LineData lineData)
        {
            string line = lineData.Line;

            try
            {
                var actionPart  = line.Substring(LineParsing.ACTIONINDEX);
                var timeString  = line.Substring(1, 24);
                var currentTime = DateUtil.ParseDate(timeString);

                // handle Slain queue
                if (!double.IsNaN(SlainTime) && currentTime > SlainTime)
                {
                    SlainQueue.ForEach(slain =>
                    {
                        if (!DataManager.Instance.RemoveActiveFight(slain) && char.IsUpper(slain[0]))
                        {
                            DataManager.Instance.RemoveActiveFight(char.ToLower(slain[0], CultureInfo.CurrentCulture) + slain.Substring(1));
                        }
                    });

                    SlainQueue.Clear();
                    SlainTime = double.NaN;
                }

                int index;
                if (line.Length >= 40 && line.IndexOf(" damage", LineParsing.ACTIONINDEX + 13, StringComparison.Ordinal) > -1)
                {
                    DamageRecord record = ParseDamage(actionPart);
                    if (record != null)
                    {
                        DamageProcessedEvent e = new DamageProcessedEvent()
                        {
                            Record = record, OrigTimeString = timeString, BeginTime = currentTime
                        };
                        EventsDamageProcessed?.Invoke(record, e);

                        if (record.Type == Labels.DD)
                        {
                            if (SpecialCodes.Keys.FirstOrDefault(special => !string.IsNullOrEmpty(record.SubType) && record.SubType.Contains(special)) is string key && !string.IsNullOrEmpty(key))
                            {
                                DataManager.Instance.AddSpecial(new SpecialSpell()
                                {
                                    Code = SpecialCodes[key], Player = record.Attacker, BeginTime = currentTime
                                });
                            }
                        }
                    }
                }
                else if (line.Length >= 49 && (index = line.IndexOf(", but miss", LineParsing.ACTIONINDEX + 22, StringComparison.Ordinal)) > -1)
                {
                    DamageRecord record = ParseMiss(actionPart, index);
                    if (record != null)
                    {
                        DamageProcessedEvent e = new DamageProcessedEvent()
                        {
                            Record = record, OrigTimeString = timeString, BeginTime = currentTime
                        };
                        EventsDamageProcessed?.Invoke(record, e);
                    }
                }
                else if (line.Length > 30 && line.Length < 102 && (index = line.IndexOf(" slain ", LineParsing.ACTIONINDEX, StringComparison.Ordinal)) > -1)
                {
                    HandleSlain(actionPart, currentTime, index - LineParsing.ACTIONINDEX);
                }
                else if (line.Length >= 40 && line.Length < 110 && (index = line.IndexOf(" resisted your ", LineParsing.ACTIONINDEX, StringComparison.Ordinal)) > -1)
                {
                    var optionalIndex = index - LineParsing.ACTIONINDEX;

                    // [Mon Feb 11 20:00:28 2019] An inferno flare resisted your Frostreave Strike III!
                    string defender = actionPart.Substring(0, optionalIndex);
                    string spell    = actionPart.Substring(optionalIndex + 15, actionPart.Length - optionalIndex - 15 - 1);

                    DataManager.Instance.AddResistRecord(new ResistRecord()
                    {
                        Spell = spell
                    }, currentTime);
                }
            }
            catch (ArgumentNullException ne)
            {
                LOG.Error(ne);
            }
            catch (NullReferenceException nr)
            {
                LOG.Error(nr);
            }
            catch (ArgumentOutOfRangeException aor)
            {
                LOG.Error(aor);
            }
            catch (ArgumentException ae)
            {
                LOG.Error(ae);
            }
        }
Beispiel #2
0
        public static void Process(LineData lineData)
        {
            string line = lineData.Line;

            try
            {
                var actionPart  = line.Substring(LineParsing.ACTIONINDEX);
                var timeString  = line.Substring(1, 24);
                var currentTime = DateUtil.ParseDate(timeString);

                // handle Slain queue
                if (!double.IsNaN(SlainTime) && currentTime > SlainTime)
                {
                    SlainQueue.ForEach(slain =>
                    {
                        if (!DataManager.Instance.RemoveActiveFight(slain) && char.IsUpper(slain[0]))
                        {
                            DataManager.Instance.RemoveActiveFight(char.ToLower(slain[0], CultureInfo.CurrentCulture) + slain.Substring(1));
                        }
                    });

                    SlainQueue.Clear();
                    SlainTime = double.NaN;
                }

                int index;
                if (line.Length >= 40 && line.IndexOf(" damage", LineParsing.ACTIONINDEX + 13, StringComparison.Ordinal) > -1)
                {
                    DamageRecord record = ParseDamage(actionPart);
                    if (record != null)
                    {
                        DamageProcessedEvent e = new DamageProcessedEvent()
                        {
                            Record = record, OrigTimeString = timeString, BeginTime = currentTime
                        };
                        EventsDamageProcessed?.Invoke(record, e);

                        if (record.Type == Labels.DD)
                        {
                            if (SpecialCodes.Keys.FirstOrDefault(special => !string.IsNullOrEmpty(record.SubType) && record.SubType.Contains(special)) is string key && !string.IsNullOrEmpty(key))
                            {
                                DataManager.Instance.AddSpecial(new SpecialSpell()
                                {
                                    Code = SpecialCodes[key], Player = record.Attacker, BeginTime = currentTime
                                });
                            }
                        }
                    }
                }
                else if (line.Length >= 49 && (index = line.IndexOf(", but miss", LineParsing.ACTIONINDEX + 22, StringComparison.Ordinal)) > -1)
                {
                    DamageRecord record = ParseMiss(actionPart, index);
                    if (record != null)
                    {
                        DamageProcessedEvent e = new DamageProcessedEvent()
                        {
                            Record = record, OrigTimeString = timeString, BeginTime = currentTime
                        };
                        EventsDamageProcessed?.Invoke(record, e);
                    }
                }
                else if (line.Length > 35 && line.EndsWith(" died.", StringComparison.Ordinal))
                {
                    var test = line.Substring(LineParsing.ACTIONINDEX, line.Length - LineParsing.ACTIONINDEX - 6);
                    if (!SlainQueue.Contains(test) && DataManager.Instance.GetFight(test) != null)
                    {
                        SlainQueue.Add(test);
                        SlainTime = currentTime;
                    }

                    if (test == "You")
                    {
                        test = ConfigUtil.PlayerName;
                        DataManager.Instance.ClearActiveAdps();
                    }

                    var death = new DeathRecord()
                    {
                        Killed = string.Intern(test), Killer = ""
                    };
                    DataManager.Instance.AddDeathRecord(death, currentTime);
                }
                else if (line.Length > 30 && line.Length < 102 && (index = line.IndexOf(" slain ", LineParsing.ACTIONINDEX, StringComparison.Ordinal)) > -1)
                {
                    HandleSlain(actionPart, currentTime, index - LineParsing.ACTIONINDEX);
                }
            }
#pragma warning disable CA1031 // Do not catch general exception types
            catch (Exception e)
#pragma warning restore CA1031 // Do not catch general exception types
            {
                if (e is ArgumentNullException || e is NullReferenceException || e is ArgumentOutOfRangeException || e is ArgumentException)
                {
                    LOG.Error(e);
                }
            }
        }
        private static bool CreateDamageRecord(LineData lineData, string[] split, int stop, string attacker, string defender,
                                               uint damage, string type, string subType, SpellResist resist = SpellResist.UNDEFINED, bool attackerIsSpell = false)
        {
            bool success = false;

            if (damage != uint.MaxValue && !string.IsNullOrEmpty(type) && !string.IsNullOrEmpty(subType) && !InIgnoreList(defender))
            {
                // Needed to replace 'You' and 'you', etc
                defender = PlayerManager.Instance.ReplacePlayer(defender, defender);

                if (string.IsNullOrEmpty(attacker))
                {
                    attacker = subType;
                }
                else if (attacker.EndsWith("'s corpse", StringComparison.Ordinal))
                {
                    attacker = attacker.Substring(0, attacker.Length - 9);
                }
                else
                {
                    // Needed to replace 'You' and 'you', etc
                    attacker = PlayerManager.Instance.ReplacePlayer(attacker, attacker);
                }

                if (resist != SpellResist.UNDEFINED && ConfigUtil.PlayerName == attacker && defender != attacker)
                {
                    DataManager.Instance.UpdateNpcSpellResistStats(defender, resist);
                }

                // check for pets
                HasOwner(attacker, out string attackerOwner);
                HasOwner(defender, out string defenderOwner);

                DamageRecord record = new DamageRecord
                {
                    Attacker      = string.Intern(FixName(attacker)),
                    Defender      = string.Intern(FixName(defender)),
                    Type          = string.Intern(type),
                    SubType       = string.Intern(subType),
                    Total         = damage,
                    AttackerOwner = attackerOwner != null?string.Intern(attackerOwner) : null,
                                        DefenderOwner = defenderOwner != null?string.Intern(defenderOwner) : null,
                                                            ModifiersMask   = -1,
                                                            AttackerIsSpell = attackerIsSpell
                };

                var currentTime = DateUtil.ParseLogDate(lineData.Line, out string timeString);

                if (split.Length > stop + 1)
                {
                    // improve this later so maybe the string doesn't have to be re-joined
                    string modifiers = string.Join(" ", split, stop + 1, split.Length - stop - 1);
                    record.ModifiersMask = LineModifiersParser.Parse(record.Attacker, modifiers.Substring(1, modifiers.Length - 2), currentTime);
                }

                if (!double.IsNaN(currentTime))
                {
                    // handle old style crits for eqemu
                    if (LastCrit != null && LastCrit.Attacker == record.Attacker && LastCrit.LineData.LineNumber == (lineData.LineNumber - 1))
                    {
                        var critTime = DateUtil.ParseLogDate(LastCrit.LineData.Line, out string _);
                        if (!double.IsNaN(critTime) && (currentTime - critTime) <= 1)
                        {
                            record.ModifiersMask = (record.ModifiersMask == -1) ? LineModifiersParser.CRIT : record.ModifiersMask | LineModifiersParser.CRIT;
                        }

                        LastCrit = null;
                    }

                    CheckSlainQueue(currentTime);

                    DamageProcessedEvent e = new DamageProcessedEvent()
                    {
                        Record = record, OrigTimeString = timeString, BeginTime = currentTime
                    };
                    EventsDamageProcessed?.Invoke(record, e);
                    success = true;

                    if (record.Type == Labels.DD && SpecialCodes.Keys.FirstOrDefault(special => !string.IsNullOrEmpty(record.SubType) && record.SubType.Contains(special)) is string key &&
                        !string.IsNullOrEmpty(key))
                    {
                        DataManager.Instance.AddSpecial(new SpecialSpell()
                        {
                            Code = SpecialCodes[key], Player = record.Attacker, BeginTime = currentTime
                        });
                    }
                }
            }

            return(success);
        }