diff --git a/.gitignore b/.gitignore index 8028858e..5c309884 100644 --- a/.gitignore +++ b/.gitignore @@ -167,3 +167,4 @@ src/utilities/record_mouse/* !src/utilities/record_mouse/record_mouse.py src/runelite_settings/executable_paths.json src/settings.pickle +src/runelite_settings/profile_manager_paths.json diff --git a/src/model/osrs/combat/combat.py b/src/model/osrs/combat/combat.py index b31f25c8..db5039d0 100644 --- a/src/model/osrs/combat/combat.py +++ b/src/model/osrs/combat/combat.py @@ -50,13 +50,21 @@ def save_options(self, options: dict): self.options_set = True def launch_game(self): + """ + This is a somewhat impractical way of modifying a properties file prior to launching RuneLite. + In this example, we make a copy of the default settings file, modify it according to the user's + option selections, and then launch RuneLite with the modified settings file. Since RuneLite 1.9.11, + it's likely more efficient to use the Profile Manager to modify settings on the fly. + """ if launcher.is_program_running("RuneLite"): self.log_msg("RuneLite is already running. Please close it and try again.") return + # Make a copy of the default settings and save locally - src = launcher.runelite_settings_folder.joinpath("osrs_settings.properties") + src = launcher.RL_SETTINGS_FOLDER_PATH.joinpath("osrs_settings.properties") dst = Path(__file__).parent.joinpath("custom_settings.properties") shutil.copy(str(src), str(dst)) + # Modify the highlight list loot_items = self.capitalize_loot_list(self.loot_items, to_list=False) with dst.open() as f: @@ -66,8 +74,15 @@ def launch_game(self): lines[i] = f"grounditems.highlightedItems={loot_items}\n" with dst.open("w") as f: f.writelines(lines) + # Launch the game - launcher.launch_runelite_with_settings(self, dst) + launcher.launch_runelite( + properties_path=dst, + game_title=self.game_title, + use_profile_manager=True, # Important for games that use the new Profile Manager RL feature + profile_name="OSBCCombat", # Supply a profile name if you'd like to save it to the Profile Manager + callback=self.log_msg, + ) def main_loop(self): self.log_msg("WARNING: This script is for testing and may not be safe for personal use. Please modify it to suit your needs.") diff --git a/src/model/osrs/combat/custom_settings.properties b/src/model/osrs/combat/custom_settings.properties deleted file mode 100644 index ef4eda7f..00000000 --- a/src/model/osrs/combat/custom_settings.properties +++ /dev/null @@ -1,1319 +0,0 @@ -#RuneLite configuration -#Sat Nov 05 16:13:28 EDT 2022 -agility.agilityArenaNotifier=false -agility.agilityArenaTimer=false -agility.highlightMarks=false -agility.highlightPortals=false -agility.highlightSepulchreNpcs=false -agility.highlightSepulchreObstacles=false -agility.highlightSepulchreSkilling=false -agility.highlightShortcuts=false -agility.highlightStick=false -agility.lapsPerHour=true -agility.lapsToLevel=true -agility.lapTimeout=1 -agility.markHighlight=-65536 -agility.overlayColor=-16711936 -agility.portalsHighlight=-65281 -agility.sepulchreHighlightColor=-16711936 -agility.showClickboxes=false -agility.showLapCount=true -agility.stickHighlightColor=-65536 -agility.trapHighlight=-65536 -agility.trapOverlay=false -animationSmoothing.smoothNpcAnimations=true -animationSmoothing.smoothObjectAnimations=true -animationSmoothing.smoothPlayerAnimations=true -antiDrag.disableOnCtrl=true -antiDrag.dragDelay=20 -antiDrag.onShiftOnly=false -attackIndicator.alwaysShowStyle=true -attackIndicator.hideAutoRetaliate=false -attackIndicator.removeWarnedStyles=false -attackIndicator.warnForAttack=false -attackIndicator.warnForDefensive=false -attackIndicator.warnForMagic=false -attackIndicator.warnForRanged=false -attackIndicator.warnForStrength=false -bank.bankPinKeyboard=false -bank.rightClickBankEquip=false -bank.rightClickBankInventory=false -bank.rightClickBankLoot=false -bank.rightClickPlaceholders=false -bank.searchKeybind=70\:128 -bank.seedVaultValue=true -bank.showExact=false -bank.showGE=true -bank.showHA=false -bank.showTP=true -bankedexperience.cascadeBankedXp=true -bankedexperience.grabFromEimBank=false -bankedexperience.grabFromGimBank=false -bankedexperience.grabFromInventory=false -bankedexperience.grabFromLootingBag=false -bankedexperience.includeRngActivities=false -bankedexperience.limitToCurrentLevel=true -bankedexperience.showSecondaries=false -banktags.position=0 -banktags.preventTagTabDrags=false -banktags.rememberTab=true -banktags.removeTabSeparators=false -banktags.useTabs=true -bankxpvalue.itemXpTooltips=true -bankxpvalue.keepFixed=false -bankxpvalue.levelUps=true -bankxpvalue.tutorial=false -barbarianAssault.showHealerBars=true -barbarianAssault.showTimer=true -barbarianAssault.waveTimes=true -barrows.brotherLocColor=-16711681 -barrows.deadBrotherLocColor=-65536 -barrows.showBrotherLoc=true -barrows.showChestValue=true -barrows.showPrayerDrainTimer=true -barrows.showPuzzleAnswer=true -blastfurnace.showBarDispenser=false -blastfurnace.showCofferTime=true -blastfurnace.showConveyorBelt=false -blastmine.hexTimerColor=-2542080 -blastmine.hexWarningColor=-2542080 -blastmine.showOreOverlay=true -blastmine.showRockIconOverlay=true -blastmine.showTimerOverlay=true -blastmine.showWarningOverlay=true -boosts.boostThreshold=0 -boosts.compactDisplay=false -boosts.displayBoosts=BOTH -boosts.displayIndicators=false -boosts.displayNextBuffChange=BOOSTED -boosts.displayNextDebuffChange=NEVER -boosts.displayPanel=false -boosts.notifyOnBoost=true -boosts.relativeBoost=false -cannon.highlightDoubleHitColor=-65536 -cannon.lowWarningThreshold=0 -cannon.showCannonSpots=true -cannon.showDoubleHitSpot=false -cannon.showEmptyCannonNotification=true -cannon.showInfobox=false -chatcommands.bh=true -chatcommands.bhRogue=true -chatcommands.clearEntireChatBox=8\:128 -chatcommands.clearSingleWord=87\:128 -chatcommands.clue=true -chatcommands.duels=true -chatcommands.gc=true -chatcommands.killcount=true -chatcommands.lms=true -chatcommands.lp=true -chatcommands.lvl=true -chatcommands.pb=true -chatcommands.pets=true -chatcommands.price=true -chatcommands.qp=true -chatcommands.sw=true -chatfilter.collapseGameChat=false -chatfilter.collapsePlayerChat=false -chatfilter.filterBroad=false -chatfilter.filterClan=false -chatfilter.filterClanChat=false -chatfilter.filterFriends=false -chatfilter.filterGameChat=false -chatfilter.filterLogin=false -chatfilter.filterNews=false -chatfilter.filterType=CENSOR_WORDS -chatfilter.maxRepeatedPublicChats=0 -chatfilter.stripAccents=false -chathistory.clearHistory=true -chathistory.copyToClipboard=true -chathistory.pmTargetCycling=true -chathistory.retainChatHistory=true -chatnotification.highlightOwnName=true -chatnotification.notifyOnBroadcast=false -chatnotification.notifyOnDuel=false -chatnotification.notifyOnHighlight=false -chatnotification.notifyOnOwnName=false -chatnotification.notifyOnPM=false -chatnotification.notifyOnTrade=false -clanchat.clanChatIcons=true -clanchat.clanChatShowJoinLeave=false -clanchat.clanChatShowOnlineMemberCount=false -clanchat.clanCounter=false -clanchat.clanTabChat=false -clanchat.confirmKicks=false -clanchat.guestClanChatShowJoinLeave=false -clanchat.guestClanChatShowOnlineMemberCount=false -clanchat.joinLeaveRank=UNRANKED -clanchat.joinLeaveTimeout=20 -clanchat.privateMessageIcons=false -clanchat.publicChatIcons=false -clanchat.recentChats=true -clanchat.showIgnores=true -clanchat.showIgnoresColor=-65536 -clanchat.showJoinLeave=false -cluescroll.displayHintArrows=true -colorpicker.recentColors=-256,-16773121,-5635841,-16711681,-65305,-6382531 -combatlevel.showLevelsUntil=true -combatlevel.showPreciseCombatLevel=true -combatlevel.wildernessAttackLevelRange=true -cooking.fermentTimer=true -cooking.statTimeout=5 -corp.leftClickCore=true -corp.markDarkCore=true -corp.showDamage=true -coxlightcolors.dust=-16711681 -coxlightcolors.noUnique=-1 -coxlightcolors.olmEntrance=-7536885 -coxlightcolors.specificUniqueColor=-65536 -coxlightcolors.specifyAncestralHat=false -coxlightcolors.specifyAncestralRobeBottom=false -coxlightcolors.specifyAncestralRobeTop=false -coxlightcolors.specifyArcanePrayerScroll=false -coxlightcolors.specifyDexPrayerScroll=false -coxlightcolors.specifyDinhsBulwark=false -coxlightcolors.specifyDragonClaws=false -coxlightcolors.specifyDragonHunterCrossbow=false -coxlightcolors.specifyElderMaul=true -coxlightcolors.specifyKodaiInsignia=true -coxlightcolors.specifyTwistedBow=true -coxlightcolors.specifyTwistedBuckler=false -coxlightcolors.twistedKit=-16711936 -coxlightcolors.unique=-961035 -customcursor.cursorStyle=RS3_GOLD -dailytaskindicators.showArrows=false -dailytaskindicators.showBonemeal=false -dailytaskindicators.showDynamite=false -dailytaskindicators.showEssence=false -dailytaskindicators.showFlax=false -dailytaskindicators.showHerbBoxes=true -dailytaskindicators.showRunes=false -dailytaskindicators.showSand=false -dailytaskindicators.showStaves=true -danceparty.disableInPvp=false -danceparty.partyOnLevelup=false -danceparty.workoutMode=false -defaultworld.defaultWorld=0 -defaultworld.lastWorld=436 -defaultworld.useLastWorld=false -devtools.inspectorAlwaysOnTop=false -discord.actionTimeout=5 -discord.elapsedTime=ACTIVITY -discord.showBossActivity=true -discord.showCityActivity=true -discord.showDungeonActivity=true -discord.showMainMenu=true -discord.showMinigameActivity=true -discord.showRaidingActivity=true -discord.showRegionsActivity=true -discord.showSkillActivity=true -dpscounter.autopause=false -dpscounter.autoreset=false -dpscounter.bossDamage=false -dpscounter.showDamage=false -driftnet.annetteTagColor=-65536 -driftnet.countColor=-1 -driftnet.highlightUntaggedFish=true -driftnet.showNetStatus=true -driftnet.tagAnnette=true -driftnet.timeoutDelay=60 -driftnet.untaggedFishColor=-16711681 -entityhider.hideAttackers=false -entityhider.hideClanChatMembers=true -entityhider.hideClanMates=true -entityhider.hideDeadNpcs=false -entityhider.hideFriends=true -entityhider.hideIgnores=false -entityhider.hideLocalPlayer=false -entityhider.hideLocalPlayer2D=true -entityhider.hideNPCs=false -entityhider.hideNPCs2D=false -entityhider.hidePets=true -entityhider.hidePlayers=true -entityhider.hidePlayers2D=true -entityhider.hideProjectiles=true -entityhider.hideThralls=false -fairyrings.autoOpen=true -feed.includeBlogPosts=true -feed.includeOsrsNews=true -feed.includeTweets=true -fightcavewaves.waveDisplay=BOTH -fishing.aerialOverlayColor=-16711936 -fishing.flyingFishNotification=false -fishing.harpoonfishOverlayColor=-16711936 -fishing.minnowsOverlayColor=-65536 -fishing.onlyCurrent=false -fishing.overlayColor=-16711681 -fishing.showFishingStats=true -fishing.showIcons=false -fishing.showMinnowOverlay=false -fishing.showNames=false -fishing.showTiles=false -fishing.statTimeout=1 -fishing.trawlerContribution=false -fishing.trawlerTimer=false -fpscontrol.drawFps=true -fpscontrol.limitFps=false -fpscontrol.limitFpsUnfocused=false -fpscontrol.maxFps=50 -fpscontrol.maxFpsUnfocused=50 -friendlist.showWorldOnLogin=false -friendNotes.showIcons=true -Gauntlet.countBossAttacks=true -Gauntlet.countPlayerAttacks=true -Gauntlet.displayTimerChat=true -Gauntlet.displayTimerWidget=true -Gauntlet.highlightResourcesColor=true -Gauntlet.highlightResourcesIcons=true -Gauntlet.iconSize=20 -Gauntlet.overlayBoss=true -Gauntlet.overlayBossPrayer=false -Gauntlet.overlayTornadoes=true -Gauntlet.uniqueAttackVisual=false -Gauntlet.uniquePrayerAudio=true -Gauntlet.uniquePrayerVisual=true -gpu.anisotropicFilteringLevel=0 -gpu.antiAliasingMode=DISABLED -gpu.brightTextures=false -gpu.colorBlindMode=NONE -gpu.drawDistance=25 -gpu.fogDepth=0 -gpu.fpsTarget=60 -gpu.smoothBanding=false -gpu.uiScalingMode=LINEAR -gpu.unlockFps=false -gpu.useComputeShaders=false -gpu.vsyncMode=ADAPTIVE -grandexchange.enableGELimitReset=true -grandexchange.enableGeLimits=true -grandexchange.enableNotifications=true -grandexchange.geSearchMode=DEFAULT -grandexchange.highlightSearchMatch=true -grandexchange.quickLookup=true -grandexchange.showActivelyTradedPrice=true -grandexchange.showExact=false -grandexchange.showTotal=true -grounditems.collapseEntries=true -grounditems.defaultColor=-1 -grounditems.deprioritizeHiddenItems=true -grounditems.dontHideUntradeables=true -grounditems.doubleTapDelay=250 -grounditems.groundItemTimers=OFF -grounditems.hiddenColor=-8355712 -grounditems.hiddenItems=Flyer -grounditems.hideUnderValue=0 -grounditems.highlightedColor=-5635841 -grounditems.highlightedItems=Bones -grounditems.highlightTiles=false -grounditems.highlightValueCalculation=HIGHEST -grounditems.highValueColor=-27136 -grounditems.highValuePrice=0 -grounditems.hotkey=0\:512 -grounditems.insaneValueColor=-39246 -grounditems.insaneValuePrice=0 -grounditems.itemHighlightMode=OVERLAY -grounditems.lootbeamStyle=MODERN -grounditems.lowValueColor=-10046721 -grounditems.lowValuePrice=0 -grounditems.mediumValueColor=-6684775 -grounditems.mediumValuePrice=0 -grounditems.menuHighlightMode=BOTH -grounditems.notifyHighlightedDrops=false -grounditems.notifyTier=OFF -grounditems.onlyShowLoot=false -grounditems.priceDisplayMode=OFF -grounditems.recolorMenuHiddenItems=false -grounditems.showHighlightedOnly=true -grounditems.showLootbeamForHighlighted=false -grounditems.showLootbeamTier=OFF -grounditems.showMenuItemQuantities=true -grounditems.textOutline=true -groundMarker.borderWidth=4.0 -groundMarker.drawOnMinimap=false -groundMarker.fillOpacity=0 -groundMarker.markerColor=-16711936 -groundMarker.rememberTileColors=true -groundMarker.showClear=false -groundMarker.showImportExport=true -herbiboar.colorGameObject=-16711681 -herbiboar.colorStart=-16711681 -herbiboar.colorTrail=-1 -herbiboar.colorTunnel=-16711936 -herbiboar.showClickboxes=false -herbiboar.showObject=true -herbiboar.showStart=true -herbiboar.showTrail=true -herbiboar.showTunnel=true -hiscore.autocomplete=true -hiscore.bountylookup=false -hiscore.menuOption=true -hiscore.playerOption=true -hiscore.virtualLevels=true -hunterplugin.hexColorEmptyTrap=-65536 -hunterplugin.hexColorFullTrap=-16711936 -hunterplugin.hexColorOpenTrap=-256 -hunterplugin.hexColorTransTrap=-14336 -hunterplugin.maniacalMonkeyNotify=false -idlenotifier.animationidle=true -idlenotifier.highEnergy=0 -idlenotifier.hitpoints=0 -idlenotifier.interactionidle=true -idlenotifier.logoutidle=true -idlenotifier.lowEnergy=100 -idlenotifier.movementidle=false -idlenotifier.oxygen=0 -idlenotifier.prayer=0 -idlenotifier.spec=0 -idlenotifier.timeout=5000 -implings.babyColor=-5140557 -implings.crystalColor=-10634030 -implings.dragonColor=-2992821 -implings.earthColor=-12691904 -implings.eclecticColor=-7234747 -implings.essenceColor=-14657190 -implings.gourmetColor=-5667998 -implings.luckyColor=-10090651 -implings.magpieColor=-7434733 -implings.natureColor=-10712481 -implings.ninjaColor=-12106165 -implings.showbaby=NONE -implings.showCrystal=NONE -implings.showdragon=HIGHLIGHT -implings.showearth=NONE -implings.showeclectic=NONE -implings.showessence=NONE -implings.showgourmet=NONE -implings.showlucky=HIGHLIGHT -implings.showmagpie=NONE -implings.showname=false -implings.shownature=NONE -implings.showninja=NONE -implings.showspawn=false -implings.showyoung=NONE -implings.spawnColor=-1 -implings.youngColor=-5266296 -interacthighlight.borderWidth=4 -interacthighlight.npcAttackHighlightColor=-1862336512 -interacthighlight.npcAttackHoverHighlightColor=-1862271232 -interacthighlight.npcHoverHighlightColor=-1862271232 -interacthighlight.npcInteractHighlightColor=-1862336512 -interacthighlight.npcShowHover=true -interacthighlight.npcShowInteract=true -interacthighlight.objectHoverHighlightColor=-1878982657 -interacthighlight.objectInteractHighlightColor=-1862336512 -interacthighlight.objectShowHover=true -interacthighlight.objectShowInteract=true -interacthighlight.outlineFeather=4 -interfaceStyles.alwaysStack=false -interfaceStyles.disableAnims=false -interfaceStyles.drawDistance=25 -interfaceStyles.gameframe=AROUND_2005 -interfaceStyles.hdHealthBars=false -interfaceStyles.hdMenu=false -interfaceStyles.hitmarkers=OLDSCHOOL -interfaceStyles.menuAlpha=255 -interfaceStyles.newCursors=false -interfaceStyles.oldschoolCritFont=DEFAULT -interfaceStyles.rsCrossSprites=false -interfaceStyles.tenXHitpoints=false -inventorygrid.dragDelay=0 -inventorygrid.gridColor=771751935 -inventorygrid.highlightColor=755040000 -inventorygrid.showGrid=true -inventorygrid.showHighlight=true -inventorygrid.showItem=true -inventorysetups.autoEquip=true -inventorysetups.bankFilter=false -inventorysetups.compactMode=false -inventorysetups.disableBankTabBar=false -inventorysetups.filterBankAddItemstOnlyHotkey=0\:0 -inventorysetups.filterBankEquipmentOnlyHotkey=0\:0 -inventorysetups.filterBankHotkey=0\:0 -inventorysetups.filterBankInventoryOnlyHotkey=0\:0 -inventorysetups.fuzzy=false -inventorysetups.hideHelpButton=false -inventorysetups.highlightColor=-65536 -inventorysetups.highlightDifference=false -inventorysetups.highlightStackDifference=false -inventorysetups.highlightStackDifferenceEnum=None -inventorysetups.highlightUnorderedDifference=false -inventorysetups.highlightVarianceDifference=false -inventorysetups.requireActivePanelFilter=false -inventorysetups.returnToSetupsHotkey=0\:0 -inventorysetups.sortingMode=DEFAULT -inventorysetups.stackCompare=None -inventorytags.fillOpacity=50 -inventorytags.groupColor1=-65536 -inventorytags.groupColor2=-16711936 -inventorytags.groupColor3=-16776961 -inventorytags.groupColor4=-65281 -inventorytags.groupColor5=-256 -inventorytags.groupColor6=-16711681 -inventorytags.migrated=1 -inventorytags.showTagOutline=true -inventorytags.tagFill=false -inventorytags.tagUnderline=false -inventoryViewer.hiddenDefault=false -inventoryViewer.hideIfInventoryActive=false -inventoryViewer.toggleKeybind=0\:0 -itemCharge.amuletOfBounty=-1 -itemCharge.amuletOfChemistry=-1 -itemCharge.bindingNotification=true -itemCharge.braceletOfClayNotification=true -itemCharge.dodgyNecklace=-1 -itemCharge.dodgyNotification=true -itemCharge.expeditiousNotification=true -itemCharge.explorerRing=-1 -itemCharge.lowWarning=2 -itemCharge.lowWarningColor=-256 -itemCharge.recoilNotification=false -itemCharge.ringOfForgingNotification=true -itemCharge.showAbyssalBraceletCharges=true -itemCharge.showAmuletOfBountyCharges=true -itemCharge.showAmuletOfChemistryCharges=true -itemCharge.showBasketCharges=true -itemCharge.showBellowCharges=true -itemCharge.showBindingNecklaceCharges=true -itemCharge.showBloodEssenceCharges=true -itemCharge.showBraceletOfClayCharges=true -itemCharge.showBraceletOfSlaughterCharges=true -itemCharge.showDodgyCount=true -itemCharge.showExpeditiousBraceletCharges=true -itemCharge.showExplorerRingCharges=true -itemCharge.showFungicideCharges=true -itemCharge.showGuthixRestDoses=true -itemCharge.showImpCharges=true -itemCharge.showInfoboxes=false -itemCharge.showPotionDoseCount=false -itemCharge.showRingOfForgingCount=true -itemCharge.showSackCharges=true -itemCharge.showTeleportCharges=true -itemCharge.showWateringCanCharges=true -itemCharge.showWaterskinCharges=true -itemCharge.slaughterNotification=true -itemCharge.veryLowWarning=1 -itemCharge.veryLowWarningColor=-65536 -itemEditor.itemId=-1 -itemEditor.itemOption=false -itemidentification.identificationType=SHORT -itemidentification.showAllotmentSeeds=false -itemidentification.showBars=false -itemidentification.showBerrySeeds=false -itemidentification.showComposts=false -itemidentification.showEnchantedJewellery=false -itemidentification.showFlowerSeeds=false -itemidentification.showFruitTreeSeeds=false -itemidentification.showGems=false -itemidentification.showHerbs=false -itemidentification.showHerbSeeds=true -itemidentification.showHopSeeds=false -itemidentification.showImplingJars=false -itemidentification.showJewellery=false -itemidentification.showLogs=false -itemidentification.showOres=false -itemidentification.showPlanks=false -itemidentification.showPotions=false -itemidentification.showPyreLogs=false -itemidentification.showSacks=false -itemidentification.showSaplings=true -itemidentification.showSpecialSeeds=false -itemidentification.showTablets=false -itemidentification.showTeleportScrolls=false -itemidentification.showTreeSeeds=false -itemidentification.textColor=-1 -itemprices.hideInventory=true -itemprices.showAlchProfit=false -itemprices.showEA=true -itemprices.showGEPrice=true -itemprices.showHAValue=true -itemprices.showWhileAlching=true -itemstat.absolute=true -itemstat.alwaysShowBaseStats=false -itemstat.colorBetterCapped=-1118669 -itemstat.colorBetterSomecapped=-6492621 -itemstat.colorBetterUncapped=-13373901 -itemstat.colorNoChange=-1118482 -itemstat.colorWorse=-1166541 -itemstat.consumableStats=true -itemstat.equipmentStats=true -itemstat.geStats=true -itemstat.relative=true -itemstat.showStatsInBank=true -itemstat.showWeight=true -itemstat.theoretical=false -keyremapping.cameraRemap=true -keyremapping.control=0\:128 -keyremapping.down=83\:0 -keyremapping.esc=27\:0 -keyremapping.f1=49\:0 -keyremapping.f10=48\:0 -keyremapping.f11=45\:0 -keyremapping.f12=61\:0 -keyremapping.f2=50\:0 -keyremapping.f3=51\:0 -keyremapping.f4=52\:0 -keyremapping.f5=53\:0 -keyremapping.f6=54\:0 -keyremapping.f7=55\:0 -keyremapping.f8=56\:0 -keyremapping.f9=57\:0 -keyremapping.fkeyRemap=false -keyremapping.left=65\:0 -keyremapping.right=68\:0 -keyremapping.space=32\:0 -keyremapping.up=87\:0 -kingdomofmiscellania.approvalThreshold=100 -kingdomofmiscellania.cofferThreshold=7500000 -kingdomofmiscellania.sendNotifications=false -kourendLibrary.alwaysShowVarlamoreEnvoy=false -kourendLibrary.hideButton=true -kourendLibrary.hideDarkManuscript=false -kourendLibrary.hideDuplicateBook=true -kourendLibrary.showTargetHintArrow=true -kourendLibrary.showTutorialOverlay=true -loginscreen.loginScreen=OFF -loginscreen.pasteenabled=false -loginscreen.showLoginFire=false -loginscreen.syncusername=true -logouttimer.idleTimeout=5 -loottracker.npcKillChatMessage=false -loottracker.priceType=GRAND_EXCHANGE -loottracker.pvpKillChatMessage=false -loottracker.showPriceType=false -loottracker.showRaidsLootValue=true -loottracker.syncPanel=true -lowmemory.hideLowerPlanes=false -lowmemory.lowDetail=true -MahoganyHomes.displayHintArrows=true -MahoganyHomes.highlightHotspots=true -MahoganyHomes.highlightStairs=true -MahoganyHomes.showRequiredMaterials=true -MahoganyHomes.showSessionStats=true -MahoganyHomes.textOverlay=true -MahoganyHomes.worldMapIcon=true -menuentryswapper.bankDepositShiftClick=DEPOSIT_ALL -menuentryswapper.bankWithdrawShiftClick=WITHDRAW_ALL -menuentryswapper.groundItemShiftClickWalkHere=false -menuentryswapper.leftClickCustomization=true -menuentryswapper.npcLeftClickCustomization=true -menuentryswapper.npcShiftClickWalkHere=true -menuentryswapper.objectLeftClickCustomization=true -menuentryswapper.objectShiftClickWalkHere=true -menuentryswapper.removeDeadNpcMenus=false -menuentryswapper.shiftClickCustomization=true -menuentryswapper.shopBuy=BUY_50 -menuentryswapper.shopSell=SELL_50 -menuentryswapper.swapAbyssTeleport=true -menuentryswapper.swapAdmire=true -menuentryswapper.swapArdougneCloak=WEAR -menuentryswapper.swapAssignment=true -menuentryswapper.swapBait=false -menuentryswapper.swapBanker=true -menuentryswapper.swapBirdhouseEmpty=true -menuentryswapper.swapBones=false -menuentryswapper.swapBoxTrap=true -menuentryswapper.swapChase=true -menuentryswapper.swapCrush=false -menuentryswapper.swapDepositItems=false -menuentryswapper.swapDesertAmulet=WEAR -menuentryswapper.swapEssenceMineTeleport=false -menuentryswapper.swapExchange=true -menuentryswapper.swapFairyRing=LAST_DESTINATION -menuentryswapper.swapFill=true -menuentryswapper.swapGEAbort=false -menuentryswapper.swapGEItemCollect=DEFAULT -menuentryswapper.swapHardmode=true -menuentryswapper.swapHarpoon=false -menuentryswapper.swapHelp=true -menuentryswapper.swapHerbs=false -menuentryswapper.swapHomePortal=HOME -menuentryswapper.swapJewelleryBox=false -menuentryswapper.swapKaramjaGloves=WEAR -menuentryswapper.swapMorytaniaLegs=WEAR -menuentryswapper.swapPay=true -menuentryswapper.swapPick=false -menuentryswapper.swapPickpocket=true -menuentryswapper.swapPortalNexus=false -menuentryswapper.swapPreviousTeleport=false -menuentryswapper.swapPrivate=false -menuentryswapper.swapQuick=true -menuentryswapper.swapRadasBlessing=EQUIP -menuentryswapper.swapStairsLeftClick=CLIMB -menuentryswapper.swapStairsShiftClick=CLIMB -menuentryswapper.swapTan=false -menuentryswapper.swapTeleportItem=false -menuentryswapper.swapTeleToPoh=false -menuentryswapper.swapTemporossLeave=false -menuentryswapper.swapTrade=true -menuentryswapper.swapTravel=true -menuentryswapper.swapUnchargedCells=TAKE -metronome.tickCount=1 -metronome.tickVolume=96 -metronome.tockVolume=0 -minimap.clan=-5635906 -minimap.friend=-16711936 -minimap.hideMinimap=false -minimap.item=-65536 -minimap.npc=-6382531 -minimap.player=-1 -minimap.team=-15503625 -minimap.zoom=true -mining.showMiningStats=true -mining.statTimeout=5 -morghttpclient.MaxObjectDistance=1200 -motherlode.showBrokenStruts=true -motherlode.showDepositsLeft=true -motherlode.showGemsFound=true -motherlode.showLootIcons=false -motherlode.showMiningState=true -motherlode.showMiningStats=true -motherlode.showOresFound=true -motherlode.showRocks=true -motherlode.showSack=true -motherlode.showVeins=true -motherlode.statTimeout=5 -mousehighlight.chatboxTooltip=true -mousehighlight.disableSpellbooktooltip=false -mousehighlight.uiTooltip=true -mta.alchemy=true -mta.enchantment=true -mta.graveyard=true -mta.telekinetic=true -music.areaSoundEffectVolume=0 -music.granularSliders=true -music.musicVolume=0 -music.muteAmbientSounds=false -music.muteOtherAreaEnvironmentSounds=false -music.muteOtherAreaNPCSounds=false -music.muteOtherAreaSounds=false -music.muteOwnAreaSounds=false -music.mutePrayerSounds=false -music.soundEffectVolume=0 -nightmareZone.absorptioncolorbelowthreshold=-65536 -nightmareZone.absorptioncoloroverthreshold=-256 -nightmareZone.absorptionnotification=true -nightmareZone.absorptionthreshold=50 -nightmareZone.moveoverlay=true -nightmareZone.overloadearlywarningseconds=10 -nightmareZone.overloadnotification=true -nightmareZone.powersurgenotification=false -nightmareZone.recurrentdamagenotification=false -nightmareZone.ultimateforcenotification=false -nightmareZone.zappernotification=false -npcindicators.borderWidth=3.0 -npcindicators.drawMinimapNames=false -npcindicators.drawNames=false -npcindicators.fillColor=335609855 -npcindicators.highlightHull=true -npcindicators.highlightMenuNames=false -npcindicators.highlightOutline=false -npcindicators.highlightSouthWestTile=false -npcindicators.highlightSouthWestTrueTile=false -npcindicators.highlightTile=false -npcindicators.highlightTrueTile=false -npcindicators.ignoreDeadNpcs=true -npcindicators.ignorePets=true -npcindicators.npcColor=-16711681 -npcindicators.npcToHighlight= -npcindicators.outlineFeather=4 -npcindicators.showRespawnTimer=false -npcUnaggroArea.hideIfOutOfCombat=false -npcUnaggroArea.notifyExpire=false -npcUnaggroArea.npcAggroAreaColor=1694498560 -npcUnaggroArea.npcUnaggroAlwaysActive=false -npcUnaggroArea.npcUnaggroAreaColor=-256 -npcUnaggroArea.npcUnaggroShowAreaLines=false -npcUnaggroArea.npcUnaggroShowTimer=true -npcUnaggroArea.showOnSlayerTask=false -objectindicators.borderWidth=7.0 -objectindicators.highlightClickbox=false -objectindicators.highlightHull=true -objectindicators.highlightOutline=false -objectindicators.highlightTile=false -objectindicators.markerColor=-65305 -objectindicators.outlineFeather=0 -objectindicators.rememberObjectColors=true -openosrs.askMode=true -openosrs.bootstrapMode=STABLE -openosrs.disableHw=false -openosrs.enableOpacity=false -openosrs.externalRepos= -openosrs.localSync=true -openosrs.opacityPercentage=100 -openosrs.warning=true -opponentinfo.hitpointsDisplayStyle=HITPOINTS -opponentinfo.lookupOnInteraction=false -opponentinfo.showOpponentsInMenu=false -party.pingHotkey=0\:0 -party.pings=true -party.recolorNames=true -party.sounds=true -party.statusOverlayHealth=false -party.statusOverlayPrayer=false -party.statusOverlayRenderSelf=true -party.statusOverlaySpec=false -party.statusOverlayStamina=false -party.statusOverlayVeng=true -playerindicators.clanChatMemberColor=-14413909 -playerindicators.clanchatMenuIcons=true -playerindicators.clanMemberColor=-5635841 -playerindicators.clanMenuIcons=true -playerindicators.colorPlayerMenu=true -playerindicators.drawClanChatMemberNames=true -playerindicators.drawClanMemberNames=true -playerindicators.drawFriendNames=true -playerindicators.drawMinimapNames=false -playerindicators.drawNonClanMemberNames=false -playerindicators.drawOwnName=false -playerindicators.drawPartyMembers=true -playerindicators.drawPlayerTiles=false -playerindicators.drawTeamMemberNames=true -playerindicators.friendNameColor=-16725933 -playerindicators.nonClanMemberColor=-65536 -playerindicators.ownNameColor=-16729900 -playerindicators.partyMemberNameColor=-1410213 -playerindicators.playerNamePosition=ABOVE_HEAD -playerindicators.teamMemberColor=-15503625 -poh.showAltar=true -poh.showBurner=true -poh.showDigsitePendant=true -poh.showExitPortal=true -poh.showGlory=true -poh.showJewelleryBox=true -poh.showMagicTravel=true -poh.showMythicalCape=true -poh.showPools=true -poh.showPortalNexus=true -poh.showPortals=true -poh.showRepairStand=true -poh.showSpellbook=true -poh.showXericsTalisman=true -poison.changeHealthIcon=true -poison.showInfoboxes=false -prayer.prayerBarHideIfNonCombat=false -prayer.prayerBarHideIfNotPraying=true -prayer.prayerFlickAlwaysOn=false -prayer.prayerFlickLocation=NONE -prayer.prayerIndicator=false -prayer.prayerIndicatorOverheads=false -prayer.replaceOrbText=false -prayer.showPrayerBar=false -prayer.showPrayerDoseIndicator=true -prayer.showPrayerTooltip=true -probability_calculator.decimalPlaces=2 -puzzlesolver.displayRemainingMoves=true -puzzlesolver.displaySolution=true -puzzlesolver.drawDots=false -pyramidplunder.hideTimer=true -pyramidplunder.highlightContainersColor=-256 -pyramidplunder.highlightDoors=true -pyramidplunder.highlightDoorsColor=-16711936 -pyramidplunder.highlightedChestFloor=9 -pyramidplunder.highlightedSarcophagusFloor=9 -pyramidplunder.highlightSpeartrapColor=-14336 -pyramidplunder.highlightSpeartraps=true -pyramidplunder.highlightUrnsFloor=9 -pyramidplunder.showExactTimer=true -pyramidplunder.timerLowWarning=30 -raids.ccDisplay=false -raids.enableLayoutWhitelist=false -raids.enableRotationWhitelist=false -raids.layoutMessage=false -raids.pointsMessage=true -raids.raidsTimer=true -raids.scoutOverlay=true -raids.scoutOverlayAtBank=true -raids.scoutOverlayInRaid=false -raids.screenshotHotkey=0\:0 -raids.uploadScreenshot=CLIPBOARD -randomevents.notifyAll=false -randomevents.notifyBeekeeper=false -randomevents.notifyBob=false -randomevents.notifyDemon=false -randomevents.notifyDunce=false -randomevents.notifyForester=false -randomevents.notifyFrog=false -randomevents.notifyGenie=false -randomevents.notifyGravedigger=false -randomevents.notifyJekyll=false -randomevents.notifyMoM=false -randomevents.notifyQuiz=false -randomevents.notifySandwich=false -randomevents.removeMenuOptions=true -regenmeter.notifyBeforeHpRegenDuration=0 -regenmeter.showHitpoints=true -regenmeter.showSpecial=true -regenmeter.showWhenNoChange=false -regionlocker.blacklistedBorderColor=-926416813 -regionlocker.blockWalk=false -regionlocker.onlyShowBlacklist=false -regionlocker.regionBorderColor=-939472813 -regionlocker.regionBorderWidth=1 -regionlocker.renderRegionBorders=false -regionlocker.unlockRealms=true -regionlocker.unlockUnderground=true -reorderprayers.prayerOrder=THICK_SKIN,BURST_OF_STRENGTH,CLARITY_OF_THOUGHT,SHARP_EYE,MYSTIC_WILL,ROCK_SKIN,SUPERHUMAN_STRENGTH,IMPROVED_REFLEXES,RAPID_RESTORE,RAPID_HEAL,PROTECT_ITEM,HAWK_EYE,MYSTIC_LORE,STEEL_SKIN,ULTIMATE_STRENGTH,INCREDIBLE_REFLEXES,PROTECT_FROM_MAGIC,PROTECT_FROM_MISSILES,PROTECT_FROM_MELEE,EAGLE_EYE,MYSTIC_MIGHT,RETRIBUTION,REDEMPTION,SMITE,CHIVALRY,PIETY,PRESERVE,RIGOUR,AUGURY -reorderprayers.unlockPrayerReordering=false -reportButton.switchTimeFormat=TIME_12H -reportButton.time=LOGIN_TIME -roofremoval.overridePOH=false -roofremoval.removeBetween=true -roofremoval.removeDestination=true -roofremoval.removeHovered=true -roofremoval.removePosition=true -runecraft.degradingNotification=true -runecraft.hightlightDarkMage=true -runecraft.showAir=true -runecraft.showBlood=true -runecraft.showBody=true -runecraft.showChaos=true -runecraft.showClickBox=true -runecraft.showCosmic=true -runecraft.showDeath=true -runecraft.showEarth=true -runecraft.showFire=true -runecraft.showLaw=true -runecraft.showMind=true -runecraft.showNature=true -runecraft.showRifts=true -runecraft.showSoul=true -runecraft.showWater=true -runelite.accountplugin=false -runelite.agilityplugin=true -runelite.alorahdplugin=false -runelite.ammoplugin=false -runelite.antidragplugin=true -runelite.attackstylesplugin=false -runelite.automaticResizeType=KEEP_GAME_SIZE -runelite.bankplugin=false -runelite.banktagsplugin=false -runelite.bankxpvalueplugin=false -runelite.barbarianassaultplugin=false -runelite.barrowsplugin=false -runelite.blastfurnaceplugin=false -runelite.blastmineplugin=false -runelite.blockExtraMouseButtons=true -runelite.boostsplugin=false -runelite.bosstimersplugin=false -runelite.cameraplugin=true -runelite.cannonplugin=false -runelite.chatchannelplugin=false -runelite.chatcommandsplugin=false -runelite.chathistoryplugin=false -runelite.clientBounds=181\:100\:773\:534 -runelite.cluescrollplugin=false -runelite.combatlevelplugin=false -runelite.containInScreen2=RESIZING -runelite.cookingplugin=false -runelite.corpplugin=false -runelite.coxlightcolorsplugin=false -runelite.crowdsourcingplugin=false -runelite.dailytasksplugin=false -runelite.defaultworldplugin=true -runelite.devtoolsplugin=false -runelite.diaryrequirementsplugin=false -runelite.discordplugin=false -runelite.dragHotkey=0\:512 -runelite.entityhiderplugin=true -runelite.examineplugin=false -runelite.externalPlugins=morghttpclient,statussocket -runelite.fairyringplugin=false -runelite.feedplugin=false -runelite.fightcavewavesplugin=false -runelite.fishingplugin=true -runelite.flashNotification=DISABLED -runelite.fontType=SMALL -runelite.friendlistplugin=false -runelite.friendnotesplugin=false -runelite.gameAlwaysOnTop=false -runelite.gameSize=800x800 -runelite.gpuplugin=false -runelite.grandexchangeplugin=false -runelite.grounditemsplugin=true -runelite.groundmarkerplugin=true -runelite.hdplugin=false -runelite.herbiboarplugin=false -runelite.hiscoreplugin=false -runelite.hunterplugin=false -runelite.implingsplugin=false -runelite.infoboxFontType=REGULAR -runelite.infoBoxSize=35 -runelite.infoBoxTextOutline=false -runelite.infoBoxVertical=false -runelite.infoplugin=true -runelite.instancemapplugin=false -runelite.interfaceFontType=REGULAR -runelite.inventorysetupsplugin=false -runelite.inventorytagsplugin=true -runelite.itemchargeplugin=false -runelite.itemstatplugin=false -runelite.kourendlibraryplugin=false -runelite.lockWindowSize=false -runelite.loginscreenplugin=false -runelite.loottrackerplugin=false -runelite.mahoganyhomesplugin=false -runelite.menuEntryShift=true -runelite.menuentryswapperplugin=true -runelite.menuswapperplugin=false -runelite.minimapplugin=true -runelite.miningplugin=false -runelite.mousehighlightplugin=false -runelite.musicplugin=false -runelite.nightmarezoneplugin=false -runelite.notesplugin=false -runelite.notificationFlashColor=1191116800 -runelite.notificationFocused=false -runelite.notificationGameMessage=false -runelite.notificationRequestFocus=OFF -runelite.notificationSound=NATIVE -runelite.notificationTimeout=10000 -runelite.notificationTray=false -runelite.npcindicatorsplugin=true -runelite.objectindicatorsplugin=true -runelite.opponentinfoplugin=true -runelite.overlayBackgroundColor=-1673118414 -runelite.panelToggleKey=123\:128 -runelite.pestcontrolplugin=false -runelite.pinnedPlugins=Agility,Anti Drag,Camera,Entity Hider,Fishing,Ground Items,Info Panel,Inventory Tags,Menu Entry Swapper,Minimap,NPC Indicators,Object Markers,Opponent Information,Quest List,Runecraft,Status Bars,Wiki,Woodcutting,World Hopper,XP Tracker -runelite.playerindicatorsplugin=false -runelite.pohplugin=false -runelite.poisonplugin=false -runelite.prayerplugin=false -runelite.profileMigrationDone=1 -runelite.puzzlesolverplugin=false -runelite.raidsplugin=false -runelite.regenmeterplugin=false -runelite.regionlockerplugin=false -runelite.rememberScreenBounds=true -runelite.reorderprayersplugin=false -runelite.reportbuttonplugin=false -runelite.runenergyplugin=false -runelite.runepouchplugin=false -runelite.screenmarkerplugin=false -runelite.screenshotplugin=false -runelite.shortestpathplugin=false -runelite.sidebarToggleKey=122\:128 -runelite.skillcalculatorplugin=false -runelite.skillstabprogressbarsplugin=false -runelite.slayerplugin=false -runelite.smeltingplugin=false -runelite.statusbarsplugin=true -runelite.statussocketplugin=true -runelite.stretchedmodeplugin=false -runelite.tearsofguthixplugin=false -runelite.temporossplugin=false -runelite.timersplugin=false -runelite.timetrackingplugin=false -runelite.tithefarmplugin=false -runelite.tooltipFontType=SMALL -runelite.tooltipPosition=UNDER_CURSOR -runelite.trayIcon=true -runelite.uiEnableCustomChrome=true -runelite.uiWindowOpacity=100 -runelite.usernameInTitle=false -runelite.useWikiItemPrices=true -runelite.warningOnExit=LOGGED_IN -runelite.wintertodtplugin=false -runelite.woodcuttingplugin=true -runelite.worldmapplugin=false -runelite.xpdropplugin=false -runelite.xptrackerplugin=true -runenergy.replaceOrbText=false -runenergy.ringOfEnduranceChargeMessage=true -runepouch.fontcolor=-256 -runepouch.runeicons=true -runepouch.runePouchOverlayMode=BOTH -screenshot.baHighGamble=false -screenshot.boss=false -screenshot.ccKick=false -screenshot.clanDeath=false -screenshot.collectionLogEntries=true -screenshot.combatAchievements=true -screenshot.displayDate=true -screenshot.duels=false -screenshot.friendDeath=false -screenshot.hotkey=0\:0 -screenshot.includeFrame=true -screenshot.kills=false -screenshot.kingdom=true -screenshot.levels=true -screenshot.notifyWhenTaken=true -screenshot.pets=true -screenshot.playerDeath=false -screenshot.rewards=true -screenshot.untradeableDrop=false -screenshot.uploadScreenshot=NEITHER -screenshot.valuableDrop=false -screenshot.valuableDropThreshold=0 -shortestPath.avoidWilderness=true -shortestPath.cancelInstead=false -shortestPath.drawCollisionMap=false -shortestPath.drawMap=true -shortestPath.drawMinimap=true -shortestPath.drawTiles=true -shortestPath.drawTransports=false -shortestPath.finishDistance=5 -shortestPath.recalculateDistance=10 -skillCalculator.automaticUpdating=false -skillstabprogressbars.backgroundColor=-16777216 -skillstabprogressbars.barHeight=2 -skillstabprogressbars.goalBarEndColor=-65408 -skillstabprogressbars.goalBarStartColor=-16776961 -skillstabprogressbars.indent=true -skillstabprogressbars.progressBarEndColor=-16711936 -skillstabprogressbars.progressBarStartColor=-65536 -skillstabprogressbars.showGoals=false -skillstabprogressbars.showOnlyOnHover=false -skillstabprogressbars.virtualLevels=false -slayer.amount=-1 -slayer.expeditious=-1 -slayer.highlightHull=false -slayer.highlightOutline=false -slayer.highlightTargets=false -slayer.highlightTile=false -slayer.infobox=true -slayer.initialAmount=-1 -slayer.itemoverlay=true -slayer.points=-1 -slayer.slaughter=-1 -slayer.statTimeout=5 -slayer.streak=-1 -slayer.superiornotification=true -slayer.targetColor=-65536 -slayer.taskCommand=true -slayer.weaknessPrompt=true -smelting.statTimeout=5 -specialcounter.arclightThreshold=0 -specialcounter.bandosGodswordThreshold=0 -specialcounter.bulwarkThreshold=0 -specialcounter.darklightThreshold=0 -specialcounter.dragonWarhammerThreshold=0 -specialcounter.infobox=true -specialcounter.specDropColor=-1 -specialcounter.specDrops=true -specialcounter.thresholdNotification=false -statusbars.barWidth=20 -statusbars.enableCounter=true -statusbars.enableRestorationBars=false -statusbars.enableSkillIcon=true -statusbars.hideAfterCombatDelay=0 -statusbars.leftBarMode=HITPOINTS -statusbars.rightBarMode=PRAYER -statussocket.endpoint=http\://localhost\:5000 -stretchedmode.increasedPerformance=false -stretchedmode.integerScaling=false -stretchedmode.keepAspectRatio=false -stretchedmode.scalingFactor=50 -suppliestracker.blowpipeAmmo=MITHRIL -suppliestracker.chargesBox=false -suppliestracker.vorkathsHead=false -teamCapes.clanChatMemberCounter=false -teamCapes.friendsChatMemberCounter=false -teamCapes.minimumCapeCount=1 -teamCapes.teamCapesOverlay=false -tearsofguthix.blueTearsColor=1677787135 -tearsofguthix.greenTearsColor=1677786880 -tearsofguthix.showGreenTearsTimer=true -tempoross.damageIndicator=true -tempoross.doubleSpotColor=-16711681 -tempoross.doubleSpotNotification=false -tempoross.fireColor=-14336 -tempoross.fireNotification=false -tempoross.fishIndicator=true -tempoross.highlightDoubleSpot=true -tempoross.highlightFires=true -tempoross.phaseIndicator=true -tempoross.poleBrokenColor=-65536 -tempoross.tetheredColor=-16711936 -tempoross.useWaveTimer=true -tempoross.vulnerableNotification=false -tempoross.waveNotification=false -tempoross.waveTimerColor=-16711681 -textrecolor.opaqueClanChatGuestMessageHighlight=-16777216 -textrecolor.opaqueClanChatInfo=-16777216 -textrecolor.opaqueClanChatInfoHighlight=-65536 -textrecolor.opaqueClanChatMessageHighlight=-16777216 -textrecolor.opaqueClanGuestInfoHighlight=-65536 -textrecolor.opaqueClanInfoHighlight=-65536 -textrecolor.opaqueClanMessageHighlight=-16777216 -textrecolor.opaqueExamineHighlight=-16776961 -textrecolor.opaqueGameMessageHighlight=-1109984 -textrecolor.opaquePrivateMessageReceivedHighlight=-16767101 -textrecolor.opaquePrivateMessageSentHighlight=-16767101 -textrecolor.opaquePublicChatHighlight=-16777216 -textrecolor.transparentClanChatGuestMessageHighlight=-1 -textrecolor.transparentClanChatInfo=-1 -textrecolor.transparentClanChatInfoHighlight=-65536 -textrecolor.transparentClanChatMessageHighlight=-1 -textrecolor.transparentClanGuestInfoHighlight=-65536 -textrecolor.transparentClanInfoHighlight=-65536 -textrecolor.transparentClanMessageHighlight=-1 -textrecolor.transparentExamineHighlight=-16711936 -textrecolor.transparentGameMessageHighlight=-1109984 -textrecolor.transparentPrivateMessageReceivedHighlight=-1 -textrecolor.transparentPrivateMessageSentHighlight=-1 -textrecolor.transparentPublicChatHighlight=-1 -tileindicators.currentTileBorderWidth=2.0 -tileindicators.currentTileFillColor=838860800 -tileindicators.destinationTileBorderWidth=2.0 -tileindicators.destinationTileFillColor=838860800 -tileindicators.highlightCurrentColor=-16711681 -tileindicators.highlightCurrentTile=false -tileindicators.highlightDestinationColor=-8355712 -tileindicators.highlightDestinationTile=true -tileindicators.highlightHoveredColor=0 -tileindicators.highlightHoveredTile=false -tileindicators.hoveredTileBorderWidth=2.0 -tileindicators.hoveredTileFillColor=838860800 -timers.showAbyssalSireStun=true -timers.showAntiFire=true -timers.showAntipoison=true -timers.showArceuus=true -timers.showArceuusCooldown=false -timers.showBlessedCrystalScarab=true -timers.showBoosterTimers=true -timers.showCannon=true -timers.showCharge=true -timers.showDeathTimer=true -timers.showDfsSpecial=true -timers.showDivine=true -timers.showFreezes=true -timers.showGodTimer=true -timers.showGodWarsAltar=true -timers.showHomeMinigameTeleports=true -timers.showImbuedHeart=true -timers.showLiquidAdrenaline=true -timers.showMagicImbue=true -timers.showOverload=true -timers.showPickpocketStun=true -timers.showPrayerEnhance=true -timers.showRejuvTimer=true -timers.showSilkDressing=true -timers.showStaffOfTheDead=true -timers.showStamina=true -timers.showTeleblock=true -timers.showTzhaarTimers=true -timers.showVengeance=true -timers.showVengeanceActive=true -timers.showVoteBonus=true -timers.showWellTimer=true -timestamp.format=[HH\:mm] -timetracking.activeTab=CLOCK -timetracking.birdHouseNotification=false -timetracking.defaultTimerMinutes=5 -timetracking.farmingContractInfoBox=true -timetracking.preferSoonest=false -timetracking.sortOrder=NONE -timetracking.timeFormatMode=ABSOLUTE_24H -timetracking.timerNotification=false -timetracking.timerWarningThreshold=10 -tithefarmplugin.hexColorGrown=-16721664 -tithefarmplugin.hexColorUnwatered=-17664 -tithefarmplugin.hexColorWatered=-16737793 -virtuallevels.virtualTotalLevel=true -wiki.leftClickSearch=false -wintertodt.damageNotificationColor=-16711681 -wintertodt.notifyBrazierDamage=INTERRUPT -wintertodt.notifyBrazierOut=true -wintertodt.notifyCold=INTERRUPT -wintertodt.notifyEmptyInv=true -wintertodt.notifyFullInv=true -wintertodt.notifySnowfall=INTERRUPT -wintertodt.roundNotification=5 -wintertodt.showOverlay=true -woodcutting.clueNestNotifyTier=HARD -woodcutting.showNestNotification=false -woodcutting.showRedwoods=false -woodcutting.showRespawnTimers=false -woodcutting.showWoodcuttingStats=true -woodcutting.statTimeout=1 -worldhopper.displayPing=false -worldhopper.menuOption=true -worldhopper.nextKey=39\:192 -worldhopper.ping=true -worldhopper.previousKey=37\:192 -worldhopper.quickhopOutOfDanger=true -worldhopper.quickHopRegionFilter=[] -worldhopper.regionFilter=[] -worldhopper.showMessage=true -worldhopper.showSidebar=true -worldhopper.subscriptionFilter=BOTH -worldmap.agilityCourseRooftopIcon=true -worldmap.agilityCourseTooltips=true -worldmap.agilityShortcutIcon=true -worldmap.agilityShortcutTooltips=true -worldmap.ancientSpellbookIcon=true -worldmap.arceuusSpellbookIcon=true -worldmap.dungeonTooltips=true -worldmap.fairyRingIcon=true -worldmap.fairyRingTooltips=true -worldmap.farmingpatchTooltips=true -worldmap.fishingSpotTooltips=true -worldmap.hunterAreaTooltips=true -worldmap.jewelleryIcon=true -worldmap.kourendTaskTooltips=true -worldmap.lunarSpellbookIcon=true -worldmap.minigameTooltip=true -worldmap.miningSiteTooltips=true -worldmap.miscellaneousTeleportIcon=true -worldmap.questStartTooltips=true -worldmap.rareTreeIcon=true -worldmap.rareTreeTooltips=true -worldmap.runecraftingAltarIcon=true -worldmap.scrollIcon=true -worldmap.standardSpellbookIcon=true -worldmap.transportationTooltips=true -xpdrop.damageColor=-65536 -xpdrop.fakeXpDropDelay=0 -xpdrop.hideSkillIcons=false -xpdrop.magePrayerColor=-15368019 -xpdrop.meleePrayerColor=-15368019 -xpdrop.rangePrayerColor=-15368019 -xpdrop.showdamagedrops=NONE -xpglobes.alignOrbsVertically=false -xpglobes.enableCustomArcColor=false -xpglobes.enableTooltips=true -xpglobes.hideMaxed=false -xpglobes.Orb\ duration=10 -xpglobes.Orb\ size=40 -xpglobes.Progress\ arc\ color=-14336 -xpglobes.Progress\ arc\ width=2 -xpglobes.Progress\ orb\ background\ color=2139127936 -xpglobes.Progress\ orb\ outline\ color=-16777216 -xpglobes.showActionsLeft=true -xpglobes.showTimeTilGoal=true -xpglobes.showVirtualLevel=false -xpglobes.showXpHour=true -xpglobes.showXpLeft=true -xpTracker.hideMaxed=false -xpTracker.intermediateLevelMarkers=false -xpTracker.logoutPausing=false -xpTracker.onScreenDisplayMode=XP_GAINED -xpTracker.onScreenDisplayModeBottom=XP_HOUR -xpTracker.pauseSkillAfter=0 -xpTracker.prioritizeRecentXpSkills=false -xpTracker.progressBarLabel=PERCENTAGE -xpTracker.progressBarTooltipLabel=TIME_TO_LEVEL -xpTracker.resetSkillRateAfter=0 -xpTracker.skillTabOverlayMenuOptions=true -xpTracker.wiseOldManOpenOption=true -xpTracker.xpPanelLabel1=XP_GAINED -xpTracker.xpPanelLabel2=XP_LEFT -xpTracker.xpPanelLabel3=XP_HOUR -xpTracker.xpPanelLabel4=ACTIONS_LEFT -xpupdater.cml=false -xpupdater.templeosrs=false -xpupdater.wiseoldman=false -zoom.compassLook=true -zoom.compassLookPreservePitch=false -zoom.controlFunction=NONE -zoom.ctrlZoomValue=512 -zoom.ignoreExamine=false -zoom.inner=false -zoom.invertPitch=false -zoom.invertYaw=false -zoom.middleClickMenu=false -zoom.outerLimit=0 -zoom.preserveYaw=false -zoom.relaxCameraPitch=true -zoom.rightClickMovesCamera=false -zoom.zoomIncrement=25 diff --git a/src/model/osrs/template.py b/src/model/osrs/template.py index 37ef5a71..4d0fef0b 100644 --- a/src/model/osrs/template.py +++ b/src/model/osrs/template.py @@ -49,11 +49,15 @@ def main_loop(self): 1. If you need to halt the bot from within this function, call `self.stop()`. You'll want to do this when the bot has made a mistake, gets stuck, or a condition is met that requires the bot to stop. 2. Frequently call self.update_progress() and self.log_msg() to send information to the UI. - 3. At the end of the main loop, make sure to set the status to STOPPED. + 3. At the end of the main loop, make sure to call `self.stop()`. Additional notes: - Make use of Bot/RuneLiteBot member functions. There are many functions to simplify various actions. - Visit the Wiki for more. + - Make use of Bot/RuneLiteBot member functions. There are many functions to simplify various actions. + Visit the Wiki for more. + - Using the available APIs is highly recommended. Some of all of the API tools may be unavailable for + select private servers. To see what the APIs can offer you, see here: https://github.com/kelltom/OSRS-Bot-COLOR/tree/main/src/utilities/api. + For usage, uncomment the `api_m` and/or `api_s` lines below, and use the `.` operator to access their + functions. """ # Setup APIs # api_m = MorgHTTPSocket() @@ -64,6 +68,7 @@ def main_loop(self): end_time = self.running_time * 60 while time.time() - start_time < end_time: # -- Perform bot actions here -- + # Code within this block will LOOP until the bot is stopped. self.update_progress((time.time() - start_time) / end_time) diff --git a/src/model/test/__init__.py b/src/model/test/__init__.py deleted file mode 100644 index e43ce246..00000000 --- a/src/model/test/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .custom_launch.window_test_bot import WindowTestBot -from .example_bot import ExampleBot diff --git a/src/model/test/custom_launch/custom_settings.properties b/src/model/test/custom_launch/custom_settings.properties deleted file mode 100644 index e27d6d36..00000000 --- a/src/model/test/custom_launch/custom_settings.properties +++ /dev/null @@ -1,1319 +0,0 @@ -#RuneLite configuration -#Sat Nov 05 16:13:28 EDT 2022 -agility.agilityArenaNotifier=false -agility.agilityArenaTimer=false -agility.highlightMarks=false -agility.highlightPortals=false -agility.highlightSepulchreNpcs=false -agility.highlightSepulchreObstacles=false -agility.highlightSepulchreSkilling=false -agility.highlightShortcuts=false -agility.highlightStick=false -agility.lapsPerHour=true -agility.lapsToLevel=true -agility.lapTimeout=1 -agility.markHighlight=-65536 -agility.overlayColor=-16711936 -agility.portalsHighlight=-65281 -agility.sepulchreHighlightColor=-16711936 -agility.showClickboxes=false -agility.showLapCount=true -agility.stickHighlightColor=-65536 -agility.trapHighlight=-65536 -agility.trapOverlay=false -animationSmoothing.smoothNpcAnimations=true -animationSmoothing.smoothObjectAnimations=true -animationSmoothing.smoothPlayerAnimations=true -antiDrag.disableOnCtrl=true -antiDrag.dragDelay=20 -antiDrag.onShiftOnly=false -attackIndicator.alwaysShowStyle=true -attackIndicator.hideAutoRetaliate=false -attackIndicator.removeWarnedStyles=false -attackIndicator.warnForAttack=false -attackIndicator.warnForDefensive=false -attackIndicator.warnForMagic=false -attackIndicator.warnForRanged=false -attackIndicator.warnForStrength=false -bank.bankPinKeyboard=false -bank.rightClickBankEquip=false -bank.rightClickBankInventory=false -bank.rightClickBankLoot=false -bank.rightClickPlaceholders=false -bank.searchKeybind=70\:128 -bank.seedVaultValue=true -bank.showExact=false -bank.showGE=true -bank.showHA=false -bank.showTP=true -bankedexperience.cascadeBankedXp=true -bankedexperience.grabFromEimBank=false -bankedexperience.grabFromGimBank=false -bankedexperience.grabFromInventory=false -bankedexperience.grabFromLootingBag=false -bankedexperience.includeRngActivities=false -bankedexperience.limitToCurrentLevel=true -bankedexperience.showSecondaries=false -banktags.position=0 -banktags.preventTagTabDrags=false -banktags.rememberTab=true -banktags.removeTabSeparators=false -banktags.useTabs=true -bankxpvalue.itemXpTooltips=true -bankxpvalue.keepFixed=false -bankxpvalue.levelUps=true -bankxpvalue.tutorial=false -barbarianAssault.showHealerBars=true -barbarianAssault.showTimer=true -barbarianAssault.waveTimes=true -barrows.brotherLocColor=-16711681 -barrows.deadBrotherLocColor=-65536 -barrows.showBrotherLoc=true -barrows.showChestValue=true -barrows.showPrayerDrainTimer=true -barrows.showPuzzleAnswer=true -blastfurnace.showBarDispenser=false -blastfurnace.showCofferTime=true -blastfurnace.showConveyorBelt=false -blastmine.hexTimerColor=-2542080 -blastmine.hexWarningColor=-2542080 -blastmine.showOreOverlay=true -blastmine.showRockIconOverlay=true -blastmine.showTimerOverlay=true -blastmine.showWarningOverlay=true -boosts.boostThreshold=0 -boosts.compactDisplay=false -boosts.displayBoosts=BOTH -boosts.displayIndicators=false -boosts.displayNextBuffChange=BOOSTED -boosts.displayNextDebuffChange=NEVER -boosts.displayPanel=false -boosts.notifyOnBoost=true -boosts.relativeBoost=false -cannon.highlightDoubleHitColor=-65536 -cannon.lowWarningThreshold=0 -cannon.showCannonSpots=true -cannon.showDoubleHitSpot=false -cannon.showEmptyCannonNotification=true -cannon.showInfobox=false -chatcommands.bh=true -chatcommands.bhRogue=true -chatcommands.clearEntireChatBox=8\:128 -chatcommands.clearSingleWord=87\:128 -chatcommands.clue=true -chatcommands.duels=true -chatcommands.gc=true -chatcommands.killcount=true -chatcommands.lms=true -chatcommands.lp=true -chatcommands.lvl=true -chatcommands.pb=true -chatcommands.pets=true -chatcommands.price=true -chatcommands.qp=true -chatcommands.sw=true -chatfilter.collapseGameChat=false -chatfilter.collapsePlayerChat=false -chatfilter.filterBroad=false -chatfilter.filterClan=false -chatfilter.filterClanChat=false -chatfilter.filterFriends=false -chatfilter.filterGameChat=false -chatfilter.filterLogin=false -chatfilter.filterNews=false -chatfilter.filterType=CENSOR_WORDS -chatfilter.maxRepeatedPublicChats=0 -chatfilter.stripAccents=false -chathistory.clearHistory=true -chathistory.copyToClipboard=true -chathistory.pmTargetCycling=true -chathistory.retainChatHistory=true -chatnotification.highlightOwnName=true -chatnotification.notifyOnBroadcast=false -chatnotification.notifyOnDuel=false -chatnotification.notifyOnHighlight=false -chatnotification.notifyOnOwnName=false -chatnotification.notifyOnPM=false -chatnotification.notifyOnTrade=false -clanchat.clanChatIcons=true -clanchat.clanChatShowJoinLeave=false -clanchat.clanChatShowOnlineMemberCount=false -clanchat.clanCounter=false -clanchat.clanTabChat=false -clanchat.confirmKicks=false -clanchat.guestClanChatShowJoinLeave=false -clanchat.guestClanChatShowOnlineMemberCount=false -clanchat.joinLeaveRank=UNRANKED -clanchat.joinLeaveTimeout=20 -clanchat.privateMessageIcons=false -clanchat.publicChatIcons=false -clanchat.recentChats=true -clanchat.showIgnores=true -clanchat.showIgnoresColor=-65536 -clanchat.showJoinLeave=false -cluescroll.displayHintArrows=true -colorpicker.recentColors=-256,-16773121,-5635841,-16711681,-65305,-6382531 -combatlevel.showLevelsUntil=true -combatlevel.showPreciseCombatLevel=true -combatlevel.wildernessAttackLevelRange=true -cooking.fermentTimer=true -cooking.statTimeout=5 -corp.leftClickCore=true -corp.markDarkCore=true -corp.showDamage=true -coxlightcolors.dust=-16711681 -coxlightcolors.noUnique=-1 -coxlightcolors.olmEntrance=-7536885 -coxlightcolors.specificUniqueColor=-65536 -coxlightcolors.specifyAncestralHat=false -coxlightcolors.specifyAncestralRobeBottom=false -coxlightcolors.specifyAncestralRobeTop=false -coxlightcolors.specifyArcanePrayerScroll=false -coxlightcolors.specifyDexPrayerScroll=false -coxlightcolors.specifyDinhsBulwark=false -coxlightcolors.specifyDragonClaws=false -coxlightcolors.specifyDragonHunterCrossbow=false -coxlightcolors.specifyElderMaul=true -coxlightcolors.specifyKodaiInsignia=true -coxlightcolors.specifyTwistedBow=true -coxlightcolors.specifyTwistedBuckler=false -coxlightcolors.twistedKit=-16711936 -coxlightcolors.unique=-961035 -customcursor.cursorStyle=RS3_GOLD -dailytaskindicators.showArrows=false -dailytaskindicators.showBonemeal=false -dailytaskindicators.showDynamite=false -dailytaskindicators.showEssence=false -dailytaskindicators.showFlax=false -dailytaskindicators.showHerbBoxes=true -dailytaskindicators.showRunes=false -dailytaskindicators.showSand=false -dailytaskindicators.showStaves=true -danceparty.disableInPvp=false -danceparty.partyOnLevelup=false -danceparty.workoutMode=false -defaultworld.defaultWorld=0 -defaultworld.lastWorld=436 -defaultworld.useLastWorld=false -devtools.inspectorAlwaysOnTop=false -discord.actionTimeout=5 -discord.elapsedTime=ACTIVITY -discord.showBossActivity=true -discord.showCityActivity=true -discord.showDungeonActivity=true -discord.showMainMenu=true -discord.showMinigameActivity=true -discord.showRaidingActivity=true -discord.showRegionsActivity=true -discord.showSkillActivity=true -dpscounter.autopause=false -dpscounter.autoreset=false -dpscounter.bossDamage=false -dpscounter.showDamage=false -driftnet.annetteTagColor=-65536 -driftnet.countColor=-1 -driftnet.highlightUntaggedFish=true -driftnet.showNetStatus=true -driftnet.tagAnnette=true -driftnet.timeoutDelay=60 -driftnet.untaggedFishColor=-16711681 -entityhider.hideAttackers=false -entityhider.hideClanChatMembers=true -entityhider.hideClanMates=true -entityhider.hideDeadNpcs=false -entityhider.hideFriends=true -entityhider.hideIgnores=false -entityhider.hideLocalPlayer=false -entityhider.hideLocalPlayer2D=true -entityhider.hideNPCs=false -entityhider.hideNPCs2D=false -entityhider.hidePets=true -entityhider.hidePlayers=true -entityhider.hidePlayers2D=true -entityhider.hideProjectiles=true -entityhider.hideThralls=false -fairyrings.autoOpen=true -feed.includeBlogPosts=true -feed.includeOsrsNews=true -feed.includeTweets=true -fightcavewaves.waveDisplay=BOTH -fishing.aerialOverlayColor=-16711936 -fishing.flyingFishNotification=false -fishing.harpoonfishOverlayColor=-16711936 -fishing.minnowsOverlayColor=-65536 -fishing.onlyCurrent=false -fishing.overlayColor=-16711681 -fishing.showFishingStats=true -fishing.showIcons=false -fishing.showMinnowOverlay=false -fishing.showNames=false -fishing.showTiles=false -fishing.statTimeout=1 -fishing.trawlerContribution=false -fishing.trawlerTimer=false -fpscontrol.drawFps=true -fpscontrol.limitFps=false -fpscontrol.limitFpsUnfocused=false -fpscontrol.maxFps=50 -fpscontrol.maxFpsUnfocused=50 -friendlist.showWorldOnLogin=false -friendNotes.showIcons=true -Gauntlet.countBossAttacks=true -Gauntlet.countPlayerAttacks=true -Gauntlet.displayTimerChat=true -Gauntlet.displayTimerWidget=true -Gauntlet.highlightResourcesColor=true -Gauntlet.highlightResourcesIcons=true -Gauntlet.iconSize=20 -Gauntlet.overlayBoss=true -Gauntlet.overlayBossPrayer=false -Gauntlet.overlayTornadoes=true -Gauntlet.uniqueAttackVisual=false -Gauntlet.uniquePrayerAudio=true -Gauntlet.uniquePrayerVisual=true -gpu.anisotropicFilteringLevel=0 -gpu.antiAliasingMode=DISABLED -gpu.brightTextures=false -gpu.colorBlindMode=NONE -gpu.drawDistance=25 -gpu.fogDepth=0 -gpu.fpsTarget=60 -gpu.smoothBanding=false -gpu.uiScalingMode=LINEAR -gpu.unlockFps=false -gpu.useComputeShaders=false -gpu.vsyncMode=ADAPTIVE -grandexchange.enableGELimitReset=true -grandexchange.enableGeLimits=true -grandexchange.enableNotifications=true -grandexchange.geSearchMode=DEFAULT -grandexchange.highlightSearchMatch=true -grandexchange.quickLookup=true -grandexchange.showActivelyTradedPrice=true -grandexchange.showExact=false -grandexchange.showTotal=true -grounditems.collapseEntries=true -grounditems.defaultColor=-1 -grounditems.deprioritizeHiddenItems=true -grounditems.dontHideUntradeables=true -grounditems.doubleTapDelay=250 -grounditems.groundItemTimers=OFF -grounditems.hiddenColor=-8355712 -grounditems.hiddenItems=Flyer -grounditems.hideUnderValue=0 -grounditems.highlightedColor=-5635841 -grounditems.highlightedItems= -grounditems.highlightTiles=false -grounditems.highlightValueCalculation=HIGHEST -grounditems.highValueColor=-27136 -grounditems.highValuePrice=0 -grounditems.hotkey=0\:512 -grounditems.insaneValueColor=-39246 -grounditems.insaneValuePrice=0 -grounditems.itemHighlightMode=OVERLAY -grounditems.lootbeamStyle=MODERN -grounditems.lowValueColor=-10046721 -grounditems.lowValuePrice=0 -grounditems.mediumValueColor=-6684775 -grounditems.mediumValuePrice=0 -grounditems.menuHighlightMode=BOTH -grounditems.notifyHighlightedDrops=false -grounditems.notifyTier=OFF -grounditems.onlyShowLoot=false -grounditems.priceDisplayMode=OFF -grounditems.recolorMenuHiddenItems=false -grounditems.showHighlightedOnly=true -grounditems.showLootbeamForHighlighted=false -grounditems.showLootbeamTier=OFF -grounditems.showMenuItemQuantities=true -grounditems.textOutline=true -groundMarker.borderWidth=4.0 -groundMarker.drawOnMinimap=false -groundMarker.fillOpacity=0 -groundMarker.markerColor=-16711936 -groundMarker.rememberTileColors=true -groundMarker.showClear=false -groundMarker.showImportExport=true -herbiboar.colorGameObject=-16711681 -herbiboar.colorStart=-16711681 -herbiboar.colorTrail=-1 -herbiboar.colorTunnel=-16711936 -herbiboar.showClickboxes=false -herbiboar.showObject=true -herbiboar.showStart=true -herbiboar.showTrail=true -herbiboar.showTunnel=true -hiscore.autocomplete=true -hiscore.bountylookup=false -hiscore.menuOption=true -hiscore.playerOption=true -hiscore.virtualLevels=true -hunterplugin.hexColorEmptyTrap=-65536 -hunterplugin.hexColorFullTrap=-16711936 -hunterplugin.hexColorOpenTrap=-256 -hunterplugin.hexColorTransTrap=-14336 -hunterplugin.maniacalMonkeyNotify=false -idlenotifier.animationidle=true -idlenotifier.highEnergy=0 -idlenotifier.hitpoints=0 -idlenotifier.interactionidle=true -idlenotifier.logoutidle=true -idlenotifier.lowEnergy=100 -idlenotifier.movementidle=false -idlenotifier.oxygen=0 -idlenotifier.prayer=0 -idlenotifier.spec=0 -idlenotifier.timeout=5000 -implings.babyColor=-5140557 -implings.crystalColor=-10634030 -implings.dragonColor=-2992821 -implings.earthColor=-12691904 -implings.eclecticColor=-7234747 -implings.essenceColor=-14657190 -implings.gourmetColor=-5667998 -implings.luckyColor=-10090651 -implings.magpieColor=-7434733 -implings.natureColor=-10712481 -implings.ninjaColor=-12106165 -implings.showbaby=NONE -implings.showCrystal=NONE -implings.showdragon=HIGHLIGHT -implings.showearth=NONE -implings.showeclectic=NONE -implings.showessence=NONE -implings.showgourmet=NONE -implings.showlucky=HIGHLIGHT -implings.showmagpie=NONE -implings.showname=false -implings.shownature=NONE -implings.showninja=NONE -implings.showspawn=false -implings.showyoung=NONE -implings.spawnColor=-1 -implings.youngColor=-5266296 -interacthighlight.borderWidth=4 -interacthighlight.npcAttackHighlightColor=-1862336512 -interacthighlight.npcAttackHoverHighlightColor=-1862271232 -interacthighlight.npcHoverHighlightColor=-1862271232 -interacthighlight.npcInteractHighlightColor=-1862336512 -interacthighlight.npcShowHover=true -interacthighlight.npcShowInteract=true -interacthighlight.objectHoverHighlightColor=-1878982657 -interacthighlight.objectInteractHighlightColor=-1862336512 -interacthighlight.objectShowHover=true -interacthighlight.objectShowInteract=true -interacthighlight.outlineFeather=4 -interfaceStyles.alwaysStack=false -interfaceStyles.disableAnims=false -interfaceStyles.drawDistance=25 -interfaceStyles.gameframe=AROUND_2005 -interfaceStyles.hdHealthBars=false -interfaceStyles.hdMenu=false -interfaceStyles.hitmarkers=OLDSCHOOL -interfaceStyles.menuAlpha=255 -interfaceStyles.newCursors=false -interfaceStyles.oldschoolCritFont=DEFAULT -interfaceStyles.rsCrossSprites=false -interfaceStyles.tenXHitpoints=false -inventorygrid.dragDelay=0 -inventorygrid.gridColor=771751935 -inventorygrid.highlightColor=755040000 -inventorygrid.showGrid=true -inventorygrid.showHighlight=true -inventorygrid.showItem=true -inventorysetups.autoEquip=true -inventorysetups.bankFilter=false -inventorysetups.compactMode=false -inventorysetups.disableBankTabBar=false -inventorysetups.filterBankAddItemstOnlyHotkey=0\:0 -inventorysetups.filterBankEquipmentOnlyHotkey=0\:0 -inventorysetups.filterBankHotkey=0\:0 -inventorysetups.filterBankInventoryOnlyHotkey=0\:0 -inventorysetups.fuzzy=false -inventorysetups.hideHelpButton=false -inventorysetups.highlightColor=-65536 -inventorysetups.highlightDifference=false -inventorysetups.highlightStackDifference=false -inventorysetups.highlightStackDifferenceEnum=None -inventorysetups.highlightUnorderedDifference=false -inventorysetups.highlightVarianceDifference=false -inventorysetups.requireActivePanelFilter=false -inventorysetups.returnToSetupsHotkey=0\:0 -inventorysetups.sortingMode=DEFAULT -inventorysetups.stackCompare=None -inventorytags.fillOpacity=50 -inventorytags.groupColor1=-65536 -inventorytags.groupColor2=-16711936 -inventorytags.groupColor3=-16776961 -inventorytags.groupColor4=-65281 -inventorytags.groupColor5=-256 -inventorytags.groupColor6=-16711681 -inventorytags.migrated=1 -inventorytags.showTagOutline=true -inventorytags.tagFill=false -inventorytags.tagUnderline=false -inventoryViewer.hiddenDefault=false -inventoryViewer.hideIfInventoryActive=false -inventoryViewer.toggleKeybind=0\:0 -itemCharge.amuletOfBounty=-1 -itemCharge.amuletOfChemistry=-1 -itemCharge.bindingNotification=true -itemCharge.braceletOfClayNotification=true -itemCharge.dodgyNecklace=-1 -itemCharge.dodgyNotification=true -itemCharge.expeditiousNotification=true -itemCharge.explorerRing=-1 -itemCharge.lowWarning=2 -itemCharge.lowWarningColor=-256 -itemCharge.recoilNotification=false -itemCharge.ringOfForgingNotification=true -itemCharge.showAbyssalBraceletCharges=true -itemCharge.showAmuletOfBountyCharges=true -itemCharge.showAmuletOfChemistryCharges=true -itemCharge.showBasketCharges=true -itemCharge.showBellowCharges=true -itemCharge.showBindingNecklaceCharges=true -itemCharge.showBloodEssenceCharges=true -itemCharge.showBraceletOfClayCharges=true -itemCharge.showBraceletOfSlaughterCharges=true -itemCharge.showDodgyCount=true -itemCharge.showExpeditiousBraceletCharges=true -itemCharge.showExplorerRingCharges=true -itemCharge.showFungicideCharges=true -itemCharge.showGuthixRestDoses=true -itemCharge.showImpCharges=true -itemCharge.showInfoboxes=false -itemCharge.showPotionDoseCount=false -itemCharge.showRingOfForgingCount=true -itemCharge.showSackCharges=true -itemCharge.showTeleportCharges=true -itemCharge.showWateringCanCharges=true -itemCharge.showWaterskinCharges=true -itemCharge.slaughterNotification=true -itemCharge.veryLowWarning=1 -itemCharge.veryLowWarningColor=-65536 -itemEditor.itemId=-1 -itemEditor.itemOption=false -itemidentification.identificationType=SHORT -itemidentification.showAllotmentSeeds=false -itemidentification.showBars=false -itemidentification.showBerrySeeds=false -itemidentification.showComposts=false -itemidentification.showEnchantedJewellery=false -itemidentification.showFlowerSeeds=false -itemidentification.showFruitTreeSeeds=false -itemidentification.showGems=false -itemidentification.showHerbs=false -itemidentification.showHerbSeeds=true -itemidentification.showHopSeeds=false -itemidentification.showImplingJars=false -itemidentification.showJewellery=false -itemidentification.showLogs=false -itemidentification.showOres=false -itemidentification.showPlanks=false -itemidentification.showPotions=false -itemidentification.showPyreLogs=false -itemidentification.showSacks=false -itemidentification.showSaplings=true -itemidentification.showSpecialSeeds=false -itemidentification.showTablets=false -itemidentification.showTeleportScrolls=false -itemidentification.showTreeSeeds=false -itemidentification.textColor=-1 -itemprices.hideInventory=true -itemprices.showAlchProfit=false -itemprices.showEA=true -itemprices.showGEPrice=true -itemprices.showHAValue=true -itemprices.showWhileAlching=true -itemstat.absolute=true -itemstat.alwaysShowBaseStats=false -itemstat.colorBetterCapped=-1118669 -itemstat.colorBetterSomecapped=-6492621 -itemstat.colorBetterUncapped=-13373901 -itemstat.colorNoChange=-1118482 -itemstat.colorWorse=-1166541 -itemstat.consumableStats=true -itemstat.equipmentStats=true -itemstat.geStats=true -itemstat.relative=true -itemstat.showStatsInBank=true -itemstat.showWeight=true -itemstat.theoretical=false -keyremapping.cameraRemap=true -keyremapping.control=0\:128 -keyremapping.down=83\:0 -keyremapping.esc=27\:0 -keyremapping.f1=49\:0 -keyremapping.f10=48\:0 -keyremapping.f11=45\:0 -keyremapping.f12=61\:0 -keyremapping.f2=50\:0 -keyremapping.f3=51\:0 -keyremapping.f4=52\:0 -keyremapping.f5=53\:0 -keyremapping.f6=54\:0 -keyremapping.f7=55\:0 -keyremapping.f8=56\:0 -keyremapping.f9=57\:0 -keyremapping.fkeyRemap=false -keyremapping.left=65\:0 -keyremapping.right=68\:0 -keyremapping.space=32\:0 -keyremapping.up=87\:0 -kingdomofmiscellania.approvalThreshold=100 -kingdomofmiscellania.cofferThreshold=7500000 -kingdomofmiscellania.sendNotifications=false -kourendLibrary.alwaysShowVarlamoreEnvoy=false -kourendLibrary.hideButton=true -kourendLibrary.hideDarkManuscript=false -kourendLibrary.hideDuplicateBook=true -kourendLibrary.showTargetHintArrow=true -kourendLibrary.showTutorialOverlay=true -loginscreen.loginScreen=OFF -loginscreen.pasteenabled=false -loginscreen.showLoginFire=false -loginscreen.syncusername=true -logouttimer.idleTimeout=5 -loottracker.npcKillChatMessage=false -loottracker.priceType=GRAND_EXCHANGE -loottracker.pvpKillChatMessage=false -loottracker.showPriceType=false -loottracker.showRaidsLootValue=true -loottracker.syncPanel=true -lowmemory.hideLowerPlanes=false -lowmemory.lowDetail=true -MahoganyHomes.displayHintArrows=true -MahoganyHomes.highlightHotspots=true -MahoganyHomes.highlightStairs=true -MahoganyHomes.showRequiredMaterials=true -MahoganyHomes.showSessionStats=true -MahoganyHomes.textOverlay=true -MahoganyHomes.worldMapIcon=true -menuentryswapper.bankDepositShiftClick=DEPOSIT_ALL -menuentryswapper.bankWithdrawShiftClick=WITHDRAW_ALL -menuentryswapper.groundItemShiftClickWalkHere=false -menuentryswapper.leftClickCustomization=true -menuentryswapper.npcLeftClickCustomization=true -menuentryswapper.npcShiftClickWalkHere=true -menuentryswapper.objectLeftClickCustomization=true -menuentryswapper.objectShiftClickWalkHere=true -menuentryswapper.removeDeadNpcMenus=false -menuentryswapper.shiftClickCustomization=true -menuentryswapper.shopBuy=BUY_50 -menuentryswapper.shopSell=SELL_50 -menuentryswapper.swapAbyssTeleport=true -menuentryswapper.swapAdmire=true -menuentryswapper.swapArdougneCloak=WEAR -menuentryswapper.swapAssignment=true -menuentryswapper.swapBait=false -menuentryswapper.swapBanker=true -menuentryswapper.swapBirdhouseEmpty=true -menuentryswapper.swapBones=false -menuentryswapper.swapBoxTrap=true -menuentryswapper.swapChase=true -menuentryswapper.swapCrush=false -menuentryswapper.swapDepositItems=false -menuentryswapper.swapDesertAmulet=WEAR -menuentryswapper.swapEssenceMineTeleport=false -menuentryswapper.swapExchange=true -menuentryswapper.swapFairyRing=LAST_DESTINATION -menuentryswapper.swapFill=true -menuentryswapper.swapGEAbort=false -menuentryswapper.swapGEItemCollect=DEFAULT -menuentryswapper.swapHardmode=true -menuentryswapper.swapHarpoon=false -menuentryswapper.swapHelp=true -menuentryswapper.swapHerbs=false -menuentryswapper.swapHomePortal=HOME -menuentryswapper.swapJewelleryBox=false -menuentryswapper.swapKaramjaGloves=WEAR -menuentryswapper.swapMorytaniaLegs=WEAR -menuentryswapper.swapPay=true -menuentryswapper.swapPick=false -menuentryswapper.swapPickpocket=true -menuentryswapper.swapPortalNexus=false -menuentryswapper.swapPreviousTeleport=false -menuentryswapper.swapPrivate=false -menuentryswapper.swapQuick=true -menuentryswapper.swapRadasBlessing=EQUIP -menuentryswapper.swapStairsLeftClick=CLIMB -menuentryswapper.swapStairsShiftClick=CLIMB -menuentryswapper.swapTan=false -menuentryswapper.swapTeleportItem=false -menuentryswapper.swapTeleToPoh=false -menuentryswapper.swapTemporossLeave=false -menuentryswapper.swapTrade=true -menuentryswapper.swapTravel=true -menuentryswapper.swapUnchargedCells=TAKE -metronome.tickCount=1 -metronome.tickVolume=96 -metronome.tockVolume=0 -minimap.clan=-5635906 -minimap.friend=-16711936 -minimap.hideMinimap=false -minimap.item=-65536 -minimap.npc=-6382531 -minimap.player=-1 -minimap.team=-15503625 -minimap.zoom=true -mining.showMiningStats=true -mining.statTimeout=5 -morghttpclient.MaxObjectDistance=1200 -motherlode.showBrokenStruts=true -motherlode.showDepositsLeft=true -motherlode.showGemsFound=true -motherlode.showLootIcons=false -motherlode.showMiningState=true -motherlode.showMiningStats=true -motherlode.showOresFound=true -motherlode.showRocks=true -motherlode.showSack=true -motherlode.showVeins=true -motherlode.statTimeout=5 -mousehighlight.chatboxTooltip=true -mousehighlight.disableSpellbooktooltip=false -mousehighlight.uiTooltip=true -mta.alchemy=true -mta.enchantment=true -mta.graveyard=true -mta.telekinetic=true -music.areaSoundEffectVolume=0 -music.granularSliders=true -music.musicVolume=0 -music.muteAmbientSounds=false -music.muteOtherAreaEnvironmentSounds=false -music.muteOtherAreaNPCSounds=false -music.muteOtherAreaSounds=false -music.muteOwnAreaSounds=false -music.mutePrayerSounds=false -music.soundEffectVolume=0 -nightmareZone.absorptioncolorbelowthreshold=-65536 -nightmareZone.absorptioncoloroverthreshold=-256 -nightmareZone.absorptionnotification=true -nightmareZone.absorptionthreshold=50 -nightmareZone.moveoverlay=true -nightmareZone.overloadearlywarningseconds=10 -nightmareZone.overloadnotification=true -nightmareZone.powersurgenotification=false -nightmareZone.recurrentdamagenotification=false -nightmareZone.ultimateforcenotification=false -nightmareZone.zappernotification=false -npcindicators.borderWidth=3.0 -npcindicators.drawMinimapNames=false -npcindicators.drawNames=false -npcindicators.fillColor=335609855 -npcindicators.highlightHull=true -npcindicators.highlightMenuNames=false -npcindicators.highlightOutline=false -npcindicators.highlightSouthWestTile=false -npcindicators.highlightSouthWestTrueTile=false -npcindicators.highlightTile=false -npcindicators.highlightTrueTile=false -npcindicators.ignoreDeadNpcs=true -npcindicators.ignorePets=true -npcindicators.npcColor=-16711681 -npcindicators.npcToHighlight= -npcindicators.outlineFeather=4 -npcindicators.showRespawnTimer=false -npcUnaggroArea.hideIfOutOfCombat=false -npcUnaggroArea.notifyExpire=false -npcUnaggroArea.npcAggroAreaColor=1694498560 -npcUnaggroArea.npcUnaggroAlwaysActive=false -npcUnaggroArea.npcUnaggroAreaColor=-256 -npcUnaggroArea.npcUnaggroShowAreaLines=false -npcUnaggroArea.npcUnaggroShowTimer=true -npcUnaggroArea.showOnSlayerTask=false -objectindicators.borderWidth=7.0 -objectindicators.highlightClickbox=false -objectindicators.highlightHull=true -objectindicators.highlightOutline=false -objectindicators.highlightTile=false -objectindicators.markerColor=-65305 -objectindicators.outlineFeather=0 -objectindicators.rememberObjectColors=true -openosrs.askMode=true -openosrs.bootstrapMode=STABLE -openosrs.disableHw=false -openosrs.enableOpacity=false -openosrs.externalRepos= -openosrs.localSync=true -openosrs.opacityPercentage=100 -openosrs.warning=true -opponentinfo.hitpointsDisplayStyle=HITPOINTS -opponentinfo.lookupOnInteraction=false -opponentinfo.showOpponentsInMenu=false -party.pingHotkey=0\:0 -party.pings=true -party.recolorNames=true -party.sounds=true -party.statusOverlayHealth=false -party.statusOverlayPrayer=false -party.statusOverlayRenderSelf=true -party.statusOverlaySpec=false -party.statusOverlayStamina=false -party.statusOverlayVeng=true -playerindicators.clanChatMemberColor=-14413909 -playerindicators.clanchatMenuIcons=true -playerindicators.clanMemberColor=-5635841 -playerindicators.clanMenuIcons=true -playerindicators.colorPlayerMenu=true -playerindicators.drawClanChatMemberNames=true -playerindicators.drawClanMemberNames=true -playerindicators.drawFriendNames=true -playerindicators.drawMinimapNames=false -playerindicators.drawNonClanMemberNames=false -playerindicators.drawOwnName=false -playerindicators.drawPartyMembers=true -playerindicators.drawPlayerTiles=false -playerindicators.drawTeamMemberNames=true -playerindicators.friendNameColor=-16725933 -playerindicators.nonClanMemberColor=-65536 -playerindicators.ownNameColor=-16729900 -playerindicators.partyMemberNameColor=-1410213 -playerindicators.playerNamePosition=ABOVE_HEAD -playerindicators.teamMemberColor=-15503625 -poh.showAltar=true -poh.showBurner=true -poh.showDigsitePendant=true -poh.showExitPortal=true -poh.showGlory=true -poh.showJewelleryBox=true -poh.showMagicTravel=true -poh.showMythicalCape=true -poh.showPools=true -poh.showPortalNexus=true -poh.showPortals=true -poh.showRepairStand=true -poh.showSpellbook=true -poh.showXericsTalisman=true -poison.changeHealthIcon=true -poison.showInfoboxes=false -prayer.prayerBarHideIfNonCombat=false -prayer.prayerBarHideIfNotPraying=true -prayer.prayerFlickAlwaysOn=false -prayer.prayerFlickLocation=NONE -prayer.prayerIndicator=false -prayer.prayerIndicatorOverheads=false -prayer.replaceOrbText=false -prayer.showPrayerBar=false -prayer.showPrayerDoseIndicator=true -prayer.showPrayerTooltip=true -probability_calculator.decimalPlaces=2 -puzzlesolver.displayRemainingMoves=true -puzzlesolver.displaySolution=true -puzzlesolver.drawDots=false -pyramidplunder.hideTimer=true -pyramidplunder.highlightContainersColor=-256 -pyramidplunder.highlightDoors=true -pyramidplunder.highlightDoorsColor=-16711936 -pyramidplunder.highlightedChestFloor=9 -pyramidplunder.highlightedSarcophagusFloor=9 -pyramidplunder.highlightSpeartrapColor=-14336 -pyramidplunder.highlightSpeartraps=true -pyramidplunder.highlightUrnsFloor=9 -pyramidplunder.showExactTimer=true -pyramidplunder.timerLowWarning=30 -raids.ccDisplay=false -raids.enableLayoutWhitelist=false -raids.enableRotationWhitelist=false -raids.layoutMessage=false -raids.pointsMessage=true -raids.raidsTimer=true -raids.scoutOverlay=true -raids.scoutOverlayAtBank=true -raids.scoutOverlayInRaid=false -raids.screenshotHotkey=0\:0 -raids.uploadScreenshot=CLIPBOARD -randomevents.notifyAll=false -randomevents.notifyBeekeeper=false -randomevents.notifyBob=false -randomevents.notifyDemon=false -randomevents.notifyDunce=false -randomevents.notifyForester=false -randomevents.notifyFrog=false -randomevents.notifyGenie=false -randomevents.notifyGravedigger=false -randomevents.notifyJekyll=false -randomevents.notifyMoM=false -randomevents.notifyQuiz=false -randomevents.notifySandwich=false -randomevents.removeMenuOptions=true -regenmeter.notifyBeforeHpRegenDuration=0 -regenmeter.showHitpoints=true -regenmeter.showSpecial=true -regenmeter.showWhenNoChange=false -regionlocker.blacklistedBorderColor=-926416813 -regionlocker.blockWalk=false -regionlocker.onlyShowBlacklist=false -regionlocker.regionBorderColor=-939472813 -regionlocker.regionBorderWidth=1 -regionlocker.renderRegionBorders=false -regionlocker.unlockRealms=true -regionlocker.unlockUnderground=true -reorderprayers.prayerOrder=THICK_SKIN,BURST_OF_STRENGTH,CLARITY_OF_THOUGHT,SHARP_EYE,MYSTIC_WILL,ROCK_SKIN,SUPERHUMAN_STRENGTH,IMPROVED_REFLEXES,RAPID_RESTORE,RAPID_HEAL,PROTECT_ITEM,HAWK_EYE,MYSTIC_LORE,STEEL_SKIN,ULTIMATE_STRENGTH,INCREDIBLE_REFLEXES,PROTECT_FROM_MAGIC,PROTECT_FROM_MISSILES,PROTECT_FROM_MELEE,EAGLE_EYE,MYSTIC_MIGHT,RETRIBUTION,REDEMPTION,SMITE,CHIVALRY,PIETY,PRESERVE,RIGOUR,AUGURY -reorderprayers.unlockPrayerReordering=false -reportButton.switchTimeFormat=TIME_12H -reportButton.time=LOGIN_TIME -roofremoval.overridePOH=false -roofremoval.removeBetween=true -roofremoval.removeDestination=true -roofremoval.removeHovered=true -roofremoval.removePosition=true -runecraft.degradingNotification=true -runecraft.hightlightDarkMage=true -runecraft.showAir=true -runecraft.showBlood=true -runecraft.showBody=true -runecraft.showChaos=true -runecraft.showClickBox=true -runecraft.showCosmic=true -runecraft.showDeath=true -runecraft.showEarth=true -runecraft.showFire=true -runecraft.showLaw=true -runecraft.showMind=true -runecraft.showNature=true -runecraft.showRifts=true -runecraft.showSoul=true -runecraft.showWater=true -runelite.accountplugin=false -runelite.agilityplugin=true -runelite.alorahdplugin=false -runelite.ammoplugin=false -runelite.antidragplugin=true -runelite.attackstylesplugin=false -runelite.automaticResizeType=KEEP_GAME_SIZE -runelite.bankplugin=false -runelite.banktagsplugin=false -runelite.bankxpvalueplugin=false -runelite.barbarianassaultplugin=false -runelite.barrowsplugin=false -runelite.blastfurnaceplugin=false -runelite.blastmineplugin=false -runelite.blockExtraMouseButtons=true -runelite.boostsplugin=false -runelite.bosstimersplugin=false -runelite.cameraplugin=true -runelite.cannonplugin=false -runelite.chatchannelplugin=false -runelite.chatcommandsplugin=false -runelite.chathistoryplugin=false -runelite.clientBounds=181\:100\:773\:534 -runelite.cluescrollplugin=false -runelite.combatlevelplugin=false -runelite.containInScreen2=RESIZING -runelite.cookingplugin=false -runelite.corpplugin=false -runelite.coxlightcolorsplugin=false -runelite.crowdsourcingplugin=false -runelite.dailytasksplugin=false -runelite.defaultworldplugin=true -runelite.devtoolsplugin=false -runelite.diaryrequirementsplugin=false -runelite.discordplugin=false -runelite.dragHotkey=0\:512 -runelite.entityhiderplugin=true -runelite.examineplugin=false -runelite.externalPlugins=morghttpclient,statussocket -runelite.fairyringplugin=false -runelite.feedplugin=false -runelite.fightcavewavesplugin=false -runelite.fishingplugin=true -runelite.flashNotification=DISABLED -runelite.fontType=SMALL -runelite.friendlistplugin=false -runelite.friendnotesplugin=false -runelite.gameAlwaysOnTop=false -runelite.gameSize=800x800 -runelite.gpuplugin=false -runelite.grandexchangeplugin=false -runelite.grounditemsplugin=true -runelite.groundmarkerplugin=true -runelite.hdplugin=false -runelite.herbiboarplugin=false -runelite.hiscoreplugin=false -runelite.hunterplugin=false -runelite.implingsplugin=false -runelite.infoboxFontType=REGULAR -runelite.infoBoxSize=35 -runelite.infoBoxTextOutline=false -runelite.infoBoxVertical=false -runelite.infoplugin=true -runelite.instancemapplugin=false -runelite.interfaceFontType=REGULAR -runelite.inventorysetupsplugin=false -runelite.inventorytagsplugin=true -runelite.itemchargeplugin=false -runelite.itemstatplugin=false -runelite.kourendlibraryplugin=false -runelite.lockWindowSize=false -runelite.loginscreenplugin=false -runelite.loottrackerplugin=false -runelite.mahoganyhomesplugin=false -runelite.menuEntryShift=true -runelite.menuentryswapperplugin=true -runelite.menuswapperplugin=false -runelite.minimapplugin=true -runelite.miningplugin=false -runelite.mousehighlightplugin=false -runelite.musicplugin=false -runelite.nightmarezoneplugin=false -runelite.notesplugin=false -runelite.notificationFlashColor=1191116800 -runelite.notificationFocused=false -runelite.notificationGameMessage=false -runelite.notificationRequestFocus=OFF -runelite.notificationSound=NATIVE -runelite.notificationTimeout=10000 -runelite.notificationTray=false -runelite.npcindicatorsplugin=true -runelite.objectindicatorsplugin=true -runelite.opponentinfoplugin=true -runelite.overlayBackgroundColor=-1673118414 -runelite.panelToggleKey=123\:128 -runelite.pestcontrolplugin=false -runelite.pinnedPlugins=Agility,Anti Drag,Camera,Entity Hider,Fishing,Ground Items,Info Panel,Inventory Tags,Menu Entry Swapper,Minimap,NPC Indicators,Object Markers,Opponent Information,Quest List,Runecraft,Status Bars,Wiki,Woodcutting,World Hopper,XP Tracker -runelite.playerindicatorsplugin=false -runelite.pohplugin=false -runelite.poisonplugin=false -runelite.prayerplugin=false -runelite.profileMigrationDone=1 -runelite.puzzlesolverplugin=false -runelite.raidsplugin=false -runelite.regenmeterplugin=false -runelite.regionlockerplugin=false -runelite.rememberScreenBounds=true -runelite.reorderprayersplugin=false -runelite.reportbuttonplugin=false -runelite.runenergyplugin=false -runelite.runepouchplugin=false -runelite.screenmarkerplugin=false -runelite.screenshotplugin=false -runelite.shortestpathplugin=false -runelite.sidebarToggleKey=122\:128 -runelite.skillcalculatorplugin=false -runelite.skillstabprogressbarsplugin=false -runelite.slayerplugin=false -runelite.smeltingplugin=false -runelite.statusbarsplugin=true -runelite.statussocketplugin=true -runelite.stretchedmodeplugin=false -runelite.tearsofguthixplugin=false -runelite.temporossplugin=false -runelite.timersplugin=false -runelite.timetrackingplugin=false -runelite.tithefarmplugin=false -runelite.tooltipFontType=SMALL -runelite.tooltipPosition=UNDER_CURSOR -runelite.trayIcon=true -runelite.uiEnableCustomChrome=true -runelite.uiWindowOpacity=100 -runelite.usernameInTitle=false -runelite.useWikiItemPrices=true -runelite.warningOnExit=LOGGED_IN -runelite.wintertodtplugin=false -runelite.woodcuttingplugin=true -runelite.worldmapplugin=false -runelite.xpdropplugin=false -runelite.xptrackerplugin=true -runenergy.replaceOrbText=false -runenergy.ringOfEnduranceChargeMessage=true -runepouch.fontcolor=-256 -runepouch.runeicons=true -runepouch.runePouchOverlayMode=BOTH -screenshot.baHighGamble=false -screenshot.boss=false -screenshot.ccKick=false -screenshot.clanDeath=false -screenshot.collectionLogEntries=true -screenshot.combatAchievements=true -screenshot.displayDate=true -screenshot.duels=false -screenshot.friendDeath=false -screenshot.hotkey=0\:0 -screenshot.includeFrame=true -screenshot.kills=false -screenshot.kingdom=true -screenshot.levels=true -screenshot.notifyWhenTaken=true -screenshot.pets=true -screenshot.playerDeath=false -screenshot.rewards=true -screenshot.untradeableDrop=false -screenshot.uploadScreenshot=NEITHER -screenshot.valuableDrop=false -screenshot.valuableDropThreshold=0 -shortestPath.avoidWilderness=true -shortestPath.cancelInstead=false -shortestPath.drawCollisionMap=false -shortestPath.drawMap=true -shortestPath.drawMinimap=true -shortestPath.drawTiles=true -shortestPath.drawTransports=false -shortestPath.finishDistance=5 -shortestPath.recalculateDistance=10 -skillCalculator.automaticUpdating=false -skillstabprogressbars.backgroundColor=-16777216 -skillstabprogressbars.barHeight=2 -skillstabprogressbars.goalBarEndColor=-65408 -skillstabprogressbars.goalBarStartColor=-16776961 -skillstabprogressbars.indent=true -skillstabprogressbars.progressBarEndColor=-16711936 -skillstabprogressbars.progressBarStartColor=-65536 -skillstabprogressbars.showGoals=false -skillstabprogressbars.showOnlyOnHover=false -skillstabprogressbars.virtualLevels=false -slayer.amount=-1 -slayer.expeditious=-1 -slayer.highlightHull=false -slayer.highlightOutline=false -slayer.highlightTargets=false -slayer.highlightTile=false -slayer.infobox=true -slayer.initialAmount=-1 -slayer.itemoverlay=true -slayer.points=-1 -slayer.slaughter=-1 -slayer.statTimeout=5 -slayer.streak=-1 -slayer.superiornotification=true -slayer.targetColor=-65536 -slayer.taskCommand=true -slayer.weaknessPrompt=true -smelting.statTimeout=5 -specialcounter.arclightThreshold=0 -specialcounter.bandosGodswordThreshold=0 -specialcounter.bulwarkThreshold=0 -specialcounter.darklightThreshold=0 -specialcounter.dragonWarhammerThreshold=0 -specialcounter.infobox=true -specialcounter.specDropColor=-1 -specialcounter.specDrops=true -specialcounter.thresholdNotification=false -statusbars.barWidth=20 -statusbars.enableCounter=true -statusbars.enableRestorationBars=false -statusbars.enableSkillIcon=true -statusbars.hideAfterCombatDelay=0 -statusbars.leftBarMode=HITPOINTS -statusbars.rightBarMode=PRAYER -statussocket.endpoint=http\://localhost\:5000 -stretchedmode.increasedPerformance=false -stretchedmode.integerScaling=false -stretchedmode.keepAspectRatio=false -stretchedmode.scalingFactor=50 -suppliestracker.blowpipeAmmo=MITHRIL -suppliestracker.chargesBox=false -suppliestracker.vorkathsHead=false -teamCapes.clanChatMemberCounter=false -teamCapes.friendsChatMemberCounter=false -teamCapes.minimumCapeCount=1 -teamCapes.teamCapesOverlay=false -tearsofguthix.blueTearsColor=1677787135 -tearsofguthix.greenTearsColor=1677786880 -tearsofguthix.showGreenTearsTimer=true -tempoross.damageIndicator=true -tempoross.doubleSpotColor=-16711681 -tempoross.doubleSpotNotification=false -tempoross.fireColor=-14336 -tempoross.fireNotification=false -tempoross.fishIndicator=true -tempoross.highlightDoubleSpot=true -tempoross.highlightFires=true -tempoross.phaseIndicator=true -tempoross.poleBrokenColor=-65536 -tempoross.tetheredColor=-16711936 -tempoross.useWaveTimer=true -tempoross.vulnerableNotification=false -tempoross.waveNotification=false -tempoross.waveTimerColor=-16711681 -textrecolor.opaqueClanChatGuestMessageHighlight=-16777216 -textrecolor.opaqueClanChatInfo=-16777216 -textrecolor.opaqueClanChatInfoHighlight=-65536 -textrecolor.opaqueClanChatMessageHighlight=-16777216 -textrecolor.opaqueClanGuestInfoHighlight=-65536 -textrecolor.opaqueClanInfoHighlight=-65536 -textrecolor.opaqueClanMessageHighlight=-16777216 -textrecolor.opaqueExamineHighlight=-16776961 -textrecolor.opaqueGameMessageHighlight=-1109984 -textrecolor.opaquePrivateMessageReceivedHighlight=-16767101 -textrecolor.opaquePrivateMessageSentHighlight=-16767101 -textrecolor.opaquePublicChatHighlight=-16777216 -textrecolor.transparentClanChatGuestMessageHighlight=-1 -textrecolor.transparentClanChatInfo=-1 -textrecolor.transparentClanChatInfoHighlight=-65536 -textrecolor.transparentClanChatMessageHighlight=-1 -textrecolor.transparentClanGuestInfoHighlight=-65536 -textrecolor.transparentClanInfoHighlight=-65536 -textrecolor.transparentClanMessageHighlight=-1 -textrecolor.transparentExamineHighlight=-16711936 -textrecolor.transparentGameMessageHighlight=-1109984 -textrecolor.transparentPrivateMessageReceivedHighlight=-1 -textrecolor.transparentPrivateMessageSentHighlight=-1 -textrecolor.transparentPublicChatHighlight=-1 -tileindicators.currentTileBorderWidth=2.0 -tileindicators.currentTileFillColor=838860800 -tileindicators.destinationTileBorderWidth=2.0 -tileindicators.destinationTileFillColor=838860800 -tileindicators.highlightCurrentColor=-16711681 -tileindicators.highlightCurrentTile=false -tileindicators.highlightDestinationColor=-8355712 -tileindicators.highlightDestinationTile=true -tileindicators.highlightHoveredColor=0 -tileindicators.highlightHoveredTile=false -tileindicators.hoveredTileBorderWidth=2.0 -tileindicators.hoveredTileFillColor=838860800 -timers.showAbyssalSireStun=true -timers.showAntiFire=true -timers.showAntipoison=true -timers.showArceuus=true -timers.showArceuusCooldown=false -timers.showBlessedCrystalScarab=true -timers.showBoosterTimers=true -timers.showCannon=true -timers.showCharge=true -timers.showDeathTimer=true -timers.showDfsSpecial=true -timers.showDivine=true -timers.showFreezes=true -timers.showGodTimer=true -timers.showGodWarsAltar=true -timers.showHomeMinigameTeleports=true -timers.showImbuedHeart=true -timers.showLiquidAdrenaline=true -timers.showMagicImbue=true -timers.showOverload=true -timers.showPickpocketStun=true -timers.showPrayerEnhance=true -timers.showRejuvTimer=true -timers.showSilkDressing=true -timers.showStaffOfTheDead=true -timers.showStamina=true -timers.showTeleblock=true -timers.showTzhaarTimers=true -timers.showVengeance=true -timers.showVengeanceActive=true -timers.showVoteBonus=true -timers.showWellTimer=true -timestamp.format=[HH\:mm] -timetracking.activeTab=CLOCK -timetracking.birdHouseNotification=false -timetracking.defaultTimerMinutes=5 -timetracking.farmingContractInfoBox=true -timetracking.preferSoonest=false -timetracking.sortOrder=NONE -timetracking.timeFormatMode=ABSOLUTE_24H -timetracking.timerNotification=false -timetracking.timerWarningThreshold=10 -tithefarmplugin.hexColorGrown=-16721664 -tithefarmplugin.hexColorUnwatered=-17664 -tithefarmplugin.hexColorWatered=-16737793 -virtuallevels.virtualTotalLevel=true -wiki.leftClickSearch=false -wintertodt.damageNotificationColor=-16711681 -wintertodt.notifyBrazierDamage=INTERRUPT -wintertodt.notifyBrazierOut=true -wintertodt.notifyCold=INTERRUPT -wintertodt.notifyEmptyInv=true -wintertodt.notifyFullInv=true -wintertodt.notifySnowfall=INTERRUPT -wintertodt.roundNotification=5 -wintertodt.showOverlay=true -woodcutting.clueNestNotifyTier=HARD -woodcutting.showNestNotification=false -woodcutting.showRedwoods=false -woodcutting.showRespawnTimers=false -woodcutting.showWoodcuttingStats=true -woodcutting.statTimeout=1 -worldhopper.displayPing=false -worldhopper.menuOption=true -worldhopper.nextKey=39\:192 -worldhopper.ping=true -worldhopper.previousKey=37\:192 -worldhopper.quickhopOutOfDanger=true -worldhopper.quickHopRegionFilter=[] -worldhopper.regionFilter=[] -worldhopper.showMessage=true -worldhopper.showSidebar=true -worldhopper.subscriptionFilter=BOTH -worldmap.agilityCourseRooftopIcon=true -worldmap.agilityCourseTooltips=true -worldmap.agilityShortcutIcon=true -worldmap.agilityShortcutTooltips=true -worldmap.ancientSpellbookIcon=true -worldmap.arceuusSpellbookIcon=true -worldmap.dungeonTooltips=true -worldmap.fairyRingIcon=true -worldmap.fairyRingTooltips=true -worldmap.farmingpatchTooltips=true -worldmap.fishingSpotTooltips=true -worldmap.hunterAreaTooltips=true -worldmap.jewelleryIcon=true -worldmap.kourendTaskTooltips=true -worldmap.lunarSpellbookIcon=true -worldmap.minigameTooltip=true -worldmap.miningSiteTooltips=true -worldmap.miscellaneousTeleportIcon=true -worldmap.questStartTooltips=true -worldmap.rareTreeIcon=true -worldmap.rareTreeTooltips=true -worldmap.runecraftingAltarIcon=true -worldmap.scrollIcon=true -worldmap.standardSpellbookIcon=true -worldmap.transportationTooltips=true -xpdrop.damageColor=-65536 -xpdrop.fakeXpDropDelay=0 -xpdrop.hideSkillIcons=false -xpdrop.magePrayerColor=-15368019 -xpdrop.meleePrayerColor=-15368019 -xpdrop.rangePrayerColor=-15368019 -xpdrop.showdamagedrops=NONE -xpglobes.alignOrbsVertically=false -xpglobes.enableCustomArcColor=false -xpglobes.enableTooltips=true -xpglobes.hideMaxed=false -xpglobes.Orb\ duration=10 -xpglobes.Orb\ size=40 -xpglobes.Progress\ arc\ color=-14336 -xpglobes.Progress\ arc\ width=2 -xpglobes.Progress\ orb\ background\ color=2139127936 -xpglobes.Progress\ orb\ outline\ color=-16777216 -xpglobes.showActionsLeft=true -xpglobes.showTimeTilGoal=true -xpglobes.showVirtualLevel=false -xpglobes.showXpHour=true -xpglobes.showXpLeft=true -xpTracker.hideMaxed=false -xpTracker.intermediateLevelMarkers=false -xpTracker.logoutPausing=false -xpTracker.onScreenDisplayMode=XP_GAINED -xpTracker.onScreenDisplayModeBottom=XP_HOUR -xpTracker.pauseSkillAfter=0 -xpTracker.prioritizeRecentXpSkills=false -xpTracker.progressBarLabel=PERCENTAGE -xpTracker.progressBarTooltipLabel=TIME_TO_LEVEL -xpTracker.resetSkillRateAfter=0 -xpTracker.skillTabOverlayMenuOptions=true -xpTracker.wiseOldManOpenOption=true -xpTracker.xpPanelLabel1=XP_GAINED -xpTracker.xpPanelLabel2=XP_LEFT -xpTracker.xpPanelLabel3=XP_HOUR -xpTracker.xpPanelLabel4=ACTIONS_LEFT -xpupdater.cml=false -xpupdater.templeosrs=false -xpupdater.wiseoldman=false -zoom.compassLook=true -zoom.compassLookPreservePitch=false -zoom.controlFunction=NONE -zoom.ctrlZoomValue=512 -zoom.ignoreExamine=false -zoom.inner=false -zoom.invertPitch=false -zoom.invertYaw=false -zoom.middleClickMenu=false -zoom.outerLimit=0 -zoom.preserveYaw=false -zoom.relaxCameraPitch=true -zoom.rightClickMovesCamera=false -zoom.zoomIncrement=25 diff --git a/src/model/test/custom_launch/window_test_bot.py b/src/model/test/custom_launch/window_test_bot.py deleted file mode 100644 index 2d00374b..00000000 --- a/src/model/test/custom_launch/window_test_bot.py +++ /dev/null @@ -1,93 +0,0 @@ -""" -This script is used to ensure that the Window properties are being set correctly. -""" - -import contextlib -import time -from pathlib import Path -from typing import List - -import utilities.game_launcher as launcher -from model.bot import Bot, BotStatus -from model.runelite_bot import RuneLiteWindow -from utilities.geometry import Rectangle - - -class WindowTestBot(Bot, launcher.Launchable): - def __init__(self): - self.win: RuneLiteWindow = None - game_title = "Test" - bot_title = "Window Test" - description = ( - "This bot is for testing the new Window feature. Log in to RuneLite and run this script to see how the mouse travels around the UI. This bot also" - " gives an example of how to launch the game with custom settings." - ) - super().__init__( - game_title=game_title, - bot_title=bot_title, - description=description, - window=RuneLiteWindow(window_title="RuneLite"), - ) - - def create_options(self): - pass - - def save_options(self, options: dict): - self.options_set = True - self.log_msg("Options set successfully.") - self.log_msg("Please launch the game via the control panel button above. If RuneLite is already running with the correct settings, ignore this.") - - def launch_game(self): - """ - Since this bot inherits from launcher.Launchable, it must implement this method. This method is called when the user clicks the "Launch Game" button. - The launcher utility has a function that will launch RuneLite with custom settings. This is useful for bots that require lots of setup to run (E.g., minigames, agility, etc.). - """ - settings_path = Path(__file__).parent.joinpath("custom_settings.properties") - launcher.launch_runelite_with_settings(bot=self, settings_file=settings_path) - - def main_loop( - self, - ): - """The first thing that happens when the Play button is pressed is the client window - is scanned and initialized. Then, all of the window properties are available. - The program will let you know if the initialization failed.""" - - # Here, we'll define some points on screen that we'll move the mouse to. - # Format: (message, Rectangle or List[Rectangle], Rectangle to click prior to moving mouse) - spots: List[tuple] = [ - ("Moving to chatbox...", self.win.chat), - ("Moving to control panel...", self.win.control_panel, self.win.cp_tabs[3]), - ("Moving to minimaparea...", self.win.minimap_area), - ("Moving to minimap...", self.win.minimap), - ("Moving to game view...", self.win.game_view), - ("Moving to mouseover area...", self.win.mouseover), - ("Moving to total XP area...", self.win.total_xp), - ("Moving to hp orb text...", self.win.hp_orb_text), - ("Moving to prayer orb text...", self.win.prayer_orb_text), - ("Moving to quick pray orb...", self.win.prayer_orb), - ("Moving to run orb...", self.win.run_orb), - ("Moving to spec orb...", self.win.spec_orb), - ("Moving to compass...", self.win.compass_orb), - ("Moving to control panel tabs...", self.win.cp_tabs), - ("Moving to inv slots...", self.win.inventory_slots), - ("Moving to chat tabs...", self.win.chat_tabs), - ("Moving to normal spells...", self.win.spellbook_normal, self.win.cp_tabs[6]), - ] - for spot_count, spot in enumerate(spots, start=1): - self.log_msg(spot[0]) - with contextlib.suppress(Exception): - self.mouse.move_to(spot[2].get_center()) - self.mouse.click() - if isinstance(spot[1], Rectangle): - self.mouse.move_to(spot[1].get_center()) - else: - for rect in spot[1]: - self.mouse.move_to(rect.get_center(), mouseSpeed="fastest") - time.sleep(0.5) - - self.update_progress(spot_count / len(spots)) - - # If the bot reaches here it has completed its running time. - self.update_progress(1) - self.log_msg("Bot has completed all of its iterations.") - self.set_status(BotStatus.STOPPED) diff --git a/src/model/test/example_bot.py b/src/model/test/example_bot.py deleted file mode 100644 index 91424c32..00000000 --- a/src/model/test/example_bot.py +++ /dev/null @@ -1,161 +0,0 @@ -""" -This file demonstrates how to set up a simple bot. It demonstrates how to implement the functions for -capturing user configuration of the bot, and includes a simulated bot loop that does not have any -side affects during testing. - -To better understand how to implement a bot, please see the documentation for the Bot class as well as -the README/Wiki. -""" -import time - -import utilities.debug as debug -from model.bot import Bot, BotStatus -from utilities.window import MockWindow - - -# Next to the bot name, define the parent class so your bot can inherit its functionality -class ExampleBot(Bot): - def __init__(self): - game_title = "Test" # This will determine the category the bot is listed under in the UI - bot_title = "Example Bot" # This is the name of the bot that will be displayed in the UI - description = ( - "This is where the description of the bot goes. Briefly describe how the bot works " - + "and any important information the user needs to know before starting it." - ) - # If you're writing a bot for a RuneLite-based game, change "MockWindow()" to "RuneLiteWindow("")" below - # If your game uses a custom interface, you can also pass in a custom window class that inherits from RuneLiteWindow - super().__init__(game_title=game_title, bot_title=bot_title, description=description, window=MockWindow()) - # This is where you should initialize any options/properties you want to use in the bot. - # These values should get replaced when the user selects options in the UI, but initial values will be used - # if you want to test the bot without the UI (see bottom of OSBC.py for how to do that). - self.running_time = 1 - self.text_edit_example = None - self.multi_select_example = None - self.menu_example = None - - def create_options(self): - """ - Use the OptionsBuilder to define the options for the bot. For each function call below, - we define the type of option we want to create, its key, a label for the option that the user will - see, and the possible values the user can select. The key is used in the save_options function to - unpack the dictionary of options after the user has selected them. - """ - self.options_builder.add_slider_option("running_time", "How long to run (minutes)?", 1, 180) # max 180 minutes - self.options_builder.add_text_edit_option("text_edit_example", "Text Edit Example", "Placeholder text here") - self.options_builder.add_checkbox_option("multi_select_example", "Multi-select Example", ["A", "B", "C"]) - self.options_builder.add_dropdown_option("menu_example", "Menu Example", ["A", "B", "C"]) - - def save_options(self, options: dict): - """ - For each option in the dictionary, if it is an expected option, save the value as a property of the bot. - If any unexpected options are found, log a warning. If an option is missing, set the options_set flag to - False. - """ - # Unpack the options dictionary received from the Options Menu UI - for option in options: - if option == "running_time": - self.running_time = options[option] - elif option == "text_edit_example": - self.text_edit_example = options[option] - elif option == "multi_select_example": - self.multi_select_example = options[option] - elif option == "menu_example": - self.menu_example = options[option] - else: - # Code will only ever reach this point if there is an issue with how the developer is dealing with options - self.log_msg(f"Unknown option: {option}") - print("Developer: ensure that the option keys are correct, and that options are being unpacked correctly.") - self.options_set = False - return - - # Let the user know what options were set - self.log_msg(f"Bot will run for {self.running_time} minutes.") - self.log_msg(f"Text edit example set to: {self.text_edit_example or 'None'}") - self.log_msg(f"Multi-select example set to: {self.multi_select_example or 'None'}") - self.log_msg(f"Menu example set to: {self.menu_example}") - - # If your bot must launch with custom RL settings (I.e. inherits from `utilities.game_launcher.Launchable`), please notify the user - # here that they should launch the game via the `Launch Game` button above. - - # Set the `options_set` flag to True to allow underlying code to continue - self.options_set = True - - def main_loop(self): - """ - When implementing this function, you have the following responsibilities: - 1. If you need to halt the bot from within this function, call `self.stop()`. You'll want to do this - when the bot has made a mistake, gets stuck, or a condition is met that requires the bot to stop. - 2. Frequently call self.update_progress() and self.log_msg() to send information to the UI. - 3. At the end of the main loop, make sure to set the status to STOPPED. - - Additional notes: - Make use of Bot/RuneLiteBot member functions. There are many functions to simplify various actions. - Visit the Wiki for more. - """ - - # --- SCENARIO EXPLANATION --- - """ - This ExampleBot script simulates a character moving between Location A and B. `time.sleep()` is used to - simulate the bot waiting for conditions. Depending on your bot, it might be wise to add variables that - keep track of progress, failed-attempts, etc. - """ - player_position = "A" - times_walked = 0 - - # --- CLIENT SETUP --- - """ - Before entering the bot loop, consider configuring the client window (E.g., setting auto-retaliate on/off, - making sure the inventory tab is open, etc.). This is not required, but it can be useful. - """ - # self.set_auto_retaliate(True) # <-- turns on auto-retaliate - # self.mouse.move_to(self.win.inventory_tabs[3].random_point()) # <-- moves the mouse to the inventory tab - - # --- MAIN LOOP --- - """ - All bots should have a continous loop that runs until the some condition is met. In this case, we want to - run the bot for a certain amount of time the user specified when they selected the bot's options. - You may change this however you like (E.g., you may want to run the bot for a fixed number of iterations/kills instead). - """ - start_time = time.time() # get the current time in seconds - end_time = self.running_time * 60 # convert the running time to seconds - while time.time() - start_time < end_time: # check if the elapsed time is less than the final running time - # Character is at point A - self.log_msg("Character is at point A") - - # Move character until it reachers point B - steps_remaining = 4 # Lets pretend it takes 4 steps to move from A to B - while player_position != "B": - # We'll simulate the player getting one step closer by decrementing the `steps_remaining` by 1. - steps_remaining -= 1 - time.sleep(2) - - # Inform the user where the character is - if steps_remaining == 0: - self.log_msg("Character is at point B") - player_position = "B" - elif steps_remaining == 1: - self.log_msg("Character is very close to B...") - elif steps_remaining == 2: - self.log_msg("Character is still walking...") - elif steps_remaining == 3: - self.log_msg("Character is walking to point B...") - - time.sleep(2) - # Since the loop has terminated, we know the character is at point B. - # We'll inform the user how many times the character has walked from A to B so far. - times_walked += 1 - self.log_msg(f"Player has walked from A to B {times_walked} time(s).") - - # We'll also update the progress bar on the UI. - self.update_progress((time.time() - start_time) / end_time) # value between 0 and 1 - - # Now, the player teleports back to point `A` - time.sleep(2) - self.log_msg("Character is teleporting back to point A...") - time.sleep(2) - player_position = "A" - - # If the bot reaches here it has completed its running time. - self.update_progress(1) - self.log_msg("Bot has completed all of its iterations.") - self.set_status(BotStatus.STOPPED) diff --git a/src/utilities/game_launcher.py b/src/utilities/game_launcher.py index 8d8836fd..fde68f27 100644 --- a/src/utilities/game_launcher.py +++ b/src/utilities/game_launcher.py @@ -6,11 +6,15 @@ import tkinter as tk from pathlib import Path from tkinter import filedialog +from typing import Callable, Union import psutil -runelite_settings_folder: Path = Path(__file__).parent.parent.joinpath("runelite_settings") -executable_paths: str = str(runelite_settings_folder.joinpath("executable_paths.json")) +RL_SETTINGS_FOLDER_PATH: Path = Path(__file__).parent.parent.joinpath("runelite_settings") +# Path to the file containing the paths to the executables for each game title. +EXECUTABLES_PATH: str = str(RL_SETTINGS_FOLDER_PATH.joinpath("executable_paths.json")) +# Path to the file containing the paths to the profile manager folders for each game title. +PM_PATH: str = str(RL_SETTINGS_FOLDER_PATH.joinpath("profile_manager_paths.json")) class Launchable: @@ -34,67 +38,189 @@ def is_program_running(program_name): return False -def launch_runelite_with_settings(bot, settings_file: Path): +def launch_runelite(properties_path: Path, game_title: str, use_profile_manager: bool, profile_name: str = "temp", callback: Callable = print) -> bool: """ - Launches the game with the specified RuneLite settings file. If it fails to - find the executable, it will prompt the user to locate the executable. + Launches the game with the specified RuneLite settings file. If it fails to find the executable, it will prompt the user to locate the executable. Args: - bot: The bot object. - settings_file: The path to the settings file to use. If not specified, the default - settings file will be selected according to the bot's game_title. - E.g., if the game title is "OSRS", the default settings file - will be "osrs_settings.properties". + properties_path: The path to the plugin properties file to use. + game_title: The title of the game to launch. This value should be supplied by the bot's `game_title` + attribute. + use_profile_manager: Whether to use the RuneLite Profile Manager to load the properties file. + Toggle True if using RuneLite v1.9.11 or newer. + profile_name: The name of the profile to overwrite. This is only used if `use_profile_manager` is True. If you set this value, choose something + very specific & unique. If a profile is found with this name, it will be overwritten. + callback: The function that is called with the output of the process. This function must accept a + string as its only positional argument. This may be called with keyword arguments (see notes). + Returns: + True if the game was launched successfully, False otherwise. + Notes: + The callback function may be called with keyword arguments. The following keyword arguments are + passed to the callback function: + - # TODO: ADD KEYWORD ARGS """ # Try to read the file and parse the JSON data - try: - with open(executable_paths, "r") as f: - data = json.load(f) - except (FileNotFoundError, json.decoder.JSONDecodeError): - data = {} - - # If the file doesn't exist, create it - if not os.path.exists(executable_paths): - Path(executable_paths).touch() + data = __read_json(path=EXECUTABLES_PATH, touch_file=True) # Check if the game's executable path exists in the JSON file - key = bot.game_title.lower() - EXECPATH = data.get(key, "") + game_title = game_title.lower() + EXECPATH = data.get(game_title, "") # Check if executable file exists if not os.path.exists(EXECPATH): - bot.log_msg("Game executable not found. Please locate the executable.") + callback("Game executable not found. Please locate the executable.") EXECPATH = __locate_executable() if not EXECPATH: - bot.log_msg("File not selected.") - return - data[key] = EXECPATH - with open(executable_paths, "w") as f: + callback("File not selected.") + return False + data[game_title] = EXECPATH + # Save the executable path to the JSON file + with open(EXECUTABLES_PATH, "w") as f: json.dump(data, f) - bot.log_msg("Executable path saved.") + callback("Executable path saved.") # Save settings file to temp - if settings_file: - bot.log_msg("Launching with custom settings.") + src_path = properties_path + + """ + This conditional block decides how the plugin .properties file is loaded into the game. + If `use_profile_manager` is True, a special profile is built and added directly to RuneLite. + Otherwise, the legacy method takes place, where the properties file is copied within OSBC's + filesystem and RuneLite is instructed to load the file from there. + """ + if use_profile_manager: + # Set up a new profile in the profile manager folder for the game + dst_path = __configure_profile_manager(game_title, callback, profile_name) + # Set the executable args to use the new profile manager command + EXECARG2 = f"--profile={profile_name}" else: - bot.log_msg(f"Launching with base {bot.game_title} settings file.") - settings_file = runelite_settings_folder.joinpath(f"{bot.game_title}_settings.properties") - src_path = settings_file - dst_path = os.path.join(runelite_settings_folder, "temp.properties") + # Set the destination path to a temporary location in OSBC + dst_path = os.path.join(RL_SETTINGS_FOLDER_PATH, "temp.properties") + EXECARG2 = f"--config={dst_path} --sessionfile=bot_session" + shutil.copyfile(src_path, dst_path) # Executable args for runelite to direct the client to launch with bot settings EXECARG1 = "--clientargs" - EXECARG2 = f"--config={dst_path} --sessionfile=bot_session" # Launch the game if platform.system() == "Windows": subprocess.Popen([EXECPATH, EXECARG1, EXECARG2], creationflags=subprocess.DETACHED_PROCESS) else: subprocess.Popen([EXECPATH, EXECARG1, EXECARG2], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, start_new_session=True) - bot.log_msg("Game launched. Please wait until you've logged into the game before starting the bot.") + callback("Game launched. Please wait until you've logged into the game before starting the bot.") + return True -def __locate_executable(): +def reset_saved_paths(game_title: str, callback: Callable = print): + """ + Resets the saved executable/profile storage paths for the specified game title. + Args: + game_title: The title of the game to reset the executable/profile storage paths for. + callback: The function that is called with the output of the process. This function must accept a + string as its only positional argument. + """ + try: + key = game_title.lower() + if os.path.exists(EXECUTABLES_PATH): + __del_key_from_json(EXECUTABLES_PATH, key) + if os.path.exists(PM_PATH): + __del_key_from_json(PM_PATH, key) + except json.decoder.JSONDecodeError: + callback(text=f"An error occurred while resetting the storage paths. One or more JSON file in {RL_SETTINGS_FOLDER_PATH} is corrupt.") + return + + callback(text=f"{game_title} executable & profile storage paths has been reset.") + + +def __configure_profile_manager(game_title: str, callback: Callable, profile_name: str): + """ + Sets up a new profile in the profile manager folder for the game. This function does the following: + - If it is not saved in OSBC's settings, the user is prompted to locate the game's profile manager folder. + - The `profiles.json` file is read from the folder. This file contains a list of all profiles that RuneLite + is aware of. For each profile, we: + - Save the ID to a list. This is used to generate a new unique ID for our new profile. + - Set the `active` flag to False. This is so that the profile is not loaded when the game is launched. + - Remove the profile if it has the same name as the profile we are creating. All profiles should have + unique names and IDs in order to be launchable from the terminal. + - A new profile is created with the specified name and a unique ID. If a profile with the same name already + existed, we'll recycle its ID to prevent endless file creation. This profile is set to `active`. + - The `profiles.json` file is saved back to the folder. + Args: + game_title: The title of the game to set up a new profile for. + callback: The callback used by the parent function. + profile_name: The name of the profile to create. + Returns: + The path (including its filename) that the new profile should be saved to. + """ + # Get the profiles folder + pm_data = __read_json(path=PM_PATH, touch_file=True) + profiles_folder_path = pm_data.get(game_title, "") + if not os.path.exists(profiles_folder_path): + callback("Profile folder not found. Please locate the folder.") + profiles_folder_path = __locate_folder(prompt="Select the Profile Manager folder for this game (usually .runelite/profiles2/).") + if not profiles_folder_path: + callback("Folder not selected.") + return + pm_data[game_title] = profiles_folder_path + with open(PM_PATH, "w") as f: + json.dump(pm_data, f) + callback("Profile folder saved.") + + # Open the `profiles.json` file + profiles_json_path = Path(profiles_folder_path).joinpath("profiles.json") + if not os.path.exists(profiles_json_path): + callback("Profile list not found. Please create a profile in the Profile Manager.") + return + with open(profiles_json_path, "r") as f: + profiles: dict = json.load(f) + + # We need to record all IDs to ensure we don't create a duplicate + # IDs span all profiles regardless of their name + all_ids = [] + tmp_profile_id = None + for profile in profiles["profiles"]: + if profile["name"] == profile_name: + tmp_profile_id = profile["id"] + callback("Removing duplicate profile.") + profiles["profiles"].remove(profile) + continue + profile["active"] = False + all_ids.append(profile["id"]) + + # Create a new profile record + callback("Creating new profile.") + if tmp_profile_id is None: + tmp_profile_id = 0 + while tmp_profile_id in all_ids: + tmp_profile_id += 1 + tmp_profile = {"id": tmp_profile_id, "name": profile_name, "sync": False, "active": True, "rev": -1} + profiles["profiles"].append(tmp_profile) + + # Save the JSON file + with open(profiles_json_path, "w") as f: + json.dump(profiles, f) + callback("Profile list updated.") + + # Append the id to the name of the new profile file + tmp_filename = f"{profile_name}-{tmp_profile_id}.properties" + return os.path.join(profiles_folder_path, tmp_filename) + + +def __del_key_from_json(filename: str, key: str): + """ + Deletes the specified key from a JSON file. + """ + data = None + with open(filename, "r") as f: + data = json.load(f) + if key in data: + del data[key] + if data: + with open(filename, "w") as f: + json.dump(data, f) + + +def __locate_executable() -> Union[str, None]: """ Opens a file dialog to allow the user to locate the game executable. """ @@ -114,3 +240,44 @@ def __locate_executable(): path_str = str(file_path) root.destroy() return path_str + + +def __locate_folder(prompt: str) -> Union[str, None]: + """ + Opens a folder dialog to allow the user to locate a folder path. + """ + root = tk.Tk() + root.withdraw() + # TODO: May need to make separate prompts for Linux + folder_path = filedialog.askdirectory(title=prompt) + try: + if not folder_path: + root.destroy() + return None + folder_path = Path(folder_path) + except TypeError: + root.destroy() + return None + path_str = str(folder_path) + root.destroy() + return path_str + + +def __read_json(path: str, touch_file: bool) -> dict: + """ + Reads the JSON file at the specified path and returns the data as a dictionary. + Args: + path: The path to the JSON file. + touch_file: Whether to create the file if it doesn't exist. + Returns: + The data from the JSON file as a dictionary. + """ + # Try to read the file and parse the JSON data + try: + with open(path, "r") as f: + data = json.load(f) + except (FileNotFoundError, json.decoder.JSONDecodeError): + data = {} + if touch_file and not os.path.exists(path): + Path(path).touch() + return data diff --git a/src/utilities/settings.py b/src/utilities/settings.py index 0f87b50e..7e9e1cba 100644 --- a/src/utilities/settings.py +++ b/src/utilities/settings.py @@ -37,6 +37,23 @@ def get(key): return data.get(key) +def delete(key): + """ + Deletes a value from the settings file based on a key. + """ + # Open the file and load the data + try: + with open(SETTINGS_PATH, "rb") as f: + data = pickle.load(f) + except FileNotFoundError: + return + # Delete the given key + del data[key] + # Save the data back to the file + with open(SETTINGS_PATH, "wb") as f: + pickle.dump(data, f) + + default_keybind = {keyboard.Key.shift, keyboard.Key.enter} diff --git a/src/view/home_view_runelite.py b/src/view/home_view_runelite.py index 929c400e..9438e2cb 100644 --- a/src/view/home_view_runelite.py +++ b/src/view/home_view_runelite.py @@ -1,16 +1,6 @@ -import json -import os -import platform -import shutil -import subprocess -import tkinter as tk -from pathlib import Path -from tkinter import filedialog -from tkinter.filedialog import askopenfilename - import customtkinter -from utilities.game_launcher import executable_paths +import utilities.game_launcher as launcher class RuneLiteHomeView(customtkinter.CTkFrame): @@ -79,7 +69,7 @@ def __init__(self, parent, main, game_title: str): self.btn_replace = customtkinter.CTkButton( master=self, text=f"Launch {game_title}", - command=self.__launch_game_with_settings, + command=self.__launch, ) self.btn_replace.grid(row=5, column=0, sticky="nwes", padx=40, pady=(0, 15)) @@ -111,94 +101,33 @@ def __init__(self, parent, main, game_title: str): lambda e: self.label_status.configure(wraplength=self.label_status.winfo_width() - 20), ) - def __launch_game_with_settings(self): + def __launch(self): """ - Launches the game with the specified RuneLite settings file. If it fails to - find the executable, it will prompt the user to locate the executable. + Launches the game with the default RuneLite settings file. """ - # Try to read the file and parse the JSON data - try: - with open(executable_paths, "r") as f: - data = json.load(f) - except (FileNotFoundError, json.decoder.JSONDecodeError): - data = {} - - # If the file doesn't exist, create it - if not os.path.exists(executable_paths): - Path(executable_paths).touch() - - # Check if the game's executable path exists in the JSON file - key = self.__game_title.lower() - EXECPATH = data.get(key, "") - - # Check if executable file exists - if not os.path.exists(EXECPATH): - self.label_status.configure( - text="RuneLite not found. Please locate the executable.", - text_color="orange", - ) - EXECPATH = self.__locate_executable() - if not EXECPATH: - self.label_status.configure(text="File not selected.", text_color="orange") - return - data[key] = EXECPATH - with open(executable_paths, "w") as f: - json.dump(data, f) - - # Save settings file to temp - PATH = Path(__file__).parent.parent.resolve() - src_path = os.path.join(PATH, "runelite_settings", f"{key}_settings.properties") - dst_path = os.path.join(PATH, "runelite_settings", "temp.properties") - shutil.copyfile(src_path, dst_path) - - # Executable args for runelite to direct the client to launch with bot settings - EXECARG1 = "--clientargs" - EXECARG2 = f"--config={dst_path} --sessionfile=bot_session" - - # Launch the game - if platform.system() == "Windows": - subprocess.Popen([EXECPATH, EXECARG1, EXECARG2], creationflags=subprocess.DETACHED_PROCESS) - else: - subprocess.Popen([EXECPATH, EXECARG1, EXECARG2], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, start_new_session=True) + path = launcher.RL_SETTINGS_FOLDER_PATH.joinpath(f"{self.__game_title.lower()}_settings.properties") + use_profile_manager = self.__game_title.lower() in ["osrs"] # TODO: This is a weak solution for identifying games that use the profile manager. + success = launcher.launch_runelite( + properties_path=path, + game_title=self.__game_title, + use_profile_manager=use_profile_manager, + callback=self.__update_label, + ) + if not success: + return self.label_status.configure(text="You may select a script from the menu.", text_color="green") self.main.toggle_btn_state(enabled=True) - def __locate_executable(self): - """ - Opens a file dialog to allow the user to locate the game executable. - """ - root = tk.Tk() - root.withdraw() - file_path = filedialog.askopenfilename( - title="Select game executable file", filetypes=[("exe files", "*.exe"), ("AppImage files", "*.AppImage"), ("Java files", "*.jar")] - ) - try: - if not file_path: - root.destroy() - return None - file_path = Path(file_path) - except TypeError: - root.destroy() - return None - path_str = str(file_path) - root.destroy() - return path_str + def __reset_saved_path(self): + launcher.reset_saved_paths(self.__game_title, self.__update_label) def __skip(self): + """ + Handler for the 'skip' button. This will simply update the status label and enable the script selection buttons, + bypassing the need to launch RuneLite. + """ self.label_status.configure(text="You may select a script from the menu.", text_color="green") self.main.toggle_btn_state(enabled=True) - def __reset_saved_path(self): - # Load the JSON file - try: - with open(executable_paths, "r") as f: - data = json.load(f) - key = self.__game_title.lower() - del data[key] - self.label_status.configure(text=f"{self.__game_title} executable path has been reset.", text_color="green") - except (FileNotFoundError, KeyError, json.decoder.JSONDecodeError): - self.label_status.configure(text="No executable path on file.", text_color="orange") - return - - with open(executable_paths, "w") as f: - json.dump(data, f) + def __update_label(self, text: str): + self.label_status.configure(text=text, text_color="white")