- 35
- 39
Хочется поеб*ть себе мозги с wall penetration внешним, без записи в память, так и еще и на питончике. В общем у меня ничего не получилось (пока что).
Но я точно знаю что это возможно и даже кем то уже реализовано. Все данные об объектах на карте в CS2 валве хранят в .vpk, от сюда и начнем.
Но я точно знаю что это возможно и даже кем то уже реализовано. Все данные об объектах на карте в CS2 валве хранят в .vpk, от сюда и начнем.
[Есть два пути]
1)
spotted = pm.read_bool(entity_pawn_addr + m_entitySpottedState + m_bSpottedByMask)
- Работает криво, медленно2) Парсинг .vpk файлов карт - Затратно, быстро, а работоспособность зависит от рук (в моем случае их отсутствия)
[.vpk -> .vphys]
Сначала нам нужен Source 2 Viewer, потребуется чтобы получить данные из .vpk (потом можно будет автоматизировать)
[.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
- База для ботов
- Пример для трассировки пуль
- Пример для проверки позиций
[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 считают устаревшим и более не используют
Последнее редактирование: