Results 1 to 6 of 6

Thread: DaiRuneCrafter

  1. #1
    Join Date
    Jan 2012
    Posts
    22
    Mentioned
    0 Post(s)
    Quoted
    0 Post(s)

    Default DaiRuneCrafter

    I'm aware there are already Air-Crafter scripts, especially Deadly's which seems to be quite popular recently. But this is what I really wanted to do so I did it anyway.

    It's my very first script. So don't expect too much.

    About 3 days ago, I was posting on the SRL Member thread, I was questioning the process and simply ended up saying that I should probably make my own but that it would take forever.

    I spent the next day reading tutorials and watched both of YoHoJo's video in one sitting, long but instructive. Then I spent yesterday writing this script and today I tested it and changed a couple things.

    I'd wait until it works flawlessly but I'd like to have an opinion from other people even though it's not perfect.

    Since this is my first script, I read quite a few scripts and used some elements from each. I didn't make a mash-up of script's parts if that's what you think, I wrote most of it myself and copy-pasted few things. There are a couple function that are very similar to some other scripts out there and I tried to credit them for the most part. I'll probably eventually replace them though, since some of them are not working as well as I'd want them to. Notably the crafting itself (took the dtm from PatDuffy's script) and leaving the altar through the portal (that I took from Deadly's), that one works with TPA and it's the only thing I don't understand so well in my script. Otherwise, I tried to make sure all my code was used and logical. The code I didn't write was also kinda messy sometimes so I cleaned that up also haha.

    So now onto the script itself :

    It crafts Air Runes, I used very simple stuff in the script but it seems to work pretty well. The banking is pretty much flawless from what I've seen, the walking works but could use some rework and the altar transportation/crafting isn't quite there yet... But it works.

    What annoyed me from most other scripts is how slow they were. Mine goes pretty fast so far and isn't too buggy. However it's not very AFKable. I didn't have time to do a very long proggy as I changed parts of the script each time, it's still very very beta, being my first script and wrote in day. Progress I made was 30 minutes long and got stuck at the bank (for the first time ever, weird).

    So anyone is welcome to review the script, tell me what they think, what I could do better, what should I replace and what feature I should add.

    Here's my script as of now :

    Code:
    program DaiRuneCrafter;
    {$DEFINE SMART}
    {$i srl/srl/misc/smart.simba}
    {$i srl/srl.simba}
    {$i ObjectDTM\ObjDTMInclude.simba}
    
    procedure DeclarePlayers;
    begin
      HowManyPlayers := 1;
      NumberOfPlayers(HowManyPlayers);
      CurrentPlayer := 0;
    
      with Players[0] do
      begin
        Name   := ''; // Username
        Pass   := ''; // Password
        Nick   := ''; // 3-4 lowercase letters from username; used for random event detection
        Pin    := ''; // Leave blank if the player doesn't have a bank pin
        Active := True;
      end;
    end;
    
    Const
      ScriptVersion = '0.10';
      ScriptName    = 'DaiRuneCrafter';
    
    Var
        EssUsed,RunesCrafted,TotalCrafted:Integer;
    
    function CountRunes:Integer;
    var
      Box: TBox;
    begin
        Box := InvBox(1);
        Result:=GetAmountBox(Box);
    end;
    
    procedure Setup; // Setup Smart, SRL and DTM. Logs the player in if he's not.
    begin
      Smart_Server := 10;
      Smart_Members := false;
      Smart_Signed := True;
    
      ClearDebug;
      SetupSRL;
    
      DeclarePlayers;
    
      if not (LoggedIn) then
        LoginPlayer;
    
      FindNormalRandoms;
      MakeCompass('N');
      SetAngle(SRL_ANGLE_HIGH);
      SetRun(True);
    
      ObjDTM_Setup;
      ObjDTM_Debug := False;
    end;
    
    procedure Antiban; // Mostly Daazndagger's Fletcher anti-ban which I liked a lot.
    var
      x: Integer;
    begin;
      if not (LoggedIn) then Exit;
      Writeln('Perfoming antiban');
      x:= Random(100);
      case x of
        10, 20, 30, 40: HoverSkill('runecrafting', false);
        //20, 25: RandomMovement;
        //30, 40: RandomAngle(SRL_ANGLE_HIGH);
        50: PickUpMouse;
        60: RandomRClick;
        70: ExamineInv;
        //80: BoredHuman;
      end;
    
      case x of
        10, 15, 20, 25, 30, 40, 50, 60, 70:
          begin
            Wait(RandomRange(250, 1000));
            GameTab(Tab_Inv);
          end;
      end;
    end;
    
    procedure Banking; // Deposits everything if player has anything in inventory, then withdraws everything from first bank slot.
    var
      i: Integer;
    begin;
      if not LoggedIn then Exit;
      Antiban;
      if OpenBankFast('vwb') then
        if InvCount>0 then // If the player's inventory is not empty, deposits all
          begin
            DepositAll;
          end else
            FixBank;
            for i:=1 to 5 do // Tries to withdraw essences from the first bank slot 5 times before giving up.
            begin
              if Withdraw(0, 0, 0) then
                Break;
              if i>=5 then
              begin
                Writeln('Could not withdraw essences.'+IntToStr(i));
                Exit;
              end;
            end;
    end;
    
    procedure Resting; // Checks if rest is needed then listen to the musician if needed. Used parts of Deadly's procedure.
    var
      x,y: Integer;
    begin
      if not loggedin then exit;
      FindNormalRandoms;
      DidRedClick;
    
    begin
      if (Not runenergy(30)) then // If the player doesn't have a minimum of 30 energy, rest at the musician.
        begin
          writeln('Need rest!')
          wait(500+Random(500));
          If FindObjCustom(x, y, ['Talk', 'alk'], [14464635, 9469760, 4297607], 10) then
            begin
              Getmousepos(x, y)
              begin;
                MMouse(x, y, 3, 3);
                ClickMouse2(False);
                Waitoption('isten', 3000);
                Writeln('Resting...')
                Antiban;
                Wait(8000+Random(5000));
                Antiban;
                RestUntil(95)
                SetRun(True);
              end;
            end;
        end else;
          writeln('Player does not need rest');
    end;
    end;
    
    procedure WalkToAltar; // Walks to the altar, stops at the musician for rest if needed.
    var
      Path: TStringArray;
      I: Integer;
    
    begin
      writeln('Adjusting the view...')
      MakeCompass('N');
      SetAngle(SRL_ANGLE_HIGH)
      writeln('Checking if run is on...')
      SetRun(True);
        Path := ['80:80:6:0:7:83:37:1:7:49:96:10:7:69:53:10:7:116:49:10:7:116:74:10:7:69:70:4:76:51:74:95:103:95:106:50',
                 '79:109:6:1:7:48:96:10:7:116:74:10:7:116:57:10:7:69:79:0:7:83:37:10:7:69:61:4:72:103:72:112:89:111:85:103',
                 '45:79:5:1:7:53:66:10:7:73:61:10:7:73:40:10:7:120:53:0:7:53:118:4:40:76:39:85:52:85:51:76',
                 '43:97:3:0:7:92:118:1:7:57:108:1:7:91:67:4:38:94:49:93:46:104:37:105',
                 '43:92:4:10:7:36:91:1:7:70:108:1:7:95:91:1:7:107:112:5:45:87:39:88:38:95:49:95:50:87',
                 '46:112:4:1:7:45:91:1:7:107:99:10:7:73:83:1:7:94:112:4:43:107:42:116:52:115:49:106',
                 '40:104:6:10:7:109:55:1:7:62:67:1:7:82:63:1:7:58:99:1:7:46:63:1:7:42:83:4:34:100:34:107:46:109:49:100',
                 '61:100:5:1:7:74:87:1:7:102:115:1:7:86:63:1:7:102:79:3:7:80:111:4:60:91:63:116:67:109:64:88']
    
      WriteLn('Checking if player is in Varrock West Bank...');
    
      if ObjDTM_InArea(Path[0], True) then
        begin
          WriteLn('Player is in Varrock West Bank.');
    
        if InvCount<28 then // If the player is not full (of essences), start the banking procedure to get essences.
          begin
            Banking;
          end;
    
        for I := 1 to 4 do // Walk to the musician then stops.
        begin
          ObjDTM_Walk(Path[i], 0, 100, 80, True);
        end;
    
        begin
          writeln('Checking if player needs rest...')
          Resting;
        end;
    
            for I := 5 to 7 do // Resume path to the altar.
        begin
          ObjDTM_Walk(Path[i], 0, 100, 80, True);
        end;
    
        if ObjDTM_InArea(Path[High(Path)], True) then
          WriteLn('Reached altar.');
      end else
      begin
        WriteLn('Player not in bank');
        Exit;
      end;
    end;
    
    procedure EnterRuins; // Finds and enter the Mysterious Ruins.
    var
      x,y: Integer;
    
    begin
      if not loggedin then exit;
      FindNormalRandoms;
      Antiban;
      DidRedClick;
    
      if InvCount>1 then // Enter the ruins if the player has not yet crafted any runes (has something other than air runes in inventory).
        begin
          If FindObjCustom(x, y, ['Ent', 'er My'], [16631951, 16629135, 16171659, 14925721, 16499851], 15) then
          begin
            Writeln('Entered the ruins.');
            Getmousepos(x, y);
            if IsUpText('nter') then
              begin
                MMouse(x, y, 8, 8);
                ClickMouse2(True);
                Wait(2000+random(500));
              end else
                begin
                Writeln('Could not find the ruins.');
                Exit;
                end;
            end;
        end;
    end;
    
    function CraftRunes:Boolean;
    Var
      x,y,Altar,i: integer;
    
    begin
      if not loggedin then exit;
      FindNormalRandoms;
      DidRedClick;
    
    if InvCount>1 then // Crafts runes if the player has not yet done so (has something other than air runes in inventory).
      for i:=1 to 5 do // Since this function is a little buggy at the moment, I have it try 5 times.
        begin
          Altar:=DTMFromString('mrAAAAHic42BgYGhlYmCoA+IaIF4MxEuAOBWI24H4FBA3AtXkAPEMIK4H4sVA3A7EZ4H4AhCnpCQwhAWHM2TmZDDExEQwtHe3MqRmpDCUlOQzNDXVMGgA1UiiYQ0kzEgAwwAAsqoUgA==');
          Result:=False;
          if i>=5 then
            begin
              FreeDTM(Altar);
              Writeln('Could not find the altar.');
              Exit;
            end;
      if FindDTM(Altar,x,y,MSX1,MSY1,MSX2,MSY2) then
        begin
          Mouse(x,y,2,2,mouse_Left);
          Result:=True;
          FreeDTM(Altar);
          Antiban;
          Writeln('Crafted Air runes.');
          EssUsed:= EssUsed + 28; // Adds a full inventory of essence to the variable to calculate to total amount of essences used.
          Wait(4500+random(500));
          RunesCrafted:= CountRunes; // Counts the number of runes in the first inventory slot and put it in RunesCrafted.
          TotalCrafted:= TotalCrafted + RunesCrafted; // Takes the Current total of crafted air runes and adds up the amount of runes you just crafted.
          RunesCrafted:= 0; // Resets the variable after having used its number.
          Exit;
        end;
      end;
    end;
    
    procedure LeaveRuins; // Leave Ruins procedure almost entirely taken from Deadly's, I'm not familiar with TPA. It seems to be quite buggy also.
    var
      X,Y,I: Integer;
      TPA : TPointArray;
      ATPA : T2DPointArray;
    
    Begin
      if not loggedin then exit;
      FindNormalRandoms;
      Antiban;
      DidRedClick;
    
    begin
        FindColorsTolerance(TPA, 5081226, MSX1, MSY1, MSX2, MSY2, 10);
        ATPA := TPAToATPAEx(TPA, 28, 28);
        For I := 0 To High(ATPA) Do
      Begin
          If MiddleTPAEx(ATPA[I], X, Y) Then
       begin
          MMouse(X, Y, 2, 2);
          ClickMouse2(True);
          Writeln('Leaving the ruins.');
          Wait(2500+random(500));
       End;
      End;
     End;
    End;
    
    procedure WalkToBank; // Running back to the bank after having crafted some runes. Rests if needed.
      var
        Path: TStringArray;
        I: Integer;
    
    begin
      writeln('Adjusting the view...')
      MakeCompass('N');
      SetAngle(SRL_ANGLE_HIGH)
      writeln('Checking if run is on...')
      SetRun(True);
        Path := ['80:80:6:1:7:102:55:1:7:98:98:1:7:58:90:1:7:54:38:3:7:108:79:3:7:44:55:11:50:50:51:80:63:93:93:97:114:92:120:80:125:63:122:46:104:35:82:22:58:29',
                 '116:76:6:1:7:49:102:1:7:46:49:1:7:94:67:1:7:89:111:3:7:36:66:3:7:100:92:4:103:74:109:86:125:79:123:73',
                 '104:51:5:3:7:63:95:1:7:58:70:1:7:110:104:1:7:86:100:1:7:74:71:4:98:55:98:46:116:46:119:50',
                 '111:48:5:10:7:114:45:1:7:87:54:1:7:69:115:1:7:66:58:1:7:49:99:4:107:41:104:55:113:51:113:45',
                 '127:74:5:10:7:86:78:1:7:57:87:1:7:120:96:1:7:107:109:1:7:58:37:4:116:73:118:86:133:79:130:67',
                 '106:56:5:10:7:40:83:1:7:74:100:1:7:61:112:1:7:90:120:1:7:73:125:4:99:58:112:52:112:63:97:62',
                 '132:76:4:1:7:109:62:1:7:74:104:0:7:108:114:1:7:86:126:4:122:73:122:83:140:80:137:71',
                 '90:50:5:0:7:57:118:10:7:77:49:10:7:77:40:10:7:77:31:1:7:57:66:4:87:49:100:47:100:60:87:58']
    
      WriteLn('Checking if player is outside Air Altar...');
    
      if ObjDTM_InArea(Path[0], True) then
        begin
          WriteLn('Player is outside Air Altar.');
    
          for I := 1 to 3 do
          begin
            ObjDTM_Walk(Path[i], 0, 100, 80, True);
          end;
    
          begin
          writeln('Checking if player needs rest...') // Stops on the way back too except it's after 3 steps this time.
          Resting;
          end;
    
          for I := 4 to 7 do
          begin
            ObjDTM_Walk(Path[i], 0, 100, 80, True);
          end;
    
        if ObjDTM_InArea(Path[High(Path)], True) then
          WriteLn('Reached bank.');
      end else
      begin
        WriteLn('Player not outside Air Altar.');
        Exit;
      end;
    end;
    
    procedure ProgressReport; // Reports the current stats. Template mostly taken from Daazndagger.
    var
      exp:Integer;
    begin
      exp:=EssUsed*5;
      ClearDebug;
      Writeln('/-------------------------------------------------------------\');
      Writeln('|-------------------------------------------------------------|');
      Writeln(PadR('|                        DaiRuneCrafter', 62) +  '|');
      Writeln(PadR('|                        Version ' + ScriptVersion, 62) + '|');
      Writeln('|-------------------------------------------------------------|');
      Writeln(PadR('|       Time Running  : ' +MsToTime(GetTimeRunning, Time_Abbrev), 62) + '|');
      Writeln(PadR('|       Airs Made: ' +IntToStr(TotalCrafted), 62) + '|');
      Writeln(PadR('|       Exp Gained: '+IntToStr(exp), 62) + '|');
      Writeln(PadR('|       Exp/Hour: '+IntToStr((exp*60/((GetTimeRunning/60000)+1))), 62) + '|');
      Writeln(PadR('|     ', 62) + '|');
      Writeln('|-------------------------------------------------------------|');
      Writeln('\-------------------------------------------------------------/');
      //Stats_IncVariable('Crafted', TotalCrafted + 'Air Runes); //These will be useful if I eventually implement SRL Stats
      //Stats_IncVariable('Runecrafting EXP (Gained)',exp);
      //Stats_Commit;
    end;
    
    begin // Begins the procedures and repeats.
      Setup;
      DeclarePlayers;
      repeat
        WalkToAltar;
        EnterRuins;
        CraftRunes;
        ProgressReport;
        LeaveRuins;
        WalkToBank;
      until(false)
      ProgressReport;
      FreeSRL;
    end.
    And... That's pretty much it. You can be pretty much wherever in Varrock's bank, it should detect it anyway, it will use any bank booth it finds. It will detect if you need rune essence or if you need to deposit your runes.

    You absolutely need to put Rune/Pure Essences in the first bank slot as the script doesn't look for the rune essence, it retrieves what's in the first slot. It may be less user friendly but it works a LOT faster.

    You could also start at the altar, inside or outside. It should see that you're not at the bank and continue with the script. Just don't start the script right in the middle of the walking process.

    The script has trouble find the altar sometimes... So it might leave then reenter but it doesn't seem to get stuck in a loop, it eventually does find it.

    Can't find much else to say, I'll edit if there's anything.

    Here's the stuff I can think of that I need to fix or that I should add in the future, feel free to tell me what I should fix or add. I've only tested the script myself so it might not run as well on other computers/connections.

    To-do list :
    • Re-work odtm paths to be more effcient/faster.
    • Work on some more anti-ban features to make the bot less... Bot-ish.
    • Make an additional setup function to prepare the player instead of having the same lines in each procedures.
    • Add SRL stats support.
    • Find a better way to wait between transportations than a simple wait()
    • Add more failsafes to avoid entering in infinite loops.
    • Find another way to detect the Crafting Altar and the portal to leave.


    Please tell me what you think and don't hesitate to be criticize!

  2. #2
    Join Date
    Nov 2011
    Posts
    99
    Mentioned
    0 Post(s)
    Quoted
    0 Post(s)

    Default

    looks good im going to test it because i have a pure runecrafter :P

  3. #3
    Join Date
    Feb 2011
    Location
    Earth
    Posts
    1,784
    Mentioned
    1 Post(s)
    Quoted
    0 Post(s)

    Default

    Well for your first script, your doing a great job! I like how you used the SRL Include well, instead of making useless clicking of specific points as I've seen with other first scripts.

    My suggestions just to help you practice and improve.
    ~Add SPS walking as a backup for ObjDTM walking.(I've been meaning to do this with my own air runecrafter )
    ~Create some custom function that return values. Such as a function to find and click something(such as the portal) that will return True if successful and False if it failed, getting into this habbit will make failsafing a ton easier when you begin more complex scripts.
    ~For the other way to detect the portal, Look into using a TPA with CTS 2 as it detects it fairly accurately, that is what I did in my own air crafter.
    ~For the other way to detect the crafting altar, try using a large DTM on the Main-Screen.
    ~For the waiting inbetween walking, a While-do statement is very useful such as...

    Simba Code:
    while IsMoving do
      Wait(100);

    that will wait 100 miliseconds while the character is moving, it's kinda like a repeat but more efficient.

    Nice job on your first script!

    Currently: Working on Defending&Attacking in my Castle-Wars Script
    Project Rebuild: 90M/170M

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

    Default

    The script looks nice, I guess I have to do the overhaul on my script sooner then I expected :P
    The reason my one is slow because I put an extended wait on each walk path, so the objects could appear on the screen before it starts to search. There used to be a bug with the search if it couldn't find the objects instantly.
    A DTM for the ess works very well and it finds it nearly immediately if the script can see it.

  5. #5
    Join Date
    Oct 2007
    Posts
    111
    Mentioned
    0 Post(s)
    Quoted
    1 Post(s)

    Default

    why not change withdrawing so that it withdraws by dtm? that way if you run out of ess, the script stops. It's up to you, i'm just a huge fan of dtms :P

  6. #6
    Join Date
    Jan 2012
    Posts
    22
    Mentioned
    0 Post(s)
    Quoted
    0 Post(s)

    Default

    Quote Originally Posted by dweg View Post
    why not change withdrawing so that it withdraws by dtm? that way if you run out of ess, the script stops. It's up to you, i'm just a huge fan of dtms :P
    Mmm... I didn't even think about what happens when you're out of ess! You're right, maybe I should... I'm just afraid it won't be as fast, ha ha. I'll look into that!

    Not ignoring Deadly who suggested the same thing :P I'll try to use that.

    Can anyone tell me if it doesn't look too much like it's a bot? The path aren't that varied, is that a really big deal as long as it doesn't click the exact same spot all the time? And my anti-bans aren't there all that much. Just want to know what you guys think.

    Also did anyone see my awesome wordplay for the scriptname? Because it's BRILLIANT.
    Last edited by Dairiun; 02-08-2012 at 09:11 AM.

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
  •