aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp12
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp16
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h30
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Server/WorldSession.h2
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);