Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Инструменты (https://forum.zone-game.info/forumdisplay.php?f=39)
-   -   L2UIUnpack (https://forum.zone-game.info/showthread.php?t=42324)

doesitmatter 23.05.2017 21:30

L2UIUnpack
 
Распаковывает указанный Interface.xdat в текущую директорию во множество .xml, ожидаемых nwindow.dll.
Пока что поддерживается только CT26 p4.

Исходный код доступен тут: https://github.com/07151129/L2UIUnpack

Примеры команд для сборки:
Код:

$ git clone https://github.com/07151129/L2UIUnpack
$ autoconf -i

Сконфигурировать для платформы хоста:
Код:

$ ./configure
Сконфигурировать для кросплатформенного билда для i686-w64-mingw32 со статической линковкой распространяемых библиотек:
Код:

$ ./configure --host=i686-w64-mingw32 --with-xml-prefix=libxml2-2.9.4/build --with-xml-exec-prefix=libxml2-2.9.4/build  --enable-static --enable-static-stdlib
Собрать бинарник в ./L2UIUnpack:
Код:

$ make
Рекомендации по использованию:
https://forum.zone-game.info/showthr...36253&page=114

Желающие могут присылать патчи сюда или на почту, указанную в git. Возможные улучшения: поддержка других версий nwindow, поддержка паковки в xdat, рефакторинг.

Небольшая часть описания формата Interface.xdat позаимствована у xdat_editor acmi.

defenderk1 28.05.2017 21:02

Re: L2UIUnpack
 
Спасибо конечно за софт, но такой геморой это компилить на винде что просто жуть.
И остается еще такой момент с DumpSchema его можно использовать для преобразования .xdat прямо в .xsd ? Ибо то что получается из xmlbeans это полный шлак - многие параметры не верно интерпретируются( Особенно енумы, к примеру Direction получается таким
Код:

  <xs:complexType name="frameType">
      <xs:attribute name="direction" type="xs:string" use="optional" />

,а должен быть хотябы таким
Код:

  <xs:complexType name="frameType">
      <xs:attribute name="direction" type="ui:directionType" use="optional" xmlns:ui="http://www.lineage2.co.kr/ui"/>

где DirectionType это Enum
Код:

  <xs:simpleType name="directionType">
    <xs:restriction base="xs:string">
      <!--1-->
          <xs:enumeration value="Right"/>
      <xs:enumeration value="Left"/>
          <xs:enumeration value="Top"/>
      <xs:enumeration value="Bottom"/>

    </xs:restriction>
  </xs:simpleType>

) иначе схема становиться не рабочей, и ту яву разбирать как то не очень хочется.

doesitmatter 29.05.2017 01:16

Re: L2UIUnpack
 
У меня не описаны в Schema.xsd значения enum'ов, т.е., например, Drawer определен так:
Код:

  <xs:element name="Drawer">
    <xs:complexType>
      <xs:attribute type="xs:string" name="direction"/>
      <xs:attribute type="xs:string" name="ownerWindow"/>
      <xs:attribute type="xs:int" name="offsetX" use="required"/>
      <xs:attribute type="xs:int" name="offsetY" use="required"/>
      <xs:attribute type="xs:boolean" name="directionFixed" use="required"/>
    </xs:complexType>
  </xs:element>

Получение значения enum'а в nwindow реализовано так же, как и чтение атрибута типа string, но значение enum'а при этом еще и отображается к соотв. константе типа int.

xmlbeans неплохо угадывает типы с опцией -simple-content-types smart, но некоторые типы надо заменить (например, int на short).

defenderk1 29.05.2017 03:45

Re: L2UIUnpack
 
Цитата:

Сообщение от doesitmatter (Сообщение 426476)
У меня не описаны в Schema.xsd значения enum'ов, т.е., например, Drawer определен так:
Код:

  <xs:element name="Drawer">
    <xs:complexType>
      <xs:attribute type="xs:string" name="direction"/>
      <xs:attribute type="xs:string" name="ownerWindow"/>
      <xs:attribute type="xs:int" name="offsetX" use="required"/>
      <xs:attribute type="xs:int" name="offsetY" use="required"/>
      <xs:attribute type="xs:boolean" name="directionFixed" use="required"/>
    </xs:complexType>
  </xs:element>

Получение значения enum'а в nwindow реализовано так же, как и чтение атрибута типа string, но значение enum'а при этом еще и отображается к соотв. константе типа int.

xmlbeans неплохо угадывает типы с опцией -simple-content-types smart, но некоторые типы надо заменить (например, int на short).

Возможно у вас оно угадывает лучше, у меня к примеру - получается так
Код:

  <xs:complexType name="DrawerType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="direction" use="optional"/>
        <xs:attribute type="xs:byte" name="offsetX" use="optional"/>
        <xs:attribute type="xs:byte" name="offsetY" use="optional"/>
        <xs:attribute type="xs:string" name="directionFixed" use="optional"/>
        <xs:attribute type="xs:string" name="ownerWindow" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

И если не использовать simpleType Enum, то во первых оно не будет отображаться в редакторе как следует , а во вторых не будет правильно сохраняться , вы там спрашивали почему оно нормально не сохраняет при использовании SaveXML,именно ввиду отсутствия enum'мов и неправильно угаданного значения типа.

Я думаю что лучше чтобы не создавать подобные курьезы, когда одно работает совсем иначе, чем у другого - лучше взять ваш софт за базу. Поскольку в нем там все верно описано, xml получаются именно такими какие они есть в оригинале, и сделать нужно - правильную генерацию в XSD.



P.S.

Возможно ли увидеть пример переобразования .xdat в схему, хоть 1 элемента к примеру
L2UIType Window.
Как можно получить Char значение из
Код:

list_children.emplace_back(new List<Window>(fdes));
Чтобы его можно было поместить в
Код:

<xs:complexType name="L2UIType">
 <xs:sequence>
      <xs:element type="ui:WindowType" name="Window" minOccurs="0" xmlns:ui="http://www.lineage2.co.kr/ui"/>
</xs:complexType>

И по сути загрузка .xdat не требуется ибо весь формат в вашем софте, вот только не понятно - можно ли их итрировать без громоздких циклов, + они привязываются в инстансцу схемы, а это тоже не то что нужно
Код:

auto el_list = static_cast<List<ElementBase>*>(child.get());
for (size_t i = 0; i < el_list->value().size(); i++)
                {
                        auto el = static_cast<const Element*>(el_list->value()[i].get());
                        res = (const char*)((StrAttribute*)el->children.front().get())->value.get();
                        fprintf(stdout, "out %s  child.get: %s", el->tag, res);
                }

таким образом получается выводить элементы L2UIType, но опять же они в xdat повторяются и привязаны к разным значениям .

doesitmatter 29.05.2017 20:52

Re: L2UIUnpack
 
Не думаю, что проблема с SaveXML связана с определениями enum'ов в схеме. Когда я пытался экспортировать таким образом интерфейс, у меня были описаны enum'ы в схеме как simple type, но в итоге часть атрибутов типа int и string вообще не экспортировалась; иногда экспортировались синтаксически некорректные xml.

Действительно, enum'ы, определенные как string в схеме отображаются в UIEditor как строки, но сохранение/редактирование у меня по-прежнему работало корректно.

Под DumpSchema подразумевался дамп конкретного xdat в набор xml. Пожалуй, стоит переименовать.

В любом случае, текущая имплементация L2UIUnpack неплохо подходит для создания схемы (по конкретному xdat; в общем случае это сделать сейчас вряд ли возможно); займусь, как будет время.

defenderk1 29.05.2017 21:44

Re: L2UIUnpack
 
Цитата:

Сообщение от doesitmatter (Сообщение 426488)
Не думаю, что проблема с SaveXML связана с определениями enum'ов в схеме. Когда я пытался экспортировать таким образом интерфейс, у меня были описаны enum'ы в схеме как simple type, но в итоге часть атрибутов типа int и string вообще не экспортировалась; иногда экспортировались синтаксически некорректные xml.

Действительно, enum'ы, определенные как string в схеме отображаются в UIEditor как строки, но сохранение/редактирование у меня по-прежнему работало корректно.

В любом случае, текущая имплементация L2UIUnpack неплохо подходит для создания схемы (по конкретному xdat; в общем случае это сделать сейчас вряд ли возможно); займусь, как будет время.

Ну не нужно самому заниматься, достаточно объяснить принцип работы или скинуть ссылки на пару статей .
И на счет сохранения xml, если имеются те енумы то и сохраняется вполне сносно, есть конечно еще какие то подводные камни - но зависит от версии движка ( к примеру на GF более стабильно чем на HF).

doesitmatter 17.06.2018 04:20

Re: L2UIUnpack
 
Посколько L2 меня давно перестала интересовать, выкладываю патчер для nwindow и схему для HF: https://gist.github.com/07151129/887...5cc494613c7f06

Возможно, патчер необходимо немного подправить.

BadStealth 13.01.2019 14:17

Re: L2UIUnpack
 
Сделайте для Эпилога такое.


Текущее время: 12:25. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot