diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/LootHandler.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/LootPackets.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Server/Packets/LootPackets.h | 39 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 6 |
9 files changed, 86 insertions, 26 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e0e5f0f72be..733df1048b3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8944,10 +8944,11 @@ void Player::SendLootError(ObjectGuid guid, LootError error) SendDirectMessage(&data); } -void Player::SendNotifyLootMoneyRemoved() +void Player::SendNotifyLootMoneyRemoved(ObjectGuid lootObj) { - WorldPacket data(SMSG_LOOT_CLEAR_MONEY, 0); - GetSession()->SendPacket(&data); + WorldPackets::Loot::CoinRemoved packet; + packet.LootObj = lootObj; + SendDirectMessage(packet.Write()); } void Player::SendNotifyLootItemRemoved(ObjectGuid owner, ObjectGuid lootObj, uint8 lootSlot) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index e3f0725b41f..9423b912548 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2286,7 +2286,7 @@ class Player : public Unit, public GridObject<Player> void SendLootError(ObjectGuid guid, LootError error); void SendLootRelease(ObjectGuid guid); void SendNotifyLootItemRemoved(ObjectGuid owner, ObjectGuid lootObj, uint8 lootSlot); - void SendNotifyLootMoneyRemoved(); + void SendNotifyLootMoneyRemoved(ObjectGuid lootObj); /*********************************************************/ /*** BATTLEGROUND SYSTEM ***/ diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 35096da66b1..61e63311910 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -103,7 +103,7 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPackets::Loot::AutoStoreLo } } -void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet*/) { TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT_MONEY"); @@ -196,10 +196,10 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) if (uint32 guildGold = CalculatePct(goldPerPlayer, (*i)->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT))) guild->HandleMemberDepositMoney(this, guildGold, true); - WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); - data << uint32(goldPerPlayer); - data << uint8(playersNear.size() <= 1); // Controls the text displayed in chat. 0 is "Your share is..." and 1 is "You loot..." - (*i)->GetSession()->SendPacket(&data); + WorldPackets::Loot::LootMoneyNotify packet; + packet.Money = goldPerPlayer; + packet.SoleLooter = playersNear.size() <= 1 ? true : false; + (*i)->SendDirectMessage(packet.Write()); } } else @@ -211,10 +211,10 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) if (uint32 guildGold = CalculatePct(loot->gold, player->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT))) guild->HandleMemberDepositMoney(this, guildGold, true); - WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1); - data << uint32(loot->gold); - data << uint8(1); // "You loot..." - SendPacket(&data); + WorldPackets::Loot::LootMoneyNotify packet; + packet.Money = loot->gold; + packet.SoleLooter = true; // "You loot..." + SendPacket(packet.Write()); } loot->gold = 0; @@ -244,18 +244,15 @@ void WorldSession::HandleLootOpcode(WorldPackets::Loot::LootUnit& packet) GetPlayer()->InterruptNonMeleeSpells(false); } -void WorldSession::HandleLootReleaseOpcode(WorldPacket& recvData) +void WorldSession::HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease& packet) { TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT_RELEASE"); // cheaters can modify lguid to prevent correct apply loot release code and re-loot // use internal stored guid - ObjectGuid guid; - recvData >> guid; - ObjectGuid lguid = GetPlayer()->GetLootGUID(); if (!lguid.IsEmpty()) - if (lguid == guid) + if (lguid == packet.Unit) DoLootRelease(lguid); } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 930b1fc775a..487454c6e2f 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -656,7 +656,7 @@ void Loot::NotifyMoneyRemoved() i_next = i; ++i_next; if (Player* player = ObjectAccessor::FindPlayer(*i)) - player->SendNotifyLootMoneyRemoved(); + player->SendNotifyLootMoneyRemoved(GetGUID()); else PlayersLooting.erase(i); } diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 776c6fe105d..c51e05f9e25 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -85,3 +85,24 @@ WorldPacket const* WorldPackets::Loot::LootRemoved::Write() return &_worldPacket; } + +void WorldPackets::Loot::LootRelease::Read() +{ + _worldPacket >> Unit; +} + +WorldPacket const* WorldPackets::Loot::LootMoneyNotify::Write() +{ + _worldPacket << Money; + _worldPacket.WriteBit(SoleLooter); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Loot::CoinRemoved::Write() +{ + _worldPacket << LootObj; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index ffe079e3583..6a3df9de214 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -104,6 +104,45 @@ namespace WorldPackets ObjectGuid Owner; uint8 LootListID = 0; }; + + class LootRelease final : public ClientPacket + { + public: + LootRelease(WorldPacket&& packet) : ClientPacket(CMSG_LOOT_RELEASE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Unit; + }; + + class LootMoney final : public ClientPacket + { + public: + LootMoney(WorldPacket&& packet) : ClientPacket(CMSG_LOOT_MONEY, std::move(packet)) { } + + void Read() override { } + }; + + class LootMoneyNotify final : public ServerPacket + { + public: + LootMoneyNotify() : ServerPacket(SMSG_LOOT_MONEY_NOTIFY, 5) { } + + WorldPacket const* Write() override; + + uint32 Money = 0; + bool SoleLooter = false; + }; + + class CoinRemoved final : public ServerPacket + { + public: + CoinRemoved() : ServerPacket(SMSG_COIN_REMOVED, 9) { } + + WorldPacket const* Write() override; + + ObjectGuid LootObj; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 8ca4d4d37f4..c3fcfc98d12 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -414,8 +414,8 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_CURRENCY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_MASTER_GIVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_METHOD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMethodOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMoneyOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_RELEASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootReleaseOpcode ); + DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootMoney, &WorldSession::HandleLootMoneyOpcode); + DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRelease, &WorldSession::HandleLootReleaseOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootRoll ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailCreateTextItem ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailDelete ); @@ -847,7 +847,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1088,7 +1088,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MASTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 2d606821c5f..d6008aed049 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -343,7 +343,7 @@ enum OpcodeClient : uint32 CMSG_LOOT_CURRENCY = 0xBADD, CMSG_LOOT_MASTER_GIVE = 0xBADD, CMSG_LOOT_METHOD = 0x0729, - CMSG_LOOT_MONEY = 0xBADD, + CMSG_LOOT_MONEY = 0x1991, CMSG_LOOT_RELEASE = 0x1199, CMSG_LOOT_ROLL = 0xBADD, CMSG_MAIL_CREATE_TEXT_ITEM = 0x13D1, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 82c0c49db72..3cba8396dfc 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -168,6 +168,8 @@ namespace WorldPackets { class LootUnit; class AutoStoreLootItem; + class LootRelease; + class LootMoney; } namespace Misc @@ -689,9 +691,9 @@ class WorldSession void HandlePingOpcode(WorldPacket& recvPacket); void HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet); void HandleAutostoreLootItemOpcode(WorldPackets::Loot::AutoStoreLootItem& packet); - void HandleLootMoneyOpcode(WorldPacket& recvPacket); + void HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& packet); void HandleLootOpcode(WorldPackets::Loot::LootUnit& packet); - void HandleLootReleaseOpcode(WorldPacket& recvPacket); + void HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease& packet); void HandleLootMasterGiveOpcode(WorldPacket& recvPacket); void HandleWhoOpcode(WorldPacket& recvPacket); void HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& logoutRequest); |