Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
client files editor
#1
В общем, как я писал ранее, я сел за написание утилиты для редактирования файлов клиента Lineage 2.
Итак, уже есть чем поделиться(правда конвертирование пока только в одну сторону).

На данный момент реализованы 2 ключевых класса для чтения.
L2FileInputStream
Как можно догадаться по названию, этот класс предоставляет возможность читать данные из файлов клиента. Он служит заменой утилите l2encdec, на лету снимает крипт и распаковывает.
L2DataInputStream
Этот класс реализует интерфейс DataInput, предоставляя методы для чтения базовых классов. Также он умеет считывать объекты по классу через рефлекшн.

Структура файлов описывается классами
Поэтому мы сразу получаем богатый набор инструментов для работы с ними(ORM, OXM, итд).

Пример использования(Клиент Lindvior NA)
PHP код:
<?php 
import ee
.l2.clientstuff.files.*;
import ee.l2.clientstuff.files.dat.*;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.FileInputStream;

public class
Test2 {
@
XmlRootElement
@DatFile(value = "ActionName", localizable = true)
@
SafePackage
public static class ActionNameDat{
public
ActionName[] actionName;
}

public static class
ActionName{
@
IntConst(1)
public
int tag;
public
int id;
public
int type;
public
int category;
@
Length(lengthType = LengthType.COMPACT)
public
int[] unkIds;
public
String name;
public
String icon;
public
String icon2;
public
String desc;
public
boolean unkBool;
@
Unicode
public String cmd;
}

public static
void main(String[] args) throws Exception{
Class<
ActionNameDat> datClass = ActionNameDat.class;
String datName = DatNameUtil.getFileName(datClass);

ActionNameDat dat = new L2DatInputStream(
new
L2FileInputStream(
new
FileInputStream("D:\\Lineage II\\System\\"+ datName),
datName
)
).
readObject(datClass);

JAXBContext context = JAXBContext.newInstance(ActionNameDat.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty("jaxb.formatted.output", true);
marshaller.marshal(dat, System.out);
}
}
Результат:
[SRC="xml"]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<actionNameDat>
<actionName>
<tag>1</tag>
<id>5000</id>
<type>-1</type>
<category>5</category>
<unkIds>1538</unkIds>
<name>Hand of Warmth</name>
<icon>BranchSys.icon.br_rudolf_hand_i00</icon>
<icon2>none</icon2>
<desc>Can express affection to Rudolph. Affection Level rises by 25%. Warning: Can be used only when a Rudolph requests expression of affection, and cannot be used while transformed!</desc>
<unkBool>false</unkBool>
<cmd>usepetskill</cmd>
</actionName>
...
</actionNameDat>
[/SRC]

Как видите, всего лишь описав формат дат-файла в виде класса, мы получили возможность его экспорта в xml. По-моему это крутоSmile
Можно как в l2jc1 генерировать датапак на основе файлов клиента.

Числа и строки
Типы из DDF:
CNTR - INT, записанный в компактном виде. В классах описывается как переменная с типом int или Integer, с добавлением аннотации @Compact.
ASCF/UNICODE - Строки, в классах описываются типом String. Если это UNICODE, то добавляется аннотация @Unicode.

Для проверки данных определены 2 аннотации IntConst/StrConst. Если определенные значения не совпадают со считанными, то выбрасывается исключение(мб и найдется применение).

Массивы
Поддерживаются только одномерные массивы.
Длина массива по умолчанию считывается как int. Если длина массива константа, и ее не нужно считывать, то добавляется аннотация @Length(<значение>). Если длина массива определяется CNTR, то добавляется аннотация @Length(lengthType = LengthType.COMPACT).


Планы на ближайшее будущее:
  • Замена xml более читабельным форматом
  • Описать датки
  • Автоматическая компиляция классов даток из более примитивных исходников DONE
  • Запись обратно в файл DONE
  • unreal packages

Проект на гитхабе/src
Жду ваших замечаний/пожеланий.

Если хотите поучаствовать - пишите.
Ответ
#2
Спасибо, забрал в архив.
Ответ
#3
Рано пока в архивSmile Это только начало...
Ответ
#4
я уже увидел, но все же декрипт есть а остальное думаю не составит труда написать.
Ответ
#5
Давайте подумаем - Вы суете в классы, это неудобно - в плане того что прийдется перекомпиливать.


а так посмотрите в мою сторону https://github.com/VISTALL/l2ce
consulo.io - Consulo - multi-language IDE
Ответ
#6
Я реализовал простенький компилятор, который ищет классы в заданной папке + добавляет необходимые импорты и аннотации.

Например пишем исходный файл episodion/SetItemGrp.java с таким содержанием:
PHP код:
<?php 
@DatFile(value = "SetItemGrp", localizable = true)
@
SafePackage
class SetItemGrpDat{
SetItemGrp[] setItemGrp;
}
class
SetItemGrp{
int setId;
ItemVariable[] items;
String[] itemBonus;
ItemVariable[] shileds;
String[] shieldBonus;
@
IntConst(0)
int unk1;
@
IntConst(0)
int unk2;
EnchantBonus[] enchantBonus;
}
class
ItemVariable {
int[] itemId;
}
class
EnchantBonus{
int level;
String bonus;
}

Вызов компилятора и генерация xml:
PHP код:
<?php 
File srcFolder
= new File("dat");
File outFolder = new File("classes");

new
SimpleCompiler(outFolder).compile(srcFolder);

ClassLoader cl = new URLClassLoader(new URL[]{
new
File("classes").toURI().toURL()
});
Class
clazz = cl.loadClass("episodion.SetItemGrpDat");

Object dat = new L2DatInputStream(
new
L2FileInputStream(
new
FileInputStream("G:\\Lineage II Kr\\system\\"+ DatNameUtil.getFileName(clazz, "k"))
)
).
readObject(clazz);

JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty("jaxb.formatted.output", true);
marshaller.marshal(dat, System.out);
[SRC="xml"]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<setItemGrpDat>
<setItemGrp>
<setId>0</setId>
<items>
<itemId>23</itemId>
</items>
<items>
<itemId>2386</itemId>
</items>
<items>
<itemId>43</itemId>
</items>
<itemBonus>세트 효과 없음</itemBonus>
<itemBonus>물리방어력 2% 증가, 최대HP 41 증가.</itemBonus>
<unk1>0</unk1>
<unk2>0</unk2>
</setItemGrp>
...
</setItemGrpDat>
[/SRC]


Описывать формат такими простыми классами не намного сложнее ddf.
Cразу получаем маппинг в xml и кучу других плюшек.
Ответ
#7
Ну я б не сказал бы что проще.


Нужна IDE что б менять. Вручную - можно сделать кучу ошибок(если Notepad++).


А что за разномерные масивы?

типо таких

http://pastebin.com/xr3cJTc1
consulo.io - Consulo - multi-language IDE
Ответ
#8
Если ошибетесь, то получите вывод стандартного java-компилятора
PHP код:
<?php 
class Schema24hzDat {
String schema
}
Код:
Error on line 11 in /lindvior/Schema24hzDat.java:11: error: ';' expected
String schema
             ^


Поддержки многомерных массивов не делал из-за различного представления длины(int или compact int).
PHP код:
<?php 
InnerArray
[] arr1;
...
class
InnerArray{
@
Length(lengthType = LengthType.COMPACT)
int[] arr2;
}
Такую структуру не опишешь как
PHP код:
<?php 
int
[][] arr;
Ответ
#9
Извини моя ошибка, я про вложеные масивы в масивы

PHP код:
<?php 
<node name="setid_2" reader="UINT" />
<for
name="setid_2">
<
node name="seteffect_2_sub" reader="UINT" />
<for
name="seteffect_2_sub">
<
node name="seteffect_2_sub2" reader="UINT" />
</for>
</for>

типо такого


Тоисть что б проверить валидность нужно всегда запускать, лишнии движения. Плюс будет туча классов, когда файл большой
consulo.io - Consulo - multi-language IDE
Ответ
#10
В данном случае будет что-то типо такого:
PHP код:
<?php 
class itemname{
...
name_class[] name_class;
...
setid_2[] setid_2;
...
}
class
name_class{
int[] name_class_sub;
}
class
setid_2{
int[] seteffect_2_sub;
}
Подобные структуры можно описать отдельным классом и повторно использовать.
PHP код:
<?php 
class itemname{
...
IntArr[] name_class;
...
IntArr[] setid_2;
...
}
class
IntArr{
int[] arr;
}
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  abnormal effect c4 client cienpe 0 1,129 11-15-2019, 12:37 PM
Последний пост: cienpe
  Пакет AutchRequest(Client) JewSzz 7 1,790 01-29-2019, 10:15 AM
Последний пост: JewSzz
  Is it possible to launch "patched" Helios client in Official server ? Syncia_Lin 0 1,105 12-05-2016, 07:01 PM
Последний пост: Syncia_Lin
  [IO:28] File Editor Evencelance 9 2,506 12-26-2015, 01:09 AM
Последний пост: Evencelance
  Tauti systextures для Unreal Editor acmi 33 9,475 03-21-2014, 05:55 PM
Последний пост: Phantom-Dev
  client Lineage2 C3 SkyWard 26 5,402 07-24-2013, 10:03 PM
Последний пост: SkyWard
  UI editor qweqwe1 2 2,914 01-21-2013, 09:14 PM
Последний пост: ANZO
  проблема с UnrealEngine 2 Editor kira1990 1 2,183 11-20-2011, 10:49 PM
Последний пост: mazillka
  Lineage 2 C3 Client Effas 12 7,022 10-21-2011, 05:07 PM
Последний пост: smeli
  Path Editor SVN VISTALL 0 2,171 10-02-2011, 09:57 AM
Последний пост: VISTALL

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)