public override void OnTerminate()
        {
            foreach (string ev in EventSubscription)
                Manager.Events.Remove(ev, HandleFishingEvents);

            CurrentState = FishingState.Lure;
            Fishing = null;
            Print("Fishing season is over! You did however catch {0} fishes.", Fishes);
        }
        public override void OnTick()
        {
            if (!Manager.ObjectManager.IsInGame)
                return;

            if ((DateTime.Now - SleepTimer).TotalMilliseconds < 200)
                return;
            SleepTimer = DateTime.Now;

            switch (CurrentState)
            {
                case FishingState.Lure:
                    //if (!HasBait)
                    //{
                    //    // Implement applying lure
                    //}
                    ProfessionInfo fish = API.Profession.Fishing;
                    if (fish != null)
                    {
                        if (fish.Level >= (fish.MaxLevel - 25) && fish.MaxLevel < 450)
                        {
                            CurrentState = FishingState.Training;
                            return;
                        }
                    }
                    CurrentState = FishingState.Cast;
                    break;

                case FishingState.Cast:
                    Print("Casting Fishing Pole");
                    Fishing.Cast();
                    CurrentState = FishingState.Fishing;
                    break;

                case FishingState.Fishing:
                    if (IsFishing)
                    {
                        if (IsBobbing)
                            CurrentState = FishingState.Loot;
                    }
                    else
                        CurrentState = FishingState.Lure;
                    break;

                case FishingState.Loot:
                    Print("Getting Fishing Bobber");
                    Bobber.Interact();
                    LootTimer = DateTime.Now;
                    CurrentState = FishingState.Looting;
                    break;

                case FishingState.Looting:
                    TimeSpan span = DateTime.Now - LootTimer;
                    if (span.TotalSeconds > 3)
                    {
                        Print("No loot? Back to fishing then!");
                        CurrentState = FishingState.Lure;
                    }
                    break;

                    // TODO: Clean up, add dynamic fishing trainer locator.
                case FishingState.Training:
                    if (Trainer == null || !Trainer.IsValid)
                    {
                        // Marcia Chase, Dalaran - Neutral.
                        Trainer =
                            Manager.ObjectManager.Objects.Where(x => x.IsValid && x.IsUnit)
                                .OfType<WoWUnit>()
                                .FirstOrDefault(u => u.Entry == 28742);
                        return;
                    }

                    if (Trainer.Distance > 6f)
                    {
                        if (Manager.Movement.Destination == Trainer.Location)
                            Sleep(100);
                        Manager.Movement.PathTo(Trainer.Location);
                        return;
                    }

                    if (!API.Gossip.IsShown && !API.Trainer.IsShown)
                    {
                        Trainer.Interact();
                        return;
                    }

                    if (API.Gossip.IsShown)
                    {
                        GossipOption opt = API.Gossip.Options.FirstOrDefault(g => g.Gossip == GossipType.Trainer);
                        if (opt != null)
                            opt.Select();
                        return;
                    }

                    if (API.Trainer.IsShown)
                    {
                        API.Trainer.BuyAllAvailable();
                        Fishing = null;
                        Manager.Spellbook.Update = true;
                        CurrentState = FishingState.Lure;
                        return;
                    }

                    CurrentState = FishingState.Lure;

                    break;
            }
        }
        public override void OnStart()
        {
            if (!Manager.ObjectManager.IsInGame)
                return;

            Manager.Spellbook.Update = true;
            CurrentState = FishingState.Lure;
            Fishes = 0;
            Fishing = Manager.Spellbook["Fishing"];
            if (Fishing == null || !Fishing.IsValid)
            {
                Print("You don't know fishing!");
                Stop();
            }

            foreach (string ev in EventSubscription)
                Manager.Events.Register(ev, HandleFishingEvents);
        }