diff --git a/common/evolving_items.cpp b/common/evolving_items.cpp index 2b7eb38c6..b74efc17b 100644 --- a/common/evolving_items.cpp +++ b/common/evolving_items.cpp @@ -54,6 +54,10 @@ double EvolvingItemsManager::CalculateProgression(const uint64 current_amount, c void EvolvingItemsManager::DoLootChecks(const uint32 char_id, const uint16 slot_id, const EQ::ItemInstance &inst) const { + if (!inst) { + return; + } + inst.SetEvolveEquipped(false); if (inst.IsEvolving() && slot_id <= EQ::invslot::EQUIPMENT_END && slot_id >= EQ::invslot::EQUIPMENT_BEGIN) { inst.SetEvolveEquipped(true); @@ -87,6 +91,10 @@ void EvolvingItemsManager::DoLootChecks(const uint32 char_id, const uint16 slot_ uint32 EvolvingItemsManager::GetFinalItemID(const EQ::ItemInstance &inst) const { + if (!inst) { + return 0; + } + const auto start_iterator = std::ranges::find_if( evolving_items_manager.GetEvolvingItemsCache().cbegin(), evolving_items_manager.GetEvolvingItemsCache().cend(), @@ -116,6 +124,10 @@ uint32 EvolvingItemsManager::GetFinalItemID(const EQ::ItemInstance &inst) const uint32 EvolvingItemsManager::GetNextEvolveItemID(const EQ::ItemInstance &inst) const { + if (!inst) { + return 0; + } + int8 const current_level = inst.GetEvolveLvl(); const auto iterator = std::ranges::find_if( @@ -191,6 +203,10 @@ uint64 EvolvingItemsManager::GetTotalEarnedXP(const EQ::ItemInstance &inst) EvolveGetNextItem EvolvingItemsManager::GetNextItemByXP(const EQ::ItemInstance &inst_in, const int64 in_xp) { EvolveGetNextItem ets{}; + if (!inst_in) { + return ets; + } + const auto evolve_items = GetEvolveIDItems(inst_in.GetEvolveLoreID()); uint32 max_transfer_level = 0; int64 xp = in_xp; @@ -235,6 +251,9 @@ EvolveTransfer EvolvingItemsManager::DetermineTransferResults( ) { EvolveTransfer ets{}; + if (!inst_from || !inst_to) { + return ets; + } auto evolving_details_inst_from = evolving_items_manager.GetEvolveItemDetails(inst_from.GetID()); auto evolving_details_inst_to = evolving_items_manager.GetEvolveItemDetails(inst_to.GetID()); @@ -295,6 +314,10 @@ uint32 EvolvingItemsManager::GetFirstItemInLoreGroupByItemID(const uint32 item_i void EvolvingItemsManager::LoadPlayerEvent(const EQ::ItemInstance &inst, PlayerEvent::EvolveItem &e) { + if (!inst) { + return; + } + e.item_id = inst.GetID(); e.item_name = inst.GetItem() ? inst.GetItem()->Name : std::string(); e.level = inst.GetEvolveLvl(); diff --git a/common/evolving_items.h b/common/evolving_items.h index 463b58493..56f7e4be8 100644 --- a/common/evolving_items.h +++ b/common/evolving_items.h @@ -53,11 +53,11 @@ public: ItemsEvolvingDetailsRepository::ItemsEvolvingDetails GetEvolveItemDetails(uint64 id); EvolveTransfer DetermineTransferResults(const EQ::ItemInstance& inst_from, const EQ::ItemInstance& inst_to); EvolveGetNextItem GetNextItemByXP(const EQ::ItemInstance &inst_in, int64 in_xp); - std::map& GetEvolvingItemsCache() { return evolving_items_cache; } + std::map& GetEvolvingItemsCache() { return m_evolving_items_cache; } std::vector GetEvolveIDItems(uint32 evolve_id); private: - std::map evolving_items_cache; + std::map m_evolving_items_cache; Database * m_db; Database * m_content_db; }; diff --git a/zone/client_evolving_items.cpp b/zone/client_evolving_items.cpp index c77b2fd12..e1259c77f 100644 --- a/zone/client_evolving_items.cpp +++ b/zone/client_evolving_items.cpp @@ -92,6 +92,16 @@ void Client::ProcessEvolvingItem(const uint64 exp, const Mob *mob) continue; } + if (!evolving_items_manager.GetEvolvingItemsCache().contains(inst->GetID())) { + LogEvolveItem( + "Character ID {} has an evolving item that is not found in the db. Please check your " + "items_evolving_details table for item id {}", + CharacterID(), + inst->GetID() + ); + continue; + } + auto const type = evolving_items_manager.GetEvolvingItemsCache().at(inst->GetID()).type; auto const sub_type = evolving_items_manager.GetEvolvingItemsCache().at(inst->GetID()).sub_type; @@ -283,24 +293,31 @@ void Client::DoEvolveItemDisplayFinalResult(const EQApplicationPacket *app) } std::unique_ptr const inst(database.CreateItem(item_id)); + if (!inst) { + return; + } LogEvolveItemDetail( "Character ID [{}] requested to view final evolve item id [{}] for evolve item id [{}]", CharacterID(), item_id, - evolving_items_manager.GetFirstItemInLoreGroupByItemID(item_id)); + evolving_items_manager.GetFirstItemInLoreGroupByItemID(item_id) + ); inst->SetEvolveProgression(100); - if (inst) { - LogEvolveItemDetail( - "Sending final result for item id [{}] to Character ID [{}]", item_id, CharacterID()); - SendItemPacket(0, inst.get(), ItemPacketViewLink); - } + LogEvolveItemDetail( + "Sending final result for item id [{}] to Character ID [{}]", item_id, CharacterID() + ); + SendItemPacket(0, inst.get(), ItemPacketViewLink); } bool Client::DoEvolveCheckProgression(EQ::ItemInstance &inst) { + if (!inst) { + return false; + } + if (inst.GetEvolveProgression() < 100 || inst.GetEvolveLvl() == inst.GetMaxEvolveLvl()) { return false; }