Sidebar

Туториал: фиксим медленный поворот монстров при больших значениях фпс

Aynekko

Маппер
07.06.2010
3 459
27
  • Золотая медаль RC
  • Бронзовая медаль 216
Все мы знаем, что когда фпс выше ~60-80, начинаются проблемы с монстрами. Они мееееееедленно поворачиваются и только потом выполняют свои действия. Этот тутор пофиксит это и при любом фпс, хоть 60, хоть 1000 - монстры будут поворачиваться одинаково.

Сразу говорю, что код не мой - нашел на github в разделе Half-Life. Автор кода - https://github.com/Solokiller
Там код написан отрывками и никакого тутора там не было, автор лишь пишет строчки, которыми он оперировал.
Я кое-как с ними разобрался и получил результат. Поэтому вот тутор, как пошагово этот код добавить в ваш мод, easy and simple. Справится даже тот, кто не шарит в программировании - даю гарантию лично от себя :tooth:

Находим на сервере файл monsters.cpp. В нем ищем функцию:
Код:
float CBaseMonster::ChangeYaw ( int yawSpeed )
После этой строчки собственно идет весь код этой функции. Как нетрудно догадаться по названию, эта функция и отвечает за поворот монстров. Мы ее удаляем целиком (но лучше копируем в безопасное место на всякий или закомментируем) и меняем на эту функцию:
Код:
float CBaseMonster::ChangeYaw ( int yawSpeed )
{
    float    ideal, current, move, speed;
    Vector    angles = GetAbsAngles();

    current = UTIL_AngleMod( angles.y );
    ideal = pev->ideal_yaw;
    if (current != ideal)
    {
        float delta = gpGlobals->time - m_flLastYawTime;
        move = ideal - current;
        if( delta > 0.25 )
            delta = 0.25;
        speed = yawSpeed * delta * 2;

        const float originalSpeed = ( float ) yawSpeed * gpGlobals->frametime * 10;

        const float multiplier = originalSpeed / ( yawSpeed * delta );
        if (ideal > current)
        {
            if (move >= 180)
                move = move - 360;
        }
        else
        {
            if (move <= -180)
                move = move + 360;
        }

        if (move > 0)
        {// turning to the monster's left
            if (move > speed)
                move = speed;
        }
        else
        {// turning to the monster's right
            if (move < -speed)
                move = -speed;
        }
        
        angles.y = UTIL_AngleMod (current + move);

        // turn head in desired direction only if they have a turnable head
        if (m_afCapability & bits_CAP_TURN_HEAD)
        {
            float yaw = pev->ideal_yaw - angles.y;
            if (yaw > 180) yaw -= 360;
            if (yaw < -180) yaw += 360;
            // yaw *= 0.8;
            SetBoneController( 0, yaw );
        }

        SetAbsAngles( angles );
    }
    else
        move = 0;
        m_flLastYawTime = gpGlobals->time;
    return move;
}
В этом коде появился новый параметр m_flLastYawTime, который нужно зарегистрировать.
В этом же файле monsters.cpp идем на самый верх. Находим строчку:
Код:
BEGIN_DATADESC( CBaseMonster )
После нее вы увидите перечисление полей DEFINE_FIELD. Листаем чуть ниже, когда перечисление полей подойдет к концу и перед строчкой END_DATADESC() пишем свою строчку:
Код:
DEFINE_FIELD( m_flLastYawTime, FIELD_TIME ),
С этим файлом мы закончили, но он у нас пока не скомпилится. Открываем файл basemonster.h и находим там код:
Код:
class CBaseMonster : public CBaseToggle
{
private:
        DECLARE_CLASS( CBaseMonster, CBaseToggle );

        int    m_afConditions;

public:
После public идет перечисление различных параметров. Куда вы поставите строчку, значения не имеет, просто она должна быть в public.
Для простоты понимания просто пишу, куда лично я прописал эту строчку. Находим строку:
Код:
    int                    m_bloodColor;        // color of blood particless
И после нее прописываем наш параметр m_flLastYawTime, должно получится вот так:
Код:
    int                    m_bloodColor;        // color of blood particless
    float                m_flLastYawTime;  // FPS fix
На этом все. Сохраняем и закрываем basemonster.h, компилируем monsters.cpp, затем компилируем server.dll через команду Rebuild All (на всякий случай).

Готово! Можете выставлять огромный fps_max, а монстры будут вести себя как полагается :)

Дополнение: в основном коде (новом) есть строчка:
Код:
speed = yawSpeed * delta * 2;
Меняя значение 2, мы можем регулировать скорость поворота. Если выставить 10, то повороты у монстров будут очень резкими и, даже бегая вокруг него, он будет все время стрелять в вас.
В комментариях на github была дискуссия по поводу этого и сошлись на мнении, что двойка - наиболее близкий вариант к оригинальной скорости поворота, которая была на 40-60 фпс без фикса. Поэтому я сразу учел это в туторе.

P.S. в стим-версии Half-Life это уже исправили. Но если вы делаете мод на ксаше, как я, то тутор может пригодится :) успехов!
 

KorteZZ

Возрождение...
18.10.2009
749
32
  • Золотая медаль 113
Йее! Вот бы все туторы были такими четкими и П О Ш А Г О В Ы М И, вплоть до каждой строчки и буквы.
А то порой пишут так, что без поллитра действительно не обойтись.
Спасибо!
 
  • Like
Reactions: Aynekko

super_genius

New member
02.01.2019
8
0
1
Код:
 if (yaw > 180) yaw -= 360;
 if (yaw < -180) yaw += 360;
Здесь разве вторая строка не отменяет действие предыдущей? Какой смысл?
 

Aynekko

Маппер
07.06.2010
3 459
27
  • Золотая медаль RC
  • Бронзовая медаль 216
Код:
 if (yaw > 180) yaw -= 360;
if (yaw < -180) yaw += 360;
Здесь разве вторая строка не отменяет действие предыдущей? Какой смысл?
Не знаю. Я просто показал, как добавить код и знаю, что он рабочий)
 

AHTu6uoTuK

Active member
10.03.2012
833
22
39
28
Москва
  • Топ Спонсор
Код:
 if (yaw > 180) yaw -= 360;
if (yaw < -180) yaw += 360;
Здесь разве вторая строка не отменяет действие предыдущей? Какой смысл?
Нет, не отменяет.
yaw > 180, ты из него вычитаешь 360, получается что-то, что будет > -180.
 
  • Like
Reactions: Aynekko

super_genius

New member
02.01.2019
8
0
1
Действительно, -1 больше -2, всё время путал в школе. Похоже, лучше всего запомнить связав с температурой, с термометром.
 

Новые сообщения

Донат - Хостинг

Итого
200.00 $
Цель
600.00 $

Доноры Красавчики

Пользователи онлайн

Нет пользователей онлайн.