aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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