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}"); } } } }
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; }
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; }
public GuildJoinUserUnit(DbCharacter character) { Id = character.Id; Level = character.Level; Job = character.Class; Name = character.Name; }
public GuildUserUnit(DbCharacter member) { Id = member.Id; Rank = member.GuildRank; Level = member.Level; Job = member.Class; Name = member.Name; }
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); }
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; }
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; }
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); }
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); }
private static CharacterProjection ToCharacterProjection(DbCharacter character) { return(new CharacterProjection() { Id = character.Id, Name = character.Name, PlanetOfBirthId = character.PlanetOfBirthId, }); }
/// <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(); }
/// <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); }
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); }
/// <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); } }
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); }
/// <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); }
/// <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); }
/// <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); } } }
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; }
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); }
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); } } }
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}"); } } } }
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); }
/// <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); } }
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; }
/// <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); }
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}"); } } } }
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; }
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}."); }
/// <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... }
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; }
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; }
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); }