From ac15c6b9f738caa936f529a74640077fc1d55cfc Mon Sep 17 00:00:00 2001 From: Emagi Date: Sun, 15 Jun 2025 19:14:44 -0400 Subject: [PATCH] Fix items after "obtained" because RemoveItem can be called making the Item Ptr dead. --- source/WorldServer/LuaInterface.cpp | 9 +++++++++ source/WorldServer/LuaInterface.h | 1 + source/WorldServer/client.cpp | 11 ++++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/source/WorldServer/LuaInterface.cpp b/source/WorldServer/LuaInterface.cpp index 67e06ea..edb2e4e 100644 --- a/source/WorldServer/LuaInterface.cpp +++ b/source/WorldServer/LuaInterface.cpp @@ -2964,6 +2964,15 @@ void LuaInterface::SetLuaUserDataStale(void* ptr) { } } +bool LuaInterface::IsLuaUserDataValid(void* ptr) { + std::shared_lock lock(MLUAUserData); + std::map::iterator itr = user_data_ptr.find(ptr); + if(itr != user_data_ptr.end()) { + return itr->second->correctly_initialized; + } + return false; +} + LUAUserData::LUAUserData(){ correctly_initialized = false; quest = 0; diff --git a/source/WorldServer/LuaInterface.h b/source/WorldServer/LuaInterface.h index cecc0bd..42d6c70 100644 --- a/source/WorldServer/LuaInterface.h +++ b/source/WorldServer/LuaInterface.h @@ -355,6 +355,7 @@ public: int32 GetFreeCustomSpellID(); void SetLuaUserDataStale(void* ptr); + bool IsLuaUserDataValid(void* ptr); private: bool shutting_down; diff --git a/source/WorldServer/client.cpp b/source/WorldServer/client.cpp index 4dafb97..cf4eef1 100644 --- a/source/WorldServer/client.cpp +++ b/source/WorldServer/client.cpp @@ -2967,12 +2967,12 @@ bool Client::HandleLootItem(Spawn* entity, Item* item, Spawn* target, bool overr guild->AddNewGuildEvent(type, "%s has looted the %s %s", Timer::GetUnixTimeStamp(), true, lootingPlayer->GetName(), adjective, item->CreateItemLink(GetVersion()).c_str()); guild->SendMessageToGuild(type, "%s has looted the %s %s", lootingPlayer->GetName(), adjective, item->CreateItemLink(GetVersion()).c_str()); } - + + lootingClient->CheckPlayerQuestsItemUpdate(item); + if (item->GetItemScript() && lua_interface) lua_interface->RunItemScript(item->GetItemScript(), "obtained", item, lootingPlayer); - lootingClient->CheckPlayerQuestsItemUpdate(item); - if (GetVersion() <= 561) { EQ2Packet* outapp = lootingPlayer->SendInventoryUpdate(GetVersion()); if (outapp) @@ -8079,6 +8079,9 @@ bool Client::AddItem(Item* item, bool* item_deleted, AddItemType type) { CheckPlayerQuestsItemUpdate(item); if (item->GetItemScript() && lua_interface) lua_interface->RunItemScript(item->GetItemScript(), "obtained", item, player); + + if(!lua_interface->IsLuaUserDataValid(item) && item_deleted) + *item_deleted = true; } else { lua_interface->SetLuaUserDataStale(item); @@ -8537,7 +8540,6 @@ void Client::BuyItem(int32 item_id, int16 quantity) { bool itemDeleted = false; AddItem(item, &itemDeleted); if (!itemDeleted) { - CheckPlayerQuestsItemUpdate(item); if (item && total_available < 0xFF) { world.DecreaseMerchantQuantity(spawn->GetMerchantID(), item_id, quantity); SendBuyMerchantList(); @@ -8634,7 +8636,6 @@ void Client::BuyItem(int32 item_id, int16 quantity) { bool itemDeleted = false; AddItem(item, &itemDeleted); if (!itemDeleted) { - CheckPlayerQuestsItemUpdate(item); if (item && total_available < 0xFF) { world.DecreaseMerchantQuantity(spawn->GetMerchantID(), item_id, quantity); SendBuyMerchantList();