Показать сообщение отдельно
Непрочитано 06.03.2017, 00:26   #1123
Пользователь

По умолчанию Re: Редактирование interface.xdat

Немного информации для тех, кто интересовался использованием встроенного редактора L2UI:

Для исследований необходим nwindow.dll соответствующей версии без Themid'ы. Все символы в релизной версии nwindow пострипаны (кроме экспортов), но достаточно много имен можно восстановить по раскрутчикам стека (см. функции с именами SEH_…).
Непосредственно редактор окон (но не шорткатов и стилей) реализован в классе UIEditor в Interface.u (доступен по команде ///ui). UIEditor для загрузки и сохранения XML окна использует функции в nwindow, например, UWindowHandle::execLoadXMLWindow. Из кода последней функции следует, что для загрузки XML окна необходимо следующее:
1. Schema.xsd, описывающая возможные XML окон;
2. Собственно XML окна
Schema.xsd в клиенте нету, но для каждого типа данных есть метод Process, например, XMLWindowData::Process. По вызовам к методам XMLNode становится ясно, какие именно атрибуты принадлежат к каждому типу, что позволяет восстановить Schema. Стоит отметить, что в схеме каждый тип данных должен быть объявлен как xs:complexType ...Type, иначе nwindow не увидит его определение.
С получением XML окон дело обстоит немного сложнее. В nwindow есть экспорт в UnrealScript
PHP код:
native final function bool SaveXMLWindowstring FilePathName ); 
, но он предназначен для сохранения окон, редактируемых в UIEditor, поэтому часть свойств и иерархии сохраняться не будет. У меня не было времени искать причину, поэтому был написан дампер из xdat в XML (описание формата можно посмотреть в коде acmi).
nwindow умеет пересобирать Interface.xdat. За сборку отвечает bool XMLUIManager::ForceCreateNewData, см. конструктор XMLUIManager. Мне также пришлось отключить пересборку скрипта (видимо, в релизе чего-то недостает для этого).
doesitmatter вне форума Ответить с цитированием
Сказали спасибо: