Beispiel #1
0
        /// <summary>Handles the quest giver query quest.</summary>
        public static void HandleQuestGiverQueryQuest(IRealmClient client, RealmPacketIn packet)
        {
            EntityId      guid            = packet.ReadEntityId();
            Character     activeCharacter = client.ActiveCharacter;
            uint          num             = packet.ReadUInt32();
            IQuestHolder  questGiver      = activeCharacter.QuestLog.GetQuestGiver(guid);
            QuestTemplate template        = QuestMgr.GetTemplate(num);

            if (questGiver == null || template == null)
            {
                return;
            }
            if (!activeCharacter.QuestLog.HasActiveQuest(num))
            {
                bool flag = template.Flags.HasFlag(QuestFlags.AutoAccept);
                SendDetails(questGiver, template, activeCharacter, !flag);
                if (!flag)
                {
                    return;
                }
                activeCharacter.QuestLog.TryAddQuest(template, questGiver);
            }
            else
            {
                SendRequestItems(questGiver, template, activeCharacter, false);
            }
        }
Beispiel #2
0
        /// <summary>Handles the quest giver complete quest.</summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void HandleQuestGiverCompleteQuest(IRealmClient client, RealmPacketIn packet)
        {
            EntityId     guid            = packet.ReadEntityId();
            Character    activeCharacter = client.ActiveCharacter;
            IQuestHolder questGiver      = activeCharacter.QuestLog.GetQuestGiver(guid);

            if (questGiver == null)
            {
                return;
            }
            uint  qid       = packet.ReadUInt32();
            Quest questById = activeCharacter.QuestLog.GetQuestById(qid);

            if (questById == null || !questGiver.QuestHolderInfo.QuestEnds.Contains(questById.Template))
            {
                return;
            }
            if (questById.CompleteStatus != QuestCompleteStatus.Completed)
            {
                SendRequestItems(questGiver, questById.Template, activeCharacter, false);
            }
            else
            {
                questById.OfferQuestReward(questGiver);
            }
        }
Beispiel #3
0
        /// <summary>
        /// Sends SMSG_QUESTGIVER_REQUEST_ITEMS
        /// </summary>
        /// <param name="qg">The qg.</param>
        /// <param name="qt">The qt.</param>
        /// <param name="chr">The client.</param>
        public static void SendRequestItems(IQuestHolder qg, QuestTemplate qt, Character chr, bool closeOnCancel)
        {
            if (qg.QuestHolderInfo != null)
            {
                //var list = qg.QuestHolderInfo.QuestEnds;
                //if (list != null && list.Contains(qt))
                {
                    var locale = chr.Locale;
                    using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_REQUEST_ITEMS))
                    {
                        pckt.Write(qg.EntityId);
                        pckt.Write(qt.Id);
                        pckt.Write(qt.Titles.Localize(locale));
                        pckt.Write(qt.ProgressTexts.Localize(locale));
                        pckt.Write((uint)0);                         // emote delay
                        pckt.Write((uint)qt.RequestEmoteType);       // Emote type
                        if (closeOnCancel)
                        {
                            pckt.Write((uint)1);
                        }
                        else
                        {
                            pckt.Write((uint)0);
                        }
                        pckt.Write((uint)qt.Flags);
                        pckt.Write((uint)qt.SuggestedPlayers);
                        if (qt.RewMoney < 0)
                        {
                            pckt.Write((uint)-qt.RewMoney);
                        }
                        else
                        {
                            pckt.Write((uint)0);
                        }
                        pckt.Write(qt.CollectableItems.Length);
                        for (uint i = 0; i < qt.CollectableItems.Length; i++)
                        {
                            pckt.Write((uint)qt.CollectableItems[i].ItemId);
                            pckt.Write(qt.CollectableItems[i].Amount);
                            var template = qt.CollectableItems[i].Template;
                            if (template != null)
                            {
                                pckt.Write(template.DisplayId);
                            }
                            else
                            {
                                pckt.Write((uint)0);
                            }
                        }
                        pckt.Write((uint)2);                         // unknown, probably IsActive
                        pckt.Write(4);                               // if can advance: 4
                        pckt.Write((uint)8);                         //always eight
                        pckt.Write((uint)10);                        // always ten

                        chr.Client.Send(pckt);
                    }
                }
            }
        }
Beispiel #4
0
        /// <summary>
        /// Sends packet, which informs client about IQuestHolder's status.
        /// </summary>
        /// <param name="qg">The qg.</param>
        /// <param name="status">The status.</param>
        /// <param name="chr">The client.</param>
        public static void SendQuestGiverStatus(IQuestHolder qg, QuestStatus status, Character chr)
        {
            qg.OnQuestGiverStatusQuery(chr);
            using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_STATUS))
            {
                pckt.Write(qg.EntityId);
                pckt.Write((byte)status);

                chr.Client.Send(pckt);
            }
        }
Beispiel #5
0
        /// <summary>Handles the quest giver request reward.</summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void HandleQuestGiverRequestReward(IRealmClient client, RealmPacketIn packet)
        {
            EntityId     guid       = packet.ReadEntityId();
            IQuestHolder questGiver = client.ActiveCharacter.QuestLog.GetQuestGiver(guid);

            QuestMgr.GetTemplate(packet.ReadUInt32());
            if (questGiver == null)
            {
                ;
            }
        }
Beispiel #6
0
        /// <summary>Handles the quest giver hello.</summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void HandleQuestGiverHello(IRealmClient client, RealmPacketIn packet)
        {
            EntityId     guid            = packet.ReadEntityId();
            Character    activeCharacter = client.ActiveCharacter;
            IQuestHolder questGiver      = activeCharacter.QuestLog.GetQuestGiver(guid);

            if (questGiver == null)
            {
                return;
            }
            questGiver.StartQuestDialog(activeCharacter);
        }
Beispiel #7
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);
        }
Beispiel #8
0
        /// <summary>Handles the quest giver accept quest.</summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void HandleQuestGiverAcceptQuest(IRealmClient client, RealmPacketIn packet)
        {
            EntityId      guid            = packet.ReadEntityId();
            Character     activeCharacter = client.ActiveCharacter;
            IQuestHolder  questGiver      = activeCharacter.QuestLog.GetQuestGiver(guid);
            QuestTemplate template        = QuestMgr.GetTemplate(packet.ReadUInt32());

            if (template == null || questGiver == null || !questGiver.QuestHolderInfo.QuestStarts.Contains(template))
            {
                return;
            }
            activeCharacter.QuestLog.TryAddQuest(template, questGiver);
        }
Beispiel #9
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)
        {
            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);
        }
Beispiel #10
0
        /// <summary>Handles the quest giver status query.</summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void HandleQuestGiverStatusQuery(IRealmClient client, RealmPacketIn packet)
        {
            EntityId     guid            = packet.ReadEntityId();
            Character    activeCharacter = client.ActiveCharacter;
            IQuestHolder questGiver      = activeCharacter.QuestLog.GetQuestGiver(guid);

            if (questGiver == null)
            {
                return;
            }
            QuestStatus questGiverStatus = questGiver.QuestHolderInfo.GetHighestQuestGiverStatus(activeCharacter);

            SendQuestGiverStatus(questGiver, questGiverStatus, activeCharacter);
        }
Beispiel #11
0
            public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
            {
                QuestTemplate template = QuestMgr.GetTemplate(trigger.Text.NextUInt());

                if (template != null)
                {
                    IQuestHolder character = trigger.Args.Character as IQuestHolder;
                    Character    target    = (Character)trigger.Args.Character.Target;
                    if (character != null)
                    {
                        QuestHandler.SendDetails(character, template, target, false);
                    }
                }

                trigger.Reply("Done.");
            }
Beispiel #12
0
        /// <summary>Sends the quest giver quest list.</summary>
        /// <param name="qHolder">The quest giver.</param>
        /// <param name="list">The list.</param>
        /// <param name="chr">The character.</param>
        public static void SendQuestList(IQuestHolder qHolder, List <QuestTemplate> list, Character chr)
        {
            using (RealmPacketOut packet =
                       new RealmPacketOut(new PacketId(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_LIST)))
            {
                packet.Write(qHolder.EntityId);
                if (qHolder.QuestHolderInfo == null)
                {
                    return;
                }
                packet.Write("Stay a while and listen...");
                packet.Write(0U);
                packet.Write(1U);
                int num = Math.Min(20, list.Count);
                packet.Write((byte)num);
                foreach (QuestTemplate questTemplate in list)
                {
                    packet.Write(questTemplate.Id);
                    Quest activeQuest = chr.QuestLog.GetActiveQuest(questTemplate.Id);
                    if (activeQuest != null)
                    {
                        if (activeQuest.CompleteStatus == QuestCompleteStatus.Completed)
                        {
                            packet.Write(4);
                        }
                        else
                        {
                            packet.Write(5U);
                        }
                    }
                    else
                    {
                        uint availability = (uint)questTemplate.GetAvailability(chr);
                        packet.Write(availability);
                    }

                    packet.WriteUInt(questTemplate.Level);
                    packet.WriteUInt((uint)questTemplate.Flags);
                    packet.Write((byte)0);
                    packet.WriteCString(questTemplate.DefaultTitle);
                }

                chr.Client.Send(packet, false);
            }
        }
Beispiel #13
0
        /// <summary>
        /// Sends the quest giver quest list.
        /// </summary>
        /// <param name="qHolder">The quest giver.</param>
        /// <param name="list">The list.</param>
        /// <param name="chr">The character.</param>
        public static void SendQuestList(IQuestHolder qHolder, List <QuestTemplate> list, Character chr)
        {
            using (var pkt = new RealmPacketOut(new PacketId(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_LIST)))
            {
                pkt.Write(qHolder.EntityId);
                if (qHolder.QuestHolderInfo != null)
                {
                    pkt.Write("Stay a while and listen..."); // TODO need to change to dynamic text, character-dependant
                    pkt.Write((uint)0);                      // player emote
                    pkt.Write((uint)1);                      // npc emote

                    var amount = Math.Min(QuestConstants.MaxQuestsPerQuestGiver, list.Count);
                    pkt.Write((byte)amount);

                    foreach (var qt in list)
                    {
                        pkt.Write(qt.Id);
                        var quest = chr.QuestLog.GetActiveQuest(qt.Id);
                        if (quest != null)
                        {
                            if (quest.CompleteStatus == QuestCompleteStatus.Completed)
                            {
                                //status = (uint)qt.GetEndStatus(qHolder.QuestHolderInfo, chr);
                                pkt.Write(4);
                            }
                            else
                            {
                                pkt.Write((uint)QuestStatus.NotCompleted);
                            }
                        }
                        else
                        {
                            var status = (uint)qt.GetAvailability(chr);
                            pkt.Write(status);
                        }
                        pkt.WriteUInt(qt.Level);
                        pkt.WriteUInt((uint)qt.Flags);
                        pkt.Write((byte)0);                         // 3.3.3 question/exclamation mark
                        pkt.WriteCString(qt.DefaultTitle);
                    }
                    chr.Client.Send(pkt);
                }
            }
        }
Beispiel #14
0
        /// <summary>Handles CMSG_QUESTGIVER_CHOOSE_REWARD.</summary>
        /// <param name="client">The client.</param>
        /// <param name="packet">The packet.</param>
        public static void HandleQuestGiverChooseReward(IRealmClient client, RealmPacketIn packet)
        {
            Character activeCharacter = client.ActiveCharacter;
            EntityId  guid            = packet.ReadEntityId();
            uint      qid             = packet.ReadUInt32();
            Quest     questById       = activeCharacter.QuestLog.GetQuestById(qid);

            if (questById == null)
            {
                return;
            }
            uint         rewardSlot = packet.ReadUInt32();
            IQuestHolder questGiver = activeCharacter.QuestLog.GetQuestGiver(guid);

            if (questGiver == null || questById.CompleteStatus != QuestCompleteStatus.Completed)
            {
                return;
            }
            questById.TryFinish(questGiver, rewardSlot);
        }
Beispiel #15
0
        public Quest TryAddQuest(QuestTemplate template, IQuestHolder questGiver)
        {
            int freeSlot = m_Owner.QuestLog.FindFreeSlot();

            if (freeSlot == -1)
            {
                QuestHandler.SendQuestLogFull(m_Owner);
            }
            else
            {
                QuestInvalidReason reason = template.CheckBasicRequirements(m_Owner);
                if (reason != QuestInvalidReason.Ok)
                {
                    QuestHandler.SendQuestInvalid(m_Owner, reason);
                }
                else if (m_Owner.QuestLog.GetActiveQuest(template.Id) != null)
                {
                    QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.AlreadyHave);
                }
                else if (!template.Repeatable && m_Owner.QuestLog.FinishedQuests.Contains(template.Id))
                {
                    QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.AlreadyCompleted);
                }
                else if (!questGiver.CanGiveQuestTo(m_Owner))
                {
                    QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.Tired);
                }
                else
                {
                    Quest quest = m_Owner.QuestLog.AddQuest(template, freeSlot);
                    if (quest.Template.Flags.HasFlag(QuestFlags.Escort))
                    {
                        AutoComplete(quest, m_Owner);
                    }
                    return(quest);
                }
            }

            return(null);
        }
Beispiel #16
0
        public Quest TryAddQuest(QuestTemplate template, IQuestHolder questGiver)
        {
            var slot = m_Owner.QuestLog.FindFreeSlot();

            if (slot == INVALID_SLOT)
            {
                QuestHandler.SendQuestLogFull(m_Owner);
            }
            else
            {
                var err = template.CheckBasicRequirements(m_Owner);
                if (err != QuestInvalidReason.Ok)
                {
                    QuestHandler.SendQuestInvalid(m_Owner, err);
                }
                else if (m_Owner.QuestLog.GetActiveQuest(template.Id) != null)
                {
                    QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.AlreadyHave);
                }
                else if (!template.Repeatable && m_Owner.QuestLog.FinishedQuests.Contains(template.Id))
                {
                    QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.AlreadyCompleted);
                }
                else if (!questGiver.CanGiveQuestTo(m_Owner))
                {
                    // cheat protection
                    QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.Tired);
                }
                else
                {
                    var quest = m_Owner.QuestLog.AddQuest(template, slot);
                    if (quest.Template.Flags.HasFlag(QuestFlags.Escort))
                    {
                        AutoComplete(quest, m_Owner);
                    }
                    return(quest);
                }
            }
            return(null);
        }
Beispiel #17
0
        public static void StartQuestDialog(this IQuestHolder qHolder, Character chr)
        {
            chr.OnInteract(qHolder as WorldObject);

            var list = qHolder.QuestHolderInfo.GetAvailableQuests(chr);

            if (list.Count > 0)
            {
                if (list.Count == 1 && !chr.QuestLog.HasActiveQuest(list[0].Id))
                {
                    // start a single quest if there is only one and the user did not start it yet
                    var autoAccept = list[0].Flags.HasFlag(QuestFlags.AutoAccept);
                    QuestHandler.SendDetails(qHolder, list[0], chr, !autoAccept);
                    if (autoAccept)
                    {
                        chr.QuestLog.TryAddQuest(list[0], qHolder);
                    }
                }
                else
                {
                    QuestHandler.SendQuestList(qHolder, list, chr);
                }
            }
        }
Beispiel #18
0
        public static void StartQuestDialog(this IQuestHolder qHolder, Character chr)
        {
            chr.OnInteract(qHolder as WorldObject);
            List <QuestTemplate> availableQuests = qHolder.QuestHolderInfo.GetAvailableQuests(chr);

            if (availableQuests.Count <= 0)
            {
                return;
            }
            if (availableQuests.Count == 1 && !chr.QuestLog.HasActiveQuest(availableQuests[0].Id))
            {
                bool flag = availableQuests[0].Flags.HasFlag((Enum)QuestFlags.AutoAccept);
                QuestHandler.SendDetails((IEntity)qHolder, availableQuests[0], chr, !flag);
                if (!flag)
                {
                    return;
                }
                chr.QuestLog.TryAddQuest(availableQuests[0], qHolder);
            }
            else
            {
                QuestHandler.SendQuestList(qHolder, availableQuests, chr);
            }
        }
Beispiel #19
0
 public void OfferQuestReward(IQuestHolder qHolder)
 {
     QuestHandler.SendQuestGiverOfferReward((IEntity)qHolder, this.Template, this.m_Log.Owner);
 }
Beispiel #20
0
 /// <summary>
 /// Sends packet, which informs client about IQuestHolder's status.
 /// </summary>
 /// <param name="qg">The qg.</param>
 /// <param name="status">The status.</param>
 /// <param name="chr">The client.</param>
 public static void SendQuestGiverStatus(IQuestHolder qg, QuestStatus status, Character chr)
 {
 }
Beispiel #21
0
 /// <summary>Sends SMSG_QUESTGIVER_REQUEST_ITEMS</summary>
 /// <param name="qg">The qg.</param>
 /// <param name="qt">The qt.</param>
 /// <param name="chr">The client.</param>
 public static void SendRequestItems(IQuestHolder qg, QuestTemplate qt, Character chr, bool closeOnCancel)
 {
 }
Beispiel #22
0
		public Quest TryAddQuest(QuestTemplate template, IQuestHolder questGiver)
		{
			var slot = m_Owner.QuestLog.FindFreeSlot();
			if (slot == INVALID_SLOT)
			{
				QuestHandler.SendQuestLogFull(m_Owner);
			}
			else
			{
				var err = template.CheckBasicRequirements(m_Owner);
				if (err != QuestInvalidReason.Ok)
				{
					QuestHandler.SendQuestInvalid(m_Owner, err);
				}
				else if (m_Owner.QuestLog.GetActiveQuest(template.Id) != null)
				{
					QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.AlreadyHave);
				}
				else if (!template.Repeatable && m_Owner.QuestLog.FinishedQuests.Contains(template.Id))
				{
					QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.AlreadyCompleted);
				}
				else if (!questGiver.CanGiveQuestTo(m_Owner))
				{
					// cheat protection
					QuestHandler.SendQuestInvalid(m_Owner, QuestInvalidReason.Tired);
				}
				else
				{
					var quest = m_Owner.QuestLog.AddQuest(template, slot);
					if (quest.Template.Flags.HasFlag(QuestFlags.Escort))
					{
						AutoComplete(quest, m_Owner);
					}
					return quest;
				}
			}
			return null;
		}
Beispiel #23
0
        /// <summary>
        /// Sends packet, which informs client about IQuestHolder's status.
        /// </summary>
        /// <param name="qg">The qg.</param>
        /// <param name="status">The status.</param>
        /// <param name="chr">The client.</param>
        public static void SendQuestGiverStatus(IQuestHolder qg, QuestStatus status, Character chr)
        {
            qg.OnQuestGiverStatusQuery(chr);
            using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_STATUS))
            {
                pckt.Write(qg.EntityId);
                pckt.Write((byte)status);

                chr.Client.Send(pckt);
            }
        }
Beispiel #24
0
 public void OfferQuestReward(IQuestHolder qHolder)
 {
     QuestHandler.SendQuestGiverOfferReward(qHolder, Template, m_Log.Owner);
 }
Beispiel #25
0
		public void OfferQuestReward(IQuestHolder qHolder)
		{
			QuestHandler.SendQuestGiverOfferReward(qHolder, Template, m_Log.Owner);
		}
Beispiel #26
0
        /// <summary>
        /// Sends SMSG_QUESTGIVER_REQUEST_ITEMS
        /// </summary>
        /// <param name="qg">The qg.</param>
        /// <param name="qt">The qt.</param>
        /// <param name="chr">The client.</param>
        public static void SendRequestItems(IQuestHolder qg, QuestTemplate qt, Character chr, bool closeOnCancel)
        {
            if (qg.QuestHolderInfo != null)
            {
                //var list = qg.QuestHolderInfo.QuestEnds;
                //if (list != null && list.Contains(qt))
                {
                    var locale = chr.Locale;
                    using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_REQUEST_ITEMS))
                    {
                        pckt.Write(qg.EntityId);
                        pckt.Write(qt.Id);
                        pckt.Write(qt.Titles.Localize(locale));
                        pckt.Write(qt.ProgressTexts.Localize(locale));
                        pckt.Write((uint)0); // emote delay
                        pckt.Write((uint)qt.RequestEmoteType); // Emote type
                        if (closeOnCancel)
                        {
                            pckt.Write((uint)1);
                        }
                        else
                        {
                            pckt.Write((uint)0);
                        }
                        pckt.Write((uint)qt.Flags);
                        pckt.Write((uint)qt.SuggestedPlayers);
                        if (qt.RewMoney < 0)
                        {
                            pckt.Write((uint)-qt.RewMoney);
                        }
                        else
                        {
                            pckt.Write((uint)0);
                        }
                        pckt.Write(qt.CollectableItems.Length);
                        for (uint i = 0; i < qt.CollectableItems.Length; i++)
                        {
                            pckt.Write((uint)qt.CollectableItems[i].ItemId);
                            pckt.Write(qt.CollectableItems[i].Amount);
                            var template = qt.CollectableItems[i].Template;
                            if (template != null)
                            {
                                pckt.Write(template.DisplayId);
                            }
                            else
                            {
                                pckt.Write((uint)0);
                            }
                        }
                        pckt.Write((uint)2); // unknown, probably IsActive
                        pckt.Write(4);			// if can advance: 4
                        pckt.Write((uint)8); //always eight
                        pckt.Write((uint)10); // always ten

                        chr.Client.Send(pckt);
                    }
                }
            }
        }
Beispiel #27
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)
		{
			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;
		}
Beispiel #28
0
        /// <summary>
        /// Sends the quest giver quest list.
        /// </summary>
        /// <param name="qHolder">The quest giver.</param>
        /// <param name="list">The list.</param>
        /// <param name="chr">The character.</param>
        public static void SendQuestList(IQuestHolder qHolder, List<QuestTemplate> list, Character chr)
        {
            using (var pkt = new RealmPacketOut(new PacketId(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_LIST)))
            {
                pkt.Write(qHolder.EntityId);
                if (qHolder.QuestHolderInfo != null)
                {
                    pkt.Write("Stay a while and listen..."); // TODO need to change to dynamic text, character-dependant
                    pkt.Write((uint)0); // player emote
                    pkt.Write((uint)1); // npc emote

                    var amount = Math.Min(QuestConstants.MaxQuestsPerQuestGiver, list.Count);
                    pkt.Write((byte)amount);

                    foreach (var qt in list)
                    {
                        pkt.Write(qt.Id);
                        var quest = chr.QuestLog.GetActiveQuest(qt.Id);
                        if (quest != null)
                        {
                            if (quest.CompleteStatus == QuestCompleteStatus.Completed)
                            {
                                //status = (uint)qt.GetEndStatus(qHolder.QuestHolderInfo, chr);
                                pkt.Write(4);
                            }
                            else
                            {
                                pkt.Write((uint)QuestStatus.NotCompleted);
                            }
                        }
                        else
                        {
                            var status = (uint)qt.GetAvailability(chr);
                            pkt.Write(status);
                        }
                        pkt.WriteUInt(qt.Level);
                        pkt.WriteUInt((uint)qt.Flags);
                        pkt.Write((byte)0); // 3.3.3 question/exclamation mark
                        pkt.WriteCString(qt.DefaultTitle);
                    }
                    chr.Client.Send(pkt);
                }
            }
        }
Beispiel #29
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)
		{
			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);
					}
				}
				return true;
			}
			return false;
		}