да, добавить точек где он будет искать тайлы для копки, после етого сортировать их и проверять есть ли лишние, после чего выстраивать в 1 целостный последовательный массив и уже потом работать с ним.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.
Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Автобот копай-крафти. [Stealth Client v6.4.0]
Re: Автобот копай-крафти. [Stealth Client v6.4.0]
да, добавить точек где он будет искать тайлы для копки, после етого сортировать их и проверять есть ли лишние, после чего выстраивать в 1 целостный последовательный массив и уже потом работать с ним.tito wrote:Вот если шахта больше чем помещается на экран, то он не все тайлы захватывает и обкапывает собственно, это можно как-то исправить, чтоб всю шахту копал?drabadan wrote:Скрипт для шарда UORPG.NET
Смысл скрипта прост, чар копает пока не достигнет своего макс веса минус 20, затем перерабатывает айрон на 1 из 3 вариантов.
Добора инструментов нету, закидывать надо заранее.Исходный код скрипта
Re: Автобот копай-крафти. [Stealth Client v6.4.0]
Не ну это я точно не сделаю , думал если будет желание и возможности апдейт сможете сделать так сказать)drabadan wrote: да, добавить точек где он будет искать тайлы для копки, после етого сортировать их и проверять есть ли лишние, после чего выстраивать в 1 целостный последовательный массив и уже потом работать с ним.
Re: Автобот копай-крафти. [Stealth Client v6.4.0]
Можете подсказать пожалуйста, как изменить эту процедуру, чтобы он тайлы из файла брал.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;
Re: Автобот копай-крафти. [Stealth Client v6.4.0]
а зачем тебе брать тайлы из файла?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;
Re: Автобот копай-крафти. [Stealth Client v6.4.0]
Под мининг, все что хотел добавил, все работает, ну кроме того что он собирает не все тайлы, а только те что в радиусе экрана. И еще хочу под ламбер его сделать, все мелочи поправил, осталась последняя загвоздка с тайлами. Тут тайлы деревьев от и до не получается выставить, много лишних(drabadan wrote:
а зачем тебе брать тайлы из файла?
Re: Автобот копай-крафти. [Stealth Client v6.4.0]
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];