Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Редактирование движка
GAMEINATOR forums > S.T.A.L.K.E.R. > Мастерская: создание модов для S.T.A.L.K.E.R.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
xrModder
Если бы всё это было артефактами...
xrModder
Нужна помощь. В движке ЗП -> UIMap.cpp есть GetCurrentZoom().x, как завести эту штуку в движок ТЧ? Чёт у меня не получается sad.gif
XR_CPU_PIPE.DLL
Эм...
В общем, я на досуге страдал фигнёй, и я связывал центральную Припять из ТЧ вместе с восточной из ЗП
Я поставил левел ченджеры, граф поинты и т.д. не в общем всё правильно.
Теперь матюгальник под названием xrAI от ТЧ (aiwrapper лучше...) пишет мне такую дичь, как блин... Неважно
В общем
Код
* Detected CPU: AuthenticAMD , F15/M1/S0, 1596.00 mhz, 114-clk 'rdtsc'
* CPU Features: RDTSC, MMX, SSE, SSE2

Initializing File System...
using fs-ltx fsgame.ltx
FS: 47140 files cached, 6194Kb memory used.
Init FileSystem 16.171164 sec
'xrCore' build 0, (null)

CRT heap 0x029e0000
Process heap 0x00e00000
Loading DLL: xrSE_Factory.dll
'xrCore' build 0, (null)

CRT heap 0x029e0000
Process heap 0x00e00000
"LevelBuilder v4.1" beta build
Compilation date: Mar 27 2010

Startup time: 04:32:44
    level  1 l26_pripyat_cop
    level  2 l11_pripyat
Script debugger succesfully restarted.
* loading script _G.script
* loading script class_registrator.script
* loading script smart_terrain.script
* loading script se_respawn.script
* loading script se_switcher.script
* loading script se_stalker.script
* loading script se_car.script
* loading script se_zones.script
* loading script se_item.script
* loading script se_artefact.script
* loading script se_monster.script
* loading script game_registrator.script

FATAL ERROR

[error]Expression    : assertion failed
[error]Function      : CLevelGraph::vertex_position
[error]File          : d:\games\stalker_src\trunk\xrai\level_graph_inline.h
[error]Line          : 99
[error]Description   : iFloor((source_position.z - header().box().min.z)/header().cell_size() + .5f) < (int)m_row_length


stack trace:

0023:1003DF69 xrCore.dll, EFS_Utils::EFS_Utils()
0023:1008AE44 xrCore.dll, CStreamReader::`vftable'()
0023:00482B00 xrAI.exe, std::_Init_locks::operator=()


Я не дибил конечно, и многое в этом соображаю, но тут я логики не нахожу
Могу разве что предположить, что, что то не то с зонами влияния, точнее с их расположением (Я к этим зонам (куб) привязал ченджер)
Помогите, пожалуйста


З.Ы. Я ALL.spawn компилил
Все остальные манипуляции он на честном слове перенёс
abramcumner
Цитата(XR_CPU_PIPE.DLL @ 12.07.2020, 04:44) *
FATAL ERROR

[error]Expression : assertion failed
[error]Function : CLevelGraph::vertex_position
[error]File : d:\games\stalker_src\trunk\xrai\level_graph_inline.h
[error]Line : 99
[error]Description : iFloor((source_position.z - header().box().min.z)/header().cell_size() + .5f) < (int)m_row_length

Какой-то спавн-объект установил за пределами аи-сетки.
stalkergoshawk
Здравствуйте, подскажите пожалуйста. Собрал я движок на исходниках, все работает, потом внес в исходный код изменения. Вопрос, как его теперь правильно собрать, нужно весь заного собирать через кнопку БИЛД, или же кнопкой РеБИЛД? Или нужно собирать только те .dll в исходных файлах которых внес изменения?
xrModder
Цитата(stalkergoshawk @ 18.07.2020, 00:37) *
Здравствуйте, подскажите пожалуйста. Собрал я движок на исходниках, все работает, потом внес в исходный код изменения. Вопрос, как его теперь правильно собрать, нужно весь заного собирать через кнопку БИЛД, или же кнопкой РеБИЛД? Или нужно собирать только те .dll в исходных файлах которых внес изменения?

Всё зависит от зависимостей. К примеру вот порядок сборки движка ТЧ:
Порядок сборки X-Ray v1.0007rc1
zlib
minizip
BugTrap
xrCore
openal32
xrCDB
xrLua
xrSound
xrParticles
xrNetServer
xrXMLParser
XR_3DA
xrQSlim
ode
ETools
xrCPU_Pipe
DXT
xrSE_Factory
xrCompress
xrDO_Light
xrAI
xrD3D9-Null
xrGameSpy
xrRender_R2
xrRender_R1
Stalker_net
xrStatisticConvert
xrCoreStatic
xrGame
xrLC
LWO


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

А так Visual Studio сама определяет какие проекты нужно собирать после изменения кода. На всякий случай можно периодический полностью пересобирать. Если не хочешь ждать долгую сборку, то можно включить в всех проектах многопроцессорную компиляцию для Mixed/Release и собирать Mixed версию и тестить изменения. А уж потом после финальных изменении собираешь Release версию.
stalkergoshawk
xrModder, Я собираю движок ЗП, взял исходники engine.vc2008. Как я понял там зависимости и порядок постройки настроен. При первой сборке собирал с начало 3rd party, а потом все библиотеки по очереди сверху вниз. собрался без ошибок и работает. Потом внес изменения в файлы рендера и собрал только рендеры(кнопкой Ребилд), собралось без ошибок, игра запускается, но если сохраниться а потом загрузиться с этого сохранения виснет намертво.
в логах

stack trace:
0023:066F5FB7 xrGame.dll, CDialogHolder::CleanInternals()
0023:066F9BDC xrGame.dll, CDialogHolder::CleanInternals()
0023:043A2D93 lua.JIT.1.1.4.dll, luaopen_io()


Может я не так собираю после изменений? Как пересобрать заново весь движок?
cjayho
QUOTE (stalkergoshawk @ 18.07.2020, 15:01) *
xrModder, Я собираю движок ЗП, взял исходники engine.vc2008. Как я понял там зависимости и порядок постройки настроен. При первой сборке собирал с начало 3rd party, а потом все библиотеки по очереди сверху вниз. собрался без ошибок и работает. Потом внес изменения в файлы рендера и собрал только рендеры(кнопкой Ребилд), собралось без ошибок, игра запускается, но если сохраниться а потом загрузиться с этого сохранения виснет намертво.
в логах

stack trace:
0023:066F5FB7 xrGame.dll, CDialogHolder::CleanInternals()
0023:066F9BDC xrGame.dll, CDialogHolder::CleanInternals()
0023:043A2D93 lua.JIT.1.1.4.dll, luaopen_io()


Может я не так собираю после изменений? Как пересобрать заново весь движок?


правой кнопкой по корню сюлюшена, build
скомпилятся те файлы что были изменены, и все бинари перелинкованы.
просто так заменить дллку у существующего двигла не получится. Только всю папку бинс менять на свежесобанную.
а все потому что в тех версиях сырцов что у нас есть - выкошен stlport.
ForserX
Цитата(xrModder @ 17.07.2020, 21:52) *
Если ты внёс изменения скажем в xrCore, то придётся собирать чуть ли не весь движок, так как другие проекты "зависимы" от него и наоборот.

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

А вообще, просто настройте зависимости в солюшене и жмите F5 -> компилятор сам перебилдит, что нужно.

Цитата(cjayho @ 20.07.2020, 09:35) *
а все потому что в тех версиях сырцов что у нас есть - выкошен stlport.

Когда-то очень давно где-то видел и с stlport'ом. Правда уже не помню, ТЧ это был или ЗП

Цитата(cjayho @ 20.07.2020, 09:35) *
просто так заменить дллку у существующего двигла не получится. Только всю папку бинс менять на свежесобанную.

Тут тоже поспорю. Если собирать в vs2005/2008, то там меняется xrGame&xrNetServer&xrCore&xrEngine. Остальное подходит. Ну, опять таки, ЕМНИП.



Цитата(xrModder @ 17.07.2020, 21:52) *
собирать Mixed версию и тестить изменения

Немного некорректно. Mixed актуален больше для отладки символов в VS. Debug проверок игры он не несёт, а оптимизации релизной сборки нет. Если ты вынес пару функций в Lua - Mixed тебе не нужен.
Winsor
Товарищи, пытаюсь получить игровые объекты (В идеале CGameObject, но хотя бы CObject), которые в данный момент видны на экране (все):
CODE
collide::ray_defs RD(
pActor->Position(), pActor->Direction(),
100,
CDB::OPT_CULL, collide::rqtBoth);
if (g_pGameLevel->ObjectSpace.RayQuery(RQR, pActor->collidable.model,RD))
{
collide::rq_result* R = RQR.r_begin();
if (R && R->O)
Msg("RQR.r_begin() [%s]",R->O->cName().c_str());
}

но как то тишина полная в логе... ЧЯДНТ?
p.s. pActor->memory().visual().objects() не содержит нужных объектов, например, лежащих на земле предметов.
abramcumner
Цитата(Winsor @ 21.07.2020, 15:56) *
Товарищи, пытаюсь получить игровые объекты (В идеале CGameObject, но хотя бы CObject), которые в данный момент видны на экране (все):
CODE
collide::ray_defs RD(
pActor->Position(), pActor->Direction(),
100,
CDB::OPT_CULL, collide::rqtBoth);
...

В коде ты ищешь пересечение луча из позиции ГГ(это даже не позиция камеры) по направлению взгляда. Скорее всего такой луч ни с чем и не пересекается...

Можно искать коллизию с фрустумом. Создай фрустум с параметрами камеры и сделай запрос.
stalkergoshawk
Благодарю всех за подсказки, со сборкой движка вроде разобрался.
Немогу добавить в код фикс камеры взятый с OpenXRay.
CODE
void CCameraManager::UpdateCamEffectors()
{
if (m_EffectorsCam.empty())
return;

auto r_it = m_EffectorsCam.rbegin();
while (r_it != m_EffectorsCam.rend())
{
if (ProcessCameraEffector(*r_it))
++r_it;
else
{
// Dereferencing reverse iterator returns previous element of the list, r_it.base() returns current element
// So, we should use base()-1 iterator to delete just processed element. 'Previous' element would be
// automatically changed after deletion, so r_it would dereferencing to another value, no need to change it
OnEffectorReleased(*r_it);
auto r_to_del = r_it.base();
m_EffectorsCam.erase(--r_to_del);
}
}

m_cam_info.d.normalize();
m_cam_info.n.normalize();
m_cam_info.r.crossproduct(m_cam_info.n, m_cam_info.d);
m_cam_info.n.crossproduct(m_cam_info.d, m_cam_info.r);
}

Чем заменить auto в строках:
CODE
auto r_it = m_EffectorsCam.rbegin();
auto r_to_del = r_it.base();

То что вместо auto нужно явно указать типы данных, я знаю, но вот как эти типы узнать мне неизвестно. Подскажите чем заменить auto?
abramcumner
Цитата(stalkergoshawk @ 22.07.2020, 18:10) *
То что вместо auto нужно явно указать типы данных, я знаю, но вот как эти типы узнать мне неизвестно. Подскажите чем заменить auto?

Что студия показывает во всплывающей подсказке, когда подводишь курсор мыши к auto, то и пиши.
Winsor
Цитата(abramcumner @ 21.07.2020, 18:56) *
В коде ты ищешь пересечение луча из позиции ГГ(это даже не позиция камеры) по направлению взгляда. Скорее всего такой луч ни с чем и не пересекается...
Можно искать коллизию с фрустумом. Создай фрустум с параметрами камеры и сделай запрос.


CODE
CFrustum Frustum;
Frustum.CreateFromMatrix(Device.mFullTransform, FRUSTUM_P_LRTB | FRUSTUM_P_NEAR);
xr_vector<ISpatial*> spatials;
g_SpatialSpace->q_frustum(spatials, 0, STYPE_COLLIDEABLE, Frustum);

Получилось увидеть все объекты. проблема в том что такой запрос возвращает в spatials даже те объекты, которые находятся за стеной или двумя... О_О какие бы параметры я не прописывал вместо FRUSTUM_P*. Можете посоветовать способ борьбы с этим?
abramcumner
Цитата(Winsor @ 23.07.2020, 09:52) *
Получилось увидеть все объекты. проблема в том что такой запрос возвращает в spatials даже те объекты, которые находятся за стеной или двумя... О_О какие бы параметры я не прописывал вместо FRUSTUM_P*. Можете посоветовать способ борьбы с этим?

Наверное придется отфильтровать результаты: заслать лучики к центрам найденных объектов.
Yara
abramcumner,
cложно ли перевести зп-проект под новую монстростудию (2017 / 19), чтобы были доступны auto/nullptr и прочее? Или там достаточно открыть проект от старой студии (2005)-сохранить-переоткрыть и можно собирать.
ForserX
Yara, не сложно. Шаблоны местами поправить, в некоторых местах проблема с Inline вроде была. Мб ещё что-то по мелочи. Не помню уже
stalkergoshawk
Цитата(abramcumner @ 22.07.2020, 23:35) *
Что студия показывает во всплывающей подсказке, когда подводишь курсор мыши к auto, то и пиши.

При наведение курсора на auto, подсказок нет. Студия VS2008.
CODE
строку
auto r_it = m_EffectorsCam.rbegin();
заменил на
EffectorCamVec::reverse_iterator r_it = m_EffectorsCam.rbegin();
подобный код был в файле до правки

Ошибку не выдает. А вот что написать вместо auto в строке
CODE
auto r_to_del = r_it.base();

Пробывал также EffectorCamVec::reverse_iterator написать, выдает ошибку и не билдеться.



abramcumner
Цитата(stalkergoshawk @ 23.07.2020, 16:50) *
Ошибку не выдает. А вот что написать вместо auto в строке auto r_to_del = r_it.base();
Пробывал также EffectorCamVec::reverse_iterator написать, выдает ошибку и не билдеться.

Здесь уже обычный итератор, замени на EffectorCamVec::iterator.
stalkergoshawk
Цитата(abramcumner @ 23.07.2020, 21:17) *
Здесь уже обычный итератор, замени на EffectorCamVec::iterator.

Спасибо, теперь все заработало
moЦart
Я что-то совсем сломался...
Код
int main (int argc, char** args)
{
    g_temporary_stuff = &trivial_encryptor::decode;
    g_dummy_stuff = &trivial_encryptor::encode;

    Debug._initialize(false);
    Core._initialize("xr_test", NULL, TRUE, "fsgame.ltx");
    
    string_path path;
    FS.update_path(path, "$game_config$", "system.ltx");
    printf ("--\t%s\n", path);

    CInifile* sys = xr_new<CInifile>(path, TRUE);
    CInifile::Root sections = sys->sections();
    printf("%d\n", sections.size());

    Core._destroy();
    return 0;
}

Валится в строке
Код
CInifile::Root sections = sys->sections();

С таким стеком
+
> TestPrj.exe!std::_Iterator_base12::_Adopt(const std::_Container_base12 * _Parent) Line 158 C++
TestPrj.exe!std::_Iterator_base12::operator=(const std::_Iterator_base12 & _Right) Line 129 C++
TestPrj.exe!std::_Iterator_base12::_Iterator_base12(const std::_Iterator_base12 & _Right) Line 121 C++
TestPrj.exe!std::_Iterator012<std::random_access_iterator_tag,CInifile::Sect *,int,CInifile::Sect * const *,CInifile::Sect * const &,std::_Iterator_base12>::_Iterator012<std::random_access_iterator_tag,CInifile::Sect *,int,CInifile::Sect * const *,CInifile::Sect * const &,std::_Iterator_base12>(const std::_Iterator012<std::random_access_iterator_tag,CInifile::Sect *,int,CInifile::Sect * const *,CInifile::Sect * const &,std::_Iterator_base12> & __that) C++
TestPrj.exe!std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > >::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > >(const std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > > & __that) C++
TestPrj.exe!std::_Uninitialized_copy<std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > >,CInifile::Sect * *,std::_Wrap_alloc<xalloc<CInifile::Sect *> > >(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > > _First, std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > > _Last, CInifile::Sect * * _Dest, std::_Wrap_alloc<xalloc<CInifile::Sect *> > & _Al) Line 427 C++
TestPrj.exe!std::vector<CInifile::Sect *,xalloc<CInifile::Sect *> >::_Ucopy<std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > > >(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > > _First, std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<CInifile::Sect *> > > _Last, CInifile::Sect * * _Ptr) Line 1640 C++
TestPrj.exe!std::vector<CInifile::Sect *,xalloc<CInifile::Sect *> >::vector<CInifile::Sect *,xalloc<CInifile::Sect *> >(const std::vector<CInifile::Sect *,xalloc<CInifile::Sect *> > & _Right) Line 725 C++
TestPrj.exe!xr_vector<CInifile::Sect *,xalloc<CInifile::Sect *> >::xr_vector<CInifile::Sect *,xalloc<CInifile::Sect *> >(const xr_vector<CInifile::Sect *,xalloc<CInifile::Sect *> > & __that) C++
TestPrj.exe!main(int argc, char * * args) Line 55 C++
moЦart
Никто не имеет идей?
abramcumner
Цитата(moЦart @ 03.08.2020, 12:28) *
Никто не имеет идей?

Ну, например, testprj и xrCore собраны с разным рантаймами: один с дебажным, другой с релизным.
moЦart
abramcumner, нет. Оба дебажные
cjayho
QUOTE (moЦart @ 03.08.2020, 12:42) *
abramcumner, нет. Оба дебажные


Вы файлик fsgame.ltx не правили? может двигло его распарсить не может?
moЦart
cjayho, нет и, как видите, FS.update_path работает отлично.
cjayho
QUOTE (moЦart @ 03.08.2020, 21:50) *
cjayho, нет и, как видите, FS.update_path работает отлично.


Значит смотрите чего накосячили в xr_new
moЦart
Цитата(cjayho @ 04.08.2020, 11:55) *
Значит смотрите чего накосячили в xr_new

smile.gif ну не дурак я, крашится даже при простом
Код
CInifile sys(path, TRUE);
moЦart
Чёрт, создал простой метод test в CInifile.
Код
void    CInifile::test(){
    for each (Sect* i in DATA){
        Msg("%s\n", i->Name.c_str());
    }
}

оттуда всё работает, магия blink.gif
Код
CInifile sys(path, TRUE);
sys.test();


Может проект надо как-то по особому настраивать? Я просто не силён знаниями по msbuild и cl.
Diesel
xrServerEntities\script_engine_script.cpp

Одна сплошная кака черным:

#ifdef XRGAME_EXPORTS
CRenderDevice *get_device()
{
return (&Device);
}

#endif

#ifdef XRGAME_EXPORTS
function (L, "device", get_device);
#endif


get_device - ни где, кроме этих двух записей нет.
CRenderDevice - используется под дебагом

#ifdef DEBUG
_SHOW_REF("*ref -CRenderDevice::ResetTotal: DeviceREF:",HW.pDevice);
#endif // DEBUG

X:\source_scs602\components\engine\Layers\xrRender\dxRenderDeviceRender.cpp(60): _SHOW_REF("*ref -CRenderDevice::ResetTotal: DeviceREF:",HW.pDevice);
X:\source_scs602\components\engine\Layers\xrRender\dxRenderDeviceRender.cpp(80): _SHOW_REF("*ref +CRenderDevice::ResetTotal: DeviceREF:",HW.pDevice);

Никогда ранее тут компилятор не спотыкался. Нафига ПЫСы это придумали?

Где то в скриптах есть? Придётся выключить. huh.gif


Там половина скриптов на этой фигне держится. Офигеть. laugh.gif
namespace {
function device();
Diesel
extern CRendeDevice Device; - ПЫСЫ приколисты, меня поимели. Они букву r забыли написать.

extern CRenderDevice Device; - а у меня вот так. А надо было без быквы r.

Я голову поломать успел.
Diesel
Всё победил код. Перетащил полсностью кости из ЗП в ЧН.

Осталось еще dx11 и х64 победить.


Еще обратил внимание, что компиль в 2012 визуалке тормозит игру (фпс ужасный). Возможно я при переносе накосячил.
А вот из 2008 визуалки выходит отличный компиль.


А еще странный баг, на ВИН7 видяха греется, а на ВИН10 нормальный процесс, кроме компиля 2012 визуалки.

А на DX10 нормально, а на DX9 тупит в ВИН10.


Короче, что я написал, только такой же как я поймёт. laugh.gif
Diesel
Как сделать так, что бы движок не зависал в меню из-за открытого браузера (Мазила)?

Это на уровне чего происходит завис? Типа xml код виноват?
atanda
Можете подсказать в каком месте в редакторах или в компиляторах билдятся декали?
XinnogeN
Всем доброго вечера! Подскажите пожалуйста, какие основные и дополнительные компоненты при установке VS2019 нужно установить для сборки движка? Заранее благодарен!
JustChiller
Кто-нибудь исправлял ввод с клавиатуры для русской раскладки ? Не удается ввести знак вопроса (DIK_7), точку и запятую (DIK_SLASH) и т.д.
Diesel
Кто хочет доказать теорию, что открытый браузер Мазила, стопорит курсор в меню игры?

Я сегодня ушатал Мазилу и понял в чём дело. Дело в dxgi.dll.
Движок и браузер Мазила используют одновременно одну и туже либу за июнь 2010 года.

Кстати, Мазила ушатывается на dxgi 2009 года.

Доказывайте!
Diesel
Игровая xrGame 1600 отличается малость от 1602, изменённым xrNetServer для сингла.
Решил потешить себя в среде 1600. Хотя на первый взгляд, рендер требует весьма серьёзной переделки.
Если переделать рендер (то смысл вообще от 1600) - это получится 1602.

Еще вариант (кроме DX11) вернуть рендер ЧН уже форсированный под 1602 и с компиляцией шейдеров как в ЧН и 1600.
Diesel
Установил я 2019 год Визуал. Проект ЧНх64 абрамкумнеровский открыл. Мля, что то даже собирается, своим очам не верю. biggrin.gif

Тык, может там xrLC для гипер двигла собрать? laugh.gif

Да ну нафиг: я xrGame собирал в 2008 1ч20мин, а в 2019 минут 20-30. Никавосебе.
Diesel
Наигрался я в 2019, что даже собрать x32 проект свой не могу.

А у Абрама малость баганут проект ЧН x64. Клиент вылетает при применении настроек в меню.
stalkergoshawk
Подскажите для чего в оружейных классах функции: install_upgrade_impl( LPCSTR section, bool test ), install_upgrade_addon( LPCSTR section, bool test ) и подобные, в которых продублированы переменные из класса. Как эти функции работают, и нужно ли в них добавлять, новые переменные, добавленные в класс мною?
Winsor
Цитата(stalkergoshawk @ 31.08.2020, 19:41) *
Подскажите для чего в оружейных классах функции

в ТЧ такого нет. smile.gif
===
Товарищи, меня уже давненько волнует тема "выкладывания" предметов из инвентаря в ТЧ. Адекватно работает только drop активного предмета, и то потому что, если я правильно понял - есть в модели актора соответствующая анимация? В остальных случаях позиция выкладываемого предмета рандомная ("за спиной"). Какие то попытки что-то сделать с этой системой я видел в движке alpet - но очень не понравилась реализация.
Основная проблема, которую я вижу - это нельзя однозначно сказать - выкладывается ли предмет (GE_OWNERSHIP_REJECT) "на улицу" или в сундук (сразу идет GE_OWNERSHIP_TAKE). при наличии однозначного ответа "красиво" переместить предмет - это не сложно.
H_SetParent так же не помогает в данном вопросе.
Кто-то пытался каким то образом исправить этот недочёт?
abramcumner
Цитата(Winsor @ 04.09.2020, 14:56) *
Основная проблема, которую я вижу - это нельзя однозначно сказать - выкладывается ли предмет (GE_OWNERSHIP_REJECT) "на улицу" или в сундук (сразу идет GE_OWNERSHIP_TAKE). при наличии однозначного ответа "красиво" переместить предмет - это не сложно.

Всегда выбрасывай красиво - вот тебе и однозначность.
RayTwitty
Цитата(Winsor @ 04.09.2020, 14:56) *
Основная проблема, которую я вижу - это нельзя однозначно сказать - выкладывается ли предмет (GE_OWNERSHIP_REJECT) "на улицу" или в сундук (сразу идет GE_OWNERSHIP_TAKE). при наличии однозначного ответа "красиво" переместить предмет - это не сложно.

Наверно можно создать глобальную переменную, в которой запоминать айди последнего предмета выкинутого актором, для которого сработал TAKE в inventory_owner. Единственное, тут надо временной лаг учитывать.
Можно еще парента через пару апдейтов проверить.

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

Цитата(abramcumner @ 04.09.2020, 15:36) *
Всегда выбрасывай красиво - вот тебе и однозначность.

Я так понял он хочет телепортировать предмет после выкидывания)) Кстати, возможно действительно, даже если применить set position для предмета находящегося внутри ящика, ничего страшного не произойдет. Но это не точно biggrin.gif
abramcumner
Цитата(RayTwitty @ 04.09.2020, 15:54) *
Я так понял он хочет телепортировать предмет после выкидывания)) Кстати, возможно действительно, даже если применить set position для предмета находящегося внутри ящика, ничего страшного не произойдет. Но это не точно biggrin.gif

Вроде норм работало: на OnItemDrop перемещаешь все подряд перед ГГ, а дальше не важно - уничтожится предмет, во что-то переместится или упадет на землю. Можно и физ. оболочку получить и по небольшой параболе в полет отправить.
Winsor
Цитата(abramcumner @ 04.09.2020, 16:18) *
Вроде норм работало: на OnItemDrop перемещаешь все подряд перед ГГ, а дальше не важно - уничтожится предмет, во что-то переместится или упадет на землю. Можно и физ. оболочку получить и по небольшой параболе в полет отправить.
а после CObject::spatial_register не будет падать если предмет потом в box помещается?
Yara
На счёт редактирования некоторых параметров погоды в игре: сделал через кон.команды (си совсем не знаю, работает криво*)

xrRender_console.cpp

CODE
class CCC_ENV1 : public CCC_Vector3
{
public:
CCC_ENV1(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().CurrentEnv.ambient.set(v);
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};

void xrRender_initconsole ()
...
tw_min.set(0,0,0);
tw_max.set(1,1,1);
CMD4( CCC_ENV1, "env_ambient_color", &ps_env_ambient_color, tw_min, tw_max );


* Работает только в режиме паузы, и при её отключении всё сбрасывается на значения из конфига. Не получилось сделать для clouds_color / hemi_color, ибо там 5/4 параметра.

Буду рад услышать дельные советы как это сделать лучше.


rentgenluch
Yara,
Костыльно можно задать time_factor_game на очень низкое значение, чтобы погода не менялась пока редактируешь
Убедись что ты редактируешь значения g_pGamePersistent->Environment().Current[0].

Например:

Код
g_pGamePersistent->Environment().Current[0]->ambient.x = myvalue;

Yara
Цитата(rentgenluch @ 11.09.2020, 14:40) *
Костыльно можно задать time_factor_game на очень низкое значение, чтобы погода не менялась пока редактируешь
Убедись что ты редактируешь значения g_pGamePersistent->Environment().Current[0].

Например:

Код
g_pGamePersistent->Environment().Current[0]->ambient.x = myvalue;

Вот спасибо, теперь нормально работает, без паузы. Только сделал не ambient.x, а сразу ambient = v; и ещё получилось менять clouds_color / hemi_color. Охх, как же теперь, чёрт возьми, удобно править погоду biggrin.gif
полный код (ТЧ):

xrRender_console.h

CODE

...
extern ECORE_API Fvector ps_env_ambient_color;
extern ECORE_API Fvector ps_env_clouds_color;
extern ECORE_API Fvector ps_env_fog_color;
extern ECORE_API Fvector ps_env_hemi_color;
extern ECORE_API Fvector ps_env_rain_color;
extern ECORE_API Fvector ps_env_sky_color;
extern ECORE_API Fvector ps_env_sun_color;


xrRender_console.cpp

CODE

...
#include "../IGame_Persistent.h"
#include "../Environment.h"
...
// Common
Fvector ps_env_ambient_color = { 0.f, 0.f, 0.f};
Fvector ps_env_clouds_color = { 0.f, 0.f, 0.f};
Fvector ps_env_fog_color = { 0.f, 0.f, 0.f};
Fvector ps_env_hemi_color = { 0.f, 0.f, 0.f};
Fvector ps_env_rain_color = { 0.f, 0.f, 0.f};
Fvector ps_env_sky_color = { 0.f, 0.f, 0.f};
Fvector ps_env_sun_color = { 0.f, 0.f, 0.f};
...
class CCC_ENV1 : public CCC_Vector3
{
public:
CCC_ENV1(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
// old, work only in game pause
//g_pGamePersistent->Environment().CurrentEnv.ambient.set(v);
g_pGamePersistent->Environment().Current[0]->ambient = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
class CCC_ENV2 : public CCC_Vector3
{
public:
CCC_ENV2(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector4 v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->clouds_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
class CCC_ENV3 : public CCC_Vector3
{
public:
CCC_ENV3(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->fog_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
class CCC_ENV4 : public CCC_Vector3
{
public:
CCC_ENV4(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector4 v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->hemi_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
class CCC_ENV5 : public CCC_Vector3
{
public:
CCC_ENV5(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->rain_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
class CCC_ENV6 : public CCC_Vector3
{
public:
CCC_ENV6(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->sky_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
class CCC_ENV7 : public CCC_Vector3
{
public:
CCC_ENV7(LPCSTR N, Fvector* V, const Fvector _min, const Fvector _max) :
CCC_Vector3(N, V, _min, _max) {;}

virtual void Execute (LPCSTR args)
{
Fvector v;
if (3!=sscanf(args,"%f,%f,%f",&v.x,&v.y,&v.z))
InvalidSyntax();
else
{
CCC_Vector3::Execute(args);
if(g_pGamePersistent)
g_pGamePersistent->Environment().Current[0]->sun_color = v;
}
}
virtual void Status (TStatus& S)
{
sprintf_s(S,"%f,%f,%f",value->x,value->y,value->z);
}
virtual void Info (TInfo& I)
{
sprintf_s(I,"vector3 in range [%f,%f,%f]-[%f,%f,%f]",min.x,min.y,min.z,max.x,max.y,max.z);
}

};
...


void xrRender_initconsole()
...

CMD4( CCC_ENV1, "env_ambient_color", &ps_env_ambient_color, tw_min, tw_max );
CMD4( CCC_ENV2, "env_clouds_color", &ps_env_clouds_color, tw_min, tw_max );
CMD4( CCC_ENV3, "env_fog_color", &ps_env_fog_color, tw_min, tw_max );
CMD4( CCC_ENV4, "env_hemi_color", &ps_env_hemi_color, tw_min, tw_max );
CMD4( CCC_ENV5, "env_rain_color", &ps_env_rain_color, tw_min, tw_max );
CMD4( CCC_ENV6, "env_sky_color", &ps_env_sky_color, tw_min, tw_max );
CMD4( CCC_ENV7, "env_sun_color", &ps_env_sun_color, tw_min, tw_max );
...


sergy172
Yara, разжуй пожалуйста, как начать этим пользоваться? Можно ли находясь в игре выбирать нужную секцию нужного конфига и сохранять внесённые изменения?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.