From b4ce38099fdfa8af56c651142dbcc480fc245791 Mon Sep 17 00:00:00 2001 From: bensaine Date: Wed, 1 Dec 2021 12:28:34 -0500 Subject: [PATCH 01/39] add: sorting (initial draft) --- .../src/interface_v3/action_handler_item.cpp | 13 ++ .../src/interface_v3/dbgroup_list_sheet.cpp | 2 + .../src/interface_v3/dbgroup_list_sheet.h | 4 + .../interface_v3/dbgroup_list_sheet_text.cpp | 2 + .../interface_v3/dbgroup_list_sheet_text.h | 4 + .../interface_v3/dbgroup_list_sheet_trade.cpp | 4 +- .../src/interface_v3/inventory_manager.cpp | 168 ++++++++++-------- .../src/interface_v3/inventory_manager.h | 16 +- ryzom/client/src/net_manager.cpp | 2 +- 9 files changed, 137 insertions(+), 78 deletions(-) diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index 46171b6c1..a8055996a 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -1666,6 +1666,19 @@ class CHandlerDragNDrop : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerDragNDrop, "drag_n_drop" ); +// ********************************************************************************************************** +class CHandlerSortInv : public IActionHandler +{ + void execute (CCtrlBase * /* pCaller */, const std::string &sParams) + { + std::string inv = getParam(sParams, "inv"); + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + pIM->displaySystemInfo("CHandlerSortInv "+inv); + CInventoryManager *pInv = CInventoryManager::getInstance(); + pInv->sortInv(INVENTORIES::toInventory(inv)); + } +}; +REGISTER_ACTION_HANDLER( CHandlerSortInv, "sort_inv" ); // ********************************************************************************************************** static void sendToServerEnchantMessage(uint8 invent, uint16 slot) diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp index 487b77c99..4c438d984 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp @@ -58,6 +58,8 @@ CDBGroupListSheet::CDBGroupListSheet(const TCtorParam ¶m) _MinRows= 1; _MaxRows= INT_MAX; _MaxItems= INT_MAX; + _SortBy = 0; + _SortDir = 0; _NbColumns= 2; _WSlot= 24; _WSpace= 0; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet.h b/ryzom/client/src/interface_v3/dbgroup_list_sheet.h index 211d872dc..b1f1f29c1 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet.h +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet.h @@ -78,6 +78,8 @@ public: // Called when the list changed for a reason or another and should be reconstructed to possibly sort items virtual void sort() { } void needToSort() { _NeedToSort = true; invalidateCoords(); } + void setSortBy(sint32 sortBy) { _SortBy = sortBy; } + void setSortDir(sint32 sortDir) { _SortDir = sortDir; } /** (useful for list only) Force the validity of an element, even if its sheetId==0 * (empty slot displayed instead) @@ -173,6 +175,8 @@ protected: bool _Array : 1; bool _Squarify : 1; + sint32 _SortBy; + sint32 _SortDir; bool _CanDrop : 1; bool _Draggable : 1; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp index 8cc114508..dcbd0e9db 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp @@ -44,6 +44,8 @@ CDBGroupListSheetText::CDBGroupListSheetText(const TCtorParam ¶m) _TextTemplate(TCtorParam()) { _MaxItems = INT_MAX; + _SortBy = 0; + _SortDir = 0; _WSlot= 24; _HSlot= 24; _HSpace = 0; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h index 329d7bcea..d45ce122a 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h @@ -184,6 +184,8 @@ public: // Called when the list changed for a reason or another and should be reconstructed to possibly sort items virtual void sort() { } void needToSort() { _NeedToSort = true; invalidateCoords(); } + void setSortBy(sint32 sortBy) { _SortBy = sortBy; } + void setSortDir(sint32 sortDir) { _SortDir = sortDir; } /// Gets. sint32 getWSlot() const {return _WSlot;} @@ -253,6 +255,8 @@ protected: std::vector _SheetChildren; bool _NeedToSort; + sint32 _SortBy; + sint32 _SortDir; // Drag'n'Drop sint32 _Scrolling; sint64 _LastTimeScrolled; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp index 0d93baccb..d1147ddf3 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp @@ -720,9 +720,7 @@ void CDBGroupListSheetTrade::sort() for (i = 0; i < _SheetChildren.size(); ++i) { vTemp[i].SheetText = _SheetChildren[i]; - - CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; - initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); + initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, 0, i); } std::sort(vTemp.begin(), vTemp.end()); diff --git a/ryzom/client/src/interface_v3/inventory_manager.cpp b/ryzom/client/src/interface_v3/inventory_manager.cpp index 1bb3c478f..e16c83cbb 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.cpp +++ b/ryzom/client/src/interface_v3/inventory_manager.cpp @@ -35,6 +35,7 @@ #include "../net_manager.h" #include "../user_entity.h" #include "../global.h" +#include #include "nel/misc/algo.h" @@ -864,7 +865,7 @@ void CInventoryManager::wearBagItem(sint32 bagEntryIndex) BagItemEquipped[bagEntryIndex]= true; grayItem (LIST_BAG_TEXT, bagEntryIndex, true); grayItem (LIST_BAG_ICONS, bagEntryIndex, true); - sortBag(); + sortAll(); } } @@ -876,7 +877,7 @@ void CInventoryManager::unwearBagItem(sint32 bagEntryIndex) BagItemEquipped[bagEntryIndex]= false; grayItem (LIST_BAG_TEXT, bagEntryIndex, false); grayItem (LIST_BAG_ICONS, bagEntryIndex, false); - sortBag(); + sortAll(); } } @@ -2114,11 +2115,12 @@ bool CTempInvManager::isOpened() // *************************************************************************** #define BAG_ITEM_NOT_SORTED 1000000 // Used for sorting -void initStructForItemSort(vector&vTemp, sint32 sheetId, sint32 quality, sint32 indexInList, sint32 indexInDB) +void initStructForItemSort(vector&vTemp, CDBCtrlSheet *ctrl, sint32 sortBy, sint32 indexInList) { // Default value is the linear pos in the db (in case its not an item) - vTemp[indexInList].Pos = toString("%08d", indexInDB); - + vTemp[indexInList].Pos = toString("%08d", ctrl->getIndexInDB()); + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + sint32 sheetId = ctrl->getSheetId(); // if not empty if (sheetId != 0) { @@ -2126,7 +2128,18 @@ void initStructForItemSort(vector&vTemp, sint32 sheetId, sint32 qua if ((pItem != NULL) && (pItem->Type == CEntitySheet::ITEM)) { CItemSheet *pIS = safe_cast(pItem); - vTemp[indexInList].Pos = toString("%02d", pIS->Family); + std::map primarySort = { + {0, pIS->Family}, + {1, ctrl->getQuantity()}, + {2, ctrl->getQuality()}, + {3, (pIS->Bulk*100)*(ctrl->getQuantity())}, + {4, (ctrl->getItemWeight())*(ctrl->getQuantity())} + }; + // Sort by + vTemp[indexInList].Pos = toString("%08d", primarySort[sortBy]); + + // Secondary sort + vTemp[indexInList].Pos += toString("%02d", pIS->Family); vTemp[indexInList].Pos += toString("%03d", pIS->ItemType); // add some specific sort for raw material @@ -2142,14 +2155,14 @@ void initStructForItemSort(vector&vTemp, sint32 sheetId, sint32 qua vTemp[indexInList].Pos += toString("%02d%02d", 0, 0); - vTemp[indexInList].Pos += toString("%03d", quality); + vTemp[indexInList].Pos += toString("%03d", ctrl->getQuality()); // add sort by name vTemp[indexInList].Pos += CSheetId(sheetId).toString(); // add at last the index in DB. to avoid resort for items that are exaclty the same - vTemp[indexInList].Pos += toString("%03d", indexInDB); + vTemp[indexInList].Pos += toString("%03d", ctrl->getIndexInDB()); } } } @@ -2484,22 +2497,32 @@ void CDBGroupListSheetBag::onSwap (sint /* nDraggedSheet */, sint /* nDroppedShe void CDBGroupListSheetBag::sort() { vector vTemp; - + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + pIM->displaySystemInfo("CDBGroupListSheetBag"); vTemp.resize (_MaxItems); uint i; for (i = 0; i < _MaxItems; ++i) { vTemp[i].SheetText = _SheetChildren[i]; - - CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; - initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); + //pIM->displaySystemInfo(to_string((int) _SortBy)); + initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, _SortBy, i); } - std::sort(vTemp.begin(), vTemp.end()); + pIM->displaySystemInfo("CDBGroupListSheetBag sort_dir "+to_string(_SortDir)+typeid(_SortDir).name()); + if (_SortDir == 0) { + // sort ASC + std::sort(vTemp.begin(), vTemp.end()); + } else if (_SortDir == 1) { + // sort DESC + std::sort(vTemp.rbegin(), vTemp.rend()); + } for (i = 0; i < _MaxItems; ++i) - { + { + if (vTemp[i].Pos.find('e') != std::string::npos) + pIM->displaySystemInfo(vTemp[i].Pos); + _SheetChildren[i] = vTemp[i].SheetText; } } @@ -2525,19 +2548,24 @@ bool CDBGroupIconListBag::parse (xmlNodePtr cur, CInterfaceGroup *parentGroup) void CDBGroupIconListBag::sort() { vector vTemp; - + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + pIM->displaySystemInfo("CDBGroupIconListBag"); vTemp.resize (_MaxItems); uint i; for (i = 0; i < _MaxItems; ++i) { vTemp[i].SheetIcon = _SheetChildren[i]; - - CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; - initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); + initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, _SortBy, i); } - std::sort(vTemp.begin(), vTemp.end()); + if (_SortDir == 0) { + // sort ASC + std::sort(vTemp.begin(), vTemp.end()); + } else { + // sort DESC + std::sort(vTemp.rbegin(), vTemp.rend()); + } for (i = 0; i < _MaxItems; ++i) { @@ -2636,9 +2664,7 @@ void CDBGroupListSheetFilterExchangeable::sort() for (i = 0; i < _MaxItems; ++i) { vTemp[i].SheetIcon = _SheetChildren[i]; - - CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; - initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); + initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, 0, i); } std::sort(vTemp.begin(), vTemp.end()); @@ -3743,61 +3769,59 @@ void CInventoryManager::debugItemInfoCache() const } // *************************************************************************** -void CInventoryManager::sortBag() +void CInventoryManager::sortAll() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); + pIM->displaySystemInfo("sortAll"); + sortInv(INVENTORIES::bag); + sortInv(INVENTORIES::player_room); + sortInv(INVENTORIES::guild); + sortInv(INVENTORIES::pet_animal1); + sortInv(INVENTORIES::pet_animal2); + sortInv(INVENTORIES::pet_animal3); + sortInv(INVENTORIES::pet_animal4); + sortInv(INVENTORIES::pet_animal5); + sortInv(INVENTORIES::pet_animal6); + sortInv(INVENTORIES::pet_animal7); +} + +void CInventoryManager::sortInv(INVENTORIES::TInventory inv) +{ + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + CDBManager *pDM = NLGUI::CDBManager::getInstance(); + CWidgetManager *pWM = CWidgetManager::getInstance(); CDBGroupIconListBag *pIconList; CDBGroupListSheetBag *pList; - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_BAG_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_BAG_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_ROOM_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_ROOM_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA0_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA0_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA1_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA1_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA2_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA2_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA3_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA3_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA4_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA4_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA5_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA5_TEXT)); - if (pList != NULL) pList->needToSort(); - - pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA6_ICONS)); - if (pIconList != NULL) pIconList->needToSort(); - pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA6_TEXT)); - if (pList != NULL) pList->needToSort(); + pIM->displaySystemInfo("sortInv " + INVENTORIES::toString(inv)); + std::map> invToProp = { + { INVENTORIES::bag, {LIST_BAG_ICONS, LIST_BAG_TEXT, BAG_SORT} }, + { INVENTORIES::player_room, {LIST_ROOM_ICONS, LIST_ROOM_TEXT, ROOM_SORT} }, + { INVENTORIES::guild, {LIST_GUILD_ICONS, LIST_GUILD_TEXT, GUILD_SORT} }, + { INVENTORIES::pet_animal1, {LIST_PA0_ICONS, LIST_PA0_TEXT, PA0_SORT} }, + { INVENTORIES::pet_animal2, {LIST_PA1_ICONS, LIST_PA1_TEXT, PA1_SORT} }, + { INVENTORIES::pet_animal3, {LIST_PA2_ICONS, LIST_PA2_TEXT, PA2_SORT} }, + { INVENTORIES::pet_animal4, {LIST_PA3_ICONS, LIST_PA3_TEXT, PA3_SORT} }, + { INVENTORIES::pet_animal5, {LIST_PA4_ICONS, LIST_PA4_TEXT, PA4_SORT} }, + { INVENTORIES::pet_animal6, {LIST_PA5_ICONS, LIST_PA5_TEXT, PA5_SORT} }, + { INVENTORIES::pet_animal7, {LIST_PA6_ICONS, LIST_PA6_TEXT, PA6_SORT} } + }; + + sint32 sortBy = pDM->getDbProp(invToProp[inv][2]+":SORT_BY")->getValue32(); + sint32 sortDir = pDM->getDbProp(invToProp[inv][2]+":SORT_DIR")->getValue32(); + pIM->displaySystemInfo("sortInv " + INVENTORIES::toString(inv) + " sortBy: " + toString(sortBy) + " sortDir: " + toString(sortDir) + " debug "+invToProp[inv][2]); + pIconList = dynamic_cast(pWM->getElementFromId(invToProp[inv][0])); + if (pIconList != NULL) { + pIconList->needToSort(); + pIconList->setSortBy(sortBy); + pIconList->setSortDir(sortDir); + } + pList = dynamic_cast(pWM->getElementFromId(invToProp[inv][1])); + if (pList != NULL) { + pList->needToSort(); + pList->setSortBy(sortBy); + pList->setSortDir(sortDir); + } } // *************************************************************************** diff --git a/ryzom/client/src/interface_v3/inventory_manager.h b/ryzom/client/src/interface_v3/inventory_manager.h index d5bd763f1..d49f247e2 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.h +++ b/ryzom/client/src/interface_v3/inventory_manager.h @@ -309,7 +309,8 @@ public: void debugItemInfoWaiters(); void debugItemInfoCache() const; - void sortBag(); + void sortInv(INVENTORIES::TInventory invId); + void sortAll(); // Animal Inventories // Is the inventory present? if true, it may still not be available for modification (eg: animal too far) @@ -526,7 +527,7 @@ struct SSortStruct }; // Helper to sort with only one way for bag and trade -void initStructForItemSort(std::vector&vTemp, sint32 sheetId, sint32 quality, sint32 indexInList, sint32 indexInDB); +void initStructForItemSort(std::vector&vTemp, CDBCtrlSheet *ctrl, sint32 sortBy, sint32 indexInList); // *************************************************************************** @@ -832,6 +833,17 @@ private: #define LIST_PA6_TEXT "ui:interface:inv_pa6:content:iil:bag_list" #define LIST_PA6_ICONS "ui:interface:inv_pa6:content:iil:bag_icons" +#define BAG_SORT "UI:SAVE:INV_BAG" +#define ROOM_SORT "UI:SAVE:INV_ROOM" +#define GUILD_SORT "UI:SAVE:INV_GUILD" +#define PA0_SORT "UI:SAVE:INV_PA0" +#define PA1_SORT "UI:SAVE:INV_PA1" +#define PA2_SORT "UI:SAVE:INV_PA2" +#define PA3_SORT "UI:SAVE:INV_PA3" +#define PA4_SORT "UI:SAVE:INV_PA4" +#define PA5_SORT "UI:SAVE:INV_PA5" +#define PA6_SORT "UI:SAVE:INV_PA6" + // Theorically never used #define LIST_BAG2_TEXT "ui:interface:inv_bag:content:iil:bag_list" #define LIST_BAG2_ICONS "ui:interface:inv_bag:content:iil:bag_icons" diff --git a/ryzom/client/src/net_manager.cpp b/ryzom/client/src/net_manager.cpp index 549732372..61cd99174 100644 --- a/ryzom/client/src/net_manager.cpp +++ b/ryzom/client/src/net_manager.cpp @@ -2865,7 +2865,7 @@ void updateInventoryFromStream (NLMISC::CBitMemStream &impulse, const CInventory } } - CInventoryManager::getInstance()->sortBag(); + CInventoryManager::getInstance()->sortAll(); } catch (const Exception &e) { From b72a71e87c3222652097cde03da48a23270895f3 Mon Sep 17 00:00:00 2001 From: Ben Saine Date: Wed, 1 Dec 2021 17:30:11 +0000 Subject: [PATCH 02/39] Revert "add: sorting (initial draft)" This reverts commit b4ce38099fdfa8af56c651142dbcc480fc245791 --- .../src/interface_v3/action_handler_item.cpp | 13 -- .../src/interface_v3/dbgroup_list_sheet.cpp | 2 - .../src/interface_v3/dbgroup_list_sheet.h | 4 - .../interface_v3/dbgroup_list_sheet_text.cpp | 2 - .../interface_v3/dbgroup_list_sheet_text.h | 4 - .../interface_v3/dbgroup_list_sheet_trade.cpp | 4 +- .../src/interface_v3/inventory_manager.cpp | 168 ++++++++---------- .../src/interface_v3/inventory_manager.h | 16 +- ryzom/client/src/net_manager.cpp | 2 +- 9 files changed, 78 insertions(+), 137 deletions(-) diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index a8055996a..46171b6c1 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -1666,19 +1666,6 @@ class CHandlerDragNDrop : public IActionHandler }; REGISTER_ACTION_HANDLER( CHandlerDragNDrop, "drag_n_drop" ); -// ********************************************************************************************************** -class CHandlerSortInv : public IActionHandler -{ - void execute (CCtrlBase * /* pCaller */, const std::string &sParams) - { - std::string inv = getParam(sParams, "inv"); - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - pIM->displaySystemInfo("CHandlerSortInv "+inv); - CInventoryManager *pInv = CInventoryManager::getInstance(); - pInv->sortInv(INVENTORIES::toInventory(inv)); - } -}; -REGISTER_ACTION_HANDLER( CHandlerSortInv, "sort_inv" ); // ********************************************************************************************************** static void sendToServerEnchantMessage(uint8 invent, uint16 slot) diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp index 4c438d984..487b77c99 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet.cpp @@ -58,8 +58,6 @@ CDBGroupListSheet::CDBGroupListSheet(const TCtorParam ¶m) _MinRows= 1; _MaxRows= INT_MAX; _MaxItems= INT_MAX; - _SortBy = 0; - _SortDir = 0; _NbColumns= 2; _WSlot= 24; _WSpace= 0; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet.h b/ryzom/client/src/interface_v3/dbgroup_list_sheet.h index b1f1f29c1..211d872dc 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet.h +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet.h @@ -78,8 +78,6 @@ public: // Called when the list changed for a reason or another and should be reconstructed to possibly sort items virtual void sort() { } void needToSort() { _NeedToSort = true; invalidateCoords(); } - void setSortBy(sint32 sortBy) { _SortBy = sortBy; } - void setSortDir(sint32 sortDir) { _SortDir = sortDir; } /** (useful for list only) Force the validity of an element, even if its sheetId==0 * (empty slot displayed instead) @@ -175,8 +173,6 @@ protected: bool _Array : 1; bool _Squarify : 1; - sint32 _SortBy; - sint32 _SortDir; bool _CanDrop : 1; bool _Draggable : 1; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp index dcbd0e9db..8cc114508 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.cpp @@ -44,8 +44,6 @@ CDBGroupListSheetText::CDBGroupListSheetText(const TCtorParam ¶m) _TextTemplate(TCtorParam()) { _MaxItems = INT_MAX; - _SortBy = 0; - _SortDir = 0; _WSlot= 24; _HSlot= 24; _HSpace = 0; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h index d45ce122a..329d7bcea 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h @@ -184,8 +184,6 @@ public: // Called when the list changed for a reason or another and should be reconstructed to possibly sort items virtual void sort() { } void needToSort() { _NeedToSort = true; invalidateCoords(); } - void setSortBy(sint32 sortBy) { _SortBy = sortBy; } - void setSortDir(sint32 sortDir) { _SortDir = sortDir; } /// Gets. sint32 getWSlot() const {return _WSlot;} @@ -255,8 +253,6 @@ protected: std::vector _SheetChildren; bool _NeedToSort; - sint32 _SortBy; - sint32 _SortDir; // Drag'n'Drop sint32 _Scrolling; sint64 _LastTimeScrolled; diff --git a/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp b/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp index d1147ddf3..0d93baccb 100644 --- a/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp +++ b/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.cpp @@ -720,7 +720,9 @@ void CDBGroupListSheetTrade::sort() for (i = 0; i < _SheetChildren.size(); ++i) { vTemp[i].SheetText = _SheetChildren[i]; - initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, 0, i); + + CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; + initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); } std::sort(vTemp.begin(), vTemp.end()); diff --git a/ryzom/client/src/interface_v3/inventory_manager.cpp b/ryzom/client/src/interface_v3/inventory_manager.cpp index e16c83cbb..1bb3c478f 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.cpp +++ b/ryzom/client/src/interface_v3/inventory_manager.cpp @@ -35,7 +35,6 @@ #include "../net_manager.h" #include "../user_entity.h" #include "../global.h" -#include #include "nel/misc/algo.h" @@ -865,7 +864,7 @@ void CInventoryManager::wearBagItem(sint32 bagEntryIndex) BagItemEquipped[bagEntryIndex]= true; grayItem (LIST_BAG_TEXT, bagEntryIndex, true); grayItem (LIST_BAG_ICONS, bagEntryIndex, true); - sortAll(); + sortBag(); } } @@ -877,7 +876,7 @@ void CInventoryManager::unwearBagItem(sint32 bagEntryIndex) BagItemEquipped[bagEntryIndex]= false; grayItem (LIST_BAG_TEXT, bagEntryIndex, false); grayItem (LIST_BAG_ICONS, bagEntryIndex, false); - sortAll(); + sortBag(); } } @@ -2115,12 +2114,11 @@ bool CTempInvManager::isOpened() // *************************************************************************** #define BAG_ITEM_NOT_SORTED 1000000 // Used for sorting -void initStructForItemSort(vector&vTemp, CDBCtrlSheet *ctrl, sint32 sortBy, sint32 indexInList) +void initStructForItemSort(vector&vTemp, sint32 sheetId, sint32 quality, sint32 indexInList, sint32 indexInDB) { // Default value is the linear pos in the db (in case its not an item) - vTemp[indexInList].Pos = toString("%08d", ctrl->getIndexInDB()); - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - sint32 sheetId = ctrl->getSheetId(); + vTemp[indexInList].Pos = toString("%08d", indexInDB); + // if not empty if (sheetId != 0) { @@ -2128,18 +2126,7 @@ void initStructForItemSort(vector&vTemp, CDBCtrlSheet *ctrl, sint32 if ((pItem != NULL) && (pItem->Type == CEntitySheet::ITEM)) { CItemSheet *pIS = safe_cast(pItem); - std::map primarySort = { - {0, pIS->Family}, - {1, ctrl->getQuantity()}, - {2, ctrl->getQuality()}, - {3, (pIS->Bulk*100)*(ctrl->getQuantity())}, - {4, (ctrl->getItemWeight())*(ctrl->getQuantity())} - }; - // Sort by - vTemp[indexInList].Pos = toString("%08d", primarySort[sortBy]); - - // Secondary sort - vTemp[indexInList].Pos += toString("%02d", pIS->Family); + vTemp[indexInList].Pos = toString("%02d", pIS->Family); vTemp[indexInList].Pos += toString("%03d", pIS->ItemType); // add some specific sort for raw material @@ -2155,14 +2142,14 @@ void initStructForItemSort(vector&vTemp, CDBCtrlSheet *ctrl, sint32 vTemp[indexInList].Pos += toString("%02d%02d", 0, 0); - vTemp[indexInList].Pos += toString("%03d", ctrl->getQuality()); + vTemp[indexInList].Pos += toString("%03d", quality); // add sort by name vTemp[indexInList].Pos += CSheetId(sheetId).toString(); // add at last the index in DB. to avoid resort for items that are exaclty the same - vTemp[indexInList].Pos += toString("%03d", ctrl->getIndexInDB()); + vTemp[indexInList].Pos += toString("%03d", indexInDB); } } } @@ -2497,32 +2484,22 @@ void CDBGroupListSheetBag::onSwap (sint /* nDraggedSheet */, sint /* nDroppedShe void CDBGroupListSheetBag::sort() { vector vTemp; - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - pIM->displaySystemInfo("CDBGroupListSheetBag"); + vTemp.resize (_MaxItems); uint i; for (i = 0; i < _MaxItems; ++i) { vTemp[i].SheetText = _SheetChildren[i]; - //pIM->displaySystemInfo(to_string((int) _SortBy)); - initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, _SortBy, i); - } - pIM->displaySystemInfo("CDBGroupListSheetBag sort_dir "+to_string(_SortDir)+typeid(_SortDir).name()); - if (_SortDir == 0) { - // sort ASC - std::sort(vTemp.begin(), vTemp.end()); - } else if (_SortDir == 1) { - // sort DESC - std::sort(vTemp.rbegin(), vTemp.rend()); + CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; + initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); } - for (i = 0; i < _MaxItems; ++i) - { - if (vTemp[i].Pos.find('e') != std::string::npos) - pIM->displaySystemInfo(vTemp[i].Pos); + std::sort(vTemp.begin(), vTemp.end()); + for (i = 0; i < _MaxItems; ++i) + { _SheetChildren[i] = vTemp[i].SheetText; } } @@ -2548,25 +2525,20 @@ bool CDBGroupIconListBag::parse (xmlNodePtr cur, CInterfaceGroup *parentGroup) void CDBGroupIconListBag::sort() { vector vTemp; - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - pIM->displaySystemInfo("CDBGroupIconListBag"); + vTemp.resize (_MaxItems); uint i; for (i = 0; i < _MaxItems; ++i) { vTemp[i].SheetIcon = _SheetChildren[i]; - initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, _SortBy, i); - } - if (_SortDir == 0) { - // sort ASC - std::sort(vTemp.begin(), vTemp.end()); - } else { - // sort DESC - std::sort(vTemp.rbegin(), vTemp.rend()); + CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; + initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); } + std::sort(vTemp.begin(), vTemp.end()); + for (i = 0; i < _MaxItems; ++i) { _SheetChildren[i] = vTemp[i].SheetIcon; @@ -2664,7 +2636,9 @@ void CDBGroupListSheetFilterExchangeable::sort() for (i = 0; i < _MaxItems; ++i) { vTemp[i].SheetIcon = _SheetChildren[i]; - initStructForItemSort (vTemp, _SheetChildren[i]->Ctrl, 0, i); + + CDBCtrlSheet *ctrl= _SheetChildren[i]->Ctrl; + initStructForItemSort (vTemp, ctrl->getSheetId(), ctrl->getQuality(), i, ctrl->getIndexInDB()); } std::sort(vTemp.begin(), vTemp.end()); @@ -3769,59 +3743,61 @@ void CInventoryManager::debugItemInfoCache() const } // *************************************************************************** -void CInventoryManager::sortAll() +void CInventoryManager::sortBag() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); - pIM->displaySystemInfo("sortAll"); - sortInv(INVENTORIES::bag); - sortInv(INVENTORIES::player_room); - sortInv(INVENTORIES::guild); - sortInv(INVENTORIES::pet_animal1); - sortInv(INVENTORIES::pet_animal2); - sortInv(INVENTORIES::pet_animal3); - sortInv(INVENTORIES::pet_animal4); - sortInv(INVENTORIES::pet_animal5); - sortInv(INVENTORIES::pet_animal6); - sortInv(INVENTORIES::pet_animal7); -} - -void CInventoryManager::sortInv(INVENTORIES::TInventory inv) -{ - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - CDBManager *pDM = NLGUI::CDBManager::getInstance(); - CWidgetManager *pWM = CWidgetManager::getInstance(); CDBGroupIconListBag *pIconList; CDBGroupListSheetBag *pList; - pIM->displaySystemInfo("sortInv " + INVENTORIES::toString(inv)); - std::map> invToProp = { - { INVENTORIES::bag, {LIST_BAG_ICONS, LIST_BAG_TEXT, BAG_SORT} }, - { INVENTORIES::player_room, {LIST_ROOM_ICONS, LIST_ROOM_TEXT, ROOM_SORT} }, - { INVENTORIES::guild, {LIST_GUILD_ICONS, LIST_GUILD_TEXT, GUILD_SORT} }, - { INVENTORIES::pet_animal1, {LIST_PA0_ICONS, LIST_PA0_TEXT, PA0_SORT} }, - { INVENTORIES::pet_animal2, {LIST_PA1_ICONS, LIST_PA1_TEXT, PA1_SORT} }, - { INVENTORIES::pet_animal3, {LIST_PA2_ICONS, LIST_PA2_TEXT, PA2_SORT} }, - { INVENTORIES::pet_animal4, {LIST_PA3_ICONS, LIST_PA3_TEXT, PA3_SORT} }, - { INVENTORIES::pet_animal5, {LIST_PA4_ICONS, LIST_PA4_TEXT, PA4_SORT} }, - { INVENTORIES::pet_animal6, {LIST_PA5_ICONS, LIST_PA5_TEXT, PA5_SORT} }, - { INVENTORIES::pet_animal7, {LIST_PA6_ICONS, LIST_PA6_TEXT, PA6_SORT} } - }; - - sint32 sortBy = pDM->getDbProp(invToProp[inv][2]+":SORT_BY")->getValue32(); - sint32 sortDir = pDM->getDbProp(invToProp[inv][2]+":SORT_DIR")->getValue32(); - pIM->displaySystemInfo("sortInv " + INVENTORIES::toString(inv) + " sortBy: " + toString(sortBy) + " sortDir: " + toString(sortDir) + " debug "+invToProp[inv][2]); - pIconList = dynamic_cast(pWM->getElementFromId(invToProp[inv][0])); - if (pIconList != NULL) { - pIconList->needToSort(); - pIconList->setSortBy(sortBy); - pIconList->setSortDir(sortDir); - } - pList = dynamic_cast(pWM->getElementFromId(invToProp[inv][1])); - if (pList != NULL) { - pList->needToSort(); - pList->setSortBy(sortBy); - pList->setSortDir(sortDir); - } + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_BAG_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_BAG_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_ROOM_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_ROOM_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_GUILD_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA0_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA0_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA1_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA1_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA2_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA2_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA3_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA3_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA4_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA4_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA5_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA5_TEXT)); + if (pList != NULL) pList->needToSort(); + + pIconList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA6_ICONS)); + if (pIconList != NULL) pIconList->needToSort(); + pList = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(LIST_PA6_TEXT)); + if (pList != NULL) pList->needToSort(); } // *************************************************************************** diff --git a/ryzom/client/src/interface_v3/inventory_manager.h b/ryzom/client/src/interface_v3/inventory_manager.h index d49f247e2..d5bd763f1 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.h +++ b/ryzom/client/src/interface_v3/inventory_manager.h @@ -309,8 +309,7 @@ public: void debugItemInfoWaiters(); void debugItemInfoCache() const; - void sortInv(INVENTORIES::TInventory invId); - void sortAll(); + void sortBag(); // Animal Inventories // Is the inventory present? if true, it may still not be available for modification (eg: animal too far) @@ -527,7 +526,7 @@ struct SSortStruct }; // Helper to sort with only one way for bag and trade -void initStructForItemSort(std::vector&vTemp, CDBCtrlSheet *ctrl, sint32 sortBy, sint32 indexInList); +void initStructForItemSort(std::vector&vTemp, sint32 sheetId, sint32 quality, sint32 indexInList, sint32 indexInDB); // *************************************************************************** @@ -833,17 +832,6 @@ private: #define LIST_PA6_TEXT "ui:interface:inv_pa6:content:iil:bag_list" #define LIST_PA6_ICONS "ui:interface:inv_pa6:content:iil:bag_icons" -#define BAG_SORT "UI:SAVE:INV_BAG" -#define ROOM_SORT "UI:SAVE:INV_ROOM" -#define GUILD_SORT "UI:SAVE:INV_GUILD" -#define PA0_SORT "UI:SAVE:INV_PA0" -#define PA1_SORT "UI:SAVE:INV_PA1" -#define PA2_SORT "UI:SAVE:INV_PA2" -#define PA3_SORT "UI:SAVE:INV_PA3" -#define PA4_SORT "UI:SAVE:INV_PA4" -#define PA5_SORT "UI:SAVE:INV_PA5" -#define PA6_SORT "UI:SAVE:INV_PA6" - // Theorically never used #define LIST_BAG2_TEXT "ui:interface:inv_bag:content:iil:bag_list" #define LIST_BAG2_ICONS "ui:interface:inv_bag:content:iil:bag_icons" diff --git a/ryzom/client/src/net_manager.cpp b/ryzom/client/src/net_manager.cpp index 61cd99174..549732372 100644 --- a/ryzom/client/src/net_manager.cpp +++ b/ryzom/client/src/net_manager.cpp @@ -2865,7 +2865,7 @@ void updateInventoryFromStream (NLMISC::CBitMemStream &impulse, const CInventory } } - CInventoryManager::getInstance()->sortAll(); + CInventoryManager::getInstance()->sortBag(); } catch (const Exception &e) { From aa34e88101fc6cacabd5a01d46d821f6acb78ebd Mon Sep 17 00:00:00 2001 From: Nimetu Date: Fri, 17 Dec 2021 15:32:06 +0200 Subject: [PATCH 03/39] Fix crash when --nopatch is used without argument --- ryzom/client/src/far_tp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/far_tp.cpp b/ryzom/client/src/far_tp.cpp index 6bd05172a..3461c824f 100644 --- a/ryzom/client/src/far_tp.cpp +++ b/ryzom/client/src/far_tp.cpp @@ -466,7 +466,7 @@ void CLoginStateMachine::run() /// check the data to check if patch needed CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_PostLogin, "login_step_post_login")); - if (!ClientCfg.PatchWanted || (Args.haveArg("n") && Args.getLongArg("nopatch").front() == "1")) + if (!ClientCfg.PatchWanted || Args.haveLongArg("nopatch")) { // client don't want to be patched ! _CurrentState = st_display_eula; From 35a7a6628b212661afb70e23233a3b8cbb2cb975 Mon Sep 17 00:00:00 2001 From: Nuno Date: Tue, 14 Dec 2021 20:23:43 +0100 Subject: [PATCH 04/39] Adde default value to _HeadPitch. Change bounds --- ryzom/client/src/user_entity.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ryzom/client/src/user_entity.cpp b/ryzom/client/src/user_entity.cpp index 90d4b28b6..aed5ca413 100644 --- a/ryzom/client/src/user_entity.cpp +++ b/ryzom/client/src/user_entity.cpp @@ -153,7 +153,7 @@ CUserEntity::CUserEntity() _LateralVelocity = 0.0f; _SpeedServerAdjust = 1.0f; - + // \todo GUIGUI : do it more generic. _First_Pos = false; @@ -186,7 +186,7 @@ CUserEntity::CUserEntity() _MoveToAction= CUserEntity::None; _MoveToDist= 0.0; _MoveToColStartTime= 0; - + _HeadPitch = Pi/2; _FollowForceHeadPitch= false; _ForceLookSlot= CLFECOMMON::INVALID_SLOT; @@ -209,7 +209,7 @@ CUserEntity::~CUserEntity() _MountSpeeds.release(); CInterfaceManager *pIM = CInterfaceManager::getInstance(); - + { CCDBNodeLeaf *node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:USER:IS_INVISIBLE", false); if (node) @@ -1220,7 +1220,7 @@ void CUserEntity::applyMotion(CEntityCL *target) speed = getVelocity()*_SpeedFactor.getValue(); _SpeedFactor.addFactorValue(0.005f); } - + // SPEED VECTOR NULL -> NO MOVE if(speed == CVectorD::Null) return; @@ -1674,11 +1674,11 @@ void CUserEntity::moveToAction(CEntityCL *ent) case CUserEntity::Outpost: CLuaManager::getInstance().executeLuaScript("game:outpostBCOpenStateWindow()", 0); break; - // BuildTotem + // BuildTotem case CUserEntity::BuildTotem: buildTotem(); break; - // openArkUrl + // openArkUrl case CUserEntity::OpenArkUrl: CLuaManager::getInstance().executeLuaScript("getUI('ui:interface:web_transactions'):find('html'):browse(ArkTargetUrl)", 0); break; @@ -2552,9 +2552,9 @@ void CUserEntity::rotHeadVertically(float ang) //----------------------------------------------- void CUserEntity::setHeadPitch(double hp) { - _HeadPitch= hp; - const double bound= Pi/2 - 0.01; // epsilon to avoid gimbal lock - clamp(_HeadPitch, -bound, bound); + _HeadPitch = hp; + // epsilon to avoid gimbal lock + clamp(_HeadPitch, -Pi/2 + 0.01, Pi/2 - 0.5); } //--------------------------------------------------- @@ -3616,7 +3616,7 @@ void CUserEntity::CSpeedFactor::update(ICDBNode *node) // virtual CCDBNodeLeaf *leaf = safe_cast(node); _Value = ((float)leaf->getValue64())/100.0f; //nlinfo("SpeedFactor changed to %f / %" NL_I64 "u", _Value, leaf->getValue64()); - + // clamp the value (2.0 is the egg item or the level 6 speed up power up, nothing should be faster) // commented because ring editor speed is in fact faster //if(_Value > 2.0f) From b325126b20d61b1d2fb62cbfd19068cdb6677b6d Mon Sep 17 00:00:00 2001 From: Nimetu Date: Fri, 10 Dec 2021 23:44:09 +0200 Subject: [PATCH 05/39] Fixed cleanup of html downloads --- nel/include/nel/gui/group_html.h | 1 + nel/src/gui/group_html.cpp | 25 +++++++++++++++---------- nel/src/gui/view_bitmap.cpp | 8 +++++++- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/nel/include/nel/gui/group_html.h b/nel/include/nel/gui/group_html.h index 8b6ad19b6..4f972b191 100644 --- a/nel/include/nel/gui/group_html.h +++ b/nel/include/nel/gui/group_html.h @@ -969,6 +969,7 @@ namespace NLGUI // stop all curl downalods (html and data) void releaseDownloads(); + void releaseDataDownloads(); void checkDownloads(); // _CurlWWW download finished diff --git a/nel/src/gui/group_html.cpp b/nel/src/gui/group_html.cpp index 107ab107a..de7e6effe 100644 --- a/nel/src/gui/group_html.cpp +++ b/nel/src/gui/group_html.cpp @@ -299,6 +299,11 @@ namespace NLGUI void CGroupHTML::ImageDownloadCB::finish() { + // Image setTexture will remove itself from Images while iterating over it. + // Do the swap to keep iterator safe. + std::vector vec; + vec.swap(Images); + // tmpdest file does not exist if download skipped (ie cache was used) if (CFile::fileExists(tmpdest) || CFile::getFileSize(tmpdest) == 0) { @@ -322,7 +327,7 @@ namespace NLGUI // to temp file temporarily. that forces driver to reload texture from disk // ITexture::touch() seem not to do this. // cache was updated, first set texture as temp file - for(std::vector::iterator it = Images.begin(); it != Images.end(); ++it) + for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it) { SImageInfo &img = *it; Parent->setImage(img.Image, tmpdest, img.Type); @@ -339,7 +344,7 @@ namespace NLGUI } // even if image was cached, incase there was 'http://' image set to CViewBitmap - for(std::vector::iterator it = Images.begin(); it != Images.end(); ++it) + for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it) { SImageInfo &img = *it; Parent->setImage(img.Image, dest, img.Type); @@ -1053,6 +1058,13 @@ namespace NLGUI _CurlWWW = NULL; } + releaseDataDownloads(); + } + + void CGroupHTML::releaseDataDownloads() + { + LOG_DL("Clear pointers to %d curls", Curls.size()); + // remove all queued and already started downloads for(std::list::iterator it = Curls.begin(); it != Curls.end(); ++it) { @@ -3080,14 +3092,7 @@ namespace NLGUI paragraphChange (); - // clear the pointer to the current image download since all the button are deleted - LOG_DL("Clear pointers to %d curls", Curls.size()); - - // remove image refs from downloads - /*for(std::list::iterator it = Curls.begin(); it != Curls.end(); ++it) - { - it->imgs.clear(); - }*/ + releaseDataDownloads(); } // *************************************************************************** diff --git a/nel/src/gui/view_bitmap.cpp b/nel/src/gui/view_bitmap.cpp index 89c944a18..1896ced40 100644 --- a/nel/src/gui/view_bitmap.cpp +++ b/nel/src/gui/view_bitmap.cpp @@ -481,7 +481,13 @@ namespace NLGUI } else { - _HtmlDownload = NULL; + if (_HtmlDownload) + { + CGroupHTML *groupHtml = dynamic_cast(CWidgetManager::getInstance()->getElementFromId("ui:interface:webig:content:html")); + if (groupHtml) + groupHtml->removeImageDownload(_HtmlDownload, dynamic_cast(this)); + _HtmlDownload = NULL; + } _TextureId.setTexture (TxName.c_str (), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false); } } From c47db9bf943d113c21c8287c0b72f40f9f2ae411 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Wed, 1 Dec 2021 22:55:27 +0200 Subject: [PATCH 06/39] Fix utf8 encoding on sphrase info window --- ryzom/client/src/interface_v3/sphrase_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/interface_v3/sphrase_manager.cpp b/ryzom/client/src/interface_v3/sphrase_manager.cpp index 7e2585eb4..639e8b426 100644 --- a/ryzom/client/src/interface_v3/sphrase_manager.cpp +++ b/ryzom/client/src/interface_v3/sphrase_manager.cpp @@ -798,7 +798,7 @@ void CSPhraseManager::buildPhraseFromSheet(CSPhraseCom &phrase, sint32 sheetI if(phraseSheet) { // get localized Name - phrase.Name= STRING_MANAGER::CStringManagerClient::getSPhraseLocalizedName(CSheetId(sheetId)); + phrase.Name.fromUtf8(STRING_MANAGER::CStringManagerClient::getSPhraseLocalizedName(CSheetId(sheetId))); // Build bricks phrase.Bricks.clear(); for(uint i=0;iBricks.size();i++) From e43515e88af1509c96b829ac52b2459425bf0921 Mon Sep 17 00:00:00 2001 From: Nuno Date: Fri, 17 Dec 2021 16:11:13 +0100 Subject: [PATCH 07/39] Fix generate_module_interface.xslt used to server shard_unifier_service/nel_database_mapping.xml file --- .../game_share/generate_module_interface.xslt | 127 ++++++++++-------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/ryzom/common/src/game_share/generate_module_interface.xslt b/ryzom/common/src/game_share/generate_module_interface.xslt index ee87f6ae4..94750a59e 100644 --- a/ryzom/common/src/game_share/generate_module_interface.xslt +++ b/ryzom/common/src/game_share/generate_module_interface.xslt @@ -19,7 +19,22 @@ - +// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> +// Copyright (C) 2010-2021 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + ///////////////////////////////////////////////////////////////// // WARNING : this is a generated file, don't change it ! ///////////////////////////////////////////////////////////////// @@ -1676,13 +1691,14 @@ namespace { // cascading deletion for vector child - nlassert(load(connection, __FILE__, __LINE__)); - - const std::vector < Ptr > & childs = get(); - - while (!childs.empty()) + if (load(connection, __FILE__, __LINE__)) { - getByIndex(childs.size()-1)->remove(connection); + const std::vector < Ptr > & childs = get(); + + while (!childs.empty()) + { + getByIndex((uint32)childs.size()-1)->remove(connection); + } } } @@ -1690,72 +1706,77 @@ namespace { // cascading deletion for map child - nlassert(load(connection, __FILE__, __LINE__)); - - const std::map < uint32, Ptr > & childs = get(); - - while (!childs.empty()) + if (load(connection, __FILE__, __LINE__)) { - getById(childs.begin()->first)->remove(connection); + const std::map < uint32, Ptr > & childs = get(); + + while (!childs.empty()) + { + getById(childs.begin()->first)->remove(connection); + } } } { // cascading deletion for single child - nlassert(load(connection, __FILE__, __LINE__)); - - if (get() != NULL) - get()->remove(connection); + if (load(connection, __FILE__, __LINE__)) + { + if (get() != NULL) + get()->remove(connection); + } } { // unreference (and update) for vector child - nlassert(load(connection, __FILE__, __LINE__)); - - const std::vector < Ptr > & childs = get(); - - for (uint i=0; i < childs.size(); ++i) + if (load(connection, __FILE__, __LINE__)) { - - - - getByIndex(i)->set(0); - getByIndex(i)->update(connection); + const std::vector < Ptr > & childs = get(); + + for (uint i=0; i < childs.size(); ++i) + { + + + + getByIndex(i)->set(0); + getByIndex(i)->update(connection); + } } } { // unreference (and update) for map child - nlassert(load(connection, __FILE__, __LINE__)); + if (load(connection, __FILE__, __LINE__)) { - const std::map < uint32, Ptr > & childs = get(); - std::map< uint32, Ptr >::const_iterator first(childs.begin()), last(childs.end()); + const std::map < uint32, Ptr > & childs = get(); + std::map< uint32, Ptr >::const_iterator first(childs.begin()), last(childs.end()); - for (; first != last; ++first) - { - - - - getById(it->first)->set(0); - getById(it->first)->update(connection); + for (; first != last; ++first) + { + + + + getById(it->first)->set(0); + getById(it->first)->update(connection); + } } } { // unreference (and update) for single child - nlassert(load(connection, __FILE__, __LINE__)); - - - - - if (get() != NULL) + if (load(connection, __FILE__, __LINE__)) { - get()->set(0); - get()->update(connection); + + + + if (get() != NULL) + { + get()->set(0); + get()->update(connection); + } } } @@ -1886,7 +1907,7 @@ namespace } else if (cmd == NOPE::cc_instance_count) { - return _ObjectCache.size(); + return (uint32)_ObjectCache.size(); } // default return value @@ -1904,7 +1925,7 @@ namespace TReleasedObject::iterator first(_ReleasedObject.begin()), last(_ReleasedObject.end()); for (; first != last; ++first) { - nbReleased += first->second.size(); + nbReleased += (uint32)first->second.size(); } nlinfo(" There are %u object instances in cache not referenced (waiting deletion or re-use))", nbReleased); @@ -2117,7 +2138,7 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification return false; } - std::auto_ptr<MSW::CStoreResult> result = connection.storeResult(); + CUniquePtr<MSW::CStoreResult> result(connection.storeResult()); for (uint i=0; i<result->getNumRows(); ++i) { @@ -2195,7 +2216,7 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification return false; } - std::auto_ptr<MSW::CStoreResult> result = connection.storeResult(); + CUniquePtr<MSW::CStoreResult> result(connection.storeResult()); // check that the data description is consistent with database content nlassert(result->getNumRows() <= 1); @@ -2300,9 +2321,9 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification } // no object with this id, return a null pointer - static Ptr nil; + static Ptr nilPtr; - return nil; + return nilPtr; } @@ -2321,8 +2342,8 @@ ERROR : parent/child relation support only 'map' or 'vector' cont specification if (it == _->end()) { // no object with this id, return a null pointer - static Ptr nil; - return nil; + static Ptr nilPtr; + return nilPtr; } return const_cast< Ptr & >(it->second); From 574efe0c36595f10a5bd0b31620a4e867f95c7dd Mon Sep 17 00:00:00 2001 From: Nuno Date: Sat, 18 Dec 2021 11:05:54 +0100 Subject: [PATCH 08/39] Remove fmod option --- ryzom/client/src/client_cfg.cpp | 1 - ryzom/client/src/client_cfg.h | 2 +- ryzom/client/src/sound_manager.cpp | 4 +--- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index 7491e9413..98ad5b9bc 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -1297,7 +1297,6 @@ void CClientConfig::setValues() if (varPtr) { if (nlstricmp(varPtr->asString(), "Auto") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvAuto; - else if (nlstricmp(varPtr->asString(), "FMod") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvFMod; else if (nlstricmp(varPtr->asString(), "OpenAL") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvOpenAL; else if (nlstricmp(varPtr->asString(), "DirectSound") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvDirectSound; else if (nlstricmp(varPtr->asString(), "XAudio2") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvXAudio2; diff --git a/ryzom/client/src/client_cfg.h b/ryzom/client/src/client_cfg.h index 8c0c299b4..0cf859721 100644 --- a/ryzom/client/src/client_cfg.h +++ b/ryzom/client/src/client_cfg.h @@ -58,7 +58,7 @@ using std::string; struct CClientConfig { enum TDriver3D { DrvAuto = 0, OpenGL, Direct3D, OpenGLES }; - enum TDriverSound { SoundDrvAuto = 0, SoundDrvFMod, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; + enum TDriverSound { SoundDrvAuto = 0, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; enum TStageLCTUsage { StageUseNoLCT = 0, StageUseAllLCT, StageUsePosOnlyLCT }; // the config file must be always be available diff --git a/ryzom/client/src/sound_manager.cpp b/ryzom/client/src/sound_manager.cpp index 572bf2c07..3253aedec 100644 --- a/ryzom/client/src/sound_manager.cpp +++ b/ryzom/client/src/sound_manager.cpp @@ -468,9 +468,7 @@ void CSoundManager::init(IProgressCallback *progressCallBack) _AudioMixer->setPackedSheetOption("", false); UAudioMixer::TDriver driverType= UAudioMixer::DriverAuto; - if(ClientCfg.DriverSound==CClientConfig::SoundDrvFMod) - driverType= UAudioMixer::DriverFMod; - else if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL) + if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL) driverType= UAudioMixer::DriverOpenAl; else if(ClientCfg.DriverSound==CClientConfig::SoundDrvDirectSound) driverType= UAudioMixer::DriverDSound; From 177e2395a5b179925c472eb05d95df644ee92c75 Mon Sep 17 00:00:00 2001 From: Nuno Date: Sat, 18 Dec 2021 11:05:59 +0100 Subject: [PATCH 09/39] Revert "Merge branch '32-remove-fmod-option-not-used-or-client-crash' into main/atys-live" This reverts commit 0e2ec103ab74c81e2f9347d20514140f128d19e7. --- ryzom/client/src/client_cfg.cpp | 1 + ryzom/client/src/client_cfg.h | 2 +- ryzom/client/src/commands.cpp | 12 ------ .../src/interface_v3/action_handler_game.cpp | 24 +++-------- .../src/interface_v3/action_handler_item.cpp | 28 ++++++------- .../src/interface_v3/action_phrase_faber.cpp | 42 ------------------- .../client/src/interface_v3/dbctrl_sheet.cpp | 3 +- .../interface_expr_user_fct_game.cpp | 6 +-- ryzom/client/src/sound_manager.cpp | 4 +- 9 files changed, 26 insertions(+), 96 deletions(-) diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index 98ad5b9bc..7491e9413 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -1297,6 +1297,7 @@ void CClientConfig::setValues() if (varPtr) { if (nlstricmp(varPtr->asString(), "Auto") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvAuto; + else if (nlstricmp(varPtr->asString(), "FMod") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvFMod; else if (nlstricmp(varPtr->asString(), "OpenAL") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvOpenAL; else if (nlstricmp(varPtr->asString(), "DirectSound") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvDirectSound; else if (nlstricmp(varPtr->asString(), "XAudio2") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvXAudio2; diff --git a/ryzom/client/src/client_cfg.h b/ryzom/client/src/client_cfg.h index 0cf859721..8c0c299b4 100644 --- a/ryzom/client/src/client_cfg.h +++ b/ryzom/client/src/client_cfg.h @@ -58,7 +58,7 @@ using std::string; struct CClientConfig { enum TDriver3D { DrvAuto = 0, OpenGL, Direct3D, OpenGLES }; - enum TDriverSound { SoundDrvAuto = 0, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; + enum TDriverSound { SoundDrvAuto = 0, SoundDrvFMod, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; enum TStageLCTUsage { StageUseNoLCT = 0, StageUseAllLCT, StageUsePosOnlyLCT }; // the config file must be always be available diff --git a/ryzom/client/src/commands.cpp b/ryzom/client/src/commands.cpp index 18f2eb779..00d2b9e4f 100644 --- a/ryzom/client/src/commands.cpp +++ b/ryzom/client/src/commands.cpp @@ -408,18 +408,6 @@ NLMISC_COMMAND(afk, "Set the player as 'away from keyboard'","[]") return true; } -NLMISC_COMMAND(selfkill, "Kill the player ","") -{ - CBitMemStream out; - if(!GenericMsgHeaderMngr.pushNameToStream("COMMAND:SELFKILL", out)) - { - nlwarning("Unknown message name COMMAND:SELFKILL"); - return false; - } - NetMngr.push(out); - return true; -} - bool randomCheckCharset(std::string const& str) { std::string::const_iterator it, itEnd = str.end(); diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index 06a97671d..f05ffb271 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -1095,20 +1095,6 @@ public: REGISTER_ACTION_HANDLER( CHandlerContextWebPage, "context_web_page"); -// *************************************************************************** -class CHandlerFullMap : public IActionHandler -{ -public: - void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) - { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - - CLuaManager::getInstance().executeLuaScript("game:openFullMap()", true); - } -}; -REGISTER_ACTION_HANDLER( CHandlerFullMap, "fullmap"); - - // *************************************************************************** @@ -1972,7 +1958,7 @@ public: bool womanTitle = false; if (pChar != NULL) womanTitle = pChar->getGender() == GSGENDER::female; - + copyInout = STRING_MANAGER::CStringManagerClient::getTitleLocalizedName(CEntityCL::getTitleFromName(copyInout), womanTitle); // Sometimes translation contains another title @@ -2679,9 +2665,9 @@ class CAHAddShape : public IActionHandler instance.setPos(CVector((float)x, (float)y, (float)z)); instance.setRotQuat(dir.getRot()); } - + instance.setTransformMode(UTransformable::RotEuler); - + // if the shape is a particle system, additionnal parameters are user params UParticleSystemInstance psi; psi.cast (instance); @@ -3416,7 +3402,7 @@ class CHandlerGameConfigVREnable : public IActionHandler // VR_CONFIG CCtrlBaseButton *pBut = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(GAME_CONFIG_VR_ENABLE_BUTTON)); - if (pBut) + if (pBut) { // hide or show device list depending on enabled or not updateVRDevicesComboUI(pBut->getPushed()); @@ -3555,7 +3541,7 @@ class CHandlerGameConfigApply : public IActionHandler NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:CHAT:AUTO_CHANNEL")->setValue32(pCS->getPushed()); CCtrlBaseButton *pBut = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(GAME_CONFIG_VR_ENABLE_BUTTON)); - if (pBut) + if (pBut) { // store the new config variables ClientCfg.VREnable = pBut->getPushed(); diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index da7e95fd8..9bbf9fbc8 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -208,7 +208,7 @@ void CInterfaceItemEdition::CItemEditionWindow::begin() { if(_CurrItemSheet && !WindowName.empty()) { - + const CItemSheet *pIS = _CurrItemSheet->asItemSheet(); if ((pIS != NULL) && ITEMFAMILY::isTextCustomizable(pIS->Family) ) { @@ -342,7 +342,7 @@ void CInterfaceItemEdition::CItemEditionWindow::begin() // ******************************************************************************************** void CInterfaceItemEdition::CItemEditionWindow::end() { - + CDBCtrlSheet *pCSItem = _CurrItemSheet; std::string windowName = WindowName; if(pCSItem && !windowName.empty()) @@ -371,7 +371,7 @@ void CInterfaceItemEdition::CItemEditionWindow::end() editBoxShort->setActive(false); editShort->setActive(false); editBoxLarge->setActive(false); - editLarge->setActive(false); + editLarge->setActive(false); display->setActive(false); editButtons->setActive(false); closeButton->setActive(false); @@ -413,7 +413,7 @@ void CInterfaceItemEdition::CItemEditionWindow::validate() textValid = editLarge->getActive(); text = editBoxLarge->getInputString(); } - + if (textValid) { CBitMemStream out; @@ -1722,7 +1722,7 @@ void CItemMenuInBagInfoWaiter::infoReceived() void CItemMenuInBagInfoWaiter::infoValidated(CDBCtrlSheet* ctrlSheet) { CInterfaceManager *pIM = CInterfaceManager::getInstance(); - + // get the dialog stack CInterfaceGroup* pMenu = dynamic_cast( CWidgetManager::getInstance()->getElementFromId("ui:interface:item_menu_in_bag") ); if(!pMenu) return; @@ -1960,15 +1960,16 @@ class CHandlerItemMenuCheck : public IActionHandler for(i=0;isetActive((uint)invId!=INVENTORIES::pet_animal+i && + pMoveToPa[i]->setActive(invId!=INVENTORIES::guild && + (uint)invId!=INVENTORIES::pet_animal+i && invMngr.isInventoryPresent((INVENTORIES::TInventory)(INVENTORIES::pet_animal+i)) ); } if (pMoveToGuild) - pMoveToGuild->setActive(invId!=INVENTORIES::guild && invMngr.isInventoryPresent(INVENTORIES::guild)); + pMoveToGuild->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::guild)); if (pMoveToRoom) - pMoveToRoom->setActive(invId!=INVENTORIES::player_room && invMngr.isInventoryPresent(INVENTORIES::player_room)); + pMoveToRoom->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::player_room)); // std case: can drop / destroy if(pDrop) pDrop->setActive(invId!=INVENTORIES::guild); @@ -2036,7 +2037,7 @@ class CHandlerItemMenuCheck : public IActionHandler if (pMoveSubMenu) pMoveSubMenu->setActive(false); } - if (bIsLockedByOwner) + if (bIsLockedByOwner) { if (pLockUnlock) pLockUnlock->setHardText("uimUnlockItem"); // Cannot drop/destroy if locked by owner @@ -2049,8 +2050,7 @@ class CHandlerItemMenuCheck : public IActionHandler } // Only show lock menu item if inventory contains the info - if (invId!=INVENTORIES::guild) - if (pLockUnlock) pLockUnlock->setActive(pCS->canOwnerLock()); + if (pLockUnlock) pLockUnlock->setActive(pCS->canOwnerLock()); // **** Gray Entries @@ -2207,7 +2207,7 @@ class CHandlerItemMenuBaseCheck : public IActionHandler CViewTextMenu *pDestroy = dynamic_cast(pMenu->getView("destroy")); CViewTextMenu *pLockUnlock = dynamic_cast(pMenu->getView("lockunlock")); - if (pCS->getLockedByOwner()) + if (pCS->getLockedByOwner()) { pLockUnlock->setHardText("uimUnlockItem"); // Cannot destroy if locked by owner @@ -2364,7 +2364,7 @@ class CHandlerItemTextDisplay : public IActionHandler std::string const& windowName = sParams; CInterfaceManager *pIM = CInterfaceManager::getInstance(); CDBCtrlSheet *pCSItem = dynamic_cast(CWidgetManager::getInstance()->getCtrlLaunchingModal()); - if (pCSItem == NULL || windowName.empty()) + if (pCSItem == NULL || windowName.empty()) return; const CItemSheet *pIS = pCSItem->asItemSheet(); @@ -2385,7 +2385,7 @@ class CHandlerItemTextEdition : public IActionHandler std::string const& windowName = sParams; CInterfaceManager *pIM = CInterfaceManager::getInstance(); CDBCtrlSheet *pCSItem = dynamic_cast(CWidgetManager::getInstance()->getCtrlLaunchingModal()); - if (pCSItem == NULL || windowName.empty()) + if (pCSItem == NULL || windowName.empty()) return; CInterfaceItemEdition::getInstance()->setCurrWindow(pCSItem, windowName, true); diff --git a/ryzom/client/src/interface_v3/action_phrase_faber.cpp b/ryzom/client/src/interface_v3/action_phrase_faber.cpp index 05e5735e1..7625be010 100644 --- a/ryzom/client/src/interface_v3/action_phrase_faber.cpp +++ b/ryzom/client/src/interface_v3/action_phrase_faber.cpp @@ -50,10 +50,6 @@ using namespace NLMISC; // *************************************************************************** const std::string FaberPlanDB= "UI:PHRASE:FABER:FABER_PLAN:SHEET"; -const std::string FaberPlanHpBuffDB= "UI:PHRASE:FABER:FABER_PLAN:HP_BUFF"; -const std::string FaberPlanSapBuffDB= "UI:PHRASE:FABER:FABER_PLAN:SAP_BUFF"; -const std::string FaberPlanStaBuffDB= "UI:PHRASE:FABER:FABER_PLAN:STA_BUFF"; -const std::string FaberPlanFocusBuffDB= "UI:PHRASE:FABER:FABER_PLAN:FOCUS_BUFF"; const std::string MPFaberDB= "UI:PHRASE:FABER:MP_BUILD"; const std::string MPSelectionDB= "UI:PHRASE:FABER:MP_SELECT"; const std::string MPQuantityDb= "UI:PHRASE:FABER:MP_QUANTITY"; @@ -174,16 +170,6 @@ void CActionPhraseFaber::launchFaberCastWindow(sint32 memoryLine, uint memoryIn if(node) node->setValue32(0); - // Reset buff values - node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanHpBuffDB, false); - if (node) node->setValue32(0); - node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanSapBuffDB, false); - if (node) node->setValue32(0); - node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanStaBuffDB, false); - if (node) node->setValue32(0); - node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanFocusBuffDB, false); - if (node) node->setValue32(0); - // Reset the result item node= NLGUI::CDBManager::getInstance()->getDbProp(ItemResultSheetDB, false); if(node) @@ -1579,14 +1565,6 @@ void CActionPhraseFaber::updateItemResult() uint phraseSlot= pPM->getMemorizedPhrase(_ExecuteFromMemoryLine, _ExecuteFromMemoryIndex); const CSPhraseCom &phrase= pPM->getPhrase(phraseSlot); uint32 recommendedPropId= pBM->getBrickPropId("cr_recommended"); - uint32 crHp = pBM->getBrickPropId("cr_hp"); - uint32 crSap = pBM->getBrickPropId("cr_sap"); - uint32 crSta = pBM->getBrickPropId("cr_sta"); - uint32 crFocus = pBM->getBrickPropId("cr_focus"); - sint32 hpBuff = 0; - sint32 sapBuff = 0; - sint32 staBuff = 0; - sint32 focusBuff = 0; for(i=0;igetBrick(phrase.Bricks[i]); @@ -1600,30 +1578,10 @@ void CActionPhraseFaber::updateItemResult() // minimze the level minLevel= min(minLevel, sint32(brick->Properties[j].Value)); } - - if (brick->Properties[j].PropId == crHp) - hpBuff = sint32(brick->Properties[j].Value); - if (brick->Properties[j].PropId == crSap) - sapBuff = sint32(brick->Properties[j].Value); - if (brick->Properties[j].PropId == crSta) - staBuff = sint32(brick->Properties[j].Value); - if (brick->Properties[j].PropId == crFocus) - focusBuff = sint32(brick->Properties[j].Value); } } } - { - NLGUI::CDBManager *cdb = NLGUI::CDBManager::getInstance(); - NLMISC::CCDBNodeLeaf *node = cdb->getDbProp(FaberPlanHpBuffDB, false); - if (node) node->setValue32(hpBuff); - node = cdb->getDbProp(FaberPlanSapBuffDB, false); - if (node) node->setValue32(sapBuff); - node = cdb->getDbProp(FaberPlanStaBuffDB, false); - if (node) node->setValue32(staBuff); - node = cdb->getDbProp(FaberPlanFocusBuffDB, false); - if (node) node->setValue32(focusBuff); - } // **** Parse all MPs setuped, to compute level and stats uint totalItemPartMPReq= 0; diff --git a/ryzom/client/src/interface_v3/dbctrl_sheet.cpp b/ryzom/client/src/interface_v3/dbctrl_sheet.cpp index 0b8cda2ee..599e99716 100644 --- a/ryzom/client/src/interface_v3/dbctrl_sheet.cpp +++ b/ryzom/client/src/interface_v3/dbctrl_sheet.cpp @@ -2534,8 +2534,7 @@ void CDBCtrlSheet::drawSheet (sint32 x, sint32 y, bool draging, bool showSelecti // there is max 4 icons sint32 hArea = (hSheet / 4); sint32 xIcon = x; - // move buff icons up a row, quantity text is displayed on bottom-left corner - sint32 yIcon = y + hArea; + sint32 yIcon = y; for (uint i = 0; i < _BuffIcons.size(); ++i) { sint32 wIcon = _BuffIcons[i].IconW; diff --git a/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp b/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp index b6dde9379..4c21fee47 100644 --- a/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp +++ b/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp @@ -799,11 +799,7 @@ static DECLARE_INTERFACE_USER_FCT(getAnimalInventoryStateText) // According to server status, change the inventory text uint status= (uint)args[0].getInteger(); - if(ANIMAL_STATUS::isInBag((ANIMAL_STATUS::EAnimalStatus)status)) - { - result.setString("uiAnimalInBag"); - } - else if(ANIMAL_STATUS::isInStable((ANIMAL_STATUS::EAnimalStatus)status)) + if(ANIMAL_STATUS::isInStable((ANIMAL_STATUS::EAnimalStatus)status)) { result.setString("uiAnimalInStable"); } diff --git a/ryzom/client/src/sound_manager.cpp b/ryzom/client/src/sound_manager.cpp index 3253aedec..572bf2c07 100644 --- a/ryzom/client/src/sound_manager.cpp +++ b/ryzom/client/src/sound_manager.cpp @@ -468,7 +468,9 @@ void CSoundManager::init(IProgressCallback *progressCallBack) _AudioMixer->setPackedSheetOption("", false); UAudioMixer::TDriver driverType= UAudioMixer::DriverAuto; - if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL) + if(ClientCfg.DriverSound==CClientConfig::SoundDrvFMod) + driverType= UAudioMixer::DriverFMod; + else if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL) driverType= UAudioMixer::DriverOpenAl; else if(ClientCfg.DriverSound==CClientConfig::SoundDrvDirectSound) driverType= UAudioMixer::DriverDSound; From de638dfe6cd055db8ce265614b14d448d642156a Mon Sep 17 00:00:00 2001 From: Nuno Date: Sat, 18 Dec 2021 11:05:54 +0100 Subject: [PATCH 10/39] Remove fmod option --- ryzom/client/src/client_cfg.cpp | 1 - ryzom/client/src/client_cfg.h | 2 +- ryzom/client/src/sound_manager.cpp | 4 +--- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index 7491e9413..98ad5b9bc 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -1297,7 +1297,6 @@ void CClientConfig::setValues() if (varPtr) { if (nlstricmp(varPtr->asString(), "Auto") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvAuto; - else if (nlstricmp(varPtr->asString(), "FMod") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvFMod; else if (nlstricmp(varPtr->asString(), "OpenAL") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvOpenAL; else if (nlstricmp(varPtr->asString(), "DirectSound") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvDirectSound; else if (nlstricmp(varPtr->asString(), "XAudio2") == 0) ClientCfg.DriverSound = CClientConfig::SoundDrvXAudio2; diff --git a/ryzom/client/src/client_cfg.h b/ryzom/client/src/client_cfg.h index 8c0c299b4..0cf859721 100644 --- a/ryzom/client/src/client_cfg.h +++ b/ryzom/client/src/client_cfg.h @@ -58,7 +58,7 @@ using std::string; struct CClientConfig { enum TDriver3D { DrvAuto = 0, OpenGL, Direct3D, OpenGLES }; - enum TDriverSound { SoundDrvAuto = 0, SoundDrvFMod, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; + enum TDriverSound { SoundDrvAuto = 0, SoundDrvOpenAL, SoundDrvDirectSound, SoundDrvXAudio2 }; enum TStageLCTUsage { StageUseNoLCT = 0, StageUseAllLCT, StageUsePosOnlyLCT }; // the config file must be always be available diff --git a/ryzom/client/src/sound_manager.cpp b/ryzom/client/src/sound_manager.cpp index 572bf2c07..3253aedec 100644 --- a/ryzom/client/src/sound_manager.cpp +++ b/ryzom/client/src/sound_manager.cpp @@ -468,9 +468,7 @@ void CSoundManager::init(IProgressCallback *progressCallBack) _AudioMixer->setPackedSheetOption("", false); UAudioMixer::TDriver driverType= UAudioMixer::DriverAuto; - if(ClientCfg.DriverSound==CClientConfig::SoundDrvFMod) - driverType= UAudioMixer::DriverFMod; - else if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL) + if(ClientCfg.DriverSound==CClientConfig::SoundDrvOpenAL) driverType= UAudioMixer::DriverOpenAl; else if(ClientCfg.DriverSound==CClientConfig::SoundDrvDirectSound) driverType= UAudioMixer::DriverDSound; From 013aad73d2a24e7111888bd5eaf811691ec4c21e Mon Sep 17 00:00:00 2001 From: Nimetu Date: Sat, 18 Dec 2021 22:18:18 +0200 Subject: [PATCH 11/39] Fix initial fullscreen window on OpenGL/Windows --- .../3d/driver/opengl/driver_opengl_window.cpp | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/nel/src/3d/driver/opengl/driver_opengl_window.cpp index 35dc433a8..68ad77a6a 100644 --- a/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -3105,13 +3105,24 @@ void CDriverGL::setWindowSize(uint32 width, uint32 height) SetWindowPos(_win, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags); // init window width and height - RECT clientRect; - GetClientRect(_win, &clientRect); - _CurrentMode.Width = uint16(clientRect.right-clientRect.left); - _CurrentMode.Height = uint16(clientRect.bottom-clientRect.top); - GetWindowRect(_win, &clientRect); - _WindowX = clientRect.left; - _WindowY = clientRect.top; + if (_CurrentMode.Windowed) + { + // TODO: this gives wrong info for initial fullscreen window so limit for windowed only for now + RECT clientRect; + GetClientRect(_win, &clientRect); + _CurrentMode.Width = uint16(clientRect.right-clientRect.left); + _CurrentMode.Height = uint16(clientRect.bottom-clientRect.top); + GetWindowRect(_win, &clientRect); + _WindowX = clientRect.left; + _WindowY = clientRect.top; + } + else + { + _CurrentMode.Width = width; + _CurrentMode.Height = height; + _WindowX = 0; + _WindowY = 0; + } #elif defined(NL_OS_MAC) From 80623a20ccc231d16744691833ae10e935b8cb98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= Date: Sat, 18 Dec 2021 20:35:23 +0000 Subject: [PATCH 12/39] Merge branch '31-wrong-fullscreen-resolution-in-opengl-win' into 'main/gingo-test' Fix initial fullscreen window on OpenGL/Windows See merge request ryzom/ryzom-core!31 --- .../3d/driver/opengl/driver_opengl_window.cpp | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/nel/src/3d/driver/opengl/driver_opengl_window.cpp index 35dc433a8..68ad77a6a 100644 --- a/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -3105,13 +3105,24 @@ void CDriverGL::setWindowSize(uint32 width, uint32 height) SetWindowPos(_win, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags); // init window width and height - RECT clientRect; - GetClientRect(_win, &clientRect); - _CurrentMode.Width = uint16(clientRect.right-clientRect.left); - _CurrentMode.Height = uint16(clientRect.bottom-clientRect.top); - GetWindowRect(_win, &clientRect); - _WindowX = clientRect.left; - _WindowY = clientRect.top; + if (_CurrentMode.Windowed) + { + // TODO: this gives wrong info for initial fullscreen window so limit for windowed only for now + RECT clientRect; + GetClientRect(_win, &clientRect); + _CurrentMode.Width = uint16(clientRect.right-clientRect.left); + _CurrentMode.Height = uint16(clientRect.bottom-clientRect.top); + GetWindowRect(_win, &clientRect); + _WindowX = clientRect.left; + _WindowY = clientRect.top; + } + else + { + _CurrentMode.Width = width; + _CurrentMode.Height = height; + _WindowX = 0; + _WindowY = 0; + } #elif defined(NL_OS_MAC) From 0df3879358dd0fd202b5785ef41a3be500642840 Mon Sep 17 00:00:00 2001 From: Nuno Date: Sun, 19 Dec 2021 22:18:37 +0100 Subject: [PATCH 13/39] Reapply changes reverted into atys-live because bad merge --- ryzom/client/src/commands.cpp | 12 ++++++ .../src/interface_v3/action_handler_game.cpp | 24 ++++++++--- .../src/interface_v3/action_handler_item.cpp | 28 ++++++------- .../src/interface_v3/action_phrase_faber.cpp | 42 +++++++++++++++++++ .../client/src/interface_v3/dbctrl_sheet.cpp | 3 +- .../interface_expr_user_fct_game.cpp | 6 ++- 6 files changed, 94 insertions(+), 21 deletions(-) diff --git a/ryzom/client/src/commands.cpp b/ryzom/client/src/commands.cpp index 00d2b9e4f..18f2eb779 100644 --- a/ryzom/client/src/commands.cpp +++ b/ryzom/client/src/commands.cpp @@ -408,6 +408,18 @@ NLMISC_COMMAND(afk, "Set the player as 'away from keyboard'","[]") return true; } +NLMISC_COMMAND(selfkill, "Kill the player ","") +{ + CBitMemStream out; + if(!GenericMsgHeaderMngr.pushNameToStream("COMMAND:SELFKILL", out)) + { + nlwarning("Unknown message name COMMAND:SELFKILL"); + return false; + } + NetMngr.push(out); + return true; +} + bool randomCheckCharset(std::string const& str) { std::string::const_iterator it, itEnd = str.end(); diff --git a/ryzom/client/src/interface_v3/action_handler_game.cpp b/ryzom/client/src/interface_v3/action_handler_game.cpp index f05ffb271..06a97671d 100644 --- a/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -1095,6 +1095,20 @@ public: REGISTER_ACTION_HANDLER( CHandlerContextWebPage, "context_web_page"); +// *************************************************************************** +class CHandlerFullMap : public IActionHandler +{ +public: + void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) + { + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + + CLuaManager::getInstance().executeLuaScript("game:openFullMap()", true); + } +}; +REGISTER_ACTION_HANDLER( CHandlerFullMap, "fullmap"); + + // *************************************************************************** @@ -1958,7 +1972,7 @@ public: bool womanTitle = false; if (pChar != NULL) womanTitle = pChar->getGender() == GSGENDER::female; - + copyInout = STRING_MANAGER::CStringManagerClient::getTitleLocalizedName(CEntityCL::getTitleFromName(copyInout), womanTitle); // Sometimes translation contains another title @@ -2665,9 +2679,9 @@ class CAHAddShape : public IActionHandler instance.setPos(CVector((float)x, (float)y, (float)z)); instance.setRotQuat(dir.getRot()); } - + instance.setTransformMode(UTransformable::RotEuler); - + // if the shape is a particle system, additionnal parameters are user params UParticleSystemInstance psi; psi.cast (instance); @@ -3402,7 +3416,7 @@ class CHandlerGameConfigVREnable : public IActionHandler // VR_CONFIG CCtrlBaseButton *pBut = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(GAME_CONFIG_VR_ENABLE_BUTTON)); - if (pBut) + if (pBut) { // hide or show device list depending on enabled or not updateVRDevicesComboUI(pBut->getPushed()); @@ -3541,7 +3555,7 @@ class CHandlerGameConfigApply : public IActionHandler NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:CHAT:AUTO_CHANNEL")->setValue32(pCS->getPushed()); CCtrlBaseButton *pBut = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(GAME_CONFIG_VR_ENABLE_BUTTON)); - if (pBut) + if (pBut) { // store the new config variables ClientCfg.VREnable = pBut->getPushed(); diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index 9bbf9fbc8..da7e95fd8 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -208,7 +208,7 @@ void CInterfaceItemEdition::CItemEditionWindow::begin() { if(_CurrItemSheet && !WindowName.empty()) { - + const CItemSheet *pIS = _CurrItemSheet->asItemSheet(); if ((pIS != NULL) && ITEMFAMILY::isTextCustomizable(pIS->Family) ) { @@ -342,7 +342,7 @@ void CInterfaceItemEdition::CItemEditionWindow::begin() // ******************************************************************************************** void CInterfaceItemEdition::CItemEditionWindow::end() { - + CDBCtrlSheet *pCSItem = _CurrItemSheet; std::string windowName = WindowName; if(pCSItem && !windowName.empty()) @@ -371,7 +371,7 @@ void CInterfaceItemEdition::CItemEditionWindow::end() editBoxShort->setActive(false); editShort->setActive(false); editBoxLarge->setActive(false); - editLarge->setActive(false); + editLarge->setActive(false); display->setActive(false); editButtons->setActive(false); closeButton->setActive(false); @@ -413,7 +413,7 @@ void CInterfaceItemEdition::CItemEditionWindow::validate() textValid = editLarge->getActive(); text = editBoxLarge->getInputString(); } - + if (textValid) { CBitMemStream out; @@ -1722,7 +1722,7 @@ void CItemMenuInBagInfoWaiter::infoReceived() void CItemMenuInBagInfoWaiter::infoValidated(CDBCtrlSheet* ctrlSheet) { CInterfaceManager *pIM = CInterfaceManager::getInstance(); - + // get the dialog stack CInterfaceGroup* pMenu = dynamic_cast( CWidgetManager::getInstance()->getElementFromId("ui:interface:item_menu_in_bag") ); if(!pMenu) return; @@ -1960,16 +1960,15 @@ class CHandlerItemMenuCheck : public IActionHandler for(i=0;isetActive(invId!=INVENTORIES::guild && - (uint)invId!=INVENTORIES::pet_animal+i && + pMoveToPa[i]->setActive((uint)invId!=INVENTORIES::pet_animal+i && invMngr.isInventoryPresent((INVENTORIES::TInventory)(INVENTORIES::pet_animal+i)) ); } if (pMoveToGuild) - pMoveToGuild->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::guild)); + pMoveToGuild->setActive(invId!=INVENTORIES::guild && invMngr.isInventoryPresent(INVENTORIES::guild)); if (pMoveToRoom) - pMoveToRoom->setActive(invId==INVENTORIES::bag && invMngr.isInventoryPresent(INVENTORIES::player_room)); + pMoveToRoom->setActive(invId!=INVENTORIES::player_room && invMngr.isInventoryPresent(INVENTORIES::player_room)); // std case: can drop / destroy if(pDrop) pDrop->setActive(invId!=INVENTORIES::guild); @@ -2037,7 +2036,7 @@ class CHandlerItemMenuCheck : public IActionHandler if (pMoveSubMenu) pMoveSubMenu->setActive(false); } - if (bIsLockedByOwner) + if (bIsLockedByOwner) { if (pLockUnlock) pLockUnlock->setHardText("uimUnlockItem"); // Cannot drop/destroy if locked by owner @@ -2050,7 +2049,8 @@ class CHandlerItemMenuCheck : public IActionHandler } // Only show lock menu item if inventory contains the info - if (pLockUnlock) pLockUnlock->setActive(pCS->canOwnerLock()); + if (invId!=INVENTORIES::guild) + if (pLockUnlock) pLockUnlock->setActive(pCS->canOwnerLock()); // **** Gray Entries @@ -2207,7 +2207,7 @@ class CHandlerItemMenuBaseCheck : public IActionHandler CViewTextMenu *pDestroy = dynamic_cast(pMenu->getView("destroy")); CViewTextMenu *pLockUnlock = dynamic_cast(pMenu->getView("lockunlock")); - if (pCS->getLockedByOwner()) + if (pCS->getLockedByOwner()) { pLockUnlock->setHardText("uimUnlockItem"); // Cannot destroy if locked by owner @@ -2364,7 +2364,7 @@ class CHandlerItemTextDisplay : public IActionHandler std::string const& windowName = sParams; CInterfaceManager *pIM = CInterfaceManager::getInstance(); CDBCtrlSheet *pCSItem = dynamic_cast(CWidgetManager::getInstance()->getCtrlLaunchingModal()); - if (pCSItem == NULL || windowName.empty()) + if (pCSItem == NULL || windowName.empty()) return; const CItemSheet *pIS = pCSItem->asItemSheet(); @@ -2385,7 +2385,7 @@ class CHandlerItemTextEdition : public IActionHandler std::string const& windowName = sParams; CInterfaceManager *pIM = CInterfaceManager::getInstance(); CDBCtrlSheet *pCSItem = dynamic_cast(CWidgetManager::getInstance()->getCtrlLaunchingModal()); - if (pCSItem == NULL || windowName.empty()) + if (pCSItem == NULL || windowName.empty()) return; CInterfaceItemEdition::getInstance()->setCurrWindow(pCSItem, windowName, true); diff --git a/ryzom/client/src/interface_v3/action_phrase_faber.cpp b/ryzom/client/src/interface_v3/action_phrase_faber.cpp index 7625be010..05e5735e1 100644 --- a/ryzom/client/src/interface_v3/action_phrase_faber.cpp +++ b/ryzom/client/src/interface_v3/action_phrase_faber.cpp @@ -50,6 +50,10 @@ using namespace NLMISC; // *************************************************************************** const std::string FaberPlanDB= "UI:PHRASE:FABER:FABER_PLAN:SHEET"; +const std::string FaberPlanHpBuffDB= "UI:PHRASE:FABER:FABER_PLAN:HP_BUFF"; +const std::string FaberPlanSapBuffDB= "UI:PHRASE:FABER:FABER_PLAN:SAP_BUFF"; +const std::string FaberPlanStaBuffDB= "UI:PHRASE:FABER:FABER_PLAN:STA_BUFF"; +const std::string FaberPlanFocusBuffDB= "UI:PHRASE:FABER:FABER_PLAN:FOCUS_BUFF"; const std::string MPFaberDB= "UI:PHRASE:FABER:MP_BUILD"; const std::string MPSelectionDB= "UI:PHRASE:FABER:MP_SELECT"; const std::string MPQuantityDb= "UI:PHRASE:FABER:MP_QUANTITY"; @@ -170,6 +174,16 @@ void CActionPhraseFaber::launchFaberCastWindow(sint32 memoryLine, uint memoryIn if(node) node->setValue32(0); + // Reset buff values + node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanHpBuffDB, false); + if (node) node->setValue32(0); + node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanSapBuffDB, false); + if (node) node->setValue32(0); + node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanStaBuffDB, false); + if (node) node->setValue32(0); + node = NLGUI::CDBManager::getInstance()->getDbProp(FaberPlanFocusBuffDB, false); + if (node) node->setValue32(0); + // Reset the result item node= NLGUI::CDBManager::getInstance()->getDbProp(ItemResultSheetDB, false); if(node) @@ -1565,6 +1579,14 @@ void CActionPhraseFaber::updateItemResult() uint phraseSlot= pPM->getMemorizedPhrase(_ExecuteFromMemoryLine, _ExecuteFromMemoryIndex); const CSPhraseCom &phrase= pPM->getPhrase(phraseSlot); uint32 recommendedPropId= pBM->getBrickPropId("cr_recommended"); + uint32 crHp = pBM->getBrickPropId("cr_hp"); + uint32 crSap = pBM->getBrickPropId("cr_sap"); + uint32 crSta = pBM->getBrickPropId("cr_sta"); + uint32 crFocus = pBM->getBrickPropId("cr_focus"); + sint32 hpBuff = 0; + sint32 sapBuff = 0; + sint32 staBuff = 0; + sint32 focusBuff = 0; for(i=0;igetBrick(phrase.Bricks[i]); @@ -1578,10 +1600,30 @@ void CActionPhraseFaber::updateItemResult() // minimze the level minLevel= min(minLevel, sint32(brick->Properties[j].Value)); } + + if (brick->Properties[j].PropId == crHp) + hpBuff = sint32(brick->Properties[j].Value); + if (brick->Properties[j].PropId == crSap) + sapBuff = sint32(brick->Properties[j].Value); + if (brick->Properties[j].PropId == crSta) + staBuff = sint32(brick->Properties[j].Value); + if (brick->Properties[j].PropId == crFocus) + focusBuff = sint32(brick->Properties[j].Value); } } } + { + NLGUI::CDBManager *cdb = NLGUI::CDBManager::getInstance(); + NLMISC::CCDBNodeLeaf *node = cdb->getDbProp(FaberPlanHpBuffDB, false); + if (node) node->setValue32(hpBuff); + node = cdb->getDbProp(FaberPlanSapBuffDB, false); + if (node) node->setValue32(sapBuff); + node = cdb->getDbProp(FaberPlanStaBuffDB, false); + if (node) node->setValue32(staBuff); + node = cdb->getDbProp(FaberPlanFocusBuffDB, false); + if (node) node->setValue32(focusBuff); + } // **** Parse all MPs setuped, to compute level and stats uint totalItemPartMPReq= 0; diff --git a/ryzom/client/src/interface_v3/dbctrl_sheet.cpp b/ryzom/client/src/interface_v3/dbctrl_sheet.cpp index 599e99716..0b8cda2ee 100644 --- a/ryzom/client/src/interface_v3/dbctrl_sheet.cpp +++ b/ryzom/client/src/interface_v3/dbctrl_sheet.cpp @@ -2534,7 +2534,8 @@ void CDBCtrlSheet::drawSheet (sint32 x, sint32 y, bool draging, bool showSelecti // there is max 4 icons sint32 hArea = (hSheet / 4); sint32 xIcon = x; - sint32 yIcon = y; + // move buff icons up a row, quantity text is displayed on bottom-left corner + sint32 yIcon = y + hArea; for (uint i = 0; i < _BuffIcons.size(); ++i) { sint32 wIcon = _BuffIcons[i].IconW; diff --git a/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp b/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp index 4c21fee47..b6dde9379 100644 --- a/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp +++ b/ryzom/client/src/interface_v3/interface_expr_user_fct_game.cpp @@ -799,7 +799,11 @@ static DECLARE_INTERFACE_USER_FCT(getAnimalInventoryStateText) // According to server status, change the inventory text uint status= (uint)args[0].getInteger(); - if(ANIMAL_STATUS::isInStable((ANIMAL_STATUS::EAnimalStatus)status)) + if(ANIMAL_STATUS::isInBag((ANIMAL_STATUS::EAnimalStatus)status)) + { + result.setString("uiAnimalInBag"); + } + else if(ANIMAL_STATUS::isInStable((ANIMAL_STATUS::EAnimalStatus)status)) { result.setString("uiAnimalInStable"); } From 36e83e32f444a89957243ee2d526cb36e89505b3 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Mon, 20 Dec 2021 08:46:36 +0200 Subject: [PATCH 14/39] Fix moving fullscreen window between monitors --- nel/src/3d/driver/opengl/driver_opengl_window.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/nel/src/3d/driver/opengl/driver_opengl_window.cpp index 68ad77a6a..bb48473d3 100644 --- a/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -2064,6 +2064,8 @@ bool CDriverGL::setMode(const GfxMode& amode) // if window is visible, then also restore mouse relative position. if (!mode.DisplayDevice.empty() && mode.DisplayDevice != current.DisplayDevice) { + setWindowStyle(EWSWindowed); + int screen = DefaultScreen(_dpy); Window root = RootWindow(_dpy, screen); uint mouseX = mode.Width / 2; @@ -2090,6 +2092,7 @@ bool CDriverGL::setMode(const GfxMode& amode) XMoveWindow(_dpy, _win, newX, newY); _WindowX = newX; _WindowY = newY; + setWindowStyle(EWSFullscreen); } } #endif From f6ac9bc4c12d35a4760b820ab82491660689b56a Mon Sep 17 00:00:00 2001 From: Nimetu Date: Mon, 20 Dec 2021 08:46:36 +0200 Subject: [PATCH 15/39] Fix moving fullscreen window between monitors --- nel/src/3d/driver/opengl/driver_opengl_window.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/nel/src/3d/driver/opengl/driver_opengl_window.cpp index 68ad77a6a..bb48473d3 100644 --- a/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -2064,6 +2064,8 @@ bool CDriverGL::setMode(const GfxMode& amode) // if window is visible, then also restore mouse relative position. if (!mode.DisplayDevice.empty() && mode.DisplayDevice != current.DisplayDevice) { + setWindowStyle(EWSWindowed); + int screen = DefaultScreen(_dpy); Window root = RootWindow(_dpy, screen); uint mouseX = mode.Width / 2; @@ -2090,6 +2092,7 @@ bool CDriverGL::setMode(const GfxMode& amode) XMoveWindow(_dpy, _win, newX, newY); _WindowX = newX; _WindowY = newY; + setWindowStyle(EWSFullscreen); } } #endif From 993d749dbab2a3f32dbd0e65a38ee6847f334b6a Mon Sep 17 00:00:00 2001 From: Nuno Date: Mon, 20 Dec 2021 19:49:50 +0100 Subject: [PATCH 16/39] Use Hunter package manager to compile external libraries --- CMakeLists.txt | 69 ++- CMakeModules/FindLuabind.cmake | 23 +- CMakeModules/HunterConfig.cmake | 8 + CMakeModules/HunterGate.cmake | 537 +++++++++++++++++++++ CMakeModules/nel.cmake | 43 +- nel/CMakeLists.txt | 10 +- nel/samples/3d/font/CMakeLists.txt | 1 + nel/src/misc/CMakeLists.txt | 16 + nel/src/sound/CMakeLists.txt | 17 + nel/src/sound/driver/openal/CMakeLists.txt | 11 +- 10 files changed, 726 insertions(+), 9 deletions(-) create mode 100644 CMakeModules/HunterConfig.cmake create mode 100644 CMakeModules/HunterGate.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 92e923e30..ad9fc7531 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,11 +34,37 @@ IF(COMMAND cmake_policy) ENDIF() ENDIF() + +#----------------------------------------------------------------------------- +# Downloads and install Hunger into HUNTER_ROOT directory. +OPTION(HUNTER_ENABLED "Enable Hunter package manager" OFF) +IF(HUNTER_ENABLED) + INCLUDE("CMakeModules/HunterGate.cmake") + HunterGate( + URL "https://github.com/cpp-pm/hunter/archive/v0.23.317.tar.gz" + SHA1 "fbdd94b1966d351384e27b02c8d134915b1131d6" + FILEPATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules/HunterConfig.cmake" + ) + + # default options for hunterized build + SET(WITH_STATIC ON CACHE BOOL "static" FORCE) + SET(WITH_STATIC_DRIVERS ON CACHE BOOL "static drivers" FORCE) + SET(WITH_STATIC_CURL ON CACHE BOOL "static curl" FORCE) + SET(WITH_STATIC_LIBXML2 ON CACHE BOOL "static libxml2" FORCE) + SET(WITH_STATIC_EXTERNAL ON CACHE BOOL "static external" FORCE) + SET(WITH_EXTERNAL OFF CACHE BOOL "external libs" FORCE) +ENDIF() + + +#----------------------------------------------------------------------------- + INCLUDE(nel) INCLUDE(ConfigureChecks) INCLUDE(CheckDepends) INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL) +MESSAGE("EXTERNAL ${WITH_EXTERNAL}") + # Force out of source builds. CHECK_OUT_OF_SOURCE() @@ -134,6 +160,28 @@ IF(WIN32) ENDIF() ENDIF() +IF(HUNTER_ENABLED) + ## TODO: hack for freetype hunter package + SET(ON 1) + ## + HUNTER_ADD_PACKAGE(ZLIB) + + FIND_PACKAGE(ZLIB CONFIG REQUIRED) + SET(ZLIB_LIBRARY ZLIB::zlib) + + HUNTER_ADD_PACKAGE(libxml2) + FIND_PACKAGE(libxml2 CONFIG REQUIRED) + SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} libxml2::libxml2) + + HUNTER_ADD_PACKAGE(OpenSSL) + FIND_PACKAGE(OpenSSL REQUIRED) + # TODO: is OpenSSL::Crypto only needed for WIN32? + SET(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) + + # for precompiled headers, not needed if using TARGET_PRECOMPILE_HEADERS() from cmake 3.16+ + SET(ZLIB_INCLUDE_DIR ZLIB_ROOT/include) + SET(LIBXML2_INCLUDE_DIR ${LIBXML2_ROOT}/include/libxml2) +ELSE() FIND_PACKAGE(ZLIB REQUIRED) FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(PNG REQUIRED) @@ -144,6 +192,7 @@ FIND_PACKAGE(Jpeg) IF(WIN32) SET(OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES} Crypt32.lib) ENDIF() +ENDIF() #hunter IF(WITH_LIBOVR) FIND_PACKAGE(LibOVR) @@ -237,6 +286,7 @@ ENDIF() INCLUDE(FindHelpers) +#TODO: hunter qt package IF(WITH_QT5) FIND_QT5() ENDIF() @@ -248,6 +298,7 @@ IF(WITH_QT) FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtXml QtOpenGL REQUIRED) ENDIF() +#TODO: hunter assimp package IF(WITH_ASSIMP) FIND_PACKAGE(assimp REQUIRED) ENDIF() @@ -257,9 +308,20 @@ IF(WITH_NEL) FIND_PACKAGE(CppTest) ENDIF() - IF(WITH_GUI) - FIND_PACKAGE(Luabind REQUIRED) - ENDIF() + IF(HUNTER_ENABLED) + IF(WITH_GUI) + HUNTER_ADD_PACKAGE(luabind) + FIND_PACKAGE(Luabind REQUIRED) + ENDIF() + + HUNTER_ADD_PACKAGE(CURL) + FIND_PACKAGE(CURL CONFIG REQUIRED) + # TODO: for nelgui + SET(CURL_LIBRARIES CURL::libcurl libxml2::libxml2) + ELSE() + IF(WITH_GUI) + FIND_PACKAGE(Luabind REQUIRED) + ENDIF() FIND_PACKAGE(CURL REQUIRED) @@ -310,6 +372,7 @@ IF(WITH_NEL) ENDIF() ENDIF() ENDIF() + ENDIF() #hunter INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include) ADD_SUBDIRECTORY(nel) diff --git a/CMakeModules/FindLuabind.cmake b/CMakeModules/FindLuabind.cmake index dae1dbd99..f4c8331e0 100644 --- a/CMakeModules/FindLuabind.cmake +++ b/CMakeModules/FindLuabind.cmake @@ -69,7 +69,13 @@ MACRO(FIND_CORRECT_LUA_VERSION) ENDIF() ELSE() # TODO: find a way to detect Lua version - IF(WITH_LUA53) + IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(Lua) + FIND_PACKAGE(Lua CONFIG REQUIRED) + SET(LUA_LIBRARIES Lua::lua_lib) + ELSEIF(WITH_LUA54) + FIND_PACKAGE(Lua54 REQUIRED) + ELSEIF(WITH_LUA53) FIND_PACKAGE(Lua53 REQUIRED) ELSEIF(WITH_LUA52) FIND_PACKAGE(Lua52 REQUIRED) @@ -89,6 +95,21 @@ ENDIF() SET(LIBRARY_NAME_RELEASE) SET(LIBRARY_NAME_DEBUG) +IF(WITH_LUA54) + IF(WITH_STLPORT) + LIST(APPEND LIBRARY_NAME_RELEASE luabind_stlport_lua54) + LIST(APPEND LIBRARY_NAME_DEBUG luabind_stlport_lua54d) + ENDIF() + + LIST(APPEND LIBRARY_NAME_RELEASE luabind_lua54) + LIST(APPEND LIBRARY_NAME_DEBUG luabind_lua54d) +ENDIF() + +IF(HUNTER_ENABLED) + LIST(APPEND LIBRARY_NAME_RELEASE luabind luabind09) + LIST(APPEND LIBRARY_NAME_DEBUG luabindd luabind09-d) +ENDIF() + IF(WITH_LUA53) IF(WITH_STLPORT) LIST(APPEND LIBRARY_NAME_RELEASE luabind_stlport_lua53) diff --git a/CMakeModules/HunterConfig.cmake b/CMakeModules/HunterConfig.cmake new file mode 100644 index 000000000..144eeeb6a --- /dev/null +++ b/CMakeModules/HunterConfig.cmake @@ -0,0 +1,8 @@ +# This file is parsed by HunterGate command + +hunter_config(luabind + VERSION 0.9.1 + URL "https://github.com/nimetu/luabind/tarball/2fa4606" + SHA1 "3b4646bab9f0b2362d7b8d71d78e40deaf3cc747" + ) + diff --git a/CMakeModules/HunterGate.cmake b/CMakeModules/HunterGate.cmake new file mode 100644 index 000000000..64ccde563 --- /dev/null +++ b/CMakeModules/HunterGate.cmake @@ -0,0 +1,537 @@ +# Copyright (c) 2013-2019, Ruslan Baratov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This is a gate file to Hunter package manager. +# Include this file using `include` command and add package you need, example: +# +# cmake_minimum_required(VERSION 3.2) +# +# include("cmake/HunterGate.cmake") +# HunterGate( +# URL "https://github.com/path/to/hunter/archive.tar.gz" +# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" +# ) +# +# project(MyProject) +# +# hunter_add_package(Foo) +# hunter_add_package(Boo COMPONENTS Bar Baz) +# +# Projects: +# * https://github.com/hunter-packages/gate/ +# * https://github.com/ruslo/hunter + +option(HUNTER_ENABLED "Enable Hunter package manager support" ON) + +if(HUNTER_ENABLED) + if(CMAKE_VERSION VERSION_LESS "3.2") + message( + FATAL_ERROR + "At least CMake version 3.2 required for Hunter dependency management." + " Update CMake or set HUNTER_ENABLED to OFF." + ) + endif() +endif() + +include(CMakeParseArguments) # cmake_parse_arguments + +option(HUNTER_STATUS_PRINT "Print working status" ON) +option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) +option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) +set(HUNTER_ROOT "" CACHE FILEPATH "Override the HUNTER_ROOT.") + +set(HUNTER_ERROR_PAGE "https://hunter.readthedocs.io/en/latest/reference/errors") + +function(hunter_gate_status_print) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + message(STATUS "[hunter] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_status_debug) + if(HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_error_page error_page) + message("------------------------------ ERROR ------------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") + message("-------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() + +function(hunter_gate_internal_error) + message("") + foreach(print_message ${ARGV}) + message("[hunter ** INTERNAL **] ${print_message}") + endforeach() + message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") + if("${hunter_ERROR_PAGE}" STREQUAL "") + hunter_gate_internal_error("Expected ERROR_PAGE") + endif() + message("") + foreach(x ${hunter_UNPARSED_ARGUMENTS}) + message("[hunter ** FATAL ERROR **] ${x}") + endforeach() + message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("${hunter_ERROR_PAGE}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") +endfunction() + +function(hunter_gate_self root version sha1 result) + string(COMPARE EQUAL "${root}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("root is empty") + endif() + + string(COMPARE EQUAL "${version}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("version is empty") + endif() + + string(COMPARE EQUAL "${sha1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("sha1 is empty") + endif() + + string(SUBSTRING "${sha1}" 0 7 archive_id) + + if(EXISTS "${root}/cmake/Hunter") + set(hunter_self "${root}") + else() + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + endif() + + set("${result}" "${hunter_self}" PARENT_SCOPE) +endfunction() + +# Set HUNTER_GATE_ROOT cmake variable to suitable value. +function(hunter_gate_detect_root) + # Check CMake variable + if(HUNTER_ROOT) + set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") + return() + endif() + + # Check environment variable + if(DEFINED ENV{HUNTER_ROOT}) + set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") + return() + endif() + + # Check HOME environment variable + if(DEFINED ENV{HOME}) + set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") + return() + endif() + + # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) + if(WIN32) + if(DEFINED ENV{SYSTEMDRIVE}) + set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using SYSTEMDRIVE environment variable" + ) + return() + endif() + + if(DEFINED ENV{USERPROFILE}) + set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using USERPROFILE environment variable" + ) + return() + endif() + endif() + + hunter_gate_fatal_error( + "Can't detect HUNTER_ROOT" + ERROR_PAGE "error.detect.hunter.root" + ) +endfunction() + +function(hunter_gate_download dir) + string( + COMPARE + NOTEQUAL + "$ENV{HUNTER_DISABLE_AUTOINSTALL}" + "" + disable_autoinstall + ) + if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) + hunter_gate_fatal_error( + "Hunter not found in '${dir}'" + "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" + "Settings:" + " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" + " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" + ERROR_PAGE "error.run.install" + ) + endif() + string(COMPARE EQUAL "${dir}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("Empty 'dir' argument") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_URL empty") + endif() + + set(done_location "${dir}/DONE") + set(sha1_location "${dir}/SHA1") + + set(build_dir "${dir}/Build") + set(cmakelists "${dir}/CMakeLists.txt") + + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + + if(EXISTS "${done_location}") + # while waiting for lock other instance can do all the job + hunter_gate_status_debug("File '${done_location}' found, skip install") + return() + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(MAKE_DIRECTORY "${build_dir}") # check directory permissions + + # Disabling languages speeds up a little bit, reduces noise in the output + # and avoids path too long windows error + file( + WRITE + "${cmakelists}" + "cmake_minimum_required(VERSION 3.2)\n" + "project(HunterDownload LANGUAGES NONE)\n" + "include(ExternalProject)\n" + "ExternalProject_Add(\n" + " Hunter\n" + " URL\n" + " \"${HUNTER_GATE_URL}\"\n" + " URL_HASH\n" + " SHA1=${HUNTER_GATE_SHA1}\n" + " DOWNLOAD_DIR\n" + " \"${dir}\"\n" + " TLS_VERIFY\n" + " ${HUNTER_TLS_VERIFY}\n" + " SOURCE_DIR\n" + " \"${dir}/Unpacked\"\n" + " CONFIGURE_COMMAND\n" + " \"\"\n" + " BUILD_COMMAND\n" + " \"\"\n" + " INSTALL_COMMAND\n" + " \"\"\n" + ")\n" + ) + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + else() + set(logging_params OUTPUT_QUIET) + endif() + + hunter_gate_status_debug("Run generate") + + # Need to add toolchain file too. + # Otherwise on Visual Studio + MDD this will fail with error: + # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" + if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") + get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make) + if(no_make) + set(make_arg "") + else() + # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM + set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + + execute_process( + COMMAND + "${CMAKE_COMMAND}" + "-H${dir}" + "-B${build_dir}" + "-G${CMAKE_GENERATOR}" + "${toolchain_arg}" + ${make_arg} + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error( + "Configure project failed." + "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}" + "In directory ${dir}" + ) + endif() + + hunter_gate_status_print( + "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" + " ${HUNTER_GATE_URL}" + " -> ${dir}" + ) + execute_process( + COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Build project failed") + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") + file(WRITE "${done_location}" "DONE") + + hunter_gate_status_debug("Finished") +endfunction() + +# Must be a macro so master file 'cmake/Hunter' can +# apply all variables easily just by 'include' command +# (otherwise PARENT_SCOPE magic needed) +macro(HunterGate) + if(HUNTER_GATE_DONE) + # variable HUNTER_GATE_DONE set explicitly for external project + # (see `hunter_download`) + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() + + # First HunterGate command will init Hunter, others will be ignored + get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) + + if(NOT HUNTER_ENABLED) + # Empty function to avoid error "unknown function" + function(hunter_add_package) + endfunction() + + set( + _hunter_gate_disabled_mode_dir + "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode" + ) + if(EXISTS "${_hunter_gate_disabled_mode_dir}") + hunter_gate_status_debug( + "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}" + ) + list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}") + endif() + elseif(_hunter_gate_done) + hunter_gate_status_debug("Secondary HunterGate (use old settings)") + hunter_gate_self( + "${HUNTER_CACHED_ROOT}" + "${HUNTER_VERSION}" + "${HUNTER_SHA1}" + _hunter_self + ) + include("${_hunter_self}/cmake/Hunter") + else() + set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}") + + string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) + if(_have_project_name) + hunter_gate_fatal_error( + "Please set HunterGate *before* 'project' command. " + "Detected project: ${PROJECT_NAME}" + ERROR_PAGE "error.huntergate.before.project" + ) + endif() + + cmake_parse_arguments( + HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} + ) + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) + string( + COMPARE + NOTEQUAL + "${HUNTER_GATE_UNPARSED_ARGUMENTS}" + "" + _have_unparsed + ) + string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) + string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) + + if(_have_unparsed) + hunter_gate_user_error( + "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" + ) + endif() + if(_empty_sha1) + hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") + endif() + if(_empty_url) + hunter_gate_user_error("URL suboption of HunterGate is mandatory") + endif() + if(_have_global) + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") + endif() + endif() + if(HUNTER_GATE_LOCAL) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") + endif() + endif() + if(_have_filepath) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") + endif() + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") + endif() + endif() + + hunter_gate_detect_root() # set HUNTER_GATE_ROOT + + # Beautify path, fix probable problems with windows path slashes + get_filename_component( + HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE + ) + hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") + if(NOT HUNTER_ALLOW_SPACES_IN_PATH) + string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) + if(NOT _contain_spaces EQUAL -1) + hunter_gate_fatal_error( + "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." + "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" + "(Use at your own risk!)" + ERROR_PAGE "error.spaces.in.hunter.root" + ) + endif() + endif() + + string( + REGEX + MATCH + "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" + HUNTER_GATE_VERSION + "${HUNTER_GATE_URL}" + ) + string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) + if(_is_empty) + set(HUNTER_GATE_VERSION "unknown") + endif() + + hunter_gate_self( + "${HUNTER_GATE_ROOT}" + "${HUNTER_GATE_VERSION}" + "${HUNTER_GATE_SHA1}" + _hunter_self + ) + + set(_master_location "${_hunter_self}/cmake/Hunter") + if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter") + # Hunter downloaded manually (e.g. by 'git clone') + set(_unused "xxxxxxxxxx") + set(HUNTER_GATE_SHA1 "${_unused}") + set(HUNTER_GATE_VERSION "${_unused}") + else() + get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) + set(_done_location "${_archive_id_location}/DONE") + set(_sha1_location "${_archive_id_location}/SHA1") + + # Check Hunter already downloaded by HunterGate + if(NOT EXISTS "${_done_location}") + hunter_gate_download("${_archive_id_location}") + endif() + + if(NOT EXISTS "${_done_location}") + hunter_gate_internal_error("hunter_gate_download failed") + endif() + + if(NOT EXISTS "${_sha1_location}") + hunter_gate_internal_error("${_sha1_location} not found") + endif() + file(READ "${_sha1_location}" _sha1_value) + string(TOLOWER "${_sha1_value}" _sha1_value_lower) + string(TOLOWER "${HUNTER_GATE_SHA1}" _HUNTER_GATE_SHA1_lower) + string(COMPARE EQUAL "${_sha1_value_lower}" "${_HUNTER_GATE_SHA1_lower}" _is_equal) + if(NOT _is_equal) + hunter_gate_internal_error( + "Short SHA1 collision:" + " ${_sha1_value} (from ${_sha1_location})" + " ${HUNTER_GATE_SHA1} (HunterGate)" + ) + endif() + if(NOT EXISTS "${_master_location}") + hunter_gate_user_error( + "Master file not found:" + " ${_master_location}" + "try to update Hunter/HunterGate" + ) + endif() + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/CMakeModules/nel.cmake b/CMakeModules/nel.cmake index ae2855b15..9e6aff63a 100644 --- a/CMakeModules/nel.cmake +++ b/CMakeModules/nel.cmake @@ -121,6 +121,22 @@ MACRO(NL_ADD_RUNTIME_FLAGS name) ENDMACRO(NL_ADD_RUNTIME_FLAGS) MACRO(NL_ADD_STATIC_VID_DRIVERS name) +IF(HUNTER_ENABLED) + IF(WIN32) + SET(drv_suffix "_win") + ELSE() + SET(drv_suffix "") + ENDIF() + IF(WIN32 AND WITH_DRIVER_DIRECT3D) + TARGET_LINK_LIBRARIES(${name} nel_drv_direct3d${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_OPENGL) + TARGET_LINK_LIBRARIES(${name} nel_drv_opengl${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_OPENGLES) + TARGET_LINK_LIBRARIES(${name} nel_drv_opengles${drv_suffix}) + ENDIF() +ELSE() IF(WITH_STATIC_DRIVERS) IF(WIN32) IF(WITH_DRIVER_DIRECT3D) @@ -144,9 +160,29 @@ MACRO(NL_ADD_STATIC_VID_DRIVERS name) ENDIF() ENDIF() ENDIF() +ENDIF()#hunter ENDMACRO(NL_ADD_STATIC_VID_DRIVERS) MACRO(NL_ADD_STATIC_SND_DRIVERS name) +IF(HUNTER_ENABLED) + IF(WIN32) + SET(drv_suffix "_win") + ELSE() + SET(drv_suffix "") + ENDIF() + IF(WIN32 AND WITH_DRIVER_DSOUND) + TARGET_LINK_LIBRARIES(${name} nel_drv_dsound${drv_suffix}) + ENDIF() + IF(WIN32 AND WITH_DRIVER_XAUDIO2) + TARGET_LINK_LIBRARIES(${name} nel_drv_xaudio2${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_FMOD) + TARGET_LINK_LIBRARIES(${name} nel_drv_fmod${drv_suffix}) + ENDIF() + IF(WITH_DRIVER_OPENAL) + TARGET_LINK_LIBRARIES(${name} nel_drv_openal${drv_suffix}) + ENDIF() +ELSE() IF(WITH_STATIC_DRIVERS) IF(WIN32) IF(WITH_DRIVER_DSOUND) @@ -175,6 +211,7 @@ MACRO(NL_ADD_STATIC_SND_DRIVERS name) ENDIF() ENDIF() +ENDIF() #hunter ENDMACRO(NL_ADD_STATIC_SND_DRIVERS) ### @@ -1195,7 +1232,11 @@ MACRO(SETUP_EXTERNAL) ENDIF() IF(WIN32) - FIND_PACKAGE(External REQUIRED) + IF (HUNTER_ENABLED) + FIND_PACKAGE(External QUIET) + ELSE() + FIND_PACKAGE(External REQUIRED) + ENDIF() # If using custom boost, we need to define the right variables used by official boost CMake module IF(DEFINED BOOST_DIR) diff --git a/nel/CMakeLists.txt b/nel/CMakeLists.txt index b102310ab..e080c640c 100644 --- a/nel/CMakeLists.txt +++ b/nel/CMakeLists.txt @@ -10,14 +10,20 @@ IF(WIN32) ENDIF() IF(WITH_3D) - FIND_PACKAGE(FreeType) + IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(freetype) + FIND_PACKAGE(freetype CONFIG REQUIRED) + SET(FREETYPE_LIBRARIES freetype::freetype) + ELSE() + FIND_PACKAGE(FreeType) + ENDIF() #hunter IF(WITH_NEL_CEGUI) FIND_PACKAGE(CEGUI) ENDIF() ENDIF() -IF(WITH_SOUND) +IF(WITH_SOUND AND NOT HUNTER_ENABLED) FIND_PACKAGE(Ogg) FIND_PACKAGE(Vorbis) IF(WITH_FFMPEG) diff --git a/nel/samples/3d/font/CMakeLists.txt b/nel/samples/3d/font/CMakeLists.txt index a944ef643..fa1ee8b4e 100644 --- a/nel/samples/3d/font/CMakeLists.txt +++ b/nel/samples/3d/font/CMakeLists.txt @@ -4,6 +4,7 @@ ADD_EXECUTABLE(nl_sample_font WIN32 ${SRC}) ADD_DEFINITIONS(-DFONT_DIR="\\"${NL_SHARE_ABSOLUTE_PREFIX}/nl_sample_font/\\"") +# TODO: hunter TARGET_LINK_LIBRARIES(nl_sample_font PRIVATE nelmisc nel3d) TARGET_LINK_LIBRARIES(nl_sample_font nelmisc nel3d) NL_DEFAULT_PROPS(nl_sample_font "NeL, Samples, 3D: Font") NL_ADD_RUNTIME_FLAGS(nl_sample_font) diff --git a/nel/src/misc/CMakeLists.txt b/nel/src/misc/CMakeLists.txt index e7b422592..da92f2593 100644 --- a/nel/src/misc/CMakeLists.txt +++ b/nel/src/misc/CMakeLists.txt @@ -183,6 +183,21 @@ IF(WITH_GTK) ENDIF() ENDIF() +IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(Jpeg) + FIND_PACKAGE(JPEG CONFIG REQUIRED) + SET(JPEG_LIBRARY JPEG::jpeg) + + HUNTER_ADD_PACKAGE(giflib) + FIND_PACKAGE(giflib CONFIG REQUIRED) + SET(GIF_LIBRARY giflib::giflib) + + HUNTER_ADD_PACKAGE(PNG) + FIND_PACKAGE(PNG CONFIG REQUIRED) + SET(PNG_LIBRARY PNG::png) + SET(PNG_LIBRARIES PNG::png) +ENDIF() + IF(JPEG_FOUND) INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR}) ADD_DEFINITIONS(-DUSE_JPEG) @@ -202,6 +217,7 @@ ELSE() TARGET_LINK_LIBRARIES(nelmisc ${PNG_LIBRARY}) ENDIF() +#TODO: needed for hunter aswell? IF(UNIX) TARGET_LINK_LIBRARIES(nelmisc -lc -ldl) IF(APPLE) diff --git a/nel/src/sound/CMakeLists.txt b/nel/src/sound/CMakeLists.txt index d2c47387e..0a6f78646 100644 --- a/nel/src/sound/CMakeLists.txt +++ b/nel/src/sound/CMakeLists.txt @@ -90,6 +90,23 @@ SOURCE_GROUP("user_classes" FILES ${USER_CLASSES}) NL_TARGET_LIB(nelsound ${HEADERS} ${SRC}) +IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(libogg) + FIND_PACKAGE(libogg CONFIG REQUIRED) + SET(OGG_LIBRARY libogg::ogg) + SET(OGG_LIBRARIES libogg::ogg) + + HUNTER_ADD_PACKAGE(vorbis) + FIND_PACKAGE(vorbis CONFIG REQUIRED) + SET(VORBIS_LIBRARY vorbis::vorbis) + SET(VORBISFILE_LIBRARY vorbis::vorbisfile) + + IF(WITH_FFMPEG) + HUNTER_ADD_PACKAGE(ffmpeg) + FIND_PACKAGE(ffmpeg CONFIG REQUIRED) + SET(FFMPEG_LIBRARIES ffmpeg::avcodec ffmpeg::avformat ffmpeg::avutil ffmpeg::swresample) + ENDIF() +ENDIF() INCLUDE_DIRECTORIES(${VORBIS_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${OGG_INCLUDE_DIR}) diff --git a/nel/src/sound/driver/openal/CMakeLists.txt b/nel/src/sound/driver/openal/CMakeLists.txt index 22b3f4348..9437dee82 100644 --- a/nel/src/sound/driver/openal/CMakeLists.txt +++ b/nel/src/sound/driver/openal/CMakeLists.txt @@ -26,9 +26,16 @@ SOURCE_GROUP(util FILES NL_TARGET_DRIVER(${NLDRV_AL_LIB} ${SRC}) -INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR}) +IF(HUNTER_ENABLED) + HUNTER_ADD_PACKAGE(OpenAL) + FIND_PACKAGE(OpenAL CONFIG REQUIRED) + SET(OPENAL_LIBRARY OpenAL::OpenAL) + ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC) +ELSE() + INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR}) +ENDIF()# hunter -TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} ${OPENAL_LIBRARY} nelmisc nelsnd_lowlevel) +TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} nelmisc nelsnd_lowlevel ${OPENAL_LIBRARY}) NL_DEFAULT_PROPS(${NLDRV_AL_LIB} "NeL, Driver, Sound: OpenAL") NL_ADD_RUNTIME_FLAGS(${NLDRV_AL_LIB}) NL_ADD_LIB_SUFFIX(${NLDRV_AL_LIB}) From 19c5b582bc1d4b3d7035218937dff160aaa37d23 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Wed, 6 Oct 2021 00:07:54 +0300 Subject: [PATCH 17/39] Fix linking with static OpenAL under windows --- nel/src/sound/driver/openal/ext_al.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nel/src/sound/driver/openal/ext_al.cpp b/nel/src/sound/driver/openal/ext_al.cpp index e6a090e80..6edeb9552 100644 --- a/nel/src/sound/driver/openal/ext_al.cpp +++ b/nel/src/sound/driver/openal/ext_al.cpp @@ -66,6 +66,7 @@ void alExtInitDevice(ALCdevice *device) } } +#if !defined(AL_LIBTYPE_STATIC) // Windows and Mac OS always link to shared OpenAL library #if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC) // EFX @@ -114,6 +115,7 @@ void alExtInitDevice(ALCdevice *device) } } #endif +#endif } #if EAX_AVAILABLE @@ -137,6 +139,7 @@ EAXGetBufferMode eaxGetBufferMode = NULL; // ALC_EXT_EFX bool AlExtEfx = false; // effect objects +#if !defined(AL_LIBTYPE_STATIC) #if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC) LPALGENEFXOBJECTS alGenEffects = NULL; LPALDELETEEFXOBJECTS alDeleteEffects = NULL; @@ -174,6 +177,7 @@ LPALGETEFXOBJECTIV alGetAuxiliaryEffectSlotiv = NULL; LPALGETEFXOBJECTF alGetAuxiliaryEffectSlotf = NULL; LPALGETEFXOBJECTFV alGetAuxiliaryEffectSlotfv = NULL; #endif +#endif } /* end of file */ From 8aa1aed3bdc9ef3d7102c877f0214c58b4754644 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Tue, 23 Nov 2021 20:06:16 +0200 Subject: [PATCH 18/39] Use Windows SDK if DirectX SDK not installed --- CMakeModules/FindWindowsSDK.cmake | 11 +++++++++++ CMakeModules/nel.cmake | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CMakeModules/FindWindowsSDK.cmake b/CMakeModules/FindWindowsSDK.cmake index 1b02dffb3..20787aa79 100644 --- a/CMakeModules/FindWindowsSDK.cmake +++ b/CMakeModules/FindWindowsSDK.cmake @@ -501,6 +501,17 @@ IF(WINSDK_INCLUDE_DIR) IF(WINSDK_VERSION STREQUAL "7.1" AND (MSVC11 OR MSVC12 OR MSVC14)) ADD_DEFINITIONS(-D_USING_V110_SDK71_) ENDIF() + + IF(NOT DXSDK_DIR) + MESSAGE("Using DirectX from Windows SDK (${WINSDK_LIBRARY_DIRS})") + SET(DXSDK_DIR ${WINSDK_DIR}) + FIND_LIBRARY(DXSDK_GUID_LIBRARY dxguid ${WINSDK_LIBRARY_DIRS}) + FIND_LIBRARY(DXSDK_DINPUT_LIBRARY dinput8 ${WINSDK_LIBRARY_DIRS}) + FIND_LIBRARY(DXSDK_DSOUND_LIBRARY dsound ${WINSDK_LIBRARY_DIRS}) + FIND_LIBRARY(DXSDK_XAUDIO_LIBRARY xaudio2 ${WINSDK_LIBRARY_DIRS}) + # TODO: FIND_LIBRARY(DXSDK_D3DX9_LIBRARY d3dx9) + FIND_LIBRARY(DXSDK_D3D9_LIBRARY d3d9 ${WINSDK_LIBRARY_DIRS}) + ENDIF() ELSE() IF(NOT WindowsSDK_FIND_QUIETLY) MESSAGE(STATUS "Warning: Unable to find Windows SDK!") diff --git a/CMakeModules/nel.cmake b/CMakeModules/nel.cmake index 9e6aff63a..3f6a6436c 100644 --- a/CMakeModules/nel.cmake +++ b/CMakeModules/nel.cmake @@ -1279,7 +1279,7 @@ MACRO(SETUP_EXTERNAL) IF(WIN32) # Must include DXSDK before WINSDK - FIND_PACKAGE(DirectXSDK REQUIRED) + FIND_PACKAGE(DirectXSDK) # IF(DXSDK_INCLUDE_DIR) # INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR}) # ENDIF() @@ -1288,5 +1288,8 @@ MACRO(SETUP_EXTERNAL) IF(MSVC) FIND_PACKAGE(MSVC REQUIRED) FIND_PACKAGE(WindowsSDK REQUIRED) + IF(NOT DXSDK_DIR) + MESSAGE(FATAL_ERROR "DirectX SDK or DirectX files from Windows SDK not found.") + ENDIF() ENDIF() ENDMACRO() From c31747a939b35fec66799fabd2103886c4263e1d Mon Sep 17 00:00:00 2001 From: Nimetu Date: Tue, 23 Nov 2021 20:33:50 +0200 Subject: [PATCH 19/39] Add windows-2019 to azure pipeline --- azure-pipelines.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1885a5dfa..fcd056b32 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -77,3 +77,24 @@ jobs: cd build make -j`nproc` displayName: 'Make' + - job: windows2019 + timeoutInMinutes: 120 + pool: + vmImage: 'windows-2019' + steps: + - checkout: self + fetchDepth: 1 + - task: Cache@2 + inputs: + key: 'hunter-win2019-x64-rel' + path: "c:/.hunter/_Base/Cache" + - task: CMake@1 + inputs: + workingDirectory: build.release + cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF ..' + - task: MSBuild@1 + inputs: + solution: build.release/ALL_BUILD.vcxproj + maximumCpuCount: true + configuration: release + platform: 'x64' From 63b4ea547a19985ea763bd72010c94eb4c7a20db Mon Sep 17 00:00:00 2001 From: kaetemi Date: Thu, 25 Nov 2021 00:41:39 +0800 Subject: [PATCH 20/39] Download and extract DX SDK --- azure-pipelines.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index fcd056b32..205270b5b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -88,10 +88,16 @@ jobs: inputs: key: 'hunter-win2019-x64-rel' path: "c:/.hunter/_Base/Cache" + - task: CmdLine@2 + inputs: + script: | + wget https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe + 7z x DXSDK_Jun10.exe -oC:\ -r -y + del DXSDK_Jun10.exe - task: CMake@1 inputs: workingDirectory: build.release - cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF ..' + cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF -DDXSDK_DIR=C:/DXSDK ..' - task: MSBuild@1 inputs: solution: build.release/ALL_BUILD.vcxproj From ec41ba753f70f525e26ff35ea3ddc4277a596936 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Thu, 25 Nov 2021 00:48:18 +0800 Subject: [PATCH 21/39] Download with aria2 instead and enable the DX drivers --- azure-pipelines.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 205270b5b..d0b938fe3 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -91,13 +91,13 @@ jobs: - task: CmdLine@2 inputs: script: | - wget https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe + aria2c https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe 7z x DXSDK_Jun10.exe -oC:\ -r -y del DXSDK_Jun10.exe - task: CMake@1 inputs: workingDirectory: build.release - cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF -DDXSDK_DIR=C:/DXSDK ..' + cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=ON -DWITH_DRIVER_XAUDIO2=ON -DDXSDK_DIR=C:/DXSDK ..' - task: MSBuild@1 inputs: solution: build.release/ALL_BUILD.vcxproj From 37abc25dcb8532ed48ea3a381855ff4b9fc87533 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Wed, 1 Dec 2021 20:09:24 +0200 Subject: [PATCH 22/39] Add ubuntu-18.04 hunter image to azure pipeline --- azure-pipelines.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d0b938fe3..f4450accb 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -104,3 +104,34 @@ jobs: maximumCpuCount: true configuration: release platform: 'x64' + - job: ubuntu18hunter + timeoutInMinutes: 120 + pool: + vmImage: ubuntu-18.04 + steps: + - checkout: self + fetchDepth: 0 + - script: | + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libasound2-dev libgl1-mesa-dev libjack-dev libpulse-dev libxrandr-dev libxrender-dev libxxf86vm-dev + displayName: 'Dependencies' + - task: Cache@2 + inputs: + key: 'hunter317-ubuntu18-rel"' + path: "$(Pipeline.Workspace)/.hunter/_Base/Cache" + - script: | + mkdir build.release + cmake --version + cd build.release + unset SYSTEM + export MAKEFLAGS=-j`nproc` + cmake -DCMAKE_BUILD_TYPE=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON .. + displayName: 'CMake, release' + - script: | + cd build.release + make -j`nproc` + displayName: 'Make, release' + #- task: PublishPipelineArtifact@1 + # inputs: + # targetPath: build.release/bin + # artifactName: RyzomUbuntu18Release From 005e714f7d302a3accfad319e7ed67d5f59d0095 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Thu, 2 Dec 2021 21:02:17 +0200 Subject: [PATCH 23/39] Add macOS to azure pipeline --- azure-pipelines.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f4450accb..9c735531b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -135,3 +135,30 @@ jobs: # inputs: # targetPath: build.release/bin # artifactName: RyzomUbuntu18Release + - job: macOS11 + timeoutInMinutes: 120 + pool: + vmImage: 'macOS-11' + steps: + - checkout: self + fetchDepth: 0 + - task: Cache@2 + inputs: + key: 'hunter317-macOS11-rel"' + path: "$(Pipeline.Workspace)/.hunter/_Base/Cache" + - task: CMake@1 + inputs: + workingDirectory: build.release + cmakeArgs: '-GXcode -DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_STATUS_DEBUG=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DWITH_LIBXML2_ICONV=OFF -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF ..' + - task: Xcode@5 + inputs: + actions: 'build' + configuration: Release + sdk: macosx12.0 + xcWorkspacePath: 'build.release/RyzomCore.xcodeproj' + scheme: 'ALL_BUILD' + packageApp: false + #- task: PublishPipelineArtifact@1 + # inputs: + # targetPath: build.release/bin/ + # artifactName: RyzomClientMacOS11Release From 7344c98e6eb8466ac6b7e3fe86f7403d0d8ac935 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Thu, 2 Dec 2021 21:02:17 +0200 Subject: [PATCH 24/39] Add macOS to azure pipeline --- azure-pipelines.yml | 27 +++++++++++++++++++ nel/include/nel/misc/cdb_leaf.h | 4 +++ .../driver/opengl/mac/cocoa_event_emitter.cpp | 8 +++--- .../driver/opengl/mac/cocoa_event_emitter.h | 5 ++-- nel/src/misc/cdb_leaf.cpp | 19 +++++++++++++ 5 files changed, 57 insertions(+), 6 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index f4450accb..9c735531b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -135,3 +135,30 @@ jobs: # inputs: # targetPath: build.release/bin # artifactName: RyzomUbuntu18Release + - job: macOS11 + timeoutInMinutes: 120 + pool: + vmImage: 'macOS-11' + steps: + - checkout: self + fetchDepth: 0 + - task: Cache@2 + inputs: + key: 'hunter317-macOS11-rel"' + path: "$(Pipeline.Workspace)/.hunter/_Base/Cache" + - task: CMake@1 + inputs: + workingDirectory: build.release + cmakeArgs: '-GXcode -DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_STATUS_DEBUG=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DWITH_LIBXML2_ICONV=OFF -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF ..' + - task: Xcode@5 + inputs: + actions: 'build' + configuration: Release + sdk: macosx12.0 + xcWorkspacePath: 'build.release/RyzomCore.xcodeproj' + scheme: 'ALL_BUILD' + packageApp: false + #- task: PublishPipelineArtifact@1 + # inputs: + # targetPath: build.release/bin/ + # artifactName: RyzomClientMacOS11Release diff --git a/nel/include/nel/misc/cdb_leaf.h b/nel/include/nel/misc/cdb_leaf.h index dc734c434..3544fee8a 100644 --- a/nel/include/nel/misc/cdb_leaf.h +++ b/nel/include/nel/misc/cdb_leaf.h @@ -96,6 +96,7 @@ public: _Property = 0; _oldProperty = 0; _Type = UNKNOWN; + m_Nullable = false; _Changed = false; _LastChangeGC = 0; } @@ -235,6 +236,9 @@ private: /// property type EPropType _Type; + /// nullable + bool m_Nullable; + /// true if this value has changed bool _Changed; diff --git a/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp b/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp index 834331a3c..4d0b833b3 100644 --- a/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp +++ b/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp @@ -152,7 +152,7 @@ static NLMISC::TKey virtualKeycodeToNelKey(unsigned short keycode) return NLMISC::KeyNOKEY; } -bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text) +bool CCocoaEventEmitter::pasteTextFromClipboard(std::string &text) { NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; @@ -163,17 +163,17 @@ bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text) { NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; NSString *nstext = [objectsToPaste objectAtIndex:0]; - text.fromUtf8([nstext UTF8String]); + text = [nstext UTF8String]; return true; } return false; } -bool CCocoaEventEmitter::copyTextToClipboard(const ucstring &text) +bool CCocoaEventEmitter::copyTextToClipboard(const std::string &text) { NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; [pasteboard clearContents]; - NSArray *copiedObjects = [NSArray arrayWithObject:[NSString stringWithUTF8String:text.toUtf8().c_str()]]; + NSArray *copiedObjects = [NSArray arrayWithObject:[NSString stringWithUTF8String:text.c_str()]]; [pasteboard writeObjects:copiedObjects]; return true; } diff --git a/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.h b/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.h index 5d3728f3c..e370e0db5 100644 --- a/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.h +++ b/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.h @@ -21,6 +21,7 @@ #ifndef NL_COCOA_EVENT_EMITTER_H #define NL_COCOA_EVENT_EMITTER_H +#include #include "nel/misc/event_emitter.h" #include "nel/misc/event_server.h" #include "nel/misc/events.h" @@ -53,8 +54,8 @@ public: virtual void submitEvents(CEventServer& server, bool allWindows); bool handleQuitRequest(); - virtual bool copyTextToClipboard(const ucstring &text); - virtual bool pasteTextFromClipboard(ucstring &text); + virtual bool copyTextToClipboard(const std::string &text); + virtual bool pasteTextFromClipboard(std::string &text); }; } diff --git a/nel/src/misc/cdb_leaf.cpp b/nel/src/misc/cdb_leaf.cpp index f5bc50ac3..51a634c4f 100644 --- a/nel/src/misc/cdb_leaf.cpp +++ b/nel/src/misc/cdb_leaf.cpp @@ -51,6 +51,18 @@ namespace NLMISC{ //----------------------------------------------- void CCDBNodeLeaf::init( xmlNodePtr node, IProgressCallback &/* progressCallBack */, bool /* mapBanks */, CCDBBankHandler * /* bankHandler */ ) { + // Read nullable + CXMLAutoPtr nullable((const char*)xmlGetProp (node, (xmlChar*)"nullable")); + if ((const char *) nullable != NULL) + { + m_Nullable = (nullable.getDatas()[0] == '1'); + } + else + { + m_Nullable = false; + } + + // Read type CXMLAutoPtr type((const char*)xmlGetProp (node, (xmlChar*)"type")); nlassert((const char *) type != NULL); @@ -141,6 +153,13 @@ void CCDBNodeLeaf::readDelta(TGameCycle gc, CBitMemStream & f ) { // Read the Property Value according to the Property Type. uint64 recvd = 0; + + uint64 isNull = 0; + if (m_Nullable) + { + f.serial(isNull, 1); + } + uint bits; if (_Type == TEXT) bits = 32; From 7c82f26bacdadf3a583f679c4a85e78b43226d5c Mon Sep 17 00:00:00 2001 From: Nimetu Date: Wed, 22 Dec 2021 12:54:53 +0200 Subject: [PATCH 26/39] Fix CViewText always returning localization key --- nel/include/nel/gui/view_text.h | 5 +++-- nel/src/gui/view_text.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/nel/include/nel/gui/view_text.h b/nel/include/nel/gui/view_text.h index cc92cf47d..eed7a7a87 100644 --- a/nel/include/nel/gui/view_text.h +++ b/nel/include/nel/gui/view_text.h @@ -119,8 +119,8 @@ namespace NLGUI void enableStringSelection(uint start, uint end); void disableStringSelection(); - /// Get - std::string getText() const { return _HardText.empty() ? _Text : _HardText; } + /// Get displayed text + std::string getText() const { return _Text; } #ifdef RYZOM_LUA_UCSTRING ucstring getTextAsUtf16() const; // Compatibility ucstring getHardTextAsUtf16() const; // Compatibility @@ -188,6 +188,7 @@ namespace NLGUI /// From a line number, get the character at which it ends (not including any '\n' ), or -1 if invalid void getLineEndIndex(uint line, sint &index, bool &endOfPreviousLine) const; + /// If localized, return localization key (ie "uiLanguage"), else return displayed text. std::string getHardText() const { return _HardText.empty() ? _Text : _HardText; } void setHardText (const std::string &ht); //< Localizes strings starting with "ui" #ifdef RYZOM_LUA_UCSTRING diff --git a/nel/src/gui/view_text.cpp b/nel/src/gui/view_text.cpp index 89f31d40d..b0382eb52 100644 --- a/nel/src/gui/view_text.cpp +++ b/nel/src/gui/view_text.cpp @@ -1468,7 +1468,7 @@ namespace NLGUI } } - nlassert(_Text.empty() || ((_Localized && (NLMISC::startsWith(getText(), "ui"))) == (_HardText.empty() == _Text.empty()))); + nlassert(_Text.empty() || ((_Localized && (NLMISC::startsWith(getHardText(), "ui"))) == (_HardText.empty() == _Text.empty()))); } // *************************************************************************** From 5df8ec43a04d377bfaf2b745d32b4c49e6574118 Mon Sep 17 00:00:00 2001 From: Ben Saine Date: Wed, 22 Dec 2021 17:10:55 +0000 Subject: [PATCH 27/39] Resolve "Encoding issues in client beta (after core4 merge)" --- nel/include/nel/gui/view_text.h | 4 +++- nel/src/gui/view_text.cpp | 38 ++++++++------------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/nel/include/nel/gui/view_text.h b/nel/include/nel/gui/view_text.h index cc92cf47d..e7405a2dd 100644 --- a/nel/include/nel/gui/view_text.h +++ b/nel/include/nel/gui/view_text.h @@ -282,8 +282,10 @@ namespace NLGUI bool _FontSizeCoef; bool _Embolden; bool _Oblique; - // width of the font in pixel. Just a Hint for tabing format (computed with '_') + // width of the font in pixel. float _FontWidth; + // width of tabs + float _TabWidth; // strings to use when computing font size std::string _FontSizingChars; std::string _FontSizingFallback; diff --git a/nel/src/gui/view_text.cpp b/nel/src/gui/view_text.cpp index 89f31d40d..814f88469 100644 --- a/nel/src/gui/view_text.cpp +++ b/nel/src/gui/view_text.cpp @@ -95,6 +95,7 @@ namespace NLGUI _FontWidth= 0; _FontHeight = 0; _FontLegHeight = 0; + _TabWidth= 0; _TextSelection= false; _TextSelectionStart= 0; @@ -1284,7 +1285,7 @@ namespace NLGUI px += firstSpace; // skip tabulation before current word if(currWord.Format.TabX) - px= max(px, (float)(_XReal * _Scale + currWord.Format.TabX*_FontWidth)); + px= max(px, (float)(_XReal * _Scale + currWord.Format.TabX*_TabWidth)); // draw. We take floorf px to avoid filtering of letters that are not located on a pixel boundary float fx = px / _Scale; @@ -1767,7 +1768,7 @@ namespace NLGUI getFormatTagChange(i, formatTagIndex, wordFormat); // Ensure the line witdh count the tab - rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_FontWidth); + rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_TabWidth); } NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); @@ -1951,7 +1952,7 @@ namespace NLGUI // compute size of spaces/Tab + word newLineWidth = lineWidth + numSpaces * _SpaceWidth; - newLineWidth = max(newLineWidth, (float)wordFormat.TabX*_FontWidth); + newLineWidth = max(newLineWidth, (float)wordFormat.TabX*_TabWidth); newLineWidth+= si.StringWidth; } // @@ -3113,8 +3114,6 @@ namespace NLGUI TextContext->setEmbolden (_Embolden); TextContext->setOblique (_Oblique); -#if 1 - UTextContext::CStringInfo si = TextContext->getStringInfo("XO"); float xoHeight = si.StringHeight; @@ -3145,34 +3144,14 @@ namespace NLGUI si = TextContext->getStringInfo(" "); _SpaceWidth = si.StringWidth; - // Font Width (used for ) + // Font Width si = TextContext->getStringInfo("O"); _FontWidth = si.StringWidth; -#else - - // Letter size - UTextContext::CStringInfo si = TextContext->getStringInfo(_FontSizingChars); - - // font generator changes unknown glyphs to dot '.'. use fallback if it looks odd - if (_FontSize > (si.StringHeight + si.StringLine)) - { - si = TextContext->getStringInfo(_FontSizingFallback); - } - - // add a padding of 1 pixel else the top will be truncated - _FontHeight = si.StringHeight + 1; - _FontLegHeight = si.StringLine; - - // Space width - si = TextContext->getStringInfo(" "); - _SpaceWidth = si.StringWidth; - - // Font Width (used for ) + // Tab Width (used for {Txx}) + // if not set to "_", breaks item help window si = TextContext->getStringInfo("_"); - _FontWidth = si.StringWidth; - -#endif + _TabWidth = si.StringWidth; } @@ -3641,6 +3620,7 @@ namespace NLGUI f.serial(_Localized); SERIAL_SINT(_FontSize); SERIAL_UINT(_FontWidth); + SERIAL_UINT(_TabWidth); SERIAL_UINT(_FontHeight); SERIAL_UINT(_FontLegHeight); f.serial(_SpaceWidth); From 82b724fe88569cf2b61d0b49cb6acdb311ea2656 Mon Sep 17 00:00:00 2001 From: Ben Saine Date: Wed, 22 Dec 2021 17:10:55 +0000 Subject: [PATCH 28/39] Resolve "Encoding issues in client beta (after core4 merge)" --- nel/include/nel/gui/view_text.h | 4 +++- nel/src/gui/view_text.cpp | 38 ++++++++------------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/nel/include/nel/gui/view_text.h b/nel/include/nel/gui/view_text.h index eed7a7a87..b4796bf4f 100644 --- a/nel/include/nel/gui/view_text.h +++ b/nel/include/nel/gui/view_text.h @@ -283,8 +283,10 @@ namespace NLGUI bool _FontSizeCoef; bool _Embolden; bool _Oblique; - // width of the font in pixel. Just a Hint for tabing format (computed with '_') + // width of the font in pixel. float _FontWidth; + // width of tabs + float _TabWidth; // strings to use when computing font size std::string _FontSizingChars; std::string _FontSizingFallback; diff --git a/nel/src/gui/view_text.cpp b/nel/src/gui/view_text.cpp index b0382eb52..44c9c3c38 100644 --- a/nel/src/gui/view_text.cpp +++ b/nel/src/gui/view_text.cpp @@ -95,6 +95,7 @@ namespace NLGUI _FontWidth= 0; _FontHeight = 0; _FontLegHeight = 0; + _TabWidth= 0; _TextSelection= false; _TextSelectionStart= 0; @@ -1284,7 +1285,7 @@ namespace NLGUI px += firstSpace; // skip tabulation before current word if(currWord.Format.TabX) - px= max(px, (float)(_XReal * _Scale + currWord.Format.TabX*_FontWidth)); + px= max(px, (float)(_XReal * _Scale + currWord.Format.TabX*_TabWidth)); // draw. We take floorf px to avoid filtering of letters that are not located on a pixel boundary float fx = px / _Scale; @@ -1767,7 +1768,7 @@ namespace NLGUI getFormatTagChange(i, formatTagIndex, wordFormat); // Ensure the line witdh count the tab - rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_FontWidth); + rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_TabWidth); } NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); @@ -1951,7 +1952,7 @@ namespace NLGUI // compute size of spaces/Tab + word newLineWidth = lineWidth + numSpaces * _SpaceWidth; - newLineWidth = max(newLineWidth, (float)wordFormat.TabX*_FontWidth); + newLineWidth = max(newLineWidth, (float)wordFormat.TabX*_TabWidth); newLineWidth+= si.StringWidth; } // @@ -3113,8 +3114,6 @@ namespace NLGUI TextContext->setEmbolden (_Embolden); TextContext->setOblique (_Oblique); -#if 1 - UTextContext::CStringInfo si = TextContext->getStringInfo("XO"); float xoHeight = si.StringHeight; @@ -3145,34 +3144,14 @@ namespace NLGUI si = TextContext->getStringInfo(" "); _SpaceWidth = si.StringWidth; - // Font Width (used for ) + // Font Width si = TextContext->getStringInfo("O"); _FontWidth = si.StringWidth; -#else - - // Letter size - UTextContext::CStringInfo si = TextContext->getStringInfo(_FontSizingChars); - - // font generator changes unknown glyphs to dot '.'. use fallback if it looks odd - if (_FontSize > (si.StringHeight + si.StringLine)) - { - si = TextContext->getStringInfo(_FontSizingFallback); - } - - // add a padding of 1 pixel else the top will be truncated - _FontHeight = si.StringHeight + 1; - _FontLegHeight = si.StringLine; - - // Space width - si = TextContext->getStringInfo(" "); - _SpaceWidth = si.StringWidth; - - // Font Width (used for ) + // Tab Width (used for {Txx}) + // if not set to "_", breaks item help window si = TextContext->getStringInfo("_"); - _FontWidth = si.StringWidth; - -#endif + _TabWidth = si.StringWidth; } @@ -3641,6 +3620,7 @@ namespace NLGUI f.serial(_Localized); SERIAL_SINT(_FontSize); SERIAL_UINT(_FontWidth); + SERIAL_UINT(_TabWidth); SERIAL_UINT(_FontHeight); SERIAL_UINT(_FontLegHeight); f.serial(_SpaceWidth); From c012e7ffcf98a7e5d75b01807e58b1cebdcf1615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= Date: Thu, 23 Dec 2021 09:20:17 +0000 Subject: [PATCH 29/39] Fix CViewText always returning localization key --- nel/include/nel/gui/view_text.h | 5 +++-- nel/src/gui/view_text.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/nel/include/nel/gui/view_text.h b/nel/include/nel/gui/view_text.h index cc92cf47d..eed7a7a87 100644 --- a/nel/include/nel/gui/view_text.h +++ b/nel/include/nel/gui/view_text.h @@ -119,8 +119,8 @@ namespace NLGUI void enableStringSelection(uint start, uint end); void disableStringSelection(); - /// Get - std::string getText() const { return _HardText.empty() ? _Text : _HardText; } + /// Get displayed text + std::string getText() const { return _Text; } #ifdef RYZOM_LUA_UCSTRING ucstring getTextAsUtf16() const; // Compatibility ucstring getHardTextAsUtf16() const; // Compatibility @@ -188,6 +188,7 @@ namespace NLGUI /// From a line number, get the character at which it ends (not including any '\n' ), or -1 if invalid void getLineEndIndex(uint line, sint &index, bool &endOfPreviousLine) const; + /// If localized, return localization key (ie "uiLanguage"), else return displayed text. std::string getHardText() const { return _HardText.empty() ? _Text : _HardText; } void setHardText (const std::string &ht); //< Localizes strings starting with "ui" #ifdef RYZOM_LUA_UCSTRING diff --git a/nel/src/gui/view_text.cpp b/nel/src/gui/view_text.cpp index 89f31d40d..b0382eb52 100644 --- a/nel/src/gui/view_text.cpp +++ b/nel/src/gui/view_text.cpp @@ -1468,7 +1468,7 @@ namespace NLGUI } } - nlassert(_Text.empty() || ((_Localized && (NLMISC::startsWith(getText(), "ui"))) == (_HardText.empty() == _Text.empty()))); + nlassert(_Text.empty() || ((_Localized && (NLMISC::startsWith(getHardText(), "ui"))) == (_HardText.empty() == _Text.empty()))); } // *************************************************************************** From 9cff221a1e1aa26a6d334bbdd745e4b58834af8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= Date: Fri, 24 Dec 2021 10:39:52 +0000 Subject: [PATCH 30/39] Add ScreenShotDirectory entry to client.cfg --- ryzom/client/src/client_cfg.cpp | 2 ++ ryzom/client/src/client_cfg.h | 1 + .../src/interface_v3/action_handler_misc.cpp | 19 ++++++++----------- .../src/interface_v3/action_handler_misc.h | 1 - ryzom/client/src/main_loop.cpp | 3 --- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/ryzom/client/src/client_cfg.cpp b/ryzom/client/src/client_cfg.cpp index 8a68b1140..c2ff6d927 100644 --- a/ryzom/client/src/client_cfg.cpp +++ b/ryzom/client/src/client_cfg.cpp @@ -412,6 +412,7 @@ CClientConfig::CClientConfig() CameraRecorderPrefix = "cam_rec"; CameraRecorderBlend = true; + ScreenShotDirectory = "screenshots"; ScreenShotWidth = 0; ScreenShotHeight = 0; ScreenShotFullDetail = true; @@ -1139,6 +1140,7 @@ void CClientConfig::setValues() READ_BOOL_FV(CameraRecorderBlend) // Screenshot + READ_STRING_FV(ScreenShotDirectory) READ_INT_FV(ScreenShotWidth) READ_INT_FV(ScreenShotHeight) READ_BOOL_FV(ScreenShotFullDetail) diff --git a/ryzom/client/src/client_cfg.h b/ryzom/client/src/client_cfg.h index 60be270fa..45a4cd6da 100644 --- a/ryzom/client/src/client_cfg.h +++ b/ryzom/client/src/client_cfg.h @@ -304,6 +304,7 @@ struct CClientConfig bool CameraRecorderBlend; /// Screen shot + string ScreenShotDirectory; uint ScreenShotWidth; // If 0 : normal screen shot, else custom screen shot without interface uint ScreenShotHeight; bool ScreenShotFullDetail; // If set to true, then load balancing will be disabled for the duration of the screenshot diff --git a/ryzom/client/src/interface_v3/action_handler_misc.cpp b/ryzom/client/src/interface_v3/action_handler_misc.cpp index 91e00807d..4c4b9e814 100644 --- a/ryzom/client/src/interface_v3/action_handler_misc.cpp +++ b/ryzom/client/src/interface_v3/action_handler_misc.cpp @@ -62,9 +62,6 @@ extern NLMISC::CLog g_log; //////////// //static CCDBNodeLeaf *MenuColorWidgetValue = NULL; // db entry for the color menu widget (Red) - -static const string ScreenshotsDirectory("screenshots/"); // don't forget the final / - void preRenderNewSky (); // *************************************************************************** @@ -602,11 +599,6 @@ void displayScreenShotSavedInfo(const string &filename) pIM->displaySystemInfo(msg); } -void initScreenshot() -{ - if (!CFile::isExists(ScreenshotsDirectory)) CFile::createDirectory(ScreenshotsDirectory); -} - bool screenshotZBuffer(const std::string &filename) { std::string::size_type pos = filename.find("."); @@ -672,6 +664,11 @@ bool screenshotZBuffer(const std::string &filename) static std::string findNewScreenShotFileName(std::string filename) { + // make screenshot directory if it does not exist + if (!CFile::isExists(ClientCfg.ScreenShotDirectory)) + CFile::createDirectory(ClientCfg.ScreenShotDirectory); + + filename = CPath::standardizePath(ClientCfg.ScreenShotDirectory) + filename; static char cstime[25]; time_t dtime; time(&dtime); @@ -698,7 +695,7 @@ void screenShotTGA() CBitmap btm; getBuffer (btm); - string filename = findNewScreenShotFileName(ScreenshotsDirectory+"screenshot.tga"); + string filename = findNewScreenShotFileName("screenshot.tga"); COFile fs(filename); if (!btm.writeTGA(fs, 24, false)) @@ -720,7 +717,7 @@ void screenShotPNG() CBitmap btm; getBuffer (btm); - string filename = findNewScreenShotFileName(ScreenshotsDirectory+"screenshot.png"); + string filename = findNewScreenShotFileName("screenshot.png"); COFile fs(filename); if (!btm.writePNG(fs, 24)) @@ -742,7 +739,7 @@ void screenShotJPG() CBitmap btm; getBuffer (btm); - string filename = findNewScreenShotFileName(ScreenshotsDirectory+"screenshot.jpg"); + string filename = findNewScreenShotFileName("screenshot.jpg"); COFile fs(filename); if (!btm.writeJPG(fs)) diff --git a/ryzom/client/src/interface_v3/action_handler_misc.h b/ryzom/client/src/interface_v3/action_handler_misc.h index 61fbbc552..2c5ba5ece 100644 --- a/ryzom/client/src/interface_v3/action_handler_misc.h +++ b/ryzom/client/src/interface_v3/action_handler_misc.h @@ -181,7 +181,6 @@ public: /** Capture current content of framebuffer and save the result. If a custom size is asked in ClientCfg, then the scene is rendered again * instead (possibly multiple time) */ -void initScreenshot(); void screenShotTGA(); void screenShotPNG(); void screenShotJPG(); diff --git a/ryzom/client/src/main_loop.cpp b/ryzom/client/src/main_loop.cpp index 492d54623..56452ba4a 100644 --- a/ryzom/client/src/main_loop.cpp +++ b/ryzom/client/src/main_loop.cpp @@ -1000,9 +1000,6 @@ bool mainLoop() // initialize the structure for the ping. Ping.init(); - // initialize screenshots directory - initScreenshot(); - // Call a function for a demo to init. if (ClientCfg.Local) From e185ddc19f7fe2212323e0e05e3fa21657f7a616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= Date: Wed, 29 Dec 2021 11:49:38 +0000 Subject: [PATCH 31/39] Fix flying text for area magic/combat actions --- ryzom/client/src/character_cl.cpp | 38 ++++++++++---------- ryzom/client/src/user_entity.cpp | 4 +-- ryzom/common/src/game_share/multi_target.cpp | 37 +++++++++---------- ryzom/common/src/game_share/multi_target.h | 22 ++++++------ 4 files changed, 49 insertions(+), 52 deletions(-) diff --git a/ryzom/client/src/character_cl.cpp b/ryzom/client/src/character_cl.cpp index 68f8acfcb..c157c0f85 100644 --- a/ryzom/client/src/character_cl.cpp +++ b/ryzom/client/src/character_cl.cpp @@ -4553,13 +4553,20 @@ void CCharacterCL::applyBehaviourFlyingHPs(const CBehaviourContext &bc, const MB { nlassert(targetHitDates.size()==bc.Targets.Targets.size()); - if(!bc.Targets.Targets.empty()) + if (behaviour.DeltaHP == 0 || bc.Targets.Targets.empty()) + return; + + CRGBA deltaHPColor(0, 0, 0); + for (size_t i=0; iaddHPOutput(behaviour.DeltaHP, deltaHPColor, float(targetHitDates[i]-TimeInSec)); - } + target2->addHPOutput(bc.Targets.Targets[i].DeltaHP, deltaHPColor, float(targetHitDates[i]-TimeInSec)); } } } @@ -9705,7 +9706,7 @@ NLMISC_COMMAND(projectile, "Cast a projectile on another entity", " pos() - ch->pos()).norm(); bool resist = false; if (args.size() > 4) fromString(args[4], resist); - bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, resist, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, resist, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), -11)); } bc.BehavTime = TimeInSec; ch->applyBehaviour(bc); @@ -9743,7 +9744,7 @@ NLMISC_COMMAND(mtProjectile, "Cast a projectile on one or several entities", "pos() - ch->pos()).norm(); - bc.Targets.Targets.push_back(CMultiTarget::CTarget(mainTargetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(mainTargetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), 1)); for(sint k = 1; k < (sint) (args.size() - 4); ++k) { uint secondaryTargetSlot; @@ -9753,7 +9754,7 @@ NLMISC_COMMAND(mtProjectile, "Cast a projectile on one or several entities", "pos() - mainTarget->pos()).norm(); - bc.Targets.Targets.push_back(CMultiTarget::CTarget(secondaryTargetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(secondaryTargetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), k+1)); } } } @@ -9770,7 +9771,7 @@ NLMISC_COMMAND(mtProjectile, "Cast a projectile on one or several entities", "pos() - ch->pos()).norm(); - bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), k+1)); } } } @@ -9787,7 +9788,7 @@ NLMISC_COMMAND(mtProjectile, "Cast a projectile on one or several entities", "pos() - startSlot->pos()).norm(); - bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), k+1)); startSlot = target; } } @@ -10100,6 +10101,7 @@ NLMISC_COMMAND(attack, "simulate an attack", " selection(); target.Info = dsPower | (dsType << 3); + target.DeltaHP = -20; bc.Targets.Targets.push_back(target); bc.BehavTime = TimeInSec; bc.Behav.DeltaHP = -20; @@ -10154,7 +10156,7 @@ NLMISC_COMMAND(rangeAttack, "simulate a range attack", " [intensity] [loca CEntityCL *target = EntitiesMngr.entity(targetSlot); if (!target) return false; double dist = (target->pos() - entity->pos()).norm(); - bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), -10)); bc.Behav.DeltaHP = -10; entity->applyBehaviour(bc); return true; @@ -10188,7 +10190,7 @@ NLMISC_COMMAND(creatureAttack, "simulate a creature attack (2 attaques per creat { fromString(args[8], resist); } - bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)))); + bc.Targets.Targets.push_back(CMultiTarget::CTarget(targetSlot, false, (uint8) ceilf((float) (dist / MULTI_TARGET_DISTANCE_UNIT)), -15)); bc.Behav.CreatureAttack.ActionDuration = 0; uint magicImpactIntensity = 1; if (args.size() > 3) diff --git a/ryzom/client/src/user_entity.cpp b/ryzom/client/src/user_entity.cpp index ca205c6de..265265344 100644 --- a/ryzom/client/src/user_entity.cpp +++ b/ryzom/client/src/user_entity.cpp @@ -491,8 +491,8 @@ void CUserEntity::updateVisualPropertyBehaviour(const NLMISC::TGameCycle &/* gam } CCDBNodeLeaf *targetList0 = dynamic_cast(_DBEntry->getNode(CLFECOMMON::PROPERTY_TARGET_LIST_0)); CCDBNodeLeaf *targetList1 = dynamic_cast(_DBEntry->getNode(CLFECOMMON::PROPERTY_TARGET_LIST_1)); - CCDBNodeLeaf *targetList2 = dynamic_cast(_DBEntry->getNode(CLFECOMMON::PROPERTY_TARGET_LIST_1)); - CCDBNodeLeaf *targetList3 = dynamic_cast(_DBEntry->getNode(CLFECOMMON::PROPERTY_TARGET_LIST_1)); + CCDBNodeLeaf *targetList2 = dynamic_cast(_DBEntry->getNode(CLFECOMMON::PROPERTY_TARGET_LIST_2)); + CCDBNodeLeaf *targetList3 = dynamic_cast(_DBEntry->getNode(CLFECOMMON::PROPERTY_TARGET_LIST_3)); if (targetList0 && targetList1 && targetList2 && targetList3) { uint64 vp[4] = diff --git a/ryzom/common/src/game_share/multi_target.cpp b/ryzom/common/src/game_share/multi_target.cpp index 066d842c9..cef120b60 100644 --- a/ryzom/common/src/game_share/multi_target.cpp +++ b/ryzom/common/src/game_share/multi_target.cpp @@ -22,18 +22,16 @@ // *********************************************************************** void CMultiTarget::pack(uint64 *destVP, uint numVP) { - nlassert(numVP * 4 >= Targets.size()); // not enough room to stores visual properties! + nlassert(numVP * 2 >= Targets.size()); // not enough room to stores visual properties! CTarget invalidTarget; uint index = 0; for(uint k = 0; k < numVP; ++k) { - uint16 parts[4]; - for(uint l = 0; l < 4; ++l) - { - parts[l] = index < Targets.size() ? Targets[index].getPacked() : invalidTarget.getPacked(); - ++ index; - } - destVP[k] = (uint64) parts[0] | ((uint64) parts[1] << 16) | ((uint64) parts[2] << 32) | ((uint64) parts[3] << 48); + destVP[k] = index < Targets.size() ? Targets[index].getPacked() : invalidTarget.getPacked(); + ++index; + + destVP[k] |= uint64(index < Targets.size() ? Targets[index].getPacked() : invalidTarget.getPacked()) << 32; + ++index; } } @@ -43,18 +41,15 @@ void CMultiTarget::unpack(const uint64 *srcVP, uint numVP) Targets.clear(); for(uint k = 0; k < numVP; ++k) { - for(uint l = 0; l < 4; ++l) - { - CTarget t; - t.setPacked((uint16) ((srcVP[k] >> (16 * l)) & 0xffff)); - if (t.TargetSlot != CLFECOMMON::INVALID_SLOT) - { - Targets.push_back(t); - } - else - { - return; - } - } + CTarget t; + t.setPacked(uint32(srcVP[k])); + if(t.TargetSlot == CLFECOMMON::INVALID_SLOT) + return; + Targets.push_back(t); + + t.setPacked(uint32(srcVP[k] >> 32)); + if(t.TargetSlot == CLFECOMMON::INVALID_SLOT) + return; + Targets.push_back(t); } } diff --git a/ryzom/common/src/game_share/multi_target.h b/ryzom/common/src/game_share/multi_target.h index 5b3fd8101..dcc6c9d6c 100644 --- a/ryzom/common/src/game_share/multi_target.h +++ b/ryzom/common/src/game_share/multi_target.h @@ -39,20 +39,21 @@ public: uint8 TargetSlot; // the slot that is targetted uint8 Info; // Damage shield for melee 5:3 format (damage shield io : power ) // Distance for range attacks (that do not have damage shield) format is 7:1 + sint16 DeltaHP; // public: - CTarget(uint8 slot = CLFECOMMON::INVALID_SLOT, bool resist = false, uint8 dist = 0) : TargetSlot(slot) + CTarget(uint8 slot = CLFECOMMON::INVALID_SLOT, bool resist = false, uint8 dist = 0, sint16 deltaHp = 0) : TargetSlot(slot), DeltaHP(deltaHp) { Info = (resist == 0 ? 0 : 0x80) | (dist & 0x7f); } - uint16 getPacked() const; - void setPacked(uint16 value); + uint32 getPacked() const; + void setPacked(uint32 value); }; typedef std::vector TTargetVect; // the list of targets TTargetVect Targets; public: /** create packed version of targets (to store in visual properties) - * each VP encodes 4 targets + * each VP encodes 2 targets * caller must provide enough room to store the result (assertion is raised otherwise) */ void pack(uint64 *destVP, uint numVP); @@ -65,19 +66,18 @@ public: //////////// // ******************************************************************************************* -inline uint16 CMultiTarget::CTarget::getPacked() const +inline uint32 CMultiTarget::CTarget::getPacked() const { //return (uint16) TargetSlot | ((uint16) (Resist ? 1 : 0) << 15) | ((uint16) Distance << 8); - return (uint16) TargetSlot | (uint16(Info) << 8); + return ((uint32) TargetSlot) | ((uint32) Info << 8) | ((uint32) DeltaHP << 16); } // ******************************************************************************************* -inline void CMultiTarget::CTarget::setPacked(uint16 value) +inline void CMultiTarget::CTarget::setPacked(uint32 value) { - TargetSlot = uint8(value & 0xff); - /*Distance = (uint8) ((value >> 8) & 0x7f); - Resist = (value & 0x8000) != 0;*/ - Info = value >> 8; + TargetSlot = uint8(value); + Info = uint8(value >> 8); + DeltaHP = sint16(value >> 16); } #endif From b1bc1a3b6cad465e80f5cfffdeb55f9e9747b3a3 Mon Sep 17 00:00:00 2001 From: Nuno Date: Wed, 29 Dec 2021 15:52:06 +0100 Subject: [PATCH 32/39] Fix issues with old gcc compiler (required by forge server) --- nel/include/nel/misc/common.h | 4 +-- nel/include/nel/misc/file.h | 2 +- nel/include/nel/misc/stream.h | 2 +- nel/include/nel/web/http_package_provider.h | 6 ++-- ryzom/common/src/game_share/object.h | 34 ++++++++++----------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/nel/include/nel/misc/common.h b/nel/include/nel/misc/common.h index 01817fa98..1e98ca3f7 100644 --- a/nel/include/nel/misc/common.h +++ b/nel/include/nel/misc/common.h @@ -412,8 +412,8 @@ public: Exception(); Exception(const std::string &reason); Exception(const char *format, ...); - virtual ~Exception() NL_OVERRIDE {} - virtual const char *what() const throw() NL_OVERRIDE; + virtual ~Exception() throw() {} + virtual const char *what() const throw(); }; diff --git a/nel/include/nel/misc/file.h b/nel/include/nel/misc/file.h index 2d3912842..0271be4a3 100644 --- a/nel/include/nel/misc/file.h +++ b/nel/include/nel/misc/file.h @@ -41,7 +41,7 @@ struct EFile : public EStream EFile (const std::string& filename) : EStream( "Unknown file error in '"+filename+"'" ), Filename(filename) {} EFile (const std::string& filename, const std::string& text, bool ) : EStream( text ), Filename(filename) {} - virtual ~EFile() NL_OVERRIDE {} + virtual ~EFile() throw() {} std::string Filename; }; diff --git a/nel/include/nel/misc/stream.h b/nel/include/nel/misc/stream.h index 9b18d575c..1dc56b1cd 100644 --- a/nel/include/nel/misc/stream.h +++ b/nel/include/nel/misc/stream.h @@ -81,7 +81,7 @@ struct EStream : public Exception EStream( const IStream &f, const std::string& str ); - virtual ~EStream() NL_OVERRIDE {} + virtual ~EStream() throw() {} // May Not be Filled... std::string StreamName; diff --git a/nel/include/nel/web/http_package_provider.h b/nel/include/nel/web/http_package_provider.h index 380b5cfa2..98b64a203 100644 --- a/nel/include/nel/web/http_package_provider.h +++ b/nel/include/nel/web/http_package_provider.h @@ -52,8 +52,8 @@ public: /// filePath: [out] ex. /games/nel/stream/00/00/000000000.. /// hash: [in] /// name: [in] name for debugging purposes - virtual bool getFile(std::string &filePath, const NLMISC::CHashKey &hash, const std::string &name) NL_OVERRIDE; - + virtual bool getFile(std::string &filePath, const NLMISC::CHashKey &hash, const std::string &name); + public: /// Set storage path (ex. stream/) std::string Path; @@ -61,7 +61,7 @@ public: /// Loads a package into the package manager (ex. http://cdn.ryzom.dev/open/stream/) typedef std::vector THosts; THosts Hosts; - + }; /* class CHttpPackageProvider */ } /* namespace NLMISC */ diff --git a/ryzom/common/src/game_share/object.h b/ryzom/common/src/game_share/object.h index 5b8c1c45d..5e8868256 100644 --- a/ryzom/common/src/game_share/object.h +++ b/ryzom/common/src/game_share/object.h @@ -291,40 +291,40 @@ public: explicit CObjectNumber(double value); explicit CObjectNumber(sint64 value); - virtual const char *getTypeAsString() const NL_OVERRIDE; + virtual const char *getTypeAsString() const; - virtual bool set(const std::string& key, sint64 value) NL_OVERRIDE; - virtual bool set(const std::string& key, double value) NL_OVERRIDE; - virtual bool set(const std::string& key, const std::string&value) NL_OVERRIDE; + virtual bool set(const std::string& key, sint64 value); + virtual bool set(const std::string& key, double value); + virtual bool set(const std::string& key, const std::string&value); - virtual bool setObject(const std::string& key, CObject* value) NL_OVERRIDE; + virtual bool setObject(const std::string& key, CObject* value); - virtual CObject* clone() const NL_OVERRIDE; + virtual CObject* clone() const; double getNumberValue() const { return m_IsInteger ? m_Value.Integer : m_Value.Number; } sint64 getIntegerValue() const { return m_IsInteger ? m_Value.Integer : m_Value.Number; } - virtual void dump(const std::string prefix = "", uint depth = 0) const NL_OVERRIDE; + virtual void dump(const std::string prefix = "", uint depth = 0) const; - virtual bool equal(const CObject* other) const NL_OVERRIDE; + virtual bool equal(const CObject* other) const; protected: - virtual void doSerialize(std::string& out, CSerializeContext& context) const NL_OVERRIDE; + virtual void doSerialize(std::string& out, CSerializeContext& context) const; - virtual bool doIsNumber() const NL_OVERRIDE; + virtual bool doIsNumber() const; - virtual double doToNumber() const NL_OVERRIDE; + virtual double doToNumber() const; - virtual bool doIsInteger() const NL_OVERRIDE; + virtual bool doIsInteger() const; - virtual sint64 doToInteger() const NL_OVERRIDE; + virtual sint64 doToInteger() const; - virtual std::string doToString() const NL_OVERRIDE; + virtual std::string doToString() const; - virtual void inPlaceCopyTo(CObject &dest) const NL_OVERRIDE; - virtual void inPlaceCopy(const CObjectNumber &src) NL_OVERRIDE; + virtual void inPlaceCopyTo(CObject &dest) const; + virtual void inPlaceCopy(const CObjectNumber &src); - virtual void visitInternal(IObjectVisitor &visitor) NL_OVERRIDE; + virtual void visitInternal(IObjectVisitor &visitor); private: bool m_IsInteger; From 663de25cbeb9f917c49ba98f8e5f0b6ecafb0caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= Date: Mon, 3 Jan 2022 10:20:02 +0000 Subject: [PATCH 33/39] Fixed cleanup of html downloads --- nel/include/nel/gui/group_html.h | 1 + nel/src/gui/group_html.cpp | 25 +++++++++++++++---------- nel/src/gui/view_bitmap.cpp | 8 +++++++- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/nel/include/nel/gui/group_html.h b/nel/include/nel/gui/group_html.h index 8b6ad19b6..4f972b191 100644 --- a/nel/include/nel/gui/group_html.h +++ b/nel/include/nel/gui/group_html.h @@ -969,6 +969,7 @@ namespace NLGUI // stop all curl downalods (html and data) void releaseDownloads(); + void releaseDataDownloads(); void checkDownloads(); // _CurlWWW download finished diff --git a/nel/src/gui/group_html.cpp b/nel/src/gui/group_html.cpp index 107ab107a..de7e6effe 100644 --- a/nel/src/gui/group_html.cpp +++ b/nel/src/gui/group_html.cpp @@ -299,6 +299,11 @@ namespace NLGUI void CGroupHTML::ImageDownloadCB::finish() { + // Image setTexture will remove itself from Images while iterating over it. + // Do the swap to keep iterator safe. + std::vector vec; + vec.swap(Images); + // tmpdest file does not exist if download skipped (ie cache was used) if (CFile::fileExists(tmpdest) || CFile::getFileSize(tmpdest) == 0) { @@ -322,7 +327,7 @@ namespace NLGUI // to temp file temporarily. that forces driver to reload texture from disk // ITexture::touch() seem not to do this. // cache was updated, first set texture as temp file - for(std::vector::iterator it = Images.begin(); it != Images.end(); ++it) + for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it) { SImageInfo &img = *it; Parent->setImage(img.Image, tmpdest, img.Type); @@ -339,7 +344,7 @@ namespace NLGUI } // even if image was cached, incase there was 'http://' image set to CViewBitmap - for(std::vector::iterator it = Images.begin(); it != Images.end(); ++it) + for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it) { SImageInfo &img = *it; Parent->setImage(img.Image, dest, img.Type); @@ -1053,6 +1058,13 @@ namespace NLGUI _CurlWWW = NULL; } + releaseDataDownloads(); + } + + void CGroupHTML::releaseDataDownloads() + { + LOG_DL("Clear pointers to %d curls", Curls.size()); + // remove all queued and already started downloads for(std::list::iterator it = Curls.begin(); it != Curls.end(); ++it) { @@ -3080,14 +3092,7 @@ namespace NLGUI paragraphChange (); - // clear the pointer to the current image download since all the button are deleted - LOG_DL("Clear pointers to %d curls", Curls.size()); - - // remove image refs from downloads - /*for(std::list::iterator it = Curls.begin(); it != Curls.end(); ++it) - { - it->imgs.clear(); - }*/ + releaseDataDownloads(); } // *************************************************************************** diff --git a/nel/src/gui/view_bitmap.cpp b/nel/src/gui/view_bitmap.cpp index 89c944a18..1896ced40 100644 --- a/nel/src/gui/view_bitmap.cpp +++ b/nel/src/gui/view_bitmap.cpp @@ -481,7 +481,13 @@ namespace NLGUI } else { - _HtmlDownload = NULL; + if (_HtmlDownload) + { + CGroupHTML *groupHtml = dynamic_cast(CWidgetManager::getInstance()->getElementFromId("ui:interface:webig:content:html")); + if (groupHtml) + groupHtml->removeImageDownload(_HtmlDownload, dynamic_cast(this)); + _HtmlDownload = NULL; + } _TextureId.setTexture (TxName.c_str (), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false); } } From aebab35cadb59648f7b710d5c66e29065558f586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Meelis=20M=C3=A4gi?= Date: Mon, 3 Jan 2022 10:20:26 +0000 Subject: [PATCH 34/39] Fix crash when --nopatch is used without argument --- ryzom/client/src/far_tp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/far_tp.cpp b/ryzom/client/src/far_tp.cpp index 6bd05172a..3461c824f 100644 --- a/ryzom/client/src/far_tp.cpp +++ b/ryzom/client/src/far_tp.cpp @@ -466,7 +466,7 @@ void CLoginStateMachine::run() /// check the data to check if patch needed CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_PostLogin, "login_step_post_login")); - if (!ClientCfg.PatchWanted || (Args.haveArg("n") && Args.getLongArg("nopatch").front() == "1")) + if (!ClientCfg.PatchWanted || Args.haveLongArg("nopatch")) { // client don't want to be patched ! _CurrentState = st_display_eula; From 3b2553e3dd07a38068477007b0a1e4644cebab1a Mon Sep 17 00:00:00 2001 From: Ben Saine Date: Mon, 3 Jan 2022 10:22:46 +0000 Subject: [PATCH 35/39] Resolve "Allow drag and drop between zig and guild" --- .../src/interface_v3/inventory_manager.cpp | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/ryzom/client/src/interface_v3/inventory_manager.cpp b/ryzom/client/src/interface_v3/inventory_manager.cpp index 1bb3c478f..04ad896bc 100644 --- a/ryzom/client/src/interface_v3/inventory_manager.cpp +++ b/ryzom/client/src/interface_v3/inventory_manager.cpp @@ -2903,32 +2903,6 @@ class CHandlerInvCanDropTo : public IActionHandler if ((pListDstText != NULL) || (pListDstIcon != NULL)) { bool bCanDrop = true; - // WE CANT DND if we want to dnd from other bag than BAG to guild bag - if (pListDstIcon != NULL) - { - if (pListDstIcon->getInvType() == CInventoryManager::InvGuild) - if (strnicmp(pCSSrc->getSheet().c_str(),"LOCAL:INVENTORY:BAG", 19) != 0) - bCanDrop = false; - } - if (pListDstText != NULL) - { - if (pListDstText->getInvType() == CInventoryManager::InvGuild) - if (strnicmp(pCSSrc->getSheet().c_str(),"LOCAL:INVENTORY:BAG", 19) != 0) - bCanDrop = false; - } - // WE CANT DND if we want to dnd from guild bag to other bag than BAG - if (pListDstIcon != NULL) - { - if (pListDstIcon->getInvType() != CInventoryManager::InvBag) - if (strnicmp(pCSSrc->getSheet().c_str(),"SERVER:GUILD:INVENTORY", 19) == 0) - bCanDrop = false; - } - if (pListDstText != NULL) - { - if (pListDstText->getInvType() != CInventoryManager::InvBag) - if (strnicmp(pCSSrc->getSheet().c_str(),"SERVER:GUILD:INVENTORY", 19) == 0) - bCanDrop = false; - } // WE CANT DND when packer/mount is too far if (pListDstIcon != NULL) @@ -3100,7 +3074,6 @@ class CHandlerInvDropTo : public IActionHandler else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvGuild)) || ((pListDstIcon != NULL) && (pListDstIcon->getInvType() == CInventoryManager::InvGuild))) { - if (strnicmp(pCSSrc->getSheet().c_str(), "LOCAL:INVENTORY:BAG", 19) == 0) CAHManager::getInstance()->runActionHandler("proc", pCSSrc, "move_to_guild"); } else if (((pListDstText != NULL) && (pListDstText->getInvType() == CInventoryManager::InvRoom)) || From 855410f3d0788d2e05d3984dc1aac93b8497fe7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= Date: Thu, 13 Jan 2022 16:28:47 +0000 Subject: [PATCH 36/39] Resolve "Add ability to have translated titles with untraslated fields" --- ryzom/client/src/string_manager_client.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ryzom/client/src/string_manager_client.cpp b/ryzom/client/src/string_manager_client.cpp index 1ff55c54b..74f650b1e 100644 --- a/ryzom/client/src/string_manager_client.cpp +++ b/ryzom/client/src/string_manager_client.cpp @@ -1630,7 +1630,7 @@ const char *CStringManagerClient::getSPhraseLocalizedDescription(NLMISC::CSheetI const char *CStringManagerClient::getTitleLocalizedName(const string &titleId, bool women) { vector listInfos = getTitleInfos(titleId, women); - + if (!listInfos.empty()) { _TitleWords.push_back(listInfos[0]); @@ -1681,7 +1681,19 @@ vector CStringManagerClient::getTitleInfos(const string &titleId, bool w { if (titleId[0] != '#') { - listInfos[0] = getSpecialWord(listInfos[0], women); + // Check special case like SON_OF|jane|joe (with SON_OF = "Son of {1} and {2}") + vector titleReps; + splitString(listInfos[0], string("|"), titleReps); + if (titleReps.size() > 1) + { + listInfos[0] = getSpecialWord(titleReps[0], women); + for(uint i=1; i < titleReps.size(); ++i ) + { + while(strFindReplace(listInfos[0], toString("{%d}", i), titleReps[i])); + } + } + else + listInfos[0] = getSpecialWord(listInfos[0], women); } } From 22b4c074e867a7dcf95ed9243cc39229ce9601cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20Gon=C3=A7alves=20=28Ulukyn=29?= Date: Thu, 13 Jan 2022 16:28:52 +0000 Subject: [PATCH 37/39] Resolve "Remove Open menu option from scroll items when item use a Scroll.Label" --- ryzom/client/src/interface_v3/action_handler_item.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index 67f0d18ee..ff4034b3d 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -1881,7 +1881,7 @@ class CHandlerItemMenuCheck : public IActionHandler } if (pItemTextDisplay && pIS->Family == ITEMFAMILY::SCROLL) { - if (pCS->getInventoryIndex()==INVENTORIES::bag) + if (pCS->getInventoryIndex()==INVENTORIES::bag && pIS->Scroll.Label.empty()) pItemTextDisplay->setActive(true); pItemInfos->setActive(false); } From 357934fcdec7ae66213d4729ee1b879ab7ec5793 Mon Sep 17 00:00:00 2001 From: Ben Saine Date: Mon, 17 Jan 2022 16:41:29 +0000 Subject: [PATCH 38/39] Resolve "Dragging from player trade to inventory takes two tries" --- ryzom/client/src/interface_v3/action_handler_item.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ryzom/client/src/interface_v3/action_handler_item.cpp b/ryzom/client/src/interface_v3/action_handler_item.cpp index ff4034b3d..f931f1d76 100644 --- a/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -747,6 +747,10 @@ public: CInterfaceElement *pElt = CWidgetManager::getInstance()->getElementFromId(src); CDBCtrlSheet *pCSSrc = dynamic_cast(pElt); CDBCtrlSheet *pCSDst = dynamic_cast(pCaller); + + // end drag + getInventory().endDrag(); + if ((pCSSrc == NULL) || (pCSDst == NULL)) return; if (pCSSrc->getType() == CCtrlSheetInfo::SheetType_Item) From db86219eabd87c14b5daad858a8cfa17f0481bbe Mon Sep 17 00:00:00 2001 From: Nuno Date: Tue, 1 Feb 2022 15:34:11 +0100 Subject: [PATCH 39/39] Added NL_NO_ASSERT to remove asserts in server --- nel/include/nel/misc/debug.h | 2 +- nel/include/nel/misc/types_nl.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nel/include/nel/misc/debug.h b/nel/include/nel/misc/debug.h index 9b6e48376..67c6837da 100644 --- a/nel/include/nel/misc/debug.h +++ b/nel/include/nel/misc/debug.h @@ -380,7 +380,7 @@ extern bool _assertex_stop_1(bool &ignoreNextTime); #define nlassume(exp) do { } while (0) #endif -#ifdef NL_NO_DEBUG +#ifdef NL_NO_ASSERT # define nlassert(exp) nlassume(exp) # define nlassertonce(exp) nlassume(exp) # define nlassertex(exp, str) nlassume(exp) diff --git a/nel/include/nel/misc/types_nl.h b/nel/include/nel/misc/types_nl.h index 5af1ce3f3..b8d888932 100644 --- a/nel/include/nel/misc/types_nl.h +++ b/nel/include/nel/misc/types_nl.h @@ -274,7 +274,7 @@ //#define NL_NO_DEBUG #undef NL_NO_DEBUG - +#define NL_NO_ASSERT // Standard types