Stat overall size ( ALL )
Как пофиксить моргание монстров на движущихся платформах
Как пофиксить моргание монстров
Как пофиксить моргание монстров на движущихся платформах
Following translations are available : |
russian |
Наверное все, кто хоть раз пытался поставить монстра на какой-нибудь лифт или
поезд сталкивались с пренеприятнейшим явлением - монстр начинал моргать и дергаться.
Данный глюк пришел к нам из хл 1.1.0.0 и так и не был пофикшен до настоящего времени.
Частично его устранили в спирите - в лифтах монстр ПОЧТИ не дергается, хотя на поездах
продолжает моргать как ни в чем не бывало. Я не берусь точно установить причины этого
глюка - возможно, что это как-то связано с переносом рендерера в клиент из движка.
Итак вот мой путь решения данной проблемы (после фикса монстры абсолютно перестают моргать
на любых движущихся поверхностях). Мое решение заключается в том, что когда монстр стоит
на месте интерполяция для него отключена. Однако легко сказть - отключить интерполяцию,
когда монстр стоит на месте - на самом деле четкого критерия тут нету. Так например есть
монстры, у которых pev→velocity всегда равна нулю и не зависит от скорости монстра.
К тому же монстры могу еще поворачиваться, ускорение у них везде задается по разному
и.т.д. Я подумал, что лучше всего использовать соответствующий флаг в самой анимации -
флаг STUDIO_LX. Данный флаг есть в любой анимации движения обычного монстра, однако
летающие монстры ее не используют, правда и на платформах они тоже не ездят
(предствьте себе например алиен_контроллера на поезде). Однако ближе к делу.
У летающих монстров есть флаг FL_FLY который и послужит нам критерием.
Кстати незабудьте проставить его у нихиланта - у него данный флаг почему-то отстутствует.
Найдте void CNihilanth :: Spawn( void ) и добавьте еще один флаг в pev→flags
pev->flags |= FL_MONSTER | FL_FLY;
Я не проверял каждого монстра в отдельности, но если вы увидете, что к примеру ихитозавр
или там monster_leesh двигаются дерганно - просто поставьте им этот флаг и все пройдет.
Теперь собственно сам код. Откройте client.cpp и найдите функцию int AddToFullPack.
Замените в ней вот этот код
if ( !player &&
ent->v.animtime &&
ent->v.velocity[ 0 ] == 0 &&
ent->v.velocity[ 1 ] == 0 &&
ent->v.velocity[ 2 ] == 0 )
{
state->eflags |= EFLAG_SLERP;
}
if(ent->v.flags & FL_FLY )
state->eflags |= EFLAG_SLERP;
else state->eflags &= ~EFLAG_SLERP;
Таким образом мы сообщим клиенту, что данная энтитя летающая и для нее нужно включить интерполяцию
Переходим на клиент. Откроем файл StudioModelRenderer.cpp и найдем в нем функцию StudioSetUpTransform.
Сначала нам надо получить доступ к флагам модели в анимции. Для этого создадим новую перменную.
Прокрутите код до условия if (m_pCurrentEntity→curstate.movetype == MOVETYPE_STEP)
и чуть ниже добавьте новую переменную:
if (m_pCurrentEntity->curstate.movetype ==MOVETYPE_STEP)
{
float f = 0;
float d;
mstudioseqdesc_t *pseqdesc;//acess to studio flags
pseqdesc = (mstudioseqdesc_t *)((byte *)m_pStudioHeader
+ m_pStudioHeader->seqindex) + m_pCurrentEntity->curstate.
sequence;
Теперь спуститесь ниже, до первого цикла с оригинами и замените его на вот такое условие.
if (pseqdesc->motiontype & STUDIO_LX || m_pCurrentEntity->curstate.eflags & EFLAG_SLERP)
for (i = 0; i < 3; i++) modelpos[i] += (m_pCurrentEntity->origin[i] -
m_pCurrentEntity->latched.prevorigin[i]) * f;
Собственно говоря это и есть отключение интерполяции по оригину. Если монстр не двигается - значит
интерполяция отключена.
Similar 1. Создание нового оружия - В этом туторе не будет объяснено КАК сделать новое оружие, ибо для каждого оружия нужен свой код. Здесь просто будет приведена информация о тех нюансах без которых ваше оружие не будет работать 2. Фикс: func_healthcharger - Фикс: func_healthcharger и func_recharger 3. Цвет HUD - Цвет HUD 4. Больше слотов и позиций для оружия - Больше слотов и позиций для оружия 5. Наследование классов в С++ - В этом туторе я попытаюсь кратко рассказать про наследование классов в С++ 6. Неработающие двери :) - Как сделать, чтоб двери не открывались, когда нет света и рядом с ними был индикатор (красн. зел.) 7. Создание сценариев - Для создания сценариев (aka скриптов) в Half-Life существуют две энтити: scripted_sequence и scripted_sentence. Первая отвечает за движения, выполняемые монстром/персонажем, будь то ходьба, бег, нажатие кнопки, тряска автомата с газировкой или почёсывание подбородка. Вторая служит для того, чтобы персонаж произнес какую-то фразу. При этом его голова повернётся в сторону слушателя, и рот будет открываться в соответствии с амплитудой звука.
gabataka 08/24/2021, 8:15:23 AM commented :
#1 куда ? "Теперь спуститесь ниже, до первого цикла с оригинами и замените его на вот такое условие."
You cannot comment, because you are not logged-in.