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

Редактирование движка X-Ray


Rolan

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

(изменено)

Правок много уже имеется, хочу спросить насчет одной интересующей на данный момент: включение("оживление" так сказать) параметра "Сытость" для артефактов в ТЧ делали или нет ? Если нет, то может кто из соображающих глянет в эту сторону ?

 

В репо на xp-dev.com фиксили.

А с помощью бинарных патчей (то есть то, что в теме "X-Ray extensions") такое можно сделать\уже сделали ?

 

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

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


Ссылка на сообщение
Поделиться на других сайтах

cam_inert регулирует раскачку камеры вправо\влево при движении. А нет ли правки, которая бы регулировала раскачку вверх\вниз ?

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


Ссылка на сообщение
Поделиться на других сайтах

Вопрос тем, кто умеет движок править: насчет cam_inert но вверх\вниз - это сложно сделать ? Движок позволяет такое ?

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


Ссылка на сообщение
Поделиться на других сайтах

Подскажите, классы CObjectActionCommand, CObjectActionShow, CObjectActionHide и т.д. находящиеся в  xrGame\object_actions.cpp - зачем они и за что отвечают в движке ?

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


Ссылка на сообщение
Поделиться на других сайтах

В классе CInventory в ф-ции Slot поставил вывод сообщений в лог:

bool CInventory::Slot(PIItem pIItem, bool bNotActivate)
{ VERIFY(pIItem);
     Msg("CInventory::Slot: before if(!CanPutInSlot(pIItem)) %s - %s[%d]", this->m_pOwner->Name(), *pIItem->object().cName(), pIItem->object().ID());
     if(!CanPutInSlot(pIItem))
     {
          if(m_slots[pIItem->GetSlot()].m_pIItem == pIItem && !bNotActivate )
          Activate(pIItem->GetSlot());
          return false;
     }
     Msg("CInventory::Slot: after if(!CanPutInSlot(pIItem)) %s - %s[%d]", this->m_pOwner->Name(), *pIItem->object().cName(), pIItem->object().ID());
..........

При перемещении в слот к примеру броника, в логе следующее:
CInventory::Slot: before if(!CanPutInSlot(pIItem)) Меченый - scientific_outfit1162[1162]
CInventory::Slot: after if(!CanPutInSlot(pIItem)) Меченый - scientific_outfit1162[1162]
CInventory::Slot: before if(!CanPutInSlot(pIItem)) Меченый - scientific_outfit1162[1162]
т.е. получается что ф-ция вызывается 2 раза для перемещаемого предмета. Зачем ? Кто нибудь пытался разобраться почему происходит два вызова ф-ции ?

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


Ссылка на сообщение
Поделиться на других сайтах

@alexus95 Желание*желание + изучение С++, WinAPI ну и собственно самих исходников движка...

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


Ссылка на сообщение
Поделиться на других сайтах

(изменено)

Пару вопросов по движковой структуре SHit.

Hit.h:

SHit (float Power, Fvector &dir, CObject *who, u16 element, Fvector p_in_object_space, float impulse, ALife::EHitType hit_type, float ap = 0.0f, bool AimBullet=false);

Hit.cpp:

SHit::SHit(float aPower, Fvector &adir, CObject *awho, u16 aelement, Fvector ap_in_bone_space, float aimpulse, ALife::EHitType ahit_type, float aAP, bool AimBullet)

Названия аргументов в объявлении не совпадают с названиями в реализации. Я всегда думал, что должно совпадать ?

u16 element - косточка, по которой пришелся хит ? Не могу найти, где перечислены все возможные косточки, подскажите.

 

Класс CEntityCondition как я понимаю используется и для актера и для мобов. А как в этом классе определиться - "кто мы сейчас". Т.е., к примеру в ф-ции этого класса ConditionHit определить, для кого она сработала - для актера или не актера ?

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

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


Ссылка на сообщение
Поделиться на других сайтах

(изменено)

Тут вот нашел такое в движке - в CEntityCondition::ConditionHit обработка хита:

      float hit_power_org = pHDS->damage();
      float hit_power = hit_power_org;
      hit_power = HitOutfitEffect(hit_power, pHDS->hit_type, pHDS->boneID, pHDS->ap);

далее:

float CEntityCondition::HitOutfitEffect(float hit_power, ALife::EHitType hit_type, s16 element, float AP)
{
....
      pOutfit->Hit(hit_power, hit_type);
....
}

далее в:

CCustomOutfit::Hit(float hit_power, ALife::EHitType hit_type)
{
      hit_power *= m_HitTypeK[hit_type];
      ChangeCondition(-hit_power);
}

Если я ничего не проглядел, то получается, что при получении к примеру телепатического(ну и радиационного до кучи) хита, происходит износ броника ?

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

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


Ссылка на сообщение
Поделиться на других сайтах

(изменено)

ТЧ 1.0007rc1. Такая вот задачка: при установке\смене броника в слот снимать предмет из другого слота. Сейчас сделал так:

Скрытый текст

 

в CCustomOutfit::OnMoveToSlot() добавил
 PIItem pRemItem = pActor->inventory().ItemFromSlot(NEWITEM_SLOT);
 if (pRemItem)
 {  
  CUIGameSP* pGameSP = NULL;
  CUI* ui = HUD().GetUI();
  if (ui && ui->UIGame())
  {
   pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame());
   if (pGameSP)
   {
    if (pGameSP->MainInputReceiver() == pGameSP->InventoryMenu)
    {
     pGameSP->InventoryMenu->RemToBag(pRemItem); <- если окно инвентаря открыто
    }
    else
    {   
     pActor->inventory().Ruck(pRemItem); <- все остальные случаи
    }
   }
  }
 }
в UIInventoryWnd.h:
bool RemToBag(PIItem pItem);
CUIDragDropListEx* m_pUINewItemList;
в UIInventoryWnd.cpp:
m_pUINewItemList инициализируем аналогично m_pUIOutfitList например.
в CUIInventoryWnd::RemToBag(PIItem pItem)
{
 if (GetInventory()->CanPutInRuck(pItem))
 {
  CUICellItem* itm = m_pUINewItemList->ItemsCount() ? m_pUINewItemList->GetItemIdx(0) : NULL;
  CUIDragDropListEx* new_owner = m_pUIBagList;

  bool result = GetInventory()->Ruck(pItem);
  VERIFY(result);
  CUICellItem* i = m_pUINewItemList->RemoveItem(itm, false);

  new_owner->SetItem(i);

  SendEvent_Item2Ruck(pItem);
  return true;
 }

 return false;
}

 

Ни чего лучше не придумалось, но вроде работает. Собственно хочу спросить: кто нить решал подобную задачу и может ли предложить более лучший вариант ?
А то сдается мне, что мой вариант - гадкий и кривой костыль...

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

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


Ссылка на сообщение
Поделиться на других сайтах

Может кто решал подобную задачу, подскажите плиз: как при активном(открытом) окне инвентаря получить для инвентарного объекта, по его конфиговой секции, объект класса CUICellItem, т.е. ячейку инв. в которой он находится(если я правильно понял назначение класса CUICellItem) ?

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


Ссылка на сообщение
Поделиться на других сайтах

Только что, mortan сказал:

тебе нужно для всех итемов с нужной тебе секцией узнать координаты их ячеек?

Мне надо при активном(открытом) окне инвентаря предмет переместить из рюкзака в слот. Вариант использования CInventory::Slot(PIItem pIItem, bool bNotActivate) не подходит, т.к. при использовании этой ф-ции предмет-то в слот перемещается, да вот только отображения этого действия нет - чтоб увидеть результат, надо закрыть окно инв. и снова открыть. Я ранее добавлял ф-цию снятия предмета из слота в рюкзак:

bool CUIInventoryWnd::RemToBag(PIItem pItem)
{
     if (GetInventory()->CanPutInRuck(pItem))
     {
          CUIDragDropListEx* old_owner = GetSlotList(pItem->GetSlot());
          CUICellItem* itm = old_owner->ItemsCount() ? old_owner->GetItemIdx(0) : NULL;
          CUIDragDropListEx* new_owner = m_pUIBagList;

          bool result = GetInventory()->Ruck(pItem);
          VERIFY(result);

          CUICellItem* i = old_owner->RemoveItem(itm, false); <- здесь происходит перемещение ячейки с предметом от одного
          new_owner->SetItem(i);                              <- владельца другому

          SendEvent_Item2Ruck(pItem);
          return true;
     }

     return false;
}

В случае перемещения предмета из слота все просто - в слоте всегда одна ячейка, получить ее не сложно и все работает нормально. А вот как для рюкзака получить нужную ячейку для нужного предмета ? Как сам предмет получить я вроде знаю:

PIItem pItem = pActor->inventory().GetItemFromInventory("ля-ля-ля");

а вот с ячейкой затык. Смотрел реализацию CUIDragDropListEx, там нашел только получение ячейки по индексу:

CUICellItem* CUIDragDropListEx::GetItemIdx(u32 idx)
{
     R_ASSERT(idx<ItemsCount());
     WINDOW_LIST_it it = m_container->GetChildWndList().begin();
     std::advance (it, idx);
     
     return smart_cast<CUICellItem*>(*it);
}

Но как индекс узнать ?

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


Ссылка на сообщение
Поделиться на других сайтах

2 часа назад, Charsi сказал:

Для переноса предмета в слот уже есть CScriptGameObject::MoveToSlot, который экспортирован как "move_to_slot".

pGameSP->ReInitShownUI();

 

2 часа назад, mortan сказал:

ещё раз, это ТЧ или ЗП?

1.0007rc1.

У меня CScriptGameObject::MoveToSlot равно как и "move_to_slot" - отсутствуют.

CUIGameSP::ReInitShownUI() -> CUIInventoryWnd::InitInventory_delayed(){m_b_need_reinit = true;} - просмотрел UIInventoryWnd.cpp, UIInventoryWnd2.cpp и UIInventoryWnd3.cpp, нигде не увидел чтоб проверялся этот m_b_need_reinit и что-то выполнялось в зависимости от его значения.

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


Ссылка на сообщение
Поделиться на других сайтах

7 часов назад, Charsi сказал:

Если отсутствуют - смотри на xp-dev.com

Тут бы подсказочку, куда конкретно там смотреть, а то пока не очень понятно...

  • Сомнительно 1

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


Ссылка на сообщение
Поделиться на других сайтах

Я в теме "С++" задавал вопрос по табуляции при форматировании текста, подсказали насчет \t, мол должно работать. Попробовал использовать это в отображении защиты броников в инвентаре(ф-ция CUIOutfitInfo::SetItem) - толку ноль. Может я чего не так делал:

_sz += sprintf_s(_buff+_sz,sizeof(_buff)-_sz,"%s \t%+3.0f%%", (_val_outfit>0.0f)?"%c[green]":"%c[red]", _val_outfit*100.0f);

Подскажите...

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


Ссылка на сообщение
Поделиться на других сайтах

28 минут назад, WinCap сказал:

Табуляция не работает на HUD'е игры.

Наверное, все же не на HUD'е, а в UI-классах не реализована ? Может кто делал реализацию ?

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


Ссылка на сообщение
Поделиться на других сайтах

Спрошу тута: в окне инвентаря, окно описания выделенного предмета, к примеру ствол - сначала идут индикаторы параметров ствола, затем его текстовое описание. Вопрос: отступ текстового описания, чтоб индикаторы поместились, где прописан - в движке или в конфиге ? Ткните носом, кто знает куда...

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


Ссылка на сообщение
Поделиться на других сайтах

(изменено)
4 часа назад, Winsor сказал:

альтернативный вариант - использовать в тексте &#160;  -это пробел, но за счет разной ширины символов все равно не получить ровных стоблцов.

А как насчет моноширинных шрифтов ? Есть реализации для Сталкера ?

Цитата

да, делал.

А что именно - восстановление табуляции или переход на CUIListItem ?

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

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


Ссылка на сообщение
Поделиться на других сайтах

Снова спрошу за окно описания выделенного предмета, а именно - отступ текстового описания, чтоб индикаторы помещались. Мне вот подсказывали, что

В ‎04‎.‎12‎.‎2017 в 12:23, Winsor сказал:

если речь идет о классе CUIItemInfo - то там все параметры отсnупов и иже с ними загружаются с xml конфигов.

Откуда конфиг может заранее учесть, описание какого предмета будет выведено ? Значит этот отступ задается в движке ? Вот только где ?

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


Ссылка на сообщение
Поделиться на других сайтах

8 часов назад, mortan сказал:

ЗП или ТЧ?

ТЧ 1.0007rc1.

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


Ссылка на сообщение
Поделиться на других сайтах

4 часа назад, alexus95 сказал:

хочу их соединить

Исходники игрового движка - это тебе не текстовой файл простенького содержания. Так просто не объединишь, тут конкретно копаться придется. Насчет советов - лучший тебе дадут авторы ОГСЕ движка, это должно быть и так понятно...

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


Ссылка на сообщение
Поделиться на других сайтах

  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

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