public static void OnCharacterSelect(GameClient client, ClientHeroSelectPacket packet)
        {
            // Get the hero the user wanted
            var hero = client.Account.Heroes.FirstOrDefault(x => x.Id == packet.HeroId);

            if (hero == null)
            {
                var response = new ServerHeroSelectResponsePacket(HeroStatus.Invalid);
                client.Send(response);
            }
            else
            {
                client.SelectedHero = hero; //TODO: remove and use gameobject hero

                var response = new ServerHeroSelectResponsePacket(HeroStatus.OK);
                client.Send(response);

                var zone = ZoneManager.Current.FindZone(hero.ZoneName);

                zone.OnClientEnter(client, hero);
            }
        }
        public static void OnCharacterSelect(GameClient client, ClientHeroSelectPacket packet)
        {
            // Ensure this is a valid action
            bool actionCanBePerformed = client.Account.IsOnline && client.HeroEntity == null;

            if (!actionCanBePerformed)
                return;

            // Get the hero the user wanted
            UserHero hero = client.Account.Heroes.FirstOrDefault();

            if (hero == null)
            {
                var response = new ServerHeroSelectResponsePacket(HeroStatus.Invalid);
                client.Send(response);
            }
            else
            {

                using (var context = new GameDatabaseContext())
                {
                    context.Characters.Attach(hero);
                    context.Entry(hero).Collection(a => a.Skills).Load();
                    context.Entry(hero).Collection(a => a.Inventory).Load();
                    context.Entry(hero).Collection(a => a.QuestInfo).Load();
                    context.Entry(hero).Collection(a => a.Flags).Load();

                    // Load up our set of requirements from the table
                    foreach (var x in hero.QuestInfo)
                        context.Entry(x).Collection(a => a.RequirementProgress).Load();

                    context.Entry(hero).Collection(a => a.Equipment).Load();
                }

                // Create an object and assign it the world if everything is okay
                var heroObject = GameObjectFactory.CreateHero(hero, client);
                client.HeroEntity = heroObject;

                var zone = ZoneManager.Instance.FindZone(hero.ZoneId);

                if (zone != null)
                {
                    // Create a response and alert the client that their selection is okay
                    var response = new ServerHeroSelectResponsePacket(HeroStatus.OK);
                    client.Send(response);

                    // Here, we should queue the player for login

                    Logger.Instance.Info("{0} has entered the game.", hero.Name);
                    zone.QueueLogin(heroObject);

                    // Add to global manager
                    ChatManager.Current.Global.Join(client);

                }
                else
                {
                    var response = new ServerHeroSelectResponsePacket(HeroStatus.Unavailable);
                    client.Send(response);

                    Logger.Instance.Error("{0} attempted to enter the game but could not be loaded.", hero.Name);
                }

            }
        }