Beispiel #1
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 #2
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 #3
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 #4
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 #5
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;
            }
        }
    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));
            }
        }
Beispiel #8
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 #9
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 #11
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 #12
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 #13
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));
        }
        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;
            }
        }
Beispiel #15
0
        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));
        }