Смысл скрипта прост, чар копает пока не достигнет своего макс веса минус 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.