Конференции   |   Вход   |   Участники   |   Календарь   |   Сообщения за день   |   Поиск   |   Правила

Вернуться   Global Half-Life | Форум > Конференция Panther Studios > Half-Life SDK: Кодинг > [ Кодинг ] Туториалы

Ответ
 
Опции темы
Shadow762
Быдлокодер
 
Аватар для Shadow762
Shadow762 на форуме
 
Регистрация: 22.11.2015
Проживает: Гиде-то
Сообщений: 50
Профиль Steam
Post Сохраняемая trigger_camera

Автор туториала: Ku2zoff (взято с hlfx.ru)

В обычной халфе, в отличие от спирита и ксашмода (и XDM), если сохраниться, когда активна trigger_camera, после загрузки вид возвращается в глаза игрока. Данный тутор будет полезен тем, кто делает мод на основе каких-то сорцев, где это не реализовано.

Сначала, нужно добавить в класс игрока кое-какие новые члены:

С / С++:
EHANDLE m_pCamera;
Vector vLastAngles;
int m_iUpdateCamera
Первое - указатель на нашу камеру, чтобы можно было найти её после загрузки, и вообще определить, смотрит игрок из глаз или из камеры. Второе - последнее направление взгляда игрока перед активацией камеры. Не знаю как остальным, а мне очень не нравится, что игрок может случайно отвернуться от кнопки, которой активировал камеру. В каких-нибудь ситуациях, когда нужно бегать и поворачиваться, смотря на себя со стороны (как в моде Conundrum 2, там есть такой паззл вроде бы), это будет лишним. Но это можно сделать опциональным, добавив trigger_camer'е новый спаунфлаг. Третье - переменная на обновление камеры.

Теперь нужно добавить первые два члена класса в сейвдату:

С / С++:
DEFINE_FIELD(CBasePlayerm_pCameraFIELD_EHANDLE),
DEFINE_FIELD(CBasePlayervLastAnglesFIELD_VECTOR), 
Далее
С / С++:
m_pCamera NULL;
m_iUpdateCamera 1
нужно вставить во все места, где игрок потенциально возвращает вид из глаз: CBasePlayer::Killed, CBasePlayer::StartObserver и т.д. Также, m_iUpdateCamera = 1 нужно вставить в CBasePlayer::Precache, чтобы после загрузки камера тоже обновлялась. Обнулять там её не нужно!

Следующий шаг, это в самый низ CBasePlayer::UpdateClientData добавить код, отвечающий за переключение вида:

С / С++:
if (m_iUpdateCamera)
{
  
//        ALERT(at_console, "Update camera\n");
  
if (m_pCameraSET_VIEW(edict(), m_pCamera->edict());
  else 
SET_VIEW(edict(), edict());
  
m_iUpdateCamera 0;

else if (
m_pCamera && pev->v_angle != vLastAngles)
{
  
//        ALERT(at_console, "Restore angles\n");
  
pev->angles pev->v_angle vLastAngles;
  
pev->fixangle TRUE;

Всё просто: когда нужно обновить вид, проверяем, есть ли у игрока сохранённая камера. Если есть, переключаем вид на неё. Если нет - на игрока. Ну и сбрасываем статус m_iUpdateCamera, иначе SET_VIEW будет срабатывать до бесконечности. Второе условие проверяет, смотрит ли игрок через камеру. Если смотрит, то его взгляд приравнивается к vLastAngles. Волшебная строчка pev->fixangle = TRUE отправляет углы взгляда с сервера на клиент. А там уже работает стандартный код, который оверрайдит pparams->viewangles на англсы камеры.

Последний этап работы - это модификация кода самой камеры. В её коде есть два вызова SET_VIEW. Их нужно заменить на это:

С / С++:
// первый вызов
CbasePlayerpPlayer = ((CBasePlayer*)((CBaseEntity*)m_hPlayer));
pPlayer->m_pCamera this;
pPlayer->vLastAngles pPlayer->pev->v_angle;
pPlayer->m_iUpdateCamera 1;
//    SET_VIEW( pActivator->edict(), edict() );
// второй вызов
CBasePlayerpPlayer = ((CBasePlayer*)((CBaseEntity*)m_hPlayer));
pPlayer->m_pCamera NULL;
pPlayer->pev->angles pPlayer->pev->v_angle pPlayer->vLastAngles;
pPlayer->pev->fixangle TRUE;
pPlayer->m_iUpdateCamera 1;
//            SET_VIEW( m_hPlayer->edict(), m_hPlayer->edict() ); 
На этом всё. Код сохраняемой камеры до сегодняшнего дня был у меня вообще в 5 строчек, но, как выяснилось, он некорректно работает с камерами, которые активируются мультименеджерами и, скорее всего, другими логическими энтитями. В чём причина, я не нашёл, возможно, что некорректно передаётся pActivator. И обнаружил я это на стартовой карте Инвазиона.

Благодарности Ku2zoff'у за этот замечательный тутор
__________________
#1 Старый 09.12.2022, 07:46 Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

На основе Vbulletin