Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Как узнать номер тайла
Как узнать номер тайла
играю на рануо сервере, в пещерах бывает 4 разных вида пола от 1339 до 1343
так как все возможные скрипты на мининг усматривают только варинт а ля:
TargetToTile(1342, GetX(self)+x, GetY(self)+y, GetZ(self));
то выходит что он не сможет во всех пещерах копать.
Хотел сделать проверку на тайл перед тем как кидать на него таргет, чтобы узнать какой пол в этом месте и уже учитывая номер тайла кидать на него таргет.
При всём при том, что в одной пещере может быть несколько вариантов пещерного пола.
возможно ли узнать номер тайла или есть путь меньшего сопротивления?
так как все возможные скрипты на мининг усматривают только варинт а ля:
TargetToTile(1342, GetX(self)+x, GetY(self)+y, GetZ(self));
то выходит что он не сможет во всех пещерах копать.
Хотел сделать проверку на тайл перед тем как кидать на него таргет, чтобы узнать какой пол в этом месте и уже учитывая номер тайла кидать на него таргет.
При всём при том, что в одной пещере может быть несколько вариантов пещерного пола.
возможно ли узнать номер тайла или есть путь меньшего сопротивления?
Можно вот так
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
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
однако чтото показывает, да не то:
вот в принципе должно работать но выдаёт:
Tile = 168 | Z = -5
и не может понять где копать.
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
и не может понять где копать.
большое спасибо по моему срабатывает:
теперь буду оптимировать
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.
а с чего ты взял, что нужный тебе слой статики - это всегда нулевой?
нулевой наоборот, обычно не тот, что надо.
перебирай все слои, и сверяй их со своим массивом нужных тайлов, если да - только тогда пользовать.
нулевой наоборот, обычно не тот, что надо.
перебирай все слои, и сверяй их со своим массивом нужных тайлов, если да - только тогда пользовать.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
собственно вопрос, пока на работе не могу проверить:
под нулевым слоем имеется в виду вот это обращение?
правильно ли я понимаю что слои это то что накладывается на одну плитку мира. Т.е. все слои деревьев, дома, итд?
но так как мне нужно обращатся "всего лиш" к слою на котором лежит статика пещерного пола то логично будет предположить что в принципе там всегда только первый слой и эффективней будет использовать:
я ошибаюсь?
под нулевым слоем имеется в виду вот это обращение?
Code: Select all
Tile0.Statics[0].Tile
но так как мне нужно обращатся "всего лиш" к слою на котором лежит статика пещерного пола то логично будет предположить что в принципе там всегда только первый слой и эффективней будет использовать:
Code: Select all
Tile0.Statics[1].Tile
я ошибаюсь?
вопрос, создал жалкую пародию на работающий скрипт:
решил для теста испробовать не нулевой слой а первый на котором по моим представлениям должна лежать статика пещерного пола. Для этого заменил значение 0 на 1:
но стелс посмотрел на меня криво и ругнулся Out Of Range at 35.634
в принципя как я понимаю, за рамки массива я не выходил так как таковой не был созданн а я напрямик обращаюсь к первому слою?
или ошибка в изначально кривом восприятии куда впихивать указывание на слой?
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)
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)
в принципя как я понимаю, за рамки массива я не выходил так как таковой не был созданн а я напрямик обращаюсь к первому слою?
или ошибка в изначально кривом восприятии куда впихивать указывание на слой?
хмм нда может конечно только один и быть, смутило в скрипте просто слишком частое повторение
[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?
подозрение упало на то что он просто на некоторые тайлы таргет кинуть не может и поэтому не выдаёт сообщения о том что выкопал и выкопал ли.
[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?
подозрение упало на то что он просто на некоторые тайлы таргет кинуть не может и поэтому не выдаёт сообщения о том что выкопал и выкопал ли.
Вот макрос определяет тайлы для копки в шахте. Те что входят в заданные параметр от 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.
спасибо, интересный вариант решения вопроса. Заметил удивительную вещ, в верхней шахте минока скрипт напроч отказывается работать. Мой и от Санька тоже
Слоев в тайлах 0 поэтому в них проблемы не должно быть,
скрипт стопорится к обращению к статике в этом месте:
может конечно влияет высота в 60 единиц, но факт налицо.
проблема решаема или это только сугубо личный глюк?
Слоев в тайлах 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));
Code: Select all
18:34:01:224 [GRUMM]: Out Of Range at 69.964