diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-07-12 00:05:41 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-07-12 00:05:41 +0200 |
| commit | 0d06fcee17274148ef6b5516b8cd03e3b8372f9a (patch) | |
| tree | ec07f780936711aa85dc84e4b152166283b1ea7c /src/server/game/Server | |
| parent | 42622aa3d4082c29887a47427745d25d79d4c7f9 (diff) | |
Core/PacketIO: Updated and enabled LFG packets
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/LFGPackets.cpp | 389 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/LFGPackets.h | 403 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/LFGPacketsCommon.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/LFGPacketsCommon.h | 13 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 43 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 32 |
6 files changed, 849 insertions, 39 deletions
diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index 4ec8178035c..ddc18719815 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -16,3 +16,392 @@ */ #include "LFGPackets.h" + +void WorldPackets::LFG::DFJoin::Read() +{ + QueueAsGroup = _worldPacket.ReadBit(); + Unknown = _worldPacket.ReadBit(); + _worldPacket >> PartyIndex; + _worldPacket >> Roles; + Slots.resize(_worldPacket.read<uint32>()); + for (uint32& slot : Slots) + _worldPacket >> slot; +} + +void WorldPackets::LFG::DFLeave::Read() +{ + _worldPacket >> Ticket; +} + +void WorldPackets::LFG::DFProposalResponse::Read() +{ + _worldPacket >> Ticket; + _worldPacket >> InstanceID; + _worldPacket >> InstanceID; + Accepted = _worldPacket.ReadBit(); +} + +void WorldPackets::LFG::DFSetRoles::Read() +{ + _worldPacket >> RolesDesired; + _worldPacket >> PartyIndex; +} + +void WorldPackets::LFG::DFBootPlayerVote::Read() +{ + Vote = _worldPacket.ReadBit(); +} + +void WorldPackets::LFG::DFTeleport::Read() +{ + TeleportOut = _worldPacket.ReadBit(); +} + +void WorldPackets::LFG::DFGetSystemInfo::Read() +{ + Player = _worldPacket.ReadBit(); + _worldPacket >> PartyIndex; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGBlackListSlot const& lfgBlackListSlot) +{ + data << uint32(lfgBlackListSlot.Slot); + data << uint32(lfgBlackListSlot.Reason); + data << int32(lfgBlackListSlot.SubReason1); + data << int32(lfgBlackListSlot.SubReason2); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGBlackList const& blackList) +{ + data.WriteBit(blackList.PlayerGuid.is_initialized()); + data << uint32(blackList.Slot.size()); + if (blackList.PlayerGuid) + data << *blackList.PlayerGuid; + + for (WorldPackets::LFG::LFGBlackListSlot const& slot : blackList.Slot) + data << slot; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LfgPlayerQuestRewardItem const& playerQuestRewardItem) +{ + data << int32(playerQuestRewardItem.ItemID); + data << int32(playerQuestRewardItem.Quantity); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LfgPlayerQuestRewardCurrency const& playerQuestRewardCurrency) +{ + data << int32(playerQuestRewardCurrency.CurrencyID); + data << int32(playerQuestRewardCurrency.Quantity); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LfgPlayerQuestReward const& playerQuestReward) +{ + data << uint32(playerQuestReward.Mask); + data << int32(playerQuestReward.RewardMoney); + data << int32(playerQuestReward.RewardXP); + data << uint32(playerQuestReward.Item.size()); + data << uint32(playerQuestReward.Currency.size()); + data << uint32(playerQuestReward.BonusCurrency.size()); + + for (WorldPackets::LFG::LfgPlayerQuestRewardItem const& item : playerQuestReward.Item) + data << item; + + for (WorldPackets::LFG::LfgPlayerQuestRewardCurrency const& currency : playerQuestReward.Currency) + data << currency; + + for (WorldPackets::LFG::LfgPlayerQuestRewardCurrency const& bonusCurrency : playerQuestReward.BonusCurrency) + data << bonusCurrency; + + data.WriteBit(playerQuestReward.RewardSpellID.is_initialized()); + data.WriteBit(playerQuestReward.Unused1.is_initialized()); + data.WriteBit(playerQuestReward.Unused2.is_initialized()); + data.WriteBit(playerQuestReward.Honor.is_initialized()); + data.FlushBits(); + + if (playerQuestReward.RewardSpellID) + data << int32(*playerQuestReward.RewardSpellID); + + if (playerQuestReward.Unused1) + data << int32(*playerQuestReward.Unused1); + + if (playerQuestReward.Unused2) + data << uint64(*playerQuestReward.Unused2); + + if (playerQuestReward.Honor) + data << int32(*playerQuestReward.Honor); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LfgPlayerDungeonInfo const& playerDungeonInfo) +{ + data << uint32(playerDungeonInfo.Slot); + data << int32(playerDungeonInfo.CompletionQuantity); + data << int32(playerDungeonInfo.CompletionLimit); + data << int32(playerDungeonInfo.CompletionCurrencyID); + data << int32(playerDungeonInfo.SpecificQuantity); + data << int32(playerDungeonInfo.SpecificLimit); + data << int32(playerDungeonInfo.OverallQuantity); + data << int32(playerDungeonInfo.OverallLimit); + data << int32(playerDungeonInfo.PurseWeeklyQuantity); + data << int32(playerDungeonInfo.PurseWeeklyLimit); + data << int32(playerDungeonInfo.PurseQuantity); + data << int32(playerDungeonInfo.PurseLimit); + data << int32(playerDungeonInfo.Quantity); + data << uint32(playerDungeonInfo.CompletedMask); + data << uint32(playerDungeonInfo.EncounterMask); + data << uint32(playerDungeonInfo.ShortageReward.size()); + data.WriteBit(playerDungeonInfo.FirstReward); + data.WriteBit(playerDungeonInfo.ShortageEligible); + data.FlushBits(); + + data << playerDungeonInfo.Rewards; + for (WorldPackets::LFG::LfgPlayerQuestReward const& shortageReward : playerDungeonInfo.ShortageReward) + data << shortageReward; + + return data; +} + +WorldPacket const* WorldPackets::LFG::LfgPlayerInfo::Write() +{ + _worldPacket << uint32(Dungeon.size()); + _worldPacket << BlackList; + for (LfgPlayerDungeonInfo const& playerDungeonInfo : Dungeon) + _worldPacket << playerDungeonInfo; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::LFG::LfgPartyInfo::Write() +{ + _worldPacket << uint32(Player.size()); + for (WorldPackets::LFG::LFGBlackList const& player : Player) + _worldPacket << player; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::LFG::LFGUpdateStatus::Write() +{ + _worldPacket << Ticket; + _worldPacket << uint8(SubType); + _worldPacket << uint8(Reason); + _worldPacket << uint32(Slots.size()); + _worldPacket << uint32(RequestedRoles); + _worldPacket << uint32(SuspendedPlayers.size()); + + for (uint32 slot : Slots) + _worldPacket << uint32(slot); + + for (ObjectGuid const& suspendedPlayer : SuspendedPlayers) + _worldPacket << suspendedPlayer; + + _worldPacket.WriteBit(IsParty); + _worldPacket.WriteBit(NotifyUI); + _worldPacket.WriteBit(Joined); + _worldPacket.WriteBit(LfgJoined); + _worldPacket.WriteBit(Queued); + _worldPacket.WriteBit(Unused); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::LFG::RoleChosen::Write() +{ + _worldPacket << Player; + _worldPacket << uint32(RoleMask); + _worldPacket.WriteBit(Accepted); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGRoleCheckUpdateMember const& lfgRoleCheckUpdateMember) +{ + data << lfgRoleCheckUpdateMember.Guid; + data << uint32(lfgRoleCheckUpdateMember.RolesDesired); + data << uint8(lfgRoleCheckUpdateMember.Level); + data.WriteBit(lfgRoleCheckUpdateMember.RoleCheckComplete); + data.FlushBits(); + + return data; +} + +WorldPacket const* WorldPackets::LFG::LFGRoleCheckUpdate::Write() +{ + _worldPacket << uint8(PartyIndex); + _worldPacket << uint8(RoleCheckStatus); + _worldPacket << uint32(JoinSlots.size()); + _worldPacket << uint64(BgQueueID); + _worldPacket << int32(GroupFinderActivityID); + _worldPacket << uint32(Members.size()); + + for (uint32 slot : JoinSlots) + _worldPacket << uint32(slot); + + _worldPacket.WriteBit(IsBeginning); + _worldPacket.WriteBit(IsRequeue); + _worldPacket.FlushBits(); + + for (LFGRoleCheckUpdateMember const& member : Members) + _worldPacket << member; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGJoinBlackListSlot const& lfgBlackListSlot) +{ + data << int32(lfgBlackListSlot.Slot); + data << int32(lfgBlackListSlot.Reason); + data << int32(lfgBlackListSlot.SubReason1); + data << int32(lfgBlackListSlot.SubReason2); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGJoinBlackList const& blackList) +{ + data << blackList.Guid; + data << uint32(blackList.Slots.size()); + + for (WorldPackets::LFG::LFGJoinBlackListSlot const& slot : blackList.Slots) + data << slot; + + return data; +} + +WorldPacket const* WorldPackets::LFG::LFGJoinResult::Write() +{ + _worldPacket << Ticket; + _worldPacket << uint8(Result); + _worldPacket << uint8(ResultDetail); + _worldPacket << uint32(BlackList.size()); + + for (LFGJoinBlackList const& blackList : BlackList) + _worldPacket << blackList; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::LFG::LFGQueueStatus::Write() +{ + _worldPacket << Ticket; + _worldPacket << uint32(Slot); + _worldPacket << uint32(AvgWaitTimeMe); + _worldPacket << uint32(AvgWaitTime); + + for (uint32 i = 0; i < 3; ++i) + { + _worldPacket << uint32(AvgWaitTimeByRole[i]); + _worldPacket << uint8(LastNeeded[i]); + } + _worldPacket << uint32(QueuedTime); + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGPlayerRewards const& lfgPlayerRewards) +{ + data << int32(lfgPlayerRewards.RewardItem); + data << uint32(lfgPlayerRewards.RewardItemQuantity); + data << int32(lfgPlayerRewards.BonusCurrency); + data.WriteBit(lfgPlayerRewards.IsCurrency); + + return data; +} + +WorldPacket const* WorldPackets::LFG::LFGPlayerReward::Write() +{ + _worldPacket << uint32(QueuedSlot); + _worldPacket << uint32(ActualSlot); + _worldPacket << int32(RewardMoney); + _worldPacket << int32(AddedXP); + _worldPacket << uint32(Rewards.size()); + + for (LFGPlayerRewards const& reward : Rewards) + _worldPacket << reward; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LfgBootInfo const& lfgBootInfo) +{ + data.WriteBit(lfgBootInfo.VoteInProgress); + data.WriteBit(lfgBootInfo.VotePassed); + data.WriteBit(lfgBootInfo.MyVoteCompleted); + data.WriteBit(lfgBootInfo.MyVote); + data.WriteBits(lfgBootInfo.Reason.length(), 8); + data << lfgBootInfo.Target; + data << uint32(lfgBootInfo.TotalVotes); + data << uint32(lfgBootInfo.BootVotes); + data << int32(lfgBootInfo.TimeLeft); + data << uint32(lfgBootInfo.VotesNeeded); + data.WriteString(lfgBootInfo.Reason); + + return data; +} + +WorldPacket const* WorldPackets::LFG::LfgBootPlayer::Write() +{ + _worldPacket << Info; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGProposalUpdatePlayer const& lfgProposalUpdatePlayer) +{ + data << uint32(lfgProposalUpdatePlayer.Roles); + data.WriteBit(lfgProposalUpdatePlayer.Me); + data.WriteBit(lfgProposalUpdatePlayer.SameParty); + data.WriteBit(lfgProposalUpdatePlayer.MyParty); + data.WriteBit(lfgProposalUpdatePlayer.Responded); + data.WriteBit(lfgProposalUpdatePlayer.Accepted); + data.FlushBits(); + + return data; +} + +WorldPacket const* WorldPackets::LFG::LFGProposalUpdate::Write() +{ + _worldPacket << Ticket; + _worldPacket << uint64(InstanceID); + _worldPacket << uint32(ProposalID); + _worldPacket << uint32(Slot); + _worldPacket << int8(State); + _worldPacket << uint32(CompletedMask); + _worldPacket << uint32(Players.size()); + _worldPacket << uint8(Unused); + _worldPacket.WriteBit(ValidCompletedMask); + _worldPacket.WriteBit(ProposalSilent); + _worldPacket.WriteBit(IsRequeue); + _worldPacket.FlushBits(); + + for (LFGProposalUpdatePlayer const& player : Players) + _worldPacket << player; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::LFG::LFGOfferContinue::Write() +{ + _worldPacket << uint32(Slot); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::LFG::LFGTeleportDenied::Write() +{ + _worldPacket.WriteBits(Reason, 4); + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index 18b8ef8620a..e0958a9daea 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -20,11 +20,414 @@ #include "Packet.h" #include "LFGPacketsCommon.h" +#include "Optional.h" + +namespace lfg +{ + enum LfgTeleportResult : uint8; +} namespace WorldPackets { namespace LFG { + class DFJoin final : public ClientPacket + { + public: + DFJoin(WorldPacket&& packet) : ClientPacket(CMSG_DF_JOIN, std::move(packet)) { } + + void Read() override; + + bool QueueAsGroup = false; + bool Unknown = false; // Always false in 7.2.5 + uint8 PartyIndex = 0; + uint32 Roles = 0; + Array<uint32, 50> Slots; + }; + + class DFLeave final : public ClientPacket + { + public: + DFLeave(WorldPacket&& packet) : ClientPacket(CMSG_DF_LEAVE, std::move(packet)) { } + + void Read() override; + + RideTicket Ticket; + }; + + class DFProposalResponse final : public ClientPacket + { + public: + DFProposalResponse(WorldPacket&& packet) : ClientPacket(CMSG_DF_PROPOSAL_RESPONSE, std::move(packet)) { } + + void Read() override; + + RideTicket Ticket; + uint64 InstanceID = 0; + uint32 ProposalID = 0; + bool Accepted = false; + }; + + class DFSetRoles final : public ClientPacket + { + public: + DFSetRoles(WorldPacket&& packet) : ClientPacket(CMSG_DF_SET_ROLES, std::move(packet)) { } + + void Read() override; + + uint32 RolesDesired = 0; + uint8 PartyIndex = 0; + }; + + class DFBootPlayerVote final : public ClientPacket + { + public: + DFBootPlayerVote(WorldPacket&& packet) : ClientPacket(CMSG_DF_BOOT_PLAYER_VOTE, std::move(packet)) { } + + void Read() override; + + bool Vote = false; + }; + + class DFTeleport final : public ClientPacket + { + public: + DFTeleport(WorldPacket&& packet) : ClientPacket(CMSG_DF_TELEPORT, std::move(packet)) { } + + void Read() override; + + bool TeleportOut = false; + }; + + class DFGetSystemInfo final : public ClientPacket + { + public: + DFGetSystemInfo(WorldPacket&& packet) : ClientPacket(CMSG_DF_GET_SYSTEM_INFO, std::move(packet)) { } + + void Read() override; + + uint8 PartyIndex = 0; + bool Player = false; + }; + + class DFGetJoinStatus final : public ClientPacket + { + public: + DFGetJoinStatus(WorldPacket&& packet) : ClientPacket(CMSG_DF_GET_JOIN_STATUS, std::move(packet)) { } + + void Read() override { } + }; + + struct LFGBlackListSlot + { + LFGBlackListSlot() { } + LFGBlackListSlot(uint32 slot, uint32 reason, int32 subReason1, int32 subReason2) + : Slot(slot), Reason(reason), SubReason1(subReason1), SubReason2(subReason2) { } + + uint32 Slot = 0; + uint32 Reason = 0; + int32 SubReason1 = 0; + int32 SubReason2 = 0; + }; + + struct LFGBlackList + { + Optional<ObjectGuid> PlayerGuid; + std::vector<LFGBlackListSlot> Slot; + }; + + struct LfgPlayerQuestRewardItem + { + LfgPlayerQuestRewardItem() { } + LfgPlayerQuestRewardItem(int32 itemId, int32 quantity) : ItemID(itemId), Quantity(quantity) { } + + int32 ItemID = 0; + int32 Quantity = 0; + }; + + struct LfgPlayerQuestRewardCurrency + { + LfgPlayerQuestRewardCurrency() { } + LfgPlayerQuestRewardCurrency(int32 currencyID, int32 quantity) : CurrencyID(currencyID), Quantity(quantity) { } + + int32 CurrencyID = 0; + int32 Quantity = 0; + }; + + struct LfgPlayerQuestReward + { + uint32 Mask = 0; // Roles required for this reward, only used by ShortageReward in SMSG_LFG_PLAYER_INFO + int32 RewardMoney = 0; // Only used by SMSG_LFG_PLAYER_INFO + int32 RewardXP = 0; + std::vector<LfgPlayerQuestRewardItem> Item; + std::vector<LfgPlayerQuestRewardCurrency> Currency; // Only used by SMSG_LFG_PLAYER_INFO + std::vector<LfgPlayerQuestRewardCurrency> BonusCurrency; // Only used by SMSG_LFG_PLAYER_INFO + Optional<int32> RewardSpellID; // Only used by SMSG_LFG_PLAYER_INFO + Optional<int32> Unused1; + Optional<uint64> Unused2; + Optional<int32> Honor; // Only used by SMSG_REQUEST_PVP_REWARDS_RESPONSE + }; + + struct LfgPlayerDungeonInfo + { + uint32 Slot = 0; + int32 CompletionQuantity = 0; + int32 CompletionLimit = 0; + int32 CompletionCurrencyID = 0; + int32 SpecificQuantity = 0; + int32 SpecificLimit = 0; + int32 OverallQuantity = 0; + int32 OverallLimit = 0; + int32 PurseWeeklyQuantity = 0; + int32 PurseWeeklyLimit = 0; + int32 PurseQuantity = 0; + int32 PurseLimit = 0; + int32 Quantity = 0; + uint32 CompletedMask = 0; + uint32 EncounterMask = 0; + bool FirstReward = false; + bool ShortageEligible = false; + LfgPlayerQuestReward Rewards; + std::vector<LfgPlayerQuestReward> ShortageReward; + }; + + class LfgPlayerInfo final : public ServerPacket + { + public: + LfgPlayerInfo() : ServerPacket(SMSG_LFG_PLAYER_INFO) { } + + WorldPacket const* Write() override; + + LFGBlackList BlackList; + std::vector<LfgPlayerDungeonInfo> Dungeon; + }; + + class LfgPartyInfo final : public ServerPacket + { + public: + LfgPartyInfo() : ServerPacket(SMSG_LFG_PARTY_INFO) { } + + WorldPacket const* Write() override; + + std::vector<LFGBlackList> Player; + }; + + class LFGUpdateStatus final : public ServerPacket + { + public: + LFGUpdateStatus() : ServerPacket(SMSG_LFG_UPDATE_STATUS) { } + + WorldPacket const* Write() override; + + RideTicket Ticket; + uint8 SubType = 0; + uint8 Reason = 0; + std::vector<uint32> Slots; + uint32 RequestedRoles = 0; + std::vector<ObjectGuid> SuspendedPlayers; + bool NotifyUI = false; + bool IsParty = false; + bool Joined = false; + bool LfgJoined = false; + bool Queued = false; + bool Unused = false; + }; + + class RoleChosen final : public ServerPacket + { + public: + RoleChosen() : ServerPacket(SMSG_ROLE_CHOSEN, 16 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid Player; + uint32 RoleMask = 0; + bool Accepted = false; + }; + + struct LFGRoleCheckUpdateMember + { + LFGRoleCheckUpdateMember() { } + LFGRoleCheckUpdateMember(ObjectGuid guid, uint32 rolesDesired, uint8 level, bool roleCheckComplete) + : Guid(guid), RolesDesired(rolesDesired), Level(level), RoleCheckComplete(roleCheckComplete) { } + + ObjectGuid Guid; + uint32 RolesDesired = 0; + uint8 Level = 0; + bool RoleCheckComplete = false; + }; + + class LFGRoleCheckUpdate final : public ServerPacket + { + public: + LFGRoleCheckUpdate() : ServerPacket(SMSG_LFG_ROLE_CHECK_UPDATE) { } + + WorldPacket const* Write() override; + + uint8 PartyIndex = 0; + uint8 RoleCheckStatus = 0; + std::vector<uint32> JoinSlots; + uint64 BgQueueID = 0; + int32 GroupFinderActivityID = 0; + std::vector<LFGRoleCheckUpdateMember> Members; + bool IsBeginning = false; + bool IsRequeue = false; + }; + + struct LFGJoinBlackListSlot + { + LFGJoinBlackListSlot() { } + LFGJoinBlackListSlot(int32 slot, int32 reason, int32 subReason1, int32 subReason2) + : Slot(slot), Reason(reason), SubReason1(subReason1), SubReason2(subReason2) { } + + int32 Slot = 0; + int32 Reason = 0; + int32 SubReason1 = 0; + int32 SubReason2 = 0; + }; + + struct LFGJoinBlackList + { + ObjectGuid Guid; + std::vector<LFGJoinBlackListSlot> Slots; + }; + + class LFGJoinResult final : public ServerPacket + { + public: + LFGJoinResult() : ServerPacket(SMSG_LFG_JOIN_RESULT) { } + + WorldPacket const* Write() override; + + RideTicket Ticket; + uint8 Result = 0; + uint8 ResultDetail = 0; + std::vector<LFGJoinBlackList> BlackList; + }; + + class LFGQueueStatus final : public ServerPacket + { + public: + LFGQueueStatus() : ServerPacket(SMSG_LFG_QUEUE_STATUS, 16 + 4 + 4 + 4 + 4 + 4 + 4 + 4 * 3 + 3 + 4) { } + + WorldPacket const* Write() override; + + RideTicket Ticket; + uint32 Slot = 0; + uint32 AvgWaitTimeMe = 0; + uint32 AvgWaitTime = 0; + uint32 AvgWaitTimeByRole[3] = {}; + uint8 LastNeeded[3] = {}; + uint32 QueuedTime = 0; + }; + + struct LFGPlayerRewards + { + LFGPlayerRewards() { } + LFGPlayerRewards(int32 rewardItem, uint32 rewardItemQuantity, int32 bonusCurrency, bool isCurrency) + : RewardItem(rewardItem), RewardItemQuantity(rewardItemQuantity), BonusCurrency(bonusCurrency), IsCurrency(isCurrency) { } + + int32 RewardItem = 0; + uint32 RewardItemQuantity = 0; + int32 BonusCurrency = 0; + bool IsCurrency = false; + }; + + class LFGPlayerReward final : public ServerPacket + { + public: + LFGPlayerReward() : ServerPacket(SMSG_LFG_PLAYER_REWARD) { } + + WorldPacket const* Write() override; + + uint32 QueuedSlot = 0; + uint32 ActualSlot = 0; + int32 RewardMoney = 0; + int32 AddedXP = 0; + std::vector<LFGPlayerRewards> Rewards; + }; + + struct LfgBootInfo + { + bool VoteInProgress = false; + bool VotePassed = false; + bool MyVoteCompleted = false; + bool MyVote = false; + ObjectGuid Target; + uint32 TotalVotes = 0; + uint32 BootVotes = 0; + int32 TimeLeft = 0; + uint32 VotesNeeded = 0; + std::string Reason; + }; + + class LfgBootPlayer final : public ServerPacket + { + public: + LfgBootPlayer() : ServerPacket(SMSG_LFG_BOOT_PLAYER) { } + + WorldPacket const* Write() override; + + LfgBootInfo Info; + }; + + struct LFGProposalUpdatePlayer + { + uint32 Roles = 0; + bool Me = false; + bool SameParty = false; + bool MyParty = false; + bool Responded = false; + bool Accepted = false; + }; + + class LFGProposalUpdate final : public ServerPacket + { + public: + LFGProposalUpdate() : ServerPacket(SMSG_LFG_PROPOSAL_UPDATE) { } + + WorldPacket const* Write() override; + + RideTicket Ticket; + uint64 InstanceID = 0; + uint32 ProposalID = 0; + uint32 Slot = 0; + int8 State = 0; + uint32 CompletedMask = 0; + uint8 Unused; + bool ValidCompletedMask = false; + bool ProposalSilent = false; + bool IsRequeue; + std::vector<LFGProposalUpdatePlayer> Players; + }; + + class LFGDisabled final : public ServerPacket + { + public: + LFGDisabled() : ServerPacket(SMSG_LFG_DISABLED, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class LFGOfferContinue final : public ServerPacket + { + public: + LFGOfferContinue(uint32 slot) : ServerPacket(SMSG_LFG_OFFER_CONTINUE, 4), Slot(slot) { } + + WorldPacket const* Write() override; + + uint32 Slot = 0; + }; + + class LFGTeleportDenied final : public ServerPacket + { + public: + LFGTeleportDenied(lfg::LfgTeleportResult reason) : ServerPacket(SMSG_LFG_TELEPORT_DENIED, 1), Reason(reason) { } + + WorldPacket const* Write() override; + + lfg::LfgTeleportResult Reason; + }; } } diff --git a/src/server/game/Server/Packets/LFGPacketsCommon.cpp b/src/server/game/Server/Packets/LFGPacketsCommon.cpp index 71af239d5aa..74b08383a72 100644 --- a/src/server/game/Server/Packets/LFGPacketsCommon.cpp +++ b/src/server/game/Server/Packets/LFGPacketsCommon.cpp @@ -21,7 +21,7 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket) { data >> ticket.RequesterGuid; data >> ticket.Id; - data >> ticket.Type; + ticket.Type = data.read<WorldPackets::LFG::RideType>(); data >> ticket.Time; return data; @@ -30,9 +30,9 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::LFG::RideTicket& ticket) ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::RideTicket const& ticket) { data << ticket.RequesterGuid; - data << int32(ticket.Id); - data << int32(ticket.Type); - data << uint32(ticket.Time); + data << uint32(ticket.Id); + data << uint32(ticket.Type); + data << int32(ticket.Time); return data; } diff --git a/src/server/game/Server/Packets/LFGPacketsCommon.h b/src/server/game/Server/Packets/LFGPacketsCommon.h index 957ed07f161..b36f0082b6f 100644 --- a/src/server/game/Server/Packets/LFGPacketsCommon.h +++ b/src/server/game/Server/Packets/LFGPacketsCommon.h @@ -25,12 +25,19 @@ namespace WorldPackets { namespace LFG { + enum class RideType : uint32 + { + None = 0, + Battlegrounds = 1, + Lfg = 2 + }; + struct RideTicket { ObjectGuid RequesterGuid; - int32 Id = 0; - int32 Type = 0; - uint32 Time = 0; + uint32 Id = 0; + RideType Type = RideType::None; + int32 Time = 0; }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 2d22d52c736..1001dd1aeec 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -352,15 +352,15 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode); DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDestroyItemOpcode); - DEFINE_HANDLER(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode); + DEFINE_HANDLER(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode); DEFINE_HANDLER(CMSG_DF_GET_JOIN_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetJoinStatus); - DEFINE_HANDLER(CMSG_DF_GET_SYSTEM_INFO, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetSystemInfo); - DEFINE_HANDLER(CMSG_DF_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode); - DEFINE_HANDLER(CMSG_DF_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode); - DEFINE_HANDLER(CMSG_DF_PROPOSAL_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgProposalResultOpcode); - DEFINE_HANDLER(CMSG_DF_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DF_SET_ROLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetRolesOpcode); - DEFINE_HANDLER(CMSG_DF_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgTeleportOpcode); + DEFINE_HANDLER(CMSG_DF_GET_SYSTEM_INFO, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleDFGetSystemInfo); + DEFINE_HANDLER(CMSG_DF_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode); + DEFINE_HANDLER(CMSG_DF_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode); + DEFINE_HANDLER(CMSG_DF_PROPOSAL_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgProposalResultOpcode); + DEFINE_HANDLER(CMSG_DF_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_DF_SET_ROLES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetRolesOpcode); + DEFINE_HANDLER(CMSG_DF_TELEPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgTeleportOpcode); DEFINE_HANDLER(CMSG_DISCARDED_TIME_SYNC_ACKS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DISMISS_CRITTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter); DEFINE_HANDLER(CMSG_DO_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -1313,28 +1313,27 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENTS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UP_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_SEARCH_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_SEARCH_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_UPDATE_BLACKLIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_REWARD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PROPOSAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_QUEUE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_REWARD, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PROPOSAL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_QUEUE_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_READY_CHECK_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_READY_CHECK_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHECK_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - //DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SEARCH_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHECK_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1634,7 +1633,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHOSEN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RUNE_REGEN_DEBUG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_BOOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 122585e0a74..ae51478180e 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -64,6 +64,7 @@ struct LfgQueueStatusData; struct LfgPlayerRewardData; struct LfgRoleCheck; struct LfgUpdateData; +enum LfgTeleportResult : uint8; } namespace rbac @@ -399,6 +400,18 @@ namespace WorldPackets struct ItemInstance; } + namespace LFG + { + class DFJoin; + class DFLeave; + class DFProposalResponse; + class DFSetRoles; + class DFBootPlayerVote; + class DFTeleport; + class DFGetSystemInfo; + class DFGetJoinStatus; + } + namespace Loot { class LootUnit; @@ -1527,21 +1540,20 @@ class TC_GAME_API WorldSession void HandleInstanceLockResponse(WorldPackets::Instance::InstanceLockResponse& packet); // Looking for Dungeon/Raid - void HandleDFGetSystemInfo(WorldPacket& recvData); void SendLfgPlayerLockInfo(); void SendLfgPartyLockInfo(); - void HandleLfgJoinOpcode(WorldPacket& recvData); - void HandleLfgLeaveOpcode(WorldPacket& recvData); - void HandleLfgSetRolesOpcode(WorldPacket& recvData); - void HandleLfgProposalResultOpcode(WorldPacket& recvData); - void HandleLfgSetBootVoteOpcode(WorldPacket& recvData); - void HandleLfgTeleportOpcode(WorldPacket& recvData); - void HandleDFGetJoinStatus(WorldPacket& recvData); + void HandleLfgJoinOpcode(WorldPackets::LFG::DFJoin& dfJoin); + void HandleLfgLeaveOpcode(WorldPackets::LFG::DFLeave& dfLeave); + void HandleLfgProposalResultOpcode(WorldPackets::LFG::DFProposalResponse& dfProposalResponse); + void HandleLfgSetRolesOpcode(WorldPackets::LFG::DFSetRoles& dfSetRoles); + void HandleLfgSetBootVoteOpcode(WorldPackets::LFG::DFBootPlayerVote& dfBootPlayerVote); + void HandleLfgTeleportOpcode(WorldPackets::LFG::DFTeleport& dfTeleport); + void HandleDFGetSystemInfo(WorldPackets::LFG::DFGetSystemInfo& dfGetSystemInfo); + void HandleDFGetJoinStatus(WorldPackets::LFG::DFGetJoinStatus& dfGetJoinStatus); void SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party); void SendLfgRoleChosen(ObjectGuid guid, uint8 roles); void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& pRoleCheck); - void SendLfgLfrList(bool update); void SendLfgJoinResult(lfg::LfgJoinResultData const& joinData); void SendLfgQueueStatus(lfg::LfgQueueStatusData const& queueData); void SendLfgPlayerReward(lfg::LfgPlayerRewardData const& lfgPlayerRewardData); @@ -1549,7 +1561,7 @@ class TC_GAME_API WorldSession void SendLfgUpdateProposal(lfg::LfgProposal const& proposal); void SendLfgDisabled(); void SendLfgOfferContinue(uint32 dungeonEntry); - void SendLfgTeleportError(uint8 err); + void SendLfgTeleportError(lfg::LfgTeleportResult err); void HandleSelfResOpcode(WorldPackets::Spells::SelfRes& packet); void HandleRequestPetInfo(WorldPackets::Pet::RequestPetInfo& packet); |
