aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIntel <chemicstry@gmail.com>2014-12-29 01:20:08 +0200
committerIntel <chemicstry@gmail.com>2014-12-29 01:20:17 +0200
commit21360bb50c6a1390fbeb51c9c27bb0823ad0f252 (patch)
treeedc6cc7692d88f1117fb343b0e87b171602dee7b /src
parenta11f1b1f91d8a8ca0558c9992ac6309339c29eeb (diff)
Core/Quests: Implemented SMSG_QUESTGIVER_QUEST_DETAILS Packet Structure
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp62
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp55
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h39
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
4 files changed, 132 insertions, 26 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 0f10266b39b..c7e1c833a5a 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -415,35 +415,47 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS))
AddQuestLevelToTitle(questLogTitle, quest->GetQuestLevel());
- WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 100); // guess size
- data << npcGUID;
- data << _session->GetPlayer()->GetDivider();
- data << uint32(quest->GetQuestId());
- data << questLogTitle;
- data << questLogDescription;
- data << questDescription;
- data << portraitGiverText; // 4.x
- data << portraitGiverName; // 4.x
- data << portraitTurnInText; // 4.x
- data << portraitTurnInName; // 4.x
- data << uint32(quest->GetQuestGiverPortrait()); // 4.x
- data << uint32(quest->GetQuestTurnInPortrait()); // 4.x
- data << uint8(activateAccept ? 1 : 0); // auto finish
- data << uint32(quest->GetFlags()); // 3.3.3 questFlags
- data << uint32(quest->GetSuggestedPlayers());
- data << uint8(0); // IsFinished? value is sent back to server in quest accept packet
- data << uint8(0); // 4.x FIXME: Starts at AreaTrigger
- data << uint32(quest->GetSrcSpell()); // 4.x
+ WorldPackets::Quest::QuestGiverQuestDetails packet;
+ packet.QuestGiverGUID = npcGUID;
+ packet.InformUnit = _session->GetPlayer()->GetDivider();
+ packet.QuestID = quest->GetQuestId();
+ packet.QuestTitle = questLogTitle;
+ packet.LogDescription = questLogDescription;
+ packet.DescriptionText = questDescription;
+ packet.PortraitGiverText = portraitGiverText;
+ packet.PortraitGiverName = portraitGiverName;
+ packet.PortraitTurnInText = portraitTurnInText;
+ packet.PortraitTurnInName = portraitTurnInName;
+ packet.PortraitGiver = quest->GetQuestGiverPortrait();
+ packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
+ packet.DisplayPopup = activateAccept;
+ packet.QuestFlags[0] = quest->GetFlags();
+ packet.QuestFlags[1] = quest->GetFlagsEx();
+ packet.SuggestedPartyMembers = quest->GetSuggestedPlayers();
+
+ if (quest->GetSrcSpell())
+ packet.LearnSpells.push_back(quest->GetSrcSpell());
- quest->BuildExtraQuestInfo(data, _session->GetPlayer());
+ quest->BuildQuestRewards(packet.Rewards, _session->GetPlayer());
- data << uint32(QUEST_EMOTE_COUNT);
- for (uint8 i = 0; i < QUEST_EMOTE_COUNT; ++i)
+ packet.DescEmotes.resize(QUEST_EMOTE_COUNT);
+ for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
{
- data << uint32(quest->DetailsEmote[i]);
- data << uint32(quest->DetailsEmoteDelay[i]); // DetailsEmoteDelay (in ms)
+ packet.DescEmotes[i].Type = quest->DetailsEmote[i];
+ packet.DescEmotes[i].Delay = quest->DetailsEmoteDelay[i];
}
- _session->SendPacket(&data);
+
+ QuestObjectives const& objs = quest->GetObjectives();
+ packet.Objectives.resize(objs.size());
+ for (uint32 i = 0; i < objs.size(); ++i)
+ {
+ packet.Objectives[i].ID = objs[i].ID;
+ packet.Objectives[i].ObjectID = objs[i].ObjectID;
+ packet.Objectives[i].Amount = objs[i].Amount;
+ packet.Objectives[i].Type = objs[i].Type;
+ }
+
+ _session->SendPacket(packet.Write());
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPC=%s, questid=%u", npcGUID.ToString().c_str(), quest->GetQuestId());
}
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index 34fc1a6261a..fd7320eac7e 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -319,3 +319,58 @@ void WorldPackets::Quest::QuestGiverCompleteQuest::Read()
_worldPacket >> QuestID;
FromScript = _worldPacket.ReadBit();
}
+
+WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
+{
+ _worldPacket << QuestGiverGUID;
+ _worldPacket << InformUnit;
+ _worldPacket << QuestID;
+ _worldPacket << QuestPackageID;
+ _worldPacket << PortraitGiver;
+ _worldPacket << SuggestedPartyMembers;
+ _worldPacket << QuestFlags[0]; // Flags
+ _worldPacket << QuestFlags[1]; // FlagsEx
+ _worldPacket << PortraitTurnIn;
+ _worldPacket << int32(LearnSpells.size());
+ _worldPacket << Rewards; // WorldPackets::Quest::QuestRewards
+ _worldPacket << int32(DescEmotes.size());
+ _worldPacket << int32(Objectives.size());
+
+ for (int32 spell : LearnSpells)
+ _worldPacket << spell;
+
+ for (WorldPackets::Quest::QuestDescEmote const& emote : DescEmotes)
+ {
+ _worldPacket << emote.Type;
+ _worldPacket << emote.Delay;
+ }
+
+ for (WorldPackets::Quest::QuestObjectiveSimple const& obj : Objectives)
+ {
+ _worldPacket << obj.ID;
+ _worldPacket << obj.ObjectID;
+ _worldPacket << obj.Amount;
+ _worldPacket << obj.Type;
+ }
+
+ _worldPacket.WriteBits(QuestTitle.size(), 9);
+ _worldPacket.WriteBits(DescriptionText.size(), 12);
+ _worldPacket.WriteBits(LogDescription.size(), 12);
+ _worldPacket.WriteBits(PortraitTurnInText.size(), 10);
+ _worldPacket.WriteBits(PortraitTurnInName.size(), 8);
+ _worldPacket.WriteBits(PortraitGiverText.size(), 10);
+ _worldPacket.WriteBits(PortraitGiverName.size(), 8);
+ _worldPacket.WriteBit(DisplayPopup);
+ _worldPacket.WriteBit(StartCheat);
+ _worldPacket.WriteBit(AutoLaunched);
+
+ _worldPacket.WriteString(QuestTitle);
+ _worldPacket.WriteString(DescriptionText);
+ _worldPacket.WriteString(LogDescription);
+ _worldPacket.WriteString(PortraitTurnInText);
+ _worldPacket.WriteString(PortraitTurnInName);
+ _worldPacket.WriteString(PortraitGiverText);
+ _worldPacket.WriteString(PortraitGiverName);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index 94d4f5173cb..9aa77da47f4 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -306,6 +306,45 @@ namespace WorldPackets
int32 QuestID = 0;
bool FromScript = false; // 0 - standart complete quest mode with npc, 1 - auto-complete mode
};
+
+ struct QuestObjectiveSimple
+ {
+ int32 ID = 0;
+ int32 ObjectID = 0;
+ int32 Amount = 0;
+ uint8 Type = 0;
+ };
+
+ class QuestGiverQuestDetails final : public ServerPacket
+ {
+ public:
+ QuestGiverQuestDetails() : ServerPacket(SMSG_QUESTGIVER_QUEST_DETAILS, 1000) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid QuestGiverGUID;
+ ObjectGuid InformUnit;
+ int32 QuestID = 0;
+ int32 QuestPackageID = 0;
+ uint32 QuestFlags[2] = {};
+ int32 SuggestedPartyMembers = 0;
+ QuestRewards Rewards;
+ std::vector<QuestObjectiveSimple> Objectives;
+ std::vector<QuestDescEmote> DescEmotes;
+ std::vector<int32> LearnSpells;
+ int32 PortraitTurnIn = 0;
+ int32 PortraitGiver = 0;
+ std::string PortraitTurnInText;
+ std::string PortraitTurnInName;
+ std::string PortraitGiverText;
+ std::string PortraitGiverName;
+ std::string QuestTitle;
+ std::string LogDescription;
+ std::string DescriptionText;
+ bool DisplayPopup = false;
+ bool StartCheat = false;
+ bool AutoLaunched = false;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 3b5e7afa996..85a639b6161 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1226,7 +1226,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);