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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
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();

 

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


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

@AndreySol ещё раз, это ТЧ или ЗП? Если ЗП то там сложностей быть не должно

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


Ссылка на сообщение
Поделиться на других сайтах
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

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