├── .gitignore ├── .gitattributes ├── README.md ├── .simbapackage ├── CHANGELOG.md ├── .github └── workflows │ └── version.yml ├── wasp_alcher.simba ├── wasp_chompy_hunter.simba ├── wasp_stall_robber.simba ├── wasp_sawmill_runner.simba ├── wasp_offerer.simba ├── wasp_glassblower.simba ├── wasp_tab_maker.simba ├── wasp_smelter.simba ├── wasp_miner.simba ├── wasp_enchanter.simba ├── wasp_cooker.simba ├── wasp_jewelry_smelter.simba ├── wasp_kraken.simba ├── wasp_ardougne_knights.simba └── wasp_builder.simba /.gitignore: -------------------------------------------------------------------------------- 1 | *.psd 2 | *.psb 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Free Official Wasp Scripts 2 | Free Official Wasp Scripts. 3 | 4 | Join https://waspscripts.com for more info and guides! 5 | -------------------------------------------------------------------------------- /.simbapackage: -------------------------------------------------------------------------------- 1 | // The package name to install under. 2 | name=wasp-free 3 | // The path to install into, from the working directory. 4 | directory=Scripts 5 | // If true, files will be installed directly into the directory 6 | extract_in_directory=false 7 | // collapse top level folders 8 | collapse=false 9 | // files not to install 10 | blacklist=.git,.gitignore,.simbapackage,.gitattributes 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [2.15.45](https://github.com/Torwent/wasp-free/compare/v2.15.44...v2.15.45) (2025-12-13) 2 | 3 | 4 | ### Bug Fixes 5 | 6 | * Phials chat ([4545bb5](https://github.com/Torwent/wasp-free/commit/4545bb5fe5b622c35cf64a7a23ac250794b053fe)) 7 | 8 | 9 | 10 | ## [2.15.44](https://github.com/Torwent/wasp-free/compare/v2.15.43...v2.15.44) (2025-11-26) 11 | 12 | 13 | ### Bug Fixes 14 | 15 | * **blast furnace:** handle new pot message ([f80e507](https://github.com/Torwent/wasp-free/commit/f80e507cd6589ab0d25beb5129b1760fde3c8362)) 16 | 17 | 18 | 19 | ## [2.15.43](https://github.com/Torwent/wasp-free/compare/v2.15.42...v2.15.43) (2025-11-13) 20 | 21 | 22 | ### Bug Fixes 23 | 24 | * **builder:** phials text changed ([f0ebd36](https://github.com/Torwent/wasp-free/commit/f0ebd36aa2a4679154a412a31edfd5956b834432)) 25 | 26 | 27 | 28 | ## [2.15.42](https://github.com/Torwent/wasp-free/compare/v2.15.41...v2.15.42) (2025-11-08) 29 | 30 | 31 | ### Bug Fixes 32 | 33 | * **blast furnace:** fixed iron, silver and gold ([91eeb52](https://github.com/Torwent/wasp-free/commit/91eeb5260a5f526c24237388b5a15d6f55328c7c)) 34 | 35 | 36 | 37 | ## [2.15.41](https://github.com/Torwent/wasp-free/compare/v2.15.40...v2.15.41) (2025-11-07) 38 | 39 | 40 | ### Bug Fixes 41 | 42 | * **blast_furnace:** read notes ([8a36549](https://github.com/Torwent/wasp-free/commit/8a365496e898ec9e4385103ad5eb68d6ca6b535e)) 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /.github/workflows/version.yml: -------------------------------------------------------------------------------- 1 | name: Version 2 | on: 3 | push: 4 | branches: [master] 5 | pull_request: 6 | branches: [master] 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3.2.0 13 | 14 | - name: Get changed files 15 | id: changed-files 16 | uses: tj-actions/changed-files@v35.2.0 17 | 18 | - name: Generate changelog 19 | id: changelog 20 | uses: TriPSs/conventional-changelog-action@v3.18.0 21 | with: 22 | github-token: ${{ secrets.GITHUB_TOKEN }} 23 | git-message: "chore(release): {version}" 24 | preset: "angular" 25 | tag-prefix: "v" 26 | output-file: "CHANGELOG.md" 27 | skip-version-file: "true" 28 | skip-on-empty: "true" 29 | skip-commit: "true" 30 | 31 | - name: Upload to waspscripts.com 32 | uses: Torwent/wasp-upload-action@master 33 | with: 34 | SB_URL: ${{ secrets.SB_URL }} 35 | SB_ANON_KEY: ${{ secrets.SB_ANON_KEY }} 36 | EMAIL: ${{ secrets.EMAIL }} 37 | PASSWORD: ${{ secrets.PASSWORD }} 38 | MODIFIED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} 39 | 40 | - name: Commit and push changes 41 | if: ${{ steps.changelog.outputs.skipped == 'false' }} 42 | run: | 43 | git config --global user.name 'WaspBot' 44 | git config --global user.email 'wasp@waspscripts.com' 45 | git commit -am "chore: github action" 46 | git push 47 | 48 | - name: Create release 49 | uses: actions/create-release@v1.1.4 50 | if: ${{ steps.changelog.outputs.skipped == 'false' }} 51 | env: 52 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 53 | with: 54 | tag_name: ${{ steps.changelog.outputs.tag }} 55 | release_name: ${{ steps.changelog.outputs.tag }} 56 | body: ${{ steps.changelog.outputs.clean_changelog }} 57 | 58 | - name: Discord notification 59 | uses: rguillaume/discord-action-embed@v1.0.4 60 | with: 61 | webhook: ${{ secrets.UPDATES_WEBHOOK }} 62 | embed: '{"title": "Update: ${{ github.event.repository.name }}", "description": ${{ toJSON(github.event.head_commit.message) }}, "url": "${{ github.event.head_commit.url }}", "footer": {"text": "Committer: ${{ github.event.head_commit.author.username }}"}, "color": "16760576"}' -------------------------------------------------------------------------------- /wasp_alcher.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'f6fc217a-3b03-44e1-8fa7-662dfb48f6d7'} 2 | {$DEFINE SCRIPT_REVISION := '41'} 3 | {$IFNDEF SCRIPT_CHAIN} 4 | {$DEFINE SCRIPT_GUI} 5 | {$I SRL-T/osr.simba} 6 | {$I WaspLib/osr.simba} 7 | {$I WaspLib/optional/handlers/alchhandler.simba} 8 | {$ENDIF} 9 | 10 | var 11 | AlchSpell: ERSSpell := ERSSpell.HIGH_LEVEL_ALCHEMY; 12 | LossProtection: Boolean := True; 13 | WalkGE: Boolean := True; 14 | 15 | type 16 | EAlcherState = ( 17 | OPEN_BANK, WITHDRAW_NATS, WITHDRAW_MONEY, 18 | 19 | OPEN_COLLECT, HANDLE_COLLECT, 20 | CLOSE_INTERFACE, 21 | 22 | CAST_ALCHEMY, WAIT_ALCH, WALK_ALCH, 23 | CLOSE_CONTEXT, 24 | 25 | SWITCH_ITEM, 26 | OUT_OF_ITEMS, OUT_OF_NATURES, END_SCRIPT 27 | ); 28 | 29 | TAlcher = record(TBaseBankScript) 30 | State: EAlcherState; 31 | AlchItem: TRSItem; 32 | NatureRune, Coins: TRSBankItem; 33 | InGE: Boolean; 34 | GEObj: TRSObjectV2; 35 | end; 36 | 37 | procedure TAntiban.Setup(); override; 38 | begin 39 | Self.Skills := [ERSSkill.MAGIC, ERSSkill.TOTAL]; 40 | Self.MinZoom := 10; 41 | Self.MaxZoom := 90; 42 | 43 | inherited; 44 | end; 45 | 46 | procedure TAlcher.Init(maxActions: UInt32; maxTime: UInt64); override; 47 | begin 48 | inherited; 49 | 50 | if WalkGE then 51 | begin 52 | Map.SetupChunk(ERSChunk.VARROCK); 53 | Objects.Setup(Map.Objects(), @Map.Walker); 54 | Self.GEObj := Objects.Get('Grand Exchange booth'); 55 | end; 56 | 57 | if not Magic.IsSpellBook(ERSSpellBook.STANDARD) then 58 | Self.Fatal('Not on Standard Spell Book'); 59 | 60 | Self.NatureRune := TRSBankItem.Setup('Nature rune', Bank.QUANTITY_ALL, False); 61 | Self.Coins := TRSBankItem.Setup('Coins', Bank.QUANTITY_ALL, False); 62 | end; 63 | 64 | function TAlcher.HandleWarning(): Boolean; 65 | begin 66 | if Chat.HasContinue then 67 | Chat.ClickContinue(); 68 | Chat.ClickOption('Cancel the', False); 69 | 70 | if not Magic.Open then 71 | Exit; 72 | 73 | if Magic.ClickSpell(AlchSpell) and ChooseOption.IsOpen() then 74 | ChooseOption.Select('Warnings'); 75 | 76 | WaitUntil(Chat.HasContinue(), 50, 2000); 77 | Chat.ClickContinue(); 78 | WaitUntil(Chat.ClickOption('Set value', False), 50, 3000); 79 | Wait(2000); 80 | Result := Chat.AnswerQuery('Set value threshold for', '50000', 1000); 81 | WaitUntil(Chat.HasContinue, 50, 2000); 82 | Chat.ClickContinue(); 83 | WaitUntil(Chat.ClickOption('Cancel', False), 50, 3000); 84 | Wait(2000); 85 | end; 86 | 87 | function TAlcher.CastAlchemy(attempts: Int32 = 0): Boolean; 88 | begin 89 | Result := RSAlchHandler.CastAlchemy(AlchSpell = ERSSpell.HIGH_LEVEL_ALCHEMY, True); 90 | 91 | if Chat.HasContinue() then 92 | Self.HandleWarning(); 93 | 94 | if attempts > 5 then 95 | TerminateScript('Can''t cast alchemy for some reason.'); 96 | if not Result and RSClient.IsLoggedIn() then 97 | Self.CastAlchemy(Inc(attempts)); 98 | 99 | if Result then 100 | Self.TotalActions += 1; 101 | end; 102 | 103 | 104 | function TAlcher.Terminate(): Boolean; override; 105 | begin 106 | Result := True; 107 | end; 108 | 109 | 110 | function TAlcher.GetState(): EAlcherState; 111 | begin 112 | if WL.Activity.IsFinished() then 113 | Exit(EAlcherState.END_SCRIPT); 114 | 115 | if RSAlchHandler.Disabled then 116 | Exit(EAlcherState.OUT_OF_ITEMS); 117 | 118 | if ChooseOption.IsOpen() then 119 | Exit(EAlcherState.CLOSE_CONTEXT); 120 | 121 | if RSInterface.IsOpen() then 122 | begin 123 | if Bank.IsOpen() then 124 | begin 125 | if not Inventory.ContainsItem('Nature rune') then 126 | Exit(EAlcherState.WITHDRAW_NATS); 127 | 128 | if not Inventory.ContainsItem('Coins') then 129 | Exit(EAlcherState.WITHDRAW_MONEY); 130 | 131 | Exit(EAlcherState.CLOSE_INTERFACE); 132 | end; 133 | 134 | if CollectBox.IsOpen() then 135 | begin 136 | if Self.CollectEmpty then 137 | Exit(EAlcherState.CLOSE_INTERFACE); 138 | Exit(EAlcherState.HANDLE_COLLECT); 139 | end; 140 | 141 | Exit(EAlcherState.CLOSE_INTERFACE); 142 | end; 143 | 144 | if WalkGE and not Self.InGE then 145 | begin 146 | Self.InGE := Map.InRange(Self.GEObj.Coordinates, 30); 147 | if not Self.InGE then 148 | Exit(EAlcherState.WALK_ALCH); 149 | end; 150 | 151 | if RSAlchHandler.Timer.TimeRemaining() >= Random(300, 1800) then 152 | Exit(EAlcherState.WAIT_ALCH); 153 | 154 | Result := EAlcherState.CAST_ALCHEMY; 155 | end; 156 | 157 | procedure TAlcher.Run(maxActions: UInt32; maxTime: UInt64); 158 | begin 159 | Self.Init(maxActions, maxTime); 160 | 161 | repeat 162 | State := Self.GetState(); 163 | Self.SetAction(ToStr(State)); 164 | 165 | case Self.State of 166 | EAlcherState.WALK_ALCH: InGe := Map.Walker.WebWalk(Self.GEObj.Coordinates, 10, 0.2); 167 | 168 | EAlcherState.OPEN_BANK: Banks.WalkOpen(); 169 | EAlcherState.WITHDRAW_NATS: Self.Withdraw(Self.NatureRune); 170 | EAlcherState.WITHDRAW_MONEY: Self.Withdraw(Self.Coins); 171 | 172 | EAlcherState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 173 | EAlcherState.HANDLE_COLLECT: Self.HandleCollectBox(['Coins', 'Nature rune']); 174 | EAlcherState.CLOSE_INTERFACE: RSInterface.Close(); 175 | 176 | EAlcherState.WAIT_ALCH: Wait(100); 177 | EAlcherState.CAST_ALCHEMY: Self.CastAlchemy(); 178 | 179 | EAlcherState.CLOSE_CONTEXT: ChooseOption.Close(); 180 | 181 | EAlcherState.END_SCRIPT: Break; 182 | end; 183 | 184 | Self.DoAntiban(); 185 | until Self.ShouldStop(); 186 | 187 | if not Self.Terminate() then 188 | Self.Fatal('Didn''t terminate properly. Stopping execution.'); 189 | end; 190 | 191 | var 192 | Alcher: TAlcher; 193 | 194 | {$IFNDEF SCRIPT_CHAIN} 195 | {$IFDEF SCRIPT_GUI} 196 | type 197 | TAlcherConfig = record(TScriptForm) 198 | AlchSelector: TLabeledCombobox; 199 | IgnoreProfit: TLabeledCheckbox; 200 | WalkGECheckbox: TLabeledCheckbox; 201 | CustomItemSelector: TLabeledEdit; 202 | end; 203 | 204 | procedure TAlcherConfig.StartScript(sender: TObject); override; 205 | begin 206 | case Self.AlchSelector.GetItemIndex() of 207 | 0: AlchSpell := ERSSpell.HIGH_LEVEL_ALCHEMY; 208 | 1: AlchSpell := ERSSpell.LOW_LEVEL_ALCHEMY; 209 | end; 210 | 211 | LossProtection := Self.IgnoreProfit.IsChecked(); 212 | WalkGE := Self.WalkGECheckbox.IsChecked(); 213 | 214 | inherited; 215 | end; 216 | 217 | procedure TAlcherConfig.Run(); override; 218 | var 219 | tab: TTabSheet; 220 | begin 221 | Self.Setup('Wasp Alcher'); 222 | Self.Start.setOnClick(@Self.StartScript); 223 | 224 | Self.AddTab('Script Settings'); 225 | tab := Self.Tabs[High(Self.Tabs)]; 226 | 227 | Self.CreateAccountManager(tab); 228 | 229 | with Self.AlchSelector do 230 | begin 231 | Create(tab); 232 | SetCaption('Alchemy spell:'); 233 | SetLeft(TControl.AdjustToDPI(20)); 234 | SetTop(TControl.AdjustToDPI(200)); 235 | Combobox.setStyle(csDropDownList); 236 | Combobox.getItems.Add('High alchemy'); 237 | Combobox.getItems.Add('Low alchemy'); 238 | Combobox.setItemIndex(0); 239 | end; 240 | 241 | with Self.IgnoreProfit do 242 | begin 243 | Create(tab); 244 | SetCaption('Prevent loss'); 245 | SetLeft(Self.AlchSelector.GetRight() + TControl.AdjustToDPI(20)); 246 | SetTop(Self.AlchSelector.GetTop() + TControl.AdjustToDPI(17)); 247 | SetChecked(LossProtection); 248 | end; 249 | 250 | with Self.WalkGECheckbox do 251 | begin 252 | Create(tab); 253 | SetCaption('Walk to GE (Varrock only)'); 254 | SetLeft(Self.IgnoreProfit.GetRight() + TControl.AdjustToDPI(20)); 255 | SetTop(Self.IgnoreProfit.GetTop()); 256 | SetChecked(WalkGE); 257 | end; 258 | 259 | Self.CreateAlchemyPanel(); 260 | Self.CreateAntibanManager(); 261 | Self.CreateWaspLibSettings(); 262 | Self.CreateAPISettings(); 263 | 264 | inherited; 265 | end; 266 | 267 | var 268 | AlcherConfig: TAlcherConfig; 269 | {$ENDIF} 270 | {$ENDIF} 271 | 272 | {$IFNDEF SCRIPT_CHAIN} 273 | begin 274 | {$IFDEF SCRIPT_GUI} 275 | AlcherConfig.Run(); 276 | {$ENDIF} 277 | Alcher.Run(WLSettings.MaxActions, WLSettings.MaxTime); 278 | end. 279 | {$ENDIF} 280 | -------------------------------------------------------------------------------- /wasp_chompy_hunter.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '7c40c4ac-0009-4a08-ab61-4887d9456420'} 2 | {$DEFINE SCRIPT_REVISION := '33'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | {$I WaspLib/optional/handlers/combathandler.simba} 7 | 8 | type 9 | EChompyState = ( 10 | WAIT_STATE, WAIT_COMBAT, FILL_TOAD, FILL_BELLOWS, PLACE_TOAD, CLICK_CHOMPY 11 | ); 12 | 13 | TChompyHunter = record(TBaseWalkerScript) 14 | State: EChompyState; 15 | Chompy, Toad: TRSNPCV2; 16 | Bubbles: TRSObjectV2; 17 | OgreBellows: TRSItemArray; 18 | FillingBellows: Boolean; 19 | end; 20 | 21 | procedure TAntiban.Setup(); override; 22 | begin 23 | Self.Skills := [ERSSkill.TOTAL, ERSSkill.RANGE]; 24 | Self.MinZoom := 5; 25 | Self.MaxZoom := 35; 26 | 27 | inherited; 28 | end; 29 | 30 | procedure TChompyHunter.Init(maxActions: UInt32; maxTime: UInt64); override; 31 | var 32 | chompy: TRSNPCV2; 33 | begin 34 | inherited; 35 | 36 | ItemFinder.Similarity := 0.9999; 37 | Map.SetupChunk(Chunk(Box(36,48,38,47), 0)); 38 | Objects.Setup(Map.Objects(), @Map.Walker); 39 | 40 | chompy := TRSNPCV2.Setup(70, 4, [[5488, 38238]]); 41 | chompy.SetupUpText('Chompy bird'); 42 | chompy.Finder.Colors := [ 43 | CTS2(8557684, 13, 0.06, 0.32), 44 | CTS2(10603982, 11, 0.04, 0.58) 45 | ]; 46 | chompy.Walker := @Map.Walker; 47 | 48 | CombatHandler.Setup(chompy, 2000); 49 | 50 | Self.Toad.SetupEx(40, [0.5, 0.5, 0], [[5488, 38238]]); 51 | Self.Toad.SetupUpText(['Inflate', 'Swamp', 'toad']); 52 | Self.Toad.Finder.Colors += CTS2(3373670, 17, 0.02, 0.10); 53 | Self.Toad.Walker := @Map.Walker; 54 | 55 | Self.Bubbles := Objects.Get('Swamp bubbles'); 56 | Self.Bubbles.Finder.Colors := [CTS2(5464637, 3, 0.23, 0.28)]; 57 | 58 | Self.OgreBellows := ['Ogre bellows (3)', 'Ogre bellows (2)', 'Ogre bellows (1)']; 59 | 60 | Options.SetNPCAttackOption(ERSAttackOption.ALWAYS_LEFT_CLICK); 61 | end; 62 | 63 | 64 | function TChompyHunter.CountBellows(): Int32; 65 | begin 66 | Result := Inventory.CountItem('Ogre bellows (3)') + 67 | Inventory.CountItem('Ogre bellows (2)') + 68 | Inventory.CountItem('Ogre bellows (1)'); 69 | end; 70 | 71 | function TChompyHunter.FillBellows(): Boolean; 72 | var 73 | InvCount: Int32 := Self.CountBellows(); 74 | TempCount: Int32; 75 | begin 76 | if Self.Bubbles.WalkClick() then 77 | begin 78 | Minimap.WaitMoving(); 79 | Result := WaitUntil(InvCount <> (TempCount := Self.CountBellows), 100, 5000); 80 | end; 81 | 82 | if Result then 83 | while Inventory.ContainsItem('Ogre bellows') do 84 | begin 85 | InvCount := TempCount; 86 | if not WaitUntil(InvCount <> (TempCount := Self.CountBellows), 100, 5000) then 87 | Break; 88 | end; 89 | end; 90 | 91 | 92 | function TChompyHunter.MoveAround(): Boolean; 93 | var 94 | MinimapTPA: TPointArray; 95 | SwampTPA: TPointArray; 96 | P: TPoint; 97 | FinalTPA: TPointArray; 98 | MMDots: TPointArray; 99 | begin 100 | MinimapTPA := Minimap.Polygon.Connect(); 101 | MinimapTPA.Fill(); 102 | MinimapTPA := MinimapTPA.Erode(3); 103 | 104 | SRL.FindColors(SwampTPA, CTS0(9083745, 0), Minimap.Bounds); 105 | 106 | MMDots := Minimap.GetDots(ERSMinimapDot.NPC).Offset(2, 2); 107 | MMDots := MMDots.Grow(2); 108 | 109 | SwampTPA := SwampTPA + MMDots; 110 | 111 | for P in MinimapTPA do 112 | if SwampTPA.Find(P) = -1 then 113 | FinalTPA += P; 114 | 115 | Mouse.Click(FinalTPA.RandomValue(), MOUSE_LEFT); 116 | 117 | Minimap.WaitMoving(); 118 | Result := not Minimap.HasDotUnder(); 119 | end; 120 | 121 | function TChompyHunter.PlaceToad(): Boolean; 122 | begin 123 | if Minimap.HasDotUnder() then 124 | Self.MoveAround(); 125 | 126 | if Inventory.ClickItem('Bloated toad') then 127 | begin 128 | Wait(1400, 1800); 129 | Result := WaitUntil(not Inventory.ContainsItem('Bloated toad'), 100, 5000); 130 | end; 131 | end; 132 | 133 | function TChompyHunter.FillToad(): Boolean; 134 | var 135 | count: Int32; 136 | begin 137 | count := Inventory.Count(); 138 | 139 | if Self.Toad.WalkClick(True, 10) then 140 | begin 141 | Minimap.WaitMoving(); 142 | Result := WaitUntil(count < Inventory.Count(), 300, 5000); 143 | end; 144 | 145 | if Result then 146 | Self.PlaceToad(); 147 | end; 148 | 149 | 150 | function TChompyHunter.ClickedChompy(featherCount: Int32): Boolean; 151 | begin 152 | Result := MainScreen.InCombat() or (featherCount < Inventory.CountItemStack('Feather')); 153 | end; 154 | 155 | function TChompyHunter.ClickChompy(): Boolean; 156 | var 157 | featherCount: Int32; 158 | begin 159 | if CombatHandler.Monster.WalkSelectOption(['Attack', 'Pluck']) then 160 | begin 161 | featherCount := Inventory.CountItemStack('Feather'); 162 | Minimap.WaitMoving(); 163 | Result := WaitUntil(Self.ClickedChompy(featherCount) or MainScreen.InCombat(), 100, 3000); 164 | end; 165 | 166 | if Result then TotalActions += 1; 167 | end; 168 | 169 | 170 | 171 | function TChompyHunter.GetState(): EChompyState; 172 | begin 173 | if Self.FillingBellows then 174 | begin 175 | if Self.FillingBellows := Inventory.ContainsItem('Ogre bellows') then 176 | Exit(EChompyState.WAIT_STATE); 177 | 178 | Exit(EChompyState.WAIT_STATE); 179 | end; 180 | 181 | if Inventory.ContainsItem('Bloated toad') then 182 | Exit(EChompyState.PLACE_TOAD); 183 | 184 | if MainScreen.InCombat() then 185 | Exit(EChompyState.WAIT_COMBAT); 186 | 187 | if CombatHandler.Monster.IsVisible() then 188 | Exit(EChompyState.CLICK_CHOMPY); 189 | 190 | if Inventory.ContainsAny(OgreBellows) then 191 | Exit(EChompyState.FILL_TOAD); 192 | 193 | Exit(EChompyState.FILL_BELLOWS); 194 | end; 195 | 196 | procedure TChompyHunter.Run(maxActions: UInt32; maxTime: UInt64); 197 | begin 198 | Self.Init(maxActions, maxTime); 199 | 200 | repeat 201 | Self.State := Self.GetState(); 202 | Self.SetAction(ToStr(Self.State)); 203 | 204 | case Self.State of 205 | EChompyState.WAIT_STATE: Wait(1200, 2400); 206 | EChompyState.WAIT_COMBAT: WaitUntil(not MainScreen.WaitInCombat(2400), 100, 5000); 207 | EChompyState.FILL_TOAD: Self.FillToad(); 208 | EChompyState.FILL_BELLOWS: Self.FillBellows(); 209 | EChompyState.PLACE_TOAD: Self.PlaceToad(); 210 | EChompyState.CLICK_CHOMPY: Self.ClickChompy(); 211 | end; 212 | 213 | Self.DoAntiban(); 214 | until Self.ShouldStop(); 215 | end; 216 | 217 | 218 | var 219 | ChompyHunter: TChompyHunter; 220 | 221 | function TRSMainScreen.InCombat(): Boolean; override; 222 | begin 223 | if Self.FindDepletedHPBar then 224 | Exit(False); 225 | 226 | Result := (CombatHandler.IsSetup and not CombatHandler.InCombatTimer.IsFinished()) 227 | or XPBar.EarnedXP or (Self.FindHitsplats <> []); 228 | end; 229 | 230 | {$IFDEF SCRIPT_GUI} 231 | type 232 | TChompyHunterConfig = record(TScriptForm) 233 | ChompyHunterInfo: TLabel; 234 | end; 235 | 236 | procedure TChompyHunterConfig.Run(); override; 237 | var 238 | tab: TTabSheet; 239 | begin 240 | Self.Setup('Wasp Chompy Hunter'); 241 | Self.Start.SetOnClick(@Self.StartScript); 242 | 243 | Self.AddTab('Script Settings'); 244 | tab := Self.Tabs[High(Self.Tabs)]; 245 | 246 | Self.CreateAccountManager(tab); 247 | 248 | with Self.ChompyHunterInfo do 249 | begin 250 | Create(tab); 251 | 252 | SetCaption('Have ogre bellows in your inventory and an ogre bow/arrows equipped.' + 253 | LineEnding + 254 | 'Start south of castle wars, in the middle pools close to the smoke dungeon.' + 255 | LineEnding + LineEnding + 256 | 'This is a simple script only meant to get the job done!' + 257 | LineEnding + 258 | 'It''s probably a good idea to baby sit!'); 259 | 260 | SetLeft(TControl.AdjustToDPI(50)); 261 | SetTop(TControl.AdjustToDPI(200)); 262 | end; 263 | 264 | Self.CreateAntibanManager(); 265 | Self.CreateWaspLibSettings(); 266 | Self.CreateAPISettings(); 267 | 268 | inherited; 269 | end; 270 | 271 | var 272 | ChompyHunterConfig: TChompyHunterConfig; 273 | {$ENDIF} 274 | 275 | begin 276 | {$IFDEF SCRIPT_GUI} 277 | ChompyHunterConfig.Run(); 278 | {$ENDIF} 279 | ChompyHunter.Run(WLSettings.MaxActions, WLSettings.MaxTime); 280 | end. 281 | -------------------------------------------------------------------------------- /wasp_stall_robber.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '2c9e42f7-cb23-4976-827f-9ffe112a0c3f'} 2 | {$DEFINE SCRIPT_REVISION := '28'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | 7 | type 8 | ERSStall = (TEA_STALL, FOOD_STALL, SILK_STALL, FRUIT_STALL); 9 | var 10 | CurrentStall: ERSStall = ERSStall.FRUIT_STALL; 11 | UseBank: Boolean = True; 12 | 13 | type 14 | EStallRobberState = ( 15 | FIND_STALL, 16 | LEVELED_UP, 17 | ROB_STALL, 18 | DROP_LOOT, OPEN_BANK, DEPOSIT_ITEMS, CLOSE_INTERFACE, 19 | WALK_SPOT, 20 | WAIT_STATE, 21 | END_SCRIPT 22 | ); 23 | 24 | TStallRobber = record(TBaseWalkerScript) 25 | State: EStallRobberState; 26 | 27 | Stall: TRSObjectV2; 28 | SafeSpot: TPoint; 29 | StealList, DropList: TRSItemArray; 30 | StallCooldown: TCountDown; 31 | end; 32 | 33 | procedure TAntiban.Setup(); override; 34 | begin 35 | Self.Skills := [ERSSkill.THIEVING, ERSSkill.TOTAL]; 36 | Self.MinZoom := 5; 37 | Self.MaxZoom := 85; 38 | 39 | inherited; 40 | end; 41 | 42 | procedure TStallRobber.SetupStall(); 43 | begin 44 | case CurrentStall of 45 | ERSStall.TEA_STALL: 46 | begin 47 | Map.SetupChunk([[50,54,51,52], [0]]); 48 | Objects.Setup(Map.Objects(), @Map.Walker); 49 | 50 | Self.Stall.Walker := @Map.Walker; 51 | Self.Stall.SetupEx([1.5, 2, 4], [[8983, 36786]]); 52 | Self.Stall.SetupUpText('Tea stall'); 53 | Self.Stall.Finder.Colors += CTS2(9939895, 8, 0.07, 0.64); 54 | Self.StallCooldown.Init(7000); 55 | Self.SafeSpot := [8976, 36790]; 56 | Self.StealList := ['Cup of tea']; 57 | end; 58 | 59 | ERSStall.FOOD_STALL: 60 | begin 61 | GENERATED_GRAPH.Spacing := 14; 62 | Map.SetupChunk([[40,52,42,51], [0]]); 63 | Objects.Setup(Map.Objects(), @Map.Walker); 64 | 65 | Self.Stall.Walker := @Map.Walker; 66 | Self.Stall.SetupEx([1.5, 2, 4], [[6574, 37185]]); 67 | Self.Stall.SetupUpText('Baker''s stall'); 68 | Self.Stall.Finder.Colors += CTS2(9216171, 8, 0.10, 0.67); 69 | 70 | Self.StallCooldown.Init(7000); 71 | Self.SafeSpot := [6580, 37190]; 72 | Self.StealList := ['Bread', 'Cake', 'Chocolate slice']; 73 | Self.DropList := ['Bread', 'Chocolate slice']; 74 | end; 75 | 76 | ERSStall.SILK_STALL: 77 | begin 78 | GENERATED_GRAPH.Spacing := 14; 79 | Map.SetupChunk([[40,52,42,51], [0]]); 80 | Objects.Setup(Map.Objects(), @Map.Walker); 81 | 82 | Self.Stall.Walker := @Map.Walker; 83 | Self.Stall.SetupEx([2, 1.5, 4], [[6554, 37172]]); 84 | Self.Stall.SetupUpText('Silk stall'); 85 | Self.Stall.Finder.Colors += CTS2(9939895, 8, 0.07, 0.64); 86 | Self.StallCooldown.Init(5000); 87 | Self.SafeSpot := [6552, 37166]; 88 | Self.StealList := ['Silk']; 89 | end; 90 | 91 | ERSStall.FRUIT_STALL: 92 | begin 93 | Map.SetupChunk([[27,56,28,55], [0]]); 94 | Map.Loader.Graph.UseCollisionData := True; 95 | Map.Walker._DoorHandler.Enabled := True; 96 | 97 | Objects.Setup(Map.Objects(), @Map.Walker); 98 | 99 | Self.Stall.Walker := @Map.Walker; 100 | Self.Stall.SetupEx([1.5, 2, 4], [[3084, 36000], [3108, 36000]]); 101 | Self.Stall.SetupUpText('Fruit Stall'); 102 | Self.Stall.Finder.Colors += CTS2(3566426, 9, 0.19, 1.19); 103 | Self.Stall.Finder.Colors += CTS2(8687792, 14, 0.12, 0.65); 104 | Self.Stall.Finder.Colors += CTS2(2568331, 19, 0.03, 0.29); 105 | Self.Stall.Finder.ColorClusters += [CTS2(1666610, 20, 0.33, 2), CTS2(4805477, 11, 0.04, 0.48), 5]; 106 | Self.StallCooldown.Init(2400); 107 | Self.StealList := [ 108 | 'Cooking apple', 'Banana', 'Jangerberries', 'Lemon', 'Redberries', 109 | 'Pineapple', 'Lime', 'Strawberry', 'Strange fruit', 110 | 'Papaya fruit', 'Golovanova fruit top' 111 | ]; 112 | Self.DropList := [ 113 | 'Cooking apple', 'Banana', 'Jangerberries', 114 | 'Lemon', 'Redberries', 'Pineapple', 'Lime' 115 | ]; 116 | end; 117 | end; 118 | end; 119 | 120 | procedure TStallRobber.Init(maxActions: UInt32; maxTime: UInt64); override; 121 | begin 122 | inherited; 123 | 124 | Self.SetupStall(); 125 | Self.StallCooldown.Timeout := GetTickCount(); 126 | end; 127 | 128 | 129 | function TStallRobber.RobStall(): Boolean; 130 | begin 131 | if Stall.WalkClick() then 132 | Result := XPBar.WaitXP(2000); 133 | 134 | if Result then 135 | begin 136 | StallCooldown.Restart(-200, 200); 137 | WL.Activity.Restart(); 138 | end; 139 | end; 140 | 141 | function TStallRobber.DropItems(): Boolean; 142 | var 143 | slots: TIntegerArray; 144 | begin 145 | if UseBank then 146 | Inventory.FindItems(Self.DropList, slots) 147 | else 148 | Inventory.FindItems(Self.StealList, slots); 149 | 150 | Result := Inventory.ShiftDrop(slots, Inventory.RandomPattern()); 151 | 152 | if Result then 153 | begin 154 | Self.TotalActions += Length(slots); 155 | Self.StallCooldown.Timeout := GetTickCount(); 156 | end; 157 | end; 158 | 159 | function TStallRobber.BankItems(): Boolean; 160 | var 161 | count: Int32; 162 | begin 163 | count := Inventory.Count(); 164 | Result := Bank.DepositAll(); 165 | if Result then 166 | Self.TotalActions += (count - Inventory.Count()); 167 | end; 168 | 169 | 170 | function TStallRobber.GetState(): EStallRobberState; 171 | begin 172 | if WL.Activity.IsFinished() then 173 | Exit(EStallRobberState.END_SCRIPT); 174 | 175 | if Chat.LeveledUp() then 176 | Exit(EStallRobberState.LEVELED_UP); 177 | 178 | if RSInterface.IsOpen() then 179 | begin 180 | if UseBank and Bank.IsOpen() and Inventory.ContainsAny(Self.StealList) then 181 | Exit(EStallRobberState.DEPOSIT_ITEMS); 182 | 183 | Exit(EStallRobberState.CLOSE_INTERFACE); 184 | end; 185 | 186 | if Inventory.IsFull() then 187 | begin 188 | if Inventory.ContainsAny(Self.DropList) then 189 | Exit(EStallRobberState.DROP_LOOT); 190 | 191 | if UseBank then 192 | Exit(EStallRobberState.OPEN_BANK); 193 | 194 | Exit(EStallRobberState.DROP_LOOT); 195 | end; 196 | 197 | if MainScreen.IsUpText('Steal-from') then 198 | Exit(EStallRobberState.ROB_STALL); 199 | 200 | if not Self.StallCooldown.IsFinished() then 201 | Exit(EStallRobberState.WAIT_STATE); 202 | 203 | if (Self.SafeSpot <> []) and not Map.InRange(Self.SafeSpot, 5) then 204 | Exit(EStallRobberState.WALK_SPOT); 205 | 206 | if Map.InRange(Self.Stall.Coordinates, 14) then 207 | Exit(EStallRobberState.FIND_STALL); 208 | end; 209 | 210 | procedure TStallRobber.Run(maxActions: UInt32; maxTime: UInt64); 211 | begin 212 | Self.Init(maxActions, maxTime); 213 | 214 | repeat 215 | Self.State := Self.GetState(); 216 | Self.SetAction(ToStr(Self.State)); 217 | 218 | case Self.State of 219 | EStallRobberState.LEVELED_UP: if Chat.HandleLevelUp() then Self.StallCooldown.Timeout := GetTickCount(); 220 | EStallRobberState.DROP_LOOT: Self.DropItems(); 221 | EStallRobberState.FIND_STALL, ROB_STALL: Self.RobStall(); 222 | EStallRobberState.WAIT_STATE: Wait(100, 200); 223 | EStallRobberState.WALK_SPOT: Map.Walker.WebWalk(Self.SafeSpot, 3, 0.2); 224 | 225 | EStallRobberState.OPEN_BANK: Banks.WalkOpen(); 226 | EStallRobberState.DEPOSIT_ITEMS: Self.BankItems(); 227 | EStallRobberState.CLOSE_INTERFACE: RSInterface.Close(); 228 | 229 | EStallRobberState.END_SCRIPT: Break; 230 | end; 231 | 232 | if Self.DoAntiban() then 233 | Self.StallCooldown.Timeout := GetTickCount(); 234 | until Self.ShouldStop(); 235 | end; 236 | 237 | var 238 | StallRobber: TStallRobber; 239 | 240 | {$IFDEF SCRIPT_GUI} 241 | type 242 | TStallRobberConfig = record(TScriptForm) 243 | StallSelector: TLabeledCombobox; 244 | BankCheckbox: TLabeledCheckBox; 245 | Config: TConfigJSON; 246 | end; 247 | 248 | procedure TStallRobberConfig.StartScript(sender: TObject); override; 249 | begin 250 | CurrentStall := ERSStall(Self.StallSelector.GetItemIndex()); 251 | UseBank := Self.BankCheckbox.IsChecked(); 252 | 253 | Self.Config.Put('stall', Self.StallSelector.GetItemIndex()); 254 | Self.Config.Put('bank', UseBank); 255 | 256 | inherited; 257 | end; 258 | 259 | procedure TStallRobberConfig.Run(); override; 260 | var 261 | tab: TTabSheet; 262 | begin 263 | Self.Config.Setup('wasp-stall-robber'); 264 | Self.Setup('Wasp Stall Robber'); 265 | Self.Start.SetOnClick(@Self.StartScript); 266 | 267 | Self.AddTab('Script Settings'); 268 | tab := Self.Tabs[High(Self.Tabs)]; 269 | 270 | Self.CreateAccountManager(tab); 271 | 272 | with Self.StallSelector do 273 | begin 274 | Create(tab); 275 | SetCaption('Stall:'); 276 | SetLeft(TControl.AdjustToDPI(20)); 277 | SetTop(TControl.AdjustToDPI(200)); 278 | SetWidth(TControl.AdjustToDPI(300)); 279 | SetStyle(csDropDownList); 280 | AddItemArray([ 281 | 'Tea stall (East Varrock)', 282 | 'Food stall (Ardougne market)', 283 | 'Silk stall (Ardougne market, safe spot knights!)', 284 | 'Fruit stall (Hosidius east of the market)' 285 | ]); 286 | if Self.Config.Has('stall') then 287 | SetItemIndex(Self.Config.GetInt('stall')) 288 | else 289 | SetItemIndex(Ord(CurrentStall)); 290 | end; 291 | 292 | with Self.BankCheckbox do 293 | begin 294 | Create(tab); 295 | SetCaption('Bank loot'); 296 | SetLeft(TControl.AdjustToDPI(20)); 297 | SetTop(TControl.AdjustToDPI(260)); 298 | if Self.Config.Has('bank') then 299 | SetChecked(Self.Config.GetBoolean('bank')) 300 | else 301 | SetChecked(UseBank); 302 | end; 303 | 304 | Self.CreateAntibanManager(); 305 | Self.CreateWaspLibSettings(); 306 | Self.CreateAPISettings(); 307 | 308 | inherited; 309 | end; 310 | 311 | var 312 | StallRobberConfig: TStallRobberConfig; 313 | {$ENDIF} 314 | 315 | begin 316 | {$IFDEF SCRIPT_GUI} 317 | StallRobberConfig.Run(); 318 | {$ENDIF} 319 | StallRobber.Run(WLSettings.MaxActions, WLSettings.MaxTime); 320 | end. 321 | -------------------------------------------------------------------------------- /wasp_sawmill_runner.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'b6feb67b-9949-45f4-a175-e92f219dfa46'} 2 | {$DEFINE SCRIPT_REVISION := '19'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | 7 | type 8 | ERSPlankType = ( 9 | NORMAL, OAK, TEAK, MAHOGANY 10 | ); 11 | 12 | var 13 | CurrentTask: ERSPlankType := ERSPlankType.TEAK; 14 | 15 | type 16 | ESawmillRunnerState = ( 17 | WAIT_STATE, 18 | 19 | OPEN_BANK, 20 | WITHDRAW_ITEMS, 21 | DEPOSIT_ITEMS, 22 | DEPOSIT_RANDOM_ITEMS, 23 | OPEN_COLLECT, 24 | HANDLE_COLLECT, 25 | CLOSE_INTERFACE, 26 | 27 | TELEPORT_SAWMILL, 28 | TELEPORT_GE, 29 | BUY_PLANKS, 30 | HANDLE_MAKE, 31 | 32 | OUT_OF_SUPPLIES, 33 | END_SCRIPT 34 | ); 35 | 36 | TSawmillRunner = record(TBaseBankScript) 37 | State: ESawmillRunnerState; 38 | Coins, Plank, Ring: TRSItem; 39 | Logs: TRSBankItem; 40 | NeededItems: TRSItemArray; 41 | RingPosition: (UNKOWN, INV, EQUIP); 42 | TeleportCost: Int32; 43 | ROECost: Int32; 44 | end; 45 | 46 | procedure TAntiban.Setup(); override; 47 | begin 48 | Self.Skills := [ERSSkill.TOTAL]; 49 | Self.MinZoom := 0; 50 | Self.MaxZoom := 20; 51 | 52 | inherited; 53 | end; 54 | 55 | procedure TSawmillRunner.Init(maxActions: UInt32; maxTime: UInt64); override; 56 | var 57 | lawCost, airCost, fireCost: Int32; 58 | begin 59 | inherited; 60 | 61 | Self.RSW.SetupRegions([RSRegions.VARROCK]); 62 | 63 | Self.Coins := 'Coins'; 64 | Self.Ring := 'Ring of the elements'; 65 | 66 | case CurrentTask of 67 | ERSPlankType.NORMAL: 68 | begin 69 | Self.Logs := TRSBankItem.Setup('Logs', Bank.QUANTITY_ALL, False); 70 | Self.Plank := 'Plank'; 71 | Self.ActionProfit := -100; 72 | end; 73 | 74 | ERSPlankType.OAK: 75 | begin 76 | Self.Logs := TRSBankItem.Setup('Oak logs', Bank.QUANTITY_ALL, False); 77 | Self.Plank := 'Oak plank'; 78 | Self.ActionProfit := -250; 79 | end; 80 | 81 | ERSPlankType.TEAK: 82 | begin 83 | Self.Logs := TRSBankItem.Setup('Teak logs', Bank.QUANTITY_ALL, False); 84 | Self.Plank := 'Teak plank'; 85 | Self.ActionProfit := -500; 86 | end; 87 | 88 | ERSPlankType.MAHOGANY: 89 | begin 90 | Self.Logs := TRSBankItem.Setup('Mahogany logs', Bank.QUANTITY_ALL, False); 91 | Self.Plank := 'Mahogany plank'; 92 | Self.ActionProfit := -1500; 93 | end; 94 | end; 95 | 96 | Self.ActionProfit += ItemData.GetAverage(Self.Plank) - ItemData.GetAverage(Self.Logs.Item); 97 | //teleport from spell and ring of the elements prices 98 | lawCost := ItemData.GetAverage('Law rune'); 99 | airCost := ItemData.GetAverage('Air rune'); 100 | fireCost := ItemData.GetAverage('Fire rune'); 101 | 102 | Self.TeleportCost := lawCost + fireCost + airCost * 3; 103 | Self.ROECost := lawCost + fireCost + airCost + 104 | ItemData.GetAverage('Water rune') + 105 | ItemData.GetAverage('Earth rune'); 106 | 107 | Self.NeededItems := [ 108 | Self.Coins, Self.Logs.Item, Self.Ring, 'Law rune', 'Air rune', 'Fire rune', 'Rune pouch', 'Divine rune pouch' 109 | ]; 110 | end; 111 | 112 | 113 | function TSawmillRunner.Deposit(): Boolean; 114 | var 115 | count: Int32; 116 | begin 117 | count := Inventory.CountItem(Self.Plank); 118 | if Bank.DepositItem(Self.Plank, True) then 119 | Result := WaitUntil(not Inventory.ContainsItem(Self.Plank), 200, 4000); 120 | 121 | if Result then 122 | begin 123 | Self.TotalActions += count; 124 | Self.TotalProfit += count * Self.ActionProfit; 125 | WL.Activity.Restart(); 126 | end; 127 | end; 128 | 129 | 130 | function TSawmillRunner.InGE(p: TPoint): Boolean; 131 | begin 132 | Result := p.AnyInRange(RSObjects.GEBank.Coordinates, 200); 133 | end; 134 | 135 | function TSawmillRunner.VarrockTeleport(): Boolean; 136 | begin 137 | if not Magic.CastSpell(ERSSpell.VARROCK_TELEPORT) then 138 | Exit; 139 | 140 | Self.TotalProfit -= Self.TeleportCost; 141 | Result := WaitUntil(Self.InGE(Self.RSW.GetMyPos()), 300, 5000); 142 | end; 143 | 144 | function TSawmillRunner.SawmillTeleport(): Boolean; 145 | var 146 | option: String; 147 | begin 148 | if Self.RingPosition = UNKOWN then 149 | begin 150 | if Inventory.ContainsItem(Self.Ring) then 151 | Self.RingPosition := INV 152 | else if Equipment.ContainsItem(Self.Ring) then 153 | Self.RingPosition := EQUIP 154 | else 155 | TerminateScript('Can''t find the ring of the elements.'); 156 | end; 157 | 158 | case Self.RingPosition of 159 | INV: 160 | begin 161 | if (Self.TotalActions = 0) then 162 | begin 163 | if not Inventory.ClickItem(Self.Ring, 'Rub') then Exit; 164 | if not WaitUntil(Chat.FindOption('Earth'), 300, 4000) then Exit; 165 | Result := Chat.ClickOption('Earth'); 166 | end 167 | else 168 | Result := Inventory.ClickItem(Self.Ring, 'Last'); 169 | end; 170 | 171 | EQUIP: 172 | begin 173 | if (Self.TotalActions = 0) or Antiban.BioDice() then 174 | option := 'Earth' 175 | else 176 | option := 'Last'; 177 | 178 | Result := Equipment.ClickItem(Self.Ring, option); 179 | end; 180 | end; 181 | 182 | if Result then 183 | begin 184 | Self.TotalProfit -= Self.ROECost; 185 | Result := WaitUntil(not Self.InGE(Self.RSW.GetMyPos()), 300, 5000); 186 | end; 187 | end; 188 | 189 | function TSawmillRunner.BuyPlanks(): Boolean; 190 | begin 191 | if RSNPCs.SawmillOperator.WalkSelectOption(['Buy']) then 192 | begin 193 | Minimap.WaitMoving(); 194 | Result := Make.IsOpen(3000); 195 | end; 196 | end; 197 | 198 | function TSawmillRunner.HandleSawmill(): Boolean; 199 | begin 200 | if Make.Select(Ord(CurrentTask), Make.QUANTITY_ALL) then 201 | Result := WaitUntil(Inventory.ContainsItem(Self.Plank), 200, 3000); 202 | end; 203 | 204 | 205 | function TSawmillRunner.GetState(): ESawmillRunnerState; 206 | begin 207 | if WL.Activity.IsFinished() then 208 | Exit(ESawmillRunnerState.END_SCRIPT); 209 | 210 | if RSInterface.IsOpen() then 211 | begin 212 | if not Self.BankEmpty and Bank.IsOpen() then 213 | begin 214 | if Inventory.ContainsItem(Self.Plank) then 215 | Exit(ESawmillRunnerState.DEPOSIT_ITEMS); 216 | 217 | if Inventory.ContainsRandomItems(Self.NeededItems) then 218 | Exit(ESawmillRunnerState.DEPOSIT_RANDOM_ITEMS); 219 | 220 | if not Inventory.IsFull() then 221 | Exit(ESawmillRunnerState.WITHDRAW_ITEMS); 222 | end; 223 | 224 | if not Self.CollectEmpty and CollectBox.IsOpen() then 225 | Exit(ESawmillRunnerState.HANDLE_COLLECT); 226 | 227 | Exit(ESawmillRunnerState.CLOSE_INTERFACE); 228 | end; 229 | 230 | if Inventory.ContainsItem(Self.Plank) or not Inventory.ContainsItem(Self.Logs.Item) then 231 | begin 232 | if Self.InGE(Self.RSW.GetMyPos()) then 233 | begin 234 | if Self.BankEmpty then 235 | begin 236 | if Self.CollectEmpty then 237 | Exit(ESawmillRunnerState.OUT_OF_SUPPLIES); 238 | 239 | Exit(ESawmillRunnerState.OPEN_COLLECT); 240 | end; 241 | 242 | Exit(ESawmillRunnerState.OPEN_BANK); 243 | end; 244 | 245 | Exit(ESawmillRunnerState.TELEPORT_GE); 246 | end; 247 | 248 | if Make.IsOpen() then 249 | Exit(ESawmillRunnerState.HANDLE_MAKE); 250 | 251 | if Inventory.ContainsItem(Self.Logs.Item) then 252 | begin 253 | if Self.InGE(Self.RSW.GetMyPos()) then 254 | Exit(ESawmillRunnerState.TELEPORT_SAWMILL); 255 | 256 | Exit(ESawmillRunnerState.BUY_PLANKS); 257 | end; 258 | 259 | Exit(ESawmillRunnerState.WAIT_STATE); 260 | end; 261 | 262 | procedure TSawmillRunner.Run(maxActions: UInt32; maxTime: UInt64); 263 | begin 264 | Self.Init(maxActions, maxTime); 265 | 266 | repeat 267 | Self.State := Self.GetState(); 268 | Self.SetAction(ToStr(Self.State)); 269 | 270 | case Self.State of 271 | ESawmillRunnerState.WAIT_STATE: Wait(500, 800); 272 | 273 | ESawmillRunnerState.OPEN_BANK: Bank.WalkOpen(); 274 | 275 | ESawmillRunnerState.WITHDRAW_ITEMS: Self.Withdraw(Self.Logs); 276 | ESawmillRunnerState.DEPOSIT_ITEMS: Self.Deposit(); 277 | ESawmillRunnerState.DEPOSIT_RANDOM_ITEMS: Bank.DepositRandomItems(Self.NeededItems); 278 | ESawmillRunnerState.OPEN_COLLECT: CollectBox.WalkOpen(); 279 | ESawmillRunnerState.HANDLE_COLLECT: Self.HandleCollectBox([]); 280 | ESawmillRunnerState.CLOSE_INTERFACE: RSInterface.Close(); 281 | 282 | ESawmillRunnerState.TELEPORT_SAWMILL: Self.SawmillTeleport(); 283 | ESawmillRunnerState.TELEPORT_GE: Self.VarrockTeleport(); 284 | ESawmillRunnerState.BUY_PLANKS: Self.BuyPlanks(); 285 | ESawmillRunnerState.HANDLE_MAKE: Self.HandleSawmill(); 286 | 287 | ESawmillRunnerState.OUT_OF_SUPPLIES, ESawmillRunnerState.END_SCRIPT: Break; 288 | end; 289 | 290 | Self.DoAntiban(); 291 | until Self.ShouldStop(); 292 | end; 293 | 294 | var 295 | SawmillRunner: TSawmillRunner; 296 | 297 | {$IFDEF SCRIPT_GUI} 298 | type 299 | TSawmillRunnerConfig = record(TScriptForm) 300 | PlankSelector: TLabeledCombobox; 301 | Config: TConfigJSON; 302 | end; 303 | 304 | procedure TSawmillRunnerConfig.StartScript(sender: TObject); override; 305 | begin 306 | CurrentTask := ERSPlankType(Self.PlankSelector.GetItemIndex()); 307 | Self.Config.Put('plank', Ord(CurrentTask)); 308 | 309 | inherited; 310 | end; 311 | 312 | procedure TSawmillRunnerConfig.Run(); override; 313 | var 314 | tab: TTabSheet; 315 | begin 316 | Self.Setup('Sawmill runner'); 317 | Self.Config.Setup('wasp-sawmill-runner'); 318 | Self.Start.setOnClick(@Self.StartScript); 319 | 320 | if Self.Config.Has('plank') then 321 | CurrentTask := ERSPlankType(Self.Config.GetInt('plank')); 322 | 323 | Self.AddTab('Script Settings'); 324 | tab := Self.Tabs[High(Self.Tabs)]; 325 | 326 | Self.CreateAccountManager(tab); 327 | 328 | with Self.PlankSelector do 329 | begin 330 | Create(tab); 331 | SetCaption('Plank type:'); 332 | SetLeft(TControl.AdjustToDPI(40)); 333 | SetTop(TControl.AdjustToDPI(170)); 334 | SetStyle(csDropDownList); 335 | AddItemArray(['Normal', 'Oak', 'Teak', 'Mahogany']); 336 | SetItemIndex(Ord(CurrentTask)); 337 | end; 338 | 339 | 340 | Self.CreateAntibanManager(); 341 | Self.CreateWaspLibSettings(); 342 | Self.CreateAPISettings(); 343 | 344 | inherited; 345 | end; 346 | 347 | var 348 | SawmillRunnerConfig: TSawmillRunnerConfig; 349 | {$ENDIF} 350 | 351 | begin 352 | {$IFDEF SCRIPT_GUI} 353 | SawmillRunnerConfig.Run(); 354 | {$ENDIF} 355 | SawmillRunner.Run(WLSettings.MaxActions, WLSettings.MaxTime); 356 | end. 357 | -------------------------------------------------------------------------------- /wasp_offerer.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '4e797d2f-966c-4ef2-bba5-febe1c1b7284'} 2 | {$DEFINE SCRIPT_REVISION := '30'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | 7 | type 8 | ERSRemains = ( 9 | FIENDISH_ASHES, VILE_ASHES, MALICIOUS_ASHES, ABYSSAL_ASHES, INFERNAL_ASHES, 10 | 11 | BABY_BONES, WYRM_BONES, DRAGON_BONES, WYVERN_BONES, DRAKE_BONES, LAVA_BONES, 12 | HYDRA_BONES, DAGANNOTH_BONES, SUPERIOR_BONES 13 | ); 14 | 15 | var 16 | CurrentBank: EBankChunk = EBankChunk.GRAND_EXCHANGE; 17 | CurrentRemains: ERSRemains := ERSRemains.MALICIOUS_ASHES; 18 | 19 | type 20 | EOffererState = ( 21 | OPEN_BANK, 22 | WITHDRAW_WRATH, 23 | WITHDRAW_ALT, 24 | WITHDRAW_REMAINS, 25 | 26 | OPEN_COLLECT, 27 | HANDLE_COLLECT, 28 | 29 | CLOSE_INTERFACE, 30 | 31 | OPEN_MAGIC, 32 | CAST_SPELL, 33 | WAIT_STATE, 34 | HANDLE_LEVEL, 35 | 36 | NO_RUNES, 37 | OUT_OF_SUPPLIES, 38 | END_SCRIPT 39 | ); 40 | 41 | TRemainOfferer = record(TBaseBankScript) 42 | State: EOffererState; 43 | 44 | OfferSpell: ERSSpell; 45 | Remains, WrathRune, AltRune: TRSBankItem; 46 | 47 | RemainsLeft: Int32; 48 | SpellCooldown, NoRunes: Boolean; 49 | end; 50 | 51 | procedure TRemainOfferer.SetupSpell(); 52 | begin 53 | Self.WrathRune := TRSBankItem.Setup('Wrath rune'); 54 | 55 | case CurrentRemains of 56 | ERSRemains.FIENDISH_ASHES..ERSRemains.INFERNAL_ASHES: 57 | begin 58 | Self.OfferSpell := ERSSpell.DEMONIC_OFFERING; 59 | Self.AltRune := TRSBankItem.Setup('Soul rune'); 60 | end; 61 | ERSRemains.BABY_BONES..ERSRemains.SUPERIOR_BONES: 62 | begin 63 | Self.OfferSpell := ERSSpell.SINISTER_OFFERING; 64 | Self.AltRune := TRSBankItem.Setup('Blood rune'); 65 | end; 66 | end; 67 | end; 68 | 69 | procedure TRemainOfferer.SetupRemains(); 70 | begin 71 | case CurrentRemains of 72 | ERSRemains.FIENDISH_ASHES: Self.Remains := TRSBankItem.Setup('Fiendish ashes'); 73 | ERSRemains.VILE_ASHES: Self.Remains := TRSBankItem.Setup('Vile ashes'); 74 | ERSRemains.MALICIOUS_ASHES: Self.Remains := TRSBankItem.Setup('Malicious ashes'); 75 | ERSRemains.ABYSSAL_ASHES: Self.Remains := TRSBankItem.Setup('Abyssal ashes'); 76 | ERSRemains.INFERNAL_ASHES: Self.Remains := TRSBankItem.Setup('Infernal ashes'); 77 | ERSRemains.BABY_BONES: Self.Remains := TRSBankItem.Setup('Babydragon bones'); 78 | ERSRemains.WYRM_BONES: Self.Remains := TRSBankItem.Setup('Wyrm bones'); 79 | ERSRemains.DRAGON_BONES: Self.Remains := TRSBankItem.Setup('Dragon bones'); 80 | ERSRemains.WYVERN_BONES: Self.Remains := TRSBankItem.Setup('Wyvern bones'); 81 | ERSRemains.DRAKE_BONES: Self.Remains := TRSBankItem.Setup('Drake bones'); 82 | ERSRemains.LAVA_BONES: Self.Remains := TRSBankItem.Setup('Lava dragon bones'); 83 | ERSRemains.HYDRA_BONES: Self.Remains := TRSBankItem.Setup('Hydra bones'); 84 | ERSRemains.DAGANNOTH_BONES: Self.Remains := TRSBankItem.Setup('Dagannoth bones'); 85 | ERSRemains.SUPERIOR_BONES: Self.Remains := TRSBankItem.Setup('Superior dragon bones'); 86 | end; 87 | 88 | Self.ActionProfit -= ItemData.GetAverage(Self.Remains.Item) * 3; 89 | Self.ActionProfit -= ItemData.GetAverage(Self.WrathRune.Item); 90 | Self.ActionProfit -= ItemData.GetAverage(Self.AltRune.Item); 91 | end; 92 | 93 | procedure TRemainOfferer.Init(maxActions: UInt32; maxTime: UInt64); override; 94 | begin 95 | Antiban.Skills := [ERSSkill.PRAYER, ERSSkill.TOTAL]; 96 | Antiban.MinZoom := 10; 97 | Antiban.MaxZoom := 90; 98 | 99 | inherited; 100 | 101 | Map.SetupChunk(CurrentBank.Get()); 102 | Objects.Setup(Map.Objects(), @Map.Walker); 103 | NPCs.Setup(Map.NPCs(), @Map.Walker); 104 | 105 | Self.SetupSpell(); 106 | Self.SetupRemains(); 107 | end; 108 | 109 | 110 | function TRemainOfferer.CanCast(): Boolean; 111 | begin 112 | if Inventory.IsOpen() then 113 | Result := Inventory.ContainsAll([Self.WrathRune.Item, Self.AltRune.Item]) 114 | else if not Self.SpellCooldown and Magic.IsOpen() then 115 | Result := WaitUntil(Magic.CanActivate(Self.OfferSpell), 300, 7000) 116 | else 117 | Result := True; 118 | end; 119 | 120 | function TRemainOfferer.CastSpell(): Boolean; 121 | begin 122 | Result := Magic.CastSpell(Self.OfferSpell); 123 | 124 | if Result then 125 | WL.Activity.Restart(); 126 | 127 | Self.SpellCooldown := True; 128 | 129 | Self.RemainsLeft -= 3; 130 | Self.TotalActions += 1; 131 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 132 | 133 | end; 134 | 135 | procedure TRemainOfferer.WaitCoolDown(); 136 | begin 137 | case Random(0, 500) of 138 | 0: 139 | begin 140 | if not WLSettings.Antiban.Chat then Exit 141 | else if (Random(20) <= 17) then Antiban.RandomChatButton() 142 | else Antiban.RandomChatButtonState(); 143 | end; 144 | 145 | 1..5: 146 | begin 147 | if not WLSettings.Antiban.Camera then Exit 148 | else if (Random(10) <= 3) then Antiban.RandomRotate(); 149 | end; 150 | 151 | 6..10: 152 | begin 153 | if not WLSettings.Antiban.Mouse then Exit 154 | else if (Random(10) <= 3) then Antiban.RandomRightClick() 155 | else Antiban.SmallRandomMouse(); 156 | end; 157 | 158 | 10, 14: 159 | begin 160 | if not WLSettings.Antiban.GameTabs then Exit 161 | else if (Random(10) <= 9) then Antiban.RandomTab() 162 | else Antiban.CheckCharges(); 163 | end; 164 | else 165 | begin 166 | Self.SpellCooldown := not WaitUntil(Magic.CanActivate(Self.OfferSpell), 300, 7000); 167 | 168 | if Chat.LeveledUp() then 169 | Exit; 170 | 171 | if SpellCooldown then 172 | begin 173 | Inventory.Open(); 174 | if Magic.Open() then 175 | Self.NoRunes := not WaitUntil(Magic.CanActivate(Self.OfferSpell), 300, 7000); 176 | end; 177 | 178 | if Self.NoRunes then 179 | SaveScreenshot('offerer' + DIRECTORYSEPARATOR + 'norunes'); 180 | Wait(0, 2400, EWaitDir.wdLeft); 181 | end; 182 | end; 183 | end; 184 | 185 | 186 | function TRemainOfferer.GetState(): EOffererState; 187 | begin 188 | if WL.Activity.IsFinished() then 189 | Exit(EOffererState.END_SCRIPT); 190 | 191 | if Self.NoRunes then 192 | Exit(EOffererState.NO_RUNES); 193 | 194 | if RSInterface.IsOpen() then 195 | begin 196 | Self.SpellCooldown := False; 197 | 198 | if Bank.IsOpen() then 199 | begin 200 | if not Inventory.ContainsItem(Self.WrathRune.Item) then 201 | Exit(EOffererState.WITHDRAW_WRATH); 202 | if not Inventory.ContainsItem(Self.AltRune.Item) then 203 | Exit(EOffererState.WITHDRAW_ALT); 204 | if (Inventory.CountItem(Self.Remains.Item) < 3) then 205 | Exit(EOffererState.WITHDRAW_REMAINS); 206 | 207 | Self.RemainsLeft := Inventory.CountItem(Self.Remains.Item); 208 | end; 209 | 210 | if CollectBox.IsOpen() and not Self.CollectEmpty then 211 | Exit(EOffererState.HANDLE_COLLECT); 212 | 213 | Exit(EOffererState.CLOSE_INTERFACE); 214 | end; 215 | 216 | if Chat.LeveledUp() then 217 | Exit(EOffererState.HANDLE_LEVEL); 218 | 219 | if (Self.RemainsLeft < 3) or not Self.CanCast() then 220 | begin 221 | if not Self.BankEmpty then 222 | Exit(EOffererState.OPEN_BANK); 223 | if not Self.CollectEmpty then 224 | Exit(EOffererState.OPEN_COLLECT); 225 | 226 | Exit(EOffererState.OUT_OF_SUPPLIES); 227 | end; 228 | 229 | if not Self.SpellCooldown then 230 | begin 231 | if Magic.IsOpen() then 232 | begin 233 | if Magic.CanActivate(OfferSpell) then 234 | Exit(EOffererState.CAST_SPELL) 235 | 236 | if not Self.BankEmpty then 237 | Exit(EOffererState.OPEN_BANK); 238 | 239 | if not Self.CollectEmpty then 240 | Exit(EOffererState.OPEN_COLLECT); 241 | 242 | Exit(EOffererState.OUT_OF_SUPPLIES); 243 | end; 244 | 245 | Exit(EOffererState.OPEN_MAGIC); 246 | end; 247 | 248 | Exit(EOffererState.WAIT_STATE); 249 | end; 250 | 251 | procedure TRemainOfferer.Run(maxActions: UInt32; maxTime: UInt64); 252 | begin 253 | Self.Init(maxActions, maxTime); 254 | 255 | repeat 256 | Self.State := Self.GetState(); 257 | Self.SetAction(ToStr(Self.State)); 258 | 259 | case Self.State of 260 | EOffererState.OPEN_BANK: Banks.WalkOpen(); 261 | EOffererState.WITHDRAW_WRATH: Self.Withdraw(Self.WrathRune); 262 | EOffererState.WITHDRAW_ALT: Self.Withdraw(Self.AltRune); 263 | EOffererState.WITHDRAW_REMAINS: Self.Withdraw(Self.Remains); 264 | 265 | EOffererState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 266 | EOffererState.HANDLE_COLLECT: Self.HandleCollectBox([Self.WrathRune.Item, Self.AltRune.Item, Self.Remains.Item]); 267 | 268 | EOffererState.CLOSE_INTERFACE: RSInterface.Close(); 269 | 270 | EOffererState.OPEN_MAGIC: Magic.Open(); 271 | EOffererState.CAST_SPELL: Self.CastSpell(); 272 | EOffererState.WAIT_STATE: Self.WaitCoolDown(); 273 | EOffererState.HANDLE_LEVEL: Chat.HandleLevelUp(); 274 | 275 | EOffererState.NO_RUNES, EOffererState.OUT_OF_SUPPLIES, 276 | EOffererState.END_SCRIPT: Break; 277 | end; 278 | 279 | Self.DoAntiban(); 280 | until Self.ShouldStop(); 281 | end; 282 | 283 | var 284 | RemainOfferer: TRemainOfferer; 285 | 286 | {$IFDEF SCRIPT_GUI} 287 | type 288 | TOffererConfig = record(TScriptForm) 289 | BankSelector, RemainSelector: TLabeledCombobox; 290 | Config: TConfigJSON; 291 | end; 292 | 293 | procedure TOffererConfig.StartScript(sender: TObject); override; 294 | begin 295 | CurrentBank := EBankChunk(Self.BankSelector.GetItemIndex()); 296 | CurrentRemains := ERSRemains(Self.RemainSelector.GetItemIndex()); 297 | 298 | Self.Config.Put('remains', Ord(CurrentRemains)); 299 | 300 | inherited; 301 | end; 302 | 303 | procedure TOffererConfig.Run(); override; 304 | var 305 | tab: TTabSheet; 306 | begin 307 | Self.Setup('Wasp Offerer'); 308 | Self.Config.Setup('wasp-offerer'); 309 | 310 | if Self.Config.Has('remains') then 311 | CurrentRemains := ERSRemains(Self.Config.GetInt('remains')); 312 | 313 | Self.Start.setOnClick(@Self.StartScript); 314 | 315 | Self.AddTab('Script Settings'); 316 | tab := Self.Tabs[High(Self.Tabs)]; 317 | 318 | Self.CreateAccountManager(tab); 319 | 320 | Self.BankSelector := Self.CreateBankSettingsV2(tab, [50, 200], [0,0]); 321 | Self.RemainSelector.Create(tab, 'Remains:', 'Pick your type of remains.', [0, 30], [0,0], [Self.BankSelector.GetLeft(), Self.BankSelector.GetBottom()], True); 322 | Self.RemainSelector.AddItemArray([ 323 | 'Fiendish ashes', 'Vile ashes', 'Malicious ashes', 'Abyssal ashes', 324 | 'Infernal ashes', 'Babydragon bones', 'Wyrm bones', 'Dragon bones', 325 | 'Wyvern bones', 'Drake bones', 'Lava dragon bones', 'Hydra bones', 326 | 'Dagannoth bones', 'Superior dragon bones' 327 | ]); 328 | Self.RemainSelector.SetItemIndex(Ord(CurrentRemains)); 329 | 330 | Self.CreateAntibanManager(); 331 | Self.CreateWaspLibSettings(); 332 | Self.CreateAPISettings(); 333 | 334 | inherited; 335 | end; 336 | 337 | var 338 | OffererConfig: TOffererConfig; 339 | {$ENDIF} 340 | 341 | begin 342 | {$IFDEF SCRIPT_GUI} 343 | OffererConfig.Run(); 344 | {$ENDIF} 345 | RemainOfferer.Run(WLSettings.MaxActions, WLSettings.MaxTime); 346 | end. 347 | -------------------------------------------------------------------------------- /wasp_glassblower.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '6f619d33-4564-4650-95fe-db2f7e0925cd'} 2 | {$DEFINE SCRIPT_REVISION := '33'} 3 | {$IFNDEF SCRIPT_CHAIN} 4 | {$DEFINE SCRIPT_GUI} 5 | {$I SRL-T/osr.simba} 6 | {$I WaspLib/osr.simba} 7 | {$ENDIF} 8 | 9 | type 10 | ERSGlassItem = (BEER, LANTERN, LAMP, VIAL, FISHBOWL, ORB, LENS, BULB, BEST); 11 | 12 | var 13 | CurrentBank: EBankChunk = EBankChunk.GRAND_EXCHANGE; 14 | CurrentGlass: ERSGlassItem = ERSGlassItem.BEST; 15 | 16 | type 17 | EBlowerState = ( 18 | HOVER_BANK, 19 | OPEN_BANK, 20 | WITHDRAW_TOOL, 21 | WITHDRAW_MATERIAL, 22 | DEPOSIT_PRODUCT, 23 | DEPOSIT_RANDOM_ITEM, 24 | 25 | OPEN_COLLECT, 26 | HANDLE_COLLECT, 27 | CLOSE_INTERFACE, 28 | 29 | DO_GLASS, 30 | HANDLE_MAKE, 31 | WAIT_GLASS, 32 | 33 | LEVEL_UP, 34 | CLOSE_CONTEXT, 35 | 36 | OUT_OF_ITEMS, 37 | END_SCRIPT 38 | ); 39 | 40 | TBlower = record(TBaseBankScript) 41 | State: EBlowerState; 42 | 43 | Tool, Material, Product: TRSBankItem; 44 | Blowing: Boolean; 45 | CurrentLevel: Int32; 46 | UseBestItem: Boolean; 47 | ItemChanged: Boolean; 48 | end; 49 | 50 | procedure TBlower.SetupProduct(); 51 | var 52 | CurrentLevelItem: ERSGlassItem; 53 | begin 54 | case CurrentLevel of 55 | 1..3: CurrentLevelItem := ERSGlassItem.BEER; 56 | 4..11: CurrentLevelItem := ERSGlassItem.LANTERN; 57 | 12..32: CurrentLevelItem := ERSGlassItem.LAMP; 58 | 33..41: CurrentLevelItem := ERSGlassItem.VIAL; 59 | 42..45: CurrentLevelItem := ERSGlassItem.FISHBOWL; 60 | 46..48: CurrentLevelItem := ERSGlassItem.ORB; 61 | 49..86: CurrentLevelItem := ERSGlassItem.LENS; 62 | else CurrentLevelItem := ERSGlassItem.BULB; 63 | end; 64 | 65 | if CurrentLevelItem <> CurrentGlass then 66 | begin 67 | CurrentGlass := CurrentLevelItem; 68 | ItemChanged := True; 69 | end; 70 | end; 71 | 72 | procedure TBlower.SetupItems(); 73 | var 74 | ProductCost: Int32; 75 | X_Number: Int32; 76 | begin 77 | if not ItemChanged then 78 | Exit; 79 | 80 | Self.Tool := TRSBankItem.Setup('Glassblowing pipe', 1); 81 | if SRL.Dice(70) then 82 | X_Number := Bank.QUANTITY_ALL 83 | else 84 | X_Number := Random(27, 9999); 85 | 86 | Self.Material := TRSBankItem.Setup('Molten glass', X_Number); 87 | 88 | case CurrentGlass of 89 | ERSGlassItem.BEER: Self.Product := TRSBankItem.Setup('Beer glass', X_Number); 90 | ERSGlassItem.LANTERN: Self.Product := TRSBankItem.Setup('Empty candle lantern', X_Number); 91 | ERSGlassItem.LAMP: Self.Product := TRSBankItem.Setup('Empty oil lamp', X_Number); 92 | ERSGlassItem.VIAL: Self.Product := TRSBankItem.Setup('Vial', X_Number); 93 | ERSGlassItem.FISHBOWL: Self.Product := TRSBankItem.Setup('Empty fishbowl', X_Number); 94 | ERSGlassItem.ORB: Self.Product := TRSBankItem.Setup('Unpowered orb', X_Number); 95 | ERSGlassItem.LENS: Self.Product := TRSBankItem.Setup('Lantern lens', X_Number); 96 | ERSGlassItem.BULB: Self.Product := TRSBankItem.Setup('Empty light orb', X_Number); 97 | end; 98 | 99 | ProductCost := ItemData.GetAverage(Self.Material.Item); 100 | Self.ActionProfit := ItemData.GetAverage(Self.Product.Item) - ProductCost; 101 | Self.ItemChanged := False; 102 | end; 103 | 104 | procedure TBlower.Init(maxActions: UInt32; maxTime: UInt64); override; 105 | begin 106 | Antiban.Skills := [ERSSkill.CRAFTING, ERSSkill.TOTAL]; 107 | Antiban.MinZoom := 15; 108 | Antiban.MaxZoom := 85; 109 | 110 | inherited; 111 | 112 | Map.SetupChunk(CurrentBank.Get()); 113 | Objects.Setup(Map.Objects(), @Map.Walker); 114 | NPCs.Setup(Map.NPCs(), @Map.Walker); 115 | 116 | Self.UseBestItem := CurrentGlass = ERSGlassItem.Best; 117 | Self.ItemChanged := True; 118 | 119 | Self.CurrentLevel := Stats.GetLevel(ERSSkill.CRAFTING); 120 | end; 121 | 122 | 123 | function TBlower.CountItem(): Int32; 124 | begin 125 | if (Result := Inventory.CountItemStack(Product.Item)) = 0 then 126 | Result := Inventory.CountItem(Product.Item); 127 | end; 128 | 129 | 130 | function TBlower.DepositExtraItems(): Boolean; 131 | var 132 | slots, DepositSlots: TIntegerArray; 133 | i: Int32; 134 | begin 135 | if Tool.Quantity = 1 then 136 | Inventory.FindItem(Tool.Item, Slots); 137 | 138 | DepositSlots := Slots.Difference(Inventory.GetUsedSlots); 139 | 140 | repeat 141 | if Result := Bank.DepositSlot([DepositSlots[i], Bank.QUANTITY_ALL], True) then 142 | WaitUntil(not Inventory.IsSlotUsed(DepositSlots[i]), 100, 2000); 143 | DepositSlots := Slots.Difference(Inventory.GetUsedSlots); 144 | until Result := (DepositSlots = []); 145 | end; 146 | 147 | function TBlower.Deposit(): Boolean; 148 | var 149 | ItemCount: Int32 := Self.CountItem; 150 | begin 151 | if Result := Bank.DepositItem(Self.Product, True) then 152 | if WaitUntil(Self.CountItem() = 0, 100, 3000) then 153 | TotalActions += ItemCount; 154 | end; 155 | 156 | 157 | function TBlower.DoGlass(): Boolean; 158 | begin 159 | if SRL.Dice(50) then 160 | Result := Inventory.Use(Tool.Item, Material.Item) 161 | else 162 | Result := Inventory.Use(Material.Item, Tool.Item); 163 | 164 | if Result then Make.IsOpen(2000); 165 | end; 166 | 167 | 168 | function TRSMake.SetQuantity(Amount: Int32): Boolean; override; 169 | const 170 | ENABLED_COLOR = $FFFFFF; 171 | var 172 | Button: TRSButton; 173 | Buttons: TRSButtonArray; 174 | begin 175 | if Amount <> Make.QUANTITY_ALL then 176 | begin 177 | Result := inherited; 178 | Exit; 179 | end; 180 | 181 | Buttons := GetQuantityButtons; 182 | 183 | if Buttons = [] then 184 | Exit; 185 | 186 | Button := Buttons[High(Buttons)]; 187 | 188 | if SRL.CountColor(ENABLED_COLOR, Button.Bounds) > 0 then 189 | Exit(True) 190 | else 191 | Exit(Button.Click); 192 | end; 193 | 194 | 195 | function TBlower.HandleMake(): Boolean; 196 | var 197 | MakeStringArray: TStringArray; 198 | ItemIndex: Int32; 199 | i: Int32; 200 | begin 201 | MakeStringArray := [ 202 | 'Beer glass', 'Candle lantern', 'Oil lamp', 'Vial', 'Fishbowl', 203 | 'Unpowered staff orb', 'Lantern lens', 'Light orb' 204 | ]; 205 | 206 | for i := Ord(Low(ERSGlassItem)) to Ord(High(ERSGlassItem)) do 207 | if CurrentGlass = ERSGlassItem(i) then 208 | begin 209 | ItemIndex := i; 210 | Break; 211 | end; 212 | 213 | Blowing := Result := Make.Select(ItemIndex, Make.QUANTITY_ALL, SRL.Dice(98.5)); 214 | if Result then WaitUntil(not Make.IsOpen, 50, 2000); 215 | end; 216 | 217 | 218 | function TBlower.WaitBlowing(): Boolean; 219 | begin 220 | if Blowing then 221 | Result := Blowing := Inventory.ContainsItem(Material.Item) and XPBar.WaitXP(2000) 222 | else 223 | Result := Blowing := XPBar.WaitXP(2000); 224 | end; 225 | 226 | 227 | function TBlower.GetState(): EBlowerState; 228 | begin 229 | if WL.Activity.IsFinished() then 230 | Exit(EBlowerState.END_SCRIPT); 231 | 232 | if XPBar.EarnedXP() then 233 | Exit(EBlowerState.WAIT_GLASS); 234 | 235 | if Chat.LeveledUp() then 236 | begin 237 | Self.Blowing := False; 238 | Exit(EBlowerState.LEVEL_UP); 239 | end; 240 | 241 | if Make.IsOpen() then 242 | Exit(EBlowerState.HANDLE_MAKE); 243 | 244 | if RSInterface.IsOpen() then 245 | begin 246 | Self.Blowing := False; 247 | Self.HoveringBank := False; 248 | if Bank.IsOpen() then 249 | begin 250 | if Inventory.ContainsItem(Product.Item) then 251 | Exit(EBlowerState.DEPOSIT_PRODUCT); 252 | 253 | if Inventory.ContainsRandomItems([Tool.Item, Material.Item]) then 254 | Exit(EBlowerState.DEPOSIT_RANDOM_ITEM); 255 | 256 | if Self.BankEmpty or Inventory.ContainsAll([Tool.Item, Material.Item]) then 257 | Exit(EBlowerState.CLOSE_INTERFACE); 258 | 259 | if not Inventory.ContainsItem(Tool.Item) then 260 | Exit(EBlowerState.WITHDRAW_TOOL); 261 | 262 | if not Inventory.ContainsItem(Material.Item) then 263 | Exit(EBlowerState.WITHDRAW_MATERIAL); 264 | end; 265 | 266 | if CollectBox.IsOpen() then 267 | begin 268 | if Self.CollectEmpty then 269 | Exit(EBlowerState.CLOSE_INTERFACE); 270 | 271 | Exit(EBlowerState.HANDLE_COLLECT); 272 | end; 273 | 274 | Exit(EBlowerState.CLOSE_INTERFACE); 275 | end; 276 | 277 | if Inventory.ContainsAll([Tool.Item, Material.Item]) then 278 | begin 279 | if Self.Blowing then 280 | Exit(EBlowerState.WAIT_GLASS); 281 | 282 | Exit(EBlowerState.DO_GLASS); 283 | end; 284 | 285 | if Self.BankEmpty and Self.CollectEmpty then 286 | Exit(EBlowerState.OUT_OF_ITEMS); 287 | 288 | if Self.BankEmpty then 289 | Exit(EBlowerState.OPEN_COLLECT); 290 | 291 | Exit(EBlowerState.OPEN_BANK); 292 | end; 293 | 294 | function TBlower.Terminate(): Boolean; override; 295 | var 296 | i: Int32; 297 | begin 298 | Self.Product.Quantity := Bank.QUANTITY_ALL; 299 | Self.Product.Noted := True; 300 | 301 | Result := inherited; 302 | 303 | if Result then 304 | for i := 0 to 3 do 305 | if Result := Bank.WithdrawItem(Self.Product, True) then 306 | Break; 307 | end; 308 | 309 | procedure TBlower.Run(maxActions: UInt32; maxTime: UInt64); 310 | begin 311 | Self.Init(maxActions, maxTime); 312 | 313 | repeat 314 | if Self.UseBestItem then 315 | Self.SetupProduct(); 316 | 317 | Self.SetupItems(); 318 | 319 | Self.State := Self.GetState(); 320 | Self.SetAction(ToStr(Self.State)); 321 | 322 | case Self.State of 323 | EBlowerState.OPEN_BANK: Banks.WalkOpen(); 324 | EBlowerState.WITHDRAW_TOOL: Self.Withdraw(Self.Tool); 325 | EBlowerState.WITHDRAW_MATERIAL: Self.Withdraw(Self.Material); 326 | EBlowerState.DEPOSIT_PRODUCT: Self.Deposit(); 327 | EBlowerState.DEPOSIT_RANDOM_ITEM: Self.DepositExtraItems(); 328 | 329 | EBlowerState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 330 | EBlowerState.HANDLE_COLLECT: Self.HandleCollectBox([Tool.Item, Material.Item]); 331 | EBlowerState.CLOSE_INTERFACE: RSInterface.Close(); 332 | 333 | EBlowerState.DO_GLASS: Self.DoGlass(); 334 | EBlowerState.HANDLE_MAKE: Self.HandleMake(); 335 | EBlowerState.WAIT_GLASS: Self.WaitBlowing(); 336 | 337 | EBlowerState.LEVEL_UP: Chat.HandleLevelUp(); 338 | EBlowerState.CLOSE_CONTEXT: ChooseOption.Close(); 339 | 340 | EBlowerState.OUT_OF_ITEMS, EBlowerState.END_SCRIPT: Break; 341 | end; 342 | 343 | Self.DoAntiban(); 344 | until Self.ShouldStop(); 345 | 346 | if not Self.Terminate then 347 | TerminateScript(Name + ' didn''t terminate properly. Stopping execution.'); 348 | end; 349 | 350 | var 351 | Blower: TBlower; 352 | 353 | function TRSChat.HandleLevelUp(Chance: Double = BioHash): Boolean; override; 354 | begin 355 | Result := inherited(Chance); 356 | 357 | Blower.CurrentLevel += 1; 358 | end; 359 | 360 | {$IFNDEF SCRIPT_CHAIN} 361 | {$IFDEF SCRIPT_GUI} 362 | type 363 | TBlowerConfig = record(TScriptForm) 364 | BankSelector, GlassSelector: TLabeledCombobox; 365 | Config: TConfigJSON; 366 | end; 367 | 368 | procedure TBlowerConfig.StartScript(sender: TObject); override; 369 | begin 370 | CurrentBank := EBankChunk(Self.BankSelector.GetItemIndex()); 371 | CurrentGlass := ERSGlassItem(Self.GlassSelector.GetItemIndex()); 372 | 373 | Self.Config.Put('glass', Ord(CurrentGlass)); 374 | 375 | inherited; 376 | end; 377 | 378 | 379 | procedure TBlowerConfig.Run(); override; 380 | var 381 | tab: TTabSheet; 382 | begin 383 | Self.Setup('Wasp Glassblower'); 384 | Self.Config.Setup('wasp-glassblower'); 385 | 386 | if Self.Config.Has('glass') then 387 | CurrentGlass := ERSGlassItem(Self.Config.GetInt('glass')); 388 | 389 | Self.Start.setOnClick(@Self.StartScript); 390 | 391 | Self.AddTab('Script Settings'); 392 | tab := Self.Tabs[High(Self.Tabs)]; 393 | 394 | Self.CreateAccountManager(tab); 395 | 396 | Self.BankSelector := Self.CreateBankSettingsV2(tab, [50, 200], [0,0]); 397 | Self.GlassSelector.Create(tab, 'Glass:', 'Pick your type of glass.', [0, 30], [0,0], [Self.BankSelector.GetLeft(), Self.BankSelector.GetBottom()], True); 398 | GlassSelector.AddItemArray(['Beer glass', 'Candle lantern', 'Oil lamp', 'Vial', 399 | 'Fishbowl', 'Unpowered orb', 'Lantern lens', 'Light orb', 'Best available']); 400 | GlassSelector.SetItemIndex(Ord(CurrentGlass)); 401 | 402 | Self.CreateAntibanManager(); 403 | Self.CreateWaspLibSettings(); 404 | Self.CreateAPISettings(); 405 | 406 | inherited; 407 | end; 408 | 409 | var 410 | BlowerConfig: TBlowerConfig; 411 | {$ENDIF} 412 | {$ENDIF} 413 | 414 | {$IFNDEF SCRIPT_CHAIN} 415 | begin 416 | {$IFDEF SCRIPT_GUI} 417 | Sync(@BlowerConfig.Run); 418 | {$ENDIF} 419 | Blower.Run(WLSettings.MaxActions, WLSettings.MaxTime); 420 | end. 421 | {$ENDIF} 422 | -------------------------------------------------------------------------------- /wasp_tab_maker.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'b15f8a8b-1a7e-457c-9e69-87dc70e90480'} 2 | {$DEFINE SCRIPT_REVISION := '20'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | {$I WaspLib/optional/interfaces/mainscreen/lectern.simba} 7 | {$I WaspLib/optional/handlers/house/house.simba} 8 | 9 | type 10 | ERSNPC = (PHIALS, SERVANT); 11 | 12 | var 13 | CurrentNPC: ERSNPC = ERSNPC.PHIALS; 14 | CurrentLectern: ERSLecternType = ERSLecternType.STANDARD; 15 | CurrentTablet: TRSItem = 'Teleport to house'; 16 | 17 | type 18 | ETabMakerState = ( 19 | LEVEL_UP, 20 | 21 | WAIT_SERVANT, WAIT_TABS, FINISHED_TABS, 22 | ENTER_HOUSE, EXIT_HOUSE, CLOSE_INTERFACE, 23 | 24 | OPEN_LECTERN, HANDLE_TAB_UI, 25 | TALK_TO_PHIALS, HANDLE_PHIALS_CHAT, 26 | 27 | CALL_SERVANT, TALK_SERVANT, HANDLE_SERVANT, 28 | 29 | END_SCRIPT 30 | ); 31 | 32 | TTabMaker = record(TBaseWalkerScript) 33 | State: ETabMakerState; 34 | 35 | Phials, ServantNPC: TRSNPCV2; 36 | 37 | IsTabbing, UsePhials, WaitingServant: Boolean; 38 | LecternObj: EHouseObject; 39 | 40 | SpellTab, SoftClay, NotedSoftClay: TRSItem; 41 | NotesSlot, SoftClayCount: Int32; 42 | end; 43 | 44 | 45 | procedure TTabMaker.SetupNPC(); 46 | begin 47 | case CurrentNPC of 48 | ERSNPC.PHIALS: 49 | begin 50 | Self.Phials := TRSNPCV2.Setup(10, 1, 6, [[7704, 37582]]); 51 | Self.Phials.SetupUpText(['Phials']); 52 | Self.Phials.Finder.Colors += CTS2(4803153, 19, 0.12, 0.19); 53 | Self.Phials.Finder.Colors += CTS2(5538225, 19, 0.02, 0.80); 54 | Self.Phials.Walker := @Map.Walker; 55 | Self.UsePhials := True; 56 | end; 57 | 58 | ERSNPC.SERVANT: 59 | begin 60 | Self.ServantNPC.SetupUpText(['Talk-to']); 61 | Self.ServantNPC.Filter.Finder := False; 62 | Self.ServantNPC.Filter.Walker := False; 63 | Self.ServantNPC.Filter.Minimap := True; 64 | end; 65 | end; 66 | end; 67 | 68 | procedure TTabMaker.SetupItems(); 69 | begin 70 | Self.SoftClay := 'Soft clay'; 71 | Self.NotedSoftClay := 'Noted soft clay'; 72 | Self.SpellTab := CurrentTablet; 73 | end; 74 | 75 | 76 | procedure TTabMaker.Init(maxActions: UInt32; maxTime: UInt64); override; 77 | begin 78 | Antiban.Skills := [ERSSkill.MAGIC, ERSSkill.TOTAL]; 79 | Antiban.MinZoom := 0; 80 | Antiban.MaxZoom := 20; 81 | 82 | inherited; 83 | 84 | 85 | for Self.LecternObj in STUDY_LECTERNS do 86 | if House.Objects[Self.LecternObj].Coordinates <> [] then 87 | Break; 88 | 89 | if Self.LecternObj > High(EHouseObject) then 90 | TerminateScript('Your house doesn''t seem to have a lectern. Please configure your house layout in the house builder tab!'); 91 | 92 | if House.Objects[EHouseObject.EXIT].Coordinates = [] then 93 | TerminateScript('Your house doesn''t seem to have a exit portal added. Please configure your house layout in the house builder tab!'); 94 | 95 | Map.SetupChunk(Chunk([45,51,47,49], 0)); 96 | 97 | Self.SetupNPC(); 98 | Self.SetupItems(); 99 | 100 | Self.ActionProfit := ItemData.GetAverage(Self.SpellTab) - ItemData.GetAverage(Self.SoftClay); 101 | end; 102 | 103 | 104 | function TTabMaker.CallServant(): Boolean; 105 | begin 106 | if ServantNPC.Click then 107 | begin 108 | Minimap.WaitMoving; 109 | Result := WaitUntil(Chat.GetChatTitle = 'Repeat last task?', 110 | SRL.TruncatedGauss(50, 1500), 5000); 111 | end 112 | else 113 | Result := Options.CallServant(); 114 | end; 115 | 116 | function TTabMaker.PhialsGetSoftClay(): Boolean; 117 | begin 118 | if not Self.Phials.IsVisible() and not Map.InRange(Self.Phials.Coordinates, 8) then 119 | Map.Walker.WebWalk(Self.Phials.Coordinates, 15, 0.2); 120 | 121 | if Inventory.SetSelectedSlot(Self.NotesSlot) and 122 | Self.Phials.SelectOption(['Use', '>']) then 123 | begin 124 | Minimap.WaitFlag(); 125 | Result := WaitUntil(Chat.GetChatTitle() = 'Select an option', 100, 15000); 126 | end; 127 | end; 128 | 129 | function TTabMaker.FinishPhialsChat(): Boolean; 130 | var 131 | count, newCount: Int32; 132 | begin 133 | count := Inventory.Count(); 134 | if Chat.ClickOption('All') then 135 | Result := WaitUntil(count <> (newCount := Inventory.Count()), 300, 3000); 136 | 137 | if Result then 138 | Self.SoftClayCount := newCount - count; 139 | end; 140 | 141 | 142 | function TTabMaker.TalkServant(): Boolean; 143 | begin 144 | if ServantNPC.Click then 145 | begin 146 | Minimap.WaitMoving; 147 | Result := WaitUntil(Inventory.IsFull, 100, 5000); 148 | end; 149 | 150 | WaitingServant := not Result; 151 | end; 152 | 153 | 154 | function TTabMaker.HandleServant(): Boolean; 155 | begin 156 | Result := Chat.ClickOption('Fetch', BioHash); 157 | if Result then 158 | begin 159 | WaitingServant := True; 160 | WaitUntil(Chat.GetChatTitle() <> 'Repeat last task?', 200, 3000) 161 | end; 162 | end; 163 | 164 | 165 | function TTabMaker.OpenLectern(): Boolean; 166 | begin 167 | if House.Objects[Self.LecternObj].WalkClick() then 168 | begin 169 | Minimap.WaitMoving(); 170 | Result := Lectern.IsOpen(8000); 171 | end; 172 | end; 173 | 174 | function TTabMaker.HandleLectern(): Boolean; 175 | begin 176 | Result := Lectern.MakeTablet(CurrentTablet) and XPBar.WaitXP(5000); 177 | Self.IsTabbing := Result; 178 | end; 179 | 180 | function TTabMaker.WaitTabs(): Boolean; 181 | begin 182 | Result := XPBar.WaitXP(2800); 183 | Self.IsTabbing := Result; 184 | end; 185 | 186 | procedure TTabMaker.FinishedTabs(); 187 | begin 188 | Self.IsTabbing := False; 189 | Self.TotalActions += Self.SoftClayCount; 190 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 191 | Self.SoftClayCount := 0; 192 | end; 193 | 194 | 195 | function TTabMaker.GetState(): ETabMakerState; 196 | var 197 | s: String; 198 | begin 199 | if WL.Activity.IsFinished() then 200 | Exit(ETabMakerState.END_SCRIPT); 201 | 202 | if Chat.LeveledUp() then 203 | Exit(ETabMakerState.LEVEL_UP); 204 | 205 | if Self.IsTabbing then 206 | begin 207 | if Inventory.ContainsItem(Self.SoftClay) then 208 | Exit(ETabMakerState.WAIT_TABS); 209 | Exit(ETabMakerState.FINISHED_TABS); 210 | end; 211 | 212 | s := Chat.GetChatTitle(); 213 | 214 | if s.Contains('Select') then 215 | Exit(ETabMakerState.HANDLE_PHIALS_CHAT); 216 | 217 | if s.Contains('Repeat') then 218 | Exit(ETabMakerState.HANDLE_SERVANT); 219 | 220 | if RSInterface.IsOpen() then 221 | begin 222 | if Lectern.IsOpen() then 223 | Exit(ETabMakerState.HANDLE_TAB_UI); 224 | Exit(ETabMakerState.CLOSE_INTERFACE); 225 | end; 226 | 227 | if not Minimap.InPOH() then 228 | begin 229 | if not Self.UsePhials or Inventory.IsFull() then 230 | Exit(ETabMakerState.ENTER_HOUSE); 231 | 232 | if not Inventory.ContainsItem(Self.NotedSoftClay) then 233 | Exit(ETabMakerState.END_SCRIPT); 234 | 235 | Exit(ETabMakerState.TALK_TO_PHIALS); 236 | end; 237 | 238 | if Inventory.ContainsItem(Self.SoftClay) then 239 | begin 240 | Self.WaitingServant := False; 241 | Exit(ETabMakerState.OPEN_LECTERN); 242 | end; 243 | 244 | if Self.UsePhials then 245 | Exit(ETabMakerState.EXIT_HOUSE); 246 | 247 | if WaitingServant then 248 | begin 249 | if Self.ServantNPC.IsVisible() then 250 | Exit(ETabMakerState.TALK_SERVANT); 251 | Exit(ETabMakerState.WAIT_SERVANT); 252 | end; 253 | 254 | Exit(ETabMakerState.CALL_SERVANT); 255 | end; 256 | 257 | procedure TTabMaker.Run(maxActions: UInt32; maxTime: UInt64); 258 | begin 259 | Self.Init(maxActions, maxTime); 260 | 261 | repeat 262 | Self.State := Self.GetState(); 263 | Self.SetAction(ToStr(Self.State)); 264 | 265 | case Self.State of 266 | ETabMakerState.LEVEL_UP: 267 | begin 268 | Self.IsTabbing := False; 269 | Chat.HandleLevelUp(); 270 | end; 271 | 272 | ETabMakerState.OPEN_LECTERN: Self.OpenLectern(); 273 | 274 | ETabMakerState.HANDLE_PHIALS_CHAT: Self.FinishPhialsChat(); 275 | ETabMakerState.HANDLE_TAB_UI: Self.HandleLectern(); 276 | ETabMakerState.HANDLE_SERVANT: Self.HandleServant(); 277 | ETabMakerState.CLOSE_INTERFACE: RSInterface.Close(); 278 | 279 | ETabMakerState.CALL_SERVANT: Self.CallServant(); 280 | ETabMakerState.TALK_SERVANT: Self.TalkServant(); 281 | ETabMakerState.EXIT_HOUSE: House.Leave(); 282 | ETabMakerState.TALK_TO_PHIALS: Self.PhialsGetSoftClay(); 283 | 284 | ETabMakerState.ENTER_HOUSE: House.Enter(); 285 | 286 | ETabMakerState.WAIT_SERVANT: Wait(7000, 8000); 287 | ETabMakerState.WAIT_TABS: Self.WaitTabs(); 288 | ETabMakerState.FINISHED_TABS: Self.FinishedTabs(); 289 | 290 | ETabMakerState.END_SCRIPT: Break; 291 | end; 292 | 293 | Self.DoAntiban(); 294 | until Self.ShouldStop(); 295 | end; 296 | 297 | var 298 | TabMaker: TTabMaker; 299 | 300 | procedure TRSMinimap.SetCompassAngleEx(degrees, accuracy: Double); override; 301 | begin 302 | if MainScreen.IsUpText('>') then 303 | ChooseOption.Select('Cancel'); 304 | 305 | inherited; 306 | end; 307 | 308 | {$IFDEF SCRIPT_GUI} 309 | type 310 | TTabMakerConfig = record(TScriptForm) 311 | LecternSelector: TLabeledCombobox; 312 | NPCSelector: TLabeledCombobox; 313 | TabletSelector: TLabeledCombobox; 314 | TabMakerInfo: TLabel; 315 | ImagePanel: TPanel; 316 | Config: TConfigJSON; 317 | end; 318 | 319 | procedure TTabMakerConfig.StartScript(sender: TObject); override; 320 | begin 321 | CurrentNPC := ERSNPC(Self.NPCSelector.GetItemIndex()); 322 | CurrentTablet := Lectern.TABLETS[CurrentLectern][Self.TabletSelector.GetItemIndex()]; 323 | 324 | Self.Config.Put('npc', Ord(CurrentNPC)); 325 | Self.Config.Put('lectern', Ord(CurrentLectern)); 326 | Self.Config.Put('tablet', ToStr(CurrentTablet)); 327 | 328 | inherited; 329 | end; 330 | 331 | procedure TTabMakerConfig.LecternSelectorOnChange(sender: TObject); 332 | var 333 | combobox: TComboBox; 334 | begin 335 | combobox := sender; 336 | CurrentLectern := ERSLecternType(combobox.getItemIndex() + 1); 337 | Self.NPCSelector.SetVisible(CurrentLectern = ERSLecternType.STANDARD); 338 | Self.TabletSelector.SetItemIndex(Lectern.TABLETS[CurrentLectern].Find(LowerCase(CurrentTablet))); 339 | end; 340 | 341 | procedure TTabMakerConfig.NPCSelectorOnChange(sender: TObject); 342 | var 343 | combobox: TComboBox; 344 | begin 345 | combobox := sender; 346 | case combobox.getItemIndex() of 347 | 0: Self.TabMakerInfo.SetCaption( 348 | 'Make sure you have noted soft clay with you, coins and the spell available.' 349 | ); 350 | 351 | 1: Self.TabMakerInfo.SetCaption( 352 | 'Make sure you have soft clay in your bank and you have previously' + 353 | LineEnding + 354 | 'asked the buttler to fetch it for you. I recommend you fetch a ' + 355 | LineEnding + 356 | 'number that has no left overs. You also need money in your servant''s' + 357 | LineEnding + 358 | ' money bag and you need to replenish it MANUALLY once in a while.' 359 | ); 360 | end; 361 | end; 362 | 363 | procedure TTabMakerConfig.Run(); override; 364 | var 365 | tab: TTabSheet; 366 | i: Int32; 367 | begin 368 | Self.Setup('Wasp TabMaker'); 369 | Self.Config.Setup('wasp-tab-maker'); 370 | 371 | if Self.Config.Has('lectern') then 372 | CurrentLectern := ERSLecternType(Self.Config.GetInt('lectern')); 373 | if Self.Config.Has('npc') then 374 | CurrentNPC := ERSNPC(Self.Config.GetInt('npc')); 375 | if Self.Config.Has('tablet') then 376 | CurrentTablet := Self.Config.GetString('tablet'); 377 | 378 | Self.Start.SetOnClick(@Self.StartScript); 379 | 380 | Self.AddTab('Script Settings'); 381 | tab := Self.Tabs[High(Self.Tabs)]; 382 | 383 | Self.CreateAccountManager(tab); 384 | 385 | with Self.LecternSelector do 386 | begin 387 | Create(tab); 388 | SetCaption('Lectern:'); 389 | SetLeft(TControl.AdjustToDPI(20)); 390 | SetTop(TControl.AdjustToDPI(150)); 391 | SetStyle(csDropDownList); 392 | AddItemArray(['Standard', 'Ancient', 'Lunar', 'Arceuus']); 393 | Combobox.SetOnChange(@Self.LecternSelectorOnChange); 394 | SetItemIndex(Ord(CurrentLectern)-1); 395 | SetEnabled(False); 396 | end; 397 | 398 | with Self.NPCSelector do 399 | begin 400 | Create(tab); 401 | SetCaption('Method:'); 402 | SetLeft(Self.LecternSelector.GetLeft()); 403 | SetTop(Self.LecternSelector.GetBottom() + TControl.AdjustToDPI(10)); 404 | SetStyle(csDropDownList); 405 | AddItemArray(['Phials', 'Demon butler']); 406 | SetItemIndex(Ord(CurrentNPC)); 407 | Combobox.SetOnChange(@Self.NPCSelectorOnChange); 408 | end; 409 | 410 | with Self.TabletSelector do 411 | begin 412 | Create(tab); 413 | SetCaption('Spell tab:'); 414 | SetTop(Self.LecternSelector.GetTop()); 415 | SetLeft(Self.LecternSelector.GetRight() + TControl.AdjustToDPI(15)); 416 | SetStyle(csDropDownList); 417 | for i := 0 to High(Lectern.TABLETS[CurrentLectern]) do 418 | AddItem(ToStr(Lectern.TABLETS[CurrentLectern][i]).SentenceCase()); 419 | end; 420 | 421 | with Self.TabMakerInfo do 422 | begin 423 | Create(tab); 424 | SetLeft(Self.NPCSelector.GetLeft()); 425 | SetTop(Self.NPCSelector.GetBottom() + TControl.AdjustToDPI(15)); 426 | SetHint('NPC mode instructions.'); 427 | end; 428 | 429 | Self.CreateHouseBuilder(); 430 | Self.CreateAntibanManager(); 431 | Self.CreateWaspLibSettings(); 432 | Self.CreateAPISettings(); 433 | 434 | Self.NPCSelectorOnChange(Self.NPCSelector.ComboBox); 435 | Self.LecternSelectorOnChange(Self.LecternSelector.ComboBox); 436 | 437 | inherited; 438 | end; 439 | 440 | var 441 | TabMakerConfig: TTabMakerConfig; 442 | {$ENDIF} 443 | 444 | begin 445 | {$IFDEF SCRIPT_GUI} 446 | TabMakerConfig.Run(); 447 | {$ENDIF} 448 | TabMaker.Run(WLSettings.MaxActions, WLSettings.MaxTime); 449 | end. 450 | -------------------------------------------------------------------------------- /wasp_smelter.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'e8df872a-afaf-44b8-9fc5-eef079ada50b'} 2 | {$DEFINE SCRIPT_REVISION := '41'} 3 | {$IFNDEF SCRIPT_CHAIN} 4 | {$DEFINE SCRIPT_GUI} 5 | {$I SRL-T/osr.simba} 6 | {$I WaspLib/osr.simba} 7 | {$ENDIF} 8 | 9 | type 10 | ERSBarType = ( 11 | BRONZE, IRON, SILVER, STEEL, GOLD, MITHRIL, ADAMANT, RUNITE, MOLTEN_GLASS 12 | ); 13 | 14 | ERSFurnace = (AL_KHARID, EDGEVILLE, FALADOR, PRIFDDINAS); 15 | 16 | var 17 | CurrentBar = ERSBarType.GOLD; 18 | CurrentFurnace = ERSFurnace.EDGEVILLE; 19 | 20 | type 21 | ESmelterState = ( 22 | HOVER_BANK, 23 | OPEN_BANK, 24 | WITHDRAW_MATERIALS, 25 | DEPOSIT_BAR, 26 | DEPOSIT_RANDOM_ITEM, 27 | 28 | OPEN_COLLECT, 29 | HANDLE_COLLECT, 30 | 31 | OPEN_FURNACE, 32 | SMELT_BAR, 33 | WAIT_SMELT, 34 | 35 | CLOSE_INTERFACE, 36 | 37 | LEVEL_UP, 38 | CLOSE_CONTEXT, 39 | 40 | END_SCRIPT, 41 | OUT_OF_SUPPLIES 42 | ); 43 | 44 | TSmelter = record(TBaseBankScript) 45 | State: ESmelterState; 46 | 47 | Furnace: TRSObjectV2; 48 | 49 | Ore1, Ore2, Bar: TRSBankItem; 50 | Materials: TRSItemArray; 51 | Smelting: Boolean; 52 | 53 | BarAmount, Multiplier: Int32; 54 | end; 55 | 56 | 57 | 58 | procedure TSmelter.SetupItems(); 59 | begin 60 | case CurrentBar of 61 | ERSBarType.BRONZE: 62 | begin 63 | Self.Bar := TRSBankItem.Setup('Bronze bar', Bank.QUANTITY_ALL, False); 64 | Self.Ore1 := TRSBankItem.Setup('Copper ore', 14, False); 65 | Self.Ore2 := TRSBankItem.Setup('Tin ore', 14, False); 66 | end; 67 | 68 | ERSBarType.IRON: 69 | begin 70 | Self.Bar := TRSBankItem.Setup('Iron bar', Bank.QUANTITY_ALL, False); 71 | Self.Ore1 := TRSBankItem.Setup('Iron ore', Bank.QUANTITY_ALL, False); 72 | end; 73 | 74 | ERSBarType.SILVER: 75 | begin 76 | Self.Bar := TRSBankItem.Setup('Silver bar', Bank.QUANTITY_ALL, False); 77 | Self.Ore1 := TRSBankItem.Setup('Silver ore', Bank.QUANTITY_ALL, False); 78 | end; 79 | 80 | ERSBarType.STEEL: 81 | begin 82 | Self.Bar := TRSBankItem.Setup('Steel bar', Bank.QUANTITY_ALL, False); 83 | Self.Ore1 := TRSBankItem.Setup('Iron ore', 9, False); 84 | Self.Ore2 := TRSBankItem.Setup('Coal', 18, False); 85 | end; 86 | 87 | ERSBarType.GOLD: 88 | begin 89 | Self.Bar := TRSBankItem.Setup('Gold bar', Bank.QUANTITY_ALL, False); 90 | Self.Ore1 := TRSBankItem.Setup('Gold ore', Bank.QUANTITY_ALL, False); 91 | end; 92 | 93 | ERSBarType.MITHRIL: 94 | begin 95 | Self.Bar := TRSBankItem.Setup('Mithril bar', Bank.QUANTITY_ALL, False); 96 | Self.Ore1 := TRSBankItem.Setup('Mithril ore', 5, False); 97 | Self.Ore2 := TRSBankItem.Setup('Coal', 20, False); 98 | end; 99 | 100 | ERSBarType.ADAMANT: 101 | begin 102 | Self.Bar := TRSBankItem.Setup('Adamantite bar', Bank.QUANTITY_ALL, False); 103 | Self.Ore1 := TRSBankItem.Setup('Adamantite ore', 4, False); 104 | Self.Ore2 := TRSBankItem.Setup('Coal', 24, False); 105 | end; 106 | 107 | ERSBarType.RUNITE: 108 | begin 109 | Self.Bar := TRSBankItem.Setup('Runite bar', Bank.QUANTITY_ALL, False); 110 | Self.Ore1 := TRSBankItem.Setup('Runite ore', 4, False); 111 | Self.Ore2 := TRSBankItem.Setup('Coal', 24, False); 112 | end; 113 | 114 | ERSBarType.MOLTEN_GLASS: 115 | begin 116 | Self.Bar := TRSBankItem.Setup('Molten glass', Bank.QUANTITY_ALL, False); 117 | Self.Ore1 := TRSBankItem.Setup('Soda ash', 14, False); 118 | Self.Ore2 := TRSBankItem.Setup('Bucket of sand', 14, False); 119 | Antiban.Skills := [ERSSkill.CRAFTING, ERSSkill.TOTAL]; 120 | end; 121 | end; 122 | 123 | Self.Materials += Self.Ore1.Item; 124 | Self.ActionProfit := (ItemData.GetAverage(Self.Bar.Item)) - 125 | (ItemData.GetAverage(Self.Ore1.Item) * Self.Ore1.Quantity); 126 | 127 | if Self.Ore2 <> [] then 128 | begin 129 | Self.ActionProfit -= (ItemData.GetAverage(Self.Ore2.Item) * Round(Self.Ore2.Quantity / Self.Ore1.Quantity)); 130 | Materials += Self.Ore2.Item; 131 | end; 132 | end; 133 | 134 | procedure TSmelter.Init(maxActions: UInt32; maxTime: UInt64); override; 135 | begin 136 | Antiban.Skills := [ERSSkill.Smithing, ERSSkill.TOTAL]; 137 | Antiban.MinZoom := 0; 138 | Antiban.MaxZoom := 40; 139 | 140 | inherited; 141 | 142 | case CurrentFurnace of 143 | ERSFurnace.AL_KHARID: Map.SetupChunk(ERSChunk.AL_KHARID); 144 | ERSFurnace.EDGEVILLE: Map.SetupChunk(ERSChunk.EDGEVILLE); 145 | ERSFurnace.FALADOR: Map.SetupChunk(ERSChunk.FALADOR); 146 | ERSFurnace.PRIFDDINAS: Map.SetupChunk(ERSChunk.PRIFDDINAS); 147 | end; 148 | 149 | Objects.Setup(Map.Objects(), @Map.Walker); 150 | NPCs.Setup(Map.NPCs(), @Map.Walker); 151 | Self.Furnace := Objects.Get('Furnace'); 152 | 153 | Self.SetupItems(); 154 | end; 155 | 156 | 157 | function TSmelter.Withdraw(): Boolean; overload; 158 | var 159 | invCount: Int32; 160 | item: TRSBankItem; 161 | find1, find2: Boolean; 162 | begin 163 | find1 := Inventory.ContainsItem(Self.Ore1.Item); 164 | find2 := (Self.Ore2 = []) or Inventory.ContainsItem(Self.Ore2.Item); 165 | 166 | if find1 then 167 | begin 168 | if find2 then 169 | Exit; 170 | item := Self.Ore2; 171 | item.Quantity := Self.Ore1.Quantity; 172 | end 173 | else if find2 or (Self.Ore1.Quantity > Self.Ore2.Quantity) or 174 | ((Self.Ore1.Quantity = Self.Ore2.Quantity) and Antiban.BioDice()) then 175 | begin 176 | item := Self.Ore1; 177 | if Self.Ore2 <> [] then 178 | item.Quantity := Self.Ore2.Quantity; 179 | end 180 | else 181 | item := Self.Ore2; 182 | 183 | invCount := Inventory.Count(); 184 | 185 | if Bank.WithdrawItem(item, True) then 186 | Result := WaitUntil(Inventory.Count() > invCount, 100, 3000); 187 | 188 | if not Result then 189 | begin 190 | Bank.UnHoverIncinerator(); 191 | Self.BankEmpty := not Bank.IsSearchOpen() and 192 | not WaitUntil(Bank.ContainsItem(item), 300, 3000); 193 | 194 | if Bank.IsSearchOpen() then 195 | Bank.CloseSearch(); 196 | end; 197 | 198 | Self.BankEmpty := Self.BankEmpty and Bank.IsOpen(); 199 | 200 | if Self.BankEmpty then 201 | SaveScreenshot('bankempty' + DIRECTORYSEPARATOR + 'bankempty', MainScreen.Bounds); 202 | 203 | if Self.CollectEmpty and Self.CollectTimer.IsFinished() then 204 | Self.CollectEmpty := False; 205 | end; 206 | 207 | function TSmelter.Deposit(): Boolean; 208 | var 209 | itemCount: Int32; 210 | begin 211 | itemCount := Inventory.Count(); 212 | 213 | if Bank.DepositAll() then 214 | Result := WaitUntil(Inventory.Count() = 0, 100, 3000); 215 | 216 | if Result then 217 | begin 218 | Self.TotalActions += itemCount; 219 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 220 | end; 221 | end; 222 | 223 | 224 | function TSmelter.OpenFurnace(): Boolean; 225 | begin 226 | if Self.Furnace.WalkSelectOption(['Smelt']) then 227 | begin 228 | Minimap.WaitPlayerMoving(300, 10000); 229 | Result := Make.IsOpen(8000); 230 | end; 231 | end; 232 | 233 | 234 | function TSmelter.SmeltBar(): Boolean; 235 | begin 236 | if not Inventory.ContainsAll(Materials) then 237 | Exit; 238 | 239 | if Result := Make.Select(ToStr(Self.Bar.Item), Make.QUANTITY_ALL, Antiban.BioDice(EBioBehavior.KEYBOARD_CHAT_CHANCE)) then 240 | Smelting := XPBar.WaitXP(4000); 241 | end; 242 | 243 | function TSmelter.IsMakingItem(waitTime: Int32 = 6000): Boolean; 244 | var 245 | itemCount: Int32 := Inventory.CountItem(Self.Bar.Item); 246 | begin 247 | if Result := WaitUntil((itemCount < Inventory.CountItem(Self.Bar.Item)) or not Inventory.ContainsAll(Materials), 100, waitTime) then 248 | WL.Activity.Restart(); 249 | end; 250 | 251 | function TSmelter.WaitSmelt(): Boolean; 252 | begin 253 | if Smelting then 254 | Result := Smelting := (Inventory.ContainsAll(Materials) and Self.IsMakingItem()) 255 | else 256 | Result := Smelting := Self.IsMakingItem(); 257 | 258 | if Result then 259 | WL.Activity.Restart(); 260 | end; 261 | 262 | 263 | function TSmelter.GetState(): ESmelterState; 264 | begin 265 | if WL.Activity.IsFinished() then 266 | Exit(ESmelterState.END_SCRIPT); 267 | 268 | if Chat.LeveledUp() then 269 | begin 270 | Self.Smelting := False; 271 | Exit(ESmelterState.LEVEL_UP); 272 | end; 273 | 274 | if RSInterface.IsOpen() then 275 | begin 276 | Self.Smelting := False; 277 | Self.HoveringBank := False; 278 | 279 | if Bank.IsOpen() then 280 | begin 281 | if Inventory.ContainsItem(Self.Bar.Item) then 282 | Exit(ESmelterState.DEPOSIT_BAR); 283 | 284 | if Inventory.ContainsRandomItems(Materials) then 285 | Exit(ESmelterState.DEPOSIT_RANDOM_ITEM); 286 | 287 | if not Self.BankEmpty and not Inventory.ContainsAll(Materials) then 288 | Exit(ESmelterState.WITHDRAW_MATERIALS); 289 | end; 290 | 291 | if not Self.CollectEmpty and CollectBox.IsOpen() then 292 | Exit(ESmelterState.HANDLE_COLLECT); 293 | 294 | Exit(ESmelterState.CLOSE_INTERFACE); 295 | end; 296 | 297 | if Inventory.ContainsAll(Materials) then 298 | begin 299 | if Self.Smelting then 300 | begin 301 | if not Self.HoveringBank then 302 | begin 303 | Self.CountItemsLeft(Self.Ore1.Item); 304 | 305 | if Self.ShouldHoverBank() then 306 | Exit(ESmelterState.HOVER_BANK); 307 | end; 308 | 309 | Exit(ESmelterState.WAIT_SMELT); 310 | end; 311 | 312 | if Make.IsOpen() then 313 | Exit(ESmelterState.SMELT_BAR); 314 | 315 | Exit(ESmelterState.OPEN_FURNACE); 316 | end; 317 | 318 | if Self.BankEmpty then 319 | begin 320 | if Self.CollectEmpty then 321 | Exit(ESmelterState.OUT_OF_SUPPLIES); 322 | 323 | Exit(ESmelterState.OPEN_COLLECT); 324 | end; 325 | 326 | if Self.BankEmpty then 327 | Exit(ESmelterState.OPEN_COLLECT); 328 | 329 | Exit(ESmelterState.OPEN_BANK); 330 | end; 331 | 332 | function TSmelter.Terminate(): Boolean; override; 333 | begin 334 | Result := inherited; 335 | Self.Bar.Noted := True; 336 | if Result then 337 | for 0 to 5 do 338 | if Result := Bank.WithdrawItem(Self.Bar, True) then 339 | Break; 340 | end; 341 | 342 | procedure TSmelter.Run(maxActions: UInt32; maxTime: UInt64); 343 | begin 344 | Self.Init(maxActions, maxTime); 345 | 346 | repeat 347 | State := Self.GetState(); 348 | Self.SetAction(ToStr(State)); 349 | 350 | case Self.State of 351 | ESmelterState.HOVER_BANK: Self.HoverBank(); 352 | ESmelterState.OPEN_BANK: Banks.WalkOpen(); 353 | ESmelterState.WITHDRAW_MATERIALS: Self.Withdraw(); 354 | ESmelterState.DEPOSIT_BAR: Self.Deposit(); 355 | ESmelterState.DEPOSIT_RANDOM_ITEM: Bank.DepositRandomItems(Self.Materials); 356 | 357 | ESmelterState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 358 | ESmelterState.HANDLE_COLLECT: Self.HandleCollectBox(Self.Materials); 359 | 360 | ESmelterState.OPEN_FURNACE: Self.OpenFurnace(); 361 | ESmelterState.SMELT_BAR: Self.SmeltBar(); 362 | ESmelterState.WAIT_SMELT: Self.WaitSmelt(); 363 | 364 | ESmelterState.CLOSE_INTERFACE: RSInterface.Close(); 365 | ESmelterState.CLOSE_CONTEXT: ChooseOption.Close(); 366 | ESmelterState.LEVEL_UP: Chat.HandleLevelUp(); 367 | 368 | ESmelterState.END_SCRIPT, ESmelterState.OUT_OF_SUPPLIES: Break; 369 | end; 370 | 371 | Self.DoAntiban(); 372 | until Self.ShouldStop(); 373 | 374 | if not Self.Terminate() then 375 | TerminateScript(Self.Name + ' didn''t terminate properly. Stopping execution.'); 376 | end; 377 | 378 | var 379 | Smelter: TSmelter; 380 | 381 | {$IFNDEF SCRIPT_CHAIN} 382 | {$IFDEF SCRIPT_GUI} 383 | type 384 | TSmelterConfig = record(TScriptForm) 385 | BarTypeSelector: TLabeledCombobox; 386 | FurnaceSelector: TLabeledCombobox; 387 | Config: TConfigJSON; 388 | end; 389 | 390 | procedure TSmelterConfig.StartScript(sender: TObject); override; 391 | begin 392 | CurrentBar := ERSBarType(Self.BarTypeSelector.GetItemIndex()); 393 | CurrentFurnace := ERSFurnace(Self.FurnaceSelector.GetItemIndex()); 394 | 395 | Self.Config.Put('bar', Ord(CurrentBar)); 396 | Self.Config.Put('furnace', Ord(CurrentFurnace)); 397 | inherited; 398 | end; 399 | 400 | procedure TSmelterConfig.Run(); override; 401 | var 402 | tab: TTabSheet; 403 | begin 404 | Self.Setup('Wasp Smelter'); 405 | Self.Config.Setup('wasp-smelter'); 406 | Self.Start.SetOnClick(@Self.StartScript); 407 | 408 | Self.AddTab('Script Settings'); 409 | tab := Self.Tabs[High(Self.Tabs)]; 410 | 411 | Self.CreateAccountManager(tab); 412 | 413 | with Self.BarTypeSelector do 414 | begin 415 | Create(tab); 416 | SetCaption('Self.Bar type:'); 417 | SetLeft(TControl.AdjustToDPI(50)); 418 | SetTop(TControl.AdjustToDPI(200)); 419 | SetStyle(csDropDownList); 420 | AddItemArray(['Bronze', 'Iron', 'Silver', 'Steel', 'Gold', 'Mithril', 'Adamantite', 'Runite', 'Molten glass']); 421 | 422 | if Self.Config.Has('bar') then 423 | SetItemIndex(Self.Config.GetInt('bar')) 424 | else 425 | SetItemIndex(Ord(CurrentBar)); 426 | end; 427 | 428 | with Self.FurnaceSelector do 429 | begin 430 | Create(tab); 431 | SetCaption('Furnace:'); 432 | SetLeft(Self.BarTypeSelector.GetRight() + TControl.AdjustToDPI(15)); 433 | SetTop(Self.BarTypeSelector.GetTop()); 434 | SetStyle(csDropDownList); 435 | AddItemArray([ 436 | 'Al Kharid', 437 | 'Edgeville', 'Falador', 'Prifddinnas' 438 | ]); 439 | 440 | if Self.Config.Has('furnace') then 441 | SetItemIndex(Self.Config.GetInt('furnace')) 442 | else 443 | SetItemIndex(Ord(CurrentFurnace)); 444 | end; 445 | 446 | Self.CreateAntibanManager(); 447 | Self.CreateWaspLibSettings(); 448 | Self.CreateAPISettings(); 449 | 450 | inherited; 451 | end; 452 | 453 | var 454 | SmelterConfig: TSmelterConfig; 455 | {$ENDIF} 456 | {$ENDIF} 457 | 458 | {$IFNDEF SCRIPT_CHAIN} 459 | begin 460 | {$IFDEF SCRIPT_GUI} 461 | SmelterConfig.Run(); 462 | {$ENDIF} 463 | Smelter.Run(WLSettings.MaxActions, WLSettings.MaxTime); 464 | end. 465 | {$ENDIF} 466 | -------------------------------------------------------------------------------- /wasp_miner.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'bffb9ec8-588b-406d-9872-9ab274b5c934'} 2 | {$DEFINE SCRIPT_REVISION := '28'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | 7 | type 8 | ERSBank = ( 9 | POWER_MINE, VARROCK_E, VARROCK_W, 10 | CRAFTING_GUILD_MINE, MINE_GUILD 11 | ); 12 | 13 | ERSRock = ( 14 | CLAY, TIN, COPPER, IRON, SILVER, COAL, GOLD, 15 | MITHRIL, ADAMANTITE, RUNITE, AMETHYST 16 | ); 17 | 18 | var 19 | CurrentRock: ERSRock := ERSRock.IRON; 20 | BankLocation: ERSBank := ERSBank.POWER_MINE; 21 | 22 | type 23 | EMinerState = ( 24 | OPEN_BANK, 25 | DEPOSIT_ITEMS, 26 | CLOSE_INTERFACE, 27 | 28 | WALK_SPOT, 29 | WAIT_STATE, 30 | 31 | EQUIP_GEAR, 32 | LEVEL_UP, 33 | USE_SPEC, 34 | MINE_ROCK, 35 | 36 | DROP_ITEMS, 37 | 38 | END_SCRIPT 39 | ); 40 | 41 | TMiner = record(TBaseBankScript) 42 | State: EMinerState; 43 | 44 | RSRock: TRSObject; 45 | 46 | ProspectorOutfit: TRSItemArray; 47 | BankList: TRSItemArray; 48 | DropList: TRSItemArray; 49 | 50 | Mining: Boolean; 51 | UseBank: Boolean; 52 | InvCount: Int32; 53 | PrevInvCount: Int32; 54 | end; 55 | 56 | procedure TAntiban.Setup(); override; 57 | begin 58 | Self.Skills := [ERSSkill.MINING, ERSSkill.TOTAL]; 59 | Self.MinZoom := 30; 60 | Self.MaxZoom := 60; 61 | 62 | inherited; 63 | end; 64 | 65 | 66 | procedure TMiner.SetupRock(); 67 | begin 68 | if not Self.UseBank then 69 | RSObjects.Setup(); 70 | 71 | case CurrentRock of 72 | ERSRock.CLAY: 73 | begin 74 | RSRock := RSObjects.ClayRock; 75 | ActionProfit := ItemData.GetAverage('Clay'); 76 | end; 77 | 78 | ERSRock.TIN: 79 | begin 80 | RSRock := RSObjects.TinRock; 81 | ActionProfit := ItemData.GetAverage('Tin ore'); 82 | end; 83 | 84 | ERSRock.COPPER: 85 | begin 86 | RSRock := RSObjects.CopperRock; 87 | ActionProfit := ItemData.GetAverage('Copper ore'); 88 | end; 89 | 90 | ERSRock.IRON: 91 | begin 92 | RSRock := RSObjects.IronRock; 93 | ActionProfit := ItemData.GetAverage('Iron ore'); 94 | end; 95 | 96 | ERSRock.SILVER: 97 | begin 98 | RSRock := RSObjects.SilverRock; 99 | ActionProfit := ItemData.GetAverage('Silver ore'); 100 | end; 101 | 102 | ERSRock.COAL: 103 | begin 104 | RSRock := RSObjects.CoalRock; 105 | ActionProfit := ItemData.GetAverage('Coal'); 106 | end; 107 | 108 | ERSRock.GOLD: 109 | begin 110 | RSRock := RSObjects.GoldRock; 111 | ActionProfit := ItemData.GetAverage('Gold ore'); 112 | end; 113 | 114 | ERSRock.MITHRIL: 115 | begin 116 | RSRock := RSObjects.MithrilRock; 117 | ActionProfit := ItemData.GetAverage('Mithril ore'); 118 | end; 119 | 120 | ERSRock.ADAMANTITE: 121 | begin 122 | RSRock := RSObjects.AdamantiteRock; 123 | ActionProfit := ItemData.GetAverage('Adamantite ore'); 124 | end; 125 | 126 | ERSRock.RUNITE: 127 | begin 128 | RSRock := RSObjects.RuniteRock; 129 | ActionProfit := ItemData.GetAverage('Runite ore'); 130 | end; 131 | 132 | ERSRock.AMETHYST: 133 | begin 134 | RSRock := RSObjects.AmethystRock; 135 | ActionProfit := ItemData.GetAverage('Amethyst'); 136 | end; 137 | end; 138 | 139 | if not Self.UseBank then 140 | begin 141 | Self.RSRock.Filter.Skip := False; 142 | Self.RSRock.SetupUpText(['Mine', 'Rocks']); 143 | end; 144 | 145 | RSRock.Filter.UpText := False; 146 | 147 | DropList := [ 148 | 'Clay', 'Tin ore', 'Copper ore', 149 | 'Iron ore', 'Silver ore', 'Gold ore', 'Uncut sapphire' 150 | ]; 151 | 152 | BankList := DropList; 153 | 154 | BankList += 'Uncut emerald'; 155 | BankList += 'Uncut ruby'; 156 | BankList += 'Uncut diamond'; 157 | 158 | BankList += 'Coal'; 159 | BankList += 'Mithril ore'; 160 | BankList += 'Adamantite ore'; 161 | BankList += 'Amethyst'; 162 | BankList += 'Unidentified minerals'; 163 | 164 | BankList += 'Clue geode (beginner)'; 165 | BankList += 'Clue geode (easy)'; 166 | BankList += 'Clue geode (medium)'; 167 | BankList += 'Clue geode (hard)'; 168 | BankList += 'Clue geode (elite)'; 169 | 170 | BankList += 'Clue scroll (beginner)'; 171 | BankList += 'Clue scroll (easy)'; 172 | BankList += 'Clue scroll (medium)'; 173 | BankList += 'Clue scroll (hard)'; 174 | BankList += 'Clue scroll (elite)'; 175 | 176 | BankList += 'Scroll box (beginner)'; 177 | BankList += 'Scroll box (easy)'; 178 | BankList += 'Scroll box (medium)'; 179 | BankList += 'Scroll box (hard)'; 180 | BankList += 'Scroll box (elite)'; 181 | end; 182 | 183 | procedure TMiner.SetupBank(); 184 | begin 185 | case BankLocation of 186 | MINE_GUILD: 187 | begin 188 | RSW.SetupRegions([RSRegions.MINING_GUILD]); 189 | UseBank := True; 190 | end; 191 | 192 | CRAFTING_GUILD_MINE: 193 | begin 194 | RSW.SetupRegions([RSRegions.CRAFTING_GUILD]); 195 | UseBank := True; 196 | end; 197 | 198 | VARROCK_E: 199 | begin 200 | RSW.SetupRegions([RSRegions.VARROCK_EAST]); 201 | UseBank := True; 202 | end; 203 | 204 | VARROCK_W: 205 | begin 206 | RSW.SetupRegions([RSRegions.VARROCK_WEST]); 207 | UseBank := True; 208 | end; 209 | 210 | POWER_MINE: UseBank := False; 211 | end; 212 | end; 213 | 214 | procedure TMiner.Init(maxActions: UInt32; maxTime: UInt64); override; 215 | begin 216 | inherited; 217 | 218 | Self.SetupBank(); 219 | Self.SetupRock(); 220 | 221 | ProspectorOutfit := [ 222 | 'Prospector helmet', 223 | 'Prospector jacket', 224 | 'Prospector legs', 225 | 'Prospector boots', 226 | 'Varrock armour 1', 227 | 'Varrock armour 2', 228 | 'Varrock armour 3', 229 | 'Varrock armour 4', 230 | 'Mining gloves', 231 | 'Superior mining gloves', 232 | 'Expert mining gloves', 233 | 'Mining cape', 234 | 'Mining cape(t)', 235 | 'Elven signet', 236 | 'Celestial ring', 237 | 'Celestial signet' 238 | ]; 239 | 240 | Options.SetZoomLevel(40); 241 | 242 | if Antiban.BioDice() then 243 | Options.SetNPCAttackOption(ERSAttackOption.HIDDEN) 244 | else 245 | Options.SetNPCAttackOption(ERSAttackOption.ALWAYS_RIGHT_CLICK); 246 | 247 | if WLSettings.RemoteInput.HUDDebug then 248 | DebugObjectArray += RSRock; 249 | end; 250 | 251 | 252 | function TMiner.MineRock(): Boolean; 253 | begin 254 | Result := Mining := RSRock.Click() or RSRock.WalkClick(); 255 | if Result then 256 | begin 257 | Minimap.WaitPlayerMoving(300, 10000); 258 | Wait(1500, 2000); 259 | end; 260 | end; 261 | 262 | function TMiner.HasGear(): Boolean; 263 | var 264 | Item: TRSItem; 265 | begin 266 | for Item in ProspectorOutfit do 267 | if Inventory.ContainsItem(Item) then 268 | Exit(True); 269 | 270 | Result := False; 271 | end; 272 | 273 | function TMiner.EquipGear(): Boolean; 274 | var 275 | Item: TRSItem; 276 | begin 277 | for Item in ProspectorOutfit do 278 | if Inventory.ClickItem(Item) then 279 | Wait(200, 300); 280 | 281 | Result := not Self.HasGear; 282 | end; 283 | 284 | 285 | function TMiner.DropItems(): Boolean; 286 | var 287 | invCount: Int32; 288 | begin 289 | invCount := Inventory.Count(); 290 | Result := Inventory.ShiftDrop(Self.DropList, Inventory.RandomPattern()); 291 | 292 | TotalActions += (invCount - Inventory.Count()); 293 | 294 | if Result then 295 | WL.Activity.Restart(); 296 | end; 297 | 298 | function TMiner.Deposit(): Boolean; 299 | begin 300 | Result := Bank.DepositItems(Self.BankList, True); 301 | if Result then 302 | WL.Activity.Restart(); 303 | end; 304 | 305 | 306 | function TMiner.IsMining(): Boolean; 307 | begin 308 | Result := SRL.IsAnimating(MainScreen.GetPlayerBox(), MainScreen.NormalizeDistance(450), 350, 3); 309 | end; 310 | 311 | function TMiner.WaitMining(t: UInt32 = 1400): Boolean; 312 | var 313 | gotXP: Boolean; 314 | begin 315 | if Inventory.Count() <> PrevInvCount then 316 | begin 317 | Self.Mining := False; 318 | Exit(False); 319 | end; 320 | 321 | Result := WaitUntil((Self.Mining := Self.IsMining) or (gotXP := XPBar.EarnedXP()), 100, t); 322 | if gotXP then 323 | Result := Self.Mining := False; 324 | end; 325 | 326 | 327 | function TMiner.GetState(): EMinerState; 328 | begin 329 | if WL.Activity.IsFinished() then 330 | Exit(EMinerState.END_SCRIPT); 331 | 332 | if Chat.LeveledUp then 333 | begin 334 | Mining := False; 335 | Exit(EMinerState.LEVEL_UP); 336 | end; 337 | 338 | if RSInterface.IsOpen then 339 | begin 340 | if Bank.IsOpen and Inventory.ContainsAny(BankList) then 341 | Exit(EMinerState.DEPOSIT_ITEMS); 342 | 343 | Exit(EMinerState.CLOSE_INTERFACE); 344 | end; 345 | 346 | if Self.HasGear then 347 | Exit(EMinerState.EQUIP_GEAR); 348 | 349 | if Inventory.IsFull then 350 | begin 351 | Mining := False; 352 | 353 | if not UseBank then 354 | Exit(EMinerState.DROP_ITEMS); 355 | 356 | Exit(EMinerState.OPEN_BANK); 357 | end; 358 | 359 | if Mining then 360 | Exit(EMinerState.WAIT_STATE); 361 | 362 | if UseBank and not RSW.AtTile(RSRock.Coordinates, 15) then 363 | Exit(EMinerState.WALK_SPOT); 364 | 365 | if Minimap.IsSpecWeapon and (Minimap.GetSpecLevel = 100) then 366 | Exit(EMinerState.USE_SPEC); 367 | 368 | Exit(EMinerState.MINE_ROCK); 369 | end; 370 | 371 | procedure TMiner.Run(maxActions: UInt32; maxTime: UInt64); 372 | begin 373 | Self.Init(maxActions, maxTime); 374 | 375 | repeat 376 | State := Self.GetState(); 377 | Self.SetAction(ToStr(State)); 378 | 379 | Self.InvCount := Inventory.Count(); 380 | 381 | if Self.InvCount <> Self.PrevInvCount then 382 | WL.Activity.Restart(); 383 | 384 | case Self.State of 385 | EMinerState.OPEN_BANK: Bank.WalkOpen(); 386 | EMinerState.DEPOSIT_ITEMS: Self.Deposit(); 387 | EMinerState.CLOSE_INTERFACE: RSInterface.Close(); 388 | EMinerState.WALK_SPOT: RSW.WebWalk(RSRock.Coordinates, 5, 0.2); 389 | EMinerState.WAIT_STATE: Self.WaitMining(); 390 | EMinerState.LEVEL_UP: Chat.HandleLevelUp(); 391 | EMinerState.EQUIP_GEAR: Self.EquipGear(); 392 | EMinerState.USE_SPEC: Minimap.EnableSpec(100); 393 | EMinerState.MINE_ROCK: Self.MineRock(); 394 | EMinerState.DROP_ITEMS: Self.DropItems(); 395 | EMinerState.END_SCRIPT: Break; 396 | end; 397 | 398 | Self.PrevInvCount := Self.InvCount; 399 | 400 | Self.DoAntiban; 401 | until Self.ShouldStop(); 402 | end; 403 | 404 | var 405 | Miner: TMiner; 406 | 407 | {$IFDEF SCRIPT_GUI} 408 | type 409 | TMinerConfig = record(TScriptForm) 410 | RockSelector: TLabeledCombobox; 411 | BankSelector: TLabeledCombobox; 412 | end; 413 | 414 | procedure TMinerConfig.StartScript(sender: TObject); override; 415 | begin 416 | CurrentRock := ERSRock(Self.RockSelector.Combobox.getItemIndex()); 417 | 418 | case Self.BankSelector.Combobox.getText() of 419 | 'Power mine (mine and drop)': BankLocation := ERSBank.POWER_MINE; 420 | 'P2P Mining Guild': BankLocation := ERSBank.MINE_GUILD; 421 | 'Crafting guild': BankLocation := ERSBank.CRAFTING_GUILD_MINE; 422 | 'Varrock west': BankLocation := ERSBank.VARROCK_W; 423 | 'Varrock east': BankLocation := ERSBank.VARROCK_E; 424 | end; 425 | 426 | inherited; 427 | end; 428 | 429 | procedure TMinerConfig.RockSelectorOnChange({$H-}sender: TObject);{$H+} 430 | begin 431 | Self.BankSelector.Clear(); 432 | 433 | case ERSRock(Self.RockSelector.Combobox.getItemIndex()) of 434 | ERSRock.CLAY: 435 | begin 436 | Self.BankSelector.AddItem('Power mine (mine and drop)'); 437 | Self.BankSelector.AddItem('Crafting guild'); 438 | Self.BankSelector.AddItem('Varrock west'); 439 | end; 440 | 441 | ERSRock.TIN: 442 | begin 443 | Self.BankSelector.AddItem('Power mine (mine and drop)'); 444 | Self.BankSelector.AddItem('Varrock east'); 445 | Self.BankSelector.AddItem('Varrock west'); 446 | end; 447 | 448 | ERSRock.COPPER: 449 | begin 450 | Self.BankSelector.AddItem('Power mine (mine and drop)'); 451 | Self.BankSelector.AddItem('Varrock east'); 452 | end; 453 | 454 | ERSRock.IRON: 455 | begin 456 | Self.BankSelector.AddItem('Power mine (mine and drop)'); 457 | Self.BankSelector.AddItem('P2P Mining Guild'); 458 | Self.BankSelector.AddItem('Varrock east'); 459 | Self.BankSelector.AddItem('Varrock west'); 460 | end; 461 | 462 | ERSRock.SILVER: 463 | begin 464 | Self.BankSelector.AddItem('Power mine (mine and drop)'); 465 | Self.BankSelector.AddItem('Crafting guild'); 466 | Self.BankSelector.AddItem('Varrock west'); 467 | end; 468 | 469 | ERSRock.GOLD: 470 | begin 471 | Self.BankSelector.AddItem('Power mine (mine and drop)'); 472 | Self.BankSelector.AddItem('Crafting guild'); 473 | end; 474 | 475 | else 476 | Self.BankSelector.AddItem('P2P Mining Guild'); 477 | 478 | end; 479 | 480 | Self.BankSelector.SetItemIndex(0); 481 | end; 482 | 483 | procedure TMinerConfig.Run(); override; 484 | var 485 | tab: TTabSheet; 486 | begin 487 | Self.Setup('Wasp Miner'); 488 | Self.Start.setOnClick(@Self.StartScript); 489 | 490 | Self.AddTab('Script Settings'); 491 | tab := Self.Tabs[High(Self.Tabs)]; 492 | 493 | Self.CreateAccountManager(tab); 494 | 495 | with Self.RockSelector do 496 | begin 497 | Create(tab); 498 | SetCaption('Rock type:'); 499 | SetLeft(TControl.AdjustToDPI(40)); 500 | SetTop(TControl.AdjustToDPI(170)); 501 | SetStyle(csDropDownList); 502 | AddItemArray(['Clay', 'Tin', 'Copper', 'Iron', 'Silver', 'Coal', 'Gold', 503 | 'Mithril', 'Adamantite', 'Runite (doesn''t hop worlds)', 504 | 'Amethyst']); 505 | SetItemIndex(Ord(CurrentRock)); 506 | Combobox.SetOnChange(@Self.RockSelectorOnChange); 507 | end; 508 | 509 | with Self.BankSelector do 510 | begin 511 | Create(tab); 512 | SetCaption('Bank location:'); 513 | SetLeft(Self.RockSelector.GetRight() + TControl.AdjustToDPI(40)); 514 | SetTop(Self.RockSelector.GetTop()); 515 | SetWidth(TControl.AdjustToDPI(200)); 516 | Combobox.setStyle(csDropDownList); 517 | end; 518 | 519 | Self.RockSelectorOnChange(Self.RockSelector.ComboBox); 520 | 521 | 522 | Self.CreateAntibanManager(); 523 | Self.CreateWaspLibSettings(); 524 | Self.CreateAPISettings(); 525 | 526 | inherited; 527 | end; 528 | 529 | var 530 | MinerConfig: TMinerConfig; 531 | {$ENDIF} 532 | 533 | begin 534 | {$IFDEF SCRIPT_GUI} 535 | MinerConfig.Run(); 536 | {$ENDIF} 537 | Miner.Run(WLSettings.MaxActions, WLSettings.MaxTime); 538 | end. 539 | -------------------------------------------------------------------------------- /wasp_enchanter.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '242c8d26-e9c9-4de5-945b-5f0288307dfc'} 2 | {$DEFINE SCRIPT_REVISION := '46'} 3 | {$IFNDEF SCRIPT_CHAIN} 4 | {$DEFINE SCRIPT_GUI} 5 | {$I SRL-T/osr.simba} 6 | {$I WaspLib/osr.simba} 7 | {$ENDIF} 8 | 9 | const 10 | GEM_TYPE: TStringArray = [ 11 | 'Opal', 'Jade', 'Red topaz', 'Sapphire', 'Emerald', 'Ruby', 12 | 'Diamond', 'Dragonstone', 'Onyx', 'Zenyte' 13 | ]; 14 | 15 | JEWELRY_TYPE: TStringArray = ['Ring', 'Necklace', 'Bracelet', 'Amulet']; 16 | 17 | var 18 | CurrentBank: EBankChunk = EBankChunk.GRAND_EXCHANGE; 19 | CurrentJewel: TRSItem = 'Ruby necklace'; 20 | 21 | type 22 | EEnchanterState = ( 23 | LEVEL_UP, 24 | CLOSE_CONTEXT, 25 | 26 | OPEN_BANK, 27 | WITHDRAW_TOOL, 28 | WITHDRAW_MATERIAL, 29 | DEPOSIT_PRODUCT, 30 | 31 | OPEN_COLLECT, 32 | HANDLE_COLLECT, 33 | CLOSE_INTERFACE, 34 | 35 | OPEN_MAGIC, 36 | OPEN_INVENTORY, 37 | 38 | CAST_SPELL, 39 | ENCHANT_JEWEL, 40 | CANCEL_SPELL, 41 | WAIT_ENCHANT, 42 | 43 | OUT_OF_SUPPLIES, 44 | END_SCRIPT 45 | ); 46 | 47 | TEnchanter = record(TBaseBankScript) 48 | State: EEnchanterState; 49 | 50 | Spell: ERSSpell; 51 | CosmicRune, RegularJewel, EnchantedJewel: TRSBankItem; 52 | Enchanting: Boolean; 53 | end; 54 | 55 | procedure TEnchanter.SetSpell(); 56 | var 57 | itemStr: String; 58 | begin 59 | itemStr := ToStr(CurrentJewel); 60 | 61 | if itemStr.ContainsAny(['Opal', 'Sapphire']) then 62 | Spell := ERSSpell.LVL1_ENCHANT 63 | else if itemStr.ContainsAny(['Jade', 'Emerald']) then 64 | Spell := ERSSpell.LVL2_ENCHANT 65 | else if itemStr.ContainsAny(['Topaz', 'Ruby']) then 66 | Spell := ERSSpell.LVL3_ENCHANT 67 | else if itemStr.Contains('Diamond') then 68 | Spell := ERSSpell.LVL4_ENCHANT 69 | else if itemStr.Contains('Dragon') then 70 | Spell := ERSSpell.LVL5_ENCHANT 71 | else if itemStr.Contains('Onyx') then 72 | Spell := ERSSpell.LVL6_ENCHANT 73 | else if itemStr.Contains('Zenyte') then 74 | Spell := ERSSpell.LVL7_ENCHANT 75 | end; 76 | 77 | procedure TEnchanter.SetupJewels(); 78 | var 79 | itemStr: String; 80 | enchantedItem: TRSItem; 81 | begin 82 | itemStr := ToStr(CurrentJewel); 83 | 84 | if itemStr.Contains('Opal') then 85 | begin 86 | if itemStr.Contains('ring') then 87 | enchantedItem := 'Ring of pursuit' 88 | else if itemStr.Contains('necklace') then 89 | enchantedItem := 'Dodgy necklace' 90 | else if itemStr.Contains('bracelet') then 91 | enchantedItem := 'Expeditious bracelet' 92 | else if itemStr.Contains('amulet') then 93 | enchantedItem := 'Amulet of bounty'; 94 | end 95 | 96 | else if itemStr.Contains('Jade') then 97 | begin 98 | if itemStr.Contains('ring') then 99 | enchantedItem := 'Ring of returning(5)' 100 | else if itemStr.Contains('necklace') then 101 | enchantedItem := 'Necklace of passage(5)' 102 | else if itemStr.Contains('bracelet') then 103 | enchantedItem := 'Flamtaer bracelet' 104 | else if itemStr.Contains('amulet') then 105 | enchantedItem := 'Amulet of Chemistry'; 106 | end 107 | 108 | else if itemStr.Contains('Topaz') then 109 | begin 110 | if itemStr.Contains('ring') then 111 | enchantedItem := 'Efaritay''s aid' 112 | else if itemStr.Contains('necklace') then 113 | enchantedItem := 'Necklace of faith' 114 | else if itemStr.Contains('bracelet') then 115 | enchantedItem := 'Bracelet of slaughter' 116 | else if itemStr.Contains('amulet') then 117 | enchantedItem := 'Burning amulet(5)'; 118 | end 119 | 120 | else if itemStr.Contains('Sapphire') then 121 | begin 122 | if itemStr.Contains('ring') then 123 | enchantedItem := 'Ring of recoil' 124 | else if itemStr.Contains('necklace') then 125 | enchantedItem := 'Games necklace(8)' 126 | else if itemStr.Contains('bracelet') then 127 | enchantedItem := 'Bracelet of clay' 128 | else if itemStr.Contains('amulet') then 129 | enchantedItem := 'Amulet of magic'; 130 | end 131 | 132 | else if itemStr.Contains('Emerald') then 133 | begin 134 | if itemStr.Contains('ring') then 135 | enchantedItem := 'Ring of dueling(8)' 136 | else if itemStr.Contains('necklace') then 137 | enchantedItem := 'Binding necklace' 138 | else if itemStr.Contains('bracelet') then 139 | enchantedItem := 'Castle wars bracelet(3)' 140 | else if itemStr.Contains('amulet') then 141 | enchantedItem := 'Amulet of defence'; 142 | end 143 | 144 | else if itemStr.Contains('Ruby') then 145 | begin 146 | if itemStr.Contains('ring') then 147 | enchantedItem := 'Ring of forging' 148 | else if itemStr.Contains('necklace') then 149 | enchantedItem := 'Digsite pendant (5)' 150 | else if itemStr.Contains('bracelet') then 151 | enchantedItem := 'Inoculation bracelet' 152 | else if itemStr.Contains('amulet') then 153 | enchantedItem := 'Amulet of strength'; 154 | end 155 | 156 | else if itemStr.Contains('Diamond') then 157 | begin 158 | if itemStr.Contains('ring') then 159 | enchantedItem := 'Ring of life' 160 | else if itemStr.Contains('necklace') then 161 | enchantedItem := 'Phoenix necklace' 162 | else if itemStr.Contains('bracelet') then 163 | enchantedItem := 'Abyssal bracelet(5)' 164 | else if itemStr.Contains('amulet') then 165 | enchantedItem := 'Amulet of power'; 166 | end 167 | 168 | else if itemStr.Contains('Dragon') then 169 | begin 170 | if itemStr.Contains('ring') then 171 | enchantedItem := 'Ring of wealth' 172 | else if itemStr.Contains('necklace') then 173 | enchantedItem := 'Skills necklace' 174 | else if itemStr.Contains('bracelet') then 175 | enchantedItem := 'Combat bracelet' 176 | else if itemStr.Contains('amulet') then 177 | enchantedItem := 'Amulet of glory'; 178 | end 179 | 180 | else if itemStr.Contains('Onyx') then 181 | begin 182 | if itemStr.Contains('ring') then 183 | enchantedItem := 'Ring of stone' 184 | else if itemStr.Contains('necklace') then 185 | enchantedItem := 'Berserker necklace' 186 | else if itemStr.Contains('bracelet') then 187 | enchantedItem := 'Regen bracelet' 188 | else if itemStr.Contains('amulet') then 189 | enchantedItem := 'Amulet of fury'; 190 | end 191 | 192 | else if itemStr.Contains('Zenyte') then 193 | begin 194 | if itemStr.Contains('ring') then 195 | enchantedItem := 'Ring of suffering' 196 | else if itemStr.Contains('necklace') then 197 | enchantedItem := 'Necklace of anguish' 198 | else if itemStr.Contains('bracelet') then 199 | enchantedItem := 'Tormented bracelet' 200 | else if itemStr.Contains('amulet') then 201 | enchantedItem := 'Amulet of torture'; 202 | end; 203 | 204 | Self.RegularJewel := TRSBankItem.Setup(CurrentJewel, Bank.QUANTITY_ALL, False); 205 | Self.EnchantedJewel := TRSBankItem.Setup(enchantedItem, Bank.QUANTITY_ALL, False); 206 | end; 207 | 208 | procedure TEnchanter.Init(maxActions: UInt32; maxTime: UInt64); override; 209 | begin 210 | Antiban.Skills := [ERSSkill.MAGIC, ERSSkill.TOTAL]; 211 | Antiban.MinZoom := 15; 212 | Antiban.MaxZoom := 85; 213 | 214 | inherited; 215 | 216 | Map.SetupChunk(CurrentBank.Get()); 217 | Objects.Setup(Map.Objects(), @Map.Walker); 218 | NPCs.Setup(Map.NPCs(), @Map.Walker); 219 | 220 | Self.CosmicRune := TRSBankItem.Setup('Cosmic rune', Bank.QUANTITY_ALL, False); 221 | Self.SetSpell(); 222 | Self.SetupJewels(); 223 | 224 | Self.ActionProfit := 225 | ItemData.GetAverage(Self.EnchantedJewel.Item) - 226 | (ItemData.GetAverage(Self.CosmicRune.Item) + 227 | ItemData.GetAverage(Self.RegularJewel.Item)); 228 | end; 229 | 230 | 231 | function TEnchanter.EnchantJewel(): Boolean; 232 | begin 233 | XPBar.EarnedXP(); 234 | if Inventory.ClickItem(Self.RegularJewel.Item, '>') then 235 | Result := WaitUntil(Magic.IsOpen() or XPBar.EarnedXP(), 300, 6000); 236 | 237 | Self.Enchanting := Result; 238 | end; 239 | 240 | function TEnchanter.WaitEnchanting(): Boolean; 241 | begin 242 | if Self.Enchanting then 243 | Result := Inventory.ContainsAll([Self.CosmicRune.Item, Self.RegularJewel.Item]) and XPBar.WaitXP(5000) 244 | else 245 | Result := XPBar.WaitXP(5000); 246 | 247 | Self.Enchanting := Result; 248 | end; 249 | 250 | function TEnchanter.Deposit(): Boolean; 251 | var 252 | itemCount: Int32; 253 | begin 254 | itemCount := Inventory.CountItem(Self.EnchantedJewel.Item); 255 | 256 | if Bank.DepositItem(Self.EnchantedJewel, True) then 257 | Result := WaitUntil(Inventory.CountItem(Self.EnchantedJewel.Item) = 0, 100, 3000); 258 | 259 | if Result then 260 | begin 261 | Self.TotalActions += itemCount; 262 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 263 | end; 264 | end; 265 | 266 | 267 | 268 | function TEnchanter.GetState(): EEnchanterState; 269 | begin 270 | if WL.Activity.IsFinished() then 271 | Exit(EEnchanterState.END_SCRIPT); 272 | 273 | if Chat.LeveledUp() then 274 | begin 275 | Self.Enchanting := False; 276 | Exit(EEnchanterState.LEVEL_UP); 277 | end; 278 | 279 | if RSInterface.IsOpen() then 280 | begin 281 | Self.Enchanting := False; 282 | Self.HoveringBank := False; 283 | 284 | if Bank.IsOpen() then 285 | begin 286 | if Inventory.ContainsItem(Self.EnchantedJewel.Item) then 287 | Exit(EEnchanterState.DEPOSIT_PRODUCT); 288 | 289 | if BankEmpty or Inventory.ContainsAll([Self.CosmicRune.Item, Self.RegularJewel.Item]) then 290 | Exit(EEnchanterState.CLOSE_INTERFACE); 291 | 292 | if not Inventory.ContainsItem(Self.CosmicRune.Item) then 293 | Exit(EEnchanterState.WITHDRAW_TOOL); 294 | 295 | if not Inventory.ContainsItem(Self.RegularJewel.Item) then 296 | Exit(EEnchanterState.WITHDRAW_MATERIAL); 297 | end; 298 | 299 | if CollectBox.IsOpen() then 300 | begin 301 | if Self.CollectEmpty or Inventory.ContainsAll([Self.CosmicRune.Item, Self.RegularJewel.Item]) then 302 | Exit(EEnchanterState.CLOSE_INTERFACE); 303 | Exit(EEnchanterState.HANDLE_COLLECT); 304 | end; 305 | 306 | Exit(EEnchanterState.CLOSE_INTERFACE); 307 | end; 308 | 309 | if Inventory.IsOpen() then 310 | begin 311 | if Inventory.ContainsAll([Self.CosmicRune.Item, Self.RegularJewel.Item]) then 312 | begin 313 | if MainScreen.IsUpText('>') then 314 | Exit(EEnchanterState.ENCHANT_JEWEL); 315 | if Self.Enchanting then 316 | Exit(EEnchanterState.WAIT_ENCHANT); 317 | Exit(EEnchanterState.OPEN_MAGIC); 318 | end; 319 | 320 | if MainScreen.IsUpText('>') then 321 | Exit(EEnchanterState.CANCEL_SPELL); 322 | 323 | if Self.BankEmpty and Self.CollectEmpty then 324 | Exit(EEnchanterState.OUT_OF_SUPPLIES); 325 | 326 | if Self.BankEmpty then 327 | Exit(EEnchanterState.OPEN_COLLECT); 328 | 329 | Exit(EEnchanterState.OPEN_BANK); 330 | end; 331 | 332 | if Magic.IsOpen() then 333 | begin 334 | if Self.Enchanting or Magic.IsSelected(SPELL) then 335 | Exit(OPEN_INVENTORY); 336 | Exit(CAST_SPELL); 337 | end; 338 | 339 | Exit(EEnchanterState.OPEN_MAGIC); 340 | end; 341 | 342 | function TEnchanter.Terminate(): Boolean; override; 343 | begin 344 | if inherited then 345 | for 0 to 5 do 346 | if Result := Bank.WithdrawItem(Self.EnchantedJewel, True) then 347 | Break; 348 | end; 349 | 350 | procedure TEnchanter.Run(maxActions: UInt32; maxTime: UInt64); 351 | begin 352 | Self.Init(maxActions, maxTime); 353 | 354 | repeat 355 | Self.State := Self.GetState(); 356 | Self.SetAction(ToStr(Self.State)); 357 | 358 | case Self.State of 359 | EEnchanterState.OPEN_BANK: Banks.WalkOpen(); 360 | EEnchanterState.WITHDRAW_TOOL: Self.Withdraw(Self.CosmicRune); 361 | EEnchanterState.WITHDRAW_MATERIAL: Self.Withdraw(Self.RegularJewel); 362 | EEnchanterState.DEPOSIT_PRODUCT: Self.Deposit(); 363 | 364 | EEnchanterState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 365 | EEnchanterState.HANDLE_COLLECT: Self.HandleCollectBox([Self.RegularJewel.Item, Self.CosmicRune.Item]); 366 | EEnchanterState.CLOSE_INTERFACE: RSInterface.Close(); 367 | 368 | EEnchanterState.WAIT_ENCHANT: Self.Enchanting := XPBar.WaitXP(5000); 369 | EEnchanterState.LEVEL_UP: Chat.HandleLevelUp(); 370 | 371 | EEnchanterState.OPEN_MAGIC: Magic.Open(); 372 | EEnchanterState.OPEN_INVENTORY: Inventory.Open(); 373 | EEnchanterState.CAST_SPELL: Magic.CastSpell(SPELL); 374 | EEnchanterState.ENCHANT_JEWEL: Self.EnchantJewel(); 375 | EEnchanterState.CANCEL_SPELL: Magic.Deselect(); 376 | 377 | EEnchanterState.OUT_OF_SUPPLIES, EEnchanterState.END_SCRIPT: Break; 378 | end; 379 | 380 | Self.DoAntiban(); 381 | until Self.ShouldStop(); 382 | 383 | if not Self.Terminate() then 384 | TerminateScript(Self.Name + ' didn''t terminate properly. Stopping execution.'); 385 | end; 386 | 387 | var 388 | Enchanter: TEnchanter; 389 | 390 | {$IFNDEF SCRIPT_CHAIN} 391 | {$IFDEF SCRIPT_GUI} 392 | type 393 | TEnchanterConfig = record(TScriptForm) 394 | GemSelector: TLabeledCombobox; 395 | JewelSelector: TLabeledCombobox; 396 | BankSelector: TLabeledComboBox; 397 | Config: TConfigJSON; 398 | end; 399 | 400 | procedure TEnchanterConfig.StartScript(sender: TObject); override; 401 | begin 402 | CurrentJewel := Self.GemSelector.getText().Replace('Red t', 'T') + ' ' + Self.JewelSelector.getText().ToLower(); 403 | Self.Config.Put('gem', Self.GemSelector.GetItemIndex()); 404 | Self.Config.Put('jewel', Self.JewelSelector.GetItemIndex()); 405 | 406 | if CurrentJewel = 'Dragonstone necklace' then 407 | CurrentJewel := 'Dragon necklace'; 408 | 409 | CurrentBank := EBankChunk(Self.BankSelector.GetItemIndex()); 410 | 411 | inherited; 412 | end; 413 | 414 | procedure TEnchanterConfig.Run(); override; 415 | var 416 | tab: TTabSheet; 417 | begin 418 | Self.Setup('Wasp Enchanter'); 419 | Self.Config.Setup('wasp-enchanter'); 420 | 421 | Self.Start.SetOnClick(@Self.StartScript); 422 | 423 | Self.AddTab('Script Settings'); 424 | tab := Self.Tabs[High(Self.Tabs)]; 425 | 426 | Self.CreateAccountManager(tab); 427 | 428 | Self.BankSelector := Self.CreateBankSettingsV2(tab, [50, 200], [0,0]); 429 | 430 | Self.GemSelector.Create(tab, 'Gem type:', 'Pick your type of gem.', [0, 30], [0,0], [Self.BankSelector.GetLeft(), Self.BankSelector.GetBottom()], True); 431 | Self.GemSelector.AddItemArray(GEM_TYPE); 432 | if Self.Config.Has('gem') then 433 | Self.GemSelector.SetItemIndex(Self.Config.GetInt('gem')) 434 | else 435 | Self.GemSelector.SetItemIndex(3); 436 | 437 | Self.JewelSelector.Create(tab, 'Jewel type:', 'Pick your type of jewellery.', [20, 0], [200,0], [Self.GemSelector.GetRight(), Self.GemSelector.GetTop()], True); 438 | Self.JewelSelector.AddItemArray(JEWELRY_TYPE); 439 | if Self.Config.Has('jewel') then 440 | Self.JewelSelector.SetItemIndex(Self.Config.GetInt('jewel')) 441 | else 442 | Self.JewelSelector.SetItemIndex(0); 443 | 444 | Self.CreateAntibanManager(); 445 | Self.CreateWaspLibSettings(); 446 | Self.CreateAPISettings(); 447 | 448 | inherited; 449 | end; 450 | 451 | var 452 | EnchanterConfig: TEnchanterConfig; 453 | {$ENDIF} 454 | {$ENDIF} 455 | 456 | {$IFNDEF SCRIPT_CHAIN} 457 | begin 458 | {$IFDEF SCRIPT_GUI} 459 | EnchanterConfig.Run(); 460 | {$ENDIF} 461 | Enchanter.Run(WLSettings.MaxActions, WLSettings.MaxTime); 462 | end. 463 | {$ENDIF} 464 | -------------------------------------------------------------------------------- /wasp_cooker.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'de957f22-8a37-4660-a7a3-9bef52cadd70'} 2 | {$DEFINE SCRIPT_REVISION := '45'} 3 | {$IFNDEF SCRIPT_CHAIN} 4 | {$DEFINE SCRIPT_GUI} 5 | {$I SRL-T/osr.simba} 6 | {$I WaspLib/osr.simba} 7 | {$ENDIF} 8 | 9 | type 10 | ERSLocation = (HOSIDIUS, ROGUES_DEN, MYTHS_GUILD); 11 | 12 | const 13 | RAW_FOOD: TRSItemArray = [ 14 | 'Custom', 15 | 'Meat', 16 | 'Shrimps', 17 | 'Chicken', 18 | 'Rabbit', 19 | 'Anchovies', 20 | 'Sardine', 21 | 'Herring', 22 | 'Mackerel', 23 | 'Trout', 24 | 'Cod', 25 | 'Pike', 26 | 'Salmon', 27 | 'Tuna', 28 | 'Karambwan', 29 | 'Rainbow fish', 30 | 'Lobster', 31 | 'Bass', 32 | 'Swordfish', 33 | 'Monkfish', 34 | 'Shark', 35 | 'Sea turtle', 36 | 'Anglerfish', 37 | 'Dark crab', 38 | 'Manta ray' 39 | ]; 40 | 41 | var 42 | CurrentFood: TRSItem := 'Anglerfish'; 43 | CurrentLocation := ERSLocation.HOSIDIUS; 44 | 45 | type 46 | ECookerState = ( 47 | OPEN_BANK, 48 | WITHDRAW_ITEMS, 49 | DEPOSIT_ITEMS, 50 | 51 | OPEN_COLLECT, 52 | HANDLE_COLLECT, 53 | CLOSE_INTERFACE, 54 | 55 | DO_COOKING, 56 | HANDLE_MAKE, 57 | WAIT_COOKING, 58 | 59 | LEVEL_UP, 60 | CLOSE_CONTEXT, 61 | 62 | END_SCRIPT 63 | ); 64 | 65 | TCooker = record(TBaseBankScript) 66 | State: ECookerState; 67 | 68 | Food: TRSItem; 69 | Ingredient: TRSBankItem; 70 | Products: array of TRSBankItem; 71 | 72 | CookingObj: TRSObjectV2; 73 | 74 | Cooking: Boolean; 75 | UsingFire: Boolean; 76 | end; 77 | 78 | 79 | procedure TCooker.SetupItems(); 80 | var 81 | cookedPrefix: TStringArray; 82 | burntFish: TStringArray; 83 | begin 84 | Self.Food := CurrentFood; 85 | ItemFinder.Similarity := 0.99999; 86 | 87 | cookedPrefix := ['chicken', 'rabbit', 'meat', 'crab meat', 88 | 'karambwan', 'chompy', 'fishcake', 'jubbly', 'sweetcorn']; 89 | 90 | burntFish := ['herring', 'mackerel', 'sardine', 'anchovies', 91 | 'giant carp', 'trout', 'cod', 'pike', 'salmon', 'tuna', 'bass']; 92 | 93 | Self.Ingredient := TRSBankItem.Setup('Raw ' + ToString(Self.Food).Lower()); 94 | 95 | if cookedPrefix.Contains(LowerCase(Self.Food)) then 96 | Self.Products := [ 97 | TRSBankItem.Setup('Cooked ' + ToString(Self.Food).Lower()), 98 | TRSBankItem.Setup('Burnt ' + ToString(Self.Food).Lower()) 99 | ] 100 | else if burntFish.Contains(LowerCase(Self.Food)) then 101 | Self.Products := [ 102 | TRSBankItem.Setup(Self.Food), 103 | TRSBankItem.Setup('Burnt fish') 104 | ] 105 | else if 'shrimps' in LowerCase(Self.Food) then 106 | Self.Products := [ 107 | TRSBankItem.Setup(Self.Food), 108 | TRSBankItem.Setup('Burnt shrimp') 109 | ] 110 | else 111 | Self.Products := [ 112 | TRSBankItem.Setup(Self.Food), 113 | TRSBankItem.Setup('Burnt ' + ToString(Self.Food).Lower()) 114 | ]; 115 | 116 | Self.ActionProfit := ( 117 | ItemData.GetAverage(Self.Products[0].Item) - 118 | ItemData.GetAverage(Self.Ingredient.Item) 119 | ); 120 | end; 121 | 122 | procedure TCooker.SetupLocation(); 123 | var 124 | tmp: TRSObjectV2; 125 | begin 126 | case CurrentLocation of 127 | ERSLocation.HOSIDIUS: 128 | begin 129 | GENERATED_GRAPH.NodeRadius := 30; 130 | Map.SetupChunk(ERSChunk.HOSIDIUS_KITCHEN); 131 | Objects.Setup(Map.Objects(), @Map.Walker); 132 | Self.CookingObj := Objects.Get('Clay oven'); 133 | Delete(Self.CookingObj.Coordinates, 0, 1); 134 | Delete(Self.CookingObj.Coordinates, 1, 1); 135 | Delete(Self.CookingObj.Rotations, 0, 2); 136 | end; 137 | 138 | ERSLocation.ROGUES_DEN: 139 | begin 140 | Map.SetupChunk(ERSChunk.ROGUES_DEN); 141 | tmp := TRSObjectV2.Setup(0.7, 5, [[21128, 30542]]); 142 | tmp.SetupUpText(['Emerald', 'Benedict']); 143 | tmp.Walker := @Map.Walker; 144 | tmp.Finder.Colors += CTS2(3430243, 19, 0.15, 0.81); 145 | tmp.Finder.Colors += CTS2(6523832, 17, 0.03, 0.89); 146 | Banks._AddObject(tmp); 147 | 148 | Self.CookingObj := TRSObjectV2.Setup(0.8,1, [[21132,30538]]); 149 | Self.CookingObj.SetupUpText('Fire'); 150 | Self.CookingObj.Finder.Colors += CTS2(3317724, 14, 0.23, 1.65); 151 | Self.CookingObj.Walker := @Map.Walker; 152 | end; 153 | 154 | ERSLocation.MYTHS_GUILD: 155 | begin 156 | Map.SetupChunk([[38,44,38,44], [1]]); 157 | Objects.Setup(Map.Objects(), @Map.Walker); 158 | Self.CookingObj := Objects.Get('Range'); 159 | end; 160 | end; 161 | end; 162 | 163 | procedure TCooker.Init(maxActions: UInt32; maxTime: UInt64); override; 164 | begin 165 | Antiban.Skills := [ERSSkill.COOKING, ERSSkill.TOTAL]; 166 | Antiban.MinZoom := 15; 167 | Antiban.MaxZoom := 60; 168 | 169 | inherited; 170 | 171 | Self.SetupItems(); 172 | Self.SetupLocation(); 173 | end; 174 | 175 | 176 | function TCooker.HasProducts(): Boolean; 177 | begin 178 | Result := Inventory.ContainsAny([Self.Products[0].Item, Self.Products[1].Item]); 179 | end; 180 | 181 | 182 | function TCooker.Deposit(): Boolean; 183 | var 184 | invCount: Int32; 185 | begin 186 | invCount := Inventory.Count(); 187 | Result := Self.DepositItem(Self.Products[0]); 188 | Self.DepositItem(Self.Products[1]); 189 | 190 | if Result then 191 | begin 192 | Self.TotalActions += invCount - Inventory.Count(); 193 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 194 | end; 195 | end; 196 | 197 | function TCooker.DoCooking(): Boolean; 198 | var 199 | fire, tpa: TPointArray; 200 | playerBox: TBox; 201 | begin 202 | case CurrentLocation of 203 | ERSLocation.ROGUES_DEN: 204 | begin 205 | playerBox := Box(Mainscreen.Center, 100, 100); 206 | if SRL.FindColors(tpa, CTS2(2730450, 13, 0.09, 1.45), playerBox) > 0 then 207 | fire += tpa; 208 | if SRL.FindColors(tpa, CTS2(15432, 1, 0.15, 0.01), playerBox) > 0 then 209 | fire += tpa; 210 | 211 | Mouse.Move(fire.Cluster(1).Biggest()); 212 | if Mainscreen.IsUpText(['Cook', 'Fire']) then 213 | begin 214 | Mouse.Click(MOUSE_LEFT); 215 | Minimap.WaitPlayerMoving(300, 3000); 216 | Exit(Make.IsOpen(4000)); 217 | end; 218 | end; 219 | end; 220 | 221 | if CookingObj.WalkSelectOption(['Cook', 'Fire']) then 222 | begin 223 | Minimap.WaitPlayerMoving(300, 3000); 224 | Result := Make.IsOpen(4000); 225 | end; 226 | end; 227 | 228 | function TCooker.HandleMake(): Boolean; 229 | var 230 | i: Int32 := 0; 231 | begin 232 | if not Make.IsOpen() then //not sure if I can remove this. 233 | Exit; //it's probably not needed. 234 | 235 | Result := Make.Select(i, Make.QUANTITY_ALL, Antiban.BioDice()); 236 | Self.Cooking := Result; 237 | 238 | if Result then 239 | WaitUntil(not Make.IsOpen(), 100, 4000); 240 | end; 241 | 242 | 243 | function TCooker.IsCooking(waitTime: Int32 = 2500): Boolean; 244 | var 245 | count: Int32; 246 | begin 247 | count := Inventory.CountItem(Self.Ingredient.Item); 248 | if count = 0 then 249 | Exit; 250 | 251 | Result := WaitUntil(count > Inventory.CountItem(Self.Ingredient.Item), 300, waitTime); 252 | if Result then 253 | WL.Activity.Restart(); 254 | end; 255 | 256 | function TCooker.WaitCooking(): Boolean; 257 | begin 258 | Result := Self.IsCooking(); 259 | Self.Cooking := Result; 260 | end; 261 | 262 | 263 | function TCooker.GetState(): ECookerState; 264 | begin 265 | if WL.Activity.IsFinished() then 266 | Exit(ECookerState.END_SCRIPT); 267 | 268 | if ChooseOption.IsOpen() then 269 | Exit(ECookerState.CLOSE_CONTEXT); 270 | 271 | if XPBar.EarnedXP() then 272 | Exit(ECookerState.WAIT_COOKING); 273 | 274 | if Chat.LeveledUp() then 275 | begin 276 | Self.Cooking := False; 277 | Exit(ECookerState.LEVEL_UP); 278 | end; 279 | 280 | if Make.IsOpen() then 281 | Exit(ECookerState.HANDLE_MAKE); 282 | 283 | if RSInterface.IsOpen() then 284 | begin 285 | Self.Cooking := False; 286 | Self.HoveringBank := False; 287 | if not Self.BankEmpty and Bank.IsOpen() then 288 | begin 289 | if Self.HasProducts() then 290 | Exit(ECookerState.DEPOSIT_ITEMS); 291 | 292 | if not Inventory.ContainsItem(Self.Ingredient.Item) then 293 | Exit(ECookerState.WITHDRAW_ITEMS); 294 | end; 295 | 296 | if not Self.CollectEmpty and CollectBox.IsOpen() then 297 | begin 298 | if not CollectBox.ContainsItem(Self.Ingredient.Item) then 299 | Exit(ECookerState.HANDLE_COLLECT); 300 | end; 301 | 302 | Exit(ECookerState.CLOSE_INTERFACE); 303 | end; 304 | 305 | if Inventory.ContainsItem(Self.Ingredient.Item) then 306 | begin 307 | if Self.Cooking then 308 | Exit(ECookerState.WAIT_COOKING); 309 | 310 | Exit(ECookerState.DO_COOKING); 311 | end; 312 | 313 | if Self.BankEmpty and Self.CollectEmpty then 314 | Exit(ECookerState.END_SCRIPT); 315 | 316 | if Self.BankEmpty then 317 | Exit(ECookerState.OPEN_COLLECT); 318 | 319 | Exit(ECookerState.OPEN_BANK); 320 | end; 321 | 322 | function TCooker.Terminate(): Boolean; override; 323 | begin 324 | Result := inherited(); 325 | if Result then 326 | for 0 to 5 do 327 | if Result := Bank.WithdrawItem(Self.Products[0], True) then 328 | Break; 329 | end; 330 | 331 | procedure TCooker.Run(maxActions: UInt32; maxTime: UInt64); 332 | begin 333 | Self.Init(maxActions, maxTime); 334 | 335 | repeat 336 | Self.State := Self.GetState(); 337 | Self.SetAction(ToString(Self.State)); 338 | 339 | case Self.State of 340 | ECookerState.OPEN_BANK: Banks.WalkOpen(); 341 | ECookerState.WITHDRAW_ITEMS: Self.Withdraw(Self.Ingredient); 342 | ECookerState.DEPOSIT_ITEMS: Self.Deposit(); 343 | 344 | ECookerState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 345 | ECookerState.HANDLE_COLLECT: Self.HandleCollectBox([Self.Ingredient.Item]); 346 | ECookerState.CLOSE_INTERFACE: RSInterface.Close(); 347 | 348 | ECookerState.LEVEL_UP: Chat.HandleLevelUp(); 349 | ECookerState.DO_COOKING: Self.DoCooking(); 350 | ECookerState.HANDLE_MAKE: Self.HandleMake(); 351 | ECookerState.WAIT_COOKING: Self.WaitCooking(); 352 | ECookerState.CLOSE_CONTEXT: ChooseOption.Close(); 353 | 354 | ECookerState.END_SCRIPT: Break; 355 | end; 356 | 357 | Self.DoAntiban(); 358 | until Self.ShouldStop(); 359 | 360 | if not Self.Terminate then 361 | TerminateScript('aio_cooker didn''t terminate properly. Stopping execution.'); 362 | end; 363 | 364 | var 365 | Cooker: TCooker; 366 | 367 | function TRSMake.Select(Index: Int32; Quantity: Int32; UseKeyboard: Boolean = True): Boolean; override; 368 | var 369 | Buttons: TRSButtonArray; 370 | begin 371 | Buttons := Self.GetItemButtons(); 372 | if Index <= High(Buttons) then 373 | Result := Self.SelectHelper(Buttons[Index], Quantity, UseKeyboard); 374 | end; 375 | 376 | function TRSBanks.WalkOpen(mapObj: PRSMapObject = nil): Boolean; override; 377 | begin 378 | if RSInterface.IsOpen() then 379 | begin 380 | if Bank.IsOpen() or BankPin.IsOpen() then 381 | Exit(True); 382 | RSInterface.Close(True); 383 | end; 384 | 385 | if mapObj = nil then mapObj := Self.GetClosest(); 386 | 387 | case mapObj^.MapObjectType of 388 | ERSMapObjectType.OBJ: 389 | case CurrentLocation of 390 | ERSLocation.ROGUES_DEN: Result := mapObj^.WalkSelectOption(['Bank']) or (MainScreen.IsUpText('Emerald') and ChooseOption.Select(['Bank B', 'Bank E'])); 391 | else Result := mapObj^.WalkClick() or (MainScreen.IsUpText('Banker') and ChooseOption.Select(['Bank B', 'Bank E'])); 392 | end; 393 | ERSMapObjectType.NPC: Result := mapObj^.WalkSelectOption(['Bank B', 'Bank E']) or (MainScreen.IsUpText('Bank') and ChooseOption.Select(['Bank B', 'Bank E'])); 394 | end; 395 | 396 | if not Result then 397 | Exit; 398 | 399 | Minimap.WaitMoving(); 400 | Result := WaitUntil(RSInterface.IsOpen(), 300, 3000) and (Bank.IsOpen() or BankPin.IsOpen()); 401 | end; 402 | 403 | {$IFNDEF SCRIPT_CHAIN} 404 | {$IFDEF SCRIPT_GUI} 405 | type 406 | TCookerConfig = record(TScriptForm) 407 | LocSelector: TLabeledCombobox; 408 | CustomFoodName: TLabeledEdit; 409 | FoodSelector: TLabeledCombobox; 410 | Config: TConfigJSON; 411 | end; 412 | 413 | procedure TCookerConfig.StartScript(sender: TObject); override; 414 | begin 415 | CurrentLocation := ERSLocation(Self.LocSelector.GetItemIndex()); 416 | Self.Config.Put('location', Ord(CurrentLocation)); 417 | Self.Config.Put('food_selector', Self.FoodSelector.GetItemIndex()); 418 | 419 | if Self.FoodSelector.GetItemIndex() = 0 then 420 | begin 421 | CurrentFood := Self.CustomFoodName.GetText(); 422 | Self.Config.Put('custom', ToStr(CurrentFood)); 423 | end 424 | else 425 | CurrentFood := Self.FoodSelector.GetText(); 426 | 427 | inherited; 428 | end; 429 | 430 | procedure TCookerConfig.FoodSelectorOnChange(sender: TObject); 431 | var 432 | combobox: TComboBox; 433 | begin 434 | combobox := sender; 435 | Self.CustomFoodName.SetVisible(combobox.getText() = 'Custom'); 436 | end; 437 | 438 | procedure TCookerConfig.Run(); override; 439 | var 440 | tab: TTabSheet; 441 | begin 442 | Self.Setup('Wasp Cooker'); 443 | Self.Config.Setup('wasp-cooker'); 444 | Self.Start.setOnClick(@Self.StartScript); 445 | 446 | Self.AddTab('Script Settings'); 447 | tab := Self.Tabs[High(Self.Tabs)]; 448 | 449 | Self.CreateAccountManager(tab); 450 | 451 | with Self.LocSelector do 452 | begin 453 | Create(tab); 454 | SetCaption('Location:'); 455 | SetLeft(TControl.AdjustToDPI(20)); 456 | SetTop(TControl.AdjustToDPI(200)); 457 | SetWidth(TControl.AdjustToDPI(200)); 458 | SetStyle(csDropDownList); 459 | AddItemArray(['Hosidius kitchen', 'Rogues den', 'Myth''s guild']); 460 | if Self.Config.Has('location') then 461 | SetItemIndex(Self.Config.GetInt('location')) 462 | else 463 | SetItemIndex(Ord(CurrentLocation)); 464 | end; 465 | 466 | with Self.FoodSelector do 467 | begin 468 | Create(tab); 469 | SetCaption('Food type:'); 470 | SetLeft(Self.LocSelector.GetRight() + TControl.AdjustToDPI(20)); 471 | SetTop(Self.LocSelector.GetTop()); 472 | SetWidth(TControl.AdjustToDPI(200)); 473 | SetStyle(csDropDownList); 474 | AddItemArray(RAW_FOOD); 475 | Combobox.setOnChange(@Self.FoodSelectorOnChange); 476 | if Self.Config.Has('food_selector') then 477 | SetItemIndex(Self.Config.GetInt('food_selector')) 478 | else 479 | SetItemIndex(0); 480 | end; 481 | 482 | with Self.CustomFoodName do 483 | begin 484 | Create(tab); 485 | SetCaption('Food name (must be the exact name):'); 486 | SetLeft(Self.FoodSelector.GetRight() + TControl.AdjustToDPI(20)); 487 | SetTop(Self.LocSelector.GetTop()); 488 | SetWidth(TControl.AdjustToDPI(200)); 489 | SetVisible(Self.FoodSelector.GetText() = 'Custom'); 490 | if Self.Config.Has('custom') then 491 | SetText(Self.Config.GetString('custom')) 492 | else 493 | SetText(CurrentFood); 494 | end; 495 | 496 | Self.CreateAntibanManager(); 497 | Self.CreateWaspLibSettings(); 498 | Self.CreateAPISettings(); 499 | 500 | inherited; 501 | end; 502 | 503 | var 504 | CookerConfig: TCookerConfig; 505 | {$ENDIF} 506 | {$ENDIF} 507 | 508 | {$IFNDEF SCRIPT_CHAIN} 509 | begin 510 | {$IFDEF SCRIPT_GUI} 511 | CookerConfig.Run(); 512 | {$ENDIF} 513 | Cooker.Run(WLSettings.MaxActions, WLSettings.MaxTime); 514 | end. 515 | {$ENDIF} 516 | -------------------------------------------------------------------------------- /wasp_jewelry_smelter.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '96576fb4-1fa5-48c2-97d4-4d5344c3f2b0'} 2 | {$DEFINE SCRIPT_REVISION := '14'} 3 | {$IFNDEF SCRIPT_CHAIN} 4 | {$DEFINE SCRIPT_GUI} 5 | {$I SRL-T/osr.simba} 6 | {$I WaspLib/osr.simba} 7 | {$ENDIF} 8 | {$I WaspLib/optional/interfaces/mainscreen/craftscreen.simba} 9 | {$I WaspLib/optional/interfaces/mainscreen/silverscreen.simba} 10 | 11 | type 12 | ERSMetalType = (SILVER, GOLD); 13 | 14 | ERSStoneType = ( 15 | NONE, OPAL, JADE, RED_TOPAZ, SAPPHIRE, EMERALD, 16 | RUBY, DIAMOND, DRAGONSTONE, ONYX, ZENYTE 17 | ); 18 | 19 | ERSJewelType = ( 20 | TIARA, HOLY_SYMBOL, UNHOLY_SYMBOL, BOLTS, RING, 21 | NECKLACE, BRACELET, AMULET 22 | ); 23 | 24 | ERSFurnace = (EDGEVILLE, FALADOR, PRIFDDINAS); 25 | 26 | var 27 | CurrentMetal = ERSMetalType.GOLD; 28 | CurrentStone = ERSStoneType.EMERALD; 29 | CurrentJewel = ERSJewelType.RING; 30 | CurrentFurnace = ERSFurnace.EDGEVILLE; 31 | 32 | type 33 | EJewelCrafterState = ( 34 | HOVER_BANK, OPEN_BANK, 35 | WITHDRAW_MOULD, WITHDRAW_BARS, WITHDRAW_GEMS, 36 | DEPOSIT_JEWELS, DEPOSIT_RANDOM_ITEM, 37 | 38 | OPEN_COLLECT, HANDLE_COLLECT, 39 | 40 | OPEN_FURNACE, CRAFT_JEWEL, WAIT_CRAFT, 41 | 42 | CLOSE_INTERFACE, 43 | 44 | LEVEL_UP, CLOSE_CONTEXT, 45 | 46 | END_SCRIPT, OUT_OF_SUPPLIES 47 | ); 48 | 49 | TJewelryCrafter = record(TBaseBankScript) 50 | State: EJewelCrafterState; 51 | Furnace: TRSObjectV2; 52 | 53 | Mould, Bar, Gem, Jewel: TRSBankItem; 54 | Materials: TRSItemArray; 55 | NoGem, IsCrafting: Boolean; 56 | CraftItem: ERSCraftItem; 57 | end; 58 | 59 | 60 | procedure TAntiban.Setup(); override; 61 | begin 62 | Self.Skills := [ERSSkill.CRAFTING, ERSSkill.TOTAL]; 63 | Self.MinZoom := 0; 64 | Self.MaxZoom := 30; 65 | 66 | inherited; 67 | end; 68 | 69 | procedure TJewelryCrafter.SetupItems(); 70 | begin 71 | case CurrentMetal of 72 | ERSMetalType.SILVER: Self.Bar := TRSBankItem.Setup('Silver bar', 13); 73 | ERSMetalType.GOLD: Self.Bar := TRSBankItem.Setup('Gold bar', 13); 74 | end; 75 | 76 | case CurrentStone of 77 | ERSStoneType.NONE: 78 | begin 79 | Self.Bar.Quantity := -1; 80 | Self.NoGem := True; 81 | end; 82 | ERSStoneType.OPAL: Self.Gem := TRSBankItem.Setup('Opal', 13); 83 | ERSStoneType.JADE: Self.Gem := TRSBankItem.Setup('Jade', 13); 84 | ERSStoneType.RED_TOPAZ: Self.Gem := TRSBankItem.Setup('Red topaz', 13); 85 | ERSStoneType.SAPPHIRE: Self.Gem := TRSBankItem.Setup('Sapphire', 13); 86 | ERSStoneType.EMERALD: Self.Gem := TRSBankItem.Setup('Emerald', 13); 87 | ERSStoneType.RUBY: Self.Gem := TRSBankItem.Setup('Ruby', 13); 88 | ERSStoneType.DIAMOND: Self.Gem := TRSBankItem.Setup('Diamond', 13); 89 | ERSStoneType.DRAGONSTONE: Self.Gem := TRSBankItem.Setup('Dragonstone', 13); 90 | ERSStoneType.ONYX: Self.Gem := TRSBankItem.Setup('Onyx', 13); 91 | ERSStoneType.ZENYTE: Self.Gem := TRSBankItem.Setup('Zenyte', 13); 92 | end; 93 | 94 | case CurrentJewel of 95 | ERSJewelType.TIARA: 96 | begin 97 | Self.Mould := TRSBankItem.Setup('Tiara mould', 1); 98 | CurrentStone := ERSStoneType.NONE; 99 | Self.NoGem := True; 100 | 101 | Self.Bar.Quantity := -1; 102 | 103 | if CurrentMetal = ERSMetalType.GOLD then 104 | Self.Jewel := TRSBankItem.Setup('Gold tiara', -1) 105 | else 106 | Self.Jewel := TRSBankItem.Setup('Tiara', -1); 107 | end; 108 | 109 | ERSJewelType.HOLY_SYMBOL: 110 | begin 111 | Self.Mould := TRSBankItem.Setup('Holy mould', 1); 112 | CurrentMetal := ERSMetalType.SILVER; 113 | CurrentStone := ERSStoneType.NONE; 114 | Self.NoGem := True; 115 | Self.Jewel := TRSBankItem.Setup('Unstrung symbol', -1); 116 | end; 117 | 118 | ERSJewelType.UNHOLY_SYMBOL: 119 | begin 120 | Self.Mould := TRSBankItem.Setup('Unholy mould', 1); 121 | CurrentMetal := ERSMetalType.SILVER; 122 | CurrentStone := ERSStoneType.NONE; 123 | Self.NoGem := True; 124 | Self.Jewel := TRSBankItem.Setup('Unstrung emblem', -1); 125 | end; 126 | 127 | ERSJewelType.BOLTS: 128 | begin 129 | Self.Mould := TRSBankItem.Setup('Bolt mould', 1); 130 | CurrentMetal := ERSMetalType.SILVER; 131 | CurrentStone := ERSStoneType.NONE; 132 | Self.NoGem := True; 133 | Self.Jewel := TRSBankItem.Setup('Silver bolts (unf)', -1); 134 | end; 135 | 136 | ERSJewelType.RING: 137 | begin 138 | Self.Mould := TRSBankItem.Setup('Ring mould', 1); 139 | if Self.NoGem then 140 | Self.Jewel := TRSBankItem.Setup('Gold ring', -1) 141 | else 142 | Self.Jewel := TRSBankItem.Setup(ToStr(Self.Gem.Item).Replace('Red t', 'T') + ' ring', -1); 143 | end; 144 | 145 | ERSJewelType.NECKLACE: 146 | begin 147 | Self.Mould := TRSBankItem.Setup('Necklace mould', 1); 148 | if Self.NoGem then 149 | Self.Jewel := TRSBankItem.Setup('Gold necklace', -1) 150 | else 151 | Self.Jewel := TRSBankItem.Setup(ToStr(Self.Gem.Item).Replace('Red t', 'T') + ' necklace', -1); 152 | end; 153 | 154 | ERSJewelType.BRACELET: 155 | begin 156 | Self.Mould := TRSBankItem.Setup('Bracelet mould', 1); 157 | if Self.NoGem then 158 | Self.Jewel := TRSBankItem.Setup('Gold bracelet', -1) 159 | else 160 | Self.Jewel := TRSBankItem.Setup(ToStr(Self.Gem.Item).Replace('Red t', 'T') + ' bracelet', -1); 161 | end; 162 | 163 | ERSJewelType.AMULET: 164 | begin 165 | Self.Mould := TRSBankItem.Setup('Amulet mould', 1); 166 | if Self.NoGem then 167 | Self.Jewel := TRSBankItem.Setup('Gold amulet (u)', -1) 168 | else 169 | Self.Jewel := TRSBankItem.Setup(ToStr(Self.Gem.Item).Replace('Red t', 'T') + ' amulet (u)', -1); 170 | end; 171 | end; 172 | 173 | if (CurrentMetal = ERSMetalType.GOLD) and (CurrentJewel <> ERSJewelType.TIARA) then 174 | Self.CraftItem.SetCraftItem(Self.Jewel.Item); 175 | 176 | Self.ActionProfit := ItemData.GetAverage(Self.Jewel.Item) - 177 | ItemData.GetAverage(Self.Bar.Item); 178 | 179 | if not Self.NoGem then 180 | Self.ActionProfit -= ItemData.GetAverage(Self.Gem.Item); 181 | 182 | Self.Materials := [Self.Bar.Item, Self.Jewel.Item, Self.Mould.Item]; 183 | 184 | if not Self.NoGem then 185 | Self.Materials += Self.Gem.Item; 186 | end; 187 | 188 | procedure TJewelryCrafter.Init(maxActions: UInt32; maxTime: UInt64); override; 189 | begin 190 | inherited; 191 | 192 | case CurrentFurnace of 193 | //ERSFurnace.AL_KHARID: Map.SetupChunk(ERSChunk.AL_KHARID); 194 | ERSFurnace.EDGEVILLE: Map.SetupChunk(ERSChunk.EDGEVILLE); 195 | ERSFurnace.FALADOR: Map.SetupChunk(ERSChunk.FALADOR); 196 | ERSFurnace.PRIFDDINAS: Map.SetupChunk(ERSChunk.PRIFDDINAS); 197 | end; 198 | 199 | Objects.Setup(Map.Objects(), @Map.Walker); 200 | Self.Furnace := Objects.Get('Furnace'); 201 | 202 | Self.SetupItems(); 203 | end; 204 | 205 | 206 | 207 | function TJewelryCrafter.OpenFurnace(): Boolean; 208 | begin 209 | if Furnace.WalkSelectOption(['Smelt']) then 210 | begin 211 | Minimap.WaitMoving(); 212 | Result := WaitUntil(CraftScreen.IsOpen() or SilverScreen.IsOpen() or Make.IsOpen(), 300, 5000); 213 | end; 214 | end; 215 | 216 | 217 | function TJewelryCrafter.WaitCraft(waitTime: Int32 = 6000): Boolean; 218 | var 219 | count: Int32; 220 | begin 221 | count := Inventory.CountItem(Self.Bar.Item); 222 | if count = 0 then 223 | begin 224 | Self.IsCrafting := False; 225 | Exit; 226 | end; 227 | 228 | Result := WaitUntil((Inventory.CountItem(Self.Bar.Item) < count) or XPBar.EarnedXP(), 300, waitTime); 229 | Self.IsCrafting := Result; 230 | 231 | if Result then 232 | WL.Activity.Restart(); 233 | end; 234 | 235 | function TJewelryCrafter._CraftSilverJewel(): Boolean; 236 | begin 237 | if SilverScreen.CraftItem(Self.Jewel.Item, -1, Antiban.BioDice(EBioBehavior.KEYBOARD_CHAT_CHANCE)) then 238 | Result := Self.WaitCraft(); 239 | end; 240 | 241 | function TJewelryCrafter._CraftGoldJewel(): Boolean; 242 | begin 243 | if CurrentJewel = ERSJewelType.TIARA then 244 | begin 245 | if Make.Select(0, Make.QUANTITY_ALL) then 246 | Exit(Self.WaitCraft()); 247 | Exit; 248 | end; 249 | 250 | if CraftScreen.CraftItem(Self.CraftItem, -1, Antiban.BioDice(EBioBehavior.KEYBOARD_CHAT_CHANCE)) then 251 | Result := Self.WaitCraft(); 252 | end; 253 | 254 | function TJewelryCrafter.CraftJewel(): Boolean; 255 | begin 256 | if not Inventory.ContainsItem(Self.Bar.Item) then 257 | Exit; 258 | 259 | if CurrentMetal = ERSMetalType.SILVER then 260 | Exit(Self._CraftSilverJewel()); 261 | 262 | Result := Self._CraftGoldJewel(); 263 | end; 264 | 265 | 266 | function TJewelryCrafter.GetState(): EJewelCrafterState; 267 | begin 268 | if WL.Activity.IsFinished() then 269 | Exit(EJewelCrafterState.END_SCRIPT); 270 | 271 | if Chat.LeveledUp() then 272 | begin 273 | Self.IsCrafting := False; 274 | Exit(EJewelCrafterState.LEVEL_UP); 275 | end; 276 | 277 | if RSInterface.IsOpen() then 278 | begin 279 | Self.IsCrafting := False; 280 | Self.HoveringBank := False; 281 | if Bank.IsOpen() then 282 | begin 283 | if Inventory.ContainsItem(Self.Jewel.Item) then 284 | Exit(EJewelCrafterState.DEPOSIT_JEWELS); 285 | 286 | if Inventory.ContainsRandomItems(Self.Materials) then 287 | Exit(EJewelCrafterState.DEPOSIT_RANDOM_ITEM); 288 | 289 | if not Self.BankEmpty then 290 | begin 291 | if not Inventory.ContainsItem(Self.Mould.Item) then 292 | Exit(EJewelCrafterState.WITHDRAW_MOULD); 293 | 294 | if not Inventory.ContainsItem(Self.Bar.Item) then 295 | Exit(EJewelCrafterState.WITHDRAW_BARS); 296 | 297 | if not Self.NoGem and not Inventory.ContainsItem(Self.Gem.Item) then 298 | Exit(EJewelCrafterState.WITHDRAW_GEMS); 299 | end; 300 | end; 301 | 302 | if CraftScreen.IsOpen() or SilverScreen.IsOpen() then 303 | Exit(EJewelCrafterState.CRAFT_JEWEL); 304 | 305 | if not Self.CollectEmpty and CollectBox.IsOpen() then 306 | Exit(EJewelCrafterState.HANDLE_COLLECT); 307 | 308 | Exit(EJewelCrafterState.CLOSE_INTERFACE); 309 | end; 310 | 311 | if Make.IsOpen() then 312 | Exit(EJewelCrafterState.CRAFT_JEWEL); 313 | 314 | if (Self.NoGem and Inventory.ContainsAll([Self.Mould.Item, Self.Bar.Item])) or 315 | (not Self.NoGem and Inventory.ContainsAll([Self.Mould.Item, Self.Bar.Item, Self.Gem.Item])) then 316 | begin 317 | if Self.IsCrafting then 318 | begin 319 | if not Self.HoveringBank then 320 | begin 321 | Self.CountItemsLeft(Self.Bar.Item); 322 | 323 | if Self.ShouldHoverBank() then 324 | Exit(EJewelCrafterState.HOVER_BANK); 325 | end; 326 | 327 | Exit(EJewelCrafterState.WAIT_CRAFT); 328 | end; 329 | 330 | if Make.IsOpen() then 331 | Exit(EJewelCrafterState.CRAFT_JEWEL); 332 | 333 | Exit(EJewelCrafterState.OPEN_FURNACE); 334 | end; 335 | 336 | if Self.BankEmpty then 337 | begin 338 | if Self.CollectEmpty then 339 | Exit(EJewelCrafterState.OUT_OF_SUPPLIES); 340 | 341 | Exit(EJewelCrafterState.OPEN_COLLECT); 342 | end; 343 | 344 | if Self.BankEmpty then 345 | Exit(EJewelCrafterState.OPEN_COLLECT); 346 | 347 | Exit(EJewelCrafterState.OPEN_BANK); 348 | end; 349 | 350 | function TJewelryCrafter.Terminate(): Boolean; override; 351 | begin 352 | Result := inherited; 353 | end; 354 | 355 | procedure TJewelryCrafter.Run(maxActions: UInt32; maxTime: UInt64); 356 | begin 357 | Self.Init(maxActions, maxTime); 358 | 359 | repeat 360 | Self.State := Self.GetState(); 361 | Self.SetAction(ToStr(Self.State)); 362 | 363 | case Self.State of 364 | EJewelCrafterState.HOVER_BANK: Self.HoverBank(); 365 | EJewelCrafterState.OPEN_BANK: Banks.WalkOpen(); 366 | EJewelCrafterState.WITHDRAW_MOULD: Self.Withdraw(Self.Mould); 367 | EJewelCrafterState.WITHDRAW_BARS: Self.Withdraw(Self.Bar); 368 | EJewelCrafterState.WITHDRAW_GEMS: Self.Withdraw(Self.Gem); 369 | EJewelCrafterState.DEPOSIT_JEWELS: Bank.DepositItem(Self.Jewel, True); 370 | EJewelCrafterState.DEPOSIT_RANDOM_ITEM: Bank.DepositRandomItems(Self.Materials); 371 | 372 | EJewelCrafterState.OPEN_COLLECT: CollectBoxes.WalkOpen(); 373 | EJewelCrafterState.HANDLE_COLLECT: Self.HandleCollectBox(Self.Materials); 374 | 375 | EJewelCrafterState.OPEN_FURNACE: Self.OpenFurnace(); 376 | EJewelCrafterState.CRAFT_JEWEL: Self.CraftJewel(); 377 | EJewelCrafterState.WAIT_CRAFT: Self.WaitCraft(); 378 | 379 | EJewelCrafterState.CLOSE_INTERFACE: RSInterface.Close(); 380 | EJewelCrafterState.CLOSE_CONTEXT: ChooseOption.Close(); 381 | EJewelCrafterState.LEVEL_UP: Chat.HandleLevelUp(); 382 | 383 | EJewelCrafterState.END_SCRIPT, EJewelCrafterState.OUT_OF_SUPPLIES: Break; 384 | end; 385 | 386 | Self.DoAntiban(); 387 | until Self.ShouldStop(); 388 | 389 | if not Self.Terminate() then 390 | TerminateScript(Self.Name + ' didn''t terminate properly. Stopping execution.'); 391 | end; 392 | 393 | var 394 | JewelryCrafter: TJewelryCrafter; 395 | 396 | {$IFNDEF SCRIPT_CHAIN} 397 | {$IFDEF SCRIPT_GUI} 398 | type 399 | TJewelryCrafterConfig = record(TScriptForm) 400 | BarTypeSelector: TLabeledCombobox; 401 | StoneTypeSelector: TLabeledCombobox; 402 | JewelTypeSelector: TLabeledCombobox; 403 | FurnaceSelector: TLabeledCombobox; 404 | Config: TConfigJSON; 405 | end; 406 | 407 | procedure TJewelryCrafterConfig.StartScript(sender: TObject); override; 408 | begin 409 | CurrentFurnace := ERSFurnace(Self.FurnaceSelector.GetItemIndex()); 410 | CurrentJewel := ERSJewelType(Self.JewelTypeSelector.GetItemIndex()); 411 | CurrentStone := ERSStoneType(Self.StoneTypeSelector.GetItemIndex()); 412 | CurrentMetal := ERSMetalType(Self.BarTypeSelector.GetItemIndex()); 413 | 414 | Self.Config.Put('furnace', Ord(CurrentFurnace)); 415 | Self.Config.Put('jewel', Ord(CurrentJewel)); 416 | Self.Config.Put('stone', Ord(CurrentStone)); 417 | Self.Config.Put('metal', Ord(CurrentMetal)); 418 | 419 | inherited; 420 | end; 421 | 422 | procedure TJewelryCrafterConfig.StoneSelectorOnChange(sender: TObject); 423 | var 424 | combobox: TComboBox; 425 | i, j: Int32; 426 | begin 427 | combobox := sender; 428 | i := combobox.getItemIndex(); 429 | j := Self.JewelTypeSelector.GetItemIndex(); 430 | 431 | Self.BarTypeSelector.SetEnabled((i = 0) and (j = 0)); 432 | 433 | case i of 434 | 1..3: Self.BarTypeSelector.SetItemIndex(0); 435 | else 436 | begin 437 | if j < 4 then 438 | Self.BarTypeSelector.SetItemIndex(0) 439 | else 440 | Self.BarTypeSelector.SetItemIndex(1); 441 | end; 442 | end; 443 | end; 444 | 445 | procedure TJewelryCrafterConfig.JewelSelectorOnChange(sender: TObject); 446 | var 447 | combobox: TComboBox; 448 | i: Int32; 449 | begin 450 | combobox := sender; 451 | i := combobox.getItemIndex(); 452 | 453 | Self.StoneTypeSelector.SetEnabled(i > 3); 454 | if i < 4 then 455 | Self.StoneTypeSelector.SetItemIndex(0); 456 | 457 | Self.StoneSelectorOnChange(Self.StoneTypeSelector.ComboBox); 458 | end; 459 | 460 | 461 | procedure TJewelryCrafterConfig.Run(); override; 462 | var 463 | tab: TTabSheet; 464 | begin 465 | Self.Setup('Wasp Jewelry Crafter'); 466 | Self.Config.Setup('wasp-jewelry-crafter'); 467 | Self.Start.SetOnClick(@Self.StartScript); 468 | 469 | if Self.Config.Has('furnace') then 470 | CurrentFurnace := ERSFurnace(Self.Config.GetInt('furnace')); 471 | if Self.Config.Has('jewel') then 472 | CurrentJewel := ERSJewelType(Self.Config.GetInt('jewel')); 473 | if Self.Config.Has('stone') then 474 | CurrentStone := ERSStoneType(Self.Config.GetInt('stone')); 475 | if Self.Config.Has('bar') then 476 | CurrentMetal := ERSMetalType(Self.Config.GetInt('bar')); 477 | 478 | Self.AddTab('Script Settings'); 479 | tab := Self.Tabs[High(Self.Tabs)]; 480 | 481 | Self.CreateAccountManager(tab); 482 | 483 | with Self.FurnaceSelector do 484 | begin 485 | Create(tab); 486 | SetCaption('Furnace:'); 487 | SetLeft(TControl.AdjustToDPI(50)); 488 | SetTop(TControl.AdjustToDPI(200)); 489 | SetStyle(csDropDownList); 490 | AddItemArray([ 491 | 'Edgeville', 'Falador', 'Prifddinnas' 492 | ]); 493 | SetItemIndex(Ord(CurrentFurnace)); 494 | end; 495 | 496 | with Self.JewelTypeSelector do 497 | begin 498 | Create(tab); 499 | SetCaption('Jewel type:'); 500 | SetLeft(Self.FurnaceSelector.GetLeft()); 501 | SetTop(Self.FurnaceSelector.GetBottom() + TControl.AdjustToDPI(20)); 502 | SetStyle(csDropDownList); 503 | AddItemArray([ 504 | 'Tiara', 'Holy symbol', 'Unholy symbol', 'Bolts', 'Ring', 505 | 'Necklace', 'Bracelet', 'Amulet' 506 | ]); 507 | SetItemIndex(Ord(CurrentJewel)); 508 | ComboBox.SetOnChange(@Self.JewelSelectorOnChange); 509 | end; 510 | 511 | with Self.StoneTypeSelector do 512 | begin 513 | Create(tab); 514 | SetCaption('Stone type:'); 515 | SetLeft(Self.JewelTypeSelector.GetRight() + TControl.AdjustToDPI(15)); 516 | SetTop(Self.JewelTypeSelector.GetTop()); 517 | SetStyle(csDropDownList); 518 | AddItemArray([ 519 | 'None', 'Opal', 'Jade', 'Red topaz', 'Sapphire', 'Emerald', 520 | 'Ruby', 'Diamond', 'Dragonstone', 'Onyx', 'Zenyte' 521 | ]); 522 | SetItemIndex(Ord(CurrentStone)); 523 | ComboBox.SetOnChange(@Self.StoneSelectorOnChange); 524 | end; 525 | 526 | with Self.BarTypeSelector do 527 | begin 528 | Create(tab); 529 | SetCaption('Bar type:'); 530 | SetLeft(Self.StoneTypeSelector.GetRight() + TControl.AdjustToDPI(15)); 531 | SetTop(Self.StoneTypeSelector.GetTop()); 532 | SetStyle(csDropDownList); 533 | AddItemArray(['Silver', 'Gold']); 534 | SetItemIndex(Ord(CurrentMetal)); 535 | SetEnabled(False); 536 | end; 537 | 538 | Self.CreateAntibanManager(); 539 | Self.CreateWaspLibSettings(); 540 | Self.CreateAPISettings(); 541 | 542 | Self.JewelSelectorOnChange(Self.JewelTypeSelector.ComboBox); 543 | 544 | inherited; 545 | end; 546 | 547 | var 548 | JewelryCrafterConfig: TJewelryCrafterConfig; 549 | {$ENDIF} 550 | {$ENDIF} 551 | 552 | {$IFNDEF SCRIPT_CHAIN} 553 | begin 554 | {$IFDEF SCRIPT_GUI} 555 | JewelryCrafterConfig.Run(); 556 | {$ENDIF} 557 | JewelryCrafter.Run(WLSettings.MaxActions, WLSettings.MaxTime); 558 | end. 559 | {$ENDIF} 560 | -------------------------------------------------------------------------------- /wasp_kraken.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'a398a083-63fd-4f13-936b-3963354fb4c1'} 2 | {$DEFINE SCRIPT_REVISION := '45'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | {$I WaspLib/optional/handlers/combathandler.simba} 7 | {$I WaspLib/optional/interfaces/mainscreen/fairyring.simba} 8 | {$SCOPEDENUMS ON} 9 | 10 | type 11 | EKrakenState = ( 12 | WAIT_STATE, 13 | EQUIP_STAFF, USE_FAIRYRING, 14 | 15 | OPEN_BANK, DEPOSIT_LOOT, WITHDRAW_FOOD, HANDLE_PIN, CLOSE_INTERFACE, 16 | 17 | //Outside 18 | ENTER_COVE, ENTER_CREVICE, 19 | HANDLE_CHAT, HANDLE_WARNING, 20 | 21 | //Inside 22 | WALK_BRIDGE, 23 | CHECK_LOOT, 24 | WAKE_KRAKEN, ATTACK_KRAKEN, SELECT_SPELL, CAST_BLOOD, 25 | BOOST, EAT_FOOD, DRINK_PRAYER, ENABLE_QPRAY, 26 | OUT_OF_FOOD, 27 | ALCH_DROP, 28 | 29 | EQUIP_GEAR, EQUIP_BRACELET, 30 | END_SCRIPT 31 | ); 32 | 33 | TKrakenKiller = record(TBaseScript) 34 | State: EKrakenState; 35 | 36 | Bridge: TPoint; 37 | SleepyKraken, KrakenTPA: TPointArray; 38 | 39 | Kraken: TRSNPCV2; 40 | KrakenFinder: TRSObjectFinder; 41 | 42 | Crevice, CaveEntrance: TRSObjectV2; 43 | 44 | AnotherPLayer, IsAttacking, CheckedLoot, UseImbuedHeart, 45 | HasBloodSpells: Boolean; 46 | BloodSpell: ERSSpell; 47 | 48 | Loot, Gear: TRSItemArray; 49 | 50 | ImbuedHeart: TCountDown; 51 | end; 52 | 53 | 54 | procedure TAntiban.SetupBreaks(); override; 55 | begin 56 | if Self.Breaks <> [] then 57 | Exit; 58 | 59 | Self.AddBreak(30 * ONE_MINUTE, 2 * ONE_MINUTE, 0.33, 0.01); 60 | Self.AddBreak(45 * ONE_MINUTE, 4 * ONE_MINUTE, 0.33, 0.15); 61 | 62 | Self.OnBreaking := @OnBreakingTask; 63 | end; 64 | 65 | function TKrakenKiller.CanCastBloodSpells(): Boolean; 66 | const 67 | BLOOD_SPELLS: array of ERSSpell = [ 68 | ERSSpell.BLOOD_BARRAGE, ERSSpell.BLOOD_BLITZ, 69 | ERSSPell.BLOOD_BURST, ERSSpell.BLOOD_RUSH 70 | ]; 71 | var 72 | i: Int32; 73 | begin 74 | if not Magic.IsSpellBook(ERSSpellBook.ANCIENT) or not Magic.Open() then 75 | Exit; 76 | 77 | for i := 0 to 3 do 78 | begin 79 | if Magic.ContainsSpell(BLOOD_SPELLS[i]) then 80 | begin 81 | Self.BloodSpell := BLOOD_SPELLS[i]; 82 | Exit(True); 83 | end; 84 | end; 85 | end; 86 | 87 | procedure TKrakenKiller.Init(maxActions: UInt32; maxTime: UInt64); override; 88 | var 89 | i: Int32; 90 | qPrayers: ERSPrayerArray; 91 | begin 92 | Antiban.Skills := [ERSSkill.MAGIC, ERSSkill.HITPOINTS, ERSSkill.TOTAL]; 93 | Antiban.MinZoom := 0; 94 | Antiban.MaxZoom := 40; 95 | 96 | inherited; 97 | 98 | Map.SetupChunks([Chunk(Box(35,56,36,56), 0), Chunk(Box(35,156,35,156), 0), Chunk(Box(48,54,50,53), 0)]); 99 | Objects.Setup(Map.Objects(), @Map.Walker); 100 | 101 | Self.Crevice := Objects.Get('Crevice'); 102 | Self.CaveEntrance := Objects.Get('Cave Entrance'); 103 | 104 | Self.Kraken.Setup(14, 4, 14, [[5024, 10286]]); 105 | Self.Kraken.SetupUpText('Kraken'); 106 | Self.Kraken.Finder.Colors += CTS2(14407349, 13, 0.13, 1.43); 107 | 108 | Self.Bridge := [5024, 10304]; 109 | 110 | FoodHandler.Amount := -1; 111 | 112 | Self.KrakenFinder.ClusterDistance := 3; 113 | Self.KrakenFinder.Erode := 2; 114 | Self.KrakenFinder.Grow := 4; 115 | Self.KrakenFinder.Colors += CTS2(14407349, 13, 0.13, 1.43); 116 | Self.KrakenFinder.MinShortSide := 70; 117 | 118 | Self.UseImbuedHeart := True; 119 | Self.ImbuedHeart.Setup(7 * ONE_MINUTE); 120 | 121 | Options.SetNPCAttackOption(ERSAttackOption.ALWAYS_LEFT_CLICK); 122 | Combat.SetAutoRetaliate(False); 123 | CombatHandler.Setup(True, Self.Kraken, 5000, 4000); 124 | 125 | Self.HasBloodSpells := Self.CanCastBloodSpells(); 126 | 127 | Self.Gear := Equipment.DiscoverAll(); 128 | 129 | i := Self.Gear.Find('expeditious bracelet'); 130 | if i > -1 then Delete(Self.Gear, i, 1); 131 | i := Self.Gear.Find('bracelet of slaughter'); 132 | if i > -1 then Delete(Self.Gear, i, 1); 133 | i := Self.Gear.Find('ring of recoil'); 134 | if i > -1 then Delete(Self.Gear, i, 1); 135 | 136 | for i := 0 to High(LootHandler.Loot) do 137 | begin 138 | if LootHandler.Loot[i].Item = 'Shark' then Continue; 139 | 140 | if LootHandler.Loot[i].Noted then 141 | Self.Loot += 'noted ' + LootHandler.Loot[i].Item 142 | else 143 | if not Self.Gear.Contains(LootHandler.Loot[i].Item) then 144 | Self.Loot += LootHandler.Loot[i].Item; 145 | end; 146 | 147 | if QuickPrayer.Open() then 148 | begin 149 | qPrayers := QuickPrayer.GetSelectedPrayers(); 150 | 151 | for i := 0 to High(qPrayers) do 152 | begin 153 | if qPrayers[i] = ERSPrayer.AUGURY then Continue; 154 | if qPrayers[i] = ERSPrayer.MYSTIC_MIGHT then Continue; 155 | if qPrayers[i] = ERSPrayer.MYSTIC_LORE then Continue; 156 | if qPrayers[i] = ERSPrayer.MYSTIC_WILL then Continue; 157 | QuickPrayer.DeselectPrayer(qPrayers[i]); 158 | end; 159 | 160 | qPrayers := [ERSPrayer.AUGURY, ERSPrayer.MYSTIC_MIGHT, ERSPrayer.MYSTIC_LORE, ERSPrayer.MYSTIC_WILL]; 161 | 162 | for i := 0 to High(qPrayers) do 163 | if Prayer.CanActivate(qPrayers[i]) and QuickPrayer.SelectPrayer(qPrayers[i]) then 164 | Break; 165 | 166 | QuickPrayer.Close(); 167 | end; 168 | end; 169 | 170 | 171 | function TKrakenKiller.InsideBossRoom(): Boolean; 172 | begin 173 | Result := MainScreen.InMultiCombat(); 174 | if not Result then 175 | Self.CheckedLoot := True; 176 | end; 177 | 178 | function TKrakenKiller.EnterCove(): Boolean; 179 | begin 180 | if Self.CaveEntrance.WalkSelectOption(['Enter']) then 181 | begin 182 | Minimap.WaitMoving(); 183 | Result := WaitUntil(not Minimap.OnGroundLevel(), 300, 5000); 184 | end; 185 | end; 186 | 187 | function TKrakenKiller.EnterCrevice(): Boolean; 188 | begin 189 | if Self.Crevice.WalkSelectOption(['Private']) then 190 | begin 191 | Minimap.WaitMoving; 192 | Result := WaitUntil(('Pay' in Chat.GetChatTitle()) or BankPin.IsOpen(), 300, 5000); 193 | end; 194 | end; 195 | 196 | function TKrakenKiller.HandlePayment(): Boolean; 197 | begin 198 | Chat.ClickOption('Yes', BioHash); 199 | Result := WaitUntil(Self.InsideBossRoom() or Chat.HasContinue(), 300, 8000); 200 | end; 201 | 202 | 203 | function TKrakenKiller.FindSleepyKraken(): Boolean; 204 | var 205 | ATPA: T2DPointArray; 206 | begin 207 | ATPA := MainScreen.FindObject(Self.KrakenFinder); 208 | Result := ATPA <> []; 209 | if Result then 210 | Self.SleepyKraken := ATPA[0]; 211 | end; 212 | 213 | function TKrakenKiller.FindRagingKraken(): Boolean; 214 | var 215 | MMDots: TPointArray; 216 | cuboid: TCuboidEx; 217 | KrakenDot: TPoint; 218 | begin 219 | MMDots := Minimap.GetDots(ERSMinimapDot.NPC); 220 | Result := (Length(MMDots) >= 5) and not Self.FindSleepyKraken(); 221 | 222 | if not Result then 223 | Exit; 224 | 225 | Self.CheckedLoot := False; 226 | 227 | MMDots.Sort(MMDots.Mean()); 228 | KrakenDot := MMDots[0]; 229 | 230 | cuboid := Minimap.GetCuboidMS(KrakenDot, [3, 3, 8], [-3, -3]); 231 | Self.KrakenTPA := cuboid.ShapeFill(); 232 | end; 233 | 234 | 235 | function TKrakenKiller.FinishedSlayerTask(): Boolean; 236 | begin 237 | Result := ('Lieve' in Chat.GetChat) or ('Lieve' in Chat.GetMessage(7)); 238 | if Result then 239 | TerminateScript('FINISHED SLAYER TASK'); 240 | end; 241 | 242 | 243 | function TKrakenKiller.WakeKraken(): Boolean; 244 | begin 245 | if MainScreen.IsUpText('>') then ChooseOption.Select('Cancel'); 246 | if not Inventory.SetSelectedItem('Fishing explosive') then Exit; 247 | 248 | Mouse.Move(Self.SleepyKraken); 249 | if MainScreen.IsUpText('Whirl') then 250 | begin 251 | Mouse.Click(MOUSE_LEFT); 252 | if MainScreen.DidRedClick() then 253 | begin 254 | Result := WaitUntil(Self.FindRagingKraken() or Self.FinishedSlayerTask(), 100, 7000); 255 | Self.IsAttacking := Result; 256 | end; 257 | end; 258 | 259 | if Result then 260 | WL.Activity.Restart(); 261 | end; 262 | 263 | function TKrakenKiller.AttackKraken(): Boolean; 264 | begin 265 | Mouse.Move(KrakenTPA.Mean()); 266 | if MainScreen.IsUpText('Attack K') then 267 | begin 268 | Mouse.Click(MOUSE_LEFT); 269 | Result := MainScreen.DidRedClick(); 270 | Self.IsAttacking := Result; 271 | end; 272 | end; 273 | 274 | function TKrakenKiller.CastBlood(): Boolean; 275 | begin 276 | Mouse.Move(KrakenTPA.Mean()); 277 | 278 | if MainScreen.IsUpText('> K') then 279 | begin 280 | XPBar.EarnedXP(); 281 | Mouse.Click(MOUSE_LEFT); 282 | Result := MainScreen.DidRedClick() and XPBar.WaitXP(1200); 283 | if Result then 284 | Self.IsAttacking := False; 285 | end; 286 | end; 287 | 288 | 289 | 290 | function TKrakenKiller.BoostMagic(): Boolean; 291 | var 292 | slot: Int32; 293 | begin 294 | Self.UseImbuedHeart := Inventory.FindItem('Imbued heart', slot) or 295 | Inventory.FindItem('Saturated heart', slot); 296 | 297 | Result := Self.UseImbuedHeart; 298 | if not Result then Exit; 299 | 300 | Inventory.ClickSlot(slot); 301 | ImbuedHeart.Restart(Random(3000, 35000)); 302 | IsAttacking := False 303 | end; 304 | 305 | function TKrakenKiller.CheckLoot(): Boolean; 306 | var 307 | rect: TRectangle; 308 | begin 309 | if MainScreen.IsUpText('>') then ChooseOption.Select('Cancel'); 310 | 311 | while Inventory.IsFull() and Inventory.ContainsConsumable(ERSConsumable.FOOD) do 312 | Inventory.Consume(ERSConsumable.FOOD); 313 | 314 | Self.CheckedLoot := True; 315 | Result := True; 316 | 317 | rect := Minimap.GetTileMS(Minimap.Center, [1,1,0]); 318 | while LootHandler.CheckLoot(rect) and Inventory.HasSpace(1) do 319 | Wait(400, 600); 320 | end; 321 | 322 | 323 | function TKrakenKiller.EquipGear(): Boolean; 324 | var 325 | item: TRSItem; 326 | begin 327 | for item in Self.Gear do 328 | if Inventory.ClickItem(item) then 329 | Exit(True); 330 | end; 331 | 332 | 333 | function TKrakenKiller.InVarrock(): Boolean; 334 | begin 335 | Map.Position(); 336 | Result := Map.RegionIndex = 2; 337 | end; 338 | 339 | 340 | function TKrakenKiller.TeleportOut(): Boolean; 341 | begin 342 | if Magic.IsSpellBook(ERSSpellBook.STANDARD) then 343 | Result := Magic.CastSpell(ERSSpell.VARROCK_TELEPORT) 344 | else 345 | Result := Inventory.ClickItem('Varrock teleport'); 346 | 347 | if not Result then 348 | TerminateScript('Out of food and we failed to teleport out!'); 349 | 350 | Result := WaitUntil(Self.InVarrock(), 300, 5000); 351 | end; 352 | 353 | 354 | function TKrakenKiller.GetVarrockState(): EKrakenState; 355 | begin 356 | if Inventory.ContainsAny(Self.Loot) or not Inventory.IsFull() then 357 | Exit(EKrakenState.OPEN_BANK); 358 | 359 | 360 | if Inventory.ContainsAny(['Dramen staff', 'Lunar staff']) then 361 | Exit(EKrakenState.EQUIP_STAFF); 362 | 363 | Result := EKrakenState.USE_FAIRYRING; 364 | end; 365 | 366 | function TKrakenKiller.GetState(): EKrakenState; 367 | var 368 | health: Int32; 369 | pos: TPoint; 370 | begin 371 | if WL.Activity.IsFinished() and not MainScreen.InCombat() then 372 | Exit(EKrakenState.END_SCRIPT); 373 | 374 | if RSInterface.IsOpen() then 375 | begin 376 | if BankPin.IsOpen() then 377 | Exit(EKrakenState.HANDLE_PIN); 378 | 379 | if Bank.IsOpen() then 380 | begin 381 | if Inventory.ContainsAny(Self.Loot) then 382 | Exit(EKrakenState.DEPOSIT_LOOT); 383 | 384 | if not Inventory.IsFull() then 385 | Exit(EKrakenState.WITHDRAW_FOOD); 386 | end; 387 | 388 | Exit(EKrakenState.CLOSE_INTERFACE); 389 | end; 390 | 391 | pos := Map.Position(); 392 | if not Self.InsideBossRoom() then 393 | begin 394 | if 'Pay' in Chat.GetChatTitle ()then 395 | Exit(EKrakenState.HANDLE_CHAT); 396 | 397 | if Chat.HasContinue() then 398 | Exit(EKrakenState.HANDLE_WARNING); 399 | 400 | case Map.RegionIndex of 401 | 0: Exit(EKrakenState.ENTER_COVE); 402 | 1: Exit(EKrakenState.ENTER_CREVICE); 403 | 2: Exit(Self.GetVarrockState()); 404 | end; 405 | end; 406 | 407 | if (Minimap.GetPrayerLevel() <= 30) and Inventory.ContainsItem('Prayer potion(1..4)') then 408 | Exit(EKrakenState.DRINK_PRAYER); 409 | 410 | if CombatHandler.NeedBracelet() then 411 | Exit(EKrakenState.EQUIP_BRACELET); 412 | 413 | if Self.UseImbuedHeart and ImbuedHeart.IsFinished() then 414 | Exit(EKrakenState.BOOST); 415 | 416 | if not Minimap.IsPrayerEnabled() and (Minimap.GetPrayerLevel() > 0) then 417 | Exit(EKrakenState.ENABLE_QPRAY); 418 | 419 | if not pos.InRange(Self.Bridge, 5) then 420 | Exit(EKrakenState.WALK_BRIDGE); 421 | 422 | if Inventory.ContainsAny(Self.Gear) then 423 | Exit(EKrakenState.EQUIP_GEAR); 424 | 425 | if not Self.HasBloodSpells then 426 | if not Inventory.ContainsConsumable(ERSConsumable.FOOD) then 427 | Exit(EKrakenState.OUT_OF_FOOD); 428 | 429 | health := Minimap.GetHPLevel(); 430 | 431 | if Self.FindRagingKraken() then 432 | begin 433 | if health <= 40 then 434 | begin 435 | if Self.HasBloodSpells then 436 | begin 437 | if not MainScreen.IsUpText('Blood') then 438 | begin 439 | if health <= 25 then 440 | Exit(EKrakenState.EAT_FOOD); 441 | 442 | Exit(EKrakenState.SELECT_SPELL); 443 | end; 444 | 445 | Exit(EKrakenState.CAST_BLOOD); 446 | end; 447 | 448 | Exit(EKrakenState.EAT_FOOD); 449 | end; 450 | 451 | if Self.IsAttacking then 452 | Exit(EKrakenState.WAIT_STATE); 453 | Exit(EKrakenState.ATTACK_KRAKEN); 454 | end; 455 | 456 | if health <= 75 then 457 | Exit(EKrakenState.EAT_FOOD); 458 | 459 | if not Self.CheckedLoot then 460 | Exit(EKrakenState.CHECK_LOOT); 461 | 462 | if not Self.HasBloodSpells and Inventory.ContainsAny(RSAlchHandler.ItemArray) then 463 | Exit(EKrakenState.ALCH_DROP); 464 | 465 | if Self.FindSleepyKraken() then 466 | Exit(EKrakenState.WAKE_KRAKEN); 467 | end; 468 | 469 | procedure TKrakenKiller.Run(maxActions: UInt32; maxTime: UInt64); 470 | begin 471 | Self.Init(maxActions, maxTime); 472 | 473 | repeat 474 | Self.State := Self.GetState(); 475 | Self.SetAction(ToStr(Self.State)); 476 | 477 | case Self.State of 478 | EKrakenState.EQUIP_STAFF: FairyRing.HandleItem(); 479 | EKrakenState.USE_FAIRYRING: FairyRing.WalkTeleport('AKQ'); 480 | EKrakenState.OPEN_BANK: Banks.WalkOpen(); 481 | EKrakenState.HANDLE_PIN: BankPin.Enter(Login.GetPlayerPin()); 482 | EKrakenState.DEPOSIT_LOOT: Bank.DepositItems(Self.Loot, True); 483 | EKrakenState.WITHDRAW_FOOD: Bank.WithdrawConsumable(ERSConsumable.FOOD); 484 | EKrakenState.CLOSE_INTERFACE: RSInterface.Close(); 485 | 486 | //Outside 487 | EKrakenState.ENTER_COVE: Self.EnterCove(); 488 | EKrakenState.ENTER_CREVICE: Self.EnterCrevice(); 489 | EKrakenState.HANDLE_CHAT: Self.HandlePayment(); 490 | EKrakenState.HANDLE_WARNING: Chat.ClickContinue(BioHash); 491 | 492 | //Inside 493 | EKrakenState.WALK_BRIDGE: Map.Walker.WebWalk(Self.Bridge, 5, 0.2); 494 | EKrakenState.WAIT_STATE: WaitUntil(not Self.FindRagingKraken(), 100, 3000); 495 | EKrakenState.CHECK_LOOT: Self.CheckLoot(); 496 | EKrakenState.WAKE_KRAKEN: Self.WakeKraken(); 497 | EKrakenState.SELECT_SPELL: Magic.CastSpell(Self.BloodSpell); 498 | EKrakenState.CAST_BLOOD: Self.CastBlood(); 499 | EKrakenState.ATTACK_KRAKEN: Self.AttackKraken(); 500 | EKrakenState.BOOST: Self.BoostMagic(); 501 | EKrakenState.EAT_FOOD: Inventory.Consume(ERSConsumable.FOOD); 502 | EKrakenState.DRINK_PRAYER: Inventory.Consume(ERSConsumable.PRAYER); 503 | EKrakenState.ENABLE_QPRAY: Minimap.EnablePrayer(); 504 | EKrakenState.OUT_OF_FOOD: Self.TeleportOut(); 505 | EKrakenState.ALCH_DROP: RSAlchHandler.CastAlchemy(True, True); 506 | EKrakenState.EQUIP_GEAR: Self.EquipGear(); 507 | EKrakenState.EQUIP_BRACELET: CombatHandler.EquipBracelet(); 508 | EKrakenState.END_SCRIPT: Break; 509 | end; 510 | 511 | Self.DoAntiban(not Self.FindRagingKraken(), False); 512 | until Self.ShouldStop(); 513 | end; 514 | 515 | 516 | var 517 | KrakenKiller: TKrakenKiller; 518 | 519 | function TRSInventory.Consume(ConsumableType: ERSConsumable; out Slots: TIntegerArray): Boolean; override; 520 | begin 521 | Result := inherited(ConsumableType); 522 | 523 | if Result then 524 | KrakenKiller.IsAttacking := False; 525 | end; 526 | 527 | function TConsumableHandler.FindInInventory(): TRSConsumableArray; override; 528 | var 529 | consumable: TRSConsumable; 530 | item: TRSItem; 531 | begin 532 | Self.DebugLn('Setting up consumable of type: ' + ToStr(Self.ConsumableType)); 533 | 534 | for item in CONSUMABLE_ARRAYS[Self.ConsumableType] do 535 | begin 536 | if item = 'Sanfew serum(1..4)' then 537 | Continue; 538 | if Self.ConsumableArray.Contains(item) then //avoid resetting leftover items. 539 | Continue; 540 | 541 | if Inventory.ContainsItem(item) then 542 | begin 543 | Self.DebugLn('Consumable found: ' + ToStr(item)); 544 | consumable := Self.Setup(item); 545 | 546 | Result += consumable; 547 | end; 548 | end; 549 | end; 550 | {$IFDEF SCRIPT_GUI} 551 | type 552 | TKrakenConfig = record(TScriptForm) 553 | InfoText: TLabel; 554 | end; 555 | 556 | procedure TKrakenConfig.Run(); override; 557 | var 558 | tab: TTabSheet; 559 | begin 560 | Self.Setup('Wasp Kraken'); 561 | Self.Start.SetOnClick(@Self.StartScript); 562 | 563 | Self.AddTab('Script Settings'); 564 | tab := Self.Tabs[High(Self.Tabs)]; 565 | 566 | Self.CreateAccountManager(tab); 567 | 568 | with Self.InfoText do 569 | begin 570 | Create(tab); 571 | SetCaption( 572 | 'Keep in mind this script doesn''t bank so Sang Staff is highly recommended.' 573 | + LINEENDING + 574 | 'If you have issues staying alive consider using magic and defense boosting prayers.' 575 | + LINEENDING + 576 | 'Overhead prayers have no effect on kraken.' 577 | + LINEENDING + LINEENDING + 578 | 'Also keep in mind this won''t stop when you have your inventory full of loot.' 579 | + LINEENDING + 580 | 'I recommend you check it every 40 mins or so to see if it needs banking.' 581 | + LINEENDING + LINEENDING + 582 | 'FISHING EXPLOSIVES ARE REQUIRED!' 583 | ); 584 | SetLeft(TControl.AdjustToDPI(50)); 585 | SetTop(TControl.AdjustToDPI(200)); 586 | end; 587 | 588 | LootHandler.Setup('Kraken', 5000); 589 | Self.CreateLootManager(); 590 | Self.CreateAntibanManager(); 591 | Self.CreateWaspLibSettings(); 592 | Self.CreateAPISettings(); 593 | 594 | inherited; 595 | end; 596 | 597 | var 598 | KrakenConfig: TKrakenConfig; 599 | {$ENDIF} 600 | 601 | begin 602 | {$IFDEF SCRIPT_GUI} 603 | KrakenConfig.Run(); 604 | {$ENDIF} 605 | KrakenKiller.Run(WLSettings.MaxActions, WLSettings.MaxTime); 606 | end. 607 | -------------------------------------------------------------------------------- /wasp_ardougne_knights.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := '0fb23f9b-3bc2-41cd-8670-3fec0eb256f1'} 2 | {$DEFINE SCRIPT_REVISION := '61'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | 7 | var 8 | FoodAmount: Int32 := Random(16, 20); 9 | NeckAmount: Int32 := Random(3, 5); 10 | MinHealth: Int32 := Random(20, 40); 11 | 12 | //Enum of script states. used in the GetState() function to decide what we got to do next. 13 | type 14 | EThieverState = ( 15 | OPEN_CHAT, CHANGE_CHAT_OFF, CHANGE_CHAT_FILTER, 16 | IS_UPSTAIRS, WALK_TO_BANK, 17 | 18 | OPEN_BANK, OPEN_COLLECT, DEPOSIT_ITEMS, WITHDRAW_NECK, 19 | DEPOSIT_NECK, WITHDRAW_FOOD, FIX_INVENTORY, HANDLE_COLLECT, 20 | CLOSE_INTERFACE, 21 | 22 | EQUIP_ROGUE, CHECK_NECK, EQUIP_NECK, EAT_FOOD, 23 | 24 | FIND_KNIGHT, PICKPOCKET, OPEN_POUCH, CAST_SHADOW_VEIL, 25 | 26 | CLOSE_CONTEXT, WAIT_STATE, 27 | 28 | OUT_OF_SUPPLIES, END_SCRIPT 29 | ); 30 | 31 | //script record, all variables of the script should go here. 32 | TKnightsThiever = record(TBaseBankScript) 33 | //init variables (to be set while the script is initiates) 34 | State: EThieverState; 35 | 36 | Knight: TRSNPCV2; 37 | 38 | CoinPouch: TRSItem; 39 | Necklace: TRSBankItem; 40 | 41 | LootArray, KeepArray, BankArray, RogueEquipment: TRSItemArray; 42 | 43 | NeckTimer, ShadowVeilTimer: TCountDown; 44 | 45 | //run variables (to be used while the script is running) 46 | HasNeck, FreshNeck, UseShadowVeil: Boolean; 47 | 48 | VeilAttempts, CoinPouchLimit, MaxHit, NextHeal, Pattern, DiaryLevel: Int32; 49 | 50 | BankBounds: TPointArray; 51 | end; 52 | 53 | procedure TKnightsThiever.CheckRogueEquipment(); 54 | var 55 | ProfitMultiplier: Double; 56 | begin 57 | if Inventory.Open() then 58 | begin 59 | if Inventory.ContainsItem('Rogue mask') then 60 | begin 61 | ProfitMultiplier += 0.2; 62 | Self.RogueEquipment += 'Rogue mask'; 63 | end; 64 | 65 | if Inventory.ContainsItem('Rogue top') then 66 | begin 67 | ProfitMultiplier += 0.2; 68 | Self.RogueEquipment += 'Rogue top'; 69 | end; 70 | 71 | if Inventory.ContainsItem('Rogue trousers') then 72 | begin 73 | ProfitMultiplier += 0.2; 74 | Self.RogueEquipment += 'Rogue trousers'; 75 | end; 76 | 77 | if Inventory.ContainsItem('Rogue gloves') then 78 | begin 79 | ProfitMultiplier += 0.2; 80 | Self.RogueEquipment += 'Rogue gloves'; 81 | end; 82 | 83 | if Inventory.ContainsItem('Rogue boots') then 84 | begin 85 | ProfitMultiplier += 0.2; 86 | Self.RogueEquipment += 'Rogue boots'; 87 | end; 88 | 89 | //This are not part of rogue equipment but are useful while thieving 90 | if Inventory.ContainsItem('Thieving cape') then 91 | Self.RogueEquipment += 'Thieving cape' 92 | else if Inventory.ContainsItem('Thieving cape(t)') then 93 | Self.RogueEquipment += 'Thieving cape(t)'; 94 | 95 | //Lava staves for shadow veil spell 96 | if Inventory.ContainsItem('Lava battlestaff') then 97 | Self.RogueEquipment += 'Lava battlestaff' 98 | else if Inventory.ContainsItem('Mystic lava staff') then 99 | Self.RogueEquipment += 'Mystic lava staff' 100 | else if Inventory.ContainsItem(21200) then 101 | Self.RogueEquipment += 21200; 102 | end; 103 | 104 | if Equipment.Open() then 105 | begin 106 | if Equipment.ContainsItem('Rogue mask') then 107 | begin 108 | ProfitMultiplier += 0.2; 109 | Self.RogueEquipment += 'Rogue mask'; 110 | end; 111 | 112 | if Equipment.ContainsItem('Rogue top') then 113 | begin 114 | ProfitMultiplier += 0.2; 115 | Self.RogueEquipment += 'Rogue top'; 116 | end; 117 | 118 | if Equipment.ContainsItem('Rogue trousers') then 119 | begin 120 | ProfitMultiplier += 0.2; 121 | Self.RogueEquipment += 'Rogue trousers'; 122 | end; 123 | 124 | if Equipment.ContainsItem('Rogue gloves') then 125 | begin 126 | ProfitMultiplier += 0.2; 127 | Self.RogueEquipment += 'Rogue gloves'; 128 | end; 129 | 130 | if Equipment.ContainsItem('Rogue boots') then 131 | begin 132 | ProfitMultiplier += 0.2; 133 | Self.RogueEquipment += 'Rogue boots'; 134 | end; 135 | 136 | 137 | //This are not part of rogue equipment but are useful while thieving 138 | if Equipment.ContainsItem('Thieving cape') then 139 | Self.RogueEquipment += 'Thieving cape' 140 | else if Equipment.ContainsItem('Thieving cape(t)') then 141 | Self.RogueEquipment += 'Thieving cape(t)'; 142 | 143 | //Lava staves for shadow veil spell 144 | if Equipment.ContainsItem('Lava battlestaff') then 145 | Self.RogueEquipment += 'Lava battlestaff' 146 | else if Equipment.ContainsItem('Mystic lava staff') then 147 | Self.RogueEquipment += 'Mystic lava staff' 148 | else if Equipment.ContainsItem(21200) then 149 | Self.RogueEquipment += 21200; 150 | end; 151 | 152 | Self.ActionProfit += Round(Self.ActionProfit * ProfitMultiplier); 153 | end; 154 | 155 | procedure TKnightsThiever.Init(maxActions: UInt32; maxTime: UInt64); override; 156 | begin 157 | Antiban.Skills := [ERSSkill.THIEVING, ERSSkill.TOTAL]; 158 | Antiban.MinZoom := 5; 159 | Antiban.MaxZoom := 50; 160 | 161 | inherited; 162 | 163 | Map.SetupChunk(ERSChunk.ARDOUGNE); 164 | Objects.Setup(Map.Objects(), @Map.Walker); 165 | 166 | Self.Knight.SetupCoordinates([[6516, 37294]]); 167 | Self.Knight.Size := [1,1,6]; 168 | Self.Knight.DotFilters.SetupBounds(Self.BankBounds, True); 169 | Self.Knight.SetupUpText('Knight of Ardougne'); 170 | Self.Knight.Finder.Colors += CTS2(10620793, 19, 0.22, 0.31); 171 | Self.Knight.Walker := @Map.Walker; 172 | 173 | Self.DiaryLevel := Max(Achievements.GetDiaryLevel(ERSAchievementDiary.ARDOUGNE), 1); 174 | if Self.DiaryLevel = 4 then Self.DiaryLevel += 1; 175 | 176 | FoodHandler.Amount := FoodAmount; 177 | 178 | Self.CoinPouch := 'Coin pouch'; 179 | Self.Necklace := TRSBankItem.Setup('Dodgy necklace', NeckAmount); 180 | Self.KeepArray := ['Coin pouch', 'Coins', 'Cosmic rune', 'Dodgy necklace']; 181 | Self.BankArray := ['Jug', 'Pie dish']; 182 | 183 | Self.MaxHit := 3; 184 | MinHealth := Max(Self.MaxHit, MinHealth); 185 | 186 | Self.ActionProfit := 50; 187 | 188 | Self.NeckTimer.Init(140000); 189 | 190 | if Antiban.BioDice() then 191 | Options.SetNPCAttackOption(ERSAttackOption.HIDDEN) 192 | else 193 | Options.SetNPCAttackOption(ERSAttackOption.ALWAYS_RIGHT_CLICK); 194 | Wait(5000); 195 | Self.CheckRogueEquipment(); 196 | Self.HasNeck := Equipment.ContainsItem(Self.Necklace.Item); 197 | 198 | if Magic.Open() and Magic.ContainsSpell(ERSSpell.SHADOW_VEIL) then 199 | begin 200 | Self.UseShadowVeil := True; 201 | Magic.CastSpell(ERSSpell.SHADOW_VEIL); 202 | Self.ShadowVeilTimer.Init(1000 * Round(0.6 * Stats.GetLevel(ERSSkill.MAGIC))); 203 | Antiban.Skills += ERSSkill.MAGIC; 204 | end; 205 | 206 | XPBar.EarnedXP(); 207 | Self.BankBounds := Box(6500,37282,6524,37310).ToRectangle().ToTPA(); 208 | end; 209 | 210 | function TKnightsThiever.CastShadowVeil(): Boolean; 211 | begin 212 | if not Magic.Open() then 213 | Exit; 214 | 215 | if not Magic.CanActivate(ERSSpell.SHADOW_VEIL) then 216 | begin 217 | if Self.VeilAttempts > 2 then 218 | begin 219 | Self.DebugLn('Disabling shadow veil.'); 220 | Self.UseShadowVeil := Result; 221 | Exit; 222 | end; 223 | 224 | Self.DebugLn('Shadow veil is not available yet.'); 225 | Self.ShadowVeilTimer.Restart(Random(-5000, 5000)); 226 | Self.VeilAttempts += 1; 227 | Exit; 228 | end; 229 | 230 | Result := Magic.CastSpell(ERSSpell.SHADOW_VEIL); 231 | Self.ShadowVeilTimer.Restart(Random(-5000, 5000)); 232 | Self.VeilAttempts := 0; 233 | end; 234 | 235 | function TKnightsThiever.HasRogue(): Boolean; 236 | begin 237 | Result := Inventory.ContainsAny(Self.RogueEquipment); 238 | end; 239 | 240 | function TKnightsThiever.EquipRogue(): Boolean; 241 | var 242 | Item: TRSItem; 243 | begin 244 | for Item in Self.RogueEquipment do 245 | if Inventory.ClickItem(Item) then 246 | Wait(200, 300); 247 | 248 | if Inventory.ClickItem(21200) then 249 | Wait(200, 300); 250 | 251 | Result := not Self.HasRogue() and not Inventory.ContainsItem('Lava battlestaff'); 252 | end; 253 | 254 | 255 | 256 | function TKnightsThiever.HasSpace(): Boolean; 257 | begin //we need at least 2 spaces always. 258 | Result := (Inventory.CountEmptySlots() >= 2) or 259 | (Inventory.ContainsItem(Self.CoinPouch) and Inventory.ContainsItem('Coins') 260 | and not Inventory.ContainsAny(Self.BankArray)); 261 | end; 262 | 263 | 264 | function TKnightsThiever.IsLowHP(): Boolean; 265 | begin 266 | if Self.NextHeal < 1 then 267 | begin 268 | Self.NextHeal := MinHealth + Random(-Self.MaxHit, Self.MaxHit) * Antiban.GetUniqueInt(2, 0, 4); 269 | Self.NextHeal := EnsureRange(Self.NextHeal, Self.MaxHit, Round(Stats.GetLevel(ERSSkill.HITPOINTS) * 0.8)); 270 | end; 271 | 272 | Result := Minimap.GetHPLevel() <= Self.NextHeal; 273 | end; 274 | 275 | function TKnightsThiever.IsPouchFull(): Boolean; 276 | begin 277 | if Self.CoinPouchLimit < 1 then 278 | Self.CoinPouchLimit := SRL.TruncatedGauss(28 * Self.DiaryLevel, 1); 279 | 280 | Result := Inventory.CountItemStack(Self.CoinPouch) >= Self.CoinPouchLimit; 281 | end; 282 | 283 | 284 | function TKnightsThiever.OpenCoinPouch(): Boolean; 285 | var 286 | pouchCount: Int32; 287 | begin 288 | pouchCount := Inventory.CountItemStack(Self.CoinPouch); 289 | if Inventory.ClickItem(Self.CoinPouch) then 290 | begin 291 | Wait(600); 292 | Result := WaitUntil(not Inventory.ContainsItem(Self.CoinPouch), 100, 2000); 293 | end; 294 | 295 | if Result then 296 | begin 297 | Self.CoinPouchLimit := SRL.TruncatedGauss(28 * Self.DiaryLevel, 1); 298 | Self.TotalActions += pouchCount; 299 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 300 | WL.Activity.Restart(); 301 | end; 302 | end; 303 | 304 | 305 | function TKnightsThiever.CheckFailed(StartingHP: Int32): Boolean; 306 | var 307 | HasHitSplat: Boolean; 308 | begin 309 | HasHitSplat := MainScreen.FindHitsplats(MainScreen.GetPlayerBox()) <> []; 310 | 311 | Result := (Minimap.GetHPLevel() < StartingHP) or HasHitSplat; 312 | 313 | if Result then 314 | begin 315 | XPBar.EarnedXP(); 316 | Self.OpenCoinPouch(); 317 | end; 318 | end; 319 | 320 | function TKnightsThiever.NecklaceExpired(): Boolean; 321 | begin 322 | Result := Chat.FindMessage('crumbles', [CHAT_COLOR_LIGHT_RED]); 323 | Self.HasNeck := not Result; 324 | end; 325 | 326 | function TKnightsThiever.Dodged(): Boolean; 327 | begin 328 | Result := Chat.FindMessage('dodgy'); 329 | end; 330 | 331 | 332 | 333 | function TKnightsThiever.Heal(): Boolean; 334 | var 335 | oldHP, newHP, hpLevel: Int32; 336 | begin 337 | newHP := Minimap.GetHPLevel(); 338 | hpLevel := Stats.GetLevel(ERSSkill.HITPOINTS) - 1; 339 | repeat 340 | oldHP := newHP; 341 | if not Inventory.Consume(ERSConsumable.FOOD) then 342 | Exit; 343 | 344 | newHP := Minimap.GetHPLevel(); 345 | Result := newHP > Random(oldHP, hpLevel); 346 | until Result; 347 | 348 | if Result then 349 | Self.NextHeal := 0; //This will be reset when TKnightsThiever.IsLowHP() is called. 350 | end; 351 | 352 | function TKnightsThiever.EquipNeck(): Boolean; 353 | var 354 | slot: Int32; 355 | begin 356 | Result := Inventory.FindItem(Self.Necklace.Item, slot); 357 | 358 | if Result then 359 | begin 360 | Inventory.ClickSlot(slot); 361 | WaitUntil(not Inventory.IsSlotUsed(slot), 300, 3000); 362 | Self.FreshNeck := True; 363 | Self.HasNeck := True; 364 | end; 365 | end; 366 | 367 | function TKnightsThiever.CheckNeck(): Boolean; 368 | begin 369 | Result := Self.HasNeck := Equipment.ContainsItem(Self.Necklace.Item); 370 | 371 | Self.NeckTimer.Restart(Random(-30000, 60000)); 372 | end; 373 | 374 | 375 | function TKnightsThiever.HoverKnight(): Boolean; 376 | var 377 | t: TCountDown; 378 | TPA: TPointArray; 379 | ATPA: T2DPointArray; 380 | P: TPoint; 381 | B: TBox; 382 | begin 383 | t.Init(1800); 384 | 385 | repeat 386 | SRL.FindColors(TPA, $00FFFF, MainScreen.Bounds); 387 | ATPA := TPA.Cluster(3, 1); 388 | ATPA.FilterDimensions(32, 10, 32, 10); 389 | until (ATPA <> []) or t.IsFinished(); 390 | 391 | if ATPA <> [] then 392 | begin 393 | ATPA.SortByMiddle(MainScreen.GetPlayerBox().Middle()); 394 | TPA := ATPA[0]; 395 | P := TPA.Mean(); 396 | P.X += MainScreen.NormalizeDistance(7); 397 | P.Y += MainScreen.NormalizeDistance(22); 398 | B := Box(P, MainScreen.NormalizeDistance(10), MainScreen.NormalizeDistance(14)); 399 | 400 | if WLSettings.RemoteInput.HUDDebug then 401 | begin 402 | RSClient.Image().Clear(); 403 | RSClient.Image().DrawBox(B, $FFFFFF); 404 | end; 405 | 406 | Mouse.Move(B); 407 | Result := MainScreen.IsUpText(Self.Knight.Name); 408 | end 409 | else if Length(Minimap.GetDots(ERSMinimapDot.PLAYER)) < 10 then 410 | Result := Self.Knight.Hover(0); 411 | 412 | if not Result and MainScreen.IsUpText('Climb') then 413 | Antiban.RandomRotate(); 414 | end; 415 | 416 | function TKnightsThiever.StealKnight(): Boolean; 417 | var 418 | slot: Int32 := Inventory.GetSelectedSlot(); 419 | currentHP: Int32 := Minimap.GetHPLevel(); 420 | circle: TCircle; 421 | i: Int32; 422 | begin 423 | if Slot > -1 then Inventory.ClickSlot(Slot); 424 | 425 | if Result := Self.HoverKnight() then 426 | begin 427 | case Self.Pattern of 428 | 2, 3, 4: Wait(200, 300); 429 | 5, 6: Wait(600, 800); 430 | end; 431 | 432 | Self.Pattern := SRL.TruncatedGauss(0, 6); 433 | 434 | Mouse.Click(MOUSE_LEFT); 435 | 436 | if MainScreen.DidYellowClick() then 437 | Exit(False); 438 | 439 | Wait(50, 100); 440 | 441 | case Self.Pattern of 442 | 4: 443 | for i := 1 to SRL.TruncatedGauss(0, 2) do 444 | begin 445 | circle.X := Mouse.Position().X; 446 | circle.Y := Mouse.Position().Y; 447 | circle.Radius := 5; 448 | 449 | Mouse.Click(circle, MOUSE_LEFT, True); 450 | Wait(200, 350); 451 | end; 452 | 6: 453 | for i := 1 to SRL.TruncatedGauss(0, 3) do 454 | begin 455 | circle.X := Mouse.Position().X; 456 | circle.Y := Mouse.Position().Y; 457 | circle.Radius := 5; 458 | 459 | Mouse.Click(circle, MOUSE_LEFT, True); 460 | Wait(10, 50); 461 | end; 462 | end; 463 | 464 | 465 | if not Self.NecklaceExpired() then 466 | Self.FreshNeck := False; 467 | 468 | Self.CheckFailed(CurrentHP); 469 | WL.Activity.Restart(); 470 | end; 471 | end; 472 | 473 | 474 | function TKnightsThiever.Deposit(): Boolean; 475 | begin 476 | Result := Bank.DepositItems(Self.BankArray, False); 477 | end; 478 | 479 | function TKnightsThiever.FixInventory(): Boolean; 480 | begin 481 | if (Inventory.CountItem(Self.Necklace.Item) < (NeckAmount-2)) or 482 | not Inventory.HasEnoughConsumable(ERSConsumable.FOOD) then 483 | begin 484 | Bank.CachedQuantity := 0; 485 | Bank.DepositAll(); 486 | end; 487 | 488 | Self.Necklace.Quantity := 1; 489 | Result := Bank.DepositItem(Self.Necklace, False); 490 | end; 491 | 492 | function TKnightsThiever.Withdraw(out item: TRSBankItem; attempts: Int32 = 3): Boolean; override; 493 | begin 494 | if item = Self.Necklace then 495 | item.Quantity := NeckAmount - Inventory.CountItem(Self.Necklace.Item); 496 | 497 | Result := inherited(item, attempts); 498 | end; 499 | 500 | procedure TKnightsThiever.HandleUpstairs(); 501 | const 502 | Finder: TRSObjectFinder = [[[5395288, 3, 0.95, 0.22]], [], 0, 0, 0, 0, 0, 0, 0]; 503 | var 504 | TPA: TPointArray; 505 | begin 506 | repeat 507 | for TPA in MainScreen.FindObject(Finder, MainScreen.GetPlayerBox.Expand(10)) do 508 | begin 509 | Mouse.Move(TPA); 510 | if MainScreen.IsUpText('down') then 511 | begin 512 | Mouse.Click(MOUSE_LEFT); 513 | if MainScreen.DidRedClick() then 514 | begin 515 | WaitUntil(Minimap.OnGroundLevel(), 100, 5000); 516 | Wait(2000); 517 | end; 518 | end; 519 | end; 520 | until Minimap.OnGroundLevel(); 521 | end; 522 | 523 | 524 | function TKnightsThiever.GetState(): EThieverState; 525 | begin 526 | if WL.Activity.IsFinished() then 527 | Exit(EThieverState.END_SCRIPT); 528 | 529 | if ChooseOption.IsOpen() then 530 | Exit(EThieverState.CLOSE_CONTEXT); 531 | 532 | if RSInterface.IsOpen() then 533 | begin 534 | if Bank.IsOpen() then 535 | begin 536 | if Self.BankEmpty then 537 | Exit(EThieverState.OUT_OF_SUPPLIES); 538 | 539 | if Inventory.ContainsAny(Self.BankArray) then 540 | Exit(EThieverState.DEPOSIT_ITEMS); 541 | 542 | if Inventory.IsFull() then 543 | Exit(EThieverState.FIX_INVENTORY); 544 | 545 | case Inventory.CountItem(Self.Necklace.Item) of 546 | 0..(NeckAmount-2): Exit(EThieverState.WITHDRAW_NECK); 547 | (NeckAmount-2)..(NeckAmount+2): ; 548 | else Exit(EThieverState.DEPOSIT_NECK); 549 | end; 550 | 551 | if not Inventory.HasEnoughConsumable(ERSConsumable.FOOD) then 552 | Exit(EThieverState.WITHDRAW_FOOD); 553 | end; 554 | 555 | Exit(EThieverState.CLOSE_INTERFACE); 556 | end; 557 | 558 | if Self.IsPouchFull() then 559 | Exit(EThieverState.OPEN_POUCH); 560 | 561 | if ChatButtons.GetState(ERSChatButton.PUBLIC_CHAT) <> ERSChatButtonState.DISABLED then 562 | Exit(EThieverState.CHANGE_CHAT_OFF); 563 | 564 | if ChatButtons.GetState(ERSChatButton.GAME_CHAT) <> ERSChatButtonState.ENABLED then 565 | Exit(EThieverState.CHANGE_CHAT_FILTER); 566 | 567 | if not ChatButtons.IsActive(ERSChatButton.GAME_CHAT) then 568 | Exit(EThieverState.OPEN_CHAT); 569 | 570 | if Self.NeckTimer.IsFinished() then 571 | Exit(EThieverState.CHECK_NECK); 572 | 573 | if Self.HasRogue() then 574 | Exit(EThieverState.EQUIP_ROGUE); 575 | 576 | if not Self.HasSpace() then 577 | begin 578 | if Inventory.ContainsAny(Self.BankArray) then 579 | Exit(EThieverState.OPEN_BANK); 580 | if Inventory.FindConsumable(ERSConsumable.FOOD) then 581 | Exit(EThieverState.EAT_FOOD); 582 | 583 | Exit(EThieverState.OPEN_BANK); 584 | end; 585 | 586 | if (NeckAmount > 0) and not Self.FreshNeck and (not Self.HasNeck or Self.NecklaceExpired) then 587 | begin 588 | if Inventory.ContainsItem(Self.Necklace.Item) then 589 | Exit(EThieverState.EQUIP_NECK); 590 | 591 | Exit(EThieverState.OPEN_BANK); 592 | end; 593 | 594 | if Self.IsLowHP() then 595 | begin 596 | if Inventory.FindConsumable(ERSConsumable.FOOD) then 597 | Exit(EThieverState.EAT_FOOD); 598 | 599 | Exit(EThieverState.OPEN_BANK); 600 | end; 601 | 602 | if Self.UseShadowVeil and Self.ShadowVeilTimer.IsFinished() then 603 | Exit(EThieverState.CAST_SHADOW_VEIL); 604 | 605 | if not Minimap.OnGroundLevel() then 606 | Exit(EThieverState.IS_UPSTAIRS); 607 | 608 | if not SRL.PointInPoly(Map.Position(), Self.BankBounds) then 609 | Exit(EThieverState.WALK_TO_BANK); 610 | 611 | Exit(EThieverState.PICKPOCKET); 612 | end; 613 | 614 | procedure TKnightsThiever.Run(maxActions: UInt32; maxTime: UInt64); 615 | begin 616 | Self.Init(maxActions, maxTime); 617 | 618 | repeat 619 | Self.State := Self.GetState(); 620 | Self.SetAction(ToStr(Self.State)); 621 | 622 | case Self.State of 623 | EThieverState.OPEN_BANK: Banks.WalkOpen(); 624 | EThieverState.DEPOSIT_ITEMS: Self.Deposit(); 625 | EThieverState.WITHDRAW_FOOD: Self.BankEmpty := not Bank.WithdrawConsumable(ERSConsumable.FOOD); 626 | EThieverState.WITHDRAW_NECK: Self.Withdraw(Self.Necklace); 627 | EThieverState.DEPOSIT_NECK: Bank.DepositItem(Self.Necklace, False); 628 | EThieverState.FIX_INVENTORY: Self.FixInventory(); 629 | EThieverState.CLOSE_INTERFACE: RSInterface.Close(); 630 | 631 | EThieverState.OPEN_CHAT: ChatButtons.Open(ERSChatButton.GAME_CHAT); 632 | EThieverState.CHANGE_CHAT_OFF: ChatButtons.ChangeState(ERSChatButton.PUBLIC_CHAT, ERSChatButtonState.DISABLED); 633 | EThieverState.CHANGE_CHAT_FILTER: ChatButtons.ChangeState(ERSChatButton.GAME_CHAT, ERSChatButtonState.ENABLED); 634 | 635 | EThieverState.PICKPOCKET: Self.StealKnight(); 636 | EThieverState.OPEN_POUCH: Self.OpenCoinPouch(); 637 | 638 | EThieverState.CAST_SHADOW_VEIL: Self.CastShadowVeil(); 639 | EThieverState.EAT_FOOD: Self.Heal(); 640 | EThieverState.EQUIP_NECK: Self.EquipNeck(); 641 | EThieverState.CHECK_NECK: Self.CheckNeck(); 642 | EThieverState.CLOSE_CONTEXT: ChooseOption.Close(); 643 | EThieverState.IS_UPSTAIRS: Self.HandleUpstairs(); 644 | EThieverState.WALK_TO_BANK: Map.Walker.WebWalk(Self.Knight.Coordinates, 30, 0.2); 645 | EThieverState.EQUIP_ROGUE: Self.EquipRogue(); 646 | 647 | EThieverState.OUT_OF_SUPPLIES, EThieverState.END_SCRIPT: Break; 648 | end; 649 | 650 | Self.DoAntiban(); //Checks for due antiban 651 | until Self.ShouldStop(); //Stops if MaxAtions or MaxTime have been reached. 652 | end; 653 | 654 | var 655 | KnightsThiever: TKnightsThiever; 656 | 657 | procedure TSRL.Debug({$H-}Bitmap: TMufasaBitmap){$H+}; override; 658 | begin 659 | { overriden so it doesn't show so much stuff } 660 | end; 661 | 662 | function TRSInventory.HasEnoughConsumable(ConsumableType: ERSConsumable): Boolean; override 663 | var 664 | consumableHandler: PConsumableHandler := TConsumableHandler.GetHandler(ConsumableType); 665 | begin 666 | Result := Self.CountPoints(ConsumableType) >= consumableHandler^.Amount; 667 | end; 668 | 669 | 670 | {$IFDEF SCRIPT_GUI} 671 | type 672 | TKnightsForm = record(TScriptForm) 673 | NeckAmountEdit: TLabeledEdit; 674 | Config: TConfigJSON; 675 | end; 676 | 677 | procedure TKnightsForm.StartScript(sender: TObject); override; 678 | var 679 | foodAmountEdit, minHealthEdit: TEdit; 680 | begin 681 | foodAmountEdit := Self.Form.GetChild('cm_food_amount_edit'); 682 | minHealthEdit := Self.Form.GetChild('cm_food_minimum_edit'); 683 | 684 | NeckAmount := StrToInt(Self.NeckAmountEdit.GetText()); 685 | FoodAmount := StrToInt(foodAmountEdit.GetText()); 686 | MinHealth := StrToint(minHealthEdit.GetText()); 687 | 688 | Self.Config.Put('necks', NeckAmount); 689 | Self.Config.Put('food_amount', FoodAmount); 690 | Self.Config.Put('min_health', MinHealth); 691 | 692 | inherited; 693 | end; 694 | 695 | function TScriptForm.CreateConsumableSettings(owner: TControl; consumableType: ERSConsumable; addInfo: Boolean = True): TPanel; override; 696 | var 697 | typeStr: String; 698 | consumableAmount: TLabeledEdit; 699 | fullWidth, w, space, y: Int32; 700 | begin 701 | fullWidth := Floor(Self.Size.X/3); 702 | space := Floor(fullWidth * 0.1); 703 | w := Floor(fullWidth - space * 2); 704 | if addInfo then 705 | y := Floor(Self.Size.Y/2.5) 706 | else 707 | y := TControl.AdjustToDPI(15); 708 | 709 | case consumableType of 710 | ERSConsumable.FOOD: typeStr := 'Food'; 711 | ERSConsumable.FOOD: typeStr := 'Prayer'; 712 | ERSConsumable.FOOD: typeStr := 'Energy'; 713 | ERSConsumable.FOOD: typeStr := 'Boost'; 714 | end; 715 | 716 | Result := inherited; 717 | 718 | with consumableAmount do 719 | begin 720 | Create(Result); 721 | SetCaption('Withdraw ' + LowerCase(typeStr) + ' amount:'); 722 | SetName('cm_' + typeStr + '_amount'); 723 | SetLeft(fullWidth * 2 + space); 724 | SetTop(y); 725 | SetWidth(w); 726 | SetText('8'); 727 | Edit.setOnKeyPress(@Edit.NumberField); 728 | end; 729 | end; 730 | 731 | procedure TKnightsForm.Run(); override; 732 | var 733 | tab: TTabSheet; 734 | panel: TPanel; 735 | foodAmountEdit, minHealthEdit: TEdit; 736 | begin 737 | Self.Setup('Wasp Ardougne Knights'); 738 | Self.Config.Setup('wasp-ardougne-knights'); 739 | Self.Start.setOnClick(@Self.StartScript); 740 | 741 | Self.AddTab('Script Settings'); 742 | tab := Self.Tabs[High(Self.Tabs)]; 743 | 744 | Self.CreateAccountManager(tab); 745 | 746 | with Self.NeckAmountEdit do 747 | begin 748 | Create(tab); 749 | SetCaption('Necklaces amount:'); 750 | SetLeft(TControl.AdjustToDPI(30)); 751 | SetTop(TControl.AdjustToDPI(180)); 752 | SetWidth(TControl.AdjustToDPI(120)); 753 | 754 | if Self.Config.Has('necks') then 755 | SetText(ToStr(Self.Config.GetInt('necks'))) 756 | else 757 | SetText(ToStr(NeckAmount)); 758 | end; 759 | 760 | panel := Self.CreateConsumableSettings(tab, ERSConsumable.FOOD, False); 761 | 762 | panel.SetTop(TControl.AdjustToDPI(230)); 763 | 764 | foodAmountEdit := panel.GetChild('cm_food_amount_edit'); 765 | minHealthEdit := panel.GetChild('cm_food_minimum_edit'); 766 | 767 | if Self.Config.Has('food_amount') then 768 | foodAmountEdit.SetText(ToStr(Self.Config.GetInt('food_amount'))) 769 | else 770 | foodAmountEdit.SetText(ToStr(FoodAmount)); 771 | 772 | foodAmountEdit.SetVisible(True); 773 | 774 | if Self.Config.Has('min_health') then 775 | minHealthEdit.SetText(ToStr(Self.Config.GetInt('min_health'))) 776 | else 777 | minHealthEdit.SetText(ToStr(MinHealth)); 778 | 779 | Self.CreateAntibanManager(); 780 | Self.CreateWaspLibSettings(); 781 | Self.CreateAPISettings(); 782 | 783 | inherited; 784 | end; 785 | 786 | var 787 | KnightsConfig: TKnightsForm; 788 | {$ENDIF} 789 | 790 | begin 791 | {$IFDEF SCRIPT_GUI} 792 | KnightsConfig.Run(); 793 | {$ENDIF} 794 | KnightsThiever.Run(WLSettings.MaxActions, WLSettings.MaxTime); 795 | end. 796 | -------------------------------------------------------------------------------- /wasp_builder.simba: -------------------------------------------------------------------------------- 1 | {$DEFINE SCRIPT_ID := 'bee77a9c-8ff3-4b11-b0fc-2fbbaa788d15'} 2 | {$DEFINE SCRIPT_REVISION := '69'} 3 | {$DEFINE SCRIPT_GUI} 4 | {$I SRL-T/osr.simba} 5 | {$I WaspLib/osr.simba} 6 | 7 | type 8 | ERSNPC = (PHIALS, SERVANT); 9 | ERSFurniture = (REGULAR_LARDER, OAK_LARDER, MYTH_CAPE, MAHOGANY_TABLE); 10 | 11 | var 12 | CurrentNPC: ERSNPC := PHIALS; 13 | CurrentFurniture: ERSFurniture := ERSFurniture.MYTH_CAPE; 14 | 15 | type 16 | EBuilderState = ( 17 | LEVEL_UP, 18 | WAIT_STATE, 19 | EXIT_HOUSE, 20 | ENTER_HOUSE, 21 | 22 | BUILD_FURNITURE, 23 | HANDLE_FURNITURE_UI, 24 | DESTROY_FURNITURE, 25 | HANDLE_BUILD_CHAT, 26 | HANDLE_PIN, 27 | CLOSE_INTERFACE, 28 | 29 | GET_PLANKS, 30 | HANDLE_PHIALS_CHAT, 31 | FILL_SACK, 32 | CALL_SERVANT, 33 | TALK_SERVANT, 34 | HANDLE_SERVANT, 35 | 36 | NO_ACTIVITY, 37 | END_SCRIPT 38 | ); 39 | 40 | TBuilder = record(TBaseWalkerScript) 41 | State: EBuilderState; 42 | 43 | BuiltFurniture, FurnitureSpace: TRSObject; 44 | ServantNPC: TRSNPC; 45 | 46 | UsePlankSack, FurnitureIsBuilt, UsePhials, WaitingServant: Boolean; 47 | 48 | Plank: TRSItem; 49 | PlankSackCount, NotedPlanksSlot, MinPlankCount: Int32; 50 | LastPoint: TPoint; 51 | end; 52 | 53 | procedure TBuilder.SetupNPC(); 54 | begin 55 | case CurrentNPC of 56 | PHIALS: Self.UsePhials := True; 57 | 58 | SERVANT: 59 | begin 60 | ServantNPC.Filter.Skip := False; 61 | ServantNPC.Filter.Finder := False; 62 | ServantNPC.Filter.Walker := False; 63 | ServantNPC.Filter.MinimapDot := True; 64 | 65 | ServantNPC.ShapeArray += [[1, 1, 7], 0]; 66 | ServantNPC.SetupUpText(['Talk-to']); 67 | end; 68 | end; 69 | end; 70 | 71 | procedure TBuilder.SetupPlank(); 72 | begin 73 | case CurrentFurniture of 74 | REGULAR_LARDER: 75 | begin 76 | Self.Plank := 'Plank'; 77 | Self.MinPlankCount := 8; 78 | end; 79 | 80 | OAK_LARDER: 81 | begin 82 | Self.Plank := 'Oak plank'; 83 | Self.MinPlankCount := 8; 84 | end; 85 | 86 | MYTH_CAPE: 87 | begin 88 | Self.Plank := 'Teak plank'; 89 | Self.MinPlankCount := 3; 90 | end; 91 | 92 | MAHOGANY_TABLE: 93 | begin 94 | Self.Plank := 'Mahogany plank'; 95 | Self.MinPlankCount := 6; 96 | end; 97 | end; 98 | end; 99 | 100 | procedure TBuilder.SetupObjects(); 101 | begin 102 | case CurrentFurniture of 103 | ERSFurniture.MYTH_CAPE: 104 | begin 105 | Self.BuiltFurniture.Setup(0.3, 4, [[1858, 138]]); 106 | Self.BuiltFurniture.SetupUpText(['Teleport']); 107 | Self.BuiltFurniture.Finder.Colors += CTS2(15198185, 9, 0.29, 0.68); 108 | Self.BuiltFurniture.Finder.Colors += CTS2(13083513, 7, 0.03, 1.71); 109 | Self.BuiltFurniture.Finder.Colors += CTS2(5799055, 10, 0.07, 0.85); 110 | 111 | Self.FurnitureSpace.Setup(0.3, 4, [[1858, 138]]); 112 | Self.FurnitureSpace.SetupUpText(['2 more']); 113 | Self.FurnitureSpace.Finder.Colors += CTS2(13293015, 14, 0.23, 0.37); 114 | end; 115 | 116 | ERSFurniture.MAHOGANY_TABLE: 117 | begin 118 | Self.BuiltFurniture.Setup(1.3, 5, [[1848, 127]]); 119 | Self.BuiltFurniture.Setup(['2 more']); 120 | Self.BuiltFurniture.Filter.Finder := False; 121 | Self.BuiltFurniture.Filter.UpText := False; 122 | 123 | Self.FurnitureSpace.Setup(1.3, 5, [[1848, 127]]); 124 | Self.FurnitureSpace.Setup(['2 more']); 125 | Self.FurnitureSpace.Filter.Finder := False; 126 | Self.FurnitureSpace.Filter.UpText := False; 127 | end; 128 | 129 | ERSFurniture.REGULAR_LARDER, ERSFurniture.OAK_LARDER: 130 | begin 131 | Self.BuiltFurniture.Setup(1.5, 7, [[1856, 115]]); 132 | Self.BuiltFurniture.SetupUpText(['Larder']); 133 | Self.BuiltFurniture.Filter.Finder := False; 134 | Self.BuiltFurniture.Filter.UpText := False; 135 | 136 | Self.FurnitureSpace.Setup(1.5, 7, [[1856, 115]]); 137 | Self.FurnitureSpace.SetupUpText(['2 more']); 138 | Self.FurnitureSpace.Filter.Finder := False; 139 | end; 140 | end; 141 | end; 142 | 143 | procedure TAntiban.Setup(); override; 144 | begin 145 | Self.Skills := [ERSSkill.CONSTRUCTION, ERSSkill.TOTAL]; 146 | Self.MinZoom := 0; 147 | Self.MaxZoom := 35; 148 | 149 | inherited; 150 | end; 151 | 152 | procedure TBuilder.Init(maxActions: UInt32; maxTime: UInt64); override; 153 | begin 154 | inherited; 155 | 156 | RSW.SetupRegions([RSRegions.RIMMINGTON, RSRegions.POH]); 157 | Self.LastPoint := [0, 0]; 158 | Self.SetupNPC(); 159 | Self.SetupObjects(); 160 | Self.SetupPlank(); 161 | 162 | Self.UsePlankSack := Inventory.ContainsItem('Plank sack'); 163 | 164 | Self.ActionProfit -= (ItemData.GetAverage(Plank) * 8 + 40); 165 | 166 | if CurrentNPC = PHIALS then 167 | case CurrentFurniture of 168 | ERSFurniture.REGULAR_LARDER: Inventory.FindItem('noted Plank', NotedPlanksSlot); 169 | ERSFurniture.OAK_LARDER: Inventory.FindItem('noted Oak plank', NotedPlanksSlot); 170 | ERSFurniture.MYTH_CAPE: Inventory.FindItem('noted Teak plank', NotedPlanksSlot); 171 | ERSFurniture.MAHOGANY_TABLE: Inventory.FindItem('noted Mahogany plank', NotedPlanksSlot); 172 | end; 173 | 174 | if WLSettings.RemoteInput.HUDDebug then 175 | begin 176 | DebugObjectArray += Self.BuiltFurniture; 177 | DebugObjectArray += Self.FurnitureSpace; 178 | DebugObjectArray += RSObjects.POHPortal; 179 | DebugMMDotArray += RSNPCs.Phials; 180 | DebugMMDotArray += Self.ServantNPC; 181 | end; 182 | end; 183 | 184 | 185 | function TBuilder.ContainsEnoughPlanks(): Boolean; 186 | begin 187 | Result := (Inventory.CountItem(Self.Plank) + Self.PlankSackCount) >= 188 | Self.MinPlankCount; 189 | end; 190 | 191 | function TBuilder.EnterHouse(): Boolean; 192 | var 193 | portalOpen: Boolean; 194 | begin 195 | portalOpen := 'house' in Chat.GetChat(); 196 | 197 | if (portalOpen and Chat.ClickOption('building')) or RSObjects.POHPortal.WalkSelectOption(['Build', 'mode']) then 198 | begin 199 | Minimap.WaitMoving(); 200 | WaitUntil((BankPin.IsOpen() and BankPin.Enter(Login.GetPlayerPin())) or MainScreen.LoadingPOH(), 300, 10000); 201 | Result := MainScreen.WaitLoadingPOH(10000); 202 | end; 203 | end; 204 | 205 | function TBuilder.BuildFurniture(): Boolean; 206 | var 207 | tpa: TPointArray; 208 | begin 209 | if Self.LastPoint <> [0, 0] then 210 | begin 211 | tpa := TPAGrow([Self.LastPoint], 6); 212 | Mouse.Move(tpa); 213 | end; 214 | 215 | if Self.FurnitureSpace.WalkSelectOption(['Build La', 'Build Gu', 'Build Ta']) then 216 | begin 217 | Minimap.WaitMoving(); 218 | Exit(WaitUntil(RSInterface.IsOpen(ERSInterfaceType.CLASSIC), 200, 5000)); 219 | end; 220 | 221 | if ChooseOption.HasOption(['Remove La', 'Remove My', 'Remove Ma']) then 222 | begin 223 | ChooseOption.Close(); 224 | FurnitureIsBuilt := True; 225 | Exit; 226 | end; 227 | 228 | Antiban.RandomRotate(); 229 | Self.LastPoint := [0,0]; 230 | end; 231 | 232 | function TBuilder.DestroyFurniture(): Boolean; 233 | var 234 | tpa: TPointArray; 235 | begin 236 | if Self.LastPoint <> [0, 0] then 237 | begin 238 | tpa := TPAGrow([Self.LastPoint], 6); 239 | Mouse.Move(tpa); 240 | end; 241 | 242 | if Self.BuiltFurniture.WalkSelectOption(['Remove La', 'Remove My', 'Remove Ma']) then 243 | begin 244 | Minimap.WaitMoving(); 245 | Exit(WaitUntil(Chat.GetChatTitle() = 'Really remove it?', 200, 3000)); 246 | end; 247 | 248 | if ChooseOption.HasOption(['Build La', 'Build Gu', 'Build Ta']) or Inventory.ContainsItem('Mythical cape') then 249 | begin 250 | ChooseOption.Close(); 251 | FurnitureIsBuilt := False; 252 | Exit; 253 | end; 254 | 255 | Antiban.RandomRotate(); 256 | Self.LastPoint := [0,0]; 257 | end; 258 | 259 | function TBuilder.CallServant(): Boolean; 260 | begin 261 | if Self.ServantNPC.Click() then 262 | begin 263 | Minimap.WaitMoving(); 264 | Result := WaitUntil(Chat.GetChatTitle() = 'Repeat last task?', 265 | SRL.TruncatedGauss(50, 1500), 5000); 266 | end 267 | else 268 | Result := Options.CallServant(); 269 | end; 270 | 271 | function TBuilder.PhialsGetPlanks(): Boolean; 272 | begin 273 | if not RSNPCs.Phials.IsVisible() and not RSW.AtTile(RSNPCs.Phials.Coordinates, 8) then 274 | RSW.WebWalk(RSNPCs.Phials.Coordinates, 15, 0.2); 275 | 276 | if Inventory.SetSelectedSlot(Self.NotedPlanksSlot) and 277 | RSNPCs.Phials.SelectOption(['Use']) then 278 | begin 279 | Minimap.WaitFlag(); 280 | Result := WaitUntil(Pos('Exchange', Chat.GetChatTitle()) > 0, 100, 15000) 281 | end; 282 | end; 283 | 284 | function TBuilder.TalkServant(): Boolean; 285 | begin 286 | if Self.ServantNPC.Click() then 287 | begin 288 | Minimap.WaitMoving(); 289 | Result := WaitUntil(Inventory.IsFull(), 100, 5000); 290 | end; 291 | 292 | Self.WaitingServant := not Result; 293 | end; 294 | 295 | function TBuilder.FillSack(attempt: Int32 = 0): Boolean; 296 | var 297 | count: Int32; 298 | begin 299 | count := Inventory.CountItem(Self.Plank); 300 | 301 | if Inventory.ClickItem('Plank sack', 'Fill') then 302 | Result := WaitUntil(Inventory.CountItem(Self.Plank) < count, 300, 3000); 303 | 304 | if Result then 305 | Self.PlankSackCount += count 306 | else if attempt = 2 then 307 | begin 308 | Self.PlankSackCount := 28; 309 | Exit(True); 310 | end 311 | else 312 | Exit(Self.FillSack(attempt + 1)); 313 | end; 314 | 315 | function TBuilder.HandleServant(): Boolean; 316 | begin 317 | Result := Chat.ClickOption('Fetch', BioHash); 318 | if Result then 319 | begin 320 | Self.WaitingServant := True; 321 | WaitUntil(Chat.GetChatTitle() <> 'Repeat last task?', 200, 3000) 322 | end; 323 | end; 324 | 325 | function TBuilder.HandleBuildChat(): Boolean; 326 | var 327 | tpa: TPointArray; 328 | begin 329 | if Chat.ClickOption('Yes') then 330 | begin 331 | if (Self.LastPoint <> [0, 0]) and Self.ContainsEnoughPlanks() then 332 | begin 333 | tpa := TPAGrow([Self.LastPoint], 6); 334 | ASyncMouse.Move(tpa); 335 | end; 336 | Result := WaitUntil(Chat.GetChatTitle() <> 'Really remove it?', 200, 3000); 337 | end; 338 | 339 | if Result then 340 | begin 341 | if CurrentFurniture = ERSFurniture.MYTH_CAPE then 342 | Result := WaitUntil(Inventory.ContainsItem('Mythical cape'), 50, 3000) 343 | else 344 | Wait(100, 150); 345 | 346 | Self.FurnitureIsBuilt := not Result; 347 | end; 348 | end; 349 | 350 | function TBuilder.HandleFurniture(): Boolean; 351 | var 352 | count: Int32; 353 | tpa: TPointArray; 354 | begin 355 | count := Inventory.CountItem(Self.Plank); 356 | 357 | case CurrentFurniture of 358 | ERSFurniture.REGULAR_LARDER: Keyboard.PressKey(VK_1); 359 | ERSFurniture.OAK_LARDER: Keyboard.PressKey(VK_2); 360 | ERSFurniture.MYTH_CAPE: Keyboard.PressKey(VK_4); 361 | ERSFurniture.MAHOGANY_TABLE: Keyboard.PressKey(VK_6); 362 | end; 363 | 364 | if (Self.LastPoint <> [0, 0]) then 365 | begin 366 | tpa := TPAGrow([Self.LastPoint], 6); 367 | ASyncMouse.Move(tpa); 368 | end; 369 | 370 | Result := WaitUntil(not RSInterface.IsOpen(ERSInterfaceType.CLASSIC), 100, 3000); 371 | Self.FurnitureIsBuilt := Result; 372 | 373 | XPBar.EarnedXP(); 374 | 375 | if Result then 376 | begin 377 | if Self.UsePlankSack and (count < Self.MinPlankCount) then 378 | begin 379 | count := Self.MinPlankCount - count; 380 | Self.PlankSackCount -= count; 381 | end; 382 | 383 | Self.TotalActions += 1; 384 | Self.TotalProfit := Self.TotalActions * Self.ActionProfit; 385 | WL.Activity.Restart(); 386 | Wait(600, 800); 387 | end else 388 | RSInterface.Close(); 389 | end; 390 | 391 | function TBuilder.HandlePhialsChat(): Boolean; 392 | var 393 | slot: Int32; 394 | begin 395 | Result := Chat.ClickOption('All', True); 396 | 397 | if Result then 398 | begin 399 | if Self.UsePlankSack and (Self.PlankSackCount < Self.MinPlankCount) then 400 | begin 401 | if Inventory.FindItem('Plank sack', slot) then 402 | AsyncMouse.Move(SRL.rowp(Mouse.Position(), Inventory.GetSlotBox(slot))); 403 | Exit; 404 | end; 405 | 406 | RSObjects.POHPortal.PreHoverHelper(Self.RSW.GetMyPos()); 407 | end; 408 | end; 409 | 410 | function TBuilder.GetState(): EBuilderState; 411 | var 412 | s: String; 413 | begin 414 | if Self.ShouldStop() then 415 | Exit(EBuilderState.END_SCRIPT); 416 | 417 | if WL.Activity.IsFinished() then 418 | Exit(EBuilderState.NO_ACTIVITY); 419 | 420 | if Chat.LeveledUp() then 421 | Exit(EBuilderState.LEVEL_UP); 422 | 423 | s := Chat.GetChatTitle(); 424 | 425 | if s.Contains('remove') then 426 | Exit(EBuilderState.HANDLE_BUILD_CHAT); 427 | 428 | if s.Contains('Exchange') then 429 | Exit(EBuilderState.HANDLE_PHIALS_CHAT); 430 | 431 | if s.Contains('Select') then 432 | begin 433 | if 'house' in Chat.GetChat() then 434 | Exit(EBuilderState.ENTER_HOUSE); 435 | end; 436 | 437 | if s.Contains('Repeat') then 438 | Exit(EBuilderState.HANDLE_SERVANT); 439 | 440 | if RSInterface.IsOpen(ERSInterfaceType.CLASSIC) then 441 | begin 442 | if BankPin.IsOpen() then 443 | Exit(EBuilderState.HANDLE_PIN); 444 | 445 | if not Minimap.InPOH() then 446 | Exit(EBuilderState.CLOSE_INTERFACE); 447 | Exit(EBuilderState.HANDLE_FURNITURE_UI); 448 | end; 449 | 450 | if not Minimap.InPOH() then 451 | begin 452 | if not UsePhials then 453 | Exit(EBuilderState.ENTER_HOUSE); 454 | 455 | if (CurrentFurniture = ERSFurniture.MYTH_CAPE) and not Inventory.ContainsItem('Mythical cape') then 456 | Exit(EBuilderState.ENTER_HOUSE); 457 | 458 | if Inventory.IsFull() then 459 | begin 460 | if Self.UsePlankSack and (Self.PlankSackCount < Self.MinPlankCount) then 461 | Exit(EBuilderState.FILL_SACK); 462 | Exit(EBuilderState.ENTER_HOUSE); 463 | end; 464 | 465 | Exit(EBuilderState.GET_PLANKS); 466 | end; 467 | 468 | if Self.FurnitureIsBuilt then 469 | Exit(EBuilderState.DESTROY_FURNITURE); 470 | 471 | if Self.ContainsEnoughPlanks() then 472 | begin 473 | Self.WaitingServant := False; 474 | Exit(EBuilderState.BUILD_FURNITURE); 475 | end; 476 | 477 | if Self.UsePhials then 478 | Exit(EBuilderState.EXIT_HOUSE); 479 | 480 | if WaitingServant then 481 | begin 482 | if ServantNPC.IsVisible() then 483 | Exit(EBuilderState.TALK_SERVANT); 484 | Exit(EBuilderState.WAIT_STATE); 485 | end; 486 | 487 | Exit(EBuilderState.CALL_SERVANT); 488 | end; 489 | 490 | procedure TBuilder.Run(maxActions: UInt32; maxTime: UInt64); 491 | begin 492 | Self.Init(maxActions, maxTime); 493 | 494 | repeat 495 | Self.State := Self.GetState(); 496 | Self.SetAction(ToStr(Self.State)); 497 | 498 | case Self.State of 499 | EBuilderState.LEVEL_UP: Chat.HandleLevelUp(); 500 | 501 | EBuilderState.HANDLE_BUILD_CHAT: Self.HandleBuildChat(); 502 | EBuilderState.HANDLE_PHIALS_CHAT: Self.HandlePhialsChat(); 503 | EBuilderState.HANDLE_FURNITURE_UI: Self.HandleFurniture(); 504 | EBuilderState.HANDLE_SERVANT: Self.HandleServant(); 505 | EBuilderState.HANDLE_PIN: BankPin.Enter(Login.GetPlayerPin()); 506 | EBuilderState.CLOSE_INTERFACE: RSInterface.Close(True); 507 | 508 | EBuilderState.CALL_SERVANT: Self.CallServant(); 509 | EBuilderState.TALK_SERVANT: Self.TalkServant(); 510 | EBuilderState.EXIT_HOUSE: Options.LeaveHouse(); 511 | EBuilderState.GET_PLANKS: Self.PhialsGetPlanks(); 512 | EBuilderState.FILL_SACK: Self.FillSack(); 513 | 514 | EBuilderState.ENTER_HOUSE: Self.EnterHouse(); 515 | EBuilderState.BUILD_FURNITURE: Self.BuildFurniture(); 516 | EBuilderState.DESTROY_FURNITURE: Self.DestroyFurniture(); 517 | 518 | EBuilderState.WAIT_STATE: Wait(7000, 8000); 519 | 520 | EBuilderState.NO_ACTIVITY, EBuilderState.END_SCRIPT: Break; 521 | end; 522 | 523 | Self.DoAntiban(); 524 | until False; 525 | end; 526 | 527 | var 528 | Builder: TBuilder; 529 | 530 | function TRSMinimap.GetCleanMinimap(angle: Double = $FFFF): TMufasaBitmap; override; 531 | var 532 | Bitmap: TMufasaBitmap; 533 | begin 534 | Bitmap := GetMufasaBitmap(BitmapFromClient(Minimap.Bounds)); 535 | Bitmap.ReplaceColor(0, 1); // We need zero to be unique 536 | 537 | Self.CleanMinimap(Bitmap); 538 | Bitmap.ReplaceColor(1, $32A072); 539 | 540 | Result.Init(); 541 | if angle = $FFFF then 542 | angle := Self.GetCompassAngle(False); 543 | Bitmap.RotateBitmapEx(angle, False, True, Result); 544 | Bitmap.Free(); 545 | end; 546 | 547 | function TRSInterfaceArea.ClickClose(pressEscape: Boolean = False): Boolean; override; 548 | var 549 | button: TRSButton; 550 | i: Int32; 551 | begin 552 | button := Self.GetCloseButton(); 553 | Result := button <> []; 554 | 555 | if not Result and Minimap.InPOH() or not Self.IsOpen() then 556 | Exit; 557 | 558 | if not Result or (pressEscape and Self.EscapeEnabled) then 559 | begin 560 | Keyboard.PressKey(VK_ESCAPE); 561 | 562 | //Antiban stuff. 563 | if Random() < Antiban.GetUniqueDouble(0.15, 0.1, 0.2) then 564 | for i := 0 to Antiban.GetUniqueInt(2, 1, 3) do 565 | begin 566 | if not Keyboard.IsKeyDown(VK_ESCAPE) then 567 | begin 568 | if Antiban.BioDice() then 569 | Keyboard.PressKey(VK_ESCAPE) 570 | else 571 | Keyboard.KeyDown(VK_ESCAPE); 572 | end; 573 | 574 | Wait(20, 150, wdLeft); 575 | 576 | if Keyboard.IsKeyDown(VK_ESCAPE) and Antiban.BioDice(0.5) then 577 | begin 578 | Keyboard.KeyUp(VK_ESCAPE); 579 | Wait(20, 80, wdLeft); 580 | end; 581 | end; 582 | 583 | if Keyboard.IsKeyDown(VK_ESCAPE) then 584 | Keyboard.KeyUp(VK_ESCAPE); 585 | 586 | Exit; 587 | end; 588 | 589 | Result := button.Click(); 590 | end; 591 | 592 | function TRSWalkerObject.FindOnMainScreen(cuboidArray: TCuboidExArray): T2DPointArray; override; 593 | var 594 | i: Int32; 595 | tpa: TPointArray; 596 | tempFinder: TRSObjectFinder; 597 | begin 598 | if (CurrentFurniture <> ERSFurniture.MYTH_CAPE) or 599 | ((Self <> Builder.BuiltFurniture) and (Self <> Builder.FurnitureSpace)) then 600 | Exit(inherited); 601 | 602 | tempFinder := Self.Finder.Unlimited(); 603 | cuboidArray := MainScreen.Filter(cuboidArray); 604 | 605 | for i := 0 to High(cuboidArray) do 606 | begin 607 | tpa := MainScreen.FindObject(tempFinder, cuboidArray[i].Bounds()).Merge(); 608 | if tpa <> [] then 609 | begin 610 | tpa := cuboidArray[i].Filter(tpa); 611 | if tpa <> [] then 612 | begin 613 | Result += tpa; 614 | Continue; 615 | end; 616 | end; 617 | 618 | tpa := cuboidArray[i].ShapeFill(); 619 | if tpa <> [] then 620 | Result += tpa; 621 | end; 622 | end; 623 | 624 | function TRSWalkerObject._SelectHelper(action: TStringArray): Boolean; override; 625 | begin 626 | if Self.CurrentUpText <> [] then 627 | Self.CurrentUpText := []; 628 | 629 | if Self.RedClicked then 630 | begin 631 | Self.RedClicked := False; 632 | Exit(True); 633 | end; 634 | 635 | if ChooseOption.IsOpen() and ChooseOption.Select(action) then 636 | Exit(True); 637 | 638 | if MainScreen.IsUpText(action) then 639 | begin 640 | Mouse.Click(MOUSE_LEFT); 641 | Exit(MainScreen.DidRedClick()); 642 | end; 643 | 644 | Builder.LastPoint := Mouse.Position(); 645 | 646 | Result := ChooseOption.Select(action, MOUSE_LEFT, True, (False)); 647 | end; 648 | 649 | procedure TRSMinimap.SetCompassAngleEx(degrees, accuracy: Double); override; 650 | begin 651 | if MainScreen.IsUpText('>') then 652 | ChooseOption.Select('Cancel'); 653 | 654 | inherited; 655 | end; 656 | 657 | procedure TSRL.Debug(bitmap: TMufasaBitmap); override; 658 | begin 659 | inherited; 660 | 661 | Builder.RSW.Draw(bitmap); 662 | end; 663 | 664 | {$IFDEF SCRIPT_GUI} 665 | type 666 | TBuilderConfig = record(TScriptForm) 667 | NPCSelector: TLabeledCombobox; 668 | FurnitureSelector: TLabeledCombobox; 669 | LayoutInfo, BuilderInfo: TLabel; 670 | ImagePanel: TPanel; 671 | end; 672 | 673 | procedure TBuilderConfig.StartScript(sender: TObject); override; 674 | begin 675 | CurrentNPC := ERSNPC(Self.NPCSelector.GetItemIndex()); 676 | CurrentFurniture := ERSFurniture(Self.FurnitureSelector.GetItemIndex()); 677 | inherited; 678 | end; 679 | 680 | procedure TBuilderConfig.NPCSelectorOnChange(sender: TObject); 681 | var 682 | combobox: TComboBox; 683 | begin 684 | combobox := sender; 685 | case combobox.getItemIndex() of 686 | 0: Self.BuilderInfo.SetCaption( 687 | 'Make sure you have noted planks with you, hammer, saw and coins.' 688 | + LineEnding + 689 | 'You may also bring a plank sack if you have one.' 690 | ); 691 | 692 | 1: Self.BuilderInfo.SetCaption( 693 | 'Make sure to have a Bell-pull in your dining room and a ' + 694 | LineEnding + 695 | 'Servant''s money bag in your south bedroom if using a butler.' + 696 | LineEnding + LineEnding + 697 | 'Make sure you have planks in your bank and you have previously' + 698 | LineEnding + 699 | 'asked the butler to fetch you 24 planks.' + 700 | LineEnding + LineEnding + 701 | 'You also need money in your servant''s money bag and you need to' + 702 | LineEnding + 703 | 'replenish it MANUALLY once in a while.' 704 | ); 705 | end; 706 | end; 707 | 708 | procedure TBuilderConfig.FurnitureSelectorOnChange(sender: TObject); 709 | var 710 | combobox: TComboBox; 711 | begin 712 | combobox := sender; 713 | 714 | DownloadToFile( 715 | 'https://files.catbox.moe/6d5d58.png', 716 | WL_DATAPATH + 'assets' + DirectorySeparator + 'hall.png' 717 | ); 718 | 719 | DownloadToFile( 720 | 'https://files.catbox.moe/9mscoc.png', 721 | WL_DATAPATH + 'assets' + DirectorySeparator + 'kitchen.png' 722 | ); 723 | 724 | DownloadToFile( 725 | 'https://files.catbox.moe/tqs1bx.png', 726 | WL_DATAPATH + 'assets' + DirectorySeparator + 'dining.png' 727 | ); 728 | 729 | case combobox.getItemIndex() of 730 | 0, 1: 731 | begin 732 | ImagePanel.SwapImage(WL_DATAPATH + 'assets' + DirectorySeparator + 'kitchen.png'); 733 | Self.LayoutInfo.setCaption( 734 | 'Your POH layout must look like this on the minimap, no other room should be seen.' 735 | + LineEnding + 736 | 'If you have more rooms move them 2 or 3 squares away with the house options.' 737 | + LineEnding + 738 | 'You may be able to use other rooms but I cannot guarantee it will work.' 739 | + LineEnding + LineEnding + 740 | 'TRY TO MATCH THE DOORS AND WINDOWS POSITIONS to the image.' 741 | + LineEnding + LineEnding + 742 | 'Have your larder in the NORTHEAST side of the kitchen.' 743 | ); 744 | end; 745 | 2: 746 | begin 747 | ImagePanel.SwapImage(WL_DATAPATH + 'assets' + DirectorySeparator + 'hall.png'); 748 | Self.LayoutInfo.setCaption( 749 | 'Your POH layout must look like this on the minimap, no other room should be seen.' 750 | + LineEnding + 751 | 'If you have more rooms move them 2 or 3 squares away with the house options.' 752 | + LineEnding + 753 | 'You may be able to use other rooms but I cannot guarantee it will work.' 754 | + LineEnding + LineEnding + 755 | 'TRY TO MATCH THE DOORS AND WINDOWS POSITIONS to the image.' 756 | + LineEnding + LineEnding + 757 | 'Have your cape mount in the SOUTHEAST side of the hall.' 758 | ); 759 | end; 760 | 3: 761 | begin 762 | ImagePanel.SwapImage(WL_DATAPATH + 'assets' + DirectorySeparator + 'dining.png'); 763 | Self.LayoutInfo.setCaption( 764 | 'Your POH layout must look like this on the minimap, no other room should be seen.' 765 | + LineEnding + 766 | 'If you have more rooms move them 2 or 3 squares away with the house options.' 767 | + LineEnding + 768 | 'You may be able to use other rooms but I cannot guarantee it will work.' 769 | + LineEnding + LineEnding + 770 | 'TRY TO MATCH THE DOORS AND WINDOWS POSITIONS to the image.' 771 | ); 772 | end; 773 | end; 774 | end; 775 | 776 | procedure TBuilderConfig.Run(); override; 777 | var 778 | tab: TTabSheet; 779 | begin 780 | Self.Setup('Wasp Builder'); 781 | Self.Start.SetOnClick(@Self.StartScript); 782 | 783 | Self.AddTab('Script Settings'); 784 | tab := Self.Tabs[High(Self.Tabs)]; 785 | 786 | Self.CreateAccountManager(tab); 787 | 788 | with Self.NPCSelector do 789 | begin 790 | Create(tab); 791 | SetCaption('Method:'); 792 | SetLeft(TControl.AdjustToDPI(40)); 793 | SetTop(TControl.AdjustToDPI(150)); 794 | SetStyle(csDropDownList); 795 | AddItemArray(['Phials', 'Demon butler']); 796 | SetItemIndex(Ord(CurrentNPC)); 797 | Combobox.SetOnChange(@Self.NPCSelectorOnChange); 798 | end; 799 | 800 | with Self.FurnitureSelector do 801 | begin 802 | Create(tab); 803 | SetCaption('Furniture:'); 804 | SetTop(Self.NPCSelector.GetTop()); 805 | SetLeft(Self.NPCSelector.GetRight() + TControl.AdjustToDPI(15)); 806 | SetStyle(csDropDownList); 807 | AddItemArray(['Regular larder', 'Oak larder', 'Myth cape', 'Mahogany table']); 808 | SetItemIndex(Ord(CurrentFurniture)); 809 | ComboBox.setOnChange(@Self.FurnitureSelectorOnChange); 810 | end; 811 | 812 | with Self.LayoutInfo do 813 | begin 814 | Create(tab); 815 | SetLeft(Self.NPCSelector.GetLeft()); 816 | SetTop(Self.NPCSelector.GetBottom() + TControl.AdjustToDPI(15)); 817 | SetHint('House layout instructions.'); 818 | end; 819 | 820 | with Self.BuilderInfo do 821 | begin 822 | Create(tab); 823 | SetLeft(Self.LayoutInfo.GetLeft()); 824 | SetTop(Self.LayoutInfo.GetBottom() + TControl.AdjustToDPI(95)); 825 | SetHint('NPC mode instructions.'); 826 | end; 827 | 828 | with Self.ImagePanel do 829 | begin 830 | Create(tab); 831 | SetTop(Self.FurnitureSelector.GetTop() + TControl.AdjustToDPI(15)); 832 | SetLeft(Self.FurnitureSelector.GetRight() + TControl.AdjustToDPI(90)); 833 | SetWidth(TControl.AdjustToDPI(253)); 834 | SetHeight(TControl.AdjustToDPI(245)); 835 | setHint('House layout. Make sure your house layout looks like this!'); 836 | end; 837 | 838 | Self.CreateAntibanManager(); 839 | Self.CreateWaspLibSettings(); 840 | Self.CreateAPISettings(); 841 | 842 | Self.NPCSelectorOnChange(Self.NPCSelector.ComboBox); 843 | Self.FurnitureSelectorOnChange(Self.FurnitureSelector.ComboBox); 844 | 845 | inherited; 846 | end; 847 | 848 | var 849 | BuilderConfig: TBuilderConfig; 850 | {$ENDIF} 851 | 852 | begin 853 | {$IFDEF SCRIPT_GUI} 854 | BuilderConfig.Run(); 855 | {$ENDIF} 856 | Builder.Run(WLSettings.MaxActions, WLSettings.MaxTime); 857 | end. 858 | --------------------------------------------------------------------------------