| 
		
	
	
	
		
	Сообщений: 2,454 
	Тем: 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 две высоты - одна минимальная, а другая максимальная. Это нужно, что бы все корректно работало, т.к. флат не содержит ячеек. Т.е. высота в одном флате может варьироваться.
 
Пример использования:
 ./geodataКод: java -cp ./conv.jar conv.Starter -f ./geodata -o ./output
 - папка, в которой лежит геодата, которую нужно переконвертировать
./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,302 
	Тем: 24 
	Зарегистрирован: Sep 2010
	
 Репутация: 
5,617 
	
	
		Donatte Написал:Кстати, если блок из Flat перевести в Complex в G3D Editor, то размер файла увеличивается. Обратное преобразование уменьшает конечный файл.
 Очень жаль что вы тоже не знаете точного строения заголовка PTS гео. Я бы пофиксил свой G3D Editor.
 
 Всё это спокойно умеет делать конвертер от Akumu который он продаёт по 100 рублей в руки, включая кривой заголовок у PTS геодаты. И как бы он не писал, что пофиксил это - возможно, но этот фикс теперь крашит приложение.
  
Что значит свой? Его автор дядька Forsaiken. Вы Форсейкен?
	 
	
	
	
		
	Сообщений: 2,454 
	Тем: 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,302 
	Тем: 24 
	Зарегистрирован: Sep 2010
	
 Репутация: 
5,617 
	
	
		Pointer*Rage Написал:Исходник в открытом доступе, ничто не мешает сделать форк и считать этот форк своим  
Ну с этой точки зрения я написал столько "своего" софта что у меня уже миллиарды должны были быть    
	
	
	
		
	Сообщений: 2,454 
	Тем: 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,454 
	Тем: 53 
	Зарегистрирован: Apr 2010
	
 Репутация: 
19,728 
	
	
		Обновил структуру постом выше. Большое спасибо r00tk1d1 :)
	 
m0nster.art - clear client patches, linkz to utils & code. 
Гадаю по капче.
 |