Перейти к содержанию
Форум шарда Middle-Earth

nepret

nepret
  • Публикаций

    274
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные nepret


  1. UP 12.10.2012

    • Исправил некоторые баги с посадкой семян
    • Добавил авто-хил бинтами

     

    // Create by nepret
    ////////////////////////////////////////////////////////////////////////////////////
    //
    //                                  Ogorod v 1.2
    //
    //                  Скрипт на вскопку огорода и посадку семян.
    //
    ////////////////////////////////////////////////////////////////////////////////////
    //
    //                              !!!  АХТУНГ !!!
    //
    //  Скрипт не предназначен для вскопки территории домов типа Tower и Villa.
    //  Это связано с тем, что обработка земли код крышей (tower) или 2 этажом (villa),
    //  не возможна из-за бага...
    //
    ////////////////////////////////////////////////////////////////////////////////////
    //
    //  Два режима работы:
    //  1-й режим: Запись, сортировка, сохранение координат огорода
    //             в файл вида "xxxx_yyyy.loc".
    //             Файлы записываються в корневую папку Stealth.
    //             Пример: D:\Ultima Online\Stealth
    //    1*Прилетаем на огород
    //    2*Ставим переменную SaveCoorMod = 1
    //    3*Запускаем скрипт
    //    4*Вызываем таргет(юзаем нож, скилл и др... главное, добиваемся появления таргета)
    //    5*Бегаем по всем местам где можно выращивать реагенты(желательно 2-3 раза)
    //    6*Как только пробежали по всем тайлам на огороде, сбрасываем таргет
    //     (Можно нажать Esc или кинуть таргет на что либо, главное чтобы он пропал)
    //    7*Ждём завершение скрипта
    //
    //  2-й режим: Определение места положения, загрузка нужного файла с координатами,
    //             копка тайлов, засеивание тайлов.
    //    1*Проверяем наличие в бекпке
    //     ** Лопаты
    //     ** Семена реагентов
    //     ** Еда (Язык интерфейса должен быть русским .lang)
    //     ** Так же надо помнить о возможном выкапывании элементалей и слизняков
    //     *** Вар включается автоматически
    //    2*Прилетаем на огород
    //    3*Запускаем скрипт
    //
    ////////////////////////////////////////////////////////////////////////////////////
    Program ogorod;
    type
      TileRecord = Record
      x,y : integer;
    end;
    type
      RdyTileRecord = Record
      x,y : integer;
    end;
    const
    ////////////////////////////////////////////////////////////////////////////////////
                                //   
    DistanceCheckLoction = 50;  // Дистанция проверки локации.
                                //
    //////////////////////////////
                                //
    Food = $097B;               // Тип еды, которую будем кушать в процессе.
                                // $097B - жаренная рыба
                                // $09F2 - жаренное мясо
                                // $171F - бананы
                                //
    //////////////////////////////
                                //                            
    SaveCoorMod = 0;            // Вариант работы скрипта: 1-Запись координат 0-Копка                            
                                //
    //////////////////////////////
                                //                            
    DebugMode = 0;              // Не трогать!
                                //
    ////////////////////////////////////////////////////////////////////////////////////                            
    var
    es, ens, ulf, eie, ins, ol, wcif, fs, fh : String;
    FileNameLoc : String;
    HungryJournalTime, WaitMsgInJournalToEP : TDateTime;
    CheckDebug, td : integer;
    Tiles : array [1..5000] of array [1..2] of Integer;
    Tile : array [0..5000] of TileRecord;
    RdyTile : array [0..5000] of RdyTileRecord;
    Count, locx, locy : integer;
    htime : TDateTime;
    
    
    procedure RunInfoMSG;
    begin
      es := #13#10+'--------------------- Error! -------------------------';
      ins := #13#10+'----------------------- Info -------------------------';
      ens := #13#10+'------------------------------------------------------';
      ulf := #13#10+'>>> Нет файла с разметкой координат под эту локацию...';
      eie := #13#10+'>>> Скрипт завершился с ошибкой!';
      ol := #13#10+'Локация определенна.';
      wcif := #13#10+'Работаем по координатам из фала: ';
      fs := #13#10+'Нету семян.';
      fh := #13#10+'Нету лопаты.';
    end;
    
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////
    procedure WaitConnection(WaitTime : Integer);
    begin
    if Connected then Exit;
    while not Connected do Wait(1000);
    wait(WaitTime);
    end;
    
    function Debug(OperationTimeSec : integer; DelayInCycleMs : integer) : Boolean;
    begin
    if DebugMode = 1 then
    begin
    if td = 0 then CheckDebug := 1;
    if CheckDebug = 1 then
    begin
    if DelayInCycleMs = 0 then
    begin
    AddToSystemJournal('>>> Debug <<< Минимально-допустимая задержка в цикле := 1ms. Debug инклюд завершился с ошибкой!');
    CheckDebug := 0;
    td := 1;
    exit;
    end;
    OperationTimeSec := OperationTimeSec * 1000;
    td := td + DelayInCycleMs;
    if td >= OperationTimeSec then
    begin
    result := true;
    CheckDebug := 0;
    end;
    end;  
    end;
    end;
    
    function Hungry(Plase : cardinal) : Boolean;
    var
    VarFood : string;
    begin
    if dead then exit;
    if Food = $097B then VarFood := 'жареной рыбы';
    if Food = $09F2 then VarFood := 'жареного мяса';
    if Food = $171F then VarFood := 'бананов';
    if not (Food = $097B) or (Food = $09F2) or (Food = $171F) then VarFood := 'еды';
    FindTypeEx(Food, $FFFF, Plase, True);
    if FindCount < 1 then
    begin
    AddToSystemJournal('>>> Нет '+ VarFood +'!');
    result := false;
    exit;
    end;
    result := true;
    if HungryJournalTime = 0 then
    begin
    HungryJournalTime := Now;
    repeat
    FindTypeEx(Food, $FFFF, Plase, False);
    if FindCount > 0 then
    begin
    UseObject(finditem);
    wait(1000);
    end;
    until InJournalBetweenTimes('Я объелс|You are full', HungryJournalTime, Now) <> -1;
    end
    else
    begin
    if Now < HungryJournalTime + (1.0/1440) then exit;
    end;
    if (InJournalBetweenTimes('голодны|Вы почти умираете от голода|Ваш желудок болит|Вы чувствуете слабость|You are absolutely stuffed|You are stuffed|hungry at all|You are a little hungry|You are somewhat hungry|You are REALLY hungry|Your stomash hurts|Your stomash hurts and you feel dizzy|You are starving|You are almost dying of hunger|You are DYING of hunger', HungryJournalTime, Now) <> -1) and (LineName = 'System') and (LineTextColor = 443) then
    begin
    FindTypeEx(Food, $FFFF, Plase, False);
    if FindCount > 0 then  UseObject(finditem);
    end;
    HungryJournalTime := Now;
    end;
    
    procedure CheckSave; 
    var Time : TDateTime; 
    begin 
    Time:= Now - (0.5 / 1440); 
    if InJournalBetweenTimes('Saving World State',Time,Now) >= 0 then
    repeat
    wait(1000);
    if not Connected then exit;
    until InJournalBetweenTimes('Saving World State complete',Time,Now) >= 0;
    end;
    
    function CheckTarget(SecTime : integer) : Boolean;
    var
    t : integer;
    begin
      SecTime := SecTime * 10;
      td := 0;
      t := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(SecTime/10,100) then AddToSystemJournal('>>> Debug <<< Блок инклюда CheckTarget ');
        wait(100);
        t := t + 1;
      until TargetPresent or (t >= SecTime);
      if t >= SecTime then result := false;
      if not Connected then exit;
      if TargetPresent then result := true;
    end;
    //////////////////////////////////////////////////////////////////////////////////////////////////////
    
    function LoadTilesFromFile (FileName : String) : Boolean; 
    var MyStringList : TStringList; 
        i : integer; 
        S : String;
        X,Y : Integer; 
    begin 
      Result := true;
      try 
        MyStringList := TStringList.Create; 
        MyStringList.LoadFromFile(FileName);
        Count := MyStringList.Count; 
        if MyStringList.Count = 0 then Result := false
        else for i := 0 to MyStringList.Count - 1 do 
          begin 
            S := MyStringList.Strings[i]; 
            X := StrToInt(Copy(S,1,4));
            Y := StrToInt(Copy(S,5,5));
            Tiles[i+1][1] := X;
            Tiles[i+1][2] := Y;
          end; 
      finally 
        MyStringList.Free; 
      end; 
    end;
    
    procedure CheckWarMode;
    begin
      if not IsWarMode(self) then SetWarMode(true);
    end;
    
    function CheckItems : Boolean;
    begin
      repeat
        FindTypeEx($0F7F, $0000, Backpack, False);
        if FindCount > 0 then ignore(finditem);
      until FindCount < 1;
      FindTypeEx($0F7F, $FFFF, Backpack, False);
      if FindCount < 1 then
        begin
          result := false;
          AddToSystemJournal(+es+fs+ens);
          exit;
        end;
      FindTypeEx($0F39, $FFFF, Backpack, False);
      if FindCount < 1 then
        begin
          result := false;
          AddToSystemJournal(+es+fh+ens);
          exit;
        end;
      result := true;
    end;
    
    procedure Heal;
    var
    t : integer;
    begin
      if not Connected then exit;
      while true do
        begin
          if HP >= Str then exit;
          if not Connected then exit; 
          FindTypeEx($0E21, $FFFF, backpack, False);
          if FindCount < 1 then exit;
          if FindCount > 0 then
            begin
              if targetpresent then canceltarget;
              htime := Now;
              if not Connected then exit;
              UseObject(finditem);
              t := 0;
              td := 0;
              repeat
                if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок Heal > 1 цикл(400)');
                wait(100);
                if not Connected then exit;
                CheckSave;
                t := t + 1;
              until TargetPresent or (t >= 50);
              if not Connected then exit;
              WaitTargetObject(self);
            end;
          td := 0;
          t := 0;
          repeat
            if Debug(30,100) then AddToSystemJournal('>>> Debug <<< Блок Heal > 2 цикл(414)');
            wait(100);
            if not Connected then exit;
            CheckSave;
            t := t + 1;
          until (InJournalBetweenTimes('You were|You have healed|The patient|You must', htime, Now) <> -1) or (t >= 300) or dead;
          htime := Now;
          Hungry(ground);
        end;  
    end;
    
    procedure EarthProcessing;
    var
    i, t : integer;
    begin
      LoadTilesFromFile(FileNameLoc);
      for i := 1 to Count do
        begin
          Heal;
          Hungry(backpack);
          if newMoveXY(Tiles[i][1], Tiles[i][2], True, 0, True) then
            begin
              CheckWarMode;
              if not CheckItems then exit;
              repeat
                if TargetPresent then CancelTarget;
                UseType($0F39, $FFFF);
                CheckTarget(5);
                TargetToXYZ(Tiles[i][1], Tiles[i][2], GetZ(self));
                WaitMsgInJournalToEP := Now;
                CheckSave;
                UseType($0F39, $FFFF);
                if (CheckTarget(1) = false) or ((InJournalBetweenTimes('Вы вскопали землю|Вы заново обработали землю|Здесь уже вскопано|There is nothing to dig here', WaitMsgInJournalToEP, Now) <> -1)) then break;
                if not newMoveXY(Tiles[i][1]+1, Tiles[i][2]+1, True, 0, True) then break;
              until false;
              t := 0;
              repeat
                wait(100);
                CheckSave;
                t := t + 1;
              until (InJournalBetweenTimes('Вы вскопали землю|Вы заново обработали землю|Здесь уже вскопано|There is nothing to dig here', WaitMsgInJournalToEP, Now) <> -1) and (LineName = 'System') or (t >= 100);
              if (GetX(self) <> Tiles[i][1]) or (GetY(self) <> Tiles[i][2]) then newMoveXY(Tiles[i][1], Tiles[i][2], True, 0, True);
              if TargetPresent then CancelTarget;
              UseType($0F7F, $FFFF);
              FindTypeEx($0ABD, $FFFF, Backpack, False);
              if FindCount > 0 then MoveItem(finditem, 0, ground, 0,0,0);
            end;  
        end;  
    end;
    
    function CheckLoction : Boolean;
    var
    x, y : integer;
    begin
      x := GetX(self);
      for x := x - DistanceCheckLoction to GetX(self) + DistanceCheckLoction do
        begin
          y := GetY(self);
          for y := y - DistanceCheckLoction to GetY(self) + DistanceCheckLoction do
            begin
              if FileExists(IntToStr(x)+'_'+IntToStr(y)+'.loc') then
                begin
                  result := true;
                  FileNameLoc := IntToStr(x)+'_'+IntToStr(y)+'.loc';
                  AddToSystemJournal(+ins+ol+wcif+FileNameLoc+ens);
                  exit;
                end;
            end;
        end;
      AddToSystemJournal(+es+ulf+eie+ens);
      result := false;
    end;
    
    procedure WriteToFile(filepath: string; data: string);
    var mode: Word;
    begin
    if FileExists(filepath) then mode := fmOpenReadWrite
    else mode := fmCreate;
    with TFileStream.Create(filepath,mode) do
      try
        Seek(0,soFromEnd);
        WriteBuffer(data,Length(data));
      finally
        Free;
      end;
    end;
    
    procedure GetCoorTile;
    var
    i, x, y : integer;
    begin
      ClientPrintEx(self, 5, 1, 'Координаты локации сохранены.');
      ClientPrintEx(self, 5, 1, 'Для начала записи координат, вызовите таргет.');
      AddToSystemJournal(#13#10+'Координаты локации сохранены.');
      AddToSystemJournal(#13#10+'Для начала записи координат, вызовите таргет.');
      i := 0;
      CancelTarget;
      repeat
        wait(1000);
      until TargetPresent;
      ClientPrintEx(self, 5, 1, 'Начало разметки огорода.');
      AddToSystemJournal(#13#10+'Начало разметки огорода.');
      repeat
        if ((x <> GetX(self)) or (y <> GetY(self))) and (GetZ(self) <= 3) then
          begin
            if i > 5000 then break;
            Tile[i].x := GetX(self);
            Tile[i].y := GetY(self);
            x := GetX(self);
            y := GetY(self);
            i := i + 1;
            wait(100);
          end;
      until not TargetPresent;
      Count := i - 1;
      ClientPrintEx(self, 5, 1, 'Конец разметки огорода.');
      AddToSystemJournal(#13#10+'Конец разметки огорода.');    
    end;
    
    procedure CheckDubleCoor;
    var
    xi, yi, ii, i : integer;
    begin
      ClientPrintEx(self, 5, 1, 'Обрабатываю данные...');
      AddToSystemJournal(#13#10+'Обрабатываю данные...');  
      repeat
        xi := Tile[ii].x;
        yi := Tile[ii].y;
        for i := 0 to Count do
          begin
            if ii <> i then
              begin
                if (xi = Tile[i].x) and (yi = Tile[i].y) then
                  begin
                    Tile[i].x := 0;
                    Tile[i].y := 0;
                  end;
              end;
          end;
        ii := ii + 1;
        if ii >= Count then break;
      until false;
      ii := 0; 
      for i := 0 to Count do
        begin
          if (Tile[i].x > 0) and (Tile[i].y > 0) then
            begin
              RdyTile[ii].x := Tile[i].x;
              RdyTile[ii].y := Tile[i].y;
              ii := ii + 1;
            end;
        end;
        Count := ii - 1;
        for i := 0 to Count do
          begin
            WriteToFile(IntToStr(locx)+'_'+IntToStr(locy)+'.loc', IntToStr(RdyTile[i].x)+' '+IntToStr(RdyTile[i].y)+#13#10);
          end;
          ClientPrintEx(self, 5, 1, 'Обработка данных закончена.');
          AddToSystemJournal(#13#10+'Обработка данных закончена.'); 
    end;
    
    begin
      if SaveCoorMod = 1 then
        begin
          CancelTarget;
          locx := GetX(self);
          locy := GetY(self);
          GetCoorTile;
          CheckDubleCoor;
          ClientPrintEx(self, 5, 1, 'Скрипт завершил работу.');
          AddToSystemJournal(#13#10+'Скрипт завершил работу.');
          CancelTarget;
          exit;
        end;
      RunInfoMSG;
      if not CheckItems then exit;
      if not CheckLoction then exit;
      EarthProcessing;
    end.
     

     


  2. UP Version 1.1

     

    // Create by nepret 
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //                       [Stealth] Sparring v1.1
    //
    ///////////////////////////////////////// MIDDLE-EARTH.RU /////////////////////////////////////////
    //
    // Скрипт для прокачки боевых скиллов.
    //
    // Функционал:
    // 1 скрипт на оба чара (Атакующего и Куклу).
    // Мытьё бинтов и сладирование в точку где лежат остальные.
    // Жрём и используем бинты с пола (как истенные свинтусы :)).
    // Авто-хил. Как только достигнут предел порога хитпоинтов, 
    // аттакующий отключает WarMod и начинает лечить куклу, + авто подхил куклы (двойнох хиллинг).
    // Автореконект при дисконекте. После реконекта, хилл куклы (если живая).
    // Автозамена сломаного оружия.
    // Дистанция при которой будет работать скрипт: 3 тайла.
    //
    // Для работы скрипта необходимо:
    // Оптимальное значение авто-реконнектора: от 2 до 5 секунд.
    // На полу:
    // *Бинты
    // *Еда
    // *Бочка с водой
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    Program Sparring;
    const
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////// Настройка переменных ////////////////////////////////////////
                  //
    VarHeal = 0;  // 0-Счёт по кол-ву хп; 1-По Процентному соотношению
                  //              
    ////////////////
                  //              
    MinHP = 40;   // Если "VarHeal = 0", то ставим количество хп при котором надо лечиться.
                  // Eсли "VarHeal = 1", то ставим количество процентов при котором начинаем лечиться.
                  //
    //////////////// 
                  //             
                  // Тип еды, которую будем кушать в процессе.
    Food = $097B; // $097B - жаренная рыба
                  // $09F2 - жаренное мясо
                  // $171F - бананы
                  //
    ////////////////
                  // Если не знаете как этом пользоваться,
                  // оставте 0.
    DebugMode = 1;// Выдавать информацию в системный журнал.
                  // Включать при отслеживании ошибок в скрипте.
                  //
    ////////////////////////////////////// Конец настроек /////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    
    var
    CharX, CharY, IDDoll, Role, CheckVarHeal, Error, RLayer, LLayer, BX, BY, BZ, CheckDebug, td, t : integer;
    NameRWeapon, NameLWeapon : String;
    htime, ftime, HungryJournalTime : TDateTime;
    
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////// Начало ////////////////////////////////////////////////
    procedure CheckSave; 
    var Time : TDateTime; 
    begin 
      Time:= Now - (0.5 / 1440); 
      if InJournalBetweenTimes('Saving World State',Time,Now) >= 0 then
        repeat
          wait(1000);
          if not Connected then exit;
        until InJournalBetweenTimes('Saving World State complete',Time,Now) >= 0;
    end;
    
    function Debug(OperationTimeSec : integer; DelayInCycleMs : integer) : Boolean;
    begin
      if DebugMode = 1 then
        begin
          if td = 0 then CheckDebug := 1;
          if CheckDebug = 1 then
            begin
              if DelayInCycleMs = 0 then
                begin
                  AddToSystemJournal('>>> Debug <<< Минимально-допустимая задержка в цикле := 1ms. Debug инклюд завершился с ошибкой!');
                  CheckDebug := 0;
                  td := 1;
                  exit;
                end;
              OperationTimeSec := OperationTimeSec * 1000;
              td := td + DelayInCycleMs;
              if td >= OperationTimeSec then
                begin
                  result := true;
                  CheckDebug := 0;
                end;
            end;  
        end;
    end;
    
    procedure WaitConnection(WaitTime : Integer);
    begin
      if Connected then Exit;
      while not Connected do Wait(1000);
        {WaitTime - Waiting After Connected}
        wait(WaitTime);
    end;
    
    function CheckTarget(SecTime : integer) : Boolean;
    var
    t : integer;
    begin
      SecTime := SecTime * 10;
      td := 0;
      t := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(SecTime/10,100) then AddToSystemJournal('>>> Debug <<< Блок инклюда CheckTarget ');
        wait(100);
        t := t + 1;
      until TargetPresent or (t >= SecTime);
      if t >= SecTime then result := false;
      if not Connected then exit;
      if TargetPresent then result := true;
    end;
    
    function Hungry(Plase : cardinal) : Boolean;
    var
    VarFood : string;
    begin
      if dead then exit;
      if Food = $097B then VarFood := 'жареной рыбы';
      if Food = $09F2 then VarFood := 'жареного мяса';
      if Food = $171F then VarFood := 'бананов';
      if not (Food = $097B) or (Food = $09F2) or (Food = $171F) then VarFood := 'еды';
      FindTypeEx(Food, $FFFF, Plase, True);
      if FindCount < 1 then
        begin
          AddToSystemJournal('>>> Нет '+ VarFood +'!');
          result := false;
          exit;
        end;
      result := true;
      if HungryJournalTime = 0 then
        begin
          HungryJournalTime := Now;
          repeat
            FindTypeEx(Food, $FFFF, Plase, False);
            if FindCount > 0 then
              begin
                UseObject(finditem);
                wait(1000);
              end;
          until InJournalBetweenTimes('Я объелс|You are full', HungryJournalTime, Now) <> -1;
        end
      else
        begin
          if Now < HungryJournalTime + (1.0/1440) then exit;
        end;
      if (InJournalBetweenTimes('голодны|Вы почти умираете от голода|Ваш желудок болит|Вы чувствуете слабость|You are absolutely stuffed|You are stuffed|hungry at all|You are a little hungry|You are somewhat hungry|You are REALLY hungry|Your stomash hurts|Your stomash hurts and you feel dizzy|You are starving|You are almost dying of hunger|You are DYING of hunger', HungryJournalTime, Now) <> -1) and (LineName = 'System') and (LineTextColor = 443) then
        begin
          FindTypeEx(Food, $FFFF, Plase, False);
          if FindCount > 0 then  UseObject(finditem);
        end;
      HungryJournalTime := Now;
    end;
    //////////////////////////////////////////// конец ////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////////////
    
    
    procedure CheckBB;
    begin
      if not Connected then exit;
      FindTypeEx($0E7B, $FFFF, Ground, False);
      if FindCount < 1 then
        begin
          AddToSystemJournal('>>> На полу нет бочки с водой! Мне негде мыть бинты.');
          exit;
        end;
      FindTypeEx($0E20, $FFFF, Backpack, False);
      if FindFullQuantity < 1000 then exit;
      if FindFullQuantity >= 1000 then
        begin
          t := 0
          td := 0
          repeat
            if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок CheckBB > 1 цикл(185)');
            FindTypeEx($0E20, $FFFF, Backpack, False);
            if FindCount > 0 then
              begin
                if not Connected then exit;
                UseObject(finditem);
                CheckTarget(5);
                FindTypeEx($0E7B, $FFFF, Ground, False);
                WaitTargetObject(finditem);
                wait(1000);
              end;
            wait(100);
            t := t + 1;  
          until (FindCount < 1) or (t >= 50);
          t := 0
          td := 0
          repeat
            if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок CheckBB > 2 цикл(202)');
            if not Connected then exit;
            FindTypeEx($0E21, $FFFF, Backpack, False);
            if FindCount > 0 then 
              begin
                MoveItem(finditem, 0, Ground, BX,BY,BZ);
                wait(1000);
              end;
              t := t + 1;
            wait(100);
          until (FindCount < 1) or (t >= 50);
        end;
    end;
    
    function CheckDead : Boolean;
    begin
      if not Connected then exit;
      if Role = 1 then
        begin
          if GetHP(IDDoll) < 1 then
            begin
              Error := 1;
              result := true;
              SetGlobal('stealth',IntToStr(self),'0')
              AddToSystemJournal('>>> Кукла мертва! Скрипт завершает работу!');
            end;
        end;
      if Role = 0 then
        begin
          if Dead then
            begin
              Error := 1;
              result := true;
              SetGlobal('stealth',IntToStr(self),'0')
              AddToSystemJournal('>>> Я мёртв! Скрипт завершает работу!');
            end;
        end;
    end;
    
    procedure CheckArm;
    var
    t : integer;
    begin
      if not Connected then exit;
      if CheckDead then exit;
      if RLayer <> 0 then
        begin
          if ObjAtLayer(RhandLayer) = 0 then
            begin  
              FindTypeEx(RLayer, $FFFF, Backpack, False);
              if FindCount > 0 then
                begin
                  Equip(RhandLayer,finditem);
                  td := 0;
                  t := 0;
                  repeat
                    if not Connected then exit;
                    if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок CheckArm > 1 цикл(259)');
                    wait(100);
                    CheckSave;
                    if CheckDead then exit;
                    t := t + 1
                  until (ObjAtLayer(RhandLayer) > 0) or (t >= 50) or dead;
                end
              else
                begin
                  Error := 1;
                  AddToSystemJournal('>>> В бекпаке больше нет '+ NameRWeapon +'! Скрипт дальше работать НЕ БУДЕТ!');
                  exit;
                end;
            end;
        end;
      if LLayer <> 0 then
        begin
          if ObjAtLayer(LhandLayer) = 0 then
            begin  
              FindTypeEx(LLayer, $FFFF, Backpack, False);
              if FindCount > 0 then
                begin
                  Equip(LhandLayer,finditem);
                  t := 0;
                  td := 0;
                  repeat
                    if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок CheckArm > 2 цикл(285)');
                    wait(100);
                    CheckSave;
                    if CheckDead then exit;
                    t := t + 1
                  until (ObjAtLayer(LhandLayer) > 0) or (t >= 50) or dead;
                end
              else
                begin
                  Error := 1;
                  AddToSystemJournal('>>> В бекпаке больше нет '+ NameLWeapon +'! Скрипт дальше работать НЕ БУДЕТ!');
                  exit;
                end;
            end;
        end;
    end;
    
    procedure SaveArm;
    begin
      if not Connected then exit;
      if (ObjAtLayer(RhandLayer) <> 0) or (ObjAtLayer(LhandLayer) <> 0) then
        begin
          AddToSystemJournal('Будем качаться с оружием в руках.');
          if ObjAtLayer(RhandLayer) <> 0 then
            begin
              RLayer := GetType(ObjAtLayer(RhandLayer));
              ClickOnObject(ObjAtLayer(RhandLayer));
              CheckSave;
              wait(2000);
              NameRWeapon := GetName(ObjAtLayer(RhandLayer));
              FindTypeEx(RLayer, $FFFF, Backpack, False);
              if FindCount >= 0 then AddToSystemJournal('В бекпаке найдено: '+ IntToStr(FindCount) + ' "'+ NameRWeapon + '".');
            end;
           if ObjAtLayer(LhandLayer) <> 0 then
            begin
              LLayer := GetType(ObjAtLayer(LhandLayer));
              ClickOnObject(ObjAtLayer(LhandLayer));
              CheckSave;
              wait(2000);
              NameLWeapon := GetName(ObjAtLayer(LhandLayer));
              FindTypeEx(LLayer, $FFFF, Backpack, False);
              if FindCount >= 0 then AddToSystemJournal('В бекпаке найдено: '+ IntToStr(FindCount) + ' "'+ NameLWeapon + '".');
            end;
        end
      else
        begin
          AddToSystemJournal('Будем качаться без оружия в руках.');
        end;
    end;
    
    procedure CheckRes;
    begin
      if not Connected then exit;
      FindTypeEx($0E21, $FFFF, Ground, False);
      if FindCount < 1 then
        begin
          Error := 1;
          AddToSystemJournal('>>> На полу нет бинтов! Скрипт дальше работать НЕ БУДЕТ!');
        end;
      BX := GetX(finditem);
      BY := GetY(finditem);
      BZ := GetZ(finditem);
      if not Connected then exit;
      FindTypeEx(Food, $FFFF, Ground, False);
      if FindCount < 1 then
        begin
          Error := 1;
          AddToSystemJournal('>>> На полу нет еды! Скрипт дальше работать НЕ БУДЕТ!');
        end;
      if CheckDead then Error := 1;
      if Error = 1 then
        begin
          if not Connected then exit;
          if WarMode then SetWarMode(False);
          SetGlobal('stealth',IntToStr(IDDoll),'0');
          exit;
        end;
      Hungry(Ground); 
    end;
    
    function CheckRoleHeal : Boolean;
    begin
      if not Connected then exit;
      if Role = 1 then
        begin
          if GetGlobal('stealth',IntToStr(IDDoll)) = IntToStr(0) then result := true;
          exit; 
        end; 
      if Role = 0 then
        begin
          if HP < MaxHP then result := true;
          exit;
        end;
      result := false;
    end;
    
    procedure Heal;
    var
    t : integer;
    begin
      if not Connected then exit;
      while CheckRoleHeal = true do
        begin
          if CheckDead then exit;
          if not Connected then exit; 
          FindTypeEx($0E21, $FFFF, Ground, False);
          if FindCount > 0 then
            begin
              if targetpresent then canceltarget;
              htime := Now;
              if not Connected then exit;
              UseObject(finditem);
              t := 0;
              td := 0;
              repeat
                if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок Heal > 1 цикл(400)');
                wait(100);
                if not Connected then exit;
                CheckSave;
                if CheckDead then exit;
                t := t + 1;
              until TargetPresent or (t >= 50);
              if not Connected then exit;
              if Role = 1 then WaitTargetObject(IDDoll); 
              if Role = 0 then WaittargetSelf;
            end;
          td := 0;
          t := 0;
          repeat
            if Debug(30,100) then AddToSystemJournal('>>> Debug <<< Блок Heal > 2 цикл(414)');
            wait(100);
            if not Connected then exit;
            CheckSave;
            t := t + 1;
          until (InJournalBetweenTimes('You were|You have healed|The patient|You must', htime, Now) <> -1) or (t >= 300) or dead;
          htime := Now;
        end;
      CheckBB;  
    end;
    
    procedure CheckRole;
    var
    i : integer;
    TypeDoll : array [0..1] of cardinal;
    begin
      if not Connected then exit;
      if PredictedDirection = 0 then
        begin
          CharX := GetX(self);
          CharY := GetY(self) - 1;
        end;
      if PredictedDirection = 4 then
        begin
          CharX := GetX(self);
          CharY := GetY(self) + 1;
        end;
      if PredictedDirection = 2 then
        begin
          CharX := GetX(self) + 1;
          CharY := GetY(self);
        end;
      if PredictedDirection = 6 then
        begin
          CharX := GetX(self) - 1;
          CharY := GetY(self);
        end;
      if PredictedDirection = 1 then
        begin
          CharX := GetX(self) + 1;
          CharY := GetY(self) - 1;
        end;
      if PredictedDirection = 5 then
        begin
          CharX := GetX(self) - 1;
          CharY := GetY(self) + 1;
        end;
      if PredictedDirection = 3 then
        begin
          CharX := GetX(self) + 1;
          CharY := GetY(self) + 1;
        end;
      if PredictedDirection = 7 then
        begin
          CharX := GetX(self) - 1;
          CharY := GetY(self) - 1;
        end;
      if WarMode then SetWarMode(False); 
      TypeDoll[0] := $0190;
      TypeDoll[1] := $0191;
      Ignore(self);
      for i := 0 to 1 do
        begin
          td := 0;
          repeat
            if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок CheckRole > 1 цикл(479)');
            wait(100);
            CheckSave;
            if not Connected then exit;
            FindTypeEx(TypeDoll[i], $FFFF, Ground, False)
            if FindCount > 0 then
              begin
                if (GetX(finditem) = CharX) and (GetY(finditem) = CharY) and (GetHP(finditem) > 0) then
                  begin
                    IDDoll := finditem;
                    SetGlobal('stealth',IntToStr(IDDoll),'0');
                    Role := 1;
                    SaveArm;
                    AddToSystemJournal('Выбрана роль атакующего...');
                    exit;
                  end
                else                    
                  begin
                    Ignore(finditem);
                  end;
              end;
          until FindCount < 1;
        end;
      SetGlobal('stealth',IntToStr(self),'0');
      Role := 0;
      AddToSystemJournal('Выбрана роль куклы...');
      Heal;
    end;
    
    procedure PlayRole;
    begin
      if Role = 1 then
        begin
          if CheckDead then exit;
          CheckRes;
          CheckArm;
          if Error = 1 then exit;
          if GetGlobal('stealth',IntToStr(IDDoll)) = IntToStr(1) then
            begin
              if not Connected then exit;
              if (WarTargetID <> IDDoll) then attack(IDDoll);
            end
          else
            begin
              td := 0;
              t := 0;
              repeat
                if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок PlayRole > 1 цикл(526)');
                CheckSave;
                if not Connected then exit;
                wait(100);
                t := t + 1;
                if WarMode then SetWarMode(False);
              until (WarMode = false) or (t >= 100);
              Heal;
            end; 
        end;
      if Role = 0 then
        begin
          if CheckDead then exit;
          CheckRes;
          if Error = 1 then exit;
          if not Connected then exit;
          if HP <= CheckVarHeal then
            begin
              repeat
                SetGlobal('stealth',IntToStr(self),'0');
                CheckSave;
                Heal;
                CheckRes;
                if (Error = 1) or CheckDead then exit;
                if not Connected then exit;
              until HP = MaxHP;
            end;
          SetGlobal('stealth',IntToStr(self),'1');  
        end; 
    end;
    
    begin
      Error := 0;
      htime := Now;
      ftime := Now;
      SetARStatus(true);
      SetPauseScriptOnDisconnectStatus(false);
      if not Connected then WaitConnection(10000);
      if VarHeal = 1 then
        begin
          CheckVarHeal := GetMaxHP(Self)*MinHP/100;
        end
      else
        begin
          CheckVarHeal := MinHP;
        end;
      CheckRole;
      UOSay('Op');
      repeat
        if not Connected then
          begin
            AddToSystemJournal('>>> Error Connected! Связь с сервером потерена.');
            if GetARStatus then AddToSystemJournal('>>> Пробую востановить соединение с сервером...');
            if Role = 1 then SetGlobal('stealth',IntToStr(IDDoll),'0');
            if Role = 0 then SetGlobal('stealth',IntToStr(self),'0');
            WaitConnection(100);
            UOSay('Op');
            if Connected then AddToSystemJournal('>>> Соединение с сервером востановленно!');
            if Role = 1 then
              begin
                td := 0;
                t := 0;
                repeat
                  if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Главный блок > 1 цикл(587)');
                  CheckSave;
                  WaitConnection(100);
                  wait(100);
                  t := t + 1;
                  if WarMode then SetWarMode(False);
                until (WarMode = false) or (t >= 100);
              end;
            Heal;
            wait(10000);
          end;
        if Error = 1 then
          begin
            SetARStatus(false);
            Disconnect;
            exit;
          end;
        PlayRole;
        wait(100);
      until false;
    end.
     

     


  3. Внимание! Дабы предостеречь от печальных событий рекомендуем двери в дом, в котором будет стоять кастер перекрывать СУНДУКАМИ или другой мебелью, через которую нельзя пройти ГОСТОМ!... (добавленно MeSSiR)

    Кастер рессает всех, кто находится рядом с ним на расстоянии 2 клеток... проверок на то что персонаж не "заслонный казачок" в скрипте нет! ИМЕЙТЕ ВВЕДУ!

    // Create by nepret   
    ///////////////////////////////////////////////////////////////////
    //
    //                       [Stealth] AutoBaffAndRes v1.4
    //
    ///////////////////////// MIDDLE-EARTH.RU /////////////////////////
    //
    // Скрипт Автоматического Бафа, ребафа и резуректа игроков. (Для дома)
    //
    // Функционал:
    // Каст на игрока Bless + Protection
    // Перекастовка Bless
    // Воскрешение игрока Resurrection 
    // (настройка любого количества фраз на полный баф и ребаф блесса)
    //
    // *Настройка +Есть -Нет
    // Оповещение о том что заканчивается реагенты\еда. Вывод информации о том что кончается и сколько реагентов осталось.(+)
    // Проверка маны перед каждым бафом. На каждый каст, своя проверка на мин-е кол-во маны для этого каста. (-)
    // Проверка на наличие реагентов для каста. Если искомых не найдено, выводит сообщения каких именно реагентов нет. (-)
    //  *** Настройка сумки с реагентами. (+)
    //  *** Ожидание появления реагентов в сумке\на полу(берёт с пола, перекладывает в сумку).(-)
    // Дистанция при которой бафер будет реагировать на команды: 4 тайла. (+)
    //
    // Для работы скрипта необходимо:
    //
    // Настроеть под себя переменные ниже.
    // Делать то, что просит бафер(скрипт).
    //
    // Спасибо за помощь в отладке скрипта: MeSSiR'y и Kallish'у.
    ///////////////////////////////////////////////////////////////////
    Program AutoBaffAndRes;
    const
    ///////////////////////////////////////////////////////////////////
    ////////////////////// Настройка переменных ///////////////////////
                           //
    WorkDistance = 4;      // Дистанция при которой реагировать на команды.
                           // на команды.
    /////////////////////////
                           //
                           // Фразы при котором давать полный обкаст.
    FullCastPh = 'баф';    // Указать одну или несколько фраз, 
                           // несколько фраз указывать через разделитель "|".
                           //
    /////////////////////////
                           //
                           // Фразы при котором давать дополнительный блесс.
    ReCastBless = 'блес';  // Указать одну или несколько фраз, 
                           // несколько фраз указывать через разделитель "|".
                           //
    /////////////////////////
                           //
                           // При каком минимальном колличестве реагентов,
    RegsCountInfo = 30;    // предупреждать в чат о том что он заканчивается?
                           // 0-Не предупреждать.
                           //
    /////////////////////////
                           //
                           // Если реагенты хранятся в контейнере(на чаре),
                           // то укажите его ID. Если в бекпаке, то 0.
                           // Указывать только так:
    ResCount = $7E895CA7;  // Бекпак -> Сумка с реагентами
                           // Вариант :
                           // Бекпак -> Сумка -> Сумка с реагентами
                           // не прокатит...
                           //
    ///////////////////////////////////////////////////////////////////
                           // Если не знаете как этим пользоваться,
                           // оставте 0.
    DebugMode = 0;         // Выдавать информацию в системный журнал.
                           // Включать при отслеживании ошибок в скрипте.
                           //
    ///////////////////////// Конец настроек //////////////////////////
    ///////////////////////////////////////////////////////////////////
    
    var
    fbjtime, rbjtime : TDateTime;
    t, ResCountVar, ID : integer;
    regs : array [0..5] of cardinal;
    regsname : array [0..5] of String;
    {$Include 'all.inc'}
    
    
    procedure CheckResInfo;
    var
    i, r, rc, h : integer;
    Info, CountInfo, CountInfoFood : string;
    begin
      if not Connected then exit;
      if RegsCountInfo < 1 then exit;
      if not Connected then exit;
      for i := 0 to 5 do
        begin
          if not Connected then exit;
          if i = 5 then h := Backpack;
          if i < 5 then h := ResCountVar;
          FindTypeEx(regs[i], $FFFF, h, false);
          if FindFullQuantity > RegsCountInfo then rc := rc + 1;
        end;
      if rc >= 6 then exit;
      rc := 0;
      if not Connected then exit;
      for i := 0 to 5 do
        begin
          if i = 5 then h := Backpack;
          if i < 5 then h := ResCountVar;
          FindTypeEx(regs[i], $FFFF, h, false);
          if (FindFullQuantity <= RegsCountInfo) and (FindFullQuantity > 0) then
            begin
              if not Connected then exit;
              if  i < 5 then
                begin
                  CountInfo := CountInfo+' | '++IntToStr(FindFullQuantity);
                  info := Info+' | '++ regsname[i];
                  r := 1;
                end
              else
                begin
                  CountInfoFood := 'Еда: '+IntToStr(FindFullQuantity);
                end;
              rc := 1;
            end;
        end;
      checksave;
      if rc = 1 then
        begin
          UOSay('Заканчивается: '+CountInfoFood);
          if r = 1 then
            begin
              UOSay(info+' | ');
              UOSay(CountInfo+' | ');
            end;
          if not Connected then exit;
        end;
    end;
    
    procedure CheckRes;
    var
    t, ts, c, i, y, rc, orc : integer;
    info, ci : string;
    begin
      if not Connected then exit;
      for i := 0 to 4 do
        begin
          if not Connected then exit;
          FindTypeEx(regs[i], $FFFF, ResCountVar, false);
          if FindFullQuantity > 0 then rc := rc + 1;
        end;
      if rc >= 5 then exit;
      y := 0;
      repeat
        rc := 0;
        for i := 0 to 4 do
          begin
            if not Connected then exit;
            FindTypeEx(regs[i], $FFFF, ResCountVar, false);
            if FindFullQuantity > 0 then rc := rc + 1;
            if FindFullQuantity < 1 then
              begin
                FindTypeEx(regs[i], $FFFF, Ground, false);
                if FindCount > 0 then
                  begin
                    if not Connected then exit;
                    MoveItem(finditem, 0, ResCountVar, 0,0,0);
                    td := 0;
                    t := 0;
                    repeat
                      if not Connected then exit;
                      checksave;
                      if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок CheckRes > 1 цикл (105)');
                      wait(100);
                      t := t + 1;
                      FindTypeEx(regs[i], $FFFF, ResCountVar, false);
                    until (FindFullQuantity > 0) or (t >= 20);
                    UOSay('Взял "'+ regsname[i] +'"!');
                    if not t <= 50 then rc := rc + 1;
                    if orc = 1 then orc := 0;
                  end
                else
                  begin
                    if y = 0 then c := c + 1;
                    info := info+' '++ regsname[i];
                  end;
              end;
          end;
        if rc >= 5 then UOSay('Работаем..');
        if rc >= 5 then exit;
        if ts = 0 then
          begin
            if c = 1 then ci := 'кончился';
            if c > 1 then ci := 'кончились';
            UOSay('У меня '+ ci +':');
            UOSay(info);
            UOSay('Кинь мне под ноги, или закинь в ручную.');
            wait(3000);
          end;
        if ts >= 166 then ts := 83;
        if (ts = 83) or (orc = 0) then 
          begin
            if orc = 0 then orc := 1;
            checksave;
            hungry(backpack);
            UOSay(info);
          end;
        info := '';
        checksave;
        wait(100);
        ts := ts + 1;
        if not Connected then exit; 
      until false;
    end;
    
    function CheckMP(MinMP : Integer) : Boolean;
    begin
      if not Connected then exit;
      if Mana < MinMP then
        begin
          if not Connected then exit;
          result := true;
          UOSay('Маны малавато... надо бы по медитировать ()');
          td := 0;
          repeat
            if not Connected then exit;
            checksave;
            if Debug(60,2000) then AddToSystemJournal('>>> Debug <<< Блок CheckMP > 1 цикл (160)');
            UseSkill('Meditation');
            wait(2000);
            UOSay('Mana '+ IntToStr(Mana) +'/'+ IntToStr(MaxMana));
          until Mana = MaxMana;
          UOSay('Ну вот, другое дело :)'); 
        end;
      if not Connected then exit;
    end;
    
    function CheckTarget(SecTime : integer) : Boolean;
    begin
      SecTime := SecTime * 10;
      td := 0;
      t := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(SecTime/10,100) then AddToSystemJournal('>>> Debug <<< Блок CheckTarget > 1 цикл (178)');
        wait(100);
        t := t + 1;
      until TargetPresent or (t >= SecTime);
      if t >= SecTime then result := false;
      if not Connected then exit;
      if TargetPresent then result := true;
    end;
    
    procedure Resurrect;
    var
    i : integer;
    PlayerGhost : array [0..1] of cardinal;
    begin
      PlayerGhost[0] := $0192;
      PlayerGhost[1] := $0193;
      for i := 0 to 1 do
        begin
          if not Connected then exit;
          CheckRes;
          FindTypeEx(PlayerGhost[i], $FFFF, Ground, False);
          if FindCount > 0 then
            begin
              repeat
                if not Connected then exit;
                if CheckMP(50) then
                  begin
                    if not Connected then exit;
                    FindTypeEx(PlayerGhost[i], $FFFF, Ground, False);
                    if FindCount < 1 then exit;
                  end;
                if not Connected then exit;
                CancelTarget;
                Cast('Resurrection');
                if not CheckTarget(6) then
                  begin
                    if DebugMode = 1 then AddToSystemJournal('>>> Debug <<< Блок Resurrect > 1 цикл ожидания таргета (214)');
                    exit;
                  end;
                TargetToObject(finditem);
                UOSay('Mana '+ IntToStr(Mana) +'/'+ IntToStr(MaxMana));
                td := 0;
                t := 0;
                repeat
                  if not Connected then exit;
                  checksave;
                  if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок Resurrect > 2 цикл (224)');
                  wait(100);
                  t := t + 1;
                until (GetHP(finditem) > 0) or (t >= 50);
                if GetHP(finditem) = 0 then UOSay('Ты кнопку жать будеш или как?! Если нет, то отойди!');
                FindTypeEx(PlayerGhost[i], $FFFF, Ground, False);
                if not Connected then exit;
              until (GetHP(finditem) > 0) or (FindCount < 1);
            end;
        end;
      if not Connected then exit;
    end;
    
    procedure Recast;
    begin
      if InJournalBetweenTimes(ReCastBless, rbjtime, Now) <> -1 then
        begin
          if not Connected then exit;
          ID := LineID;
          CheckRes;
          if ID <= 0 then exit;
          if LineName = 'System' then exit;
          if GetZ(self) <> GetZ(ID) then exit;
          if (GetX(ID) < GetX(self) - WorkDistance) or (GetX(ID) > GetX(self) + WorkDistance) or (GetY(ID) < GetY(self) - WorkDistance) or (GetY(ID) > GetY(self) + WorkDistance) then
            begin
              td := 0;
              t := 0;
              repeat
                if not Connected then exit;
                checksave;
                if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок Recast > 1 цикл (254)');
                wait(100);
                t := t + 1;
              until (GetX(ID) >= GetX(self) - WorkDistance) and (GetX(ID) <= GetX(self) + WorkDistance) and (GetY(ID) >= GetY(self) - WorkDistance) and (GetY(ID) <= GetY(self) + WorkDistance) or (t >= 20);
              if t >= 20 then exit;
              if not Connected then exit;
            end;
          if CheckMP(9) then
            begin
            if (GetZ(self) <> GetZ(ID)) or (GetX(ID) < GetX(self) - WorkDistance) or (GetX(ID) > GetX(self) + WorkDistance) or (GetY(ID) < GetY(self) - WorkDistance) or (GetY(ID) > GetY(self) + WorkDistance) then
              begin
                UOSay(' ');
                UOSay('ммм...');
                UOSay('Я тебя потерял...');
                rbjtime := Now;
                exit;
              end;
            end;
          if not Connected then exit;
          CancelTarget;
          Cast('Bless');
          if not CheckTarget(6) then
            begin
              if DebugMode = 1 then AddToSystemJournal('>>> Debug <<< Блок Recast > 1 цикл ожидания таргета (277)');
              exit;
            end;
          UOSay('Mana '+ IntToStr(Mana) +'/'+ IntToStr(MaxMana));
          TargetToObject(ID);
          CheckRes;
          rbjtime := Now;
          CheckResInfo;
        end;
      if not Connected then exit;
    end;
    
    procedure FullBaff;
    begin
      if not Connected then exit;
      if InJournalBetweenTimes(FullCastPh, fbjtime, Now) <> -1 then
        begin
          if not Connected then exit;
          ID := LineID;
          CheckRes;
          if ID <= 0 then exit;
          if LineName = 'System' then exit;
          if GetZ(self) <> GetZ(ID) then exit;
          if (GetX(ID) < GetX(self) - WorkDistance) or (GetX(ID) > GetX(self) + WorkDistance) or (GetY(ID) < GetY(self) - WorkDistance) or (GetY(ID) > GetY(self) + WorkDistance) then
            begin
              td := 0;
              t := 0;
              repeat
                if not Connected then exit;
                checksave;
                if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок FullBaff > 1 цикл (307)');
                wait(100);
                t := t + 1;
              until (GetX(ID) >= GetX(self) - WorkDistance) and (GetX(ID) <= GetX(self) + WorkDistance) and (GetY(ID) >= GetY(self) - WorkDistance) and (GetY(ID) <= GetY(self) + WorkDistance) or (t >= 20);
              if t >= 20 then exit;
            end;
          if not Connected then exit;
          if CheckMP(15) then
            begin
              if (GetZ(self) <> GetZ(ID)) or (GetX(ID) < GetX(self) - WorkDistance) or (GetX(ID) > GetX(self) + WorkDistance) or (GetY(ID) < GetY(self) - WorkDistance) or (GetY(ID) > GetY(self) + WorkDistance) then
                begin
                  UOSay(' ');
                  UOSay('ммм...');
                  UOSay('Я тебя потерял...');
                  fbjtime := Now;
                  exit;
              end;
            end;
          if not Connected then exit;
          CancelTarget;
          Cast('Protection');
          if not CheckTarget(6) then
            begin
              if DebugMode = 1 then AddToSystemJournal('>>> Debug <<< Блок FullBaff > 1 цикл ожидания таргета (330)');
              exit;
            end;
          TargetToObject(ID);
          if not Connected then exit;
          CancelTarget;
          Cast('Bless');
          if not CheckTarget(6) then
            begin
              if DebugMode = 1 then AddToSystemJournal('>>> Debug <<< Блок FullBaff > 2 цикл ожидания таргета (339)');
              exit;
            end;
          UOSay('Mana '+ IntToStr(Mana) +'/'+ IntToStr(MaxMana));
          TargetToObject(ID);
          CheckRes;
          fbjtime := Now;
          CheckResInfo;
        end;
      if not Connected then exit;  
    end;
    
    procedure CheckSettingGag;
    begin
      if not Connected then WaitConnection(5);
      if ResCount > 0 then
        begin
          ResCountVar := ResCount;
          UseObject(Backpack);
          td := 0;
          t := 0;
          repeat
            if not Connected then exit;
            checksave;
            if Debug(6,100) then AddToSystemJournal('>>> Debug <<< Блок CheckSettingGag > 1 цикл (363)');
            wait(100);
            t := t + 1;
          until (LastContainer = Backpack) or (t >= 50);
          UseObject(ResCountVar);
          td := 0;
          t := 0;
          repeat
            if not Connected then exit;
            checksave;
            if Debug(6,100) then AddToSystemJournal('>>> Debug <<< Блок CheckSettingGag > 2 цикл (373)');
            wait(100);
            t := t + 1;
          until (LastContainer = ResCountVar) or (t >= 50);
        end
      else
        begin
          ResCountVar := Backpack;
          UseObject(ResCountVar);
          td := 0;
          t := 0;
          repeat
            if not Connected then exit;
            checksave;
            if Debug(6,100) then AddToSystemJournal('>>> Debug <<< Блок CheckSettingGag > 3 цикл (387)');
            wait(100);
            t := t + 1;
          until (LastContainer = ResCountVar) or (t >= 50);
        end;
    end;
    
    begin
      regs[0] := $0F85;
      regs[1] := $0F84;
      regs[2] := $0F8C;
      regs[3] := $0F86;
      regs[4] := $0F7B;
      regs[5] := Food;
      regsname[0] := 'GI';
      regsname[1] := 'GA';
      regsname[2] := 'SA';
      regsname[3] := 'MR';
      regsname[4] := 'BM';
      regsname[5] := 'Провиант';
      if not GetARStatus then SetARStatus(true);
      fbjtime := Now;
      rbjtime := Now;
      CheckSettingGag;
      repeat
        if not Connected then
          begin
            fbjtime := Now;
            rbjtime := Now;
            WaitConnection(5);
            CheckSettingGag;
          end;
        hungry(backpack);
        CheckRes;
        FullBaff;
        Recast;
        Resurrect;
        wait(100);
      until false;
    end.
     

     


  4. Тайлор под стелс

     

    // Create by nepret
    // За основу брался скрипт MeSSiR'а на Inject'е из этого поста:
    // http://middle-earth.ru/forum/index.php?showtopic=6502&view=findpost&p=79565
    ///////////////////////// MIDDLE-EARTH.RU /////////////////////////
    // Скрипт для прокачки скилла Tailoring.
    // Работает по принципу изготовления необходимой вещи 
    // (в зависимости от уровня скилла) и разрезания ее обратно
    // в ткань.
    // Для работы скрипта необходимо:
    // - Include Hungry, CheckSave, WaitConnection (http://middle-earth.ru/forum/index.php?showtopic=6676)    
    // - Побольше ткани на пол возле себя    
    // - Ножницы в сумку (желательно много, т.к. часто ломаются)       
    // - Иголки (Sewing Kit) в сумке ( 1 шт. вполне хватит)           
    // Не забудьте, что после скилла в 100 необходимо использовать  
    // Lesser Power, Power, Greater Power и Ultimate скроллы.       
    // Желательно для скрипта:                                       
    // - Еда
    ///////////////////////////////////////////////////////////////////
    Program Tailoring;
    const
    ////////////////////// Настройка переменных ///////////////////////
                      //
    stop = 120;       // Стоп-отметка уровня скилла, когда нужно
                      // будет остановить прокачку для того, чтоб 
                      // применить Power скроллы. Если не нужна,
                      // то поставить значение 120.
                      //
    ///////////////////////////////////////////////////////////////////
                      //
    DebugMode = 0;    // Выдавать информацию в системный журнал
                      // Включать при отслеживании ошибок в скрипте.
                      //                  
    ///////////////////////// Конец настроек //////////////////////////
    ///////////////////////////////////////////////////////////////////
    
    var
    t : integer;
    
    {$Include 'all.inc'}
    
    function CheckSkill : Boolean;
    begin
      if not Connected then exit;
      if GetSkillValue('Tailoring') >= stop then
        begin
          AddToSystemJournal('Стоп-отметка! Скилл прокачался до: '+FloatToStrF(GetSkillValue('Tailoring'), ffgeneral, 4, 2));
          ClientPrintEx(self, 190, 200, 'Стоп-отметка! Скилл прокачался до: '+FloatToStrF(GetSkillValue('Tailoring'), ffgeneral, 4, 2));
          result := true;
          exit;
        end;
      result := false;
    end;
    
    procedure CheckRes;
    var
    CheckItemRes : array [0..2] of cardinal;
    CheckItemResInfo : array [0..2] of string;
    i : integer;
    begin
      CheckItemRes[0] := $0F9D;
      CheckItemRes[1] := $0F9E;
      CheckItemResInfo[0] := 'В сумке нет "Катушки с нитками"(Sewing Kit)';
      CheckItemResInfo[1] := 'В сумке нет "Ножиниц"(Scissors)';
      if not Connected then exit;
      for i := 0 to 1 do
        begin
          FindTypeEx(CheckItemRes[i], $FFFF, Backpack, True);
          if FindCount < 1 then
            begin
              AddToSystemJournal('>>> '+CheckItemResInfo[i]);
              ClientPrintEx(self, 190, 200, CheckItemResInfo[i]);
              td := 0;
            repeat
              if not Connected then exit;
              checksave;
              if Debug(10,1000) then AddToSystemJournal('>>> Debug <<< Блок CheckRes > 1 цикл (76)');
              wait(1000);
              FindTypeEx(CheckItemRes[i], $FFFF, Backpack, True);
            until FindCount > 0;
            AddToSystemJournal('Продолжаем работу');
            ClientPrintEx(self, 190, 200, 'Продолжаем работу');
          end;
        end;
      FindTypeEx($1766, $FFFF, Ground, False);
      if FindFullQuantity < 20 then
        begin
          AddToSystemJournal('>>> На полу нет "Ткани"(Сut Сloths)');
          ClientPrintEx(self, 190, 200, 'На полу нет "Ткани"(Сut Сloths)');
          td := 0;
          repeat
            if not Connected then exit;
            checksave;
            if Debug(10,1000) then AddToSystemJournal('>>> Debug <<< Блок CheckRes > 3 цикл (93)');
            wait(1000);
            FindTypeEx($1766, $FFFF, Ground, False);
          until FindFullQuantity > 100;
          AddToSystemJournal('Продолжаем работу');
          ClientPrintEx(self, 190, 200, 'Продолжаем работу');
        end;
    end;
    
    procedure GetCloths;
    var
    CountCloths : integer;
    begin
      FindTypeEx($1766, $FFFF, Backpack, False);
      if FindQuantity < 20 then
        begin
          if not Connected then exit;
          CountCloths := 20 - FindQuantity;
          FindTypeEx($1766, $FFFF, Ground, False);
          MoveItem(finditem, CountCloths, Backpack,0,0,0);
        end;
      td := 0;
      t := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(5,100) then AddToSystemJournal('>>> Debug <<< Блок GetCloths > 1 цикл (119)');
        wait(100);
        t := t + 1;
        FindTypeEx($1766, $FFFF, Backpack, False);
      until (FindQuantity >= 20) or (t >= 100); 
    end;
    
    function CheckTarget(SecTime : integer) : Boolean;
    var
    t : integer;
    begin
      SecTime := SecTime * 10;
      td := 0;
      t := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(SecTime/10,100) then AddToSystemJournal('>>> Debug <<< Блок CheckTarget > 1 цикл (136)');
        wait(100);
        t := t + 1;
      until TargetPresent or (t >= SecTime);
      if t >= SecTime then result := false;
      if not Connected then exit;
      if TargetPresent then result := true;
    end;
    
    procedure DestroyItem;
    var
    CraftedItem : array [0..2] of cardinal;
    si, i : integer;
    begin
      CraftedItem[0] := $1EFD;
      CraftedItem[1] := $1F03;
      CraftedItem[2] := $0ABD;
      for i := 0 to 2 do
        begin
          repeat
            if not Connected then exit;
            FindTypeEx(CraftedItem[i], $FFFF, Backpack, False);
            if FindCount > 0 then
              begin
                si := FindCount;
                repeat
                  if not Connected then exit;
                  CheckRes;
                  CancelTarget;
                  UseType($0F9E, $FFFF);
                  CheckTarget(5);
                until TargetPresent;
                FindTypeEx(CraftedItem[i], $FFFF, Backpack, False);
                WaitTargetObject(finditem);
                td := 0;
                t := 0;
                repeat
                  if not Connected then exit;
                  checksave;
                  if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок DestroyItem > 1 цикл (175)');
                  wait(100);
                  FindTypeEx(CraftedItem[i], $FFFF, Backpack, False);
                until (FindCount < si) or (t >= 50);
              end;
            if not Connected then exit;
            FindTypeEx(CraftedItem[i], $FFFF, Backpack, False);
          until FindCount = 0; 
        end;
    end;
    
    procedure Tailor;
    var
    cjtime : TDateTime;
    begin
      DestroyItem;
      GetCloths;
      repeat
        if not Connected then exit;
        CheckRes;
        CancelTarget;
        UseType($0F9D, $FFFF);
        CheckTarget(5);
      until TargetPresent;
      FindTypeEx($1766, $FFFF, Backpack, False);
      WaitTargetObject(finditem);
      cjtime := Now;
      td := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок Tailor > 2 цикл (206)');
        wait(100);
      until MenuPresent;
      if GetSkillValue('Tailoring') <= 60 then
        begin
          WaitMenu('Choose a category.','shirts');
          WaitMenu('What','Fancy Shirt');
        end;
      if GetSkillValue('Tailoring') <= 90 then
        begin
          WaitMenu('Choose','shirts');
          WaitMenu('What','Robe');
        end;
      if GetSkillValue('Tailoring') < 120 then
        begin
          WaitMenu('Choose','carpets');
          WaitMenu('Select','carpet1');
          WaitMenu('Select','carpet');
        end;
      td := 0;
      t := 0;
      repeat
        if not Connected then exit;
        checksave;
        if Debug(10,100) then AddToSystemJournal('>>> Debug <<< Блок Tailor > 3 цикл (230)');
        wait(100);
        t := t + 1;
      until (InJournalBetweenTimes('You create|You failed|You make|destroy', cjtime, Now) <> -1) or (t >= 50);
      if not Connected then exit;
    end;
    
    begin
      FindDistance := 1;
      repeat
        if not Connected then WaitConnection(5);
        if CheckSkill then exit;
        hungry(backpack);
        CheckRes;
        Tailor;
      until false;
    end.


  5. include Debug

    Инклюд предназначен для циклов типа repeat-until\while.

    Я в своих скриптах частенько выважу циклы на различные проверки, на появление таргета, на появлении определённой фразы при крафте или прокачке скиллов.

    И бывает так что они где-то зацикливаются без возможности выйти из цикла... Как правила циклов много и чтобы определить в каком именно косяк, я ставил AddToSystemJournal(название_цикла).

    Но эта порнуха заспамлевает весь системный журнал постоянным флудом циклов.

    Я прикинул х$@ к носу и решил что это как то не айс, надо найти другой способ.

    Потратил час своего времени и на свет появилось то что лежит ниже.

    Суть проста, вставляем сколько ждать до реагирования на зацикливание и сколько стоит задержка в цикле.

    После прохода контрольной точки времени, скрипт выдаёт в системный чат то, что вы напишете...

    Пример есть ниже.

    Хочу заметить, что проверки на сейв тут нет, по этому запускать инклюд стоит только вместе с checksave;

     

    include Debug(OperationTimeSec : integer; DelayInCycleMs : integer) : Boolean;

    OperationTimeSec - Сколько должно пройти времени чтобы дебагер среагировал

    Указывать в секундах

    DelayInCycleMs - Указать задержку которая стоит в цикле

    Указывать в миллисекундах

    Перед или после цикла обязательно объявить переменную "td := 0;" !

    В скрипте, в константах прописать переменную "DebugMode = 0\1;" 0-Отключить 1-Включить!

    пример использования:

     repeat
       Debug(10, 0);
    until t > 10;
    td := 0;

    в скриптах:

    Program test;
    
    const
    DebugMode = 1;
    var
    t : integer;  
    {$Include 'all.inc'}
    
    begin
      t := 0;
      td := 0;
      repeat
        if Debug(10, 0) then AddToSystemJournal('прошло 10 секунд 1-го цикла');
        wait(1);
        t := t + 1;
      until t >= 10001;
      t := 0;
      td := 0;
      repeat
        if Debug(10, 100) then AddToSystemJournal('прошло 10 секунд 2-го цикла');
        wait(100);
        t := t + 1;
      until t >= 101;
    end.

     

     

    debug.inc

    var
    CheckDebug, td : integer;
    
    function Debug(OperationTimeSec : integer; DelayInCycleMs : integer) : Boolean;
    begin
      if DebugMode = 1 then
        begin
          if td = 0 then CheckDebug := 1;
          if CheckDebug = 1 then
            begin
                if DelayInCycleMs = 0 then
                begin
                  AddToSystemJournal('>>> Debug <<< Минимально-допустимая задержка в цикле := 1ms. Debug инклюд завершился с ошибкой!');
                    CheckDebug := 0;
                    td := 1;
                  exit;
                end;
              OperationTimeSec := OperationTimeSec * 1000;
              td := td + DelayInCycleMs;
              if td >= OperationTimeSec then
                begin
                  result := true;
                  CheckDebug := 0;
                end;
            end;  
        end;
    end;


  6. include Hungy(Plase : cardinal) : Boolean;

    Plase - Указать где искать еду

    ID контейнера (требуется открыть хотя бы 1 раз)Ground (ищет на земле в радиусе 2 тайлов, редактируется параметром FindDistance)Backpack сумка персонажа (требуется открыть хотя бы 1 раз)

    В самом инклюде, указать тип еды которую будет есть. (По умолчанию фиш стейки)

    пример использования:

    Hungry(ground);

     

    UP 19.09.2012 Добавил поддержку фраз на энглише (.lang для смены языка в клиенте)

     

    const
    Food = $097B;        // Тип еды, которую будем кушать в процессе.
                                    // $097B - жаренная рыба
                                    // $09F2 - жаренное мясо
                                    // $171F - бананы
    
    var
    HungryJournalTime : TDateTime;
    
    function Hungry(Plase : cardinal) : Boolean;
    var
    VarFood : string;
    begin
        if not Connected then exit;
        if dead then exit;
        if Food = $097B then VarFood := 'жареной рыбы';
        if Food = $09F2 then VarFood := 'жареного мяса';
        if Food = $171F then VarFood := 'бананов';
        if not (Food = $097B) or (Food = $09F2) or (Food = $171F) then VarFood := 'еды';
        FindTypeEx(Food, $FFFF, Plase, True);
        if FindCount < 1 then
            begin
                AddToSystemJournal('>>> Нет '+ VarFood +'!');
                result := false;
                exit;
            end;
        result := true;
      if HungryJournalTime = 0 then
            begin
                HungryJournalTime := Now;
                repeat
                    FindTypeEx(Food, $FFFF, Plase, False);
                    if FindCount > 0 then
                        begin
                            UseObject(finditem);
                            wait(1000);
                        end;
                until InJournalBetweenTimes('Я объелс|You are full', HungryJournalTime, Now) <> -1;
            end
        else
            begin
                if Now < HungryJournalTime + (1.0/1440) then exit;
            end;
        if (InJournalBetweenTimes('голодны|Вы почти умираете от голода|Ваш желудок болит|Вы чувствуете слабость|You are absolutely stuffed|You are stuffed|hungry at all|You are a little hungry|You are somewhat hungry|You are REALLY hungry|Your stomash hurts|Your stomash hurts and you feel dizzy|You are starving|You are almost dying of hunger|You are DYING of hunger', HungryJournalTime, Now) <> -1) and (LineName = 'System') and (LineTextColor = 443) then
            begin
                FindTypeEx(Food, $FFFF, Plase, False);
                if FindCount > 0 then  UseObject(finditem);
            end;
        HungryJournalTime := Now;
    end;


  7. http://stealth.od.ua

     

    функции := http://stealth.od.ua/Doc:RU/Api (с примерами)

    "все" функции := http://stealth.od.ua/wiki/doku.php?id=functions (c примерами)

    ОБСАЛЮТНО все функции := http://stealth.od.ua/forum/viewtopic.php?t=1220 (без примеров (их очень мало))

     

    зы: пост выше писался про мой скрипт который я доделать не могу (влом =) )


  8. скорей всего ид не высветиться и он будет кастовать в молоко

    так же в молоко

     

    у меня он проверяет 3 переменный:

    x, y, z

    z должна быть такая же как и у кастера

    х и у должны быть не дальше 5 тайлов от кастера

    если к примеру ты скажешь в системный чат (баф, каст и тд) мой скрипт проигнорирует это

    +ненадо никаких контейнеров... реги под ноги кастеру (будет ждать пока ему не дадут нужный рег)

    информативность... есть функция оповещения при заканчивающемся реагенте(настраеваеться)

×
×
  • Создать...