CS2 External visibility check [FAST] | no mSpotted | Python

Read1dno

Участник
Автор темы
35
39
Хочется поеб*ть себе мозги с wall penetration внешним, без записи в память, так и еще и на питончике. В общем у меня ничего не получилось (пока что).
Но я точно знаю что это возможно и даже кем то уже реализовано. Все данные об объектах на карте в CS2 валве хранят в .vpk, от сюда и начнем.

[Есть два пути]

1) spotted = pm.read_bool(entity_pawn_addr + m_entitySpottedState + m_bSpottedByMask) - Работает криво, медленно
2) Парсинг .vpk файлов карт - Затратно, быстро, а работоспособность зависит от рук (в моем случае их отсутствия)

[.vpk -> .vphys]

Сначала нам нужен Source 2 Viewer, потребуется чтобы получить данные из .vpk (потом можно будет автоматизировать)
Снимок экрана 2025-04-06 170640.png
Снимок экрана 2025-04-06 170720.png
Снимок экрана 2025-04-06 170837.png
В итоге получаем файл world_physics.vphys для карты de_mirage. Его вес около 25мб, из которых 23мб мусор, нужные нам треугольнички и вершины можно получить спарсив файл.

[.vphys -> .opt]

Можете использовать парсер VPhysToOpt, компилируйте Release X64 ISO C++ 20. Указываете директорию в которой лежат ваши .vphys файлы, дальше парсер должен отработать примерно так:

Код:
C:\VPhysToOpt\x64\Release>VPhysToOpt C:\PythonCODE\ProjectX
Processing C:\PythonCODE\ProjectX\world_physics.vphys -> C:\PythonCODE\ProjectX\world_physics.opt
Successfully saved: C:\PythonCODE\ProjectX\world_physics.opt

Если кому то интересно, то .opt[imized] - бинарный файл, содержащий только объединённые данные о треугольниках и вершинах, находящихся в .vphys файле.

[VisCheckCS2]

Можете использовать исходник VisCheck, но так как я хочу все это использовать в python, то сначала делаю pip install pybind11, далее компилирую vischeck_module.cpp Release X64 ISO C++ 20 указав в Configuration Properties → C/C++ → General → Additional Include Directories каталоги C:\Users\ИМЯЮЗЕРА\AppData\Local\Programs\Python\PythonВЕРСИЯ\include; C:\Users\ИМЯЮЗЕРА\AppData\Local\Programs\Python\PythonВЕРСИЯ\Lib\site-packages\pybind11\include. В Configuration Properties → Linker → General → Additional Library Directories указываю C:\Users\ИМЯЮЗЕРА\AppData\Local\Programs\Python\PythonВЕРСИЯ\libs.

По итогу получите модуль vischeck.pyd — это питоновский бинарник для проверки видимости между точками в 3D-пространстве. Работает так: когда ты вызываешь is_visible(point1, point2), он строит луч из point1 в point2 и рекурсивно проверяет пересечения этого луча с AABB боксами в BVH. Если луч попадает в бокс — проверяет треугольники внутри. Если пересечение найдено и оно ближе чем point2 — точки не видимы. Для проверки пересечений используется алгоритм Мёллера-Трумбора.

[Пример использования]
Python:
import vischeck
import random
import time

start_loader = time.time()
checker = vischeck.VisCheck("C:\VPhysToOpt\world_physics.opt") # ваша карта
end_loader = time.time()
print('loader map time:', end_loader - start_loader)

for i in range(1000):
    me = (random.randint(-3000, 3000), random.randint(-3000, 3000), random.randint(-3000, 3000))
    enemy = (random.randint(-3000, 3000), random.randint(-3000, 3000), random.randint(-3000, 3000))
    start_time = time.time()
    r = checker.is_visible(me, enemy)
    end_time = time.time()
    print('time to 1 ray: ', end_time - start_time, 'result:', r) # время обработки (чаще всего 0.0) и результат True/False
В реальном коде чита получаем коорды хеда противника и меня, ну мой говнокод вышел таким:
Python:
import vischeck

checker = vischeck.VisCheck("mirage.opt")

def vischeck(pm, entity_pawn_addr, local_player_pawn_addr):
    global checker
    game_scene = pm.read_longlong(entity_pawn_addr + m_pGameSceneNode)
    bone_matrix = pm.read_longlong(game_scene + m_modelState + 0x80)
    data = pm.read_bytes(bone_matrix + 6 * 0x20, 3 * 4)
    local_game_scene = pm.read_longlong(local_player_pawn_addr + m_pGameSceneNode)
    local_bone_matrix = pm.read_longlong(local_game_scene + m_modelState + 0x80)
    local_data = pm.read_bytes(local_bone_matrix + 6 * 0x20, 3 * 4)
    me = struct.unpack('fff', local_data)
    enemy = struct.unpack('fff', data)
   
    return checker.is_visible(me, enemy)

*fov и небо были заменены через сторонние программы

[Зачем оно надо?]
  • База для ИИ на python
  • База для ботов
  • Пример для трассировки пуль
  • Пример для проверки позиций
И конечно vischeck для читов, сам по себе проект VisCheckCS2 вызвать VAC не может никак! Тут нету взлома игры или чтения с записью памяти, мы просто читаем файлик .opt и все. Бан же дадут если проект использовать в чите, где есть оверлей, чтение запись памяти и тд. (надо постараться забаниться еще с VAC`ом то :/ )

[P.s.]
Я знаю что таких проектов уже куча, взять тот же cs2-map-parser. У меня он не завелся почему то :(

На видео мой чит на python, написанный только на чтение игры из kernal ядра.

Код полное говнище, вообще весь, загрузка карты inferno весом в 690мб займет примерно 68 секунд КАРЛЛ

Инфа от сюда:

Мой проект: VisCheckCS2, готовой .pyd либы и .exe парсера НЕ БУДЕТ, потому что меня обвинят в том что я этакий плохой НН вирусы втираю. Не малые - сами скомпилируете.

[P.s.s]
Забыл написать, у многих новых карт и у всех карт из мастерской в Source 2 Viewer будет отсутствовать файл .vphys_c, но точно должен быть файл .vmdl_c, в нем храниться идентичная информация что и в .vphys_c. Просто заходите в графу phys в .vmdl_c и копируете в txt файл, позже переименовывая в .vphys. У меня все получилось, парсер отработал как надо. Вообще валве формат .vphys считают устаревшим и более не используют
 
Последнее редактирование: