public SaveResult InsertOrUpdate(ref StaticBonusDTO staticBonus) { try { using (OpenNosContext context = DataAccessHelper.CreateContext()) { long id = staticBonus.CharacterId; StaticBonusType cardid = staticBonus.StaticBonusType; StaticBonus entity = context.StaticBonus.FirstOrDefault(c => c.StaticBonusType == cardid && c.CharacterId == id); if (entity == null) { staticBonus = Insert(staticBonus, context); return(SaveResult.Inserted); } staticBonus.StaticBonusId = entity.StaticBonusId; staticBonus = Update(entity, staticBonus, context); return(SaveResult.Updated); } } catch (Exception e) { Logger.Error(e); return(SaveResult.Error); } }
public void SendStaticBonus(long characterId, MallStaticBonus item) { if (!MSManager.Instance.AuthentificatedClients.Any(s => s.Equals(CurrentClient.ClientId))) { return; } StaticBonusDTO dto = DAOFactory.StaticBonusDAO.LoadByCharacterId(characterId).FirstOrDefault(s => s.StaticBonusType == item.StaticBonus); if (dto != null) { dto.DateEnd.AddSeconds(item.Seconds); } else { dto = new StaticBonusDTO() { CharacterId = characterId, DateEnd = DateTime.Now.AddSeconds(item.Seconds), StaticBonusType = item.StaticBonus }; } DAOFactory.StaticBonusDAO.InsertOrUpdate(ref dto); AccountConnection account = MSManager.Instance.ConnectedAccounts.Find(a => a.CharacterId.Equals(characterId)); if (account?.ConnectedWorld != null) { account.ConnectedWorld.CommunicationServiceClient.GetClientProxy <ICommunicationClient>().UpdateStaticBonus(characterId); } }
/// <summary> /// c_skill packet /// </summary> /// <param name="cSkillPacket"></param> public void OpenBazaar(CSkillPacket cSkillPacket) { if (ServerManager.Instance.InShutdown || Session.Character == null || Session.Character.InExchangeOrTrade) { return; } SpinWait.SpinUntil(() => !ServerManager.Instance.InBazaarRefreshMode); if (Session.Character.Authority >= AuthorityType.Vip && Session.Character.StaticBonusList.All(s => s.StaticBonusType != StaticBonusType.BazaarMedalGold)) { Session.Character.StaticBonusList.Add(new StaticBonusDTO { CharacterId = Session.Character.CharacterId, DateEnd = DateTime.Now.AddDays(30), StaticBonusType = StaticBonusType.BazaarMedalGold }); } StaticBonusDTO medalBonus = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); if (medalBonus != null) { byte medal = medalBonus.StaticBonusType == StaticBonusType.BazaarMedalGold || (int)Session.Character.Authority >= 1 ? (byte)MedalType.Gold : (byte)MedalType.Silver; int time = (int)Session.Character.Authority >= 1 ? 720 : (int)(medalBonus.DateEnd - DateTime.Now).TotalHours; Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOTICE_BAZAAR"), 0)); Session.SendPacket($"wopen 32 {medal} {time}"); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("INFO_BAZAAR"))); } }
public static bool ToStaticBonusDTO(StaticBonus input, StaticBonusDTO output) { if (input == null) { return(false); } output.CharacterId = input.CharacterId; output.DateEnd = input.DateEnd; output.StaticBonusId = input.StaticBonusId; output.StaticBonusType = input.StaticBonusType; return(true); }
private static StaticBonusDTO Update(StaticBonus entity, StaticBonusDTO sb, OpenNosContext context) { if (entity != null) { Mapper.Mappers.StaticBonusMapper.ToStaticBonus(sb, entity); context.SaveChanges(); } if (Mapper.Mappers.StaticBonusMapper.ToStaticBonusDTO(entity, sb)) { return(sb); } return(null); }
public IEnumerable <StaticBonusDTO> LoadByCharacterId(long characterId) { using (OpenNosContext context = DataAccessHelper.CreateContext()) { List <StaticBonusDTO> result = new List <StaticBonusDTO>(); foreach (StaticBonus entity in context.StaticBonus.AsNoTracking().Where(i => i.CharacterId == characterId && i.DateEnd > DateTime.UtcNow)) { StaticBonusDTO dto = new StaticBonusDTO(); Mapper.Mappers.StaticBonusMapper.ToStaticBonusDTO(entity, dto); result.Add(dto); } return(result); } }
/// <summary> /// c_skill packet /// </summary> /// <param name="cSkillPacket"></param> public void OpenBazaar(CSkillPacket cSkillPacket) { SpinWait.SpinUntil(() => !ServerManager.Instance.InBazaarRefreshMode); StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); if (medal != null) { byte Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; int Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOTICE_BAZAAR"), 0)); Session.SendPacket($"wopen 32 {Medal} {Time}"); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("INFO_BAZAAR"))); } }
public static StaticBonusDTO LoadById(long sbId) { try { using (OpenNosContext context = DataAccessHelper.CreateContext()) { StaticBonusDTO dto = new StaticBonusDTO(); if (Mapper.Mappers.StaticBonusMapper.ToStaticBonusDTO(context.StaticBonus.AsNoTracking().FirstOrDefault(s => s.StaticBonusId.Equals(sbId)), dto)) { return(dto); } return(null); } } catch (Exception e) { Logger.Error(e); return(null); } }
private static StaticBonusDTO Insert(StaticBonusDTO sb, OpenNosContext context) { try { StaticBonus entity = new StaticBonus(); Mapper.Mappers.StaticBonusMapper.ToStaticBonus(sb, entity); context.StaticBonus.Add(entity); context.SaveChanges(); if (Mapper.Mappers.StaticBonusMapper.ToStaticBonusDTO(entity, sb)) { return(sb); } return(null); } catch (Exception e) { Logger.Error(e); return(null); } }
private void ExecuteHandler(ClientSession session) { SpinWait.SpinUntil(() => !ServerManager.Instance.InBazaarRefreshMode); StaticBonusDTO medal = session.Character.StaticBonusList.Find(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); if (medal != null) { byte bmedal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; int time = (int)(medal.DateEnd - DateTime.UtcNow).TotalHours; session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOTICE_BAZAAR"), 0)); session.SendPacket($"wopen 32 {bmedal} {time}"); } else { session.SendPacket( UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("INFO_BAZAAR"))); } }
/// <summary> /// c_reg packet /// </summary> /// <param name="cRegPacket"></param> public void SellBazaar(CRegPacket cRegPacket) { if (ServerManager.Instance.InShutdown || Session.Character == null || Session.Character.InExchangeOrTrade) { return; } SpinWait.SpinUntil(() => !ServerManager.Instance.InBazaarRefreshMode); StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); long price = cRegPacket.Price * cRegPacket.Amount; long taxmax = price > 100000 ? price / 200 : 500; long taxmin = price >= 4000 ? (60 + (price - 4000) / 2000 * 30 > 10000 ? 10000 : 60 + (price - 4000) / 2000 * 30) : 50; long tax = medal == null ? taxmax : taxmin; long maxGold = ServerManager.Instance.MaxGold; if (Session.Character.Gold < tax || cRegPacket.Amount <= 0 || Session.Character.ExchangeInfo != null && Session.Character.ExchangeInfo.ExchangeList.Any() || Session.Character.IsShopping) { return; } ItemInstance it = Session.Character.Inventory.LoadBySlotAndType(cRegPacket.Slot, cRegPacket.Inventory == 4 ? 0 : (InventoryType)cRegPacket.Inventory); if (it == null || !it.Item.IsSoldable || it.IsBound) { return; } if (Session.Character.Inventory.CountItemInAnInventory(InventoryType.Bazaar) > 10 * (medal == null ? 1 : 10)) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LIMIT_EXCEEDED"), 0)); return; } if (price > (medal == null ? 100000000 : maxGold)) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PRICE_EXCEEDED"), 0)); return; } if (cRegPacket.Price < 0) { return; } ItemInstance bazar = Session.Character.Inventory.AddIntoBazaarInventory(cRegPacket.Inventory == 4 ? 0 : (InventoryType)cRegPacket.Inventory, cRegPacket.Slot, cRegPacket.Amount); if (bazar == null) { return; } short duration; switch (cRegPacket.Durability) { case 1: duration = 24; break; case 2: duration = 168; break; case 3: duration = 360; break; case 4: duration = 720; break; default: return; } ItemInstanceDTO bazarDto = bazar; DAOFactory.IteminstanceDAO.InsertOrUpdate(ref bazarDto); BazaarItemDTO bazaarItem = new BazaarItemDTO { Amount = bazar.Amount, DateStart = DateTime.Now, Duration = duration, IsPackage = cRegPacket.IsPackage != 0, MedalUsed = medal != null, Price = cRegPacket.Price, SellerId = Session.Character.CharacterId, ItemInstanceId = bazar.Id }; DAOFactory.BazaarItemDAO.InsertOrUpdate(ref bazaarItem); if (bazar is WearableInstance wear) { wear.EquipmentOptions.ForEach(s => s.WearableInstanceId = bazar.Id); IEnumerable <EquipmentOptionDTO> equipmentOptionDtos = wear.EquipmentOptions; DAOFactory.EquipmentOptionDAO.InsertOrUpdate(equipmentOptionDtos); } ServerManager.Instance.BazaarRefresh(bazaarItem.BazaarItemId); Session.Character.Gold -= tax; Session.SendPacket(Session.Character.GenerateGold()); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("OBJECT_IN_BAZAAR"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("OBJECT_IN_BAZAAR"), 0)); Session.SendPacket("rc_reg 1"); }
private void ExecuteHandler(ClientSession session) { if (session.IsOnMap || !session.HasSelectedCharacter) { // character should have been selected in SelectCharacter return; } if (session.Character.MapInstance.Map.MapTypes.Any(m => m.MapTypeId == (short)MapTypeEnum.Act4) && ServerManager.Instance.ChannelId != 51) { session.Character.ChangeChannel(ServerManager.Instance.Configuration.Act4IP, ServerManager.Instance.Configuration.Act4Port, 2); return; } session.CurrentMapInstance = session.Character.MapInstance; if (ServerManager.Instance.Configuration.SceneOnCreate && session.Character.GeneralLogs.CountLinq(s => s.LogType == "Connection") < 2) { session.SendPacket("scene 40"); } if (ServerManager.Instance.Configuration.WorldInformation) { Assembly assembly = Assembly.GetEntryAssembly(); string productVersion = assembly?.Location != null ? FileVersionInfo.GetVersionInfo(assembly.Location).ProductVersion : "1337"; session.SendPacket(session.Character.GenerateSay("----------[World Information]----------", 10)); session.SendPacket( session.Character.GenerateSay("XARION - REUSRRECTION\n" + $"Version : V4\n" + $"Built by: XARION TEAM\n" + $"Running on current Xarion supported source\n" + (ServerManager.Instance.IsDebugMode ? "DEBUG_MODE: Enabled\n" : "\n"), 11)); session.SendPacket(session.Character.GenerateSay("-----------------------------------------------", 10)); } session.Character.LoadSpeed(); session.Character.LoadSkills(); session.Character.LoadPassiveSkills(); session.SendPacket(session.Character.GenerateTit()); session.SendPacket(session.Character.GenerateSpPoint()); session.SendPacket("rsfi 1 1 0 9 0 9"); if (session.Character.Hp <= 0) { ServerManager.Instance.ReviveFirstPosition(session.Character.CharacterId); } else { ServerManager.Instance.ChangeMap(session.Character.CharacterId); } session.SendPacket(session.Character.GenerateSki()); session.SendPacket( $"fd {session.Character.Reputation} 0 {(int)session.Character.Dignity} {Math.Abs(session.Character.GetDignityIco())}"); session.SendPacket(session.Character.GenerateFd()); session.SendPacket("rage 0 250000"); session.SendPacket("rank_cool 0 0 18000"); ItemInstance specialistInstance = session.Character.Inventory.LoadBySlotAndType(8, InventoryType.Wear); StaticBonusDTO medal = session.Character.StaticBonusList.Find(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); if (medal != null) { session.SendPacket( session.Character.GenerateSay(Language.Instance.GetMessageFromKey("LOGIN_MEDAL"), 12)); } if (session.Character.StaticBonusList.Any(s => s.StaticBonusType == StaticBonusType.PetBasket)) { session.SendPacket("ib 1278 1"); } if (session.Character.MapInstance.Map.MapTypes.Any(m => m.MapTypeId == (short)MapTypeEnum.CleftOfDarkness)) { session.SendPacket("bc 0 0 0"); } if (specialistInstance != null) { session.SendPacket(session.Character.GenerateSpPoint()); } session.SendPacket("scr 0 0 0 0 0 0"); for (int i = 0; i < 10; i++) { session.SendPacket($"bn {i} {Language.Instance.GetMessageFromKey($"BN{i}")}"); } session.SendPacket(session.Character.GenerateExts()); session.SendPacket(session.Character.GenerateMlinfo()); session.SendPacket(UserInterfaceHelper.GeneratePClear()); session.SendPacket(session.Character.GeneratePinit()); session.SendPacket(session.Character.GeneratePinit()); session.SendPackets(session.Character.Mates.Where(s => s.IsTeamMember).OrderBy(s => s.MateType).Select(s => s.GeneratePst())); foreach (var mate in session.Character.Mates.Where(s => s.IsTeamMember)) { mate.JoinTeam(true); } session.SendPacket("zzim"); session.SendPacket( $"twk 1 {session.Character.CharacterId} {session.Account.Name} {session.Character.Name} {session.Account.Password.Substring(0, 16)}"); long?familyId = DAOFactory.FamilyCharacterDAO.LoadByCharacterId(session.Character.CharacterId)?.FamilyId; if (familyId.HasValue) { session.Character.Family = ServerManager.Instance.FamilyList[familyId.Value]; } if (session.Character.Family != null && session.Character.FamilyCharacter != null) { session.SendPacket(session.Character.GenerateGInfo()); session.SendPackets(session.Character.GetFamilyHistory()); session.SendPacket(session.Character.GenerateFamilyMember()); session.SendPacket(session.Character.GenerateFamilyMemberMessage()); session.SendPacket(session.Character.GenerateFamilyMemberExp()); session.Character.Faction = session.Character.Family.FamilyCharacters .Find(s => s.Authority.Equals(FamilyAuthority.Head))?.Character ?.Faction ?? FactionType.None; if (!string.IsNullOrWhiteSpace(session.Character.Family.FamilyMessage)) { session.SendPacket( UserInterfaceHelper.GenerateInfo("--- Family Message ---\n" + session.Character.Family.FamilyMessage)); } } // qstlist target sqst bf session.SendPacket("act6"); session.SendPacket(session.Character.GenerateFaction()); session.SendPackets(session.Character.GenerateScP()); session.SendPackets(session.Character.GenerateScN()); #pragma warning disable 618 session.Character.GenerateStartupInventory(); #pragma warning restore 618 session.SendPacket(session.Character.GenerateGold()); session.SendPackets(session.Character.GenerateQuicklist()); string clinit = "clinit"; string flinit = "flinit"; string kdlinit = "kdlinit"; foreach (CharacterDTO character in ServerManager.Instance.TopComplimented) { clinit += $" {character.CharacterId}|{character.Level}|{character.HeroLevel}|{character.Compliment}|{character.Name}"; } foreach (CharacterDTO character in ServerManager.Instance.TopReputation) { flinit += $" {character.CharacterId}|{character.Level}|{character.HeroLevel}|{character.Reputation}|{character.Name}"; } foreach (CharacterDTO character in ServerManager.Instance.TopPoints) { kdlinit += $" {character.CharacterId}|{character.Level}|{character.HeroLevel}|{character.Act4Points}|{character.Name}"; } session.CurrentMapInstance?.Broadcast(session.Character.GenerateGidx()); session.SendPacket(session.Character.GenerateFinit()); session.SendPacket(session.Character.GenerateBlinit()); session.SendPacket(clinit); session.SendPacket(flinit); session.SendPacket(kdlinit); session.Character.LastPvpRevive = DateTime.UtcNow; List <PenaltyLogDTO> warning = DAOFactory.PenaltyLogDAO.LoadByAccount(session.Character.AccountId) .Where(p => p.Penalty == PenaltyType.Warning).ToList(); if (warning.Count > 0) { session.SendPacket(UserInterfaceHelper.GenerateInfo( string.Format(Language.Instance.GetMessageFromKey("WARNING_INFO"), warning.Count))); } // finfo - friends info session.Character.LoadMail(); session.Character.LoadSentMail(); session.Character.DeleteTimeout(); foreach (StaticBuffDTO staticBuff in DAOFactory.StaticBuffDAO.LoadByCharacterId(session.Character .CharacterId)) { session.Character.AddStaticBuff(staticBuff); } if (session.Character.Authority == AuthorityType.BitchNiggerFaggot) { CommunicationServiceClient.Instance.SendMessageToCharacter(new ScsCharacterMessage { DestinationCharacterId = null, SourceCharacterId = session.Character.CharacterId, SourceWorldId = ServerManager.Instance.WorldId, Message = $"User {session.Character.Name} with rank BitchNiggerFaggot has logged in, don't trust *it*!", Type = MessageType.Shout }); } string parsedip = session.IpAddress.Split(':')[1].Replace("//", ""); List <GeneralLogDTO> tmp = DAOFactory.GeneralLogDAO.LoadByLogType("DailyLogin", null, true).ToList(); if (!tmp.Any(s => s.AccountId.Equals(session.Account.AccountId))) { session.Character.RaidDracoRuns = 0; session.Character.RaidGlacerusRuns = 0; DAOFactory.GeneralLogDAO.WriteGeneralLog(session.Account.AccountId, parsedip, null, "DailyLogin", "World"); } GeneralLogDTO securityLog = DAOFactory.GeneralLogDAO.LoadByLogType("TOTP", null, true) .LastOrDefault(s => s.AccountId == session.Account.AccountId); if (securityLog?.IpAddress.Split(':')[1].Replace("//", "") != parsedip || securityLog.LogData != "SUCCESS") { if (string.IsNullOrWhiteSpace(session.Account.TotpSecret)) { session.SendPacket( UserInterfaceHelper.GenerateModal( Language.Instance.GetMessageFromKey("WELCOME ON XARION").Replace("\\n", "\n"), 1)); session.Account.IsVerified = true; } else { session.SendPacket( session.Character.GenerateSay( Language.Instance.GetMessageFromKey("TOTP_INFO").Replace("\\n", "\n"), 12)); session.SendPacket(UserInterfaceHelper.GenerateGuri(10, 11, session.Character.CharacterId, 2)); Observable.Timer(TimeSpan.FromSeconds(60)).Subscribe(o => { if (session.Account.IsVerified == false) { session.Disconnect(); } }); } } else { session.Account.IsVerified = true; } session.Character.QuestManager = new QuestManager(session); QuestModel firstQuestModel = ServerManager.Instance.QuestModelList.FirstOrDefault(s => s.QuestGiver.Type == QuestGiverType.InitialQuest); if (firstQuestModel != null && DAOFactory.QuestProgressDAO.LoadByCharacterId(session.Character.CharacterId) .All(s => s.QuestId != firstQuestModel.QuestId)) { session.Character.QuestManager.AddQuest(firstQuestModel.QuestId); } #region !Multi baguette detection! bool trapTriggered = false; bool possibleUnregisteredException = false; long[][] connections = CommunicationServiceClient.Instance.RetrieveOnlineCharacters(session.Character.CharacterId); foreach (long[] connection in connections) { if (connection != null) { CharacterDTO characterDTO = DAOFactory.CharacterDAO.LoadById(connection[0]); if (characterDTO != null) { MultiAccountExceptionDTO exception = DAOFactory.MultiAccountExceptionDAO.LoadByAccount(characterDTO.AccountId); if (exception == null && connections.Length > 3) { trapTriggered = true; } if (exception != null && connections.Length > exception.ExceptionLimit) { possibleUnregisteredException = true; } } } } if (possibleUnregisteredException) { foreach (ClientSession team in ServerManager.Instance.Sessions.Where(s => s.Account.Authority == AuthorityType.GameMaster || s.Account.Authority == AuthorityType.Moderator)) { if (team.HasSelectedCharacter) { team.SendPacket(team.Character.GenerateSay( string.Format("Possible unregistered exception detected for user: "******", CharacterId: " + session.Character.CharacterId), 12)); } } } if (trapTriggered) { foreach (ClientSession team in ServerManager.Instance.Sessions.Where(s => s.Account.Authority == AuthorityType.GameMaster || s.Account.Authority == AuthorityType.Moderator)) { if (team.HasSelectedCharacter) { team.SendPacket(team.Character.GenerateSay( string.Format("Possible multi account abusing user: "******", CharacterId: " + session.Character.CharacterId), 12)); } } } #endregion }
public static void NRun(ClientSession Session, byte type, short runner, short npcid) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == npcid); switch (runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.GetAllItems().All(i => i.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + type * 14), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + type * 13), type: InventoryType.Wear); switch (type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)type); } else { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tp = npc.Recipes; foreach (Recipe s in tp) { if (s.Amount > 0) { recipelist = recipelist + $" {s.ItemVNum}"; } } recipelist += " -100"; Session.SendPacket(recipelist); } break; case 16: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { if (Session.Character.Gold >= 1000 * type) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); Session.Character.Gold -= 1000 * type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 26: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { if (Session.Character.Gold >= 5000 * type) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); Session.Character.Gold -= 5000 * type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 45: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { if (Session.Character.Gold >= 500) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 132: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 150: if (npc != null) { if (Session.Character.Family != null) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeathId, 153, 145); } else { Session.SendPacket(Session.Character.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 23: Session.SendPacket(Session.Character.GenerateInbox(type, 14)); //Session.SendPacket(Session.Character.GenerateFamilyMember()); break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5002: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { Session.SendPacket("it 3"); ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 5001: if (npc != null) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 130, 12, 40); } break; case 5011: if (npc != null) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == type); if (tp != null) { ServerManager.Instance.LeaveMap(Session.Character.CharacterId); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), runner)); break; } }
public static void NRun(ClientSession Session, NRunPacket packet) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.Find(s => s.MapNpcId == packet.NpcId); TeleporterDTO tp; switch (packet.Runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (packet.Type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.All(i => i.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + (packet.Type * 14)), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + (packet.Type * 13)), type: InventoryType.Wear); switch (packet.Type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)packet.Type); } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 4: Mate mate = Session.Character.Mates.Find(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (Session.Character.Level >= mate.Level) { Mate teammate = Session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.IsTeamMember = false; teammate.MapX = teammate.PositionX; teammate.MapY = teammate.PositionY; } mate.IsTeamMember = true; } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } break; case 4: if (mate != null) { if (Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } else { Session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } break; } break; case 5: if (mate != null) { Session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null && Session.Character.Miniland != Session.Character.MapInstance) { mate.IsTeamMember = false; Session.CurrentMapInstance.Broadcast(mate.GenerateOut()); Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); Session.SendPacket(UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } break; case 7: if (mate != null) { if (Session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { Session.SendPacket(UserInterfaceHelper.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null && Session.Character.Level >= mate.Level) { mate.PositionX = (short)(Session.Character.PositionX + (mate.MateType == MateType.Partner ? -1 : 1)); mate.PositionY = (short)(Session.Character.PositionY + 1); mate.IsTeamMember = true; Session.CurrentMapInstance?.Broadcast(mate.GenerateIn()); } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } Session.SendPacket(Session.Character.GeneratePinit()); Session.SendPackets(Session.Character.GeneratePst()); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {packet.Type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tps = npc.Recipes; recipelist = tps.Where(s => s.Amount > 0).Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}"); recipelist += " -100"; Session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { Session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: Session.Character.SetRespawnPoint(1, 79, 116); break; case 20: Session.Character.SetRespawnPoint(20, 9, 92); break; case 145: Session.Character.SetRespawnPoint(145, 13, 110); break; } Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 1000 * packet.Type) { Session.Character.Gold -= 1000 * packet.Type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - Session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !Session.HasCurrentMapInstance || ServerManager.Instance.ChannelId == 51 || Session.CurrentMapInstance.MapInstanceId == ServerManager.Instance.ArenaInstance.MapInstanceId || Session.CurrentMapInstance.MapInstanceId == ServerManager.Instance.FamilyArenaInstance.MapInstanceId) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (Session.Character.Gold >= 500 * (1 + packet.Type)) { Session.Character.LastPortal = currentRunningSeconds; Session.Character.Gold -= 500 * (1 + packet.Type); Session.SendPacket(Session.Character.GenerateGold()); MapCell pos = packet.Type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition() : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId, pos.X, pos.Y); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: Session.SendPacket(Session.Character.GenerateNpcDialog(17)); break; case 26: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 5000 * packet.Type) { Session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 45: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 500) { Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 132: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 135: if (TalentArena.IsRunning) { TalentArena.RegisteredParticipants[Session.Character.CharacterId] = Session; Session.SendPacket(UserInterfaceHelper.GenerateBSInfo(0, 3, 300, 5)); } break; case 150: if (npc != null) { if (Session.Character.Family != null) { if (Session.Character.Family.LandOfDeath != null && npc.EffectActivated) { if (Session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 1600: Session.SendPacket(Session.Character.OpenFamilyWarehouse()); break; case 1601: Session.SendPackets(Session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (Session.Character.Family?.FamilyLevel >= 3 && Session.Character.Family.WarehouseSize < 21) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 21; Session.Character.Gold -= 500000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (Session.Character.Family?.FamilyLevel >= 7 && Session.Character.Family.WarehouseSize < 49) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 49; Session.Character.Gold -= 2000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (Session.Character.Family?.FamilyLevel >= 5 && Session.Character.Family.MaxSize < 70) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 70; Session.Character.Gold -= 5000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (Session.Character.Family?.FamilyLevel >= 9 && Session.Character.Family.MaxSize < 100) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 100; Session.Character.Gold -= 10000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (Session.Character.Group?.CharacterCount == 3) { foreach (ClientSession s in Session.Character.Group.Characters.GetAllItems()) { if (s.Character.Family != null) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } } if (Session.Character.Group == null || Session.Character.Group.CharacterCount != 3) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } Session.SendPacket(UserInterfaceHelper.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (Session.Character.Family == null) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (Session.Character.Family != null && Session.Character.FamilyCharacter != null && Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { Session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } Session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.Find(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5002: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { //Session.SendPacket("it 3"); if (ServerManager.Instance.ChannelId == 51) { string connection = CommunicationServiceClient.Instance.RetrieveOriginWorld(Session.Account.AccountId); if (string.IsNullOrWhiteSpace(connection)) { return; } Session.Character.MapId = tp.MapId; Session.Character.MapX = tp.MapX; Session.Character.MapY = tp.MapY; int port = Convert.ToInt32(connection.Split(':')[1]); Session.Character.ChangeChannel(connection.Split(':')[0], port, 3); } else { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 5001: if (npc != null) { MapInstance map = null; switch (Session.Character.Faction) { case FactionType.None: Session.SendPacket(UserInterfaceHelper.GenerateInfo("You need to be part of a faction to join Act 4")); return; case FactionType.Angel: map = ServerManager.GetAllMapInstances().Find(s => s.MapInstanceType.Equals(MapInstanceType.Act4ShipAngel)); break; case FactionType.Demon: map = ServerManager.GetAllMapInstances().Find(s => s.MapInstanceType.Equals(MapInstanceType.Act4ShipDemon)); break; } if (map == null || npc.EffectActivated) { Session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("SHIP_NOTARRIVED"), 0)); return; } if (3000 > Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Gold -= 3000; MapCell pos = map.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, map.MapInstanceId, pos.X, pos.Y); } break; case 5004: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 145, 50, 41); } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; default: Logger.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); break; } }
public static void NRun(ClientSession Session, NRunPacket packet) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == packet.NpcId); TeleporterDTO tp; Random rand = new Random(); switch (packet.Runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (packet.Type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.All(i => i.Value.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + packet.Type * 14), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + packet.Type * 13), type: InventoryType.Wear); switch (packet.Type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)packet.Type); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 4: Mate mate = Session.Character.Mates.FirstOrDefault(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (Session.Character.Level >= mate.Level) { Mate teammate = Session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.IsTeamMember = false; teammate.MapX = teammate.PositionX; teammate.MapY = teammate.PositionY; } mate.IsTeamMember = true; } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } break; case 4: if (mate != null) { if (Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } else { Session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } break; } break; case 5: if (mate != null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null) { if (Session.Character.Miniland != Session.Character.MapInstance) { mate.IsTeamMember = false; Session.CurrentMapInstance.Broadcast(mate.GenerateOut()); Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } } break; case 7: if (mate != null) { if (Session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null) { if (Session.Character.Level >= mate.Level) { mate.PositionX = (short)(Session.Character.PositionX + 1); } mate.PositionY = (short)(Session.Character.PositionY + 1); mate.IsTeamMember = true; Session.CurrentMapInstance.Broadcast(mate.GenerateIn()); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } Session.SendPacket(Session.Character.GeneratePinit()); Session.SendPackets(Session.Character.GeneratePst()); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {packet.Type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List<Recipe> tps = npc.Recipes; recipelist = tps.Where(s => s.Amount > 0).Aggregate(recipelist, (current, s) => current + $" {s.ItemVNum}"); recipelist += " -100"; Session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { Session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: Session.Character.SetRespawnPoint(1, 79, 116); break; case 20: Session.Character.SetRespawnPoint(20, 9, 92); break; case 145: Session.Character.SetRespawnPoint(145, 13, 110); break; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 1000 * packet.Type) { Session.Character.Gold -= 1000 * packet.Type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket( Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - Session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !Session.HasCurrentMapInstance || Session.CurrentMapInstance.MapInstanceType == MapInstanceType.Act4Instance) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (Session.Character.Gold >= 500 * (1 + packet.Type)) { Session.Character.LastPortal = currentRunningSeconds; Session.Character.Gold -= 500 * (1 + packet.Type); Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.TeleportOnRandomPlaceInMap(Session, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: Session.SendPacket(Session.Character.GenerateNpcDialog(17)); break; case 26: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 5000 * packet.Type) { Session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 45: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 500) { Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket( Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } break; case 132: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 137: Session.SendPacket("taw_open"); break; case 138: ConcurrentBag<ArenaTeamMember> at = ServerManager.Instance.ArenaTeams.OrderBy(s => rand.Next()).FirstOrDefault(); if (at != null) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, at.FirstOrDefault(s => s.Session != null).Session.CurrentMapInstance.MapInstanceId, 69, 100); ArenaTeamMember zenas = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ZENAS); ArenaTeamMember erenia = at.OrderBy(s => s.Order).FirstOrDefault(s => s.Session != null && !s.Dead && s.ArenaTeamType == ArenaTeamType.ERENIA); Session.SendPacket(erenia.Session.Character.GenerateTaM(0)); Session.SendPacket(erenia.Session.Character.GenerateTaM(3)); Session.SendPacket("taw_sv 0"); Session.SendPacket(zenas.Session.Character.GenerateTaP(0, true)); Session.SendPacket(erenia.Session.Character.GenerateTaP(2, true)); Session.SendPacket(zenas.Session.Character.GenerateTaFc(0)); Session.SendPacket(erenia.Session.Character.GenerateTaFc(1)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NO_TALENT_ARENA"))); } break; case 135: if (!ServerManager.Instance.StartedEvents.Contains(EventType.TALENTARENA)) { Session.SendPacket(npc?.GenerateSay(Language.Instance.GetMessageFromKey("ARENA_NOT_OPEN"), 10)); } else { int tickets = 5 - Session.Character.GeneralLogs.Count(s => s.LogType == "TalentArena" && s.Timestamp.Date == DateTime.Today); if (ServerManager.Instance.ArenaMembers.All(s => s.Session != Session) && tickets > 0) { if (ServerManager.Instance.IsCharacterMemberOfGroup(Session.Character.CharacterId)) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 0)); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TALENT_ARENA_GROUP"), 10)); } else { Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("ARENA_TICKET_LEFT"), tickets), 10)); ServerManager.Instance.ArenaMembers.Add(new ArenaMember { ArenaType = EventType.TALENTARENA, Session = Session, GroupId = null, Time = 0 }); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 0)); Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("TALENT_ARENA_NO_MORE_TICKET"), 10)); } } break; case 150: if (npc != null) { if (Session.Character.Family != null) { if (Session.Character.Family.LandOfDeath != null && npc.EffectActivated) { if (Session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; case 1600: Session.SendPacket(Session.Character.OpenFamilyWarehouse()); break; case 1601: Session.SendPackets(Session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 3 && Session.Character.Family.WarehouseSize < 21) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 21; Session.Character.Gold -= 500000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 7 && Session.Character.Family.WarehouseSize < 49) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 49; Session.Character.Gold -= 2000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 5 && Session.Character.Family.MaxSize < 70) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 70; Session.Character.Gold -= 5000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 9 && Session.Character.Family.MaxSize < 100) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 100; Session.Character.Gold -= 10000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (Session.Character.Group != null && Session.Character.Group.CharacterCount == 3) { if (Session.Character.Group.Characters.Any(s => s.Character.Family != null)) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } if (Session.Character.Group == null || Session.Character.Group.CharacterCount != 3) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (Session.Character.Family == null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (Session.Character.Family != null && Session.Character.FamilyCharacter != null && Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } Session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5001: if (npc != null) { MapInstance map = null; switch (Session.Character.Faction) { case FactionType.Neutral: Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo("NEED_FACTION_ACT4")); return; case FactionType.Angel: map = ServerManager.Instance.Act4ShipAngel; break; case FactionType.Demon: map = ServerManager.Instance.Act4ShipDemon; break; } if (map == null || !npc.EffectActivated) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("SHIP_NOTARRIVED"), 0)); return; } if (3000 > Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Gold -= 3000; MapCell pos = map.Map.GetRandomPosition(); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, map.MapInstanceId, pos.X, pos.Y); } break; case 5002: if (npc != null) { tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { Session.SendPacket("it 3"); SerializableWorldServer connection = CommunicationServiceClient.Instance.GetPreviousChannelByAccountId(Session.Account.AccountId); Session.Character.MapId = tp.MapId; Session.Character.MapX = tp.MapX; Session.Character.MapY = tp.MapY; Session.Character.ChangeChannel(connection.EndPointIp, connection.EndPointPort, 3); } } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: tp = npc?.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); break; } }
private void ExecuteHandler(ClientSession session) { SpinWait.SpinUntil(() => !ServerManager.Instance.InBazaarRefreshMode); StaticBonusDTO medal = session.Character.StaticBonusList.Find(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); long price = Price * Amount; long taxmax = price > 100000 ? price / 200 : 500; long taxmin = price >= 4000 ? (60 + ((price - 4000) / 2000 * 30) > 10000 ? 10000 : 60 + ((price - 4000) / 2000 * 30)) : 50; long tax = medal == null ? taxmax : taxmin; long maxGold = ServerManager.Instance.Configuration.MaxGold; if (session.Character.Gold < tax || Amount <= 0 || session.Character.ExchangeInfo?.ExchangeList.Count > 0 || session.Character.IsShopping) { return; } ItemInstance it = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType == 4 ? 0 : (InventoryType)InventoryType); if (it?.Item.IsSoldable != true || !it.Item.IsTradable || (it.IsBound && !(it.Item.Type == Domain.InventoryType.Equipment && (it.Item.ItemType == ItemType.Armor || it.Item.ItemType == ItemType.Weapon)))) { return; } if (session.Character.Inventory.CountItemInAnInventory(Domain.InventoryType.Bazaar) > 10 * (medal == null ? 1 : 10)) { session.SendPacket( UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("LIMIT_EXCEEDED"), 0)); return; } if (price >= (medal == null ? 1000000 : maxGold)) { session.SendPacket( UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("PRICE_EXCEEDED"), 0)); return; } if (Price < 0) { return; } ItemInstance bazaar = session.Character.Inventory.AddIntoBazaarInventory( InventoryType == 4 ? 0 : (InventoryType)InventoryType, Slot, Amount); if (bazaar == null) { return; } short duration; switch (Durability) { case 1: duration = 24; break; case 2: duration = 168; break; case 3: duration = 360; break; case 4: duration = 720; break; default: return; } DAOFactory.ItemInstanceDAO.InsertOrUpdate(bazaar); BazaarItemDTO bazaarItem = new BazaarItemDTO { Amount = bazaar.Amount, DateStart = DateTime.UtcNow, Duration = duration, IsPackage = IsPackage != 0, MedalUsed = medal != null, Price = Price, SellerId = session.Character.CharacterId, ItemInstanceId = bazaar.Id }; DAOFactory.BazaarItemDAO.InsertOrUpdate(ref bazaarItem); ServerManager.Instance.BazaarRefresh(bazaarItem.BazaarItemId); session.Character.Gold -= tax; session.SendPacket(session.Character.GenerateGold()); session.SendPacket(session.Character.GenerateSay(Language.Instance.GetMessageFromKey("OBJECT_IN_BAZAAR"), 10)); session.SendPacket(UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("OBJECT_IN_BAZAAR"), 0)); GameLogger.Instance.LogBazaarInsert(ServerManager.Instance.ChannelId, session.Character.Name, session.Character.CharacterId, bazaarItem, bazaar.ItemVNum); session.SendPacket("rc_reg 1"); }
public static void NRun(ClientSession Session, NRunPacket packet) { if (!Session.HasCurrentMapInstance) { return; } MapNpc npc = Session.CurrentMapInstance.Npcs.FirstOrDefault(s => s.MapNpcId == packet.NpcId); switch (packet.Runner) { case 1: if (Session.Character.Class != (byte)ClassType.Adventurer) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NOT_ADVENTURER"), 0)); return; } if (Session.Character.Level < 15 || Session.Character.JobLevel < 20) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOW_LVL"), 0)); return; } if (packet.Type == (byte)Session.Character.Class) { return; } if (Session.Character.Inventory.GetAllItems().All(i => i.Type != InventoryType.Wear)) { Session.Character.Inventory.AddNewToInventory((short)(4 + packet.Type * 14), type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory((short)(81 + packet.Type * 13), type: InventoryType.Wear); switch (packet.Type) { case 1: Session.Character.Inventory.AddNewToInventory(68, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2082, 10); break; case 2: Session.Character.Inventory.AddNewToInventory(78, type: InventoryType.Wear); Session.Character.Inventory.AddNewToInventory(2083, 10); break; case 3: Session.Character.Inventory.AddNewToInventory(86, type: InventoryType.Wear); break; } Session.CurrentMapInstance?.Broadcast(Session.Character.GenerateEq()); Session.SendPacket(Session.Character.GenerateEquipment()); Session.Character.ChangeClass((ClassType)packet.Type); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("EQ_NOT_EMPTY"), 0)); } break; case 2: Session.SendPacket("wopen 1 0"); break; case 4: Mate mate = Session.Character.Mates.FirstOrDefault(s => s.MateTransportId == packet.NpcId); switch (packet.Type) { case 2: if (mate != null) { if (Session.Character.Level >= mate.Level) { Mate teammate = Session.Character.Mates.Where(s => s.IsTeamMember).FirstOrDefault(s => s.MateType == mate.MateType); if (teammate != null) { teammate.IsTeamMember = false; teammate.MapX = teammate.PositionX; teammate.MapY = teammate.PositionY; } mate.IsTeamMember = true; } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } } break; case 3: if (mate != null && Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } break; case 4: if (mate != null) { if (Session.Character.Miniland == Session.Character.MapInstance) { mate.IsTeamMember = false; mate.MapX = mate.PositionX; mate.MapY = mate.PositionY; } else { Session.SendPacket($"qna #n_run^4^5^3^{mate.MateTransportId} {Language.Instance.GetMessageFromKey("ASK_KICK_PET")}"); } break; } break; case 5: if (mate != null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^6^3^{mate.MateTransportId}")); } break; case 6: if (mate != null) { if (Session.Character.Miniland != Session.Character.MapInstance) { mate.IsTeamMember = false; Session.CurrentMapInstance.Broadcast(mate.GenerateOut()); Session.SendPacket(Session.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PET_KICKED"), mate.Name), 0)); } } break; case 7: if (mate != null) { if (Session.Character.Mates.Any(s => s.MateType == mate.MateType && s.IsTeamMember)) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 11)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("ALREADY_PET_IN_TEAM"), 0)); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateDelay(3000, 10, $"#n_run^4^9^3^{mate.MateTransportId}")); } } break; case 9: if (mate != null) { if (Session.Character.Level >= mate.Level) { mate.PositionX = (short)(Session.Character.PositionX + 1); } mate.PositionY = (short)(Session.Character.PositionY + 1); mate.IsTeamMember = true; Session.CurrentMapInstance.Broadcast(mate.GenerateIn()); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PET_HIGHER_LEVEL"), 0)); } break; } Session.SendPacket(Session.Character.GeneratePinit()); Session.Character.SendPst(); break; case 10: Session.SendPacket("wopen 3 0"); break; case 12: Session.SendPacket($"wopen {packet.Type} 0"); break; case 14: Session.SendPacket("wopen 27 0"); string recipelist = "m_list 2"; if (npc != null) { List <Recipe> tp = npc.Recipes; foreach (Recipe s in tp) { if (s.Amount > 0) { recipelist = recipelist + $" {s.ItemVNum}"; } } recipelist += " -100"; Session.SendPacket(recipelist); } break; case 15: if (npc != null) { if (packet.Value == 2) { Session.SendPacket($"qna #n_run^15^1^1^{npc.MapNpcId} {Language.Instance.GetMessageFromKey("ASK_CHANGE_SPAWNLOCATION")}"); } else { switch (npc.MapId) { case 1: Session.Character.SetRespawnPoint(1, 79, 116); break; case 20: Session.Character.SetRespawnPoint(20, 9, 92); break; case 145: Session.Character.SetRespawnPoint(145, 13, 110); break; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("RESPAWNLOCATION_CHANGED"), 0)); } } break; case 16: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 1000 * packet.Type) { Session.Character.Gold -= 1000 * packet.Type; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 17: double currentRunningSeconds = (DateTime.Now - Process.GetCurrentProcess().StartTime.AddSeconds(-50)).TotalSeconds; double timeSpanSinceLastPortal = currentRunningSeconds - Session.Character.LastPortal; if (!(timeSpanSinceLastPortal >= 4) || !Session.HasCurrentMapInstance) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("CANT_MOVE"), 10)); return; } if (Session.Character.Raid != null && Session.Character.Raid.Launched) { Session.SendPacket(Session.Character.GenerateSay("Vous n'avez pas le droit d'aller à l'arène une fois en raid", 10)); // french in source? nou! break; } if (Session.Character.Gold >= 500 * (1 + packet.Type)) { Session.Character.LastPortal = currentRunningSeconds; Session.Character.Gold -= 500 * (1 + packet.Type); Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.MapInstanceId : ServerManager.Instance.FamilyArenaInstance.MapInstanceId, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition().X : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition().X, packet.Type == 0 ? ServerManager.Instance.ArenaInstance.Map.GetRandomPosition().Y : ServerManager.Instance.FamilyArenaInstance.Map.GetRandomPosition().Y); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } break; case 18: Session.SendPacket(Session.Character.GenerateNpcDialog(17)); break; case 26: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 5000 * packet.Type) { Session.Character.Gold -= 5000 * packet.Type; ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 45: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { if (Session.Character.Gold >= 500) { Session.Character.Gold -= 500; Session.SendPacket(Session.Character.GenerateGold()); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); } } } break; case 132: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 150: if (npc != null) { if (Session.Character.Family != null) { if (Session.Character.Family.LandOfDeath != null && !npc.EffectActivated) { if (Session.Character.Level >= 55) { ServerManager.Instance.ChangeMapInstance(Session.Character.CharacterId, Session.Character.Family.LandOfDeath.MapInstanceId, 153, 145); } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_REQUIERE_LVL"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("LOD_CLOSED"), 0)); } } else { Session.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("NEED_FAMILY"), 0)); } } break; case 301: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 1600: Session.SendPacket(Session.Character.OpenFamilyWarehouse()); break; case 1601: Session.SendPackets(Session.Character.OpenFamilyWarehouseHist()); break; case 1602: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 3 && Session.Character.Family.WarehouseSize < 21) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (500000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 21; Session.Character.Gold -= 500000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1603: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 7 && Session.Character.Family.WarehouseSize < 49) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (2000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.WarehouseSize = 49; Session.Character.Gold -= 2000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1604: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 5 && Session.Character.Family.MaxSize < 70) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (5000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 70; Session.Character.Gold -= 5000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 1605: if (Session.Character.Family != null && Session.Character.Family.FamilyLevel >= 9 && Session.Character.Family.MaxSize < 100) { if (Session.Character.FamilyCharacter.Authority == FamilyAuthority.Head) { if (10000000 >= Session.Character.Gold) { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } Session.Character.Family.MaxSize = 100; Session.Character.Gold -= 10000000; Session.SendPacket(Session.Character.GenerateGold()); FamilyDTO fam = Session.Character.Family; DAOFactory.FamilyDAO.InsertOrUpdate(ref fam); ServerManager.Instance.FamilyRefresh(Session.Character.Family.FamilyId); } else { Session.SendPacket(Session.Character.GenerateSay(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 10)); Session.SendPacket(UserInterfaceHelper.Instance.GenerateModal(Language.Instance.GetMessageFromKey("ONLY_HEAD_CAN_BUY"), 1)); } } break; case 23: if (packet.Type == 0) { if (Session.Character.Group != null && Session.Character.Group.CharacterCount == 3) { foreach (ClientSession s in Session.Character.Group.Characters) { if (s.Character.Family != null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("GROUP_MEMBER_ALREADY_IN_FAMILY"))); return; } } } if (Session.Character.Group == null || Session.Character.Group.CharacterCount != 3) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("FAMILY_GROUP_NOT_FULL"))); return; } Session.SendPacket(UserInterfaceHelper.Instance.GenerateInbox($"#glmk^ {14} 1 {Language.Instance.GetMessageFromKey("CREATE_FAMILY").Replace(' ', '^')}")); } else { if (Session.Character.Family == null) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_IN_FAMILY"))); return; } if (Session.Character.Family != null && Session.Character.FamilyCharacter != null && Session.Character.FamilyCharacter.Authority != FamilyAuthority.Head) { Session.SendPacket(UserInterfaceHelper.Instance.GenerateInfo(Language.Instance.GetMessageFromKey("NOT_FAMILY_HEAD"))); return; } Session.SendPacket($"qna #glrm^1 {Language.Instance.GetMessageFromKey("DISMISS_FAMILY")}"); } break; case 60: StaticBonusDTO medal = Session.Character.StaticBonusList.FirstOrDefault(s => s.StaticBonusType == StaticBonusType.BazaarMedalGold || s.StaticBonusType == StaticBonusType.BazaarMedalSilver); byte Medal = 0; int Time = 0; if (medal != null) { Medal = medal.StaticBonusType == StaticBonusType.BazaarMedalGold ? (byte)MedalType.Gold : (byte)MedalType.Silver; Time = (int)(medal.DateEnd - DateTime.Now).TotalHours; } Session.SendPacket($"wopen 32 {Medal} {Time}"); break; case 5002: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { Session.SendPacket("it 3"); ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; case 5001: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 130, 12, 40); } break; case 5011: if (npc != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, 170, 127, 46); } break; case 5012: if (npc != null) { TeleporterDTO tp = npc.Teleporters?.FirstOrDefault(s => s.Index == packet.Type); if (tp != null) { ServerManager.Instance.ChangeMap(Session.Character.CharacterId, tp.MapId, tp.MapX, tp.MapY); } } break; default: Logger.Log.Warn(string.Format(Language.Instance.GetMessageFromKey("NO_NRUN_HANDLER"), packet.Runner)); break; } }