From ca0e85b4bce093f0811013d659ab7f45f9a7b0d4 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Mon, 13 Feb 2023 00:52:47 -0500 Subject: [PATCH] [Quest API] Export $item to EVENT_PLAYER_PICKUP in Perl. (#2875) * [Quest API] Export $item to EVENT_PLAYER_PICKUP in Perl. # Notes - Exports `$item` to `EVENT_PLAYER_PICKUP` in Perl so that you have access to the item itself. * Optional parsing. * Update object.cpp * Update object.cpp --- zone/embparser.cpp | 3 +++ zone/object.cpp | 30 ++++++++++++++---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/zone/embparser.cpp b/zone/embparser.cpp index 1dfa7e778..0aea3f2c1 100644 --- a/zone/embparser.cpp +++ b/zone/embparser.cpp @@ -1680,6 +1680,9 @@ void PerlembParser::ExportEventVariables( case EVENT_PLAYER_PICKUP: { ExportVar(package_name.c_str(), "picked_up_id", data); ExportVar(package_name.c_str(), "picked_up_entity_id", extradata); + if (extra_pointers && extra_pointers->size() == 1) { + ExportVar(package_name.c_str(), "item", "QuestItem", std::any_cast(extra_pointers->at(0))); + } break; } diff --git a/zone/object.cpp b/zone/object.cpp index 276a8435e..d041635d6 100644 --- a/zone/object.cpp +++ b/zone/object.cpp @@ -528,26 +528,24 @@ bool Object::HandleClick(Client* sender, const ClickObject_Struct* click_object) RecordPlayerEventLogWithClient(sender, PlayerEvent::GROUNDSPAWN_PICKUP, e); } - std::string export_string = fmt::format("{}", item->ID); - std::vector args; - args.push_back(m_inst); - if(parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, export_string, GetID(), &args)) - { - auto outapp = new EQApplicationPacket(OP_ClickObject, sizeof(ClickObject_Struct)); - memcpy(outapp->pBuffer, click_object, sizeof(ClickObject_Struct)); - ClickObject_Struct* co = (ClickObject_Struct*)outapp->pBuffer; - co->drop_id = 0; - entity_list.QueueClients(nullptr, outapp, false); - safe_delete(outapp); + if (parse->PlayerHasQuestSub(EVENT_PLAYER_PICKUP)) { + std::vector args = { m_inst }; - // No longer using a tradeskill object - sender->SetTradeskillObject(nullptr); - user = nullptr; + if (parse->EventPlayer(EVENT_PLAYER_PICKUP, sender, std::to_string(item->ID), GetID(), &args)) { + auto outapp = new EQApplicationPacket(OP_ClickObject, sizeof(ClickObject_Struct)); + memcpy(outapp->pBuffer, click_object, sizeof(ClickObject_Struct)); + auto* co = (ClickObject_Struct*) outapp->pBuffer; + co->drop_id = 0; + entity_list.QueueClients(nullptr, outapp, false); + safe_delete(outapp); - return true; + sender->SetTradeskillObject(nullptr); + user = nullptr; + + return true; + } } - // Transfer item to client sender->PutItemInInventory(EQ::invslot::slotCursor, *m_inst, false); sender->SendItemPacket(EQ::invslot::slotCursor, m_inst, ItemPacketTrade);