From 040c0927959ff31590f7c3c8e1eec9580f5eef2c Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Mon, 30 Jan 2023 21:18:16 -0500 Subject: [PATCH] [Quest API] Add Augment Slot support to does_augment_fit (#2813) * [Quest API] Add Augment Slot support to does_augment_fit # Notes - Allows you to check if the supplied augment ID fits in the specified augment slot of the item instance provided. * Update item_instance.cpp --- common/item_instance.cpp | 22 +++++++++++++++++----- common/item_instance.h | 4 ++-- zone/embparser_api.cpp | 8 +++++++- zone/lua_general.cpp | 8 +++++++- zone/questmgr.cpp | 9 ++++++++- zone/questmgr.h | 2 +- 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/common/item_instance.cpp b/common/item_instance.cpp index 0b940c8b2..6dda47978 100644 --- a/common/item_instance.cpp +++ b/common/item_instance.cpp @@ -358,15 +358,27 @@ int8 EQ::ItemInstance::AvailableAugmentSlot(int32 augment_type) const return (i <= invaug::SOCKET_END) ? i : INVALID_INDEX; } -bool EQ::ItemInstance::IsAugmentSlotAvailable(int32 augtype, uint8 slot) const +bool EQ::ItemInstance::IsAugmentSlotAvailable(int32 augment_type, uint8 slot) const { - if (!m_item || !m_item->IsClassCommon()) - return false; + if (!m_item || !m_item->IsClassCommon()) { + return false; + } - if ((!GetItem(slot) && m_item->AugSlotVisible[slot]) && augtype == -1 || (m_item->AugSlotType[slot] && ((1 << (m_item->AugSlotType[slot] - 1)) & augtype))) { + if ( + ( + !GetItem(slot) && + m_item->AugSlotVisible[slot] + ) && + augment_type == -1 || + ( + m_item->AugSlotType[slot] && + ((1 << (m_item->AugSlotType[slot] - 1)) & augment_type) + ) + ) { return true; } - return false; + + return false; } // Retrieve item inside container diff --git a/common/item_instance.h b/common/item_instance.h index 02832a6e5..89620d0b5 100644 --- a/common/item_instance.h +++ b/common/item_instance.h @@ -101,8 +101,8 @@ namespace EQ // bool IsAugmentable() const; bool AvailableWearSlot(uint32 aug_wear_slots) const; - int8 AvailableAugmentSlot(int32 augtype) const; - bool IsAugmentSlotAvailable(int32 augtype, uint8 slot) const; + int8 AvailableAugmentSlot(int32 augment_type) const; + bool IsAugmentSlotAvailable(int32 augment_type, uint8 slot) const; inline int32 GetAugmentType() const { return ((m_item) ? m_item->AugType : 0); } inline bool IsExpendable() const { return ((m_item) ? ((m_item->Click.Type == item::ItemEffectExpendable) || (m_item->ItemType == item::ItemTypePotion)) : false); } diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 77036ecbe..ac4881b30 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -3981,6 +3981,11 @@ int8 Perl__does_augment_fit(EQ::ItemInstance* inst, uint32 augment_id) return quest_manager.DoesAugmentFit(inst, augment_id); } +int8 Perl__does_augment_fit(EQ::ItemInstance* inst, uint32 augment_id, uint8 augment_slot) +{ + return quest_manager.DoesAugmentFit(inst, augment_id, augment_slot); +} + void perl_register_quest() { perl::interpreter perl(PERL_GET_THX); @@ -4326,7 +4331,8 @@ void perl_register_quest() package.add("doanim", (void(*)(int, int, bool))&Perl__doanim); package.add("doanim", (void(*)(int, int, bool, int))&Perl__doanim); package.add("do_augment_slots_match", &Perl__do_augment_slots_match); - package.add("does_augment_fit", &Perl__does_augment_fit); + package.add("does_augment_fit", (int8(*)(EQ::ItemInstance*, uint32))&Perl__does_augment_fit); + package.add("does_augment_fit", (int8(*)(EQ::ItemInstance*, uint32, uint8))&Perl__does_augment_fit); package.add("echo", &Perl__echo); package.add("emote", &Perl__emote); package.add("enable_proximity_say", &Perl__enable_proximity_say); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 6e6d91310..4bb9c9bdb 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -3700,6 +3700,11 @@ int8 lua_does_augment_fit(Lua_ItemInst inst, uint32 augment_id) return quest_manager.DoesAugmentFit(inst, augment_id); } +int8 lua_does_augment_fit(Lua_ItemInst inst, uint32 augment_id, uint8 augment_slot) +{ + return quest_manager.DoesAugmentFit(inst, augment_id, augment_slot); +} + #define LuaCreateNPCParse(name, c_type, default_value) do { \ cur = table[#name]; \ if(luabind::type(cur) != LUA_TNIL) { \ @@ -4217,7 +4222,8 @@ luabind::scope lua_register_general() { luabind::def("do_anim", (void(*)(int,int,bool))&lua_do_anim), luabind::def("do_anim", (void(*)(int,int,bool,int))&lua_do_anim), luabind::def("do_augment_slots_match", &lua_do_augment_slots_match), - luabind::def("does_augment_fit", &lua_does_augment_fit), + luabind::def("does_augment_fit", (int8(*)(Lua_ItemInst, uint32))&lua_does_augment_fit), + luabind::def("does_augment_fit", (int8(*)(Lua_ItemInst, uint32, uint8))&lua_does_augment_fit), /* Cross Zone */ diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 9e6b4859d..004c88ed6 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -3969,7 +3969,7 @@ bool QuestManager::DoAugmentSlotsMatch(uint32 item_one, uint32 item_two) return true; } -int8 QuestManager::DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id) +int8 QuestManager::DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id, uint8 augment_slot) { if (!inst) { return INVALID_INDEX; @@ -3980,5 +3980,12 @@ int8 QuestManager::DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id) return INVALID_INDEX; } + if ( + augment_slot != 255 && + !inst->IsAugmentSlotAvailable(aug_inst->AugType, augment_slot) + ) { + return INVALID_INDEX; + } + return inst->AvailableAugmentSlot(aug_inst->AugType); } diff --git a/zone/questmgr.h b/zone/questmgr.h index ed7899fbd..71c166685 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -346,7 +346,7 @@ public: std::string GetRecipeName(uint32 recipe_id); bool HasRecipeLearned(uint32 recipe_id); bool DoAugmentSlotsMatch(uint32 item_one, uint32 item_two); - int8 DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id); + int8 DoesAugmentFit(EQ::ItemInstance* inst, uint32 augment_id, uint8 augment_slot = 255); Bot *GetBot() const; Client *GetInitiator() const;