Вопрос Как работает гранат предикшн

Пользователь
Статус
Оффлайн
Регистрация
3 Июл 2019
Сообщения
137
Реакции[?]
77
Поинты[?]
2K
чит определяет куда и от кого был брошен нейд, потом рисует линию куда будет брошен нейд
но тогда, если это объясняет, как большинство читов предсказывают, где взорвется гранат, при этом нужно ли вам использовать трассировку?
Я кодирую способы, которыми игра имитирует место взрыва гранаты, к сожалению, это не работает
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
когда враг гранату кидает
Суть предсказания гранаты в том чтобы симулировать ее полет, и по мере этой симуляции запоминать точки где она находилась, а уже после по ним отрисовать линию.
Код симуляции раньше вырезали реверсив из 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, там обрабатывается взаимодействие с водой.
Так ты крутишь симуляцию кадр за кадром до определенных условий остановки (взорвалась или слишком долго крутится).
В общем, все это можно посмотреть в сорсах игры, и надеюсь текст выше поможет тебе понять что именно там происходит.
 
Пользователь
Статус
Оффлайн
Регистрация
3 Июл 2019
Сообщения
137
Реакции[?]
77
Поинты[?]
2K
Суть предсказания гранаты в том чтобы симулировать ее полет, и по мере этой симуляции запоминать точки где она находилась, а уже после по ним отрисовать линию.
Код симуляции раньше вырезали реверсив из 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, там обрабатывается взаимодействие с водой.
Так ты крутишь симуляцию кадр за кадром до определенных условий остановки (взорвалась или слишком долго крутится).
В общем, все это можно посмотреть в сорсах игры, и надеюсь текст выше поможет тебе понять что именно там происходит.
код, который вы имеете в виду, уже находится в lv grenadeprediction
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
уже находится в lv grenadeprediction
Если вы про легендвар мне вообще не нравится как он написан, это что-то с чем-то.
Поэтому при написании своего предикта лучше обратиться к сорсам игры нежели к сорсу какого-то чита.
Там нет учета препятствий, и вообще никаких комментариев, какое-то напасченное месиво, имхо.
 
Пользователь
Статус
Оффлайн
Регистрация
3 Июл 2019
Сообщения
137
Реакции[?]
77
Поинты[?]
2K
Если вы про легендвар мне вообще не нравится как он написан, это что-то с чем-то.
Поэтому при написании своего предикта лучше обратиться к сорсам игры нежели к сорсу какого-то чита.
я согласен.
весь код, о котором он говорит, находится в утечке исходного кода csgo, physics_main.cpp
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Вообще-то в:
/game/shared/physics_main_shared.cpp
/game/shared/collisionproperty.cpp
/game/shared/cstrike15/basecsgrenade_projectile.cpp
/game/server/physics_main.cpp
/game/client/physics_main_client.cpp
/game/shared/baseentity_shared.cpp
/game/shared/cstrike15/<name>_projectile.cpp
/game/shared/cstrike15/weapon_basecsgrenade.cpp
/game/shared/cstrike15/weapon_<name>.cpp
/game/shared/props_shared.cpp
Но да, почти...
 
Сверху Снизу