Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Как узнать номер тайла
Оно все конечно отлично, только ты не у нас спрашивай об ошибке, а в журнал кидай все проверки.
Например. Ты таргетом тыкаешь в точку. Ты в систем журнал кинул что показывает стелс при определении этих координат?
Что я заметил. Если тыкнуть в точку где нет тайлов (черная пустота) то выскочит подобная ошибка.
У тебя ошибка, это в любом случае. Когда такое появляется при в журнал проверочку с значением переменной и если показыает 0 когда должно быть подругому вот тебе и место где нужно подумать )
Например. Ты таргетом тыкаешь в точку. Ты в систем журнал кинул что показывает стелс при определении этих координат?
Что я заметил. Если тыкнуть в точку где нет тайлов (черная пустота) то выскочит подобная ошибка.
У тебя ошибка, это в любом случае. Когда такое появляется при в журнал проверочку с значением переменной и если показыает 0 когда должно быть подругому вот тебе и место где нужно подумать )
да в журмал выводил всё возможное. Вот например после использования "только" на тайлы у которых больше чем 0 слоёв:
при чём как видно это уже не пещера в миноке
может он захватывает пространство где тайлы заканчиваются(чёрные) но тогда стоит вопрос в том как узнать это, по крайней мере в логе с.в. все типы тайлов правильно определяются
Code: Select all
21:21:21:493 [krafter1]: layers 1
21:21:22:312 [krafter1]: | Tile = 1343 | X = 4551 | Y = 3174 | Z = 0
21:21:22:608 [krafter1]: layers 1
21:21:23:436 [krafter1]: | Tile = 1343 | X = 4551 | Y = 3176 | Z = 0
21:21:23:843 [krafter1]: layers 1
21:21:24:668 [krafter1]: | Tile = 1350 | X = 4551 | Y = 3178 | Z = 0
21:21:24:967 [krafter1]: layers 2
21:21:25:777 [krafter1]: | Tile = 1343 | X = 4553 | Y = 3170 | Z = 0
21:21:26:183 [krafter1]: layers 1
21:21:26:993 [krafter1]: | Tile = 1343 | X = 4553 | Y = 3172 | Z = 0
21:21:27:310 [krafter1]: layers 1
21:21:28:119 [krafter1]: | Tile = 1343 | X = 4553 | Y = 3174 | Z = 0
21:21:28:429 [krafter1]: layers 1
21:21:29:254 [krafter1]: | Tile = 1344 | X = 4553 | Y = 3176 | Z = 0
21:21:29:554 [krafter1]: layers 1
21:21:30:380 [krafter1]: Out Of Range at 69.690
21:21:30:384 [krafter1]: Script Mining3.sc stopped successfuly
может он захватывает пространство где тайлы заканчиваются(чёрные) но тогда стоит вопрос в том как узнать это, по крайней мере в логе с.в. все типы тайлов правильно определяются
Code: Select all
If (TargetPresent) and (Tile0.StaticCount > 0) then TargetToTile(Tile0.Statics[0].Tile,(Tile0.Statics[0].X)+x,(Tile0.Statics[0].Y)+y,Getz(Self));
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
спасибо, частично помогло. Но пришлось ещё и жёстко привязывать копание к диапазону тайлов.
так как выяснил что он иногда и другие пытается копать, некоторые правда даже както обкапывает другие же приводят к вылетанию ошибки.
теперь выглядит вот так:
другой вопрос, как лучше всего выходить из цикла на подобие:
в принципе я знаю два метода Exit; и Break; но Exit завершает всю процедуру а Break; только тот цикл в котором он упоминается, если я не ошибаюсь. Есть ли аналог next; чтобы он действовал дальше по списку?
Или назначать во внутреннем цикле переменную а её во внешнем ещё раз проверять и тогда ещё один раз использовать Break;?
?
так как выяснил что он иногда и другие пытается копать, некоторые правда даже както обкапывает другие же приводят к вылетанию ошибки.
Code: Select all
10:00:17:845 [krafter1]: | Tile = 1351 | X = 4544 | Y = 3175 | Z = 0
10:00:18:142 [krafter1]: layers 1
10:00:18:459 [krafter1]: отработали тайл
10:00:18:972 [krafter1]: Out Of Range at 69.695
0:04:44:357 [krafter1]: | Tile = 1344 | X = 4553 | Y = 3176 | Z = 0
10:04:44:654 [krafter1]: layers 1
10:04:44:951 [krafter1]: отработали тайл
10:04:45:469 [krafter1]: Out Of Range at 69.695
Code: Select all
If TargetPresent and (Tile0.StaticCount > 0)
and (Tnum > 1338)
and (Tnum < 1344) then
Begin
TargetToTile(Tile0.Statics[0].Tile,(Getx(Self))+x,(Gety(self))+y,(Getz(self)));
End
Else
Begin
CancelTarget;
Addtosystemjournal('ïëîõîé òàéë ');
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));
Exit;
End;
другой вопрос, как лучше всего выходить из цикла на подобие:
Code: Select all
for x:=-2 to 2 do
begin
for y:=-2 to 2 do
begin
repeat
until ...
end;
end;
Или назначать во внутреннем цикле переменную а её во внешнем ещё раз проверять и тогда ещё один раз использовать Break;?
Code: Select all
for x:=-2 to 2 do
begin
for y:=-2 to 2 do
begin
repeat
if ... then mining:=false; Break;
until
if mining = false then Break;
end;
end;
чем дальше в лес тем больше дров:
18:25:45 : прыгаем на рунку с номером: 60
18:25:48 : Exception: List index out of bounds (-1) at 55.1102
18:25:48 : Script Mining4.sc stopped successfuly
сейчас работает по крайней мере больше 10 минут стабильно (возможно потому что вырубил другой стелс)
Если к вечеру ситуация станет хуже, выложу "глючную" процедуру мининга.
18:25:45 : прыгаем на рунку с номером: 60
18:25:48 : Exception: List index out of bounds (-1) at 55.1102
18:25:48 : Script Mining4.sc stopped successfuly
сейчас работает по крайней мере больше 10 минут стабильно (возможно потому что вырубил другой стелс)
Если к вечеру ситуация станет хуже, выложу "глючную" процедуру мининга.
всё намного веселее чем я думал.
скрипт работает, НО если он только у одного чара одновременно запущенн. При чём не имеет значения в другом стелсе или в томже самом стелсе он работает. Вылетает всёравно с оут оф ранге.
Теперь гипотетический вопрос: возможен ли такой вариант развития событий, что стелс использует для сохранения служебной информации/переменных одну и ту же ячейку памяти что соответственно приводит к сбою в других инстанциях стелса?
скрипт работает, НО если он только у одного чара одновременно запущенн. При чём не имеет значения в другом стелсе или в томже самом стелсе он работает. Вылетает всёравно с оут оф ранге.
Теперь гипотетический вопрос: возможен ли такой вариант развития событий, что стелс использует для сохранения служебной информации/переменных одну и ту же ячейку памяти что соответственно приводит к сбою в других инстанциях стелса?
А косяк выскакивает часом не в момент передвижения чара (MoveXY)?
Просто в текущей версии есть баг в ходилке вываливающий эту ошибку (в текущей тестовой версии исправлен).
В качестве временного лекарства могу порекомендовать ходилку
EasyMoveXY - от Грюндика, в ней этот баг устранен.
Просто в текущей версии есть баг в ходилке вываливающий эту ошибку (в текущей тестовой версии исправлен).
Code: Select all
13:08:01 [Lww]: Starting Mining script at : 24.08.2009 13:08:01
13:08:01 [Lww]: Go to : [0] 5670.2674
13:08:07 [Lww]: Mover: Resync is pending, ignoring.
13:08:20 [Lww]: *** Mining ...
13:08:46 [Lww]: Go to : [2] 5669.2675
13:08:47 [Lww]: *** Mining ...
13:08:58 [Lww]: Go to : [4] 5668.2677
13:08:58 [Lww]: Mover: Client Canceled. Point not Passable.
13:08:59 [Lww]: *** Mining ...
13:09:26 [Lww]: *** Mining ...
13:09:59 [Lww]: Go to : [7] 5665.2680
13:10:00 [Lww]: Out Of Range at 43.567
EasyMoveXY - от Грюндика, в ней этот баг устранен.
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
приветствую, извиняюсь за долгое отсуствие, работа...
Ходилка как таковая в скрипте не используется. Вылетает в определённых пещерах/местах.
вот почищенный код с проверками:
на данный момент вылетает после сообщения:
по моему восприятию всё сделанно правильно. Но может всётаки чтото не учёл. Если же всё в теории должно работать то могу дать тестчара в нужной пещере.
p.s. есть смутные подозрения что виновник торжества находится в указаниях X0 + x и Y0 + y, так как на начальной стадии х и у негативные тоесть -2 и являются integer в то время как X0 и Y0 являются Word и если память не изменяет то негативные значения не принимает.
но установив все переменные в integer получаю тот же самый результат
п.п.с. логичнее предположить что ошибка в:
ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell;
Statics : Array of TStaticItem;
Ходилка как таковая в скрипте не используется. Вылетает в определённых пещерах/местах.
вот почищенный код с проверками:
Code: Select all
Program Mining;
//{$Include 'all.inc'}
var
X0,Y0,Z0,Tnum: Word;
Tile0: TStaticCell;
W0: Byte;
x,y, i,k : integer;
xf,yf, LayersCount : word;
i1,i2,nr : integer;
MiningFlag : Boolean; // true - работаем, false - нет (разгрузка или смерть)
Const
Bags = $0E75;
ShovelType =$0F39;
Mes1 = 'no metal';
Mes2 = 'far away';
Mes3 = 'too far away';
function CheckShovel : Boolean;
begin
Result := true;
if (CountEx(ShovelType, $FFFF, backpack) < 1) then
begin
Result := false;
wait(500);
//checksave;
end;
end;
procedure Mine;
var
cTime : TDateTime;
begin
AddToSystemJournal('установили cTime, начинаем цикл for');
for x:= -2 to 2 do
begin
AddToSystemJournal('переменная x с -2 до +2');
wait(100);
for y:= -2 to 2 do
begin
AddToSystemJournal('переменная y с -2 до +2');
repeat
waitconnection(5000);
AddToSystemJournal('повторный цикл, дождались связи');
if not CheckShovel then
begin
AddToSystemJournal('нету лопат, ставим флаг и выходим из цикла');
MiningFlag:=False;
Exit;
end;
if TargetPresent then CancelTarget;
AddToSystemJournal('приверили таргет');
if WarMode = true then SetWarMode(false);
AddToSystemJournal('проверили вармод');
if (weight>(MaxWeight-40)) then Begin MiningFlag := False; Exit; End;
cTime := Now;
AddToSystemJournal('cTime установили, проверили флаги');
wait(250);
X0:=GetX(Self);
Y0:=GetY(Self);
Z0:=GetZ(Self);
W0:=WorldNum;
AddToSystemJournal('установил значение переменный X0,Y0,Z0,W0');
Tile0:=ReadStaticsXY(X0+(x),Y0+(y),W0);
AddToSystemJournal('установил значение переменной Tile0');
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));
Tnum := Tile0.Statics[0].Tile;
AddToSystemJournal('установил Tnum');
UseObject(FindType(ShovelType,backpack));
AddToSystemJournal('использую лопату и жду таргета');
WaitForTarget(2000);
if TargetPresent and (Tile0.StaticCount > 0)
and (Tnum > 1338)
and (Tnum < 1344)
and (MiningFlag = true) then
Begin
AddToSystemJournal('если все условия выполненны то кидаем таргет на тайл');
TargetToTile(Tile0.Statics[0].Tile,(Getx(Self))+(x),(Gety(self))+(y),(Getz(self)));
End
Else
Begin
AddToSystemJournal('если нет то скидываем таргет');
CancelTarget;
Addtosystemjournal('указываем на плохой тайл: ');
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));
Exit;
End;
i:=0;
AddToSystemJournal('обозначаем переменную i: ' +intTostr(i));
repeat
wait(200);
AddToSystemJournal('обрабатываем тайл');
UseObject(FindType(ShovelType,backpack));
WaitForTarget(2000);
If TargetPresent and (Tile0.StaticCount > 0) and (Tnum > 1338) and (Tnum < 1344) then
Begin
AddToSystemJournal('проверка на все возможные условия если да то кидаем таргет на тайл');
TargetToTile(Tile0.Statics[0].Tile,(Getx(Self))+x,(Gety(self))+y,(Getz(self)));
End
Else
Begin
CancelTarget;
Addtosystemjournal('в принципе не возможно но ещё один плохой тайл: ');
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 := 10;
Break;
End;
checksave;
i := i+1;
until (InJournalBetweenTimes(Mes1, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes2, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes3, Ctime, Now) <> -1)
or (i>=10)
or Dead
or (weight>(MaxWeight-40))
or ((Tnum < 1339) and (Tnum > 1343))
// if Paralyzed OR Poisoned OR (Life < MaxLife) then Begin UOSay('guards'); fastrecall; sjob; Exit; End;
if (weight>(MaxWeight-40)) then Begin MiningFlag := False; Exit; End;
wait(200);
until (InJournalBetweenTimes(Mes1, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes2, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes3, Ctime, Now) <> -1)
or Dead
or (weight>(MaxWeight-40))
or (i >= 10)
or ((Tnum < 1339) and (Tnum > 1343))
//or (LayersCount <1);
Addtosystemjournal('отработали тайл');
end;
Addtosystemjournal('отработали Y');
end;
Addtosystemjournal('отработали X');
end;
BEGIN
MiningFlag := true;
repeat
WaitTargetSelf;
UseSkill('Detecting Hidden');
if (Weight < (MaxWeight-40)) then MiningFlag :=true;
if (MiningFlag = true) and (Weight < (MaxWeight-40)) then Mine;
AddToSystemJournal('поминили');
AddToSystemJournal('Вес: '+IntToStr(Weight) +' Количество Лопат: ' + IntToStr(Count(ShovelType)));
until (1<>1);
END.
Code: Select all
15:27:44 [krafter1]: установил значение переменной Tile0
15:27:44 [krafter1]: Out Of Range at 35.1304
15:27:44 [krafter1]: Script outofrange.sc stopped successfuly
p.s. есть смутные подозрения что виновник торжества находится в указаниях X0 + x и Y0 + y, так как на начальной стадии х и у негативные тоесть -2 и являются integer в то время как X0 и Y0 являются Word и если память не изменяет то негативные значения не принимает.
но установив все переменные в integer получаю тот же самый результат
п.п.с. логичнее предположить что ошибка в:
ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell;
Statics : Array of TStaticItem;