summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/Item/Item.h7
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h8
-rw-r--r--src/server/game/Entities/Player/PlayerUpdates.cpp17
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
4 files changed, 33 insertions, 1 deletions
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 51289594b9..9f467fad79 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -272,6 +272,13 @@ public:
[[nodiscard]] uint32 GetCount() const { return GetUInt32Value(ITEM_FIELD_STACK_COUNT); }
void SetCount(uint32 value) { SetUInt32Value(ITEM_FIELD_STACK_COUNT, value); }
[[nodiscard]] uint32 GetMaxStackCount() const { return GetTemplate()->GetMaxStackSize(); }
+ void GetOnEquipSpellIDs(std::vector<uint32>& spellEquipID) const
+ {
+ if (ItemTemplate const* proto = GetTemplate())
+ proto->GetOnEquipSpellIDs(spellEquipID);
+ else
+ spellEquipID.clear();
+ };
// Checks if this item has sockets, whether built-in or added by an upgrade.
[[nodiscard]] bool HasSocket() const;
[[nodiscard]] uint8 GetGemCountWithID(uint32 GemID) const;
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index b41616c112..b073cb1078 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -729,6 +729,14 @@ struct ItemTemplate
return (Stackable == 2147483647 || Stackable <= 0) ? uint32(0x7FFFFFFF - 1) : uint32(Stackable);
}
+ void GetOnEquipSpellIDs(std::vector<uint32>& spellEquipID) const
+ {
+ spellEquipID.clear();
+ for (auto const& spell : Spells)
+ if (spell.SpellId && spell.SpellTrigger == ITEM_SPELLTRIGGER_ON_EQUIP)
+ spellEquipID.push_back(spell.SpellId);
+ }
+
[[nodiscard]] float getDPS() const
{
if (Delay == 0)
diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp
index b0c7a85218..469131a65c 100644
--- a/src/server/game/Entities/Player/PlayerUpdates.cpp
+++ b/src/server/game/Entities/Player/PlayerUpdates.cpp
@@ -319,6 +319,23 @@ void Player::Update(uint32 p_time)
{
m_regenTimer += p_time;
RegenerateAll();
+
+ // Apply buffs from items with Apply on Equip trigger if they are not present.
+ for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
+ {
+ if (!m_items[i])
+ continue;
+
+ std::vector<uint32> spellIDs;
+ m_items[i]->GetOnEquipSpellIDs(spellIDs);
+ bool apply = false;
+ for (uint32 spellID : spellIDs)
+ if (!apply && !HasAura(spellID))
+ apply = true;
+
+ if (apply)
+ ApplyItemEquipSpell(m_items[i], true, false);
+ }
}
if (m_deathState == DeathState::JustDied)
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 5fb2c59256..615732f59b 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -14711,7 +14711,7 @@ void Unit::setDeathState(DeathState s, bool despawn)
}
else if (s == DeathState::JustRespawned)
{
- RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
}
}