diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index d2db20bc2..56c44a1f8 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -4024,10 +4024,8 @@ void QuestManager::SendPlayerHandinEvent() { if (!handin_items.empty()) { if (Strings::Contains(handin_items, ",")) { const auto handin_data = Strings::Split(handin_items, ","); - for (const auto &h: handin_data) { - const auto item_data = Strings::Split(h, "-"); - + const auto item_data = Strings::Split(h, "|"); if ( item_data.size() == 3 && Strings::IsNumber(item_data[0]) && @@ -4037,22 +4035,22 @@ void QuestManager::SendPlayerHandinEvent() { const auto item_id = static_cast(std::stoul(item_data[0])); if (item_id != 0) { const auto *item = database.GetItem(item_id); - - hi.emplace_back( - PlayerEvent::HandinEntry{ - .item_id = item_id, - .item_name = item->Name, - .charges = static_cast(std::stoul(item_data[1])), - .attuned = std::stoi(item_data[2]) ? true : false - } - ); + if (item) { + hi.emplace_back( + PlayerEvent::HandinEntry{ + .item_id = item_id, + .item_name = item->Name, + .charges = static_cast(std::stoul(item_data[1])), + .attuned = std::stoi(item_data[2]) ? true : false + } + ); + } } } } } else if (Strings::Contains(handin_items, "|")) { const auto item_data = Strings::Split(handin_items, "|"); - if ( item_data.size() == 3 && Strings::IsNumber(item_data[0]) && @@ -4061,15 +4059,16 @@ void QuestManager::SendPlayerHandinEvent() { ) { const auto item_id = static_cast(std::stoul(item_data[0])); const auto *item = database.GetItem(item_id); - - hi.emplace_back( - PlayerEvent::HandinEntry{ - .item_id = item_id, - .item_name = item->Name, - .charges = static_cast(std::stoul(item_data[1])), - .attuned = std::stoi(item_data[2]) ? true : false - } - ); + if (item) { + hi.emplace_back( + PlayerEvent::HandinEntry{ + .item_id = item_id, + .item_name = item->Name, + .charges = static_cast(std::stoul(item_data[1])), + .attuned = std::stoi(item_data[2]) ? true : false + } + ); + } } } } @@ -4087,10 +4086,8 @@ void QuestManager::SendPlayerHandinEvent() { if (!return_items.empty()) { if (Strings::Contains(return_items, ",")) { const auto return_data = Strings::Split(return_items, ","); - for (const auto &r: return_data) { const auto item_data = Strings::Split(r, "|"); - if ( item_data.size() == 3 && Strings::IsNumber(item_data[0]) && @@ -4100,20 +4097,21 @@ void QuestManager::SendPlayerHandinEvent() { const auto item_id = static_cast(std::stoul(item_data[0])); const auto *item = database.GetItem(item_id); - ri.emplace_back( - PlayerEvent::HandinEntry{ - .item_id = item_id, - .item_name = item->Name, - .charges = static_cast(std::stoul(item_data[1])), - .attuned = std::stoi(item_data[2]) ? true : false - } - ); + if (item) { + ri.emplace_back( + PlayerEvent::HandinEntry{ + .item_id = item_id, + .item_name = item->Name, + .charges = static_cast(std::stoul(item_data[1])), + .attuned = std::stoi(item_data[2]) ? true : false + } + ); + } } } } else if (Strings::Contains(return_items, "|")) { const auto item_data = Strings::Split(return_items, "|"); - if ( item_data.size() == 3 && Strings::IsNumber(item_data[0]) && @@ -4123,14 +4121,16 @@ void QuestManager::SendPlayerHandinEvent() { const auto item_id = static_cast(std::stoul(item_data[0])); const auto *item = database.GetItem(item_id); - ri.emplace_back( - PlayerEvent::HandinEntry{ - .item_id = item_id, - .item_name = item->Name, - .charges = static_cast(std::stoul(item_data[1])), - .attuned = std::stoi(item_data[2]) ? true : false - } - ); + if (item) { + ri.emplace_back( + PlayerEvent::HandinEntry{ + .item_id = item_id, + .item_name = item->Name, + .charges = static_cast(std::stoul(item_data[1])), + .attuned = std::stoi(item_data[2]) ? true : false + } + ); + } } } } @@ -4149,7 +4149,13 @@ void QuestManager::SendPlayerHandinEvent() { initiator->DeleteEntityVariable("RETURN_ITEMS"); initiator->DeleteEntityVariable("RETURN_MONEY"); - if (player_event_logs.IsEventEnabled(PlayerEvent::NPC_HANDIN)) { + bool handed_in_money = hm.platinum > 0 || hm.gold > 0 || hm.silver > 0 || hm.copper > 0; + + bool event_has_data_to_record = ( + !hi.empty() || handed_in_money + ); + + if (player_event_logs.IsEventEnabled(PlayerEvent::NPC_HANDIN) && event_has_data_to_record) { auto e = PlayerEvent::HandinEvent{ .npc_id = owner->CastToNPC()->GetNPCTypeID(), .npc_name = owner->GetCleanName(),