aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2025-05-11 12:00:43 +0200
committerOvahlord <dreadkiller@gmx.de>2025-05-11 12:00:43 +0200
commitd01f12cc91d3443cb217ba7db0c4f42263dfc53c (patch)
tree851f01dbfb5c9a65c11ec12c48e54600ee23e58d /src
parentfdedb23b56b4d9bcc5f6930ea2110e963bf902f6 (diff)
Core/Misc: added missing changes for 412c5416f9406548c5b59569fbbcf47438f72f07
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/Item.cpp29
-rw-r--r--src/server/game/Entities/Item/Item.h7
-rw-r--r--src/server/game/Entities/Player/Player.cpp26
-rw-r--r--src/server/game/Entities/Player/Player.h3
4 files changed, 35 insertions, 30 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 7c6f7de62ef..6927183dcab 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -54,6 +54,13 @@ Item* NewItemOrBag(ItemTemplate const* proto)
return new Item();
}
+struct ItemSetEffect
+{
+ uint32 ItemSetID;
+ std::unordered_set<Item const*> EquippedItems;
+ std::unordered_set<ItemSetSpellEntry const*> SetBonuses;
+};
+
void AddItemsSetItem(Player* player, Item const* item)
{
ItemTemplate const* proto = item->GetTemplate();
@@ -195,6 +202,28 @@ void RemoveItemsSetItem(Player* player, Item const* item)
}
}
+void UpdateItemSetAuras(Player* player, bool formChange)
+{
+ // item set bonuses not dependent from item broken state
+ for (ItemSetEffect* eff : player->ItemSetEff)
+ {
+ if (!eff)
+ continue;
+
+ for (ItemSetSpellEntry const* itemSetSpell : eff->SetBonuses)
+ {
+ SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE);
+ player->ApplyEquipSpell(spellInfo, nullptr, false, formChange); // remove spells that not fit to form - removal is skipped if shapeshift condition is satisfied
+ player->ApplyEquipSpell(spellInfo, nullptr, true, formChange); // add spells that fit form but not active
+ }
+ }
+}
+
+void DeleteItemSetEffects(ItemSetEffect* itemSetEffect)
+{
+ delete itemSetEffect;
+}
+
bool ItemCanGoIntoBag(ItemTemplate const* pProto, ItemTemplate const* pBagProto)
{
if (!pProto || !pBagProto)
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 6ed742ef011..3554689010d 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -37,13 +37,6 @@ namespace WorldPackets
}
}
-struct ItemSetEffect
-{
- uint32 ItemSetID;
- std::unordered_set<Item const*> EquippedItems;
- std::unordered_set<ItemSetSpellEntry const*> SetBonuses;
-};
-
#define MAX_GEM_SOCKETS MAX_ITEM_PROTO_SOCKETS// (BONUS_ENCHANTMENT_SLOT-SOCK_ENCHANTMENT_SLOT) and item proto size, equal value expected
#define MAX_ENCHANTMENT_OFFSET 3
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index ca4686f5764..4aaed6dc52b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -363,8 +363,8 @@ Player::~Player()
for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
- for (size_t x = 0; x < ItemSetEff.size(); x++)
- delete ItemSetEff[x];
+ for (ItemSetEffect* itemSetEff : ItemSetEff)
+ DeleteItemSetEffects(itemSetEff);
for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i)
delete _voidStorageItems[i];
@@ -7818,25 +7818,7 @@ void Player::UpdateEquipSpellsAtFormChange()
}
}
- UpdateItemSetAuras(true);
-}
-
-void Player::UpdateItemSetAuras(bool formChange /*= false*/)
-{
- // item set bonuses not dependent from item broken state
- for (size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
- {
- ItemSetEffect* eff = ItemSetEff[setindex];
- if (!eff)
- continue;
-
- for (ItemSetSpellEntry const* itemSetSpell : eff->SetBonuses)
- {
- SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE);
- ApplyEquipSpell(spellInfo, nullptr, false, formChange); // remove spells that not fit to form - removal is skipped if shapeshift condition is satisfied
- ApplyEquipSpell(spellInfo, nullptr, true, formChange); // add spells that fit form but not active
- }
- }
+ UpdateItemSetAuras(this, true);
}
void Player::CastItemCombatSpell(DamageInfo const& damageInfo)
@@ -27922,7 +27904,7 @@ void Player::SetActiveTalentGroup(uint8 group, bool withUpdate /*= true*/, bool
SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
SetPower(pw, 0);
- UpdateItemSetAuras(false);
+ UpdateItemSetAuras(this, false);
// update visible transmog
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
if (Item* equippedItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 32ba39828c5..1c8c9c7b474 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2320,7 +2320,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void ApplyItemEquipSpell(Item* item, bool apply, bool formChange = false);
void ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply, bool formChange = false);
void UpdateEquipSpellsAtFormChange();
- void UpdateItemSetAuras(bool formChange = false);
void CastItemCombatSpell(DamageInfo const& damageInfo);
void CastItemCombatSpell(DamageInfo const& damageInfo, Item* item, ItemTemplate const* proto);
@@ -3191,6 +3190,8 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
TC_GAME_API void AddItemsSetItem(Player* player, Item const* item);
TC_GAME_API void RemoveItemsSetItem(Player* player, Item const* item);
+TC_GAME_API void UpdateItemSetAuras(Player* player, bool formChange);
+TC_GAME_API void DeleteItemSetEffects(ItemSetEffect* itemSetEffect);
// Transforms a container of customization choices with continuous storage into iterator pair that does not depend on container
// and doesn't force implementations in header files