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

Alchemy для шарда Forest Wars

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

Alchemy для шарда Forest Wars

Post by Scripts Writer »

Простой скрипт на алхимию для шарда Forest Wars, который на днях (на дворе лето-июль) побил планку в 200 онлайна.
Принцип работы скрипта прост: добираем бутылки и реагенты, крафтим lesser explosions, выбрасываем в мусорку, и так по кругу, пока не умрем или не докачаем скил до заданного значения (указывается в настройках к скрипту). Сам скрипт является очередной переделкой моего универсального скрипта на крафт, в первоначальном варианте на Bowcraft. В процессе работы, ведётся следующий лог (в зависимости от кол-ва указанных реагентов и их названия и минимального кол-ва для изготовления зелья):
05:24:04:983 [*]: Sulfurous Ash: 11639 штук. Примерно изделий: 3879 .
05:24:11:199 [*]: Бутылки: 17332 штук. Примерно изделий: 17332 .
05:24:12:056 [*]: Sulfurous Ash: 11636 штук. Примерно изделий: 3878 .
05:24:17:069 [*]: Бутылки: 17331 штук. Примерно изделий: 17331 .
05:24:17:923 [*]: Sulfurous Ash: 11633 штук. Примерно изделий: 3877 .
05:24:23:039 [*]: Бутылки: 17330 штук. Примерно изделий: 17330 .
05:24:23:894 [*]: Sulfurous Ash: 11630 штук. Примерно изделий: 3876 .

Code: Select all

Program Alchemy; 
 
{$Include 'all.inc'} 

const
// Типы и ID
idContainer = $4001C6CD; // Сундук с реагентами и бутылками
idTrashCan = $40035305; // Мусорка
tItem = $0F0D; // Тип изготавливаемой вещи
// Скил, до которого качаем на текущих настройках (реагентах)
MaxAlchemySkill = 45.1;
// Журнал
Msg1 = 'переместили'; // Сообщение при крафте
Msg2 = 'toss the failed'; // Сообщение при физле   
// Прочее
Trash = true; // Выбрасываем, или складываем в контейнер
MoveDelay = 750; // Задержка на перемещение
qRes = 2; // Размерность массива (кол-во ресурсов)
nRes = 2; // Номер ресурса, на которой дважды кликаем (реагенты)

type
  resource= record
    tRes : Cardinal;
    cRes : Cardinal;
    qRes : Integer;
    sRes : String;
  end;

var
resources : array[1..qRes] of resource;
TimeStart : TDateTime;
k, i : Integer;

procedure Init;
  begin
    // Пустые бутылки
    resources[1].tRes := $0F0E;
    resources[1].cRes := $0000;
    resources[1].qRes := 1;
    resources[1].sRes := 'Бутылки';
    // Sulfurous Ash
    resources[2].tRes := $0F8C;
    resources[2].cRes := $0000;
    resources[2].qRes := 3;
    resources[2].sRes := 'Sulfurous Ash';
  end;
  
// Возвращаем ресурсы в сундук
function ClearResources(tItem : Cardinal; cItem : Cardinal) : Boolean;
  begin
    if GetQuantity(FindTypeEx(tItem, cItem, Backpack, false)) > 0 then
      begin
        MoveItem(FindItem, 0, idContainer, 0, 0, 0);
        wait(MoveDelay);
        result := true;
      end; 
  end;

// Добираем ресурсы  
function GetResources(tItem : Cardinal; cItem : Cardinal; qItem : Integer) : Boolean;
  begin
    MoveItem(FindTypeEx(tItem, cItem, idContainer, false), qItem, Backpack, 0, 0, 0);
    wait(MoveDelay);
    result := true; 
  end;

// Проверяем ресурсы (шаблон)
function CheckResourcesFunc(tItem : Cardinal; cItem : Cardinal; qItem : Integer; sItem : String) : Boolean;
  begin
    ClearResources(tItem, cItem);
    if GetQuantity(FindTypeEx(tItem, cItem, Backpack, false)) < qItem then
      begin
        if GetQuantity(FindTypeEx(tItem, cItem, idContainer, false)) > 0 then
          begin
            AddToSystemJournal(sItem + ': ' + IntToStr(FindFullQuantity) + ' штук. Примерно изделий: ' + IntToStr((FindFullQuantity / qItem)) + ' .');
            GetResources(tItem, cItem, qItem);
            result := true;
          end
        else
          begin
            AddToSystemJournal(sItem + ': закончились ресурсы.');
            result := false;
          end; 
      end;
  end;

// Проверяем ресурсы (вызов)
procedure CheckResourcesProc;
  begin
    for i:= 1 to qRes do
      begin
        CheckResourcesFunc(resources[i].tRes, resources[i].cRes, resources[i].qRes, resources[i].sRes);
      end;
  end;
  
// Перемещаем скрафченное зелье в мусорку
procedure MoveItemToTrashCan;
  begin
    if FindType(tItem, Backpack) <> 0 then
      begin
        MoveItem(FindItem, 0, idTrashCan, 0, 0, 0);
        wait(MoveDelay);
      end;
  end;

// Перемещаем скрафченное зелье в контейнер
procedure MoveItemToContainer;
  begin
    if FindType(tItem, Backpack) <> 0 then
      begin
        MoveItem(FindItem, 0, idContainer, 0, 0, 0);
        wait(MoveDelay);
      end;
  end;
  
// Инициализация меню
procedure InitMenu;
  begin
    WaitMenu('What sort of potion','Lesser Explosion');
  end;

// Чистимся  
procedure CancelTargetsAndMenu;
  begin
    CancelMenu;
    if TargetPresent then CancelTarget;
    while MenuPresent do CloseMenu;
    if WarMode then SetWarMode(false);
    while not Hidden do 
      begin
        UseSkill('Stealth');
        wait(3500);
      end;
  end;

// Открываем контейнер с ресурсами
procedure OpenContainer;
  begin
    UseObject(idContainer);
    wait(MoveDelay);
  end;
  
// Крафтим зелье и перемещаем в мусорку    
procedure MakeItem;
  var m1, m2 : Integer;
  begin
    CancelTargetsAndMenu;
    InitMenu;
    ClearJournal;
    k:=0;
    UseObject(FindTypeEx(resources[nRes].tRes, resources[nRes].cRes, Backpack, false));
    TimeStart:=Now;
    repeat
      wait(100);
      k := k + 1;
      m1 := InJournalBetweenTimes(Msg1, TimeStart, Now);
      m2 := InJournalBetweenTimes(Msg2, TimeStart, Now); 
    until (m1<>-1) or (m2<>-1) or (k > 100);
    if Trash then begin MoveItemToTrashCan; end
    else begin MoveItemToContainer; end;  
  end;

// Инициализируем меню, кушаем, добираем реагенты и бутылки, крафтим        
Begin
  Init;
  OpenContainer;
  repeat
    CheckResourcesProc;  
    MakeItem;
  until Dead OR (GetSkillValue('Alchemy') >= MaxAlchemySkill);  
End.
Проще научить человека ловить рыбу, чем постоянно ею его кормить. (с) Destruction
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Alchemy для шарда Forest Wars

Post by Vizit0r »

Code: Select all

  TimeStart:=Now;
    repeat
      wait(100);
      k := k + 1;
      m1 := InJournalBetweenTimes(Msg1, TimeStart, Now);
      m2 := InJournalBetweenTimes(Msg2, TimeStart, Now); 
    until (m1<>-1) or (m2<>-1) or (k > 100);
зачем нужен этот бредовый счетчик, если это можно привести к виду

Code: Select all

  TimeStart:=Now;
    repeat
      wait(100);
      m1 := InJournalBetweenTimes(Msg1, TimeStart, Now);
      m2 := InJournalBetweenTimes(Msg2, TimeStart, Now); 
    until (m1<>-1) or (m2<>-1) or (Now > TimeStart + (10/86400));
без левака...


дальше по мелочам, оптимизации для.

Code: Select all

 GetResources(tItem, cItem, qItem);
result := true;
уменьшается до

Code: Select all

result := GetResources(tItem, cItem, qItem);
MoveDelay - эта вообще капец.
Насколько я помню - всегда в стелсе была встроенная переменная DropDelay. На значение этой переменной идет задержка при дропе айтема (а мувайтем это и есть драг+дроп).
соответственно кучу строк вида wait(MoveDelay); можно отправить в космос.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Scripts Writer
Novice
Novice
Posts: 130
Joined: 06.05.2008 18:03

Re: Alchemy для шарда Forest Wars

Post by Scripts Writer »

Vizit0r wrote:

Code: Select all

  TimeStart:=Now;
    repeat
      wait(100);
      k := k + 1;
      m1 := InJournalBetweenTimes(Msg1, TimeStart, Now);
      m2 := InJournalBetweenTimes(Msg2, TimeStart, Now); 
    until (m1<>-1) or (m2<>-1) or (k > 100);
зачем нужен этот бредовый счетчик, если это можно привести к виду

Code: Select all

  TimeStart:=Now;
    repeat
      wait(100);
      m1 := InJournalBetweenTimes(Msg1, TimeStart, Now);
      m2 := InJournalBetweenTimes(Msg2, TimeStart, Now); 
    until (m1<>-1) or (m2<>-1) or (Now > TimeStart + (10/86400));
без левака...


дальше по мелочам, оптимизации для.

Code: Select all

 GetResources(tItem, cItem, qItem);
result := true;
уменьшается до

Code: Select all

result := GetResources(tItem, cItem, qItem);
MoveDelay - эта вообще капец.
Насколько я помню - всегда в стелсе была встроенная переменная DropDelay. На значение этой переменной идет задержка при дропе айтема (а мувайтем это и есть драг+дроп).
соответственно кучу строк вида wait(MoveDelay); можно отправить в космос.
Жаль ты скрипты не пишешь, можно было бы многому научиться.
Проще научить человека ловить рыбу, чем постоянно ею его кормить. (с) Destruction
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Alchemy для шарда Forest Wars

Post by Vizit0r »

я не пишу скрипты, потому что сложно переключиться с полноценных дельфей на ПС. зато я вижу стелс изнутри, знаю как он работает - так проще видеть в чужих скриптах возможности для оптимизации.

P.S. Тот жалкий скрипт на полторы страницы, что я делал тут - http://www.stealth.od.ua/forum/viewtopic.php?f=8&t=1818, занял у меня больше часа. Так что как скриптописатель с нуля я уже потерян для общества :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply