/* * Copyright (C) 2012-2017 CypherCore * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Framework.Constants; using Game.Entities; using System.Collections.Generic; namespace Game.Network.Packets { public class QuestGiverStatusQuery : ClientPacket { public QuestGiverStatusQuery(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); } public ObjectGuid QuestGiverGUID { get; set; } } public class QuestGiverStatusMultipleQuery : ClientPacket { public QuestGiverStatusMultipleQuery(WorldPacket packet) : base(packet) { } public override void Read() { } } public class QuestGiverStatusPkt : ServerPacket { public QuestGiverStatusPkt() : base(ServerOpcodes.QuestGiverStatus, ConnectionType.Instance) { QuestGiver = new QuestGiverInfo(); } public override void Write() { _worldPacket.WritePackedGuid(QuestGiver.Guid); _worldPacket.WriteUInt32(QuestGiver.Status); } public QuestGiverInfo QuestGiver { get; set; } } public class QuestGiverStatusMultiple : ServerPacket { public QuestGiverStatusMultiple() : base(ServerOpcodes.QuestGiverStatusMultiple, ConnectionType.Instance) { } public override void Write() { _worldPacket.WriteInt32(QuestGiver.Count); foreach (QuestGiverInfo questGiver in QuestGiver) { _worldPacket.WritePackedGuid(questGiver.Guid); _worldPacket.WriteUInt32(questGiver.Status); } } public List QuestGiver { get; set; } = new List(); } public class QuestGiverHello : ClientPacket { public QuestGiverHello(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); } public ObjectGuid QuestGiverGUID { get; set; } } public class QueryQuestInfo : ClientPacket { public QueryQuestInfo(WorldPacket packet) : base(packet) { } public override void Read() { QuestID = _worldPacket.ReadUInt32(); QuestGiver = _worldPacket.ReadPackedGuid(); } public ObjectGuid QuestGiver { get; set; } public uint QuestID { get; set; } } public class QueryQuestInfoResponse : ServerPacket { public QueryQuestInfoResponse() : base(ServerOpcodes.QueryQuestInfoResponse, ConnectionType.Instance) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteBit(Allow); _worldPacket.FlushBits(); if (Allow) { _worldPacket.WriteInt32(Info.QuestID); _worldPacket.WriteInt32(Info.QuestType); _worldPacket.WriteInt32(Info.QuestLevel); _worldPacket.WriteInt32(Info.QuestPackageID); _worldPacket.WriteInt32(Info.QuestMinLevel); _worldPacket.WriteInt32(Info.QuestSortID); _worldPacket.WriteInt32(Info.QuestInfoID); _worldPacket.WriteInt32(Info.SuggestedGroupNum); _worldPacket.WriteInt32(Info.RewardNextQuest); _worldPacket.WriteInt32(Info.RewardXPDifficulty); _worldPacket.WriteFloat(Info.RewardXPMultiplier); _worldPacket.WriteInt32(Info.RewardMoney); _worldPacket.WriteInt32(Info.RewardMoneyDifficulty); _worldPacket.WriteFloat(Info.RewardMoneyMultiplier); _worldPacket.WriteInt32(Info.RewardBonusMoney); foreach (uint id in Info.RewardDisplaySpell) _worldPacket.WriteInt32(id); _worldPacket.WriteInt32(Info.RewardSpell); _worldPacket.WriteInt32(Info.RewardHonor); _worldPacket.WriteFloat(Info.RewardKillHonor); _worldPacket .WriteInt32(Info.RewardArtifactXPDifficulty); _worldPacket .WriteFloat(Info.RewardArtifactXPMultiplier); _worldPacket .WriteInt32(Info.RewardArtifactCategoryID); _worldPacket.WriteInt32(Info.StartItem); _worldPacket.WriteUInt32(Info.Flags); _worldPacket.WriteUInt32(Info.FlagsEx); for (uint i = 0; i < SharedConst.QuestRewardItemCount; ++i) { _worldPacket.WriteInt32(Info.RewardItems[i]); _worldPacket.WriteInt32(Info.RewardAmount[i]); _worldPacket.WriteInt32(Info.ItemDrop[i]); _worldPacket.WriteInt32(Info.ItemDropQuantity[i]); } for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) { _worldPacket.WriteInt32(Info.UnfilteredChoiceItems[i].ItemID); _worldPacket.WriteInt32(Info.UnfilteredChoiceItems[i].Quantity); _worldPacket.WriteInt32(Info.UnfilteredChoiceItems[i].DisplayID); } _worldPacket.WriteInt32(Info.POIContinent); _worldPacket.WriteFloat(Info.POIx); _worldPacket.WriteFloat(Info.POIy); _worldPacket.WriteInt32(Info.POIPriority); _worldPacket.WriteInt32(Info.RewardTitle); _worldPacket.WriteInt32(Info.RewardArenaPoints); _worldPacket.WriteInt32(Info.RewardSkillLineID); _worldPacket.WriteInt32(Info.RewardNumSkillUps); _worldPacket.WriteInt32(Info.PortraitGiver); _worldPacket.WriteInt32(Info.PortraitTurnIn); for (uint i = 0; i < SharedConst.QuestRewardReputationsCount; ++i) { _worldPacket.WriteInt32(Info.RewardFactionID[i]); _worldPacket.WriteInt32(Info.RewardFactionValue[i]); _worldPacket.WriteInt32(Info.RewardFactionOverride[i]); _worldPacket.WriteInt32(Info.RewardFactionCapIn[i]); } _worldPacket.WriteInt32(Info.RewardFactionFlags); for (uint i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i) { _worldPacket.WriteInt32(Info.RewardCurrencyID[i]); _worldPacket.WriteInt32(Info.RewardCurrencyQty[i]); } _worldPacket.WriteInt32(Info.AcceptedSoundKitID); _worldPacket.WriteInt32(Info.CompleteSoundKitID); _worldPacket.WriteInt32(Info.AreaGroupID); _worldPacket.WriteInt32(Info.TimeAllowed); _worldPacket.WriteUInt32(Info.Objectives.Count); _worldPacket.WriteInt32(Info.AllowableRaces); _worldPacket.WriteInt32(Info.QuestRewardID); _worldPacket.WriteInt32(Info.Expansion); _worldPacket.WriteBits(Info.LogTitle.Length, 9); _worldPacket.WriteBits(Info.LogDescription.Length, 12); _worldPacket.WriteBits(Info.QuestDescription.Length, 12); _worldPacket.WriteBits(Info.AreaDescription.Length, 9); _worldPacket.WriteBits(Info.PortraitGiverText.Length, 10); _worldPacket.WriteBits(Info.PortraitGiverName.Length, 8); _worldPacket.WriteBits(Info.PortraitTurnInText.Length, 10); _worldPacket.WriteBits(Info.PortraitTurnInName.Length, 8); _worldPacket.WriteBits(Info.QuestCompletionLog.Length, 11); _worldPacket.FlushBits(); foreach (QuestObjective questObjective in Info.Objectives) { _worldPacket.WriteUInt32(questObjective.ID); _worldPacket.WriteUInt8(questObjective.Type); _worldPacket.WriteInt8(questObjective.StorageIndex); _worldPacket.WriteInt32(questObjective.ObjectID); _worldPacket.WriteInt32(questObjective.Amount); _worldPacket.WriteUInt32(questObjective.Flags); _worldPacket.WriteUInt32(questObjective.Flags2); _worldPacket.WriteFloat(questObjective.ProgressBarWeight); _worldPacket.WriteInt32(questObjective.VisualEffects.Length); foreach (var visualEffect in questObjective.VisualEffects) _worldPacket.WriteInt32(visualEffect); _worldPacket.WriteBits(questObjective.Description.Length, 8); _worldPacket.FlushBits(); _worldPacket.WriteString(questObjective.Description); } _worldPacket.WriteString(Info.LogTitle); _worldPacket.WriteString(Info.LogDescription); _worldPacket.WriteString(Info.QuestDescription); _worldPacket.WriteString(Info.AreaDescription); _worldPacket.WriteString(Info.PortraitGiverText); _worldPacket.WriteString(Info.PortraitGiverName); _worldPacket.WriteString(Info.PortraitTurnInText); _worldPacket.WriteString(Info.PortraitTurnInName); _worldPacket.WriteString(Info.QuestCompletionLog); } } public bool Allow { get; set; } public QuestInfo Info { get; set; } = new QuestInfo(); public uint QuestID { get; set; } } public class QuestUpdateAddCredit : ServerPacket { public QuestUpdateAddCredit() : base(ServerOpcodes.QuestUpdateAddCredit, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(VictimGUID); _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteInt32(ObjectID); _worldPacket.WriteUInt16(Count); _worldPacket.WriteUInt16(Required); _worldPacket.WriteUInt8(ObjectiveType); } public ObjectGuid VictimGUID { get; set; } public int ObjectID { get; set; } public uint QuestID { get; set; } public ushort Count { get; set; } public ushort Required { get; set; } public byte ObjectiveType { get; set; } } class QuestUpdateAddCreditSimple : ServerPacket { public QuestUpdateAddCreditSimple() : base(ServerOpcodes.QuestUpdateAddCreditSimple, ConnectionType.Instance) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteInt32(ObjectID); _worldPacket.WriteUInt8(ObjectiveType); } public uint QuestID { get; set; } public int ObjectID { get; set; } public QuestObjectiveType ObjectiveType { get; set; } } class QuestUpdateAddPvPCredit : ServerPacket { public QuestUpdateAddPvPCredit() : base(ServerOpcodes.QuestUpdateAddPvpCredit, ConnectionType.Instance) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteUInt16(Count); } public uint QuestID { get; set; } public ushort Count { get; set; } } public class QuestGiverOfferRewardMessage : ServerPacket { public QuestGiverOfferRewardMessage() : base(ServerOpcodes.QuestGiverOfferRewardMessage) { } public override void Write() { QuestData.Write(_worldPacket); _worldPacket.WriteInt32(QuestPackageID); _worldPacket.WriteInt32(PortraitGiver); _worldPacket.WriteInt32(PortraitTurnIn); _worldPacket.WriteBits(QuestTitle.Length, 9); _worldPacket.WriteBits(RewardText.Length, 12); _worldPacket.WriteBits(PortraitGiverText.Length, 10); _worldPacket.WriteBits(PortraitGiverName.Length, 8); _worldPacket.WriteBits(PortraitTurnInText.Length, 10); _worldPacket.WriteBits(PortraitTurnInName.Length, 8); _worldPacket.WriteString(QuestTitle); _worldPacket.WriteString(RewardText); _worldPacket.WriteString(PortraitGiverText); _worldPacket.WriteString(PortraitGiverName); _worldPacket.WriteString(PortraitTurnInText); _worldPacket.WriteString(PortraitTurnInName); } public uint PortraitTurnIn { get; set; } public uint PortraitGiver { get; set; } public string QuestTitle = ""; public string RewardText = ""; public string PortraitGiverText = ""; public string PortraitGiverName = ""; public string PortraitTurnInText = ""; public string PortraitTurnInName = ""; public QuestGiverOfferReward QuestData { get; set; } public uint QuestPackageID { get; set; } } public class QuestGiverChooseReward : ClientPacket { public QuestGiverChooseReward(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); QuestID = _worldPacket.ReadUInt32(); ItemChoiceID = _worldPacket.ReadUInt32(); } public ObjectGuid QuestGiverGUID { get; set; } public uint QuestID { get; set; } public uint ItemChoiceID { get; set; } } public class QuestGiverQuestComplete : ServerPacket { public QuestGiverQuestComplete() : base(ServerOpcodes.QuestGiverQuestComplete) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteUInt32(XPReward); _worldPacket.WriteInt64(MoneyReward); _worldPacket.WriteUInt32(SkillLineIDReward); _worldPacket.WriteUInt32(NumSkillUpsReward); _worldPacket.WriteBit(UseQuestReward); _worldPacket.WriteBit(LaunchGossip); _worldPacket.WriteBit(LaunchQuest); _worldPacket.WriteBit(HideChatMessage); ItemReward.Write(_worldPacket); } public uint QuestID { get; set; } public uint XPReward { get; set; } public long MoneyReward { get; set; } public uint SkillLineIDReward { get; set; } public uint NumSkillUpsReward { get; set; } public bool UseQuestReward { get; set; } public bool LaunchGossip { get; set; } public bool LaunchQuest { get; set; } public bool HideChatMessage { get; set; } public ItemInstance ItemReward { get; set; } = new ItemInstance(); } public class QuestGiverCompleteQuest : ClientPacket { public QuestGiverCompleteQuest(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); QuestID = _worldPacket.ReadUInt32(); FromScript = _worldPacket.HasBit(); } public ObjectGuid QuestGiverGUID; // NPC / GameObject guid for normal quest completion. Player guid for self-completed quests public uint QuestID { get; set; } public bool FromScript; // 0 - standart complete quest mode with npc, 1 - auto-complete mode } public class QuestGiverQuestDetails : ServerPacket { public QuestGiverQuestDetails() : base(ServerOpcodes.QuestGiverQuestDetails) { } public override void Write() { _worldPacket.WritePackedGuid(QuestGiverGUID); _worldPacket.WritePackedGuid(InformUnit); _worldPacket.WriteInt32(QuestID); _worldPacket.WriteInt32(QuestPackageID); _worldPacket.WriteInt32(PortraitGiver); _worldPacket.WriteInt32(PortraitTurnIn); _worldPacket.WriteUInt32(QuestFlags[0]); // Flags _worldPacket.WriteUInt32(QuestFlags[1]); // FlagsEx _worldPacket.WriteInt32(SuggestedPartyMembers); _worldPacket.WriteInt32(LearnSpells.Count); _worldPacket.WriteUInt32(DescEmotes.Count); _worldPacket.WriteUInt32(Objectives.Count); _worldPacket.WriteInt32(QuestStartItemID); foreach (int spell in LearnSpells) _worldPacket.WriteInt32(spell); foreach (QuestDescEmote emote in DescEmotes) { _worldPacket.WriteInt32(emote.Type); _worldPacket.WriteUInt32(emote.Delay); } foreach (QuestObjectiveSimple obj in Objectives) { _worldPacket.WriteInt32(obj.ID); _worldPacket.WriteInt32(obj.ObjectID); _worldPacket.WriteInt32(obj.Amount); _worldPacket.WriteInt8(obj.Type); } _worldPacket.WriteBits(QuestTitle.Length, 9); _worldPacket.WriteBits(DescriptionText.Length, 12); _worldPacket.WriteBits(LogDescription.Length, 12); _worldPacket.WriteBits(PortraitGiverText.Length, 10); _worldPacket.WriteBits(PortraitGiverName.Length, 8); _worldPacket.WriteBits(PortraitTurnInText.Length, 10); _worldPacket.WriteBits(PortraitTurnInName.Length, 8); _worldPacket.WriteBit(AutoLaunched); _worldPacket.WriteBit(StartCheat); _worldPacket.WriteBit(DisplayPopup); _worldPacket.FlushBits(); Rewards.Write(_worldPacket); _worldPacket.WriteString(QuestTitle); _worldPacket.WriteString(DescriptionText); _worldPacket.WriteString(LogDescription); _worldPacket.WriteString(PortraitGiverText); _worldPacket.WriteString(PortraitGiverName); _worldPacket.WriteString(PortraitTurnInText); _worldPacket.WriteString(PortraitTurnInName); } public ObjectGuid QuestGiverGUID { get; set; } public ObjectGuid InformUnit { get; set; } public uint QuestID { get; set; } public int QuestPackageID { get; set; } public uint[] QuestFlags { get; set; } = new uint[2]; public uint SuggestedPartyMembers { get; set; } public QuestRewards Rewards { get; set; } = new QuestRewards(); public List Objectives { get; set; } = new List(); public List DescEmotes { get; set; } = new List(); public List LearnSpells { get; set; } = new List(); public uint PortraitTurnIn { get; set; } public uint PortraitGiver { get; set; } public int QuestStartItemID { get; set; } public string PortraitGiverText = ""; public string PortraitGiverName = ""; public string PortraitTurnInText = ""; public string PortraitTurnInName = ""; public string QuestTitle = ""; public string LogDescription = ""; public string DescriptionText = ""; public bool DisplayPopup { get; set; } public bool StartCheat { get; set; } public bool AutoLaunched { get; set; } } public class QuestGiverRequestItems : ServerPacket { public QuestGiverRequestItems() : base(ServerOpcodes.QuestGiverRequestItems) { } public override void Write() { _worldPacket.WritePackedGuid(QuestGiverGUID); _worldPacket.WriteInt32(QuestGiverCreatureID); _worldPacket.WriteInt32(QuestID); _worldPacket.WriteInt32(CompEmoteDelay); _worldPacket.WriteInt32(CompEmoteType); _worldPacket.WriteUInt32(QuestFlags[0]); _worldPacket.WriteUInt32(QuestFlags[1]); _worldPacket.WriteInt32(SuggestPartyMembers); _worldPacket.WriteInt32(MoneyToGet); _worldPacket.WriteInt32(Collect.Count); _worldPacket.WriteInt32(Currency.Count); _worldPacket.WriteInt32(StatusFlags); foreach (QuestObjectiveCollect obj in Collect) { _worldPacket.WriteInt32(obj.ObjectID); _worldPacket.WriteInt32(obj.Amount); _worldPacket.WriteUInt32(obj.Flags); } foreach (QuestCurrency cur in Currency) { _worldPacket.WriteInt32(cur.CurrencyID); _worldPacket.WriteInt32(cur.Amount); } _worldPacket.WriteBit(AutoLaunched); _worldPacket.FlushBits(); _worldPacket.WriteBits(QuestTitle.Length, 9); _worldPacket.WriteBits(CompletionText.Length, 12); _worldPacket.WriteString(QuestTitle); _worldPacket.WriteString(CompletionText); } public ObjectGuid QuestGiverGUID { get; set; } public uint QuestGiverCreatureID { get; set; } public uint QuestID { get; set; } public uint CompEmoteDelay { get; set; } public uint CompEmoteType { get; set; } public bool AutoLaunched { get; set; } public uint SuggestPartyMembers { get; set; } public int MoneyToGet { get; set; } public List Collect { get; set; } = new List(); public List Currency { get; set; } = new List(); public int StatusFlags { get; set; } public uint[] QuestFlags { get; set; } = new uint[2]; public string QuestTitle = ""; public string CompletionText = ""; } public class QuestGiverRequestReward : ClientPacket { public QuestGiverRequestReward(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); QuestID = _worldPacket.ReadUInt32(); } public ObjectGuid QuestGiverGUID { get; set; } public uint QuestID { get; set; } } public class QuestGiverQueryQuest : ClientPacket { public QuestGiverQueryQuest(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); QuestID = _worldPacket.ReadUInt32(); RespondToGiver = _worldPacket.HasBit(); } public ObjectGuid QuestGiverGUID { get; set; } public uint QuestID { get; set; } public bool RespondToGiver { get; set; } } public class QuestGiverAcceptQuest : ClientPacket { public ObjectGuid QuestGiverGUID { get; set; } public uint QuestID { get; set; } public bool StartCheat { get; set; } public QuestGiverAcceptQuest(WorldPacket packet) : base(packet) { } public override void Read() { QuestGiverGUID = _worldPacket.ReadPackedGuid(); QuestID = _worldPacket.ReadUInt32(); StartCheat = _worldPacket.HasBit(); } } public class QuestLogRemoveQuest : ClientPacket { public QuestLogRemoveQuest(WorldPacket packet) : base(packet) { } public override void Read() { Entry = _worldPacket.ReadUInt8(); } public byte Entry { get; set; } } public class QuestGiverQuestListMessage : ServerPacket { public QuestGiverQuestListMessage() : base(ServerOpcodes.QuestGiverQuestListMessage) { } public override void Write() { _worldPacket.WritePackedGuid(QuestGiverGUID); _worldPacket.WriteUInt32(GreetEmoteDelay); _worldPacket.WriteUInt32(GreetEmoteType); _worldPacket.WriteUInt32(QuestDataText.Count); _worldPacket.WriteBits(Greeting.Length, 11); _worldPacket.FlushBits(); foreach (GossipText gossip in QuestDataText) { _worldPacket.WriteUInt32(gossip.QuestID); _worldPacket.WriteUInt32(gossip.QuestType); _worldPacket.WriteUInt32(gossip.QuestLevel); _worldPacket.WriteUInt32(gossip.QuestFlags); _worldPacket.WriteUInt32(gossip.QuestFlagsEx); _worldPacket.WriteBit(gossip.Repeatable); _worldPacket.WriteBits(gossip.QuestTitle.Length, 9); _worldPacket.FlushBits(); _worldPacket.WriteString(gossip.QuestTitle); } _worldPacket.WriteString(Greeting); } public ObjectGuid QuestGiverGUID { get; set; } public uint GreetEmoteDelay { get; set; } public uint GreetEmoteType { get; set; } public List QuestDataText { get; set; } = new List(); public string Greeting { get; set; } = ""; } class QuestUpdateComplete : ServerPacket { public QuestUpdateComplete() : base(ServerOpcodes.QuestUpdateComplete) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); } public uint QuestID { get; set; } } class QuestConfirmAcceptResponse : ServerPacket { public QuestConfirmAcceptResponse() : base(ServerOpcodes.QuestConfirmAccept) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); _worldPacket.WritePackedGuid(InitiatedBy); _worldPacket.WriteBits(QuestTitle.Length, 10); _worldPacket.WriteString(QuestTitle); } public ObjectGuid InitiatedBy { get; set; } public uint QuestID { get; set; } public string QuestTitle; } class QuestConfirmAccept : ClientPacket { public QuestConfirmAccept(WorldPacket packet) : base(packet) { } public override void Read() { QuestID = _worldPacket.ReadUInt32(); } public uint QuestID { get; set; } } class QuestPushResultResponse : ServerPacket { public QuestPushResultResponse() : base(ServerOpcodes.QuestPushResult) { } public override void Write() { _worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WriteUInt8(Result); } public ObjectGuid SenderGUID { get; set; } public QuestPushReason Result { get; set; } } class QuestPushResult : ClientPacket { public QuestPushResult(WorldPacket packet) : base(packet) { } public override void Read() { SenderGUID = _worldPacket.ReadPackedGuid(); QuestID = _worldPacket.ReadUInt32(); Result = (QuestPushReason)_worldPacket.ReadUInt8(); } public ObjectGuid SenderGUID { get; set; } public uint QuestID { get; set; } public QuestPushReason Result { get; set; } } class QuestGiverInvalidQuest : ServerPacket { public QuestGiverInvalidQuest() : base(ServerOpcodes.QuestGiverInvalidQuest) { } public override void Write() { _worldPacket.WriteUInt32(Reason); _worldPacket.WriteInt32(ContributionRewardID); _worldPacket.WriteBit(SendErrorMessage); _worldPacket.WriteBits(ReasonText.Length, 9); _worldPacket.FlushBits(); _worldPacket.WriteString(ReasonText); } public QuestFailedReasons Reason { get; set; } public int ContributionRewardID { get; set; } public bool SendErrorMessage { get; set; } public string ReasonText { get; set; } = ""; } class QuestUpdateFailedTimer : ServerPacket { public QuestUpdateFailedTimer() : base(ServerOpcodes.QuestUpdateFailedTimer) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); } public uint QuestID { get; set; } } class QuestGiverQuestFailed : ServerPacket { public QuestGiverQuestFailed() : base(ServerOpcodes.QuestGiverQuestFailed) { } public override void Write() { _worldPacket.WriteUInt32(QuestID); _worldPacket.WriteUInt32(Reason); } public uint QuestID { get; set; } public InventoryResult Reason { get; set; } } class PushQuestToParty : ClientPacket { public PushQuestToParty(WorldPacket packet) : base(packet) { } public override void Read() { QuestID = _worldPacket.ReadUInt32(); } public uint QuestID { get; set; } } class DailyQuestsReset : ServerPacket { public DailyQuestsReset() : base(ServerOpcodes.DailyQuestsReset) { } public override void Write() { _worldPacket.WriteInt32(Count); } public int Count { get; set; } } class QuestLogFull : ServerPacket { public QuestLogFull() : base(ServerOpcodes.QuestLogFull) { } public override void Write() { } } class RequestWorldQuestUpdate : ClientPacket { public RequestWorldQuestUpdate(WorldPacket packet) : base(packet) { } public override void Read() { } } class WorldQuestUpdate : ServerPacket { public WorldQuestUpdate() : base(ServerOpcodes.WorldQuestUpdate, ConnectionType.Instance) { } public override void Write() { _worldPacket.WriteUInt32(WorldQuestUpdates.Count); foreach (WorldQuestUpdateInfo worldQuestUpdate in WorldQuestUpdates) { _worldPacket.WriteInt32(worldQuestUpdate.LastUpdate); _worldPacket.WriteUInt32(worldQuestUpdate.QuestID); _worldPacket.WriteUInt32(worldQuestUpdate.Timer); _worldPacket.WriteInt32(worldQuestUpdate.VariableID); _worldPacket.WriteInt32(worldQuestUpdate.Value); } } List WorldQuestUpdates = new List(); } //Structs public class QuestGiverInfo { public QuestGiverInfo() { } public QuestGiverInfo(ObjectGuid guid, QuestGiverStatus status) { Guid = guid; Status = status; } public ObjectGuid Guid { get; set; } public QuestGiverStatus Status { get; set; } = QuestGiverStatus.None; } public struct QuestInfoChoiceItem { public uint ItemID { get; set; } public uint Quantity { get; set; } public uint DisplayID { get; set; } } public class QuestInfo { public QuestInfo() { LogTitle = ""; LogDescription = ""; QuestDescription = ""; AreaDescription = ""; PortraitGiverText = ""; PortraitGiverName = ""; PortraitTurnInText = ""; PortraitTurnInName = ""; QuestCompletionLog = ""; } public uint QuestID { get; set; } public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) public int QuestLevel; // may be -1, static data, in other cases must be used dynamic level: Player.GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) public uint QuestPackageID { get; set; } public int QuestMinLevel { get; set; } public int QuestSortID; // zone or sort to display in quest log public uint QuestInfoID { get; set; } public uint SuggestedGroupNum { get; set; } public uint RewardNextQuest; // client will request this quest from NPC, if not. public uint RewardXPDifficulty; // used for calculating rewarded experience public float RewardXPMultiplier { get; set; } = 1.0f; public int RewardMoney; // reward money (below max lvl) public uint RewardMoneyDifficulty { get; set; } public float RewardMoneyMultiplier { get; set; } = 1.0f; public uint RewardBonusMoney { get; set; } public uint[] RewardDisplaySpell { get; set; } = new uint[SharedConst.QuestRewardDisplaySpellCount]; // reward spell, this spell will be displayed (icon) public uint RewardSpell { get; set; } public uint RewardHonor { get; set; } public float RewardKillHonor { get; set; } public int RewardArtifactXPDifficulty { get; set; } public float RewardArtifactXPMultiplier { get; set; } public int RewardArtifactCategoryID { get; set; } public uint StartItem { get; set; } public uint Flags { get; set; } public uint FlagsEx { get; set; } public uint POIContinent { get; set; } public float POIx { get; set; } public float POIy { get; set; } public uint POIPriority { get; set; } public int AllowableRaces { get; set; } = -1; public string LogTitle; public string LogDescription; public string QuestDescription; public string AreaDescription; public uint RewardTitle; // new 2.4.0, player gets this title (id from CharTitles) public int RewardArenaPoints { get; set; } public uint RewardSkillLineID; // reward skill id public uint RewardNumSkillUps; // reward skill points public uint PortraitGiver; // quest giver entry. public uint PortraitTurnIn; // quest turn in entry. public string PortraitGiverText; public string PortraitGiverName; public string PortraitTurnInText; public string PortraitTurnInName; public string QuestCompletionLog; public uint RewardFactionFlags; // rep mask (unsure on what it does) public uint AcceptedSoundKitID { get; set; } public uint CompleteSoundKitID { get; set; } public uint AreaGroupID { get; set; } public uint TimeAllowed { get; set; } public int QuestRewardID { get; set; } public int Expansion { get; set; } public List Objectives { get; set; } = new List(); public uint[] RewardItems { get; set; } = new uint[SharedConst.QuestRewardItemCount]; public uint[] RewardAmount { get; set; } = new uint[SharedConst.QuestRewardItemCount]; public int[] ItemDrop { get; set; } = new int[SharedConst.QuestItemDropCount]; public int[] ItemDropQuantity { get; set; } = new int[SharedConst.QuestItemDropCount]; public QuestInfoChoiceItem[] UnfilteredChoiceItems { get; set; } = new QuestInfoChoiceItem[SharedConst.QuestRewardChoicesCount]; public uint[] RewardFactionID { get; set; } = new uint[SharedConst.QuestRewardReputationsCount]; public int[] RewardFactionValue { get; set; } = new int[SharedConst.QuestRewardReputationsCount]; public int[] RewardFactionOverride { get; set; } = new int[SharedConst.QuestRewardReputationsCount]; public int[] RewardFactionCapIn { get; set; } = new int[SharedConst.QuestRewardReputationsCount]; public uint[] RewardCurrencyID { get; set; } = new uint[SharedConst.QuestRewardCurrencyCount]; public uint[] RewardCurrencyQty { get; set; } = new uint[SharedConst.QuestRewardCurrencyCount]; } public struct QuestChoiceItem { public uint ItemID { get; set; } public uint Quantity { get; set; } } public class QuestRewards { public void Write(WorldPacket data) { data.WriteUInt32(ChoiceItemCount); for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) { data.WriteUInt32(ChoiceItems[i].ItemID); data.WriteUInt32(ChoiceItems[i].Quantity); } data.WriteUInt32(ItemCount); for (int i = 0; i < SharedConst.QuestRewardItemCount; ++i) { data.WriteUInt32(ItemID[i]); data.WriteUInt32(ItemQty[i]); } data.WriteUInt32(Money); data.WriteUInt32(XP); data.WriteUInt64(ArtifactXP); data.WriteUInt32(ArtifactCategoryID); data.WriteUInt32(Honor); data.WriteUInt32(Title); data.WriteUInt32(FactionFlags); for (int i = 0; i < SharedConst.QuestRewardReputationsCount; ++i) { data.WriteUInt32(FactionID[i]); data.WriteInt32(FactionValue[i]); data.WriteInt32(FactionOverride[i]); data.WriteInt32(FactionCapIn[i]); } foreach (var id in SpellCompletionDisplayID) data.WriteInt32(id); data.WriteUInt32(SpellCompletionID); for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i) { data.WriteUInt32(CurrencyID[i]); data.WriteUInt32(CurrencyQty[i]); } data.WriteUInt32(SkillLineID); data.WriteUInt32(NumSkillUps); data.WriteInt32(RewardID); data.WriteBit(IsBoostSpell); data.FlushBits(); } public uint ChoiceItemCount { get; set; } public uint ItemCount { get; set; } public uint Money { get; set; } public uint XP { get; set; } public uint ArtifactXP { get; set; } public uint ArtifactCategoryID { get; set; } public uint Honor { get; set; } public uint Title { get; set; } public uint FactionFlags { get; set; } public int[] SpellCompletionDisplayID { get; set; } = new int[SharedConst.QuestRewardDisplaySpellCount]; public uint SpellCompletionID { get; set; } public uint SkillLineID { get; set; } public uint NumSkillUps { get; set; } public uint RewardID { get; set; } public QuestChoiceItem[] ChoiceItems { get; set; } = new QuestChoiceItem[SharedConst.QuestRewardChoicesCount]; public uint[] ItemID { get; set; } = new uint[SharedConst.QuestRewardItemCount]; public uint[] ItemQty { get; set; } = new uint[SharedConst.QuestRewardItemCount]; public uint[] FactionID { get; set; } = new uint[SharedConst.QuestRewardReputationsCount]; public int[] FactionValue { get; set; } = new int[SharedConst.QuestRewardReputationsCount]; public int[] FactionOverride { get; set; } = new int[SharedConst.QuestRewardReputationsCount]; public int[] FactionCapIn { get; set; } = new int[SharedConst.QuestRewardReputationsCount]; public uint[] CurrencyID { get; set; } = new uint[SharedConst.QuestRewardCurrencyCount]; public uint[] CurrencyQty { get; set; } = new uint[SharedConst.QuestRewardCurrencyCount]; public bool IsBoostSpell { get; set; } } public struct QuestDescEmote { public QuestDescEmote(uint type = 0, uint delay = 0) { Type = type; Delay = delay; } public uint Type { get; set; } public uint Delay { get; set; } } public class QuestGiverOfferReward { public void Write(WorldPacket data) { data.WritePackedGuid(QuestGiverGUID); data.WriteUInt32(QuestGiverCreatureID); data.WriteUInt32(QuestID); data.WriteUInt32(QuestFlags[0]); // Flags data.WriteUInt32(QuestFlags[1]); // FlagsEx data.WriteUInt32(SuggestedPartyMembers); data.WriteInt32(Emotes.Count); foreach (QuestDescEmote emote in Emotes) { data.WriteInt32(emote.Type); data.WriteInt32(emote.Delay); } data.WriteBit(AutoLaunched); data.FlushBits(); Rewards.Write(data); } public ObjectGuid QuestGiverGUID { get; set; } public uint QuestGiverCreatureID { get; set; } = 0; public uint QuestID { get; set; } = 0; public bool AutoLaunched { get; set; } = false; public uint SuggestedPartyMembers { get; set; } = 0; public QuestRewards Rewards { get; set; } = new QuestRewards(); public List Emotes { get; set; } = new List(); public uint[] QuestFlags { get; set; } = new uint[2]; // Flags and FlagsEx } public struct QuestObjectiveSimple { public uint ID { get; set; } public int ObjectID { get; set; } public int Amount { get; set; } public byte Type { get; set; } } public struct QuestObjectiveCollect { public QuestObjectiveCollect(uint objectID = 0, int amount = 0, uint flags = 0) { ObjectID = objectID; Amount = amount; Flags = flags; } public uint ObjectID { get; set; } public int Amount { get; set; } public uint Flags { get; set; } } public struct QuestCurrency { public QuestCurrency(uint currencyID = 0, int amount = 0) { CurrencyID = currencyID; Amount = amount; } public uint CurrencyID { get; set; } public int Amount { get; set; } } public struct GossipText { public GossipText(uint questID, uint questType, uint questLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle) { QuestID = questID; QuestType = questType; QuestLevel = questLevel; QuestFlags = questFlags; QuestFlagsEx = questFlagsEx; Repeatable = repeatable; QuestTitle = questTitle; } public uint QuestID { get; set; } public uint QuestType { get; set; } public uint QuestLevel { get; set; } public uint QuestFlags { get; set; } public uint QuestFlagsEx { get; set; } public bool Repeatable { get; set; } public string QuestTitle { get; set; } } struct WorldQuestUpdateInfo { public WorldQuestUpdateInfo(int lastUpdate, uint questID, uint timer, int variableID, int value) { LastUpdate = lastUpdate; QuestID = questID; Timer = timer; VariableID = variableID; Value = value; } public int LastUpdate { get; set; } public uint QuestID { get; set; } public uint Timer { get; set; } // WorldState public int VariableID { get; set; } public int Value { get; set; } } }