/// <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); } }
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)); }
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)); }
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; } }
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)); } } }
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)); } }
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 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 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; } }
private static void HandleCompleteNavigator(GameSession session, PacketReader packet) { int questId = packet.ReadInt(); QuestStatus questStatus = session.Player.QuestList.FirstOrDefault(x => x.Basic.Id == questId); if (questStatus == null) { return; } foreach (QuestRewardItem rewardItem in questStatus.RewardItems) { Item item = new Item(rewardItem.Code) { Amount = rewardItem.Count, Rarity = rewardItem.Rank }; InventoryController.Add(session, item, true); } questStatus.Completed = true; questStatus.CompleteTimestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); session.Send(QuestPacket.CompleteQuest(questId, false)); }
private static void HandleUse(GameSession session, PacketReader packet) { string uuid = packet.ReadMapleString(); MapInteractActor actor = MapEntityStorage.GetInteractActors(session.Player.MapId).FirstOrDefault(x => x.Uuid == uuid); int numDrop = 0; 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.InteractId); 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; } } else if (actor.Type == InteractActorType.Gathering) { RecipeMetadata recipe = RecipeMetadataStorage.GetRecipe(actor.RecipeId); long requireMastery = int.Parse(recipe.RequireMastery); Enums.MasteryType type = (Enums.MasteryType) int.Parse(recipe.MasteryType); session.Player.Levels.GainMasteryExp(type, 0); long currentMastery = session.Player.Levels.MasteryExp.FirstOrDefault(x => x.Type == type).CurrentExp; if (currentMastery < requireMastery) { return; } session.Player.IncrementGatheringCount(actor.RecipeId, 0); int numCount = session.Player.GatheringCount[actor.RecipeId].Current; List <RecipeItem> items = RecipeMetadataStorage.GetResult(recipe); Random rand = new Random(); int masteryDiffFactor = numCount switch { int n when n < recipe.HighPropLimitCount => MasteryFactorMetadataStorage.GetFactor(0), int n when n < recipe.NormalPropLimitCount => MasteryFactorMetadataStorage.GetFactor(1), int n when n < (int)(recipe.NormalPropLimitCount * 1.3) => MasteryFactorMetadataStorage.GetFactor(2), _ => MasteryFactorMetadataStorage.GetFactor(3), }; foreach (RecipeItem item in items) { int prob = (int)(RarityChance[item.Rarity] * masteryDiffFactor) / 10000; if (rand.Next(100) >= prob) { continue; } for (int i = 0; i < item.Amount; i++) { session.FieldManager.AddItem(session, new Item(item.Id)); } numDrop += item.Amount; } if (numDrop > 0) { session.Player.IncrementGatheringCount(actor.RecipeId, numDrop); session.Player.Levels.GainMasteryExp(type, recipe.RewardMastery); } } session.Send(InteractActorPacket.UseObject(actor, numDrop > 0 ? 0 : 1, numDrop)); session.Send(InteractActorPacket.Extra(actor)); }