public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId if (Session.Account == null) { bool hasRegisteredAccountLogin = true; try { hasRegisteredAccountLogin = ServiceFactory.Instance.CommunicationService.HasRegisteredAccountLogin(loginPacketParts[4], Session.SessionId); } catch (Exception ex) { Logger.Log.Error("WCF Communication Failed.", ex); } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { AccountDTO accountDTO = DAOFactory.AccountDAO.LoadByName(loginPacketParts[4]); if (accountDTO != null) { if (accountDTO.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6]))) { var account = new Account() { AccountId = accountDTO.AccountId, Name = accountDTO.Name, Password = accountDTO.Password.ToLower(), Authority = accountDTO.Authority, LastCompliment = accountDTO.LastCompliment, }; account.Initialize(); foreach (PenaltyLogDTO penalty in DAOFactory.PenaltyLogDAO.LoadByAccount(accountDTO.AccountId)) { account.PenaltyLogs.Add(new PenaltyLogDTO() { AccountId = penalty.AccountId, DateEnd = penalty.DateEnd, DateStart = penalty.DateStart, Reason = penalty.Reason, Penalty = penalty.Penalty, PenaltyLogId = penalty.PenaltyLogId }); } foreach (GeneralLogDTO general in DAOFactory.GeneralLogDAO.LoadByAccount(accountDTO.AccountId)) { account.GeneralLogs.Add(new GeneralLogDTO() { AccountId = general.AccountId, LogData = general.LogData, IpAddress = general.IpAddress, LogType = general.LogType, LogId = general.LogId, Timestamp = general.Timestamp, CharacterId = general.CharacterId }); } Session.InitializeAccount(account); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO IList<CharacterDTO> characters = DAOFactory.CharacterDAO.LoadByAccount(Session.Account.AccountId); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.SessionId); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable<ItemInstanceDTO> inventory = DAOFactory.ItemInstanceDAO.LoadByType(character.CharacterId, InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte)character.Gender} {(byte)character.HairStyle} {(byte)character.HairColor} 0 {(byte)character.Class} {character.Level} {character.HeroLevel} {(equipment[(byte)EquipmentType.Hat] != null ? equipment[(byte)EquipmentType.Hat].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.Armor] != null ? equipment[(byte)EquipmentType.Armor].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.WeaponSkin] != null ? equipment[(byte)EquipmentType.WeaponSkin].ItemVNum : equipment[(byte)EquipmentType.MainWeapon] != null ? equipment[(byte)EquipmentType.MainWeapon].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.SecondaryWeapon] != null ? equipment[(byte)EquipmentType.SecondaryWeapon].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.Mask] != null ? equipment[(byte)EquipmentType.Mask].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.Fairy] != null ? equipment[(byte)EquipmentType.Fairy].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.CostumeSuit] != null ? equipment[(byte)EquipmentType.CostumeSuit].ItemVNum : -1)}.{(equipment[(byte)EquipmentType.CostumeHat] != null ? equipment[(byte)EquipmentType.CostumeHat].ItemVNum : -1)} {character.JobLevel} 1 1 -1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 {(equipment[(byte)EquipmentType.Hat] != null && equipment[(byte)EquipmentType.Hat].Item.IsColored ? equipment[(byte)EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); }
public void InitializeAccount(Account account) { Account = account; ServiceFactory.Instance.CommunicationService.ConnectAccount(account.Name, SessionId); }
public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId bool isCrossServerLogin = false; if (Session.Account == null) { bool hasRegisteredAccountLogin = true; AccountDTO account = null; if (loginPacketParts.Length > 4) { if (loginPacketParts.Length > 7 && loginPacketParts[4] == "DAC" && loginPacketParts[8] == "CrossServerAuthenticate") { isCrossServerLogin = true; string name = loginPacketParts[5]; account = DAOFactory.AccountDAO.FirstOrDefault(s => s.Name == name); } else { string name = loginPacketParts[4]; account = DAOFactory.AccountDAO.FirstOrDefault(s => s.Name == name); } } try { if (account != null) { hasRegisteredAccountLogin = isCrossServerLogin ? CommunicationServiceClient.Instance.IsCrossServerLoginPermitted(account.AccountId, Session.SessionId) : CommunicationServiceClient.Instance.IsLoginPermitted(account.AccountId, Session.SessionId); } } catch (Exception ex) { Logger.Log.Error("MS Communication Failed.", ex); Session.Disconnect(); return; } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { if (account != null) { if (account.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6])) || isCrossServerLogin) { PenaltyLogDTO penalty = DAOFactory.PenaltyLogDAO.FirstOrDefault(s => s.AccountId == account.AccountId && s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { Session.SendPacket($"failc {(byte)LoginFailType.Banned}"); Logger.Log.Info($"[LOG] {account.Name} connected from {Session.IpAddress} while being banned"); Session.Disconnect(); return; } // TODO MAINTENANCE MODE if (ServerManager.Instance.Sessions.Count() >= ServerManager.Instance.AccountLimit) { if (account.Authority < AuthorityType.Moderator) { Session.Disconnect(); return; } } Account accountobject = new Account { AccountId = account.AccountId, Name = account.Name, Password = account.Password.ToLower(), Authority = account.Authority }; accountobject.Initialize(); Session.InitializeAccount(accountobject, isCrossServerLogin); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO if (Session.Account == null) { return; } if (isCrossServerLogin) { if (byte.TryParse(loginPacketParts[6], out byte slot)) { SelectCharacter(new SelectPacket { Slot = slot }); } } else { IEnumerable <CharacterDTO> characters = DAOFactory.CharacterDAO.Where(s => s.AccountId == Session.Account.AccountId && s.State == (byte)CharacterState.Active); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.Account.Name); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable <ItemInstanceDTO> inventory = DAOFactory.IteminstanceDAO.Where(s => s.CharacterId == character.CharacterId && s.Type == (byte)InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } string petlist = string.Empty; List <MateDTO> mates = DAOFactory.MateDAO.Where(s => s.CharacterId == character.CharacterId).ToList(); for (int i = 0; i < 26; i++) { //0.2105.1102.319.0.632.0.333.0.318.0.317.0.9.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 petlist += $"{(i != 0 ? "." : "")}{(mates.Count > i ? $"{mates.ElementAt(i).Skin}.{mates.ElementAt(i).NpcMonsterVNum}" : "-1")}"; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte)character.Gender} {(byte)character.HairStyle} {(byte)character.HairColor} 0 {(byte)character.Class} {character.Level} {character.HeroLevel} {equipment[(byte)EquipmentType.Hat]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Armor]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.WeaponSkin]?.ItemVNum ?? (equipment[(byte)EquipmentType.MainWeapon]?.ItemVNum ?? -1)}.{equipment[(byte)EquipmentType.SecondaryWeapon]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Mask]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Fairy]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeSuit]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeHat]?.ItemVNum ?? -1} {character.JobLevel} 1 1 {petlist} {(equipment[(byte)EquipmentType.Hat] != null && equipment[(byte)EquipmentType.Hat].Item.IsColored ? equipment[(byte)EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); } }