Yoko

All sides of Injection
It is currently 2024-04-18 12:27:01

All times are UTC+02:00




Post new topic  Reply to topic  [ 37 posts ]  Go to page 1 2 Next
Author Message
 Post subject: GetTile(x,y,z)
PostPosted: 2004-10-18 12:10:40 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Будет такая функция в Yoko Injection? Очень ее не хватает...
А еще хорошо бы интерфейс к .exe файлам, что б их вызывать из injection можно было.


Top
   
 Post subject: Re: GetTile(x,y,z)
PostPosted: 2004-10-18 12:54:44 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Shaud wrote:
Будет такая функция в Yoko Injection? Очень ее не хватает...
А еще хорошо бы интерфейс к .exe файлам, что б их вызывать из injection можно было.


Интеряейс есть, смотри команду launch


Top
   
 Post subject:
PostPosted: 2004-10-18 16:07:17 
Offline
Site Admin
User avatar

Joined: 2004-04-03 16:49:38
Posts: 1964
1) в официальной версии её типа нет
2) [yhlp_launch]


Top
   
 Post subject:
PostPosted: 2004-10-19 11:06:51 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Это просто замечательно :)
Я начал писать функцию для вытаскивания тайлов из map0.mul и statics0.mul, Но без launch я придумал только заранее разобрать их на 768 текстовых файлов с координатами - соответсвующими им тайлами, и потом искать в соответсвующем файле из Injection, а теперь смогу вместо этого просто искать в map0.mul и statics0.mul запишу результат в файлик который прочитаю injection. :)


Top
   
 Post subject:
PostPosted: 2004-10-19 11:44:22 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Shaud wrote:
Это просто замечательно :)
Я начал писать функцию для вытаскивания тайлов из map0.mul и statics0.mul, Но без launch я придумал только заранее разобрать их на 768 текстовых файлов с координатами - соответсвующими им тайлами, и потом искать в соответсвующем файле из Injection, а теперь смогу вместо этого просто искать в map0.mul и statics0.mul запишу результат в файлик который прочитаю injection. :)


Можешь результат писать в реестр, в переменные Изи, а в инжекте читать через GetEasyUO...


Top
   
 Post subject:
PostPosted: 2004-10-19 12:53:27 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Какая разница? Ну буду я не через свой файл обмениваться а через файл реестра...
Главное что можно запустить :)
А то наш сервер на RunUO кривых тайлов в WaitTargetTile не понимает. А теперь я смогу прямые доставать :)


Top
   
 Post subject:
PostPosted: 2004-10-19 22:22:03 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Все вроде дописал :)
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.



Last edited by Shaud on 2004-10-21 18:25:02, edited 1 time in total.

Top
   
 Post subject:
PostPosted: 2004-10-20 12:38:40 
Offline
Expert!
User avatar

Joined: 2004-04-04 21:40:09
Posts: 1007
Не забудь что есть еще динамические тайлы. ВИП лес, ВИП шахта например.


Top
   
 Post subject:
PostPosted: 2004-10-20 12:51:13 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
А они в каких файлах хранятся?
Кстати, может кто нибудь привети пример использования команды launch?
поподробнее. а то как то странно она ведет с передачей параметров.
Иногда не то передает. или вообще не передает? разберусь расскажу подробнее.


Top
   
 Post subject:
PostPosted: 2004-10-20 12:56:22 
Offline
Expert!
User avatar

Joined: 2004-04-04 21:40:09
Posts: 1007
Shaud wrote:
А они в каких файлах хранятся?

Они не в файлах хранятся. Это объекты которые сервер присылает. С серийниками, типами, именами и все как положено. :)

Shaud wrote:
Кстати, может кто нибудь привети пример использования команды launch?
поподробнее. а то как то странно она ведет с передачей параметров.
Иногда не то передает. или вообще не передает? разберусь расскажу подробнее.


Никогда не пользовался.


Top
   
 Post subject:
PostPosted: 2004-10-20 13:05:05 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Ну даже не знаю...
А в какой момент он их присылает? При загрузке клиента, когда ты видишь эти самые динамические тайлы или?

Кто то может предложить лучшее решение по вытаскиванию тайлов чем мое?
Буду благодарен за идеи.


Top
   
 Post subject:
PostPosted: 2004-10-20 13:15:17 
Offline
Expert!
User avatar

Joined: 2004-04-04 21:40:09
Posts: 1007
Shaud wrote:
Ну даже не знаю...
А в какой момент он их присылает? При загрузке клиента, когда ты видишь эти самые динамические тайлы или?

По мере появления конечно, как всегда.

Shaud wrote:
Кто то может предложить лучшее решение по вытаскиванию тайлов чем мое?
Буду благодарен за идеи.

А что, твое не работает?


Top
   
 Post subject:
PostPosted: 2004-10-20 13:43:21 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Работает :)
Ну динамические тайлы вот не обрабатывает.
Может есть еще какой нибудь путь вытаскивать Тайлы?
Вот EasyUO например вытаскивает тайлы похоже функциями клиента Ультиы (Полуение ID тайлв там работаент только когда запущен клиент).
Кроме того мне не нравится обмен через файлы. Кстати, как ты в Object Pascal пишешь в реестр?
Хочу так тоже попробовать.


Top
   
 Post subject:
PostPosted: 2004-10-20 16:51:52 
Offline
Expert!

Joined: 2004-06-04 03:24:25
Posts: 333
Shaud wrote:
Ну даже не знаю...
А в какой момент он их присылает? При загрузке клиента, когда ты видишь эти самые динамические тайлы или?

Кто то может предложить лучшее решение по вытаскиванию тайлов чем мое?
Буду благодарен за идеи.

если объект,даже если это выглядит как пол шахты, имеет серийник, то его можно искать по uo.findtype() на земле, как обычный предмет и таргетить по сериалу, так что здесь всё предельно просто. даже waittargettile не понадобится.
Code:
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


Top
   
 Post subject:
PostPosted: 2004-10-21 18:27:19 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.Так что не получится. Воторое ты указываешь номер тайла. А задача как раз и стоит в том что бы его узнать. третее идентификатор тайла (как я понял) это ссылка на соответствующую картинку. а type (первый параметр findtype) это несколько другое...
Спасибо за предложение.


Top
   
 Post subject:
PostPosted: 2004-10-21 18:39:58 
Offline
Expert!
User avatar

Joined: 2004-04-04 21:40:09
Posts: 1007
Shaud wrote:
К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.


Бред.


Top
   
 Post subject:
PostPosted: 2004-10-21 18:43:11 
Offline
Expert!
User avatar

Joined: 2004-04-04 21:40:09
Posts: 1007
Shaud wrote:
третее идентификатор тайла (как я понял) это ссылка на соответствующую картинку. а type (первый параметр findtype) это несколько другое...


И то и другое - "графический тип объекта".


Top
   
 Post subject:
PostPosted: 2004-10-21 18:51:16 
Offline
Expert!
User avatar

Joined: 2004-04-04 21:40:09
Posts: 1007
AGRS wrote:
Shaud wrote:
К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.


Бред.


Вобще я бы исключил понятие тайла, только путаницу наводит.
Постараюсь пояснить.
WaitTargetTile это ловушка на ячейку мира. Ячейка имеет мировые координаты (X, Y и Z) и в ней вероятно содержатся статические и(или) динамические объекты. Поэтому для того чтобы конкретизировать свой выбор, мы должны еще указать и графический тип этого объекта. Перебором в статике, на карте и в объектах (присланных сервером) мы выбираем любой графический тип из нужного нам логического (дерево, скала, вода) и используем его в качестве параметра тайл.


Top
   
 Post subject:
PostPosted: 2004-10-21 20:15:24 
Offline
Expert!

Joined: 2004-06-04 03:24:25
Posts: 333
Shaud wrote:
К сожалению Тайл и обьект это разные вещи и сериала тайл не имеет.Так что не получится. Воторое ты указываешь номер тайла. А задача как раз и стоит в том что бы его узнать. третее идентификатор тайла (как я понял) это ссылка на соответствующую картинку. а type (первый параметр findtype) это несколько другое...
Спасибо за предложение.

значит так. разгребать, так разгребать. на самом деле "тайл", в нашей с вами терминологии, - это "нечто", "вшитое" в статику, то есть - имеющее координаты и objtype, но не имеющее серийника. а почему "не имеющее"? да потому, что оно и не обязано его иметь, так как серийники раздаются лишь тем объектам, которые были созданы во время игры, и поэтому обязаны быть сохраненными при первом же сейве мира, а чтобы их как-то отличать друг от друга (не дай бог два одинаковых стоят по одним и тем же координатам), им и раздают серийные номера, а так же для удобства поиска конкретного объекта, изменения его свойств, или удаления из мира, в чем статика, естественно, не нуждается.
далее, насчет VIP территорий - они создаются, как правило, во время игры и, впоследствии, сохраняются вместе с миром. то есть, допустим, где-то в грин акрах, надо создать пол шахты. тогда стафф мембер пишет соответствующую команду, допустим "createitem", с указанием objtype, потом указывает, где именно, и на этом месте уже готовый объект, при чем неважно, что это - кусок горы, пол шахты, или кирка, и т.д., в любом случае будет создан объект, имеющий, кроме всего проего, еще и серийник, так как иначе сервер не будет "знать", на что конкретно мы хотим кинуть таргет, при выполнении каких-либо действий, если по одним и тем же координатам находится два и более однотипных объекта (в нашем случае - клетки пола шахты).


Top
   
 Post subject:
PostPosted: 2004-10-22 09:48:13 
Offline

Joined: 2004-09-27 21:42:27
Posts: 87
Вот пример процедуры для пользования моей программкой и тест к ней :) Работает! :) у меня.

Code:
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


Last edited by Shaud on 2004-10-22 10:06:36, edited 1 time in total.

Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 37 posts ]  Go to page 1 2 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 9 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited