/// <summary> /// select packet /// </summary> /// <param name="selectPacket"></param> public void SelectCharacter(SelectPacket selectPacket) { try { if (Session?.Account == null || Session.HasSelectedCharacter) { return; } if (!(DaoFactory.CharacterDao.LoadBySlot(Session.Account.AccountId, selectPacket.Slot) is Character character)) { return; } character.GeneralLogs = DaoFactory.GeneralLogDao.LoadByAccount(Session.Account.AccountId).Where(s => s.CharacterId == character.CharacterId).ToList(); character.MapInstanceId = ServerManager.Instance.GetBaseMapInstanceIdByMapId(character.MapId); Map currentMap = ServerManager.Instance.GetMapInstance(character.MapInstanceId)?.Map; if (currentMap != null && currentMap.IsBlockedZone(character.MapX, character.MapY)) { MapCell pos = currentMap.GetRandomPosition(); character.PositionX = pos.X; character.PositionY = pos.Y; } else { character.PositionX = character.MapX; character.PositionY = character.MapY; } character.Authority = Session.Account.Authority; Session.SetCharacter(character); if (!Session.Character.GeneralLogs.Any(s => s.Timestamp == DateTime.Now && s.LogData == "World" && s.LogType == "Connection")) { Session.Character.SpAdditionPoint += Session.Character.SpPoint; Session.Character.SpPoint = 10000; } if (Session.Character.Hp > Session.Character.HpLoad()) { Session.Character.Hp = (int)Session.Character.HpLoad(); } if (Session.Character.Mp > Session.Character.MpLoad()) { Session.Character.Mp = (int)Session.Character.MpLoad(); } Session.Character.Respawns = DaoFactory.RespawnDao.LoadByCharacter(Session.Character.CharacterId).ToList(); Session.Character.StaticBonusList = DaoFactory.StaticBonusDao.LoadByCharacterId(Session.Character.CharacterId).ToList(); Session.Character.LoadInventory(); Session.Character.LoadQuicklists(); Session.Character.GenerateMiniland(); if (!DaoFactory.CharacterQuestDao.LoadByCharacterId(Session.Character.CharacterId).Any(s => s.IsMainQuest)) { CharacterQuestDTO firstQuest = new CharacterQuestDTO { CharacterId = Session.Character.CharacterId, QuestId = 1997, IsMainQuest = true }; DaoFactory.CharacterQuestDao.InsertOrUpdate(firstQuest); } DaoFactory.CharacterQuestDao.LoadByCharacterId(Session.Character.CharacterId).ToList().ForEach(q => Session.Character.Quests.Add(q as CharacterQuest)); DaoFactory.MateDao.LoadByCharacterId(Session.Character.CharacterId).ToList().ForEach(s => { Mate mate = (Mate)s; mate.Owner = Session.Character; mate.GenerateMateTransportId(); mate.Monster = ServerManager.Instance.GetNpc(s.NpcMonsterVNum); Session.Character.Mates.Add(mate); if (!mate.IsTeamMember) { mate.MapX = ServerManager.Instance.MinilandRandomPos().X; mate.MapY = ServerManager.Instance.MinilandRandomPos().Y; } }); Session.Character.Life = Observable.Interval(TimeSpan.FromMilliseconds(300)).Subscribe(x => { Session?.Character?.CharacterLife(); }); Session.Character.GeneralLogs.Add(new GeneralLogDTO { AccountId = Session.Account.AccountId, CharacterId = Session.Character.CharacterId, IpAddress = Session.IpAddress, LogData = "World", LogType = "Connection", Timestamp = DateTime.Now }); Session.SendPacket("OK"); // Inform everyone about connected character CommunicationServiceClient.Instance.ConnectCharacter(ServerManager.Instance.WorldId, character.CharacterId); } catch (Exception ex) { Logger.Log.Error("Select character failed.", ex); } }
private void ExecuteHandler(ClientSession session) { try { Character character = new Character(DAOFactory.CharacterDAO.LoadBySlot(session.Account.AccountId, Slot)); if (session.Account != null && !session.HasSelectedCharacter) { character.Initialize(); #if !DEBUG if (session.Account.Authority > Domain.AuthorityType.Moderator) { character.Invisible = true; character.InvisibleGm = true; } #endif character.GeneralLogs = new ThreadSafeGenericList<GeneralLogDTO>(); character.GeneralLogs.AddRange(DAOFactory.GeneralLogDAO.LoadByAccount(session.Account.AccountId) .Where(s => s.CharacterId == character.CharacterId).ToList()); character.MapInstanceId = ServerManager.GetBaseMapInstanceIdByMapId(character.MapId); character.PositionX = character.MapX; character.PositionY = character.MapY; character.Authority = session.Account.Authority; session.SetCharacter(character); if (!session.Character.GeneralLogs.Any(s => s.Timestamp == DateTime.UtcNow && s.LogData == "World" && s.LogType == "Connection")) { session.Character.SpAdditionPoint += session.Character.SpPoint; session.Character.SpPoint = 10000; } if (session.Character.Hp > session.Character.HPLoad()) { session.Character.Hp = (int)session.Character.HPLoad(); } if (session.Character.Mp > session.Character.MPLoad()) { session.Character.Mp = (int)session.Character.MPLoad(); } session.Character.Respawns = DAOFactory.RespawnDAO.LoadByCharacter(session.Character.CharacterId).ToList(); session.Character.StaticBonusList = DAOFactory.StaticBonusDAO .LoadByCharacterId(session.Character.CharacterId).ToList(); session.Character.LoadInventory(); session.Character.LoadQuicklists(); session.Character.GenerateMiniland(); Map miniland = ServerManager.GetMapInstanceByMapId(20001).Map; DAOFactory.MateDAO.LoadByCharacterId(session.Character.CharacterId).ToList().ForEach(s => { Mate mate = new Mate(s) { Owner = session.Character }; mate.GenerateMateTransportId(); mate.Monster = ServerManager.GetNpcMonster(s.NpcMonsterVNum); mate.IsAlive = true; if (!mate.IsTeamMember && miniland.IsBlockedZone(mate.MapX, mate.MapY)) { MapCell cell = miniland.GetRandomPosition(); mate.MapX = cell.X; mate.MapY = cell.Y; } if (mate.MateType == MateType.Pet && mate.MateSlot == -1) { mate.MateSlot = session.Character.GetNextMateSlot(mate.MateType); mate.PartnerSlot = 0; } else if (mate.MateType == MateType.Partner && mate.PartnerSlot == -1) { mate.PartnerSlot = session.Character.GetNextMateSlot(mate.MateType); mate.MateSlot = 0; } session.Character.Mates.Add(mate); mate.StartLife(); }); session.Character.CharacterLifeDisposable = Observable.Interval(TimeSpan.FromMilliseconds(300)) .Subscribe(x => session.Character.CharacterLife()); session.Character.GeneralLogs.Add(new GeneralLogDTO { AccountId = session.Account.AccountId, CharacterId = session.Character.CharacterId, IpAddress = session.IpAddress, LogData = "World", LogType = "Connection", Timestamp = DateTime.UtcNow }); session.SendPacket("OK"); // Inform everyone about connected character CommunicationServiceClient.Instance.ConnectCharacter(ServerManager.Instance.WorldId, character.CharacterId); } } catch (Exception ex) { Logger.Error("Select character failed.", ex); } }