Перейти к содержанию
Форум шарда Middle-Earth
Авторизация  
nepret

[Stealth] Sparring

Рекомендуемые сообщения

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.
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня почему-то не работает. просто стоит лечит без перерыва оппонента со 100% хп и все(( (уровень хп при котором нужно лечится ставила естесственно меньше 100% )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Авторизация  

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