UnLoaded 313 Опубликовано 26 Декабря 2016 (изменено) Создание нового слота ... после: m_slots_array[sLOT_QUICK_ACCESS_3] = m_pUISlotQuickAccessList_3; ... У меня нет нигде m_slots_array. Результат поиска в 4611 файлах - 0. Версия исходников 1.0007(rc1). Если пропустить все, касаемо m_slots_array - работать новый слот будет ? Изменено 26 Декабря 2016 пользователем UnLoaded Поделиться этим сообщением Ссылка на сообщение
UnLoaded 313 Опубликовано 5 Марта 2017 (изменено) расскажи хоть где копать. в xrGame\ui\UIInventoryUtilities.cpp объявлен дефайн #define EQUIPMENT_ICONS "ui\\ui_icon_equipment" далее, там-же ref_shader& InventoryUtilities::GetEquipmentIconsShader() { if(!g_EquipmentIconsShader) { g_EquipmentIconsShader.create("hud\\default", EQUIPMENT_ICONS); } return g_EquipmentIconsShader; } Остается только продумать, как организовать указание движку, откуда иконки читать... Обнаружил такую вот бяку: если на ГГ надет броник с ПНВ, и ПНВ включен, то при удалении этого броника ф-циями release\transfer_item или продаже\выкладывании в другой инвентарь, ПНВ не выключается. Порылся в исходниках, нашел такое решение: в xrGame\Inventory.cpp находим ф-цию bool CInventory::DropItem(CGameObject *pObj). Прямо перед ней добавляем #include "customoutfit.h" #include "torch.h" в теле ф-ции находим и добавляем(то, что выделено): case eItemPlaceSlot: { R_ASSERT (InSlot(pIItem)); if(m_iActiveSlot == pIItem->GetSlot()) Activate(NO_ACTIVE_SLOT); m_slots[pIItem->GetSlot()].m_pIItem = NULL; pIItem->object().processing_deactivate(); ///это добавить CCustomOutfit* pOutfit = smart_cast(pObj); if (pOutfit) { CTorch* pTorch = smart_cast(ItemFromSlot(TORCH_SLOT)); if (pTorch) pTorch->SwitchNightVision(false); } /// }break; Потестил, вроде все как надо. Хотя может можно и по другому ? Изменено 5 Марта 2017 пользователем Kondr48 Убрал портянки под спойлеры 2 Поделиться этим сообщением Ссылка на сообщение
UnLoaded 313 Опубликовано 5 Марта 2017 (изменено) надо просто размотать всю эту цепочку Дак вроде ж выше уже размоталась: поиск по файлам проекта "ui_icon_equipment" - результат 1 строка, выше уже писал где и какая. Далее, поиск "EQUIPMENT_ICONS" - результатов уже 4, но 2 из них - файл xrGame\game_cl_mp.cpp, в нем все касаемо мультиплеера + там совсем другой файл дефайнится, значит нам не интересны. Оставшиеся 2 - описаны выше, и следовательно, вся размотка заканчивается на ф-ции ref_shader& InventoryUtilities::GetEquipmentIconsShader(). Я думаю, можно дефайн убрать(зачем он, если используется всего один раз?), а в ф-ции сделать вычитывание имени файла как нам хоца. Ну, к примеру, из добавленного нового параметра в system.ltx, в котором прописывать новый файл... Всегда, играя в какой-нить мод, где есть квесты типа "собери 30 детекторов, отнеси кому-то - получишь обертку от чупа-чупсы", напрягало меня отсутствие возможности взять разом из нычки все эти накопленные 30 детекторов. По этому, сделал такую себе правочку, для окна обыска инв.ящиков\нычек\трупов: В xrGame\ui\UIMessages.h добавляем в конец(у меня после MAP_SELECT_SPOT): ..... MAP_HIDE_HINT, MAP_SELECT_SPOT, INVENTORY_TAKE_ALL //<- это Далее, в xrGame\ui\UICarBodyWnd.cpp, в ф-ции void CUICarBodyWnd::ActivatePropertiesBox(): ..... m_pUIPropertiesBox->RemoveAll(); LPCSTR _action = NULL; ///// это добавить - если в ячейке инв. более одного предмета, то добавляем соотв. пункт в меню правого клика мыша bool b_added = false; CUICellItem* itm = CurrentItem(); for (u32 i = 0; i < itm->ChildsCount(); ++i) { b_added = true; break; } if (b_added) { _action = "st_move_all"; b_show = true; m_pUIPropertiesBox->AddItem(_action, NULL, INVENTORY_TAKE_ALL); } ///// if (m_pInventoryBox) { ..... затем в том же файле, в ф-ции void CUICarBodyWnd::SendMessage(CUIWindow *pWnd, s16 msg, void *pData): ..... switch(m_pUIPropertiesBox->GetClickedItem()->GetTAG()) { case INVENTORY_EAT_ACTION: EatItem(); break; ///// это добавить - обрабатываем выбор добавленного пункта меню case INVENTORY_TAKE_ALL: MoveAllfromCell(); break; ///// case INVENTORY_UNLOAD_MAGAZINE: { ..... Теперь добавим саму ф-цию перемещения, сначала в xrGame\ui\UICarBodyWnd.h объявим как protected: void MoveAllfromCell(); затем, опять в xrGame\ui\UICarBodyWnd.cpp, сама ф-ция: void CUICarBodyWnd::MoveAllfromCell() { u16 tmp_id = 0; CUIDragDropListEx* owner_list = CurrentItem()->OwnerList(); if (owner_list != m_pUIOthersBagList) { // перемещаем в актерский инв. CUICellItem* ci = CurrentItem(); for (u32 j = 0; j<ci->ChildsCount(); ++j) { PIItem _itm = (PIItem)(ci->Child(j)->m_pData); if (m_pOthersObject) TransferItem(_itm, m_pOurObject, m_pOthersObject, false); else { move_item(tmp_id, m_pInventoryBox->ID(), _itm->object().ID()); // ЭТО ПОХОЖЕ заткнута выдача кэллбэка на взятие предмета из инв. ящика //. Actor()->callback(GameObject::eInvBoxItemTake)( m_pInventoryBox->lua_game_object(), _itm->object().lua_game_object() ); } } PIItem itm = (PIItem)(ci->m_pData); if (m_pOthersObject) TransferItem(itm, m_pOurObject, m_pOthersObject, false); else { move_item(tmp_id, m_pInventoryBox->ID(), itm->object().ID()); // ЭТО ПОХОЖЕ заткнута выдача кэллбэка на взятие предмета из инв. ящика //. Actor()->callback(GameObject::eInvBoxItemTake)(m_pInventoryBox->lua_game_object(), itm->object().lua_game_object() ); } } else { // перемещаем из актерского в другой инв. CUICellItem* ci = CurrentItem(); for (u32 j = 0; j<ci->ChildsCount(); ++j) { PIItem _itm = (PIItem)(ci->Child(j)->m_pData); if (m_pOthersObject) TransferItem(_itm, m_pOthersObject, m_pOurObject, false); else { move_item(m_pInventoryBox->ID(), tmp_id, _itm->object().ID()); // ЭТО ПОХОЖЕ заткнута выдача кэллбэка на взятие предмета из инв. ящика //. Actor()->callback(GameObject::eInvBoxItemTake)( m_pInventoryBox->lua_game_object(), _itm->object().lua_game_object() ); } } PIItem itm = (PIItem)(ci->m_pData); if (m_pOthersObject) TransferItem(itm, m_pOthersObject, m_pOurObject, false); else { move_item(m_pInventoryBox->ID(), tmp_id, itm->object().ID()); // ЭТО ПОХОЖЕ заткнута выдача кэллбэка на взятие предмета из инв. ящика //. Actor()->callback(GameObject::eInvBoxItemTake)(m_pInventoryBox->lua_game_object(), itm->object().lua_game_object() ); } } } Ну и последнее: в конфиге config\text\rus\ui_st_inventory.xml добавляем идентификатор "st_move_all" и текст для него: <?xml version="1.0" encoding="windows-1251" ?> <string_table> <string id="st_move_all"> <text>переместить все</text> </string> <string id="st_activate_artefact"> <text>активировать артефакт</text> </string>..... ..... Вроде все, теперь, если в окне обыска будет в ячейке более одного предмета - правый клик мыша -> "переместить все". Работает в обоих направлениях: инв. ГГ <-> другой инв. P.S. может что забыл из добавленного, если не взлетит у кого - отпишитесь, по-вспоминаю точнее. Изменено 5 Марта 2017 пользователем UnLoaded 1 1 Поделиться этим сообщением Ссылка на сообщение
UnLoaded 313 Опубликовано 16 Марта 2017 (изменено) Оно, вероятно должно работать, вот только в репозитории КД начиная со 180 ревизии (а мб и раньше) менюшка по клику пкм в car body изначально не работает =)Я забыл уточнить, для всех правок за моим авторством, что сделаны они для "чистых" исходников 1.0007rc1(скачаны из этого места). Изменено 16 Марта 2017 пользователем UnLoaded 1 Поделиться этим сообщением Ссылка на сообщение