aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorTraesh <traesh@farahlon.com>2017-12-17 14:40:04 +0100
committerShauren <shauren.trinity@gmail.com>2017-12-31 23:22:55 +0100
commit89c91c271b94f34076be7256378610a2a45c9ed2 (patch)
tree71a2d1751039924a66ebfdb33408695f0cd51d3b /src/server/game/Server
parent5dd686c080723eeeefdabb50b867f9f662d5deb9 (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.cpp76
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h30
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h2
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);