Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
05-22-2014, 09:55 PM
(Сообщение последний раз редактировалось: 04-29-2015, 12:49 AM n3k0nation.)
Данный конвертер был написан уже очень давно мной, но только сейчас дошли руки его выложить
Умеет конвертить dat -> l2j и l2j -> dat.
Единственный минус - не создает заголовок при конвертации в дат (18 первых байт), поэтому геодата получается "не полной", хоть и отрабатывает свое. Кому надо - исправит это недоразумение
Скачать исходник + компил: клац-клац
В исходнике есть описание двух форматов. Кому лень, можно прочитать тут.
Замечания по формату
В DAT-геодате, у FLAT две высоты - одна минимальная, а другая максимальная. Это нужно, что бы все корректно работало, т.к. флат не содержит ячеек. Т.е. высота в одном флате может варьироваться.
Пример использования:
Код: java -cp ./conv.jar conv.Starter -f ./geodata -o ./output
./geodata - папка, в которой лежит геодата, которую нужно переконвертировать
./output - папка, в которую будет сохранена переконверченая гео.
Have fun!
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
Кстати, если блок из Flat перевести в Complex в G3D Editor, то размер файла увеличивается. Обратное преобразование уменьшает конечный файл.
Очень жаль что вы тоже не знаете точного строения заголовка PTS гео. Я бы пофиксил свой G3D Editor.
Всё это спокойно умеет делать конвертер от Akumu который он продаёт по 100 рублей в руки, включая кривой заголовок у PTS геодаты. И как бы он не писал, что пофиксил это - возможно, но этот фикс теперь крашит приложение.
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Donatte Написал:Кстати, если блок из Flat перевести в Complex в G3D Editor, то размер файла увеличивается. Обратное преобразование уменьшает конечный файл.
Очень жаль что вы тоже не знаете точного строения заголовка PTS гео. Я бы пофиксил свой G3D Editor.
Всё это спокойно умеет делать конвертер от Akumu который он продаёт по 100 рублей в руки, включая кривой заголовок у PTS геодаты. И как бы он не писал, что пофиксил это - возможно, но этот фикс теперь крашит приложение.
Что значит свой? Его автор дядька Forsaiken. Вы Форсейкен?
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Donatte Написал:Кстати, если блок из Flat перевести в Complex в G3D Editor, то размер файла увеличивается. Обратное преобразование уменьшает конечный файл. Увеличивается, потому-что добавляется еще 64 ячейки (64*2 = 128 байт в плюсе). Ну и перевод в из комплекса в флат минус 126 байт. Для ПТС минус 124 байта.
Donatte Написал:Очень жаль что вы тоже не знаете точного строения заголовка PTS гео. Я бы пофиксил свой G3D Editor. По поводу хедера: есть некоторые мысли, некоторые элементы заголовка уже разобрал; когда закончу выложу в паблик, если надо.
Donatte Написал:Всё это спокойно умеет делать конвертер от Akumu который он продаёт по 100 рублей в руки, включая кривой заголовок у PTS геодаты. И как бы он не писал, что пофиксил это - возможно, но этот фикс теперь крашит приложение. Значит уже не будет продавать Или точнее не будут покупать.
ANZO Написал:Что значит свой? Его автор дядька Forsaiken. Вы Форсейкен? Исходник в открытом доступе, ничто не мешает сделать форк и считать этот форк своим
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 1,240
Тем: 29
Зарегистрирован: May 2013
Репутация:
2,505
ANZO Написал:Что значит свой? Его автор дядька Forsaiken. Вы Форсейкен?
Во-первых, я его частично исправил. Был ряд багов.
Во-вторых, вырезал всё ненужное, на мой взгляд.
И наконец, шарить я его под своими копирайтами не собираюсь в паблик. Да и вообще шарить не собираюсь. Поэтому, он исключительно "мой"!
Pointer*Rage Написал:По поводу хедера: есть некоторые мысли, некоторые элементы заголовка уже разобрал; когда закончу выложу в паблик, если надо.
Выложите в этой теме, если не затруднит.
Сообщений: 2,303
Тем: 24
Зарегистрирован: Sep 2010
Репутация:
5,617
Pointer*Rage Написал:Исходник в открытом доступе, ничто не мешает сделать форк и считать этот форк своим
Ну с этой точки зрения я написал столько "своего" софта что у меня уже миллиарды должны были быть
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
05-23-2014, 03:17 PM
(Сообщение последний раз редактировалось: 10-20-2015, 09:14 PM n3k0nation.)
Donatte Написал:Выложите в этой теме, если не затруднит.
Пока, то что разобрал.
Структура заголовка у DAT:
byte -- сохраняется в массиве (регион по x)
byte -- сохраняется в массиве (регион по y)
short (word) -- не сохраняется (всегда 0x0080, возможно макс. число слоев)
short (word) -- не сохраняется (всегда 0x0010, дискретность клетки)
int (dword) -- сохраняется в массиве (общее количество ячеек для комплекса и слоев для мультилевела)
int (dword) -- не сохраняется (количество всех блоков, кроме multilevel)
int (dword) -- не сохраняется (количество flat блоков)
Первые два байта сохраняются в массив и после чекаются на ренж (результат чека сейвится в массив сдвиг от второго байта 7):
Код: first <= 17 ||
first == 18 && second >= 23 ||
first == 19 && (second == 18 || second == 24) ||
first == 20 && second >= 23 ||
first == 21 && (second == 18 || second == 23) ||
first == 22 && (second == 22 || second == 23);
На следующий байт (сдвиг 8 от второго байта) в массиве кладем ноль.
ЗЫ: под массивом я имею ввиду мемори-хранилище в птске
ЗЫЫ: разобранный листинг дизасма не буду выкладывать, т.к. не вижу смысла
Тестер ячеек:
Код: public static void main(String[] args) throws Throwable {
int original, real = 0;
try(RandomAccessFile raf = new RandomAccessFile(new File("./16_10_conv.dat"), "r"); FileChannel fc= raf.getChannel()) {
ByteBuffer bb = fc.map(MapMode.READ_ONLY, 0, fc.size());
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.position(6);
original = bb.getInt();
bb.position(18);
//real = (bb.limit() - bb.position());
for(int i = 0; i < 65536; i++) {
short blocktype = bb.getShort();
//real += 2;
if(blocktype == 0) {
bb.position(bb.position() + 4);
//real += 2;
} else if(blocktype == 0x0040) {
bb.position(bb.position() + 128);
real += 64;
} else /*if(blocktype == 0x0048)*/ {
for(int j = 0; j < 64; j++) {
short layers = bb.getShort();
//real += 2;
real += layers;
bb.position(bb.position() + (layers << 1));
}
}
}
System.out.println(bb.position());
System.out.println(bb.limit());
}
System.out.println("Original " + original + ", \r\n"
+ "real " + real);
}
Have fun!
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Сообщений: 2,455
Тем: 53
Зарегистрирован: Apr 2010
Репутация:
19,728
Обновил структуру постом выше. Большое спасибо r00tk1d1 :)
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
|