1. Нужно отвязать движение от секвенции, то есть исключить использование StduioFrameAdvance в функции CBaseMonster::Move, где оно юзается по дефолту. Делается это очень легко: нужно всего лишь задать монстру значение m_flGroundSpeed. Для бега выше, для ходьбы ниже. Как и у игрока в юнит/сек. Лучше всего это сделать в функции MonsterThink, оверрайдить её для конкретного монстра.
2. Нужно назначать гейтсеквенции для активностей движения. Оверрайдим SetActivity для конкретного монстра. Если NewActivity = m_movementActivity, то эту активность делаем гейтсеквенцией. Если нет, то простой секвенцией.
3. Самая сложная часть. Нужно отредактировать существующие таски, или написать новые. К примеру, я убрал TASK_STOP_MOVING из Task_t tlAGruntRangeAttack1[], тем самым отучив его останавливаться, когда он стреляет. Ну потом конечно написал отдельный таск для стрельбы в движении. И сделал переключение между ними в функции выбора скедъюлей Schedule_t* CAGrunt :: GetScheduleOfType ( int Type ) в зависимости от расстояния до противника. Тут всё ограничивается лишь полётом фантазии.
Таски и скедъюлы можно по-разному комбинировать, получая интересные результаты. А если вчитаться в их код, то вообще о-го-го, чего там есть К примеру, стрейф в халфе вполне себе реализован. Только ни один бегающий монстр его не юзает. Вроде бы только алиен_контролееры умеют.
4. Расчёт гейтсеквенции монстрам на клиенте. Аналогично игроку, с той лишь разницей, что скорость фиксированная, и нам не нужна никакая m_flGaitMovement. Только m_flGaitFrame нужно рассчитывать. Здесь я напоролся на то, что для КАЖДОГО отдельного монстра нужно считать свой гейтфрейм (для игрока юзается индивидуальная структура m_pPlayerInfo, поэтому там проблем нету). Сначала я ради эксперимента сделал так: float m_flGaitframeMonster[1024]; ну понятно, максимум 1024 монстра, в качестве идентификатора - индекс энтити. Говнокод кароч. Потом заюзал пустой энтварс под гейтфрейм, и всё стало нормально.
5. Передача гейтсеквенции по сети. В маленькое изменение в client.cpp и новая строчка в delta.lst.
6. Серверные хитбоксы. Рассчёт m_flGaitFrame для гейтсеквенции на сервере, как в кс. Пока не делал, т.к. серверный кадр не синхронен с клиентским.
Пункты 2 и 3 ещё требуют доработки, чтобы не было дёрганий на ровном месте и искр над башкой. Пункт 6, я хз, нужен ли он вообще в халфе. Разве что при стрельбе из арбалета по монстру, который медленно идёт, и ноги у него медленно анимируются.
Проблема в том, что серверный gaitframe у игрока не совпадает с клиентским, отсюда рассинхрон серверных хитбоксов ног с видимой моделью. (Только в движении. Код на сервере идентичен клиентскому, но, видимо, здесь играет роль то, что сервер тчинкает реже клиента). Я тебе сорцы дам, ты сможешь в XDM потестить и найти способ синхронизировать? Я ещё прогу подскажу, которая рисует серверные хитбоксы. Только осторожно, её античиты не любят, авторы очень особо об этом напоминают каждый раз при запуске
Цитата:
~ X ~ писал: Не мог бы на мои вопросы ответить? Про модели, например.
Спрашивай.
Я тут пораскинул мозгами, и вот что решил: PLut попробовал алиен грантов в бдефе. Сказал, что двигаются дёрганно. Я сильно со свенкоопом не сравнивал, но таки есть что-то. Видимо, придётся сделать гейт на сервере. А соответственно написать StudioFrameAdvance для гейта. Тогда проблема с подбором скоростей отпадёт, и, теоретически, монстры будут двигаться так же, как и при обычных анимациях. А ещё я думаю, что надо будет сделать монстрам нулевую секвенцию, которая не будет юзаться. Как и у игрока. Чтобы действовало условие if (pev->gaitsequence == 0).
Ku2zoff
Плавнее стало переключение между, например, ходьбой и прыжком, ходьбой и idle. Монстрам это тоже должно помочь. Хотя смотря что вы понимаете под "дёрганно".
~ X ~ писал: По теме: модели все тоже новые клепать? Частично оставить старых монстров можно будет? pev->weaponmodel тоже, может, задействовать? (чтоб не клепать десяток bodygroup для оружий)
Если серверные хитбоксы решат проблему с непонятно куда тыканьем монтировкой по дохлым монстрам - я буду счастлив.
Я пока не буду брать у тебя код (ПОКА!) потому что у меня обнаружился сетевой баг с монстрами, оторый мне надо сначала решить.
Ku2zoff писал: отреверсившим серверную дллку кс 1.6. Почитали отреверсенный код и поисправляли несколько неточностей в коде ксаша.
Что ж все никак клиентку не отреверсят? Смысла только от серверной мало....
Добавлено 22-07-2015 в 01:01:
Цитата:
~ X ~ писал: Чиво? ДМише собрали 200к?? Может, мне так объявить о сборе средств на фичу???
Я давно предлагал. И не говори, что не помнишь!!!
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo