diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/widgets.xml b/code/ryzom/client/data/gamedev/interfaces_v3/widgets.xml
index 3c25c911a..70aea48b1 100644
--- a/code/ryzom/client/data/gamedev/interfaces_v3/widgets.xml
+++ b/code/ryzom/client/data/gamedev/interfaces_v3/widgets.xml
@@ -1847,7 +1847,17 @@
name="uimMtPaMount3"
handler="item_group_move"
params="pet_animal4" />
-
+
+
+
+
+
diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp
index 7f308c8d2..3b7badcfc 100644
--- a/code/ryzom/client/src/client_cfg.cpp
+++ b/code/ryzom/client/src/client_cfg.cpp
@@ -589,7 +589,7 @@ CClientConfig::CClientConfig()
FollowOnAtk = true;
AtkOnSelect = false;
TransparentUnderCursor = false;
-
+ ItemGroupAllowGuild = false;
// PREFERENCES
FPV = false;
CameraHeight = 2.5f;
@@ -1440,6 +1440,8 @@ void CClientConfig::setValues()
READ_BOOL_FV(FollowOnAtk);
READ_BOOL_FV(AtkOnSelect);
READ_BOOL_DEV(TransparentUnderCursor);
+ //
+ READ_BOOL_FV(ItemGroupAllowGuild);
/////////////////
diff --git a/code/ryzom/client/src/client_cfg.h b/code/ryzom/client/src/client_cfg.h
index 3a143ec1f..dd150dd49 100644
--- a/code/ryzom/client/src/client_cfg.h
+++ b/code/ryzom/client/src/client_cfg.h
@@ -571,6 +571,9 @@ struct CClientConfig
/// Makes entities transparent if they are under cursor
bool TransparentUnderCursor;
+ /// Allow item group to move from / to guild room
+ bool ItemGroupAllowGuild;
+
/////////////////
// PREFERENCES //
diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp
index 511d4f536..b05c5c71b 100644
--- a/code/ryzom/client/src/commands.cpp
+++ b/code/ryzom/client/src/commands.cpp
@@ -209,6 +209,11 @@ NLMISC_COMMAND(who, "Display all players currently in region","[listGroup();
+ return true;
+}
NLMISC_COMMAND(equipGroup, "equip group ", "name")
{
@@ -225,14 +230,38 @@ NLMISC_COMMAND(moveGroup, "move group to ", "name dst")
NLMISC_COMMAND(createGroup, "create group ", "name")
{
- if(args.empty()) return false;
- return CItemGroupManager::getInstance()->createGroup(args[0]);
+ if(args.empty())
+ {
+ CInterfaceManager *pIM = CInterfaceManager::getInstance();
+ pIM->displaySystemInfo(ucstring("Cannot create a group without name."));
+ return false;
+ }
+ if(!CItemGroupManager::getInstance()->createGroup(args[0]))
+ {
+ CInterfaceManager *pIM = CInterfaceManager::getInstance();
+ std::string msg = "A group named " + args[0] + "already exist, cannot create one with the same name.";
+ pIM->displaySystemInfo(ucstring(msg));
+ return false;
+ }
+ return true;
}
NLMISC_COMMAND(deleteGroup, "delete group ", "name")
{
- if(args.empty()) return false;
- return CItemGroupManager::getInstance()->deleteGroup(args[0]);
+ if(args.empty())
+ {
+ CInterfaceManager *pIM = CInterfaceManager::getInstance();
+ pIM->displaySystemInfo(ucstring("Cannot delete a group without name."));
+ return false;
+ }
+ if(!CItemGroupManager::getInstance()->deleteGroup(args[0]))
+ {
+ CInterfaceManager *pIM = CInterfaceManager::getInstance();
+ std::string msg = "Cannot delete group " + args[0] + " : no group with this name found.";
+ pIM->displaySystemInfo(msg);
+ return false;
+ }
+ return true;
}
NLMISC_COMMAND(naked, "get naked !", "")
diff --git a/code/ryzom/client/src/interface_v3/action_handler_item.cpp b/code/ryzom/client/src/interface_v3/action_handler_item.cpp
index 2c9a7f952..67699e329 100644
--- a/code/ryzom/client/src/interface_v3/action_handler_item.cpp
+++ b/code/ryzom/client/src/interface_v3/action_handler_item.cpp
@@ -1759,8 +1759,12 @@ class CHandlerItemMenuCheck : public IActionHandler
CViewTextMenu *pMoveToRoom = dynamic_cast(pMenu->getView("room"));
CViewTextMenu *pMoveToPa[MAX_INVENTORY_ANIMAL];
CViewTextMenu *pGroupSubMenu = dynamic_cast(pMenu->getView("item_group"));
- CViewTextMenu *pGroupMoveToBag = dynamic_cast(pMenu->getView("group_bag"));
CViewTextMenu *pGroupName = dynamic_cast(pMenu->getView("group_name"));
+ CViewTextMenu *pGroupMoveSubMenu = dynamic_cast(pMenu->getView("group_move"));
+ CViewTextMenu *pGroupMoveToBag = dynamic_cast(pMenu->getView("group_bag"));
+ CViewTextMenu *pGroupMoveToGuild = dynamic_cast(pMenu->getView("group_guild"));
+ CViewTextMenu *pGroupMoveToRoom = dynamic_cast(pMenu->getView("group_room"));
+
CViewTextMenu *pGroupMoveToPa[MAX_INVENTORY_ANIMAL];
bool bIsLockedByOwner = pCS->getLockedByOwner();
@@ -1912,10 +1916,12 @@ class CHandlerItemMenuCheck : public IActionHandler
if (pMoveToGuild)
pMoveToGuild->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::guild));
-
+ if (pGroupMoveToGuild)
+ pGroupMoveToGuild->setActive(ClientCfg.ItemGroupAllowGuild && invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::guild));
if (pMoveToRoom)
pMoveToRoom->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::player_room));
-
+ if (pGroupMoveToRoom)
+ pGroupMoveToRoom->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::player_room));
// std case: can drop / destroy
if(pDrop) pDrop->setActive(invId!=INVENTORIES::guild);
if(pDestroy) pDestroy->setActive(invId!=INVENTORIES::guild);
@@ -1924,20 +1930,24 @@ class CHandlerItemMenuCheck : public IActionHandler
// hide the move entry completely?
bool someMovePossible= false;
- if(pMoveSubMenu)
+ bool someGroupMovePossible = false;
+ if(pMoveSubMenu && pGroupMoveSubMenu)
{
if(pMoveToBag) someMovePossible= someMovePossible || pMoveToBag->getActive();
- if(pGroupMoveToBag) someMovePossible= someMovePossible || pGroupMoveToBag->getActive();
+ if(pGroupMoveToBag) someGroupMovePossible= someGroupMovePossible || pGroupMoveToBag->getActive();
for(i=0;igetActive();
- if(pGroupMoveToPa[i]) someMovePossible= someMovePossible || pGroupMoveToPa[i]->getActive();
+ if(pGroupMoveToPa[i]) someGroupMovePossible= someGroupMovePossible || pGroupMoveToPa[i]->getActive();
}
if(pMoveToGuild) someMovePossible= someMovePossible || pMoveToGuild->getActive();
if(pMoveToRoom) someMovePossible= someMovePossible || pMoveToRoom->getActive();
+ if(pGroupMoveToGuild) someGroupMovePossible= someGroupMovePossible || pGroupMoveToGuild->getActive();
+ if(pGroupMoveToRoom) someGroupMovePossible= someGroupMovePossible || (ClientCfg.ItemGroupAllowGuild && pGroupMoveToRoom->getActive());
pMoveSubMenu->setActive(someMovePossible);
+ pGroupMoveSubMenu->setActive(someGroupMovePossible);
}
// Equip
diff --git a/code/ryzom/client/src/item_group_manager.cpp b/code/ryzom/client/src/item_group_manager.cpp
index 0ff17d269..30e8d02b6 100644
--- a/code/ryzom/client/src/item_group_manager.cpp
+++ b/code/ryzom/client/src/item_group_manager.cpp
@@ -27,7 +27,7 @@
#include "net_manager.h"
#include "connection.h" // Used to access PlayerSelectedFileName for xml filename
#include "nel/gui/db_manager.h"
-
+#include "interface_v3/interface_manager.h"
CItemGroupManager *CItemGroupManager::_Instance = NULL;
CItemGroup::CItemGroup()
@@ -391,6 +391,15 @@ bool CItemGroupManager::deleteGroup(std::string name)
return true;
}
+void CItemGroupManager::listGroup()
+{
+ CInterfaceManager *pIM = CInterfaceManager::getInstance();
+ for(auto &group: _Groups)
+ {
+ pIM->displaySystemInfo(ucstring(group.name));
+ }
+}
+
//Used by AH
std::string CItemGroupManager::getGroupName(CDBCtrlSheet* pCS)
@@ -428,6 +437,10 @@ std::string CItemGroupManager::toDbPath(INVENTORIES::TInventory inventory)
return LIST_PA2_TEXT; break;
case INVENTORIES::TInventory::pet_animal4:
return LIST_PA3_TEXT; break;
+ case INVENTORIES::TInventory::player_room:
+ return LIST_ROOM_TEXT;break;
+ case INVENTORIES::TInventory::guild:
+ return ClientCfg.ItemGroupAllowGuild ? LIST_GUILD_TEXT : ""; break;
default:
return "";
}
diff --git a/code/ryzom/client/src/item_group_manager.h b/code/ryzom/client/src/item_group_manager.h
index 27b73757d..daeefea51 100644
--- a/code/ryzom/client/src/item_group_manager.h
+++ b/code/ryzom/client/src/item_group_manager.h
@@ -83,6 +83,7 @@ public:
bool equipGroup(std::string name, bool pullBefore=true);
bool createGroup(std::string name);
bool deleteGroup(std::string name);
+ void listGroup();
std::string getGroupName(CDBCtrlSheet *pCS);
private: