/// <summary> /// Sends the quest giver quest complete. /// </summary> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> public static void SendComplete(QuestTemplate qt, Character chr) { using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_COMPLETE)) { pckt.Write(qt.Id); if (chr.Level >= RealmServerConfiguration.MaxCharacterLevel) { pckt.Write(0u); pckt.Write(qt.MoneyAtMaxLevel); } else { pckt.Write(qt.CalcRewardXp(chr)); pckt.Write(qt.RewMoney); } pckt.Write(qt.CalcRewardHonor(chr)); pckt.Write(qt.RewardTalents); pckt.Write(0); // since 3.3: Arena reward chr.Client.Send(pckt); /*if (chr.Level >= LevelMgr.MaxCharacterLevel) * { * pckt.Write(qt.MoneyAtMaxLevel); * } * else * { * pckt.Write(qt.RewMoney); * } * pckt.Write((uint)0); // unknown value * * pckt.Write(qt.RewardItems.Length); * * foreach (var reward in qt.RewardItems) * { * pckt.Write(reward.ItemId); * pckt.Write(reward.Amount); * }*/ } }
/// <summary>Sends the quest giver quest complete.</summary> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> public static void SendComplete(QuestTemplate qt, Character chr) { using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_COMPLETE)) { packet.Write(qt.Id); if (chr.Level >= RealmServerConfiguration.MaxCharacterLevel) { packet.Write(0U); packet.Write(qt.MoneyAtMaxLevel); } else { packet.Write(qt.CalcRewardXp(chr)); packet.Write(qt.RewMoney); } packet.Write(qt.CalcRewardHonor(chr)); packet.Write(qt.RewardTalents); packet.Write(0); chr.Client.Send(packet, false); } }
/// <summary> /// Offers the reward of the given Quest to the given Character. /// When replying the Quest will be complete. /// </summary> /// <param name="questGiver">The qg.</param> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> public static void SendQuestGiverOfferReward(IEntity questGiver, QuestTemplate qt, Character chr) { ClientLocale locale = chr.Locale; using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_OFFER_REWARD)) { packet.Write(questGiver.EntityId); packet.WriteUInt(qt.Id); packet.WriteCString(qt.Titles.Localize(locale)); packet.WriteCString(qt.OfferRewardTexts.Localize(locale)); packet.WriteByte(qt.FollowupQuestId > 0U ? (byte)1 : (byte)0); packet.WriteUInt((uint)qt.Flags); packet.WriteUInt(qt.SuggestedPlayers); packet.Write(qt.OfferRewardEmotes.Length); for (uint index = 0; (long)index < (long)qt.OfferRewardEmotes.Length; ++index) { packet.Write(qt.OfferRewardEmotes[index].Delay); packet.Write((uint)qt.OfferRewardEmotes[index].Type); } packet.Write(qt.RewardChoiceItems.Length); for (int index = 0; index < qt.RewardChoiceItems.Length; ++index) { packet.Write((uint)qt.RewardChoiceItems[index].ItemId); packet.Write(qt.RewardChoiceItems[index].Amount); ItemTemplate template = qt.RewardChoiceItems[index].Template; if (template != null) { packet.Write(template.DisplayId); } else { packet.Write(0); } } packet.Write(qt.RewardItems.Length); for (int index = 0; index < qt.RewardItems.Length; ++index) { packet.Write((uint)qt.RewardItems[index].ItemId); packet.Write(qt.RewardItems[index].Amount); ItemTemplate template = qt.RewardItems[index].Template; if (template != null) { packet.WriteUInt(template.DisplayId); } else { packet.Write(0); } } if (chr.Level >= RealmServerConfiguration.MaxCharacterLevel) { packet.Write(qt.MoneyAtMaxLevel); } else { packet.Write(qt.RewMoney); } packet.Write(qt.CalcRewardXp(chr)); packet.Write(qt.CalcRewardHonor(chr)); packet.Write(qt.RewHonorMultiplier); packet.Write(8U); packet.Write((uint)qt.RewSpell); packet.Write((uint)qt.CastSpell); packet.Write((uint)qt.RewardTitleId); packet.Write(qt.RewardTalents); packet.Write(0); packet.Write(0); for (uint index = 0; index < 5U; ++index) { packet.Write((uint)qt.RewardReputations[index].Faction); } for (uint index = 0; index < 5U; ++index) { packet.Write(qt.RewardReputations[index].ValueId); } for (uint index = 0; index < 5U; ++index) { packet.Write(qt.RewardReputations[index].Value); } chr.Client.Send(packet, false); } }
/// <summary>Sends the quest giver quest detail.</summary> /// <param name="questGiver">The qg.</param> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> /// <param name="acceptable">if set to <c>true</c> [acceptable].</param> public static void SendDetails(IEntity questGiver, QuestTemplate qt, Character chr, bool acceptable) { ClientLocale locale = chr.Locale; using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_DETAILS)) { packet.Write(questGiver != null ? questGiver.EntityId : EntityId.Zero); packet.Write(EntityId.Zero); packet.Write(qt.Id); packet.WriteCString(qt.Titles.Localize(locale)); packet.WriteCString(qt.Details.Localize(locale)); packet.WriteCString(qt.Instructions.Localize(locale)); packet.Write(acceptable ? (byte)1 : (byte)0); packet.WriteUInt((uint)qt.Flags); packet.WriteUInt(qt.SuggestedPlayers); packet.Write((byte)0); if (qt.Flags.HasFlag(QuestFlags.HiddenRewards)) { packet.WriteUInt(0U); packet.WriteUInt(0U); packet.WriteUInt(0U); packet.WriteUInt(0U); } else { packet.Write(qt.RewardChoiceItems.Length); for (uint index = 0; (long)index < (long)qt.RewardChoiceItems.Length; ++index) { packet.Write((uint)qt.RewardChoiceItems[index].ItemId); packet.Write(qt.RewardChoiceItems[index].Amount); ItemTemplate template = qt.RewardChoiceItems[index].Template; if (template != null) { packet.Write(template.DisplayId); } else { packet.Write(0); } } packet.Write(qt.RewardItems.Length); for (uint index = 0; (long)index < (long)qt.RewardItems.Length; ++index) { packet.Write((uint)qt.RewardItems[index].ItemId); packet.Write(qt.RewardItems[index].Amount); ItemTemplate template = qt.RewardItems[index].Template; if (template != null) { packet.Write(template.DisplayId); } else { packet.Write(0); } } if (chr.Level >= RealmServerConfiguration.MaxCharacterLevel) { packet.Write(qt.MoneyAtMaxLevel); } else { packet.Write(qt.RewMoney); } packet.Write(qt.CalcRewardXp(chr)); } packet.Write(qt.RewHonorAddition); packet.Write(qt.RewHonorMultiplier); packet.Write((uint)qt.RewSpell); packet.Write((uint)qt.CastSpell); packet.Write((uint)qt.RewardTitleId); packet.Write(qt.RewardTalents); packet.Write(0); packet.Write(0); for (uint index = 0; index < 5U; ++index) { packet.Write((uint)qt.RewardReputations[index].Faction); } for (uint index = 0; index < 5U; ++index) { packet.Write(qt.RewardReputations[index].ValueId); } for (uint index = 0; index < 5U; ++index) { packet.Write(qt.RewardReputations[index].Value); } packet.Write(4); for (int index = 0; index < 4; ++index) { EmoteTemplate questDetailedEmote = qt.QuestDetailedEmotes[index]; packet.Write((int)questDetailedEmote.Type); packet.Write(questDetailedEmote.Delay); } chr.Client.Send(packet, false); } }
/// <summary>Sends the quest query response.</summary> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> public static void SendQuestQueryResponse(QuestTemplate qt, Character chr) { ClientLocale locale = chr.Client.Info.Locale; using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_QUEST_QUERY_RESPONSE)) { packet.Write(qt.Id); packet.Write((uint)qt.IsActive); packet.Write(qt.Level); packet.Write(qt.MinLevel); packet.Write(qt.Category); packet.Write((uint)qt.QuestType); packet.Write(qt.SuggestedPlayers); packet.Write((uint)qt.ObjectiveMinReputation.ReputationIndex); packet.Write(qt.ObjectiveMinReputation.Value); packet.Write((uint)qt.ObjectiveMaxReputation.ReputationIndex); packet.Write(qt.ObjectiveMaxReputation.Value); packet.Write(qt.FollowupQuestId); packet.Write(qt.CalcRewardXp(chr)); if (qt.Flags.HasFlag(QuestFlags.HiddenRewards)) { packet.Write(0); } else { packet.Write(qt.RewMoney); } packet.Write(qt.MoneyAtMaxLevel); packet.Write((uint)qt.CastSpell); packet.Write((uint)qt.RewSpell); packet.Write(qt.RewHonorAddition); packet.WriteFloat(qt.RewHonorMultiplier); packet.Write((uint)qt.SrcItemId); packet.Write((uint)qt.Flags); packet.Write((uint)qt.RewardTitleId); packet.Write(qt.PlayersSlain); packet.Write(qt.RewardTalents); packet.Write(0); packet.Write(0); if (qt.Flags.HasFlag(QuestFlags.HiddenRewards)) { for (int index = 0; index < 4; ++index) { packet.WriteUInt(0U); packet.WriteUInt(0U); } for (int index = 0; index < 6; ++index) { packet.WriteUInt(0U); packet.WriteUInt(0U); } } else { for (int index = 0; index < 4; ++index) { if (index < qt.RewardItems.Length) { packet.Write((uint)qt.RewardItems[index].ItemId); packet.Write(qt.RewardItems[index].Amount); } else { packet.WriteUInt(0U); packet.WriteUInt(0U); } } for (int index = 0; index < 6; ++index) { if (index < qt.RewardChoiceItems.Length) { packet.Write((uint)qt.RewardChoiceItems[index].ItemId); packet.Write(qt.RewardChoiceItems[index].Amount); } else { packet.WriteUInt(0U); packet.WriteUInt(0U); } } } for (int index = 0; index < 5; ++index) { packet.Write((uint)qt.RewardReputations[index].Faction); } for (int index = 0; index < 5; ++index) { packet.Write(qt.RewardReputations[index].ValueId); } for (int index = 0; index < 5; ++index) { packet.Write(qt.RewardReputations[index].Value); } packet.Write((uint)qt.MapId); packet.Write(qt.PointX); packet.Write(qt.PointY); packet.Write(qt.PointOpt); packet.WriteCString(qt.Titles.Localize(locale)); packet.WriteCString(qt.Instructions.Localize(locale)); packet.WriteCString(qt.Details.Localize(locale)); packet.WriteCString(qt.EndTexts.Localize(locale)); packet.WriteCString(qt.CompletedTexts.Localize(locale)); for (int index = 0; index < 4; ++index) { packet.Write(qt.ObjectOrSpellInteractions[index].RawId); packet.Write(qt.ObjectOrSpellInteractions[index].Amount); packet.Write((uint)qt.CollectableSourceItems[index].ItemId); packet.Write(qt.CollectableSourceItems[index].Amount); } for (int index = 0; index < 6; ++index) { if (index < qt.CollectableItems.Length) { packet.Write((uint)qt.CollectableItems[index].ItemId); packet.Write(qt.CollectableItems[index].Amount); } else { packet.WriteUInt(0U); packet.WriteUInt(0U); } } for (int index = 0; index < 4; ++index) { QuestObjectiveSet objectiveText = qt.ObjectiveTexts[(int)locale]; if (objectiveText != null) { packet.Write(objectiveText.Texts[index]); } else { packet.Write(""); } } chr.Client.Send(packet, false); } }
/// <summary> /// Offers the reward of the given Quest to the given Character. /// When replying the Quest will be complete. /// </summary> /// <param name="questGiver">The qg.</param> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> public static void SendQuestGiverOfferReward(IEntity questGiver, QuestTemplate qt, Character chr) { //if (questGiver.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_OFFER_REWARD)) { pckt.Write(questGiver.EntityId); pckt.WriteUInt(qt.Id); pckt.WriteCString(qt.Titles.Localize(locale)); pckt.WriteCString(qt.OfferRewardTexts.Localize(locale)); pckt.WriteByte((byte)(qt.FollowupQuestId > 0 ? 1 : 0)); pckt.WriteUInt((uint)qt.Flags); pckt.WriteUInt(qt.SuggestedPlayers); // Suggested Group Num pckt.Write(qt.OfferRewardEmotes.Length); for (uint i = 0; i < qt.OfferRewardEmotes.Length; i++) { pckt.Write(qt.OfferRewardEmotes[i].Delay); pckt.Write((uint)qt.OfferRewardEmotes[i].Type); } pckt.Write(qt.RewardChoiceItems.Length); for (var i = 0; i < qt.RewardChoiceItems.Length; i++) { pckt.Write((uint)qt.RewardChoiceItems[i].ItemId); pckt.Write(qt.RewardChoiceItems[i].Amount); var template = qt.RewardChoiceItems[i].Template; if (template != null) { pckt.Write(template.DisplayId); } else { pckt.Write(0); } } pckt.Write(qt.RewardItems.Length); for (var i = 0; i < qt.RewardItems.Length; i++) { pckt.Write((uint)qt.RewardItems[i].ItemId); pckt.Write(qt.RewardItems[i].Amount); var template = qt.RewardItems[i].Template; if (template != null) { pckt.WriteUInt(template.DisplayId); } else { pckt.Write(0); } } if (chr.Level >= RealmServerConfiguration.MaxCharacterLevel) { pckt.Write(qt.MoneyAtMaxLevel); } else { pckt.Write(qt.RewMoney); } pckt.Write(qt.CalcRewardXp(chr)); pckt.Write(qt.CalcRewardHonor(chr)); // honor points pckt.Write(qt.RewHonorMultiplier); // since 3.3 pckt.Write((uint)0x08); // unused by client pckt.Write((uint)qt.RewSpell); pckt.Write((uint)qt.CastSpell); pckt.Write((uint)qt.RewardTitleId); pckt.Write(qt.RewardTalents); // reward talents pckt.Write(0); // since 3.3 pckt.Write(0); // since 3.3 // #### since 3.3 for (uint i = 0; i < QuestConstants.MaxReputations; i++) { pckt.Write((uint)qt.RewardReputations[i].Faction); } for (uint i = 0; i < QuestConstants.MaxReputations; i++) { pckt.Write(qt.RewardReputations[i].ValueId); } for (uint i = 0; i < QuestConstants.MaxReputations; i++) { pckt.Write(qt.RewardReputations[i].Value); } // ###### chr.Client.Send(pckt); } }
/// <summary> /// Sends the quest giver quest detail. /// </summary> /// <param name="questGiver">The qg.</param> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> /// <param name="acceptable">if set to <c>true</c> [acceptable].</param> public static void SendDetails(IEntity questGiver, QuestTemplate qt, Character chr, bool acceptable) { var locale = chr.Locale; using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUESTGIVER_QUEST_DETAILS)) { pckt.Write(questGiver != null ? questGiver.EntityId : EntityId.Zero); pckt.Write(EntityId.Zero); // unknown, wotlk, quest sharing? pckt.Write(qt.Id); pckt.WriteCString(qt.Titles.Localize(locale)); pckt.WriteCString(qt.Details.Localize(locale)); pckt.WriteCString(qt.Instructions.Localize(locale)); pckt.Write((byte)(acceptable ? 1 : 0)); // doesn't work pckt.WriteUInt((uint)qt.Flags); pckt.WriteUInt(qt.SuggestedPlayers); pckt.Write((byte)0); // probably some pvp flag if (qt.Flags.HasFlag(QuestFlags.HiddenRewards)) { pckt.WriteUInt(0u); // choice items length pckt.WriteUInt(0u); // reward items length pckt.WriteUInt(0u); // money pckt.WriteUInt(0u); // xp } else { pckt.Write(qt.RewardChoiceItems.Length); for (uint i = 0; i < qt.RewardChoiceItems.Length; i++) { pckt.Write((uint)qt.RewardChoiceItems[i].ItemId); pckt.Write(qt.RewardChoiceItems[i].Amount); var template = qt.RewardChoiceItems[i].Template; if (template != null) { pckt.Write(template.DisplayId); } else { pckt.Write(0); } } pckt.Write(qt.RewardItems.Length); for (uint i = 0; i < qt.RewardItems.Length; i++) { pckt.Write((uint)qt.RewardItems[i].ItemId); pckt.Write(qt.RewardItems[i].Amount); var template = qt.RewardItems[i].Template; if (template != null) { pckt.Write(template.DisplayId); } else { pckt.Write(0); } } if (chr.Level >= RealmServerConfiguration.MaxCharacterLevel) { pckt.Write(qt.MoneyAtMaxLevel); } else { pckt.Write(qt.RewMoney); } pckt.Write(qt.CalcRewardXp(chr)); // since 3.3 } pckt.Write(qt.RewHonorAddition); pckt.Write(qt.RewHonorMultiplier); // since 3.3 pckt.Write((uint)qt.RewSpell); pckt.Write((uint)qt.CastSpell); pckt.Write((uint)qt.RewardTitleId); // since 2.4.0 pckt.Write(qt.RewardTalents); // #### since 3.3 pckt.Write(0); // bonus arena points pckt.Write(0); for (uint i = 0; i < QuestConstants.MaxReputations; ++i) { pckt.Write((uint)qt.RewardReputations[i].Faction); } for (uint i = 0; i < QuestConstants.MaxReputations; ++i) { pckt.Write(qt.RewardReputations[i].ValueId); } for (uint i = 0; i < QuestConstants.MaxReputations; ++i) { pckt.Write(qt.RewardReputations[i].Value); } pckt.Write(QuestConstants.MaxEmotes); for (var i = 0; i < QuestConstants.MaxEmotes; i++) { var emote = qt.QuestDetailedEmotes[i]; pckt.Write((int)emote.Type); pckt.Write(emote.Delay); } chr.Client.Send(pckt); } }
/// <summary> /// Sends the quest query response. /// </summary> /// <param name="qt">The quest id.</param> /// <param name="chr">The client.</param> public static void SendQuestQueryResponse(QuestTemplate qt, Character chr) { var locale = chr.Client.Info.Locale; using (var pckt = new RealmPacketOut(RealmServerOpCode.SMSG_QUEST_QUERY_RESPONSE)) { pckt.Write(qt.Id); pckt.Write((uint)qt.IsActive); pckt.Write(qt.Level); pckt.Write(qt.MinLevel); // since 3.3 pckt.Write(qt.Category); // questsort pckt.Write((uint)qt.QuestType); pckt.Write(qt.SuggestedPlayers); pckt.Write((uint)qt.ObjectiveMinReputation.ReputationIndex); pckt.Write(qt.ObjectiveMinReputation.Value); pckt.Write((uint)qt.ObjectiveMaxReputation.ReputationIndex); pckt.Write(qt.ObjectiveMaxReputation.Value); // (#10) pckt.Write(qt.FollowupQuestId); pckt.Write(qt.CalcRewardXp(chr)); // since 3.3 if (qt.Flags.HasFlag(QuestFlags.HiddenRewards)) { pckt.Write(0); } else { pckt.Write(qt.RewMoney); } pckt.Write(qt.MoneyAtMaxLevel); pckt.Write((uint)qt.CastSpell); pckt.Write((uint)qt.RewSpell); pckt.Write(qt.RewHonorAddition); pckt.WriteFloat(qt.RewHonorMultiplier); // since 3.3 pckt.Write((uint)qt.SrcItemId); pckt.Write((uint)qt.Flags); pckt.Write((uint)qt.RewardTitleId); pckt.Write(qt.PlayersSlain); pckt.Write(qt.RewardTalents); // NEW 3.0.2 RewardTalentCount (#21) pckt.Write(0); // since 3.3: bonus arena points pckt.Write(0); // since 3.3 int i; if (qt.Flags.HasFlag(QuestFlags.HiddenRewards)) { for (i = 0; i < QuestConstants.MaxRewardItems; ++i) { pckt.WriteUInt(0u); pckt.WriteUInt(0u); } for (i = 0; i < QuestConstants.MaxRewardChoiceItems; ++i) { pckt.WriteUInt(0u); pckt.WriteUInt(0u); } } else { for (i = 0; i < QuestConstants.MaxRewardItems; i++) { if (i < qt.RewardItems.Length) { pckt.Write((uint)qt.RewardItems[i].ItemId); pckt.Write(qt.RewardItems[i].Amount); } else { pckt.WriteUInt(0u); pckt.WriteUInt(0u); } } for (i = 0; i < QuestConstants.MaxRewardChoiceItems; i++) { if (i < qt.RewardChoiceItems.Length) { pckt.Write((uint)qt.RewardChoiceItems[i].ItemId); pckt.Write(qt.RewardChoiceItems[i].Amount); } else { pckt.WriteUInt(0u); pckt.WriteUInt(0u); } } } // #### since 3.3 for (i = 0; i < QuestConstants.MaxReputations; i++) { pckt.Write((uint)qt.RewardReputations[i].Faction); } for (i = 0; i < QuestConstants.MaxReputations; i++) { pckt.Write(qt.RewardReputations[i].ValueId); } for (i = 0; i < QuestConstants.MaxReputations; i++) { pckt.Write(qt.RewardReputations[i].Value); } // ###### pckt.Write((uint)qt.MapId); pckt.Write(qt.PointX); pckt.Write(qt.PointY); pckt.Write(qt.PointOpt); pckt.WriteCString(qt.Titles.Localize(locale)); pckt.WriteCString(qt.Instructions.Localize(locale)); pckt.WriteCString(qt.Details.Localize(locale)); pckt.WriteCString(qt.EndTexts.Localize(locale)); pckt.WriteCString(qt.CompletedTexts.Localize(locale)); // since 3.3 for (i = 0; i < QuestConstants.MaxObjectInteractions; i++) { pckt.Write(qt.ObjectOrSpellInteractions[i].RawId); // Mob or GO entry ID [i] pckt.Write(qt.ObjectOrSpellInteractions[i].Amount); // amount [i], pckt.Write((uint)qt.CollectableSourceItems[i].ItemId); pckt.Write(qt.CollectableSourceItems[i].Amount); } for (i = 0; i < QuestConstants.MaxCollectableItems; i++) { if (i < qt.CollectableItems.Length) { pckt.Write((uint)qt.CollectableItems[i].ItemId); pckt.Write(qt.CollectableItems[i].Amount); } else { pckt.WriteUInt(0u); pckt.WriteUInt(0u); } } for (i = 0; i < QuestConstants.MaxObjectiveTexts; i++) { var set = qt.ObjectiveTexts[(int)locale]; if (set != null) { pckt.Write(set.Texts[i]); } else { pckt.Write(""); } } chr.Client.Send(pckt); } }