Все вроде дописал
FreePascal 1.06
AOS
Эта программа получает в качестве параметров абсолютные x и y и пишет в файл все тайлы и из Z координаты которые есть в данных мировых координатах.
т.е. вызываем uo.launch(prog.exe,str(x)+' '+str(y)) и потом забираем из tile.txt номер тайла и Z координату.
Программу только закончил писать, поэтому возможно найду в ней глюки
Программа предназначена для map0.mul так что для остальных миров где карты другого размера, надо изменить кое какие переменные. Кроме того я нашел подозрительные файлы типа mapdif0.mul которые я не учитывал в своей программе, потому что и так все работает. Т.е. копает
Вроде работает нормально.
Всем приятного WaitTargetTile(TileID,x,y,z)
Кстати вот чего действительно не хватает в injection это плагинов
Если б был стандартный интерфейс с внешними программами, было б гораздо веселее писать
Code:
// Программа получающая на вход абсолютные координаты x и y
// И пишущая в файл индефикаторы всех тайлов и их Z координат.
// Для всех тайлов по координтам x и y
uses
sysutils;
// Щаг Record 1 byte (по умолчанию 2, это неприемлемо потому что ячейка
// 3 байта, значит будем читать бри шаге 2 байта 4 байта вместо 3
{$PackRecords 1}
type
// cell of map<n>.mul
cell = record
TileID:Word;
TileZ:shortint;
end;
// Блок map<n>.mul
map_Block = record
Header:Cardinal;
cells:array [0..63] of cell;
end;
// Блок Static index file
Statidx_Block = record
Start:Cardinal;
Length:Cardinal;
Unknown:Cardinal;
end;
// Ячейка Static File
Stat_cell = record
TileID:Word;
cellX:byte;
cellY:byte;
cellZ:shortint;
Unknown:Word;
end;
var
f_in,f_in_sidx,f_in_s:longint;
curBlock:map_Block;
Staidx_Block:Statidx_Block;
m:longint;
f_out:text;
stat_items:array[1..1024] of Stat_cell;
stat:Stat_cell;
file_num,param:string;
x,y,XBlock,YBlock,BlockNum,XCell,YCell:Longint;
begin
// Программе передаются два параметрава абсолютные x и y координаты.
// Если кол-во параметров отличается от 2ух - выход
if ParamCount<>2 then
halt(0);
// Переводим координаты x и y из строки в число
val(Paramstr(1),x);
val(Paramstr(2),y);
// Открываем рабочие файлы
f_in:=FileOpen('c:\temp\map0.mul',fmOpenRead);
f_in_sidx:=FileOpen('c:\temp\staidx0.mul',fmOpenRead);
f_in_s:=FileOpen('c:\temp\statics0.mul',fmOpenRead);
assign(f_out,'Tile.txt');
ReWrite(f_out);
// Рассчитываем координаты блока в map<n>.mul
XBlock:=x div 8;
YBlock:=y div 8;
//Расчитываем смещение в Блоках - Block Num for map0.mul
// (Высота map0.mul 512 блоков, для других карт надо подставить их высоту)
BlockNum:=(XBlock*512)+YBlock;
// Координаты ячейки в блоке
XCell:=x mod 8;
YCell:=y mod 8;
// Ищем map<n>.mul Блок который надо прочитать(Длина блокаmap<n>.mul 196 байт)
FileSeek(f_in,BlockNum*196,fsFromBeginning);
// Читаем найденый блок
FileRead(f_in,curBlock,sizeOF(curBlock));
// Пишем результат в файл
Writeln(f_out,curBlock.cells[YCell*8+XCell].TileID,' ',curBlock.cells[YCell*8+XCell].TileZ);
// Ищем соответствующий прочитаному блоку map0.mul
//Блок в Staidx0.mul (Длина блока 12 байт)
FileSeek(f_in_sidx,BlockNum*12,fsFromBeginning);
// Считываем его
FileRead(f_in_sidx,Staidx_Block,sizeOF(Staidx_Block));
// Есди в Static0.mul есть блок соответствующий блоку map0.mul
// Обрабатываем
// $FFFFFFFF - значит что такого блока нет
if Staidx_Block.Start <> $FFFFFFFF then
begin
// Устанавливаем начальную позицию полученую из Staidx0.mul
// в фале Statics0.mul
FileSeek(f_in_s,Staidx_Block.Start,fsFromBeginning);
// И читаем все записи с этой позиции в количестве полученом
// из того же Staidx0.mul
for m:=1 to Staidx_Block.Length div 7 do
begin
FileRead(f_in_s,Stat,sizeOF(Stat));
stat_items[m]:=Stat;
end;
// Записываем результаты в файл
for m:=1 to Staidx_Block.Length div 7 do
if (stat_items[m].CellX=XCell) and (stat_items[m].CellY=YCell) then
Writeln(f_out,stat_items[m].TileID,' ',stat_items[m].cellZ);
end;
// Закрываем все файлы
close(f_out);
FileClose(f_in);
FileClose(f_in_sidx);
FileClose(f_in_s);
// Все :)
end.