Перейти к контенту
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);

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

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

  • Спасибо 1
Ссылка на комментарий
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

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

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

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

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

Ещё один вопрос по поводу мультиплеера. Чистое Небо 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, т.ч. можешь просто число там указывать, которому соотв. нужный тебе флаг.

 

  • Спасибо 1
Ссылка на комментарий

@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

 

  • Спасибо 1
Ссылка на комментарий

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

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

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

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

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

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

AMK-Team.ru

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