В обычной халфе, в отличие от спирита и ксашмода (и XDM), если сохраниться, когда активна trigger_camera, после загрузки вид возвращается в глаза игрока. Данный тутор будет полезен тем, кто делает мод на основе каких-то сорцев, где это не реализовано.
Сначала, нужно добавить в класс игрока кое-какие новые члены:
С / С++:
EHANDLE m_pCamera;
Vector vLastAngles;
int m_iUpdateCamera;
Первое - указатель на нашу камеру, чтобы можно было найти её после загрузки, и вообще определить, смотрит игрок из глаз или из камеры. Второе - последнее направление взгляда игрока перед активацией камеры. Не знаю как остальным, а мне очень не нравится, что игрок может случайно отвернуться от кнопки, которой активировал камеру. В каких-нибудь ситуациях, когда нужно бегать и поворачиваться, смотря на себя со стороны (как в моде Conundrum 2, там есть такой паззл вроде бы), это будет лишним. Но это можно сделать опциональным, добавив trigger_camer'е новый спаунфлаг. Третье - переменная на обновление камеры.
Теперь нужно добавить первые два члена класса в сейвдату:
нужно вставить во все места, где игрок потенциально возвращает вид из глаз: CBasePlayer::Killed, CBasePlayer::StartObserver и т.д. Также, m_iUpdateCamera = 1 нужно вставить в CBasePlayer::Precache, чтобы после загрузки камера тоже обновлялась. Обнулять там её не нужно!
Следующий шаг, это в самый низ CBasePlayer::UpdateClientData добавить код, отвечающий за переключение вида:
С / С++:
if (m_iUpdateCamera)
{
// ALERT(at_console, "Update camera\n");
if (m_pCamera) SET_VIEW(edict(), m_pCamera->edict());
else SET_VIEW(edict(), edict());
m_iUpdateCamera = 0;
Всё просто: когда нужно обновить вид, проверяем, есть ли у игрока сохранённая камера. Если есть, переключаем вид на неё. Если нет - на игрока. Ну и сбрасываем статус m_iUpdateCamera, иначе SET_VIEW будет срабатывать до бесконечности. Второе условие проверяет, смотрит ли игрок через камеру. Если смотрит, то его взгляд приравнивается к vLastAngles. Волшебная строчка pev->fixangle = TRUE отправляет углы взгляда с сервера на клиент. А там уже работает стандартный код, который оверрайдит pparams->viewangles на англсы камеры.
Последний этап работы - это модификация кода самой камеры. В её коде есть два вызова SET_VIEW. Их нужно заменить на это:
На этом всё. Код сохраняемой камеры до сегодняшнего дня был у меня вообще в 5 строчек, но, как выяснилось, он некорректно работает с камерами, которые активируются мультименеджерами и, скорее всего, другими логическими энтитями. В чём причина, я не нашёл, возможно, что некорректно передаётся pActivator. И обнаружил я это на стартовой карте Инвазиона.
Благодарности Ku2zoff'у за этот замечательный тутор