All pastes #30490 Raw Edit

UltraMiner

public text v1 · immutable
#30490 ·published 2005-11-23 03:58 UTC
rendered paste body
// -->
// --> Name: Ultra Miner
// --> Version: 0.5_133
// --> Author: BadAhr
// --> Email: badahr@gmail.com
// --> Date: 17/11/05
// *****************************************************************************
// ---------------------- IMPORTANT - READ ME - IMPORTANT ----------------------
// *****************************************************************************
// --> 1) Face a Wall in a Cave! Tilt the angle you mine!
// --> 2) Only eats Steak!! Expand it!
// --> 3) Open Invetory, Sort so Water is ABOVE Steak
// --> 4) Start with FULL food + water
// --> 4) IMPORTANT: SEE CONFIG AREA! Go to line 66 to set them
// --> 5) Start the script, then leave the computer
// *****************************************************************************
// ---------------------- IMPORTANT - READ ME - IMPORTANT ----------------------
// *****************************************************************************
// --> If you enjoy my scripts, please support me by
// --> donating. I can be contacted by email.
// -->
// --> Special Thanks to those that have supported me. You know
// --> who you are.
// -->
// --> Known BUGS!: Please READ the Revision History!
// -->
// --> Email:
// --> All emails directed to me should be in ENGLISH. That means
// --> spelling, puncuation, and grammar are a must.
// -->
// --> Please email any bugs you find, be sure to
// --> include the following in your email:
// --> 1) Script Name + Version
// --> 2) Description of bug
// -->
// --> Email me any Questions/Comments/Suggestions.
// -->
// --> If you enjoy my scripts. Please support me. Email me to inquire.
// -->
// --> Revision History:
// --> v0.1_132 = Initial Release  10/11/2005
// --> v0.2_132 = Bug Fixes        11/11/2005
// -->    Features: Added some basic Statistics to Report Box
// -->    Resolved: Pickaxe stuck Anti Random
// -->    Regressions: No known Regressions
// --> v0.3_132 = Bug Fixes        11/11/2005
// -->    Features: Added automation of Water and Food Coords.
// -->              you can still set them manually if you wish
// -->              Added Time Procedure. For now is only implemented
// -->              in statistics.
// -->    Resolved: Failing to detect Stamina/Food/Water Bar
// -->    Regressions: No known regressions.
// --> v0.3_132r2 = Bug Fix        11/11/2005
// -->    Resolved: Will find Steak and Water now
// --> v0.4_132 = Bug Fix          12/11/2005
// -->    Features: Faster :D And more reliable.
// -->              Auto finds everything... no setting coords
// -->    Resolved: Not moving forward
// -->              Freeing pickaxe should be more optimized
// -->              Fixed issue with custom window themes
// -->    Regressions: Mining anything other than rock is broken.
// --> v0.5_133 = Improvements Features 17/11/05
// -->    Features: More optimizations/Finds everything automatically
// -->              Option to set Error Level, see config area.
// -->              Option to Mine + Prospect, see config area.
// -->              Option to Logout if you run out of fatigue.
// -->    Resolved: Mining any ore type, up to 8 Tile types. Including
// -->              rock outside a cave.
// -->

program UltraMiner;

const

// *****************************************************************************
// ---------------------- USER CONFIG AREA - CHANGE THESE ----------------------
// *****************************************************************************
Client = 'Wurm Online 1.3.3'; //Set Client Name
OreLimit = 500; //0 = Infinite;
TileType = 1; //0 = Rock; 1 = Cave Wall; 2 = Iron; 3 = Silver; 4 = Gold; 5 = Lead; 6 = Zinc; 7 = Tin; 8 = Copper;
MinePath = 0; //0 = Straight; 1 = Down; 2 = Up;
ErrorLvl = 1; //0 = Halt Script; 1 = Retry Once; 2 = Retry Indefinatly;
Prospect = False; //False = No; True = Mine/Prospect/Mine/Prospect;
Logout = True; //True = will log out once done mining. Or run out of fat.

// *****************************************************************************
// ---------------------- SCRIPT AREA - DONT CHANGE BELOW ----------------------
// *****************************************************************************
function IsTextAtFromMouse(x, y, Chars: Integer; S: String): Boolean;
var mx, my: Integer;
begin
  GetMousePos(mx, my);
  Result := IsTextAtEx(mx + x, my + y, S, 0, Chars , False, False, 0, 1, $FFFFFF);
end;

var
StatOre, StatDrink, StatEat, StatStuck, StatFwd,
pbarx, pbary, miny, minx, wax, way, stx, sty, dx, dy, x, y, Count, Chars, MoveStuck,
wbarx, wbary, fbarx, fbary, nbarx, nbary: Integer;
Tile, ErrorMsg, MineAngle: String;
Error: Boolean;
ST: LongInt;

Procedure ReportStatistics;
var
  RHours, Minutes, Seconds, RMinutes, RSeconds, AvTime: LongInt;
  Time: string;
begin
  Seconds := (GetSystemTime - ST) div 1000;
  Minutes := Seconds div 60;
  RHours :=  Minutes div 60;
  Time := IntToStr(Seconds) + ' Seconds';
  if(Count > 0)then
    AvTime := Seconds/Count;
  if(Minutes <> 0)then
  begin
    RSeconds := Seconds Mod(Minutes * 60);
    Time := IntToStr(Minutes) + ' Minutes and ' + IntToStr(RSeconds) + ' Seconds';
  end;
  if(RHours <> 0)then
  begin
    RMinutes := Minutes Mod(RHours * 60);
    RSeconds := Seconds Mod(Minutes * 60);
    Time := IntToStr(RHours)+' Hours, '+IntToStr(RMinutes) +
    ' Minutes and ' + IntToStr(RSeconds) + ' Seconds';
  end;
  ClearReport;
  AddToReport('Ultra Miner v0.5_133');
  AddToReport('I have mined a total of ' + IntToStr(StatOre) + ' ores.');
  AddToReport('I have broken through ' + IntToStr(StatFwd) + ' walls.');
  AddToReport('I have consumed water ' + IntToStr(StatDrink) + ' times.');
  AddToReport('I have eaten steak ' + IntToStr(StatEat) + ' times.');
  AddToReport('I have gotten my pickaxe stuck ' + IntToStr(StatStuck) +
                   ' times.');
  AddToReport('I am averaging ' + IntToStr(avtime) + ' seconds per Ore.');
  AddToReport('I have been mining for ' + Time + '.');
end;

procedure Init;
var n, sx, sy, rep: Integer;
begin
  if not(GetSCARVersion = 203)then
  begin
    ErrorMsg := 'Error: you do not have the required software, please';
    Error := True;
    exit;
  end else if not(FindWindowTitlePart(Client, True))then
  begin
    ErrorMsg := 'Error: Could not find the client specified.';
    Error := True;
    exit;
  end;
  ActivateClient;
  GetClientDimensions(dx, dy);
  SetMouseMode(False);
  if(IsFontSmoothingEnabled)then SetFontSmoothing(False);
  Chars:= LoadCharsFromFont2('Arial', 8, False, False, False, False);
  case TileType of
    0 : Tile := 'Rock';
    1 : Tile := 'Cave wall';
    2 : Tile := 'Iro';
    3 : Tile := 'Silver';
    4 : Tile := 'Gold';
    5 : Tile := 'Lead';
    6 : Tile := 'Zi';
    7 : Tile := 'Ti';
    8 : Tile := 'Copper';
  end;
  MoveMouseSmooth(dx div 2, dy div 2);
  while not(IsTextAtFromMouse(15, 4, Chars, Tile))and(rep < 150)do
  begin
    GetMousePos(minx, miny);
    if(minx < 100)or(miny < 100)or(minx > dx - 200)or(miny > dy - 160)or(n > 14)then
    begin
      MoveMouseSmooth(dx div 2 + Random(3), dy div 2 - Random(3));
      GetMousePos(minx, miny);
      n := 2;
    end;
    MoveMouseSmooth(minx + (n * Random(10)), miny - (n * Random(10)));
    wait(150);
    if(IsTextAtFromMouse(15, 4, Chars, Tile)) then break;
    GetMousePos(minx, miny);
    MoveMouseSmooth(minx - Random(2), miny + (n * Random(15)));
    wait(150);
    if(IsTextAtFromMouse(15, 4, Chars, Tile)) then break;
    GetMousePos(minx, miny);
    MoveMouseSmooth(minx - (n * Random(10)), miny + Random(2));
    wait(150);
    if(IsTextAtFromMouse(15, 4, Chars, Tile)) then break;
    GetMousePos(minx, miny);
    MoveMouseSmooth(minx - Random(2), miny - (n * Random(10)));
    wait(150);
    if(IsTextAtFromMouse(15, 4, Chars, Tile))then break;
    wait(150);
    rep := rep + 1;
    n := n + 1;
  end;
  GetMousePos(minx, miny);
  if(IsTextInAreaEx(0, 0, dx, dy, x, y, 'water', 0, Chars, False, False, 0, 1, $FFFFFF))then
  begin
    wax := x + 10;
    way := y + 5;
  end else
  begin
    Error := True;
    ErrorMsg := 'Error: Failed to find Water Coordinates, please make sure invetory is open.';
    exit;
  end;
  if(IsTextInAreaEx(0, 0, dx, dy, x, y, 'steak', 0, Chars, False, False, 0, 1, $FFFFFF))then
  begin
    MoveMouseSmooth(x, y);
    Wait(100);
    if(IsTextAtFromMouse(15, 4, Chars, 'Pi'))then
    begin
      stx := x + 10;
      sty := y + 20;
    end else if(IsTextAtFromMouse(15, 4, Chars, 'steak'))then
    begin
      stx := x;
      sty := y;
    end;
  end else
  begin
    Error := True;
    ErrorMsg := 'Error: Failed to find Steak Coordinates, please make sure invetory is open.';
    exit;
  end;
  sx := dx - (dx div 2);
  sy := dy;
  FindColorTolerance(pbarx, pbary, 2694943, sx, sy -100, sx + 20, sy, 0);
  case MinePath of
    0 : MineAngle := 'Mi';
    1 : MineAngle := 'dow';
    2 : MineAngle := 'upwards';
  end;
  Error := False;
end;

procedure MineTest(Prospect: Boolean);
var rep, xx ,yy: Integer;
begin
  if(IsTextAtEx(382, 360, 'You are too far', 0, Chars, False, False, 0, 1, $FFFFFF))or(IsTextAtEx(382, 344, 'The wall breaks', 0, Chars, False, False, 0, 1, $FFFFFF))then
  begin
    SendArrowSilentWait(0, 2000);
    StatFwd := StatFwd + 1;
  end;
  if(IsTextAtEx(382, 344, 'You have to', 0, Chars, False, False, 0, 1, $FFFFFF))then
  begin
    while not(IsTextAtEx(458, 360, 'free your pickaxe', 0, Chars, False, False, 0, 1, $FFFFFF))do
    begin
      SendArrowSilentWait(2, 1000);
      if(MoveStuck > 1)then
      begin
        KeyDownSilent(GetKeyCode('d'));
        Wait(2000)
        KeyUpSilent(GetKeyCode('d'));
        KeyDownSilent(GetKeyCode('a'));
        Wait(2000);
        KeyUpSilent(GetKeyCode('a'));
      end;
      MoveStuck := MoveStuck + 1;
      if(MoveStuck > 10)then break;
    end;
    if(MoveStuck > 0)then
    begin
      MoveStuck := MoveStuck * 1000 + 1000;
      SendArrowSilentWait(0, MoveStuck);
    end;
    MoveStuck := 0;
    StatStuck := StatStuck + 1;
  end;
  MoveMouse(minx, miny);
  Wait(500);
  if not(IsTextAtFromMouse(15, 4, Chars, Tile))then
  begin
    ErrorMsg := 'Error: Could not find Wall! Please edit your constants';
    Error := True
    exit;
  end else
  begin
    while not(IsTextAtFromMouse(-4 ,-16, Chars, Tile))do
    begin
      ClickMouse(minx, miny, False);
      MoveMouseSmooth(minx, miny + 10);
      Wait(50);
    end;
    MoveMouseSmooth(minx, miny);
    while not(IsTextAtFromMouse(-4, 91, Chars, 'Mi'))do Wait(50);
    GetMousePos(x, y);
    MoveMouse(x, y + 100);
    Wait(500);
    GetMousePos(x, y);
    MoveMouse(x + 85, y);
    GetMousePos(x, y);
    if(Prospect)then
    begin
      MoveMouseSmooth(x, y + 45);
    end else if(MinePath = 1)then
    begin
      MoveMouseSmooth(x, y + 15);
    end else if(MinePath = 2)then
    begin
    MoveMouseSmooth(x, y + 30);
    end;
    GetMousePos(x, y);
    while(GetColor(pbarx, pbary) = 13408665) do wait(100);
    while not(FindColorTolerance(xx, yy, 3644729, nbarx, nbary , nbarx, nbary + 10, 50)) do wait(100);
    ClickMouse(x, y, True);
  end;
  while(FindColor(x, y, 2694943, pbarx, pbary, pbarx, pbary))do
  begin
    wait(500);
    rep := rep + 1;
    if(rep > 10)then break;
  end;
  StatOre := StatOre + 1;
end;

procedure EatTest;
var rep: Integer;
begin
  MoveMouse(stx, sty);
  Wait(200);
  if not(IsTextAtFromMouse(15, 4, Chars, 'steak'))then
  begin
    ErrorMsg := 'Error: Could not find Steak! Please edit your constants';
    Error := True
    exit;
  end else
  begin
    while not(IsTextAtFromMouse(11,-6, Chars, 'ak'))do
    begin
      ClickMouse(stx, sty, False);
      Wait(50);
    end;
    while not(IsTextAtFromMouse(-4, 75, Chars, 'Eat'))do Wait(50);
    GetMousePos(x, y);
    MoveMouse(x, y + 84);
    Wait(100);
    GetMousePos(x, y);
    ClickMouse(x, y, True);
  end;
  while(FindColor(x, y, 2694943, pbarx, pbary, pbarx, pbary))do
  begin
    wait(500);
    rep := rep + 1;
    if(rep > 10)then break;
  end;
  StatEat := StatEat + 1;
end;

procedure DrinkTest;
var rep: Integer;
begin
  MoveMouse(wax, way );
  Wait(200);
  if not(IsTextAtFromMouse(15, 4, Chars, 'water'))then
  begin
    ErrorMsg := 'Error: Could not find water! Please edit your constants';
    Error := True
    exit;
  end else
   begin
    while not(IsTextAtFromMouse(12,-6, Chars, 'ter'))do
    begin
      ClickMouse(wax, way, False);
      Wait(50);
    end;
    while not(IsTextAtFromMouse(-4, 91, Chars, 'Dri'))do Wait(50);
    GetMousePos(x, y);
    MoveMouse(x, y + 100);
    Wait(100);
    GetMousePos(x, y);
    ClickMouse(x, y, True);
  end;
  while(FindColor(x, y, 2694943, pbarx, pbary, pbarx, pbary))do
  begin
    wait(500);
    rep := rep + 1;
    if(rep > 10)then break;
  end;
  StatDrink := StatDrink + 1;
end;

procedure ErrorTest;
begin
  writeln(ErrorMsg);
  case ErrorLvl of
    0 : exit;
    1 : Init;
    2 : while(Error)do Init;
  end;
end;

// *****************************************************************************
// ---------------------- MAIN LOOP - DO NOT CHANGE BELOW ----------------------
// *****************************************************************************
begin
  ClearDebug;
  ClearReport;
  Init;
  FindColorTolerance(nbarx, nbary, 3644729 , dx -  200, 0, dx, dy, 5);
  FindColorTolerance(fbarx, fbary, 3043228, dx -  200, 0, dx, dy, 5);
  FindColorTolerance(wbarx, wbary, 10971947, dx -  200, 0, dx, dy, 5);
  ST := GetSystemTime;
  ClearDebug;
  Changereportwidth(400);
  repeat
    if(Error)then
    begin
      status('Error! Halting.');
      writeln(ErrorMsg);
      case ErrorLvl of
        1 : Init;
        2 : while(Error)do Init;
      end;
      if(Error)then exit;
    end;
    if not(FindColorTolerance(x, y, 10971947, wbarx, wbary + 7, wbarx, wbary + 7, 5))then DrinkTest;
    if not(FindColorTolerance(x, y, 3043228, fbarx, fbary + 10, fbarx, fbary + 12, 5))then EatTest;
    MineTest(False);
    if(Prospect)then MineTest(True);
    ReportStatistics;
    Count := Count + 1;
  until(Count = OreLimit);
  FreeChars2(Chars);
end.