/// <summary>
        /// returns the DR level of the given target in given DR Category.
        /// </summary>
        public int GetDrLevel(WoWUnit target, DrCategory category)
        {
            if (target == null || !target.IsValid)
            {
                return(0);
            }
            var level = 0;

            switch (category)
            {
            case DrCategory.Disoriented:
                level = DisorientedTargetsLevel.ContainsKey(target) ? DisorientedTargetsLevel[target] : 0;
                break;

            case DrCategory.Stun:
                level = StunnedTargetsLevel.ContainsKey(target) ? StunnedTargetsLevel[target] : 0;
                break;

            case DrCategory.Root:
                level = RootedTargetsLevel.ContainsKey(target) ? RootedTargetsLevel[target] : 0;
                break;

            case DrCategory.Incapacitate:
                level = IncapacitatedTargetsLevel.ContainsKey(target) ? IncapacitatedTargetsLevel[target] : 0;
                break;

            case DrCategory.Silence:
                level = SilenceTargetsLevel.ContainsKey(target) ? SilenceTargetsLevel[target] : 0;
                break;
            }
            return(level);
        }
        private void AddDr(WoWUnit target, DrCategory category)
        {
            if (target == null || !target.IsValid)
                return;

            switch (category)
            {
                case DrCategory.Disoriented:
                    if (!Instance.DisorientedTargets.ContainsKey(target))
                        Instance.DisorientedTargets.Add(target, Stopwatch.StartNew());
                    else
                    {
                        Instance.DisorientedTargets.Remove(target);
                        Instance.DisorientedTargets.Add(target, Stopwatch.StartNew());
                    }

                    if (!Instance.DisorientedTargetsLevel.ContainsKey(target))
                        Instance.DisorientedTargetsLevel.Add(target, 1);
                    else
                    {
                        var oldDrLevel = Instance.DisorientedTargetsLevel[target];
                        Instance.DisorientedTargetsLevel.Remove(target);
                        Instance.DisorientedTargetsLevel.Add(target, oldDrLevel + 1);
                    }

                    Log.Combat(String.Format("Added {0} on Desorientation DR, Level : {1}",
                        target.SafeName,
                        Instance.DisorientedTargetsLevel[target]));
                    break;
                case DrCategory.Stun:
                    if (!Instance.StunnedTargets.ContainsKey(target))
                        Instance.StunnedTargets.Add(target, Stopwatch.StartNew());
                    else
                    {
                        Instance.StunnedTargets.Remove(target);
                        Instance.StunnedTargets.Add(target, Stopwatch.StartNew());
                    }
                    if (!Instance.StunnedTargetsLevel.ContainsKey(target))
                        Instance.StunnedTargetsLevel.Add(target, 1);
                    else
                    {
                        var oldDrLevel = Instance.StunnedTargetsLevel[target];
                        Instance.StunnedTargetsLevel.Remove(target);
                        Instance.StunnedTargetsLevel.Add(target, oldDrLevel + 1);
                    }

                    Log.Combat(String.Format("Added {0} on Stun DR, Level : {1}",
                        target.SafeName,
                        Instance.StunnedTargetsLevel[target]));
                    break;
                 case DrCategory.Root:
                    if (!Instance.RootedTargets.ContainsKey(target))
                        Instance.RootedTargets.Add(target, Stopwatch.StartNew());
                    else
                    {
                        Instance.RootedTargets.Remove(target);
                        Instance.RootedTargets.Add(target, Stopwatch.StartNew());
                    }
                    if (!Instance.RootedTargetsLevel.ContainsKey(target))
                        Instance.RootedTargetsLevel.Add(target, 1);
                    else
                    {
                        var oldDrLevel = Instance.RootedTargetsLevel[target];
                        Instance.RootedTargetsLevel.Remove(target);
                        Instance.RootedTargetsLevel.Add(target, oldDrLevel + 1);
                    }

                    Log.Combat(String.Format("Added {0} on Root DR, Level : {1}",
                        target.SafeName,
                        Instance.RootedTargetsLevel[target]));
                    break;
                case DrCategory.Incapacitate:
                     if (!Instance.IncapacitatedTargets.ContainsKey(target))
                        Instance.IncapacitatedTargets.Add(target, Stopwatch.StartNew());
                    else
                    {
                        Instance.IncapacitatedTargets.Remove(target);
                        Instance.IncapacitatedTargets.Add(target, Stopwatch.StartNew());
                    }
                    if (!Instance.IncapacitatedTargetsLevel.ContainsKey(target))
                        Instance.IncapacitatedTargetsLevel.Add(target, 1);
                    else
                    {
                        var oldDrLevel = Instance.IncapacitatedTargetsLevel[target];
                        Instance.IncapacitatedTargetsLevel.Remove(target);
                        Instance.IncapacitatedTargetsLevel.Add(target, oldDrLevel + 1);
                    }

                    Log.Combat(String.Format("Added {0} on Incapacitate DR, Level : {1}",
                        target.SafeName,
                        Instance.IncapacitatedTargetsLevel[target]));
                    break;
                case DrCategory.Silence:
                     if (!Instance.SilenceTargets.ContainsKey(target))
                        Instance.SilenceTargets.Add(target, Stopwatch.StartNew());
                    else
                    {
                        Instance.SilenceTargets.Remove(target);
                        Instance.SilenceTargets.Add(target, Stopwatch.StartNew());
                    }
                    if (!Instance.SilenceTargetsLevel.ContainsKey(target))
                        Instance.SilenceTargetsLevel.Add(target, 1);
                    else
                    {
                        var oldDrLevel = Instance.SilenceTargetsLevel[target];
                        Instance.SilenceTargetsLevel.Remove(target);
                        Instance.SilenceTargetsLevel.Add(target, oldDrLevel + 1);
                    }

                    Log.Combat(String.Format("Added {0} on Silence DR, Level : {1}",
                        target.SafeName,
                        Instance.SilenceTargetsLevel[target]));
                    break;
            }
        }
 /// <summary>
 /// returns the DR level of the given target in given DR Category.
 /// </summary>
 public int GetDrLevel(WoWUnit target, DrCategory category )
 {
     if (target == null || !target.IsValid)
         return 0;
     var level = 0;
     switch (category)
     {
         case DrCategory.Disoriented:
             level = DisorientedTargetsLevel.ContainsKey(target) ? DisorientedTargetsLevel[target] : 0;
             break;
         case DrCategory.Stun:
             level = StunnedTargetsLevel.ContainsKey(target) ? StunnedTargetsLevel[target] : 0;
             break;
         case DrCategory.Root:
             level = RootedTargetsLevel.ContainsKey(target) ? RootedTargetsLevel[target] : 0;
             break;
         case DrCategory.Incapacitate:
             level = IncapacitatedTargetsLevel.ContainsKey(target) ? IncapacitatedTargetsLevel[target] : 0;
             break;
         case DrCategory.Silence:
             level = SilenceTargetsLevel.ContainsKey(target) ? SilenceTargetsLevel[target] : 0;
             break;
     }
     return level;
 }
        private void AddDr(WoWUnit target, DrCategory category)
        {
            if (target == null || !target.IsValid)
            {
                return;
            }

            switch (category)
            {
            case DrCategory.Disoriented:
                if (!Instance.DisorientedTargets.ContainsKey(target))
                {
                    Instance.DisorientedTargets.Add(target, Stopwatch.StartNew());
                }
                else
                {
                    Instance.DisorientedTargets.Remove(target);
                    Instance.DisorientedTargets.Add(target, Stopwatch.StartNew());
                }

                if (!Instance.DisorientedTargetsLevel.ContainsKey(target))
                {
                    Instance.DisorientedTargetsLevel.Add(target, 1);
                }
                else
                {
                    var oldDrLevel = Instance.DisorientedTargetsLevel[target];
                    Instance.DisorientedTargetsLevel.Remove(target);
                    Instance.DisorientedTargetsLevel.Add(target, oldDrLevel + 1);
                }

                Log.Combat(String.Format("Added {0} on Desorientation DR, Level : {1}",
                                         target.SafeName,
                                         Instance.DisorientedTargetsLevel[target]));
                break;

            case DrCategory.Stun:
                if (!Instance.StunnedTargets.ContainsKey(target))
                {
                    Instance.StunnedTargets.Add(target, Stopwatch.StartNew());
                }
                else
                {
                    Instance.StunnedTargets.Remove(target);
                    Instance.StunnedTargets.Add(target, Stopwatch.StartNew());
                }
                if (!Instance.StunnedTargetsLevel.ContainsKey(target))
                {
                    Instance.StunnedTargetsLevel.Add(target, 1);
                }
                else
                {
                    var oldDrLevel = Instance.StunnedTargetsLevel[target];
                    Instance.StunnedTargetsLevel.Remove(target);
                    Instance.StunnedTargetsLevel.Add(target, oldDrLevel + 1);
                }

                Log.Combat(String.Format("Added {0} on Stun DR, Level : {1}",
                                         target.SafeName,
                                         Instance.StunnedTargetsLevel[target]));
                break;

            case DrCategory.Root:
                if (!Instance.RootedTargets.ContainsKey(target))
                {
                    Instance.RootedTargets.Add(target, Stopwatch.StartNew());
                }
                else
                {
                    Instance.RootedTargets.Remove(target);
                    Instance.RootedTargets.Add(target, Stopwatch.StartNew());
                }
                if (!Instance.RootedTargetsLevel.ContainsKey(target))
                {
                    Instance.RootedTargetsLevel.Add(target, 1);
                }
                else
                {
                    var oldDrLevel = Instance.RootedTargetsLevel[target];
                    Instance.RootedTargetsLevel.Remove(target);
                    Instance.RootedTargetsLevel.Add(target, oldDrLevel + 1);
                }

                Log.Combat(String.Format("Added {0} on Root DR, Level : {1}",
                                         target.SafeName,
                                         Instance.RootedTargetsLevel[target]));
                break;

            case DrCategory.Incapacitate:
                if (!Instance.IncapacitatedTargets.ContainsKey(target))
                {
                    Instance.IncapacitatedTargets.Add(target, Stopwatch.StartNew());
                }
                else
                {
                    Instance.IncapacitatedTargets.Remove(target);
                    Instance.IncapacitatedTargets.Add(target, Stopwatch.StartNew());
                }
                if (!Instance.IncapacitatedTargetsLevel.ContainsKey(target))
                {
                    Instance.IncapacitatedTargetsLevel.Add(target, 1);
                }
                else
                {
                    var oldDrLevel = Instance.IncapacitatedTargetsLevel[target];
                    Instance.IncapacitatedTargetsLevel.Remove(target);
                    Instance.IncapacitatedTargetsLevel.Add(target, oldDrLevel + 1);
                }

                Log.Combat(String.Format("Added {0} on Incapacitate DR, Level : {1}",
                                         target.SafeName,
                                         Instance.IncapacitatedTargetsLevel[target]));
                break;

            case DrCategory.Silence:
                if (!Instance.SilenceTargets.ContainsKey(target))
                {
                    Instance.SilenceTargets.Add(target, Stopwatch.StartNew());
                }
                else
                {
                    Instance.SilenceTargets.Remove(target);
                    Instance.SilenceTargets.Add(target, Stopwatch.StartNew());
                }
                if (!Instance.SilenceTargetsLevel.ContainsKey(target))
                {
                    Instance.SilenceTargetsLevel.Add(target, 1);
                }
                else
                {
                    var oldDrLevel = Instance.SilenceTargetsLevel[target];
                    Instance.SilenceTargetsLevel.Remove(target);
                    Instance.SilenceTargetsLevel.Add(target, oldDrLevel + 1);
                }

                Log.Combat(String.Format("Added {0} on Silence DR, Level : {1}",
                                         target.SafeName,
                                         Instance.SilenceTargetsLevel[target]));
                break;
            }
        }