aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-07 15:41:41 +0200
committerShauren <shauren.trinity@gmail.com>2025-05-07 15:41:41 +0200
commitb5c99939a82ed956cd185cd7a2ede838e2fdf23e (patch)
tree9bf5d22594213a9b14c8b2225c4b5e83247d5ff3 /src/server/game/Entities
parentf1854cdf83a525c50afc2f06ec5ce52da609cc6a (diff)
Core/Misc: Minor compile time improving changes
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Conversation/Conversation.cpp10
-rw-r--r--src/server/game/Entities/Conversation/Conversation.h3
-rw-r--r--src/server/game/Entities/Item/Item.cpp89
-rw-r--r--src/server/game/Entities/Item/Item.h11
-rw-r--r--src/server/game/Entities/Player/Player.cpp62
-rw-r--r--src/server/game/Entities/Player/Player.h3
6 files changed, 94 insertions, 84 deletions
diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp
index 60c03073507..e5e59f49542 100644
--- a/src/server/game/Entities/Conversation/Conversation.cpp
+++ b/src/server/game/Entities/Conversation/Conversation.cpp
@@ -209,12 +209,13 @@ void Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry,
lineField.Flags = line->Flags;
lineField.ChatType = line->ChatType;
+ std::array<Milliseconds, TOTAL_LOCALES>& startTimes = _lineStartTimes[line->Id];
for (LocaleConstant locale = LOCALE_enUS; locale < TOTAL_LOCALES; locale = LocaleConstant(locale + 1))
{
if (locale == LOCALE_none)
continue;
- _lineStartTimes[{ locale, line->Id }] = _lastLineEndTimes[locale];
+ startTimes[locale] = _lastLineEndTimes[locale];
if (locale == DEFAULT_LOCALE)
lineField.StartTime = _lastLineEndTimes[locale].count();
@@ -225,7 +226,7 @@ void Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry,
}
}
- _duration = Milliseconds(*std::max_element(_lastLineEndTimes.begin(), _lastLineEndTimes.end()));
+ _duration = *std::ranges::max_element(_lastLineEndTimes);
SetUpdateFieldValue(m_values.ModifyValue(&Conversation::m_conversationData).ModifyValue(&UF::ConversationData::LastLineEndTime), _duration.count());
SetUpdateFieldValue(m_values.ModifyValue(&Conversation::m_conversationData).ModifyValue(&UF::ConversationData::Lines), std::move(lines));
@@ -288,7 +289,10 @@ void Conversation::AddActor(int32 actorId, uint32 actorIdx, ConversationActorTyp
Milliseconds const* Conversation::GetLineStartTime(LocaleConstant locale, int32 lineId) const
{
- return Trinity::Containers::MapGetValuePtr(_lineStartTimes, { locale, lineId });
+ if (std::array<Milliseconds, TOTAL_LOCALES> const* durations = Trinity::Containers::MapGetValuePtr(_lineStartTimes, lineId))
+ return &(*durations)[locale];
+
+ return nullptr;
}
Milliseconds Conversation::GetLastLineEndTime(LocaleConstant locale) const
diff --git a/src/server/game/Entities/Conversation/Conversation.h b/src/server/game/Entities/Conversation/Conversation.h
index 4f85809b5ba..96cfd6dda77 100644
--- a/src/server/game/Entities/Conversation/Conversation.h
+++ b/src/server/game/Entities/Conversation/Conversation.h
@@ -20,7 +20,6 @@
#include "Object.h"
#include "GridObject.h"
-#include "Hash.h"
class ConversationAI;
class Unit;
@@ -100,7 +99,7 @@ class TC_GAME_API Conversation final : public WorldObject, public GridObject<Con
Milliseconds _duration;
uint32 _textureKitId;
- std::unordered_map<std::pair<LocaleConstant /*locale*/, int32 /*lineId*/>, Milliseconds /*startTime*/> _lineStartTimes;
+ std::unordered_map<int32 /*lineId*/, std::array<Milliseconds, TOTAL_LOCALES> /*startTime*/> _lineStartTimes;
std::array<Milliseconds /*endTime*/, TOTAL_LOCALES> _lastLineEndTimes;
std::unique_ptr<ConversationAI> _ai;
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index be3ef59c975..89a36b1d026 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -63,6 +63,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();
@@ -205,6 +212,34 @@ 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);
+
+ if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization())
+ player->ApplyEquipSpell(spellInfo, nullptr, false, false); // item set aura is not for current spec
+ else
+ {
+ 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)
@@ -1041,6 +1076,21 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie
return true;
}
+void Item::LoadAdditionalDataFromDB(Player const* owner, ItemAdditionalLoadInfo* addionalData)
+{
+ if (GetTemplate()->GetArtifactID() && addionalData->Artifact)
+ LoadArtifactData(owner, addionalData->Artifact->Xp, addionalData->Artifact->ArtifactAppearanceId,
+ addionalData->Artifact->ArtifactTierId, addionalData->Artifact->ArtifactPowers);
+
+ if (addionalData->AzeriteItem)
+ if (AzeriteItem* azeriteItem = ToAzeriteItem())
+ azeriteItem->LoadAzeriteItemData(owner, *addionalData->AzeriteItem);
+
+ if (addionalData->AzeriteEmpoweredItem)
+ if (AzeriteEmpoweredItem* azeriteEmpoweredItem = ToAzeriteEmpoweredItem())
+ azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(owner, *addionalData->AzeriteEmpoweredItem);
+}
+
void Item::LoadArtifactData(Player const* owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector<ArtifactPowerData>& powers)
{
for (uint8 i = 0; i <= artifactTier; ++i)
@@ -2597,20 +2647,25 @@ bool Item::IsArtifactDisabled() const
return true;
}
+int32 Item::GetArtifactPowerIndex(uint32 artifactPowerId) const
+{
+ return m_itemData->ArtifactPowers.FindIndexIf([artifactPowerId](UF::ArtifactPower const& artifactPower)
+ {
+ return uint32(artifactPower.ArtifactPowerID) == artifactPowerId;
+ });
+}
+
UF::ArtifactPower const* Item::GetArtifactPower(uint32 artifactPowerId) const
{
- auto indexItr = m_artifactPowerIdToIndex.find(artifactPowerId);
- if (indexItr != m_artifactPowerIdToIndex.end())
- return &m_itemData->ArtifactPowers[indexItr->second];
+ int32 index = GetArtifactPowerIndex(artifactPowerId);
+ if (index >= 0)
+ return &m_itemData->ArtifactPowers[index];
return nullptr;
}
void Item::AddArtifactPower(ArtifactPowerData const* artifactPower)
{
- uint16 index = uint16(m_artifactPowerIdToIndex.size());
- m_artifactPowerIdToIndex[artifactPower->ArtifactPowerId] = index;
-
UF::ArtifactPower& powerField = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ArtifactPowers));
powerField.ArtifactPowerID = artifactPower->ArtifactPowerId;
powerField.PurchasedRank = artifactPower->PurchasedRank;
@@ -2619,27 +2674,31 @@ void Item::AddArtifactPower(ArtifactPowerData const* artifactPower)
void Item::SetArtifactPower(uint16 artifactPowerId, uint8 purchasedRank, uint8 currentRankWithBonus)
{
- auto indexItr = m_artifactPowerIdToIndex.find(artifactPowerId);
- if (indexItr != m_artifactPowerIdToIndex.end())
+ int32 index = GetArtifactPowerIndex(artifactPowerId);
+ if (index >= 0)
{
SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData)
- .ModifyValue(&UF::ItemData::ArtifactPowers, indexItr->second)
+ .ModifyValue(&UF::ItemData::ArtifactPowers, index)
.ModifyValue(&UF::ArtifactPower::PurchasedRank), purchasedRank);
SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData)
- .ModifyValue(&UF::ItemData::ArtifactPowers, indexItr->second)
+ .ModifyValue(&UF::ItemData::ArtifactPowers, index)
.ModifyValue(&UF::ArtifactPower::CurrentRankWithBonus), currentRankWithBonus);
}
}
void Item::InitArtifactPowers(uint8 artifactId, uint8 artifactTier)
{
+ std::unordered_set<uint32> knownPowers;
+ for (UF::ArtifactPower const& power : m_itemData->ArtifactPowers)
+ knownPowers.insert(power.ArtifactPowerID);
+
for (ArtifactPowerEntry const* artifactPower : sDB2Manager.GetArtifactPowers(artifactId))
{
if (artifactPower->Tier != artifactTier)
continue;
- if (m_artifactPowerIdToIndex.find(artifactPower->ID) != m_artifactPowerIdToIndex.end())
+ if (knownPowers.contains(artifactPower->ID))
continue;
ArtifactPowerData powerData;
@@ -2714,20 +2773,20 @@ void Item::ApplyArtifactPowerEnchantmentBonuses(EnchantmentSlot slot, uint32 enc
break;
case ITEM_ENCHANTMENT_TYPE_ARTIFACT_POWER_BONUS_RANK_BY_ID:
{
- if (uint16 const* artifactPowerIndex = Trinity::Containers::MapGetValuePtr(m_artifactPowerIdToIndex, enchant->EffectArg[i]))
+ if (int32 artifactPowerIndex = GetArtifactPowerIndex(enchant->EffectArg[i]); artifactPowerIndex >= 0)
{
- uint8 newRank = m_itemData->ArtifactPowers[*artifactPowerIndex].CurrentRankWithBonus;
+ uint8 newRank = m_itemData->ArtifactPowers[artifactPowerIndex].CurrentRankWithBonus;
if (apply)
newRank += enchant->EffectPointsMin[i];
else
newRank -= enchant->EffectPointsMin[i];
SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData)
- .ModifyValue(&UF::ItemData::ArtifactPowers, *artifactPowerIndex)
+ .ModifyValue(&UF::ItemData::ArtifactPowers, artifactPowerIndex)
.ModifyValue(&UF::ArtifactPower::CurrentRankWithBonus), newRank);
if (IsEquipped())
- if (ArtifactPowerRankEntry const* artifactPowerRank = sDB2Manager.GetArtifactPowerRank(m_itemData->ArtifactPowers[*artifactPowerIndex].ArtifactPowerID, newRank ? newRank - 1 : 0))
+ if (ArtifactPowerRankEntry const* artifactPowerRank = sDB2Manager.GetArtifactPowerRank(m_itemData->ArtifactPowers[artifactPowerIndex].ArtifactPowerID, newRank ? newRank - 1 : 0))
owner->ApplyArtifactPowerRank(this, artifactPowerRank, newRank != 0);
}
break;
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 231af9bfb08..527f5e50068 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
@@ -222,6 +215,7 @@ class TC_GAME_API Item : public Object
bool IsBoundByEnchant() const;
virtual void SaveToDB(CharacterDatabaseTransaction trans);
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fields, uint32 entry);
+ void LoadAdditionalDataFromDB(Player const* owner, ItemAdditionalLoadInfo* addionalData);
void LoadArtifactData(Player const* owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector<ArtifactPowerData>& powers); // must be called after LoadFromDB to have gems (relics) initialized
void CheckArtifactRelicSlotUnlock(Player const* owner);
@@ -465,7 +459,8 @@ class TC_GAME_API Item : public Object
GuidSet allowedGUIDs;
ItemRandomBonusListId m_randomBonusListId; // store separately to easily find which bonus list is the one randomly given for stat rerolling
ObjectGuid m_childItem;
- std::unordered_map<uint32, uint16> m_artifactPowerIdToIndex;
std::array<uint32, MAX_ITEM_PROTO_SOCKETS> m_gemScalingLevels;
+
+ int32 GetArtifactPowerIndex(uint32 artifactPowerId) const;
};
#endif
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 206be44af06..5b5adc24b31 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -371,8 +371,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];
@@ -8481,31 +8481,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);
-
- if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != GetPrimarySpecialization())
- ApplyEquipSpell(spellInfo, nullptr, false, false); // item set aura is not for current spec
- else
- {
- 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::ApplyArtifactPowers(Item* item, bool apply)
@@ -19038,19 +19014,7 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti
if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
{
if (ItemAdditionalLoadInfo* addionalDataPtr = Trinity::Containers::MapGetValuePtr(additionalData, fields[0].GetUInt64()))
- {
- if (item->GetTemplate()->GetArtifactID() && addionalDataPtr->Artifact)
- item->LoadArtifactData(this, addionalDataPtr->Artifact->Xp, addionalDataPtr->Artifact->ArtifactAppearanceId,
- addionalDataPtr->Artifact->ArtifactTierId, addionalDataPtr->Artifact->ArtifactPowers);
-
- if (addionalDataPtr->AzeriteItem)
- if (AzeriteItem* azeriteItem = item->ToAzeriteItem())
- azeriteItem->LoadAzeriteItemData(this, *addionalDataPtr->AzeriteItem);
-
- if (addionalDataPtr->AzeriteEmpoweredItem)
- if (AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem())
- azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(this, *addionalDataPtr->AzeriteEmpoweredItem);
- }
+ item->LoadAdditionalDataFromDB(this, addionalDataPtr);
ObjectGuid bagGuid = fields[52].GetUInt64() ? ObjectGuid::Create<HighGuid::Item>(fields[52].GetUInt64()) : ObjectGuid::Empty;
uint8 slot = fields[53].GetUInt8();
@@ -19410,19 +19374,7 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint
}
if (addionalData)
- {
- if (item->GetTemplate()->GetArtifactID() && addionalData->Artifact)
- item->LoadArtifactData(player, addionalData->Artifact->Xp, addionalData->Artifact->ArtifactAppearanceId,
- addionalData->Artifact->ArtifactTierId, addionalData->Artifact->ArtifactPowers);
-
- if (addionalData->AzeriteItem)
- if (AzeriteItem* azeriteItem = item->ToAzeriteItem())
- azeriteItem->LoadAzeriteItemData(player, *addionalData->AzeriteItem);
-
- if (addionalData->AzeriteEmpoweredItem)
- if (AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem())
- azeriteEmpoweredItem->LoadAzeriteEmpoweredItemData(player, *addionalData->AzeriteEmpoweredItem);
- }
+ item->LoadAdditionalDataFromDB(player, addionalData);
if (mail)
mail->AddItem(itemGuid, itemEntry);
@@ -27363,7 +27315,7 @@ void Player::ResetTalentSpecialization()
LearnSpecializationSpells();
SendTalentsInfoData();
- UpdateItemSetAuras(false);
+ UpdateItemSetAuras(this, false);
}
TalentLearnResult Player::LearnPvpTalent(uint32 talentID, uint8 slot, int32* spellOnCooldown)
@@ -28575,7 +28527,7 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec)
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 69329a69358..67af3272b27 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2455,7 +2455,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 ApplyArtifactPowers(Item* item, bool apply);
void ApplyArtifactPowerRank(Item* artifact, ArtifactPowerRankEntry const* artifactPowerRank, bool apply);
void ApplyAzeritePowers(Item* item, bool apply);
@@ -3343,6 +3342,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