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

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

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

13 минут назад, drksnc сказал:

Никто не знает как в ЧН/ЗП в сетевой игре включить возможность использования камер cam_2 и cam_3?

Файл 1: ...\xrGame\actor_mp_client.cpp

Строка проверки юзания камер актером на клиенте №39

Код:

void CActorMP::cam_Set		(EActorCameras style)
{
#ifndef	DEBUG
	if (style != eacFirstEye)
		return;
#endif
	CCameraBase* old_cam = cam_Active();
	cam_active = style;
	old_cam->OnDeactivate();
	cam_Active()->OnActivate(old_cam);
}

Файл 2: ...\xrGame\actor_mp_client.h

Строка обобщения функции проверки №37:

Код:

	virtual	void			cam_Set					(EActorCameras style);

Твоё действие:

Выпилить этот код с этих двух файлов к чертовой бабушке.

Ссылка на комментарий
9 минут назад, jargon сказал:

Твоё действие:

Выпилить этот код с этих двух файлов к чертовой бабушке.

А разве простое удаление условия не поможет?

Ссылка на комментарий
1 минуту назад, drksnc сказал:

А разве простое удаление условия не поможет?

По мне проще просто удалить проверку, дабы код не занимал место.

Ссылка на комментарий
Только что, 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);
}

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

Ссылка на комментарий

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

На случай открытого окна инвентаря после вызова 

    inventory_owner->inventory().Slot(inventory_item, bNotActivate);

нужно вызвать переинициализацию открытого окна, например так:

     CUIGameSP* pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame());

     if (pGameSP) pGameSP->ReInitShownUI();

 

Ссылка на комментарий
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 и что-то выполнялось в зависимости от его значения.

Ссылка на комментарий
Если отсутствуют - смотри на xp-dev.com
Есть m_b_need_reinit в UIInventoryWnd.cpp
void CUIInventoryWnd::Update()
{
	if(m_b_need_reinit)
		InitInventory					();

 

Ссылка на комментарий
7 часов назад, Charsi сказал:

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

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

Ссылка на комментарий

Здравствуйте, мастеры движкового дела! Есть тут те, кто ковыряет движок Call of Chernobyl? Заранее извините, если тема СоС тут под запретом

Ссылка на комментарий

Ещё один вопрос по поводу мультиплеера. Чистое Небо 1.5.10.

Экспериментирую с ai в мультиплеере. Подключил alife и смог заспавнить монстров. Есть несколько проблем, но самая актуальная - клиент валится на синхронизации, последовательность методов такая

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

0023:049F15A6 xrGame.dll, CQuadTree<moving_object>::insert() + 22 byte(s), c:\xray-dev\cs\engine\xrgame\quadtree_inline.h, line 90 + 18 byte(s)
0023:049F0D6B xrGame.dll, moving_object::moving_object() + 283 byte(s), c:\xray-dev\cs\engine\xrgame\moving_object.cpp, line 27
0023:048C7381 xrGame.dll, CCustomMonster::net_Spawn() + 1185 byte(s), c:\xray-dev\cs\engine\xrgame\custommonster.cpp, line 763 + 26 byte(s)
0023:0484CF56 xrGame.dll, CAI_Stalker::net_Spawn() + 150 byte(s), c:\xray-dev\cs\engine\xrgame\ai\stalker\ai_stalker.cpp, line 352 + 45 byte(s)
0023:049C7798 xrGame.dll, CLevel::g_sv_Spawn() + 88 byte(s), c:\xray-dev\cs\engine\xrgame\level_network_spawn.cpp, line 108 + 16 byte(s)
0023:049C75A9 xrGame.dll, CLevel::cl_Process_Spawn() + 169 byte(s), c:\xray-dev\cs\engine\xrgame\level_network_spawn.cpp, line 40
0023:049B4EF2 xrGame.dll, CLevel::ProcessGameEvents() + 290 byte(s), c:\xray-dev\cs\engine\xrgame\level.cpp, line 465
0023:049B4723 xrGame.dll, CLevel::OnFrame() + 467 byte(s), c:\xray-dev\cs\engine\xrgame\level.cpp, line 603
0023:008D539A xrEngine.exe, CInput::OnFrame() + 154 byte(s), c:\xray-dev\cs\engine\xrengine\xr_input.cpp, line 470
0023:00885400 xrEngine.exe, CRegistrator<pureAppStart>::Process() + 80 byte(s), c:\xray-dev\cs\engine\xrengine\pure.h, line 77
0023:008A69AF xrEngine.exe, CRenderDevice::FrameMove() + 399 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 474
0023:008A6C07 xrEngine.exe, CRenderDevice::on_idle() + 183 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 267
0023:008A6B3A xrEngine.exe, CRenderDevice::message_loop() + 90 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 379
0023:008A6A88 xrEngine.exe, CRenderDevice::Run() + 168 byte(s), c:\xray-dev\cs\engine\xrengine\device.cpp, line 423
0023:008DC31A xrEngine.exe, Startup() + 378 byte(s), c:\xray-dev\cs\engine\xrengine\x_ray.cpp, line 335
0023:008DBD88 xrEngine.exe, WinMain_impl() + 1048 byte(s), c:\xray-dev\cs\engine\xrengine\x_ray.cpp, line 496
0023:008DB8F6 xrEngine.exe, WinMain() + 54 byte(s), c:\xray-dev\cs\engine\xrengine\x_ray.cpp, line 521
0023:008A3E39 xrEngine.exe, __tmainCRTStartup() + 293 byte(s), f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c, line 618 + 14 byte(s)
0023:763162C4 KERNEL32.DLL, BaseThreadInitThunk() + 36 byte(s)
0023:77CC0F79 ntdll.dll, RtlSubscribeWnfStateChangeNotification() + 1081 byte(s)
0023:77CC0F44 ntdll.dll, RtlSubscribeWnfStateChangeNotification() + 1028 byte(s)

Сразу оговорюсь что я не очень силен в программировании, поэтому может не вижу очевидных вещей. Подскажите куда копать.

Изменено пользователем drksnc
Ссылка на комментарий

Объясните, как изменить(перенести с другой версии мода сталкер) прицел, какие файлы за это отвечают, и что чем править?

Ссылка на комментарий

[ТЧ 1.0007rc1 (xp-dev.com)]

Методы для CInventoryItem:  set_inventory_item_flags(flags16)  и  get_inventory_item_flags()

Если, есть те, кто разобрался как ими пользоваться.

Подскажите, пожалуйста (с примерами, если не трудно).

 

В движке из репо на xp-dev.com -- при обыске трупа или открытия ящика -- не работает выпадающий список действий (при нажатии правой клавиши мыши) на предмет.

Может, кто-нибудь поправил это? Если да - как исправить?

Ссылка на комментарий
5 hours ago, Shkiper2012 said:

Методы для CInventoryItem:  set_inventory_item_flags(flags16)  и  get_inventory_item_flags()

Вот так вот, например

function set_item_ungroupable( item )
  local f = item:get_inventory_item_flags()
  f:set( global_flags.FIUngroupable, true )
  item:set_inventory_item_flags( f )
end

В xp-dev нет этих флагов в global_flags, т.ч. можешь просто число там указывать, которому соотв. нужный тебе флаг.

 

Ссылка на комментарий

@dsh Наспавнил 5 бутылок водки в инвентарь гг.

Беру одну бутылку и пытаюсь установить ей флаг "не-группируемости" или "не-торгуемости".
Но, никакого результата (либо я его не вижу).

 

Что делал:

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

-- dbg_logf - это тот же log1, только для дебага.

-- Ставим флаг. --
function set_item_ungroupable( item )
    if not item then return end

    dbg_logf("* set_item_ungroupable -- 0 -- sect: "..tostring( item:section() ).." id: "..tostring( item:id() ))
    local f = item:get_inventory_item_flags()

    dbg_logf("* set_item_ungroupable -- 1 -- ")
    f:set( 16384, true )        -- const FIUngroupable      = 16384;
    -- f:set( 8192, true )      -- const FIAlwaysUntradable = 8192;

    dbg_logf("* set_item_ungroupable -- 2 -- ")
    item:set_inventory_item_flags( f )

    dbg_logf("* set_item_ungroupable -- 3 -- ")
end

-- Поиск предмета по секции в инвентаре. --
function search_item_in_inv( section )
    for i=0, db.actor:object_count()-1 do
        local obj = db.actor:object(i)
        if obj:section() == section then
            dbg_logf("* search_item_in_inv  >>>  sect:  "..tostring(section).."  >>>  id:  "..tonumber(obj:id()))
            -- return obj:id()  -- предмет найден
            return obj          -- предмет найден
        end
    end
    return nil
end

local sec = "vodka"
local act = db.actor
if act then
    local obj = search_item_in_inv(sec)
    if obj then
        dbg_logf("* set_item_ungroupable -- start -- ")
        set_item_ungroupable(obj)
        dbg_logf("* set_item_ungroupable -- finish -- ")
    end
end

 

Лог:

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

[02.11.17 01:08:15.656] ~~Start TESTING script!
[02.11.17 01:08:15.657] ~ --------------------------------------------------------
[02.11.17 01:08:15.658] * search_item_in_inv  >>>  sect:  vodka  >>>  id:  16905
[02.11.17 01:08:15.658] * set_item_ungroupable -- start --
[02.11.17 01:08:15.658] * set_item_ungroupable -- 0 -- sect: vodka id: 16905
[02.11.17 01:08:15.658] * set_item_ungroupable -- 1 --
[02.11.17 01:08:15.658] * set_item_ungroupable -- 2 --
[02.11.17 01:08:15.658] * set_item_ungroupable -- 3 --
[02.11.17 01:08:15.658] * set_item_ungroupable -- finish --
[02.11.17 01:08:15.658] ~ --------------------------------------------------------
[02.11.17 01:08:15.658] ~~Finish TESTING script!

 

Ожидания:

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

  Бутылка с флагом "должна" отделится от группы остальныих или,
  при торговле "должна быть": закрашена красным и не доступна,
  при соответствующем флаге, конечно.
  
  Но, этого не происходит.

 

Что я делаю не так?

 

Ссылка на комментарий

@Shkiper2012 в xp-dev флаг неторгуемости не обрабатывается, а флаг негруппируемости обрабатывается только после вызова соотв. коллбека и сбрасывается после его обработки, т.е. служит только для возврата результата из коллбека.

Ссылка на комментарий

@dsh

Вывод: прямо из скрипта нельзя настроить группирование/торгуемость (другие флаги не проверял)

(в xp-dev движке, на данный момент, для отдельно-взятого предмета).

Так? Или есть другие варианты?

 

Раньше я игрался с "кондишен" предмета для этих целей, либо использовал X-Ray extensions с их "set_inventory_item_int16".

А тут такой облом.

Ссылка на комментарий

@Shkiper2012 если не внести свои изменения в xp-dev, то на торгуемость влиять нельзя. На группируемость - можно. Нужно подключить обработчик для коллбэка "on_group_items", в который передаются два предмета, и в нем этим предметам выставлять флаг негруппируемости, если нужно. Коллбэк вызывается для выяснения, можно-ли сгруппировать эти два предмета.

 

Если же вносить свои изменения, то см. для примера

 

https://github.com/dsh2dsh/OGSR-Engine/commit/eff43a33936c6fdffbf58c70f06a4b7f68df1801

https://github.com/dsh2dsh/OGSR-Engine/commit/22069d0d62a04ea075497540cf98ecdeef3eddf5

 

Ссылка на комментарий

Ребят, помогите нубу, есть скрипт - награда за помощь от НПС, тоесть лечу непись, получаю от него предмет из списка. Как правильно прописать число к каждому предмету, чтобы получить их несколько за раз(типа ammo_9x18_fmj = 3 \n но в скрипте надо как то по другому число писать) Вот начало скрипта, список

local nagrad = {
  
  level_1 = {
  "af_vyvert",
  "af_blood",
  "wpn_bm16",
  "antirad",

Ссылка на комментарий

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
К сожалению, ваш пост содержит слова, запрещенные в нашем сообществе. Пожалуйста, измените ваш текст так, чтобы в нем не оставалось слов, указанных ниже. Помните, что публикация вами даже видоизмененного запрещенного слова может нарушать законодательство РФ и Правила форума.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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

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

AMK-Team.ru

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