mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Loot: Implement CMSG_LOOT_MONEY, CMSG_LOOT_RELEASE, SMSG_COIN_REMOVED, SMSG_LOOT_MONEY_NOTIFY
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 ***/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user