Exemple #1
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);
        }
Exemple #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));
        }
Exemple #3
0
        private void LoadQuest(string fullPath)
        {
            var file = new File();
            var err  = file.OpenCompressed(fullPath, (int)File.ModeFlags.Read, (int)File.CompressionMode.Gzip);

            if (err != Error.Ok)
            {
                Logger.Error("Could not load quest " + fullPath + " error code " + err);
                file.Close();
                return;
            }
            var json = file.GetAsText();

            file.Close();
            var saveModel = JsonConvert.DeserializeObject <QuestSaveModel>(json);

            if (saveModel != null)
            {
                if (QuestIdToMetadata.ContainsKey(saveModel.Start.Id))
                {
                    Logger.Error("Quests already has file " + fullPath);
                }
                var metadata = new QuestMetadata(saveModel.Start.Id, fullPath, fullPath, null, saveModel);
                QuestIdToMetadata[saveModel.Start.Id] = metadata;
            }
            else
            {
                Logger.Error("Could not deserialize quest " + fullPath);
            }
        }
    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));
    }
Exemple #5
0
 private void SetMetadataValues(QuestMetadata metadata)
 {
     Basic         = metadata.Basic;
     StartNpcId    = metadata.StartNpc;
     CompleteNpcId = metadata.CompleteNpc;
     Reward        = metadata.Reward;
     RewardItems   = metadata.RewardItem;
 }
Exemple #6
0
 public QuestStatus(QuestMetadata metadata)
 {
     Basic         = metadata.Basic;
     StartNpcId    = metadata.StartNpc;
     CompleteNpcId = metadata.CompleteNpc;
     Condition     = metadata.Condition;
     Reward        = metadata.Reward;
     RewardItems   = metadata.RewardItem;
 }
Exemple #7
0
        public void SetMetadataValues(int id)
        {
            QuestMetadata metadata = QuestMetadataStorage.GetMetadata(id);

            Basic         = metadata.Basic;
            StartNpcId    = metadata.StartNpc;
            CompleteNpcId = metadata.CompleteNpc;
            Reward        = metadata.Reward;
            RewardItems   = metadata.RewardItem;
        }
    private void SetMetadataValues()
    {
        QuestMetadata metadata = QuestMetadataStorage.GetMetadata(Id);

        Basic         = metadata.Basic;
        StartNpcId    = metadata.StartNpc;
        CompleteNpcId = metadata.CompleteNpc;
        Reward        = metadata.Reward;
        RewardItems   = metadata.RewardItem;
    }
    private static void HandleResumeDungeon(GameSession session, PacketReader packet)
    {
        int questId = packet.ReadInt();

        if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State is QuestState.Completed)
        {
            return;
        }

        QuestMetadata questMetadata = QuestMetadataStorage.GetMetadata(questId);

        session.Player.Warp(questMetadata.ProgressMap.First());
    }
    private static void HandleDispatchMode(GameSession session, PacketReader packet)
    {
        int   questId = packet.ReadInt();
        short mode    = packet.ReadShort();

        if (!session.Player.QuestData.TryGetValue(questId, out QuestStatus questStatus) || questStatus.State is QuestState.Completed)
        {
            return;
        }

        QuestMetadata questMetadata = QuestMetadataStorage.GetMetadata(questId);

        session.Player.Warp(questMetadata.Dispatch.FieldId);
    }
Exemple #11
0
 public QuestStatus(Player player, QuestMetadata metadata)
 {
     Player        = player;
     Id            = metadata.Basic.Id;
     Basic         = metadata.Basic;
     StartNpcId    = metadata.StartNpc;
     CompleteNpcId = metadata.CompleteNpc;
     Condition     = new List <Condition>();
     foreach (QuestCondition condition in metadata.Condition)
     {
         Condition.Add(new Condition(condition.Type, condition.Codes, condition.Goal, 0, condition.Target));
     }
     Reward      = metadata.Reward;
     RewardItems = metadata.RewardItem;
     Uid         = DatabaseManager.AddQuest(this);
 }
        public static List <QuestMetadata> GetAvailableQuests(int level)
        {
            List <QuestMetadata> list = new List <QuestMetadata>();

            foreach (KeyValuePair <int, QuestMetadata> item in map)
            {
                QuestMetadata questMetadata = item.Value;
                if (level >= questMetadata.Require.Level && questMetadata.Require.RequiredQuests.Count == 0 &&
                    (questMetadata.Basic.QuestType == QuestType.Epic || questMetadata.Basic.QuestType == QuestType.World))
                {
                    list.Add(questMetadata);
                }
            }

            return(list);
        }
Exemple #13
0
    public QuestStatus(long characterId, QuestMetadata metadata, QuestState state = QuestState.None, long startTimestamp = 0, bool accepted = false)
    {
        SetMetadataValues(metadata);

        CharacterId = characterId;
        Id          = metadata.Basic.Id;
        Condition   = new();
        foreach (QuestCondition condition in metadata.Condition)
        {
            Condition.Add(new(condition.Type, condition.Code, condition.Goal, 0, condition.Target));
        }

        State           = state;
        StartTimestamp  = startTimestamp;
        Accepted        = accepted;
        AmountCompleted = 0;
        Uid             = DatabaseManager.Quests.Insert(this);
    }
 public QuestStatus(Player player, QuestMetadata metadata, bool started = false, long startTimestamp = 0)
 {
     CharacterId   = player.CharacterId;
     Id            = metadata.Basic.Id;
     Basic         = metadata.Basic;
     StartNpcId    = metadata.StartNpc;
     CompleteNpcId = metadata.CompleteNpc;
     Condition     = new List <Condition>();
     foreach (QuestCondition condition in metadata.Condition)
     {
         Condition.Add(new Condition(condition.Type, condition.Codes, condition.Goal, 0, condition.Target));
     }
     Reward         = metadata.Reward;
     RewardItems    = metadata.RewardItem;
     Started        = started;
     StartTimestamp = startTimestamp;
     Tracked        = true;
     Uid            = DatabaseManager.Quests.Insert(this);
 }
Exemple #15
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));
        }
    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);
        }
    }
Exemple #17
0
    public override void Execute(GameCommandTrigger trigger)
    {
        int  questId    = trigger.Get <int>("id");
        bool forceStart = trigger.Get <bool>("force");

        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;
        }

        Player player = trigger.Session.Player;

        if (player.QuestData.TryGetValue(questId, out QuestStatus questStatus) && !forceStart)
        {
            trigger.Session.Send(NoticePacket.Notice(
                                     $"You already have quest: {questId.ToString().Color(Color.Aquamarine)}. \r\tUse '/startquest {questId} true' to start it again.",
                                     NoticeType.Chat));
            return;
        }

        if (questStatus is not null)
        {
            player.QuestData.Remove(questId, out _);
            DatabaseManager.Quests.Delete(questStatus.Uid);
        }

        questStatus = new(player.CharacterId, questId, QuestState.Started, TimeInfo.Now(), accepted : true);
        player.QuestData.Add(questId, questStatus);
        trigger.Session.Send(QuestPacket.AcceptQuest(questStatus));
    }
        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.QuestList.Any(x => x.Basic.Id == questId))
            {
                trigger.Session.Send(NoticePacket.Notice($"You already have quest: {questId.ToString().Color(Color.Aquamarine)}.", NoticeType.Chat));
                return;
            }
            trigger.Session.Player.QuestList.Add(new QuestStatus(trigger.Session.Player, quest, true, DateTimeOffset.Now.ToUnixTimeSeconds()));
            trigger.Session.Send(QuestPacket.AcceptQuest(questId));
        }
Exemple #19
0
        public static List <QuestMetadata> Parse(MemoryMappedFile m2dFile, IEnumerable <PackFileEntry> entries)
        {
            List <QuestMetadata> quests = new List <QuestMetadata>();

            foreach (PackFileEntry entry in entries)
            {
                if (!entry.Name.StartsWith("quest/"))
                {
                    continue;
                }

                QuestMetadata metadata = new QuestMetadata();

                using XmlReader reader = m2dFile.GetReader(entry.FileHeader);
                while (reader.Read())
                {
                    if (reader.NodeType != XmlNodeType.Element)
                    {
                        continue;
                    }

                    if (reader.Name == "environment" && (reader["locale"] != "NA" && reader["locale"] != "")) // only reading quests for NA or all environments
                    {
                        reader.Skip();
                    }
                    else if (reader.Name == "environment")
                    {
                        metadata.Feature = reader["feature"];
                        metadata.Locale  = reader["locale"];
                    }
                    else if (reader.Name == "basic")
                    {
                        metadata.Basic.ChapterID          = string.IsNullOrEmpty(reader["chapterID"]) ? 0 : int.Parse(reader["chapterID"]);
                        metadata.Basic.QuestID            = string.IsNullOrEmpty(reader["questID"]) ? 0 : int.Parse(reader["questID"]);
                        metadata.Basic.QuestType          = string.IsNullOrEmpty(reader["questType"]) ? 0 : byte.Parse(reader["questType"]);
                        metadata.Basic.Account            = string.IsNullOrEmpty(reader["account"]) ? 0 : byte.Parse(reader["account"]);
                        metadata.Basic.StandardLevel      = string.IsNullOrEmpty(reader["standardLevel"]) ? 0 : int.Parse(reader["standardLevel"]);
                        metadata.Basic.AutoStart          = string.IsNullOrEmpty(reader["autoStart"]) ? 0 : byte.Parse(reader["autoStart"]);
                        metadata.Basic.DisableGiveup      = string.IsNullOrEmpty(reader["disableGiveup"]) ? 0 : byte.Parse(reader["disableGiveup"]);
                        metadata.Basic.ExceptChapterClear = string.IsNullOrEmpty(reader["exceptChapterClear"]) ? 0 : int.Parse(reader["exceptChapterClear"]);
                        metadata.Basic.Repeatable         = string.IsNullOrEmpty(reader["repeatable"]) ? 0 : byte.Parse(reader["repeatable"]);
                        metadata.Basic.UsePeriod          = reader["usePeriod"];
                        metadata.Basic.EventTag           = reader["eventTag"];
                        metadata.Basic.Locking            = string.IsNullOrEmpty(reader["locking"]) ? 0 : byte.Parse(reader["locking"]);
                        metadata.Basic.TabIndex           = string.IsNullOrEmpty(reader["tabIndex"]) ? 0 : int.Parse(reader["tabIndex"]);
                        metadata.Basic.ForceRegistGuide   = string.IsNullOrEmpty(reader["forceRegistGuide"]) ? 0 : byte.Parse(reader["forceRegistGuide"]);
                        metadata.Basic.UseNavigation      = reader["useNavi"] == "FALSE" ? false : true;
                    }
                    else if (reader.Name == "notify")
                    {
                        metadata.Notify.CompleteUiEffect = reader["completeUiEffect"];
                        metadata.Notify.AcceptSoundKey   = reader["acceptSoundKey"];
                        metadata.Notify.CompleteSoundKey = reader["completeSoundKey"];
                    }
                    else if (reader.Name == "require")
                    {
                        metadata.Require.Level    = string.IsNullOrEmpty(reader["level"]) ? 0 : short.Parse(reader["level"]);
                        metadata.Require.MaxLevel = string.IsNullOrEmpty(reader["maxLevel"]) ? 0 : short.Parse(reader["maxLevel"]);

                        if (!string.IsNullOrEmpty(reader["job"]))
                        {
                            List <string> temp = new List <string>(reader["job"].Split(","));
                            foreach (string item in temp)
                            {
                                metadata.Require.Job.Add(short.Parse(item));
                            }
                        }

                        if (!string.IsNullOrEmpty(reader["quest"]))
                        {
                            List <string> temp = new List <string>(reader["quest"].Split(","));
                            foreach (string item in temp)
                            {
                                metadata.Require.RequiredQuests.Add(int.Parse(item));
                            }
                        }

                        if (!string.IsNullOrEmpty(reader["selectableQuest"]))
                        {
                            List <string> temp = new List <string>(reader["selectableQuest"].Split(","));
                            foreach (string item in temp)
                            {
                                metadata.Require.SelectableQuest.Add(int.Parse(item));
                            }
                        }

                        if (!string.IsNullOrEmpty(reader["unrequire"]))
                        {
                            List <string> temp = new List <string>(reader["unrequire"].Split(","));
                            foreach (string item in temp)
                            {
                                metadata.Require.Unrequire.Add(int.Parse(item));
                            }
                        }

                        metadata.Require.Field       = string.IsNullOrEmpty(reader["field"]) ? 0 : int.Parse(reader["field"]);
                        metadata.Require.Achievement = string.IsNullOrEmpty(reader["achievement"]) ? 0 : int.Parse(reader["achievement"]);

                        if (!string.IsNullOrEmpty(reader["unreqAchievement"]))
                        {
                            List <string> temp = new List <string>(reader["unreqAchievement"].Split(","));
                            foreach (string item in temp)
                            {
                                metadata.Require.UnreqAchievement.Add(int.Parse(item));
                            }
                        }

                        metadata.Require.GroupID   = string.IsNullOrEmpty(reader["groupID"]) ? 0 : int.Parse(reader["groupID"]);
                        metadata.Require.DayOfWeek = reader["dayOfWeek"];
                        metadata.Require.GearScore = string.IsNullOrEmpty(reader["gearScore"]) ? 0 : int.Parse(reader["gearScore"]);
                    }
                    else if (reader.Name == "start")
                    {
                        metadata.StartNpc = int.Parse(reader["npc"]);
                    }
                    else if (reader.Name == "complete")
                    {
                        metadata.CompleteNpc = int.Parse(reader["npc"]);
                    }
                    else if (reader.Name == "completeReward")
                    {
                        metadata.Reward.Exp         = string.IsNullOrEmpty(reader["exp"]) ? 0 : int.Parse(reader["exp"]);
                        metadata.Reward.RelativeExp = reader["relativeExp"];
                        metadata.Reward.Money       = string.IsNullOrEmpty(reader["money"]) ? 0 : int.Parse(reader["money"]);
                        metadata.Reward.Karma       = string.IsNullOrEmpty(reader["karma"]) ? 0 : int.Parse(reader["karma"]);
                        metadata.Reward.Lu          = string.IsNullOrEmpty(reader["lu"]) ? 0 : int.Parse(reader["lu"]);
                    }
                    else if (reader.Name == "essentialJobItem" || reader.Name == "globalEssentialItem" || reader.Name == "globalEssentialJobItem")
                    {
                        int             itemid = string.IsNullOrEmpty(reader["code"]) ? 0 : int.Parse(reader["code"]);
                        byte            rank   = string.IsNullOrEmpty(reader["rank"]) ? 0 : byte.Parse(reader["rank"]);
                        int             count  = string.IsNullOrEmpty(reader["count"]) ? 0 : int.Parse(reader["count"]);
                        QuestRewardItem item   = new QuestRewardItem(itemid, rank, count);
                        metadata.RewardItem.Add(item);
                    }
                    else if (reader.Name == "progressMap")
                    {
                        if (!string.IsNullOrEmpty(reader["progressMap"]))
                        {
                            List <string> temp = new List <string>(reader["progressMap"].Split(","));
                            foreach (string item in temp)
                            {
                                metadata.ProgressMap.Add(int.Parse(item));
                            }
                        }
                    }
                    else if (reader.Name == "guide")
                    {
                        metadata.Guide.Type     = reader["guideType"];
                        metadata.Guide.Icon     = reader["guideIcon"];
                        metadata.Guide.MinLevel = string.IsNullOrEmpty(reader["guideMinLevel"]) ? 0 : byte.Parse(reader["guideMinLevel"]);
                        metadata.Guide.MaxLevel = string.IsNullOrEmpty(reader["guideMaxLevel"]) ? 0 : byte.Parse(reader["guideMaxLevel"]);
                        metadata.Guide.Group    = reader["guideGroup"];
                    }
                    else if (reader.Name == "gotoNpc")
                    {
                        metadata.Npc.Enable     = string.IsNullOrEmpty(reader["enable"]) ? 0 : byte.Parse(reader["enable"]);
                        metadata.Npc.GoToField  = string.IsNullOrEmpty(reader["gotoField"]) ? 0 : int.Parse(reader["gotoField"]);
                        metadata.Npc.GoToPortal = string.IsNullOrEmpty(reader["gotoPortal"]) ? 0 : int.Parse(reader["gotoPortal"]);
                    }
                    else if (reader.Name == "gotoDungeon")
                    {
                        metadata.Dungeon.State          = string.IsNullOrEmpty(reader["state"]) ? 0 : byte.Parse(reader["state"]);
                        metadata.Dungeon.GoToDungeon    = string.IsNullOrEmpty(reader["gotoDungeon"]) ? 0 : int.Parse(reader["gotoDungeon"]);
                        metadata.Dungeon.GoToInstanceID = string.IsNullOrEmpty(reader["gotoInstanceID"]) ? 0 : int.Parse(reader["gotoInstanceID"]);
                    }
                    else if (reader.Name == "remoteAccept")
                    {
                        metadata.RemoteAccept.UseRemote    = reader["useRemote"];
                        metadata.RemoteAccept.RequireField = string.IsNullOrEmpty(reader["requireField"]) ? 0 : int.Parse(reader["requireField"]);
                    }
                    else if (reader.Name == "remoteComplete")
                    {
                        metadata.RemoteComplete.UseRemote           = reader["useRemote"];
                        metadata.RemoteComplete.RequireField        = string.IsNullOrEmpty(reader["requireField"]) ? 0 : int.Parse(reader["requireField"]);
                        metadata.RemoteComplete.RequireDungeonClear = string.IsNullOrEmpty(reader["requireDungeonClear"]) ? 0 : int.Parse(reader["requireDungeonClear"]);
                    }
                    else if (reader.Name == "summonPortal")
                    {
                        metadata.SummonPortal.FieldID  = string.IsNullOrEmpty(reader["fieldID"]) ? 0 : int.Parse(reader["fieldID"]);
                        metadata.SummonPortal.PortalID = string.IsNullOrEmpty(reader["portalID"]) ? 0 : int.Parse(reader["portalID"]);
                    }
                    else if (reader.Name == "eventMission")
                    {
                        metadata.Event = reader["event"];
                    }
                    else if (reader.Name == "condition")
                    {
                        string        Type  = reader["type"];
                        string        Code  = reader["code"];
                        int           Value = string.IsNullOrEmpty(reader["value"]) ? 0 : int.Parse(reader["value"]);
                        List <string> temp  = null;
                        if (!string.IsNullOrEmpty(reader["target"]))
                        {
                            temp = new List <string>(reader["target"].Split(","));
                        }
                        metadata.Condition.Add(new QuestCondition(Type, Code, Value, temp));
                    }
                    else if (reader.Name == "navi")
                    {
                        string NaviType = reader["type"];
                        string NaviCode = reader["code"];
                        int    NaviMap  = string.IsNullOrEmpty(reader["map"]) ? 0 : int.Parse(reader["map"]);

                        metadata.Navigation.Add(new QuestNavigation(NaviType, NaviCode, NaviMap));
                    }
                }

                quests.Add(metadata);
            }

            return(quests);
        }