aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDehravor <dehravor@gmail.com>2014-03-11 19:06:42 +0100
committerDehravor <dehravor@gmail.com>2014-03-11 19:06:42 +0100
commit892d9eac79e94796e3b22e5be368063d59b20efc (patch)
treeca5ad782743f1c33a08bd6d61f0e2b81b1205e1b
parent5221bd8c1099d0aa2c7317d9bf591fbe38c962c6 (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.cpp6
-rw-r--r--src/server/game/Groups/Group.cpp35
-rw-r--r--src/server/game/Handlers/LootHandler.cpp3
-rw-r--r--src/server/game/Loot/LootMgr.cpp21
-rw-r--r--src/server/game/Loot/LootMgr.h7
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