Перейти к контенту

[SOC] Мелкие правки движка


Kondr48

Рекомендуемые сообщения

(изменено)

Создание нового слота

...

после: m_slots_array[sLOT_QUICK_ACCESS_3] = m_pUISlotQuickAccessList_3;

...

У меня нет нигде m_slots_array. Результат поиска в 4611 файлах - 0. Версия исходников 1.0007(rc1). Если пропустить все, касаемо  m_slots_array - работать новый слот будет ?

Изменено пользователем UnLoaded

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
расскажи хоть где копать.

в 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;

 

 

Потестил, вроде все как надо. Хотя может можно и по другому ?

Изменено пользователем Kondr48
Убрал портянки под спойлеры
  • Спасибо 2

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
надо просто размотать всю эту цепочку

Дак вроде ж выше уже размоталась: поиск по файлам проекта "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. может что забыл из добавленного, если не взлетит у кого - отпишитесь, по-вспоминаю точнее.

 

Изменено пользователем UnLoaded
  • Спасибо 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Оно, вероятно должно работать, вот только в репозитории КД начиная со 180 ревизии (а мб и раньше) менюшка по клику пкм в car body изначально не работает =)

Я забыл уточнить, для всех правок за моим авторством, что сделаны они для "чистых" исходников 1.0007rc1(скачаны из этого места). Изменено пользователем UnLoaded
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...