public void Add(uint questId)
        {
            if (Quests.ContainsKey(questId))
            {
                _log.Warn("Duplicate add quest {0}", questId);
                return;
            }

            var template = QuestManager.Instance.GetTemplate(questId);

            if (template == null)
            {
                return;
            }
            var quest = new Quest(template);

            quest.Id     = Quests.Count + 1; // TODO временно, переделать
            quest.Status = QuestStatus.Progress;
            quest.Owner  = Owner;
            Quests.Add(quest.TemplateId, quest);

            var res = quest.Start();

            if (res == 0)
            {
                Quests.Remove(quest.TemplateId);
            }
            else
            {
                Owner.SendPacket(new SCQuestContextStartedPacket(quest, res));
            }
        }
Пример #2
0
        public override void LoadFromResponse(string apiname, dynamic data)
        {
            base.LoadFromResponse(apiname, (object)data);

            var progress = KCDatabase.Instance.QuestProgress;


            //周期任務削除
            if (DateTimeHelper.IsCrossedDay(progress.LastUpdateTime, 5, 0, 0))
            {
                progress.Progresses.RemoveAll(p => (p.QuestType == 1 || p.QuestID == 211 /* 空母3 */ || p.QuestID == 212 /* 輸送5 */ || p.QuestID == 311 /* 演習勝利7 */));
                Quests.RemoveAll(q => q.Type == 1 || q.QuestID == 211 /* 空母3 */ || q.QuestID == 212 /* 輸送5 */ || q.QuestID == 311 /* 演習勝利7 */);
            }
            if (DateTimeHelper.IsCrossedWeek(progress.LastUpdateTime, DayOfWeek.Monday, 5, 0, 0))
            {
                progress.Progresses.RemoveAll(p => p.QuestType == 2);
                Quests.RemoveAll(q => q.Type == 2);
            }
            if (DateTimeHelper.IsCrossedMonth(progress.LastUpdateTime, 1, 5, 0, 0))
            {
                progress.Progresses.RemoveAll(p => p.QuestType == 3);
                Quests.RemoveAll(q => q.Type == 3);
            }
            if (DateTimeHelper.IsCrossedQuarter(progress.LastUpdateTime, 0, 1, 5, 0, 0))
            {
                // "沖ノ島海域迎撃戦", "戦果拡張任務!「Z作戦」前段作戦" に限る
                progress.Progresses.RemoveAll(p => p.QuestID == 822 || p.QuestID == 854);
                Quests.RemoveAll(q => q.QuestID == 822 || q.QuestID == 854);
            }


            Count = (int)RawData.api_count;

            if (RawData.api_list != null)                       //任務完遂時orページ遷移時 null になる

            {
                foreach (dynamic elem in RawData.api_list)
                {
                    if (!(elem is double))                                      //空欄は -1 になるため。

                    {
                        int id = (int)elem.api_no;
                        if (!Quests.ContainsKey(id))
                        {
                            var q = new QuestData();
                            q.LoadFromResponse(apiname, elem);
                            Quests.Add(q);
                        }
                        else
                        {
                            Quests[id].LoadFromResponse(apiname, elem);
                        }
                    }
                }
            }


            IsLoaded = true;
        }
        public void OnItemGather(Item item, int count)
        {
            if (!Quests.ContainsKey(item.Template.LootQuestId))
            {
                return;
            }
            var quest = Quests[item.Template.LootQuestId];

            quest.OnItemGather(item, count);
        }
Пример #4
0
        public void SetQuestData(int QuestID, string pData, bool pSendPacket = true)
        {
            if (!Quests.ContainsKey(QuestID))
            {
                return;
            }

            Quests[QuestID].Data = pData;
            QuestPacket.SendQuestDataUpdate(Character, QuestID, pData);
        }
Пример #5
0
        public override void LoadFromResponse(string apiname, dynamic data)
        {
            base.LoadFromResponse(apiname, (object)data);

            var progress = KCDatabase.Instance.QuestProgress;


            //周期任務削除
            if (DateTimeHelper.IsCrossedDay(progress.LastUpdateTime, 5, 0, 0))
            {
                // 注: 311 = 精鋭艦隊演習; マンスリーだがデイリーで進捗リセット
                progress.Progresses.RemoveAll(p => (p.QuestType == 1 || p.QuestType == 5 || p.QuestID == 311));
                Quests.RemoveAll(q => q.Type == 1 || q.Type == 5 || q.QuestID == 311);
            }
            if (DateTimeHelper.IsCrossedWeek(progress.LastUpdateTime, DayOfWeek.Monday, 5, 0, 0))
            {
                progress.Progresses.RemoveAll(p => p.QuestType == 2);
                Quests.RemoveAll(q => q.Type == 2);
            }
            if (DateTimeHelper.IsCrossedMonth(progress.LastUpdateTime, 1, 5, 0, 0))
            {
                progress.Progresses.RemoveAll(p => p.QuestType == 3);
                Quests.RemoveAll(q => q.Type == 3);
            }


            Count = (int)RawData.api_count;

            if (RawData.api_list != null)                       //任務完遂時orページ遷移時 null になる

            {
                foreach (dynamic elem in RawData.api_list)
                {
                    if (!(elem is double))                                      //空欄は -1 になるため。

                    {
                        int id = (int)elem.api_no;
                        if (!Quests.ContainsKey(id))
                        {
                            var q = new QuestData();
                            q.LoadFromResponse(apiname, elem);
                            Quests.Add(q);
                        }
                        else
                        {
                            Quests[id].LoadFromResponse(apiname, elem);
                        }
                    }
                }
            }


            IsLoaded = true;
        }
Пример #6
0
        public void Drop(uint questId)
        {
            if (!Quests.ContainsKey(questId))
            {
                return;
            }
            var quest = Quests[questId];

            quest.Drop();
            Quests.Remove(questId);
        }
Пример #7
0
        public override void LoadFromResponse(string apiname, dynamic data)
        {
            base.LoadFromResponse(apiname, (object)data);


            //周期任務削除
            if (DateTimeHelper.IsCrossedDay(_prevTime, 5, 0, 0))
            {
                Quests.RemoveAll(q => q.Type == 2 || q.Type == 4 || q.Type == 5);
            }
            if (DateTimeHelper.IsCrossedWeek(_prevTime, DayOfWeek.Monday, 5, 0, 0))
            {
                Quests.RemoveAll(q => q.Type == 3);
            }
            if (DateTimeHelper.IsCrossedMonth(_prevTime, 1, 5, 0, 0))
            {
                Quests.RemoveAll(q => q.Type == 6);
            }


            Count = (int)RawData.api_count;

            if (RawData.api_list != null)                       //任務完遂時orページ遷移時 null になる

            {
                foreach (dynamic elem in RawData.api_list)
                {
                    if (!(elem is double))                                      //空欄は -1 になるため。

                    {
                        int id = (int)elem.api_no;
                        if (!Quests.ContainsKey(id))
                        {
                            var q = new QuestData();
                            q.LoadFromResponse(apiname, elem);
                            Quests.Add(q);
                        }
                        else
                        {
                            Quests[id].LoadFromResponse(apiname, elem);
                        }
                    }
                }
            }


            IsLoaded  = true;
            _prevTime = DateTime.Now;
        }
        public void Complete(uint questId, int selected, bool supply = true)
        {
            if (!Quests.ContainsKey(questId))
            {
                _log.Warn("Complete not exist quest {0}", questId);
                return;
            }

            var quest = Quests[questId];
            var res   = quest.Complete(selected);

            if (res != 0)
            {
                if (supply)
                {
                    var supplies = QuestManager.Instance.GetSupplies(quest.Template.Level);
                    if (supplies != null)
                    {
                        Owner.AddExp(supplies.Exp, true);
                        Owner.Money += supplies.Copper;
                        Owner.SendPacket(
                            new SCItemTaskSuccessPacket(
                                ItemTaskType.QuestComplete,
                                new List <ItemTask>
                        {
                            new MoneyChange(supplies.Copper)
                        },
                                new List <ulong>())
                            );
                    }
                }

                var completeId = (ushort)(quest.TemplateId / 64);
                if (!CompletedQuests.ContainsKey(completeId))
                {
                    CompletedQuests.Add(completeId, new CompletedQuest(completeId));
                }
                var complete = CompletedQuests[completeId];
                complete.Body.Set((int)(quest.TemplateId - completeId * 64), true);
                var body = new byte[8];
                complete.Body.CopyTo(body, 0);
                Owner.SendPacket(new SCQuestContextCompletedPacket(quest.TemplateId, body, res));
                Quests.Remove(questId);
                _removed.Add(questId);
                OnQuestComplete(questId);
            }
        }
Пример #9
0
        public bool AddNewQuest(int QuestID, string Data = "")
        {
            if (Quests.ContainsKey(QuestID))
            {
                return(false);
            }

            Server.Instance.CharacterDatabase.RunQuery("INSERT INTO character_quests (id, charid, questid, data) VALUES (NULL, " + Character.ID.ToString() + ", " + QuestID + ", '" + MySqlHelper.EscapeString(Data) + "')");
            int ID = Server.Instance.CharacterDatabase.GetLastInsertId();

            Quests[QuestID] = new QuestData
            {
                ID      = ID,
                Data    = Data,
                QuestID = QuestID
            };
            QuestPacket.SendQuestDataUpdate(Character, QuestID, Data);
            return(true);
        }
Пример #10
0
 public string GetQuestData(int QuestID)
 {
     return(Quests.ContainsKey(QuestID) ? Quests[QuestID].Data : "");
 }
Пример #11
0
 public bool HasQuest(int QuestID)
 {
     return(Quests.ContainsKey(QuestID));
 }