From b6b67f748271ceb49333afbfae748a77c67d38f9 Mon Sep 17 00:00:00 2001 From: bensaine Date: Fri, 4 Feb 2022 18:17:31 -0500 Subject: [PATCH] initial draft --- .../src/interface_v3/action_handler_item.cpp | 34 +++ .../client/src/interface_v3/dbctrl_sheet.cpp | 10 + ryzom/client/src/interface_v3/dbctrl_sheet.h | 2 + .../src/interface_v3/inventory_manager.cpp | 270 +++++++++++++++++- .../src/interface_v3/inventory_manager.h | 33 +++ ryzom/common/src/game_share/item_family.cpp | 11 + ryzom/common/src/game_share/item_family.h | 2 + 7 files changed, 359 insertions(+), 3 deletions(-) diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index f931f1d76..92688d0f2 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -1079,6 +1079,40 @@ class CCanDropToExchange : public IActionHandler }; REGISTER_ACTION_HANDLER (CCanDropToExchange, "can_drop_to_exchange"); +// ********************************************************************************************************** +class CCanDropToHotbar : public IActionHandler +{ + virtual void execute (CCtrlBase *pCaller, const string &Params) + { + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + nlinfo("hey"); + string src = getParam(Params, "src"); + CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); + CDBCtrlSheet *pCSSrc = dynamic_cast(pElt); + CDBCtrlSheet *pCSDst = dynamic_cast(pCaller); + if (!pCSSrc || !pCSDst) return; + + // Exchange can only be done from bag to exchange inventories + uint32 srcInventory = pCSSrc->getSecondIndexInDB(); + if ( + (srcInventory == INVENTORIES::bag || + srcInventory == INVENTORIES::pet_animal1 || + srcInventory == INVENTORIES::pet_animal2 || + srcInventory == INVENTORIES::pet_animal3 || + srcInventory == INVENTORIES::pet_animal4 || + srcInventory == INVENTORIES::pet_animal5 || + srcInventory == INVENTORIES::pet_animal6 || + srcInventory == INVENTORIES::pet_animal7 || + srcInventory == INVENTORIES::player_room) + && getInventory().isInventoryAvailable((INVENTORIES::TInventory) pCSSrc->getSecondIndexInDB()) + && getInventory().isUsableItem(pCSSrc->getSheetId()) + ) + { + pCSDst->setCanDrop ( true ); + } + } +}; +REGISTER_ACTION_HANDLER (CCanDropToHotbar, "can_drop_to_hotbar"); // ********************************************************************************************************** diff --git a/ryzom/client/src/interface_v3/dbctrl_sheet.cpp b/ryzom/client/src/interface_v3/dbctrl_sheet.cpp index 0b8cda2ee..6f6b9e519 100644 --- a/ryzom/client/src/interface_v3/dbctrl_sheet.cpp +++ b/ryzom/client/src/interface_v3/dbctrl_sheet.cpp @@ -315,6 +315,7 @@ CCtrlSheetInfo::CCtrlSheetInfo() _ItemSlot= SLOTTYPE::UNDEFINED; _AutoGrayed= false; _HasTradeSlotType = false; + _IsHotbarSlot = false; _BrickOverable= false; _ReadQuantityFromSheet = false; _AHOnLeftClick = NULL; @@ -390,6 +391,10 @@ bool CCtrlSheetInfo::parseCtrlInfo(xmlNodePtr cur, CInterfaceGroup * /* parentGr prop = (char*) xmlGetProp( cur, (xmlChar*)"use_slot_type_db_entry" ); if (prop) _HasTradeSlotType= CInterfaceElement::convertBool(prop); + + prop = (char*) xmlGetProp( cur, (xmlChar*)"hotbar_slot" ); + if (prop) + _IsHotbarSlot= CInterfaceElement::convertBool(prop); // Read Action handlers CAHManager::getInstance()->parseAH(cur, "onclick_l", "params_l", _AHOnLeftClick, _AHLeftClickParams); @@ -3789,6 +3794,11 @@ bool CDBCtrlSheet::canDropItem(CDBCtrlSheet *src) const bf|= 1<getSheetId()) ) + { + return true; + } + // Look if one slot solution match. if( pIS->SlotBF & bf ) { diff --git a/ryzom/client/src/interface_v3/dbctrl_sheet.h b/ryzom/client/src/interface_v3/dbctrl_sheet.h index 2ccbdf00a..ec0104bcb 100644 --- a/ryzom/client/src/interface_v3/dbctrl_sheet.h +++ b/ryzom/client/src/interface_v3/dbctrl_sheet.h @@ -169,6 +169,7 @@ public: // and another in the source slot. Useful for items to buy that are in infinite quantity. bool _AutoGrayed : 1; // if true then gray the ctrlSheeet if: 1/ Items: Is the Item Locked. 2/ Bricks: is the brick Latent. bool _HasTradeSlotType : 1; // true is the SLOT_TYPE DB field should be taken in account + bool _IsHotbarSlot : 1; // true if the slot is part of the hotbar bool _BrickOverable : 1; // if Type is Brick, display like a button (because LeftClickable). @@ -273,6 +274,7 @@ public: uint32 getItemNameId() const { return (uint32)_NameId.getSInt32();} // New Stack Size sint32 getStackable() const { return (_Stackable>1) ? 999 : 1; } + bool isHotbarSlot() const { return _IsHotbarSlot; } // get non locked quantity (can be zero) sint32 getNonLockedQuantity() const; diff --git a/ryzom/client/src/interface_v3/inventory_manager.cpp b/ryzom/client/src/interface_v3/inventory_manager.cpp index 04ad896bc..d39a90abf 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.cpp +++ b/ryzom/client/src/interface_v3/inventory_manager.cpp @@ -74,6 +74,7 @@ CInventoryManager *CInventoryManager::_Instance = NULL; NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupListSheetBag, std::string, "list_sheet_bag"); NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupIconListBag, std::string, "list_icon_bag"); NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupListSheetFilterCLMSlot, std::string, "list_sheet_filter_clm_slot"); +NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupListSheetFilterHotbarSlot, std::string, "list_sheet_filter_hotbar_slot"); NLMISC_REGISTER_OBJECT(CViewBase, CDBGroupListSheetFilterExchangeable, std::string, "list_sheet_filter_exchangeable"); // *************************************************************************** @@ -527,6 +528,12 @@ void CInventoryManager::init() UIEquip[SLOT_EQUIPMENT::LEGS] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_ARMOR_LEGS)); UIEquip[SLOT_EQUIPMENT::HANDS] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_ARMOR_HANDS)); + UIEquip[19] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR_1)); + UIEquip[20] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR_2)); + UIEquip[21] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR_3)); + UIEquip[22] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR_4)); + UIEquip[23] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR_5)); + UIEquip2[SLOT_EQUIPMENT::HEADDRESS] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_JEWL2_HEADDRESS)); UIEquip2[SLOT_EQUIPMENT::EARL] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_JEWL2_EARING_LEFT)); UIEquip2[SLOT_EQUIPMENT::EARR] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_JEWL2_EARING_RIGHT)); @@ -545,6 +552,11 @@ void CInventoryManager::init() UIEquip2[SLOT_EQUIPMENT::LEGS] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_ARMR2_LEGS)); UIEquip2[SLOT_EQUIPMENT::HANDS] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_ARMR2_HANDS)); + UIEquip2[19] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR2_1)); + UIEquip2[20] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR2_2)); + UIEquip2[21] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR2_3)); + UIEquip2[22] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR2_4)); + UIEquip2[23] = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(CTRL_HOTBAR2_5)); // Init ItemInfoObservers { @@ -758,6 +770,20 @@ bool CInventoryManager::isForageToolItem(uint32 sheetID) return result; } +// *************************************************************************** +bool CInventoryManager::isUsableItem(uint32 sheetID) +{ + bool result = false; + CEntitySheet *sheet= SheetMngr.get(CSheetId(sheetID)); + if(sheet && sheet->type()== CEntitySheet::ITEM) + { + CItemSheet *item= (CItemSheet*)sheet; + if( ITEMFAMILY::isUsable(item->Family) ) + result = true; + } + return result; +} + // *************************************************************************** uint32 CInventoryManager::getHandItemSheet( bool rightHand ) const { @@ -2608,6 +2634,42 @@ bool CDBGroupListSheetFilterCLMSlot::CSheetChildFilter::isSheetValid(CDBGroupLis return false; } +// *************************************************************************** +// CDBGroupListSheetFilterHotbarSlot +// *************************************************************************** + +// *************************************************************************** +bool CDBGroupListSheetFilterHotbarSlot::CSheetChildFilter::isSheetValid(CDBGroupListSheet *pFather) +{ + if (CSheetChild::isSheetValid(pFather)) + { + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + CDBCtrlSheet *clmCtrl = dynamic_cast(CWidgetManager::getInstance()->getCtrlLaunchingModal()); + if (!clmCtrl || !Ctrl) return false; + if (clmCtrl->getInventoryIndex() == INVENTORIES::exchange && + Ctrl->getInventoryIndex() == INVENTORIES::exchange) + { + return false; + } + if ((clmCtrl->getType() == CCtrlSheetInfo::SheetType_Item) && + (Ctrl->getType() == CCtrlSheetInfo::SheetType_Item) ) + { + // Ok if we can put in the slot Ctrl in clmCtrl + if ( clmCtrl->canDropItem(Ctrl)) + { + string sTmp = Ctrl->getSheet(); + // Look if the source is locked + sTmp = sTmp.substr(sTmp.rfind(':')+1,sTmp.size()); + sint32 nTmp; + fromString(sTmp, nTmp); + if (!getInventory().isBagItemWeared(nTmp) && getInventory().isUsableItem(Ctrl->getSheetId()) && Ctrl->getLockedByOwner() == 0) + return true; + } + } + } + return false; +} + // *************************************************************************** // CDBGroupListSheetFilterExchangeable // *************************************************************************** @@ -3121,10 +3183,11 @@ class CHandlerInvCannotDrop : public IActionHandler // Is the dragged sheet comes from a slot if (!getInventory().isDraggingFromTextList()) { - // Unequip CDBCtrlSheet *pCSDst = dynamic_cast(pCaller); - string invPath = getInventory().getDBIndexPath(pCSDst); - getInventory().unequip(invPath); + if (!pCSDst->isHotbarSlot()) { + string invPath = getInventory().getDBIndexPath(pCSDst); + getInventory().unequip(invPath); + } } getInventory().endDrag(); } @@ -3132,6 +3195,207 @@ class CHandlerInvCannotDrop : public IActionHandler REGISTER_ACTION_HANDLER( CHandlerInvCannotDrop, "inv_cannot_drop" ); +// *************************************************************************** +class CHandlerHotbarDropTo : public IActionHandler +{ + virtual void execute (CCtrlBase *pCaller, const string &Params) + { + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + + // Check that we have drag'n'drop from inventory (list or slot) + // Or if we have launched the choose_bag modal + // To prevent other things to happens + string src = getParam(Params, "src"); + CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); + CDBCtrlSheet *pCSSrc = dynamic_cast(pElt); + CDBCtrlSheet *pCSDst = dynamic_cast(pCaller); + CAHManager::getInstance()->runActionHandler("swap_item", pCSDst, "src="+toString(pCSSrc->getId())); + getInventory().endDrag(); + if (!getInventory().isDragging()) + { + CInterfaceGroup *pIG = CWidgetManager::getInstance()->getModalWindow(); + if (pIG == NULL) return; + if (pIG->getId() != "ui:interface:bag_choose") return; + getInventory().beginDrag(NULL, CInventoryManager::TextList); + + // Special case for choose in bag dialog + string src = getParam(Params, "src"); + CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); + CDBCtrlSheet *pCSSrc = dynamic_cast(pElt); + CDBCtrlSheet *pCSDst = dynamic_cast(pCaller); + + string invPath = getInventory().getDBIndexPath(pCSSrc); + string bagPath = pCSDst->getSheet(); + + if (bagPath == "UI:EMPTY") + CAHManager::getInstance()->runActionHandler("swap_item", pCSDst, "src="+toString(pCSSrc->getId())); + else + getInventory().equip (bagPath, invPath); + + getInventory().endDrag(); + return; + } + + string src = getParam(Params, "src"); + CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); + CDBCtrlSheet *pCSSrc = dynamic_cast(pElt); + CDBCtrlSheet *pCSDst = dynamic_cast(pCaller); + if (pCSSrc == NULL) return; + + // Is the dragged sheet comes from an inventory list + if (getInventory().isDraggingFromTextList() || getInventory().isDraggingFromIconList()) + { + // If the destination is an equipment slot ? + if (pCSDst != NULL) + { + string invPath = getInventory().getDBIndexPath(pCSDst); // Get the index in the equipment + if (!invPath.empty()) + { + // Drop to the slot ie write the database with the index of the slot + string bagPath = pCSSrc->getSheet(); // Get the database branch of the dragged sheet + + if (pCSSrc && pCSSrc->getType() == CCtrlSheetInfo::SheetType_Item) + if (pCSDst && pCSDst->getType() == CCtrlSheetInfo::SheetType_Item) + { + // If the destination slot match with the type of incoming item + if (pCSDst->canDropItem(pCSSrc)) + { + // So directly equip + getInventory().equip(bagPath, invPath); + } + else + { + // Else try to auto equip the player with the incoming item + const string sTmp = bagPath.substr(bagPath.rfind(':')+1,bagPath.size()); + sint index; + fromString(sTmp, index); + if (!getInventory().autoEquip(index, false)) + getInventory().autoEquip(index, true); + } + } + getInventory().endDrag(); + return; + } + } + + // If the destination is a list sheet + IListSheetBase *pListDst = dynamic_cast(pCaller); + if ((pListDst == NULL) && (pCSDst != NULL)) + pListDst = IListSheetBase::getListContaining(pCSDst); + IListSheetBase *pListSrc = IListSheetBase::getListContaining(pCSSrc); + if ((pListDst != NULL) && (pListSrc != NULL)) + { + // If the source list and destination list are the same + if (pListDst == pListSrc) + { + // no op + getInventory().endDrag(); + return; + } + else // Source list and destination list are not the same + { + // Move the item to the destination list using the procedure move_to_xxx + CDBGroupListSheetBag *pListDstText = dynamic_cast(pListDst); + CDBGroupIconListBag *pListDstIcon = dynamic_cast(pListDst); + + if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvBag)) || + ((pListDstIcon != NULL) && (pListDstIcon->getInvType() == CInventoryManager::InvBag))) + { + CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_bag"); + } + else if (((pListDstText != NULL) && ((pListDstText->getInvType() == CInventoryManager::InvPA0) || + (pListDstText->getInvType() == CInventoryManager::InvPA1) || + (pListDstText->getInvType() == CInventoryManager::InvPA2) || + (pListDstText->getInvType() == CInventoryManager::InvPA3) || + (pListDstText->getInvType() == CInventoryManager::InvPA4) || + (pListDstText->getInvType() == CInventoryManager::InvPA5) || + (pListDstText->getInvType() == CInventoryManager::InvPA6) + )) || + ((pListDstIcon != NULL) && ((pListDstIcon->getInvType() == CInventoryManager::InvPA0) || + (pListDstIcon->getInvType() == CInventoryManager::InvPA1) || + (pListDstIcon->getInvType() == CInventoryManager::InvPA2) || + (pListDstIcon->getInvType() == CInventoryManager::InvPA3) || + (pListDstIcon->getInvType() == CInventoryManager::InvPA4) || + (pListDstIcon->getInvType() == CInventoryManager::InvPA5) || + (pListDstIcon->getInvType() == CInventoryManager::InvPA6) + ))) + { + string sTmp; + if (pListDstText != NULL) sTmp = toString("%d",pListDstText->getInvType()-CInventoryManager::InvPA0); + if (pListDstIcon != NULL) sTmp = toString("%d",pListDstIcon->getInvType()-CInventoryManager::InvPA0); + nlinfo("ici :%s", sTmp.c_str()); + CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_pa|"+sTmp); + } + else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvGuild)) || + ((pListDstIcon != NULL) && (pListDstIcon->getInvType() == CInventoryManager::InvGuild))) + { + CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_guild"); + } + else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvRoom)) || + ((pListDstIcon != NULL) && (pListDstIcon->getInvType() == CInventoryManager::InvRoom))) + { + CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_room"); + } + } + } + } + + // Is the dragged sheet comes from another slot + if (pCSDst != NULL) + if (getInventory().isDraggingFromSlot()) + { + CAHManager::getInstance()->runActionHandler("swap_item", pCSDst, "src="+toString(pCSSrc->getId())); + } + + CAHManager::getInstance()->runActionHandler("inv_cannot_drop", pCSSrc); + } +}; +REGISTER_ACTION_HANDLER( CHandlerHotbarDropTo, "hotbar_drop" ); + +// ********************************************************************************************************** +class CHotbarLeftClickOnSlotHandler : public IActionHandler +{ + virtual void execute (CCtrlBase *pCaller, const string &/* Params */) + { + CDBCtrlSheet *sheet = dynamic_cast(pCaller); + if (!sheet) return; + if (sheet->getSheetId() == 0) + { + // is there's no item that is not worn, can't choose any item) + bool isThereObjectNotWorn = false; + for(uint k = 0; k < MAX_BAGINV_ENTRIES; ++k) + { + uint32 sheetid = getInventory().getBagItem(k).getSheetID(); + if (sheetid != 0) + { + if (!getInventory().isBagItemWeared(k)) + { + CEntitySheet *pES = SheetMngr.get(CSheetId(sheetid)); + if (pES && pES->type()== CEntitySheet::ITEM) + { + CItemSheet *pIS = (CItemSheet*)pES; + if (getInventory().isUsableItem(sheetid)) + { + isThereObjectNotWorn = true; + break; + } + } + } + } + } + + if (!isThereObjectNotWorn) + { + // every object are worn, so there's no use to display an empty list -> no-op + return; + } + } + CInterfaceManager *im = CInterfaceManager::getInstance(); + CWidgetManager::getInstance()->pushModalWindow(pCaller, "ui:interface:hotbar_choose"); + } +}; +REGISTER_ACTION_HANDLER(CHotbarLeftClickOnSlotHandler, "hotbar_left_click_on_slot"); + // *************************************************************************** class CHandlerInvAutoEquip : public IActionHandler { diff --git a/ryzom/client/src/interface_v3/inventory_manager.h b/ryzom/client/src/interface_v3/inventory_manager.h index d5bd763f1..c1bf5f4fc 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.h +++ b/ryzom/client/src/interface_v3/inventory_manager.h @@ -250,6 +250,8 @@ public: bool isSword(uint32 sheetID); // Check if an item is a forage tool bool isForageToolItem(uint32 sheetID); + // Check if an item is usable + bool isUsableItem(uint32 sheetID); // Get the Hand item sheet uint32 getRightHandItemSheet() const { return getHandItemSheet(true); } uint32 getLeftHandItemSheet() const { return getHandItemSheet(false); } @@ -745,6 +747,25 @@ public: }; }; +// *************************************************************************** +/** + * Special list for filtering items which are usable + */ +class CDBGroupListSheetFilterHotbarSlot : public CDBGroupListSheet +{ +public: + CDBGroupListSheetFilterHotbarSlot (const TCtorParam ¶m) + : CDBGroupListSheet(param) + {} + + virtual CSheetChild *createSheetChild() { return new CSheetChildFilter; } + + // A child node + struct CSheetChildFilter : public CDBGroupListSheet::CSheetChild + { + virtual bool isSheetValid(CDBGroupListSheet *pFather); + }; +}; // *************************************************************************** /** @@ -861,6 +882,12 @@ private: #define CTRL_ARMOR_ARMS "ui:interface:inv_equip:content:equip:armors:arms" #define CTRL_ARMOR_HANDS "ui:interface:inv_equip:content:equip:armors:hands" +#define CTRL_HOTBAR_1 "ui:interface:inv_equip:content:equip:hotbar:hotbar1" +#define CTRL_HOTBAR_2 "ui:interface:inv_equip:content:equip:hotbar:hotbar2" +#define CTRL_HOTBAR_3 "ui:interface:inv_equip:content:equip:hotbar:hotbar3" +#define CTRL_HOTBAR_4 "ui:interface:inv_equip:content:equip:hotbar:hotbar4" +#define CTRL_HOTBAR_5 "ui:interface:inv_equip:content:equip:hotbar:hotbar5" + #define CTRL_JEWL2_EARING_LEFT "ui:interface:inventory:content:equip:jewelry:earing_l" #define CTRL_JEWL2_BRACELET_LEFT "ui:interface:inventory:content:equip:jewelry:bracelet_l" #define CTRL_JEWL2_RING_LEFT "ui:interface:inventory:content:equip:jewelry:ring_l" @@ -879,6 +906,12 @@ private: #define CTRL_ARMR2_ARMS "ui:interface:inventory:content:equip:armors:arms" #define CTRL_ARMR2_HANDS "ui:interface:inventory:content:equip:armors:hands" +#define CTRL_HOTBAR2_1 "ui:interface:inventory:content:equip:hotbar:hotbar1" +#define CTRL_HOTBAR2_2 "ui:interface:inventory:content:equip:hotbar:hotbar2" +#define CTRL_HOTBAR2_3 "ui:interface:inventory:content:equip:hotbar:hotbar3" +#define CTRL_HOTBAR2_4 "ui:interface:inventory:content:equip:hotbar:hotbar4" +#define CTRL_HOTBAR2_5 "ui:interface:inventory:content:equip:hotbar:hotbar5" + #endif // RY_INVENTORY_MANAGER_H /* End of inventory_manager.h */ diff --git a/ryzom/common/src/game_share/item_family.cpp b/ryzom/common/src/game_share/item_family.cpp index 695225b11..ee9cc1702 100644 --- a/ryzom/common/src/game_share/item_family.cpp +++ b/ryzom/common/src/game_share/item_family.cpp @@ -124,6 +124,17 @@ namespace ITEMFAMILY } + bool isUsable( EItemFamily fam ) + { + return + fam == ITEM_SAP_RECHARGE || + fam == CRYSTALLIZED_SPELL || + fam == CONSUMABLE || + fam == XP_CATALYSER || + fam == TELEPORT; + + } + /** * returns true if items of this family are destroyed when they are completely worned out */ diff --git a/ryzom/common/src/game_share/item_family.h b/ryzom/common/src/game_share/item_family.h index 68c3110b0..200bcb710 100644 --- a/ryzom/common/src/game_share/item_family.h +++ b/ryzom/common/src/game_share/item_family.h @@ -95,6 +95,8 @@ namespace ITEMFAMILY bool isResellable( EItemFamily fam ); /// return true if this family of item can display a custom text bool isTextCustomizable( EItemFamily fam ); + /// return true if this family of item can use item (consume, execute, open, etc) + bool isUsable( EItemFamily fam ); /// is craftable }; // ITEMFAMILY