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

Автобот копай-крафти. [Stealth Client v6.4.0]

Only working scripts
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Автобот копай-крафти. [Stealth Client v6.4.0]

Post by drabadan »

tito wrote:
drabadan wrote:Скрипт для шарда UORPG.NET
Смысл скрипта прост, чар копает пока не достигнет своего макс веса минус 20, затем перерабатывает айрон на 1 из 3 вариантов.
Добора инструментов нету, закидывать надо заранее.
Исходный код скрипта

Code: Select all

Program Mining_UORPG_Kendal;

//Крафтить можно на выбор 2 вещи, CraftChoice = 0 - плейтмеил горгеты(БС), 
//                                CraftChoice = 2 - молотки кузнеца(тинкеринг)  
//                                CraftChoice = 1 - war mace(BS)
const
 CraftChoice = 1;

 SeekRange = 20; 
 Pickaxe_Type = $0E85;
 MyMaxWeight = 800;
 Forge = $400D9F1F;
 BankX = 2509;
 BankY = 542;
 CaveX = 2571;
 CaveY = 479;

type
 TCraftItemInfo = record
  ButtonInput : Array of Word;
  Name : String;
  ItemType : Word;
  ToolType : Word;
  ResourceType : Word;
  CraftGumpSerial : Cardinal;
 end;
 
type
 MinTile = record
 x, y, z, Tile : Word;
end;

var
 MinTiles_Array : Array of MinTile;
 CraftItemArray :Array of TCraftItemInfo;
 i : Integer;
 currExp, ExpCounter : Integer;
 StartTime : TDateTime;
 
{$Region 'Mining'}
 
procedure GetTilesToMine;
var
 x, y, i : Integer;
 TileInfo : TStaticCell;
begin
 SetLength(MinTiles_Array, 0);
 for x := (-1 * SeekRange) to SeekRange do
  for y := (-1 * SeekRange) to SeekRange do
   begin
    TileInfo := ReadStaticsXY(GetX(self)+x, GetY(self)+y, WorldNum);
    if TileInfo.StaticCount > 0 then
    for i := Low(TileInfo.Statics) to High(TileInfo.Statics) do
     if (TileInfo.Statics[i].Tile >= 1339) and (TileInfo.Statics[i].Tile <= 1359) and (TileInfo.Statics[i].z = GetZ(self)) then
      begin
       SetLength(MinTiles_Array, Length(MinTiles_Array) + 1);
       MinTiles_Array[High(MinTiles_Array)].Tile := TileInfo.Statics[i].Tile;
       MinTiles_Array[High(MinTiles_Array)].x := TileInfo.Statics[i].x;
       MinTiles_Array[High(MinTiles_Array)].y := TileInfo.Statics[i].y;
       MinTiles_Array[High(MinTiles_Array)].z := TileInfo.Statics[i].z;
      end;                            
   end;
 AddToSystemJournal('Found ' + IntToStr(Length(MinTiles_Array)) + ' tiles to mine.');   
end;

procedure WaitLag(WaitMS : Integer);
begin
 Wait(WaitMS);
 CheckLag(60000);
end;

procedure MinTileSpot(Idx : Integer);
var
 i, k : Integer;
 msgFizzle, msgEnd : String;
 cTime : TDateTime;    
begin
 msgFizzle := 'You put |You loosen ';
 msgEnd := 'is nothing| too far| mining in rock| cannot mine| no line| reach| not to mine|Try mining | Iron Ore in ';
 if Dist(GetX(self), GetY(self), MinTiles_Array[Idx].x, MinTiles_Array[Idx].y) > 2 then 
  NewMoveXY(MinTiles_Array[Idx].x, MinTiles_Array[Idx].y, true, 1, true);
 for k := 0 to 4 do
  begin
   if WarMode then SetWarMode(False);            
   if UseType(Pickaxe_Type, $FFFF) = 0 then 
    UseType(Pickaxe_Type, $FFFF);
   CheckLag(60000);            
   if not WaitForTarget(60000) then 
    begin
     ClientPrint('No pickaxes or shovels found...');
     exit;
    end
   else
    begin
     cTime := Now;
     TargetToTile(MinTiles_Array[Idx].Tile, MinTiles_Array[Idx].x, MinTiles_Array[Idx].y, MinTiles_Array[Idx].z);                    
     for i := 0 to 100 do
      begin
       Wait(100);
       CheckLag(60000);
       if (InJournalBetweenTimes(msgEnd, cTime, Now) <> -1) then exit;
       if (InJournalBetweenTimes(msgFizzle, cTime, Now) <> -1) then break;       
      end;
    end;
  end;
 ClientPrint('Tile finished.');    
end;

procedure MoveTo(Obj : Cardinal);
begin
 if Dist(GetX(Obj), GetY(Obj), GetX(Self), GetY(Self)) > 1 then
  NewMoveXY(GetX(Obj), GetY(Obj), true, 1, true);
 WaitLag(100);
end;

function IsOreOnFloor : Boolean;
begin
 Result := False;
 FindDistance := 40;
 if (Weight < 700) and (FindType($19B9, Ground) > 0) then
   begin
    MoveTo(FindItem);
    MoveItem(FindItem, 0, Backpack, 0,0,0);
    Wait(1000);
    Result := True;
   end;  
end;

procedure Smelt;
begin
 MoveTo(Forge);
 while FindType($19B9, Backpack) > 0 do
  begin
   UseObject(FindItem);
   WaitLag(500);   
  end;
end;

procedure Unload;
begin
 NewMoveXY(BankX, BankY, true, 1, true);
 UOSay('Bank');
 WaitLag(1000);
 while FindType($1BEF, Backpack) > 0 do
  begin
   MoveItem(FindItem, 0, ObjAtLayer(BankLayer), 0,0,0);
   WaitLag(1000);
  end;
 FindType($1BEF, Backpack);
 if FindFullQuantity > 0 then
  AddToSystemJournal(IntToStr(FindFullQuantity) + ' ingots in bank.');
 NewMoveXY(CaveX, CaveY, true, 1, true);
end;
{$EndRegion 'Mining'}

{$Region 'Crafting'}

procedure InitItems;
begin
{$Region 'Item 0 - Gorget'}
 SetLength(CraftItemArray, Length(CraftItemArray)+1);
 CraftItemArray[0].Name := 'Gorget';
 CraftItemArray[0].ItemType := $1413;
 CraftItemArray[0].ToolType := $13E3;
 CraftItemArray[0].ResourceType := $1BEF;
 CraftItemArray[0].CraftGumpSerial := $F5CCF;
 SetLength(CraftItemArray[0].ButtonInput, 3);
 CraftItemArray[0].ButtonInput[0] := 3;
 CraftItemArray[0].ButtonInput[1] := 103;
 CraftItemArray[0].ButtonInput[2] := 1;
{$EndRegion}
{$Region 'Item 1 - WarMace'}
 SetLength(CraftItemArray, Length(CraftItemArray)+1);
 CraftItemArray[1].Name := 'War Mace';
 CraftItemArray[1].ItemType := $1406;
 CraftItemArray[1].ToolType := $13E3;
 CraftItemArray[1].ResourceType := $1BEF;
 CraftItemArray[1].CraftGumpSerial := $F5CCF;
 SetLength(CraftItemArray[1].ButtonInput, 3);
 CraftItemArray[1].ButtonInput[0] := 7;
 CraftItemArray[1].ButtonInput[1] := 103;
 CraftItemArray[1].ButtonInput[2] := 1; 
{$EndRegion}
{$Region 'Item 2 - Smith Hammer - Tinkering'}
 SetLength(CraftItemArray, Length(CraftItemArray)+1);
 CraftItemArray[2].Name := 'Smith hammer';
 CraftItemArray[2].ItemType := $13E3;
 CraftItemArray[2].ToolType := $1EBC;
 CraftItemArray[2].ResourceType := $1BEF;
 CraftItemArray[2].CraftGumpSerial := $F5CCF;
 SetLength(CraftItemArray[2].ButtonInput, 2);
 CraftItemArray[2].ButtonInput[0] := 102;
 CraftItemArray[2].ButtonInput[1] := 1; 
{$EndRegion}
end;

procedure SmeltItem(ItemType : Word);
var
 ForgeVar : Cardinal;
begin
 ForgeVar := FindType($0FB1, Ground);
 while FindType(ItemType, Backpack) > 0 do
  begin
   UseObject(ForgeVar);
   if WaitForTarget(60000) then
    TargetToObject(FindItem);
   Wait(100);
   CheckLag(60000);
  end;
end;

procedure CraftItem(ItemIndex : Integer); //Platemail gorget
var
 gInfo : TGumpInfo;
 k : Integer;
begin
 Wait(1000);
 UseType(CraftItemArray[ItemIndex].ToolType, $FFFF);
 if WaitForTarget(60000) then
  TargetToObject(FindTypeEx(CraftItemArray[ItemIndex].ResourceType, $0000, Backpack, True));
 WaitLag(3000);
 if IsGump then
  if GetGumpSerial(GetGumpsCount-1) = CraftItemArray[ItemIndex].CraftGumpSerial then
   GetGumpInfo(GetGumpsCount-1, gInfo)
  else
   AddToSystemJournal('No Gump!');
 for k := 0 to High(CraftItemArray[ItemIndex].ButtonInput) do
  begin
   NumGumpButton(GetGumpsCount-1, CraftItemArray[ItemIndex].ButtonInput[k]);
   WaitLag(1000);
  end;
 Wait(7000);
end;

procedure CraftCycle(ItemIndex : Integer); //craft last item 999 times
begin
 UseType(CraftItemArray[ItemIndex].ToolType, $FFFF);
 if WaitForTarget(60000) then
  TargetToObject(FindTypeEx(CraftItemArray[ItemIndex].ResourceType, $0000, Backpack, False));
 WaitLag(3000);
 if IsGump then
  begin
   NumGumpTextEntry(GetGumpsCount-1, 1, '999'); 
   WaitLag(1000);
   NumGumpButton(GetGumpsCount-1, 508); //last item
  end
 else
  AddToSystemJournal('No Gump!');
end;


procedure CraftingAlternate(ItemIndex : Integer);
var
 cTime : TDateTime;
begin
 CraftItem(ItemIndex); 
 AddToSystemJournal(IntToStr(GetQuantity(FindTypeEx(CraftItemArray[ItemIndex].ResourceType, $0000, Backpack, False))));
 while (GetQuantity(FindTypeEx(CraftItemArray[ItemIndex].ResourceType, $0000, Backpack, False)) > 60) do
  begin
   If FindType(CraftItemArray[ItemIndex].ItemType, Backpack) > 0 then
    SmeltItem(CraftItemArray[ItemIndex].ItemType);
   WaitLag(3000);   
   CraftCycle(ItemIndex);
   cTime := Now;
   repeat
    WaitLag(1000);
    if (GetQuantity(FindTypeEx(CraftItemArray[ItemIndex].ResourceType, $0000, Backpack, False)) < 60) then
     break;
    if (InJournalBetweenTimes('недостаточно ресурсов|не существует|is destroyed', cTime, Now) > 0) then
     break;
   until Dead or (Not Connected);
   SmeltItem(CraftItemArray[ItemIndex].ItemType); 
  end; 
end;

{$EndRegion}


{$Region 'Statistics'}

function TimeParser(TimeStr : String) : Double;
var 
 SL : TStringList;
 m, res : Integer; 
begin
 SL := TStringList.Create;
 StrBreakApart(TimeStr, ':', SL);
 for m := 0 to SL.Count-1 do
  if SL[0] <> '0' then
   begin
    res := StrToInt(SL[0])*60;
    res := res * 60;
   end;
  if SL[1] <> '00' then
   begin
    res := res + (StrToInt(SL[1]) * 60);
   end;  
 res := res + StrToInt(SL[2]);
 //AddToSystemJournal('Parser: ' + IntToStr(res));
 if res > 0 then
  Result := res
 else
  Result := -1;  
 SL.Free; 
end; 


procedure TestEvSpeech(Text,SenderName:String;SenderID:Cardinal);
var 
 Sl : TStringList; 
 CurrTime : TDateTime;
 AverExpPerSec, tmpExp : Double; 
begin
 SL := TStringList.Create;
 If(BMSearch(0,Text,'единиц опыта')>0)then
  begin
   Inc(ExpCounter);
   StrBreakApart(Text, ' ', SL);   
   currExp := StrToInt(SL[2]) + currExp;
   CurrTime := Now;
   tmpExp := currExp;
   CurrTime := CurrTime - StartTime;   
   AverExpPerSec := tmpExp/TimeParser(TimeToStr(CurrTime));  
   AddToSystemJournal('Exp gained: ' + IntToStr(currExp) + '; Average Exp: ' + IntToStr(currExp/ExpCounter) + '; Exp/sec: ' + FloatToStrF(AverExpPerSec, ffNumber, 4, 2) + '; Time elapsed: ' + TimeToStr(CurrTime));     
  end;
 SL.Free;   
end;


{$EndRegion}

begin
 InitItems; 
 StartTime := Now; 
 SetEventProc(evUnicodeSpeech, 'TestEvSpeech');
 NewMoveXY(CaveX, CaveY, true, 1, true);
 GetTilesToMine;
 for i := Low(MinTiles_Array) to High(MinTiles_Array) do
  begin
   IsOreOnFloor;
   if Weight >= MaxWeight-20 then    
    begin
     Smelt;
     Waitlag(3000);
     CraftingAlternate(CraftChoice);
    end
   else
    MinTileSpot(i);
  end;
end.
Вот если шахта больше чем помещается на экран, то он не все тайлы захватывает и обкапывает собственно, это можно как-то исправить, чтоб всю шахту копал?
да, добавить точек где он будет искать тайлы для копки, после етого сортировать их и проверять есть ли лишние, после чего выстраивать в 1 целостный последовательный массив и уже потом работать с ним.
tito
Neophyte
Neophyte
Posts: 16
Joined: 10.11.2014 20:21

Re: Автобот копай-крафти. [Stealth Client v6.4.0]

Post by tito »

drabadan wrote: да, добавить точек где он будет искать тайлы для копки, после етого сортировать их и проверять есть ли лишние, после чего выстраивать в 1 целостный последовательный массив и уже потом работать с ним.
Не ну это я точно не сделаю :roll: , думал если будет желание и возможности апдейт сможете сделать так сказать)
tito
Neophyte
Neophyte
Posts: 16
Joined: 10.11.2014 20:21

Re: Автобот копай-крафти. [Stealth Client v6.4.0]

Post by tito »

drabadan wrote:Скрипт для шарда UORPG.NET
[/spoiler]
Можете подсказать пожалуйста, как изменить эту процедуру, чтобы он тайлы из файла брал.

Code: Select all

procedure GetTilesToMine;
var
 x, y, i : Integer;
 TileInfo : TStaticCell;
begin
 SetLength(MinTiles_Array, 0);
 for x := (-1 * SeekRange) to SeekRange do
  for y := (-1 * SeekRange) to SeekRange do
   begin
    TileInfo := ReadStaticsXY(GetX(self)+x, GetY(self)+y, WorldNum);
    if TileInfo.StaticCount > 0 then
    for i := Low(TileInfo.Statics) to High(TileInfo.Statics) do
     if (TileInfo.Statics[i].Tile >= 1339) and (TileInfo.Statics[i].Tile <= 1359) and (TileInfo.Statics[i].z = GetZ(self)) then
      begin
       SetLength(MinTiles_Array, Length(MinTiles_Array) + 1);
       MinTiles_Array[High(MinTiles_Array)].Tile := TileInfo.Statics[i].Tile;
       MinTiles_Array[High(MinTiles_Array)].x := TileInfo.Statics[i].x;
       MinTiles_Array[High(MinTiles_Array)].y := TileInfo.Statics[i].y;
       MinTiles_Array[High(MinTiles_Array)].z := TileInfo.Statics[i].z;
      end;                            
   end;
 AddToSystemJournal('Found ' + IntToStr(Length(MinTiles_Array)) + ' tiles to mine.');   
end;
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Автобот копай-крафти. [Stealth Client v6.4.0]

Post by drabadan »

tito wrote:
drabadan wrote:Скрипт для шарда UORPG.NET
[/spoiler]
Можете подсказать пожалуйста, как изменить эту процедуру, чтобы он тайлы из файла брал.

Code: Select all

procedure GetTilesToMine;
var
 x, y, i : Integer;
 TileInfo : TStaticCell;
begin
 SetLength(MinTiles_Array, 0);
 for x := (-1 * SeekRange) to SeekRange do
  for y := (-1 * SeekRange) to SeekRange do
   begin
    TileInfo := ReadStaticsXY(GetX(self)+x, GetY(self)+y, WorldNum);
    if TileInfo.StaticCount > 0 then
    for i := Low(TileInfo.Statics) to High(TileInfo.Statics) do
     if (TileInfo.Statics[i].Tile >= 1339) and (TileInfo.Statics[i].Tile <= 1359) and (TileInfo.Statics[i].z = GetZ(self)) then
      begin
       SetLength(MinTiles_Array, Length(MinTiles_Array) + 1);
       MinTiles_Array[High(MinTiles_Array)].Tile := TileInfo.Statics[i].Tile;
       MinTiles_Array[High(MinTiles_Array)].x := TileInfo.Statics[i].x;
       MinTiles_Array[High(MinTiles_Array)].y := TileInfo.Statics[i].y;
       MinTiles_Array[High(MinTiles_Array)].z := TileInfo.Statics[i].z;
      end;                            
   end;
 AddToSystemJournal('Found ' + IntToStr(Length(MinTiles_Array)) + ' tiles to mine.');   
end;
а зачем тебе брать тайлы из файла?
tito
Neophyte
Neophyte
Posts: 16
Joined: 10.11.2014 20:21

Re: Автобот копай-крафти. [Stealth Client v6.4.0]

Post by tito »

drabadan wrote:
а зачем тебе брать тайлы из файла?
Под мининг, все что хотел добавил, все работает, ну кроме того что он собирает не все тайлы, а только те что в радиусе экрана. И еще хочу под ламбер его сделать, все мелочи поправил, осталась последняя загвоздка с тайлами. Тут тайлы деревьев от и до не получается выставить, много лишних(
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Автобот копай-крафти. [Stealth Client v6.4.0]

Post by drabadan »

tito wrote:
drabadan wrote:
а зачем тебе брать тайлы из файла?
Под мининг, все что хотел добавил, все работает, ну кроме того что он собирает не все тайлы, а только те что в радиусе экрана. И еще хочу под ламбер его сделать, все мелочи поправил, осталась последняя загвоздка с тайлами. Тут тайлы деревьев от и до не получается выставить, много лишних(

Code: Select all

ATiles := [3274,3275,3277,3280,3283,3286,3288,3290,3293,3296,3299,3302,3320,3323,3326,3329,3393,3394,3395,3396,3415,3416,3417,3418,3419,3438,3439,3440,3441,3442,3460,3461,3462,3476,3478,3480,3482,3484,3492,3496];
все тайлы для ламбера.
Post Reply