Page 1 of 2 12 LastLast
Results 1 to 25 of 36

Thread: [AeroLib]bAl_KharidUnstrungMaker - Mine silver, make symbols, collect coins!

  1. #1
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Cool [AeroLib]bAl_KharidUnstrungMaker - Mine silver, make symbols, collect coins!

    Hey guys, I am releasing this script, its based on DeniedHacker's one, found here: https://villavu.com/forum/showthread.php?t=113515

    I took what he had done and used it to base my own off of, Currently I haven't had a chance to fully incorporate the features I was hoping to.

    Currently:
    • 100% C O L O R B O Y S
    • It will walk to the mine
    • Mine silver from the 3 rocks, once they deplete it will hop worlds (randomly at the moment)
    • It will then walk to the smelter and smelt the ore and then the bars into holy symbols
    • It will detect and trade the shop NPCs on first go (99% of the time).
    • After its inventory is empty (Doesn't hop worlds to sell, its planned) it will walk back to the mine

    Planned:
    These are critical updates that will happen first:
    • Relog on logout assuming shutDown wasn't triggered, if shutdown is triggered something bad has happened.
    • Rewrite the main loop and ensure it can catch itself if it happens to fail
    • Closed Door Detection, currently I haven't incorporated any door detection into this, hence beta.
    • Better detection of the shop NPCs, getting them on the first go should not be much work, I just need to fix my search functions, currently they are just chopped together.
    • Allow user to input worlds to hop, this is probably the easiest feature to put in, I just have more important things to worry about currently.
    • Few more location checks, specifically around the smelter and shop.

    Bugs:
    There are 2 bugs that I have noticed so far:
    • Will sometimes click hop twice, meaning it will hop and then hop again. The script can and does recover from this as there is a fail safe in place. The problem here is that if you are logged out, the script won't log you back in, this is a planned critical update.
    • Script doesn't have any fail safes incorporated into its mainloop, once again its hacked together so I could test the main functions.

    Doesn't have an output just yet, but you could gauge that based on the amount of coins you have I guess.

    I won't attach the script, I'll put it in tags here, I'll attach the official release!

    SETUP:
    You need to have the exp box open like this:
    1d03461f66.jpg


    Code:
    program new;
    {$DEFINE SMART}
    {$DEFINE WALKER}
    {$i AeroLib/AeroLib.Simba}
    
    Const
    SEARCH_AREA : TBox = [245, 130, 285, 195];
    EXP_AREA    : TBox = [395, 6, 512, 34];
    //-----------USER SETUP-----------\\
    
    USERNAME    := '';
    PASSWORD    := '';
    MEMBER      := False;
    
    //------------END USER------------\\
    
    //-------------WORLD SETUP--------\\
    WORLDS := 5;
    WORLD1 := 1;
    WORLD2 := 16;
    WORLD3 := 35;
    WORLD4 := 84;
    WORLD5 := 83;
    
    
    //DTMS START
    silverOreDTM := DTMFromString('mJgIAAHic3c65DoAgEARQL7wSY+8fa+2P4hEPBJwNU9hY2rjJy4LCsF0UynrvFbpBr/mthNOHmkH2LUxYX6DZhZyPeV+T5OTMcDyzoK+wwQ4HyH/DHEvukZlAChkoZhacryJ5q+F8/TDy1rdazvcX73UDO8xpzQ==');
    silverBarDTM := DTMFromString('mwQAAAHic42RgYOAAYl4gZmNAAFYg5gJiASAWQZJjhLK5gZgPijmhYjW1HRjY0tIOTC9avB6M5YDqCGFGIjAcAADr7g9Q');
    unstrungSymbolDTM := DTMFromString('maQEAAHiczc3LCoAgEIXhMuxCFAS9jove/3GKLljZL51F0K5VA5/DwRntkrsydYsxhLDiQE6elT0qcosCBl5zcXeiL9iwP5y6N/rHSny7RI0Gg3Oa+q7nTH/gVRdAdDz3');
    holyMouldDTM := DTMFromString('mUAIAAHic3ZBJCoAwFEMdUJy9gPdf6d57WUeUmtAUXLl04YdHfofkl3aBq8Nae1lXIdYbNIVmYEVfQ1uwoG+gs/YMtIJO0FLKs0KZ5yMzB6nm0Wd0l5mr4NxdeL9/F30RiEGirEy5hDNLUQm+cRx6Ob+B/xT+mLe6AaqzbnA=');
    jugDTM := DTMFromString('mvQEAAHiczY05DoBADAMBcQkQVDyVlldzX8tEeDtKCiKNYiWW3QbPbM65CyL0ws7YKST6rTDrXsGINibdc/l39AmWObA93mc55jnUZ74QrDdWhmUVUKqrhgb6rpPzOxr1/53XuQG+vFWH');
    potDTM := DTMFromString('mUAIAAHic3Y7JDYAwEAMBgUCcDdAILVETXXKfwRbOJw+ePFhp4s3hjWvvqcsY40NDcKJfQYI+BTN66gTNoCO0gA6O8jzXu1kzNnCYpwLcRfqvx95C/yjoXeTd5b3kZ75AGTknBjYjc/Fv5igduraR8xsqrP6PeasbAqhxiw==');
    
    type STATE = (MINEWALK, SMELTWALK, SMELTING, CRAFTING, SHOPWALK, SELLING, LOST);
    
    Var
      prevTask              :STATE;
      shutDown              :Boolean = False;
      stateFails            :Integer;
    //Declarations
    //Areas
      mining_Area           :TPointArray;
      smelting_Area         :TPointArray;
      selling_Area          :TPointArray;
    
    //Paths
      pathToMine            :TPointArray;
      pathToSmelt           :TPointArray;
      pathToSell            :TPointArray;
    
    //Tiles
      tile_Silver           :TPoint;
      tile_Smelt            :TPoint;
      tile_Shop             :TPoint;
    //Walker
      RSW                   :TRSWalker;
    //Misc
      silver_onScreen       :TPoint;
      XP                    :Extended;
      silverOre, silverBar  :TItem;
      symbol                :TItem;
      silverMined           :Integer; //Should let us determine the amount of crafted shit too
      moneyEarned           :Integer;
      previousLength        :Integer = 999;
    //Store Mouse coords from functions
      MouseX, MouseY        : Integer;
      HolySymbolPoint       : TPoint = [339,104];
      StatusText            : String;
      startExp              : Integer;
    
    procedure setupScript();
    begin
    //Data
    //Locations
      mining_Area           := [[4967, 3352], [4961, 3253], [4988, 3188], [5007, 3168], [5024, 3179],
                                [5032, 3214], [5042, 3227], [5037, 3251], [5035, 3266], [5039, 3286],
                                [5037, 3307], [5038, 3342], [5030, 3353]];
      smelting_Area         := [[4900, 3696], [4909, 3695], [4916, 3694], [4922, 3695], [4925, 3696],
                                [4924, 3707], [4927, 3715], [4919, 3715], [4910, 3714],
                                [4904, 3713], [4904, 3705]];
      selling_Area          := [[5056, 3703], [5083, 3703], [5083, 3738], [5056, 3737]];
    
    //Paths
      pathToMine            := [[5061, 3718], [5051, 3715], [5048, 3706], [5045, 3696], [5044, 3687],
                                [5045, 3676], [5050, 3666], [5055, 3656], [5055, 3645], [5056, 3628],
                                [5055, 3618], [5042, 3605], [5036, 3595], [5032, 3586],
                                [5030, 3577], [5024, 3572], [5016, 3560], [5012, 3546], [5012, 3531],
                                [5016, 3514], [5015, 3498], [5012, 3487], [5010, 3468], [5002, 3459],
                                [5000, 3441], [5000, 3426], [5001, 3412], [5001, 3393],
                                [4991, 3378], [4992, 3358], [4998, 3344], [5003, 3324], [5007, 3305],
                                [5002, 3293], [4998, 3278], [4992, 3265], [4989, 3255], [4991, 3238]];
    
      pathToSmelt           := [[4995, 3245], [4993, 3256], [4993, 3266], [4993, 3281], [4994, 3294],
                                [4995, 3307], [4994, 3324], [4993, 3336], [4992, 3350], [4988, 3363],
                                [4986, 3372], [4985, 3385], [4983, 3394], [4982, 3408],
                                [4978, 3421], [4975, 3434], [4973, 3449], [4971, 3458], [4970, 3470],
                                [4967, 3486], [4966, 3498], [4961, 3507], [4947, 3521], [4938, 3531],
                                [4930, 3543], [4926, 3557], [4923, 3575], [4920, 3589],
                                [4920, 3606], [4924, 3616], [4924, 3626], [4924, 3640], [4928, 3649],
                                [4936, 3661], [4934, 3671], [4934, 3680], [4934, 3699], [4932, 3707],
                                [4923, 3707], [4914, 3706]];
    
      pathToSell            := [[4921, 3708], [4934, 3711], [4948, 3712], [4961, 3713], [4970, 3715],
                                [4986, 3720], [4995, 3724], [5004, 3726], [5022, 3724], [5027, 3724],
                                [5035, 3724], [5045, 3723], [5058, 3718], [5071, 3721]];
    //Tiles
      tile_Silver           := [4991, 3238];
      tile_Smelt            := [4911, 3705];
      tile_Shop             := [5065, 3720];
    
    //Walkers
      RSW.init('WorldMap');
      RSW.minRunEnergy  := 50;
      RSW.walkStyle     := wsSPS;
      RSW.skipClose     := 15;
    
    //Misc
      silver_onScreen   := [204, 408];
      XP                := 13.7;
      silverOre.DTM     := silverOreDTM;
      silverBar.DTM     := silverBarDTM;
      symbol.DTM        := unstrungSymbolDTM;
    
      silverMined       := 0;
    
    end;
    
    Procedure customMouse(point:TPoint);  //Denied Hacker, thanks for this method, although you dont know where you got it from
    begin
      case random(0, 6) of
      0..2: brakeMMouse(point,random(5), random(5), true);
      3   : brakeMMouse(point, random(4), random(6), false);
      4..5: missMouse(point, random(4), random(3));
      6   : humanMMouse(point, random(6), random(4));
      end;
    end;
    //adapted from Denied Hacker
    Procedure antiBan(number:Integer);
    begin
      case random(0, number) of
        0..10 :  pickUpMouse();
        11..19:  boredHuman();
        45..50:  checkMovingObjs(False);
        27..44:  MMouseOffClient('random');
      end
    end;
    //Denied Hacker, thanks for the method
    Function FindDTMOnScreen(DTMs:TIntegerArray; TopLeftLocation, BotRightLocation : TPoint) : Boolean;
    var
      i : Integer;
    begin
      for i:= 0 to High(DTMs) do
      begin
        if (FindDTM(DTMs[i], MouseX, MouseY, TopLeftLocation.X, TopLeftLocation.Y, BotRightLocation.X, BotRightLocation.Y)) then
        begin
          Exit(True); //We found it, return true and leave
        end;
      end;
      Exit(False);
    end;
    
    Function GetFirstOccuranceOfDTM(itemDTM : Integer) : Integer;
    var
      B : Byte;
    begin
      Result := -1;
    
      For B := 0 to 27 do
        if FindDTMOnScreen([itemDTM], Point(MIX1, MIY1), Point(MIX2, MIY2)) then
          Exit(B);
    end;
    
    Function WaitForDTMChange(itemDTM : Integer; WaitPer : UInt16 = 250; WaitFor : UInt32 = 1800) : Boolean;
    var
      TickCount     : UInt64;
      OriginalValue : Int16;
    begin
      Result := False;
      TickCount := GetTickCount64() + WaitFor;
      OriginalValue := GetFirstOccuranceOfDTM(itemDTM);
      Repeat
        Wait(Abs(WaitPer + Random(-25, 50)));
        if (GetFirstOccuranceOfDTM(itemDTM) <> OriginalValue) then
          Exit(true);
      Until(GetTickCount64() > TickCount);
      Exit(False);
    end;
    
    //Adapted from Denied Hacker
    function ClickDTMInInventory(DTM : TIntegerArray; mouseButton : Integer; TopLeftLoc, BotRightLoc : TPoint; upText : TStringArray) : Boolean;
    var
      FoundDTMs : TPointArray;
      ClickedDTM, i : Integer;
    begin
      for i:=0 to High(DTM) do
      begin
        if (FindDTMs(DTM[i], FoundDTMs, TopLeftLoc.X, TopLeftLoc.Y, BotRightLoc.X, BotRightLoc.Y)) then
        begin
          //Found it, its good lets get a random one
          ClickedDTM  := Random(Length(FoundDTMs));
          customMouse(Point(FoundDTMs[ClickedDTM].X, FoundDTMs[ClickedDTM].Y)); //Moves mouse with a bunch of methods
          if (waitUpTextMulti(upText, (randomRange(100, 350)))) then
          begin
            //we click a random DTM here
            fastClick(mouseButton);
            wait(randomRange(50, 150));
            Exit(True);
          end;
        end;
        writeln('Couldnt find the DTM specified, we didnt click anything');
        Exit(False); //Couldn't locate the DTM specified, we dun goofed
      end;
    
    end;
    
    function ClickWithOptionInput(mousePOS : TPoint; textUp: TStringArray; num : Integer; craftAll : Boolean) : Boolean;
    begin
      //Mouse to position
      customMouse(mousePOS);
    
      //upText
      if (waitUpTextMulti(textUp, 100 + randomRange(100, 350))) then
      begin
        //click
        fastClick(MOUSE_RIGHT);
        waitEx(randomRange(50, 200)); //we aren't exactly quick, we need to wait
    
        if (craftAll) then   //'Craft All Unstrung symbol'
        begin
          if waitOptionMulti(['Craft All', 'All Unst', 'All Unstrung symbol'], randomRange(100, 450)) then
          begin
            fastClick(MOUSE_LEFT);
          end;
        end;
    
        if (waitOptionMulti(['X'], (randomRange(100, 350)))) then
        begin
          waitChatChange();
          waitEx(randomRange(500, 750)); // as humans we won't notice the chat change instantly
          typeSend(IntToStr(num + randomRange(50, 64656)));  //When Smithing you dont enter 28
          waitEx(randomRange(100, 250));                     //or something like that, you spam the
          Exit(True);                                        //numberpad :)
        end;
      end;
    end;
    //TODO
    Function CheckDoor(Col, Tol : Integer; Hue, Sat : Double; TopLeft, BotRight : TPoint; ClickToOpen : Boolean) : Boolean;
    var
      TPA       : TPointArray;
      ATPA      : T2DPointArray;                       // CheckDoorShop(1592934, 12, 0.03, 0.25, Point(MSX1, MSY1), Point(MSX2, MSY2), True);
      i         : Integer;
      P         : TPoint;
    begin
      SetColorToleranceSpeed(2);                     //1592934, Tol 12, hue 0.03, Sat 0.25 -> Shop Door
      SetColorspeed2Modifiers(Hue, Sat);
      Result := False;
      if FindColorsTolerance(TPA, Col, TopLeft.X, TopLeft.Y, BotRight.X, BotRight.Y, Tol) then
      begin
        ATPA := ClusterTPA(TPA, 10);
        SortATPASize(ATPA, True);
    
        for i:=0 to Min(10, High(ATPA)) do
        begin
    
          if (Length(ATPA[i]) > 50) then
          begin
            customMouse(Point(MiddleTPA(ATPA[i]).X, MiddleTPA(ATPA[i]).Y));
            if (isUptextMulti(['Open Door', 'pen Do', 'Open'])) then
            begin
              if (ClickToOpen) then
              begin
                wait(randomRange(50, 120)); // we arent as quick as we think
                fastClick(MOUSE_LEFT);
                Exit(True);
              end;
            end else
            begin
            //We dont want to click it, its open
              writeln('Door is Open');
              Exit(True); //FALSE MEANS DOOR IS CLOSED
            end;
          end;
        end; //FOR END
      end;
    end;
    
    Function FindTPAObjectsWithOption(Col, Tol : Integer; Hue, Sat : Double; TopLeftLoc, BotRightLoc : TPoint; upText, textOption : TStringArray) : Boolean;
    var
      TPA       : TPointArray;
      ATPA      : T2DPointArray;
      i         : Integer;
      P         : TPoint;
    begin
      SetColorToleranceSpeed(2);
      SetColorspeed2Modifiers(Hue, Sat);
      if FindColorsTolerance(TPA, Col, TopLeftLoc.X, TopLeftLoc.Y, BotRightLoc.X, BotRightLoc.Y, Tol) then
      begin
        ATPA := ClusterTPA(TPA, 40);
        SortATPASize(ATPA, True);
    
        for i:=0 to Min(10, High(ATPA)) do
        begin
          if (Length(ATPA[i]) < 40) then Continue;
          customMouse(Point(MiddleTPA(ATPA[i]).X, MiddleTPA(ATPA[i]).Y));
    
          //Check UpText To see if we get a match
          if (waitUpTextMulti(upText, randomRange(150, 250))) then
          begin // Matched uptext, click it
            fastClick(MOUSE_RIGHT);
            wait(randomRange(50, 120));
            if (waitOptionMulti(textOption, randomRange(150, 270))) then //Matched option text click it
            begin
              Exit(true);
            end;
          end;
        end;
      end;
    end;
    
    Function FindTPAObjects(Col, Tol : Integer; TopLeftLoc, BotRightLoc : TPoint; upText : TStringArray;
    MoveMouse, Click, Furnace : Boolean) : Boolean;
    var
      TPA       : TPointArray;
      ATPA      : T2DPointArray;
      i         : Integer;
      P         : TPoint;
    begin
      SetColorToleranceSpeed(2);
    
      if FindColorsTolerance(TPA, Col, TopLeftLoc.X, TopLeftLoc.Y,
                                       BotRightLoc.X, BotRightLoc.Y, Tol) then
      begin
         ATPA := ClusterTPA(TPA, 50);
         SortATPASize(ATPA, True);
    
         for i:=0 to High(ATPA) do
         begin
          if (MoveMouse) then
          begin
            if (Furnace) then
            begin  //adapted from Denied Hackers methods
              customMouse(Point(MiddleTPA(ATPA[i]).X - 30 - random(10), MiddleTPA(ATPA[i]).Y));
            end else
              customMouse(Point(MiddleTPA(ATPA[i]).X, MiddleTPA(ATPA[i]).Y));
    
                //check UPTEXT here
            if (waitUpTextMulti(upText, randomRange(100, 350))) then
            begin
              if (Click) then
              begin
                fastClick(MOUSE_LEFT);
                wait(randomRange(50, 150));
    
                //didnt click failsafe
                if didYellowClick() then
                begin
                  while (isLoggedIn() and isPlayerWalking) do
                    WaitEx(randomRange(250, 400));
                  FindTPAObjects(Col, Tol, TopLeftLoc, BotRightLoc, upText, MoveMouse, Click, Furnace);
                end;
    
                //We clearly hit the target, so we return true
                Exit(True);
              end else//if not click
              begin
                mouseX := MiddleTPA(ATPA[i]).X;
                mouseY := MiddleTPA(ATPA[i]).Y;
                Exit(True);
              end;
            end; //Uptext didnt match
          end else
          begin //Dont move mouse
            mouseX := MiddleTPA(ATPA[i]).X;
            mouseY := MiddleTPA(ATPA[i]).Y;
            Exit(True);
          end;
         end;
      end;
    end;
    
    function randomsCheck() : Boolean;
    begin
      if not isLoggedIn() then Exit(False);
      if levelUpEx(false) then Exit(True);
      if continueChat(False) then Exit(True);
    
      if getHealthPercent() <= 20 then
      begin
        shutDown := True;
        writeln('Near death, Shutting down.');
      end;
      result := waitEx(50);
    end;
    
    function nearLocation (Where:String; distance:Integer) : Boolean;
    var
      myPos, T  : TPoint;
    begin
      if not isLoggedIn() then Exit(false);
      myPos := RSW.GetMyPos();
    
      case Where of
      'Smelt': T := tile_Smelt;
      'Shop'   : T := tile_Shop;
      'Silver' : T := tile_Silver; //The rocks where we mine
      end;
      Result := pointsInDist(myPos, T, distance);
    
    end;
    
    function walker(Where : String) : Boolean;
    var
      P, mm : TPoint;
    begin
      if not isLoggedIn() then Exit();
      randomsCheck();
    
      setCompass('N');
      setAngle(ANGLE_HIGH);
    
      case Where of
      'Smelt':
        begin
          writeln('Walking to Smelter');
          Result := RSW.walkPath(pathToSmelt);
          if not Result then
          begin
            RSW.blindWalk(tile_Smelt);
            writeln('walkPath didnt happen, we are blind walking to smelt');
            Result := True;
          end;
        end;
    
      'Mine':
        begin
          writeln('Walking to Mine');
          Result := RSW.walkPath(pathToMine);
          if not Result then
          begin
            RSW.blindWalk(tile_Silver);
            writeln('walkPath didnt happen, we are blind walking to smelt');
            Result := True;
          end;
        end;
    
      'Shop':
        begin
          writeln('walking to Shop');
          Result := RSW.walkPath(pathToSell);
          if not Result then
          begin
            RSW.blindWalk(tile_Shop);
            writeln('walkPath didnt happen, we are blind walking to sell');
            Result := True;
          end;
        end;
      end;//CASE END
    
      while isPlayerWalking() do
        waitEx(50);
    end;
    
    function smeltOre() : Boolean;
    var
      P               : TPoint;
      TPA             : TPointArray;
      ATPA            : T2DPointArray;
      i,l             : Integer;
      //Stat tracking vars
      count, smelted  : Integer;
      silverBarArray  : TIntegerArray;
      original, second: Integer;
      retry           : Boolean;
    begin
      if not isLoggedIn() then Exit;
      if not nearLocation('Smelt', 15) then walker('Smelt');
    
      while isPlayerWalking() do
        waitEx(50);
    
      Result := False;
    
      Repeat                 //FindColorsTolerance(TPA, 2829367, MSX1, MSY1, MSX2, MSY2, 15)
        retry := false;
        wait(randomRange(350, 500));
        if FindTPAObjects(2829367, 15, Point(MSX1, MSY1), Point(MSX2, MSY2),
                            ['Smelt Furn', 'elt Furn', 'lt Furnace', 'rnace'], True, True, True) then
        begin
          while isPlayerWalking() do
            waitEx(50);
          wait(randomRange(650, 950)); // Good to wait, because sometimes can get ahead of itsself
          ClickWithOptionInput(silver_onScreen, (['ilver', '1 Silver', 'Smelt 1 Silver']), 28, false);
          Repeat
            original := getXPBarAmount();
            randomsCheck();
            MMouseOffClient('Random'); //again, moving offscreen makes most sense
            waitEx(randomRange(3000, 5000));
    
            second := getXPBarAmount();
            if (original = second) then retry := True;
    
    
          Until ((GetFirstOccuranceOfDTM(silverOreDTM) = -1) or retry);
        end;
        //Fail Safe Goes here
      Until(not FindDTMOnScreen([silverOreDTM], Point(MIX1, MIY1), Point(MIX2, MIY2)));
    
      Result := True;
      silverBarArray := silverBar.getSlots();
      silverMined := silverMined + Length(silverBarArray);
    
    end;
    
    function SmeltSymbol()  : Boolean;
    var
      counter, original, secondary    : Integer;
      retry                           : Boolean;
    begin
      if not isLoggedIn() then Exit(false);
      if not nearLocation('Smelt', 15) then walker('Smelt');
      writeln('Smelting Symbols');
    
      Repeat
        retry := false;
        ClickDTMInInventory([silverBarDTM], MOUSE_LEFT, Point(MIX1, MIY1), Point(MIX2, MIY2), (['Silver bar', 'ver bar', 'ilver bar']));
        wait(randomRange(500, 850));
    
        FindTPAObjects(2829367, 15, Point(MSX1, MSY1), Point(MSX2, MSY2),
                            ['Smelt Furn', 'elt Furn', 'lt Furnace', 'rnace'], True, True, True);
        wait(randomRange(450, 600));
        ClickWithOptionInput(HolySymbolPoint, ['Craft 1 Un', '1 Unstrung sym', 'rung symbol'], 26, true);
    
        Repeat
          original := getXPBarAmount();
          randomsCheck();
          MMouseOffClient('Random');
          wait(randomRange(2000, 3000));
    
          secondary := getXPBarAmount();
          if (original = secondary) then
          begin
            //writeln('Same Exp amount after 2 - 3 seconds, we are not smelting, trying again.');
            retry := True;
          end;
    
        Until((GetFirstOccuranceOfDTM(silverBarDTM) = -1) or retry);
      Until(not FindDTMOnScreen([silverBarDTM], Point(MIX1, MIY1), Point(MIX2, MIY2)));
      Result := True;
    end;
    Function checkWeAreMining() : Boolean;
    var
      Fails     : Integer;
      prevXP    : Integer;
      nowXP     : Integer;
      tim       : Timer; //Tim the Timer :)
    begin
      Tim.start();
      prevXP := getXPBarAmount();
      MMouseOffClient('random');    //This is thebest antiban, you are doing 'somethingelse' while playing
    
      repeat
        nowXP := getXPBarAmount();
        wait(randomRange(200, 300));
        if (tim.timeElapsed > 5000) then
        begin
          writeln('Something happend, we havent mined for 5 seconds, calling false and trying again');
          Exit(False);
        end;
      until(prevXP <> nowXP);
      Exit(False);
    
    end;
    
    Function FindSilverRocks() : Boolean;
    var
      OreNotFound, NothingFound : Integer;
      worldCounter              : Integer;
      Switched                  : Boolean;
    begin
      OreNotFound := 0;
      NothingFound := 0;
      worldCounter := WORLDS;
      if not isLoggedIn() then Exit;
    
      if not (nearLocation('Silver', 20)) then walker('Mine');
    
      Repeat
    
        writeln('Looking For silver Rock');
        wait(randomRange(250, 350));
        OreNotFound := OreNotFound + 1;
    
        wait(randomRange(1000, 1350));
    
        //Change World if there isn't any rocks
        if (OreNotFound > 3) then
        begin
          writeln('Switching to a random world');
          OreNotFound := 0;
          wait(randomRange(350, 1250));
          Case worldCounter of
          1:
          begin
            writeln('Hopping to ' + IntToStr(WORLD1));
            WS_switchWorlds(WORLD1);
            worldCounter := worldCounter - 1;
          end;
          2:
          begin
            writeln('Hopping to ' + IntToStr(WORLD2));
            WS_switchWorlds(WORLD2);
            worldCounter := worldCounter - 1;
          end;
    
          3:
          begin
            writeln('Hopping to ' + IntToStr(WORLD3));
            WS_switchWorlds(WORLD3);
            worldCounter := worldCounter - 1;
          end;
    
          4:
          begin
            writeln('Hopping to ' + IntToStr(WORLD4));
            WS_switchWorlds(WORLD4);
            worldCounter := worldCounter - 1;
          end;
    
          5:
          begin
            writeln('Hopping to ' + IntToStr(WORLD5));
            WS_switchWorlds(WORLD5);
            worldCounter := worldCounter - 1;
          end;
    
          0:
          begin
            writeln('Base case, switching to WORLD3');
            worldCounter := WORLDS;
            WS_switchWorlds(WORLD3);
          end;
    
          end;
    
          FTab(TAB_INV);
    
        end;
    
        //Fail Safe
        if (NothingFound > 300) then
        begin
          writeln('We didnt find rocks for a really long time');
          shutDown := True;
          logoutPlayer();
        end else
          NothingFound := NothingFound + 1;
                                              //FindColorsTolerance 9014166, 17 TOL, 0.15 HUE, 0.16 SAT
      Until(FindTPAObjects(9013653, 18, Point(MSX1, MSY1), Point(MSX2, MSY2), ['ine', 'ock'], True, True, False));
      Result := True;
    end;
    
    Function OpenTradeWindow() : Boolean;
    var
      failCount : Integer;
    begin
      failCount := 0;
    
      if not isLoggedIn() then Exit;
      if isPlayerWalking() then waitEx(50);
    
      Repeat
        writeln('Trying to open trade window');
        wait(randomRange(100, 150));
        randomsCheck();
    
        if (failCount < 20) then
        begin
          inc(failCount);
        end else
        begin
          writeln('Cant seem to open a trade window, Terminating');
          shutDown := True;
          logoutPlayer();
          Exit(false);     //Should add HUE and SAT into finder function, TODO
        end;               //Col 2967135, Tol 17, HUE 0.07, Sat 1
      Until(FindTPAObjectsWithOption(2967135, 17, 0.07, 1, Point(MSX1, MSY1), Point(MSX2, MSY2), ['Shop', 'ssis'], ['rade']));
    
      While (not FindDTMOnScreen([jugDTM, potDTM], Point(MSX1, MSY1), Point(MSX2, MSY2))) do
      begin
        wait(RandomRange(100, 500));
        if (failCount < 20) then
        begin
          inc(failCount);
        end else
        begin
          writeln('Fail Count has exceeded 20, terminating script because we couldnt open trade window');
          shutDown := True;
          logoutPlayer();
          Exit(False);
        end;
      end;
      Exit(true); //Found the trade window
    end;
    
    Function sellSymbols() : Boolean;
    var
      failCount           : Integer;
    begin
      if not isLoggedIn() then Exit;
      if isPlayerWalking() then waitEx(50);
    
      failCount := 0;
      Result := False;
    
      if not nearLocation('Shop', 20) then walker('Shop');
    
      writeln('Off to sell symbols');
    
      Repeat
        ClickDTMInInventory([unstrungSymbolDTM], MOUSE_RIGHT, Point(MIX1, MIY1), Point(MIX2, MIY2),
                                                        ['Unstrung', 'symbol', 'rung symbol']);
        if (waitOptionMulti(['50'], randomRange(150, 300))) then
        begin
          waitEx(randomRange(400, 750));
        end else
        begin //Fail Safe Starts here
          if (failCount < 20) then
          begin
            failCount := failCount + 1;
          end else
          begin
            writeln('We have had more than 20 fails, terminating');
            shutDown := True;
            logoutPlayer();
            Exit(False);
          end;
        end;
    
      Until(not FindDTMOnScreen([unstrungSymbolDTM], Point(MIX1, MIY1), Point(MIX2, MIY2)));
    
      //We need to close the trade screen here
      //customMouse(Point(485, 41));
      wait(randomRange(50, 200));
      mouse(Point(485, 41), 3, 3, MOUSE_LEFT);
    
      Exit(True);
    
    end
    procedure Release();
    begin
      RSW.Free();
      FreeDTM(silverOreDTM);
      FreeDTM(silverBarDTM);
      FreeDTM(unstrungSymbolDTM);
      FreeDTM(jugDTM);
      FreeDTM(potDTM);
      FreeDTM(holyMouldDTM);
    end
    
    begin
      initAL();
      setupScript();
    
      Repeat
        Repeat
          if (not FindSilverRocks()) then
            Exit;
    
          checkWeAreMining();
          wait(randomRange(150, 200));
    
          randomsCheck();
    
        Until(isInvFull());
    
        if not (walker('Smelt')) then exit;
    
        if not (smeltOre()) then Exit;
    
        if not (SmeltSymbol()) then Exit;
    
        if not (walker('Shop')) then Exit;
    
        if not (OpenTradeWindow()) then Exit;
    
        if not (sellSymbols()) then Exit;
    
        if not (walker('Mine')) then Exit;
    
      Until(shutDown);
      //CheckDoorShop(Col, Tol : Integer; Hue, Sat : Double; TopLeft, BotRight : TPoint; ClickToOpen : Boolean) : Boolean;
      //CheckDoor(1592934, 12, 0.03, 0.25, Point(MSX1, MSY1), Point(MSX2, MSY2), True);
    
      Release();
    end.

    Update 06-Mar-17:
    • Added in better detection of trader NPCs, it should find them in one go now.
    • Removed some of the random anti ban, it will now move mouse off screen when doing activites like mining and smelting, because that more human like than simulating the 'bored human'


    Update 07-Mar-17:
    • Added in a door detection function will pick up the shop and furnace door, I have yet to implement it in the script loop, but you can do it by adding it in after a furnace or shop trip, I have commented out the lines to show the usage and also another line below it which documents the color, hue, sat needed.


    Update 11-Mar-2017
    • New bug found, will be fixed soon. Bug is that the DTMs for bar and symbol are to damn similar and the inventory counter counts the wrong things
    • Various tweaks to get it a bit more stable


    Update 12-Mar-2017
    • Reworked the detection features to make sure we are smelting/mining/smithing etc with Joopi's help
    • Fixed some bugs involving selling symbols
    • Script should be way more stable now, make sure to have your login details entered incase you are dropped from RS servers because of excessive world hopping


    Update 13-Mar-2017
    • Reworked world hopping to allow user defined worlds, make sure you set the correct worlds, its got a maximum of 5 worlds at this point, but anyone can extend it, just add a few more case statements, this will be reworked again in the future.


    USER DEFINED VARIABLE THAT IS REQUIRED:
    Code:
    DEFAULT_INVNETORY_COUNT := 3;
    This is found on line 14, you must set this to be the correct variable for your particular setup.
    If you are not wielding the pickaxe, you must set this to 3, if you are wielding the pickaxe this must be set to 2.
    (This isn't in the script currently, but I need a place holder here to make sure I don't forget.)
    Last edited by Barr; 03-13-2017 at 06:46 AM.

  2. #2
    Join Date
    Sep 2014
    Location
    C:\Simba\
    Posts
    565
    Mentioned
    9 Post(s)
    Quoted
    71 Post(s)

    Default

    Damn you're going hard on script releasing

    What's the profit rate on this one?
    Feel free to ask me any questions, I will do my best to answer them!

    Previously known as YouPee.

  3. #3
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by Joopi View Post
    Damn you're going hard on script releasing

    What's the profit rate on this one?
    Not very much, depends if you are hopping to sell, if you hop and sell 10 each world assuming no other symbols in stock you make around 1.1k per run, which is also the same amount of EXP you get from a run in crafting.

    If you aren't hopping then that falls to about ~600 or so GP per run, so it makes sense to hop, and I plan to have this script hop worlds to sell, but that is a luxury feature right now

  4. #4
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Update Bump, I have been testing it a few times a week and its gotten a lot more stable. I am experiencing a bug where it will hop a number of times before it decides it can mine in that world. I'll be fixing this bug hopefully this week, as spamming the change world will get you logged out.

  5. #5
    Join Date
    Apr 2013
    Posts
    680
    Mentioned
    13 Post(s)
    Quoted
    341 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    Update Bump, I have been testing it a few times a week and its gotten a lot more stable. I am experiencing a bug where it will hop a number of times before it decides it can mine in that world. I'll be fixing this bug hopefully this week, as spamming the change world will get you logged out.
    I might be complete wrong; but i had a similar issue albeit on the reflection include - the solution was to include 'exit'&'break' statements... mine was getting stuck every so often. Something so simple.

    My 2cents

    PS - good job on the release =D

    <------------------>



  6. #6
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Used this script briefly. Noticed when all the ores have been mined the script will say:

    Something happend, we havent mined for 5 seconds, calling false and trying again
    Looking For silver Rock
    and it will just click a rock without any ore in it.

    EDIT: Just got this error when trying to sell symbols to shop

    walking to Shop
    Trying to open trade window
    Off to sell symbols
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    We have had more than 20 fails, terminating
    Last edited by sk80rdie76; 03-12-2017 at 03:04 AM.

  7. #7
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by sk80rdie76 View Post
    Used this script briefly. Noticed when all the ores have been mined the script will say:



    and it will just click a rock without any ore in it.

    EDIT: Just got this error when trying to sell symbols to shop
    I know of this error, Im working on an update right now
    I will be posting the new script within an hour. Sorry for about this.

    Edit:

    Uploaded new script, ive tested it and it sells symbols just fine now. Should be working for you.
    Last edited by Barr; 03-12-2017 at 04:13 AM.

  8. #8
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    I know of this error, Im working on an update right now
    I will be posting the new script within an hour. Sorry for about this.

    Edit:

    Uploaded new script, ive tested it and it sells symbols just fine now. Should be working for you.
    Testing now. Shop selling is working great now but the mining issue is still happening

  9. #9
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by sk80rdie76 View Post
    Testing now. Shop selling is working great now but the mining issue is still happening
    Did you open the EXP bar at the top? Im testing mining right now, its fine for me. Can you send me a screenshot or a vid of the error?

    Edit:

    Okay, ive done some more mining and ive re created what I think you are experiencing.
    Code:
    Something happend, we havent mined for 5 seconds, calling false and trying again
    Looking For silver Rock
    So, how I have designed the script is a bit hacky at this stage. You need to show the EXP box at the top right of the client. If it doesn't sense a change in 5 seconds, it will look for a new rock or will click the current rock again. It shouldn't be standing still after the 5 seconds.

    If it is standing still, then I would really like to see a video of that, because that's a weird bug.
    Last edited by Barr; 03-13-2017 at 05:56 AM.

  10. #10
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    Did you open the EXP bar at the top? Im testing mining right now, its fine for me. Can you send me a screenshot or a vid of the error?

    Edit:

    Okay, ive done some more mining and ive re created what I think you are experiencing.
    Code:
    Something happend, we havent mined for 5 seconds, calling false and trying again
    Looking For silver Rock
    So, how I have designed the script is a bit hacky at this stage. You need to show the EXP box at the top right of the client. If it doesn't sense a change in 5 seconds, it will look for a new rock or will click the current rock again. It shouldn't be standing still after the 5 seconds.

    If it is standing still, then I would really like to see a video of that, because that's a weird bug.
    symbolmaker.jpg

    it sits there clicking the rock with no ore until an ore appears in another rock

  11. #11
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by sk80rdie76 View Post
    symbolmaker.jpg

    it sits there clicking the rock with no ore until an ore appears in another rock
    I'm going to change the color, and see if that helps.

    If its doing that it must think it has found the rock when it hasn't, are you wearing something white like the silver? Is your graphics settings on brightest and on normal zoom?

  12. #12
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    I'm going to change the color, and see if that helps.

    If its doing that it must think it has found the rock when it hasn't, are you wearing something white like the silver? Is your graphics settings on brightest and on normal zoom?
    I will change clothing and see. i have it on brightest and normal zoom

  13. #13
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by sk80rdie76 View Post
    I will change clothing and see. i have it on brightest and normal zoom
    Let me know, I've grabbed new colors and I'm testing now. Ill edit back to see if its worth putting the new colors in.

    Edit, I honestly can't seem to recreate what you are showing me, I did have an issue like the one you specify when I was wearing my full white graceful, and when I had sampled the darker silver color, but as it stands, the silver color should still be good.

    Ive updated the color for the silver rocks anyway, i'll be posting the script soon. The color went from 9014166 to 9013653, so basically the same one, but this one seems to be operating a tad bit better.

    The only other bug I get while mining is the fact that when we get kicked because we hop a bit too much it wont log you back in, mainly because for some reason AeroLib doesn't want to recognize my decalrePlayer, But im working on this issue and the issue you have told me about.
    Last edited by Barr; 03-13-2017 at 06:48 AM.

  14. #14
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    Let me know, I've grabbed new colors and I'm testing now. Ill edit back to see if its worth putting the new colors in.

    Edit, I honestly can't seem to recreate what you are showing me, I did have an issue like the one you specify when I was wearing my full white graceful, and when I had sampled the darker silver color, but as it stands, the silver color should still be good.

    Ive updated the color for the silver rocks anyway, i'll be posting the script soon. The color went from 9014166 to 9013653, so basically the same one, but this one seems to be operating a tad bit better.

    The only other bug I get while mining is the fact that when we get kicked because we hop a bit too much it wont log you back in, mainly because for some reason AeroLib doesn't want to recognize my decalrePlayer, But im working on this issue and the issue you have told me about.
    It seems to work better now that I changed clothes but noticed if other people are also mining silver and wearing similar colored clothing it will click them or the rock closest to them.

    Just got this error when trying to sell symbols. maybe an issue with gems in inv?

    walking to Shop
    Trying to open trade window
    Off to sell symbols
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    Couldnt find the DTM specified, we didnt click anything
    We have had more than 20 fails, terminating
    Successfully executed.
    The following DTMs were not freed: [0, 1, 2, 3, 4, 5]
    symbolmaker2.jpg

  15. #15
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by sk80rdie76 View Post
    It seems to work better now that I changed clothes but noticed if other people are also mining silver and wearing similar colored clothing it will click them or the rock closest to them.

    Just got this error when trying to sell symbols. maybe an issue with gems in inv?



    symbolmaker2.jpg
    Ive tested with gems in inventory, it will simply ignore them. I truly don't know why you are having this issue, I will look into soon, thanks for testing this. Maybe you could create your own DTM for the symbols and try that? I understand the white clothing issue, but not the inability to sell the symbols. I will look for a better way to get over that issue.

    Edit, Still can't recreate what you are experiencing there. I've added in user defined switching now, from what ive tested so far it fixes the multiple hopping problem.

    Heres a picture of my inventory, its done a few trips:

  16. #16
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    Ive tested with gems in inventory, it will simply ignore them. I truly don't know why you are having this issue, I will look into soon, thanks for testing this. Maybe you could create your own DTM for the symbols and try that? I understand the white clothing issue, but not the inability to sell the symbols. I will look for a better way to get over that issue.

    Edit, Still can't recreate what you are experiencing there. I've added in user defined switching now, from what ive tested so far it fixes the multiple hopping problem.

    Heres a picture of my inventory, its done a few trips:
    Script has been pretty stable, but caught it a few times not smelting the ores and going to the shop.

    Walking to Smelter
    Smelting Symbols
    Couldnt find the DTM specified, we didnt click anything
    walking to Shop

  17. #17
    Join Date
    Dec 2011
    Posts
    39
    Mentioned
    0 Post(s)
    Quoted
    12 Post(s)

    Default

    Quote Originally Posted by sk80rdie76 View Post
    Script has been pretty stable, but caught it a few times not smelting the ores and going to the shop.
    Yeah, thats an issue that will be solved once I re write the main loop. Unfortunately short on time, I'm pretty sure the issue stems from the DTMs again, so ill rework that and the main loop and it shouldn't do that. It currently doesn't have any checks for inventory transitions, but it will soon!

  18. #18
    Join Date
    Oct 2006
    Posts
    313
    Mentioned
    0 Post(s)
    Quoted
    13 Post(s)

    Default

    Quote Originally Posted by Barr View Post
    Yeah, thats an issue that will be solved once I re write the main loop. Unfortunately short on time, I'm pretty sure the issue stems from the DTMs again, so ill rework that and the main loop and it shouldn't do that. It currently doesn't have any checks for inventory transitions, but it will soon!
    Awesome! Looking forward to it

  19. #19
    Join Date
    Sep 2016
    Posts
    41
    Mentioned
    0 Post(s)
    Quoted
    14 Post(s)

    Default

    nice script, bro

  20. #20
    Join Date
    Mar 2017
    Posts
    13
    Mentioned
    0 Post(s)
    Quoted
    1 Post(s)

    Default

    nice release thanks for this

  21. #21
    Join Date
    Jul 2017
    Posts
    30
    Mentioned
    0 Post(s)
    Quoted
    15 Post(s)

    Default

    Switching worlds is broken.

    Looking for silver rock
    Switching to a random world
    and does nothing.
    Last edited by Grendal; 07-21-2017 at 12:34 AM.

  22. #22
    Join Date
    Jan 2012
    Location
    Sydney, Australia
    Posts
    870
    Mentioned
    12 Post(s)
    Quoted
    361 Post(s)

    Default

    Quote Originally Posted by Grendal View Post
    Switching worlds is broken.

    Looking for silver rock
    Switching to a random world
    and does nothing.
    https://villavu.com/forum/showthread...35#post1384535

    https://villavu.com/forum/showthread...03#post1384903

    Should fix your issue.

    The problem is that the include isnt updated with the world locations.

    I adjusted this a while ago, but I am not sure if its been fucked up again...

    Let me know if there is issues and I will update.

  23. #23
    Join Date
    Jul 2017
    Posts
    30
    Mentioned
    0 Post(s)
    Quoted
    15 Post(s)

    Default

    Quote Originally Posted by Dan the man View Post
    https://villavu.com/forum/showthread...35#post1384535

    https://villavu.com/forum/showthread...03#post1384903

    Should fix your issue.

    The problem is that the include isnt updated with the world locations.

    I adjusted this a while ago, but I am not sure if its been fucked up again...

    Let me know if there is issues and I will update.
    Still broken.
    Last edited by Grendal; 07-22-2017 at 11:03 AM.

  24. #24
    Join Date
    Aug 2007
    Location
    Colorado
    Posts
    7,343
    Mentioned
    266 Post(s)
    Quoted
    1402 Post(s)

    Default

    That's a really neat script. I noticed in your description you only target the 3 silver rocks rather than that cluster as well as the two north-east of that location. Is that because of the color similarity between the silver rocks and the tin rock / rune spawns?

    I just whipped up my own simple silver miner & banker that utilizes both clusters of rocks. It was a bit tricky to correctly handle the 2 silver rock zones but if you'd like some advice let me know and I'll show you how I tackled them.

    Current project:
    [ Blast furnace, P2P Guild-miner, Auto-Fighter R&D]

  25. #25
    Join Date
    Jul 2017
    Posts
    30
    Mentioned
    0 Post(s)
    Quoted
    15 Post(s)

    Default

    Can you add Tiaras for banking as an option?

Page 1 of 2 12 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •