diff options
| author | Traesh <traesh@farahlon.com> | 2017-12-17 14:40:04 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-12-31 23:22:55 +0100 |
| commit | 89c91c271b94f34076be7256378610a2a45c9ed2 (patch) | |
| tree | 71a2d1751039924a66ebfdb33408695f0cd51d3b /src/server/game/Server | |
| parent | 5dd686c080723eeeefdabb50b867f9f662d5deb9 (diff) | |
Core/Quests: Implemented player choices
* Implemented SPELL_EFFECT_LAUNCH_QUEST_CHOICE
* Script hook for player choices
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 76 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 30 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
4 files changed, 110 insertions, 2 deletions
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 32f9da96a1b..d076315fde3 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -599,3 +599,79 @@ WorldPacket const* WorldPackets::Quest::WorldQuestUpdate::Write() return &_worldPacket; } + +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponse const& response) +{ + data << int32(response.ResponseID); + data << int32(response.ChoiceArtFileID); + + data.WriteBits(response.Answer.length(), 9); + data.WriteBits(response.Header.length(), 9); + data.WriteBits(response.Description.length(), 11); + data.WriteBits(response.Confirmation.length(), 7); + + data.WriteBit(response.Reward.is_initialized()); + data.FlushBits(); + + if (response.Reward.is_initialized()) + data << (*response.Reward); + + data.WriteString(response.Answer); + data.WriteString(response.Header); + data.WriteString(response.Description); + data.WriteString(response.Confirmation); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseReward const& reward) +{ + data << int32(reward.TitleID); + data << int32(reward.PackageID); + data << int32(reward.SkillLineID); + data << uint32(reward.SkillPointCount); + data << uint32(reward.ArenaPointCount); + data << uint32(reward.HonorPointCount); + data << uint64(reward.Money); + data << uint32(reward.Xp); + + data << uint32(0); // itemCount + data << uint32(0); // currencyCount + data << uint32(0); // factionCount + data << uint32(0); // itemChoiceCount + + /*for (var i = 0u; i < itemCount; ++i) + ReadPlayerChoiceResponseRewardEntry(packet, "Item", i); + + for (var i = 0u; i < currencyCount; ++i) + ReadPlayerChoiceResponseRewardEntry(packet, "Currency", i); + + for (var i = 0u; i < factionCount; ++i) + ReadPlayerChoiceResponseRewardEntry(packet, "Faction", i); + + for (var i = 0u; i < itemChoiceCount; ++i) + ReadPlayerChoiceResponseRewardEntry(packet, "ItemChoice", i);*/ + + return data; +} + +WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write() +{ + _worldPacket << int32(Choice->ChoiceId); + _worldPacket << uint32(Choice->Responses.size()); + _worldPacket << SenderGUID; + _worldPacket.WriteBits(Choice->Question.length(), 8); + _worldPacket.WriteBit(CloseChoiceFrame); + _worldPacket.FlushBits(); + + for (auto response : Choice->Responses) + _worldPacket << response.second; + + _worldPacket.WriteString(Choice->Question); + return &_worldPacket; +} + +void WorldPackets::Quest::PlayerChoiceResponse::Read() +{ + _worldPacket >> ChoiceID; + _worldPacket >> ResponseID; +} diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 955571f79ab..a087c5de241 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -23,6 +23,10 @@ #include "QuestDef.h" #include "ObjectGuid.h" +struct PlayerChoice; +struct PlayerChoiceResponse; +struct PlayerChoiceResponseReward; + namespace WorldPackets { namespace Quest @@ -633,9 +637,35 @@ namespace WorldPackets std::vector<WorldQuestUpdateInfo> WorldQuestUpdates; }; + + class DisplayPlayerChoice final : public ServerPacket + { + public: + DisplayPlayerChoice() : ServerPacket(SMSG_DISPLAY_PLAYER_CHOICE) { } + + WorldPacket const* Write() override; + + ObjectGuid SenderGUID; + PlayerChoice const* Choice; + bool CloseChoiceFrame = false; + }; + + class PlayerChoiceResponse final : public ClientPacket + { + public: + PlayerChoiceResponse(WorldPacket&& packet) : ClientPacket(CMSG_CHOICE_RESPONSE, std::move(packet)) { } + + void Read() override; + + int32 ChoiceID; + int32 ResponseID; + }; } } +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponse const& response); +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseReward const& reward); + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards); ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferReward const& offer); diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5796215cbe8..08d88187ddb 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -322,7 +322,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAllAddonPrefixesOpcode); DEFINE_HANDLER(CMSG_CHECK_RAF_EMAIL_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePlayerChoiceResponse); DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearRaidMarker); DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode); DEFINE_HANDLER(CMSG_CLIENT_PORT_GRAVEYARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePortGraveyard); @@ -1108,7 +1108,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_QUEST_POPUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 283a2dab146..5d680a1dab1 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -596,6 +596,7 @@ namespace WorldPackets class QuestPushResult; class PushQuestToParty; class RequestWorldQuestUpdate; + class PlayerChoiceResponse; } namespace RaF @@ -1442,6 +1443,7 @@ class TC_GAME_API WorldSession void HandlePushQuestToParty(WorldPackets::Quest::PushQuestToParty& packet); void HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet); void HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWorldQuestUpdate& packet); + void HandlePlayerChoiceResponse(WorldPackets::Quest::PlayerChoiceResponse& packet); void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage); void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& chatMessageWhisper); |
