diff options
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 30 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
6 files changed, 63 insertions, 1 deletions
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 8430a30e86e..89ebbaffbc0 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -435,7 +435,7 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemove } _player->TakeQuestSourceItem(questId, true); // remove quest src item from player - _player->AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements. + _player->AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements. _player->RemoveActiveQuest(questId); _player->RemoveCriteriaTimer(CRITERIA_TIMED_TYPE_QUEST, questId); @@ -669,3 +669,13 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques SendPacket(response.Write()); } + +void WorldSession::HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& /*packet*/) +{ + WorldPackets::Quest::WorldQuestUpdate response; + + /// @todo: 7.x Has to be implemented + //response.WorldQuestUpdates.push_back(WorldPackets::Quest::WorldQuestUpdateInfo(lastUpdate, questID, timer, variableID, value)); + + SendPacket(response.Write()); +} diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 4f2139c3454..78cd99c3ae5 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -576,3 +576,19 @@ WorldPacket const* WorldPackets::Quest::DailyQuestsReset::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Quest::WorldQuestUpdate::Write() +{ + _worldPacket << uint32(WorldQuestUpdates.size()); + + for (WorldQuestUpdateInfo const& worldQuestUpdate : WorldQuestUpdates) + { + _worldPacket << int32(worldQuestUpdate.LastUpdate); + _worldPacket << uint32(worldQuestUpdate.QuestID); + _worldPacket << uint32(worldQuestUpdate.Timer); + _worldPacket << int32(worldQuestUpdate.VariableID); + _worldPacket << int32(worldQuestUpdate.Value); + } + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 170c3d992fb..f60e3da2eda 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -594,6 +594,36 @@ namespace WorldPackets int32 Count = 0; }; + + class RequestWorldQuestUpdate final : public ClientPacket + { + public: + RequestWorldQuestUpdate(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_WORLD_QUEST_UPDATE, std::move(packet)) { } + + void Read() override { } + }; + + struct WorldQuestUpdateInfo + { + WorldQuestUpdateInfo(int32 lastUpdate, uint32 questID, uint32 timer, int32 variableID, int32 value) : + LastUpdate(lastUpdate), QuestID(questID), Timer(timer), VariableID(variableID), Value(value) { } + int32 LastUpdate; + uint32 QuestID; + uint32 Timer; + // WorldState + int32 VariableID; + int32 Value; + }; + + class WorldQuestUpdate final : public ServerPacket + { + public: + WorldQuestUpdate() : ServerPacket(SMSG_WORLD_QUEST_UPDATE, 100) { } + + WorldPacket const* Write() override; + + std::vector<WorldQuestUpdateInfo> WorldQuestUpdates; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 96ce155de11..98b3f1fa926 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -677,6 +677,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleNextSeat); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehiclePrevSeat); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleSwitchSeat); + DEFINE_HANDLER(CMSG_REQUEST_WORLD_QUEST_UPDATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestWorldQuestUpdate); DEFINE_HANDLER(CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestWowTokenMarketPrice); DEFINE_HANDLER(CMSG_RESET_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_RESET_INSTANCES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleResetInstancesOpcode); @@ -1766,6 +1767,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO_IS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_QUEST_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_AUCTION_SOLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 45f4272187d..ad20b33ad34 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -592,6 +592,7 @@ enum OpcodeClient : uint32 CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x321C, CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x321B, CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x321D, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3323, CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC, CMSG_RESET_CHALLENGE_MODE = 0x31EB, CMSG_RESET_INSTANCES = 0x366D, @@ -1674,6 +1675,7 @@ enum OpcodeServer : uint32 SMSG_WEEKLY_SPELL_USAGE = 0x2C18, SMSG_WHO = 0x2BAE, SMSG_WHO_IS = 0x26CB, + SMSG_WORLD_QUEST_UPDATE = 0x283C, SMSG_WORLD_SERVER_INFO = 0x25C0, SMSG_WORLD_TEXT = 0x2824, SMSG_WOW_TOKEN_AUCTION_SOLD = 0x2813, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index be4060bdc9b..324e79d7f59 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -558,6 +558,7 @@ namespace WorldPackets class QuestLogRemoveQuest; class QuestPushResult; class PushQuestToParty; + class RequestWorldQuestUpdate; } namespace RaF @@ -1464,6 +1465,7 @@ class TC_GAME_API WorldSession void HandleQuestgiverQuestAutoLaunch(WorldPacket& recvPacket); void HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& packet); void HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet); + void HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& packet); void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage); void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& chatMessageWhisper); |