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

Как передать значение массива в процедуру ?

тут можно задать вопрос по скриптингу
Xtreem
Neophyte
Neophyte
Posts: 44
Joined: 02.12.2006 4:29

Как передать значение массива в процедуру ?

Post by Xtreem »

Есть процедура рекола, пытаюсь из тела скрипта передать переменную массива, все просто заканчивается ничем на процедуре висим пока не достигаем лимита для отключения скрипта. Заранее спасибо.

Code: Select all

...
var
...

r_cave : array[1..16] of integer;
j : integer;
rune : integer;

...

procedure recal_rb(rune : integer);
   var tmpr : Integer;
   mx, my, k, Res : Integer;

   begin
repeat
      Res := 0;
   tmpr := rune;
   UseObject(runebook_cave);
   while GetGumpID(GetGumpsCount-1) <> $01CC do
      wait(550);
   waitgump(IntToStr(tmpr));
   wait(1000)   
   mx := GetX(self);
   my := GetY(self);
      k := 0;
   repeat
      wait(500)
      k := k + 1;
   until (mx<>GetX(self)) or (my<>GetY(self)) or Dead or (k = 20)

   if (mx<>GetX(self)) or (my<>GetY(self)) then Res := 1;

until Res = 1;  
end;

...

begin
  ScriptStartTime := Now;
  HowManyDischarge := 0;
  StartFlag := 1;
  j:=1;
  r_cave[1]:=7;
  r_cave[2]:=13;
  r_cave[3]:=19;
  r_cave[4]:=25;
  r_cave[5]:=31;
  r_cave[6]:=37;
  r_cave[7]:=43;
  r_cave[8]:=49;
  r_cave[9]:=55;
  r_cave[10]:=61;
  r_cave[11]:=67;
  r_cave[12]:=73;
  r_cave[13]:=79;
  r_cave[14]:=85;
  r_cave[15]:=91;
  r_cave[16]:=97;
   repeat
      CheckDead;
      rune := r_cave[j];
   recal_rb(rune);
      repeat
         CheckDead;
         if Dead then break;
         checkPickaxe;
         minret := MiningAround;
         CheckDead;
         if Dead then break;
         if minret = 4 then  checkpickaxe;
         if minret = 1 then j:=j+1;
      until minret = 2;
      CheckDead;
   recal_rb(r_home);
      if not Dead then

 ...

end.
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Емн вопрос сбли с толку. Все процедуры сам писал или взял у когото?
Рекол с рунбуки вот recal_rb(rune);
ищет в нем нем нужную кнопку и жмет. Или ты интересуешся правильно ли написанна сама процедура? Или правильно ли посылаешь из скрипта? Или надо чтобы реколился по очереди по рунам?
Xtreem
Neophyte
Neophyte
Posts: 44
Joined: 02.12.2006 4:29

Post by Xtreem »

Процедура взята с скрипта на мининг by v26RuS.

Code: Select all

procedure recal_rb(rune : integer);
   var tmpr : Integer;
   mx, my, k, Res : Integer;

   begin
repeat
      Res := 0;
        CheckDead;
AddToSystemJournal('Пытаемся рекольнуться');
   tmpr := rune;
   waitgump(IntToStr(tmpr));
wait(1000)
   UseObject(runebook);
   mx := GetX(self);
   my := GetY(self);
      k := 0;
   repeat
      wait(500)
      k := k + 1;
   until (mx<>GetX(self)) or (my<>GetY(self)) or Dead or (k = 20)

   if (mx<>GetX(self)) or (my<>GetY(self)) then Res := 1;

until Res = 1;
end;
Моя цель, чтобы в процедуру передавалась переменная массива r_cave[j] как видно в нем 16 елементов(руны), всем присвоен номер батона в рунбук гампе. В теории все должно работать, но как свидетельствует эта тема, не все так просто.
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

Code: Select all

rune := r_cave[j]; 
recal_rb(rune);
именно в этом коде проблем нет. косяк вероятно в procedure recal_rb(rune : integer);
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Если проблема в в процедуре, то я б ее сделал попроще. Невижу смысла задавать значения r_cave[1]:=7; а потом переводить в строку. Сдесь как раз и может быть сложность.
Лучше сразу r_cave[1]:= '7'; и потом в процедуре там где waitgump(IntToStr(tmpr)); заменить на WaitGump(rune);
А еще бы сначало бы юзал рунбук а потом уже делал бы вайт джамп
Xtreem
Neophyte
Neophyte
Posts: 44
Joined: 02.12.2006 4:29

Post by Xtreem »

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

Не буду засорять раздел, поэтому продолжу марафон вопросов.

Процедура обкопки, используют ее я так понял в всех скриптах на мининг которые есть на этом форуме. Столкнулся с проблемой тайлов, скрипт начинает висеть как только появляется таргет. Потыкал infotile'om, по шахте нарыл 12 тайлов различных по id. Создал массив с тайлами, засунул в цикл для проверки, если таргет остается после клика на тайл то перебираем тайлы, пока их количество не достигнет конца. Но опять же результат отрицательный копать отказывается привожу процедуру ниже.

Code: Select all

function MiningAround : Integer ;
   var k, r, x, y : Integer;
   var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mw1, ms1 : Integer;
   var ctime : TDateTime;
   begin
      m_tile[1] := 1340;
      m_tile[2] := 1341;
      m_tile[3] := 1342;
      m_tile[4] := 1343;
      m_tile[5] := 1344;
      m_tile[6] := 1345;
      m_tile[7] := 1346;
      m_tile[8] := 1347;
      m_tile[9] := 1348;
      m_tile[10] := 1349;
      m_tile[11] := 1350;
      m_tile[12] := 1351;
      m_tile[13] := 1352;
      m := 1;
      Result := 1;
      for x := -2 to 2 do
      begin
         for y := -2 to 2 do
         begin
            r := 0;
            repeat
               waitconnection(5000);
               if not CheckPickaxe then
               begin
                  Result := 4;
                  addtosystemjournal('íåòó êèðêè');
                  exit;
               end;
               repeat
               if TargetPresent then CancelTarget;
               if WarMode = true then SetWarMode(false);
               ctime := Now;
               UseObject(FindType($0F39,$FFFF));
               WaitForTarget(5000);
               If TargetPresent then TargetToTile(m_tile[m], GetX(self)+x, GetY(self)+y, GetZ(self));
               if TargetPresent then m := m + 1;
               until m >= 13
               m:=1;  
               k := 0;
               repeat
                  wait(100);
                  k := k + 1;
                  checksave;
                  mn1 := InJournalBetweenTimes(M_nothing1, ctime, Now);
                  mn2 := InJournalBetweenTimes(M_nothing2, ctime, Now);
                  mn3 := InJournalBetweenTimes(M_nothing3, ctime, Now);
                  mn4 := InJournalBetweenTimes(M_nothing4, ctime, Now);
                  mn5 := InJournalBetweenTimes(M_nothing5, ctime, Now);
                  mn6 := InJournalBetweenTimes(M_nothing6, ctime, Now);
                  mf1 := InJournalBetweenTimes(M_fizzles1, ctime, Now);
                  ms1 := InJournalBetweenTimes(M_success, ctime, Now);
               until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mf1<>-1) or (ms1<>-1) or Dead or (k > 300);
              if InJournalBetweenTimes('heavy', ctime, Now) <> -1 then
      begin
        Result := 6
        exit;
          end;

               if Weight > MyMaxWeight then
               begin
                  Result := 2;
                  exit;
               end;
               if (mf1<>-1) then
               begin
                  r := r + 1;
                  if r >= 10 then break
                  else continue;
               end;
               if (mw1<>-1) then wait(3000);
            until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1);
         end;
      end;
   end;
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

UseObject(FindType($0F39,$FFFF));
это мне не нравится, лучше UseObject(FindType($0F39,self));
или backpack
Вот тема по тайлам для манинга http://stealth.od.ua/forum/viewtopic.ph ... sc&start=0
Last edited by SaNeK on 03.03.2010 16:42, edited 2 times in total.
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Тем более вот тут TargetToTile(m_tile[m], GetX(self)+x, GetY(self)+y, GetZ(self));
ты тыкаешь в одну и туже точку по всем тайлам. Давай подумаем логически. Если тыкнуть таргетом в место которого не существует что будет? На одних серверах скажит что такое невозможно другие просто промолчат (в болшинстве случаев).
Так вот ты тыкаешь в пустое место а потом у тебя идет

Code: Select all

repeat 
                  wait(100); 
                  k := k + 1; 
                  checksave; 
                  mn1 := InJournalBetweenTimes(M_nothing1, ctime, Now);
тоесть ищит нужную месагу в журнале. Естественно, если ее нету то и не находит.
Чтобы не тыкать в пустое место а сразу наверняка на тайл где есть руда посмотри ссылочку. Те команды позволяют узнать какие тайлы есть в той или иной координате и когда она совпадает с теми где можно копать тыкает в координату с нужным тайлом.
Там есть мой пример определения тайлов в радиусе 4 вокруг себя где можно копать и вывод их в журнал.
Да, и на каком ты сервере играешь?
Xtreem
Neophyte
Neophyte
Posts: 44
Joined: 02.12.2006 4:29

Post by Xtreem »

Спасибо SaNeK, буду сейчас разбираться. Сервер ROFL(UO:ML).
Xtreem
Neophyte
Neophyte
Posts: 44
Joined: 02.12.2006 4:29

Post by Xtreem »

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

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 - нет (разгрузка или смерть)
r_cave: array [1..16] of string;
j : integer;

Const
Bags = $0E75;
ShovelType =$0F39;
Mes1 = 'no metal';
Mes2 = 'far away';
Mes3 = 'too far away';
Ore5 = $3193;
Ore6 = $3192;
Ore7 = $3198;
Ore8 = $3197;
Ore9 = $3194;
Ore10 = $3195;
Ore1 = $19B7;               // 1 Ore
Ore2 = $19BA;               // 2 Ore
Ore3 = $19B8;               // 3 Ore
Ore4 = $19B9;               // 4 Ore
ingot = $1BF2;
ttools = $1EB8;
sunduk_With_Iron_and_Tools = $4013C4DD;
Mes4 = 'There is no ore here to mine';
runebook = $400F2A64;
runebook_cave = $4024A059;       // Runebook
r_home = '7';
r_bank = '13';


procedure home; 
begin
repeat
Cast('Sacred Journey');
waitfortarget(2000);
until targetpresent = true 
targettoobject(runebook)
end;



//#########################################################
procedure Check_Iron;
 begin
  FindTypeEx(Ingot,$0000,Backpack,False);
  if (FindCount=0) OR (GetQuantity(FindItem)<5) then
    begin
      AddToSystemJournal('Добираем инги.')
      UseObject(Sunduk_With_Iron_and_Tools);
      wait(1000);
      FindTypeEx(Ingot,$0000,Sunduk_With_Iron_and_Tools,False);
      if (FindCount>0) and (GetQuantity(FindItem)>100) then
        begin
          MoveItem(FindItem,100,Backpack,0,0,0);
          wait(1000);
        end
      else
        AddToSystemJournal('Ошибка во время добора Iron Ignots.');
        exit;
    end;
   FindType(Ingot,Ground);
   if FindCount>0 then
     begin
       MoveItem(ingot,$FFFF,Sunduk_With_Iron_and_Tools,0,0,0);
       wait(500);
     end
 end;

//#########################################################
procedure recal_rb(rune : string);
   var 
   mx, my, k, Res : Integer;
begin
repeat
  Res := 0;
    AddToSystemJournal('Пытаемся рекольнутся.');
    //repeat
   while GetGumpID(GetGumpsCount-1) <> $0059 do begin
     //if (Weight > (MaxWeight-71)) or (CountEx(ShovelType, $FFFF, backpack) < 1) then 
     //begin
       //if rune = r_home then 
       //begin
       //addtosystemjournal('Используем рунбук в дом.'); 
       //UseObject(runebook);
       //wait(550)
       ///else 
       addtosystemjournal('Используем рунбук в шахту.');
       UseObject(runebook_cave);
       wait(2000);
       //end 
   // until GetGumpID(GetGumpsCount-1) <> $0059       
   end;
   mx := GetX(self);
   my := GetY(self);
   k := 0;
   waitgump(rune);
   wait(2000)   
   addtosystemjournal('Проверяем изменились ли координаты');
   repeat
      wait(500)
      k := k + 1;
   until (mx<>GetX(self)) or (my<>GetY(self)) or Dead or (k = 20)

   if (mx<>GetX(self)) or (my<>GetY(self)) then begin
   Res := 1;
   addtosystemjournal('Все хорошо координаты изменились');
   end;

until Res = 1;
end;
   
//#########################################################
function CheckShovel : Boolean;
  var
  TimeStart : TDateTime;
begin
  Result := true;
  if (CountEx(ShovelType, $FFFF, backpack) < 1) then
  begin
  addtosystemjournal('Пора делать лопаты');
  if (Getx(self) <> 1630) and (Gety(self) <> 1067) then 
  begin
  home;
  addtosystemjournal('Реколимся к дому');
  end;
  Check_Iron;
  addtosystemjournal('Проверяем металл в паке');
  timestart:=now;
  k :=0
  addtosystemjournal('Начинаем крафт лопат');
  repeat
    useobject(findtype(ttools,Backpack));
    while GetGumpID(GetGumpsCount-1) <> $01CC do
      wait(550);
    WaitGump('9002');
    while GetGumpID(GetGumpsCount-1) <> $01CC do
      wait(550);
    WaitGump('18');
    wait(1000);
    k:=k+1;
    CheckSave;
    until (injournalbetweentimes('You put|failed', TimeStart, Now)<>-1) or (k > 4)
    wait(100);
    end;
    MoveItem(ingot,$FFFF,Sunduk_With_Iron_and_Tools,0,0,0);
    wait(500);
    result := true;
   end;


//#########################################################
function DischargeSunduk : Boolean;
   // 1 - Все ок.
   // 0 - Лажа.
   var tmpcnt : Integer;
      tmpid : Cardinal;
      tmpconnect : TDateTime;
   begin
            addtosystemjournal('Пришли на разгрузку');
      Result := true;
      waitconnection(3000);
      tmpconnect := ConnectedTime;
      //CheckDead;
      if Dead then
      begin
         Result := false;
         exit;
      end;
      addtosystemjournal('Открываем сундук с металлом');
      UseObject(sunduk_With_Iron_and_Tools);
      checksave;
      // Переместим руду
      tmpcnt := 0;
      repeat
         tmpid := FindTypeEx(Ore1,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore2,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore3,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore4,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore5,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore6,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore7,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore8,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore9,$FFFF,Backpack,False);
         if tmpid = 0 then tmpid := FindTypeEx(Ore10,$FFFF,Backpack,False);
         if tmpid = 0 then break;
         tmpcnt := tmpcnt + 1;
         if tmpcnt > 11 then
         begin
            addtosystemjournal('Ошибка не могу переместить руду!');
            Result := false;
            exit;
         end;
         {repeat
            tmpstack := FindtypeEx(Ore1,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore2,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore3,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore4,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore5,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore6,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore7,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore8,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore9,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore10,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
            if GetQuantity(tmpstack) >= 60000 then Ignore(tmpstack);
         until (tmpstack = 0) OR (GetQuantity(tmpstack) < 60000);
         // Если не найден в сундуке тогда просто контейнер.
         if tmpstack = 0 then tmpstack := sunduk_With_Iron_and_Tools;}
         waitconnection(3000);
         MoveItem(tmpid,0,sunduk_With_Iron_and_Tools,0,0,0);
         wait(1000);
         CheckSave;
      until tmpid = 0;
      {//HowManyDischarge := HowManyDischarge + 1;
      IgnoreReset;
      with TStringList.Create do
         try
         Add('Разгрузка руды: ' + DateTimeToStr(Now));
         SaveToFile('mining_' + GetName(self) + '.log');
         finally
         free;
      end;}
         addtosystemjournal('разгрузка окончена');
   end;



//#########################################################
procedure Mine;
var
cTime : TDateTime;
begin
  while j < 17 do
  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-71)) then Begin home; {DischargeSunduk;} 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) then
                           //and (MiningFlag = true) 
           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-71))
             or ((Tnum < 1339) and (Tnum > 1343))
           
         
         
           // if Paralyzed OR Poisoned OR (Life < MaxLife) then Begin UOSay('guards'); fastrecall; sjob; Exit; End;
            if (weight>(MaxWeight-71)) then Begin home; 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-71))
           or (i >= 10)
           or ((Tnum < 1339) and (Tnum > 1343))
        //or (LayersCount <1); 
   
       Addtosystemjournal('отработали тайл');
     end;
     Addtosystemjournal('отработали Y');
   end;
   Addtosystemjournal('отработали X');
   j:=j+1;
  Addtosystemjournal('Массив j+1');
  recal_rb(r_cave[j]);
if (j >=17) then j:=1;
end;
j:=1;
  Addtosystemjournal('Сбросили массив j в 0');

end;


//#########################################################
BEGIN
//MiningFlag := true;
j:=1;
r_cave[1] := '7';
r_cave[2] := '13';
r_cave[3] := '19';
r_cave[4] := '25';
r_cave[5] := '31';
r_cave[6] := '37';
r_cave[7] := '43';
r_cave[8] := '49';
r_cave[9] := '55';
r_cave[10] := '61';
r_cave[11] := '67';
r_cave[12] := '73';
r_cave[13] := '79';
r_cave[14] := '85';
r_cave[15] := '91';
r_cave[16] := '97'; 

repeat
      //WaitTargetSelf;                   
      //UseSkill('Detecting Hidden');
      addtosystemjournal('Проверяем где мы находимся'); 
      if (Getx(self) <> 1630) and (Gety(self) <> 1067) then
      begin
      home;
      addtosystemjournal('Реколимся к дому');
      end;
      //recal_rb(r_home);        
      ///end
      //else 
      //MiningFlag :=true;
      //if (MiningFlag = true) and (
      if Weight < (MaxWeight-71) then
      begin
      addtosystemjournal('Проверяем лопаты');
      checkshovel;
      addtosystemjournal('Рекол в шахту');
      recal_rb(r_cave[j]);
      addtosystemjournal('Начинаем процедуру обкопки'); 
      Mine;
      end
      else
      addtosystemjournal('Идем на выгрузку'); 
      DischargeSunduk;
      //AddToSystemJournal('поминили');
      //AddToSystemJournal('Вес: '+IntToStr(Weight) +' Количество Лопат: ' + IntToStr(Count(ShovelType)));

 
until (1<>1);
END.
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Так давай смотреть на проблему проще.
Мы хотим узнать например какой тайл в точке 1111 (х) 222 (у)
для этого используем
ReadStaticsXY(X,Y: Word; WorldNum: Byte): TStaticCell; // Возвращает тип тайла с координатами и цветом, а так же количество слоев
наш номер тайла будет называтся Tails теперь
Tile0:=ReadStaticsXY(1111, 222, WorldNum);
Узнали сколько в точке тайлов. Обычно в шахте тот тайл который можно копать идеть с самого начала (нулевым).
Потому задаем
Tails := Tile0.Statics[0].Tile;
если вывести в жрунал Addtosystemjournal('Тайл № ' + inttostr(Tails)); мы получим его номерок в журнале
Теперь. Если он совпадает с твоими от 1340 до 1352 то можно тыкать в эту точку
If (Tails > 1340) and (Tails < 1352) then TargetToTile(Tails, 1111, 222, 0);
Так понятнее?
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Куда проще уже не знаю:

Code: Select all

   for x:= -2 to 2 do 
   begin 
      for y:= -2 to 2 do 
      begin
          TkaX := GetX(Self) + x;
	  TkaY := GetY(Self) + Y;

          Tile0:=ReadStaticsXY(tkaX, tkaY, WorldNum); 
          TkaT := Tile0.Statics[0].Tile; 
          If (TkaT > 1340) and (TkaT < 1352) then 
          begin 
            Addtosystemjournal('Точка ' + inttostr(Tkax) + ' ' + inttostr(TkaY)+ ' Тайле = ' +IntToStr(TkaT)); 
	    Useobject(topor, backpack);
	    WaitForTarget(2000);
	    if TargetPresent then TargetToTile(TkaT, Tkax, TkaY, 0);
          end;
      end;
   end;
Xtreem
Neophyte
Neophyte
Posts: 44
Joined: 02.12.2006 4:29

Post by Xtreem »

Спасибо еще раз SaNeK!
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Post by CFA »

Code: Select all

TkaT := Tile0.Statics[0].Tile;
Надо проверять количество слоев статики, если ее в этих координатах нет вообще, скрипт вылетит.
SaNeK
Novice
Novice
Posts: 65
Joined: 08.09.2008 9:52
Contact:

Post by SaNeK »

Ах, да, СFA прав. Была такая ситуация. Вылетит, потому и надо проверять. Это когда в шахте все что вне ее черная "бездна", пустота ) Там тайлов нету
Post Reply