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

Lumber Edred

тут можно задать вопрос по скриптингу
Post Reply
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Lumber Edred

Post by Chepka »

при запуске выбивает:

Code: Select all

17:38:13 [Skorn]: Compiling
17:38:13 [Skorn]: Compiler: [Error] (lumber.sc at 1:1):  Syntax error
17:38:13 [Skorn]: Compiling failed
17:38:13 [Skorn]: Script lumber.sc stoped successfuly
пробывал разные версии стелса, менял имя программы, непомогает(

вот сам скрипт

Code: Select all

program LambIsengard101;
// В папке D:\Games\Railes есть файл имя_чара.txt и файл res.txt
// Первый - это маршрут перемещения чара по лесу от сундука и обратно к
// сундуку. При килле чар идет дальше по маршруту вплоть до сундука.
// Второй файл - маршрут от сундука до креста для реса.
// Вырубленные логи скидывать в сундук. Топоры брать из мешка оттуда же.
// В общем, как в мининге.
//
// v.1.01 (c) Edred

{$Include 'all.inc'}

const
MyMaxWeight = 350;
Msg1 = 'You put the';
Msg2 = 'не смогли вырубить ничего';
Msg3 = 'fail to';
Msg4 = 'You decide not to chop wood';
Msg5 = 'There is nothing';
Hatchet1 = $0F43;
Hatchet2 = $0F44;
AnkhID = $40002DFE;
Sunduk = $400549E1;
BagHatchets = $4003FF49;
DeadLife = 40;
Logs = $1BDD;
WoodType = $0F90;

type LumbRecord = Record
   x,y,tt,tx,ty,tz : integer;
   end;

var
LumberDim : array [0..5000] of LumbRecord;
ResDim : array [0..5000] of  LumbRecord;
Regs : array [1..3] of Cardinal;
MaxPosL, MaxPosR, k : integer;               // длины соответствующих массивов
CharRail, ResRail : String;
LumberFlag : Boolean;      // true - работаем, false - нет (разгрузка или смерть)
ctime : TDateTime;
 

   procedure GetLumberRail(s : String; WPos : Integer; flag : Boolean);
   // flag - true - маршрут для ламбера, false - маршрут для реса
   begin
      s := s + ' ';
      if flag then
      begin
         LumberDim[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         LumberDim[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         LumberDim[WPos].tt := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         LumberDim[WPos].tx := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         LumberDim[WPos].ty := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         LumberDim[WPos].tz := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
      end
      else
      begin
         ResDim[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         ResDim[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         ResDim[WPos].tt := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         ResDim[WPos].tx := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         ResDim[WPos].ty := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
         ResDim[WPos].tz := StrToInt(Copy(s,1,Pos(' ',s)-1));
         Delete(s,1,Pos(' ',s));
      end;
   end;

   procedure GetRail(FileNam : String; Flagoffile : boolean);
   var
   List : TStringList;
   i : integer;
   begin
      List := TStringList.Create;
      List.LoadFromFile(FileNam);
      for i := 0 to List.Count-1 do GetLumberRail(List.strings[i],i,FlagOfFile);
      if Flagoffile then MaxPosL := i
      else MaxPosR := i;
   end;

   procedure CheckDead;
   begin
      if Dead then exit;
      if HP < 40 then
      begin
         Disconnect;
         wait(5000);
         Connect;
         repeat
            wait(100);
         until Connected;
      end;
   end;

   procedure GotoXY(x,y,prec : integer; runflag : boolean);
   // x,y - координаты, в которые идем
   // prec - точность подхода
   // runflag - бежать или идти
   // v. 1.04 (с) Edred, скрипт портирован с инжекта
   // оригинальная версия Yoko с доработкой AGRS и Edred.
   var ld, ldc, dx, dy, mx, my : Integer;
   begin
      ld := 0; ldc := 0;
      while true do
      begin
         CheckSave;
         dx := GetX(self) - x; if dx < 0 then dx := 0 - dx;
         dy := GetY(self) - y; if dy < 0 then dy := 0 - dy;
         if dy > dx then dx := dy;
         if dx <= prec then exit;
         mx := GetX(self); my := GetY(self);
         dx := mx - x; if dx < 0 then dx := 0 - dx;
         dy := my - y; if dy < 0 then dy := 0 - dy;
         if dy > dx then dx := dy;
         if dx <= prec then exit;
         if ld = dx then begin
            ldc := ldc + 1;
            if ldc > 100 then begin addtosystemjournal( 'GotoXY: Cannot reach location!' ); exit; end;
         end
         else ld := dx;
         waitconnection(5000);
         if mx = x then begin
            if my = y then exit;
            // North
            if my > y then begin Raw_Move(0,runflag); continue; end;
            // South
            Raw_Move(4,runflag); continue;
         end;
         if mx < x then begin
            // Northeast
            if my > y then begin Raw_Move(1,runflag); continue; end;
            // East
            if my = y then begin Raw_Move(2,runflag); continue; end;
            // Southeast
            Raw_Move(3,runflag); continue;
         end;
         // Southwest
         if my < y then begin Raw_Move(5,runflag); continue; end;
         // West
         if my = y then begin Raw_Move(6,runflag); continue; end;
         // Nortwest
         Raw_Move(7,runflag); continue;
      end;
   end;

   procedure RestoreStamina;
   // если стамины мало, восстанавливаем ее чару до полной
   begin
      if Stam < 20 then
      begin
         repeat
            waitconnection(3000);
            wait(1000);
         until Stam = MaxStam;
      end;
   end;

   function CheckHatchet : Boolean;
   // проверяем, есть ли топор у чара в паке или на нужном слое.
   // если ее нет - открываем сундук и мешок, берем топор. Если топора нет
   // в мешке - выход.
   var tmpser : Cardinal;
   begin
      Result := true;
      waitconnection(3000);
      if (ObjAtLayerEx(RhandLayer,self) <> 0) or (count(Hatchet1)<>0) or (count(Hatchet2)<>0) then exit;
      // нет у чара топора
      repeat
         UseObject(Sunduk);
         wait(1000);
         checksave;
         UseObject(BagHatchets);
         wait(1000);
         checksave;
         tmpser := findtype(Hatchet1,BagHatchets);
         if tmpser = 0 then tmpser := findtype(Hatchet2,BagHatchets);
         if tmpser <> 0 then
         begin
            Grab(tmpser,1);
            wait(1000);
            checksave;
         end;
      until (count(Hatchet1)<>0) or (count(Hatchet2)<>0);
   end;

   procedure ResChar;
   // идем по маршруту на рес, ресаем чара, восстанавливаем здоровье, возвращаемся
   // по тому же маршруту в обратную сторону
   var
   n : integer;
   tmptime : TDateTime;
   begin
AddToSystemJournal('TEST: нужен рес чара');
      For n := 0 to MaxPosR-1 do
      begin
         repeat
            GotoXY(ResDim[n].x,ResDim[n].y,0,true);
            wait(300);
         until (GetX(self)=ResDim[n].x) and (GetY(self)=ResDim[n].y);
      end;
      // чар у креста
AddToSystemJournal('TEST: чар у креста');
      WaitConnection(5000);
      if WarMode = true then SetWarMode(false);
      repeat
         UseObject(AnkhID);
         wait(2000);
         checksave;
      until not Dead;
      // лечим чара
AddToSystemJournal('TEST: лечим чара');
      while (HP<MaxHP) do
      begin
         waitconnection(3000);
         tmptime := Now;
         n := 0
         UseSkill('Spirit Speak');
         repeat
            wait(100);
            n := n + 1;
         until (InJournalBetweenTimes('You fail|You channel|You lack|You establish', tmptime, Now)<>-1) or (Mana < (MaxMana - 50)) or (n > 300);
         wait(500);
         if Mana < 30 then
         begin
            tmptime := Now;
            n := 0;
            repeat
               waitconnection(3000);
               useskill('meditation');
               wait(2000);
               n := n + 1;
               checksave;
            until (InJournalBetweenTimes('reached full mana', tmptime, Now)<>-1) or (n = 100);
         end;
      end;
      // пойдем обратно
AddToSystemJournal('TEST: идем обратно к сундуку');
      For n := 0 to MaxPosR-1 do
      begin
         repeat
            GotoXY(ResDim[MaxPosR-1-n].x,ResDim[MaxPosR-1-n].y,0,true);
            wait(300);
         until (GetX(self)=ResDim[MaxPosR-1-n].x) and (GetY(self)=ResDim[MaxPosR-1-n].y);
      end;
   end;

   procedure Discharge;
   // разгружаем нарубленное в сундук
   // нарубленное - реги в массиве Regs[1..3]
   // логи - константа Logs
   var m, tmpcnt : integer;
      tmpid, tmpstack, tmpcolor : Cardinal;
      tmpname : String;
   begin
AddToSystemJournal('TEST: разгрузка');
      waitconnection(3000);
      CheckDead;
      if Dead then exit;
      UseObject(Sunduk);
      wait(1000);
      checksave;
      // выложим реги
      for m := 1 to 3 do
      begin
         tmpcnt := 0;
         Repeat
            tmpid := Findtype(Regs[m],backpack);
            if tmpid = 0 then break;
            addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' regs');
            tmpcnt := tmpcnt + 1;
            if tmpcnt > 10 then
            begin
               addtosystemjournal('Ошибка: не могу переместить regs!');
               wait(15000);
            end;
            tmpstack := Findtype(Regs[m],Sunduk);
            // Если не найден в банке - тогда просто в контейнер
            if tmpstack = 0 then tmpstack := Sunduk;
            MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
            wait(1000);
            CheckSave;
         until tmpid = 0;
      end;
      // выложим дид вуды
      tmpcnt := 0;
      Repeat
         tmpid := Findtype(WoodType,backpack);
         if tmpid = 0 then break;
         addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' dead woods');
         tmpcnt := tmpcnt + 1;
         if tmpcnt > 10 then
         begin
            addtosystemjournal('Ошибка: не могу переместить dead woods!');
            wait(15000);
         end;
         tmpstack := Findtype(WoodType,Sunduk);
         // Если не найден в банке - тогда просто в контейнер
         if tmpstack = 0 then tmpstack := Sunduk;
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
         wait(1000);
         CheckSave;
      until tmpid = 0;
      // выложим логи
      tmpcnt := 0;
      Repeat
         tmpid := Findtype(Logs,backpack);
         if tmpid = 0 then break;
         tmpcolor := GetColor(tmpid);
         tmpname := ' unknown logs';
         case tmpcolor of
            $0000 : tmpname := ' logs';
            $037F : tmpname := ' Grave logs';
            $0039 : tmpname := ' Willow logs';
            $0026 : tmpname := ' Maple logs';
            $0405 : tmpname := ' Oak logs';
            $0994 : tmpname := ' Bloody logs';
            $048A : tmpname := ' Nature logs';
            $0898 : tmpname := ' Spirits logs';
         end;
         addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + tmpname);
         tmpcnt := tmpcnt + 1;
         if tmpcnt > 10 then
         begin
            addtosystemjournal('Ошибка: не могу переместить логи');
            wait(15000);
         end;
         repeat
            tmpstack := FindtypeEx(Logs,tmpcolor,Sunduk,False);
            if GetQuantity(tmpstack) >= 65000 then Ignore(tmpstack);
         until (tmpstack = 0) OR (GetQuantity(tmpstack) < 65000);
         // Если не найден в сундуке - тогда просто в контейнер
         if tmpstack = 0 then tmpstack := Sunduk;
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
         wait(1000);
         CheckSave;
      until tmpid = 0;
      IgnoreReset;
AddToSystemJournal('TEST: разгрузка закончена');
   end;

   function LumbCurTree(tile,x,y,z : Integer) : Boolean;
   // рубим указанный тайл. Возвращаем false если перевес или чар мертв.
   var q, m1, m2, m3, m4, m5, CountFizzle : integer;
   begin
      Result := true;
      CountFizzle := 0;
      repeat
         if WarMode = true then SetWarMode(false);
         if TargetPresent then CancelTarget;
         ctime := Now;
         if Dead then begin Result := false; exit; end;
         if UseType(Hatchet1,$FFFF) = 0 then
         begin
            if UseType(Hatchet2,$FFFF) = 0 then
            begin
               Result := false;
               exit;
            end;
         end;
         WaitForTarget(5000);
         If TargetPresent then TargetToTile(tile, x, y, z);
         q := 0;
         repeat
            wait(100);
            q := q + 1;
            checksave;
            m1 := InJournalBetweenTimes(Msg1, ctime, Now);
            m2 := InJournalBetweenTimes(Msg2, ctime, Now);
            m3 := InJournalBetweenTimes(Msg3, ctime, Now);
            m4 := InJournalBetweenTimes(Msg4, ctime, Now);
            m5 := InJournalBetweenTimes(Msg5, ctime, Now);
         until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or Dead or (q > 300);
         if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1;
         if Dead or (Weight > MyMaxWeight) then begin Result := false; exit; end;
      until (m5<>-1) OR (CountFizzle = 10);
   end;

Begin
   Regs[1] := $0F85;      // ginseng
   Regs[2] := $0F88;      // Nightshade
   Regs[3] := $0F86;      // Mandrake Roots
   CharRail := 'D:\Games\Railes\' + GetName(self) + '.txt';
   ResRail := 'D:\Games\Railes\res.txt';
   GetRail(CharRail,true);
   AddToSystemJournal('Маршрут ' + CharRail + ' загружен');
   GetRail(ResRail,false);
   AddToSystemJournal('Маршрут ' + ResRail + ' загружен');
   // Стартуем от сундука
   repeat
      CheckDead;
      if Dead then LumberFlag := false else LumberFlag := true;
      if LumberFlag then
      begin
         if not CheckHatchet then exit;
         For k := 0 to MaxPosL-1 do
         begin
            // идем по маршруту
            repeat
               RestoreStamina;
               GotoXY(LumberDim[k].x,LumberDim[k].y,0,true);
               wait(300);
            until (GetX(self)=LumberDim[k].x) and (GetY(self)=LumberDim[k].y);
AddToSystemJournal('TEST (' + inttostr(k) + ' of ' + inttostr(MaxPosL-1) + '): пришел в координаты ' + inttostr(LumberDim[k].x) + ',' + inttostr(LumberDim[k].y));
            if LumberFlag and (LumberDim[k].tt <> 0) then
               // Будем рубить
               LumberFlag := LumbCurTree(LumberDim[k].tt,LumberDim[k].tx,LumberDim[k].ty,LumberDim[k].tz);
         end;
      end;
      // мы снова у сундука
      if not Dead then Discharge else ResChar;
      if ((GetX(self) = 3231) AND (GetY(self) = 2759)) then GotoXY(3232,2759,0,true);       
   until False;
End. 
[/code]
-=JoKeR=-
Novice
Novice
Posts: 153
Joined: 10.02.2008 11:19
Location: [Forest Wars] Ode$$a

Post by -=JoKeR=- »

А если в .txt скрипт запихнуть ?
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

А если пустую строку вначале убрать? Первой строкой должна быть program
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Post by Chepka »

txt не помогло, 1 строка и есть програм:((
пробывал на RC1, RC3
scf
Neophyte
Neophyte
Posts: 20
Joined: 06.02.2008 11:56

Post by scf »

Были подобные, непонятные ошибки.
Попробуй пересоздать файл со скриптом.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Компилятору не нравится что-то в первой строке в позиции 1. Это значит, что что-то не то с файлом, файл-то, надеюсь, создаешь текстовый? Попробуй пересоздать, если не поможет - проверь кодировку файла, возьми какой-нибудь из скриптов из комплекта стелса, скопируй под другим именем, в нем в редакторе удали все и вставь код скрипта на ламбер. В общем, тут тебе надо потыркаться, никто кроме тебя не знает что у тебя там в виндах наворочено, а собака порылась где-то там. Стелс сам по себе тут непричем.
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Post by Chepka »

взял файл 100% рабочего скрита и засунул скрипт на ламбер туда:) заработало :roll: спасибо:)
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Post by Chepka »

ещё 1 вопросик возник:)
как зделать чтоб чар ходил а не бегал? ато я добавил чтоб он в хайде ходил а он зараза постоянно бежать пітается и появляется))

нашол в описании
// runflag - бежать или идти
а на что его поменять чтоб ходил недоганяю..
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

Ищешь в коде скрипта вот такие строки:

Code: Select all

GotoXY(LumberDim[k].x,LumberDim[k].y,0,true);
и заменяешь где надо true на false.

Там где заменишь - будет ходить. Но, кстати, на большинстве известных мне шардов, чтобы не вывалиться из хайда, надо ходить с задержкой между шагами. От 100 до 500 мс. Поэкспериментируй, если у вас тоже подобное нужно - проще переделать процедуру GotoXY - вставить в начало этой процедуры проверку хайда и задержку перед шагом.
Chepka
Neophyte
Neophyte
Posts: 40
Joined: 04.12.2005 23:19
Contact:

Post by Chepka »

спасибо. теперь всё просто супер:)
Post Reply