Merge remote-tracking branch 'origin/10-use-item-shortcut-client' into main/yubo-dev

main/yubo-dev
Nuno 3 years ago
parent 9fc091f99b
commit eda9f224bc

@ -1079,41 +1079,6 @@ class CCanDropToExchange : public IActionHandler
}; };
REGISTER_ACTION_HANDLER (CCanDropToExchange, "can_drop_to_exchange"); 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<CDBCtrlSheet*>(pElt);
CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(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");
// ********************************************************************************************************** // **********************************************************************************************************
/** Clear the selected sheet /** Clear the selected sheet

@ -314,7 +314,6 @@ CCtrlSheetInfo::CCtrlSheetInfo()
_ItemSlot= SLOTTYPE::UNDEFINED; _ItemSlot= SLOTTYPE::UNDEFINED;
_AutoGrayed= false; _AutoGrayed= false;
_HasTradeSlotType = false; _HasTradeSlotType = false;
_IsHotbarSlot = false;
_BrickOverable= false; _BrickOverable= false;
_ReadQuantityFromSheet = false; _ReadQuantityFromSheet = false;
_AHOnLeftClick = NULL; _AHOnLeftClick = NULL;
@ -390,10 +389,6 @@ bool CCtrlSheetInfo::parseCtrlInfo(xmlNodePtr cur, CInterfaceGroup * /* parentGr
prop = (char*) xmlGetProp( cur, (xmlChar*)"use_slot_type_db_entry" ); prop = (char*) xmlGetProp( cur, (xmlChar*)"use_slot_type_db_entry" );
if (prop) if (prop)
_HasTradeSlotType= CInterfaceElement::convertBool(prop); _HasTradeSlotType= CInterfaceElement::convertBool(prop);
prop = (char*) xmlGetProp( cur, (xmlChar*)"hotbar_slot" );
if (prop)
_IsHotbarSlot= CInterfaceElement::convertBool(prop);
// Read Action handlers // Read Action handlers
CAHManager::getInstance()->parseAH(cur, "onclick_l", "params_l", _AHOnLeftClick, _AHLeftClickParams); CAHManager::getInstance()->parseAH(cur, "onclick_l", "params_l", _AHOnLeftClick, _AHLeftClickParams);
@ -3798,11 +3793,6 @@ bool CDBCtrlSheet::canDropItem(CDBCtrlSheet *src) const
bf|= 1<<SLOTTYPE::RIGHT_HAND_EXCLUSIVE; bf|= 1<<SLOTTYPE::RIGHT_HAND_EXCLUSIVE;
} }
if ( _IsHotbarSlot && getInventory().isUsableItem(src->getSheetId()) )
{
return true;
}
// Look if one slot solution match. // Look if one slot solution match.
if( pIS->SlotBF & bf ) if( pIS->SlotBF & bf )
{ {

@ -168,7 +168,6 @@ public:
// and another in the source slot. Useful for items to buy that are in infinite quantity. // 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 _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 _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). bool _BrickOverable : 1; // if Type is Brick, display like a button (because LeftClickable).
@ -273,7 +272,6 @@ public:
uint32 getItemNameId() const { return (uint32)_NameId.getSInt32();} uint32 getItemNameId() const { return (uint32)_NameId.getSInt32();}
// New Stack Size // New Stack Size
sint32 getStackable() const { return (_Stackable>1) ? 999 : 1; } sint32 getStackable() const { return (_Stackable>1) ? 999 : 1; }
bool isHotbarSlot() const { return _IsHotbarSlot; }
// get non locked quantity (can be zero) // get non locked quantity (can be zero)
sint32 getNonLockedQuantity() const; sint32 getNonLockedQuantity() const;

@ -1030,6 +1030,11 @@ void CInventoryManager::equip(const std::string &bagPath, const std::string &inv
inventory = INVENTORIES::equipment; inventory = INVENTORIES::equipment;
fromString(invPath.substr(22,invPath.size()), invSlot); fromString(invPath.substr(22,invPath.size()), invSlot);
} }
else if (strnicmp(invPath.c_str(),"LOCAL:INVENTORY:HOTBAR",22) == 0)
{
inventory = INVENTORIES::hotbar;
fromString(invPath.substr(23,invPath.size()), invSlot);
}
// Hands management : check if we have to unequip left hand because of incompatibility with right hand item // Hands management : check if we have to unequip left hand because of incompatibility with right hand item
sint16 oldRightIndexInBag = NLGUI::CDBManager::getInstance()->getDbProp(invPath + ":INDEX_IN_BAG")->getValue16(); sint16 oldRightIndexInBag = NLGUI::CDBManager::getInstance()->getDbProp(invPath + ":INDEX_IN_BAG")->getValue16();
@ -1163,6 +1168,11 @@ void CInventoryManager::unequip(const std::string &invPath)
inventory = INVENTORIES::equipment; inventory = INVENTORIES::equipment;
fromString(invPath.substr(22,invPath.size()), invSlot); fromString(invPath.substr(22,invPath.size()), invSlot);
} }
else if (strnicmp(invPath.c_str(),"LOCAL:INVENTORY:HOTBAR",22) == 0)
{
inventory = INVENTORIES::hotbar;
fromString(invPath.substr(23,invPath.size()), invSlot);
}
// Hands management : check if we have to unequip left hand because of incompatibility with right hand item // Hands management : check if we have to unequip left hand because of incompatibility with right hand item
if (inventory == INVENTORIES::handling && invSlot == 0) if (inventory == INVENTORIES::handling && invSlot == 0)
@ -1365,14 +1375,11 @@ void CInventoryManager::CDBEquipObs::update(ICDBNode* node)
// Remove Last reference and update database // Remove Last reference and update database
sint16 oldVal = pNL->getOldValue16(); sint16 oldVal = pNL->getOldValue16();
sint16 newVal = pNL->getValue16(); sint16 newVal = pNL->getValue16();
if (sIE != CTRL_HOTBAR_1 && sIE != CTRL_HOTBAR_2 && sIE != CTRL_HOTBAR_3 && sIE != CTRL_HOTBAR_4 && sIE != CTRL_HOTBAR_5) if (oldVal != 0)
{ getInventory().unwearBagItem (oldVal-1);
if (oldVal != 0)
getInventory().unwearBagItem (oldVal-1);
if (newVal != 0) if (newVal != 0)
getInventory().wearBagItem (newVal-1); getInventory().wearBagItem (newVal-1);
}
// Update Display // Update Display
if (newVal == 0) if (newVal == 0)
@ -3113,7 +3120,7 @@ class CHandlerInvDropTo : public IActionHandler
{ {
CInterfaceGroup *pIG = CWidgetManager::getInstance()->getModalWindow(); CInterfaceGroup *pIG = CWidgetManager::getInstance()->getModalWindow();
if (pIG == NULL) return; if (pIG == NULL) return;
if (pIG->getId() != "ui:interface:bag_choose") return; if (pIG->getId() != "ui:interface:bag_choose" && pIG->getId() != "ui:interface:hotbar_choose") return;
getInventory().beginDrag(NULL, CInventoryManager::TextList); getInventory().beginDrag(NULL, CInventoryManager::TextList);
// Special case for choose in bag dialog // Special case for choose in bag dialog
@ -3275,173 +3282,40 @@ class CHandlerInvCannotDrop : public IActionHandler
if (!getInventory().isDraggingFromTextList()) if (!getInventory().isDraggingFromTextList())
{ {
CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(pCaller); CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(pCaller);
if (!pCSDst->isHotbarSlot()) { string invPath = getInventory().getDBIndexPath(pCSDst);
string invPath = getInventory().getDBIndexPath(pCSDst); getInventory().unequip(invPath);
getInventory().unequip(invPath);
}
} }
getInventory().endDrag(); getInventory().endDrag();
} }
}; };
REGISTER_ACTION_HANDLER( CHandlerInvCannotDrop, "inv_cannot_drop" ); REGISTER_ACTION_HANDLER( CHandlerInvCannotDrop, "inv_cannot_drop" );
// **********************************************************************************************************
// *************************************************************************** class CCanDropToHotbar : public IActionHandler
class CHandlerHotbarDropTo : public IActionHandler
{ {
virtual void execute (CCtrlBase *pCaller, const string &Params) virtual void execute (CCtrlBase *pCaller, const string &Params)
{ {
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();
nlinfo("hey");
// 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"); string src = getParam(Params, "src");
CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src);
CDBCtrlSheet *pCSSrc = dynamic_cast<CDBCtrlSheet*>(pElt); CDBCtrlSheet *pCSSrc = dynamic_cast<CDBCtrlSheet*>(pElt);
CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(pCaller); CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(pCaller);
CAHManager::getInstance()->runActionHandler("swap_item", pCSDst, "src="+toString(pCSSrc->getId())); if (!pCSSrc || !pCSDst) return;
getInventory().endDrag();
// if (!getInventory().isDragging()) // Exchange can only be done from bag to exchange inventories
// { uint32 srcInventory = pCSSrc->getSecondIndexInDB();
// CInterfaceGroup *pIG = CWidgetManager::getInstance()->getModalWindow(); if (
// if (pIG == NULL) return; srcInventory == INVENTORIES::bag
// if (pIG->getId() != "ui:interface:bag_choose") return; && getInventory().isInventoryAvailable((INVENTORIES::TInventory) pCSSrc->getSecondIndexInDB())
// getInventory().beginDrag(NULL, CInventoryManager::TextList); && getInventory().isUsableItem(pCSSrc->getSheetId())
)
// // Special case for choose in bag dialog {
// string src = getParam(Params, "src"); pCSDst->setCanDrop ( true );
// CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); }
// CDBCtrlSheet *pCSSrc = dynamic_cast<CDBCtrlSheet*>(pElt);
// CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(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<CDBCtrlSheet*>(pElt);
// CDBCtrlSheet *pCSDst = dynamic_cast<CDBCtrlSheet*>(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<IListSheetBase*>(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<CDBGroupListSheetBag*>(pListDst);
// CDBGroupIconListBag *pListDstIcon = dynamic_cast<CDBGroupIconListBag*>(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" ); REGISTER_ACTION_HANDLER (CCanDropToHotbar, "can_drop_to_hotbar");
// ********************************************************************************************************** // **********************************************************************************************************
class CHotbarLeftClickOnSlotHandler : public IActionHandler class CHotbarLeftClickOnSlotHandler : public IActionHandler

@ -33,6 +33,7 @@ namespace INVENTORIES
NL_STRING_CONVERSION_TABLE_ENTRY(handling) NL_STRING_CONVERSION_TABLE_ENTRY(handling)
NL_STRING_CONVERSION_TABLE_ENTRY(temporary) NL_STRING_CONVERSION_TABLE_ENTRY(temporary)
NL_STRING_CONVERSION_TABLE_ENTRY(equipment) NL_STRING_CONVERSION_TABLE_ENTRY(equipment)
NL_STRING_CONVERSION_TABLE_ENTRY(hotbar)
NL_STRING_CONVERSION_TABLE_ENTRY(bag) NL_STRING_CONVERSION_TABLE_ENTRY(bag)
NL_STRING_CONVERSION_TABLE_ENTRY(pet_animal1) NL_STRING_CONVERSION_TABLE_ENTRY(pet_animal1)
NL_STRING_CONVERSION_TABLE_ENTRY(pet_animal2) NL_STRING_CONVERSION_TABLE_ENTRY(pet_animal2)
@ -49,7 +50,6 @@ namespace INVENTORIES
NL_STRING_CONVERSION_TABLE_ENTRY(reward_sharing) NL_STRING_CONVERSION_TABLE_ENTRY(reward_sharing)
NL_STRING_CONVERSION_TABLE_ENTRY(guild) NL_STRING_CONVERSION_TABLE_ENTRY(guild)
NL_STRING_CONVERSION_TABLE_ENTRY(player_room) NL_STRING_CONVERSION_TABLE_ENTRY(player_room)
NL_STRING_CONVERSION_TABLE_ENTRY(hotbar)
NL_END_STRING_CONVERSION_TABLE(TInventory, InventoryToString, UNDEFINED) NL_END_STRING_CONVERSION_TABLE(TInventory, InventoryToString, UNDEFINED)
@ -95,6 +95,7 @@ namespace INVENTORIES
"TEMP", // temporary "TEMP", // temporary
// "", // pick-up // "", // pick-up
"EQUIP", // equipment "EQUIP", // equipment
"HOTBAR", // hotbar
"", // bag "", // bag
"", // pack_animal1 "", // pack_animal1
"", // pack_animal2 "", // pack_animal2
@ -109,7 +110,6 @@ namespace INVENTORIES
// "", // exchange_proposition // "", // exchange_proposition
"", // guild "", // guild
"", // player_room "", // player_room
"HOTBAR", // hotbar
"" // unknown "" // unknown
}; };

@ -158,8 +158,9 @@ namespace INVENTORIES
handling = 0, handling = 0,
temporary, // 1 temporary, // 1
equipment, // 2 equipment, // 2
bag, // 3 hotbar, // 3
pet_animal, // 4 Character can have 7 pack animal bag, // 4
pet_animal, // 5 Character can have 7 pack animal
pet_animal1 = pet_animal, // for toString => TInventory convertion pet_animal1 = pet_animal, // for toString => TInventory convertion
pet_animal2, pet_animal2,
pet_animal3, pet_animal3,
@ -167,18 +168,17 @@ namespace INVENTORIES
pet_animal5, pet_animal5,
pet_animal6, pet_animal6,
pet_animal7, pet_animal7,
max_pet_animal, // 11 max_pet_animal, // 12
NUM_INVENTORY = max_pet_animal, // 11 NUM_INVENTORY = max_pet_animal, // 12
UNDEFINED = NUM_INVENTORY, // 11 UNDEFINED = NUM_INVENTORY, // 12
exchange, // 12 This is not a bug : exchange is a fake inventory exchange, // 13 This is not a bug : exchange is a fake inventory
exchange_proposition, // 13 and should not count in the number of inventory exchange_proposition, // 14 and should not count in the number of inventory
// same for botChat trading. // same for botChat trading.
trading, // 14 trading, // 15
reward_sharing, // 15 fake inventory, not in database.xml. Used by the item info protocol only reward_sharing, // 16 fake inventory, not in database.xml. Used by the item info protocol only
guild, // 16 (warning: number stored in guild saved file) guild, // 17 (warning: number stored in guild saved file)
player_room, // 17 player_room, // 18
hotbar, // 18
NUM_ALL_INVENTORY // warning: distinct from NUM_INVENTORY NUM_ALL_INVENTORY // warning: distinct from NUM_INVENTORY
}; };

Loading…
Cancel
Save