Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Как узнать номер тайла

тут можно задать вопрос по скриптингу
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Как узнать номер тайла

Post by Insulin »

играю на рануо сервере, в пещерах бывает 4 разных вида пола от 1339 до 1343

так как все возможные скрипты на мининг усматривают только варинт а ля:
TargetToTile(1342, GetX(self)+x, GetY(self)+y, GetZ(self));

то выходит что он не сможет во всех пещерах копать.

Хотел сделать проверку на тайл перед тем как кидать на него таргет, чтобы узнать какой пол в этом месте и уже учитывая номер тайла кидать на него таргет.

При всём при том, что в одной пещере может быть несколько вариантов пещерного пола.

возможно ли узнать номер тайла или есть путь меньшего сопротивления?
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Можно вот так
function ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell; // Возвращает тип тайла с координатами и цветом, а так же количество слоев
function GetMapCell(X,Y: Word; WorldNum: Byte): TMapCell; // Возвращает тип тайла и его высоту
http://stealth.od.ua/forum/viewtopic.php?t=1220
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

однако чтото показывает, да не то:

Code: Select all

tile:= (GetMapCell((GetX(Self)+x),(GetY(Self)+y),WorldNum).tile);     
      
            UseObject(FindType(Shoveltype,backpack)); 
            WaitForTarget(5000);
            WaitTargetTile(tile,(GetX(Self)+x),(GetY(Self)+y),GetZ(Self));
вот в принципе должно работать но выдаёт:
Tile = 168 | Z = -5

и не может понять где копать.
Alexej
Novice
Novice
Posts: 79
Joined: 06.06.2008 11:55
Contact:

Post by Alexej »

юзай ReadStaticsXY - это статика, которую и надо копать
т.к. GetMapCell - а это мировые тайлы, они лежат под статикой
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

большое спасибо по моему срабатывает:

Code: Select all

Program findtiletype;
const

ShovelType =$0F39;

var 
    X0,Y0,Z0: Word; 
    Tile0: TStaticCell; 
    C,W0: Byte; 
begin 

      X0:=GetX(Self); 
      Y0:=GetY(Self); 
      Z0:=GetZ(Self); 
      W0:=WorldNum; 
      Tile0:=ReadStaticsXY(X0,Y0,W0); 
      C:=GetLayerCount(X0,Y0,WorldNum); 
      
      Addtosystemjournal(
      ' | Tile = ' +IntToStr(Tile0.Statics[0].Tile)+ 
      ' | X = ' +IntToStr(Tile0.Statics[0].X)+ 
      ' | Y = ' +IntToStr(Tile0.Statics[0].Y)+
      ' | Z = ' +IntToStr(Tile0.Statics[0].Z)); 
      

      UseObject(FindType(Shoveltype,backpack)); 
      WaitForTarget(5000);
      WaitTargetTile(Tile0.Statics[0].Tile,GetX(Self),GetY(Self),GetZ(Self));

end.
теперь буду оптимировать :)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

а с чего ты взял, что нужный тебе слой статики - это всегда нулевой?
нулевой наоборот, обычно не тот, что надо.

перебирай все слои, и сверяй их со своим массивом нужных тайлов, если да - только тогда пользовать.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

хмм, только подумал что всё понял а оказывается всё намного сложнее.

в принципе размышлял что 0 обозначает все слои. и он нужный сам вычислит

завтра значит придётся дальше ковырять....
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

собственно вопрос, пока на работе не могу проверить:

под нулевым слоем имеется в виду вот это обращение?

Code: Select all

Tile0.Statics[0].Tile
правильно ли я понимаю что слои это то что накладывается на одну плитку мира. Т.е. все слои деревьев, дома, итд?

но так как мне нужно обращатся "всего лиш" к слою на котором лежит статика пещерного пола то логично будет предположить что в принципе там всегда только первый слой и эффективней будет использовать:

Code: Select all

Tile0.Statics[1].Tile

я ошибаюсь?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

в случае с пещерой...возможно.

а в случае с деревьями и прочим - однозначно нет.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

вопрос, создал жалкую пародию на работающий скрипт:



Code: Select all

     X0:=GetX(Self); 
        Y0:=GetY(Self); 
        Z0:=GetZ(Self); 
        W0:=WorldNum; 
        Tile0:=ReadStaticsXY(X0+x,Y0+y,W0); 
        C:=GetLayerCount(X0,Y0,WorldNum); 
      
      Addtosystemjournal(
      ' | Tile = ' +IntToStr(Tile0.Statics[0].Tile)+ 
      ' | X = ' +IntToStr((Tile0.Statics[0].X)+x)+ 
      ' | Y = ' +IntToStr((Tile0.Statics[0].Y)+y)+
      ' | Z = ' +IntToStr(Tile0.Statics[0].Z));
       
      i:= 0
      repeat
      UseObject(FindType(Shoveltype,backpack)); 
      WaitForTarget(5000);
      WaittargetTile(Tile0.Statics[0].Tile,(Tile0.Statics[0].X)+x,(Tile0.Statics[0].Y)+y,GetZ(Self)); 
      i:=i+1;
      until (i > 5) OR (InJournalBetweenTimes(Mes1, Ctime, Now) <> -1) 
решил для теста испробовать не нулевой слой а первый на котором по моим представлениям должна лежать статика пещерного пола. Для этого заменил значение 0 на 1:

Code: Select all

     X0:=GetX(Self); 
        Y0:=GetY(Self); 
        Z0:=GetZ(Self); 
        W0:=WorldNum; 
        Tile0:=ReadStaticsXY(X0+x,Y0+y,W0); 
        C:=GetLayerCount(X0,Y0,WorldNum); 
      
      Addtosystemjournal(
      ' | Tile = ' +IntToStr(Tile0.Statics[1].Tile)+ 
      ' | X = ' +IntToStr((Tile0.Statics[1].X)+x)+ 
      ' | Y = ' +IntToStr((Tile0.Statics[1].Y)+y)+
      ' | Z = ' +IntToStr(Tile0.Statics[1].Z));
       
      i:= 0
      repeat
      UseObject(FindType(Shoveltype,backpack)); 
      WaitForTarget(5000);
      WaittargetTile(Tile0.Statics[1].Tile,(Tile0.Statics[1].X)+x,(Tile0.Statics[1].Y)+y,GetZ(Self)); 
      i:=i+1;
      until (i > 5) OR (InJournalBetweenTimes(Mes1, Ctime, Now) <> -1) 
но стелс посмотрел на меня криво и ругнулся Out Of Range at 35.634
в принципя как я понимаю, за рамки массива я не выходил так как таковой не был созданн а я напрямик обращаюсь к первому слою?

или ошибка в изначально кривом восприятии куда впихивать указывание на слой?
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

C:=GetLayerCount(X0,Y0,WorldNum);
Ты уверен что в той точке 2 слоя? Я думаю один )
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

хмм нда может конечно только один и быть, смутило в скрипте просто слишком частое повторение

[17:49:31] System: System Where do you wish to dig?
[17:49:33] System: System Where do you wish to dig?
[17:49:35] System: System Where do you wish to dig?
[17:49:37] System: System Where do you wish to dig?
[17:49:40] System: System Where do you wish to dig?
[17:49:42] System: System Where do you wish to dig?

подозрение упало на то что он просто на некоторые тайлы таргет кинуть не может и поэтому не выдаёт сообщения о том что выкопал и выкопал ли.
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Вот макрос определяет тайлы для копки в шахте. Те что входят в заданные параметр от 1338 по 1344 выводятся в журнал

Code: Select all

var 
    Tile0: TStaticCell; 
    W0: Byte; 
    tkaX, tkaY, minx, miny, maxx, maxy: integer;
    TkaT: Word; 
begin 
  minx := GetX(Self) - 4;
  maxx := GetX(Self) + 4;
  miny := GetY(Self) - 4;
  maxy := GetY(Self) + 4;

  W0:=WorldNum; 
  TkaX := minx;
  TkaY := miny;

  while true do 
  begin

 tkaX := tkaX + 1;
 If tkaX > maxx then
  begin
    tkaX := minx;
    TkaY := TkaY + 1;
  end;
 If TkaY > maxy then
  begin
    tkaX := minx;
    TkaY := miny;
    wait(30000);
  end;

  Tile0:=ReadStaticsXY(tkaX, tkaY, WorldNum); 
  TkaT := Tile0.Statics[0].Tile;
  If (TkaT > 1338) and (TkaT < 1344) then
  begin
    Addtosystemjournal('Точка ' + inttostr(Tkax) + ' ' + inttostr(TkaY)+ ' ' +IntToStr(TkaT)); 
  end;


  end;
end.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

я бы заодно перебрал еще и все слои, а не только нулевой...
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

спасибо, интересный вариант решения вопроса. Заметил удивительную вещ, в верхней шахте минока скрипт напроч отказывается работать. Мой и от Санька тоже

Слоев в тайлах 0 поэтому в них проблемы не должно быть,

Code: Select all

  LayersCount:=GetLayerCount(Tkax,Tkay,WorldNum); 
 Addtosystemjournal('layers ' + inttostr(Layerscount)); 
скрипт стопорится к обращению к статике в этом месте:

Code: Select all

  If TargetPresent then TargetToTile(Tile0.Statics[0].Tile,(Tile0.Statics[0].X)+x,(Tile0.Statics[0].Y)+y,Getz(Self)); 
может конечно влияет высота в 60 единиц, но факт налицо.

Code: Select all

18:34:01:224 [GRUMM]: Out Of Range at 69.964
проблема решаема или это только сугубо личный глюк?
Post Reply