Page 1 of 2
GetTile(x,y,z)
Posted: 2004-10-18 12:10:40
by Shaud
Будет такая функция в Yoko Injection? Очень ее не хватает...
А еще хорошо бы интерфейс к .exe файлам, что б их вызывать из injection можно было.
Re: GetTile(x,y,z)
Posted: 2004-10-18 12:54:44
by Edred
Shaud wrote:Будет такая функция в Yoko Injection? Очень ее не хватает...
А еще хорошо бы интерфейс к .exe файлам, что б их вызывать из injection можно было.
Интеряейс есть, смотри команду launch
Posted: 2004-10-18 16:07:17
by Yoko
1) в официальной версии её типа нет
2) [yhlp_launch]
Posted: 2004-10-19 11:06:51
by Shaud
Это просто замечательно
Я начал писать функцию для вытаскивания тайлов из map0.mul и statics0.mul, Но без launch я придумал только заранее разобрать их на 768 текстовых файлов с координатами - соответсвующими им тайлами, и потом искать в соответсвующем файле из Injection, а теперь смогу вместо этого просто искать в map0.mul и statics0.mul запишу результат в файлик который прочитаю injection.

Posted: 2004-10-19 11:44:22
by Edred
Shaud wrote:Это просто замечательно

Я начал писать функцию для вытаскивания тайлов из map0.mul и statics0.mul, Но без launch я придумал только заранее разобрать их на 768 текстовых файлов с координатами - соответсвующими им тайлами, и потом искать в соответсвующем файле из Injection, а теперь смогу вместо этого просто искать в map0.mul и statics0.mul запишу результат в файлик который прочитаю injection.

Можешь результат писать в реестр, в переменные Изи, а в инжекте читать через GetEasyUO...
Posted: 2004-10-19 12:53:27
by Shaud
Какая разница? Ну буду я не через свой файл обмениваться а через файл реестра...
Главное что можно запустить
А то наш сервер на RunUO кривых тайлов в WaitTargetTile не понимает. А теперь я смогу прямые доставать

Posted: 2004-10-19 22:22:03
by Shaud
Все вроде дописал
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: Select all
// Программа получающая на вход абсолютные координаты 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.
Posted: 2004-10-20 12:38:40
by AGRS
Не забудь что есть еще динамические тайлы. ВИП лес, ВИП шахта например.
Posted: 2004-10-20 12:51:13
by Shaud
А они в каких файлах хранятся?
Кстати, может кто нибудь привети пример использования команды launch?
поподробнее. а то как то странно она ведет с передачей параметров.
Иногда не то передает. или вообще не передает? разберусь расскажу подробнее.
Posted: 2004-10-20 12:56:22
by AGRS
Shaud wrote:А они в каких файлах хранятся?
Они не в файлах хранятся. Это объекты которые сервер присылает. С серийниками, типами, именами и все как положено.

Shaud wrote:Кстати, может кто нибудь привети пример использования команды launch?
поподробнее. а то как то странно она ведет с передачей параметров.
Иногда не то передает. или вообще не передает? разберусь расскажу подробнее.
Никогда не пользовался.
Posted: 2004-10-20 13:05:05
by Shaud
Ну даже не знаю...
А в какой момент он их присылает? При загрузке клиента, когда ты видишь эти самые динамические тайлы или?
Кто то может предложить лучшее решение по вытаскиванию тайлов чем мое?
Буду благодарен за идеи.
Posted: 2004-10-20 13:15:17
by AGRS
Shaud wrote:Ну даже не знаю...
А в какой момент он их присылает? При загрузке клиента, когда ты видишь эти самые динамические тайлы или?
По мере появления конечно, как всегда.
Shaud wrote:Кто то может предложить лучшее решение по вытаскиванию тайлов чем мое?
Буду благодарен за идеи.
А что, твое не работает?
Posted: 2004-10-20 13:43:21
by Shaud
Работает
Ну динамические тайлы вот не обрабатывает.
Может есть еще какой нибудь путь вытаскивать Тайлы?
Вот EasyUO например вытаскивает тайлы похоже функциями клиента Ультиы (Полуение ID тайлв там работаент только когда запущен клиент).
Кроме того мне не нравится обмен через файлы. Кстати, как ты в Object Pascal пишешь в реестр?
Хочу так тоже попробовать.
Posted: 2004-10-20 16:51:52
by GrayLord
Shaud wrote:Ну даже не знаю...
А в какой момент он их присылает? При загрузке клиента, когда ты видишь эти самые динамические тайлы или?
Кто то может предложить лучшее решение по вытаскиванию тайлов чем мое?
Буду благодарен за идеи.
если объект,даже если это выглядит как пол шахты, имеет серийник, то его можно искать по uo.findtype() на земле, как обычный предмет и таргетить по сериалу, так что здесь всё предельно просто. даже waittargettile не понадобится.
Code: Select all
sub main()
uo.set('finddistance','2')
var tilenum='1349'
var tool='0x1234'
uo.findtype(tilenum"-1",'ground')
if uo.getserial('finditem')<>0 then
uo.waittargetobject(uo.getserial('finditem'))
uo.usetype(tool)
endif
endsub
Posted: 2004-10-21 18:27:19
by Shaud
К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.Так что не получится. Воторое ты указываешь номер тайла. А задача как раз и стоит в том что бы его узнать. третее идентификатор тайла (как я понял) это ссылка на соответствующую картинку. а type (первый параметр findtype) это несколько другое...
Спасибо за предложение.
Posted: 2004-10-21 18:39:58
by AGRS
Shaud wrote:К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.
Бред.
Posted: 2004-10-21 18:43:11
by AGRS
Shaud wrote:третее идентификатор тайла (как я понял) это ссылка на соответствующую картинку. а type (первый параметр findtype) это несколько другое...
И то и другое - "графический тип объекта".
Posted: 2004-10-21 18:51:16
by AGRS
AGRS wrote:Shaud wrote:К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.
Бред.
Вобще я бы исключил понятие тайла, только путаницу наводит.
Постараюсь пояснить.
WaitTargetTile это ловушка на ячейку мира. Ячейка имеет мировые координаты (X, Y и Z) и в ней вероятно содержатся статические и(или) динамические объекты. Поэтому для того чтобы конкретизировать свой выбор, мы должны еще указать и графический тип этого объекта. Перебором в статике, на карте и в объектах (присланных сервером) мы выбираем любой графический тип из нужного нам логического (дерево, скала, вода) и используем его в качестве параметра тайл.
Posted: 2004-10-21 20:15:24
by GrayLord
Shaud wrote:К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.Так что не получится. Воторое ты указываешь номер тайла. А задача как раз и стоит в том что бы его узнать. третее идентификатор тайла (как я понял) это ссылка на соответствующую картинку. а type (первый параметр findtype) это несколько другое...
Спасибо за предложение.
значит так. разгребать, так разгребать. на самом деле "тайл", в нашей с вами терминологии, - это "нечто", "вшитое" в статику, то есть - имеющее координаты и objtype, но не имеющее серийника. а почему "не имеющее"? да потому, что оно и не обязано его иметь, так как серийники раздаются лишь тем объектам, которые были созданы во время игры, и поэтому обязаны быть сохраненными при первом же сейве мира, а чтобы их как-то отличать друг от друга (не дай бог два одинаковых стоят по одним и тем же координатам), им и раздают серийные номера, а так же для удобства поиска конкретного объекта, изменения его свойств, или удаления из мира, в чем статика, естественно, не нуждается.
далее, насчет VIP территорий - они создаются, как правило, во время игры и, впоследствии, сохраняются вместе с миром. то есть, допустим, где-то в грин акрах, надо создать пол шахты. тогда стафф мембер пишет соответствующую команду, допустим "createitem", с указанием objtype, потом указывает, где именно, и на этом месте уже готовый объект, при чем неважно, что это - кусок горы, пол шахты, или кирка, и т.д., в любом случае будет создан объект, имеющий, кроме всего проего, еще и серийник, так как иначе сервер не будет "знать", на что конкретно мы хотим кинуть таргет, при выполнении каких-либо действий, если по одним и тем же координатам находится два и более однотипных объекта (в нашем случае - клетки пола шахты).
Posted: 2004-10-22 09:48:13
by Shaud
Вот пример процедуры для пользования моей программкой и тест к ней

Работает!

у меня.
Code: Select all
sub test6()
var f1=file("c:\temp\res.txt")
DIM TileID[9]
DIM TileZ[9]
var i,j
for i=0 to 9
TileID[i]=0
TileZ[i]=0
next
j=GetTile(1352,255,TileID,TileZ)
f1.Create()
for i=0 to j
f1.writeln(str(TileID[i])+' '+str(TileZ[i]))
next
f1.close()
end sub
sub GetTile(x,y,TileIDs,TileZs)
var s,exit,z,k,i,j
var f=file("c:\temp\Tile.txt")
uo.launch('c:\temp\mapread.exe',str(x)+' '+str(y));
exit=0
while exit<>1
z=f.open()
if z then
exit=1
end if
wait(100)
wend
k=0
while not f.eof() and not fatal error and k<=9
TileIDs[k]=safe call f.readnumber()
TileZs[k]=safe call f.readnumber()
k=k+1
if k>9 then
exit=1
endif
wend
f.close()
if k==1 then
k=0
end if
return k-2
end sub