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