diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-11-22 23:54:14 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-22 23:54:14 +0100 |
commit | 7b11d17f4928d17637ad8182f9c632d90f873db4 (patch) | |
tree | 744ba213d7e1f05d30e14b4408ef4e846ead52bc | |
parent | f5ab650f9cdb73ca4fb9f7f81f39f8d752728eaa (diff) |
Core/Players: Load faction change items from db2 instead of db
-rw-r--r-- | sql/updates/world/master/2021_11_22_03_world.sql | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 1 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 3 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 13 |
5 files changed, 19 insertions, 26 deletions
diff --git a/sql/updates/world/master/2021_11_22_03_world.sql b/sql/updates/world/master/2021_11_22_03_world.sql new file mode 100644 index 00000000000..45d6fdf9fdf --- /dev/null +++ b/sql/updates/world/master/2021_11_22_03_world.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS `player_factionchange_items`; 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); } |