Пример #1
0
        public void OnExecute()
        {
            DbUser user = this._database.Users.Get(x => x.Username.Equals(this.Username, StringComparison.OrdinalIgnoreCase));

            if (user == null)
            {
                Console.WriteLine($"Cannot find user with username: '******'.");
            }
            else
            {
                Console.WriteLine("#########################");
                Console.WriteLine("#   User informations   #");
                Console.WriteLine("#########################");
                Console.WriteLine($"Username: {user.Username}");
                Console.WriteLine($"Email: {user.Email}");
                Console.WriteLine($"Authority: {user.Authority.ToString()}");
                Console.WriteLine($"Deleted: {user.IsDeleted}");
                Console.WriteLine($"Last connection: {user.LastConnectionTime.ToString("yyyy/MM/dd HH:mm:ss")}");
                Console.WriteLine($"Play time: {TimeSpan.FromSeconds(user.PlayTime).ToString(@"hh\:mm\:ss")}");
                Console.WriteLine($"Number of characters: {user.Characters.Count}");

                if (user.Characters.Any())
                {
                    for (int i = 0; i < user.Characters.Count; i++)
                    {
                        DbCharacter character = user.Characters.ElementAt(i);

                        Console.WriteLine("-------------------------");
                        Console.WriteLine($"Character name: {character.Name} (id: {character.Id})");
                        Console.WriteLine($"Deleted: {character.IsDeleted}");
                    }
                }
            }
        }
Пример #2
0
 public static DbCharacterFeature ToDbFeature(this Feature feature, DbCharacter dbCharacter)
 {
     var dbClass = dbCharacter.Features.SingleOrDefault(x => x.Feature == (int)feature) ?? new DbCharacterFeature();
     dbClass.Character = dbCharacter;
     dbClass.Feature = (int)feature;
     return dbClass;
 }
Пример #3
0
        public void OnJoin(IWorldClient client, JoinPacket packet)
        {
            DbCharacter character = _database.Characters.Include(x => x.User).FirstOrDefault(x => x.Id == packet.PlayerId);

            if (character == null)
            {
                _logger.LogError($"Invalid player id received from client; cannot find player with id: {packet.PlayerId}");
                return;
            }

            if (character.IsDeleted)
            {
                _logger.LogWarning($"Cannot connect with character '{character.Name}' for user '{character.User.Username}'. Reason: character is deleted.");
                return;
            }

            if (character.User.Authority <= 0)
            {
                _logger.LogWarning($"Cannot connect with '{character.Name}'. Reason: User {character.User.Username} is banned.");
                // TODO: send error to client
                return;
            }

            client.Player            = _playerFactory.CreatePlayer(character);
            client.Player.Connection = client;
            _worldSpawnPacketFactory.SendPlayerSpawn(client.Player);
            client.Player.Object.Spawned        = true;
            client.Player.PlayerData.LoggedInAt = DateTime.UtcNow;
        }
Пример #4
0
 public GuildJoinUserUnit(DbCharacter character)
 {
     Id    = character.Id;
     Level = character.Level;
     Job   = character.Class;
     Name  = character.Name;
 }
Пример #5
0
 public GuildUserUnit(DbCharacter member)
 {
     Id    = member.Id;
     Rank  = member.GuildRank;
     Level = member.Level;
     Job   = member.Class;
     Name  = member.Name;
 }
Пример #6
0
        private static void SendCharacterDetails(WorldClient client, DbCharacter character)
        {
            using var packet = new Packet(PacketType.CHARACTER_DETAILS);
            var bytes = new CharacterDetails(character).Serialize();

            packet.Write(bytes);
            client.SendPacket(packet);
        }
Пример #7
0
 public static DbCharacterSkill ToDbSkill(this KeyValuePair<SkillType, int> skill, DbCharacter dbCharacter)
 {
     var dbClass = dbCharacter.Skills.SingleOrDefault(x => x.Type == (int)skill.Key) ?? new DbCharacterSkill();
     dbClass.Character = dbCharacter;
     dbClass.Ranks = skill.Value;
     dbClass.Type = (int)skill.Key;
     return dbClass;
 }
Пример #8
0
 public StatisticsComponent(DbCharacter character)
 {
     this.Strength     = (ushort)character.Strength;
     this.Stamina      = (ushort)character.Stamina;
     this.Dexterity    = (ushort)character.Dexterity;
     this.Intelligence = (ushort)character.Intelligence;
     this.StatPoints   = (ushort)character.StatPoints;
 }
Пример #9
0
        public static void OnCheckAvailableName(WorldClient client, IPacketStream packet)
        {
            var checkNamePacket = new CheckCharacterAvailableNamePacket(packet);

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            DbCharacter character = database.Charaters.Get(c => c.Name == checkNamePacket.CharacterName);

            WorldPacketFactory.SendCharacterAvailability(client, character is null);
        }
Пример #10
0
        public static void SendSelectedCharacter(WorldClient client, DbCharacter character)
        {
            using var packet = new Packet(PacketType.SELECT_CHARACTER);
            packet.WriteByte(0); // ok response
            packet.Write(character.Id);
            client.SendPacket(packet);

            SendCharacterDetails(client, character);
        }
Пример #11
0
 private static CharacterProjection ToCharacterProjection(DbCharacter character)
 {
     return(new CharacterProjection()
     {
         Id = character.Id,
         Name = character.Name,
         PlanetOfBirthId = character.PlanetOfBirthId,
     });
 }
Пример #12
0
        /// <inheritdoc />
        public void Save(IPlayerEntity player)
        {
            DbCharacter          character     = _database.Characters.FirstOrDefault(x => x.Id == player.PlayerData.Id);
            IEnumerable <DbItem> itemsToDelete = (from dbItem in character.Items
                                                  let inventoryItem = player.Inventory.GetItem(x => x != null && x.DbId == dbItem.Id)
                                                                      where !dbItem.IsDeleted && inventoryItem == null
                                                                      select dbItem).ToList();

            foreach (DbItem dbItem in itemsToDelete)
            {
                dbItem.IsDeleted = true;

                _database.Items.Update(dbItem);
            }

            // Add or update items
            foreach (Item item in player.Inventory)
            {
                if (item == null)
                {
                    continue;
                }

                DbItem dbItem = character.Items.FirstOrDefault(x => x.Id == item.DbId && !x.IsDeleted);

                if (dbItem != null && dbItem.Id != 0)
                {
                    dbItem.CharacterId   = player.PlayerData.Id;
                    dbItem.ItemId        = item.Id;
                    dbItem.ItemCount     = item.Quantity;
                    dbItem.ItemSlot      = item.Slot;
                    dbItem.Refine        = item.Refine;
                    dbItem.Element       = (byte)item.Element;
                    dbItem.ElementRefine = item.ElementRefine;

                    _database.Items.Update(dbItem);
                }
                else
                {
                    dbItem = new DbItem
                    {
                        CharacterId   = player.PlayerData.Id,
                        CreatorId     = item.CreatorId,
                        ItemId        = item.Id,
                        ItemCount     = item.Quantity,
                        ItemSlot      = item.Slot,
                        Refine        = item.Refine,
                        Element       = (byte)item.Element,
                        ElementRefine = item.ElementRefine
                    };

                    _database.Items.Add(dbItem);
                }
            }

            _database.SaveChanges();
        }
Пример #13
0
        /// <summary>
        /// Handles event, when user clicks "check name button".
        /// </summary>
        private void HandleCheckName(CheckCharacterAvailableNamePacket checkNamePacket)
        {
            DbCharacter character = _database.Characters.FirstOrDefault(c => c.Name == checkNamePacket.CharacterName);

            using var packet = new Packet(PacketType.CHECK_CHARACTER_AVAILABLE_NAME);
            packet.Write(character is null);

            _client.SendPacket(packet);
        }
Пример #14
0
        public static void OnDeletePlayer(ClusterClient client, INetPacketStream packet)
        {
            var         pak         = new DeletePlayerPacket(packet);
            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 delete character id '{pak.CharacterId}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                      "Reason: bad presented credentials compared to the database.");
                    client.Disconnect();
                    return;
                }

                // Check if given password match confirmation password.
                if (!string.Equals(pak.Password, pak.PasswordConfirmation, StringComparison.OrdinalIgnoreCase))
                {
                    Logger.LogWarning($"Unable to delete character id '{pak.CharacterId}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                      "Reason: passwords entered do not match.");
                    ClusterPacketFactory.SendError(client, ErrorType.WRONG_PASSWORD);
                    return;
                }

                dbCharacter = database.Characters.Get(pak.CharacterId);

                // Check if character exist.
                if (dbCharacter == null)
                {
                    Logger.LogWarning($"[SECURITY] Unable to delete character id '{pak.CharacterId}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                      "Reason: user doesn't have any character with this id.");
                    client.Disconnect();
                    return;
                }

                if (dbCharacter.IsDeleted)
                {
                    Logger.LogWarning($"[SECURITY] Unable to delete character id '{pak.CharacterId}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                      "Reason: character is already deleted.");
                    return;
                }

                database.Characters.Delete(dbCharacter);
                database.Complete();
            }
            Logger.LogInformation("Character '{0}' has been deleted successfully for user '{1}' from {2}.",
                                  dbCharacter.Name, pak.Username, client.RemoteEndPoint);

            ClusterPacketFactory.SendPlayerList(client, pak.AuthenticationKey, dbUser.Characters);
        }
Пример #15
0
        /// <summary>
        /// Handles creation of character.
        /// </summary>
        private async void HandleCreateCharacter(CreateCharacterPacket createCharacterPacket)
        {
            using var database = DependencyContainer.Instance.Resolve <IDatabase>();

            // Get number of user characters.
            var characters = database.Characters.Where(x => x.UserId == _client.UserID).ToList();

            byte freeSlot = createCharacterPacket.Slot;

            if (characters.Any(c => c.Slot == freeSlot && !c.IsDelete))
            {
                // Wrong slot.
                SendCreatedCharacter(false);
                return;
            }

            var charConfig   = DependencyContainer.Instance.Resolve <CharacterConfiguration>();
            var defaultStats = charConfig.DefaultStats.FirstOrDefault(s => s.Job == createCharacterPacket.Class);

            if (defaultStats is null)
            {
                // Something went very wrong. No default stats for this job.
                SendCreatedCharacter(false);
                return;
            }

            DbCharacter character = new DbCharacter()
            {
                Name         = createCharacterPacket.CharacterName,
                Race         = createCharacterPacket.Race,
                Mode         = createCharacterPacket.Mode,
                Hair         = createCharacterPacket.Hair,
                Face         = createCharacterPacket.Face,
                Height       = createCharacterPacket.Height,
                Class        = createCharacterPacket.Class,
                Gender       = createCharacterPacket.Gender,
                Strength     = defaultStats.Str,
                Dexterity    = defaultStats.Dex,
                Rec          = defaultStats.Rec,
                Intelligence = defaultStats.Int,
                Wisdom       = defaultStats.Wis,
                Luck         = defaultStats.Luc,
                Level        = 1,
                Slot         = freeSlot,
                UserId       = _client.UserID
            };

            await database.Characters.AddAsync(character);

            if (await database.SaveChangesAsync() > 0)
            {
                characters.Add(character);
                SendCreatedCharacter(true);
                SendCharacterList(characters);
            }
        }
Пример #16
0
        private void OnJoin(NetPacketBase packet)
        {
            var worldId        = packet.Read <int>();
            var playerId       = packet.Read <int>();
            var authKey        = packet.Read <int>();
            var partyId        = packet.Read <int>();
            var guildId        = packet.Read <int>();
            var guildWarId     = packet.Read <int>();
            var idOfMulti      = packet.Read <int>(); // what is this?
            var slot           = packet.Read <byte>();
            var playerName     = packet.Read <string>();
            var username       = packet.Read <string>();
            var password       = packet.Read <string>();
            var messengerState = packet.Read <int>();
            var messengerCount = packet.Read <int>();

            // Not using messenger yet

            this.CurrentUser = DatabaseService.Users.Get(x =>
                                                         x.Username.ToLower() == username.ToLower() &&
                                                         x.Password.ToLower() == password.ToLower() &&
                                                         x.Authority > 0);

            if (this.CurrentUser == null)
            {
                Log.Warning("Unknow account: '{0}'.", username);
                this.Server.RemoveClient(this);
                return;
            }

            DbCharacter character = DatabaseService.Characters.Get(x =>
                                                                   x.AccountId == this.CurrentUser.Id &&
                                                                   x.Name.ToLower() == playerName.ToLower() &&
                                                                   x.Id == playerId, includes => includes.Items); // TODO: include more

            if (character == null)
            {
                Log.Warning("Cannot find character '{0}' with id {1} for account '{2}'.", playerName, playerId, this.CurrentUser.Id);
                this.Server.RemoveClient(this);
                return;
            }

            this.Player = new Player(this, character);
            this.Player.SendPlayerSpawn();

            Map playerMap = WorldServer.MapManager[this.Player.MapId];

            if (playerMap == null)
            {
                Log.Error("Invalid MapId: {0}", this.Player.MapId);
                this.Server.RemoveClient(this);
                return;
            }

            playerMap.AddObject(this.Player);
        }
Пример #17
0
        /// <summary>
        /// Handles event, when user clicks "check name button".
        /// </summary>
        private void HandleCheckName(CheckCharacterAvailableNamePacket checkNamePacket)
        {
            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            DbCharacter character = database.Characters.FirstOrDefault(c => c.Name == checkNamePacket.CharacterName);

            using var packet = new Packet(PacketType.CHECK_CHARACTER_AVAILABLE_NAME);
            packet.Write(character is null);

            _client.SendPacket(packet);
        }
Пример #18
0
        /// <inheritdoc/>
        public void EnsureMap(DbCharacter dbCharacter)
        {
            if (Maps.ContainsKey(dbCharacter.Map)) // All fine, map is presented on server.
            {
                return;
            }

            // Map was completely deleted from the server. Fallback to map 0.
            if (!AvailableMapIds.Contains(dbCharacter.Map))
            {
                var coordinates = Maps[0].GetNearestSpawn(0, 0, 0, dbCharacter.User.Faction == Fraction.Light ? CountryType.Light : CountryType.Dark);
                dbCharacter.Map  = 0;
                dbCharacter.PosX = coordinates.X;
                dbCharacter.PosY = coordinates.Y;
                dbCharacter.PosZ = coordinates.Z;
                return;
            }

            // Map is an instance map. Likely for guild or party. Find out what is the rebirth map.
            if (!Maps.ContainsKey(dbCharacter.Map))
            {
                var definition = _mapDefinitions.Maps.First(m => m.Id == dbCharacter.Map);

                if (definition.RebirthMap != null) // Rebirth map for both factions set.
                {
                    dbCharacter.Map  = definition.RebirthMap.MapId;
                    dbCharacter.PosX = definition.RebirthMap.PosX;
                    dbCharacter.PosY = definition.RebirthMap.PosY;
                    dbCharacter.PosZ = definition.RebirthMap.PosZ;
                    return;
                }

                if (dbCharacter.User.Faction == Fraction.Light)
                {
                    dbCharacter.Map  = definition.LightRebirthMap.MapId;
                    dbCharacter.PosX = definition.LightRebirthMap.PosX;
                    dbCharacter.PosY = definition.LightRebirthMap.PosY;
                    dbCharacter.PosZ = definition.LightRebirthMap.PosZ;
                    return;
                }

                if (dbCharacter.User.Faction == Fraction.Dark)
                {
                    dbCharacter.Map  = definition.DarkRebirthMap.MapId;
                    dbCharacter.PosX = definition.DarkRebirthMap.PosX;
                    dbCharacter.PosY = definition.DarkRebirthMap.PosY;
                    dbCharacter.PosZ = definition.DarkRebirthMap.PosZ;
                    return;
                }
            }

            _logger.LogError("Couldn't ensure map {id} for player {characterId}! Check it manually!", dbCharacter.Map, dbCharacter.Id);
        }
Пример #19
0
        /// <inheritdoc />
        public void SavePlayer(IPlayerEntity player)
        {
            if (player == null)
            {
                return;
            }

            DbCharacter character = _database.Characters.FirstOrDefault(x => x.Id == player.PlayerData.Id);

            if (character != null)
            {
                character.LastConnectionTime = player.PlayerData.LoggedInAt;
                character.PlayTime          += (long)(DateTime.UtcNow - player.PlayerData.LoggedInAt).TotalSeconds;

                character.PosX       = player.Object.Position.X;
                character.PosY       = player.Object.Position.Y;
                character.PosZ       = player.Object.Position.Z;
                character.Angle      = player.Object.Angle;
                character.MapId      = player.Object.MapId;
                character.MapLayerId = player.Object.LayerId;
                character.Gender     = player.VisualAppearance.Gender;
                character.HairColor  = player.VisualAppearance.HairColor;
                character.HairId     = player.VisualAppearance.HairId;
                character.FaceId     = player.VisualAppearance.FaceId;
                character.SkinSetId  = player.VisualAppearance.SkinSetId;
                character.Level      = player.Object.Level;

                character.JobId      = (int)player.PlayerData.Job;
                character.Gold       = player.PlayerData.Gold;
                character.Experience = player.PlayerData.Experience;

                character.Strength     = player.Attributes[DefineAttributes.STR];
                character.Stamina      = player.Attributes[DefineAttributes.STA];
                character.Dexterity    = player.Attributes[DefineAttributes.DEX];
                character.Intelligence = player.Attributes[DefineAttributes.INT];
                character.StatPoints   = player.Statistics.StatPoints;
                character.SkillPoints  = player.Statistics.SkillPoints;

                character.Hp = player.Attributes[DefineAttributes.HP];
                character.Mp = player.Attributes[DefineAttributes.MP];
                character.Fp = player.Attributes[DefineAttributes.FP];

                _database.SaveChanges();

                var gameSystems = _serviceProvider.GetRequiredService <IEnumerable <IGameSystemLifeCycle> >().OrderBy(x => x.Order);

                foreach (IGameSystemLifeCycle system in gameSystems)
                {
                    system.Save(player);
                }
            }
        }
Пример #20
0
        public CharacterSelectionScreen(DbCharacter character)
        {
            CharacterId   = character.Id;
            Level         = character.Level;
            Race          = character.Race;
            Mode          = character.Mode;
            Hair          = character.Hair;
            Face          = character.Face;
            Height        = character.Height;
            Class         = character.Class;
            Gender        = character.Gender;
            Map           = character.Map;
            Strength      = character.Strength;
            Dexterity     = character.Dexterity;
            Rec           = character.Rec;
            Intelligence  = character.Intelligence;
            Wisdom        = character.Wisdom;
            Luck          = character.Luck;
            HealthPoints  = character.HealthPoints;
            ManaPoints    = character.ManaPoints;
            StaminaPoints = character.StaminaPoints;
            IsRename      = character.IsRename;

            var equipmentItems = character.Items.Where(item => item.Bag == 0);

            for (var i = 0; i < 17; i++)
            {
                var item = equipmentItems.FirstOrDefault(itm => itm.Slot == i);
                if (item != null)
                {
                    EquipmentItemsType[i]    = item.Type;
                    EquipmentItemsTypeId[i]  = item.TypeId;
                    EquipmentItemHasColor[i] = item.HasDyeColor;
                    if (item.HasDyeColor)
                    {
                        Colors[i] = new DyeColorSerialized(item.DyeColorAlpha, item.DyeColorR, item.DyeColorG, item.DyeColorB, item.DyeColorSaturation);
                    }
                    else
                    {
                        Colors[i] = new DyeColorSerialized();
                    }
                }
                else
                {
                    Colors[i] = new DyeColorSerialized();
                }
            }

            Name     = character.Name;
            IsDelete = character.IsDelete;
        }
Пример #21
0
        public static void OnPreJoin(ClusterClient client, INetPacketStream packet)
        {
            var         pak = new PreJoinPacket(packet);
            var         clusterConfiguration = DependencyContainer.Instance.Resolve <ClusterConfiguration>();
            DbCharacter dbCharacter          = null;

            using (var database = DependencyContainer.Instance.Resolve <IDatabase>())
                dbCharacter = database.Characters.Get(pak.CharacterId);

            // Check if character exist.
            if (dbCharacter == null)
            {
                Logger.LogWarning($"[SECURITY] Unable to prejoin character id '{pak.CharacterName}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                  $"Reason: no character with id {pak.CharacterId}.");
                client.Disconnect();
                return;
            }

            // Check if the character is deleted.
            if (dbCharacter.IsDeleted)
            {
                Logger.LogWarning($"[SECURITY] Unable to prejoin with character '{dbCharacter.Name}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                  "Reason: character is deleted.");
                return;
            }

            // Check if given username is the real owner of this character.
            if (!pak.Username.Equals(dbCharacter.User.Username, StringComparison.OrdinalIgnoreCase))
            {
                Logger.LogWarning($"[SECURITY] Unable to prejoin character '{dbCharacter.Name}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                  "Reason: character is not owned by this user.");
                client.Disconnect();
                return;
            }

            // Check if presented bank code is correct.
            if (clusterConfiguration.EnableLoginProtect &&
                LoginProtect.GetNumPadToPassword(client.LoginProtectValue, pak.BankCode) != dbCharacter.BankCode)
            {
                Logger.LogWarning($"Unable to prejoin character '{dbCharacter.Name}' for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                                  "Reason: bad bank code.");
                client.LoginProtectValue = new Random().Next(0, 1000);
                ClusterPacketFactory.SendLoginProtect(client, client.LoginProtectValue);
                return;
            }

            // Finally, we connect the player.
            ClusterPacketFactory.SendJoinWorld(client);
            Logger.LogInformation("Character '{0}' has prejoin successfully the game for user '{1}' from {2}.",
                                  dbCharacter.Name, pak.Username, client.RemoteEndPoint);
        }
Пример #22
0
        public Character(DbCharacter dbCharacter)
        {
            this.FromDbCharacter(dbCharacter);

            this.ItemsId = new List <int>();

            if (dbCharacter.Items.Any())
            {
                foreach (var item in dbCharacter.Items)
                {
                    this.ItemsId.Add(item.Id);
                }
            }
        }
Пример #23
0
        public void OnExecute()
        {
            if (string.IsNullOrEmpty(DatabaseConfigurationFile))
            {
                DatabaseConfigurationFile = ConfigurationConstants.DatabasePath;
            }

            var dbConfig = ConfigurationHelper.Load <DatabaseConfiguration>(DatabaseConfigurationFile, ConfigurationConstants.DatabaseConfiguration);

            if (dbConfig is null)
            {
                Console.WriteLine("Couldn't load database configuration file during execution of user show command.");
                return;
            }

            using IRhisisDatabase database = _databaseFactory.CreateDatabaseInstance(dbConfig);

            DbUser user = database.Users.Include(x => x.Characters).FirstOrDefault(x => x.Username.Equals(Username, StringComparison.OrdinalIgnoreCase));

            if (user == null)
            {
                Console.WriteLine($"Cannot find user with username: '******'.");
            }
            else
            {
                Console.WriteLine("#########################");
                Console.WriteLine("#   User information   #");
                Console.WriteLine("#########################");
                Console.WriteLine($"Username: {user.Username}");
                Console.WriteLine($"Email: {user.Email}");
                Console.WriteLine($"Authority: {user.Authority.ToString()}");
                Console.WriteLine($"Deleted: {user.IsDeleted}");
                Console.WriteLine($"Last connection: {user.LastConnectionTime:yyyy/MM/dd HH:mm:ss}");
                Console.WriteLine($"Play time: {TimeSpan.FromSeconds(user.PlayTime):hh\\:mm\\:ss}");
                Console.WriteLine($"Number of characters: {user.Characters.Count}");

                if (user.Characters.Any())
                {
                    for (int i = 0; i < user.Characters.Count; i++)
                    {
                        DbCharacter character = user.Characters.ElementAt(i);

                        Console.WriteLine("-------------------------");
                        Console.WriteLine($"Character name: {character.Name} (id: {character.Id})");
                        Console.WriteLine($"Deleted: {character.IsDeleted}");
                    }
                }
            }
        }
Пример #24
0
        public void OnDeletePlayer(IClusterClient client, DeletePlayerPacket 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 (!string.Equals(packet.Password, packet.PasswordConfirmation, StringComparison.OrdinalIgnoreCase))
            {
                _logger.LogWarning($"Unable to delete character id '{packet.CharacterId}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: passwords entered do not match.");
                _clusterPacketFactory.SendClusterError(client, ErrorType.WRONG_PASSWORD);
                return;
            }

            DbCharacter characterToDelete = _database.Characters.FirstOrDefault(x => x.Id == packet.CharacterId);

            // Check if character exist.
            if (characterToDelete == null)
            {
                _logger.LogWarning($"[SECURITY] Unable to delete character id '{packet.CharacterId}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: user doesn't have any character with this id.");
                client.Disconnect();
                return;
            }

            if (characterToDelete.IsDeleted)
            {
                _logger.LogWarning($"[SECURITY] Unable to delete character id '{packet.CharacterId}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: character is already deleted.");
                return;
            }

            characterToDelete.IsDeleted = true;

            _database.Characters.Update(characterToDelete);
            _database.SaveChanges();

            _logger.LogInformation($"Character '{characterToDelete.Name}' has been deleted successfully for user '{packet.Username}' from {client.Socket.RemoteEndPoint}.");

            IEnumerable <DbCharacter> dbCharacters = GetCharacters(dbUser.Id);

            _clusterPacketFactory.SendPlayerList(client, packet.AuthenticationKey, dbCharacters);
        }
Пример #25
0
        /// <summary>
        /// Handles creation of character.
        /// </summary>
        private async void HandleCreateCharacter(CreateCharacterPacket createCharacterPacket)
        {
            using var database = DependencyContainer.Instance.Resolve <IDatabase>();

            // Get number of user characters.
            var characters = database.Characters.Where(x => x.UserId == _client.UserID).ToList();

            if (characters.Count == Constants.MaxCharacters - 1)
            {
                // Max number is reached.
                SendCreatedCharacter(false);
                return;
            }

            byte freeSlot = 0;

            for (byte i = 0; i < Constants.MaxCharacters; i++)
            {
                if (!characters.Any(c => c.Slot == i))
                {
                    freeSlot = i;
                    break;
                }
            }
            DbCharacter character = new DbCharacter()
            {
                Name   = createCharacterPacket.CharacterName,
                Race   = createCharacterPacket.Race,
                Mode   = createCharacterPacket.Mode,
                Hair   = createCharacterPacket.Hair,
                Face   = createCharacterPacket.Face,
                Height = createCharacterPacket.Height,
                Class  = createCharacterPacket.Class,
                Gender = createCharacterPacket.Gender,
                Level  = 1,
                Slot   = freeSlot,
                UserId = _client.UserID
            };

            await database.Characters.AddAsync(character);

            if (await database.SaveChangesAsync() > 0)
            {
                characters.Add(character);
                SendCreatedCharacter(true);
                SendCharacterList(characters);
            }
        }
Пример #26
0
        public static DbCharacter ToDbCharacter(this ICharacter character, DbCharacter dbCharacter)
        {
            dbCharacter.Experience = character.Experience.Current;
            dbCharacter.Race = (int)character.Race;
            dbCharacter.Name = character.Name;
            dbCharacter.HitpointsCurrent = character.Hitpoints.Current;
            dbCharacter.HitpointsMax = character.Hitpoints.Max;

            dbCharacter.Abilities = character.ToDbAbilities(dbCharacter);

            dbCharacter.Classes = new Collection<DbCharacterClass>(character.Classes.Values.Select(x => x.ToDbClass(dbCharacter)).ToList());
            dbCharacter.Features = new Collection<DbCharacterFeature>(character.Features.Select(x => x.ToDbFeature(dbCharacter)).ToList());
            dbCharacter.Skills = new Collection<DbCharacterSkill>(character.Skills.Select(x => x.ToDbSkill(dbCharacter)).ToList());

            return dbCharacter;
        }
Пример #27
0
        /// <summary>
        /// Gets the characters of a given user id.
        /// </summary>
        /// <param name="userId">User id.</param>
        /// <returns>Collection of <see cref="DbCharacter"/>.</returns>
        private IEnumerable <DbCharacter> GetCharacters(int userId)
        {
            const int EquipOffset = 42;
            IEnumerable <DbCharacter> dbCharacters = _database.Characters.Include(x => x.Items).Where(x => x.UserId == userId && !x.IsDeleted);

            for (int i = 0; i < dbCharacters.Count(); i++)
            {
                DbCharacter character = dbCharacters.ElementAt(i);

                if (character == null)
                {
                    continue;
                }

                character.Items = character.Items.Where(x => x.ItemSlot > EquipOffset).ToList();
            }

            return(dbCharacters);
        }
Пример #28
0
        public void OnExecute(CommandLineApplication app, IConsole console)
        {
            if (string.IsNullOrEmpty(DatabaseConfigurationFile))
            {
                this.DatabaseConfigurationFile = Application.DefaultDatabaseConfigurationFile;
            }

            DatabaseFactory.Instance.Initialize(this.DatabaseConfigurationFile);
            this._database = new Rhisis.Database.Database();

            DbUser user = this._database.Users.Get(x => x.Username.Equals(this.Username, StringComparison.OrdinalIgnoreCase));

            if (user == null)
            {
                Console.WriteLine($"Cannot find user with username: '******'.");
            }
            else
            {
                Console.WriteLine("#########################");
                Console.WriteLine("#   User informations   #");
                Console.WriteLine("#########################");
                Console.WriteLine($"Username: {user.Username}");
                Console.WriteLine($"Email: {user.Email}");
                Console.WriteLine($"Authority: {user.Authority.ToString()}");
                Console.WriteLine($"Deleted: {user.IsDeleted}");
                Console.WriteLine($"Last connection: {user.LastConnectionTime.ToString("yyyy/MM/dd HH:mm:ss")}");
                Console.WriteLine($"Play time: {TimeSpan.FromSeconds(user.PlayTime).ToString(@"hh\:mm\:ss")}");
                Console.WriteLine($"Number of characters: {user.Characters.Count}");

                if (user.Characters.Any())
                {
                    for (int i = 0; i < user.Characters.Count; i++)
                    {
                        DbCharacter character = user.Characters.ElementAt(i);

                        Console.WriteLine("-------------------------");
                        Console.WriteLine($"Character name: {character.Name} (id: {character.Id})");
                        Console.WriteLine($"Deleted: {character.IsDeleted}");
                    }
                }
            }
        }
Пример #29
0
 public CharacterDetails(DbCharacter character)
 {
     Strength     = character.Strength;
     Dexterity    = character.Dexterity;
     Rec          = character.Rec;
     Intelligence = character.Intelligence;
     Wisdom       = character.Wisdom;
     Luck         = character.Luck;
     StatPoint    = character.StatPoint;
     SkillPoint   = character.SkillPoint;
     Angle        = character.Angle;
     Gold         = character.Gold;
     PosX         = character.PosX;
     PosY         = character.PosY;
     PosZ         = character.PosZ;
     Kills        = character.Kills;
     Deaths       = character.Deaths;
     Victories    = character.Victories;
     Defeats      = character.Defeats;
 }
Пример #30
0
        public void OnPreJoin(IClusterClient client, PreJoinPacket packet)
        {
            DbCharacter character = _database.Characters.FirstOrDefault(x => x.Id == packet.CharacterId);

            if (character == null)
            {
                _logger.LogWarning($"[SECURITY] Unable to prejoin character id '{packet.CharacterName}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   $"Reason: no character with id {packet.CharacterId}.");
                client.Disconnect();
                return;
            }

            if (character.IsDeleted)
            {
                _logger.LogWarning($"[SECURITY] Unable to prejoin with character '{character.Name}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: character is deleted.");
                client.Disconnect();
                return;
            }

            if (character.Name != packet.CharacterName)
            {
                _logger.LogWarning($"[SECURITY] Unable to prejoin character '{character.Name}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: character is not owned by this user.");
                client.Disconnect();
                return;
            }

            if (_clusterServer.ClusterConfiguration.EnableLoginProtect &&
                LoginProtect.GetNumPadToPassword(client.LoginProtectValue, packet.BankCode) != character.BankCode)
            {
                _logger.LogWarning($"Unable to prejoin character '{character.Name}' for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: bad bank code.");
                client.LoginProtectValue = new Random().Next(0, 1000);
                _clusterPacketFactory.SendLoginProtect(client, client.LoginProtectValue);
                return;
            }

            _clusterPacketFactory.SendJoinWorld(client);
            _logger.LogInformation($"Character '{character.Name}' has prejoin successfully the game for user '{packet.Username}' from {client.Socket.RemoteEndPoint}.");
        }
Пример #31
0
        /// <summary>
        /// Creates a new Player based on a <see cref="DbCharacter"/> stored in database.
        /// </summary>
        /// <param name="parentClient">Parent client instance</param>
        /// <param name="dbCharacter">Character stored in database</param>
        public Player(WorldClient parentClient, DbCharacter dbCharacter)
            : base(dbCharacter?.Gender == 0 ? 11 : 12)
        {
            this.Client    = parentClient;
            this.Chat      = new Chat(this);
            this.Inventory = new Inventory(this, dbCharacter.Items);
            this.Class     = AClass.Create(dbCharacter.ClassId);

            this.Id        = dbCharacter.Id;
            this.AccountId = dbCharacter.AccountId;
            this.Name      = dbCharacter.Name;
            this.Gender    = dbCharacter.Gender;
            this.ClassId   = dbCharacter.ClassId;
            this.Gold      = dbCharacter.Gold;
            this.Slot      = dbCharacter.Slot;
            this.Level     = dbCharacter.Level;
            this.Authority = this.Client.CurrentUser.Authority;
            this.Attributes[DefineAttributes.STR] = dbCharacter.Strength;
            this.Attributes[DefineAttributes.STA] = dbCharacter.Stamina;
            this.Attributes[DefineAttributes.DEX] = dbCharacter.Dexterity;
            this.Attributes[DefineAttributes.INT] = dbCharacter.Intelligence;
            this.Attributes[DefineAttributes.HP]  = dbCharacter.Hp;
            this.Attributes[DefineAttributes.MP]  = dbCharacter.Mp;
            this.Attributes[DefineAttributes.FP]  = dbCharacter.Fp;
            this.Experience          = dbCharacter.Experience;
            this.SkinSetId           = dbCharacter.SkinSetId;
            this.HairId              = dbCharacter.HairId;
            this.HairColor           = dbCharacter.HairColor;
            this.FaceId              = dbCharacter.FaceId;
            this.BankCode            = dbCharacter.BankCode;
            this.MapId               = dbCharacter.MapId;
            this.Position            = new Vector3(dbCharacter.PosX, dbCharacter.PosY, dbCharacter.PosZ);
            this.Angle               = dbCharacter.Angle;
            this.DestinationPosition = this.Position.Clone();
            this.IsFlying            = this.Inventory.HasFlyingObjectEquiped();

            this.StatPoints  = dbCharacter.StatPoints;
            this.SkillPoints = dbCharacter.SkillPoints;

            // Initialize quests, guild, friends, skills etc...
        }
Пример #32
0
        public CharacterSelectionScreen(DbCharacter character)
        {
            CharacterId  = character.Id;
            Level        = character.Level;
            Race         = character.Race;
            Mode         = character.Mode;
            Hair         = character.Hair;
            Face         = character.Face;
            Height       = character.Height;
            Class        = character.Class;
            Gender       = character.Gender;
            Map          = character.Map;
            Strength     = character.Strength;
            Dexterity    = character.Dexterity;
            Rec          = character.Rec;
            Intelligence = character.Intelligence;
            Wisdom       = character.Wisdom;
            Luck         = character.Luck;

            var equipmentItems = character.Items.Where(item => item.Bag == 0);

            for (var i = 0; i < 17; i++)
            {
                var item = equipmentItems.FirstOrDefault(itm => itm.Slot == i);
                if (item is null)
                {
                    EquipmentItemsType[i]    = 0;
                    EquipmentItemsTypeId[i]  = 0;
                    EquipmentItemHasColor[i] = false;
                }
                else
                {
                    EquipmentItemsType[i]    = item.Type;
                    EquipmentItemsTypeId[i]  = item.TypeId;
                    EquipmentItemHasColor[i] = false; // TODO: research how colors are working
                }
            }

            Name     = character.Name;
            IsDelete = character.IsDelete;
        }
Пример #33
0
        public static DbCharacterAbilities ToDbAbilities(this ICharacter character, DbCharacter dbCharacter)
        {
            var dbABilities = dbCharacter.Abilities ?? new DbCharacterAbilities();

            //dbABilities.Character = dbCharacter;

            dbABilities.StartStrength = character.StartAbilities[AbilityType.Strength];
            dbABilities.StartDexterity = character.StartAbilities[AbilityType.Dexterity];
            dbABilities.StartConstitution = character.StartAbilities[AbilityType.Constitution];
            dbABilities.StartIntelligence = character.StartAbilities[AbilityType.Intelligence];
            dbABilities.StartWisdom = character.StartAbilities[AbilityType.Wisdom];
            dbABilities.StartCharisma = character.StartAbilities[AbilityType.Charisma];

            dbABilities.ModStrength = character.AddedAbilityScores[AbilityType.Strength];
            dbABilities.ModDexterity = character.AddedAbilityScores[AbilityType.Dexterity];
            dbABilities.ModConstitution = character.AddedAbilityScores[AbilityType.Constitution];
            dbABilities.ModIntelligence = character.AddedAbilityScores[AbilityType.Intelligence];
            dbABilities.ModWisdom = character.AddedAbilityScores[AbilityType.Wisdom];
            dbABilities.ModCharisma = character.AddedAbilityScores[AbilityType.Charisma];

            return dbABilities;
        }
Пример #34
0
        public static async void OnCreateCharacter(WorldClient client, IPacketStream packet)
        {
            var createCharacterPacket = new CreateCharacterPacket(packet);

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();

            // Get number of user characters.
            var count = (byte)database.Charaters.Count(x => x.UserId == client.UserID);

            if (count == Constants.MaxCharacters - 1)
            {
                // Max number is reached.
                WorldPacketFactory.SendCreatedCharacter(client, false);
            }

            DbCharacter character = new DbCharacter()
            {
                Name   = createCharacterPacket.CharacterName,
                Race   = createCharacterPacket.Race,
                Mode   = createCharacterPacket.Mode,
                Hair   = createCharacterPacket.Hair,
                Face   = createCharacterPacket.Face,
                Height = createCharacterPacket.Height,
                Class  = createCharacterPacket.Class,
                Gender = createCharacterPacket.Gender,
                Level  = 1,
                Slot   = count,
                UserId = client.UserID
            };

            await database.Charaters.CreateAsync(character);

            await database.CompleteAsync();

            WorldPacketFactory.SendCreatedCharacter(client, true);
        }