├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── explvs_aio.iml ├── pom.xml ├── resources-archive.zip └── src ├── assembly └── resources-archive.xml └── main ├── java ├── activities │ ├── activity │ │ ├── Activity.java │ │ └── ActivityType.java │ ├── banking │ │ ├── Bank.java │ │ ├── Banking.java │ │ ├── DepositAllBanking.java │ │ ├── DepositBox.java │ │ ├── ItemReqBanking.java │ │ └── ToolUpgradeBanking.java │ ├── eating │ │ ├── Eating.java │ │ └── Food.java │ ├── grand_exchange │ │ ├── GEActivity.java │ │ ├── GEBuyActivity.java │ │ ├── GEItem.java │ │ ├── GEMode.java │ │ ├── GESellActivity.java │ │ ├── event │ │ │ ├── GrandExchangeBuyEvent.java │ │ │ ├── GrandExchangeEvent.java │ │ │ └── GrandExchangeSellEvent.java │ │ ├── item_guide │ │ │ └── ItemGuide.java │ │ └── price_guide │ │ │ ├── OSRSPriceGuide.java │ │ │ └── RSBuddyPriceGuide.java │ ├── money_making │ │ ├── MoneyMakingType.java │ │ └── flax_picking │ │ │ └── FlaxPickingActivity.java │ ├── quests │ │ ├── CooksAssistant.java │ │ ├── DialogueCompleter.java │ │ ├── Quest.java │ │ ├── QuestActivity.java │ │ ├── RomeoAndJuliet.java │ │ ├── RuneMysteries.java │ │ ├── SheepShearer.java │ │ └── TheRestlessGhost.java │ ├── skills │ │ ├── agility │ │ │ ├── AgilityActivity.java │ │ │ ├── AgilityCourse.java │ │ │ ├── CoursePart.java │ │ │ └── Obstacle.java │ │ ├── cooking │ │ │ ├── CookingActivity.java │ │ │ ├── CookingItem.java │ │ │ ├── CookingLocation.java │ │ │ ├── CookingObject.java │ │ │ └── CookingType.java │ │ ├── crafting │ │ │ ├── CraftingActivity.java │ │ │ ├── CraftingItem.java │ │ │ └── CraftingType.java │ │ ├── firemaking │ │ │ ├── FMLocation.java │ │ │ ├── FiremakingActivity.java │ │ │ └── Log.java │ │ ├── fishing │ │ │ ├── Fish.java │ │ │ ├── FishingActivity.java │ │ │ ├── FishingLocation.java │ │ │ └── FishingMethod.java │ │ ├── fletching │ │ │ ├── FletchItem.java │ │ │ ├── FletchItemType.java │ │ │ └── FletchingActivity.java │ │ ├── herblore │ │ │ ├── HerbloreType.java │ │ │ ├── herb_cleaning │ │ │ │ ├── Herb.java │ │ │ │ └── HerbCleaningActivity.java │ │ │ └── potion_making │ │ │ │ ├── Potion.java │ │ │ │ └── PotionMakingActivity.java │ │ ├── magic │ │ │ ├── MagicActivity.java │ │ │ ├── Rune.java │ │ │ ├── Spell.java │ │ │ ├── SpellType.java │ │ │ └── Staff.java │ │ ├── mining │ │ │ ├── Mine.java │ │ │ ├── MiningActivity.java │ │ │ ├── Pickaxe.java │ │ │ ├── Rock.java │ │ │ ├── RockArea.java │ │ │ └── RuneEssMiningActivity.java │ │ ├── ranged │ │ │ ├── Bow.java │ │ │ └── RangeGuildActivity.java │ │ ├── runecrafting │ │ │ ├── Altar.java │ │ │ ├── EssenceType.java │ │ │ ├── FireAltarRunecraftingActivity.java │ │ │ ├── RunecraftingActivity.java │ │ │ ├── RunecraftingBase.java │ │ │ ├── RunecraftingType.java │ │ │ └── TiaraMakingActivity.java │ │ ├── smithing │ │ │ ├── Bar.java │ │ │ ├── SmithingType.java │ │ │ ├── cannonballs │ │ │ │ └── CannonballActivity.java │ │ │ ├── item_making │ │ │ │ ├── SmithItem.java │ │ │ │ ├── SmithItemMakingActivity.java │ │ │ │ └── SmithLocation.java │ │ │ └── smelting │ │ │ │ ├── SmeltLocation.java │ │ │ │ └── SmeltingActivity.java │ │ ├── thieving │ │ │ ├── ThievingActivity.java │ │ │ ├── ThievingObject.java │ │ │ └── ThievingType.java │ │ └── woodcutting │ │ │ ├── Axe.java │ │ │ ├── Tree.java │ │ │ └── WoodcuttingActivity.java │ └── tutorial_island │ │ ├── BankSection.java │ │ ├── CookingSection.java │ │ ├── FightingSection.java │ │ ├── MiningSection.java │ │ ├── PriestSection.java │ │ ├── QuestSection.java │ │ ├── RuneScapeGuideSection.java │ │ ├── SurvivalSection.java │ │ ├── TutorialIsland.java │ │ ├── TutorialSection.java │ │ └── WizardSection.java ├── gui │ ├── Gui.java │ ├── IconButton.java │ ├── activity_panels │ │ ├── ActivityPanel.java │ │ ├── ActivityPanelFactory.java │ │ ├── AgilityActivityPanel.java │ │ ├── CookingActivityPanel.java │ │ ├── CraftingActivityPanel.java │ │ ├── FMActivityPanel.java │ │ ├── FishingActivityPanel.java │ │ ├── FletchActivityPanel.java │ │ ├── HerbloreActivityPanel.java │ │ ├── MiningActivityPanel.java │ │ ├── MoneyMakingActivityPanel.java │ │ ├── RCActivityPanel.java │ │ ├── RangedActivityPanel.java │ │ ├── SmithActivityPanel.java │ │ ├── ThievingActivityPanel.java │ │ └── WCActivityPanel.java │ ├── conf_man │ │ └── ConfigManager.java │ ├── dialogs │ │ └── NewVersionDialog.java │ ├── document_filters │ │ ├── DoubleDocumentFilter.java │ │ └── IntegerDocumentFilter.java │ ├── fields │ │ ├── AutoCompleteTextField.java │ │ ├── DateField.java │ │ ├── DoubleField.java │ │ ├── IntegerField.java │ │ ├── ItemField.java │ │ ├── PlaceholderTextField.java │ │ └── RSUnitField.java │ ├── interfaces │ │ └── JSONSerializable.java │ ├── styled_components │ │ ├── StyledJCheckBox.java │ │ ├── StyledJComboBox.java │ │ ├── StyledJLabel.java │ │ ├── StyledJPanel.java │ │ ├── StyledJScrollPane.java │ │ └── StyledJTextField.java │ ├── task_list │ │ └── TaskList.java │ ├── task_panels │ │ ├── ActivitySelectorPanel.java │ │ ├── BreakTaskPanel.java │ │ ├── GETaskPanel.java │ │ ├── LevelTaskPanel.java │ │ ├── LoopTaskPanel.java │ │ ├── QuestTaskPanel.java │ │ ├── ResourceTaskPanel.java │ │ ├── TaskPanel.java │ │ ├── TaskPanelFactory.java │ │ └── TimedTaskPanel.java │ └── utils │ │ ├── ColourScheme.java │ │ ├── CopyToClipboardButton.java │ │ ├── DateTimePanel.java │ │ ├── DurationPanel.java │ │ ├── EventDispatchThreadRunner.java │ │ └── LoadoutPanel.java ├── paint │ ├── MouseTrail.java │ └── Paint.java ├── script │ ├── AIO.java │ └── VersionChecker.java ├── tasks │ ├── GrandExchangeTask.java │ ├── LevelTask.java │ ├── LoopTask.java │ ├── QuestTask.java │ ├── ResourceTask.java │ ├── Task.java │ ├── TaskType.java │ ├── TimedTask.java │ ├── TutorialIslandTask.java │ ├── break_task │ │ ├── BreakTask.java │ │ └── CustomBreakManager.java │ └── task_executor │ │ ├── TaskChangeListener.java │ │ └── TaskExecutor.java └── util │ ├── Copyable.java │ ├── Location.java │ ├── PaintUtil.java │ ├── RSUnits.java │ ├── ResourceMode.java │ ├── ScreenshotUtil.java │ ├── ScriptProperties.java │ ├── Sleep.java │ ├── Tool.java │ ├── custom_method_provider │ ├── CustomMethodProvider.java │ ├── ExecutableUtil.java │ ├── ExtendedCamera.java │ ├── ExtendedGroundItems.java │ ├── ExtendedInventory.java │ ├── ExtendedNPCS.java │ ├── ExtendedSettings.java │ ├── Graphics.java │ ├── InteractionHelper.java │ ├── MakeAllInterface.java │ └── SkillTracker.java │ ├── event │ ├── ConfigureClientEvent.java │ └── DisableAudioEvent.java │ ├── executable │ ├── BlockingExecutable.java │ ├── Executable.java │ └── ExecutionFailedException.java │ ├── file_managers │ ├── FontManager.java │ ├── ImageManager.java │ └── ResourceManager.java │ ├── item_requirement │ └── ItemReq.java │ └── widget │ ├── CachedWidget.java │ └── filters │ ├── WidgetActionFilter.java │ ├── WidgetDimensionFilter.java │ └── WidgetMessageFilter.java └── resources ├── fonts └── Roboto-Regular.ttf └── images ├── agility.png ├── attack.png ├── breakIcon.png ├── breakIconHover.png ├── clipboardIcon.png ├── clipboardIconHover.png ├── closeIcon.png ├── closeIconHover.png ├── construction.png ├── cooking.png ├── crafting.png ├── cursor.png ├── defence.png ├── farming.png ├── firemaking.png ├── fishing.png ├── fletching.png ├── geIcon.png ├── geIconHover.png ├── herblore.png ├── hitpoints.png ├── hunter.png ├── levelIcon.png ├── levelIconHover.png ├── loadIcon.png ├── loadIconHover.png ├── loadout.png ├── loadout ├── amulet.png ├── arrows.png ├── boots.png ├── cape.png ├── chest.png ├── gloves.png ├── helmet.png ├── legs.png ├── ring.png ├── shield.png ├── slot_background.png └── weapon.png ├── loopIcon.png ├── loopIconHover.png ├── magic.png ├── mining.png ├── moveDownIcon.png ├── moveDownIconHover.png ├── moveUpIcon.png ├── moveUpIconHover.png ├── prayer.png ├── questIcon.png ├── questIconHover.png ├── ranged.png ├── resourceIcon.png ├── resourceIconHover.png ├── runecrafting.png ├── saveIcon.png ├── saveIconHover.png ├── slayer.png ├── smithing.png ├── startIcon.png ├── startIconHover.png ├── strength.png ├── templates ├── iconHoverTemplate.png └── iconTemplate.png ├── thieving.png ├── timedIcon.png ├── timedIconHover.png └── woodcutting.png /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | out/* 3 | AIO/src/resources/* 4 | AIO/AIO.iml 5 | Makefile 6 | target/ 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Explv 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Explvs-AIO 2 | This All-in-one(AIO) script is open source and free for all to use. 3 | 4 | ## CLI Usage example 5 | 6 | Pass the name of your saved .config file as the script parameter: 7 | 8 | `java -jar "OSBot 2.5.38.jar" -login osbot_user:osbot_passwd -bot osrs_user:osrs_passwd:pin -script "\"Explv's AIO v3.2\":example.config"` 9 | 10 | 11 | ## Development 12 | Intellij is the recommended IDE of choice:[https://www.jetbrains.com/idea/download/](here) 13 | 14 | Select `File -> New -> Project From Version Control -> Git` 15 | 16 | Enter https://github.com/Explv/Explvs-AIO.git 17 | 18 | And then follow the setup wizard. 19 | 20 | If you're building the script for the first time, run: `mvn initialize` 21 | 22 | This will download OSBot, and allow you to build the script. 23 | 24 | To build the script, run: `mvn install` 25 | 26 | The script will be built to your scripts directory `/OSBot/Scripts` 27 | 28 | If / when OSBot updates, you will need to delete the `osbot.jar` that maven downloads, and re-run `mvn intialize` to get the latest version. 29 | 30 | ## Issues 31 | If you find any bugs with the project, feel free to make a pull request fixing them. Alternatively, you can make an issue on this project and they will be addressed when possible. 32 | 33 | ## Colour Scheme 34 | 35 | Grey: `#1b1919` 36 | 37 | White: `#ffffff` 38 | 39 | Blue: `#33b5e5` 40 | 41 | ## Icon templates 42 | 43 | https://github.com/Explv/Explvs-AIO/tree/master/AIO/resources/images/templates 44 | -------------------------------------------------------------------------------- /explvs_aio.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /resources-archive.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/resources-archive.zip -------------------------------------------------------------------------------- /src/assembly/resources-archive.xml: -------------------------------------------------------------------------------- 1 | 3 | resources-archive 4 | false 5 | 6 | zip 7 | 8 | 9 | 10 | ${basedir}/src/main/resources 11 | / 12 | false 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/main/java/activities/activity/Activity.java: -------------------------------------------------------------------------------- 1 | package activities.activity; 2 | 3 | 4 | import org.osbot.rs07.canvas.paint.Painter; 5 | import util.Copyable; 6 | import util.executable.Executable; 7 | 8 | import java.awt.*; 9 | 10 | public abstract class Activity extends Executable implements Copyable, Painter { 11 | 12 | private final ActivityType activityType; 13 | public boolean isComplete = false; 14 | /** 15 | * Current activity status to be displayed in the GUI 16 | */ 17 | private String status = ""; 18 | 19 | public Activity(final ActivityType activityType) { 20 | this.activityType = activityType; 21 | } 22 | 23 | /** 24 | * Update the activity status 25 | * 26 | * @param status to set 27 | */ 28 | protected void setStatus(String status) { 29 | this.status = status; 30 | } 31 | 32 | public final ActivityType getActivityType() { 33 | return activityType; 34 | } 35 | 36 | @Override 37 | public void run() throws InterruptedException { 38 | runActivity(); 39 | } 40 | 41 | public abstract void runActivity() throws InterruptedException; 42 | 43 | public String toString() { 44 | return activityType != null ? String.format("%s : %s", activityType.toString(), status) : ""; 45 | } 46 | 47 | @Override 48 | public void onPaint(Graphics2D graphics) {} 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/activities/activity/ActivityType.java: -------------------------------------------------------------------------------- 1 | package activities.activity; 2 | 3 | import org.osbot.rs07.api.ui.Skill; 4 | 5 | public enum ActivityType { 6 | 7 | AGILITY(Skill.AGILITY), 8 | //COMBAT (Skill.ATTACK, Skill.STRENGTH, Skill.DEFENCE, Skill.HITPOINTS, Skill.RANGED, Skill.MAGIC), 9 | //CONSTRUCTION (Skill.CONSTRUCTION), 10 | COOKING(Skill.COOKING), 11 | CRAFTING(Skill.CRAFTING), 12 | //FARMING (Skill.FARMING), 13 | FIREMAKING(Skill.FIREMAKING), 14 | FISHING(Skill.FISHING), 15 | FLETCHING(Skill.FLETCHING), 16 | HERBLORE(Skill.HERBLORE), 17 | //HUNTER (Skill.HUNTER), 18 | //MAGIC (Skill.MAGIC), 19 | MINING(Skill.MINING), 20 | //PRAYER (Skill.PRAYER), 21 | RUNECRAFTING(Skill.RUNECRAFTING), 22 | //SLAYER (Skill.SLAYER, Skill.ATTACK, Skill.STRENGTH, Skill.DEFENCE, Skill.HITPOINTS, Skill.RANGED, Skill.MAGIC), 23 | SMITHING(Skill.SMITHING), 24 | THIEVING(Skill.THIEVING), 25 | WOODCUTTING(Skill.WOODCUTTING), 26 | RANGED(Skill.RANGED), 27 | MONEY_MAKING; 28 | 29 | public Skill[] gainedXPSkills; 30 | 31 | ActivityType(final Skill... gainedXPSkills) { 32 | this.gainedXPSkills = gainedXPSkills; 33 | } 34 | 35 | @Override 36 | public String toString() { 37 | char[] name = name().toLowerCase().replace('_', ' ').toCharArray(); 38 | name[0] = Character.toUpperCase(name[0]); 39 | return new String(name); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/activities/banking/DepositAllBanking.java: -------------------------------------------------------------------------------- 1 | package activities.banking; 2 | 3 | import util.item_requirement.ItemReq; 4 | 5 | import java.util.stream.Stream; 6 | 7 | public class DepositAllBanking extends Banking { 8 | 9 | private String[] exceptItems; 10 | 11 | public DepositAllBanking(final String... exceptItems) { 12 | super(true); 13 | this.exceptItems = exceptItems; 14 | } 15 | 16 | public DepositAllBanking() { 17 | this(new String[]{}); 18 | } 19 | 20 | public DepositAllBanking(final ItemReq... exceptItems) { 21 | this(Stream.of(exceptItems).map(ItemReq::getName).toArray(String[]::new)); 22 | } 23 | 24 | public void setExceptItems(final String... exceptItems) { 25 | this.exceptItems = exceptItems; 26 | } 27 | 28 | @Override 29 | protected void bank(final BankType currentBankType) { 30 | boolean success; 31 | 32 | if (exceptItems == null) { 33 | if (currentBankType == BankType.DEPOSIT_BOX) { 34 | success = getDepositBox().depositAll(); 35 | } else { 36 | success = getBank().depositAll(); 37 | } 38 | } else if (currentBankType == BankType.DEPOSIT_BOX) { 39 | success = getDepositBox().depositAllExcept(exceptItems); 40 | } else { 41 | success = getBank().depositAllExcept(exceptItems); 42 | } 43 | 44 | if (success) { 45 | setFinished(); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/activities/banking/DepositBox.java: -------------------------------------------------------------------------------- 1 | package activities.banking; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | import util.Location; 6 | 7 | import java.util.Arrays; 8 | 9 | public enum DepositBox { 10 | PORT_SARIM(new Location("Port Sarim", new Area(3044, 3237, 3052, 3234))); 11 | 12 | public Location location; 13 | 14 | public static Area[] AREAS = Arrays.stream(DepositBox.values()).map(depositBox -> depositBox.location.getArea()).toArray(Area[]::new); 15 | 16 | DepositBox(final Location location) { 17 | this.location = location; 18 | } 19 | 20 | public static boolean atAnyDepositBox(final Position position) { 21 | for (DepositBox depositBox : DepositBox.values()) { 22 | if (depositBox.location.getArea().contains(position)) return true; 23 | } 24 | return false; 25 | } 26 | 27 | 28 | @Override 29 | public String toString() { 30 | return location.toString(); 31 | } 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/activities/eating/Eating.java: -------------------------------------------------------------------------------- 1 | package activities.eating; 2 | 3 | import org.osbot.rs07.api.ui.Skill; 4 | import util.Sleep; 5 | import util.executable.Executable; 6 | 7 | public class Eating extends Executable { 8 | 9 | private final Food food; 10 | 11 | public Eating(final Food food) { 12 | this.food = food; 13 | } 14 | 15 | public float getHpPercent() { 16 | return getSkills().getDynamic(Skill.HITPOINTS) * 100 / getSkills().getStatic(Skill.HITPOINTS); 17 | } 18 | 19 | @Override 20 | public void run() throws InterruptedException { 21 | long foodCount = getInventory().getAmount(food.toString()); 22 | getInventory().getItem(food.toString()).interact("Eat", "Drink"); 23 | Sleep.sleepUntil(() -> getInventory().getAmount(food.toString()) < foodCount, 5000); 24 | } 25 | 26 | @Override 27 | public String toString() { 28 | return "Eating"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/activities/eating/Food.java: -------------------------------------------------------------------------------- 1 | package activities.eating; 2 | 3 | public enum Food { 4 | NONE("None", 0), 5 | SHRIMP("Shrimp", 3), 6 | CHICKEN("Cooked chicken", 3), 7 | SARDINE("Sardine", 3), 8 | MEAT("Cooked meat", 3), 9 | BREAD("Bread", 5), 10 | HERRING("Herring", 5), 11 | MACKEREL("Mackerel", 5), 12 | TROUT("Trout", 7), 13 | COD("Cod", 7), 14 | PIKE("Pike", 8), 15 | ROAST_BEAST("Roast beast meat", 8), 16 | PINEAPPLE_PUNCH("Pineapple punch", 9), 17 | SALMON("Salmon", 9), 18 | TUNA("Tuna", 10), 19 | JUG_OF_WINE("Jug of wine", 11), 20 | RAINBOW_FISH("Rainbow fish", 11), 21 | STEW("Stew", 11), 22 | CAKE("Cake", 4), 23 | MEAT_PIE("Meat pie", 6), 24 | LOBSTER("Lobster", 12), 25 | BASS("Bass", 13), 26 | PLAIN_PIZZA("Plain pizza", 7), 27 | SWORDFISH("Swordfish", 14), 28 | POTATO_WITH_BUTTER("Potato with butter", 14), 29 | CHOCOLATE_CAKE("Chocolate cake", 5), 30 | TANGLED_TOADS_LEGS("Tangled toad's legs", 15), 31 | POTATO_WITH_CHEESE("Potato with cheese", 16), 32 | MEAT_PIZZA("Meat pizza", 8), 33 | MONKFISH("Monkfish", 16), 34 | ANCHOVY_PIZZA("Anchovy pizza", 9), 35 | COOKED_KARAMBWAN("Cooked karambwan", 18), 36 | CURRY("Curry", 19), 37 | UGTHANKI_KEBAB("Ugthanki kebab", 19), 38 | MUSHROOM_POTATO("Mushroom potato", 20), 39 | SHARK("Shark", 20), 40 | SEA_TURTLE("Sea turtle", 21), 41 | PINEAPPLE_PIZZA("Pineapple pizza", 11), 42 | MANTA_RAY("Manta ray", 22), 43 | TUNA_POTATO("Tuna potato", 22), 44 | DARK_CRAB("Dark crab", 22), 45 | BASKET_OF_STRAWBERRIES("Basket of strawberries", -1), 46 | SARADOMIN_BREW("Saradomin brew", -1); 47 | 48 | String name; 49 | int healthGain; 50 | 51 | Food(final String name, final int healthGain) { 52 | this.name = name; 53 | this.healthGain = healthGain; 54 | } 55 | 56 | @Override 57 | public String toString() { 58 | return name; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/GEActivity.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange; 2 | 3 | import activities.activity.Activity; 4 | import org.osbot.rs07.api.GrandExchange; 5 | import org.osbot.rs07.api.map.Area; 6 | 7 | public abstract class GEActivity extends Activity { 8 | 9 | protected static final Area GRAND_EXCHANGE = new Area(3154, 3479, 3174, 3500); 10 | 11 | GrandExchange.Box box; 12 | 13 | GEActivity() { 14 | super(null); 15 | } 16 | 17 | public GrandExchange.Box getBox() { 18 | return box; 19 | } 20 | 21 | @Override 22 | public abstract GEActivity copy(); 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/GEBuyActivity.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange; 2 | 3 | import activities.banking.ItemReqBanking; 4 | import activities.grand_exchange.event.GrandExchangeBuyEvent; 5 | import util.executable.ExecutionFailedException; 6 | import util.item_requirement.ItemReq; 7 | 8 | public class GEBuyActivity extends GEActivity { 9 | 10 | private final GEItem geItem; 11 | private final ItemReq coinReq; 12 | 13 | private ItemReqBanking itemReqBanking; 14 | 15 | public GEBuyActivity(final GEItem geItem) { 16 | this.geItem = geItem; 17 | 18 | int coinsRequired = geItem.getPrice() * geItem.getQuantity(); 19 | 20 | coinReq = new ItemReq( 21 | "Coins", 22 | coinsRequired, 23 | coinsRequired 24 | ).setStackable(); 25 | 26 | itemReqBanking = new ItemReqBanking(coinReq); 27 | } 28 | 29 | @Override 30 | public void runActivity() throws InterruptedException { 31 | if (box != null) { 32 | return; 33 | } 34 | 35 | if (!GRAND_EXCHANGE.contains(myPosition())) { 36 | getWalking().webWalk(GRAND_EXCHANGE); 37 | } else if (!coinReq.hasRequirement(getInventory())) { 38 | execute(itemReqBanking); 39 | } else { 40 | GrandExchangeBuyEvent buyEvent = new GrandExchangeBuyEvent( 41 | geItem.getName(), 42 | geItem.getPrice(), 43 | geItem.getQuantity() 44 | ); 45 | execute(buyEvent); 46 | if (buyEvent.hasFailed()) { 47 | throw new ExecutionFailedException("Failed to buy items"); 48 | } else { 49 | box = buyEvent.getBoxUsed(); 50 | } 51 | } 52 | } 53 | 54 | @Override 55 | public String toString() { 56 | return "Buying"; 57 | } 58 | 59 | @Override 60 | public GEBuyActivity copy() { 61 | return new GEBuyActivity(geItem); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/GEItem.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange; 2 | 3 | public class GEItem { 4 | 5 | private final String name; 6 | private final int quantity; 7 | private final int price; 8 | 9 | public GEItem(final String name, final int quantity, final int price) { 10 | this.name = name; 11 | this.quantity = quantity; 12 | this.price = price; 13 | } 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public int getQuantity() { 20 | return quantity; 21 | } 22 | 23 | public int getPrice() { 24 | return price; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/GEMode.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange; 2 | 3 | public enum GEMode { 4 | 5 | BUY, 6 | SELL; 7 | 8 | @Override 9 | public String toString() { 10 | char[] name = name().toLowerCase().toCharArray(); 11 | name[0] = Character.toUpperCase(name[0]); 12 | return new String(name); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/GESellActivity.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange; 2 | 3 | import activities.banking.DepositAllBanking; 4 | import activities.banking.ItemReqBanking; 5 | import activities.grand_exchange.event.GrandExchangeSellEvent; 6 | import util.item_requirement.ItemReq; 7 | 8 | public class GESellActivity extends GEActivity { 9 | 10 | private final GEItem geItem; 11 | private final DepositAllBanking depositAllBanking; 12 | private final ItemReqBanking itemReqBanking; 13 | private boolean checkedBank; 14 | 15 | public GESellActivity(final GEItem geItem) { 16 | this.geItem = geItem; 17 | depositAllBanking = new DepositAllBanking(); 18 | itemReqBanking = new ItemReqBanking( 19 | new ItemReq(geItem.getName(), 1, geItem.getQuantity()).setStackable().setNoted() 20 | ); 21 | } 22 | 23 | @Override 24 | public void runActivity() throws InterruptedException { 25 | if (box != null) { 26 | return; 27 | } 28 | 29 | if (!GRAND_EXCHANGE.contains(myPosition())) { 30 | getWalking().webWalk(GRAND_EXCHANGE); 31 | } else if (!checkedBank && getInventory().getAmount(geItem.getName()) < geItem.getQuantity()) { 32 | if (!getInventory().isEmpty()) { 33 | execute(depositAllBanking); 34 | } else { 35 | execute(itemReqBanking); 36 | checkedBank = true; 37 | } 38 | } else { 39 | GrandExchangeSellEvent sellEvent = new GrandExchangeSellEvent( 40 | geItem.getName(), geItem.getPrice(), geItem.getQuantity() 41 | ); 42 | execute(sellEvent); 43 | box = sellEvent.getBoxUsed(); 44 | } 45 | } 46 | 47 | @Override 48 | public String toString() { 49 | return "Selling"; 50 | } 51 | 52 | @Override 53 | public GESellActivity copy() { 54 | return new GESellActivity(geItem); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/event/GrandExchangeSellEvent.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange.event; 2 | 3 | import org.osbot.rs07.api.GrandExchange; 4 | import util.Sleep; 5 | 6 | public class GrandExchangeSellEvent extends GrandExchangeEvent { 7 | 8 | public GrandExchangeSellEvent(final String itemName, final int price, final int quantity) { 9 | super(itemName, price, quantity); 10 | } 11 | 12 | @Override 13 | public void onStart() { 14 | quantity = (int) Math.min(quantity, getInventory().getAmount(itemName)); 15 | } 16 | 17 | @Override 18 | boolean isOfferScreenOpen() { 19 | return getGrandExchange().isSellOfferOpen(); 20 | } 21 | 22 | @Override 23 | boolean openOfferScreen(final GrandExchange.Box box) { 24 | return getGrandExchange().sellItems(box); 25 | } 26 | 27 | @Override 28 | boolean setOfferItem() { 29 | if (getInventory().getItem(itemName).interact()) { 30 | Sleep.sleepUntil(() -> getOfferedItemID() != -1, 5000); 31 | return true; 32 | } 33 | return false; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/item_guide/ItemGuide.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange.item_guide; 2 | 3 | import org.json.simple.JSONObject; 4 | import org.json.simple.parser.JSONParser; 5 | import org.json.simple.parser.ParseException; 6 | 7 | import java.io.File; 8 | import java.io.FileOutputStream; 9 | import java.io.FileReader; 10 | import java.io.IOException; 11 | import java.net.URL; 12 | import java.nio.channels.Channels; 13 | import java.nio.channels.ReadableByteChannel; 14 | import java.nio.file.Paths; 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | 18 | public class ItemGuide { 19 | private static final Map allGEItems = new HashMap<>(); 20 | 21 | public static Map getAllGEItems() { 22 | if (allGEItems.isEmpty()) { 23 | 24 | File summaryFile = Paths.get(System.getProperty("user.home"), "OSBot", "Data", "explv_aio_rsbuddy_summary.json").toFile(); 25 | 26 | try { 27 | if (!summaryFile.exists()) { 28 | System.out.println("Downloading summary JSON from RSBuddy"); 29 | URL website = new URL("https://rsbuddy.com/exchange/summary.json"); 30 | ReadableByteChannel rbc = Channels.newChannel(website.openStream()); 31 | FileOutputStream fos = new FileOutputStream(summaryFile); 32 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 33 | } 34 | 35 | try (FileReader fileReader = new FileReader(summaryFile)) { 36 | JSONObject jsonObject = (JSONObject) (new JSONParser().parse(fileReader)); 37 | for (Object value : jsonObject.values()) { 38 | JSONObject item = (JSONObject) value; 39 | allGEItems.put((String) item.get("name"), new Long((long) item.get("id")).intValue()); 40 | } 41 | } 42 | } catch (IOException | ParseException e) { 43 | e.printStackTrace(); 44 | } 45 | } 46 | return allGEItems; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/activities/grand_exchange/price_guide/RSBuddyPriceGuide.java: -------------------------------------------------------------------------------- 1 | package activities.grand_exchange.price_guide; 2 | 3 | import org.json.simple.JSONObject; 4 | import org.json.simple.parser.JSONParser; 5 | 6 | import java.io.BufferedReader; 7 | import java.io.InputStreamReader; 8 | import java.net.URL; 9 | import java.net.URLConnection; 10 | import java.util.Optional; 11 | 12 | public class RSBuddyPriceGuide { 13 | public static Optional getBuyPrice(final int itemID) { 14 | return getPrice(itemID, "buying"); 15 | } 16 | 17 | public static Optional getSellPrice(final int itemID) { 18 | return getPrice(itemID, "selling"); 19 | } 20 | 21 | private static Optional getPrice(final int itemID, final String type) { 22 | try { 23 | URL url = new URL("http://api.rsbuddy.com/grandExchange?a=guidePrice&i=" + itemID); 24 | URLConnection con = url.openConnection(); 25 | con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); 26 | 27 | try (InputStreamReader inputStreamReader = new InputStreamReader(con.getInputStream()); 28 | BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { 29 | JSONParser jsonParser = new JSONParser(); 30 | JSONObject itemJSON = (JSONObject) jsonParser.parse(bufferedReader); 31 | 32 | int price = new Long((long) itemJSON.get(type)).intValue(); 33 | 34 | System.out.println("Got RSBuddy price"); 35 | return Optional.of(price); 36 | } 37 | } catch (Exception e) { 38 | System.out.println("Failed to get RSBuddy price"); 39 | } 40 | return Optional.empty(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/activities/money_making/MoneyMakingType.java: -------------------------------------------------------------------------------- 1 | package activities.money_making; 2 | 3 | public enum MoneyMakingType { 4 | 5 | FLAX_PICKING("Flax picking"), 6 | VIAL_FILLING("Vial filling"); 7 | 8 | String name; 9 | 10 | MoneyMakingType(final String name) { 11 | this.name = name; 12 | } 13 | 14 | @Override 15 | public String toString() { 16 | return name; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/activities/quests/DialogueCompleter.java: -------------------------------------------------------------------------------- 1 | package activities.quests; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.model.NPC; 5 | import org.osbot.rs07.event.WebWalkEvent; 6 | import org.osbot.rs07.utility.Condition; 7 | import util.Sleep; 8 | import util.executable.Executable; 9 | import util.executable.ExecutionFailedException; 10 | 11 | import java.util.stream.Stream; 12 | 13 | public class DialogueCompleter extends Executable { 14 | 15 | private final String npcName; 16 | private final String[] dialogueOptions; 17 | private Area area; 18 | 19 | private static final String[] BASE_DIALOGUE_OPTIONS = { 20 | "Yes", 21 | "Yes." 22 | }; 23 | 24 | public DialogueCompleter(final String npcName, final Area area, final String... dialogueOptions) { 25 | this.npcName = npcName; 26 | this.area = area; 27 | this.dialogueOptions = buildDialogueOptions(dialogueOptions); 28 | } 29 | 30 | public DialogueCompleter(final String npcName, final String... dialogueOptions) { 31 | this.npcName = npcName; 32 | this.dialogueOptions = buildDialogueOptions(dialogueOptions); 33 | } 34 | 35 | private String[] buildDialogueOptions(final String[] dialogueOptions) { 36 | return Stream.concat(Stream.of(BASE_DIALOGUE_OPTIONS), Stream.of(dialogueOptions)).toArray(String[]::new); 37 | } 38 | 39 | @Override 40 | public void run() throws InterruptedException { 41 | NPC npc = getNpcs().closest(npcName); 42 | 43 | if (npc == null || !npc.isVisible()) { 44 | if (area != null && !area.contains(myPosition())) { 45 | WebWalkEvent webWalkEvent = new WebWalkEvent(area); 46 | webWalkEvent.setBreakCondition(new Condition() { 47 | @Override 48 | public boolean evaluate() { 49 | NPC npc = getNpcs().closest(npcName); 50 | return npc != null && npc.isVisible() && getMap().canReach(npc); 51 | } 52 | }); 53 | execute(webWalkEvent); 54 | return; 55 | } else { 56 | throw new ExecutionFailedException(String.format("Could not find NPC with name '%s'", npcName)); 57 | } 58 | } 59 | 60 | if (!getMap().canReach(npc)) { 61 | getDoorHandler().handleNextObstacle(npc); 62 | } else if (!getDialogues().inDialogue() || !myPlayer().isInteracting(npc)) { 63 | if (npc.interact("Talk-to")) { 64 | Sleep.sleepUntil(() -> getDialogues().inDialogue() && myPlayer().isInteracting(npc), 5000); 65 | } 66 | } else { 67 | getDialogues().completeDialogue(dialogueOptions); 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/activities/quests/Quest.java: -------------------------------------------------------------------------------- 1 | package activities.quests; 2 | 3 | import org.osbot.rs07.api.Configs; 4 | 5 | public enum Quest { 6 | 7 | SHEEP_SHEARER("Sheep Shearer", 179, 21), 8 | THE_RESTLESS_GHOST("The Restless Ghost", 107, 5), 9 | RUNE_MYSTERIES("Rune Mysteries", 63, 6), 10 | COOKS_ASSISTANT("Cooks Assistant", 29, 2), 11 | ROMEO_AND_JULIET("Romeo & Juliet", 144, 100); 12 | //ABYSS ("Abyss Mini Quest", 492, 4); 13 | 14 | final String name; 15 | final int configID; 16 | final int completedConfigVal; 17 | 18 | Quest(final String name, final int configID, final int completedConfigVal) { 19 | this.name = name; 20 | this.configID = configID; 21 | this.completedConfigVal = completedConfigVal; 22 | } 23 | 24 | public boolean isComplete(final Configs configs) { 25 | return configs.get(configID) == completedConfigVal; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return name; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/activities/quests/QuestActivity.java: -------------------------------------------------------------------------------- 1 | package activities.quests; 2 | 3 | import activities.activity.Activity; 4 | 5 | public abstract class QuestActivity extends Activity { 6 | 7 | private final Quest quest; 8 | 9 | public QuestActivity(final Quest quest) { 10 | super(null); 11 | this.quest = quest; 12 | } 13 | 14 | protected int getProgress() { 15 | return getConfigs().get(quest.configID); 16 | } 17 | 18 | @Override 19 | public String toString() { 20 | return quest.name; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/agility/CoursePart.java: -------------------------------------------------------------------------------- 1 | package activities.skills.agility; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | 6 | public class CoursePart { 7 | 8 | public final Area activeArea; 9 | final Obstacle obstacle; 10 | Position[] pathToArea; 11 | Position obstaclePosition; 12 | 13 | CoursePart(final Obstacle obstacle, final Area activeArea) { 14 | this.obstacle = obstacle; 15 | this.activeArea = activeArea; 16 | } 17 | 18 | CoursePart(final Obstacle obstacle, final Area activeArea, final Position[] pathToObstacle) { 19 | this.obstacle = obstacle; 20 | this.activeArea = activeArea; 21 | this.pathToArea = pathToObstacle; 22 | } 23 | 24 | CoursePart(final Obstacle obstacle, final Area activeArea, final Position obstaclePosition) { 25 | this.obstacle = obstacle; 26 | this.activeArea = activeArea; 27 | this.obstaclePosition = obstaclePosition; 28 | } 29 | 30 | CoursePart(final Obstacle obstacle, final Area activeArea, final Position[] pathToObstacle, final Position obstaclePosition) { 31 | this.obstacle = obstacle; 32 | this.activeArea = activeArea; 33 | this.pathToArea = pathToObstacle; 34 | this.obstaclePosition = obstaclePosition; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/agility/Obstacle.java: -------------------------------------------------------------------------------- 1 | package activities.skills.agility; 2 | 3 | public enum Obstacle { 4 | 5 | LOG_BALANCE("Log balance", "Walk-across"), 6 | TREE_BRANCH_UP("Tree branch", "Climb"), 7 | TREE_BRANCH_DOWN("Tree branch", "Climb-down"), 8 | OBSTACLE_NET("Obstacle net", "Climb-over"), 9 | OBSTACLE_PIPE("Obstacle pipe", "Squeeze-through"), 10 | BALANCING_ROPE("Balancing rope", "Walk-on"), 11 | ROUGH_WALL("Rough wall", "Climb"), 12 | TIGHTROPE("Tightrope", "Cross"), 13 | NARROW_WALL("Narrow wall", "Balance"), 14 | WALL("Wall", "Jump-up"), 15 | GAP("Gap", "Jump"), 16 | CRATE("Crate", "Climb-down"), 17 | CABLE("Cable", "Swing-across"), 18 | ZIP_LINE("Zip line", "Teeth-grip"), 19 | TROPICAL_TREE("Tropical tree", "Swing-across"), 20 | ROOF_TOP_BEAMS("Roof top beams", "Climb"), 21 | CLOTHES_LINE("Clothes line", "Cross"), 22 | LEAP_GAP("Gap", "Leap"), 23 | BALANCE_WALL("Wall", "Balance"), 24 | LEDGE("Ledge", "Hurdle"), 25 | EDGE("Edge", "Jump-off"), 26 | ROPE_SWING("Ropeswing", "Swing-on"), 27 | BALANCING_LEDGE("Balancing ledge", "Walk-across"), 28 | LADDER_DOWN("Ladder", "Climb-down"), 29 | CRUMBLING_WALL("Crumbling wall", "Climb-over"), 30 | TALL_TREE("Tall tree", "Climb"), 31 | POLE_VAULT("Pole-vault", "Vault"), 32 | HAND_HOLDS("Hand holds", "Cross"), 33 | JUMP_LEDGE("Ledge", "Jump"), 34 | JUMP_EDGE("Edge", "Jump"), 35 | CLIMB_WALL("Wall", "Climb-up"), 36 | BASKET("Basket", "Climb-on"), 37 | MARKET_STALL("Market stall", "Jump-on"), 38 | BANNER("Banner", "Grab"), 39 | TREE("Tree", "Jump-to"), 40 | MONKEY_BARS("Monkeybars", "Cross"), 41 | DRYING_LINE("Drying line", "Jump-to"), 42 | JUMP_ON_TREE("Tree", "Jump-on"), 43 | HURDLE_GAP("Gap", "Hurdle"), 44 | PILE_OF_FISH("Pile of fish", "Jump-in"); 45 | 46 | String NAME; 47 | String ACTION; 48 | 49 | Obstacle(final String NAME, final String ACTION) { 50 | this.NAME = NAME; 51 | this.ACTION = ACTION; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/cooking/CookingActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.cooking; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import org.osbot.rs07.api.model.RS2Object; 7 | import org.osbot.rs07.event.WebWalkEvent; 8 | import org.osbot.rs07.utility.Condition; 9 | import util.Sleep; 10 | import util.executable.Executable; 11 | import util.item_requirement.ItemReq; 12 | 13 | public class CookingActivity extends Activity { 14 | 15 | private final CookingItem cookingItem; 16 | private final CookingLocation cookingLocation; 17 | private final Executable bankNode; 18 | 19 | public CookingActivity(final CookingItem cookingItem, final CookingLocation cookingLocation) { 20 | super(ActivityType.COOKING); 21 | this.cookingItem = cookingItem; 22 | this.cookingLocation = cookingLocation; 23 | bankNode = new ItemReqBanking(cookingItem.itemReqs); 24 | } 25 | 26 | @Override 27 | public void runActivity() throws InterruptedException { 28 | if (ItemReq.hasItemRequirements(cookingItem.itemReqs, getInventory())) { 29 | if (!cookingLocation.location.getArea().contains(myPosition())) { 30 | WebWalkEvent webWalkEvent = new WebWalkEvent(cookingLocation.location.getArea()); 31 | webWalkEvent.setBreakCondition(new Condition() { 32 | @Override 33 | public boolean evaluate() { 34 | return getInteractionHelper().canInteract(getCookingObject()); 35 | } 36 | }); 37 | execute(webWalkEvent); 38 | } else { 39 | cook(); 40 | } 41 | } else { 42 | execute(bankNode); 43 | } 44 | } 45 | 46 | private void cook() throws InterruptedException { 47 | if (getMakeAllInterface().isOpen()) { 48 | getMakeAllInterface().makeAll(1); 49 | Sleep.sleepUntil(() -> getDialogues().isPendingContinuation() || !ItemReq.hasItemRequirements(cookingItem.itemReqs, getInventory()), 90_000); 50 | } else if (!cookingItem.toString().equals(getInventory().getSelectedItemName())) { 51 | getInventory().use(cookingItem.toString()); 52 | } else if (getCookingObject().interact("Use")) { 53 | Sleep.sleepUntil(() -> getMakeAllInterface().isOpen(), 2000); 54 | } 55 | } 56 | 57 | private RS2Object getCookingObject() { 58 | return getObjects().closest(cookingLocation.cookingObject.toString()); 59 | } 60 | 61 | @Override 62 | public CookingActivity copy() { 63 | return new CookingActivity(cookingItem, cookingLocation); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/cooking/CookingLocation.java: -------------------------------------------------------------------------------- 1 | package activities.skills.cooking; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | import util.Location; 6 | 7 | public enum CookingLocation { 8 | 9 | FALADOR_RANGE(new Location("Falador", new Area( 10 | new int[][]{ 11 | {2988, 3363}, 12 | {2988, 3368}, 13 | {2992, 3368}, 14 | {2992, 3366}, 15 | {2995, 3366}, 16 | {2995, 3363} 17 | } 18 | )), CookingObject.RANGE), 19 | EDGEVILLE_STOVE(new Location("Edgeville Stove", new Area(3077, 3493, 3079, 3496)), CookingObject.STOVE), 20 | EDGEVILLE_RANGE(new Location("Edgeville Range", new Area(new Position(3083, 3509, 1), new Position(3080, 3508, 1))), CookingObject.RANGE), 21 | CATHERBY_RANGE(new Location("Catherby Range", new Area(2815, 3439, 2818, 3444)), CookingObject.RANGE), 22 | LUMBRIDGE_RANGE(new Location("Lumbridge Range", new Area(3205, 3212, 3212, 3217)), CookingObject.RANGE); 23 | 24 | public Location location; 25 | public CookingObject cookingObject; 26 | 27 | CookingLocation(final Location location, final CookingObject cookingObject) { 28 | this.location = location; 29 | this.cookingObject = cookingObject; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return location.toString(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/cooking/CookingObject.java: -------------------------------------------------------------------------------- 1 | package activities.skills.cooking; 2 | 3 | public enum CookingObject { 4 | 5 | FIRE("Fire"), 6 | STOVE("Stove", CookingType.CAKE, CookingType.MEAT, CookingType.PIE, CookingType.PIZZA), 7 | RANGE("Range", CookingType.CAKE, CookingType.MEAT, CookingType.PIE, CookingType.PIZZA); 8 | 9 | public CookingType[] allowedCookingTypes; 10 | String name; 11 | 12 | CookingObject(final String name, final CookingType... allowedCookingTypes) { 13 | this.allowedCookingTypes = allowedCookingTypes; 14 | this.name = name; 15 | } 16 | 17 | @Override 18 | public String toString() { 19 | return name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/cooking/CookingType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.cooking; 2 | 3 | public enum CookingType { 4 | 5 | MEAT, 6 | PIE, 7 | PIZZA, 8 | CAKE, 9 | DRINK; 10 | 11 | @Override 12 | public String toString() { 13 | char[] name = name().toLowerCase().toCharArray(); 14 | name[0] = Character.toUpperCase(name[0]); 15 | return new String(name); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/crafting/CraftingType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.crafting; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | import util.Location; 6 | 7 | public enum CraftingType { 8 | SPINNING(new Location("Lumbridge Castle", new Area(new Position(3213, 3217, 1), new Position(3208, 3212, 1))), 9 | new Location("Seers' Village", new Area(new Position(2710, 3470, 1), new Position(2716, 3473, 1))) 10 | ), 11 | WEAVING(new Location("Falador", new Area(3038, 3285, 3040, 3289))), 12 | POTTERY(new Location("Barbarian Village", new Area(3082, 3407, 3087, 3411))), 13 | ARMOUR(CraftingLocations.BANK_LOCATION), 14 | SNELM(CraftingLocations.BANK_LOCATION), 15 | MOLTEN_GLASS(CraftingLocations.FURNACE_LOCATIONS), 16 | GLASS(CraftingLocations.BANK_LOCATION), 17 | JEM_CUTTING(CraftingLocations.BANK_LOCATION), 18 | JEWELLERY(CraftingLocations.FURNACE_LOCATIONS), 19 | WEAPONRY(CraftingLocations.BANK_LOCATION); 20 | 21 | public Location[] locations; 22 | 23 | CraftingType(final Location... locations) { 24 | this.locations = locations; 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | char[] name = name().toLowerCase().toCharArray(); 30 | name[0] = Character.toUpperCase(name[0]); 31 | return new String(name); 32 | } 33 | 34 | private interface CraftingLocations { 35 | Location BANK_LOCATION = new Location("Bank", null); 36 | Location[] FURNACE_LOCATIONS = { 37 | new Location("Al-Kharid", new Area(3272, 3184, 3279, 3188)), 38 | new Location("Edgeville", new Area(3105, 3496, 3110, 3501)), 39 | new Location("Falador", new Area( 40 | new int[][]{ 41 | {2970, 3368}, 42 | {2970, 3377}, 43 | {2974, 3377}, 44 | {2974, 3375}, 45 | {2978, 3375}, 46 | {2978, 3373}, 47 | {2976, 3373}, 48 | {2976, 3368} 49 | } 50 | )) 51 | }; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/firemaking/FMLocation.java: -------------------------------------------------------------------------------- 1 | package activities.skills.firemaking; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import util.Location; 5 | 6 | public enum FMLocation { 7 | 8 | GRAND_EXCHANGE(new Location("Grand Exchange", new Area(3146, 3473, 3185, 3487))), 9 | LUMBRIDGE(new Location("Lumbridge", new Area( 10 | new int[][]{ 11 | {3217, 3216}, 12 | {3217, 3211}, 13 | {3215, 3209}, 14 | {3207, 3209}, 15 | {3207, 3203}, 16 | {3221, 3203}, 17 | {3221, 3216} 18 | } 19 | ))), 20 | VARROCK_WEST(new Location("Varrock West", new Area(3200, 3428, 3165, 3432))), 21 | FALADOR_EAST(new Location("Falador East", new Area(2996, 3359, 3033, 3366))), 22 | DRAYNOR(new Location("Draynor", new Area(3097, 3247, 3074, 3250))), 23 | AL_KHARID(new Location("Al Kharid", new Area(3304, 3157, 3265, 3154))), 24 | EDGEVILLE(new Location("Edgeville", new Area(3073, 3501, 3104, 3506))), 25 | SEERS_VILLAGE(new Location("Seers' Village", new Area(2703, 3483, 2737, 3486))), 26 | VARROCK_EAST(new Location("Varrock East", new Area(3228, 3428, 3273, 3430))), 27 | YANILLE(new Location("Yanille", new Area(2608, 3096, 2575, 3098))); 28 | 29 | public Location LOCATION; 30 | 31 | FMLocation(final Location LOCATION) { 32 | this.LOCATION = LOCATION; 33 | } 34 | 35 | @Override 36 | public String toString() { 37 | return LOCATION.toString(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/firemaking/Log.java: -------------------------------------------------------------------------------- 1 | package activities.skills.firemaking; 2 | 3 | public enum Log { 4 | 5 | NORMAL("Logs", 1), 6 | ACHEY_TREE("Achey tree logs", 1), 7 | OAK("Oak logs", 15), 8 | WILLOW("Willow logs", 30), 9 | TEAK("Teak logs", 35), 10 | ARCTIC_PINE("Arctic pine logs", 42), 11 | MAPLE("Maple logs", 45), 12 | MAHOGANY("Mahogany logs", 50), 13 | YEW("Yew logs", 60), 14 | MAGIC("Magic logs", 75); 15 | 16 | String NAME; 17 | int LEVEL_REQUIRED; 18 | 19 | Log(final String NAME, final int LEVEL_REQUIRED) { 20 | this.NAME = NAME; 21 | this.LEVEL_REQUIRED = LEVEL_REQUIRED; 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return NAME; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/fishing/FishingMethod.java: -------------------------------------------------------------------------------- 1 | package activities.skills.fishing; 2 | 3 | import util.item_requirement.ItemReq; 4 | 5 | public enum FishingMethod { 6 | 7 | NET("Fishing spot", new String[]{"Small Net", "Net"}, new ItemReq("Small fishing net")), 8 | BIG_NET("Fishing spot", new String[]{"Big Net", "Net"}, new ItemReq("Big fishing net")), 9 | BAIT("Rod Fishing spot", "Bait", new ItemReq("Fishing rod"), new ItemReq("Fishing bait", 1).setStackable()), 10 | OILY_BAIT("Rod Fishing spot", "Bait", new ItemReq("Oily fishing rod"), new ItemReq("Fishing bait", 1).setStackable()), 11 | LURE("Rod Fishing spot", "Lure", new ItemReq("Fly fishing rod"), new ItemReq("Feather", 1).setStackable()), 12 | STRIPY_LURE("Rod Fishing spot", "Lure", new ItemReq("Fly fishing rod"), new ItemReq("Stripy Feather", 1).setStackable()), 13 | CAGE("Fishing spot", "Cage", new ItemReq("Lobster pot")), 14 | HARPOON("Fishing spot", "Harpoon", new ItemReq("Harpoon")), 15 | VESSEL("Fishing spot", "Vessel", new ItemReq("Karambwan vessel")), 16 | TRAWLER("Fishing spot", "Trawler", null), 17 | SANDWORM_BAIT("Fishing spot", "", null), 18 | BAIT_POT("Fishing spot", "", null), 19 | SWAMP_BAIT("Fishing spot", "", null); 20 | 21 | String spotName; 22 | String[] action; 23 | ItemReq[] itemReqs; 24 | 25 | FishingMethod(final String spotName, final String action, final ItemReq... itemReqs) { 26 | this.spotName = spotName; 27 | this.action = new String[]{action}; 28 | this.itemReqs = itemReqs; 29 | } 30 | 31 | FishingMethod(final String spotName, final String[] action, final ItemReq... itemReqs) { 32 | this.spotName = spotName; 33 | this.action = action; 34 | this.itemReqs = itemReqs; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/fletching/FletchItemType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.fletching; 2 | 3 | public enum FletchItemType { 4 | 5 | ARROW_SHAFT("Arrow shaft"), 6 | JAVELIN_SHAFT("Javelin shaft"), 7 | HEADLESS_ARROW("Headless arrow"), 8 | ARROW("Arrow"), 9 | BOW_U("Bow (u)"), 10 | BOW("Bow"), 11 | CROSSBOW_STOCK("Crossbow stock"), 12 | CROSSBOW_U("Crossbow (u)"), 13 | CROSSBOW("Crossbow"), 14 | DART("Dart"), 15 | SHIELD("Shield"); 16 | 17 | String name; 18 | 19 | FletchItemType(final String name) { 20 | this.name = name; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return name; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/fletching/FletchingActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.fletching; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import util.Sleep; 7 | import util.executable.Executable; 8 | import util.item_requirement.ItemReq; 9 | 10 | 11 | public class FletchingActivity extends Activity { 12 | 13 | private final FletchItem fletchItem; 14 | private final Executable bankNode; 15 | 16 | public FletchingActivity(final FletchItem fletchItem) { 17 | super(ActivityType.FLETCHING); 18 | this.fletchItem = fletchItem; 19 | bankNode = new ItemReqBanking(fletchItem.itemReqs); 20 | } 21 | 22 | @Override 23 | public void runActivity() throws InterruptedException { 24 | if (canMake()) { 25 | makeAllItem(fletchItem.itemReqs[1].toString(), fletchItem.itemReqs[0].toString()); 26 | } else { 27 | execute(bankNode); 28 | } 29 | } 30 | 31 | private boolean canMake() { 32 | return ItemReq.hasItemRequirements(fletchItem.itemReqs, getInventory()); 33 | } 34 | 35 | private void makeAllItem(String useItem, String interactItem) throws InterruptedException { 36 | if (getMakeAllInterface().isOpen()) { 37 | getMakeAllInterface().makeAll(fletchItem.widgetText); 38 | Sleep.sleepUntil(() -> !canMake() || getDialogues().isPendingContinuation(), 60_000); 39 | } else if (!useItem.equals(getInventory().getSelectedItemName())) { 40 | getInventory().use(useItem); 41 | } else if (getInventory().getItem(interactItem).interact()) { 42 | if (fletchItem.type != FletchItemType.DART) { 43 | Sleep.sleepUntil(() -> getMakeAllInterface().isOpen(), 3000); 44 | } 45 | } 46 | } 47 | 48 | @Override 49 | public FletchingActivity copy() { 50 | return new FletchingActivity(fletchItem); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/herblore/HerbloreType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.herblore; 2 | 3 | public enum HerbloreType { 4 | 5 | HERB_CLEANING("Herb cleaning"), 6 | POTION("Potion"); 7 | 8 | String name; 9 | 10 | HerbloreType(final String name) { 11 | this.name = name; 12 | } 13 | 14 | @Override 15 | public String toString() { 16 | return name; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/herblore/herb_cleaning/Herb.java: -------------------------------------------------------------------------------- 1 | package activities.skills.herblore.herb_cleaning; 2 | 3 | public enum Herb { 4 | 5 | GUAM("Guam leaf", "Grimy guam leaf"), 6 | ROGUES_PURSE("Rogue's purse", "Grimy rogue's purse"), 7 | MARRENTILL("Marrentill", "Grimy marrentill"), 8 | TARROMIN("Tarromin", ("Grimy tarromin")), 9 | HARRALANDER("Harralander", ("Grimy harralander")), 10 | RANARR_WEED("Ranarr weed", "Grimy ranarr weed"), 11 | TOADFLAX("Toadflax", "Grimy toadflax"), 12 | IRIT_LEAF("Irit leaf", "Grimy irit leaf"), 13 | AVANTOE("Avantoe", "Grimy avantoe"), 14 | KWUARM("Kwuarm", "Grimy kwuarm"), 15 | SNAPDRAGON("Snapdragon", "Grimy snapdragon"), 16 | CADANTINE("Cadantine", "Grimy cadantine"), 17 | LANTADYME("Lantadyme", "Grimy lantadyme"), 18 | DWARF_WEED("Dwarf weed", "Grimy dwarf weed"), 19 | TORSTOL("Torstol", "Grimy torstol"); 20 | 21 | public String grimyName; 22 | String name; 23 | 24 | Herb(final String name, final String grimyName) { 25 | this.name = name; 26 | this.grimyName = grimyName; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return name; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/herblore/herb_cleaning/HerbCleaningActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.herblore.herb_cleaning; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import util.Sleep; 7 | import util.executable.Executable; 8 | import util.item_requirement.ItemReq; 9 | 10 | public class HerbCleaningActivity extends Activity { 11 | 12 | private final Herb herb; 13 | private final ItemReq herbReq; 14 | private final Executable bankNode; 15 | 16 | public HerbCleaningActivity(final Herb herb) { 17 | super(ActivityType.HERBLORE); 18 | this.herb = herb; 19 | this.herbReq = new ItemReq(herb.grimyName, 1); 20 | bankNode = new ItemReqBanking(herbReq); 21 | } 22 | 23 | @Override 24 | public void runActivity() throws InterruptedException { 25 | if (ItemReq.hasItemRequirements(new ItemReq[]{ herbReq }, getInventory())) { 26 | cleanHerbs(); 27 | } else { 28 | execute(bankNode); 29 | } 30 | } 31 | 32 | private void cleanHerbs() { 33 | if (getInventory().interact("Clean", herb.grimyName)) { 34 | Sleep.sleepUntil(() -> { 35 | return !getInventory().contains(herb.grimyName) || 36 | getDialogues().isPendingContinuation(); 37 | }, 30_000); 38 | } 39 | } 40 | 41 | @Override 42 | public HerbCleaningActivity copy() { 43 | return new HerbCleaningActivity(herb); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/herblore/potion_making/PotionMakingActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.herblore.potion_making; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import util.Sleep; 7 | import util.executable.Executable; 8 | import util.item_requirement.ItemReq; 9 | 10 | 11 | public class PotionMakingActivity extends Activity { 12 | 13 | private final Potion potion; 14 | private final Executable bankNode; 15 | 16 | public PotionMakingActivity(final Potion potion) { 17 | super(ActivityType.HERBLORE); 18 | this.potion = potion; 19 | bankNode = new ItemReqBanking(potion.itemReqs); 20 | } 21 | 22 | @Override 23 | public void runActivity() throws InterruptedException { 24 | if (ItemReq.hasItemRequirements(potion.itemReqs, getInventory())) { 25 | makePotion(); 26 | } else { 27 | execute(bankNode); 28 | } 29 | } 30 | 31 | private void makePotion() throws InterruptedException { 32 | if (getMakeAllInterface().isOpen()) { 33 | getMakeAllInterface().makeAll(1); 34 | Sleep.sleepUntil(() -> !ItemReq.hasItemRequirements(potion.itemReqs, getInventory()) || getDialogues().isPendingContinuation(), 30_000); 35 | } else if (potion.itemReqs[1].toString().equals(getInventory().getSelectedItemName())) { 36 | if (getInventory().getItem(potion.itemReqs[0].toString()).interact()) { 37 | Sleep.sleepUntil(() -> getMakeAllInterface().isOpen(), 3000); 38 | } 39 | } else { 40 | getInventory().use(potion.itemReqs[1].toString()); 41 | } 42 | } 43 | 44 | @Override 45 | public PotionMakingActivity copy() { 46 | return new PotionMakingActivity(potion); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/magic/MagicActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.magic; 2 | 3 | import activities.activity.Activity; 4 | 5 | public class MagicActivity extends Activity { 6 | 7 | private final Spell spell; 8 | 9 | public MagicActivity(final Spell spell) { 10 | super(null);//ActivityType.MAGIC); 11 | this.spell = spell; 12 | } 13 | 14 | @Override 15 | public void runActivity() throws InterruptedException { 16 | } 17 | 18 | @Override 19 | public MagicActivity copy() { 20 | return new MagicActivity(spell); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/magic/Rune.java: -------------------------------------------------------------------------------- 1 | package activities.skills.magic; 2 | 3 | public enum Rune { 4 | AIR("Air rune"), 5 | MIND("Mind rune"), 6 | WATER("Water rune"), 7 | EARTH("Earth rune"), 8 | FIRE("Fire rune"), 9 | BODY("Body rune"), 10 | COSMIC("Cosmic rune"), 11 | CHAOS("Chaos rune"), 12 | NATURE("Nature rune"), 13 | LAW("Law rune"), 14 | DEATH("Death rune"), 15 | ASTRAL("Astral rune"), 16 | BLOOD("Blood rune"), 17 | SOUL("Soul rune"), 18 | WRATH("Wrath rune"), 19 | MIST("Mist rune"), 20 | DUST("Dust rune"), 21 | MUD("Mud rune"), 22 | SMOKE("Smoke rune"), 23 | STEAM("Steam rune"), 24 | LAVA("Lava rune"); 25 | 26 | private String name; 27 | 28 | Rune(final String name) { 29 | this.name = name; 30 | } 31 | 32 | public String toString() { 33 | return name; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/magic/SpellType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.magic; 2 | 3 | public enum SpellType { 4 | ALCH 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/magic/Staff.java: -------------------------------------------------------------------------------- 1 | package activities.skills.magic; 2 | 3 | public enum Staff { 4 | STAFF_OF_AIR("Staff of air", Rune.AIR), 5 | STAFF_OF_WATER("Staff of water", Rune.WATER), 6 | STAFF_OF_EARTH("Staff of earth", Rune.EARTH), 7 | STAFF_OF_FIRE("Staff of fire", Rune.FIRE), 8 | 9 | AIR_BATTLESTAFF("Air battlestaff", Rune.AIR), 10 | WATER_BATTLESTAFF("Water battlestaff", Rune.WATER), 11 | EARTH_BATTLESTAFF("Earth battlestaff", Rune.EARTH), 12 | FIRE_BATTLESTAFF("Fire battlestaff", Rune.FIRE), 13 | LAVA_BATTLESTAFF("Lava battlestaff", Rune.EARTH, Rune.FIRE), 14 | MUD_BATTLESTAFF("Mud battlestaff", Rune.EARTH, Rune.WATER), 15 | STEAM_BATTLESTAFF("Steam battlestaff", Rune.FIRE, Rune.WATER), 16 | SMOKE_BATTLESTAFF("Smoke battlestaff", Rune.FIRE, Rune.AIR), 17 | MIST_BATTLESTAFF("Mist battlestaff", Rune.WATER, Rune.AIR), 18 | DUST_BATTLESTAFF("Dust battlestaff", Rune.EARTH, Rune.AIR); 19 | 20 | private String name; 21 | private Rune[] runes; 22 | 23 | Staff(final String name, final Rune... runes) { 24 | this.name = name; 25 | this.runes = runes; 26 | } 27 | 28 | public String getName() { 29 | return name; 30 | } 31 | 32 | public Rune[] getRunes() { 33 | return runes; 34 | } 35 | 36 | @Override 37 | public String toString() { 38 | return getName(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/mining/Pickaxe.java: -------------------------------------------------------------------------------- 1 | package activities.skills.mining; 2 | 3 | import org.osbot.rs07.api.Skills; 4 | import org.osbot.rs07.api.ui.Skill; 5 | import util.Tool; 6 | 7 | import java.util.Arrays; 8 | import java.util.List; 9 | import java.util.stream.Collectors; 10 | 11 | public enum Pickaxe implements Tool { 12 | 13 | BRONZE("Bronze pickaxe", 1, 1), 14 | IRON("Iron pickaxe", 1, 1), 15 | STEEL("Steel pickaxe", 6, 5), 16 | BLACK("Black pickaxe", 11, 10), 17 | MITHRIL("Mithril pickaxe", 21, 20), 18 | ADAMANT("Adamant pickaxe", 31, 30), 19 | RUNE("Rune pickaxe", 41, 40), 20 | DRAGON("Dragon pickaxe", 61, 60, true), 21 | INFERNAL("Infernal pickaxe", 61, 60, true); 22 | 23 | String name; 24 | int miningLevelRequired; 25 | int attackLevelRequired; 26 | boolean membersOnly; 27 | 28 | Pickaxe(final String name, final int miningLevelRequired, final int attackLevelRequired) { 29 | this.name = name; 30 | this.miningLevelRequired = miningLevelRequired; 31 | this.attackLevelRequired = attackLevelRequired; 32 | } 33 | 34 | Pickaxe(final String name, final int miningLevelRequired, final int attackLevelRequired, final boolean membersOnly) { 35 | this(name, miningLevelRequired, attackLevelRequired); 36 | this.membersOnly = membersOnly; 37 | } 38 | 39 | public static List getNames() { 40 | return Arrays.stream(values()).map(Pickaxe::toString).collect(Collectors.toList()); 41 | } 42 | 43 | @Override 44 | public String getName() { 45 | return name; 46 | } 47 | 48 | @Override 49 | public boolean isMembersOnly() { 50 | return membersOnly; 51 | } 52 | 53 | @Override 54 | public int getLevelRequired() { 55 | return miningLevelRequired; 56 | } 57 | 58 | @Override 59 | public boolean canUse(Skills skills) { 60 | return skills.getStatic(Skill.MINING) >= miningLevelRequired; 61 | } 62 | 63 | @Override 64 | public boolean canEquip(Skills skills) { 65 | return skills.getStatic(Skill.ATTACK) >= attackLevelRequired; 66 | } 67 | 68 | @Override 69 | public String toString() { 70 | return name; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/mining/Rock.java: -------------------------------------------------------------------------------- 1 | package activities.skills.mining; 2 | 3 | import org.osbot.rs07.api.filter.Filter; 4 | import org.osbot.rs07.api.model.Entity; 5 | import org.osbot.rs07.api.model.RS2Object; 6 | import org.osbot.rs07.script.MethodProvider; 7 | 8 | import java.util.stream.Stream; 9 | 10 | public enum Rock { 11 | 12 | CLAY(new short[]{6705}, "Clay"), 13 | COPPER(new short[]{4645, 4510}, "Copper ore"), 14 | TIN(new short[]{53}, "Tin ore"), 15 | IRON(new short[]{2576}, "Iron ore"), 16 | SILVER(new short[]{74}, "Silver"), 17 | COAL(new short[]{10508}, "Coal"), 18 | GOLD(new short[]{8885}, "Gold"), 19 | MITHRIL(new short[]{-22239}, "Mithril ore"), 20 | ADAMANTITE(new short[]{21662}, "Adamantite ore"), 21 | RUNITE(new short[]{-31437}, "Runite ore"), 22 | RUNE_ESSENCE(null, "Rune essence"); 23 | 24 | public String ORE; 25 | public short[] COLOURS; 26 | 27 | Rock(final short[] COLOURS, final String ORE) { 28 | this.COLOURS = COLOURS; 29 | this.ORE = ORE; 30 | } 31 | 32 | public RS2Object getClosestWithOre(final MethodProvider methods, final Filter... filters) { 33 | //noinspection unchecked 34 | return methods.getObjects().closest( 35 | obj -> Stream.of(filters).allMatch(f -> f.match(obj)) 36 | && hasOre(obj) 37 | ); 38 | } 39 | 40 | public boolean hasOre(final Entity rockEntity) { 41 | if (rockEntity.getDefinition() == null) { 42 | return false; 43 | } 44 | 45 | short[] colours = rockEntity.getDefinition().getModifiedModelColors(); 46 | 47 | if (colours == null) { 48 | return false; 49 | } 50 | 51 | for (short rockColour : this.COLOURS) { 52 | for (short entityColour : colours) { 53 | if (rockColour == entityColour) { 54 | return true; 55 | } 56 | } 57 | } 58 | return false; 59 | } 60 | 61 | @Override 62 | public String toString() { 63 | char[] name = name().toLowerCase().replace("_", " ").toCharArray(); 64 | name[0] = Character.toUpperCase(name[0]); 65 | return new String(name); 66 | } 67 | } -------------------------------------------------------------------------------- /src/main/java/activities/skills/mining/RockArea.java: -------------------------------------------------------------------------------- 1 | package activities.skills.mining; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | 5 | public class RockArea { 6 | 7 | final Rock rock; 8 | final Area area; 9 | 10 | public RockArea(final Rock rock, final Area area) { 11 | this.rock = rock; 12 | this.area = area; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/ranged/Bow.java: -------------------------------------------------------------------------------- 1 | package activities.skills.ranged; 2 | 3 | public enum Bow { 4 | 5 | TRAINING_BOW("Training bow", 1), 6 | SHORTBOW("Shortbow", 1), 7 | LONGBOW("Longbow", 1), 8 | OAK_SHORTBOW("Oak shortbow", 5), 9 | OAK_LONGBOW("Oak longbow", 5), 10 | WILLOW_SHORTBOW("Willow shortbow", 20), 11 | WILLOW_COMP_BOW("Willow comp bow", 20), 12 | WILLOW_LONGBOW("Willow longbow", 20), 13 | MAPLE_SHORTBOW("Maple shortbow", 30), 14 | MAPLE_LONGBOW("Maple longbow", 30), 15 | OGRE_BOW("Ogre bow", 30), 16 | COMP_OGRE_BOW("Comp ogre bow", 30), 17 | YEW_SHORTBOW("Yew shortbow", 40), 18 | YEW_LONGBOW("Yew longbow", 40), 19 | YEW_COMP_BOW("Yew comp bow", 40), 20 | MAGIC_SHORTBOW("Magic shortbow", 50), 21 | MAGIC_LONGBOW("Magic longbow", 50), 22 | MAGIC_COMP_BOW("Magic comp bow", 50), 23 | SEERCULL("Seercull", 50), 24 | DARK_BOW("Dark bow", 60), 25 | THIRD_AGE_BOW("3rd age bow", 65), 26 | CRYSTAL_BOW("Crystal bow", 70); 27 | 28 | String name; 29 | int rangedLvl; 30 | 31 | Bow(final String name, final int rangedLvl) { 32 | this.name = name; 33 | this.rangedLvl = rangedLvl; 34 | } 35 | 36 | @Override 37 | public String toString() { 38 | return name; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/runecrafting/Altar.java: -------------------------------------------------------------------------------- 1 | package activities.skills.runecrafting; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | 5 | public enum Altar { 6 | 7 | AIR("Air altar", "Air talisman", "Air tiara", false, new Area(2981, 3289, 2989, 3295)), 8 | MIND("Mind altar", "Mind talisman", "Mind tiara", false, new Area(2978, 3508, 2987, 3517)), 9 | WATER("Water altar", "Water talisman", "Water tiara", false, new Area(3180, 3161, 3187, 3167)), 10 | EARTH("Earth altar", "Earth talisman", "Earth tiara", false, new Area(3300, 3471, 3310, 3479)), 11 | FIRE("Fire altar", "Fire talisman", "Fire tiara", false, new Area(3311, 3255, 3319, 3264)), 12 | BODY("Body altar", "Body talisman", "Body tiara", false, new Area(3049, 3437, 3058, 3448)), 13 | CHAOS("Chaos altar", "Chaos talisman", "Chaos tiara", true, new Area(3058, 3588, 3069, 3598)), 14 | ASTRAL("Astral altar", "", "", true, new Area(2151, 3859, 2164, 3871)), 15 | NATURE("Nature altar", "Nature talisman", "Nature tiara", true, new Area(2860, 3017, 2868, 3024)), 16 | LAW("Law altar", "Law talisman", "Law tiara", true, new Area(2855, 3371, 2865, 3382)); 17 | //BLOOD ("Blood altar", "", "", true, new Area(1713, 3825, 1721, 3833)), 18 | //SOUL ("Soul altar", "", "", true, new Area(1812, 3851, 1818, 3857)); 19 | 20 | String name; 21 | String talisman; 22 | String tiara; 23 | boolean pureEss; 24 | Area area; 25 | 26 | Altar(final String name, final String talisman, final String tiara, final boolean pureEss, final Area area) { 27 | this.name = name; 28 | this.area = area; 29 | this.talisman = talisman; 30 | this.tiara = tiara; 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return name; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/runecrafting/EssenceType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.runecrafting; 2 | 3 | public enum EssenceType { 4 | RUNE("Rune essence"), 5 | PURE("Pure essence"); 6 | 7 | private String name; 8 | 9 | EssenceType(final String name) { 10 | this.name = name; 11 | } 12 | 13 | @Override 14 | public String toString() { 15 | return name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/runecrafting/RunecraftingBase.java: -------------------------------------------------------------------------------- 1 | package activities.skills.runecrafting; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import org.osbot.rs07.api.model.RS2Object; 6 | import org.osbot.rs07.event.WebWalkEvent; 7 | import org.osbot.rs07.utility.Condition; 8 | import util.Sleep; 9 | 10 | abstract class RunecraftingBase extends Activity { 11 | 12 | final Altar altar; 13 | 14 | RunecraftingBase(final Altar altar) { 15 | super(ActivityType.RUNECRAFTING); 16 | this.altar = altar; 17 | } 18 | 19 | void walkToAltar() { 20 | WebWalkEvent webWalkEvent = new WebWalkEvent(altar.area); 21 | webWalkEvent.setBreakCondition(new Condition() { 22 | @Override 23 | public boolean evaluate() { 24 | return altar.area.contains(myPosition()) && getObjects().closest("Mysterious ruins") != null; 25 | } 26 | }); 27 | execute(webWalkEvent); 28 | } 29 | 30 | RS2Object getAltar() { 31 | return getObjects().closest(obj -> obj.getName().equals("Altar") && obj.hasAction("Craft-rune")); 32 | } 33 | 34 | void enterAltar() { 35 | if (getInventory().contains(altar.talisman)) { 36 | enterAltarUsingTalisman(); 37 | } else { 38 | enterAltarUsingTiara(); 39 | } 40 | } 41 | 42 | void enterAltarUsingTalisman() { 43 | if (!altar.talisman.equals(getInventory().getSelectedItemName())) { 44 | if (getInventory().isItemSelected()) { 45 | getInventory().deselectItem(); 46 | } else { 47 | getInventory().use(altar.talisman); 48 | } 49 | } else if (getObjects().closest("Mysterious ruins").interact("Use")) { 50 | Sleep.sleepUntil(() -> getAltar() != null, 5000); 51 | } 52 | } 53 | 54 | void enterAltarUsingTiara() { 55 | if (getObjects().closest("Mysterious ruins").interact("Enter")) { 56 | Sleep.sleepUntil(() -> getAltar() != null, 10000); 57 | } 58 | } 59 | 60 | void leaveAltar() { 61 | if (getObjects().closest("Portal").interact("Use")) { 62 | Sleep.sleepUntil(() -> getObjects().closest("Altar") == null, 10_000); 63 | } 64 | } 65 | 66 | @Override 67 | public boolean canExit() { 68 | return getAltar() == null; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/runecrafting/RunecraftingType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.runecrafting; 2 | 3 | public enum RunecraftingType { 4 | RUNES("Runes"), 5 | TIARAS("Tiaras"); 6 | 7 | private String name; 8 | 9 | RunecraftingType(final String name) { 10 | this.name = name; 11 | } 12 | 13 | @Override 14 | public String toString() { 15 | return name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/runecrafting/TiaraMakingActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.runecrafting; 2 | 3 | import activities.banking.ItemReqBanking; 4 | import util.executable.Executable; 5 | import util.item_requirement.ItemReq; 6 | 7 | 8 | public class TiaraMakingActivity extends RunecraftingBase { 9 | 10 | private final ItemReq[] itemReqs; 11 | private final Executable bankNode; 12 | 13 | public TiaraMakingActivity(final Altar altar) { 14 | super(altar); 15 | itemReqs = new ItemReq[]{new ItemReq("Tiara", 1), new ItemReq(altar.talisman, 1)}; 16 | bankNode = new ItemReqBanking(itemReqs); 17 | } 18 | 19 | @Override 20 | public void runActivity() throws InterruptedException { 21 | if (ItemReq.hasItemRequirements(itemReqs, getInventory())) { 22 | if (getAltar() != null) { 23 | makeTiaras(); 24 | } else if (getObjects().closest("Mysterious ruins") != null && altar.area.contains(myPosition())) { 25 | enterAltar(); 26 | } else { 27 | walkToAltar(); 28 | } 29 | } else if (getAltar() != null) { 30 | leaveAltar(); 31 | } else { 32 | execute(bankNode); 33 | } 34 | } 35 | 36 | private void makeTiaras() throws InterruptedException { 37 | if (!"Tiara".equals(getInventory().getSelectedItemName())) { 38 | if (getInventory().isItemSelected()) { 39 | getInventory().deselectItem(); 40 | } else { 41 | getInventory().interact("Use", "Tiara"); 42 | } 43 | } else { 44 | getAltar().interact("Use"); 45 | } 46 | } 47 | 48 | @Override 49 | public TiaraMakingActivity copy() { 50 | return new TiaraMakingActivity(altar); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/Bar.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing; 2 | 3 | import util.item_requirement.ItemReq; 4 | 5 | public enum Bar { 6 | 7 | BRONZE("Bronze bar", 1, true, new ItemReq("Copper ore", 1), new ItemReq("Tin ore", 1)), 8 | IRON("Iron bar", 15, true, new ItemReq("Iron ore", 1)), 9 | SILVER("Silver bar", 20, false, new ItemReq("Silver ore", 1)), 10 | STEEL("Steel bar", 30, true, new ItemReq("Coal", 2), new ItemReq("Iron ore", 1)), 11 | GOLD("Gold bar", 40, false, new ItemReq("Gold ore", 1)), 12 | MITHRIL("Mithril bar", 50, true, new ItemReq("Coal", 4), new ItemReq("Mithril ore", 1)), 13 | ADAMANTITE("Adamantite bar", 70, true, new ItemReq("Coal", 6), new ItemReq("Adamantite ore", 1)), 14 | RUNITE("Runite bar", 85, true, new ItemReq("Coal", 8), new ItemReq("Runite ore", 1)); 15 | 16 | public boolean smithable; 17 | public ItemReq[] oresRequired; 18 | String name; 19 | int levelRequired; 20 | 21 | Bar(final String name, final int levelRequired, final boolean smithable, final ItemReq... oresRequired) { 22 | this.name = name; 23 | this.smithable = smithable; 24 | this.levelRequired = levelRequired; 25 | this.oresRequired = oresRequired; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return name; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/SmithingType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing; 2 | 3 | public enum SmithingType { 4 | 5 | SMELT_BAR("Smelt Bar"), 6 | SMITH_ITEM("Smith Item"), 7 | CANNONBALLS("Cannonballs"); 8 | 9 | String name; 10 | 11 | SmithingType(final String name) { 12 | this.name = name; 13 | } 14 | 15 | @Override 16 | public String toString() { 17 | return name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/cannonballs/CannonballActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing.cannonballs; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import activities.skills.smithing.smelting.SmeltLocation; 7 | import util.Sleep; 8 | import util.executable.Executable; 9 | import util.item_requirement.ItemReq; 10 | 11 | public class CannonballActivity extends Activity { 12 | 13 | private final SmeltLocation smeltLocation; 14 | private final ItemReq[] itemReqs = { 15 | new ItemReq("Ammo mould"), 16 | new ItemReq("Steel bar", 1) 17 | }; 18 | private final Executable bankNode = new ItemReqBanking(itemReqs); 19 | 20 | public CannonballActivity(final SmeltLocation smeltLocation) { 21 | super(ActivityType.SMITHING); 22 | this.smeltLocation = smeltLocation; 23 | } 24 | 25 | @Override 26 | public void runActivity() throws InterruptedException { 27 | if (canMakeCannonballs()) { 28 | if (!smeltLocation.location.getArea().contains(myPosition())) { 29 | getWalking().webWalk(smeltLocation.location.getArea()); 30 | } else { 31 | makeCannonballs(); 32 | } 33 | } else { 34 | execute(bankNode); 35 | } 36 | } 37 | 38 | private boolean canMakeCannonballs() { 39 | return ItemReq.hasItemRequirements(itemReqs, getInventory()); 40 | } 41 | 42 | private void makeCannonballs() throws InterruptedException { 43 | if (!getMakeAllInterface().isOpen()) { 44 | useFurance(); 45 | } { 46 | getMakeAllInterface().makeAll(1); 47 | Sleep.sleepUntil(() -> !canMakeCannonballs() || getDialogues().isPendingContinuation(), 150_000); 48 | } 49 | } 50 | 51 | private void useFurance() { 52 | if (getObjects().closest("Furnace").interact("Smelt")) { 53 | Sleep.sleepUntil(() -> getMakeAllInterface().isOpen(), 5000); 54 | } 55 | } 56 | 57 | @Override 58 | public CannonballActivity copy() { 59 | return new CannonballActivity(smeltLocation); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/item_making/SmithItem.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing.item_making; 2 | 3 | public enum SmithItem { 4 | 5 | DAGGER("Dagger", 1), 6 | SWORD("Sword", 1), 7 | SCIMITAR("Scimitar", 2), 8 | LONG_SWORD("Long sword", 2), 9 | TWO_HANDED_SWORD("2-hand sword", 3), 10 | AXE("Axe", 1), 11 | MACE("Mace", 1), 12 | WARHAMMER("Warhammer", 3), 13 | BATTLE_AXE("Battle axe", 3), 14 | CLAWS("Claws", 2), 15 | CHAIN_BODY("Chain body", 3), 16 | PLATE_LEGS("Plate legs", 3), 17 | PLATE_SKIRT("Plate skirt", 3), 18 | PLATE_BODY("Plate body", 5), 19 | NAILS("Nails", 1), 20 | MED_HELM("Medium helm", 1), 21 | FULL_HELM("Full helm", 2), 22 | SQUARE_SHIELD("Square shield", 2), 23 | KITE_SHIELD("Kite shield", 3), 24 | BULLSEYE_LANTERN("Bullseye lantern", 1), 25 | DART_TIPS("Dart tips", 1), 26 | ARROW_TIPS("Arrowtips", 1), 27 | THROWING_KNIVES("Throwing knives", 1), 28 | STUDS("Studs", 1), 29 | WIRE("Wire", 1), 30 | BOLTS("Bolts", 1), 31 | Limbs("Limbs", 1); 32 | 33 | String name; 34 | int barsRequired; 35 | 36 | SmithItem(final String name, final int barsRequired) { 37 | this.name = name; 38 | this.barsRequired = barsRequired; 39 | } 40 | 41 | @Override 42 | public String toString() { 43 | return name; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/item_making/SmithItemMakingActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing.item_making; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import activities.skills.smithing.Bar; 7 | import org.osbot.rs07.api.ui.RS2Widget; 8 | import util.Sleep; 9 | import util.executable.Executable; 10 | import util.item_requirement.ItemReq; 11 | import util.widget.CachedWidget; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class SmithItemMakingActivity extends Activity { 17 | 18 | private final Bar bar; 19 | private final SmithItem smithItem; 20 | private final SmithLocation smithLocation; 21 | private final CachedWidget smithItemWidget; 22 | private final ItemReq[] itemReqs; 23 | 24 | private Executable bankNode; 25 | 26 | public SmithItemMakingActivity(final Bar bar, final SmithItem smithItem, final SmithLocation smithLocation) { 27 | super(ActivityType.SMITHING); 28 | this.bar = bar; 29 | this.smithItem = smithItem; 30 | this.smithLocation = smithLocation; 31 | smithItemWidget = new CachedWidget(smithItem.name); 32 | 33 | List itemReqs = new ArrayList<>(); 34 | itemReqs.add(new ItemReq(bar.toString(), smithItem.barsRequired)); 35 | itemReqs.add(new ItemReq("Hammer")); 36 | this.itemReqs = itemReqs.toArray(new ItemReq[0]); 37 | bankNode = new ItemReqBanking(this.itemReqs); 38 | } 39 | 40 | @Override 41 | public void runActivity() throws InterruptedException { 42 | if (canSmithItem()) { 43 | if (!smithLocation.location.getArea().contains(myPosition())) { 44 | getWalking().webWalk(smithLocation.location.getArea()); 45 | } else if (smithItemWidget.getParent(getWidgets()).map(RS2Widget::isVisible).isPresent()) { 46 | smithAll(); 47 | } else { 48 | useAnvil(); 49 | } 50 | } else { 51 | execute(bankNode); 52 | } 53 | } 54 | 55 | private boolean canSmithItem() { 56 | return getInventory().contains("Hammer") && 57 | getInventory().getAmount(bar.toString()) >= smithItem.barsRequired; 58 | } 59 | 60 | private void smithAll() { 61 | if (smithItemWidget.getParent(getWidgets()).get().interact("Smith")) { 62 | Sleep.sleepUntil(() -> !canSmithItem() || getDialogues().isPendingContinuation(), 100_000); 63 | } 64 | } 65 | 66 | private void useAnvil() { 67 | if (getObjects().closest("Anvil").interact("Smith")) { 68 | Sleep.sleepUntil(() -> smithItemWidget.getParent(getWidgets()).map(RS2Widget::isVisible).isPresent(), 5000); 69 | } 70 | } 71 | 72 | @Override 73 | public SmithItemMakingActivity copy() { 74 | return new SmithItemMakingActivity(bar, smithItem, smithLocation); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/item_making/SmithLocation.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing.item_making; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import util.Location; 5 | 6 | public enum SmithLocation { 7 | 8 | VARROCK(new Location("Varrock", new Area(3185, 3420, 3190, 3427))), 9 | SEERS_VILLAGE(new Location("Seers' Village", new Area( 10 | new int[][]{ 11 | {2706, 3487}, 12 | {2706, 3492}, 13 | {2704, 3492}, 14 | {2704, 3499}, 15 | {2706, 3499}, 16 | {2706, 3497}, 17 | {2709, 3497}, 18 | {2709, 3496}, 19 | {2715, 3496}, 20 | {2715, 3492}, 21 | {2712, 3492}, 22 | {2712, 3487} 23 | } 24 | ))); 25 | 26 | Location location; 27 | 28 | SmithLocation(final Location location) { 29 | this.location = location; 30 | } 31 | 32 | @Override 33 | public String toString() { 34 | return location.toString(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/smelting/SmeltLocation.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing.smelting; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import util.Location; 5 | 6 | public enum SmeltLocation { 7 | 8 | AL_KHARID(new Location("Al-Kharid", new Area(3272, 3184, 3279, 3188))), 9 | EDGEVILLE(new Location("Edgeville", new Area(3105, 3496, 3110, 3501))), 10 | FALADOR(new Location("Falador", new Area( 11 | new int[][]{ 12 | {2970, 3368}, 13 | {2970, 3377}, 14 | {2974, 3377}, 15 | {2974, 3375}, 16 | {2978, 3375}, 17 | {2978, 3373}, 18 | {2976, 3373}, 19 | {2976, 3368} 20 | } 21 | ))); 22 | 23 | public Location location; 24 | 25 | SmeltLocation(final Location location) { 26 | this.location = location; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return location.toString(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/smithing/smelting/SmeltingActivity.java: -------------------------------------------------------------------------------- 1 | package activities.skills.smithing.smelting; 2 | 3 | import activities.activity.Activity; 4 | import activities.activity.ActivityType; 5 | import activities.banking.ItemReqBanking; 6 | import activities.skills.smithing.Bar; 7 | import util.Sleep; 8 | import util.executable.Executable; 9 | import util.item_requirement.ItemReq; 10 | 11 | public class SmeltingActivity extends Activity { 12 | 13 | private final Bar bar; 14 | private final SmeltLocation smeltLocation; 15 | private final Executable bankNode; 16 | 17 | public SmeltingActivity(final Bar bar, final SmeltLocation smeltLocation) { 18 | super(ActivityType.SMITHING); 19 | this.bar = bar; 20 | this.smeltLocation = smeltLocation; 21 | bankNode = new ItemReqBanking(bar.oresRequired); 22 | } 23 | 24 | @Override 25 | public void runActivity() throws InterruptedException { 26 | if (canSmeltBar()) { 27 | if (!smeltLocation.location.getArea().contains(myPosition())) { 28 | getWalking().webWalk(smeltLocation.location.getArea()); 29 | } else { 30 | smeltBars(); 31 | } 32 | } else { 33 | execute(bankNode); 34 | } 35 | } 36 | 37 | private boolean canSmeltBar() { 38 | return ItemReq.hasItemRequirements(bar.oresRequired, getInventory()); 39 | } 40 | 41 | private void smeltBars() throws InterruptedException { 42 | if (!getMakeAllInterface().isOpen()) { 43 | useFurance(); 44 | } else { 45 | getMakeAllInterface().makeAll(bar.toString()); 46 | Sleep.sleepUntil(() -> !canSmeltBar() || getDialogues().isPendingContinuation(), 60_000); 47 | } 48 | } 49 | 50 | private void useFurance() { 51 | if (getObjects().closest("Furnace").interact("Smelt")) { 52 | Sleep.sleepUntil(() -> getMakeAllInterface().isOpen(), 5000); 53 | } 54 | } 55 | 56 | @Override 57 | public SmeltingActivity copy() { 58 | return new SmeltingActivity(bar, smeltLocation); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/thieving/ThievingType.java: -------------------------------------------------------------------------------- 1 | package activities.skills.thieving; 2 | 3 | public enum ThievingType { 4 | 5 | NPC, 6 | STALL; 7 | //CHEST; 8 | 9 | @Override 10 | public String toString() { 11 | char[] name = name().toLowerCase().toCharArray(); 12 | name[0] = Character.toUpperCase(name[0]); 13 | return new String(name); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/activities/skills/woodcutting/Axe.java: -------------------------------------------------------------------------------- 1 | package activities.skills.woodcutting; 2 | 3 | import org.osbot.rs07.api.Skills; 4 | import org.osbot.rs07.api.ui.Skill; 5 | import util.Tool; 6 | 7 | public enum Axe implements Tool { 8 | 9 | BRONZE("Bronze axe", 1, 1), 10 | IRON("Iron axe", 1, 1), 11 | STEEL("Steel axe", 6, 5), 12 | BLACK("Black axe", 11, 10), 13 | MITHRIL("Mithril axe", 21, 20), 14 | ADAMANT("Adamant axe", 31, 30), 15 | RUNE("Rune axe", 41, 40), 16 | DRAGON("Dragon axe", 61, 60, true), 17 | INFERNAL("Infernal axe", 61, 60, true); 18 | 19 | String name; 20 | int wcLevelRequired; 21 | int attLevelRequired; 22 | boolean membersOnly; 23 | 24 | Axe(final String name, final int wcLevelRequired, final int attLevelRequired) { 25 | this.name = name; 26 | this.wcLevelRequired = wcLevelRequired; 27 | this.attLevelRequired = attLevelRequired; 28 | } 29 | 30 | Axe(final String name, final int wcLevelRequired, final int attLevelRequired, final boolean membersOnly) { 31 | this(name, wcLevelRequired, attLevelRequired); 32 | this.membersOnly = membersOnly; 33 | } 34 | 35 | @Override 36 | public String getName() { 37 | return name; 38 | } 39 | 40 | @Override 41 | public boolean isMembersOnly() { 42 | return membersOnly; 43 | } 44 | 45 | @Override 46 | public int getLevelRequired() { 47 | return wcLevelRequired; 48 | } 49 | 50 | @Override 51 | public boolean canUse(Skills skills) { 52 | return skills.getStatic(Skill.WOODCUTTING) >= wcLevelRequired; 53 | } 54 | 55 | @Override 56 | public boolean canEquip(Skills skills) { 57 | return skills.getStatic(Skill.ATTACK) >= attLevelRequired; 58 | } 59 | 60 | @Override 61 | public String toString() { 62 | return name; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/activities/tutorial_island/CookingSection.java: -------------------------------------------------------------------------------- 1 | package activities.tutorial_island; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | import util.Sleep; 6 | 7 | import java.util.Arrays; 8 | import java.util.List; 9 | 10 | public class CookingSection extends TutorialSection { 11 | 12 | private static final Area COOK_BUILDING = new Area(3073, 3083, 3078, 3086); 13 | private static final List PATH_TO_COOK_BUILDING = Arrays.asList( 14 | new Position(3087, 3091, 0), 15 | new Position(3083, 3086, 0), 16 | new Position(3080, 3083, 0) 17 | ); 18 | 19 | public CookingSection() { 20 | super("Master Chef"); 21 | } 22 | 23 | @Override 24 | public final void run() throws InterruptedException { 25 | if (pendingContinue()) { 26 | selectContinue(); 27 | return; 28 | } 29 | switch (getProgress()) { 30 | case 130: 31 | if (getWalking().walkPath(PATH_TO_COOK_BUILDING)) { 32 | if (getDoorHandler().handleNextObstacle(COOK_BUILDING)) { 33 | Sleep.sleepUntil(() -> getProgress() == 140, 5000, 600); 34 | } 35 | } 36 | break; 37 | case 140: 38 | talkToInstructor(); 39 | break; 40 | case 150: 41 | makeDough(); 42 | break; 43 | case 160: 44 | bakeDough(); 45 | break; 46 | case 170: 47 | if (getDoorHandler().handleNextObstacle(new Position(3071, 3090, 0))) { 48 | Sleep.sleepUntil(() -> getProgress() != 170, 5000, 600); 49 | } 50 | break; 51 | } 52 | } 53 | 54 | private void makeDough() { 55 | if (!"Pot of flour".equals(getInventory().getSelectedItemName())) { 56 | getInventory().interact("Use", "Pot of flour"); 57 | } else if (getInventory().getItem("Bucket of water").interact()) { 58 | Sleep.sleepUntil(() -> getInventory().contains("Bread dough"), 3000, 600); 59 | } 60 | } 61 | 62 | private void bakeDough() { 63 | if (!"Bread dough".equals(getInventory().getSelectedItemName())) { 64 | getInventory().interact("Use", "Bread dough"); 65 | } else if (getObjects().closest("Range").interact()) { 66 | Sleep.sleepUntil(() -> getInventory().contains("Bread"), 5000, 600); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/activities/tutorial_island/PriestSection.java: -------------------------------------------------------------------------------- 1 | package activities.tutorial_island; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | import org.osbot.rs07.api.ui.Tab; 6 | import util.Sleep; 7 | 8 | import java.util.Arrays; 9 | import java.util.List; 10 | 11 | public final class PriestSection extends TutorialSection { 12 | 13 | private static final Area CHURCH_AREA = new Area(3120, 3103, 3128, 3110); 14 | 15 | private static final List PATH_TO_CHURCH = Arrays.asList( 16 | new Position(3131, 3124, 0), 17 | new Position(3134, 3121, 0), 18 | new Position(3134, 3117, 0), 19 | new Position(3132, 3114, 0), 20 | new Position(3130, 3111, 0), 21 | new Position(3130, 3108, 0), 22 | new Position(3129, 3106, 0) 23 | ); 24 | 25 | public PriestSection() { 26 | super("Brother Brace"); 27 | } 28 | 29 | @Override 30 | public final void run() throws InterruptedException { 31 | if (pendingContinue()) { 32 | selectContinue(); 33 | return; 34 | } 35 | 36 | switch (getProgress()) { 37 | case 550: 38 | if (getInstructor() == null) { 39 | getWalking().walkPath(PATH_TO_CHURCH); 40 | } else if (!getMap().canReach(getInstructor())) { 41 | getDoorHandler().handleNextObstacle(CHURCH_AREA); 42 | } else { 43 | talkToInstructor(); 44 | } 45 | break; 46 | case 560: 47 | getTabs().open(Tab.PRAYER); 48 | break; 49 | case 570: 50 | talkToInstructor(); 51 | break; 52 | case 580: 53 | getTabs().open(Tab.FRIENDS); 54 | break; 55 | case 590: 56 | getTabs().open(Tab.IGNORES); 57 | break; 58 | case 600: 59 | talkToInstructor(); 60 | break; 61 | case 610: 62 | if (getDoorHandler().handleNextObstacle(new Position(3122, 3101, 0))) { 63 | Sleep.sleepUntil(() -> getProgress() != 610, 5000, 600); 64 | } 65 | break; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/activities/tutorial_island/QuestSection.java: -------------------------------------------------------------------------------- 1 | package activities.tutorial_island; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | import org.osbot.rs07.api.map.Position; 5 | import org.osbot.rs07.api.ui.Tab; 6 | import util.Sleep; 7 | 8 | import java.util.Arrays; 9 | import java.util.List; 10 | 11 | public final class QuestSection extends TutorialSection { 12 | 13 | private static final Area QUEST_BUILDING = new Area(3083, 3119, 3089, 3125); 14 | 15 | private static final List PATH_TO_QUEST_BUILDING = Arrays.asList( 16 | new Position(3071, 3090, 0), 17 | new Position(3071, 3094, 0), 18 | new Position(3071, 3099, 0), 19 | new Position(3072, 3103, 0), 20 | new Position(3074, 3108, 0), 21 | new Position(3076, 3111, 0), 22 | new Position(3077, 3115, 0), 23 | new Position(3076, 3118, 0), 24 | new Position(3076, 3122, 0), 25 | new Position(3079, 3125, 0), 26 | new Position(3083, 3127, 0), 27 | new Position(3086, 3126, 0) 28 | ); 29 | 30 | public QuestSection() { 31 | super("Quest Guide"); 32 | } 33 | 34 | @Override 35 | public final void run() throws InterruptedException { 36 | if (pendingContinue()) { 37 | selectContinue(); 38 | return; 39 | } 40 | switch (getProgress()) { 41 | case 200: 42 | boolean isRunning = getSettings().isRunning(); 43 | if (getSettings().setRunning(!isRunning)) { 44 | Sleep.sleepUntil(() -> getSettings().isRunning() == !isRunning, 1200); 45 | } 46 | break; 47 | case 210: 48 | if (!getSettings().isRunning()) { 49 | if (getSettings().setRunning(true)) { 50 | Sleep.sleepUntil(() -> getSettings().isRunning(), 1200); 51 | } 52 | } else { 53 | if (getWalking().walkPath(PATH_TO_QUEST_BUILDING)) { 54 | if (getDoorHandler().handleNextObstacle(QUEST_BUILDING)) { 55 | Sleep.sleepUntil(() -> getProgress() != 210, 5000, 600); 56 | } 57 | } 58 | } 59 | break; 60 | case 220: 61 | talkToInstructor(); 62 | break; 63 | case 230: 64 | getTabs().open(Tab.QUEST); 65 | break; 66 | case 240: 67 | talkToInstructor(); 68 | break; 69 | case 250: 70 | if (getObjects().closest("Ladder").interact("Climb-down")) { 71 | Sleep.sleepUntil(() -> getProgress() != 250, 5000, 600); 72 | } 73 | break; 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/activities/tutorial_island/TutorialIsland.java: -------------------------------------------------------------------------------- 1 | package activities.tutorial_island; 2 | 3 | import activities.activity.Activity; 4 | import util.Sleep; 5 | 6 | public final class TutorialIsland extends Activity { 7 | 8 | private final TutorialSection rsGuideSection = new RuneScapeGuideSection(); 9 | private final TutorialSection survivalSection = new SurvivalSection(); 10 | private final TutorialSection cookingSection = new CookingSection(); 11 | private final TutorialSection questSection = new QuestSection(); 12 | private final TutorialSection miningSection = new MiningSection(); 13 | private final TutorialSection fightingSection = new FightingSection(); 14 | private final TutorialSection bankSection = new BankSection(); 15 | private final TutorialSection priestSection = new PriestSection(); 16 | private final TutorialSection wizardSection = new WizardSection(); 17 | 18 | public TutorialIsland() { 19 | super(null); 20 | } 21 | 22 | @Override 23 | public void onStart() throws InterruptedException { 24 | Sleep.sleepUntil(() -> getClient().isLoggedIn() && myPlayer().isVisible(), 6000, 500); 25 | } 26 | 27 | @Override 28 | public void runActivity() throws InterruptedException { 29 | switch (getTutorialSection()) { 30 | case 0: 31 | case 1: 32 | execute(rsGuideSection); 33 | break; 34 | case 2: 35 | case 3: 36 | execute(survivalSection); 37 | break; 38 | case 4: 39 | case 5: 40 | execute(cookingSection); 41 | break; 42 | case 6: 43 | case 7: 44 | execute(questSection); 45 | break; 46 | case 8: 47 | case 9: 48 | execute(miningSection); 49 | break; 50 | case 10: 51 | case 11: 52 | case 12: 53 | execute(fightingSection); 54 | break; 55 | case 14: 56 | case 15: 57 | execute(bankSection); 58 | break; 59 | case 16: 60 | case 17: 61 | execute(priestSection); 62 | break; 63 | case 18: 64 | case 19: 65 | case 20: 66 | execute(wizardSection); 67 | break; 68 | } 69 | } 70 | 71 | private int getTutorialSection() { 72 | return getConfigs().get(406); 73 | } 74 | 75 | @Override 76 | public TutorialIsland copy() { 77 | return new TutorialIsland(); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/activities/tutorial_island/TutorialSection.java: -------------------------------------------------------------------------------- 1 | package activities.tutorial_island; 2 | 3 | import org.osbot.rs07.api.model.NPC; 4 | import org.osbot.rs07.api.ui.RS2Widget; 5 | import util.Sleep; 6 | import util.executable.Executable; 7 | 8 | import java.awt.event.KeyEvent; 9 | 10 | public abstract class TutorialSection extends Executable { 11 | 12 | private final String INSTRUCTOR_NAME; 13 | 14 | public TutorialSection(final String INSTRUCTOR_NAME) { 15 | this.INSTRUCTOR_NAME = INSTRUCTOR_NAME; 16 | } 17 | 18 | protected final int getProgress() { 19 | return getConfigs().get(281); 20 | } 21 | 22 | protected final void talkToInstructor() { 23 | if (getInstructor().interact("Talk-to")) { 24 | Sleep.sleepUntil(this::pendingContinue, 5000, 600); 25 | } 26 | } 27 | 28 | protected NPC getInstructor() { 29 | return getNpcs().closest(INSTRUCTOR_NAME); 30 | } 31 | 32 | protected boolean pendingContinue() { 33 | RS2Widget continueWidget = getContinueWidget(); 34 | return continueWidget != null && continueWidget.isVisible(); 35 | } 36 | 37 | protected boolean selectContinue() { 38 | RS2Widget continueWidget = getContinueWidget(); 39 | if (continueWidget == null) { 40 | return false; 41 | } 42 | if (continueWidget.getMessage().contains("Click here to continue")) { 43 | getKeyboard().pressKey(KeyEvent.VK_SPACE); 44 | Sleep.sleepUntil(() -> !continueWidget.isVisible(), 1000, 600); 45 | return true; 46 | } else if (continueWidget.interact()) { 47 | Sleep.sleepUntil(() -> !continueWidget.isVisible(), 1000, 600); 48 | return true; 49 | } 50 | return false; 51 | } 52 | 53 | private RS2Widget getContinueWidget() { 54 | return getWidgets().singleFilter(getWidgets().getAll(), 55 | widget -> widget.isVisible() 56 | && (widget.getMessage().contains("Click here to continue") 57 | || widget.getMessage().contains("Click to continue")) 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/gui/IconButton.java: -------------------------------------------------------------------------------- 1 | package gui; 2 | 3 | import util.file_managers.ImageManager; 4 | 5 | import javax.swing.*; 6 | import java.awt.*; 7 | import java.awt.event.ActionListener; 8 | import java.awt.image.BufferedImage; 9 | 10 | public class IconButton { 11 | public static JButton createButton(final String toolTip, final String icon, final String rolloverIcon, ActionListener callback) { 12 | JButton button = new JButton() { 13 | @Override 14 | public void paintComponent(Graphics g) { 15 | if (this.model.isRollover()) { 16 | int drawX = (this.getWidth() / 2) - (this.getRolloverIcon().getIconWidth() / 2); 17 | int drawY = (this.getHeight() / 2) - (this.getRolloverIcon().getIconHeight() / 2); 18 | this.getRolloverIcon().paintIcon(this, g, drawX, drawY); 19 | } else { 20 | int drawX = (this.getWidth() / 2) - (this.getIcon().getIconWidth() / 2); 21 | int drawY = (this.getHeight() / 2) - (this.getIcon().getIconHeight() / 2); 22 | this.getIcon().paintIcon(this, g, drawX, drawY); 23 | } 24 | } 25 | }; 26 | button.setToolTipText(toolTip); 27 | 28 | BufferedImage iconImage = ImageManager.getInstance().loadImage(icon); 29 | if (iconImage != null) { 30 | button.setIcon(new ImageIcon(iconImage)); 31 | } 32 | 33 | BufferedImage rolloverIconImage = ImageManager.getInstance().loadImage(rolloverIcon); 34 | if (rolloverIconImage != null) { 35 | button.setRolloverIcon(new ImageIcon(rolloverIconImage)); 36 | } 37 | 38 | button.setOpaque(false); 39 | button.setContentAreaFilled(false); 40 | button.setBorderPainted(false); 41 | button.setBorder(BorderFactory.createEmptyBorder()); 42 | button.setFocusPainted(false); 43 | 44 | button.addActionListener(callback); 45 | 46 | return button; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/ActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import gui.interfaces.JSONSerializable; 5 | 6 | import javax.swing.*; 7 | 8 | public interface ActivityPanel extends JSONSerializable { 9 | Activity toActivity(); 10 | 11 | JPanel getPanel(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/ActivityPanelFactory.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.ActivityType; 4 | 5 | public class ActivityPanelFactory { 6 | public static ActivityPanel createActivityPanel(final ActivityType activityType) { 7 | switch (activityType) { 8 | case WOODCUTTING: 9 | return new WCActivityPanel(); 10 | case AGILITY: 11 | return new AgilityActivityPanel(); 12 | case FLETCHING: 13 | return new FletchActivityPanel(); 14 | case FISHING: 15 | return new FishingActivityPanel(); 16 | case SMITHING: 17 | return new SmithActivityPanel(); 18 | case MINING: 19 | return new MiningActivityPanel(); 20 | case FIREMAKING: 21 | return new FMActivityPanel(); 22 | case RUNECRAFTING: 23 | return new RCActivityPanel(); 24 | case THIEVING: 25 | return new ThievingActivityPanel(); 26 | case HERBLORE: 27 | return new HerbloreActivityPanel(); 28 | case MONEY_MAKING: 29 | return new MoneyMakingActivityPanel(); 30 | case CRAFTING: 31 | return new CraftingActivityPanel(); 32 | case RANGED: 33 | return new RangedActivityPanel(); 34 | case COOKING: 35 | return new CookingActivityPanel(); 36 | } 37 | return null; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/AgilityActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import activities.skills.agility.AgilityActivity; 5 | import activities.skills.agility.AgilityCourse; 6 | import gui.styled_components.StyledJComboBox; 7 | import gui.styled_components.StyledJLabel; 8 | import gui.styled_components.StyledJPanel; 9 | import org.json.simple.JSONObject; 10 | 11 | import javax.swing.*; 12 | import java.awt.*; 13 | 14 | public class AgilityActivityPanel implements ActivityPanel { 15 | 16 | private JPanel mainPanel; 17 | private JComboBox courseSelector; 18 | 19 | public AgilityActivityPanel() { 20 | mainPanel = new StyledJPanel(); 21 | mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 22 | 23 | mainPanel.add(new StyledJLabel("Course:")); 24 | 25 | courseSelector = new StyledJComboBox<>(AgilityCourse.values()); 26 | mainPanel.add(courseSelector); 27 | } 28 | 29 | @Override 30 | public JPanel getPanel() { 31 | return mainPanel; 32 | } 33 | 34 | @Override 35 | public Activity toActivity() { 36 | return new AgilityActivity((AgilityCourse) courseSelector.getSelectedItem()); 37 | } 38 | 39 | @Override 40 | public JSONObject toJSON() { 41 | JSONObject jsonObject = new JSONObject(); 42 | jsonObject.put("course", ((AgilityCourse) courseSelector.getSelectedItem()).name()); 43 | return jsonObject; 44 | } 45 | 46 | @Override 47 | public void fromJSON(JSONObject jsonObject) { 48 | courseSelector.setSelectedItem(AgilityCourse.valueOf((String) jsonObject.get("course"))); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/FMActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import activities.skills.firemaking.FMLocation; 5 | import activities.skills.firemaking.FiremakingActivity; 6 | import activities.skills.firemaking.Log; 7 | import gui.styled_components.StyledJComboBox; 8 | import gui.styled_components.StyledJLabel; 9 | import gui.styled_components.StyledJPanel; 10 | import org.json.simple.JSONObject; 11 | 12 | import javax.swing.*; 13 | import java.awt.*; 14 | 15 | public class FMActivityPanel implements ActivityPanel { 16 | 17 | private JPanel mainPanel; 18 | private JComboBox logSelector; 19 | private JComboBox locationSelector; 20 | 21 | public FMActivityPanel() { 22 | mainPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 23 | 24 | mainPanel.add(new StyledJLabel("Log Type:")); 25 | logSelector = new StyledJComboBox<>(Log.values()); 26 | mainPanel.add(logSelector); 27 | 28 | mainPanel.add(new StyledJLabel("Location:")); 29 | locationSelector = new StyledJComboBox<>(FMLocation.values()); 30 | mainPanel.add(locationSelector); 31 | } 32 | 33 | @Override 34 | public JPanel getPanel() { 35 | return mainPanel; 36 | } 37 | 38 | @Override 39 | public Activity toActivity() { 40 | return new FiremakingActivity((Log) logSelector.getSelectedItem(), ((FMLocation) locationSelector.getSelectedItem()).LOCATION); 41 | } 42 | 43 | @Override 44 | public JSONObject toJSON() { 45 | JSONObject jsonObject = new JSONObject(); 46 | jsonObject.put("log", ((Log) logSelector.getSelectedItem()).name()); 47 | jsonObject.put("location", ((FMLocation) locationSelector.getSelectedItem()).name()); 48 | return jsonObject; 49 | } 50 | 51 | @Override 52 | public void fromJSON(JSONObject jsonObject) { 53 | logSelector.setSelectedItem(Log.valueOf((String) jsonObject.get("log"))); 54 | locationSelector.setSelectedItem(FMLocation.valueOf((String) jsonObject.get("location"))); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/FishingActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import activities.skills.fishing.Fish; 5 | import activities.skills.fishing.FishingActivity; 6 | import activities.skills.fishing.FishingLocation; 7 | import gui.styled_components.StyledJComboBox; 8 | import gui.styled_components.StyledJLabel; 9 | import gui.styled_components.StyledJPanel; 10 | import org.json.simple.JSONObject; 11 | import util.ResourceMode; 12 | 13 | import javax.swing.*; 14 | import java.awt.*; 15 | 16 | public class FishingActivityPanel implements ActivityPanel { 17 | 18 | private JPanel mainPanel; 19 | private JComboBox fishSelector; 20 | private JComboBox locationSelector; 21 | private JComboBox resourceModeSelector; 22 | 23 | public FishingActivityPanel() { 24 | mainPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 25 | 26 | mainPanel.add(new StyledJLabel("Fish:")); 27 | 28 | fishSelector = new StyledJComboBox<>(Fish.values()); 29 | mainPanel.add(fishSelector); 30 | 31 | mainPanel.add(new StyledJLabel("Location:")); 32 | locationSelector = new StyledJComboBox<>(Fish.values()[0].locations); 33 | mainPanel.add(locationSelector); 34 | 35 | mainPanel.add(new StyledJLabel("Collection Mode:")); 36 | resourceModeSelector = new StyledJComboBox<>(ResourceMode.values()); 37 | mainPanel.add(resourceModeSelector); 38 | 39 | fishSelector.addActionListener(e -> { 40 | Fish selectedFish = (Fish) fishSelector.getSelectedItem(); 41 | locationSelector.setModel(new DefaultComboBoxModel<>(selectedFish.locations)); 42 | }); 43 | } 44 | 45 | @Override 46 | public JPanel getPanel() { 47 | return mainPanel; 48 | } 49 | 50 | @Override 51 | public Activity toActivity() { 52 | return new FishingActivity((Fish) fishSelector.getSelectedItem(), ((FishingLocation) locationSelector.getSelectedItem()), (ResourceMode) resourceModeSelector.getSelectedItem()); 53 | } 54 | 55 | @Override 56 | public JSONObject toJSON() { 57 | JSONObject jsonObject = new JSONObject(); 58 | jsonObject.put("location", ((FishingLocation) locationSelector.getSelectedItem()).name()); 59 | jsonObject.put("fish", ((Fish) fishSelector.getSelectedItem()).name()); 60 | jsonObject.put("resource_mode", ((ResourceMode) resourceModeSelector.getSelectedItem()).name()); 61 | return jsonObject; 62 | } 63 | 64 | @Override 65 | public void fromJSON(JSONObject jsonObject) { 66 | fishSelector.setSelectedItem(Fish.valueOf((String) jsonObject.get("fish"))); 67 | locationSelector.setSelectedItem(FishingLocation.valueOf((String) jsonObject.get("location"))); 68 | resourceModeSelector.setSelectedItem(ResourceMode.valueOf((String) jsonObject.get("resource_mode"))); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/FletchActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import activities.skills.fletching.FletchItem; 5 | import activities.skills.fletching.FletchItemType; 6 | import activities.skills.fletching.FletchingActivity; 7 | import gui.styled_components.StyledJComboBox; 8 | import gui.styled_components.StyledJLabel; 9 | import gui.styled_components.StyledJPanel; 10 | import org.json.simple.JSONObject; 11 | 12 | import javax.swing.*; 13 | import java.awt.*; 14 | 15 | public class FletchActivityPanel implements ActivityPanel { 16 | 17 | private JPanel mainPanel; 18 | private JComboBox typeSelector; 19 | private JComboBox itemSelector; 20 | 21 | public FletchActivityPanel() { 22 | mainPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 23 | 24 | mainPanel.add(new StyledJLabel("Type:")); 25 | typeSelector = new StyledJComboBox<>(FletchItemType.values()); 26 | mainPanel.add(typeSelector); 27 | 28 | mainPanel.add(new StyledJLabel("Item:")); 29 | itemSelector = new StyledJComboBox<>(FletchItem.getAllWithType(FletchItemType.values()[0])); 30 | mainPanel.add(itemSelector); 31 | 32 | typeSelector.addActionListener(e -> 33 | itemSelector.setModel(new DefaultComboBoxModel<>(FletchItem.getAllWithType((FletchItemType) typeSelector.getSelectedItem()))) 34 | ); 35 | } 36 | 37 | @Override 38 | public JPanel getPanel() { 39 | return mainPanel; 40 | } 41 | 42 | @Override 43 | public Activity toActivity() { 44 | return new FletchingActivity((FletchItem) itemSelector.getSelectedItem()); 45 | } 46 | 47 | @Override 48 | public JSONObject toJSON() { 49 | JSONObject jsonObject = new JSONObject(); 50 | jsonObject.put("item_type", ((FletchItemType) typeSelector.getSelectedItem()).name()); 51 | jsonObject.put("item", ((FletchItem) itemSelector.getSelectedItem()).name()); 52 | return jsonObject; 53 | } 54 | 55 | @Override 56 | public void fromJSON(JSONObject jsonObject) { 57 | typeSelector.setSelectedItem(FletchItemType.valueOf((String) jsonObject.get("item_type"))); 58 | itemSelector.setSelectedItem(FletchItem.valueOf((String) jsonObject.get("item"))); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/MoneyMakingActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import activities.money_making.MoneyMakingType; 5 | import activities.money_making.flax_picking.FlaxPickingActivity; 6 | import gui.styled_components.StyledJComboBox; 7 | import gui.styled_components.StyledJLabel; 8 | import gui.styled_components.StyledJPanel; 9 | import org.json.simple.JSONObject; 10 | 11 | import javax.swing.*; 12 | import java.awt.*; 13 | 14 | public class MoneyMakingActivityPanel implements ActivityPanel { 15 | 16 | private JPanel mainPanel; 17 | private JComboBox typeSelector; 18 | 19 | public MoneyMakingActivityPanel() { 20 | mainPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 21 | 22 | mainPanel.add(new StyledJLabel("Type:")); 23 | typeSelector = new StyledJComboBox<>(MoneyMakingType.values()); 24 | mainPanel.add(typeSelector); 25 | } 26 | 27 | @Override 28 | public JPanel getPanel() { 29 | return mainPanel; 30 | } 31 | 32 | @Override 33 | public Activity toActivity() { 34 | switch ((MoneyMakingType) typeSelector.getSelectedItem()) { 35 | case FLAX_PICKING: 36 | return new FlaxPickingActivity(); 37 | case VIAL_FILLING: 38 | return null; 39 | } 40 | return null; 41 | } 42 | 43 | @Override 44 | public JSONObject toJSON() { 45 | JSONObject jsonObject = new JSONObject(); 46 | jsonObject.put("type", ((MoneyMakingType) typeSelector.getSelectedItem()).name()); 47 | return jsonObject; 48 | } 49 | 50 | @Override 51 | public void fromJSON(JSONObject jsonObject) { 52 | typeSelector.setSelectedItem(MoneyMakingType.valueOf((String) jsonObject.get("type"))); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/gui/activity_panels/RangedActivityPanel.java: -------------------------------------------------------------------------------- 1 | package gui.activity_panels; 2 | 3 | import activities.activity.Activity; 4 | import activities.skills.ranged.Bow; 5 | import activities.skills.ranged.RangeGuildActivity; 6 | import gui.styled_components.StyledJComboBox; 7 | import gui.styled_components.StyledJLabel; 8 | import gui.styled_components.StyledJPanel; 9 | import org.json.simple.JSONObject; 10 | 11 | import javax.swing.*; 12 | import java.awt.*; 13 | 14 | public class RangedActivityPanel implements ActivityPanel { 15 | 16 | private JPanel mainPanel; 17 | private JComboBox bowSelector; 18 | 19 | public RangedActivityPanel() { 20 | mainPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 21 | 22 | mainPanel.add(new StyledJLabel("Bow:")); 23 | 24 | bowSelector = new StyledJComboBox<>(Bow.values()); 25 | mainPanel.add(bowSelector); 26 | } 27 | 28 | @Override 29 | public JPanel getPanel() { 30 | return mainPanel; 31 | } 32 | 33 | @Override 34 | public Activity toActivity() { 35 | return new RangeGuildActivity((Bow) bowSelector.getSelectedItem()); 36 | } 37 | 38 | @Override 39 | public JSONObject toJSON() { 40 | JSONObject jsonObject = new JSONObject(); 41 | jsonObject.put("bow", ((Bow) bowSelector.getSelectedItem()).name()); 42 | return jsonObject; 43 | } 44 | 45 | @Override 46 | public void fromJSON(JSONObject jsonObject) { 47 | bowSelector.setSelectedItem(Bow.valueOf((String) jsonObject.get("bow"))); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/gui/dialogs/NewVersionDialog.java: -------------------------------------------------------------------------------- 1 | package gui.dialogs; 2 | 3 | import gui.utils.CopyToClipboardButton; 4 | import script.VersionChecker; 5 | 6 | import javax.swing.*; 7 | import java.awt.*; 8 | 9 | public class NewVersionDialog { 10 | 11 | public static int showNewVersionDialog(final Component parentComponent) { 12 | JPanel contents = new JPanel(); 13 | contents.add(Box.createVerticalGlue()); 14 | 15 | contents.setLayout(new BoxLayout(contents, BoxLayout.PAGE_AXIS)); 16 | 17 | Dimension contentSize = new Dimension(450, 150); 18 | 19 | contents.setMinimumSize(contentSize); 20 | contents.setPreferredSize(contentSize); 21 | 22 | JLabel titleLabel = new JLabel("A new version is available"); 23 | titleLabel.setFont(titleLabel.getFont().deriveFont(25.0f)); 24 | titleLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 25 | contents.add(titleLabel); 26 | 27 | contents.add(Box.createVerticalStrut(20)); 28 | 29 | JLabel sdnLabel = new JLabel("If you are an SDN user the script will be updated automatically over the next few days."); 30 | sdnLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 31 | contents.add(sdnLabel); 32 | 33 | contents.add(Box.createVerticalStrut(10)); 34 | 35 | JLabel downloadLabel = new JLabel("Alternatively, you can download the latest version now from GitHub:"); 36 | downloadLabel.setAlignmentX(Component.CENTER_ALIGNMENT); 37 | contents.add(downloadLabel); 38 | 39 | JPanel linkPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 20)); 40 | 41 | JTextField linkField = new JTextField(VersionChecker.GITHUB_RELEASES_URL); 42 | linkField.setEditable(false); 43 | 44 | linkField.setBorder(null); 45 | linkField.setFont(linkField.getFont().deriveFont(14.0f)); 46 | 47 | linkPanel.add(linkField); 48 | 49 | JButton copyToClipboardButton = CopyToClipboardButton.create(() -> VersionChecker.GITHUB_RELEASES_URL); 50 | 51 | linkPanel.add(copyToClipboardButton); 52 | 53 | linkPanel.setAlignmentX(Component.CENTER_ALIGNMENT); 54 | contents.add(linkPanel); 55 | 56 | contents.add(Box.createVerticalGlue()); 57 | 58 | return JOptionPane.showOptionDialog( 59 | parentComponent, 60 | contents, 61 | "Explv's AIO", 62 | JOptionPane.YES_NO_CANCEL_OPTION, 63 | JOptionPane.PLAIN_MESSAGE, 64 | null, 65 | new Object[]{"Don't show this message again", "Ok"}, 66 | null 67 | ); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/gui/document_filters/DoubleDocumentFilter.java: -------------------------------------------------------------------------------- 1 | package gui.document_filters; 2 | 3 | import javax.swing.text.AttributeSet; 4 | import javax.swing.text.BadLocationException; 5 | import javax.swing.text.DocumentFilter; 6 | import java.util.regex.Matcher; 7 | import java.util.regex.Pattern; 8 | 9 | public class DoubleDocumentFilter extends DocumentFilter { 10 | private static final Pattern DOUBLE_REGEX = Pattern.compile("\\d*(\\.\\d*)?"); 11 | 12 | @Override 13 | public void replace(DocumentFilter.FilterBypass fb, 14 | int offset, 15 | int length, 16 | String text, 17 | AttributeSet attrs) throws BadLocationException { 18 | 19 | Matcher matcher = DOUBLE_REGEX.matcher(text); 20 | 21 | if (!matcher.matches()) { 22 | return; 23 | } 24 | 25 | super.replace(fb, offset, length, text, attrs); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/gui/document_filters/IntegerDocumentFilter.java: -------------------------------------------------------------------------------- 1 | package gui.document_filters; 2 | 3 | import javax.swing.text.AttributeSet; 4 | import javax.swing.text.BadLocationException; 5 | import javax.swing.text.DocumentFilter; 6 | import java.util.regex.Matcher; 7 | import java.util.regex.Pattern; 8 | 9 | public class IntegerDocumentFilter extends DocumentFilter { 10 | 11 | private static final Pattern NUMBER_REGEX = Pattern.compile("\\d+"); 12 | 13 | @Override 14 | public void replace(DocumentFilter.FilterBypass fb, 15 | int offset, 16 | int length, 17 | String text, 18 | AttributeSet attrs) throws BadLocationException { 19 | 20 | Matcher matcher = NUMBER_REGEX.matcher(text); 21 | 22 | if (!matcher.matches()) { 23 | return; 24 | } 25 | 26 | super.replace(fb, offset, length, text, attrs); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/gui/fields/DateField.java: -------------------------------------------------------------------------------- 1 | package gui.fields; 2 | 3 | import gui.styled_components.StyledJTextField; 4 | import gui.utils.ColourScheme; 5 | 6 | import javax.swing.*; 7 | import java.awt.*; 8 | import java.awt.event.KeyAdapter; 9 | import java.awt.event.KeyEvent; 10 | import java.time.DateTimeException; 11 | import java.time.LocalDate; 12 | import java.time.format.DateTimeFormatter; 13 | import java.time.format.DateTimeFormatterBuilder; 14 | 15 | public class DateField extends StyledJTextField { 16 | 17 | private static final DateTimeFormatter dtFormatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd") 18 | .parseStrict() 19 | .toFormatter(); 20 | 21 | public DateField() { 22 | addKeyListener(new KeyAdapter() { 23 | @Override 24 | public void keyReleased(final KeyEvent e) { 25 | validateField(); 26 | } 27 | }); 28 | 29 | setInputVerifier(new InputVerifier() { 30 | @Override 31 | public boolean verify(final JComponent input) { 32 | return validateField(); 33 | } 34 | }); 35 | } 36 | 37 | public LocalDate getDate() { 38 | return LocalDate.parse(getText().trim(), dtFormatter); 39 | } 40 | 41 | public void setDate(final LocalDate date) { 42 | setText(date.format(dtFormatter)); 43 | } 44 | 45 | private boolean validateField() { 46 | if (getText().trim().isEmpty()) { 47 | setForeground(Color.RED); 48 | return false; 49 | } 50 | 51 | try { 52 | LocalDate.parse( 53 | getText().trim(), 54 | dtFormatter 55 | ); 56 | } catch (DateTimeException e) { 57 | setForeground(Color.RED); 58 | return false; 59 | } 60 | 61 | setForeground(ColourScheme.WHITE); 62 | return true; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/gui/fields/DoubleField.java: -------------------------------------------------------------------------------- 1 | package gui.fields; 2 | 3 | import gui.document_filters.DoubleDocumentFilter; 4 | import gui.styled_components.StyledJTextField; 5 | import gui.utils.ColourScheme; 6 | 7 | import javax.swing.*; 8 | import javax.swing.text.AbstractDocument; 9 | import java.awt.*; 10 | import java.awt.event.KeyAdapter; 11 | import java.awt.event.KeyEvent; 12 | 13 | public class DoubleField extends StyledJTextField { 14 | public DoubleField() { 15 | ((AbstractDocument) getDocument()).setDocumentFilter(new DoubleDocumentFilter()); 16 | 17 | addKeyListener(new KeyAdapter() { 18 | @Override 19 | public void keyReleased(final KeyEvent e) { 20 | validateField(); 21 | } 22 | }); 23 | 24 | setInputVerifier(new InputVerifier() { 25 | @Override 26 | public boolean verify(final JComponent input) { 27 | return validateField(); 28 | } 29 | }); 30 | } 31 | 32 | private boolean validateField() { 33 | if (getText().trim().isEmpty()) { 34 | setForeground(Color.RED); 35 | return false; 36 | } 37 | 38 | try { 39 | Double.parseDouble(getText().trim()); 40 | } catch (NumberFormatException e) { 41 | setForeground(Color.RED); 42 | return false; 43 | } 44 | 45 | setForeground(ColourScheme.WHITE); 46 | return true; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/gui/fields/IntegerField.java: -------------------------------------------------------------------------------- 1 | package gui.fields; 2 | 3 | import gui.document_filters.IntegerDocumentFilter; 4 | import gui.styled_components.StyledJTextField; 5 | import gui.utils.ColourScheme; 6 | 7 | import javax.swing.*; 8 | import javax.swing.text.AbstractDocument; 9 | import java.awt.*; 10 | import java.awt.event.KeyAdapter; 11 | import java.awt.event.KeyEvent; 12 | 13 | public class IntegerField extends StyledJTextField { 14 | private int minValue = -1; 15 | private int maxValue = -1; 16 | 17 | public IntegerField() { 18 | ((AbstractDocument) getDocument()).setDocumentFilter(new IntegerDocumentFilter()); 19 | 20 | addKeyListener(new KeyAdapter() { 21 | @Override 22 | public void keyReleased(final KeyEvent e) { 23 | validateField(); 24 | } 25 | }); 26 | 27 | setInputVerifier(new InputVerifier() { 28 | @Override 29 | public boolean verify(final JComponent input) { 30 | return validateField(); 31 | } 32 | }); 33 | } 34 | 35 | public void setMinValue(int minValue) { 36 | this.minValue = minValue; 37 | } 38 | 39 | public void setMaxValue(int maxValue) { 40 | this.maxValue = maxValue; 41 | } 42 | 43 | private boolean validateField() { 44 | if (getText().trim().isEmpty()) { 45 | setForeground(Color.RED); 46 | return false; 47 | } 48 | 49 | int value = Integer.parseInt(getText().trim()); 50 | 51 | if (minValue != -1 && value < minValue) { 52 | setForeground(Color.RED); 53 | return false; 54 | } 55 | 56 | if (maxValue != -1 && value > maxValue) { 57 | setForeground(Color.RED); 58 | return false; 59 | } 60 | 61 | setForeground(ColourScheme.WHITE); 62 | return true; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/gui/fields/ItemField.java: -------------------------------------------------------------------------------- 1 | package gui.fields; 2 | 3 | 4 | import activities.grand_exchange.item_guide.ItemGuide; 5 | import gui.utils.ColourScheme; 6 | 7 | import javax.swing.*; 8 | import java.awt.*; 9 | import java.awt.event.KeyAdapter; 10 | import java.awt.event.KeyEvent; 11 | 12 | public class ItemField extends AutoCompleteTextField { 13 | 14 | public ItemField() { 15 | setColumns(20); 16 | addPosibilities(ItemGuide.getAllGEItems().keySet()); 17 | addKeyListener(new KeyAdapter() { 18 | @Override 19 | public void keyReleased(final KeyEvent e) { 20 | validateItemNameField(); 21 | } 22 | }); 23 | 24 | setInputVerifier(new InputVerifier() { 25 | @Override 26 | public boolean verify(final JComponent input) { 27 | return validateItemNameField(); 28 | } 29 | }); 30 | } 31 | 32 | public boolean validateItemNameField() { 33 | String itemName = getText().trim(); 34 | 35 | if (itemName.isEmpty() || !ItemGuide.getAllGEItems().containsKey(itemName)) { 36 | setForeground(Color.RED); 37 | return false; 38 | } 39 | 40 | setForeground(ColourScheme.WHITE); 41 | return true; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/gui/fields/PlaceholderTextField.java: -------------------------------------------------------------------------------- 1 | package gui.fields; 2 | 3 | import gui.styled_components.StyledJTextField; 4 | 5 | import java.awt.*; 6 | 7 | @SuppressWarnings("serial") 8 | public class PlaceholderTextField extends StyledJTextField { 9 | 10 | private String placeholder; 11 | 12 | public PlaceholderTextField() { 13 | } 14 | 15 | @Override 16 | protected void paintComponent(final Graphics pG) { 17 | super.paintComponent(pG); 18 | 19 | if (placeholder == null || placeholder.length() == 0 || getText().length() > 0) { 20 | return; 21 | } 22 | 23 | final Graphics2D g = (Graphics2D) pG; 24 | g.setRenderingHint( 25 | RenderingHints.KEY_ANTIALIASING, 26 | RenderingHints.VALUE_ANTIALIAS_ON); 27 | g.setColor(getDisabledTextColor().darker()); 28 | g.drawString(placeholder, getInsets().left, pG.getFontMetrics() 29 | .getMaxAscent() + getInsets().top); 30 | } 31 | 32 | public void setPlaceholder(final String s) { 33 | placeholder = s; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/gui/fields/RSUnitField.java: -------------------------------------------------------------------------------- 1 | package gui.fields; 2 | 3 | import gui.utils.ColourScheme; 4 | import util.RSUnits; 5 | 6 | import javax.swing.*; 7 | import java.awt.*; 8 | import java.awt.event.KeyAdapter; 9 | import java.awt.event.KeyEvent; 10 | 11 | public class RSUnitField extends PlaceholderTextField { 12 | public RSUnitField() { 13 | addKeyListener(new KeyAdapter() { 14 | @Override 15 | public void keyReleased(final KeyEvent e) { 16 | validateField(); 17 | } 18 | }); 19 | 20 | setInputVerifier(new InputVerifier() { 21 | @Override 22 | public boolean verify(final JComponent input) { 23 | return validateField(); 24 | } 25 | }); 26 | 27 | setPlaceholder("100 / 1.2k / etc."); 28 | } 29 | 30 | public long getValue() { 31 | return RSUnits.formattedToValue(getText().trim()); 32 | } 33 | 34 | private boolean validateField() { 35 | if (getText().trim().isEmpty()) { 36 | setForeground(Color.RED); 37 | return false; 38 | } 39 | 40 | String text = getText().trim(); 41 | 42 | if (!RSUnits.UNIT_PATTERN.matcher(text).matches()) { 43 | setForeground(Color.RED); 44 | return false; 45 | } 46 | 47 | setForeground(ColourScheme.WHITE); 48 | return true; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/gui/interfaces/JSONSerializable.java: -------------------------------------------------------------------------------- 1 | package gui.interfaces; 2 | 3 | import org.json.simple.JSONObject; 4 | 5 | public interface JSONSerializable { 6 | JSONObject toJSON(); 7 | 8 | void fromJSON(final JSONObject jsonObject); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/gui/styled_components/StyledJCheckBox.java: -------------------------------------------------------------------------------- 1 | package gui.styled_components; 2 | 3 | import gui.utils.ColourScheme; 4 | import util.file_managers.FontManager; 5 | 6 | import javax.swing.*; 7 | 8 | public class StyledJCheckBox extends JCheckBox { 9 | 10 | public StyledJCheckBox(final String text) { 11 | super(text); 12 | setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 13 | setForeground(ColourScheme.WHITE); 14 | 15 | setFont(FontManager.ROBOTO_REGULAR); 16 | } 17 | 18 | public StyledJCheckBox() { 19 | this(null); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/gui/styled_components/StyledJComboBox.java: -------------------------------------------------------------------------------- 1 | package gui.styled_components; 2 | 3 | import gui.utils.ColourScheme; 4 | import util.file_managers.FontManager; 5 | 6 | import javax.swing.*; 7 | import javax.swing.plaf.ComponentUI; 8 | import javax.swing.plaf.basic.BasicComboBoxUI; 9 | 10 | public class StyledJComboBox extends JComboBox { 11 | 12 | public StyledJComboBox(ComboBoxModel model) { 13 | super(model); 14 | setStyle(); 15 | } 16 | 17 | public StyledJComboBox(E[] items) { 18 | super(items); 19 | setStyle(); 20 | } 21 | 22 | public StyledJComboBox() { 23 | setStyle(); 24 | } 25 | 26 | private void setStyle() { 27 | setFont(FontManager.ROBOTO_REGULAR); 28 | setUI(new CustomComboBoxUI()); 29 | setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); 30 | setBackground(ColourScheme.PANEL_BACKGROUND_GREY.darker()); 31 | setForeground(ColourScheme.WHITE); 32 | } 33 | 34 | static class CustomComboBoxUI extends BasicComboBoxUI { 35 | public static ComponentUI createUI(JComponent c) { 36 | return new CustomComboBoxUI(); 37 | } 38 | 39 | protected JButton createArrowButton() { 40 | JButton arrowButton = super.createArrowButton(); 41 | arrowButton.setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 42 | arrowButton.setOpaque(false); 43 | arrowButton.setContentAreaFilled(false); 44 | arrowButton.setBorderPainted(false); 45 | arrowButton.setBorder(BorderFactory.createEmptyBorder()); 46 | arrowButton.setFocusPainted(false); 47 | return arrowButton; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/gui/styled_components/StyledJLabel.java: -------------------------------------------------------------------------------- 1 | package gui.styled_components; 2 | 3 | import gui.utils.ColourScheme; 4 | import util.file_managers.FontManager; 5 | 6 | import javax.swing.*; 7 | 8 | public class StyledJLabel extends JLabel { 9 | 10 | public StyledJLabel(final String text) { 11 | super(text); 12 | setForeground(ColourScheme.WHITE); 13 | setFont(FontManager.ROBOTO_REGULAR); 14 | } 15 | 16 | public StyledJLabel() { 17 | setForeground(ColourScheme.WHITE); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/gui/styled_components/StyledJPanel.java: -------------------------------------------------------------------------------- 1 | package gui.styled_components; 2 | 3 | import gui.utils.ColourScheme; 4 | 5 | import javax.swing.*; 6 | import java.awt.*; 7 | 8 | public class StyledJPanel extends JPanel { 9 | 10 | public StyledJPanel(final LayoutManager layoutManager) { 11 | super(layoutManager); 12 | setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 13 | } 14 | 15 | public StyledJPanel() { 16 | setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/gui/styled_components/StyledJScrollPane.java: -------------------------------------------------------------------------------- 1 | package gui.styled_components; 2 | 3 | import gui.utils.ColourScheme; 4 | 5 | import javax.swing.*; 6 | import javax.swing.plaf.ComponentUI; 7 | import javax.swing.plaf.basic.BasicScrollBarUI; 8 | 9 | public class StyledJScrollPane extends JScrollPane { 10 | 11 | public StyledJScrollPane() { 12 | getVerticalScrollBar().setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 13 | getVerticalScrollBar().setForeground(ColourScheme.WHITE); 14 | getVerticalScrollBar().setUI(new CustomScrollBarUI()); 15 | 16 | getHorizontalScrollBar().setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 17 | getHorizontalScrollBar().setForeground(ColourScheme.WHITE); 18 | getHorizontalScrollBar().setUI(new CustomScrollBarUI()); 19 | } 20 | 21 | static class CustomScrollBarUI extends BasicScrollBarUI { 22 | public static ComponentUI createUI(JComponent c) { 23 | return new CustomScrollBarUI(); 24 | } 25 | 26 | @Override 27 | protected JButton createDecreaseButton(int orientation) { 28 | JButton button = super.createDecreaseButton(orientation); 29 | styleButton(button); 30 | return button; 31 | } 32 | 33 | @Override 34 | protected JButton createIncreaseButton(int orientation) { 35 | JButton button = super.createIncreaseButton(orientation); 36 | styleButton(button); 37 | return button; 38 | } 39 | 40 | private void styleButton(final JButton jButton) { 41 | jButton.setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 42 | jButton.setOpaque(false); 43 | jButton.setContentAreaFilled(false); 44 | jButton.setBorderPainted(false); 45 | jButton.setBorder(BorderFactory.createEmptyBorder()); 46 | jButton.setFocusPainted(false); 47 | } 48 | 49 | @Override 50 | protected void configureScrollBarColors() { 51 | thumbHighlightColor = ColourScheme.PANEL_BACKGROUND_GREY; 52 | thumbLightShadowColor = ColourScheme.PANEL_BACKGROUND_GREY; 53 | thumbDarkShadowColor = ColourScheme.PANEL_BACKGROUND_GREY; 54 | thumbColor = ColourScheme.PANEL_BACKGROUND_GREY.darker(); 55 | 56 | trackColor = ColourScheme.PANEL_BACKGROUND_GREY; 57 | trackHighlightColor = ColourScheme.PANEL_BACKGROUND_GREY; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/gui/styled_components/StyledJTextField.java: -------------------------------------------------------------------------------- 1 | package gui.styled_components; 2 | 3 | import gui.utils.ColourScheme; 4 | import util.file_managers.FontManager; 5 | 6 | import javax.swing.*; 7 | 8 | public class StyledJTextField extends JTextField { 9 | 10 | public StyledJTextField(final String text) { 11 | super(text); 12 | setStyle(); 13 | } 14 | 15 | public StyledJTextField() { 16 | setStyle(); 17 | } 18 | 19 | protected void setStyle() { 20 | setFont(FontManager.ROBOTO_REGULAR); 21 | setBackground(ColourScheme.PANEL_BACKGROUND_GREY.darker()); 22 | setForeground(ColourScheme.WHITE); 23 | setCaretColor(ColourScheme.WHITE); 24 | setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/gui/task_panels/BreakTaskPanel.java: -------------------------------------------------------------------------------- 1 | package gui.task_panels; 2 | 3 | import gui.styled_components.StyledJCheckBox; 4 | import gui.styled_components.StyledJPanel; 5 | import gui.utils.ColourScheme; 6 | import gui.utils.DurationPanel; 7 | import org.json.simple.JSONObject; 8 | import tasks.Task; 9 | import tasks.TaskType; 10 | import tasks.break_task.BreakTask; 11 | 12 | import javax.swing.*; 13 | import java.awt.*; 14 | 15 | public class BreakTaskPanel extends TaskPanel { 16 | 17 | private DurationPanel durationPanel; 18 | private JCheckBox logoutCheckBox; 19 | 20 | BreakTaskPanel() { 21 | super(TaskType.BREAK); 22 | 23 | JPanel contentPanel = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 24 | contentPanel.setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 25 | 26 | durationPanel = new DurationPanel(); 27 | contentPanel.add(durationPanel); 28 | 29 | logoutCheckBox = new StyledJCheckBox("Logout"); 30 | logoutCheckBox.setBackground(ColourScheme.PANEL_BACKGROUND_GREY); 31 | contentPanel.add(logoutCheckBox); 32 | 33 | setContentPanel(contentPanel); 34 | } 35 | 36 | @Override 37 | public Task toTask() { 38 | if (durationPanel.getSelectedTimeType() == DurationPanel.TimeType.DATE_TIME) { 39 | return new BreakTask(durationPanel.getSelectedDateTime(), logoutCheckBox.isSelected()); 40 | } 41 | 42 | return new BreakTask(durationPanel.getDurationMS(), logoutCheckBox.isSelected()); 43 | } 44 | 45 | @Override 46 | public JSONObject toJSON() { 47 | JSONObject taskJSONObject = new JSONObject(); 48 | taskJSONObject.put("type", TaskType.BREAK.name()); 49 | 50 | JSONObject durationObj = durationPanel.toJSON(); 51 | for (Object key : durationObj.keySet()) { 52 | taskJSONObject.put(key, durationObj.get(key)); 53 | } 54 | 55 | taskJSONObject.put("logout", logoutCheckBox.isSelected()); 56 | 57 | return taskJSONObject; 58 | } 59 | 60 | @Override 61 | public void fromJSON(final JSONObject jsonObject) { 62 | durationPanel.fromJSON(jsonObject); 63 | logoutCheckBox.setSelected((Boolean) jsonObject.get("logout")); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/gui/task_panels/QuestTaskPanel.java: -------------------------------------------------------------------------------- 1 | package gui.task_panels; 2 | 3 | import activities.quests.*; 4 | import gui.styled_components.StyledJComboBox; 5 | import gui.styled_components.StyledJLabel; 6 | import gui.styled_components.StyledJPanel; 7 | import org.json.simple.JSONObject; 8 | import tasks.QuestTask; 9 | import tasks.Task; 10 | import tasks.TaskType; 11 | 12 | import javax.swing.*; 13 | import java.awt.*; 14 | 15 | public class QuestTaskPanel extends TaskPanel { 16 | 17 | private JComboBox questSelector; 18 | 19 | QuestTaskPanel() { 20 | super(TaskType.QUEST); 21 | 22 | JPanel contentPanel = new StyledJPanel(new BorderLayout()); 23 | 24 | JPanel controls = new StyledJPanel(new FlowLayout(FlowLayout.LEFT, 5, 5)); 25 | 26 | final JLabel label1 = new StyledJLabel(); 27 | label1.setText("Quest:"); 28 | controls.add(label1); 29 | 30 | questSelector = new StyledJComboBox<>(); 31 | controls.add(questSelector); 32 | 33 | contentPanel.add(controls, BorderLayout.CENTER); 34 | 35 | questSelector.setModel(new DefaultComboBoxModel<>(Quest.values())); 36 | 37 | setContentPanel(contentPanel); 38 | } 39 | 40 | @Override 41 | public Task toTask() { 42 | switch ((Quest) questSelector.getSelectedItem()) { 43 | case SHEEP_SHEARER: 44 | return new QuestTask(new SheepShearer(), (Quest) questSelector.getSelectedItem()); 45 | case RUNE_MYSTERIES: 46 | return new QuestTask(new RuneMysteries(), (Quest) questSelector.getSelectedItem()); 47 | case COOKS_ASSISTANT: 48 | return new QuestTask(new CooksAssistant(), (Quest) questSelector.getSelectedItem()); 49 | case ROMEO_AND_JULIET: 50 | return new QuestTask(new RomeoAndJuliet(), (Quest) questSelector.getSelectedItem()); 51 | case THE_RESTLESS_GHOST: 52 | return new QuestTask(new TheRestlessGhost(), (Quest) questSelector.getSelectedItem()); 53 | } 54 | return null; 55 | } 56 | 57 | @Override 58 | public JSONObject toJSON() { 59 | JSONObject jsonObject = new JSONObject(); 60 | jsonObject.put("type", TaskType.QUEST.name()); 61 | jsonObject.put("quest", ((Quest) questSelector.getSelectedItem()).name()); 62 | return jsonObject; 63 | } 64 | 65 | @Override 66 | public void fromJSON(JSONObject jsonObject) { 67 | questSelector.setSelectedItem(Quest.valueOf((String) jsonObject.get("quest"))); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/gui/task_panels/ResourceTaskPanel.java: -------------------------------------------------------------------------------- 1 | package gui.task_panels; 2 | 3 | import gui.fields.ItemField; 4 | import gui.fields.RSUnitField; 5 | import gui.styled_components.StyledJLabel; 6 | import gui.styled_components.StyledJPanel; 7 | import org.json.simple.JSONObject; 8 | import tasks.ResourceTask; 9 | import tasks.Task; 10 | import tasks.TaskType; 11 | 12 | import javax.swing.*; 13 | import java.awt.*; 14 | 15 | public class ResourceTaskPanel extends TaskPanel { 16 | 17 | private ItemField resourceField; 18 | private RSUnitField quantityField; 19 | private ActivitySelectorPanel activitySelectorPanel; 20 | 21 | ResourceTaskPanel() { 22 | super(TaskType.RESOURCE); 23 | 24 | JPanel contentPanel = new StyledJPanel(new BorderLayout()); 25 | 26 | JPanel bottomControls = new StyledJPanel(); 27 | bottomControls.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 28 | 29 | bottomControls.add(new StyledJLabel("Name of item:")); 30 | 31 | resourceField = new ItemField(); 32 | bottomControls.add(resourceField); 33 | 34 | final JPanel panel1 = new StyledJPanel(new BorderLayout()); 35 | panel1.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); 36 | bottomControls.add(panel1); 37 | 38 | bottomControls.add(new StyledJLabel("Quantity of item:")); 39 | 40 | quantityField = new RSUnitField(); 41 | quantityField.setColumns(10); 42 | bottomControls.add(quantityField); 43 | 44 | contentPanel.add(bottomControls, BorderLayout.SOUTH); 45 | 46 | activitySelectorPanel = new ActivitySelectorPanel(this); 47 | contentPanel.add(activitySelectorPanel.getPanel(), BorderLayout.CENTER); 48 | 49 | setContentPanel(contentPanel); 50 | } 51 | 52 | @Override 53 | public Task toTask() { 54 | return new ResourceTask( 55 | activitySelectorPanel.getActivityPanel().toActivity(), 56 | resourceField.getText(), 57 | (int) quantityField.getValue() 58 | ); 59 | } 60 | 61 | @Override 62 | public JSONObject toJSON() { 63 | JSONObject jsonObject = new JSONObject(); 64 | jsonObject.put("type", TaskType.RESOURCE.name()); 65 | jsonObject.put("resource_name", resourceField.getText()); 66 | jsonObject.put("resource_quantity", quantityField.getText()); 67 | jsonObject.put("activity", activitySelectorPanel.toJSON()); 68 | return jsonObject; 69 | } 70 | 71 | @Override 72 | public void fromJSON(JSONObject jsonObject) { 73 | resourceField.setText((String) jsonObject.get("resource_name")); 74 | quantityField.setText((String) jsonObject.get("resource_quantity")); 75 | activitySelectorPanel.fromJSON((JSONObject) jsonObject.get("activity")); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/gui/task_panels/TaskPanelFactory.java: -------------------------------------------------------------------------------- 1 | package gui.task_panels; 2 | 3 | import tasks.TaskType; 4 | 5 | public class TaskPanelFactory { 6 | public static TaskPanel createTaskPanel(final TaskType taskType) { 7 | switch (taskType) { 8 | case RESOURCE: 9 | return new ResourceTaskPanel(); 10 | case LEVEL: 11 | return new LevelTaskPanel(); 12 | case LOOP: 13 | return new LoopTaskPanel(); 14 | case TIMED: 15 | return new TimedTaskPanel(); 16 | case QUEST: 17 | return new QuestTaskPanel(); 18 | case GRAND_EXCHANGE: 19 | return new GETaskPanel(); 20 | case BREAK: 21 | return new BreakTaskPanel(); 22 | default: 23 | return null; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/gui/task_panels/TimedTaskPanel.java: -------------------------------------------------------------------------------- 1 | package gui.task_panels; 2 | 3 | import gui.styled_components.StyledJPanel; 4 | import gui.utils.DurationPanel; 5 | import org.json.simple.JSONObject; 6 | import tasks.Task; 7 | import tasks.TaskType; 8 | import tasks.TimedTask; 9 | 10 | import javax.swing.*; 11 | import java.awt.*; 12 | 13 | public class TimedTaskPanel extends TaskPanel { 14 | private ActivitySelectorPanel activitySelectorPanel; 15 | private DurationPanel durationPanel; 16 | 17 | TimedTaskPanel() { 18 | super(TaskType.TIMED); 19 | 20 | JPanel contentPanel = new StyledJPanel(new BorderLayout()); 21 | activitySelectorPanel = new ActivitySelectorPanel(this); 22 | contentPanel.add(activitySelectorPanel.getPanel(), BorderLayout.NORTH); 23 | 24 | durationPanel = new DurationPanel(); 25 | contentPanel.add(durationPanel, BorderLayout.SOUTH); 26 | 27 | setContentPanel(contentPanel); 28 | } 29 | 30 | @Override 31 | public Task toTask() { 32 | if (durationPanel.getSelectedTimeType() == DurationPanel.TimeType.MINUTES) { 33 | return new TimedTask( 34 | activitySelectorPanel.getActivityPanel().toActivity(), 35 | durationPanel.getDurationMS() 36 | ); 37 | } 38 | return new TimedTask( 39 | activitySelectorPanel.getActivityPanel().toActivity(), 40 | durationPanel.getSelectedDateTime() 41 | ); 42 | } 43 | 44 | @Override 45 | public JSONObject toJSON() { 46 | JSONObject taskObject = new JSONObject(); 47 | taskObject.put("type", TaskType.TIMED.name()); 48 | 49 | JSONObject durationObj = durationPanel.toJSON(); 50 | for (Object key : durationObj.keySet()) { 51 | taskObject.put(key, durationObj.get(key)); 52 | } 53 | 54 | taskObject.put("activity", activitySelectorPanel.toJSON()); 55 | 56 | return taskObject; 57 | } 58 | 59 | @Override 60 | public void fromJSON(final JSONObject jsonObject) { 61 | activitySelectorPanel.fromJSON((JSONObject) jsonObject.get("activity")); 62 | durationPanel.fromJSON(jsonObject); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/gui/utils/ColourScheme.java: -------------------------------------------------------------------------------- 1 | package gui.utils; 2 | 3 | import java.awt.*; 4 | 5 | public class ColourScheme { 6 | 7 | public static final Color PANEL_BACKGROUND_GREY = Color.decode("#333333"); 8 | public static final Color DIALOG_BACKGROUND_GREY = Color.decode("#181818"); 9 | public static final Color WHITE = Color.decode("#CCCCCC"); 10 | public static final Color BLUE = Color.decode("#33b5e5"); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/gui/utils/CopyToClipboardButton.java: -------------------------------------------------------------------------------- 1 | package gui.utils; 2 | 3 | import gui.IconButton; 4 | 5 | import javax.swing.*; 6 | import java.awt.*; 7 | import java.awt.datatransfer.Clipboard; 8 | import java.awt.datatransfer.StringSelection; 9 | import java.util.function.Supplier; 10 | 11 | public class CopyToClipboardButton { 12 | public static JButton create(final Supplier textSupplier) { 13 | return IconButton.createButton("Copy to clipboard", "images/clipboardIcon.png", "images/clipboardIconHover.png", e -> { 14 | Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 15 | clipboard.setContents(new StringSelection(textSupplier.get()), null); 16 | }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/gui/utils/DateTimePanel.java: -------------------------------------------------------------------------------- 1 | package gui.utils; 2 | 3 | import gui.fields.DateField; 4 | import gui.fields.IntegerField; 5 | import gui.styled_components.StyledJLabel; 6 | import gui.styled_components.StyledJPanel; 7 | 8 | import javax.swing.*; 9 | import java.awt.*; 10 | import java.time.LocalDate; 11 | import java.time.LocalDateTime; 12 | import java.time.LocalTime; 13 | import java.time.format.DateTimeFormatter; 14 | 15 | public class DateTimePanel extends StyledJPanel { 16 | 17 | private DateField dateField; 18 | private IntegerField hourField; 19 | private IntegerField minuteField; 20 | 21 | public DateTimePanel() { 22 | setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 23 | add(new StyledJLabel("Date (year-month-day):")); 24 | 25 | dateField = new DateField(); 26 | dateField.setDate(LocalDate.now()); 27 | add(dateField); 28 | 29 | add(new StyledJLabel("Time (24h): ")); 30 | 31 | hourField = new IntegerField(); 32 | hourField.setMaxValue(23); 33 | hourField.setColumns(2); 34 | hourField.setHorizontalAlignment(JTextField.CENTER); 35 | add(hourField); 36 | 37 | minuteField = new IntegerField(); 38 | minuteField.setMaxValue(59); 39 | minuteField.setColumns(2); 40 | minuteField.setHorizontalAlignment(JTextField.CENTER); 41 | add(minuteField); 42 | 43 | setDateTime(LocalDateTime.now()); 44 | } 45 | 46 | public LocalDateTime getDateTime() { 47 | return LocalDateTime.of( 48 | dateField.getDate(), 49 | LocalTime.of(Integer.parseInt(hourField.getText()), Integer.parseInt(minuteField.getText())) 50 | ); 51 | } 52 | 53 | public void setDateTime(final LocalDateTime dateTime) { 54 | dateField.setDate(dateTime.toLocalDate()); 55 | hourField.setText("" + dateTime.format(DateTimeFormatter.ofPattern("HH"))); 56 | minuteField.setText("" + dateTime.format(DateTimeFormatter.ofPattern("mm"))); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/gui/utils/EventDispatchThreadRunner.java: -------------------------------------------------------------------------------- 1 | package gui.utils; 2 | 3 | import javax.swing.*; 4 | import java.lang.reflect.InvocationTargetException; 5 | 6 | public class EventDispatchThreadRunner { 7 | 8 | public static void runOnDispatchThread(final Runnable runnable, final boolean wait) throws InvocationTargetException, InterruptedException { 9 | if (SwingUtilities.isEventDispatchThread()) { 10 | runnable.run(); 11 | } else if (wait) { 12 | SwingUtilities.invokeAndWait(runnable); 13 | } else { 14 | SwingUtilities.invokeLater(runnable); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/paint/MouseTrail.java: -------------------------------------------------------------------------------- 1 | package paint; 2 | 3 | import org.osbot.rs07.api.Mouse; 4 | import org.osbot.rs07.canvas.paint.Painter; 5 | 6 | import java.awt.*; 7 | import java.awt.geom.GeneralPath; 8 | import java.util.ArrayDeque; 9 | import java.util.Iterator; 10 | 11 | public class MouseTrail implements Painter { 12 | 13 | private final ArrayDeque mousePoints; 14 | private final Mouse mouse; 15 | private final int maxTrailLength; 16 | private final Color colour; 17 | 18 | public MouseTrail(final Mouse mouse, final int maxTrailLength, final Color colour) { 19 | this.mouse = mouse; 20 | this.maxTrailLength = maxTrailLength; 21 | this.colour = colour; 22 | mousePoints = new ArrayDeque<>(maxTrailLength); 23 | } 24 | 25 | @Override 26 | public void onPaint(final Graphics2D g) { 27 | updatePoints(); 28 | if (mousePoints.size() > 1) drawPath(g); 29 | } 30 | 31 | private void updatePoints() { 32 | Point mousePos = mouse.getPosition(); 33 | if (mousePos.equals(mousePoints.peekLast())) { 34 | mousePoints.poll(); 35 | return; 36 | } 37 | if (mousePoints.size() >= maxTrailLength) mousePoints.poll(); 38 | if (mousePos.x < 0 || mousePos.y < 0) { 39 | if (mousePoints.size() > 0) mousePoints.offer(mousePoints.peekLast()); 40 | } else mousePoints.offer(mousePos); 41 | } 42 | 43 | private void drawPath(final Graphics2D g) { 44 | 45 | g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 46 | g.setColor(colour); 47 | 48 | GeneralPath path = new GeneralPath(); 49 | 50 | Iterator mousePointIterator = mousePoints.iterator(); 51 | 52 | Point firstPoint = mousePointIterator.next(); 53 | path.moveTo(firstPoint.getX(), firstPoint.getY()); 54 | 55 | Point prev = firstPoint; 56 | while (mousePointIterator.hasNext()) { 57 | Point current = mousePointIterator.next(); 58 | path.quadTo(prev.getX(), prev.getY(), current.getX(), current.getY()); 59 | prev = current; 60 | } 61 | g.draw(path); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/tasks/GrandExchangeTask.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.grand_exchange.GEActivity; 4 | import activities.grand_exchange.GEItem; 5 | import activities.grand_exchange.GEMode; 6 | import org.osbot.rs07.api.GrandExchange; 7 | import util.RSUnits; 8 | 9 | public class GrandExchangeTask extends Task { 10 | 11 | private final GEActivity geActivity; 12 | private final GEMode geMode; 13 | private final GEItem geItem; 14 | private final boolean waitForCompletion; 15 | private boolean completed; 16 | 17 | public GrandExchangeTask(final GEActivity geActivity, final GEMode geMode, final GEItem geItem, final boolean waitForCompletion) { 18 | super(TaskType.GRAND_EXCHANGE, geActivity); 19 | this.geActivity = geActivity; 20 | this.geMode = geMode; 21 | this.geItem = geItem; 22 | this.waitForCompletion = waitForCompletion; 23 | } 24 | 25 | @Override 26 | public boolean isComplete() { 27 | if (completed) { 28 | return true; 29 | } 30 | 31 | GEActivity activity = (GEActivity) getActivity(); 32 | 33 | if (activity.getBox() == null) { 34 | return false; 35 | } 36 | 37 | if (activity.getBox() != null && !waitForCompletion) { 38 | completed = true; 39 | return true; 40 | } 41 | 42 | if (geMode == GEMode.BUY && getGrandExchange().getStatus(activity.getBox()) == GrandExchange.Status.FINISHED_BUY) { 43 | if (getGrandExchange().collect(true)) { 44 | completed = true; 45 | return true; 46 | } else { 47 | return false; 48 | } 49 | } 50 | 51 | if (geMode == GEMode.SELL && getGrandExchange().getStatus(activity.getBox()) == GrandExchange.Status.FINISHED_SALE) { 52 | if (getGrandExchange().collect(true)) { 53 | completed = true; 54 | return true; 55 | } else { 56 | return false; 57 | } 58 | } 59 | return false; 60 | } 61 | 62 | @Override 63 | public String toString() { 64 | return String.format( 65 | "Grand Exchange task: %s %s %s for %s each", 66 | geMode.toString(), 67 | RSUnits.valueToFormatted(geItem.getQuantity()), 68 | geItem.getName(), 69 | RSUnits.valueToFormatted(geItem.getPrice()) 70 | ); 71 | } 72 | 73 | @Override 74 | public Task copy() { 75 | return new GrandExchangeTask(geActivity.copy(), geMode, geItem, waitForCompletion); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/tasks/LevelTask.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.activity.Activity; 4 | import org.osbot.rs07.api.ui.Skill; 5 | import util.PaintUtil; 6 | 7 | public class LevelTask extends Task { 8 | 9 | private final Skill skill; 10 | private final int targetLevel; 11 | 12 | public LevelTask(final Activity activity, final Skill skill, final int targetLevel) { 13 | super(TaskType.LEVEL, activity); 14 | this.skill = skill; 15 | this.targetLevel = targetLevel; 16 | } 17 | 18 | @Override 19 | public boolean isComplete() { 20 | return getSkills().getStatic(skill) >= targetLevel; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return String.format( 26 | "Level task: %s (%d/%d) (%s)", 27 | skill.toString(), 28 | getSkills().getStatic(skill), 29 | targetLevel, 30 | PaintUtil.formatTime(getSkillTracker().getTimeToLevel(skill, targetLevel)) 31 | ); 32 | } 33 | 34 | @Override 35 | public Task copy() { 36 | return new LevelTask(getActivity().copy(), skill, targetLevel); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/tasks/QuestTask.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.activity.Activity; 4 | import activities.quests.Quest; 5 | 6 | public class QuestTask extends Task { 7 | 8 | private final Quest quest; 9 | 10 | public QuestTask(final Activity activity, final Quest quest) { 11 | super(TaskType.QUEST, activity); 12 | this.quest = quest; 13 | } 14 | 15 | @Override 16 | public boolean isComplete() { 17 | return quest.isComplete(getConfigs()); 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return "Quest task"; 23 | } 24 | 25 | @Override 26 | public Task copy() { 27 | return new QuestTask(getActivity().copy(), quest); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/tasks/ResourceTask.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.activity.Activity; 4 | 5 | public class ResourceTask extends Task { 6 | 7 | private final String resource; 8 | private final int targetQuantity; 9 | private long quantityObtained; 10 | private long prevInvcount; 11 | 12 | public ResourceTask(final Activity activity, final String resource, final int targetQuantity) { 13 | super(TaskType.RESOURCE, activity); 14 | this.resource = resource; 15 | this.targetQuantity = targetQuantity; 16 | } 17 | 18 | @Override 19 | public void onStart() throws InterruptedException { 20 | super.onStart(); 21 | prevInvcount = getInventory().getAmount(resource); 22 | } 23 | 24 | @Override 25 | public boolean isComplete() { 26 | return quantityObtained >= targetQuantity; 27 | } 28 | 29 | @Override 30 | public void run() throws InterruptedException { 31 | long invCount = getInventory().getAmount(resource); 32 | if (invCount > prevInvcount) quantityObtained += invCount - prevInvcount; 33 | prevInvcount = invCount; 34 | super.run(); 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return String.format("Resource task: %s (%d/%d)", resource, quantityObtained, targetQuantity); 40 | } 41 | 42 | @Override 43 | public Task copy() { 44 | return new ResourceTask(getActivity().copy(), resource, targetQuantity); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/tasks/Task.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.activity.Activity; 4 | import org.osbot.rs07.canvas.paint.Painter; 5 | import util.Copyable; 6 | import util.executable.Executable; 7 | 8 | import java.awt.*; 9 | 10 | public abstract class Task extends Executable implements Copyable, Painter { 11 | private final TaskType taskType; 12 | protected Activity activity; 13 | private int executionOrder; 14 | 15 | public Task(final TaskType taskType) { 16 | this.taskType = taskType; 17 | } 18 | 19 | public Task(final TaskType taskType, final Activity activity) { 20 | this.taskType = taskType; 21 | this.activity = activity; 22 | } 23 | 24 | public abstract boolean isComplete(); 25 | 26 | public TaskType getTaskType() { 27 | return taskType; 28 | } 29 | 30 | public Activity getActivity() { 31 | return activity; 32 | } 33 | 34 | public int getExecutionOrder() { 35 | return executionOrder; 36 | } 37 | 38 | public void setExecutionOrder(int executionOrder) { 39 | this.executionOrder = executionOrder; 40 | } 41 | 42 | @Override 43 | public void onStart() throws InterruptedException { 44 | if (activity != null) { 45 | activity.exchangeContext(getBot(), this); 46 | activity.onStart(); 47 | } 48 | } 49 | 50 | @Override 51 | public void run() throws InterruptedException { 52 | if (activity != null) { 53 | execute(activity); 54 | } 55 | } 56 | 57 | @Override 58 | public boolean canExit() { 59 | return activity == null || activity.canExit(); 60 | } 61 | 62 | @Override 63 | public void onEnd() throws InterruptedException { 64 | if (activity != null) { 65 | activity.onEnd(); 66 | } 67 | } 68 | 69 | @Override 70 | public void onPaint(Graphics2D graphics) { 71 | if (activity != null) { 72 | activity.onPaint(graphics); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/tasks/TaskType.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | public enum TaskType { 4 | 5 | LEVEL("Level Task"), 6 | LOOP("Loop Task"), 7 | RESOURCE("Resource Task"), 8 | TIMED("Timed task"), 9 | QUEST("Quest task"), 10 | GRAND_EXCHANGE("Grand Exchange Task"), 11 | TUTORIAL_ISLAND("Tutorial Island Task"), 12 | BREAK("Break Task"); 13 | 14 | String name; 15 | 16 | TaskType(final String name) { 17 | this.name = name; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return name; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/tasks/TimedTask.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.activity.Activity; 4 | 5 | import java.time.LocalDateTime; 6 | import java.time.format.DateTimeFormatter; 7 | 8 | public class TimedTask extends Task { 9 | 10 | private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 11 | private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); 12 | 13 | private long durationMs; 14 | private LocalDateTime endTime; 15 | private String endDateStr; 16 | private String endTimeStr; 17 | 18 | private long startTimeMs; 19 | private boolean isStarted; 20 | 21 | public TimedTask(final Activity activity, final long durationMs) { 22 | super(TaskType.TIMED, activity); 23 | this.durationMs = durationMs; 24 | } 25 | 26 | public TimedTask(final Activity activity, final LocalDateTime endTime) { 27 | super(TaskType.TIMED, activity); 28 | this.endTime = endTime; 29 | endDateStr = dateFormatter.format(endTime); 30 | endTimeStr = timeFormatter.format(endTime); 31 | } 32 | 33 | @Override 34 | public boolean isComplete() { 35 | if (!isStarted) { 36 | return false; 37 | } 38 | 39 | if (endTime != null) { 40 | return LocalDateTime.now().isAfter(endTime); 41 | } 42 | 43 | return System.currentTimeMillis() - startTimeMs >= durationMs; 44 | } 45 | 46 | @Override 47 | public void run() throws InterruptedException { 48 | if (!isStarted) { 49 | startTimeMs = System.currentTimeMillis(); 50 | isStarted = true; 51 | } 52 | super.run(); 53 | } 54 | 55 | @Override 56 | public String toString() { 57 | if (endTime != null) { 58 | return String.format("Timed task: Ends on %s at %s", endDateStr, endTimeStr); 59 | } 60 | 61 | long runTime = System.currentTimeMillis() - startTimeMs; 62 | return String.format("Timed task: (%s/%s)", formatTime(runTime), formatTime(durationMs)); 63 | } 64 | 65 | private String formatTime(final long ms) { 66 | long s = ms / 1000, m = s / 60, h = m / 60, d = h / 24; 67 | s %= 60; 68 | m %= 60; 69 | h %= 24; 70 | 71 | return d > 0 ? String.format("%02d:%02d:%02d:%02d", d, h, m, s) : 72 | h > 0 ? String.format("%02d:%02d:%02d", h, m, s) : 73 | String.format("%02d:%02d", m, s); 74 | } 75 | 76 | @Override 77 | public Task copy() { 78 | return new TimedTask(getActivity().copy(), durationMs); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/tasks/TutorialIslandTask.java: -------------------------------------------------------------------------------- 1 | package tasks; 2 | 3 | import activities.tutorial_island.TutorialIsland; 4 | 5 | public class TutorialIslandTask extends Task { 6 | 7 | public TutorialIslandTask() { 8 | super(TaskType.TUTORIAL_ISLAND, new TutorialIsland()); 9 | } 10 | 11 | @Override 12 | public boolean isComplete() { 13 | return getConfigs().get(281) == 1000 && myPlayer().isVisible(); 14 | } 15 | 16 | @Override 17 | public void run() throws InterruptedException { 18 | if (getSettings().getRunEnergy() > 40) { 19 | getSettings().setRunning(true); 20 | } 21 | super.run(); 22 | } 23 | 24 | @Override 25 | public String toString() { 26 | return "Tutorial Island task"; 27 | } 28 | 29 | @Override 30 | public Task copy() { 31 | return new TutorialIslandTask(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/tasks/break_task/BreakTask.java: -------------------------------------------------------------------------------- 1 | package tasks.break_task; 2 | 3 | import org.osbot.rs07.script.RandomEvent; 4 | import tasks.Task; 5 | import tasks.TaskType; 6 | 7 | import java.time.LocalDateTime; 8 | import java.time.format.DateTimeFormatter; 9 | 10 | public class BreakTask extends Task { 11 | 12 | private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 13 | private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); 14 | private final boolean shouldLogout; 15 | private long duration; 16 | private LocalDateTime endTime; 17 | private String endDateStr; 18 | private String endTimeStr; 19 | private CustomBreakManager customBreakManager; 20 | 21 | public BreakTask(final long duration, final boolean shouldLogout) { 22 | super(TaskType.BREAK, null); 23 | this.duration = duration; 24 | this.shouldLogout = shouldLogout; 25 | } 26 | 27 | public BreakTask(final LocalDateTime endTime, final boolean shouldLogout) { 28 | super(TaskType.BREAK, null); 29 | this.endTime = endTime; 30 | this.shouldLogout = shouldLogout; 31 | 32 | endDateStr = dateFormatter.format(endTime); 33 | endTimeStr = timeFormatter.format(endTime); 34 | } 35 | 36 | @Override 37 | public void onStart() { 38 | customBreakManager = (CustomBreakManager) getBot().getRandomExecutor().forEvent(RandomEvent.BREAK_MANAGER); 39 | customBreakManager.reset(); 40 | 41 | if (endTime != null) { 42 | customBreakManager.startBreaking(endTime, shouldLogout); 43 | } else { 44 | customBreakManager.startBreaking(duration, shouldLogout); 45 | } 46 | } 47 | 48 | @Override 49 | public boolean isComplete() { 50 | return customBreakManager.finishedBreaking(); 51 | } 52 | 53 | @Override 54 | public String toString() { 55 | if (endTime != null) { 56 | return String.format("Break task: Ends on %s at %s", endDateStr, endTimeStr); 57 | } 58 | 59 | return String.format( 60 | "Break task (%s) %s", 61 | formatTime(duration), 62 | formatTime(System.currentTimeMillis() - customBreakManager.getBreakStartTime()) 63 | ); 64 | } 65 | 66 | private String formatTime(final long ms) { 67 | long s = ms / 1000, m = s / 60, h = m / 60, d = h / 24; 68 | s %= 60; 69 | m %= 60; 70 | h %= 24; 71 | 72 | return d > 0 ? String.format("%02d:%02d:%02d:%02d", d, h, m, s) : 73 | h > 0 ? String.format("%02d:%02d:%02d", h, m, s) : 74 | String.format("%02d:%02d", m, s); 75 | } 76 | 77 | @Override 78 | public Task copy() { 79 | return new BreakTask(duration, shouldLogout); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/tasks/break_task/CustomBreakManager.java: -------------------------------------------------------------------------------- 1 | package tasks.break_task; 2 | 3 | import org.osbot.rs07.api.Client; 4 | import org.osbot.rs07.script.RandomEvent; 5 | import org.osbot.rs07.script.RandomSolver; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | public class CustomBreakManager extends RandomSolver { 10 | 11 | private LocalDateTime endDateTime; 12 | 13 | private long breakDuration = -1; 14 | private long breakStartTime = -1; 15 | private boolean shouldLogout; 16 | 17 | public CustomBreakManager() { 18 | super(RandomEvent.BREAK_MANAGER); 19 | } 20 | 21 | public void reset() { 22 | endDateTime = null; 23 | breakDuration = -1; 24 | breakStartTime = -1; 25 | shouldLogout = false; 26 | } 27 | 28 | public void startBreaking(final long breakDuration) { 29 | startBreaking(breakDuration, false); 30 | } 31 | 32 | public void startBreaking(final long breakDuration, final boolean shouldLogout) { 33 | this.breakDuration = breakDuration; 34 | this.breakStartTime = System.currentTimeMillis(); 35 | this.shouldLogout = shouldLogout; 36 | } 37 | 38 | public void startBreaking(final LocalDateTime endDateTime) { 39 | startBreaking(endDateTime, false); 40 | } 41 | 42 | public void startBreaking(final LocalDateTime endDateTime, final boolean shouldLogout) { 43 | this.endDateTime = endDateTime; 44 | this.shouldLogout = shouldLogout; 45 | } 46 | 47 | public long getBreakStartTime() { 48 | return breakStartTime; 49 | } 50 | 51 | @Override 52 | public boolean shouldActivate() { 53 | return (endDateTime != null || breakDuration > 0) && !finishedBreaking(); 54 | } 55 | 56 | public boolean finishedBreaking() { 57 | if (endDateTime != null) { 58 | return LocalDateTime.now().isAfter(endDateTime); 59 | } 60 | 61 | return System.currentTimeMillis() - breakStartTime >= breakDuration; 62 | } 63 | 64 | @Override 65 | public int onLoop() throws InterruptedException { 66 | if (shouldLogout && getClient().getLoginState() == Client.LoginState.LOGIN_SUCCESSFUL) { 67 | if (getWidgets().closeOpenInterface() && getLogoutTab().logOut()) { 68 | return 1000; 69 | } 70 | } 71 | 72 | if (getMouse().isOnScreen()) { 73 | getMouse().moveOutsideScreen(); 74 | } 75 | 76 | return 3000; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/tasks/task_executor/TaskChangeListener.java: -------------------------------------------------------------------------------- 1 | package tasks.task_executor; 2 | 3 | import tasks.Task; 4 | 5 | public interface TaskChangeListener { 6 | void taskChanged(final Task oldTask, final Task newTask); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/util/Copyable.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | public interface Copyable { 4 | T copy(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/util/Location.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import org.osbot.rs07.api.map.Area; 4 | 5 | public class Location { 6 | 7 | private final String name; 8 | private final Area area; 9 | 10 | public Location(final String name, final Area area) { 11 | this.name = name; 12 | this.area = area; 13 | } 14 | 15 | public String getName() { 16 | return name; 17 | } 18 | 19 | public Area getArea() { 20 | return area; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return name; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/util/PaintUtil.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | public class PaintUtil { 4 | 5 | public static String formatTime(long ms) { 6 | long s = ms / 1000, m = s / 60, h = m / 60; 7 | h %= 24; 8 | m %= 60; 9 | s %= 60; 10 | return String.format("%02d:%02d:%02d", h, m, s); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/util/RSUnits.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import java.text.DecimalFormat; 4 | import java.util.Collections; 5 | import java.util.LinkedHashMap; 6 | import java.util.Map; 7 | import java.util.regex.Pattern; 8 | 9 | public class RSUnits { 10 | 11 | public static final Pattern UNIT_PATTERN = Pattern.compile("^\\d+(?:(?:\\.\\d+[kmb])|[kmb])?$"); 12 | 13 | private static final DecimalFormat decimalFormat = new DecimalFormat("#.#"); 14 | 15 | private static final Map suffixMultipliers; 16 | 17 | static { 18 | // Use a LinkedHashMap to maintain insertion order (largest denomination first) 19 | Map suffixMultipliersTemp = new LinkedHashMap<>(); 20 | 21 | suffixMultipliersTemp.put('b', 1_000_000_000); 22 | suffixMultipliersTemp.put('m', 1_000_000); 23 | suffixMultipliersTemp.put('k', 1_000); 24 | 25 | suffixMultipliers = Collections.unmodifiableMap(suffixMultipliersTemp); 26 | } 27 | 28 | public static long formattedToValue(String formattedValue) { 29 | formattedValue = formattedValue.trim(); 30 | 31 | formattedValue = formattedValue.toLowerCase(); 32 | 33 | char suffix = formattedValue.charAt(formattedValue.length() - 1); 34 | 35 | // If no suffix exists, assume it is already in GP 36 | if (!suffixMultipliers.containsKey(suffix)) { 37 | return Integer.parseInt(formattedValue); 38 | } 39 | 40 | String valueNoSuffix = formattedValue.substring(0, formattedValue.length() - 1); 41 | 42 | double valueDouble = Double.parseDouble(valueNoSuffix); 43 | 44 | valueDouble = valueDouble * suffixMultipliers.get(suffix); 45 | 46 | return (long) valueDouble; 47 | } 48 | 49 | public static String valueToFormatted(final long value) { 50 | for (Character suffix : suffixMultipliers.keySet()) { 51 | Integer multiplier = suffixMultipliers.get(suffix); 52 | 53 | if (value > multiplier) { 54 | double newValue = ((double) value / multiplier); 55 | 56 | return decimalFormat.format(newValue) + suffix; 57 | } 58 | } 59 | 60 | return Long.toString(value); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/util/ResourceMode.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | public enum ResourceMode { 4 | 5 | BANK, 6 | DROP; 7 | 8 | @Override 9 | public String toString() { 10 | char[] name = name().toLowerCase().toCharArray(); 11 | name[0] = Character.toUpperCase(name[0]); 12 | return new String(name); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/util/ScreenshotUtil.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import org.osbot.rs07.Bot; 4 | import org.osbot.rs07.canvas.paint.Painter; 5 | import org.osbot.rs07.script.Script; 6 | 7 | import javax.imageio.ImageIO; 8 | import java.awt.*; 9 | import java.awt.image.BufferedImage; 10 | import java.io.File; 11 | import java.io.IOException; 12 | import java.nio.file.Paths; 13 | import java.time.LocalDateTime; 14 | import java.time.format.DateTimeFormatter; 15 | 16 | public class ScreenshotUtil { 17 | 18 | private static final DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy.MM.dd_HH.mm.ss"); 19 | 20 | public static void takeScreenshot(final Bot bot) throws IOException { 21 | takeScreenshot(bot, dateFormat.format(LocalDateTime.now()) + ".png"); 22 | } 23 | 24 | public static void takeScreenshot(final Bot bot, final String imageName) throws IOException { 25 | Script currentScript = bot.getScriptExecutor().getCurrent(); 26 | String scriptName = currentScript.getName(); 27 | 28 | File screenshotDir = Paths.get(currentScript.getDirectoryData(), scriptName, "Screenshots", bot.getMethods().myPlayer().getName()).toFile(); 29 | 30 | if (!screenshotDir.exists()) { 31 | screenshotDir.mkdirs(); 32 | } 33 | 34 | BufferedImage gameBuffer = bot.getCanvas().getGameBuffer(); 35 | 36 | if (gameBuffer == null) { 37 | return; 38 | } 39 | 40 | BufferedImage outImage = GraphicsEnvironment.getLocalGraphicsEnvironment() 41 | .getDefaultScreenDevice() 42 | .getDefaultConfiguration() 43 | .createCompatibleImage(gameBuffer.getWidth(), gameBuffer.getHeight(), 1); 44 | 45 | Graphics2D graphics = outImage.createGraphics(); 46 | 47 | graphics.drawImage(gameBuffer, 0, 0, null); 48 | 49 | for (final Painter painter : bot.getPainters()) { 50 | painter.onPaint(graphics); 51 | } 52 | 53 | graphics.dispose(); 54 | 55 | File outputFile = Paths.get(screenshotDir.getAbsolutePath(), imageName).toFile(); 56 | ImageIO.write(outImage, "PNG", outputFile); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/util/ScriptProperties.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.FileOutputStream; 6 | import java.io.IOException; 7 | import java.nio.file.Paths; 8 | import java.util.Properties; 9 | 10 | public class ScriptProperties { 11 | 12 | public static final String IGNORE_UPDATE_SCRIPT_VER = "ignore_update_script_ver"; 13 | 14 | private static final String PROPERTIES_FILENAME = Paths.get(System.getProperty("user.home"), 15 | "OSBot", 16 | "Data", 17 | "explvs_aio.properties").toString(); 18 | 19 | 20 | public static void setProperty(final String key, final String value) { 21 | Properties properties = loadProperties(); 22 | properties.setProperty(key, value); 23 | saveProperties(properties); 24 | } 25 | 26 | public static String getProperty(final String key) { 27 | Properties properties = loadProperties(); 28 | return properties.getProperty(key); 29 | } 30 | 31 | private static Properties loadProperties() { 32 | Properties properties = new Properties(); 33 | 34 | File propertiesFile = new File(PROPERTIES_FILENAME); 35 | 36 | if (!propertiesFile.exists()) { 37 | return properties; 38 | } 39 | 40 | try { 41 | FileInputStream fileInputStream = new FileInputStream(propertiesFile); 42 | properties.load(fileInputStream); 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | } 46 | return properties; 47 | } 48 | 49 | private static Properties saveProperties(final Properties properties) { 50 | try { 51 | FileOutputStream fileOutputStream = new FileOutputStream(PROPERTIES_FILENAME); 52 | properties.store(fileOutputStream, null); 53 | } catch (IOException e) { 54 | e.printStackTrace(); 55 | } 56 | return properties; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/util/Sleep.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import org.osbot.rs07.utility.ConditionalSleep; 4 | 5 | import java.util.function.BooleanSupplier; 6 | 7 | public final class Sleep extends ConditionalSleep { 8 | 9 | private final BooleanSupplier condition; 10 | 11 | public Sleep(final BooleanSupplier condition, final int timeout) { 12 | super(timeout); 13 | this.condition = condition; 14 | } 15 | 16 | public Sleep(final BooleanSupplier condition, final int timeout, final int interval) { 17 | super(timeout, interval); 18 | this.condition = condition; 19 | } 20 | 21 | public static boolean sleepUntil(final BooleanSupplier condition, final int timeout) { 22 | return new Sleep(condition, timeout).sleep(); 23 | } 24 | 25 | public static boolean sleepUntil(final BooleanSupplier condition, final int timeout, final int interval) { 26 | return new Sleep(condition, timeout, interval).sleep(); 27 | } 28 | 29 | @Override 30 | public boolean condition() throws InterruptedException { 31 | return condition.getAsBoolean(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/util/Tool.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import org.osbot.rs07.api.Skills; 4 | 5 | public interface Tool { 6 | String getName(); 7 | 8 | boolean isMembersOnly(); 9 | 10 | int getLevelRequired(); 11 | 12 | boolean canUse(final Skills skills); 13 | 14 | boolean canEquip(final Skills skills); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/ExecutableUtil.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import util.executable.Executable; 4 | 5 | public class ExecutableUtil extends CustomMethodProvider { 6 | 7 | public void execute(final Executable executable) throws InterruptedException { 8 | if (!executable.hasContext()) { 9 | executable.exchangeContext(getBot(), this); 10 | } 11 | executable.run(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/ExtendedCamera.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import org.osbot.rs07.api.Camera; 4 | import org.osbot.rs07.api.model.Entity; 5 | import org.osbot.rs07.api.ui.RS2Widget; 6 | import org.osbot.rs07.api.ui.Tab; 7 | import org.osbot.rs07.event.Event; 8 | 9 | import java.util.function.Supplier; 10 | 11 | public class ExtendedCamera extends Camera { 12 | 13 | private static final int MAX_PITCH_ANGLE = 67; 14 | private static final int MAX_ZOOM_OUT_SCALE = 181; 15 | private final CustomMethodProvider customMethodProvider; 16 | 17 | public ExtendedCamera(final CustomMethodProvider customMethodProvider) { 18 | this.customMethodProvider = customMethodProvider; 19 | } 20 | 21 | public boolean isAtTop() { 22 | return getCamera().getPitchAngle() >= MAX_PITCH_ANGLE; 23 | } 24 | 25 | public int clampAngle(final int angle) { 26 | if (angle < 0) { 27 | return angle + 360; 28 | } else if (angle > 360) { 29 | return angle - 360; 30 | } 31 | return angle; 32 | } 33 | 34 | public void moveYawUntilObjectVisible(final Supplier entitySupplier) { 35 | execute(new Event() { 36 | @Override 37 | public int execute() { 38 | if (entitySupplier.get().isVisible()) { 39 | setFinished(); 40 | } else { 41 | int nextYaw = clampAngle(getCamera().getYawAngle() + random(5, 10)); 42 | getCamera().moveYaw(nextYaw); 43 | } 44 | return 0; 45 | } 46 | }); 47 | } 48 | 49 | public boolean isZoomedOut() { 50 | return getCamera().getScaleZ() == MAX_ZOOM_OUT_SCALE; 51 | } 52 | 53 | public void zoomOut() { 54 | if (isZoomedOut()) { 55 | log("IS zoomed out"); 56 | return; 57 | } 58 | execute(new Event() { 59 | @Override 60 | public int execute() { 61 | if (isZoomedOut()) { 62 | setFinished(); 63 | } else if (getTabs().getOpen() != Tab.SETTINGS) { 64 | getTabs().open(Tab.SETTINGS); 65 | } else if (!customMethodProvider.getSettings().isBasicSettingsTabOpen(ExtendedSettings.BasicSettingsTab.CONTROLS)) { 66 | customMethodProvider.getSettings().openBasicSettingsTab(ExtendedSettings.BasicSettingsTab.CONTROLS); 67 | } else { 68 | RS2Widget maxZoomOutWidget = getWidgets().get(116, 51); 69 | if (maxZoomOutWidget != null) { 70 | maxZoomOutWidget.interact(); 71 | } 72 | } 73 | return 0; 74 | } 75 | }); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/ExtendedGroundItems.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import org.osbot.rs07.api.GroundItems; 4 | import org.osbot.rs07.api.model.GroundItem; 5 | import org.osbot.rs07.event.InteractionEvent; 6 | import util.Sleep; 7 | 8 | public class ExtendedGroundItems extends GroundItems { 9 | 10 | public boolean canTakeStackableItem(final String itemName) { 11 | return getInventory().contains(itemName) || !getInventory().isFull(); 12 | } 13 | 14 | public boolean take(final String itemName) { 15 | return take(getGroundItems().closest(itemName)); 16 | } 17 | 18 | public boolean take(final String itemName, final boolean useCamera) { 19 | return take(getGroundItems().closest(itemName), useCamera); 20 | } 21 | 22 | public boolean take(final GroundItem groundItem) { 23 | return take(groundItem, true); 24 | } 25 | 26 | public boolean take(final GroundItem groundItem, final boolean useCamera) { 27 | long invAmount = getInventory().getAmount(groundItem.getName()); 28 | if (execute(new InteractionEvent(groundItem, "Take").setOperateCamera(useCamera)).hasFinished()) { 29 | Sleep.sleepUntil(() -> { 30 | return getInventory().getAmount(groundItem.getName()) > invAmount || 31 | !groundItem.exists(); 32 | }, 5000); 33 | } 34 | return getInventory().getAmount(groundItem.getName()) > invAmount; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/ExtendedInventory.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import org.osbot.rs07.api.Inventory; 4 | import util.Sleep; 5 | 6 | public class ExtendedInventory extends Inventory { 7 | 8 | public boolean use(final String itemName) { 9 | if (itemName.equals(getSelectedItemName())) { 10 | return true; 11 | } 12 | if (getInventory().interact("Use", itemName)) { 13 | Sleep.sleepUntil(() -> itemName.equals(getSelectedItemName()), 1000); 14 | return true; 15 | } 16 | return false; 17 | } 18 | 19 | public boolean equip(final String itemName) { 20 | return getInventory().getItem(itemName).interact("Wield", "Equip"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/ExtendedNPCS.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import org.osbot.rs07.api.NPCS; 4 | import org.osbot.rs07.api.model.NPC; 5 | 6 | public class ExtendedNPCS extends NPCS { 7 | 8 | public boolean isTalkingToNPC(final String npcName) { 9 | NPC npc = getNpcs().closest(npcName); 10 | 11 | if (npc == null) { 12 | return false; 13 | } 14 | 15 | return getDialogues().inDialogue() && myPlayer().isInteracting(npc); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/Graphics.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import org.osbot.rs07.api.model.Entity; 4 | import org.osbot.rs07.script.MethodProvider; 5 | 6 | import java.awt.*; 7 | 8 | public class Graphics extends MethodProvider { 9 | 10 | public void drawEntity(final Entity entity, final Graphics2D graphics) { 11 | getDisplay().drawModel( 12 | graphics, 13 | entity.getGridX(), 14 | entity.getGridY(), 15 | entity.getZ(), 16 | entity.getModel() 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/util/custom_method_provider/InteractionHelper.java: -------------------------------------------------------------------------------- 1 | package util.custom_method_provider; 2 | 3 | import org.osbot.rs07.api.model.Entity; 4 | import org.osbot.rs07.event.InteractionEvent; 5 | import org.osbot.rs07.script.MethodProvider; 6 | 7 | public class InteractionHelper extends MethodProvider { 8 | 9 | public boolean canInteract(final Entity entity) { 10 | return entity != null && 11 | entity.isVisible() && 12 | getMap().canReach(entity); 13 | } 14 | 15 | public boolean interactNoMovement(final Entity entity) { 16 | InteractionEvent event = new InteractionEvent(entity); 17 | event.setOperateCamera(false); 18 | event.setWalkTo(false); 19 | return execute(event).hasFinished(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/util/event/ConfigureClientEvent.java: -------------------------------------------------------------------------------- 1 | package util.event; 2 | 3 | import org.osbot.rs07.api.Display; 4 | import util.custom_method_provider.ExtendedSettings; 5 | import util.executable.BlockingExecutable; 6 | 7 | public class ConfigureClientEvent extends BlockingExecutable { 8 | 9 | private boolean isAudioDisabled = false; 10 | 11 | @Override 12 | protected void blockingRun() throws InterruptedException { 13 | if (getDisplay().isResizableMode()) { 14 | getDisplay().setDisplayMode(Display.DisplayMode.FIXED); 15 | } else if (!getSettings().areRoofsEnabled()) { 16 | getSettings().toggleSetting(ExtendedSettings.Setting.HIDE_ROOFS); 17 | } else if (!getSettings().isShiftDropActive()) { 18 | getSettings().toggleSetting(ExtendedSettings.Setting.SHIFT_CLICK_TO_DROP_ITEMS); 19 | } else if (getSettings().isAllSettingsWidgetVisible()) { 20 | getWidgets().closeOpenInterface(); 21 | } else if (!isAudioDisabled) { 22 | execute(new DisableAudioEvent()); 23 | isAudioDisabled = true; 24 | } else { 25 | setFinished(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/util/event/DisableAudioEvent.java: -------------------------------------------------------------------------------- 1 | package util.event; 2 | 3 | import org.osbot.rs07.api.ui.Tab; 4 | import org.osbot.rs07.event.Event; 5 | import util.widget.CachedWidget; 6 | import util.widget.filters.WidgetActionFilter; 7 | import util.widget.filters.WidgetMessageFilter; 8 | 9 | public final class DisableAudioEvent extends Event { 10 | 11 | private static final int musicVolumeConfig = 168; 12 | private static final int soundEffectVolumeConfig = 169; 13 | private static final int areaSoundEffectVolumeConfig = 872; 14 | 15 | private final CachedWidget soundSettingsWidget = new CachedWidget(new WidgetActionFilter("Audio")); 16 | private final CachedWidget musicVolumeWidget = new CachedWidget(new WidgetActionFilter("Adjust Music Volume")); 17 | private final CachedWidget audioSettingsWidget = new CachedWidget(new WidgetMessageFilter("Audio Settings")); 18 | private final CachedWidget soundEffectVolumeWidget = new CachedWidget(new WidgetActionFilter("Adjust Sound Effect Volume")); 19 | private final CachedWidget areaSoundEffectVolumeWidget = new CachedWidget(new WidgetActionFilter("Adjust Area Sound Volume")); 20 | 21 | @Override 22 | public final int execute() throws InterruptedException { 23 | if (isVolumeDisabled(musicVolumeConfig) && isVolumeDisabled(soundEffectVolumeConfig) && isVolumeDisabled(areaSoundEffectVolumeConfig)) { 24 | setFinished(); 25 | } else if (Tab.SETTINGS.isDisabled(getBot())) { 26 | setFailed(); 27 | } else if (getTabs().getOpen() != Tab.SETTINGS) { 28 | getTabs().open(Tab.SETTINGS); 29 | } else if (!audioSettingsWidget.isVisible(getWidgets())) { 30 | soundSettingsWidget.interact(getWidgets()); 31 | } else if (!isVolumeDisabled(musicVolumeConfig)) { 32 | musicVolumeWidget.interact(getWidgets()); 33 | } else if (!isVolumeDisabled(soundEffectVolumeConfig)) { 34 | soundEffectVolumeWidget.interact(getWidgets()); 35 | } else if (!isVolumeDisabled(areaSoundEffectVolumeConfig)) { 36 | areaSoundEffectVolumeWidget.interact(getWidgets()); 37 | } 38 | return 600; 39 | } 40 | 41 | private boolean isVolumeDisabled(final int config) { 42 | return getConfigs().get(config) == 4; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/util/executable/BlockingExecutable.java: -------------------------------------------------------------------------------- 1 | package util.executable; 2 | 3 | import org.osbot.rs07.event.Event; 4 | 5 | public abstract class BlockingExecutable extends Executable { 6 | 7 | private boolean finished; 8 | private ExecutionFailedException executionFailedException; 9 | 10 | @Override 11 | public final void run() throws InterruptedException { 12 | finished = false; 13 | executionFailedException = null; 14 | onStart(); 15 | execute(new Event() { 16 | @Override 17 | public int execute() throws InterruptedException { 18 | if (finished) { 19 | setFinished(); 20 | } else { 21 | try { 22 | blockingRun(); 23 | } catch (ExecutionFailedException executionFailedException) { 24 | BlockingExecutable.this.executionFailedException = executionFailedException; 25 | setFailed(); 26 | } 27 | } 28 | return 0; 29 | } 30 | }); 31 | onEnd(); 32 | if (executionFailedException != null) { 33 | throw executionFailedException; 34 | } 35 | } 36 | 37 | protected abstract void blockingRun() throws InterruptedException; 38 | 39 | protected void setFinished() { 40 | finished = true; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/util/executable/Executable.java: -------------------------------------------------------------------------------- 1 | package util.executable; 2 | 3 | import util.custom_method_provider.CustomMethodProvider; 4 | 5 | public abstract class Executable extends CustomMethodProvider { 6 | 7 | public void onStart() throws InterruptedException {} 8 | 9 | public abstract void run() throws InterruptedException; 10 | 11 | public void onEnd() throws InterruptedException {} 12 | 13 | public boolean canExit() { 14 | return true; 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/util/executable/ExecutionFailedException.java: -------------------------------------------------------------------------------- 1 | package util.executable; 2 | 3 | public class ExecutionFailedException extends RuntimeException { 4 | public ExecutionFailedException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/util/file_managers/FontManager.java: -------------------------------------------------------------------------------- 1 | package util.file_managers; 2 | 3 | import java.awt.*; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | 7 | public class FontManager extends ResourceManager { 8 | 9 | private static final String FONT_DIR = "fonts/"; 10 | 11 | private static final String[] FONT_FILES = { 12 | "Roboto-Regular.ttf" 13 | }; 14 | public static Font ROBOTO_REGULAR = new Font("Roboto-Regular", Font.PLAIN, 12); 15 | 16 | static { 17 | loadFonts(); 18 | } 19 | 20 | private static void loadFonts() { 21 | for (String font : FONT_FILES) { 22 | String relativeFontPath = FONT_DIR + font; 23 | 24 | if (!loadFont(relativeFontPath)) { 25 | System.out.println("Failed to laod font: " + font); 26 | } 27 | } 28 | } 29 | 30 | private static boolean loadFont(final String relativeFontPath) { 31 | try (InputStream fontInputStream = loadFile(relativeFontPath)) { 32 | 33 | if (fontInputStream == null) { 34 | return false; 35 | } 36 | 37 | GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 38 | ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, fontInputStream)); 39 | return true; 40 | 41 | } catch (IOException | FontFormatException e) { 42 | e.printStackTrace(); 43 | } 44 | 45 | return false; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/util/file_managers/ImageManager.java: -------------------------------------------------------------------------------- 1 | package util.file_managers; 2 | 3 | import javax.imageio.ImageIO; 4 | import java.awt.image.BufferedImage; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | public class ImageManager extends ResourceManager { 11 | 12 | private static ImageManager instance; 13 | 14 | private final Map imageCache = new HashMap<>(); 15 | 16 | private ImageManager() { 17 | } 18 | 19 | synchronized public static ImageManager getInstance() { 20 | if (instance == null) { 21 | instance = new ImageManager(); 22 | } 23 | return instance; 24 | } 25 | 26 | public BufferedImage loadImage(final String relativeImagePath) { 27 | if (imageCache.containsKey(relativeImagePath)) { 28 | return imageCache.get(relativeImagePath); 29 | } 30 | 31 | try (InputStream imageInputStream = loadFile(relativeImagePath)) { 32 | if (imageInputStream == null) { 33 | return null; 34 | } 35 | 36 | BufferedImage image = ImageIO.read(imageInputStream); 37 | 38 | imageCache.put(relativeImagePath, image); 39 | 40 | return image; 41 | } catch (IOException e) { 42 | e.printStackTrace(); 43 | } 44 | return null; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/util/widget/filters/WidgetActionFilter.java: -------------------------------------------------------------------------------- 1 | package util.widget.filters; 2 | 3 | import org.osbot.rs07.api.filter.Filter; 4 | import org.osbot.rs07.api.ui.RS2Widget; 5 | 6 | public final class WidgetActionFilter implements Filter { 7 | 8 | private final String[] actions; 9 | 10 | public WidgetActionFilter(final String... actions) { 11 | this.actions = actions; 12 | } 13 | 14 | @Override 15 | public final boolean match(final RS2Widget rs2Widget) { 16 | if (rs2Widget == null || !rs2Widget.isVisible() || rs2Widget.getInteractActions() == null) { 17 | return false; 18 | } 19 | for (final String widgetAction : rs2Widget.getInteractActions()) { 20 | for (final String matchAction : actions) { 21 | if (matchAction.equals(widgetAction)) { 22 | return true; 23 | } 24 | } 25 | } 26 | return false; 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/util/widget/filters/WidgetDimensionFilter.java: -------------------------------------------------------------------------------- 1 | package util.widget.filters; 2 | 3 | import org.osbot.rs07.api.filter.Filter; 4 | import org.osbot.rs07.api.ui.RS2Widget; 5 | 6 | public class WidgetDimensionFilter implements Filter { 7 | 8 | private final int width, height; 9 | 10 | public WidgetDimensionFilter(final int width, final int height) { 11 | this.width = width; 12 | this.height = height; 13 | } 14 | 15 | @Override 16 | public boolean match(final RS2Widget widget) { 17 | return widget.getWidth() == width && widget.getHeight() == height; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/util/widget/filters/WidgetMessageFilter.java: -------------------------------------------------------------------------------- 1 | package util.widget.filters; 2 | 3 | import org.osbot.rs07.api.filter.Filter; 4 | import org.osbot.rs07.api.ui.RS2Widget; 5 | 6 | import java.util.stream.Stream; 7 | 8 | public class WidgetMessageFilter implements Filter { 9 | 10 | private final String[] messages; 11 | 12 | public WidgetMessageFilter(final String... messages) { 13 | this.messages = messages; 14 | } 15 | 16 | @Override 17 | public boolean match(final RS2Widget widget) { 18 | return Stream.of(messages) 19 | .anyMatch(message -> widget.getMessage().contains(message)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/resources/fonts/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/fonts/Roboto-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/images/agility.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/agility.png -------------------------------------------------------------------------------- /src/main/resources/images/attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/attack.png -------------------------------------------------------------------------------- /src/main/resources/images/breakIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/breakIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/breakIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/breakIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/clipboardIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/clipboardIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/clipboardIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/clipboardIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/closeIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/closeIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/closeIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/closeIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/construction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/construction.png -------------------------------------------------------------------------------- /src/main/resources/images/cooking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/cooking.png -------------------------------------------------------------------------------- /src/main/resources/images/crafting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/crafting.png -------------------------------------------------------------------------------- /src/main/resources/images/cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/cursor.png -------------------------------------------------------------------------------- /src/main/resources/images/defence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/defence.png -------------------------------------------------------------------------------- /src/main/resources/images/farming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/farming.png -------------------------------------------------------------------------------- /src/main/resources/images/firemaking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/firemaking.png -------------------------------------------------------------------------------- /src/main/resources/images/fishing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/fishing.png -------------------------------------------------------------------------------- /src/main/resources/images/fletching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/fletching.png -------------------------------------------------------------------------------- /src/main/resources/images/geIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/geIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/geIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/geIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/herblore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/herblore.png -------------------------------------------------------------------------------- /src/main/resources/images/hitpoints.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/hitpoints.png -------------------------------------------------------------------------------- /src/main/resources/images/hunter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/hunter.png -------------------------------------------------------------------------------- /src/main/resources/images/levelIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/levelIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/levelIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/levelIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/loadIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/loadIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/amulet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/amulet.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/arrows.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/boots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/boots.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/cape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/cape.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/chest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/chest.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/gloves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/gloves.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/helmet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/helmet.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/legs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/legs.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/ring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/ring.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/shield.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/slot_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/slot_background.png -------------------------------------------------------------------------------- /src/main/resources/images/loadout/weapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loadout/weapon.png -------------------------------------------------------------------------------- /src/main/resources/images/loopIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loopIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/loopIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/loopIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/magic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/magic.png -------------------------------------------------------------------------------- /src/main/resources/images/mining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/mining.png -------------------------------------------------------------------------------- /src/main/resources/images/moveDownIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/moveDownIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/moveDownIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/moveDownIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/moveUpIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/moveUpIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/moveUpIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/moveUpIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/prayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/prayer.png -------------------------------------------------------------------------------- /src/main/resources/images/questIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/questIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/questIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/questIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/ranged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/ranged.png -------------------------------------------------------------------------------- /src/main/resources/images/resourceIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/resourceIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/resourceIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/resourceIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/runecrafting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/runecrafting.png -------------------------------------------------------------------------------- /src/main/resources/images/saveIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/saveIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/saveIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/saveIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/slayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/slayer.png -------------------------------------------------------------------------------- /src/main/resources/images/smithing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/smithing.png -------------------------------------------------------------------------------- /src/main/resources/images/startIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/startIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/startIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/startIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/strength.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/strength.png -------------------------------------------------------------------------------- /src/main/resources/images/templates/iconHoverTemplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/templates/iconHoverTemplate.png -------------------------------------------------------------------------------- /src/main/resources/images/templates/iconTemplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/templates/iconTemplate.png -------------------------------------------------------------------------------- /src/main/resources/images/thieving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/thieving.png -------------------------------------------------------------------------------- /src/main/resources/images/timedIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/timedIcon.png -------------------------------------------------------------------------------- /src/main/resources/images/timedIconHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/timedIconHover.png -------------------------------------------------------------------------------- /src/main/resources/images/woodcutting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Explv/Explvs-AIO/0ea5bd98a78099db1017cad3f49c0dcb3bcf3b13/src/main/resources/images/woodcutting.png --------------------------------------------------------------------------------