public void OnCreatePlayer(IClusterClient client, CreatePlayerPacket packet) { DbUser dbUser = _database.Users.FirstOrDefault(x => x.Username == packet.Username && x.Password == packet.Password); if (dbUser == null) { _logger.LogWarning($"[SECURITY] Unable to create new character for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " + "Reason: bad presented credentials compared to the database."); client.Disconnect(); return; } if (_database.Characters.Any(x => x.Name == packet.CharacterName)) { _logger.LogWarning( $"Unable to create new character for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " + $"Reason: character name '{packet.CharacterName}' already exists."); _clusterPacketFactory.SendClusterError(client, ErrorType.USER_EXISTS); return; } DefaultCharacter defaultCharacter = _clusterServer.ClusterConfiguration.DefaultCharacter; DefaultStartItems defaultEquipment = packet.Gender == 0 ? defaultCharacter.Man : defaultCharacter.Woman; if (!_gameResources.Jobs.TryGetValue(packet.Job, out JobData jobData)) { _logger.LogError($"Cannot find job data for job '{packet.Job}' for user '{dbUser.Username}'."); client.Disconnect(); return; } var newCharacter = new DbCharacter() { UserId = dbUser.Id, Name = packet.CharacterName, Slot = (byte)packet.Slot, SkinSetId = packet.SkinSet, HairColor = (int)packet.HairColor, FaceId = packet.HeadMesh, HairId = packet.HairMeshId, BankCode = packet.BankPassword, Gender = packet.Gender, JobId = (int)packet.Job, Hp = HealthFormulas.GetMaxOriginHp(defaultCharacter.Level, defaultCharacter.Stamina, jobData.MaxHpFactor), Mp = HealthFormulas.GetMaxOriginMp(defaultCharacter.Level, defaultCharacter.Intelligence, jobData.MaxMpFactor, true), Fp = HealthFormulas.GetMaxOriginFp(defaultCharacter.Level, defaultCharacter.Stamina, defaultCharacter.Dexterity, defaultCharacter.Strength, jobData.MaxFpFactor, true), Strength = defaultCharacter.Strength, Stamina = defaultCharacter.Stamina, Dexterity = defaultCharacter.Dexterity, Intelligence = defaultCharacter.Intelligence, MapId = defaultCharacter.MapId, PosX = defaultCharacter.PosX, PosY = defaultCharacter.PosY, PosZ = defaultCharacter.PosZ, Level = defaultCharacter.Level, Gold = defaultCharacter.Gold, StatPoints = 0, //TODO: create default stat point constant. SkillPoints = 0, //TODO: create default skill point constant. Experience = 0, }; //TODO: create game constants for slot. newCharacter.Items.Add(new DbItem(defaultEquipment.StartSuit, 44)); newCharacter.Items.Add(new DbItem(defaultEquipment.StartHand, 46)); newCharacter.Items.Add(new DbItem(defaultEquipment.StartShoes, 47)); newCharacter.Items.Add(new DbItem(defaultEquipment.StartWeapon, 52)); _database.Characters.Add(newCharacter); _database.SaveChanges(); _logger.LogInformation($"Character '{newCharacter.Name}' has been created successfully for user '{dbUser.Username}' from {client.Socket.RemoteEndPoint}."); IEnumerable <DbCharacter> dbCharacters = GetCharacters(dbUser.Id); _clusterPacketFactory.SendPlayerList(client, packet.AuthenticationKey, dbCharacters); }
public static void OnCreatePlayer(ClusterClient client, INetPacketStream packet) { var pak = new CreatePlayerPacket(packet); var clusterConfiguration = DependencyContainer.Instance.Resolve <ClusterConfiguration>(); var jobs = DependencyContainer.Instance.Resolve <JobLoader>(); DbUser dbUser = null; DbCharacter dbCharacter = null; using (var database = DependencyContainer.Instance.Resolve <IDatabase>()) { dbUser = database.Users.Get(x => x.Username.Equals(pak.Username, StringComparison.OrdinalIgnoreCase) && x.Password.Equals(pak.Password, StringComparison.OrdinalIgnoreCase)); // Check if user exist and with good password in database. if (dbUser == null) { Logger.LogWarning( $"[SECURITY] Unable to create new character for user '{pak.Username}' from {client.RemoteEndPoint}. " + "Reason: bad presented credentials compared to the database."); client.Disconnect(); return; } dbCharacter = database.Characters.Get(x => x.Name == pak.Name); // Check if character name is not already used. if (dbCharacter != null) { Logger.LogWarning( $"Unable to create new character for user '{pak.Username}' from {client.RemoteEndPoint}. " + $"Reason: character name '{pak.Name}' already exists."); ClusterPacketFactory.SendError(client, ErrorType.USER_EXISTS); return; } DefaultCharacter defaultCharacter = clusterConfiguration.DefaultCharacter; DefaultStartItems defaultEquipment = pak.Gender == 0 ? defaultCharacter.Man : defaultCharacter.Woman; JobData jobData = jobs[pak.Job]; dbCharacter = new DbCharacter() { UserId = dbUser.Id, Name = pak.Name, Slot = pak.Slot, SkinSetId = pak.SkinSet, HairColor = (int)pak.HairColor, FaceId = pak.HeadMesh, HairId = pak.HairMeshId, BankCode = pak.BankPassword, Gender = pak.Gender, ClassId = pak.Job, Hp = HealthFormulas.GetMaxOriginHp(defaultCharacter.Level, defaultCharacter.Stamina, jobData.MaxHpFactor), Mp = HealthFormulas.GetMaxOriginMp(defaultCharacter.Level, defaultCharacter.Intelligence, jobData.MaxMpFactor, true), Fp = HealthFormulas.GetMaxOriginFp(defaultCharacter.Level, defaultCharacter.Stamina, defaultCharacter.Dexterity, defaultCharacter.Strength, jobData.MaxFpFactor, true), Strength = defaultCharacter.Strength, Stamina = defaultCharacter.Stamina, Dexterity = defaultCharacter.Dexterity, Intelligence = defaultCharacter.Intelligence, MapId = defaultCharacter.MapId, PosX = defaultCharacter.PosX, PosY = defaultCharacter.PosY, PosZ = defaultCharacter.PosZ, Level = defaultCharacter.Level, Gold = defaultCharacter.Gold, StatPoints = 0, //TODO: create game constants. SkillPoints = 0, //TODO: create game constants. Experience = 0, }; //TODO: create game constants for slot. dbCharacter.Items.Add(new DbItem(defaultEquipment.StartSuit, 44)); dbCharacter.Items.Add(new DbItem(defaultEquipment.StartHand, 46)); dbCharacter.Items.Add(new DbItem(defaultEquipment.StartShoes, 47)); dbCharacter.Items.Add(new DbItem(defaultEquipment.StartWeapon, 52)); database.Characters.Create(dbCharacter); database.Complete(); } Logger.LogInformation("Character '{0}' has been created successfully for user '{1}' from {2}.", dbCharacter.Name, pak.Username, client.RemoteEndPoint); ClusterPacketFactory.SendPlayerList(client, pak.AuthenticationKey, dbUser.Characters); }