public static void HandleRegister(Client pClient, MsgRegister pMsg)
        {
            Client trash;

            if (pMsg.CancelRequest)
            {
                try
                {
                    pClient.Disconnect();
                }
                catch
                {
                    ServerKernel.Players.TryRemove(pClient.Identity, out trash);
                    ServerKernel.CharacterCreation.TryRemove(pClient.Identity, out trash);
                    ServerKernel.CharacterCreation.TryRemove(pClient.AccountIdentity, out trash);
                }
                return;
            }

            if (ServerKernel.CharacterCreation.TryGetValue(pClient.AccountIdentity, out trash))
            {
                trash = null;

                if (CheckName(pMsg.Name))
                {
                    var pRepository = new CharacterRepository();
                    if (pRepository.AccountHasCharacter(pClient.AccountIdentity))
                    {
                        //DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.AccountHasCharacter);
                        pClient.Send(ServerMessages.CharacterCreation.AccountHasCharacter);
                        return;
                    }
                    if (pRepository.CharacterExists(pMsg.Name))
                    {
                        //DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.NameTaken);
                        pClient.Send(ServerMessages.CharacterCreation.NameTaken);
                        return;
                    }

                    ProfessionType profession = ((ProfessionType)pMsg.Profession > ProfessionType.INTERN_TAOIST
                        ? ProfessionType.INTERN_TAOIST
                        : (ProfessionType)(pMsg.Profession / 10 * 10));
                    if (!Enum.IsDefined(typeof(BodyType), pMsg.Body) ||
                        !Enum.IsDefined(typeof(ProfessionType), profession))
                    {
                        // The client is a proxy exploiting the server. Disconnect the client.
                        DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.AccessDenied);
                        return;
                    }

                    switch (profession)
                    {
                    case ProfessionType.INTERN_ARCHER:
                    case ProfessionType.INTERN_NINJA:
                    case ProfessionType.INTERN_TAOIST:
                    case ProfessionType.INTERN_TROJAN:
                    case ProfessionType.INTERN_WARRIOR:
                    case ProfessionType.INTERN_MONK:
                        break;

                    default:
                    {
                        DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.AccessDenied);
                        return;
                    }
                    }

                    ushort hair     = 410;
                    uint   lookface = 0;
                    if (pMsg.Body == (ushort)BodyType.THIN_MALE || pMsg.Body == (ushort)BodyType.HEAVY_MALE)
                    {
                        if ((pMsg.Profession / 10) == 5)
                        {
                            lookface = (uint)(new Random().Next(103, 107));
                        }
                        else if ((pMsg.Profession / 10) == 6)
                        {
                            lookface = (uint)(new Random().Next(109, 113));
                        }
                        else
                        {
                            lookface = (uint)(new Random().Next(1, 102));
                        }
                    }
                    else
                    {
                        hair = 410;
                        if ((pMsg.Profession / 10) == 5)
                        {
                            lookface = (uint)(new Random().Next(291, 295));
                        }
                        else if ((pMsg.Profession / 10) == 6)
                        {
                            lookface = (uint)(new Random().Next(300, 304));
                        }
                        else
                        {
                            lookface = (uint)(new Random().Next(201, 290));
                        }
                    }

                    #region Initial HairStyle and Lookface for monks
                    switch (profession)
                    {
                    case ProfessionType.INTERN_MONK:
                        if (pMsg.Body == (ushort)BodyType.THIN_MALE)
                        {
                            lookface = (uint)(new Random().Next(109, 113));
                            hair     = 400;
                        }
                        else if (pMsg.Body == (ushort)BodyType.HEAVY_MALE)
                        {
                            lookface = (uint)(new Random().Next(129, 133));
                            hair     = 400;
                        }
                        else if (pMsg.Body == (ushort)BodyType.THIN_FEMALE)
                        {
                            lookface = (uint)(new Random().Next(300, 304));
                        }
                        else if (pMsg.Body == (ushort)BodyType.HEAVY_FEMALE)
                        {
                            lookface = (uint)(new Random().Next(325, 329));
                        }
                        break;
                    }
                    #endregion

                    DbPointAllot points =
                        ServerKernel.PointAllot.Values.FirstOrDefault(
                            x => x.Profession == ((pMsg.Profession - (pMsg.Profession % 10)) / 10) && x.Level == 1);
                    if (points == null)
                    {
                        pClient.Send(new MsgTalk("Could not fetch class attribute points.", ChatTone.CHARACTER_CREATION));
                        return;
                    }

                    int    idx    = new Random().Next(m_startX.Length - 1);
                    ushort startX = m_startX[idx];
                    ushort startY = m_startY[idx];

                    switch (profession)
                    {
                    case ProfessionType.INTERN_TROJAN:
                    case ProfessionType.INTERN_WARRIOR:
                    case ProfessionType.INTERN_ARCHER:
                    case ProfessionType.INTERN_NINJA:
                    case ProfessionType.INTERN_TAOIST:
                    case ProfessionType.INTERN_MONK:
                    {
                        break;
                    }

                    default:
                        DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.AccessDenied);
                        return;
                    }

                    uint money = 100000, emoney = 25;

                    ushort startLife = (ushort)(((points.Agility + points.Strength + points.Spirit) * 3) + points.Vitality * 24);

                    var newUser = new DbUser
                    {
                        AccountId           = pClient.AccountIdentity,
                        Name                = pMsg.Name,
                        Lookface            = pMsg.Body + (lookface * 10000),
                        Profession          = (byte)profession,
                        Mate                = "None",
                        AdditionalPoints    = 0,
                        Agility             = points.Agility,
                        Strength            = points.Strength,
                        Vitality            = points.Vitality,
                        Spirit              = points.Spirit,
                        AutoAllot           = 1,
                        AutoExercise        = 0,
                        BoundEmoney         = 4300,
                        Business            = 255,
                        CoinMoney           = 0,
                        CurrentLayout       = 0,
                        Donation            = 0,
                        Emoney              = emoney,
                        Experience          = 0,
                        Level               = 1,
                        FirstProfession     = 0,
                        Metempsychosis      = 0,
                        Flower              = 0,
                        HomeId              = 0,
                        LastLogin           = 0,
                        LastLogout          = 0,
                        LastProfession      = 0,
                        Life                = startLife,
                        LockKey             = 0,
                        Hair                = hair,
                        Mana                = 0,
                        MapId               = _START_MAP,
                        MapX                = startX,
                        MapY                = startY,
                        MeteLevel           = 0,
                        Money               = money,
                        MoneySaved          = 0,
                        Orchids             = 0,
                        PkPoints            = 0,
                        RedRoses            = 0,
                        StudentPoints       = 0,
                        Tulips              = 0,
                        Virtue              = 0,
                        WhiteRoses          = 0,
                        EnlightPoints       = 0,
                        HeavenBlessing      = (uint)(UnixTimestamp.Timestamp() + 60 * 60 * 24 * 30),
                        ExperienceExpires   = (uint)(UnixTimestamp.Timestamp() + 60 * 60 * 24),
                        ExperienceMultipler = 10
                    };

                    if (pRepository.CreateNewCharacter(newUser))
                    {
                        uint idUser = newUser.Identity;

                        try
                        {
                            GenerateInitialStatus(idUser, profession);
                        }
                        catch
                        {
                            ServerKernel.Log.SaveLog("Could not create initial status for character " + idUser, true, LogType.ERROR);
                        }
                        ServerKernel.Log.SaveLog(string.Format("User [({0}){1}] has created character {2}.",
                                                               pClient.AccountIdentity, idUser, newUser.Name), true);

                        pClient.Send(ServerMessages.CharacterCreation.AnswerOk);
                        return;
                    }
                }
                else
                {
                    //DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.InvalidName);
                    pClient.Send(ServerMessages.CharacterCreation.InvalidName);
                    return;
                }
            }
            else
            {
                DisconnectWithMsg(pClient, ServerMessages.CharacterCreation.AccessDenied);
                return;
            }
        }