Lumberjacking [stelth client 7.9.2]

Гости
Сообщений: 14
Рег. 15.11.2013
10 марта 2017 19:35
Сообщение #1
Скрипт для тестов.

Я не предоставляю помощь по настройке и если у вас что-то не работает, то я искренне соболезную.

Алгоритм:
- Запуск на месте где рубим.
- При достижении 150 log's летит в банк (проверка не по весу).
- Проверяет топоры в банке (Не крафтит! Если закончились, то выход из скрипта)
- Проверяет и берет реги из банка
- Проверяет заряды руны (если менее 5ти, то маркирует).
- Летит обратно на место рубки
- Срубив все деревья летит к банку и стоит 30 минут (восстановление усталости)
И по кругу.

Настройка:
TileTXT = 'Scripts\Lumber_Tiles_BestUO.txt';  
BankRune = $40F3FB9D;
OstrovRune = $40F16ECF;
Bank = $40BEA94B;

TileTXT - Файл с деревьями (да, снимаем руками командой ,infotile)
ID рун к банку и к месту рубки деревьев
ID банка

Как заполнить деревья?
Подходим к дереву.
Вводим ,infotile и наводим на дерево.
Делаем так на все деревья которые хотим рубить
Копируем все тайлы деревьев и сохраняем через блокнот (обратите внимание, что файл у меня в папке Scripts, и имеет название Lumber_Tiles_BestUO.txt)

Внешний вид файлы Lumber_Tiles_BestUO.txt
Tile: 3394   X: 2309   Y: 3506   Z: 0
Tile: 3395   X: 2310   Y: 3505   Z: 0
Tile: 3394   X: 2309   Y: 3501   Z: 0
Tile: 3395   X: 2310   Y: 3500   Z: 0
Tile: 3461   X: 2310   Y: 3495   Z: 0
Tile: 3394   X: 2309   Y: 3491   Z: 0
Tile: 3395   X: 2310   Y: 3490   Z: 0
Tile: 3440   X: 2310   Y: 3485   Z: 0
Tile: 3394   X: 2315   Y: 3491   Z: 0
Tile: 3395   X: 2316   Y: 3490   Z: 0
Tile: 3417   X: 2316   Y: 3500   Z: 0
Tile: 3440   X: 2322   Y: 3510   Z: 0
Tile: 3440   X: 2322   Y: 3505   Z: 0
Tile: 3417   X: 2322   Y: 3490   Z: 0
Tile: 3440   X: 2322   Y: 3485   Z: 0
Tile: 3440   X: 2322   Y: 3480   Z: 0


Сам скрипт:
Program Lumber_BestUO;
uses
    SysUtils;
    
const
    TileTXT = 'Scripts\Lumber_Tiles_BestUO.txt';  
    BankRune = $40F3FB9D;
    OstrovRune = $40F16ECF;
    Bank = $40BEA94B;
    
    AxeType = $0F43;
    Log = $1BDD;

var
    Tiles : TStringList;
    i,ii : integer;  
    TilesStr : string;
    TileNum,TileX,TileY,TileZ : array of integer;
    cTime,cTime2 : TDateTime;
    mPathArr : TPathArray;
    NeedToDrop : Boolean;
    
procedure recall(rune:cardinal);
var
    MyX,MyY,Waiti : integer;
    
begin
MyX := GetX(Self);
MyY := GetY(Self);
While (getX(Self)=MyX) and (GetY(Self)=MyY) do
begin
If TargetPresent Then CancelTarget;
Cast('Recall');
WaitForTarget(5000);
TargetToObject(rune);
Waiti := 0;
While (getX(Self)=MyX) and (GetY(Self)=MyY) and (Waiti < 20) Do
    begin
    Wait(500);
    Waiti := Waiti + 1;
    end;
Wait(650);
CheckLag(10000);
end;
end;


procedure checkrune(check_rune_id:cardinal);
var
    CheckRunecTime : TDateTime;
    RuneString,OldName : String;
    Zariadi : integer;
    
begin
CheckRunecTime := Now;
ClickOnObject(check_rune_id);
WaitJournalLine(CheckRunecTime,'(',10000);
If InJournalBetweenTimes('(',CheckRunecTime,Now)<>-1 then
begin
RuneString := Journal(InJournalBetweenTimes('(',CheckRunecTime,Now));
OldName := RuneString;
Delete(OldName,Ansipos('(',RuneString)-1,99);
Delete(OldName,1,Ansipos(':',RuneString)+1);
Delete(RuneString,1,Ansipos('(',RuneString));
Delete(RuneString,Ansipos(')',RuneString),1);
AddToSystemJournal('Зарядов осталось: '+OldName+': '+RuneString);
Zariadi := StrToInt(RuneString);
If Zariadi < 5 Then
    begin
    AddToSystemJournal('Мало зарядов.');
    If TargetPresent Then CancelTarget;
    Cast('Mark');
    WaitFortarget(5000);
    TargetToObject(check_rune_id);
    CheckLag(10000);
    Wait(10000);
    end;
end;
end;

procedure CheckReags;
var
    reags : array of integer;
    ireags : integer;
    reagtype : string;
begin
reags := [$0F7A,$0F7B,$0F86];
For ireags:=0 To length(reags)-1 do
    begin
    FindType(reags[ireags],backpack);
    if FindQuantity<10 then
        begin
        FindType(reags[ireags],bank);
        Case reags[ireags] of
            $0F7A : reagtype := 'Black Perl';
            $0F7B : reagtype := 'Blood Moss';
            $0F86 : reagtype := 'Mandrake Root';
            end;
        AddToSystemJournal(reagtype+' в банке: '+IntToStr(FindQuantity));
        Grab(FindItem,10);
        Wait(650);
        CheckLag(10000);
        end;
    end;
end;

function CheckAxe : Boolean;
begin
Result := True;
If FindType(AxeType,BackPack)=0 Then
    begin
    AddToSystemJournal('Нужен топор.');
    FindType(AxeType,Bank);
    If FindCount=0 Then
        begin
        AddToSystemJournal('В банке нет топоров!');
        Result := False;
        end
    else
        begin
        Grab(FindItem,1);
        Wait(650);
        CheckLag(10000);
        AddToSystemJournal('В банке осталось: '+IntToStr(FindCount)+' топоров.');
        end;
    end;
end;

procedure CheckMana;
begin
If WarMode Then SetWarMode(False);
If Mana < 50 Then
begin
While Mana <> MaxMana do
    begin
    UseSkill('Meditation');
    Wait(1000);
    end;
end;
end;
    
procedure ImDead(DeadStatus:Boolean);
    var
    Deada : Integer;
begin
If DeadStatus Then
begin
    AddToSystemJournal('Я умер. Летим домой.');
    Deada := GetGumpsCount;
    NumGumpButton(GetGumpsCount-1,1);
    while Deada = GetGumpsCount do
    Wait(50);
    NumGumpButton(GetGumpsCount-1,2);
    While 1=1 Do Wait(1000);
end;
end;
    
procedure LoadTiles;
begin
Tiles := TStringList.Create;
Tiles.LoadFromFile(TileTXT);
SetLength(TileNum,Tiles.Count);
SetLength(TileX,Tiles.Count);
SetLength(TileY,Tiles.Count);
SetLength(TileZ,Tiles.Count);

For i:=0 To Tiles.Count-1 Do
begin
TilesStr := Tiles[i];
While AnsiPos(' ',TilesStr)<>0 Do
    Delete(TilesStr,AnsiPos(' ',TilesStr),1); // удалить все пробелы
Delete(TilesStr,1,5); // удалить tile:
TileNum[i] := StrToInt(Copy(TilesStr,1,AnsiPos('X',TilesStr)-1));
Delete(TilesStr,1,AnsiPos(':',TilesStr));
TileX[i] := StrToInt(Copy(TilesStr,1,AnsiPos('Y',TilesStr)-1));
Delete(TilesStr,1,AnsiPos(':',TilesStr));
TileY[i] := StrToInt(Copy(TilesStr,1,AnsiPos('Z',TilesStr)-1));
Delete(TilesStr,1,AnsiPos(':',TilesStr));
TileZ[i] := StrToInt(TilesStr);
end;
AddToSystemJournal('Деревья загружены. Всего деревьев: '+IntToStr(Length(TileNum))+' шт.');
Tiles.Clear;
Tiles.Free;
end;

procedure Lumber(tTile,tX,tY,tZ:integer);
begin
cTime := Now;
While InJournalBetweenTimes('in the city|appears immune|nothing here|far away',cTime,Now)=-1 Do
begin
cTime2 := Now;
If TargetPresent Then CancelTarget;
if (GetType(ObjAtLayer(LhandLayer)) <> AxeType) then
   begin
   UseObject(FindType(AxeType, Backpack));
   end;
if (GetType(ObjAtLayer(LhandLayer)) = AxeType) then
   begin
   UseObject(ObjAtLayer(lhandLayer));
   end;  
WaitForTarget(5000);
TargetToTile(tTile,tX,tY,tZ);
WaitJournalLine(cTime2,'in the city|hack at|appears immune|put the|nothing here|far away|not to chop',25000);
Wait(350);
end;
end;

procedure CheckWeight;
begin
FindType(Log,BackPack);
If (FindFullQuantity > 150) or (NeedToDrop = True) Then
    begin
    recall(bankrune);
    If NeedToDrop Then
        begin
        Wait(60000*30);
        NeedToDrop := False;
        end;
    checkrune(bankrune);
    CheckLag(10000);
    UoSay('bank');
    Wait(650);
    CheckLag(10000);
    While FindType(Log,BackPack)>0 Do
        begin
        MoveItem(FindItem,-1,Bank,0,0,0);
        Wait(650);
        CheckLag(10000);
        end;
    FindTypeEx(Log,$0000,bank,False);
    AddToSystemJournal('Простых логов в банке: '+IntToStr(FindFullQuantity));
    CheckReags;
    If CheckAxe = False Then Exit;
    CheckMana;
    recall(OstrovRune);
    checkrune(OstrovRune);
    AddToSystemJournal('------------------');
    end;
end;      
    
begin
SetARStatus(True);
SetEventProc(evDeath,'ImDead');
LoadTiles;
NeedToDrop := False;
While 1 = 1 Do
begin
For ii:=0 To Length(TileNum)-1 Do
begin
    If GetPathArray(TileX[ii],TileY[ii],True,1,mPathArr)<0 Then
        begin
        AddToSystemJournal('Не вижу деревья.');
        Exit;
        end;
    NewMoveXY(TileX[ii],TileY[ii],True,1,True);
    Lumber(TileNum[ii],TileX[ii],TileY[ii],TileZ[ii]);
    CheckWeight;
end;
NeedToDrop := True;
AddToSystemJournal('Рубку закончил. 30 минут отдых');
CheckWeight;
end;
end.
Последние посетители (0):

 
Сейчас: 24 ноября 2024 01:03