mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-01 09:12:25 +00:00
[Player Events] Fix issue with item instances not being validated properly before accessing causing crashes on handin (#2945)
This commit is contained in:
parent
da20a6ab67
commit
26dc05c0dc
@ -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,22 +4035,22 @@ 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,
|
||||||
.item_name = item->Name,
|
.item_name = item->Name,
|
||||||
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
||||||
.attuned = std::stoi(item_data[2]) ? true : false
|
.attuned = std::stoi(item_data[2]) ? true : false
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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,15 +4059,16 @@ 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,
|
||||||
.item_name = item->Name,
|
.item_name = item->Name,
|
||||||
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
||||||
.attuned = std::stoi(item_data[2]) ? true : false
|
.attuned = std::stoi(item_data[2]) ? true : false
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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,20 +4097,21 @@ 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);
|
||||||
|
|
||||||
ri.emplace_back(
|
if (item) {
|
||||||
PlayerEvent::HandinEntry{
|
ri.emplace_back(
|
||||||
.item_id = item_id,
|
PlayerEvent::HandinEntry{
|
||||||
.item_name = item->Name,
|
.item_id = item_id,
|
||||||
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
.item_name = item->Name,
|
||||||
.attuned = std::stoi(item_data[2]) ? true : false
|
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
||||||
}
|
.attuned = std::stoi(item_data[2]) ? true : false
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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,14 +4121,16 @@ 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);
|
||||||
|
|
||||||
ri.emplace_back(
|
if (item) {
|
||||||
PlayerEvent::HandinEntry{
|
ri.emplace_back(
|
||||||
.item_id = item_id,
|
PlayerEvent::HandinEntry{
|
||||||
.item_name = item->Name,
|
.item_id = item_id,
|
||||||
.charges = static_cast<uint16>(std::stoul(item_data[1])),
|
.item_name = item->Name,
|
||||||
.attuned = std::stoi(item_data[2]) ? true : false
|
.charges = static_cast<uint16>(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_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(),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user