diff --git a/zone/client.h b/zone/client.h index d2553e97e..0455ab689 100644 --- a/zone/client.h +++ b/zone/client.h @@ -988,6 +988,7 @@ public: void IncStats(uint8 type,int16 increase_val); void DropItem(int16 slot_id, bool recurse = true); void DropItemQS(EQ::ItemInstance* inst, bool pickup); + bool HasItemOnCorpse(uint32 item_id); bool IsAugmentRestricted(uint8 item_type, uint32 augment_restriction); diff --git a/zone/inventory.cpp b/zone/inventory.cpp index 95ed20c85..928850fa6 100644 --- a/zone/inventory.cpp +++ b/zone/inventory.cpp @@ -4789,3 +4789,31 @@ void Client::SummonItemIntoInventory( slot_id ); } + +bool Client::HasItemOnCorpse(uint32 item_id) +{ + const uint32 corpse_count = GetCorpseCount(); + if (!corpse_count) { + return EQ::invslot::SLOT_INVALID; + } + + for (int i = 0; i < corpse_count; i++) { + const uint32 corpse_id = GetCorpseID(i); + + for (int16 slot_id = EQ::invslot::POSSESSIONS_BEGIN; slot_id < EQ::invslot::POSSESSIONS_END; slot_id++) { + const uint32 current_item_id = GetCorpseItemAt(corpse_id, slot_id); + if (current_item_id && current_item_id == item_id) { + return true; + } + } + + for (int16 slot_id = EQ::invbag::GENERAL_BAGS_BEGIN; slot_id < EQ::invbag::GENERAL_BAGS_END; slot_id++) { + const uint32 current_item_id = GetCorpseItemAt(corpse_id, slot_id); + if (current_item_id && current_item_id == item_id) { + return true; + } + } + } + + return false; +} diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 2ed7097c5..369141fcd 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -3246,6 +3246,12 @@ void Lua_Client::SummonItemIntoInventory(luabind::object item_table) { ); } +bool Lua_Client::HasItemOnCorpse(uint32 item_id) +{ + Lua_Safe_Call_Bool(); + return self->HasItemOnCorpse(item_id); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -3508,6 +3514,7 @@ luabind::scope lua_register_client() { .def("HasDisciplineLearned", (bool(Lua_Client::*)(uint16))&Lua_Client::HasDisciplineLearned) .def("HasExpeditionLockout", (bool(Lua_Client::*)(std::string, std::string))&Lua_Client::HasExpeditionLockout) .def("HasItemEquippedByID", (bool(Lua_Client::*)(uint32))&Lua_Client::HasItemEquippedByID) + .def("HasItemOnCorpse", (bool(Lua_Client::*)(uint32))&Lua_Client::HasItemOnCorpse) .def("HasPEQZoneFlag", (bool(Lua_Client::*)(uint32))&Lua_Client::HasPEQZoneFlag) .def("HasRecipeLearned", (bool(Lua_Client::*)(uint32))&Lua_Client::HasRecipeLearned) .def("HasSkill", (bool(Lua_Client::*)(int))&Lua_Client::HasSkill) diff --git a/zone/lua_client.h b/zone/lua_client.h index b34e6f4e9..eb759a8a9 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -487,6 +487,7 @@ public: void RemoveEbonCrystals(uint32 amount); void RemoveRadiantCrystals(uint32 amount); void SummonItemIntoInventory(luabind::object item_table); + bool HasItemOnCorpse(uint32 item_id); void ApplySpell(int spell_id); void ApplySpell(int spell_id, int duration); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index b6c7a8d15..00cddb083 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -3058,6 +3058,11 @@ void Perl_Client_SummonItemIntoInventory(Client* self, perl::reference table_ref ); } +bool Perl_Client_HasItemOnCorpse(Client* self, uint32 item_id) +{ + return self->HasItemOnCorpse(item_id); +} + void perl_register_client() { perl::interpreter perl(PERL_GET_THX); @@ -3320,6 +3325,7 @@ void perl_register_client() package.add("HasDisciplineLearned", &Perl_Client_HasDisciplineLearned); package.add("HasExpeditionLockout", &Perl_Client_HasExpeditionLockout); package.add("HasItemEquippedByID", &Perl_Client_HasItemEquippedByID); + package.add("HasItemOnCorpse", &Perl_Client_HasItemOnCorpse); package.add("HasPEQZoneFlag", &Perl_Client_HasPEQZoneFlag); package.add("HasRecipeLearned", &Perl_Client_HasRecipeLearned); package.add("HasSkill", &Perl_Client_HasSkill); diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index f49bd6e9e..b04d7fc97 100755 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -4123,15 +4123,16 @@ uint32 ZoneDatabase::GetCharacterCorpseID(uint32 char_id, uint8 corpse) { return 0; } -uint32 ZoneDatabase::GetCharacterCorpseItemAt(uint32 corpse_id, uint16 slotid) { - Corpse* tmp = LoadCharacterCorpse(corpse_id); - uint32 itemid = 0; +uint32 ZoneDatabase::GetCharacterCorpseItemAt(uint32 corpse_id, uint16 slot_id) { + Corpse* c = LoadCharacterCorpse(corpse_id); + uint32 item_id = 0; - if (tmp) { - itemid = tmp->GetWornItem(slotid); - tmp->DepopPlayerCorpse(); + if (c) { + item_id = c->GetWornItem(slot_id); + c->DepopPlayerCorpse(); } - return itemid; + + return item_id; } bool ZoneDatabase::LoadCharacterCorpseData(uint32 corpse_id, CharacterCorpseEntry& corpse){ diff --git a/zone/zonedb.h b/zone/zonedb.h index 0c20a76db..d069035a1 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -498,7 +498,7 @@ public: uint32 GetFirstCorpseID(uint32 char_id); uint32 GetCharacterCorpseCount(uint32 char_id); uint32 GetCharacterCorpseID(uint32 char_id, uint8 corpse); - uint32 GetCharacterCorpseItemAt(uint32 corpse_id, uint16 slotid); + uint32 GetCharacterCorpseItemAt(uint32 corpse_id, uint16 slot_id); uint32 GetPlayerCorpseTimeLeft(uint8 corpse, uint8 type); void SendCharacterCorpseToNonInstance(uint32 corpse_db_id);