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; } }