--HG--
branch : item_group
This commit is contained in:
Guillaume Dupuy 2017-03-16 11:36:24 +01:00
parent 27b7131e22
commit a6f541aad2
2 changed files with 31 additions and 13 deletions

View file

@ -38,9 +38,9 @@ CItemGroup::CItemGroup()
bool CItemGroup::contains(CDBCtrlSheet *other) bool CItemGroup::contains(CDBCtrlSheet *other)
{ {
for(int i=0;i<_Items.size();i++) for(int i=0;i<Items.size();i++)
{ {
CItem item = _Items[i]; CItem item = Items[i];
NLMISC::CSheetId sheet = NLMISC::CSheetId(other->getSheetId()); NLMISC::CSheetId sheet = NLMISC::CSheetId(other->getSheetId());
if (sheet.toString() == item.sheetName && other->getQuality() == item.quality && if (sheet.toString() == item.sheetName && other->getQuality() == item.quality &&
other->getItemWeight() == item.weight && other->getItemColor() == item.color && other->getItemWeight() == item.weight && other->getItemColor() == item.color &&
@ -56,16 +56,16 @@ bool CItemGroup::contains(CDBCtrlSheet *other)
void CItemGroup::addItem(std::string sheetName, uint16 quality, uint32 weight, uint8 color) void CItemGroup::addItem(std::string sheetName, uint16 quality, uint32 weight, uint8 color)
{ {
_Items.push_back(CItem(sheetName, quality, weight, color)); Items.push_back(CItem(sheetName, quality, weight, color));
} }
void CItemGroup::writeTo(xmlNodePtr node) void CItemGroup::writeTo(xmlNodePtr node)
{ {
xmlNodePtr groupNode = xmlNewChild (node, NULL, (const xmlChar*)"group", NULL ); xmlNodePtr groupNode = xmlNewChild (node, NULL, (const xmlChar*)"group", NULL );
xmlSetProp(groupNode, (const xmlChar*)"name", (const xmlChar*)name.c_str()); xmlSetProp(groupNode, (const xmlChar*)"name", (const xmlChar*)name.c_str());
for(int i=0;i<_Items.size();i++) for(int i=0;i<Items.size();i++)
{ {
CItem item = _Items[i]; CItem item = Items[i];
xmlNodePtr itemNode = xmlNewChild(groupNode, NULL, (const xmlChar*)"item", NULL); xmlNodePtr itemNode = xmlNewChild(groupNode, NULL, (const xmlChar*)"item", NULL);
xmlSetProp (itemNode, (const xmlChar*)"sheetName", (const xmlChar*)item.sheetName.c_str()); xmlSetProp (itemNode, (const xmlChar*)"sheetName", (const xmlChar*)item.sheetName.c_str());
xmlSetProp (itemNode, (const xmlChar*)"quality", (const xmlChar*)NLMISC::toString(item.quality).c_str()); xmlSetProp (itemNode, (const xmlChar*)"quality", (const xmlChar*)NLMISC::toString(item.quality).c_str());
@ -103,7 +103,9 @@ void CItemGroup::readFrom(xmlNodePtr node)
ptrName = (char*) xmlGetProp(curNode, (xmlChar*)"maxPrice"); ptrName = (char*) xmlGetProp(curNode, (xmlChar*)"maxPrice");
if (ptrName) NLMISC::fromString((const char*)ptrName, item.maxPrice); if (ptrName) NLMISC::fromString((const char*)ptrName, item.maxPrice);
item.usePrice = (item.minPrice != 0 || item.maxPrice != std::numeric_limits<uint32>::max()); item.usePrice = (item.minPrice != 0 || item.maxPrice != std::numeric_limits<uint32>::max());
_Items.push_back(item); //Old version of groups.xml could save unknown sheets, remove them for clarity
if(item.sheetName != "unknown.unknown")
Items.push_back(item);
} }
curNode = curNode->next; curNode = curNode->next;
} }
@ -165,6 +167,11 @@ CItemGroupManager::CItemGroupManager()
void CItemGroupManager::init() void CItemGroupManager::init()
{ {
loadGroups(); loadGroups();
linkInterface();
}
void CItemGroupManager::linkInterface()
{
//attach item group subgroup to right-click in bag group //attach item group subgroup to right-click in bag group
CWidgetManager* pWM = CWidgetManager::getInstance(); CWidgetManager* pWM = CWidgetManager::getInstance();
CGroupMenu *pRootMenu = dynamic_cast<CGroupMenu*>(pWM->getElementFromId("ui:interface:item_menu_in_bag")); CGroupMenu *pRootMenu = dynamic_cast<CGroupMenu*>(pWM->getElementFromId("ui:interface:item_menu_in_bag"));
@ -175,19 +182,23 @@ void CItemGroupManager::init()
if(pMenu && pGroupSubMenu) if(pMenu && pGroupSubMenu)
pMenu->setSubMenu(pMenu->getNumLine() - 1, pGroupSubMenu); pMenu->setSubMenu(pMenu->getNumLine() - 1, pGroupSubMenu);
else else
nlinfo("Couldn't update yet, maybe wait a little bit ?"); nlwarning("Couldn't link group action to group menu, interface isn't initialize yet ?");
} }
void CItemGroupManager::uninit() void CItemGroupManager::uninit()
{ {
saveGroups(); saveGroups();
} }
// Inspired from macro parsing // Inspired from macro parsing
void CItemGroupManager::saveGroups() void CItemGroupManager::saveGroups()
{ {
std::string userGroupFileName = "save/groups_" + PlayerSelectedFileName + ".xml"; std::string userGroupFileName = "save/groups_" + PlayerSelectedFileName + ".xml";
if(PlayerSelectedFileName.empty())
{
nlwarning("Trying to save group with an empty PlayerSelectedFileName, aborting");
return;
}
try { try {
NLMISC::COFile f; NLMISC::COFile f;
if(f.open(userGroupFileName, false, false, true)) if(f.open(userGroupFileName, false, false, true))
@ -222,6 +233,11 @@ bool CItemGroupManager::loadGroups()
{ {
std::string userGroupFileName = "save/groups_" + PlayerSelectedFileName + ".xml"; std::string userGroupFileName = "save/groups_" + PlayerSelectedFileName + ".xml";
if(PlayerSelectedFileName.empty())
{
nlwarning("Trying to load group with an empty PlayerSelectedFileName, aborting");
return false;
}
if (!NLMISC::CFile::fileExists(userGroupFileName) || NLMISC::CFile::getFileSize(userGroupFileName) == 0) if (!NLMISC::CFile::fileExists(userGroupFileName) || NLMISC::CFile::getFileSize(userGroupFileName) == 0)
{ {
nlinfo("No item groups file found !"); nlinfo("No item groups file found !");
@ -380,6 +396,7 @@ bool CItemGroupManager::createGroup(std::string name)
{ {
pCS = CInventoryManager::getInstance()->getHandSheet(i); pCS = CInventoryManager::getInstance()->getHandSheet(i);
if(!pCS) continue; if(!pCS) continue;
if(!pCS->isSheetValid()) continue;
NLMISC::CSheetId sheet(pCS->getSheetId()); NLMISC::CSheetId sheet(pCS->getSheetId());
group.addItem(sheet.toString(), pCS->getQuality(), pCS->getItemWeight(), pCS->getItemColor()); group.addItem(sheet.toString(), pCS->getQuality(), pCS->getItemWeight(), pCS->getItemColor());
} }
@ -389,6 +406,7 @@ bool CItemGroupManager::createGroup(std::string name)
{ {
pCS = CInventoryManager::getInstance()->getEquipSheet(i); pCS = CInventoryManager::getInstance()->getEquipSheet(i);
if(!pCS) continue; if(!pCS) continue;
if(!pCS->isSheetValid()) continue;
NLMISC::CSheetId sheet(pCS->getSheetId()); NLMISC::CSheetId sheet(pCS->getSheetId());
group.addItem(sheet.toString(), pCS->getQuality(), pCS->getItemWeight(), pCS->getItemColor()); group.addItem(sheet.toString(), pCS->getQuality(), pCS->getItemWeight(), pCS->getItemColor());
} }
@ -416,10 +434,12 @@ bool CItemGroupManager::deleteGroup(std::string name)
void CItemGroupManager::listGroup() void CItemGroupManager::listGroup()
{ {
CInterfaceManager *pIM = CInterfaceManager::getInstance(); CInterfaceManager *pIM = CInterfaceManager::getInstance();
pIM->displaySystemInfo(ucstring("Available item groups :"));
for(int i=0;i<_Groups.size();i++) for(int i=0;i<_Groups.size();i++)
{ {
CItemGroup group = _Groups[i]; CItemGroup group = _Groups[i];
pIM->displaySystemInfo(ucstring(group.name)); ucstring msg = "* " + ucstring(group.name) + ucstring(NLMISC::toString(" with %d items inside.", group.Items.size()));
pIM->displaySystemInfo(msg);
} }
} }
@ -447,7 +467,6 @@ CItemGroup* CItemGroupManager::findGroup(std::string name)
} }
return NULL; return NULL;
} }
// Note : Guild & room aren't supported because missing price might cause issue
std::string CItemGroupManager::toDbPath(INVENTORIES::TInventory inventory) std::string CItemGroupManager::toDbPath(INVENTORIES::TInventory inventory)
{ {
switch(inventory) switch(inventory)

View file

@ -60,9 +60,7 @@ public:
void readFrom(xmlNodePtr node); void readFrom(xmlNodePtr node);
std::string name; std::string name;
std::vector<CItem> Items;
private:
std::vector<CItem> _Items;
}; };
class CItemGroupManager { class CItemGroupManager {
@ -77,6 +75,7 @@ public:
void uninit(); void uninit();
void saveGroups(); void saveGroups();
bool loadGroups(); bool loadGroups();
void linkInterface();
//Return NULL if no group was found //Return NULL if no group was found
//Return false if no group was found //Return false if no group was found
bool moveGroup(std::string name, INVENTORIES::TInventory dst); bool moveGroup(std::string name, INVENTORIES::TInventory dst);