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

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

тут можно задать вопрос по скриптингу
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

тк слоев 0, то обращение к Tile0.Statics[0] и дает такую ошибку.
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

хм, но в клиенте он же както копает в этой пещере
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Оно все конечно отлично, только ты не у нас спрашивай об ошибке, а в журнал кидай все проверки.
Например. Ты таргетом тыкаешь в точку. Ты в систем журнал кинул что показывает стелс при определении этих координат?
Что я заметил. Если тыкнуть в точку где нет тайлов (черная пустота) то выскочит подобная ошибка.
У тебя ошибка, это в любом случае. Когда такое появляется при в журнал проверочку с значением переменной и если показыает 0 когда должно быть подругому вот тебе и место где нужно подумать )
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

да в журмал выводил всё возможное. Вот например после использования "только" на тайлы у которых больше чем 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
при чём как видно это уже не пещера в миноке

может он захватывает пространство где тайлы заканчиваются(чёрные) но тогда стоит вопрос в том как узнать это, по крайней мере в логе с.в. все типы тайлов правильно определяются
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

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));
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

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

так как выяснил что он иногда и другие пытается копать, некоторые правда даже както обкапывает другие же приводят к вылетанию ошибки.

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; 
в принципе я знаю два метода Exit; и Break; но Exit завершает всю процедуру а Break; только тот цикл в котором он упоминается, если я не ошибаюсь. Есть ли аналог next; чтобы он действовал дальше по списку?
Или назначать во внутреннем цикле переменную а её во внешнем ещё раз проверять и тогда ещё один раз использовать 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; 
?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

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

Post by Insulin »

Vizit0r wrote:Continue;
спасибо,

возможно чтолибо изменить в Tile0:=ReadStaticsXY(X0+(x),Y0+(y),W0); и соответственно "Tile0.Statics[0].Tile" всётаки на нём вырубает скрипт с Out Of Range, хотя все возможные проверки уже учтенны.
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

значит не все. код в студию
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

чем дальше в лес тем больше дров:

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 минут стабильно (возможно потому что вырубил другой стелс)

Если к вечеру ситуация станет хуже, выложу "глючную" процедуру мининга.
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

всё намного веселее чем я думал.

скрипт работает, НО если он только у одного чара одновременно запущенн. При чём не имеет значения в другом стелсе или в томже самом стелсе он работает. Вылетает всёравно с оут оф ранге.

Теперь гипотетический вопрос: возможен ли такой вариант развития событий, что стелс использует для сохранения служебной информации/переменных одну и ту же ячейку памяти что соответственно приводит к сбою в других инстанциях стелса?
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

Если в одном работающем экземпляре такое можно допустить, то в двух разных нет. Стукни в аську, попробуем разобраться.
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

А косяк выскакивает часом не в момент передвижения чара (MoveXY)?
Просто в текущей версии есть баг в ходилке вываливающий эту ошибку (в текущей тестовой версии исправлен).

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 - от Грюндика, в ней этот баг устранен.
"Как хочешь ты трудись;
Но приобресть не льстись
Ни благодарности, ни славы,
Коль нет в твоих трудах ни пользы, ни забавы. (с) С.Крылов."
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

приветствую, извиняюсь за долгое отсуствие, работа...

Ходилка как таковая в скрипте не используется. Вылетает в определённых пещерах/местах.

вот почищенный код с проверками:

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;
Insulin
Neophyte
Neophyte
Posts: 27
Joined: 22.08.2009 11:37

Post by Insulin »

ээх, походу разобрался. Его выкидывало при обращении к статике, если количество статики равнялось нулю. Если же всюду перед обращением добавлять проверку а ля:

if (Tile0.StaticCount > 0) then

то всё наконец то начинало работать (надеюсь)
Post Reply