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.567EasyMoveXY - от Грюндика, в ней этот баг устранен.
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
						Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
приветствую, извиняюсь за долгое отсуствие, работа...
Ходилка как таковая в скрипте не используется. Вылетает в определённых пещерах/местах.
вот почищенный код с проверками:
на данный момент вылетает после сообщения:
по моему восприятию всё сделанно правильно. Но может всётаки чтото не учёл. Если же всё в теории должно работать то могу дать тестчара в нужной пещере.
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;




