mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 17:54:48 +01:00
Core/Loot: fix some issues with master loot and don't allow players to see soulbound recipes that they already learned in the loot window. (#23410)
(cherry picked from commit e6ad9b10cf)
This commit is contained in:
@@ -516,7 +516,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPackets::Loot::MasterLootItem
|
||||
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count);
|
||||
if (item.follow_loot_rules && !item.AllowedForPlayer(target))
|
||||
if (!item.AllowedForPlayer(target, true))
|
||||
msg = EQUIP_ERR_CANT_EQUIP_EVER;
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
@@ -526,8 +526,6 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPackets::Loot::MasterLootItem
|
||||
_player->SendLootError(req.Object, ObjectGuid::Empty, LOOT_ERROR_MASTER_INV_FULL);
|
||||
else
|
||||
_player->SendLootError(req.Object, ObjectGuid::Empty, LOOT_ERROR_MASTER_OTHER);
|
||||
|
||||
target->SendEquipError(msg, nullptr, nullptr, item.itemid);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ LootItem::LootItem(LootStoreItem const& li)
|
||||
}
|
||||
|
||||
// Basic checks for player/item compatibility - if false no chance to see the item in the loot
|
||||
bool LootItem::AllowedForPlayer(Player const* player) const
|
||||
bool LootItem::AllowedForPlayer(Player const* player, bool isGivenByMasterLooter) const
|
||||
{
|
||||
// DB conditions check
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(player), conditions))
|
||||
@@ -67,10 +67,6 @@ bool LootItem::AllowedForPlayer(Player const* player) const
|
||||
if (!pProto)
|
||||
return false;
|
||||
|
||||
// not show loot for players without profession or those who already know the recipe
|
||||
if ((pProto->GetFlags() & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) && (!player->HasSkill(pProto->GetRequiredSkill()) || player->HasSpell(pProto->Effects[1]->SpellID)))
|
||||
return false;
|
||||
|
||||
// not show loot for not own team
|
||||
if ((pProto->GetFlags2() & ITEM_FLAG2_FACTION_HORDE) && player->GetTeam() != HORDE)
|
||||
return false;
|
||||
@@ -78,6 +74,45 @@ bool LootItem::AllowedForPlayer(Player const* player) const
|
||||
if ((pProto->GetFlags2() & ITEM_FLAG2_FACTION_ALLIANCE) && player->GetTeam() != ALLIANCE)
|
||||
return false;
|
||||
|
||||
// Master looter can see certain items even if the character can't loot them
|
||||
if (!isGivenByMasterLooter && player->GetGroup() && player->GetGroup()->GetMasterLooterGuid() == player->GetGUID())
|
||||
{
|
||||
// check quest requirements
|
||||
if (!(pProto->FlagsCu & ITEM_FLAGS_CU_IGNORE_QUEST_STATUS) && (needs_quest || pProto->GetStartQuest()))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Don't allow loot for players without profession or those who already know the recipe
|
||||
if (pProto->GetFlags() & ITEM_FLAG_HIDE_UNUSABLE_RECIPE)
|
||||
{
|
||||
if (!player->HasSkill(pProto->GetRequiredSkill()))
|
||||
return false;
|
||||
|
||||
for (ItemEffectEntry const* itemEffect : pProto->Effects)
|
||||
{
|
||||
if (itemEffect->TriggerType != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
|
||||
continue;
|
||||
|
||||
if (player->HasSpell(itemEffect->SpellID))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Don't allow to loot soulbound recipes that the player has already learned
|
||||
if (pProto->GetClass() == ITEM_CLASS_RECIPE && pProto->GetBonding() == BIND_ON_ACQUIRE)
|
||||
{
|
||||
for (ItemEffectEntry const* itemEffect : pProto->Effects)
|
||||
{
|
||||
if (itemEffect->TriggerType != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
|
||||
continue;
|
||||
|
||||
if (player->HasSpell(itemEffect->SpellID))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// check quest requirements
|
||||
if (!(pProto->FlagsCu & ITEM_FLAGS_CU_IGNORE_QUEST_STATUS) && ((needs_quest || (pProto->GetStartQuest() && player->GetQuestStatus(pProto->GetStartQuest()) != QUEST_STATUS_NONE)) && !player->HasQuestForItem(itemid)))
|
||||
return false;
|
||||
|
||||
@@ -158,7 +158,7 @@ struct TC_GAME_API LootItem
|
||||
freeforall(false), is_underthreshold(false), is_counted(false), needs_quest(false), follow_loot_rules(false) { };
|
||||
|
||||
// Basic checks for player/item compatibility - if false no chance to see the item in the loot
|
||||
bool AllowedForPlayer(Player const* player) const;
|
||||
bool AllowedForPlayer(Player const* player, bool isGivenByMasterLooter = false) const;
|
||||
void AddAllowedLooter(Player const* player);
|
||||
GuidSet const& GetAllowedLooters() const { return allowedGUIDs; }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user