private static void HandleUse(GameSession session, PacketReader packet) { string uuid = packet.ReadMapleString(); MapInteractActor actor = MapEntityStorage.GetInteractActors(session.Player.MapId).FirstOrDefault(x => x.Uuid == uuid); if (actor == null) { return; } if (actor.Type == InteractActorType.Binoculars) { List <QuestStatus> questList = session.Player.QuestList; foreach (QuestStatus item in questList.Where(x => x.Basic.QuestID >= 72000000 && x.Condition != null)) { QuestCondition condition = item.Condition.FirstOrDefault(x => x.Code != "" && int.Parse(x.Code) == actor.Id); if (condition == null) { continue; } item.Completed = true; item.CompleteTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); session.Send(QuestPacket.CompleteExplorationGoal(item.Basic.QuestID)); session.Send(QuestPacket.CompleteQuest(item.Basic.QuestID)); break; } } session.Send(InteractActorPacket.UseObject(actor)); session.Send(InteractActorPacket.Extra(actor)); }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { List <QuestStatus> list = new List <QuestStatus>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); if (session.Player.QuestList.Exists(x => x.Basic.QuestID == questId)) { continue; } QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); QuestStatus questStatus = new QuestStatus() { Basic = metadata.Basic, Started = true, StartTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Condition = metadata.Condition, Reward = metadata.Reward, RewardItems = metadata.RewardItem }; list.Add(questStatus); } session.Player.QuestList.AddRange(list); session.Send(QuestPacket.SendQuests(list)); }
/// <summary> /// Increase the current condition value by 1. /// If the condition value is already at the maximum, the condition is completed. /// Send the respective quest packets to the player. /// </summary> private static void UpdateConditions(this IEnumerable <Condition> relevantConditions, GameSession session, QuestStatus quest) { foreach (Condition condition in relevantConditions) { if (condition.Goal != 0 && condition.Goal == condition.Current) { continue; } condition.Current++; if (condition.Current >= condition.Goal) { condition.Completed = true; } session.Send(QuestPacket.UpdateCondition(quest.Basic.Id, quest.Condition)); if (!condition.Completed || quest.Basic.QuestType is not QuestType.Exploration) { continue; } quest.State = QuestState.Completed; quest.AmountCompleted++; quest.CompleteTimestamp = TimeInfo.Now(); session.Player.Levels.GainExp(quest.Reward.Exp); session.Player.Wallet.Meso.Modify(quest.Reward.Money); session.Send(QuestPacket.CompleteQuest(quest.Basic.Id, false)); DatabaseManager.Quests.Update(quest); } }
public static void UpdateQuest(GameSession session, string code, string type, string target = "") { List <QuestStatus> questList = session.Player.QuestList.Where(x => x.Condition != null && x.Condition.Any(x => x.Type == type) && x.Started && !x.Completed).ToList(); foreach (QuestStatus quest in questList) { Condition condition = quest.Condition .FirstOrDefault(x => x.Codes != null && x.Codes.Length != 0 && x.Codes.Contains(code) && x.Target.Contains(target) && !x.Completed); if (condition == null) { continue; } if (condition.Goal != 0) { if (condition.Goal == condition.Current) { return; } } condition.Current++; if (condition.Current >= condition.Goal) { condition.Completed = true; } session.Send(QuestPacket.UpdateCondition(quest.Basic.Id, quest.Condition)); DatabaseManager.Quests.Update(quest); return; } }
public override void Execute(GameCommandTrigger trigger) { int questId = trigger.Get <int>("id"); if (questId == 0) { trigger.Session.SendNotice("Type an quest id."); return; } QuestMetadata quest = QuestMetadataStorage.GetMetadata(questId); if (quest == null) { trigger.Session.Send(NoticePacket.Notice($"Quest not found with id: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } if (trigger.Session.Player.QuestData.ContainsKey(questId)) { trigger.Session.Send(NoticePacket.Notice($"You already have quest: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } trigger.Session.Player.QuestData.Add(questId, new(trigger.Session.Player, quest, QuestState.Started, TimeInfo.Now())); trigger.Session.Send(QuestPacket.AcceptQuest(questId)); }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { List <QuestStatus> list = new List <QuestStatus>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); if (session.Player.QuestList.Exists(x => x.Basic.Id == questId && x.Started)) { continue; } QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); QuestStatus questStatus = new QuestStatus(session.Player, metadata) { Started = true, StartTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds() }; list.Add(questStatus); session.Send(QuestPacket.AcceptQuest(questStatus.Basic.Id)); } session.Player.QuestList.AddRange(list); }
private static void HandleCompleteNavigator(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State is QuestState.Finished) { return; } foreach (QuestRewardItem rewardItem in questStatus.RewardItems) { Item item = new(rewardItem.Code) { Amount = rewardItem.Count, Rarity = rewardItem.Rank }; session.Player.Inventory.AddItem(session, item, true); } Condition firstCondition = questStatus.Condition.First(); firstCondition.Current++; firstCondition.Completed = true; questStatus.State = QuestState.Finished; questStatus.CompleteTimestamp = TimeInfo.Now(); DatabaseManager.Quests.Update(questStatus); session.Send(QuestPacket.CompleteQuest(questId, false)); }
public static void UpdateExplorationQuest(GameSession session, string code, string type) { List <QuestStatus> questList = session.Player.QuestList; foreach (QuestStatus quest in questList.Where(x => x.Basic.QuestType == QuestType.Exploration && x.Condition != null)) { QuestCondition condition = quest.Condition.Where(x => x.Type == type) .FirstOrDefault(x => x.Codes.Length != 0 && x.Codes.Contains(code)); if (condition == null) { continue; } if (condition.Goal != condition.Current) { condition.Current++; } session.Send(QuestPacket.UpdateCondition(quest.Basic.Id, quest.Condition.IndexOf(condition) + 1, condition.Current)); if (condition.Goal != condition.Current) // Quest completed { return; } quest.Completed = true; quest.CompleteTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); session.Player.Levels.GainExp(quest.Reward.Exp); session.Player.Wallet.Meso.Modify(quest.Reward.Money); session.Send(QuestPacket.CompleteQuest(quest.Basic.Id, false)); return; } }
/// <summary> /// Checks whether a given event progresses any active quests /// </summary> /// <param name="packet">Event data</param> public void CheckProgression(QuestPacket packet) { foreach (QuestInstanceData quest in currentQuests) { if (quest.state != QuestState.Complete && quest.state != QuestState.ReadyForSubmission) { bool questComplete = true; List <QuestObjectiveDef> objectives = Registry.QuestRegistry[quest.questID].objectives; for (int i = 0; i < objectives.Count; i++) { if (objectives[i].action == packet.action) { bool invalid = false; //If it has a mod that disqualifies it from progressing this objective, go to next objective foreach (QuestReqActionMod disqualifyingMod in objectives[i].disqualifyingMods) { if (packet.mods.Contains(disqualifyingMod)) { invalid = true; break; } } if (invalid) { continue; } //If it is missing a mod required to progress this objective, go to next objective foreach (QuestReqActionMod requiredMod in objectives[i].requiredMods) { if (!packet.mods.Contains(requiredMod)) { invalid = true; break; } } //Progresses the quest if it should be progressed if (!invalid) { quest.completionProgress[i] = Mathf.Min(quest.completionProgress[i] + packet.amount, objectives[i].completionReqAmt); } } //Checks if this objective is complete if (questComplete && !GameStorage.Approximately(quest.completionProgress[i], objectives[i].completionReqAmt)) { questComplete = false; } } //If all objectives are complete, mark this as ready for turn in if (questComplete) { quest.state = QuestState.ReadyForSubmission; } } } UpdateSidebar(); }
public override void Handle(GameSession session, PacketReader packet) // TODO: Refactor when DB is implemented { QuestMode mode = (QuestMode)packet.ReadByte(); switch (mode) { case QuestMode.AcceptQuest: { int questid = packet.ReadInt(); int objectid = packet.ReadInt(); session.Send(QuestPacket.AcceptQuest(questid)); break; } case QuestMode.CompleteQuest: { int questid = packet.ReadInt(); int objectid = packet.ReadInt(); session.Send(QuestPacket.CompleteQuest(questid)); QuestReward quest = QuestMetadataStorage.GetMetadata(questid).Reward; session.Player.Levels.GainExp(quest.Exp); session.Player.Wallet.Meso.Modify(quest.Money); break; } case QuestMode.ExplorationGoals: List <QuestMetadata> list = new List <QuestMetadata>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { list.Add(QuestMetadataStorage.GetMetadata(packet.ReadInt())); } session.Send(QuestPacket.SendQuests(list)); break; case QuestMode.CompleteNavigator: int questId = packet.ReadInt(); foreach (QuestRewardItem item in QuestMetadataStorage.GetMetadata(questId).RewardItem) { InventoryController.Add(session, new Types.Item(item.Code), true); } session.Send(QuestPacket.CompleteQuest(questId)); break; default: IPacketHandler <GameSession> .LogUnknownMode(mode); break; } }
public override void Execute(GameCommandTrigger trigger) { int questId = trigger.Get <int>("id"); if (questId == 0) { trigger.Session.SendNotice("Please type an quest id"); return; } if (!QuestMetadataStorage.IsValid(questId)) { trigger.Session.Send(NoticePacket.Notice($"Quest not found with id: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } Player player = trigger.Session.Player; if (!player.QuestData.TryGetValue(questId, out QuestStatus questStatus)) { questStatus = new(player, QuestMetadataStorage.GetMetadata(questId)); player.QuestData.Add(questId, questStatus); } questStatus.State = QuestState.Finished; questStatus.StartTimestamp = TimeInfo.Now(); questStatus.CompleteTimestamp = TimeInfo.Now(); player.Levels.GainExp(questStatus.Reward.Exp); player.Wallet.Meso.Modify(questStatus.Reward.Money); foreach (QuestRewardItem reward in questStatus.RewardItems) { Item newItem = new(reward.Code) { Amount = reward.Count, Rarity = reward.Rank }; if (newItem.RecommendJobs.Contains(player.Job) || newItem.RecommendJobs.Contains(0)) { player.Inventory.AddItem(trigger.Session, newItem, true); } } DatabaseManager.Quests.Update(questStatus); trigger.Session.Send(QuestPacket.CompleteQuest(questId, true)); // Add next quest IEnumerable <KeyValuePair <int, QuestMetadata> > questList = QuestMetadataStorage.GetAllQuests().Where(x => x.Value.Require.RequiredQuests.Contains(questId)); foreach ((int id, QuestMetadata quest) in questList) { player.QuestData.Add(id, new(player, quest)); } } }
private static void HandleToggleTracking(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); bool tracked = packet.ReadBool(); if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus)) { return; } questStatus.Tracked = tracked; DatabaseManager.Quests.Update(questStatus); session.Send(QuestPacket.ToggleTracking(questId, tracked)); }
private static void HandleAcceptQuest(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); int objectId = packet.ReadInt(); QuestStatus quest = session.Player.QuestList.FirstOrDefault(x => x.Basic.QuestID == questId); if (quest == null) { return; } quest.Started = true; session.Send(QuestPacket.AcceptQuest(questId)); }
public static void GetNewQuests(GameSession session, int level) { List <QuestMetadata> questList = QuestMetadataStorage.GetAvailableQuests(level); foreach (QuestMetadata quest in questList) { if (session.Player.QuestList.Exists(x => x.Basic.Id == quest.Basic.Id)) { continue; } session.Player.QuestList.Add(new QuestStatus(session.Player, quest)); } session.Send(QuestPacket.SendQuests(session.Player.QuestList)); }
private static void HandleToggleTracking(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); bool tracked = packet.ReadBool(); QuestStatus questStatus = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null) { return; } questStatus.Tracked = tracked; DatabaseManager.Quests.Update(questStatus); session.Send(QuestPacket.ToggleTracking(questId, tracked)); }
public override void Execute(GameCommandTrigger trigger) { int questId = trigger.Get <int>("id"); if (questId == 0) { trigger.Session.SendNotice("Please type an quest id"); return; } if (!QuestMetadataStorage.IsValid(questId)) { trigger.Session.Send(NoticePacket.Notice($"Quest not found with id: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat)); return; } QuestStatus questStatus = trigger.Session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null) { questStatus = new QuestStatus(trigger.Session.Player, QuestMetadataStorage.GetMetadata(questId)); trigger.Session.Player.QuestList.Add(questStatus); } questStatus.Completed = true; questStatus.CompleteTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); trigger.Session.Player.Levels.GainExp(questStatus.Reward.Exp); trigger.Session.Player.Wallet.Meso.Modify(questStatus.Reward.Money); foreach (QuestRewardItem reward in questStatus.RewardItems) { Item newItem = new Item(reward.Code) { Amount = reward.Count, Rarity = reward.Rank }; if (newItem.RecommendJobs.Contains(trigger.Session.Player.Job) || newItem.RecommendJobs.Contains(0)) { InventoryController.Add(trigger.Session, newItem, true); } } trigger.Session.Send(QuestPacket.CompleteQuest(questId, true)); // Add next quest IEnumerable <KeyValuePair <int, QuestMetadata> > questList = QuestMetadataStorage.GetAllQuests().Where(x => x.Value.Require.RequiredQuests.Contains(questId)); foreach (KeyValuePair <int, QuestMetadata> kvp in questList) { trigger.Session.Player.QuestList.Add(new QuestStatus(trigger.Session.Player, kvp.Value)); } }
public static void GetNewQuests(Player player) { List <QuestMetadata> questList = QuestMetadataStorage.GetAvailableQuests(player.Levels.Level, player.Job); foreach (QuestMetadata quest in questList) { if (player.QuestData.ContainsKey(quest.Basic.Id)) { continue; } player.QuestData.Add(quest.Basic.Id, new(player, quest)); } player.Session.Send(QuestPacket.SendQuests(player.QuestData.Values.ToList())); }
private static void HandleAcceptQuest(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); int objectId = packet.ReadInt(); QuestStatus questStatus = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null) { return; } questStatus.Started = true; questStatus.StartTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); session.Send(QuestPacket.AcceptQuest(questId)); }
private static void HandleAcceptQuest(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); int objectId = packet.ReadInt(); if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus)) { return; } questStatus.State = QuestState.Started; questStatus.StartTimestamp = TimeInfo.Now(); DatabaseManager.Quests.Update(questStatus); session.Send(QuestPacket.AcceptQuest(questId)); TrophyManager.OnAcceptQuest(session.Player, questId); }
private static void ProcessQuestCommand(GameSession session, string command) { if (command == "") { session.SendNotice("Type a quest id."); return; } if (!int.TryParse(command, out int questId)) { return; } QuestStatus questStatus = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null) { return; } questStatus.Completed = true; questStatus.CompleteTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); session.Player.Levels.GainExp(questStatus.Reward.Exp); session.Player.Wallet.Meso.Modify(questStatus.Reward.Money); foreach (QuestRewardItem reward in questStatus.RewardItems) { Item newItem = new Item(reward.Code) { Amount = reward.Count, Rarity = reward.Rank }; if (newItem.RecommendJobs.Contains(session.Player.Job) || newItem.RecommendJobs.Contains(0)) { InventoryController.Add(session, newItem, true); } } session.Send(QuestPacket.CompleteQuest(questId, true)); // Add next quest IEnumerable <KeyValuePair <int, QuestMetadata> > questList = QuestMetadataStorage.GetAllQuests().Where(x => x.Value.Require.RequiredQuests.Contains(questId)); foreach (KeyValuePair <int, QuestMetadata> kvp in questList) { session.Player.QuestList.Add(new QuestStatus(kvp.Value)); } }
private static void HandleCompleteQuest(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); int objectId = packet.ReadInt(); if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State is QuestState.Finished) { return; } questStatus.State = QuestState.Finished; questStatus.CompleteTimestamp = TimeInfo.Now(); session.Player.Levels.GainExp(questStatus.Reward.Exp); session.Player.Wallet.Meso.Modify(questStatus.Reward.Money); foreach (QuestRewardItem reward in questStatus.RewardItems) { Item newItem = new(reward.Code) { Amount = reward.Count, Rarity = reward.Rank }; if (newItem.RecommendJobs.Contains(session.Player.Job) || newItem.RecommendJobs.Contains(0)) { session.Player.Inventory.AddItem(session, newItem, true); } } DatabaseManager.Quests.Update(questStatus); session.Send(QuestPacket.CompleteQuest(questId, true)); // Add next quest IEnumerable <QuestMetadata> questList = QuestMetadataStorage.GetAllQuests().Values .Where(x => x.Require.RequiredQuests.Contains(questId)); foreach (QuestMetadata questMetadata in questList) { if (session.Player.QuestData.ContainsKey(questMetadata.Basic.Id)) { continue; } session.Player.QuestData.Add(questMetadata.Basic.Id, new(session.Player, questMetadata)); } }
private static void HandleCompleteQuest(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); int objectId = packet.ReadInt(); QuestStatus questStatus = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null || questStatus.Completed) { return; } questStatus.Completed = true; questStatus.CompleteTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); session.Player.Levels.GainExp(questStatus.Reward.Exp); session.Player.Wallet.Meso.Modify(questStatus.Reward.Money); foreach (QuestRewardItem reward in questStatus.RewardItems) { Item newItem = new Item(reward.Code) { Amount = reward.Count, Rarity = reward.Rank }; if (newItem.RecommendJobs.Contains(session.Player.Job) || newItem.RecommendJobs.Contains(0)) { InventoryController.Add(session, newItem, true); } } DatabaseManager.Quests.Update(questStatus); session.Send(QuestPacket.CompleteQuest(questId, true)); // Add next quest IEnumerable <KeyValuePair <int, QuestMetadata> > questList = QuestMetadataStorage.GetAllQuests().Where(x => x.Value.Require.RequiredQuests.Contains(questId)); foreach (KeyValuePair <int, QuestMetadata> kvp in questList) { if (session.Player.QuestList.Exists(x => x.Basic.Id == kvp.Value.Basic.Id)) { continue; } session.Player.QuestList.Add(new QuestStatus(session.Player, kvp.Value)); } }
private static void HandleCompleteQuest(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); int objectId = packet.ReadInt(); QuestStatus quest = session.Player.QuestList.FirstOrDefault(x => x.Basic.QuestID == questId); if (quest == null) { return; } quest.Completed = true; session.Send(QuestPacket.CompleteQuest(questId)); session.Player.Levels.GainExp(quest.Reward.Exp); session.Player.Wallet.Meso.Modify(quest.Reward.Money); }
public static void UpdateExplorationQuest(GameSession session, string code, string type) { List <QuestStatus> quests = session.Player.QuestList.Where(quest => quest.Basic.QuestType == QuestType.Exploration && quest.Condition is not null && !quest.Completed && quest.Started && quest.Condition.Any(condition => condition.Type == type && condition.Codes.Contains(code))) .ToList(); foreach (QuestStatus quest in quests) { Condition condition = quest.Condition.FirstOrDefault(condition => condition.Type == type && condition.Codes.Contains(code) && !condition.Completed); if (condition == null) { continue; } condition.Current++; if (condition.Current >= condition.Goal) { condition.Completed = true; } session.Send(QuestPacket.UpdateCondition(quest.Basic.Id, quest.Condition)); if (!condition.Completed) { return; } quest.Completed = true; quest.CompleteTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); DatabaseManager.Quests.Update(quest); session.Player.Levels.GainExp(quest.Reward.Exp); session.Player.Wallet.Meso.Modify(quest.Reward.Money); session.Send(QuestPacket.CompleteQuest(quest.Basic.Id, false)); return; } }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { List <QuestStatus> list = new List <QuestStatus>(); int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); if (session.Player.QuestList.Exists(x => x.Basic.Id == questId)) { continue; } QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); list.Add(new QuestStatus(metadata)); } session.Player.QuestList.AddRange(list); session.Send(QuestPacket.SendQuests(list)); }
public static void UpdateQuest(GameSession session, string code, string type) { List <QuestStatus> questList = session.Player.QuestList; foreach (QuestStatus quest in questList.Where(x => x.Condition != null)) { QuestCondition condition = quest.Condition.Where(x => x.Type == type).FirstOrDefault(x => x.Codes != null && x.Codes.Length != 0 && x.Codes.Contains(code)); if (condition == null) { continue; } if (condition.Goal == condition.Current) { return; } condition.Current++; session.Send(QuestPacket.UpdateCondition(quest.Basic.Id, quest.Condition.IndexOf(condition) + 1, condition.Current)); return; } }
private static void HandleCompleteNavigator(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); QuestStatus quest = session.Player.QuestList.FirstOrDefault(x => x.Basic.QuestID == questId); if (quest == null) { return; } foreach (QuestRewardItem rewardItem in quest.RewardItems) { Item item = new Item(rewardItem.Code) { Amount = rewardItem.Count }; InventoryController.Add(session, item, true); } session.Send(QuestPacket.CompleteQuest(questId)); }
private static void HandleAddExplorationQuests(GameSession session, PacketReader packet) { int listSize = packet.ReadInt(); for (int i = 0; i < listSize; i++) { int questId = packet.ReadInt(); session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus); session.Send(QuestPacket.AcceptQuest(questId)); if (questStatus is null) { QuestMetadata metadata = QuestMetadataStorage.GetMetadata(questId); session.Player.QuestData.Add(questId, new(session.Player, metadata, QuestState.Started, TimeInfo.Now())); continue; } questStatus.State = QuestState.Started; DatabaseManager.Quests.Update(questStatus); } }
public static void UpdateQuest(GameSession session, string code, string type, string target = "") { IEnumerable <QuestStatus> questList = session.Player.QuestData.Values.Where(quest => quest.Condition is not null && quest.State is QuestState.Started && quest.Condition.Any(condition => condition.Codes is not null && condition.Target is not null && condition.Type == type && condition.Codes.Contains(code) && (condition.Target.Contains(target) || condition.Target.Count == 0))); foreach (QuestStatus quest in questList) { Condition condition = quest.Condition.FirstOrDefault(condition => condition.Codes.Contains(code) && (condition.Target.Contains(target) || condition.Target.Count == 0) && !condition.Completed); if (condition == null) { continue; } if (condition.Goal != 0) { if (condition.Goal == condition.Current) { return; } } condition.Current++; if (condition.Current >= condition.Goal) { condition.Completed = true; } session.Send(QuestPacket.UpdateCondition(quest.Basic.Id, quest.Condition)); DatabaseManager.Quests.Update(quest); } }
private static void CheckForExplorationQuest(GameSession session, MapInteractActor actor) { List <QuestStatus> questList = session.Player.QuestList; foreach (QuestStatus quest in questList.Where(x => x.Basic.Id >= 72000000 && x.Condition != null)) { QuestCondition condition = quest.Condition.Where(x => x.Type == "interact_object_rep").FirstOrDefault(x => x.Codes.Length != 0 && x.Codes.Contains(actor.InteractId.ToString())); if (condition == null) { continue; } quest.Completed = true; quest.CompleteTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); session.Player.Levels.GainExp(quest.Reward.Exp); session.Player.Wallet.Meso.Modify(quest.Reward.Money); session.Send(QuestPacket.CompleteExplorationGoal(quest.Basic.Id)); session.Send(QuestPacket.CompleteQuest(quest.Basic.Id)); break; } }