static void checkForNewAgro()
        {
            List<uint> diff = null;

            try
            {
                // Check for new entries in the enmity list
                diff = playerEntity.EnmityEntries.Select(x => x.ID).Except(_enmityCached.Select(y => y.ID)).ToList();

                if (diff.Any())
                {
                    // loop through the new enmity entries

                    foreach (uint ID in diff)
                    {
                        ActorEntity currentEntity = null;
                        if (_mobCached.ContainsKey(ID))
                        {
                            currentEntity = _mobCached[ID];
                        }
                        else if (_mobList.ContainsKey(ID))
                        {
                            currentEntity = _mobList[ID];
                        }

                        if (currentEntity != null)
                        {
                            if (currentEntity.IsValid && currentEntity.HPCurrent > 0) // && currentEntity.ClaimedByID != 0 && currentEntity.ClaimedByID < 0xE0000000)
                            {
                                if (!_agroList.Any() && implementationClass == null && learningHelperClass == null)
                                {
                                    // This is the first enmity entry we found. Start the encounter timer.
                                    started = DateTime.Now;
                                }

                                // make sure it's our own copy so it won't mysteriously disappear or change without our knowledge
                                currentEntity = cloneActorEntity(currentEntity);

                                if (_agroList.Any())
                                {
                                    firstAgro = DateTime.Now;
                                }

                                _agroList.Add(currentEntity);
                                endEncounterAt = DateTime.MaxValue;


                                if (implementationClass != null)
                                {
                                    // send the new mobs to the encounter script
                                    try
                                    {
                                        debug("Agroed Mob: " + currentEntity.Name, DBMErrorLevel.Trace);
                                        inController = false;
                                        implementationClass.onMobAgro(currentEntity);
                                        inController = true;
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("onMobAgro", getEngineVsEncounter(implementationClass), e2);
                                        inController = true;
                                    }
                                    try
                                    {
                                        implementationClass.bossCheck(currentEntity);
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("bossCheck", getEngineVsEncounter(implementationClass), e2);
                                    }

                                }
                                else
                                {
                                    if (useTestEncounter)
                                    {
                                        IEncounter inst = (IEncounter)(new TestEncounter());
                                        implementationClass = inst;

                                        setupNewClass(inst);


                                        debug("TestEncounter started", DBMErrorLevel.Trace);
                                        debug("Agroed Mob: " + currentEntity.Name, DBMErrorLevel.Trace);
                                    }
                                    else
                                    {
                                        // No encounter script loaded. Lets see if we have one that matches this mob
                                        Regex rgx = new Regex("[^a-zA-Z0-9 -]");
                                        string mobName = rgx.Replace(currentEntity.Name, "");

                                        string dir = getScriptsDirectory();

                                        checkRecompile(currentEntity.Name);

                                        if (encounters.ContainsKey(mobName))
                                        {
                                            IEncounter inst = findEntryPoint(encounters[mobName]);
                                            implementationClass = inst;

                                            if (implementationClass != null)
                                            {
                                                setupNewClass(inst);

                                                debug("Encounter started (" + dir + @"\" + mobName + ".cs)", DBMErrorLevel.Trace);
                                                debug("Agroed Mob: " + currentEntity.Name, DBMErrorLevel.Trace);

                                                resetLearningHelper();
                                            }
                                            else
                                            {
                                                debug("Couldn't find entry point in class: " + dir + @"\" + mobName + ".cs", DBMErrorLevel.EngineErrors);
                                            }
                                        }
                                    }
                                }


                                if (learningHelperClass != null)
                                {
                                    // send the new mobs to the learning helper
                                    try
                                    {
                                        learningHelperClass.onMobAgro(currentEntity);
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("learningHelper onMobAgro", getEngineVsEncounter(learningHelperClass), e2);
                                    }
                                    try
                                    {
                                        learningHelperClass.bossCheck(currentEntity);
                                    }
                                    catch (Exception e2)
                                    {
                                        debug("learningHelper bossCheck", getEngineVsEncounter(learningHelperClass), e2);
                                    }
                                }
                                else
                                {
                                    refreshIgnoreMobsList();

                                    // Start learning helper for a new encounter
                                    LearningHelper abc = new LearningHelper();
                                    setupNewClass((IEncounter)abc);
                                    learningHelperClass = abc;
                                    debug("LearningHelper started (" + currentEntity.Name + ")", DBMErrorLevel.Trace);
                                }

                            }
                            else
                            {
                                debug("New agro invalid: IsValid: " + currentEntity.IsValid + ", HPCurrent: " + currentEntity.HPCurrent + ", ClaimedByID: " + currentEntity.ClaimedByID, DBMErrorLevel.Notice);
                            }
                        }
                        else
                        {
                            debug("New agro not found (ID: " + ID + ")", DBMErrorLevel.Notice);
                        }
                    }
                }
            }
            catch (Exception e2)
            {
                debug("updateData check for new agro", DBMErrorLevel.EngineErrors, e2);
            }
        }
        private static void resetLearningHelper()
        {
            if (learningHelperClass != null)
            {
                try
                {
                    learningHelperClass.endEncounter();
                    inController = false;
                    learningHelperClass.onEndEncounter();
                    inController = true;
                }
                catch (Exception e2)
                {
                    inController = true;
                    debug("learningHelper processChatLine", getEngineVsEncounter(learningHelperClass), e2);
                }
                learningHelperClass = null;
            }

            try
            {
                refreshIgnoreMobsList();

                // Start learning helper for a new encounter
                LearningHelper abc = new LearningHelper();
                setupNewClass((IEncounter)abc);
                learningHelperClass = abc;
                debug("LearningHelper started", DBMErrorLevel.Trace);
            }
            catch (Exception e2)
            {
                debug("learningHelper setupNewClass", getEngineVsEncounter(learningHelperClass), e2);
            }
        }