Results 1 to 5 of 5

Thread: Help me stabilize my poor script

  1. #1
    Join Date
    May 2012
    Posts
    8
    Mentioned
    0 Post(s)
    Quoted
    2 Post(s)

    Default Help me stabilize my poor script

    Hello guys, so i wanted to make a simple cooking script, using tutorials on this forum. I managed to make it loop 4-5 times, but since my scripting knowledge is very limited it would start clicking where it not supposted to.

    The script cooks, withdraws and deposits, opens bank (poorly but eventualy does it). While walking to cooking range and while walking to bnak, after few runs it would start clicking on the main screen, while walking(it supposed to sleep, while player is moving).

    Here is how the script looks like:
    I've made some really long sleep/wait time, hoping it would fix the random clicking on main screen while walking.
    Also i wasnt sure how to make it loop properly.

    Code:
    program new;
    {$i AeroLib/AeroLib.Simba}
    function IsCooking: Boolean;
      var
        PBox: TBox;
      begin
        PBox := IntToBox(560, 205, 734, 463);
        if pixelShift(PBox, 2000) then
        Result := true;
      end;
    function isRawFishInInv: boolean;
     var
     x,y : integer;
    
    begin
     if FindColorTolerance(x,y, 14271377, 555, 206, 729, 461, 15) then
       result := true;
    end;
    
    
    
    procedure WalkToBank
    var
    pnt : TPoint
    begin
     if findSymbol(pnt, SYMBOL_Bank) then
      humanMMouse(pnt,1,1);
       wait(250);
        fastClick(1);
         sleep(2000);
          while isPlayerWalking() do
           wait(1000);
    end;
    
    procedure WalkToRange
    var
      color_White : TColEx;
      foundPnt    : TPoint;
    begin
      color_White.create(982782, 2, 0.00, 0.39);
      if color_White.findIn(AREA_MM, foundPnt) then
        humanMMouse(foundPnt,1,1);
        wait(250);
        fastClick(1);
        wait(2000);
        while isPlayerWalking() do
            wait(1000);
    end;
    
    
    procedure Banking;
    var
      x,y       : integer;
      obj_Chest : TMSObject;
      Pnts      : TPointArray;
    
    begin                                                             // Wooden color                     // Silver color
      obj_Chest.create('Bank', ['Bank booth','booth'], [createCol(3618620, 16, 0.53, 2.97)], [createCol(3493981, 1, 0.27, 0.12)]);
      if obj_Chest.findAll(10, MSCP, Pnts) then
        findMSObjectSimple([3618620, 3493981], ['Bank booth','booth']);
          fastClick(1);
           Wait(500 + Random(500 + 1000));
            mouseBox(387,295,407,310,1,1);
             wait(800);
              repeat
               mouseBox(387,295,407,310,1,1);
              until(isInvEmpty);
    
    end;
    
    procedure Withdraw;
    begin
      mouseBox(44,93,52,103,1,0);
       wait(500);
        waitOption('All', 500);
         wait(500);
    end;
    
    procedure SelectFish;
    var
    x,y : integer;
    begin
     if FindColorTolerance(x,y,6907522, 7, 347, 511, 473, 15) then
       MoveMouse(x,y);
        wait(500);
         fastClick(1);
    end;
    
    procedure LetsCook;
    var
      x,y       : integer;
      obj_Range : TMSObject;
      Pnts      : TPointArray;
    
    begin                                                             // Wooden color                     // Silver color
      obj_Range.create('Range', ['Ran','nge'], [createCol(1583821, 9, 0.55, 2.87)], [createCol(3618620, 12, 0.47, 3.13)]);
      if obj_Range.findAll(10, MSCP, Pnts) then
        findMSObjectSimple([1583821, 3618620], ['Range']);
          fastClick(1);
           Wait(500 + Random(500 + 1000));
    end;
    
    procedure DepositAndWithdraw;
    begin
    if (not(isRawFishInInv)) then
     WalkToBank;
      wait(1000);
       Banking;
        if (isInvEmpty) then
          Withdraw;
    end;
    procedure WalkToRangeAndCook;
    begin
      if (isRawFishInInv) then
         WalkToRange;
          wait(1000);
           LetsCook;
            wait(500);
             SelectFish;
              while IsCooking do
               wait(200);
    end;
    
    procedure loop;
    begin
      DepositAndWithdraw;
       sleep(500);
        WalkToRangeAndCook;
         sleep(500);
    end;
    
    
    begin
    initAL;
    repeat
    Loop;
    until(false);
    end.

  2. #2
    Join Date
    Jan 2012
    Location
    Sydney, Australia
    Posts
    848
    Mentioned
    12 Post(s)
    Quoted
    351 Post(s)

    Default

    Bit of feedback - forgive the shitty code - I haven't used AL in forever.

    isPlayerWalking may not be overly accurate as it was made a while ago, and it depends on your zoom settings etc. You would be better off playing with the pixelShift function, or using other flags like bank open etc.

    The IsCooking function would be worth integrating a few extra checks:
    - Create a loop delay timer between cooks (say 5000 ms). If exceeded, exits the function.
    - Use the GetXPBarAmount function to see if the xp has changed (ie successfully cooked a fish). If a fish is cooked, it restarts the delay timer.
    - Count the amount of raw fish in your inventory. If the number changes from the last count (means we cooked or burnt a fish), it restarts the delay timer.
    - Add a check to see if there is any raw fish left, if not, it breaks the loop.

    Also look at replacing your Rawfish check with a DTM.
    You can remove the whole block if you just create a TItem. You can also remove the select fish block as RawFish.Interact works better.

    The indents of your WalkToBank procedure don't appear to be formatted corretly. Here it is with proper formatting.
    Simba Code:
    procedure WalkToBank
    var
      pnt : TPoint
    begin
     if findSymbol(pnt, SYMBOL_Bank) then
      humanMMouse(pnt,1,1);
     wait(250);
     fastClick(1);
     sleep(2000);
     while isPlayerWalking() do
      wait(1000);
    end;
    It would also be worth adding a failsafe timer to your potential infinite loop:
    Simba Code:
    procedure WalkToBank
    var
      pnt : TPoint
      t:timer;
    begin
     if findSymbol(pnt, SYMBOL_Bank) then
      humanMMouse(pnt,1,1);
     wait(250);
     fastClick(1);
     sleep(2000);
     t.start();
     while isPlayerWalking() do
      if (t.TimeElapsed > 10000) then // if we exceed 10 seconds of walking, the wait loop breaks.
        break;
    end;
    The same can be applied to the WalkToRange.

    With the banking procedure, it would be worth adding a check or even just delays between your mousebox clicks, and adding a fastClick option if the mouse is in the box already.
    You should also look at adding a IsBankOpen check before clicking on the mousebox area.
    Simba Code:
    procedure Banking;
    var
      x,y       : integer;
      obj_Chest : TMSObject;
      Pnts      : TPointArray;
      t:timer;
    begin                                                             // Wooden color                     // Silver color
      obj_Chest.create('Bank', ['Bank booth','booth'], [createCol(3618620, 16, 0.53, 2.97)], [createCol(3493981, 1, 0.27, 0.12)]);
      if obj_Chest.findAll(10, MSCP, Pnts) then
        findMSObjectSimple([3618620, 3493981], ['Bank booth','booth']);
      fastClick(1);
      t.start();
      while not IsBankOpen do
        if (t.timeElapsed > 10000) then
          break;
      Wait(500 + Random(500 + 1000));
      if not MouseInBox(ToBox(387,295,407,310)) then
        mouseBox(387,295,407,310,1,1);
      wait(800);
      t.start()
      repeat
        wait(randomrange(500, 2000));
        if not MouseInBox(ToBox(387,295,407,310)) then
          mouseBox(387,295,407,310,1,1)
        else
          FastClick(MOUSE_LEFT); // if mouse point is already in the bounds of the box, we just left click.
        if (t.TimeElapsed > 5000) then
          break;
      until(isInvEmpty);
    end;
    Again, we used a timer to determine the amount of time to wait before moving on.

    A few modifications to withdraw based on the use of a TItem.
    Simba Code:
    function Withdraw:boolean;
    var
      p:tpoint;
      t:timer;
    begin
      if RawFish.findIn(Area_BS, p) then
        MissMouse(p, 5, 5);
      if WaitUpTextMulti(['Withdraw'], 300) then
      begin
        FastClick(MOUSE_RIGHT);
        wait(randomrange(75, 175));
        ChooseOption('All');
      end;
      while not RawFish.InInventory do
        if (t.TimeElapsed > 3000) then
          exit(false);
      result := true;
    end;

    Rather than grouping the Depo and Withdraw in separate blocks, I would just do them in your main loop.
    It would be worth changing some of the procedures to functions with a boolean output to make your loop easier to build.
    Simba Code:
    procedure loop;
    var
      t:timer;
    begin
      GameTab(TAB_INV);
      if RawFish.InInventory then
        if WalkToRange then
          if RawFish.interact(MOUSE_LEFT, true) then
            if LetsCook then
            begin
              t.start();
              while IsCooking do
                if (t.TimeElapsed > 60000) then
                  break;
            end;
      if not RawFish.InInventory then
        if WalkToBank then
          if Banking then
            if Withdraw then
              wait(randomrange(275, 525));
    end;
    Make a start with these suggestions and then feel free to ask me for some more feedback. Object finding can be a lot more accurate if you make your own finder function rather than using TMSObject.

    Hope this helps.

  3. #3
    Join Date
    May 2012
    Posts
    8
    Mentioned
    0 Post(s)
    Quoted
    2 Post(s)

    Default

    Thank you very much, it helped me alot to understand more about it. I've made a raw fish DTM and script runs much more smoothly, also running to bank and cooking range is much better now. But when i try running new Withdraw function, the .findIn wouldnt work with the RawFish DTM.

    Edit: Forgot i had to create TItem first.
    Last edited by bl3d3; 11-09-2019 at 09:12 AM.

  4. #4
    Join Date
    Jan 2012
    Location
    Sydney, Australia
    Posts
    848
    Mentioned
    12 Post(s)
    Quoted
    351 Post(s)

    Default

    Quote Originally Posted by bl3d3 View Post
    Thank you very much, it helped me alot to understand more about it. I've made a raw fish DTM and script runs much more smoothly, also running to bank and cooking range is much better now. But when i try running new Withdraw function, the .findIn wouldnt work with the RawFish DTM.

    Edit: Forgot i had to create TItem first.
    You are best creating the TItem at the start of your script and freeing it when you finish.

    You can achieve this by creating a procedure like so:
    Simba Code:
    procedure StopScript;
    begin
      FreeDTM(RawFish.DTM);
    end;
    You then add the following to the main script block.
    Simba Code:
    AddOnTerminate('StopScript');

    So it should look something like this:
    Simba Code:
    procedure StopScript;
    begin
      FreeDTM(RawFish.DTM);
    end;

    begin
      RawFish.DTM := DTMFromString('Some string stuff');
      AddOnTerminate('StopScript');
      ScriptSetup;
      Repeat
        MainLoop;
      until(false);
    end.
    This will unload the DTM when the script is terminated (whether it's called from the script or manually stopped).

    When using the .findin function, be sure to declare the area that you are looking for the fish in the bank, not your inventory.

  5. #5
    Join Date
    May 2012
    Posts
    8
    Mentioned
    0 Post(s)
    Quoted
    2 Post(s)

    Default

    Quote Originally Posted by Dan the man View Post
    You are best creating the TItem at the start of your script and freeing it when you finish.

    You can achieve this by creating a procedure like so:
    Simba Code:
    procedure StopScript;
    begin
      FreeDTM(RawFish.DTM);
    end;
    You then add the following to the main script block.
    Simba Code:
    AddOnTerminate('StopScript');

    So it should look something like this:
    Simba Code:
    procedure StopScript;
    begin
      FreeDTM(RawFish.DTM);
    end;

    begin
      RawFish.DTM := DTMFromString('Some string stuff');
      AddOnTerminate('StopScript');
      ScriptSetup;
      Repeat
        MainLoop;
      until(false);
    end.
    This will unload the DTM when the script is terminated (whether it's called from the script or manually stopped).

    When using the .findin function, be sure to declare the area that you are looking for the fish in the bank, not your inventory.
    The script works great now. Was running for few hours, without any issues.


    Edit:
    How can i make it select closest to centre of minimap first?
    Code:
    procedure WalkToRange
    var
      color_White : TColEx;
      foundPnt    : TPoint;
      t           : Timer;
    begin
      color_White.create(982782, 2, 0.00, 0.39);
      if color_White.findIn(AREA_MM, foundPnt) then
        humanMMouse(foundPnt,1,1);
         wait(250);
          fastClick(1);
           wait(2000);
            t.start();
         while isPlayerWalking() do
          if (t.TimeElapsed > 10000) then
            break;
    end;
    It clicks on minimap npc colour, but sometimes when I stand in diferent position, there would be 2 npc dots on minimap and it would select the top one first.

    Also is it possible to make it click on Minimap Symbol at exact spot all the time (like top right corner) ? Because the findSymbol function would find the symbol for me and would click it, but it clicks randomly anywhere on symbol. This sometimes makes the account run to outside of the cooking building.
    Last edited by bl3d3; 11-11-2019 at 03:28 PM.

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
  •