/// <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); } }
/// <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); } }
/// <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); } } } }
/// <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); } }
/// <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) { ; } }
/// <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); }
/// <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>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); }
/// <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); }
/// <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); }
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."); }
/// <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); } }
/// <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); } } }
/// <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); }
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); }
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); }
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); } } }
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); } }
public void OfferQuestReward(IQuestHolder qHolder) { QuestHandler.SendQuestGiverOfferReward((IEntity)qHolder, this.Template, this.m_Log.Owner); }
/// <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) { }
/// <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) { }
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; }
public void OfferQuestReward(IQuestHolder qHolder) { QuestHandler.SendQuestGiverOfferReward(qHolder, Template, m_Log.Owner); }
/// <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; }
/// <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); } } }
/// <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; }