aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp86
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp39
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h37
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
5 files changed, 116 insertions, 50 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 975a4e74a81..186e6c53c96 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -689,65 +689,55 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
if (sWorld->getBoolConfig(CONFIG_UI_QUESTLEVELS_IN_DIALOGS))
AddQuestLevelToTitle(questTitle, quest->GetQuestLevel());
- WorldPacket data(SMSG_QUESTGIVER_REQUEST_ITEMS, 50); // guess size
- /*data << npcGUID;
- data << uint32(quest->GetQuestId());
- data << questTitle;
- data << requestItemsText;
+ WorldPackets::Quest::QuestGiverRequestItems packet;
+ packet.QuestGiverGUID = npcGUID;
+
+ // Is there a better way? what about game objects?
+ if (Creature const* creature = sObjectAccessor->GetCreature(*_session->GetPlayer(), npcGUID))
+ packet.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
- data << uint32(0); // unknown
+ packet.QuestID = quest->GetQuestId();
if (canComplete)
- data << quest->GetCompleteEmote();
+ {
+ packet.CompEmoteDelay = quest->EmoteOnCompleteDelay;
+ packet.CompEmoteType = quest->EmoteOnComplete;
+ }
else
- data << quest->GetIncompleteEmote();
-
- // Close Window after cancel
- data << uint32(closeOnCancel);
-
- data << uint32(quest->GetFlags()); // 3.3.3 questFlags
- data << uint32(quest->GetSuggestedPlayers()); // SuggestedGroupNum
-
- // Required Money
- data << uint32(quest->GetRewOrReqMoney() < 0 ? -quest->GetRewOrReqMoney() : 0);
-
- data << uint32(quest->GetReqItemsCount());
- for (QuestObjective const& obj : quest->Objectives)
{
- if (obj.Type != QUEST_OBJECTIVE_ITEM)
- continue;
-
- data << uint32(obj.ObjectID);
- data << uint32(obj.Amount);
-
- if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(obj.ObjectID))
- data << uint32(itemTemplate->DisplayInfoID);
-
- else
- data << uint32(0);
+ packet.CompEmoteDelay = quest->EmoteOnIncompleteDelay;
+ packet.CompEmoteType = quest->EmoteOnIncomplete;
}
- data << uint32(quest->GetReqCurrencyCount());
- for (int i = 0; i < QUEST_REQUIRED_CURRENCY_COUNT; ++i)
- {
- if (!quest->RequiredCurrencyId[i])
- continue;
+ packet.QuestFlags[0] = quest->GetFlags();
+ packet.QuestFlags[1] = quest->GetFlagsEx();
+ packet.SuggestPartyMembers = quest->GetSuggestedPlayers();
+ packet.StatusFlags = 0xDF; // Unk, send common value
- data << uint32(quest->RequiredCurrencyId[i]);
- data << uint32(quest->RequiredCurrencyCount[i]);
+ packet.MoneyToGet = 0;
+ for (QuestObjective const& obj : quest->GetObjectives())
+ {
+ switch (obj.Type)
+ {
+ case QUEST_OBJECTIVE_ITEM:
+ packet.Collect.push_back(WorldPackets::Quest::QuestObjectiveCollect(obj.ObjectID, obj.Amount));
+ break;
+ case QUEST_OBJECTIVE_CURRENCY:
+ packet.Currency.push_back(WorldPackets::Quest::QuestCurrency(obj.ObjectID, obj.Amount));
+ break;
+ case QUEST_OBJECTIVE_MONEY:
+ packet.MoneyToGet += obj.Amount;
+ break;
+ default:
+ break;
+ }
}
- if (!canComplete) // Experimental; there are 6 similar flags, if any of them
- data << uint32(0x00); // of them is 0 player can't complete quest (still unknown meaning)
- else
- data << uint32(0x02);
-
- data << uint32(0x04);
- data << uint32(0x08);
- data << uint32(0x10);
- data << uint32(0x40);*/
+ packet.AutoLaunched = closeOnCancel;
+ packet.QuestTitle = questTitle;
+ packet.CompletionText = requestItemsText;
- _session->SendPacket(&data);
+ _session->SendPacket(packet.Write());
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS 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 fd7320eac7e..5003b49dc2f 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -374,3 +374,42 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write()
+{
+ _worldPacket << QuestGiverGUID;
+ _worldPacket << QuestGiverCreatureID;
+ _worldPacket << QuestID;
+ _worldPacket << CompEmoteDelay;
+ _worldPacket << CompEmoteType;
+ _worldPacket << QuestFlags[0];
+ _worldPacket << QuestFlags[1];
+ _worldPacket << SuggestPartyMembers;
+ _worldPacket << MoneyToGet;
+ _worldPacket << int32(Collect.size());
+ _worldPacket << int32(Currency.size());
+ _worldPacket << StatusFlags;
+
+ for (QuestObjectiveCollect const& obj : Collect)
+ {
+ _worldPacket << obj.ObjectID;
+ _worldPacket << obj.Amount;
+ }
+
+ for (QuestCurrency const& cur : Currency)
+ {
+ _worldPacket << cur.CurrencyID;
+ _worldPacket << cur.Amount;
+ }
+
+ _worldPacket.WriteBit(AutoLaunched);
+ _worldPacket.FlushBits();
+
+ _worldPacket.WriteBits(QuestTitle.size(), 9);
+ _worldPacket.WriteBits(CompletionText.size(), 12);
+
+ _worldPacket.WriteString(QuestTitle);
+ _worldPacket.WriteString(CompletionText);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index 66f97dcfc30..2d42d5990f7 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -345,6 +345,43 @@ namespace WorldPackets
bool StartCheat = false;
bool AutoLaunched = false;
};
+
+ struct QuestObjectiveCollect
+ {
+ QuestObjectiveCollect(int32 objectID = 0, int32 amount = 0) : ObjectID(objectID), Amount(amount) { }
+ int32 ObjectID;
+ int32 Amount;
+ };
+
+ struct QuestCurrency
+ {
+ QuestCurrency(int32 currencyID = 0, int32 amount = 0) : CurrencyID(currencyID), Amount(amount) { }
+ int32 CurrencyID;
+ int32 Amount;
+ };
+
+ class QuestGiverRequestItems final : public ServerPacket
+ {
+ public:
+ QuestGiverRequestItems() : ServerPacket(SMSG_QUESTGIVER_REQUEST_ITEMS, 300) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid QuestGiverGUID;
+ int32 QuestGiverCreatureID = 0;
+ int32 QuestID = 0;
+ int32 CompEmoteDelay = 0;
+ int32 CompEmoteType = 0;
+ bool AutoLaunched = false;
+ int32 SuggestPartyMembers = 0;
+ int32 MoneyToGet = 0;
+ std::vector<QuestObjectiveCollect> Collect;
+ std::vector<QuestCurrency> Currency;
+ int32 StatusFlags = 0;
+ uint32 QuestFlags[2] = {};
+ std::string QuestTitle;
+ std::string CompletionText;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 6919d457ecb..cbc98dbef3c 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1232,7 +1232,7 @@ void OpcodeTable::Initialize()
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);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTLOG_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 0c8f0569da8..4c84d7b47f4 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -1237,7 +1237,7 @@ enum OpcodeServer : uint32
SMSG_QUESTGIVER_QUEST_FAILED = 0xBADD,
SMSG_QUESTGIVER_QUEST_INVALID = 0xBADD,
SMSG_QUESTGIVER_QUEST_LIST = 0xBADD,
- SMSG_QUESTGIVER_REQUEST_ITEMS = 0xBADD,
+ SMSG_QUESTGIVER_REQUEST_ITEMS = 0x17B8,
SMSG_QUESTGIVER_STATUS = 0x1567,
SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x17C6,
SMSG_QUESTLOG_FULL = 0xBADD,