[Player Events] Fix issue with item instances not being validated properly before accessing causing crashes on handin (#2945)

This commit is contained in:
Chris Miles 2023-02-17 06:07:02 -06:00 committed by GitHub
parent da20a6ab67
commit 26dc05c0dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4024,10 +4024,8 @@ void QuestManager::SendPlayerHandinEvent() {
if (!handin_items.empty()) { if (!handin_items.empty()) {
if (Strings::Contains(handin_items, ",")) { if (Strings::Contains(handin_items, ",")) {
const auto handin_data = Strings::Split(handin_items, ","); const auto handin_data = Strings::Split(handin_items, ",");
for (const auto &h: handin_data) { for (const auto &h: handin_data) {
const auto item_data = Strings::Split(h, "-"); const auto item_data = Strings::Split(h, "|");
if ( if (
item_data.size() == 3 && item_data.size() == 3 &&
Strings::IsNumber(item_data[0]) && Strings::IsNumber(item_data[0]) &&
@ -4037,7 +4035,7 @@ void QuestManager::SendPlayerHandinEvent() {
const auto item_id = static_cast<uint32>(std::stoul(item_data[0])); const auto item_id = static_cast<uint32>(std::stoul(item_data[0]));
if (item_id != 0) { if (item_id != 0) {
const auto *item = database.GetItem(item_id); const auto *item = database.GetItem(item_id);
if (item) {
hi.emplace_back( hi.emplace_back(
PlayerEvent::HandinEntry{ PlayerEvent::HandinEntry{
.item_id = item_id, .item_id = item_id,
@ -4050,9 +4048,9 @@ void QuestManager::SendPlayerHandinEvent() {
} }
} }
} }
}
else if (Strings::Contains(handin_items, "|")) { else if (Strings::Contains(handin_items, "|")) {
const auto item_data = Strings::Split(handin_items, "|"); const auto item_data = Strings::Split(handin_items, "|");
if ( if (
item_data.size() == 3 && item_data.size() == 3 &&
Strings::IsNumber(item_data[0]) && Strings::IsNumber(item_data[0]) &&
@ -4061,7 +4059,7 @@ void QuestManager::SendPlayerHandinEvent() {
) { ) {
const auto item_id = static_cast<uint32>(std::stoul(item_data[0])); const auto item_id = static_cast<uint32>(std::stoul(item_data[0]));
const auto *item = database.GetItem(item_id); const auto *item = database.GetItem(item_id);
if (item) {
hi.emplace_back( hi.emplace_back(
PlayerEvent::HandinEntry{ PlayerEvent::HandinEntry{
.item_id = item_id, .item_id = item_id,
@ -4073,6 +4071,7 @@ void QuestManager::SendPlayerHandinEvent() {
} }
} }
} }
}
// Handin Money // Handin Money
if (!handin_money.empty()) { if (!handin_money.empty()) {
@ -4087,10 +4086,8 @@ void QuestManager::SendPlayerHandinEvent() {
if (!return_items.empty()) { if (!return_items.empty()) {
if (Strings::Contains(return_items, ",")) { if (Strings::Contains(return_items, ",")) {
const auto return_data = Strings::Split(return_items, ","); const auto return_data = Strings::Split(return_items, ",");
for (const auto &r: return_data) { for (const auto &r: return_data) {
const auto item_data = Strings::Split(r, "|"); const auto item_data = Strings::Split(r, "|");
if ( if (
item_data.size() == 3 && item_data.size() == 3 &&
Strings::IsNumber(item_data[0]) && Strings::IsNumber(item_data[0]) &&
@ -4100,6 +4097,7 @@ void QuestManager::SendPlayerHandinEvent() {
const auto item_id = static_cast<uint32>(std::stoul(item_data[0])); const auto item_id = static_cast<uint32>(std::stoul(item_data[0]));
const auto *item = database.GetItem(item_id); const auto *item = database.GetItem(item_id);
if (item) {
ri.emplace_back( ri.emplace_back(
PlayerEvent::HandinEntry{ PlayerEvent::HandinEntry{
.item_id = item_id, .item_id = item_id,
@ -4111,9 +4109,9 @@ void QuestManager::SendPlayerHandinEvent() {
} }
} }
} }
}
else if (Strings::Contains(return_items, "|")) { else if (Strings::Contains(return_items, "|")) {
const auto item_data = Strings::Split(return_items, "|"); const auto item_data = Strings::Split(return_items, "|");
if ( if (
item_data.size() == 3 && item_data.size() == 3 &&
Strings::IsNumber(item_data[0]) && Strings::IsNumber(item_data[0]) &&
@ -4123,6 +4121,7 @@ void QuestManager::SendPlayerHandinEvent() {
const auto item_id = static_cast<uint32>(std::stoul(item_data[0])); const auto item_id = static_cast<uint32>(std::stoul(item_data[0]));
const auto *item = database.GetItem(item_id); const auto *item = database.GetItem(item_id);
if (item) {
ri.emplace_back( ri.emplace_back(
PlayerEvent::HandinEntry{ PlayerEvent::HandinEntry{
.item_id = item_id, .item_id = item_id,
@ -4134,6 +4133,7 @@ void QuestManager::SendPlayerHandinEvent() {
} }
} }
} }
}
// Return Money // Return Money
if (!return_money.empty()) { if (!return_money.empty()) {
@ -4149,7 +4149,13 @@ void QuestManager::SendPlayerHandinEvent() {
initiator->DeleteEntityVariable("RETURN_ITEMS"); initiator->DeleteEntityVariable("RETURN_ITEMS");
initiator->DeleteEntityVariable("RETURN_MONEY"); 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{ auto e = PlayerEvent::HandinEvent{
.npc_id = owner->CastToNPC()->GetNPCTypeID(), .npc_id = owner->CastToNPC()->GetNPCTypeID(),
.npc_name = owner->GetCleanName(), .npc_name = owner->GetCleanName(),