когда враг гранату кидает
Суть предсказания гранаты в том чтобы симулировать ее полет, и по мере этой симуляции запоминать точки где она находилась, а уже после по ним отрисовать линию.
Код симуляции раньше вырезали реверсив из server.dll,теперь есть исходники игры и можно наиболее точно предсказывать гранаты вырезав оттуда все что нужно.
Первым делом при смене карты тебе нужно загружать список разрушаемых сущностей, затем вести их учет, какие из них разрушены, чтобы предикт работал сквозь уже разрушенные объекты, это делается через парсинг BSP.
Затем есть два варианта:
- Когда гранату бросили (см CBaseCSGrenade::ThrowGrenade), там рассчитывается угол блоска, его скорость и уже из них вектор броска, и затем вызывается отпускание гранаты (см ниже).
- Когда гранату отпустили (см C<Name>Grenade::EmitGrenade, C<Name>Projectile::Create), там выставляется начальное состояние полета (сбрасывается), выставляются параметры на основе типа гранаты.
Дальше начинается код симуляции полета гранаты, ее суть заключается в том, что ты симулируешь кадры полета как бы это делал сервер в реальном времени, но только той части что нужно и при этом периодически запоминаешь координаты гранаты.
У сущности есть метод PhysicsSimulate, он выполняется каждый кадр на сервере для всех сущностей, сам метод определяет поведение физики сущности за один кадр.
В одном тике PhysicsSimulate будет вызываться:
- CBaseEntity::PhysicsRunThink, там для гранаты решается когда она будет взорвана (см. C<Name>Projectile::Think_Detonate) смок/декой раскрывается когда почти остановились, флешка/обычная/молотов/зажигательная как вышло время, причем они замедляются в два раза когда в воде, обновляется раз в 0.2 секунды.
- CBaseEntity::PhysicsAddGravityMove, там рассчитывается влияние гравитации на гранату
- CBaseEntity::PhysicsPushEntity, там рассчитается движение гранаты, а так же столкновения
- если столкновение произошло то в PerformFlyCollisionResolution обрабатывается отскок (после 20 граната в любом случае взрывается), там же нужно сделать проверку на ломаемые объекты
- CBaseEntity::PhysicsCheckWaterTransition, там обрабатывается взаимодействие с водой.
Так ты крутишь симуляцию кадр за кадром до определенных условий остановки (взорвалась или слишком долго крутится).
В общем, все это можно посмотреть в сорсах игры, и надеюсь текст выше поможет тебе понять что именно там происходит.