aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcemak <mightyhaza@yandex.ru>2015-01-16 12:50:09 +0300
committerIntel <chemicstry@gmail.com>2015-01-16 19:33:21 +0200
commit44b2e520218f3d0d1969efb7fa22c869e5c7833f (patch)
tree76526b5db5bbf3c461739807521cea1015365fe7
parent1406536a2c12159424dee0df6486276a28f0d34c (diff)
Core/Loot: Implement CMSG_LOOT_MONEY, CMSG_LOOT_RELEASE, SMSG_COIN_REMOVED, SMSG_LOOT_MONEY_NOTIFY
-rw-r--r--src/server/game/Entities/Player/Player.cpp7
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Handlers/LootHandler.cpp25
-rw-r--r--src/server/game/Loot/LootMgr.cpp2
-rw-r--r--src/server/game/Server/Packets/LootPackets.cpp21
-rw-r--r--src/server/game/Server/Packets/LootPackets.h39
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp8
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Server/WorldSession.h6
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);