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

Mining

тут можно задать вопрос по скриптингу
Post Reply
darkday
Posts: 6
Joined: 31.10.2009 20:24

Mining

Post by darkday »

Code: Select all

program MineBotRohan;
// v.2.01b (c) Edred
//
// 2.01 - ввел дополнительно в ходилку проверку коннекта. Теперь при реконнекте
//        чар не сбивается с маршрута. Ввел дополнительные циклы проверок
//        успешности разгрузки в банк и реса, если реконнект - процедуры
//        будут повторены с новым открыванием банка. Ввел раздельные для
//        каждого чара лимиты пещеры (крайние точки, дальше которых копка
//        не продолжается).

{$Include 'all.inc'}

const
r1 = 4; r2 = 6; r3 = 14; r4 = 4; r5 = 4; r6 = 4; r7 = 10; r8 = 8;
rmax = 14;                                 // максимальный
M_nothing1 = 'There is nothing here';
M_nothing2 = 'That is too far';
M_nothing3 = 'Try mining elsewhere.';
M_nothing4 = 'You cannot mine so close';
M_nothing5 = 'You have no line';
M_nothing6 = 'there is no more ore here to mine';
M_fizzles1 = 'You loosen some rocks';
M_fizzles2 = 'не смогли выкопать ничего';
M_needwait = 'You decide not to mine';
M_success = 'in your pack.';
MaxLimit = 10;               // максимальное кол-во физлов одной точки
Pickaxe1 = $0E85;            // Типы кирок
Pickaxe2 = $0E86;
JevelType = $0F29;            // тип Jewel of Spirits
Ore1 = $19B7;               // 1 Ore
Ore2 = $19BA;               // 2 Ore
Ore3 = $19B8;               // 3 Ore
Ore4 = $19B9;               // 4 Ore
DeedType = $14EF;            // Тип дида
Vikktoria = $00013D85;
DeadLife = 10;               // Временно - если меньше здоровья - мы мертвы
                        // Точнее, проверить через реконнект.

type Rail = array[1..rmax] of Integer;

var
Rail_1, Rail_2, Rail_3, Rail_5, Rail_6, StartMinPoint : Rail;
minret, MyMaxWeight, StartFlag, CaveLimit : integer;
BankBoxID,BagInBank1,BagInBank2,BagInBank3,BagInBank4,BagInBank5,BagInBank6 : Cardinal;
flag1,DisGlobalFlag : Boolean;


   function InitConfig : Boolean;
   // Настройка переменных под конкретного чара
   begin
      Result := true;

      // Rail_1 - Внутри шахты
      Rail_1[1] := 1163;Rail_1[2] := 288;
      Rail_1[3] := 1159;Rail_1[4] := 298;
      Rail_1[5] := 1155;Rail_1[6] := 298;

      // Rail_2 - От шахты до банка
      Rail_2[1] := 1100;Rail_2[2] := 232;
      Rail_2[3] := 1100;Rail_2[4] := 282;
      Rail_2[5] := 1189;Rail_2[6] := 293;
      Rail_2[7] := 1189;Rail_2[8] := 239;
      Rail_2[9] := 1109;Rail_2[10] := 242;

      // Rail_3 - Подход к банку
      Rail_3[1] := 1510;Rail_3[2] := 240;
      Rail_3[3] := 1509;Rail_3[4] := 242;

      // Rail_5 - От банка к шахте
      Rail_5[1] := 1516;Rail_5[2] := 142;
      Rail_5[3] := 1517;Rail_5[4] := 152;
      Rail_5[5] := 1521;Rail_5[6] := 153;
      Rail_5[7] := 1566;Rail_5[8] := 185;

      // Rail_6 - маршрут подхода к респу кирок
      Rail_6[1] := 1308;Rail_6[2] := 2848;
      Rail_6[3] := 1302;Rail_6[4] := 2849;

      if GetName(self) = 'ThatMyName' then
      begin
         BankBoxID := $571C9FC1;
         BagInBank1 := $57266B21;
         BagInBank2 := $57266B22;
         BagInBank3 := $57266B23;
         BagInBank4 := $54E68583;
         BagInBank5 := $57266B20;
         BagInBank6 := $57266B27;
         MyMaxWeight := 50;
         StartMinPoint[1] := 2561;
         StartMinPoint[2] := 493;
         StartMinPoint[3] := 2564;
         StartMinPoint[4] := 488;
         StartMinPoint[5] := 2566;
         StartMinPoint[6] := 485;
         CaveLimit := 2568;
         exit;
      end;
      // Если дошли до сюда - это плохо!
      Result := false;
      addtosystemjournal('Error: Не могу настроиться под чара!');
      exit;
   end;

   function CheckPickaxe : Boolean;
   // Проверяем есть ли кирка и одеваем ее (если необходимо) в правую руку
   // возвращаем true - если все ок, false - если нет кирки
   // Проверка на то, что в руке у чара не кирка не производится!
   var tmpser : Cardinal;
   begin
      Result := true;
      if (ObjAtLayer(RhandLayer) = 0) then
      begin
         // ничего в руках нету
         tmpser := findtype(Pickaxe1,backpack);
         if tmpser = 0 then tmpser := findtype(Pickaxe2,backpack);
         if tmpser = 0 then
         begin
            Result := false;
            exit;
         end;
         if not equip(RhandLayer,tmpser) then
         begin
            wait(1000);
            if not equip(RhandLayer,tmpser) then
            begin
               Result := false;
               exit;
            end;
         end;
         wait(500);
         checksave;
      end;
   end;

   function MiningAround : Integer ;
   // копаем вокруг чара
   // параметр - максимальный вес.
   // возвращаем:
   // 1 - вокруг чара все вскопано успешно
   // 2 - превышен максимальный вес
   // 3 - чар под атакой
   // 4 - нет кирки
   var k, r, x, y : Integer;
   var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mf2, mw1, ms1 : Integer;
   var ctime : TDateTime;
   begin
      Result := 1;
      if (HP < MaxHP) or Dead then
      begin
         Result := 3;
         exit;
      end;
      addtosystemjournal(inttostr(GetX(self)) + ' ' + inttostr(GetY(self)) + ': Начинаем обкопку. Вес чара: ' + inttostr(Weight));
      for x := -2 to 2 do
      begin
         for y := -2 to 2 do
         begin
            r := 0;
            repeat
               waitconnection(5000);
               if (HP < MaxHP) or Dead then
               begin
                  Result := 3;
                  exit;
               end;
               if not CheckPickaxe then
               begin
                  Result := 4;
                  exit;
               end;
               if TargetPresent then CancelTarget;
               if WarMode = true then SetWarMode(false);
               ctime := Now;
               UseObject(ObjAtLayer(RHandLayer));
               WaitForTarget(5000);
               If TargetPresent then TargetToTile(1342, GetX(self)+x, GetY(self)+y, GetZ(self));
               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);
                  mf2 := InJournalBetweenTimes(M_fizzles2, 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 (mf2<>-1) or (ms1<>-1) or (HP < MaxHP) or Dead or (k > 300);
               if (HP < MaxHP) or Dead then
               begin
                  Result := 3;
                  exit;
               end;
               if Weight > MyMaxWeight then
               begin
                  Result := 2;
                  exit;
               end;
               if (mf1<>-1) or (mf2<>-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;

   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
//         addtosystemjournal('Идем в: ' + inttostr(x) + ', ' + inttostr(y));
//         addtosystemjournal('Счас в: ' + inttostr(GetX(self)) + ', ' + inttostr(GetY(self)));
         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);
//         addtosystemjournal('Отладка: перед шагом: myx, myy = ' + inttostr(mx) + ', ' + inttostr(my) + ' [GotoXY]');
         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 GotoRail(TmpR : Rail; TmpRD : Integer; dir, guard : Boolean);
   // TmpR - маршрут, по которому двигаться
   // TmpRD - размер этого массива
   // dir - направление перемещения по маршруту (true - прямое, false - обратное)
   // guard - звать гвардов если бьют по дороге или нет (true - звать, false - нет)
   // v.1.21 (c) Edred, основана на моих аналогичных функциях для Инжекта и Изи.
   var i,k,x,y : Integer;
   begin
      // число элементов в массиве четное. Каждые два - это координаты.
      // 1 : 1,2      2 : 3,4      3 : 5,6      n : n*2-1,n*2
      // обратное направление:
      // 1 : max-1,max   2 : max-3,max-2      n : max-n*2+1,max-n*2+2
      k := TmpRD/2;
      for i := 1 to k do
      begin
         if dir then
            begin x := TmpR[i*2 - 1]; y := TmpR[i*2]; end
         else
            begin x := TmpR[TmpRD - i*2 + 1]; y := TmpR[TmpRD - i*2 + 2]; end;
         if guard AND (HP < MaxHP) then
            begin UOSay( 'GUARDS' ); wait(100); end;
         repeat
            wait(1000);
addtosystemjournal('Отладка: идем в ' + inttostr(x) + ', ' + inttostr(y) + ' [GotoRail]');
            GotoXY(x,y,0,true);
addtosystemjournal('Отладка: пришли в ' + inttostr(x) + ', ' + inttostr(y) + ' [GotoRail]');
         until (GetX(self)=x) and (GetY(self)=y);
      end;
   end;

   function DischargeBank : Boolean;
   // Разгружаем пак чара в банк. Возвращаем:
   // 1 - все ок, пак разгружен.
   // 0 - не получилось.
   var
      tmpcnt : Integer;
      tmpid, tmpstack : Cardinal;
      tmpconnect : TDateTime;
   begin
      Result := true;
      if WarMode = true then SetWarMode(false);
      tmpconnect := ConnectedTime;
      UOSay('bank');
      wait(1000)
      checksave;
      // Переместим в банк SA
      tmpcnt := 0;
      repeat
         tmpid := Findtype(SA,backpack);
         if tmpid = 0 then break;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' SA');
         tmpcnt := tmpcnt + 1;
         if tmpcnt > 10 then
         begin
            addtosystemjournal('Ошибка: не могу переместить SA в банк!');
            Result := false;
            exit;
         end;
         tmpstack := Findtype(SA,BankBoxID);
         // Если не найден в банке - тогда просто в контейнер
         if tmpstack = 0 then tmpstack := BankBoxID;
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
         MoveItem(tmpid,GetQuantity(tmpid),BankBoxID,0,0,0);
         wait(1000);
         CheckSave;
      until tmpid = 0;
      // Переместим в банк джевелы
      tmpcnt := 0;
      repeat
         tmpid := Findtype(JevelType,backpack);
         if tmpid = 0 then break;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' Jewels of Spirit');
         tmpcnt := tmpcnt + 1;
         if tmpcnt > 10 then
         begin
            addtosystemjournal('Ошибка: не могу переместить Jewels of Spirit в банк!');
            Result := false;
            exit;
         end;
         tmpstack := Findtype(JevelType,BankBoxID);
         // Если не найден в банке - тогда просто в контейнер
         if tmpstack = 0 then tmpstack := BankBoxID;
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
         MoveItem(tmpid,GetQuantity(tmpid),BankBoxID,0,0,0);
         wait(1000);
         CheckSave;
      until tmpid = 0;
      // Переместим в банк руду
      tmpcnt := 0;
      repeat
         tmpid := Findtype(Ore1,backpack);
         if tmpid = 0 then tmpid := Findtype(Ore2,backpack);
         if tmpid = 0 then tmpid := Findtype(Ore3,backpack);
         if tmpid = 0 then tmpid := Findtype(Ore4,backpack);
         if tmpid = 0 then break;
addtosystemjournal( 'Отладка: нашли Ore в количестве ' + inttostr(GetQuantity(tmpid)));
         tmpcnt := tmpcnt + 1;
         if tmpcnt > 10 then
         begin
            addtosystemjournal('Ошибка: не могу переместить Ore в банк!');
            Result := false;
            exit;
         end;
         tmpstack := Findtype(JevelType,BankBoxID);
         // Если не найден в банке - тогда просто в контейнер
         if tmpstack = 0 then tmpstack := BankBoxID;
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
         MoveItem(tmpid,GetQuantity(tmpid),BankBoxID,0,0,0);
         wait(1000);
         CheckSave;
      until tmpid = 0;
   end;

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


Begin
   if not InitConfig then exit;
   StartFlag := 1;
//   if (GetX(self) = 2509) and (GetY(self) = 542) then
   if (GetX(self) = 2516) and (GetY(self) = 555) then
   begin
      // стартуем от банка
      addtosystemjournal('Скрипт начинает работу от банка, идем в шахту');
      begin
         RestoreStamina;
      end;
      GotoRail(Rail_5,r8,true,false);
   end;
   repeat
      addtosystemjournal('Я в шахте. Начнем с точки ' + inttostr(StartFlag));
      Case StartFlag of
         1 : begin
               GotoXY( StartMinPoint[1],StartMinPoint[2],0,true);
               StartFlag := 2;
            end;
         2 : begin
               GotoXY( StartMinPoint[3],StartMinPoint[4],0,true);
               StartFlag := 3;
            end;
         3 : begin
               GotoXY( StartMinPoint[5],StartMinPoint[6],0,true);
               StartFlag := 1;
            end;
      end;
      repeat
         
         minret := MiningAround;
         if minret = 1 then GotoXY(GetX(self)-3,GetY(self),0,false);
         if GetX(self) < (CaveLimit + 3) then break;
      until minret <> 1;
      addtosystemjournal('Идем в город');
      GotoRail(Rail_1,r2,true,false);
      GotoRail(Rail_2,r7,true,false);
      RestoreStamina;
      begin

      // Проверим, если чар мертв - пора ресаться


         // Чар не мертв, идем на разгрузку
         RestoreStamina;
         // Около банка, будем разгружаться
         DisGlobalFlag := true;
         repeat
            WaitConnection(5000);
            flag1 := DischargeBank;
            wait(100);
            if not DisGlobalFlag then exit;
         until flag1 = true;
         RestoreStamina;
         addtosystemjournal('Идем в шахту');
         GotoRail(Rail_5,r8,true,false);
      end;
      // Идем обратно
      GotoRail(Rail_3,r3,false,true);
      GotoRail(Rail_2,r2,false,false);
      GotoRail(Rail_1,r1,false,false);
   until false;
End. 
Last edited by darkday on 03.11.2009 18:13, edited 1 time in total.
WladL
Apprentice
Apprentice
Posts: 240
Joined: 27.07.2009 17:21
Location: DRW
Contact:

Post by WladL »

Не знаю как у Вас плавится руда, у нас она плавится двойным кликом в паке, чар должен стоять рядом с плавилкой.

Code: Select all

//Функция вернет True если руду удалось сплавить.

Function SmeltOre:Boolean;
var
Ore:Array [0..3] of Cardinal;
i:Integer;
Forge:Cardinal;
begin
Ore[0]:=$19B7;
Ore[1]:=$19BA;
Ore[2]:=$19B8;
Ore[3]:=$19B9;
AddToSystemJournal('Starting *Smelt_Ore* at  : '+DateTimeToStr(Now));
result:=false;

//Ищем форжу
Forge:=FindType($0FB1,ground);
if (GetDistance(forge)=-1) OR (GetDistance(forge)>2) then begin
	AddToSystemJournal('Forge not found or too far away.');
	Exit;
end;

//== Плавим ==
for i:=0 to 3 do begin
	FindType(Ore[i],Backpack);
	while FindCount > 0 do begin
		//WaitConnection(5000);
		UseObject(FindItem);
		CheckSave; //<-----------Сюда твой ворлдсейв
		wait(2000);
		FindType(ore[i],Backpack);
	end;
end;

Result:=true;
AddToSystemJournal('Smelt_Ore Complete...');
end;
GotoXY - ходилка не без глючков. В релизе есть встроенная MoveXY, и если мулы включены обязательно на нее перепиши.
Post Reply