diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/Item.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 1 | ||||
| -rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 8 |
4 files changed, 20 insertions, 10 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index d7052a98630..be53397f52e 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1127,9 +1127,17 @@ void Item::SetGem(uint16 slot, ItemDynamicFieldGems const* gem) SetUpdateFieldValue(gemField.ModifyValue(&UF::SocketedGem::BonusListIDs, i), gem->BonusListIDs[i]); } -bool Item::GemsFitSockets() const +bool Item::HasAllSocketsFilledWithMatchingColors() const { - uint32 gemSlot = 0; + uint8 gemSlots = 0; + for (uint8 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i) + if (GetTemplate()->GetSocketColor(i) != SOCKET_COLOR_NONE) + ++gemSlots; + + if (gemSlots > m_itemData->Gems.size()) + return false; + + uint8 gemSlot = 0; for (UF::SocketedGem const& gemData : m_itemData->Gems) { SocketColor color = GetTemplate()->GetSocketColor(gemSlot); @@ -1137,19 +1145,20 @@ bool Item::GemsFitSockets() const if (!color) // no socket slot continue; - uint32 GemColor = 0; + uint32 gemColor = 0; ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemData.ItemID); if (gemProto) { GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GetGemProperties()); if (gemProperty) - GemColor = gemProperty->Type; + gemColor = gemProperty->Type; } - if (!(GemColor & SocketColorToGemTypeMask[color])) // bad gem color on this socket + if (!(gemColor & SocketColorToGemTypeMask[color])) // bad gem color on this socket return false; } + return true; } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 0e247129390..3ddfc5a2c78 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -200,7 +200,7 @@ class TC_GAME_API Item : public Object bool IsFitToSpellRequirements(SpellInfo const* spellInfo) const; bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const; - bool GemsFitSockets() const; + bool HasAllSocketsFilledWithMatchingColors() const; uint32 GetCount() const { return m_itemData->StackCount; } void SetCount(uint32 value); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 23357f816bf..6f824208833 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -343,6 +343,7 @@ enum BAG_FAMILY_MASK enum SocketColor { + SOCKET_COLOR_NONE = 0x000000, SOCKET_COLOR_META = 0x000001, SOCKET_COLOR_RED = 0x000002, SOCKET_COLOR_YELLOW = 0x000004, diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 60481b71068..be4f8d813ca 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1054,7 +1054,7 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) } } - bool SocketBonusActivated = itemTarget->GemsFitSockets(); //save state of socketbonus + bool hadSocketBonusActive = itemTarget->HasAllSocketsFilledWithMatchingColors(); //save state of socketbonus _player->ToggleMetaGemsActive(slot, false); //turn off all metagems (except for the target item) //if a meta gem is being equipped, all information has to be written to the item before testing if the conditions for the gem are met @@ -1080,11 +1080,11 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) for (uint32 enchantmentSlot = SOCK_ENCHANTMENT_SLOT; enchantmentSlot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchantmentSlot) _player->ApplyEnchantment(itemTarget, EnchantmentSlot(enchantmentSlot), true); - bool SocketBonusToBeActivated = itemTarget->GemsFitSockets();//current socketbonus state - if (SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change... + bool socketBonusToBeActivated = itemTarget->HasAllSocketsFilledWithMatchingColors();//current socketbonus state + if (hadSocketBonusActive != socketBonusToBeActivated) //if there was a change... { _player->ApplyEnchantment(itemTarget, BONUS_ENCHANTMENT_SLOT, false); - itemTarget->SetEnchantment(BONUS_ENCHANTMENT_SLOT, (SocketBonusToBeActivated ? itemTarget->GetTemplate()->GetSocketBonus() : 0), 0, 0, _player->GetGUID()); + itemTarget->SetEnchantment(BONUS_ENCHANTMENT_SLOT, (socketBonusToBeActivated ? itemTarget->GetTemplate()->GetSocketBonus() : 0), 0, 0, _player->GetGUID()); _player->ApplyEnchantment(itemTarget, BONUS_ENCHANTMENT_SLOT, true); //it is not displayed, client has an inbuilt system to determine if the bonus is activated } |
