diff options
| author | Andrius Peleckas <32540208+sanctum32@users.noreply.github.com> | 2021-08-26 16:41:17 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-26 15:41:17 +0200 |
| commit | dd14c630882355ad1d28112ea68935bf69d17e99 (patch) | |
| tree | a0ee9091baf45572ac3ba012d7645af90f4f474d /src | |
| parent | 9854a1fb91c3e7a5b843103e5a0c0ad55961017e (diff) | |
fix(Core/Vendors): incorrect check which allowed/disabled alliance players (#7507)
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 14 | ||||
| -rw-r--r-- | src/server/game/Loot/LootMgr.cpp | 12 |
3 files changed, 28 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index dbc0babe39..f193835bee 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -9888,8 +9888,10 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin return false; } - if (!IsGameMaster() && ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->Flags2 == ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && GetTeamId(true) == TEAM_HORDE))) + if (!IsGameMaster() && ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && GetTeamId(true) == TEAM_ALLIANCE) || (pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && GetTeamId(true) == TEAM_HORDE))) + { return false; + } Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR); if (!creature) diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index d7246790d7..2b799c5bb5 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -884,11 +884,15 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) + { GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); + } // Stop the npc if moving if (vendor->HasUnitState(UNIT_STATE_MOVING)) + { vendor->StopMoving(); + } SetCurrentVendor(vendorEntry); @@ -921,16 +925,22 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(item->item)) { if (!(itemTemplate->AllowableClass & _player->getClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP && !_player->IsGameMaster()) + { continue; + } // Only display items in vendor lists for the team the // player is on. If GM on, display all items. - if (!_player->IsGameMaster() && ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeamId() == TEAM_ALLIANCE) || (itemTemplate->Flags2 == ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeamId() == TEAM_HORDE))) + if (!_player->IsGameMaster() && ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeamId() == TEAM_ALLIANCE) || (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeamId() == TEAM_HORDE))) + { continue; + } // Items sold out are not displayed in list uint32 leftInStock = !item->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(item); if (!_player->IsGameMaster() && !leftInStock) + { continue; + } ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(vendor->GetEntry(), item->item); if (!sConditionMgr->IsObjectMeetToConditions(_player, vendor, conditions)) @@ -952,7 +962,9 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid, uint32 vendorEntry) data << uint32(item->ExtendedCost); if (++count >= MAX_VENDOR_ITEMS) + { break; + } } } } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 0b2fe036cc..6e120b862f 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -393,7 +393,9 @@ bool LootItem::AllowedForPlayer(Player const* player, bool isGivenByMasterLooter { ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid); if (!pProto) + { return false; + } bool isMasterLooter = player->GetGroup() && player->GetGroup()->GetMasterLooterGuid() == player->GetGUID(); @@ -414,10 +416,14 @@ bool LootItem::AllowedForPlayer(Player const* player, bool isGivenByMasterLooter // not show loot for not own team if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && player->GetTeamId(true) != TEAM_HORDE) + { return false; + } if ((pProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && player->GetTeamId(true) != TEAM_ALLIANCE) + { return false; + } // Master looter can see all items even if the character can't loot them if (!isGivenByMasterLooter && isMasterLooter && allowQuestLoot) @@ -427,15 +433,21 @@ bool LootItem::AllowedForPlayer(Player const* player, bool isGivenByMasterLooter // Don't allow loot for players without profession or those who already know the recipe if ((pProto->Flags & ITEM_FLAG_HIDE_UNUSABLE_RECIPE) && (!player->HasSkill(pProto->RequiredSkill) || player->HasSpell(pProto->Spells[1].SpellId))) + { return false; + } // Don't allow to loot soulbound recipes that the player has already learned if (pProto->Class == ITEM_CLASS_RECIPE && pProto->Bonding == BIND_WHEN_PICKED_UP && pProto->Spells[1].SpellId != 0 && player->HasSpell(pProto->Spells[1].SpellId)) + { return false; + } // check quest requirements if (!(pProto->FlagsCu & ITEM_FLAGS_CU_IGNORE_QUEST_STATUS) && ((needs_quest || (pProto->StartQuest && player->GetQuestStatus(pProto->StartQuest) != QUEST_STATUS_NONE)) && !player->HasQuestForItem(itemid))) + { return false; + } return true; } |
