{$UNDEF SCRIPT_ID}{$DEFINE SCRIPT_ID := 'cf2ed007-5328-4914-b6fc-cd521759f893'} {$UNDEF SCRIPT_REVISION}{$DEFINE SCRIPT_REVISION := '13'} {$IFDEF WINDOWS}{$DEFINE SCRIPT_GUI}{$ENDIF} {$I SRL-B/osr.simba} {$I BashLib/osr.simba} {$I BashLib/optional/handlers/discord.simba} {$I BashLib/optional/handlers/aichat.simba} {$IFDEF SCRIPT_GUI} {$I BashLib/optional/handlers/bashgui.simba} {$ENDIF} { ---------------------------------------------------------------------------------- ~~~ Need Support? Contact Me ~~~ Website: https://bashscripts.shop/ Discord Server: https://discord.gg/qsmKs5uKfR Email: thebigaussie@proton.me Github: https://github.com/BigAussie/BASH ---------------------------------------------------------------------------------- } var POWERMINING: Boolean = False; IGNOREWATERFALLS: Boolean = False; DiscordUID: String = ''; PINGONTERMINATED: Boolean = True; begin Mouse.Speed := Random(22, 28); end; type EState = ( STATE_MINECALCIFIEDROCKS, STATE_PROCESSDEPOSITS, STATE_WALKTOBLACKSMITH, STATE_WALKTOMINESITE, STATE_OPENBANK, STATE_HANDLEBANKING, STATE_DROPITEMS ); ELocation = ( BLACKSMITH, BANKAREA, EASTMINESITE, WESTMINESITE ); CalcifiedMiner = record (TBaseBankScript) CurrentState: EState; CalcifiedDeposit: TRSitem; HammerItem: TRSitem; CalcifiedMoths: TRSitem; HammerBank: TRSBankItem; ItemsToDeposit: TRSItemArray; BankTripItems: TRSItemArray; StartXP: Integer; CurrentXP: Integer; TotalShardsMined: Integer; TotalShardsBanked: Integer; TotalCalcifiedMoths: Integer; CalcifiedMothValue: Integer; StartingShards: Integer; MyPos: TPoint; CalcifiedRocks: TRSObject; WetCalcifiedRocks: TRSObject; CamTorumAnvil: TRSObject; BankersTable: TRSObject; end; var Timer: TStopWatch; RSW: TRSWalker; CamTorumMine : TWebGraph; procedure TRSWalker.InternalSetup(); override; begin inherited; CamTorumMine.LoadNodesFromString('xgAAAHicTY3BDcQwCARbcQkG1gfUYqX/NrIbR7r8RsMAG94D2deGrYE2whTIwI+JtmMi5wfqGbHJKaM7QSjGSw1oQqOIgVnX9u4D5vWH6EXgrygQEgcUB9T8aJAvuL1bjxHw+w3F/C2g'); CamTorumMine.LoadPathsFromString('iwAAAHicJYzRFQQxCAJbmRKCm2ySWnz238bh3pcgDCmeykFUimlVGSx25eStXJxWh1u5+7GRKxfJwEDNCT3IiAJ5o93ymeglurj+mbfkgUt443Pny2M08AMgryD8'); CamTorumMine.LoadNamesFromString('WAAAAHici1Y2iI2mAQYA/MUW8w=='); Self.WebGraph := CamTorumMine; end; procedure TAntiban.Setup(); override; begin Self.Skills := [ERSSkill.MINING, ERSSkill.PRAYER, ERSSkill.TOTAL]; Self.MinZoom := 10; Self.MaxZoom := 24; inherited; if OVERRIDEBREAKS then begin WriteLn('[ANTIBAN] Custom break override enabled:'); WriteLn(' - Break Interval: ', CUSTOMBREAKINTERVAL, ' minutes'); WriteLn(' - Break Duration: ', CUSTOMBREAKDURATION, ' minutes'); Self.Breaks := []; Self.AddBreak(CUSTOMBREAKINTERVAL * ONE_MINUTE, CUSTOMBREAKDURATION * ONE_MINUTE, 0.33, 0.15); WriteLn('[ANTIBAN] Custom breaks initialized successfully'); end else WriteLn('[ANTIBAN] Using WaspLib break system'); end; function TBaseScript.DoAntiban(checkBreaks: Boolean = True; checkSleeps: Boolean = True): Boolean; override; begin Antiban.DismissRandom(); Self.TimeRunning.Pause(); Self.OnAntiban := True; checkBreaks := checkBreaks and (WLSettings.GetObject('antiban').getBoolean('breaks') or OVERRIDEBREAKS); checkSleeps := checkSleeps and WLSettings.GetObject('antiban').getJSONObject('sleep').getBoolean('enabled'); if WLSettings.GetObject('antiban').getJSONObject('tasks').getBoolean('enabled') or checkBreaks or checkSleeps then Result := Antiban.DoAntiban(checkBreaks, checkSleeps); Self.TimeRunning.Resume(); Self.OnAntiban := False; if not RSClient.IsLoggedIn() then Login.LoginPlayer(); end; procedure CalcifiedMiner.SendWebhook(msg: String; FilePath: String = ''); var HTTP: Int32; Response, Payload: String; begin if WEBHOOKURL = "" then Exit; if DiscordUID <> '' then msg := '<@' + DiscordUID + '> ' + msg; // First attempt with JSON payload Payload := '{"content": "' + msg + '"}'; HTTP := InitializeHTTPClient(False); try SetHTTPHeader(HTTP, 'Content-Type', 'application/json'); Response := PostHTTPPage(HTTP, WEBHOOKURL, Payload); if Response = '' then WriteLn('Webhook successfully sent with JSON payload.') else WriteLn('Webhook sent with JSON payload. Response: ', Response); // Fallback to FORMS if JSON Fails - We had to fallback as some users had issues with JSON Thanks @Chandler for all the help testing this. if Pos('"code": 50006', Response) > 0 then begin FreeHTTPClient(HTTP); HTTP := InitializeHTTPClient(False); AddPostVariable(HTTP, 'content', msg); Response := PostHTTPPageEx(HTTP, WEBHOOKURL); if Response = '' then WriteLn('Webhook fallback successfully sent with form data after code 50006 error.') else WriteLn('Webhook fallback sent with form data after code 50006 error. Response: ', Response); end; finally FreeHTTPClient(HTTP); end; end; procedure CalcifiedMiner.SendTerminationNotification(); begin Self.SendWebhook('Calcified Miner has terminated or crashed.'); end; procedure CalcifiedMiner.SetupObjects(); begin writeln('Setting up objects'); with self.CalcifiedRocks do begin SetupEx([1, 1, 10], [[354, 483], [354, 496], [354, 487], [363, 468], [358, 468], {East Wall} [452, 486], [452, 490], [452, 482], [436, 470], [432, 470], [424, 470]]); SetupUpText(['Calcified rocks']); Finder.ColorClusters += [CTS2(4082774, 4, 0.14, 0.46), CTS2(3289654, 6, 0.01, 0.34), 5]; end; with self.WetCalcifiedRocks do begin SetupEx([1, 1, 10], [[354, 483], [354, 496], [354, 487], [363, 468], [358, 468], {East Wall} [452, 486], [452, 490], [452, 482], [436, 470], [432, 470], [424, 470]]); SetupUpText(['Calcified rocks']); Finder.Colors += CTS2(10388048, 13, 0.02, 1.02); end; with self.CamTorumAnvil do begin Setup(2, [[150, 326]]); SetupUpText(['Anvil']); Finder.Colors += CTS2(4942722, 10, 0.06, 0.44); end; with self.BankersTable do begin Setup(2, [[171, 377]]); SetupUpText(['Bank table']); Finder.ColorClusters += [CTS2(5138813, 5, 0.09, 0.08), CTS2(5412524, 7, 0.04, 0.75), 5]; end; end; function CalcifiedMiner.GetLocation(): ELocation; begin if (not RSClient.IsLoggedIn) then Exit; MyPos := Self.RSW.GetMyPos; if MyPos.InBox([136, 299, 191, 341]) then Exit(BLACKSMITH); if MyPos.InBox([159, 369, 199, 402]) then Exit(BANKAREA); if MyPos.InBox([413, 455, 468, 514]) then Exit(EASTMINESITE); if MyPos.InBox([350, 460, 388, 515]) then Exit(WESTMINESITE); end; procedure CalcifiedMiner.WALKTOBLACKSMITH(); begin writeln('Walking to blacksmith.'); RSW.WebWalk([156, 326]); end; procedure CalcifiedMiner.HANDLEBANKING(); var shardCount: Integer; begin if not Bank.IsOpen then begin Bank.Walkopen(BankersTable); if not WaitUntil(Bank.IsOpen, 120, 3000) then Exit; end; shardCount := Inventory.CountItemStack('Blessed bone shards'); TotalCalcifiedMoths += Inventory.CountItemStack(CalcifiedMoths); writeln('Depositing mining loot.'); if Inventory.ContainsItem('Open gem bag') then begin Inventory.ClickItem('Open gem bag', 'Empty'); WaitUntil(Inventory.ContainsItem('Open gem bag'), 120, 3000); end; Bank.DepositItems(Self.ItemsToDeposit, True); TotalShardsBanked += shardCount - Inventory.CountItemStack('Blessed bone shards'); if not (Inventory.ContainsItem(HammerItem) or Inventory.ContainsItem('Imcando hammer')) then Bank.WithdrawItem(HammerBank, TRUE); Bank.Close(); end; procedure CalcifiedMiner.OPENBANK(); begin writeln('Opening bank.'); RSW.WebWalk([172, 382]); if not Bank.Walkopen(BankersTable) then Exit; if not WaitUntil(Bank.IsOpen, 120, 3000) then Exit; HANDLEBANKING(); end; procedure CalcifiedMiner.DROPITEMS(); var Slots: TIntegerArray; DropList: TRSItemArray; begin writeln('Dropping...'); DropList := ['Calcified deposit', 'Uncut sapphire', 'Uncut emerald', 'Uncut ruby', 'Uncut diamond']; Inventory.FindItems(DropList, Slots); Inventory.ShiftDrop(DropList, DROP_PATTERN_SNAKE); end; procedure CalcifiedMiner.WALKTOMINESITE(); var destination: TPoint; begin writeln('Returning to mine site.'); if Antiban.BioDice() then destination := Point(436, 486) // West Mine Site else destination := Point(368, 486); // East Mine Site RSW.WebWalk(destination); end; // It's a meme but thanks club and student for helping me tidy up this (Oh also CJ said check uptext which was a good idea to) procedure CalcifiedMiner.PROCESSDEPOSITS(); var ATPA: T2DPointArray; TPA: TPointArray; begin if not Inventory.SetSelectedItem(CalcifiedDeposit) then Exit; CamTorumAnvil.Find(ATPA); if (ATPA.Len <= 0) then Exit; TPA := ATPA[0]; Mouse.Move(TPA.Mean()); if not MainScreen.IsUpText('Anvil', 250) then Exit; Mouse.Click(MOUSE_LEFT); if not WaitUntil(Make.IsOpen, 100, 3000) then Exit; if Make.Select('Calcified deposit', Make.QUANTITY_ALL) then WaitUntil(not Inventory.ContainsItem(CalcifiedDeposit), 100, 70000); end; // full Credits to SkunkGUIworks procedure TRSMinimap.RotateWithinAngles(min, max: Int32); var minMaxAvg: Int32 := Floor((min + max) div 2); preferredAngle: Int32 := SRL.SkewedRand(minMaxAvg, min, max); currentAngle, normMin, normMax: Int32; begin if preferredAngle < 0 then preferredAngle := preferredAngle + 360; currentAngle := Round(Self.GetCompassAngle(True)); if currentAngle < 0 then currentAngle := currentAngle + 360; normMin := min; normMax := max; if normMin < 0 then normMin := normMin + 360; if normMax < 0 then normMax := normMax + 360; // Wrapping ranges (e.g. 267..10) are in-range on either side of 0. if normMin <= normMax then begin if (currentAngle >= normMin) and (currentAngle <= normMax) then Exit; end else if (currentAngle >= normMin) or (currentAngle <= normMax) then Exit; Minimap.SetCompassAngle(preferredAngle); end; procedure CalcifiedMiner.MINECALCIFIEDROCKS(); var PlayerBox: TBox; XP: Integer; ATPA: T2DPointArray; TPA: TPointArray; T, ReportTimer: TStopWatch; MiningDuration: Int32; InitialShards: Integer; CurrentShards: Integer; MiningWetRock: Boolean; CompassAngle: Double; begin if Inventory.ContainsItem('Gem bag') then Inventory.ClickItem('Gem bag', 'Open'); PlayerBox := MainScreen.GetPlayerBox(); XP := XPBar.Read(); ReportTimer.Start(); InitialShards := Inventory.CountItemStack('Blessed bone shards');; begin if (not Inventory.ContainsItem('Hammer') and not Inventory.ContainsItem('Imcando hammer')) and not POWERMINING then begin writeln('No hammer in inventory, attempting to withdraw.'); OPENBANK(); Exit; end; CompassAngle := Minimap.GetCompassAngle(); if (Self.GetLocation() = WESTMINESITE) and ((CompassAngle < 10) or (CompassAngle > 95)) then Minimap.RotateWithinAngles(15, 85) else if (Self.GetLocation() = EASTMINESITE) and ((CompassAngle > 10) and (CompassAngle < 267)) then Minimap.RotateWithinAngles(-93, 10); if (not IGNOREWATERFALLS) and WetCalcifiedRocks.Find(ATPA) and (not MiningWetRock) then begin WriteLn('Wet Calcified Rock spawned, switching target.'); TPA := ATPA[0]; Mouse.Move(TPA.Mean()); WetCalcifiedRocks.WalkClick(); MiningWetRock := True; WaitUntil(Minimap.IsPlayerMoving, 120, 2000); MiningDuration := RandomRange(1000, 1100); T.Start(); end; ATPA := MainScreen.FindObject(CalcifiedRocks.Finder); if (ATPA.Len > 0) and (not MiningWetRock) then begin CalcifiedRocks.Click(); WaitUntil(Minimap.IsPlayerMoving, 120, 2000); MiningDuration := RandomRange(1000, 1100); T.Start(); end; while (T.ElapsedTime < MiningDuration) do begin Inventory.Open(); if Inventory.CountEmptySlots <= 1 then begin WriteLn('Inventory full or almost full, moving to smash.'); Exit; end; if (not IGNOREWATERFALLS) and WetCalcifiedRocks.Find(ATPA) and (not MiningWetRock) then begin WriteLn('Wet Calcified Rock spawned, switching target.'); TPA := ATPA[0]; Mouse.Move(TPA.Mean()); WetCalcifiedRocks.WalkClick(); MiningWetRock := True; WaitUntil(Minimap.IsPlayerMoving, 120, 2000); MiningDuration := RandomRange(1000, 1100); T.Start(); end; if XPBar.Read() > XP then begin XP := XPBar.Read(); T.Start(); end; if (SRL.PercentShift(PlayerBox, 500) >= 14) then begin T.Start(); end; Wait(100); WL.Activity.Restart(); if ReportTimer.ElapsedTime >= 4000 then begin CurrentShards := Inventory.CountItemStack('Blessed bone shards'); if CurrentShards > InitialShards then begin Self.TotalShardsMined += CurrentShards - InitialShards; InitialShards := CurrentShards; end; Self.Report(); ReportTimer.Start(); end; end; MiningWetRock := False; Self.DoAntiban; end; Self.TotalShardsMined += Inventory.CountItemStack('Blessed bone shards') - InitialShards; end; procedure CalcifiedMiner.doAction(); begin case Self.GetState() of STATE_MINECALCIFIEDROCKS: MINECALCIFIEDROCKS(); STATE_PROCESSDEPOSITS: PROCESSDEPOSITS(); STATE_WALKTOMINESITE: WALKTOMINESITE(); STATE_WALKTOBLACKSMITH: WALKTOBLACKSMITH(); STATE_OPENBANK: OPENBANK(); STATE_HANDLEBANKING: HANDLEBANKING(); STATE_DROPITEMS: DROPITEMS(); end; end; function CalcifiedMiner.GetState(): EState; begin if Inventory.ContainsItem(CalcifiedDeposit) and (Self.GetLocation() = BLACKSMITH) then Exit(STATE_PROCESSDEPOSITS) else if (Inventory.CountEmptySlots <= 1) and Inventory.ContainsItem(CalcifiedDeposit) then begin if POWERMINING then Exit(STATE_DROPITEMS) else Exit(STATE_WALKTOBLACKSMITH); end else if Inventory.ContainsItem(CalcifiedDeposit) and not (Self.GetLocation() in [EASTMINESITE, WESTMINESITE]) then Exit(STATE_WALKTOBLACKSMITH) else if (not Inventory.ContainsItem(CalcifiedDeposit)) and Inventory.ContainsAny(Self.BankTripItems) and not (Self.GetLocation() in [EASTMINESITE, WESTMINESITE]) then Exit(STATE_OPENBANK) else if (Self.GetLocation() = WESTMINESITE) or (Self.GetLocation() = EASTMINESITE) then Exit(STATE_MINECALCIFIEDROCKS) else Exit(STATE_WALKTOMINESITE); end; function FormatRoundedNumber(Number: Integer): String; begin // If the number is >= 1 million, format it with 1 decimal place and add "M" suffix if Number >= 1000000 then Result := FormatFloat('0.0M', Number / 1000000) // If the number is >= 1 thousand, format it with no decimal places and add "K" suffix else if Number >= 1000 then Result := FormatFloat('0K', Number / 1000) // For smaller numbers, use the regular SRL.FormatNumber function else Result := SRL.FormatNumber(Number); end; procedure CalcifiedMiner.Report(); var Runtime: Integer; CurrentXP, GainedXP, PrayerXP, SunfirePrayerXP, Currentshards, Totalshards: Integer; CurrentStateName: String; begin CurrentXP := XPBar.Read(); GainedXP := CurrentXP - startXP; ClearDebug(); Runtime := Timer.ElapsedTime; Totalshards := 0; Currentshards := Inventory.CountItemStack('Blessed bone shards'); Totalshards := Currentshards + Self.TotalShardsBanked - StartingShards; PrayerXP := Totalshards * 5; // Each bone shard is worth 5 prayer XP SunfirePrayerXP := Totalshards * 6; // Each bone shard is worth 6 prayer XP with Sunfire wine case Self.CurrentState of STATE_MINECALCIFIEDROCKS: CurrentStateName := 'Mining Calcified Rocks'; STATE_PROCESSDEPOSITS: CurrentStateName := 'Processing Deposits'; STATE_WALKTOBLACKSMITH: CurrentStateName := 'Walking to Blacksmith'; STATE_WALKTOMINESITE: CurrentStateName := 'Walking to Mine Site'; STATE_OPENBANK: CurrentStateName := 'Opening Bank'; STATE_HANDLEBANKING: CurrentStateName := 'Handling Banking'; end; WriteLn('========================================'); WriteLn(' BASH Scripts Calcified Mining '); WriteLn('========================================'); WriteLn(' Current State: ' + CurrentStateName); WriteLn(' Runtime: ' + SRL.MsToTime(GetTimeRunning, Time_Short)); WriteLn(' Mining XP Gained: ' + FormatRoundedNumber(GainedXP)); WriteLn(' Bone Shards: ' + IntToStr(Totalshards)); WriteLn(' Prayer XP: ' + FormatRoundedNumber(PrayerXP) + ' / Sunfire ' + FormatRoundedNumber(SunfirePrayerXP)); if TotalCalcifiedMoths > 0 then begin WriteLn(' Calcified Moths: ' + IntToStr(TotalCalcifiedMoths)); WriteLn(' Total Moth Profit: ' + FormatRoundedNumber(TotalCalcifiedMoths * CalcifiedMothValue)); end; WriteLn('----------------------------------------'); WriteLn(' Mining XP/Hour: ' + FormatRoundedNumber(Round((GainedXP / (GetTimeRunning / 3600000))))); WriteLn(' Shards/Hour: ' + FormatRoundedNumber(Round((Totalshards) / (GetTimeRunning / 3600000)))); WriteLn(' Prayer XP/Hour: ' + FormatRoundedNumber(Round((PrayerXP) / (GetTimeRunning / 3600000))) + ' / Sunfire ' + FormatRoundedNumber(Round((SunfirePrayerXP) / (GetTimeRunning / 3600000)))); WriteLn(' ', Antiban.BreakScheduleText()); WriteLn(' ', Antiban.SleepScheduleText()); WriteLn('========================================'); WriteLn(' BASH Scripts Calcified Mining '); WriteLn(' Version: ' + {$MACRO SCRIPT_REVISION}); WriteLn('========================================'); end; procedure CalcifiedMiner.Init(MaxActions: UInt32; MaxTime: UInt64); override; begin inherited; if AIChatbot.Enabled then begin WriteLn('[AI Chatbot] Enabled - initializing'); AIChatbot.Init(); end else WriteLn('[AI Chatbot] Disabled'); RSW.AdaptiveWalk := True; RSW.Setup('CamTorumMap'); CalcifiedDeposit := ('Calcified deposit'); HammerItem := ('Hammer'); HammerBank := TRSBankItem.Setup(HammerItem, 1, FALSE); CalcifiedMoths := ('Calcified moth'); ItemsToDeposit := [ 'Blessed bone shards', 'Calcified moth', 'Uncut sapphire', 'Uncut emerald', 'Uncut ruby', 'Uncut diamond', 'Clue geode (beginner)', 'Clue geode (easy)', 'Clue geode (medium)', 'Clue geode (hard)', 'Clue geode (elite)', 'Loop half of key' ]; BankTripItems := [ 'Calcified moth', 'Uncut sapphire', 'Uncut emerald', 'Uncut ruby', 'Uncut diamond', 'Clue geode (beginner)', 'Clue geode (easy)', 'Clue geode (medium)', 'Clue geode (hard)', 'Clue geode (elite)', 'Loop half of key' ]; StartXP := XPBar.Read(); SetupObjects(); CalcifiedMothValue := ItemData.GetAverage(29090); StartingShards := Inventory.CountItemStack('Blessed bone shards'); if PINGONTERMINATED then AddOnTerminate(@Self.SendTerminationNotification); HANDLEBANKING(); end; procedure CalcifiedMiner.Run(MaxActions: UInt32; MaxTime: UInt64); begin Self.Init(MaxActions, MaxTime); repeat Self.doAction(); if WL.Activity.IsFinished() then begin WriteLn('No activity detected in 5 minutes! Shutting down.'); Break; end; Self.DoAntiban; until Self.ShouldStop(); end; var Script: CalcifiedMiner; {$IFDEF SCRIPT_GUI} type TConfig = record(TBASHPremiumGUI) PowerMineCheckbox, IgnoreWaterfallsCheckBox: TLabeledCheckBox; DiscordUIDInfo: TLabel; DiscordUIDInput: TLabeledEdit; PingOnTerminatedCheckBox: TLabeledCheckBox; SavedIgnoreWaterfalls, SavedPowerMining: Boolean; end; TScriptGUI = TConfig; procedure TConfig.InitGUI(); override; begin Self.BrandTitle := 'Calcified Mining'; Self.WindowTitle := 'BASH Scripts Calcified Mining'; Self.WebhookTestPrefix := 'Test message from BASH Scripts Calcified Mining'; Self.HasFarm := False; Self.HasAIChat := True; Self.HasWorldHopping := False; Self.HasMaxActions := True; Self.HasStopAtLevel := False; Self.LegacyAntibanSection := ' Calcified Mining Antiban'; end; procedure TConfig.SetupAIChat(); override; begin inherited; AIChatbot.SetScriptDefaults('calcified mining'); end; procedure TConfig.MigrateLegacyWebhook(); var url, en: String; begin url := ReadINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'WebhookURL', BASH_GUI_SETTINGS_FILE); if url = '' then begin url := ReadINI(Self.Username + ' Webhook Settings', 'WebhookURL', BASH_GUI_SETTINGS_FILE); if url = '' then url := ReadINI('Webhook Settings', 'WebhookURL', BASH_GUI_SETTINGS_FILE); if url <> '' then WriteINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'WebhookURL', url, BASH_GUI_SETTINGS_FILE); end; en := ReadINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'EnableWebhooks', BASH_GUI_SETTINGS_FILE); if en = '' then begin en := ReadINI(Self.Username + ' Webhook Settings', 'EnableWebhooks', BASH_GUI_SETTINGS_FILE); if en = '' then en := ReadINI('Webhook Settings', 'EnableWebhooks', BASH_GUI_SETTINGS_FILE); if en <> '' then WriteINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'EnableWebhooks', en, BASH_GUI_SETTINGS_FILE); end; end; procedure TConfig.LoadActionSettings(); override; begin Self.MigrateLegacyWebhook(); Self.SavedPowerMining := StrToBoolDef(ReadINI('Calcified Mining Settings', 'PowerMining', BASH_GUI_SETTINGS_FILE), POWERMINING); Self.SavedIgnoreWaterfalls := StrToBoolDef(ReadINI('Calcified Mining Settings', 'IgnoreWaterfalls', BASH_GUI_SETTINGS_FILE), IGNOREWATERFALLS); end; procedure TConfig.BuildActionSection(); override; begin Self.AddHeader(Self.ActionSection, 'Action', 'Mine calcified rocks and process deposits in Cam Torum.'); Self.AddCheck(Self.ActionSection, Self.IgnoreWaterfallsCheckBox, 'cb_cm_ignore_waterfalls', 'Ignore Waterfalls', 24, 110, Self.SavedIgnoreWaterfalls); Self.IgnoreWaterfallsCheckBox.SetTooltip('When enabled, waterfalls will be ignored.'); Self.AddCheck(Self.ActionSection, Self.PowerMineCheckbox, 'cb_cm_power_mine', 'Power Mining', 24, 150, Self.SavedPowerMining); Self.PowerMineCheckbox.SetTooltip('Disables banking and breaking of deposits.'); end; procedure TConfig.OpenDiscordUIDHelp(Sender: TObject); begin if Sender = nil then; OpenWebPage('https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID'); end; procedure TConfig.WebhooksCheckboxChanged({$H-}sender: TObject); {$H+} override; var shown: Boolean; begin inherited; shown := Self.EnableWebhooksCheckBox.IsChecked(); if Assigned(Self.DiscordUIDInput) then Self.DiscordUIDInput.SetVisible(shown); if Assigned(Self.DiscordUIDInfo) then Self.DiscordUIDInfo.SetVisible(shown); if Assigned(Self.PingOnTerminatedCheckBox) then Self.PingOnTerminatedCheckBox.SetVisible(shown); end; procedure TConfig.BuildAccountsExtras(); override; var savedUID: String; savedPing: Boolean; begin savedUID := ReadINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'DiscordUID', BASH_GUI_SETTINGS_FILE); if savedUID = '' then savedUID := ReadINI(Self.Username + ' Webhook Settings', 'DiscordUID', BASH_GUI_SETTINGS_FILE); if savedUID = '' then savedUID := ReadINI('Webhook Settings', 'DiscordUID', BASH_GUI_SETTINGS_FILE); savedPing := StrToBoolDef(ReadINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'PingOnTerminated', BASH_GUI_SETTINGS_FILE), True); if ReadINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'PingOnTerminated', BASH_GUI_SETTINGS_FILE) = '' then savedPing := StrToBoolDef(ReadINI(Self.Username + ' Webhook Settings', 'PingOnTerminated', BASH_GUI_SETTINGS_FILE), savedPing); if ReadINI(Self.Username + ' Webhook Settings', 'PingOnTerminated', BASH_GUI_SETTINGS_FILE) = '' then savedPing := StrToBoolDef(ReadINI('Webhook Settings', 'PingOnTerminated', BASH_GUI_SETTINGS_FILE), savedPing); Self.AddCheck(Self.AccountsSection, Self.PingOnTerminatedCheckBox, 'cb_free_ping_term', 'Ping on script termination', BASH_GUI_COL2, 350, savedPing); Self.AddEdit(Self.AccountsSection, Self.DiscordUIDInput, 'le_free_discord_uid', 'Discord UID (optional)', savedUID, 24, 490, 260); Self.DiscordUIDInfo := Self.MakeLabel(Self.AccountsSection, 'How to find your Discord User ID', BASH_GUI_COL2, 508, 10, BASH_GUI_LINK, False); Self.DiscordUIDInfo.SetOnClick(@Self.OpenDiscordUIDHelp); Self.DiscordUIDInfo.SetCursor(crHandPoint); Self.EnableWebhooksCheckBox.CheckBox.SetOnChange(@Self.WebhooksCheckboxChanged); Self.WebhooksCheckboxChanged(nil); end; procedure TConfig.ApplyActionSettings(); override; begin POWERMINING := Self.PowerMineCheckbox.IsChecked(); IGNOREWATERFALLS := Self.IgnoreWaterfallsCheckBox.IsChecked(); WriteINI('Calcified Mining Settings', 'PowerMining', BoolToStr(POWERMINING, 'true', 'false'), BASH_GUI_SETTINGS_FILE); WriteINI('Calcified Mining Settings', 'IgnoreWaterfalls', BoolToStr(IGNOREWATERFALLS, 'true', 'false'), BASH_GUI_SETTINGS_FILE); if Assigned(Self.PingOnTerminatedCheckBox) then PINGONTERMINATED := Self.PingOnTerminatedCheckBox.IsChecked(); if Assigned(Self.DiscordUIDInput) then DiscordUID := Self.DiscordUIDInput.GetText(); WriteINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'DiscordUID', DiscordUID, BASH_GUI_SETTINGS_FILE); WriteINI(Self.Username + BASH_GUI_WEBHOOK_SECTION, 'PingOnTerminated', BoolToStr(PINGONTERMINATED, 'true', 'false'), BASH_GUI_SETTINGS_FILE); end; procedure TConfig.StartScript(Sender: TObject); override; begin if Sender = nil then; try Self._WarmBuildCache(); except end; inherited; end; {$IFDEF SCRIPT_GUI} {$I BashLib/optional/handlers/bashgui_host_scriptgui.simba} {$ENDIF} var Config: TConfig; {$ENDIF} begin {$IFDEF SCRIPT_GUI} Sync(@Config.Run); {$ENDIF} Script.Run(WLSettings.MaxActions, WLSettings.MaxTime); end.