Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
    /// <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);
        }
    }
Beispiel #4
0
        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));
    }
Beispiel #6
0
        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);
        }
Beispiel #7
0
    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));
    }
Beispiel #8
0
        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;
            }
        }
Beispiel #9
0
 /// <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();
 }
Beispiel #10
0
        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;
            }
        }
Beispiel #11
0
    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));
        }
    }
}
Beispiel #12
0
    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));
    }
Beispiel #13
0
        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));
        }
Beispiel #14
0
        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));
            }
        }
Beispiel #17
0
    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()));
    }
Beispiel #18
0
        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));
        }
Beispiel #19
0
    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);
    }
Beispiel #20
0
        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));
            }
        }
Beispiel #21
0
    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));
            }
        }
Beispiel #23
0
        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);
        }
Beispiel #24
0
        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;
            }
        }
Beispiel #25
0
        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));
        }
Beispiel #26
0
        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;
            }
        }
Beispiel #27
0
        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));
        }
Beispiel #28
0
    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);
        }
    }
Beispiel #29
0
    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;
            }
        }