diff options
author | Dehravor <dehravor@gmail.com> | 2014-03-11 19:06:42 +0100 |
---|---|---|
committer | Dehravor <dehravor@gmail.com> | 2014-03-11 19:06:42 +0100 |
commit | 892d9eac79e94796e3b22e5be368063d59b20efc (patch) | |
tree | ca5ad782743f1c33a08bd6d61f0e2b81b1205e1b | |
parent | 5221bd8c1099d0aa2c7317d9bf591fbe38c962c6 (diff) |
Core/Loot: Fix master loot
Players will be able to open the loot window and see the items in case of master loot.
If the item is under threshold FFA applies, else the item becomes locked.
Also fix an exploit related to master loot item give.
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 35 | ||||
-rw-r--r-- | src/server/game/Handlers/LootHandler.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Loot/LootMgr.h | 7 |
5 files changed, 61 insertions, 11 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6d65dff5c18..e78392e917f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8835,7 +8835,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type) switch (group->GetLootMethod()) { case MASTER_LOOT: - permission = MASTER_PERMISSION; + permission = group->GetLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION; break; case FREE_FOR_ALL: permission = ALL_PERMISSION; @@ -9013,7 +9013,7 @@ void Player::SendLoot(uint64 guid, LootType loot_type) switch (group->GetLootMethod()) { case MASTER_LOOT: - permission = MASTER_PERMISSION; + permission = group->GetLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION; break; case FREE_FOR_ALL: permission = ALL_PERMISSION; @@ -17794,9 +17794,9 @@ bool Player::isAllowedToLoot(const Creature* creature) switch (thisGroup->GetLootMethod()) { case FREE_FOR_ALL: + case MASTER_LOOT: return true; case ROUND_ROBIN: - case MASTER_LOOT: // may only loot if the player is the loot roundrobin player // or if there are free/quest/conditional item for the player if (loot->roundRobinPlayer == 0 || loot->roundRobinPlayer == GetGUID()) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 09b251984ee..abc4b19f3f2 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -890,12 +890,25 @@ void Group::SendLooter(Creature* creature, Player* groupLooter) WorldPacket data(SMSG_LOOT_LIST, (8+8)); data << uint64(creature->GetGUID()); - data << uint8(0); // unk1 if (groupLooter) - data.append(groupLooter->GetPackGUID()); + { + if (GetLootMethod() == MASTER_LOOT) + { + data.append(groupLooter->GetPackGUID()); + data << uint8(0); + } + else + { + data << uint8(0); + data.append(groupLooter->GetPackGUID()); + } + } else + { + data << uint8(0); data << uint8(0); + } BroadcastPacket(&data, false); } @@ -1196,10 +1209,26 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) } } -void Group::MasterLoot(Loot* /*loot*/, WorldObject* pLootedObject) +void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) { TC_LOG_DEBUG("network", "Group::MasterLoot (SMSG_LOOT_MASTER_LIST)"); + for (std::vector<LootItem>::iterator i = loot->items.begin(); i != loot->items.end(); ++i) + { + if (i->freeforall) + continue; + + i->is_blocked = !i->is_underthreshold; + } + + for (std::vector<LootItem>::iterator i = loot->quest_items.begin(); i != loot->quest_items.end(); ++i) + { + if (!i->follow_loot_rules) + continue; + + i->is_blocked = !i->is_underthreshold; + } + uint32 real_count = 0; WorldPacket data(SMSG_LOOT_MASTER_LIST, 1 + GetMembersCount() * 8); diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index f3a1803dfca..d1b60ed07fa 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -404,7 +404,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) recvData >> lootguid >> slotid >> target_playerguid; - if (!_player->GetGroup() || _player->GetGroup()->GetLooterGuid() != _player->GetGUID()) + if (!_player->GetGroup() || _player->GetGroup()->GetLooterGuid() != _player->GetGUID() || _player->GetGroup()->GetLootMethod() != MASTER_LOOT) { _player->SendLootRelease(GetPlayer()->GetLootGUID()); return; @@ -425,7 +425,6 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) return; } - Loot* loot = NULL; if (IS_CRE_OR_VEH_GUID(GetPlayer()->GetLootGUID())) diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index bb7f679b7cd..79056bcd750 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -953,6 +953,21 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) } break; } + case RESTRICTED_PERMISSION: + { + for (uint8 i = 0; i < l.items.size(); ++i) + { + if (!l.items[i].is_looted && !l.items[i].freeforall && l.items[i].conditions.empty() && l.items[i].AllowedForPlayer(lv.viewer)) + { + uint8 slot_type = l.items[i].is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT; + + b << uint8(i) << l.items[i]; + b << uint8(slot_type); + ++itemsShown; + } + } + break; + } default: return b; } @@ -977,6 +992,9 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) case MASTER_PERMISSION: b << uint8(LOOT_SLOT_TYPE_MASTER); break; + case RESTRICTED_PERMISSION: + b << (item.is_blocked ? uint8(LOOT_SLOT_TYPE_LOCKED) : uint8(slotType)); + break; case GROUP_PERMISSION: case ROUND_ROBIN_PERMISSION: if (!item.is_blocked) @@ -1033,6 +1051,9 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv) case MASTER_PERMISSION: b << uint8(LOOT_SLOT_TYPE_MASTER); break; + case RESTRICTED_PERMISSION: + b << (item.is_blocked ? uint8(LOOT_SLOT_TYPE_LOCKED) : uint8(slotType)); + break; case GROUP_PERMISSION: case ROUND_ROBIN_PERMISSION: if (!item.is_blocked) diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index 96af1919e90..fe21e4726ef 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -68,9 +68,10 @@ enum PermissionTypes ALL_PERMISSION = 0, GROUP_PERMISSION = 1, MASTER_PERMISSION = 2, - ROUND_ROBIN_PERMISSION = 3, - OWNER_PERMISSION = 4, - NONE_PERMISSION = 5 + RESTRICTED_PERMISSION = 3, + ROUND_ROBIN_PERMISSION = 4, + OWNER_PERMISSION = 5, + NONE_PERMISSION = 6 }; enum LootType |