aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h1
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp27
-rw-r--r--src/server/game/Globals/ObjectMgr.h3
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp13
4 files changed, 18 insertions, 26 deletions
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index ad18054120b..a40a004f9e2 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -747,6 +747,7 @@ struct TC_GAME_API ItemTemplate
uint32 GetFlags2() const { return ExtendedData->Flags[1]; }
uint32 GetFlags3() const { return ExtendedData->Flags[2]; }
uint32 GetFlags4() const { return ExtendedData->Flags[3]; }
+ uint32 GetOtherFactionItemId() const { return ExtendedData->FactionRelated; }
float GetPriceRandomValue() const { return ExtendedData->PriceRandomValue; }
float GetPriceVariance() const { return ExtendedData->PriceVariance; }
uint32 GetBuyCount() const { return std::max<uint32>(ExtendedData->VendorStackCount, 1u); }
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index b96aa7a0650..b921933cfdf 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -9714,34 +9714,21 @@ void ObjectMgr::LoadFactionChangeAchievements()
void ObjectMgr::LoadFactionChangeItems()
{
uint32 oldMSTime = getMSTime();
-
- QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
-
- if (!result)
- {
- TC_LOG_INFO("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` is empty.");
- return;
- }
-
uint32 count = 0;
- do
+ for (std::pair<uint32 const, ItemTemplate> const& itemPair : _itemTemplateStore)
{
- Field* fields = result->Fetch();
+ if (!itemPair.second.GetOtherFactionItemId())
+ continue;
- uint32 alliance = fields[0].GetUInt32();
- uint32 horde = fields[1].GetUInt32();
+ if (itemPair.second.GetFlags2() & ITEM_FLAG2_FACTION_HORDE)
+ FactionChangeItemsHordeToAlliance[itemPair.first] = itemPair.second.GetOtherFactionItemId();
- if (!GetItemTemplate(alliance))
- TC_LOG_ERROR("sql.sql", "Item %u (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
- else if (!GetItemTemplate(horde))
- TC_LOG_ERROR("sql.sql", "Item %u (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
- else
- FactionChangeItems[alliance] = horde;
+ if (itemPair.second.GetFlags2() & ITEM_FLAG2_FACTION_ALLIANCE)
+ FactionChangeItemsAllianceToHorde[itemPair.first] = itemPair.second.GetOtherFactionItemId();
++count;
}
- while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded %u faction change item pairs in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 58f9bc71a53..45c1fb3d83b 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1650,7 +1650,8 @@ class TC_GAME_API ObjectMgr
}
CharacterConversionMap FactionChangeAchievements;
- CharacterConversionMap FactionChangeItems;
+ CharacterConversionMap FactionChangeItemsAllianceToHorde;
+ CharacterConversionMap FactionChangeItemsHordeToAlliance;
CharacterConversionMap FactionChangeQuests;
CharacterConversionMap FactionChangeReputation;
CharacterConversionMap FactionChangeSpells;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index fd0b4c0a07c..7006ff0d2cc 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -2337,14 +2337,17 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa
}
// Item conversion
- for (std::map<uint32, uint32>::const_iterator it = sObjectMgr->FactionChangeItems.begin(); it != sObjectMgr->FactionChangeItems.end(); ++it)
+ ObjectMgr::CharacterConversionMap const& itemConversionMap = newTeamId == TEAM_ALLIANCE
+ ? sObjectMgr->FactionChangeItemsHordeToAlliance
+ : sObjectMgr->FactionChangeItemsAllianceToHorde;
+ for (std::map<uint32, uint32>::const_iterator it = itemConversionMap.begin(); it != itemConversionMap.end(); ++it)
{
- uint32 item_alliance = it->first;
- uint32 item_horde = it->second;
+ uint32 oldItemId = it->first;
+ uint32 newItemId = it->second;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE);
- stmt->setUInt32(0, (newTeamId == TEAM_ALLIANCE ? item_alliance : item_horde));
- stmt->setUInt32(1, (newTeamId == TEAM_ALLIANCE ? item_horde : item_alliance));
+ stmt->setUInt32(0, newItemId);
+ stmt->setUInt32(1, oldItemId);
stmt->setUInt64(2, lowGuid);
trans->Append(stmt);
}