[Code] EvolvingItemsManager Global to Singleton Cleanup (#4929)

Co-authored-by: Chris Miles <akkadius1@gmail.com>
This commit is contained in:
Alex King 2025-06-25 15:26:29 -04:00 committed by GitHub
parent 1e6a4dac78
commit 128732e05d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 51 additions and 47 deletions

View File

@ -40,7 +40,6 @@
WorldContentService content_service; WorldContentService content_service;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager;
void ExportSpells(SharedDatabase *db); void ExportSpells(SharedDatabase *db);
void ExportSkillCaps(SharedDatabase *db); void ExportSkillCaps(SharedDatabase *db);

View File

@ -34,7 +34,6 @@
WorldContentService content_service; WorldContentService content_service;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager;
void ImportSpells(SharedDatabase *db); void ImportSpells(SharedDatabase *db);
void ImportSkillCaps(SharedDatabase *db); void ImportSkillCaps(SharedDatabase *db);

View File

@ -21,8 +21,8 @@ void EvolvingItemsManager::LoadEvolvingItems() const
results.begin(), results.begin(),
results.end(), results.end(),
std::inserter( std::inserter(
evolving_items_manager.GetEvolvingItemsCache(), EvolvingItemsManager::Instance()->GetEvolvingItemsCache(),
evolving_items_manager.GetEvolvingItemsCache().end() EvolvingItemsManager::Instance()->GetEvolvingItemsCache().end()
), ),
[](const ItemsEvolvingDetailsRepository::ItemsEvolvingDetails &x) { [](const ItemsEvolvingDetailsRepository::ItemsEvolvingDetails &x) {
return std::make_pair(x.item_id, x); return std::make_pair(x.item_id, x);
@ -42,13 +42,13 @@ void EvolvingItemsManager::SetContentDatabase(Database *db)
double EvolvingItemsManager::CalculateProgression(const uint64 current_amount, const uint32 item_id) double EvolvingItemsManager::CalculateProgression(const uint64 current_amount, const uint32 item_id)
{ {
if (!evolving_items_manager.GetEvolvingItemsCache().contains(item_id)) { if (!EvolvingItemsManager::Instance()->GetEvolvingItemsCache().contains(item_id)) {
return 0; return 0;
} }
return evolving_items_manager.GetEvolvingItemsCache().at(item_id).required_amount > 0 return EvolvingItemsManager::Instance()->GetEvolvingItemsCache().at(item_id).required_amount > 0
? static_cast<double>(current_amount) ? static_cast<double>(current_amount)
/ static_cast<double>(evolving_items_manager.GetEvolvingItemsCache().at(item_id).required_amount) * 100 / static_cast<double>(EvolvingItemsManager::Instance()->GetEvolvingItemsCache().at(item_id).required_amount) * 100
: 0; : 0;
} }
@ -73,7 +73,7 @@ void EvolvingItemsManager::DoLootChecks(const uint32 char_id, const uint16 slot_
e.character_id = char_id; e.character_id = char_id;
e.item_id = inst.GetID(); e.item_id = inst.GetID();
e.equipped = inst.GetEvolveEquipped(); e.equipped = inst.GetEvolveEquipped();
e.final_item_id = evolving_items_manager.GetFinalItemID(inst); e.final_item_id = EvolvingItemsManager::Instance()->GetFinalItemID(inst);
auto r = CharacterEvolvingItemsRepository::InsertOne(*m_db, e); auto r = CharacterEvolvingItemsRepository::InsertOne(*m_db, e);
e.id = r.id; e.id = r.id;
@ -96,20 +96,20 @@ uint32 EvolvingItemsManager::GetFinalItemID(const EQ::ItemInstance &inst) const
} }
const auto start_iterator = std::ranges::find_if( const auto start_iterator = std::ranges::find_if(
evolving_items_manager.GetEvolvingItemsCache().cbegin(), EvolvingItemsManager::Instance()->GetEvolvingItemsCache().cbegin(),
evolving_items_manager.GetEvolvingItemsCache().cend(), EvolvingItemsManager::Instance()->GetEvolvingItemsCache().cend(),
[&](const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a) { [&](const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a) {
return a.second.item_evo_id == inst.GetEvolveLoreID(); return a.second.item_evo_id == inst.GetEvolveLoreID();
} }
); );
if (start_iterator == std::end(evolving_items_manager.GetEvolvingItemsCache())) { if (start_iterator == std::end(EvolvingItemsManager::Instance()->GetEvolvingItemsCache())) {
return 0; return 0;
} }
const auto final_id = std::ranges::max_element( const auto final_id = std::ranges::max_element(
start_iterator, start_iterator,
evolving_items_manager.GetEvolvingItemsCache().cend(), EvolvingItemsManager::Instance()->GetEvolvingItemsCache().cend(),
[&]( [&](
const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a, const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a,
const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &b const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &b
@ -131,15 +131,15 @@ uint32 EvolvingItemsManager::GetNextEvolveItemID(const EQ::ItemInstance &inst) c
int8 const current_level = inst.GetEvolveLvl(); int8 const current_level = inst.GetEvolveLvl();
const auto iterator = std::ranges::find_if( const auto iterator = std::ranges::find_if(
evolving_items_manager.GetEvolvingItemsCache().cbegin(), EvolvingItemsManager::Instance()->GetEvolvingItemsCache().cbegin(),
evolving_items_manager.GetEvolvingItemsCache().cend(), EvolvingItemsManager::Instance()->GetEvolvingItemsCache().cend(),
[&](const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a) { [&](const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a) {
return a.second.item_evo_id == inst.GetEvolveLoreID() && return a.second.item_evo_id == inst.GetEvolveLoreID() &&
a.second.item_evolve_level == current_level + 1; a.second.item_evolve_level == current_level + 1;
} }
); );
if (iterator == std::end(evolving_items_manager.GetEvolvingItemsCache())) { if (iterator == std::end(EvolvingItemsManager::Instance()->GetEvolvingItemsCache())) {
return 0; return 0;
} }
@ -255,8 +255,8 @@ EvolveTransfer EvolvingItemsManager::DetermineTransferResults(
return ets; return ets;
} }
auto evolving_details_inst_from = evolving_items_manager.GetEvolveItemDetails(inst_from.GetID()); auto evolving_details_inst_from = EvolvingItemsManager::Instance()->GetEvolveItemDetails(inst_from.GetID());
auto evolving_details_inst_to = evolving_items_manager.GetEvolveItemDetails(inst_to.GetID()); auto evolving_details_inst_to = EvolvingItemsManager::Instance()->GetEvolveItemDetails(inst_to.GetID());
if (!evolving_details_inst_from.id || !evolving_details_inst_to.id) { if (!evolving_details_inst_from.id || !evolving_details_inst_to.id) {
return ets; return ets;
@ -272,10 +272,10 @@ EvolveTransfer EvolvingItemsManager::DetermineTransferResults(
compatibility = 30; compatibility = 30;
} }
xp = evolving_items_manager.GetTotalEarnedXP(inst_from) * compatibility / 100; xp = EvolvingItemsManager::Instance()->GetTotalEarnedXP(inst_from) * compatibility / 100;
auto results = evolving_items_manager.GetNextItemByXP(inst_to, xp); auto results = EvolvingItemsManager::Instance()->GetNextItemByXP(inst_to, xp);
ets.item_from_id = evolving_items_manager.GetFirstItemInLoreGroup(inst_from.GetEvolveLoreID()); ets.item_from_id = EvolvingItemsManager::Instance()->GetFirstItemInLoreGroup(inst_from.GetEvolveLoreID());
ets.item_from_current_amount = results.from_current_amount; ets.item_from_current_amount = results.from_current_amount;
ets.item_to_id = results.new_item_id; ets.item_to_id = results.new_item_id;
ets.item_to_current_amount = results.new_current_amount; ets.item_to_current_amount = results.new_current_amount;

View File

@ -56,12 +56,15 @@ public:
std::map<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails>& GetEvolvingItemsCache() { return m_evolving_items_cache; } std::map<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails>& GetEvolvingItemsCache() { return m_evolving_items_cache; }
std::vector<ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> GetEvolveIDItems(uint32 evolve_id); std::vector<ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> GetEvolveIDItems(uint32 evolve_id);
static EvolvingItemsManager* Instance()
{
static EvolvingItemsManager instance;
return &instance;
}
private: private:
std::map<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> m_evolving_items_cache; std::map<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> m_evolving_items_cache;
Database * m_db; Database * m_db;
Database * m_content_db; Database * m_content_db;
}; };
extern EvolvingItemsManager evolving_items_manager;
#endif //EVOLVING_H #endif //EVOLVING_H

View File

@ -335,7 +335,7 @@ namespace EQ
void SetEvolveAddToCurrentAmount(const uint64 in) const { m_evolving_details.current_amount += in; } void SetEvolveAddToCurrentAmount(const uint64 in) const { m_evolving_details.current_amount += in; }
void SetEvolveFinalItemID(const uint32 in) const { m_evolving_details.final_item_id = in; } void SetEvolveFinalItemID(const uint32 in) const { m_evolving_details.final_item_id = in; }
bool TransferOwnership(Database& db, const uint32 to_char_id) const; bool TransferOwnership(Database& db, const uint32 to_char_id) const;
void CalculateEvolveProgression() const { m_evolving_details.progression = evolving_items_manager.CalculateProgression(GetEvolveCurrentAmount(), GetID()); } void CalculateEvolveProgression() const { m_evolving_details.progression = EvolvingItemsManager::Instance()->CalculateProgression(GetEvolveCurrentAmount(), GetID()); }
protected: protected:
////////////////////////// //////////////////////////

View File

@ -824,7 +824,7 @@ bool SharedDatabase::GetInventory(Client *c)
e.character_id = char_id; e.character_id = char_id;
e.item_id = item_id; e.item_id = item_id;
e.equipped = inst->GetEvolveEquipped(); e.equipped = inst->GetEvolveEquipped();
e.final_item_id = evolving_items_manager.GetFinalItemID(*inst); e.final_item_id = EvolvingItemsManager::Instance()->GetFinalItemID(*inst);
auto r = CharacterEvolvingItemsRepository::InsertOne(*this, e); auto r = CharacterEvolvingItemsRepository::InsertOne(*this, e);
e.id = r.id; e.id = r.id;

View File

@ -37,7 +37,6 @@
WorldContentService content_service; WorldContentService content_service;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager;
#ifdef _WINDOWS #ifdef _WINDOWS
#include <direct.h> #include <direct.h>

View File

@ -110,7 +110,6 @@ const WorldConfig *Config;
WorldContentService content_service; WorldContentService content_service;
WebInterfaceList web_interface; WebInterfaceList web_interface;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
EvolvingItemsManager evolving_items_manager;
void CatchSignal(int sig_num); void CatchSignal(int sig_num);

View File

@ -92,7 +92,7 @@ void Client::ProcessEvolvingItem(const uint64 exp, const Mob *mob)
continue; continue;
} }
if (!evolving_items_manager.GetEvolvingItemsCache().contains(inst->GetID())) { if (!EvolvingItemsManager::Instance()->GetEvolvingItemsCache().contains(inst->GetID())) {
LogEvolveItem( LogEvolveItem(
"Character ID {} has an evolving item that is not found in the db. Please check your " "Character ID {} has an evolving item that is not found in the db. Please check your "
"items_evolving_details table for item id {}", "items_evolving_details table for item id {}",
@ -102,8 +102,8 @@ void Client::ProcessEvolvingItem(const uint64 exp, const Mob *mob)
continue; continue;
} }
auto const type = evolving_items_manager.GetEvolvingItemsCache().at(inst->GetID()).type; auto const type = EvolvingItemsManager::Instance()->GetEvolvingItemsCache().at(inst->GetID()).type;
auto const sub_type = evolving_items_manager.GetEvolvingItemsCache().at(inst->GetID()).sub_type; auto const sub_type = EvolvingItemsManager::Instance()->GetEvolvingItemsCache().at(inst->GetID()).sub_type;
LogEvolveItemDetail( LogEvolveItemDetail(
"CharacterID <green>[{}] item id <green>[{}] type {} sub_type {} is Evolving. Continue processing...", "CharacterID <green>[{}] item id <green>[{}] type {} sub_type {} is Evolving. Continue processing...",
@ -301,7 +301,7 @@ void Client::DoEvolveItemDisplayFinalResult(const EQApplicationPacket *app)
"Character ID <green>[{}] requested to view final evolve item id <yellow>[{}] for evolve item id <yellow>[{}]", "Character ID <green>[{}] requested to view final evolve item id <yellow>[{}] for evolve item id <yellow>[{}]",
CharacterID(), CharacterID(),
item_id, item_id,
evolving_items_manager.GetFirstItemInLoreGroupByItemID(item_id) EvolvingItemsManager::Instance()->GetFirstItemInLoreGroupByItemID(item_id)
); );
inst->SetEvolveProgression(100); inst->SetEvolveProgression(100);
@ -322,7 +322,7 @@ bool Client::DoEvolveCheckProgression(EQ::ItemInstance &inst)
return false; return false;
} }
const auto new_item_id = evolving_items_manager.GetNextEvolveItemID(inst); const auto new_item_id = EvolvingItemsManager::Instance()->GetNextEvolveItemID(inst);
if (!new_item_id) { if (!new_item_id) {
return false; return false;
} }
@ -387,12 +387,12 @@ bool Client::DoEvolveCheckProgression(EQ::ItemInstance &inst)
PlayerEvent::EvolveItem e{}; PlayerEvent::EvolveItem e{};
RemoveItemBySerialNumber(inst.GetSerialNumber()); RemoveItemBySerialNumber(inst.GetSerialNumber());
evolving_items_manager.LoadPlayerEvent(inst, e); EvolvingItemsManager::Instance()->LoadPlayerEvent(inst, e);
e.status = "Evolved Item due to obtaining progression - Old Evolve Item removed from inventory."; e.status = "Evolved Item due to obtaining progression - Old Evolve Item removed from inventory.";
RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e); RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e);
PushItemOnCursor(*new_inst, true); PushItemOnCursor(*new_inst, true);
evolving_items_manager.LoadPlayerEvent(*new_inst, e); EvolvingItemsManager::Instance()->LoadPlayerEvent(*new_inst, e);
e.status = "Evolved Item due to obtaining progression - New Evolve Item placed in inventory."; e.status = "Evolved Item due to obtaining progression - New Evolve Item placed in inventory.";
RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e); RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e);
@ -437,7 +437,7 @@ void Client::SendEvolveXPWindowDetails(const EQApplicationPacket *app)
return; return;
} }
const auto results = evolving_items_manager.DetermineTransferResults(*inst_from, *inst_to); const auto results = EvolvingItemsManager::Instance()->DetermineTransferResults(*inst_from, *inst_to);
if (!results.item_from_id || !results.item_to_id) { if (!results.item_from_id || !results.item_to_id) {
SendEvolveTransferResults(*inst_from, *inst_to, *inst_from, *inst_to, 0, 0); SendEvolveTransferResults(*inst_from, *inst_to, *inst_from, *inst_to, 0, 0);
@ -482,7 +482,7 @@ void Client::DoEvolveTransferXP(const EQApplicationPacket *app)
return; return;
} }
const auto results = evolving_items_manager.DetermineTransferResults(*inst_from, *inst_to); const auto results = EvolvingItemsManager::Instance()->DetermineTransferResults(*inst_from, *inst_to);
if (!results.item_from_id || !results.item_to_id) { if (!results.item_from_id || !results.item_to_id) {
Message(Chat::Red, "Transfer Failed. Incompatible Items."); Message(Chat::Red, "Transfer Failed. Incompatible Items.");
@ -507,22 +507,22 @@ void Client::DoEvolveTransferXP(const EQApplicationPacket *app)
PlayerEvent::EvolveItem e{}; PlayerEvent::EvolveItem e{};
RemoveItemBySerialNumber(inst_from->GetSerialNumber()); RemoveItemBySerialNumber(inst_from->GetSerialNumber());
evolving_items_manager.LoadPlayerEvent(*inst_from, e); EvolvingItemsManager::Instance()->LoadPlayerEvent(*inst_from, e);
e.status = "Transfer XP - Original FROM Evolve Item removed from inventory."; e.status = "Transfer XP - Original FROM Evolve Item removed from inventory.";
RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e); RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e);
PushItemOnCursor(*inst_from_new, true); PushItemOnCursor(*inst_from_new, true);
evolving_items_manager.LoadPlayerEvent(*inst_from_new, e); EvolvingItemsManager::Instance()->LoadPlayerEvent(*inst_from_new, e);
e.status = "Transfer XP - Updated FROM item placed in inventory."; e.status = "Transfer XP - Updated FROM item placed in inventory.";
RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e); RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e);
RemoveItemBySerialNumber(inst_to->GetSerialNumber()); RemoveItemBySerialNumber(inst_to->GetSerialNumber());
evolving_items_manager.LoadPlayerEvent(*inst_to, e); EvolvingItemsManager::Instance()->LoadPlayerEvent(*inst_to, e);
e.status = "Transfer XP - Original TO Evolve Item removed from inventory."; e.status = "Transfer XP - Original TO Evolve Item removed from inventory.";
RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e); RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e);
PushItemOnCursor(*inst_to_new, true); PushItemOnCursor(*inst_to_new, true);
evolving_items_manager.LoadPlayerEvent(*inst_to_new, e); EvolvingItemsManager::Instance()->LoadPlayerEvent(*inst_to_new, e);
e.status = "Transfer XP - Updated TO Evolve item placed in inventory."; e.status = "Transfer XP - Updated TO Evolve item placed in inventory.";
RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e); RecordPlayerEventLog(PlayerEvent::EVOLVE_ITEM, e);

View File

@ -33,7 +33,7 @@ void command_evolvingitems(Client *c, const Seperator *sep)
continue; continue;
} }
auto item = evolving_items_manager.GetEvolvingItemsCache().at(value->GetID()); auto item = EvolvingItemsManager::Instance()->GetEvolvingItemsCache().at(value->GetID());
c->Message( c->Message(
Chat::Yellow, Chat::Yellow,
fmt::format( fmt::format(
@ -126,7 +126,7 @@ void command_evolvingitems(Client *c, const Seperator *sep)
continue; continue;
} }
auto item = evolving_items_manager.GetEvolvingItemsCache().at(value->GetID()); auto item = EvolvingItemsManager::Instance()->GetEvolvingItemsCache().at(value->GetID());
c->Message( c->Message(
Chat::Yellow, Chat::Yellow,
fmt::format( fmt::format(

View File

@ -1037,7 +1037,7 @@ bool Client::PushItemOnCursor(const EQ::ItemInstance& inst, bool client_update)
{ {
LogInventory("Putting item [{}] ([{}]) on the cursor", inst.GetItem()->Name, inst.GetItem()->ID); LogInventory("Putting item [{}] ([{}]) on the cursor", inst.GetItem()->Name, inst.GetItem()->ID);
evolving_items_manager.DoLootChecks(CharacterID(), EQ::invslot::slotCursor, inst); EvolvingItemsManager::Instance()->DoLootChecks(CharacterID(), EQ::invslot::slotCursor, inst);
m_inv.PushCursor(inst); m_inv.PushCursor(inst);
if (client_update) { if (client_update) {
@ -1059,7 +1059,7 @@ bool Client::PutItemInInventory(int16 slot_id, const EQ::ItemInstance& inst, boo
return PushItemOnCursor(inst, client_update); return PushItemOnCursor(inst, client_update);
} }
evolving_items_manager.DoLootChecks(CharacterID(), slot_id, inst); EvolvingItemsManager::Instance()->DoLootChecks(CharacterID(), slot_id, inst);
m_inv.PutItem(slot_id, inst); m_inv.PutItem(slot_id, inst);
if (client_update) if (client_update)
@ -1087,7 +1087,7 @@ void Client::PutLootInInventory(int16 slot_id, const EQ::ItemInstance &inst, Loo
bool cursor_empty = m_inv.CursorEmpty(); bool cursor_empty = m_inv.CursorEmpty();
evolving_items_manager.DoLootChecks(CharacterID(), slot_id, inst); EvolvingItemsManager::Instance()->DoLootChecks(CharacterID(), slot_id, inst);
if (slot_id == EQ::invslot::slotCursor) { if (slot_id == EQ::invslot::slotCursor) {
m_inv.PushCursor(inst); m_inv.PushCursor(inst);

View File

@ -105,7 +105,12 @@ QuestParserCollection *parse = 0;
ZoneEventScheduler event_scheduler; ZoneEventScheduler event_scheduler;
WorldContentService content_service; WorldContentService content_service;
PlayerEventLogs player_event_logs; PlayerEventLogs player_event_logs;
<<<<<<< kinglykrab/evolvingitemsmanager-global-to-singleton
DatabaseUpdate database_update;
SkillCaps skill_caps;
=======
EvolvingItemsManager evolving_items_manager; EvolvingItemsManager evolving_items_manager;
>>>>>>> master
const SPDat_Spell_Struct* spells; const SPDat_Spell_Struct* spells;
int32 SPDAT_RECORDS = -1; int32 SPDAT_RECORDS = -1;
@ -394,9 +399,9 @@ int main(int argc, char **argv)
content_db.LoadTributes(); content_db.LoadTributes();
// Load evolving item data // Load evolving item data
evolving_items_manager.SetDatabase(&database); EvolvingItemsManager::Instance()->SetDatabase(&database);
evolving_items_manager.SetContentDatabase(&content_db); EvolvingItemsManager::Instance()->SetContentDatabase(&content_db);
evolving_items_manager.LoadEvolvingItems(); EvolvingItemsManager::Instance()->LoadEvolvingItems();
database.GetDecayTimes(npcCorpseDecayTimes); database.GetDecayTimes(npcCorpseDecayTimes);