Нифга не получается. Ни портированный код с клиентки не фурычит, не перенесённый из ксаша. Причём под ксашем игра умудряется ещё и вылетать при обращении к pEdict. В исходниках движка ДМ оставил комментарий: Warning, pEdict is unused. Под GoldSRC не вылетает, но хитбоксы всё равно на полкарты. ЧЯДНТ?
Ну почему у дяди Мишы всё прекрасно получается несколько раз и туда и обратно и бамп выдернули и на место вставили, а вы, толпой в пять человек уже четвертый год не можете решить ПРОСТЕЙШУЮ ПРОБЛЕМУ, почему, я не понимаю? Вам неприятно понимать что вы делаете? Вам интереснее тыкать наугад, пока не повезет или что?
Вроде же всё как надо делаю. Есть SV_StudioSetupBones с выкинутыми интерполяцией между анимациями и проигрыванием гейт-секвенций. Из неё вызываются ещё функции, они тоже есть. Studio Header я задаю прямо в теле SV_StudioSetupBones. bonetransform и rotationmatrix беру из движка, как и на клиенте делается. blending тоже из движка, его на сервере считать не надо. (Для стандартного халфовского блендинга).
engine\common\mod_studio.c - готовая рабочая реализация на классический халфовский блендинг. Для начала перенеси в игровую библиотеку её. А потом расширь до 9-way.
Я уже молчал-молчал, думал догадаются. Но куда там! В стену головой долбится куда интереснее.
По аналогии с клиентом сделал. Ну если нет документации, как я узнаю, что нужен ещё один таинственный вызов таинственной функции откуда-нибудь из кода серверной дллки? Я StudioPlayerBlend на сервере не делал. Ну он же не повлияет на хитбоксы? Он ведь за наклоны игрока отвечает.
marikcool писал: ты параметры у себя в SV_StudioSetupBones местами поменял?
После того как поменял, начало вылетать и под Goldsrc при обращении к pEdict.
Добавлено 16-12-2012 в 02:44:
Цитата:
Дядя Миша писал: Для начала перенеси в игровую библиотеку её.
Переносится без проблем, только не работает. То ли дело в неправильных аргументах SV_StudioSetupBones, то ли в том, что вместо float'ов в ксашдвижке используется matrix3x4.
Простите, что поднимаю старую тему. Но несколько дней возни терять зря не хочется. На меня в последние дни что-то нашло, и я сделал ответную часть StudioSetupBones для 9-way blending'а на сервере. Благо, у нас теперь есть хоть какие-то исходники контр-страйка, и в них можно кое-что подглядеть
Ошибка была в том, что для 9-way нужен, как бы это сказать, более продвинутый рассчёт угла поворота игрока по YAW. На данный момент всё работает, но не очень точно. То есть хитбоксы располагаются правильно и меняют положение в зависимости от направления взгляда игрока, только серверная часть не совсем совпадает с клиентской. Скорее всего, дело в каких-то переменных на серверной стороне. Я в подробности не вдавался и не сравнивал. Как бы то ни было, есть база для дальнейшей работы.
В туторы не пишу, потому что это не тутор, а копипаста.
Шаг первый: клиентская сторона.
Тырим код отсюдова, адаптируем код из исходников сервера контры (я делал так, но решил, что лучше перенести с клиента на сервер, а не наоборот), или пишем свой. Компилим клиент, подменяем player.mdl и нужную модельку игрока, корректируем анимации - вуаля! На клиенте у нас есть всё, что нужно.
Кто разобрался с клиентской частью, тот поймёт, что здесь для чего. Далее открываем player.h и добавляем в класс игрока заголовки новых функций и новые переменные:
C++ Source Code:
1
void StudioProcessGait( void );
2
void StudioEstimateGait( void );
3
void CalculateYawBlend( void );
4
void CalculatePitchBlend( void );
5
6
float m_flYaw;
7
float m_flPitch;
8
float m_flGaitMovement;
9
float m_flGaitframe;
10
float m_flGaityaw;
11
float m_flYawModifier;
12
int m_iGaitsequence;
13
vec3_t m_prevgaitorigin;
Компилим, если без ошибок - всё сделали правильно. Теперь находим в player.cpp функцию void CBasePlayer::PostThink() и в самый её низ вставляем:
C++ Source Code:
m_iGaitsequence = pev->gaitsequence;
StudioProcessGait();
Надо же откуда-то вызывать все эти новые рассчёты, верно?
Далее, идём в функцию Spawn игрока, она находится ниже. В самое её начало засовываем:
C++ Source Code:
m_flGaitMovement = 0;
m_flGaitframe = 0;
m_flGaityaw = 0;
m_iGaitsequence = 0;
m_prevgaitorigin = Vector(0, 0, 0);
Чтобы новые переменные обнулялись при спавне. Компилим. Без ошибок - молодцы!
Шаг третий: серверная сторона. Собственно, ответная часть блендинга.
Сразу скажу, что на правильность работы этот код не претендует, т.к. я только-только начал более или менее разбираться в механизме работы студиомодельрендерера. Но, судя по моим нескольким тестам, он работает, хоть и не совсем точно.
Открываем animation.cpp (да, копипастить удобнее в него, потому что почти всё нужные заголовки уже подключены), в самый низ вставляем вот этот код:
Их можно без изменений упереть из клиентской части.
А теперь очередь функций настройки костей. В чистом виде с клиента их не перенесёшь, нужна модификация. Но можно взять из ксашдвижка, что я и сделал. Вставляем ниже:
Ну вы поглядите на него! Вроде опытный учаснег, а всю ветку каким-то говно-кодом заспамил. Ребяты, так не годится. Если ты пишешь тутор, значит к каждому кусочку кода делай пояснение что это и зачем. Но ты этого сделать не в состоянии, поскольку и сам толком не понимаешь, как это работает. Значит бери и клади в аттач, всё равно оттуда удобнее копировать, чем эти простыни из постов.
Добавлено 23-01-2014 в 19:43:
Поглядел код. Ну навскидку - лерпинг надо убрать к чертям, на сервере он не нужен. И самое главное - pEdict всё-таки последний аргумент или iBone? Кто кого обманывает? Valve или maricool?
Дядя Миша я же написал, что это пока не тутор. Я понял, как работает StudioSetupBones, а в остальную прочую математику не вдавался, потому что со школы её терпеть не могу. Лерпинг вырежу, когда оформлю в виде тутора. Тогда кстати, сможешь затереть эти два моих поста. Ну или оставить в назидание другим, как хочешь. Я кстати разобрался, почему хитбоксы на сервере не совпадали с клиентскими и уже это поправил.
Цитата:
Дядя Миша писал: И самое главное - pEdict всё-таки последний аргумент или iBone? Кто кого обманывает? Valve или maricool?
Когда аргументы располагаются как у Valve, то всё работает. Стоит поменять местами - вылетает под голдсорсом. Под ксашем наоборот, но началось это после того, как ты поменял аргументы местами в движке. А вообще, эдикт приходит верный, иначе yaw/pitch игрока невозможно было бы получить. И ещё - я делал в новом СДК, что в репозитарии валяется, не думаю, что Valve оставили бы код с такой ошибкой, учитывая, что там кусок контры в виде ботов имеется.