private static void HandleCombatLogTH(object sender, LuaEventArgs args) { var e = new CombatLogEventArgs(args.EventName, args.FireTimeStamp, args.Args); if (e.DestUnit == null || e.Event != "SPELL_AURA_REFRESH" && e.Event != "SPELL_AURA_APPLIED" || !IsEnemy(e.DestUnit) || !DisorientsHS.Contains(e.SpellId) && !ControlStunHS.Contains(e.SpellId)) { return; } if (DisorientsHS.Contains(e.SpellId)) { DisorientsAdd(e.DestUnit); //Logging.Write(DateTime.Now.ToString("ss:fff") + " " + // e.DestName + // " got DisorientsHS " // + e.SpellName); } if (ControlStunHS.Contains(e.SpellId)) { ControlStunAdd(e.DestUnit); //Logging.Write(DateTime.Now.ToString("ss:fff") + " " + // e.DestName + // " got ControlStunHS " // + e.SpellName); } //Logging.Write("[CombatLogAll] " + e.Event + " - " + e.SourceName + " - " + e.SpellName); //switch (e.Event) //{ // //default: // // Logging.Write("[CombatLog] filter out this event - " + e.Event + " - " + e.SourceName + " - " + // // e.SpellName); // // break; // case "SPELL_AURA_APPLIED": // Logging.Write(e.DestName + " got SPELL_AURA_APPLIED " + e.SpellName); // break; // //case "SPELL_AURA_REFRESH": // // Logging.Write(e.SourceUnit.Name + " got SPELL_AURA_REFRESH " + e.SpellName); // // break; // //case "SPELL_AURA_REMOVED": // // Logging.Write(e.SourceUnit.Name + " got SPELL_AURA_REFRESH " + e.SpellName); // // break; //} }
private static void HandleEvadeBuggedMob(LuaEventArgs args, CombatLogEventArgs e) { WoWUnit unit = e.DestUnit; ulong guid = e.DestGuid; if (unit == null && StyxWoW.Me.CurrentTarget != null) { unit = StyxWoW.Me.CurrentTarget; guid = StyxWoW.Me.CurrentTargetGuid; Logging.Write("Evade: bugged mob guid:{0}, so assuming current target instead", args.Args[7]); } if (unit != null) { if (!MobsThatEvaded.ContainsKey(unit.Guid)) { MobsThatEvaded.Add(unit.Guid, 0); } MobsThatEvaded[unit.Guid]++; if (MobsThatEvaded[unit.Guid] <= 5) { Logging.Write("Mob {0} has evaded {1} times. Keeping an eye on {2:X0} for now!", unit.Name, MobsThatEvaded[unit.Guid], unit.Guid); } else { const int secondsToBlacklist = 10; if (Blacklist.Contains(unit.Guid, BlacklistFlags.Combat)) { Logging.Write(Colors.LightGoldenrodYellow, "Mob {0} has evaded {1} times. Previously blacklisted {2:X0} for {3} seconds!", unit.Name, MobsThatEvaded[unit.Guid], unit.Guid, secondsToBlacklist); } else { Logging.Write(Colors.LightGoldenrodYellow, "Mob {0} has evaded {1} times. Blacklisting {2:X0} for {3} seconds!", unit.Name, MobsThatEvaded[unit.Guid], unit.Guid, secondsToBlacklist); Blacklist.Add(unit.Guid, BlacklistFlags.Combat, TimeSpan.FromSeconds(secondsToBlacklist)); if (!Blacklist.Contains(unit.Guid, BlacklistFlags.Combat)) { Logging.Write(Colors.Pink, "error: blacklist does not contain entry for {0} so adding {1}", unit.Name, unit.Guid); } } if (BotPoi.Current.Guid == unit.Guid) { Logging.Write("EvadeHandling: Current BotPOI type={0} is Evading, clearing now...", BotPoi.Current.Type); BotPoi.Clear("Singular recognized Evade bugged mob"); } if (StyxWoW.Me.CurrentTargetGuid == guid) { foreach (var target in Targeting.Instance.TargetList) { if (target.IsAlive && Classname.ValidUnit(target) && !Blacklist.Contains(target, BlacklistFlags.Combat)) { Logging.Write(Colors.Pink, "Setting target to {0} to get off evade bugged mob!", target.Name); target.Target(); return; } } Logging.Write(Colors.Pink, "BotBase has 0 entries in Target list not blacklisted -- nothing else we can do at this point!"); // StyxWoW.Me.ClearTarget(); } } } /// line below was originally in Evade logic, but commenting to avoid Sleeps // StyxWoW.SleepForLagDuration(); }
private static void HandleCombatLog(object sender, LuaEventArgs args) { var e = new CombatLogEventArgs(args.EventName, args.FireTimeStamp, args.Args); if (e.SourceGuid != StyxWoW.Me.Guid) { return; } //Logging.Write("[CombatLog] " + e.Event + " - " + e.SourceName + " - " + e.Spell.Name); switch (e.Event) { default: Logging.Write("[CombatLog] filter out this event -- " + e.Event + " - " + e.SourceName + " - " + e.Spell.Name); break; // spell_cast_failed only passes filter in Singular debug mode case "SPELL_CAST_FAILED": CastFailReason = e.Args[14].ToString(); if (CastFailReason != "Your target is dead" && CastFailReason != "No target" && CastFailReason != "Not yet recovered") { Logging.Write(LogLevel.Diagnostic, "[CombatLog] {0} {1}#{2} failure: '{3}'", e.Event, e.Spell.Name, e.SpellId, CastFailReason); } if (CastFailReason != LocalizedAnotheractionisinprogress) { Classname.CastFailed = true; } //if (e.Args[14].ToString() == LocalizedLineOfSightError) //{ // LastLineOfSightError = DateTime.Now; // Logging.Write("[CombatLog] cast fail due to los reported at {0}", // LastLineOfSightError.ToString("HH:mm:ss.fff")); //} //else if (StyxWoW.Me.Class == WoWClass.Druid && SingularRoutine.IsQuestBotActive) //{ // if (LocalizedShapeshiftErrors.Contains(e.Args[14].ToString())) // { // LastShapeshiftError = DateTime.Now; // Logging.Write( // "[CombatLog] cast fail due to shapeshift error while questing reported at {0}", // LastShapeshiftError.ToString("HH:mm:ss.fff")); // } //} break; //case "SPELL_AURA_APPLIED": // Classname.LastCastSpell = e.SpellName; // Classname.LastCastTime = DateTime.Now; // // break; //case "SPELL_CAST_START": // Classname.LastCastSpell = e.SpellName; // Classname.LastCastTime = DateTime.Now; // break; //case "SPELL_CAST_SUCCESS": // Classname.LastCastSpell = e.SpellName; // Classname.LastCastTime = DateTime.Now; // Update the last spell we cast. So certain classes can 'switch' their logic around. //Spell.LastSpellCast = e.SpellName; //Logging.Write("Successfully cast " + Spell.LastSpellCast); // following commented block should not be needed since rewrite of Pet summon // //// Force a wait for all summoned minions. This prevents double-casting it. //if (StyxWoW.Me.Class == WoWClass.Warlock && e.SpellName.StartsWith("Summon ")) //{ // StyxWoW.SleepForLagDuration(); //} //break; case "SWING_MISSED": if (e.Args[11].ToString() == "EVADE") { HandleEvadeBuggedMob(args, e); } else if (e.Args[11].ToString() == "IMMUNE") { WoWUnit unit = e.DestUnit; if (unit != null && !unit.IsPlayer) { Logging.Write("{0} is immune to Physical spell school", unit.Name); } } break; case "SPELL_MISSED": case "RANGE_MISSED": // Why log misses? Because users of classes with DoTs testing on training dummies // .. that they don't have enough +Hit for will get DoT spam. This allows easy // .. diagnosis of false reports of rotation issues where a user simply isn't geared // .. this happens more at the beginning of an expansion especially Logging.Write( "[CombatLog] {0} {1}#{2} {3}", e.Event, e.Spell.Name, e.SpellId, e.Args[14] ); if (e.Args[14].ToString() == "EVADE") { HandleEvadeBuggedMob(args, e); } else if (e.Args[14].ToString() == "IMMUNE") { WoWUnit unit = e.DestUnit; if (unit != null && !unit.IsPlayer) { Logging.Write("{0} is immune to {1} spell school", unit.Name, e.SpellSchool); } } break; } }