Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Редактирование движка
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
atanda
В отсутствие звука ничего не подскажу, но вроде OpenAL, идущий в комплекте, работает.

А вот по-поводу "щелчков", ты какие библиотеки vorbis используешь? Емнип, те, которые шли в комплекте, имели проблемы. Попробуй использовать последние версии https://www.xiph.org/downloads/

У libogg есть порт на 13 студию, все другие отлично конвертируются.
xrModder
Цитата(RayTwitty @ 14.07.2019, 04:35) *
xrModder, у меня однажды были какие-то проблемы с xrSound, помогло обновление 2010 студии до какого-то сервис-пака. Собирал репо xp-dev от КД (оказалось, что там в инструкции указана точная версия студии).

Студия стоит 2010 + SP1 + патч для SP1. xrSound собирается без проблем.
xrModder
Оказывается причина отсутствия звука из-за неустановленной oalinst.exe.
AndreySol
Если добавить для какого либо класса новую переменную в нет-пакет, то где-нибудь в движке могут проблемы появиться? Т.е., где-нибудь в движке есть прямое использование данных из нет-пакета вне ф-ций net_Import\net_Export, net_Spawn, save\load?
mortan
AndreySol, нужно версию allspawn обновлять, тогда по идее их быть не должно. Я несколько переменных добавлял для оружейки, вроде стабильно работает, проблем не замечал.
AndreySol
Цитата
нужно версию allspawn обновлять
Разве это обязательно? Я уже добавлял новые данные в нет-пакет, но пока только для "конечных" классов(это я имею в виду классы, от которых уже никакие другие не наследуются), и проблем пока нет.
В исходниках я естественно встречал эту тему с версиями all.spawn'а, но пока не очень понятно что это означает в плане конечного использования движка. Может кто, из знающих, просветит на эту тему? Сам я пока это понимаю как-то так: попытка универсального использования all.spawn'а - типа, если кому-то понадобится использовать ресурсы от более старшей версии игры с младшей версией движка, то все, что не подходит по версии будет проигнорировано.
mortan
AndreySol, это больше нужно для сейвов, ведь они по сути почти тот же самый allspawn. Я попадал в ситуацию когда размещённый через сдк на карте объект ( ванильные ресурсы ) грузился неправильно как раз из-за того что не было проверок на версию спавна. Если писать параметры в save/load то проблем быть не должно.
xrModder
Фуххх... Удалось всё таки привести исходники v1.0007rc1 в порядок, исправить ошибки и обновить некоторые компоненты.
Сборка: xrEngine_v1.0007rc1b 'xrCore' build 7469, Jul 19 2019.7z
Позже выложу исходники.
NanoBot-AMK
Какой всетаки придурок делал CWeaponRG6, CWeaponRPG7, CWeaponMagazinedWGrenade т.е гранатомёты. Это очень простые объекты, надо быть совсем идиотом чтобы так накосячить в коде.
Leonardus
Скиньте пожалуйста файлы для Сталкера тень чернобыля, которые добавляют блудмарки(раны на нпс), чтобы оставались они как можно дольше, и появлялись не через раз
Leonardus
И еще как решить данную проблему
Microsoft ® Macro Assembler Version 6.14.8444
Copyright © Microsoft Corp 1981-1997. All rights reserved.

Assembling: src.asm
weather_parameters.asm(94) : error A2070: invalid instruction operands
Microsoft ® Incremental Linker Version 5.12.8078
Copyright © Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1181: cannot open input file "src.obj"
Не удается найти C:\xray\exe\3312_shoc_10006\src.obj
Не удается найти C:\xray\exe\3312_shoc_10006\src.exp
Не удается найти C:\xray\exe\3312_shoc_10006\src.lib
Для продолжения нажмите любую клавишу . . .
пытаюсь собрать измененый эксешник x ray extstension ради блудмарков, но в итоге ничего не выходит(
NanoBot-AMK
Leonardus, видно же что просто пути не установлены, открой батник блокнотом и настрой пути.
Насчёт гранатомётов.
Снаряд надо запускать из метода void FireTrace(const Fvector &P, const Fvector &D) в оригинале этот метод не виртуальный, надо сделать его виртуальным. И уже из указанных классах переопределить, практика показала что это единственный правильный метод чтобы пофиксить многие баги этих классов, стрельбы из пустого РГ-6, стрельбы из заблокированного РПГ-7 и ПГ, многое другое..
RayTwitty
NanoBot-AMK, ты лучше скажи, почему если я делаю для РПГ7 выстрел не из центра камеры, а из кости fire_bone, то у меня ракета улетает вверх куда-то, пролетев метров 50?

По траектории это примерно как на этом графике (нагуглил): https://alcofan.com/wp-content/uploads/2018...ogo-ostatka.png
Leonardus

Пути к masm я настроил, например тот же рендер собирает без ошибок, но конкретно ексешник ни в какую не хочет собирать
v2v3v4
Цитата(RayTwitty @ 21.07.2019, 02:04) *
NanoBot-AMK, ты лучше скажи, почему если я делаю для РПГ7 выстрел не из центра камеры, а из кости fire_bone, то у меня ракета улетает вверх куда-то, пролетев метров 50?

По траектории это примерно как на этом графике (нагуглил): https://alcofan.com/wp-content/uploads/2018...ogo-ostatka.png

Это как? Вот как у меня:
Leonardus
Прошу если кто сможет соберите вот это ексешник тч Нажмите для просмотра прикрепленного файла собрать через xray-extensions мне он нужен для блудмарков, буду очень благодарен
Leonardus
Вообщем все заработало, правда пропатчить ексешник, получилось в итоге только с X-Ray extensions nanobot
xrModder
Перенос оригинальной X-Ray Engine v1.0007rc1 в Visual Studio 2010: Репозиторий xrEngine_vs2010
Изменения:
- Проект перенесен в Visual Studio 2010;
- Обновлен BugTrap и DXSDK;
- Полностью настроенные Debug, Mixed и Release конфигурации;
- Исправлены некоторые ошибки (подробнее);
- Поправлен пути в некоторых исходниках;
- Некоторые папки перемещены для удобства сборки.

Собирается одиночная и мультиплеерная версия движка.
RayTwitty
Цитата(v2v3v4 @ 21.07.2019, 06:27) *
Цитата(RayTwitty @ 21.07.2019, 02:04) *
NanoBot-AMK, ты лучше скажи, почему если я делаю для РПГ7 выстрел не из центра камеры, а из кости fire_bone, то у меня ракета улетает вверх куда-то, пролетев метров 50?

По траектории это примерно как на этом графике (нагуглил): https://alcofan.com/wp-content/uploads/2018...ogo-ostatka.png

Это как? Вот как у меня:


У меня ТЧ, ракета летит куда зря после того, как я поправил следующий кусок:
функция CActor::g_fireParams
было (летит из позиции камеры по направлению взгляда)
Код
fire_pos        = Cameras().Pos();
fire_dir        = Cameras().Dir();

я сделал:
Код
Fvector cam_pos = Cameras().Pos();
Fvector cam_dir = Cameras().Dir();

float dist = HUD().GetCurrentRayQuery().range;
Fvector target_pos = cam_pos.mad(cam_dir, dist);
fire_dir.set(target_pos.sub(fire_pos));

Летит из fire_bone в точку куда направлена камера.

Баг есть только у РПГ7, с РГ6 и т.д. всё в порядке.
NanoBot-AMK
Сделал ракету осветительную для ХЕ, на основе движковой, занятно, когда непыси в страхе разбегаются от ракеты, т.к. думают что она взорвётся, хотя я выключил способность взрываться от контакта с чем либо, и по таймеру. Да, ещё пришлось хорошо класс CWeaponRG6 полечить, но ещё много чего надо сделать, так что релиз потом. Ну да, код продублирован с исходниками С++, если что. Какие преимущества перед скриптовым решением, хит зачисляется от стрелка, так что без наказано убивать нейтралов и друзей не получится. Занятно решил вопроса парашюта, да там парашют есть, задаём время когда откроется, и когда это время настало, задаём сопротивления воздуха, тут я интересно решил, задаём параметр снижения на парашюте, и метод рассчитывает коэффициент трения, такое, какое задаёт нужное снижение.
Да, ещё много чего надо для оружейки сделать.


RayTwitty, у тебя что-то не то с РПГ7, ракета же правильно вылетает, но потом вверх срывается.
RayTwitty
Цитата(NanoBot-AMK @ 21.07.2019, 20:54) *
у тебя что-то не то с РПГ7, ракета же правильно вылетает, но потом вверх срывается.

Модель/физику/ракету не трогал вообще. Спецэффект наблюдается только если не сделать fire_pos = Cameras().Pos();
Попробуй закомментировать.
NanoBot-AMK
У меня такой код.
Код
void CActor::g_fireParams    (const CHudItem* pHudItem, Fvector &fire_pos, Fvector &fire_dir)
{
    fire_pos        = Cameras().Pos();
    fire_dir        = Cameras().Dir();

    const CMissile    *pMissile = smart_cast <const CMissile*> (pHudItem);
    CWeaponMagazined*    wpn = smart_cast<CWeaponMagazined*>(pHudItem->item().cast_weapon());
    if (pMissile){
        Fvector offset;
        XFORM().transform_dir(offset, m_vMissileOffset);
        fire_pos.add(offset);
    }else if(wpn){
        fire_pos.set(wpn->get_LastFP());
        if(active_cam()==eacFreeLook)
            fire_dir.set(wpn->get_LastFD());
        else{
            Fvector        pos;
            pos.mad(Device.vCameraPosition, Device.vCameraDirection, HUD().GetCurrentRayQuery().range);    //точка куда стреляем
            fire_dir.sub(pos, fire_pos).normalize();
        }
        fire_pos.mad(fire_dir, -1.0f);    //для того чтобы пули не летели через стену.
    }
}

Код пока не полностью доделан, т.к. пули иногда улетаю за стену.
RayTwitty
Цитата(NanoBot-AMK @ 21.07.2019, 23:15) *
У меня такой код.

РПГ с ним работает?
Дописал у себя:
Код
CWeaponMagazined*    wpn = smart_cast<CWeaponMagazined*>(pHudItem->item().cast_weapon());
fire_pos.set(wpn->get_LastFP());

но эффекта никакого не дало.

upd: Скопипастил функцию целиком, заряд стал лететь нормально. Буду ковырять, спасибо.

upd2: Дело было здесь:
заменил
Код
fire_dir.set(target_pos.sub(fire_pos));
на
Код
fire_dir.sub(target_pos, fire_pos).normalize();

и всё сразу полетело как надо. Похоже, нужно было нормализовать вектор.
xrModder
[SoC]
() KRoddin [Архивная ценность]
() OP Engine (Winsor)

Это репозитории удалены ohmy.gif
RayTwitty
Вопрос по поводу экспорта функций в скрипты.
В оригинальном ТЧ есть функция разрядки магазина оружия:
Код
xr_3da/xrGame/script_game_object.h

void UnloadMagazine();

Я добавил новый аргумент и задал его значение по умолчанию в прототипе функции:
Код
void UnloadMagazine(bool spawn_ammo = true);

экспорт функции оставил старым:
Код
xr_3da/xrGame/script_game_object_script3.cpp

class_<CScriptGameObject> &script_register_game_object2(class_<CScriptGameObject> &instance)
{
    instance
...
.def("unload_magazine", &CScriptGameObject::UnloadMagazine)

Так вот, дефолтное значение параметра не работает, т.е. если я вызываю в скрипте:
Код
obj:unload_magazine()

То spawn_ammo автоматом становится false (хотя скорее всего, там наверно мусор). Попробовал другие функции с аналогичной ситуацией - тоже самое, не работает.

В луабинде эта фича с дефолтными значениями не работает как я понимаю?
abramcumner
Цитата(RayTwitty @ 22.07.2019, 23:01) *
В луабинде эта фича с дефолтными значениями не работает как я понимаю?

Да, естественно не работает.

Можно экспортировать в луа unload_magazine без параметров, в ней вызвать UnloadMagazine(true).
Типа такого: https://forums.ogre3d.org/viewtopic.php?t=31250

Можно попробовать состряпать свое policy, чтобы при экспорте функции можно было указать значения по умолчанию.
Xottab_DUTY
Цитата(RayTwitty @ 23.07.2019, 01:01) *
В луабинде эта фича с дефолтными значениями не работает как я понимаю?

Эта фича не может работать, потому что C++ не предоставляет средств для определения дефолтных значений. Соответственно, луабинд никак не может определить дефолтный аргумент, чтобы неявно и автоматически сгенерировать перегрузку. Но, если в каком стандарте C++ таки появилось что-то для решения этой проблемы, то поправьте меня, буду рад))

Для обычных функций GSC создавали несколько отдельных функций и экспортировали их как перегрузки:

CODE
spawn(LPCSTR stroka, u32 count = 0, CObject* wKogoSpawnitb = nullptr);

...

alife_spawn (LPCSTR stroka) { spawn(stroka); }
alife_spawn2 (LPCSTR stroka, u32 count) { spawn(stroka, count); }
alife_spawn3 (LPCSTR stroka, u32 count, CObject* wKogoSpawnitb) { spawn(stroka, count, wKogoSpawnitb); }

...

module(L)
[
def("alife_spawn", &alife_spawn),
def("alife_spawn", &alife_spawn2),
def("alife_spawn", &alife_spawn3)
]

Для функций-членов тоже есть примеры прямо в движке. Ну и abramcumner уже скинул ссылку на форум Ogre, там тоже есть.

Цитата(abramcumner @ 23.07.2019, 04:17) *
Можно попробовать состряпать свое policy, чтобы при экспорте функции можно было указать значения по умолчанию.

Неплохое решение. Должно укоротить код, который придётся писать для экспорта.
Alex Ros
Здрасьте. А в чем принципиальная разница OpenXRay и OxygenXRay?
Xottab_DUTY
Нету такого проекта OxygenXRay, есть X-Ray Oxygen (с дефисом, с пробелом, не слитно)

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


В OpenXRay нововвдения сильно ограничены, дабы сохранить максимальную совместимость с оригинальной игрой. Более того, мы даже сделали делаем ЧН и ТЧ, чтобы можно было запустить все три игры на нашем движке без каких-либо изменений ресурсов.
SkyLoader
Цитата(Alex Ros @ 23.07.2019, 17:33) *
Здрасьте. А в чем принципиальная разница OpenXRay и OxygenXRay?

Первый проект предназначен для модмейкеров и ориентирован на создание модов на этом движке. Второй же проект взял курс на создание полноценных игр на этом движке и всё меньше поддерживает создание модов на сталкер.
Alex Ros
А что за "полноценных игр"? В смысле типа такого тотал-ультра-конверсия на движке?
SkyLoader
Цитата(Alex Ros @ 23.07.2019, 18:31) *
А что за "полноценных игр"?

Если не ошибаюсь, хотят, чтобы в будущем любые разработчики игр могли использовать их версию движка для создания своих игр. Забавно, конечно, звучит, но что поделать, это их дело.
RayTwitty
Цитата(abramcumner @ 23.07.2019, 02:17) *
Можно экспортировать в луа unload_magazine без параметров, в ней вызвать UnloadMagazine(true).
Цитата(Xottab_DUTY @ 23.07.2019, 12:12) *
Для обычных функций GSC создавали несколько отдельных функций и экспортировали их как перегрузки:

Да, про перегрузки я не подумал, они как раз подойдут. Спс))
xrModder
Нужен коммит по возвращению тени актёра в R2 ТЧ. Кто знает поделитесь пожалуйста!
XR_CPU_PIPE.DLL
del
xrModder
XR_CPU_PIPE.DLL, можешь посмотреть у меня в github уже настроенный и исправленный проект v1.0007rc1, правда собирается на vs2010.
XR_CPU_PIPE.DLL
Цитата
собирается на vs2010

ладно пасеба буду обновляться
тока там диски типа S:\ и X:\ надо создавать?
xrModder
Цитата(XR_CPU_PIPE.DLL @ 25.07.2019, 13:16) *
Цитата
собирается на vs2010

ладно пасеба буду обновляться
тока там диски типа S:\ и X:\ надо создавать?

Нет
XR_CPU_PIPE.DLL
кто то пытался собрать исходники лост альфы?
XR_CPU_PIPE.DLL
опять же
я юзал версию xrModder'a тч 1.0007(rc1)
и оно валиться с логом:
Код
* Detected CPU: GenuineIntel Pentium-II, F6/M5/S1, 1696.00 mhz, 25-clk 'rdtsc'
* CPU Features: RDTSC, MMX, SSE, SSE2

Initializing File System...
using fs-ltx fsgame.ltx
FS: 28624 files cached, 4592Kb memory used.
Init FileSystem 1.241836 sec
'xrCore' build 7469, Jul 19 2019

Initializing Engine...
Executing config-script "user.ltx"...
[d:\s.t.a.l.k.e.r. - shadow of chernobyl\userdata\user.ltx] successfully loaded.
Starting INPUT device...
Loading DLL: xrRender_R2.dll
Loading DLL: xrGame.dll
! Unable to find Software\GSC Game World\STALKER-SHOC\ in registry
* [win32]: free[4079104 K], reserved[48108 K], committed[67028 K]
* [ D3D ]: textures[0 K]
* [x-ray]: crt heap[6437 K], process heap[677 K], game lua[0 K], engine lua[0 K], render[0 K]
* [x-ray]: economy: strings[1032 K], smem[0 K]
Executing config-script "d:\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\config\default_controls.ltx"...
! cant convert dik_name for dik[16], prop=[
! cant convert dik_name for dik[17], prop=[
! cant convert dik_name for dik[18], prop=[
! cant convert dik_name for dik[19], prop=[
! cant convert dik_name for dik[20], prop=[
! cant convert dik_name for dik[21], prop=[
! cant convert dik_name for dik[22], prop=[
! cant convert dik_name for dik[23], prop=[
! cant convert dik_name for dik[24], prop=[
! cant convert dik_name for dik[25], prop=[
! cant convert dik_name for dik[26], prop=[
! cant convert dik_name for dik[27], prop=[
! cant convert dik_name for dik[30], prop=[
! cant convert dik_name for dik[31], prop=[
! cant convert dik_name for dik[32], prop=[
! cant convert dik_name for dik[33], prop=[
! cant convert dik_name for dik[34], prop=[
! cant convert dik_name for dik[35], prop=[
! cant convert dik_name for dik[36], prop=[
! cant convert dik_name for dik[37], prop=[
! cant convert dik_name for dik[38], prop=[
! cant convert dik_name for dik[39], prop=[
! cant convert dik_name for dik[40], prop=[
! cant convert dik_name for dik[41], prop=[
! cant convert dik_name for dik[44], prop=[
! cant convert dik_name for dik[45], prop=[
! cant convert dik_name for dik[46], prop=[
! cant convert dik_name for dik[47], prop=[
! cant convert dik_name for dik[48], prop=[
! cant convert dik_name for dik[49], prop=[
! cant convert dik_name for dik[50], prop=[
! cant convert dik_name for dik[51], prop=[
! cant convert dik_name for dik[52], prop=[
! cant convert dik_name for dik[144], prop=[
[d:\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\config\default_controls.ltx] successfully loaded.
Executing config-script "user.ltx"...
Executing config-script "d:\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\config\rspec_extreme.ltx"...
! Unknown command:  r__dtex_range
! Unknown command:  r__ssa_glod_end
! Unknown command:  r__ssa_glod_start
! Unknown command:  r__wallmark_ttl
! Unknown command:  rs_detail
! Unknown command:  rs_skeleton_update
! Unknown command:  vid_bpp
[d:\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\config\rspec_extreme.ltx] successfully loaded.
Executing config-script "d:\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\config\default_controls.ltx"...
[d:\s.t.a.l.k.e.r. - shadow of chernobyl\gamedata\config\default_controls.ltx] successfully loaded.
! Unknown command:  sv_statistic_save_auto
[d:\s.t.a.l.k.e.r. - shadow of chernobyl\userdata\user.ltx] successfully loaded.
SOUND: OpenAL: enumerate devices...
SOUND: OpenAL: EnumerationExtension Present
devices Generic Software
SOUND: OpenAL: system  default SndDevice name is Generic Software
SOUND: OpenAL: All available devices:
1. Generic Software, Spec Version 1.1 (default)
SOUND: OpenAL: SelectBestDevice is Generic Software 1.1
SOUND: OpenAL: Required device: Generic Software. Created device: Generic Software.
* sound: EAX 2.0 extension: absent
* sound: EAX 2.0 deferred: absent
* sound : cache: 65538 kb, 7609 lines, 8820 bpl
Starting RENDER device...
* GPU [vendor:8086]-[device:A16]: Intel(R) HD Graphics Family
* GPU driver: 10.18.10.3740
* CREATE: DeviceREF: 1
* Vertex Processor: PURE HARDWARE
*     Texture memory: 1690 M
*          DDI-level: 9.0
* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)
* GPU vertex cache: recognized, 32
* DVB created: 1536K
* DIB created: 512K
! Version conflict in shader 'def_shaders\def_aref'
! Version conflict in shader 'def_shaders\def_aref_v'
! Version conflict in shader 'def_shaders\def_trans'
! Version conflict in shader 'def_shaders\def_trans_v'
! Version conflict in shader 'def_shaders\def_trans_v_tuchi'
! Version conflict in shader 'def_shaders\lod_old'
! Renderer doesn't support blender 'effects\shadow_world'
! Version conflict in shader 'effects\watertest-1'
count of .thm files=1
load time=64 ms
* NULLRT supported
* ...and used
* HWDST/PCF supported and used
- r__tf_aniso 16
- r2_tf_mipbias 0.
Starting engine...
Loading DLL: xrGameSpy.dll

FATAL ERROR

[error]Expression    : xml_doc.NavigateToNode(path,index)
[error]Function      : CUIXmlInit::InitStatic
[error]File          : ui\UIXmlInit.cpp
[error]Line          : 172
[error]Description   : XML node not found
[error]Arguments     : msg_box_kicked_by_server:picture


stack trace:

0023:6C2A854A xrCore.dll, xrDebug::fail()
0023:6BC52CC4 xrGame.dll
0023:6BC782E2 xrGame.dll
0023:6BD87A77 xrGame.dll, xrFactory_Create()
0023:008EC7F5 xrEngine.exe, CApplication::OnEvent()
AndreySol
XR_CPU_PIPE.DLL, ну так написано же: XML node not found, не найдено "msg_box_kicked_by_server:picture". У тебя в конфигах, похоже, вырезано что-то касающееся мультиплеера. Или добавь из оригинальных в свои, или используй оригинальные конфиги.
XR_CPU_PIPE.DLL
эврика
ну не фига се
чтоб я без вас делал biggrin.gif
cjayho
QUOTE (XR_CPU_PIPE.DLL @ 25.07.2019, 10:34) *
кто то пытался собрать исходники лост альфы?


Я пытался. И даже получалось ( я разработчик лостальфы biggrin.gif )
XR_CPU_PIPE.DLL
2013 студию юзал?
хотя по .sln файлу видно
cjayho
QUOTE (XR_CPU_PIPE.DLL @ 25.07.2019, 13:42) *
2013 студию юзал?
хотя по .sln файлу видно


ну так к чему такие вопросы? smile.gif
XR_CPU_PIPE.DLL
это был риторический вопрос
RayTwitty
В оригинальном ТЧ (а может и в ЧН/ЗП) есть баг со скрытием оружия.
Есть вызываем скриптовый метод db.actor:hide_weapon() то оружие исчезает сразу, не отыгрывая анимацию holster (hide). При этом, если скрыть оружие кнопкой на клавиатуре (например, для слота автоматов это кнопка 3), то оружие скрывается нормально, отыгрывая анимацию.

Долго ковыряв стек вызовов, решил сравнить, что происходит при скрытии оружия кнопкой. Сравнил стек функции CInventory::Activate и понял, что он абсолютно идентичен что при скрытии кнопкой, так и при скрытии через скрипт. Постепенно стал идти по стеку вызова функций и нашел место, где происходит разное поведение:
Если скрыть оружие таким образом
Код
pActor->inventory().SetSlotsBlocked(u16(INV_STATE_BLOCK_ALL), true);
то все ОК.
А вот если вызвать
Код
pActor->SetWeaponHideState(INV_STATE_BLOCK_ALL, true);
то оружие исчезнет сразу.

Но самое интересное, что SetWeaponHideState делает почти тоже самое, только вызов идет пересылками через пакет:
Код
void CActor::SetWeaponHideState (u32 State, bool bSet)
{
    if (g_Alive() && this == Level().CurrentControlEntity())
    {
        NET_Packet    P;
        u_EventGen    (P, GEG_PLAYER_WEAPON_HIDE_STATE, ID());
        P.w_u32        (State);
        P.w_u8        (u8(bSet));
        u_EventSend    (P);
    };
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void CActor::OnEvent(NET_Packet& P, u16 type)
{
...
case GEG_PLAYER_WEAPON_HIDE_STATE:
        {
            u32 State        = P.r_u32();
            BOOL    Set        = !!P.r_u8();
            inventory().SetSlotsBlocked    ((u16)State, !!Set);
        }break;
...
}

Спрашивается, в чем тут магия и почему разное поведение?

Попутно, заметил еще кое-что:
1) Болт скрывается с анимацией и по кнопке, и по скрипту. Но это происходит скорее всего из-за того, что для него не вызывается CHudItem::Deactivate() в родительских классах, в котором в свою очередь вызывается OnHiddenItem(), который херит всю малину (сразу переключает стейт на hidden)
2) Оружие при скрытии скриптом, похоже скрывается не до конца, а убирается из рендера, так как звук скрытия и стейт Hide отыгрывается.

Короче, какая-то странная дичь z_crazy.gif
XR_CPU_PIPE.DLL
А чему то удивляться
Это же ПЫС smile.gif
cjayho
QUOTE (RayTwitty @ 25.07.2019, 18:58) *
pActor->inventory().SetSlotsBlocked(u16(INV_STATE_BLOCK_ALL), true);

pActor->SetWeaponHideState(INV_STATE_BLOCK_ALL, true);

Короче, какая-то странная дичь z_crazy.gif


чисто поржать попробуй применить function-style cast на u32 в нижнем коде biggrin.gif
RayTwitty
Поставил вывод в лог на входе и на выходе:
Код
// посылаем сообщение
void CActor::SetWeaponHideState (u32 State, bool bSet)
{
    if (g_Alive() && this == Level().CurrentControlEntity())
    {
        Msg("CActor::SetWeaponHideState State = %d, (u16)State = %d, u8(bSet) = %d", State, (u16)State, u8(bSet));
        
        NET_Packet    P;
        u_EventGen    (P, GEG_PLAYER_WEAPON_HIDE_STATE, ID());
        P.w_u32        (State);
        P.w_u8        (u8(bSet));
        u_EventSend    (P);
        
    };
}
// принимаем сообщение
void CActor::OnEvent        (NET_Packet& P, u16 type)
{
...
    case GEG_PLAYER_WEAPON_HIDE_STATE:
        {
            u32 State        = P.r_u32();
            u8    Set        = P.r_u8();

            Msg("GEG_PLAYER_WEAPON_HIDE_STATE State = %d, (u16)State = %d, Set = %d", State, (u16)State, Set);
            inventory().SetSlotsBlocked    ((u16)State, !!Set);
        }break;
...
}

Результат вызова:
Код
Lua:
db.actor:hide_weapon()

исходники:
u32    INV_STATE_BLOCK_ALL        = 0xffffffff;
Actor()->SetWeaponHideState(INV_STATE_BLOCK_ALL,true);


Код
CActor::SetWeaponHideState State = -1, (u16)State = 65535, u8(bSet) = 1
GEG_PLAYER_WEAPON_HIDE_STATE State = -1, (u16)State = 65535, Set = 1

т.е. как можно видеть, результаты одинаковые.

---------------------------------------------------------------------
в качестве временного решения, решил вызывать скрытие оружие напрямую, без нет_пакета. С таким кодом, оно скрывается нормально, с анимацией.
Код
void CActor::SetWeaponHideState (u32 State, bool bSet)
{
    if (g_Alive() && this == Level().CurrentControlEntity())
    {
        inventory().SetSlotsBlocked(u16(State), bSet);
        
/*
        NET_Packet    P;
        u_EventGen    (P, GEG_PLAYER_WEAPON_HIDE_STATE, ID());
        P.w_u32        (State);
        P.w_u8        (u8(bSet));
        u_EventSend    (P);
*/
    };
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.