コード例 #1
0
        public void FinalizeDataHolder()
        {
            QuestTemplate template = QuestMgr.GetTemplate(QuestId);

            if (template == null)
            {
                ContentMgr.OnInvalidDBData(
                    GetType().Name + " (QuestGiverId: {0}) referred to invalid QuestId: " + QuestId,
                    (object)QuestGiverId);
            }
            else
            {
                ObjectTemplate objectTemplate = ObjectTemplate;
                if (objectTemplate == null)
                {
                    ContentMgr.OnInvalidDBData(
                        GetType().Name + " (QuestId: {0}) referred to invalid QuestGiverId: " +
                        QuestGiverId, (object)QuestId);
                }
                else
                {
                    QuestHolderInfo questHolderInfo = objectTemplate.QuestHolderInfo;
                    bool            flag            = questHolderInfo == null;
                    if (flag)
                    {
                        objectTemplate.QuestHolderInfo = questHolderInfo = new QuestHolderInfo();
                    }
                    switch (RelationType)
                    {
                    case QuestGiverRelationType.Starter:
                        questHolderInfo.QuestStarts.Add(template);
                        template.Starters.Add(objectTemplate);
                        if (!flag)
                        {
                            break;
                        }
                        ++QuestMgr._questStarterCount;
                        break;

                    case QuestGiverRelationType.Finisher:
                        questHolderInfo.QuestEnds.Add(template);
                        template.Finishers.Add(objectTemplate);
                        if (!flag)
                        {
                            break;
                        }
                        ++QuestMgr._questFinisherCount;
                        break;

                    default:
                        ContentMgr.OnInvalidDBData(
                            GetType().Name +
                            " (Quest: {0}, QuestGiver: {1}) had invalid QuestGiverRelationType: " +
                            RelationType, (object)QuestId, (object)QuestGiverId);
                        break;
                    }
                }
            }
        }
コード例 #2
0
        public void FinalizeDataHolder()
        {
            var template = QuestMgr.GetTemplate(QuestId);

            if (template == null)
            {
                ContentMgr.OnInvalidDBData(GetType().Name + " (QuestGiverId: {0}) referred to invalid QuestId: " +
                                           QuestId, QuestGiverId);
            }
            else
            {
                var entry = ObjectTemplate;
                if (entry == null)
                {
                    ContentMgr.OnInvalidDBData(GetType().Name + " (QuestId: {0}) referred to invalid QuestGiverId: " +
                                               QuestGiverId, QuestId);
                }
                else
                {
                    var qgEntry = entry.QuestHolderInfo;
                    var newQg   = qgEntry == null;
                    if (newQg)
                    {
                        entry.QuestHolderInfo = qgEntry = new QuestHolderInfo();
                    }

                    switch (RelationType)
                    {
                    case QuestGiverRelationType.Starter:
                    {
                        qgEntry.QuestStarts.Add(template);
                        template.Starters.Add(entry);
                        if (newQg)
                        {
                            QuestMgr._questStarterCount++;
                        }
                        break;
                    }

                    case QuestGiverRelationType.Finisher:
                    {
                        qgEntry.QuestEnds.Add(template);
                        template.Finishers.Add(entry);
                        if (newQg)
                        {
                            QuestMgr._questFinisherCount++;
                        }
                        break;
                    }

                    default:
                        ContentMgr.OnInvalidDBData(GetType().Name + " (Quest: {0}, QuestGiver: {1}) had invalid QuestGiverRelationType: " +
                                                   RelationType, QuestId, QuestGiverId);
                        break;
                    }
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Tries to hand out the rewards, archives this quest and sends details about the next quest in the chain (if any).
        /// </summary>
        /// <param name="qHolder"></param>
        /// <param name="rewardSlot"></param>
        public bool TryFinish(IQuestHolder qHolder, uint rewardSlot)
        {
            Character owner = m_Log.Owner;

            owner.OnInteract(qHolder as WorldObject);
            if (qHolder is WorldObject &&
                !owner.IsInRadius((WorldObject)qHolder, NPCMgr.DefaultInteractionDistance))
            {
                NPCHandler.SendNPCError(owner, qHolder,
                                        VendorInventoryError.TooFarAway);
                return(false);
            }

            if (!Template.TryGiveRewards(m_Log.Owner, qHolder, rewardSlot))
            {
                return(false);
            }
            ArchiveQuest();
            QuestHandler.SendComplete(Template, owner);
            if (Template.FollowupQuestId != 0U)
            {
                QuestTemplate template = QuestMgr.GetTemplate(Template.FollowupQuestId);
                if (template != null && qHolder.QuestHolderInfo.QuestStarts.Contains(template))
                {
                    QuestHandler.SendDetails(qHolder, template, owner, true);
                    if (template.Flags.HasFlag(QuestFlags.AutoAccept))
                    {
                        owner.QuestLog.TryAddQuest(template, qHolder);
                    }
                }
            }

            if (!Template.Repeatable)
            {
                owner.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteQuestCount, 1U, 0U,
                                                                   null);
                owner.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteQuest,
                                                                   Entry, 0U, null);
                if (Template.ZoneTemplate != null)
                {
                    owner.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteQuestsInZone,
                                                                       (uint)Template.ZoneTemplate.Id, 0U, null);
                }
            }

            if (Template.IsDaily)
            {
                owner.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteDailyQuest, 1U, 0U,
                                                                   null);
            }
            return(true);
        }
コード例 #4
0
ファイル: Quest.cs プロジェクト: NecroSharper/WCell
        /// <summary>
        /// Tries to hand out the rewards, archives this quest and sends details about the next quest in the chain (if any).
        /// </summary>
        /// <param name="qHolder"></param>
        /// <param name="rewardSlot"></param>
        public bool TryFinish(IQuestHolder qHolder, uint rewardSlot)
        {
            var chr = m_Log.Owner;

            chr.OnInteract(qHolder as WorldObject);

            if (qHolder is WorldObject && !chr.IsInRadius((WorldObject)qHolder, NPCMgr.DefaultInteractionDistance))
            {
                NPCHandler.SendNPCError(chr, qHolder, VendorInventoryError.TooFarAway);
                return(false);
            }

            if (Template.TryGiveRewards(m_Log.Owner, qHolder, rewardSlot))
            {
                ArchiveQuest();
                QuestHandler.SendComplete(Template, chr);

                if (Template.FollowupQuestId != 0)
                {
                    var nq = QuestMgr.GetTemplate(Template.FollowupQuestId);
                    if (nq != null && qHolder.QuestHolderInfo.QuestStarts.Contains(nq))
                    {
                        // Offer the next Quest if its also offered by the same QuestGiver
                        QuestHandler.SendDetails(qHolder, nq, chr, true);
                        if (nq.Flags.HasFlag(QuestFlags.AutoAccept))
                        {
                            chr.QuestLog.TryAddQuest(nq, qHolder);
                        }
                    }
                }

                if (!Template.Repeatable)
                {
                    chr.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteQuestCount, 1);
                    chr.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteQuest, Entry);
                    if (Template.ZoneTemplate != null)
                    {
                        chr.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteQuestsInZone,
                                                                         (uint)Template.ZoneTemplate.Id);
                    }
                }

                if (Template.IsDaily)
                {
                    chr.Achievements.CheckPossibleAchievementUpdates(AchievementCriteriaType.CompleteDailyQuest, 1);
                }

                return(true);
            }
            return(false);
        }
コード例 #5
0
ファイル: QuestMgr.cs プロジェクト: uvbs/Asda2-Server
 public static void SetItemQuestRelations()
 {
     foreach (ItemTemplate template1 in ItemMgr.Templates)
     {
         if (template1 != null && template1.QuestId != 0U)
         {
             QuestTemplate template2 = QuestMgr.GetTemplate(template1.QuestId);
             if (template2 != null)
             {
                 template1.QuestHolderInfo = new QuestHolderInfo();
                 template1.QuestHolderInfo.QuestStarts.Add(template2);
             }
         }
     }
 }
コード例 #6
0
        /// <summary>
        /// If we want this method to be public,
        /// it should update all Quests correctly (remove non-existant ones etc)
        /// </summary>
        internal void Load()
        {
            QuestRecord[] records;
            try
            {
                records = QuestRecord.GetQuestRecordForCharacter(Owner.EntityId.Low);
            }
            catch (Exception e)
            {
                RealmDBMgr.OnDBError(e);
                records = QuestRecord.GetQuestRecordForCharacter(Owner.EntityId.Low);
            }

            if (records != null)
            {
                foreach (var record in records)
                {
                    var templ = QuestMgr.GetTemplate(record.QuestTemplateId);
                    if (templ != null)
                    {
                        var quest = new Quest(this, record, templ);
                        AddQuest(quest);

                        //Cancel any quests relating to inactive events
                        if (templ.EventIds.Count > 0)
                        {
                            if (!templ.EventIds.Where(WorldEventMgr.IsEventActive).Any())
                            {
                                quest.Cancel(false);
                            }
                        }
                    }
                    else
                    {
                        log.Error("Character {0} had Invalid Quest: {1} (Record: {2})", Owner,
                                  record.QuestTemplateId, record.QuestRecordId);
                    }
                }
            }
        }
コード例 #7
0
        /// <summary>
        /// If we want this method to be public,
        /// it should update all Quests correctly (remove non-existant ones etc)
        /// </summary>
        internal void Load()
        {
            QuestRecord[] recordForCharacter;
            try
            {
                recordForCharacter = QuestRecord.GetQuestRecordForCharacter(Owner.EntityId.Low);
            }
            catch (Exception ex)
            {
                RealmDBMgr.OnDBError(ex);
                recordForCharacter = QuestRecord.GetQuestRecordForCharacter(Owner.EntityId.Low);
            }

            if (recordForCharacter == null)
            {
                return;
            }
            foreach (QuestRecord record in recordForCharacter)
            {
                QuestTemplate template = QuestMgr.GetTemplate(record.QuestTemplateId);
                if (template != null)
                {
                    Quest quest = new Quest(this, record, template);
                    AddQuest(quest);
                    if (template.EventIds.Count > 0 && !template.EventIds
                        .Where(WorldEventMgr.IsEventActive).Any())
                    {
                        quest.Cancel(false);
                    }
                }
                else
                {
                    log.Error("Character {0} had Invalid Quest: {1} (Record: {2})", Owner,
                              record.QuestTemplateId, record.QuestRecordId);
                }
            }
        }
コード例 #8
0
ファイル: QuestMgr.cs プロジェクト: uvbs/Asda2-Server
        /// <summary>Creates the graph of all quests and their relations</summary>
        private static void CreateQuestRelationGraph()
        {
            Dictionary <int, List <uint> > map = new Dictionary <int, List <uint> >();

            foreach (QuestTemplate template1 in QuestMgr.Templates)
            {
                if (template1 != null)
                {
                    if (template1.Id == 10068U)
                    {
                        template1.ToString();
                    }
                    if (template1.ExclusiveGroup != 0)
                    {
                        map.GetOrCreate <int, uint>(template1.ExclusiveGroup).AddUnique <uint>(template1.Id);
                    }
                    else if (template1.NextQuestId != 0)
                    {
                        QuestTemplate template2 = QuestMgr.GetTemplate((uint)Math.Abs(template1.NextQuestId));
                        if (template2 == null)
                        {
                            ContentMgr.OnInvalidDBData("NextQuestId {0} is invalid in: {1}",
                                                       (object)template1.NextQuestId, (object)template1);
                        }
                        else if (template1.NextQuestId > 0)
                        {
                            template2.ReqAllFinishedQuests.AddUnique <uint>(template1.Id);
                        }
                        else
                        {
                            template2.ReqAllActiveQuests.AddUnique <uint>(template1.Id);
                        }
                    }

                    if (template1.PreviousQuestId != 0)
                    {
                        if (template1.PreviousQuestId > 0)
                        {
                            template1.ReqAllFinishedQuests.AddUnique <uint>((uint)template1.PreviousQuestId);
                        }
                        else
                        {
                            template1.ReqAllActiveQuests.AddUnique <uint>((uint)-template1.PreviousQuestId);
                        }
                    }

                    if (template1.FollowupQuestId != 0U)
                    {
                        QuestTemplate template2 = QuestMgr.GetTemplate(template1.FollowupQuestId);
                        if (template2 != null)
                        {
                            template2.ReqAllFinishedQuests.AddUnique <uint>(template1.Id);
                        }
                    }
                }
            }

            foreach (KeyValuePair <int, List <uint> > keyValuePair in map)
            {
                foreach (uint id in keyValuePair.Value)
                {
                    QuestTemplate template1 = QuestMgr.GetTemplate(id);
                    foreach (uint num in keyValuePair.Value)
                    {
                        if ((int)num != (int)id && keyValuePair.Key > 0)
                        {
                            template1.ReqUndoneQuests.AddUnique <uint>(num);
                        }
                    }

                    if (template1.NextQuestId != 0)
                    {
                        QuestTemplate template2 = QuestMgr.GetTemplate((uint)Math.Abs(template1.NextQuestId));
                        if (template2 == null)
                        {
                            ContentMgr.OnInvalidDBData("NextQuestId {0} is invalid in: {1}",
                                                       (object)template1.NextQuestId, (object)template1);
                        }
                        else if (keyValuePair.Key > 0)
                        {
                            template2.ReqAllFinishedQuests.AddUnique <uint>(template1.Id);
                        }
                        else
                        {
                            template2.ReqAnyFinishedQuests.AddUnique <uint>(template1.Id);
                        }
                    }
                }
            }
        }