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

лумбер дрв, постоянно реколиться по рунбуке,и не рубит!

Only working scripts
Post Reply
olnev115
Posts: 2
Joined: 06.02.2011 17:34

лумбер дрв, постоянно реколиться по рунбуке,и не рубит!

Post by olnev115 »

Ув. скриптеры и геймеры уо. Взял этот скрипт с Вашего форума и попробовал его запустить, но получилась небольшая проблема. Скрипт летит по рунбуку в лес, и вместо того чтобы начать рубить опять летит по рунбуку в лес. и так постоянно(как будто зациклился). Могу ли я Вас попросить взглянуть на скрипт и сказать из за чего это могло случиться?

Отдельное СПАСИБО v26RuS за предоставленные скрипты!!!

Code: Select all

Program LumberDRW; 
// (c) v26RuS (Galiano{ASTARTA} DRW) v1.4 

{$Include 'all.inc'} 
type LumbRecord = Record 
   x,y,tt,tx,ty,tz : integer; 
   end; 

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

const 
FMoveArrMax = 300; // ставь здесь больше, если твой чар ходит на дистанции больше 13 тайлов или вокруг чара очень много препятствий. Если препятствий на пути мало, то можно оставить как есть. 
var 
PrognosisX, PrognosisY, FMoveArrCount : integer; 
FMoveArr : array [1..FMoveArrMax] of array [1..2] of smallint; 

const 
Msg1 = 'You put the'; 
Msg2 = 'reach this'; 
Msg3 = 'fail to'; 
Msg4 = 'There are no logs here to chop'; 
Msg5 = 'There is nothing'; 
Msg6 = 'OOPS !!!'; 
AxeType1 = $0F47; 
AxeType2 = $0F48; 
MaxWeight = 700; 
MaxFizzle = 15; 
l_rails = 'D:\UO\drw\Inj(oldp)ASM\trees.txt'; 
logType = $1BDD; 
Sunduk_log = $40005B98; 
r_lumb = 33;          // Number of rune to Lumber 2 (no change) 
r_home = 21;          // Number of rune to home 1 (no change) 
runebook = $4040E2D4;       // Runebook 


   procedure CheckDead; 
Begin 
if Dead then 
begin 
AddToSystemJournal('Персонаж мертв: '+TimeToStr(now)); 
//FullDisconnect; 
end 
      end; 

   procedure ents; 
var TimeInterno : TDateTime; 
   begin 
ClearJournal; 
   TimeInterno := Now; 
   Addtosystemjournal('Найден ЭНТ для продолжение напишите start'); 
   UOSay('\w Galiano: Ents!!! x:'+IntToStr(GetX(self))+' y:'+IntToStr(GetY(self))); 
repeat 
wait(2000); 
until (inJournalBetweenTimes('start', TimeInterno, Now) >= 0); 
wait(2000); 
ClearJournal; 
   end; 

   procedure GetLumberRail(s : String; WPos : Integer; flag : Boolean); 
   // flag - true - маршрут для ламбера, false - маршрут для реса 
   begin 
      s := s + ' '; 
      if flag then 
      begin 
         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)); 
      end 
      else 
      begin 
         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)); 
      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; 


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

procedure dlog(logString,fname : string); 
var 
   ls : TStringList; 
begin 
   ls := TSTringList.Create(); 
   try 
      ls.loadFromFile(fname); 
   except 
      //создаем файл, если нету 
      ls.saveToFile(fname); 
   end; 

   ls.add(logString); 

   ls.saveToFile(fname) 
   ls.free(); 
end; 

procedure DropLog; 
   var tmpid : Cardinal; 
   begin 
      dlog('Babros - Разгрузка логов: ' + DateTimeToStr(Now),'lumber.log'); 
      CheckDead; 
      checksave; 
      repeat 
         tmpid := Findtype(logType,backpack); 
         waitconnection(3000); 
         checksave; 
         MoveItem(tmpid,GetQuantity(tmpid),Sunduk_log,0,0,0); 
         wait(1000); 
         checksave; 
      until tmpid = 0; 
End; 

   procedure CheckHide; 
   begin 
      if Hidden then exit; 
      repeat 
      if WarMode = true then SetWarMode(false); 
         AddToSystemJournal('Прячемся...'); 
         UseSkill('Hiding'); 
         wait(4500); 
         checksave; 
      until Hidden or (not Connected); 
   end; 


   function LumbCurTree(tile,x,y,z : Integer) : Boolean; 
   // рубим указанный тайл. Возвращаем false если перевес или чар мертв. 
   var q, m1, m2, m3, m4, m5, m6, CountFizzle : integer; 
   begin 
      Result := true; 
      CountFizzle := 0; 
      repeat 
    CheckHide; 
         checkdead; 
         if WarMode = true then SetWarMode(false); 
         if TargetPresent then CancelTarget; 
         ctime := Now; 
         if Dead then begin Result := false; exit; end; 
    UseObject(ObjAtLayerEx(LhandLayer,self)); 
         WaitForTarget(5000); 
         If TargetPresent then TargetToTile(tile, x, y, z); 
         q := 0; 
         repeat 
            wait(1000); 
            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); 
            m6 := InJournalBetweenTimes(Msg6, ctime, Now); 
         until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or (m6<>-1) or Dead or (q = 60); 
         if (m2<>-1) or (m3<>-1) or (q = 60) then CountFizzle := CountFizzle + 1; 
    if (m6<>-1) then ents; 
         if Dead or (Weight > MaxWeight) then begin Result := false; exit; end; 

      until (m5<>-1) or (m4<>-1) OR (CountFizzle = MaxFizzle); 

   end; 


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

   begin 
    repeat 
      Res := 0; 
        CheckDead; 
        AddToSystemJournal('Try to recall'); 
   tmpr := rune; 
   waitgump(IntToStr(tmpr)); 
        wait(1000) 
   UseObject(runebook); 
   mx := GetX(self); 
   my := GetY(self); 
      k := 0; 
   repeat 
      wait(500) 
      k := k + 1; 
      CheckSave; 
   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; 

procedure checkweight; 
begin 
if (Weight > MaxWeight) then  
begin 
AddToSystemJournal('Полный'); 
recal_rb(r_home); 
DropLog; 
recal_rb(r_lumb); 
end; 
end; 
procedure InitCheckFlow; 
begin 
CheckSWSTimer := Now; 
end; 

function SWSSoon : boolean; 
begin 
result := (GetGlobal('stealth', 'Saving World State') = '1'); 
end; 

function CheckFlow : integer; 
var 
delay : integer; 
begin 
delay := timer; 
checksave; 
WaitConnection(5000); 
result := timer - delay; 
end; 

Function Abs(A: integer): integer; 
Begin 
If A>=0 then result:=A 
Else result:=0-A; 
End; 

function SetDirection(x, y : integer) : integer; 
var 
   MyX,MyY,DiffX,DiffY,GoDir: integer; 
Begin 
MyX:=GetX(self); 
MyY:=GetY(self); 
DiffX:=Abs(MyX-x); 
DiffY:=Abs(MyY-y); 

if (DiffX/(DiffY+0.1))>=2 then 
   begin 
   if (MyX>X) then 
      GoDir:=6 
   else 
      GoDir:=2; 
   end  
else 
    
   if (DiffY/(DiffX+0.1))>=2 then 
      begin 
      if (MyY>Y) then 
         GoDir:=0 
      else 
         GoDir:=4; 
      end  
   else 
        
      if (MyX>X) and (MyY>Y) then  GoDir:=7 
      else 

        if (MyX>X) and (MyY<Y) then  GoDir:=5 
        else 

           if (MyX<X) and (MyY>Y) then  GoDir:=1 
           else 

             if (MyX<X) and (MyY<Y) then  GoDir:=3; 
              
result:=GoDir; 
end; 


procedure CalcPrognosis(Dir : integer); 
begin 
   if (Dir = 1) or (Dir = 2) or (Dir = 3) then PrognosisX := GetX(self) + 1; 
   if (Dir = 5) or (Dir = 6) or (Dir = 7) then PrognosisX := GetX(self) - 1; 
   if (Dir = 0) or (Dir = 4) then PrognosisX := GetX(self); 

   if (Dir = 3) or (Dir = 4) or (Dir = 5) then PrognosisY := GetY(self) + 1; 
   if (Dir = 7) or (Dir = 0) or (Dir = 1) then PrognosisY := GetY(self) - 1; 
   if (Dir = 2) or (Dir = 6) then PrognosisY := GetY(self); 
end; 

function TryToMove(Direction : integer; RunFlag : boolean) : boolean; 
begin 
   if GetDirection(self) <> Direction then Raw_Move(Direction, RunFlag); 
   result := Raw_Move(Direction, RunFlag); 
end; 

function WrongMove(x, y : integer) : boolean; 
var 
i : integer; 
begin 
   result := false; 
   if FMoveArrCount = 0 then exit; 
   for i := 1 to FMoveArrCount do 
      begin 
      if (x = FMoveArr[i][1]) and (y = FMoveArr[i][2]) then 
         begin 
         result := true; 
         exit; 
         end; 
      end; 
end; 


function Min(x,y: integer): integer; 
begin 
 if x>y then Result:=y else Result:=x; 
end; 

function HEst(x,y: integer): integer; 
var dx,dy,Ddx : integer; 
begin 
  dx:= GetX(self)-x; 
  dy:= GetY(self)-y; 
  Ddx:= dx-dy; 
  If dx<0 then dx:=0-dx; 
  If dy<0 then dy:=0-dy; 
  If Ddx<0 then Ddx:=0-Ddx; 
  Result:= min(dx,dy)+Ddx; 
end; 

procedure SetWrongMove(x, y : integer); 
begin 
   FMoveArrCount := FMoveArrCount + 1; 
   FMoveArr[FMoveArrCount][1] := x; 
   FMoveArr[FMoveArrCount][2] := y; 
end; 

function RewindDir(Dir, c : integer) : integer; 
begin 
   result := Dir + c; 
   if result < 0 then result := result + 8; 
   if result > 7 then result := result - 8; 
end; 

function Move(x, y, tolerance : integer) : boolean; 
var 
Dir, Dist, lastX, lastY, t, i, timeout : integer; 
begin 
   FMoveArrCount := 0; 
   Dist := HEst(x, y); 
   timeout := Dist * 13000; // 13 секунд времени на шаг 
   t := timer; 
   while true do 
      begin 
      Dist := HEst(x, y); 
      if Dist <= tolerance then // пришёл 
         begin 
         result := true; 
         exit; 
      end; 
      if timer - t > timeout then // провал по таймауту 
      begin 
         AddToSystemJournal('Move: Time moved out!'); 
         result := false; 
         exit; 
      end; 
      Dir := SetDirection(x, y); 
      CalcPrognosis(Dir); 
      if WrongMove(PrognosisX, PrognosisY) then 
         begin 
         for i := 1 to 7 do 
            begin 
            Dir := RewindDir(Dir, 1); 
            CalcPrognosis(Dir); 
            if not WrongMove(PrognosisX, PrognosisY) then break; 
            end; 
      if i = 8 then 
         begin 
         AddToSystemJournal('Move: Cannot move'); 
         result := false; 
         exit; 
         end; 
      end; 
      timeout := timeout + CheckFlow; 
      lastX := GetX(self); lastY := GetY(self); 
      if TryToMove(Dir, true) then SetWrongMove(lastX, lastY) // отсюда чар пришёл 
      else SetWrongMove(PrognosisX, PrognosisY); 
      end; 
end; 

procedure _move(x, y, tolerance : integer); 
begin 
while not Move(x, y, tolerance) do wait(100); 
end; 
Begin 
   GetRail(l_rails,true); 
AddToSystemJournal('Маршрут ' + l_rails + ' загружен'); 
   repeat 
      CheckDead; 
      if Dead then LumberFlag := false else LumberFlag := true; 
      if LumberFlag then 
      begin 
         recal_rb(r_lumb); 
         if not CheckAxe then exit; 
         For k := 0 to MaxPosL-1 do 
         begin 
            // идем по маршруту 
          AddToSystemJournal('Переход к дереву #' + inttostr(k+1)+ ' x:'+inttostr(LumberDim[k].tx)+' y:'+inttostr(LumberDim[k].ty)); 
       _move(LumberDim[k].tx, LumberDim[k].ty, 1); 

          AddToSystemJournal('Переход окончен'); 
            if LumberFlag and (LumberDim[k].tt <> 0) then 
          CheckHide; 
          AddToSystemJournal('Начинаем рубить дерево #' + inttostr(k+1)); 
               LumberFlag := LumbCurTree(LumberDim[k].tt,LumberDim[k].tx,LumberDim[k].ty,GetZ(self)); 
           checkweight; 
         end; 
      end; 
   until False; 
End.
Заранее спасибо Всем откликнувшимся!!!.
PS И хочу поздравить с прошедшим всех парней этого форума!!!
olnev115
Posts: 2
Joined: 06.02.2011 17:34

Post by olnev115 »

нету идей почему такое может быть??

Я не силен в скриптах, но логически подумав, косяк должен быть здесь?

Code: Select all

repeat 
      wait(500) 
      k := k + 1;
      CheckSave; 
   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;
Post Reply