12 KiB
OpenWC
Портирование клиента World of Warcraft 3.3.5a (12340) на Godot 4.6.
Текущий фокус проекта: загрузка данных из клиента, разбор форматов WoW и отображение мира в Godot так, чтобы его можно было смотреть и дальше редактировать уже средствами движка.
Сейчас проект уже умеет:
- открывать MPQ-архивы клиента через editor plugin;
- извлекать файлы из MPQ в
res://extracted; - читать
BLP2текстуры; - читать
ADT-тайлы terrain; - рендерить terrain из
ADTс текстурными слоямиMCLY/MCAL; - учитывать
holesвMCNK; - читать и рендерить воду из
MH2O; - стримить мир чанками с LOD в runtime;
- стримить мир в editor preview по мере движения камеры в 3D viewport;
- читать
WMOв отдельныйDictionaryи собирать его вNode3Dвручную.
Что пока не доведено до полноценного world renderer:
- автоматическая подстановка
WMOиM2в мир изADT/WDT; - вода без простого базового материала: нет нормального water shader, depth fade, shoreline blending, анимации;
- world-level
WDTloader; - импорт обратно в форматы WoW;
- полноценные инструменты редактирования мира в editor.
Текущее состояние
Реализовано
MPQManager- открытие клиентских архивов;
- список архивов по приоритету;
- listing/extract по фильтру.
BLPLoader- чтение
BLP2из файла или из байтов; - поддержка основных сжатых форматов, достаточная для terrain textures.
- чтение
ADTLoaderMTEX,MMDX/MMID,MWMO/MWID;MDDF,MODF;MCVT,MCNR,MCLY,MCAL;holes;MH2O.
ADTBuilder- сборка terrain в
Node3D; - terrain material с 4 слоями;
- legacy/big/compressed alpha;
- chunk-level LOD;
- первый проход рендера воды.
- сборка terrain в
StreamingWorld- runtime streaming тайлов и чанков;
- editor streaming вокруг камеры viewport;
- отдельные
ADT-узлы подTerrainв дереве сцены.
Частично реализовано
WMOLoader- root/group parsing есть;
WMOBuilderсобирает mesh по группам;- в общий world streaming пока не интегрировано.
Не реализовано
M2renderer;WDTstreaming metadata;- сохранение terrain/liquid/object placement обратно в WoW-форматы;
- редакторские инструменты изменения ADT/WMO данных.
Структура проекта
sources/- исходный клиент WoW 3.3.5a, без модификаций.
extracted/- извлечённые из MPQ файлы, с которыми работает Godot.
addons/mpq_extractor/- editor plugin и GDScript-сборщики сцен.
gdextension/- C++ GDExtension: MPQ, BLP, ADT, WMO.
maps/- готовые сцены для просмотра мира.
scenes/- скрипты streaming/preview/camera.
thirdparty/godot-cpp,StormLibи другие зависимости.
Требования
- Windows
- Godot
4.6 - Visual Studio 2022 с C++ workload
- CMake
- клиент WoW 3.3.5a (12340)
Сборка
Собрать GDExtension:
cd gdextension
build.bat Release
После успешной сборки DLL появится в:
addons/mpq_extractor/bin/
Подготовка данных
По умолчанию plugin смотрит на клиент в:
res://sources
И извлекает файлы в:
res://extracted
Через editor plugin
- Открой проект в Godot.
- Убедись, что plugin
MPQ Extractorвключён. - Внизу editor открой панель
MPQ Extractor. - Укажи путь к клиенту WoW 3.3.5a.
- Выбери locale.
- Нажми
Open Client Archives. - Для полной распаковки используй фильтр
*иExtract.
Для terrain/world обычно нужны как минимум:
World/Maps/...Textures/...World/wmo/...DBFilesClient/...если позже понадобится работа с DBC
Основные классы GDExtension
MPQManager
Доступен из GDScript. Основные методы:
open_client(base_path, locale)list_files(filter="*")extract_files(filter, output_dir)read_file(internal_path)
BLPLoader
Читает WoW BLP2 и возвращает Image.
Основные методы:
load_image(path)load_image_from_bytes(bytes)
ADTLoader
Читает ADT и возвращает Dictionary с terrain, texture layers, placements и liquid.
Основные поля результата:
texturesm2_nameswmo_namesm2_placementswmo_placementschunks
Каждый chunk содержит:
index_x,index_yoriginheightsnormalsholeslayersalpha_mapsliquids
WMOLoader
Читает root/group файлы WMO и возвращает Dictionary с materials и groups.
Это уже можно использовать вручную, но в world streaming оно пока не подключено.
GDScript-сборщики
ADTBuilder
Файл: addons/mpq_extractor/loaders/adt_builder.gd
Умеет:
- собрать весь
ADTвNode3D; - собрать отдельный chunk с нужным LOD;
- собрать water root для тайла;
- создать layered terrain material;
- загрузить BLP-текстуры через
BLPLoader.
WMOBuilder
Файл: addons/mpq_extractor/loaders/wmo_builder.gd
Умеет:
- собрать
Node3Dиз данныхWMOLoader; - создать по одному
MeshInstance3Dна группу; - назначить базовые материалы.
Сцены просмотра
maps/test.tscn
Файл: maps/test.tscn
Тестовая сцена, которая грузит квадрат тайлов вокруг центра карты.
Скрипт: scenes/test_world_loader.gd
Подходит для:
- быстрой проверки terrain;
- отладки парсинга
ADT; - проверки AABB и координат.
maps/adt_tile_preview.tscn
Файл: maps/adt_tile_preview.tscn
Preview одного ADT прямо в editor.
Скрипт: scenes/adt_tile_preview.gd
Полезно для:
- проверки одного конкретного тайла;
- отладки terrain layers;
- проверки воды и дыр по отдельному
ADT.
Основные export-поля:
map_nametile_xtile_yreload_now
maps/eastern_kingdoms_streaming.tscn
Файл: maps/eastern_kingdoms_streaming.tscn
Главная сцена для стриминга мира.
Скрипт: scenes/streaming_world_loader.gd
Умеет:
- находить все доступные
ADTтайлы вWorld/Maps/Azeroth; - загружать/выгружать тайлы по мере перемещения;
- строить chunk mesh по LOD;
- отдельно добавлять воду на тайл;
- работать и в runtime, и в editor.
Editor streaming
StreamingWorld теперь умеет подгружать мир прямо в editor по мере движения камеры viewport.
Ключевые export-поля:
editor_preview_enablededitor_follow_view_cameraeditor_preview_center_xeditor_preview_center_yeditor_preview_tile_radiuseditor_reload_now
Логика такая:
editor_preview_center_x/yзадают anchor, который сдвигается кorigin, чтобы мир было удобно смотреть в Godot;- при
editor_follow_view_camera = trueстриминг идёт вокруг положения editor camera в 3D viewport; - тайлы и их children появляются под
Terrainв Scene Tree.
Это нужно, чтобы визуально проверить, что мир действительно собирается по мере перемещения по карте, а не только как статичный превью-блок.
Runtime streaming и LOD
В runtime StreamingWorld:
- подгружает
ADTтайлы по расстоянию; - для terrain использует chunk-level LOD;
- хранит дальний мир на грубом chunk LOD;
- отдельно создаёт воду на тайл.
Основные параметры:
tiles_per_tickchunk_ops_per_ticklod0_radius_chunkslod1_radius_chunkslod2_radius_chunkslod2_tile_radius
Управление камерой
Файл: scenes/fly_camera.gd
Управление:
RMBудерживать для обзора;WASDдвижение;Q/Eвниз/вверх;Shiftускорение.
Что именно уже исправлено в terrain pipeline
По сравнению с самым ранним состоянием проекта уже поправлены:
- layout
MCNKHeader; - offsets внутри
MCNK; - чтение
MCVT; - чтение
MCNR; - legacy
MCAL; - big alpha / compressed alpha;
- корректные local coordinates внутри
ADT-узла; - holes;
- chunk winding/culling;
- editor preview одного тайла;
- streaming всего
Azeroth; - первый проход
MH2O.
Ограничения текущей версии
- terrain текстурирование уже рабочее, но ещё не 1:1 как в клиенте/Noggit во всех edge cases;
- water renderer сейчас базовый, без настоящих WoW water materials;
WMOчитается отдельно, но world placement пока не подключён;M2placements изADTпарсятся, но renderer нет;WDTещё не управляет составом мира;- проект сейчас ориентирован на просмотр и исследование данных, а не на полный round-trip import/export.
Ближайшие логичные шаги
- Подключить
WDT, чтобы мир собирался не по сканированию папки, а по данным карты. - Интегрировать
WMOplacement вStreamingWorld. - Добавить
M2loader/renderer. - Довести water shader.
- Начать editor-side инструменты для редактирования terrain/liquid/object placement.
- Подготовить формат сохранения обратно в WoW-совместимые структуры.
Быстрый старт
- Положить клиент WoW 3.3.5a в
sources/или указать путь через plugin. - Собрать расширение:
cd gdextension
build.bat Release
- Извлечь данные в
res://extractedчерезMPQ Extractor. - Открыть одну из сцен:
maps/adt_tile_preview.tscnmaps/test.tscnmaps/eastern_kingdoms_streaming.tscn
Если нужен именно просмотр мира в editor по движению камеры, используй:
maps/eastern_kingdoms_streaming.tscneditor_preview_enabled = trueeditor_follow_view_camera = true