Page 1 of 1

Мининг ДРВ

Posted: 14.12.2012 9:54
by aalexx
Ниже выкладываю скрипт на мининг для ДРВ. В принципе, скрипт рабочий , может сутками копать, только успевай рунбуки менять и монетки на чаров закидывать . НО (!) .. Именно из-за этого НО всё обламывается...
1- Иногда , чар , вместо того чтобы лететь в пещеру , после покупки лопаты , туо стоит у вендора, у которого купил лопату... ( тоже сутками может стоять =)

2-Тоже самое может происходить перед и после реса.

Нашёдшим косяк - лично вручу пирожок =)

Code: Select all

 //runes[1]:='21';
 //runes[2]:='33';
 //runes[3]:='46';
 //runes[4]:='58';
 //runes[5]:='64';
 //runes[6]:='73';
 //runes[7]:='88';
 //runes[8]:='94';
 //runes[9]:='1025';
program Mining; 
// (c) v26RuS (Galiano{ASTARTA} DRW) v1.2
{$Include 'all.inc'}

const 
M_nothing1 = 'There is no ore here to mine'; 
M_nothing2 = 'That is too far'; 
M_nothing3 = 'Try mining in rock'; 
M_nothing4 = 'You cannot mine so close'; 
M_nothing5 = 'You have no line'; 
M_nothing6 = 'reach'; 
M_fizzles1 = 'You loosen some rocks'; 
M_needwait = 'You decide not to mine'; 
M_success = 'in your pack.';
MaxLimit = 15;               // максимальное кол-во физлов одной точки 
Pickaxe1 = $0F39;            // Типы кирок 
Pickaxe2 = $0F3A; 
Sunduk_ore = $40230CB8;     // Sunduk of ore
runebook = $4050DC0F;       // Runebook
r_cave = 33;          // Number of rune to cave 9 (no change)
r_home = 21;          // Number of rune to home 1 (no change)
r_venik = 46;         //  Knopka v buke k veniku
VendorAxe =$0055744C;      //Venik 
MyMaxWeight = 500;       // Max Weight
CaveLimit = 4045;        // Cave limit
RuneHome=$4001E531;       // Rune to fast 
Recall=$1F4C;            // Type Recall scrolls
pk_time=420;          // Seconds of wait to pk go
kill_elem=0;          // Убивать элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
Itype=$0F09;           // Тип инвизки
vxcol=$FFFF;           // Цвет скрола вортекса
vacol=$FFFF;           // Цвет скрола мас диспела
stone=$4001D120; // Resurrect stone
//resursi
//*****ruda*****
Ore1 = $19B7;               // 1 Ore 
Ore2 = $19BA;               // 2 Ore 
Ore3 = $19B8;               // 3 Ore 
Ore4 = $19B9;               // 4 Ore 
//********Gems****
Gems1 = $0F26;              // Gems
Gems2 = $0F18;              // Gems
Gems3 = $0F11;              // Gems
Gems4 = $0F10;              // Gems
Gems5 = $0F15;              // Gems
Gems6 = $0F16;              // Gems
Gems7 = $0F0F;              // Gems
Gems8 = $0F0E;              // Gems  ??
Gems9 = $0EED;              // Gems  ??

var 
minret,StartFlag : Integer; 
HowManyDischarge : Integer; 
ScriptStartTime : TDateTime; 
dot:array [0..2] of TFoundTile;

flag1 : Boolean; 


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

   begin 

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

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


   end;
   
procedure podhod(Vendor:Cardinal);
begin
AddToSystemJournal('273 Продацец: '+GetName(Vendor)+'. координата Х: '+inttostr(GetX(Vendor))+'. координата Y: '+inttostr(GetY(Vendor))+'. дистанция: ' +inttostr(GetDistance(Vendor)));
repeat
NewMoveXY(GetX(Vendor),GetY(Vendor),true,1,false);
wait(4000);
checksave;
until (GetDistance(Vendor)< 2) or dead;
end;

   
procedure smena;
begin
dot[0].X:=2467;
dot[0].Y:=532;
dot[1].X:=2467;    //krest
dot[1].Y:=532;     //krest
dot[2].X:=1750;
dot[2].Y:=706;
end;   
    
Procedure Take2;
begin
UseObject($400D5D2F);        //ид суднука с кирками
wait(3000)
FindTypeEx($0F3A,$FFFF,$400D5D2F,True);  //ид суднука с кирками
wait(1000)
MoveItem(FindItem,1,Backpack,0,0,0);
wait(3000)
FindTypeEx($0F39,$FFFF,$400D5D2F,True);      //ид суднука с кирками
wait(1000)
MoveItem(FindItem,1,Backpack,0,0,0);
wait(3000)
recal_rb2(r_cave)
end;

procedure Take;
begin
checksave;
while (GetType(ObjAtLayer(RhandLayer))<>Pickaxe1) and (GetType(ObjAtLayer(LhandLayer))<>Pickaxe1) and (CountEx(Pickaxe1,$0000,backpack) = 0) and not dead do
begin
//AddToSystemJournal('Телепортируюсь в бриту за лопатой в магаз');
recal_rb2(r_venik)
checksave;
wait(5000);
//podhod(VendorAxe);
SetAutoBuyDelay(8);      //Установить задержку на продажу. Время задается в секундах. По умолчанию - 3 (минимальное значение).
Autobuy(Pickaxe1,$0000,1);
//UOSay((GetName(VendorAxe))+' buy guards');   
UOSay('buy guards');      
wait(12000);
recal_rb2(r_cave)
end;
end;

   procedure Resurrector;
BEGIN
if dead then
begin
HelpRequest;//Нажать  "Help"
wait(1000);
waitgump('3');//Нажать "Help i am stuck"
wait(1000);
waitgump(IntToStr(2));//Нажать на кнопку города 
wait(3000)
FindDistance:=20;
//moveXY(getX(stone),getY(stone),false,1,false);
//NewMoveXY(getX(stone),getY(stone),false,1,true);
//NewMoveXY(dot[1].X,dot[1].Y,false,1,true);
		newmoveXY(getX(stone),getY(stone),false,1,false);
wait(5000)
repeat
useObject($4001BDF0);
wait(8000);
until HP>0;
//recal_rb2(r_home);
//recal_rb2(r_cave);
//wait(pk_time*1000);
Take;
end;
end;



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

end 
      end;   
      

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

   procedure CheckHide; 
   begin 
   SetWarMode(false);
   checkdead;
      if Hidden then exit; 
      if WarMode = true then SetWarMode(false); 
      repeat 
         SetWarMode(false);
         UseSkill('Hiding'); 
         wait(4500); 
         checksave;
         checkdead; 
      until Hidden or (not Connected); 
   end; 



function redcheck : Boolean;
   // Ищет персонажей от серого к красному в радиусе 10-ти клеток. Возвращаем: 
   // True - найдетны такие персонажи. 
   // False - персонажей не найдено все спокойно. 
var  n : integer; l : TStringList; 
begin 
l := TStringList.Create();
Result := False;
FindType($190,ground); 
GetFindedList(l); 
if (l.count > 0) then 
begin 
for n:= 0 to (l.count-1) do 
if (GetNotoriety(StrToInt('$'+l.strings[n]))>2) then Result := true; 
end; 
l.free;
l := TStringList.Create();
FindType($191,ground); 
GetFindedList(l); 
if (l.count > 0) then 
begin 
for n:= 0 to (l.count-1) do 
if (GetNotoriety(StrToInt('$'+l.strings[n]))>2) then Result := true; 
end; 
l.free; 
end;


   function MiningAround : Integer ; 
   // копаем вокруг чара 
   // параметр - максимальный вес. 
   // возвращаем: 
   // 1 - вокруг чара все вскопано успешно 
   // 2 - превышен максимальный вес 
   // 3 - чар под атакой 
   // 4 - нет кирки 
   // 5 - PK
   var k, r, x, y : Integer; 
   var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mw1, ms1 : Integer; 
   var ctime : TDateTime; 
   begin 
      Result := 1; 
      
   addtosystemjournal(inttostr(GetX(self)) + ' ' + inttostr(GetY(self)) + ': Начинаем обкопку. Вес чара: ' + inttostr(Weight)); 
   
      for x := -4 to 4 do 
      begin 
     for y := -4 to 4 do 
          begin 
      
            r := 0;
           
            repeat 
               waitconnection(5000);
               if not CheckPickaxe then 
               begin 
                  Result := 4; 
                  exit; 
               end; 
               Checkdead;
               CheckHide; 
               
               if TargetPresent then CancelTarget; 
               if WarMode = true then SetWarMode(false); 
               ctime := Now; 
//               UseObject(ObjAtLayerEx(RhandLayer,self));
               UseObject(FindType(Pickaxe1,Backpack));
               WaitForTarget(1000); 
               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); 
                  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 redcheck = true then
//     begin
//       Result := 5
//        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; 

function DischargeSunduk : Boolean; 
   // Разгружаем пак чара в сундук. Возвращаем: 
   // 1 - все ок, пак разгружен. 
   // 0 - не получилось. 
   var tmpcnt : Integer; 
      tmpid, tmpstack : Cardinal; 
      tmpconnect : TDateTime; 
   begin 
            addtosystemjournal('Пришли на разгрузку'); 
      Result := true; 
      waitconnection(3000); 
      tmpconnect := ConnectedTime; 
      CheckDead; 
      if Dead then 
      begin 
         Result := false; 
         exit; 
      end; 
      UseObject(Sunduk_ore); 
      checksave; 
      // Переместим руду 
      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); 
         //gems
         if tmpid = 0 then tmpid := Findtype(Gems1,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems2,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems3,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems4,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems5,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems6,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems7,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems8,backpack);
         if tmpid = 0 then tmpid := Findtype(Gems9,backpack);
         if tmpid = 0 then break; 
         tmpcnt := tmpcnt + 1; 
         if tmpcnt > 10 then 
         begin 
            addtosystemjournal('Ошибка: не могу переместить руду!'); 
            Result := false; 
            exit; 
         end; 
         repeat 
            tmpstack := FindtypeEx(Ore1,GetColor(tmpid),Sunduk_ore,False); 
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore2,GetColor(tmpid),Sunduk_ore,False); 
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore3,GetColor(tmpid),Sunduk_ore,False); 
            if tmpstack = 0 then tmpstack := FindtypeEx(Ore4,GetColor(tmpid),Sunduk_ore,False);
            //gems 
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems1,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems2,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems3,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems4,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems5,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems6,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems7,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems8,GetColor(tmpid),Sunduk_ore,False);
            if tmpstack = 0 then tmpstack := FindtypeEx(Gems9,GetColor(tmpid),Sunduk_ore,False);
            
            if GetQuantity(tmpstack) >= 50000 then Ignore(tmpstack); 
         until (tmpstack = 0) OR (GetQuantity(tmpstack) < 50000); 
         // Если не найден в сундуке - тогда просто в контейнер 
         if tmpstack = 0 then tmpstack := Sunduk_ore; 
         waitconnection(3000); 
         MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0); 
         wait(1000); 
         CheckSave; 
      until tmpid = 0; 
      HowManyDischarge := HowManyDischarge + 1; 
      IgnoreReset; 
   FindType(Recall,Backpack);
    if (FindCount = 0) or (Count(Recall) < 5) then
     begin
        AddToSystemJournal('Добираем скролы');
     FindType(Recall,Sunduk_ore);
      if FindCount > 0 then
        begin
        MoveItem(FindItem,10,Backpack,0,0,0);
      end;
    end;
        AddToSystemJournal('Добираем реагенты');
   FindType($0F86,Backpack);
    if (FindCount = 0) or (Count($0F86) < 10) then
     begin
     FindType($0F86,Sunduk_ore);
      if FindCount > 0 then
        begin
        MoveItem(FindItem,10,Backpack,0,0,0);
      end;
    end;
   FindType($0F7A,Backpack);
    if (FindCount = 0) or (Count($0F7A) < 10) then
     begin
     FindType($0F7A,Sunduk_ore);
      if FindCount > 0 then
        begin
        MoveItem(FindItem,10,Backpack,0,0,0);
      end;
    end;
   FindType($0F7B,Backpack);
    if (FindCount = 0) or (Count($0F7B) < 10) then
     begin
     FindType($0F7B,Sunduk_ore);
      if FindCount > 0 then
        begin
        MoveItem(FindItem,10,Backpack,0,0,0);
      end;
    end;
   FindType($0F7B,Backpack);
    if (FindCount = 0) or (Count($0F7B) < 10) then
     begin
     FindType($0F7B,Sunduk_ore);
      if FindCount > 0 then
        begin
        MoveItem(FindItem,10,Backpack,0,0,0);
      end;
    end;

   FindType(Itype,Backpack);
    if (FindCount = 0) or (Count(Itype) <= 2) then
     begin
        AddToSystemJournal('Добираем инвизки');
     FindType(Itype,Sunduk_ore);
      if FindCount > 0 then
        begin
        MoveItem(FindItem,5,Backpack,0,0,0);
      end;
    end;


      with TStringList.Create do 
         try 
         Add('Разгрузка руды: ' + DateTimeToStr(Now)); 
         SaveToFile('mining_' + GetName(self) + '.log'); 
         finally 
         free; 
      end; 
         addtosystemjournal('Разгрузка закончена'); 
   end;
 
   procedure recal_rb(rune : integer); 
   var tmpr : Integer; 
   mx, my, k, Res : Integer; 

   begin 

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

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


   end;
   function GetPickaxe : Boolean; 
   // Проверяем есть ли кирка и одеваем ее (если необходимо) в правую руку 
   // возвращаем true - если все ок, false - если нет кирки 
   // Проверка на то, что в руке у чара не кирка не производится! 
   var tmpser : Cardinal; 
   begin 
      Result := true; 
      if (ObjAtLayerEx(RhandLayer,self) = 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; 
if Result = false then
begin
                 recal_rb(r_home);
       useobject(sunduk_ore);
       tmpser := findtype(Pickaxe1,Sunduk_ore);
       if tmpser = 0 then tmpser := findtype(Pickaxe2,Sunduk_ore); 
       if tmpser = 0 then
       begin
        Result := false;
        addtosystemjournal('Нету кирки в сундуке:((');
       end;
       grab(Finditem,1);
         if not equip(RhandLayer,tmpser) then 
         begin 
            wait(1000); 
            if not equip(RhandLayer,tmpser) then 
            begin 
               Result := false; 
        addtosystemjournal('Нету кирки в сундуке:((');
               exit; 
            end; 
         end; 
         wait(500); 
         
                 recal_rb(r_cave);
end;
   end; 


Begin 
   ScriptStartTime := Now; 
   HowManyDischarge := 0; 
   StartFlag := 1; 
   repeat 
   // стартуем от сундука 
      CheckDead; 

      addtosystemjournal('Вылетаю в шахту'); 
   recal_rb(r_cave);
      repeat 
         CheckDead; 
         if Dead then break; 
         GetPickaxe;
         minret := MiningAround; 
         CheckDead; 
         if Dead then break; 
         if minret = 4 then  GetPickaxe;
    
    
      until minret = 2; 
      addtosystemjournal('Пора на разгрузку'); 
      CheckDead;
   recal_rb(r_home); 
      if not Dead then 
      begin 
         repeat 
            WaitConnection(5000); 
            CheckDead; 
            if Dead then break; 
            flag1 := DischargeSunduk; 
            wait(100); 
         until flag1 = true; 
   
      end; 
      CheckDead; 
   until false; 
End.


П.с. Кто написал скрипт - в начале скрипта , спасибо ему (ей) огромное -)

Re: Мининг ДРВ

Posted: 14.12.2012 10:02
by Vizit0r
1) скрипт без отступов нечитаемый. для кого я делал авто-формат скриптов?
2) SetAutoBuyDelay достаточно сделать один раз вначале скрипта, а не каждый раз при покупке
3) recal_rb2 отдельная песня.
3.1) почему прыжок по руне не в цикле? один раз не получилось по какой-то причине - он и стоит дальше до бесконечности. тут и есть корень зла.
3.2) что такое Res, которое устанавливается и не используется?


дальше скрипт без форматирования смотреть не буду. если тебе лень 3 раза кликнуть мышкой, то мне тем более не хочется глаза ломать.