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

Мининг по скалам для шарда Forest Wars

Only working scripts
Post Reply
Scripts Writer
Novice
Novice
Posts: 130
Joined: 06.05.2008 18:03

Мининг по скалам для шарда Forest Wars

Post by Scripts Writer »

Небольшой скрипт на mining для обкопки скал для шарда Forest Wars.
Скрипт написан под Stealth версии 3.4 и выше, и протестирован на версии 3.7.3.
Первым что хочу сказать, что за основу были взяты скрипты Edred'a на мининг и ламбер для Forest Wars, за что ему огромная благодарность.
Для работы скрипта, нам потребуется:
Дом - 1 шт.
Сундук - 1 шт.
Кирка в руке - 1 шт.
Stealth v 3.4 и выше.
Injection (для маркировки точек).
Сам скрипт представлен ниже:

Code: Select all

Program mining;

{$Include 'all.inc'}

  const 
  WalkSpeed=450; // Скорость перемещения
  Sunduk = $47DB8AC3; // Сундук, куда складываем руду
  
  Pickaxe1 = $0E85; // Тип кирки
  Pickaxe2 = $0E86; // Тип Кирки
  
  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 = 'reach'; 
  M_nothing7 = 'Вы переместили Iron Ore в свою сумку..'; 
  M_nothing8 = 'Вы переместили Jewel of Spirits в свою сумку..'; 
  M_nothing9 = 'Вы переместили Silver Ore в свою сумку..'; 
  M_nothing10 = 'Вы переместили Dark Iron Ore в свою сумку..'; 
  M_fizzles1 = 'You loosen some rocks'; 
  M_fizzles2 = 'не смогли выкопать ничего'; 
  M_needwait = 'You decide not to mine'; 
  M_success = 'Вы переместили';
  M_tfail = 'Targeting cancelled';
  
  Ore1 = $19B7;  
  Ore2 = $19BA;
  Ore3 = $19B8; 
  Ore4 = $19B9;
  
  XNearSunduk = 3179; // Координаты рядом с сундуком
  YNearSunduk = 2287; // Координаты рядом с сундуком
  
  MyMaxWeight = 250; // Максимальный вес
 
  type MineRecord = Record 
     tilenum, x, y, z : Integer; 
   end;

  var
  xx, yy, k, l : Integer;
  mn1, mn2, mn3, mn4, mn5, mn6, mn7, mn8, mn9, mn10, mf1, mf2, mw1, ms1, tf1 : Integer; 
  tiles : array[0..1000] of MineRecord;
  arrayLength : Integer;
  ctime : TDateTime;

// Инициализация
procedure Init;
  begin   
    SetWalkUnmountTimer(WalkSpeed);
  end;

// Прячемся
procedure CheckHide;
  begin
    repeat
      if WarMode = true then SetWarMode(false);
      UseSkill('Stealth');
      wait(3500);
    until Hidden;
  end;

// Парсим строку   
procedure GetMiningRail(s : String; WPos : Integer);
  begin
    s := s + ' '; 
    tiles[WPos].tilenum := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
    Delete(s,1,Pos(' ',s)); 
    tiles[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
    Delete(s,1,Pos(' ',s)); 
    tiles[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
    Delete(s,1,Pos(' ',s)); 
    tiles[WPos].z := StrToInt(Copy(s,1,Pos(' ',s)-1)); 
    Delete(s,1,Pos(' ',s)); 
  end;

// Парсим файл  
procedure GetRail(FileNam : String); 
  var 
  List : TStringList; 
  i : Integer; 
  begin 
    List := TStringList.Create; 
    List.LoadFromFile(FileNam); 
    for i := 0 to List.Count-1 do GetMiningRail(List.strings[i],i);
    arrayLength := i; 
  end;  

// Копаем тайл, пока не выкопаем    
function MineTile(tilenum : Integer; x : Integer; y : Integer; z : Integer) : Boolean;
  begin
    repeat
      begin
        if not Hidden then CheckHide;
        ClearJournal;
        ctime := Now;
        k := 0;
        if WarMode = true then SetWarMode(false); 
        if TargetPresent then CancelTarget;
        WaitTargetTile(tilenum, x, y, z);
        if UseType(Pickaxe1,$FFFF) = 0 then begin
          if UseType(Pickaxe2,$FFFF) = 0 then begin
            AddToSystemJournal('Потеряли кирку. Выходим.');
            exit;
          end;
        end;
        repeat
          begin
            wait(1000); 
            k := k + 1;
            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); 
            mn7 := InJournalBetweenTimes(M_nothing7, ctime, Now); 
            mn8 := InJournalBetweenTimes(M_nothing8, ctime, Now); 
            mn9 := InJournalBetweenTimes(M_nothing9, ctime, Now); 
            mn10 := InJournalBetweenTimes(M_nothing10, ctime, Now); 
            mf1 := InJournalBetweenTimes(M_fizzles1, ctime, Now); 
            mf2 := InJournalBetweenTimes(M_fizzles2, ctime, Now); 
            ms1 := InJournalBetweenTimes(M_success, ctime, Now);
            tf1 := InJournalBetweenTimes(M_tfail, ctime, Now);
          end;
        until (tf1<>-1) or (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mn7<>-1) or (mn8<>-1) or (mn9<>-1) or (mn10<>-1) or (mf1<>-1) or (mf2<>-1) or (ms1<>-1) or Dead or (k > 300);
      end;
    until (tf1<>-1) or (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mn7<>-1) or (mn8<>-1) or (mn9<>-1) or (mn10<>-1);
    result := true; 
  end;

// Возвращаемся домой к сундуку
procedure GoHome;
  begin
    NewMoveXY(XNearSunduk, YNearSunduk, true, 1 ,true);
  end;
   
// Выгружаемся
function Unload : Boolean; 
   var 
      tmpid : Cardinal; 
      tmpconnect : TDateTime;       
   begin 
      addtosystemjournal('Пришли на разгрузку'); 
      Result := true; 
      waitconnection(3000); 
      tmpconnect := ConnectedTime; 
      UseObject(Sunduk); 
      wait(1000); 
      // Переместим руду 
      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; 
         waitconnection(3000); 
         MoveItem(tmpid, GetQuantity(tmpid), Sunduk, 0, 0, 0); 
         wait(1000); 
         CheckSave; 
      until tmpid = 0; 
      IgnoreReset;
   end;

// Проверка веса     
procedure CheckWeight;
  begin
    if Weight >= MyMaxWeight then
      begin
        AddToSystemJournal('Идём на разгрузку.');
        GoHome;
        Unload; 
      end;
  end;
                  
Begin
  Init;
  GetRail('D:\Games\Railes\Mining\' + CharName + '.txt');
  repeat
    begin
      AddToSystemJournal('Начинаем обкопку.');
      for l := 0 to arrayLength-1 do 
        begin
          NewMoveXY(tiles[l].x, tiles[l].y, true, 1, false);
          MineTile(tiles[l].tilenum, tiles[l].x, tiles[l].y, tiles[l].z);
          CheckWeight;
        end;
      AddToSystemJournal('Всё выкопали. Возвращаемся на исходную.');
    end;
  Until Dead;
End.
Копируем, сохраняем, меняем ID сундука и координаты для разгрузки, берём в руки кирку.
Установка:
Для работы скрипта, нам требуется создать файл с координатами в каталоге (или изменить в строке 138 путь до файла и имя, какое вам больше нравится)
D:\Games\Railes\Mining\имя_персонажа.txt
В моём случае, это
D:\Games\Railes\Mining\Leonard.txt
Image
После того, как файл был создан, переходим к наполнению файла координатами. Для этого, вам потребуется скрипт на Injection, представленный ниже:

Code: Select all

sub MarkMining()
  uo.TextOpen()
  if uo.GetDir() == 0 then
    uo.TextPrint('0 ' + STR(uo.GetX('self')) + ' ' + STR(uo.GetY('self') - 1) + ' 0')
  endif
  if uo.GetDir() == 4 then
    uo.TextPrint('0 ' + STR(uo.GetX('self')) + ' ' + STR(uo.GetY('self') + 1) + ' 0')
  endif
  if uo.GetDir() == 6 then
    uo.TextPrint('0 ' + STR(uo.GetX('self') - 1) + ' ' + STR(uo.GetY('self')) + ' 0')
  endif
  if uo.GetDir() == 2 then
    uo.TextPrint('0 ' + STR(uo.GetX('self') + 1) + ' ' + STR(uo.GetY('self')) + ' 0')
  endif
  if uo.GetDir() == 7 then
    uo.TextPrint('0 ' + STR(uo.GetX('self') - 1) + ' ' + STR(uo.GetY('self') - 1) + ' 0')
  endif
  if uo.GetDir() == 3 then
    uo.TextPrint('0 ' + STR(uo.GetX('self') + 1) + ' ' + STR(uo.GetY('self') + 1) + ' 0')
  endif
  if uo.GetDir() == 5 then
    uo.TextPrint('0 ' + STR(uo.GetX('self') - 1) + ' ' + STR(uo.GetY('self') + 1) + ' 0')
  endif
  if uo.GetDir() == 1 then
    uo.TextPrint('0 ' + STR(uo.GetX('self') + 1) + ' ' + STR(uo.GetY('self') - 1) + ' 0')
  endif
  uo.Print('Added')
endsub
Принцип работы скрипта опишу в картинках:
Заходим в игру
Image
Копируем скрипт для маркировки и для удобства, забиваем его на хоткей (в моем случае это F5):
Image
Подходим вплотную к скале, и нажимаем F5. В нижем левом углу, видим надпись Added, значит скрипт отработал нормально.
Image
Принцип работы прост- исходя из направления персонажа и текущих координат, осуществляется запись координат тайла, который требуется выкопать. Таким образом, переходим к следующему тайлу и так же нажимаем F5, записали. К следующему, следующему...
Image
Image
Image
Когда промаркируете все координаты, копируем их из окна, который открыл для этого Inject (если окно не открыто, то ,textopen) и сохраняем в файл с координатами (см. выше). Подходим к сундуку, берём в руки кирку, запускаем. Если всё было сделано верно, то набрав максимальный вес, персонаж разгрузится и продолжить копать по кругу.
 
Проще научить человека ловить рыбу, чем постоянно ею его кормить. (с) Destruction
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Re: Мининг по скалам для шарда Forest Wars

Post by shinma »

а почему все так пристрастились к левым файлам и координатам от инжекта. почему не организовать автокопание прям в стелсе без координат, а на обработки тайлов местности.
--->>>ПОИСК ПО ФОРУМУ, НАЧНИ С НЕГО!!!<<<---
--->>>Search the forum, start with him!!!<<<---
95% Ваших вопросов уже кем-то написаны и решены.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Мининг по скалам для шарда Forest Wars

Post by Vizit0r »

давно уже сделано, и готовые скрипты выложены.
хз, зачем вязаться к конкретным тайлам...
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply