diff --git a/iherbcleaner/iherbcleaner.gradle.kts b/iherbcleaner/iherbcleaner.gradle.kts new file mode 100644 index 00000000..687ff789 --- /dev/null +++ b/iherbcleaner/iherbcleaner.gradle.kts @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019 Owain van Brakel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +version = "1.0.0" + +project.extra["PluginName"] = "iHerbCleaner" +project.extra["PluginDescription"] = "Illumine - Herb Cleaner" + +dependencies { + //compileOnly(group = "com.openosrs.externals", name = "iutils", version = "1.0.0+") uncomment this is you want to use this in a project that doesn't also hold iUtils + compileOnly(project(":iutils")) + compileOnly(group = "com.owain.externals", name = "chinbreakhandler", version = "0.0.13+") +} + +tasks { + jar { + manifest { + attributes(mapOf( + "Plugin-Version" to project.version, + "Plugin-Id" to nameToId(project.extra["PluginName"] as String), + "Plugin-Provider" to project.extra["PluginProvider"], + "Plugin-Dependencies" to + arrayOf( + nameToId("iUtils"), + "chinbreakhandler-plugin" + ).joinToString(), + "Plugin-Description" to project.extra["PluginDescription"], + "Plugin-License" to project.extra["PluginLicense"] + )) + } + } +} \ No newline at end of file diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/Task.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/Task.java new file mode 100644 index 00000000..316b98dc --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/Task.java @@ -0,0 +1,74 @@ +package net.runelite.client.plugins.iherbcleaner; + +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.MenuEntry; +import net.runelite.api.events.GameTick; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.sleepLength; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.tickLength; +import net.runelite.client.plugins.iutils.CalculationUtils; +import net.runelite.client.plugins.iutils.MenuUtils; +import net.runelite.client.plugins.iutils.MouseUtils; +import net.runelite.client.plugins.iutils.ObjectUtils; +import net.runelite.client.plugins.iutils.PlayerUtils; +import net.runelite.client.plugins.iutils.iUtils; + +@Slf4j +public abstract class Task +{ + public Task() + { + } + + @Inject + public Client client; + + @Inject + public iHerbCleanerConfig config; + + @Inject + public iUtils utils; + + @Inject + public MenuUtils menu; + + @Inject + public MouseUtils mouse; + + @Inject + public CalculationUtils calc; + + @Inject + public PlayerUtils playerUtils; + + @Inject + public ObjectUtils object; + + public MenuEntry entry; + + public abstract boolean validate(); + + public long sleepDelay() + { + sleepLength = calc.randomDelay(config.sleepWeightedDistribution(), config.sleepMin(), config.sleepMax(), config.sleepDeviation(), config.sleepTarget()); + return sleepLength; + } + + public int tickDelay() + { + tickLength = (int) calc.randomDelay(config.tickDelayWeightedDistribution(), config.tickDelayMin(), config.tickDelayMax(), config.tickDelayDeviation(), config.tickDelayTarget()); + return tickLength; + } + + public String getTaskDescription() + { + return this.getClass().getSimpleName(); + } + + public void onGameTick(GameTick event) + { + return; + } + +} diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/TaskSet.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/TaskSet.java new file mode 100644 index 00000000..e2ab0572 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/TaskSet.java @@ -0,0 +1,42 @@ +package net.runelite.client.plugins.iherbcleaner; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class TaskSet +{ + public List taskList = new ArrayList<>(); + + public TaskSet(Task... tasks) + { + taskList.addAll(Arrays.asList(tasks)); + } + + public void addAll(Task... tasks) + { + taskList.addAll(Arrays.asList(tasks)); + } + + public void clear() + { + taskList.clear(); + } + + /** + * Iterates through all the tasks in the set and returns + * the highest priority valid task. + * @return The first valid task from the task list or null if no valid task. + */ + public Task getValidTask() + { + for (Task task : this.taskList) + { + if (task.validate()) + { + return task; + } + } + return null; + } +} diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerConfig.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerConfig.java new file mode 100644 index 00000000..e9f3ac11 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerConfig.java @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * Copyright (c) 2018, oplosthee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.iherbcleaner; + +import net.runelite.client.config.Button; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.ConfigSection; +import net.runelite.client.config.ConfigTitleSection; +import net.runelite.client.config.Range; +import net.runelite.client.config.Title; + +@ConfigGroup("iHerbCleaner") +public interface iHerbCleanerConfig extends Config +{ + + @ConfigSection( + keyName = "delayConfig", + name = "Sleep Delay Configuration", + description = "Configure how the bot handles sleep delays", + position = 0 + ) + default boolean delayConfig() + { + return false; + } + + @Range( + min = 0, + max = 550 + ) + @ConfigItem( + keyName = "sleepMin", + name = "Sleep Min", + description = "", + position = 1, + section = "delayConfig" + ) + default int sleepMin() + { + return 60; + } + + @Range( + min = 0, + max = 550 + ) + @ConfigItem( + keyName = "sleepMax", + name = "Sleep Max", + description = "", + position = 2, + section = "delayConfig" + ) + default int sleepMax() + { + return 350; + } + + @Range( + min = 0, + max = 550 + ) + @ConfigItem( + keyName = "sleepTarget", + name = "Sleep Target", + description = "", + position = 3, + section = "delayConfig" + ) + default int sleepTarget() + { + return 100; + } + + @Range( + min = 0, + max = 550 + ) + @ConfigItem( + keyName = "sleepDeviation", + name = "Sleep Deviation", + description = "", + position = 4, + section = "delayConfig" + ) + default int sleepDeviation() + { + return 10; + } + + @ConfigItem( + keyName = "sleepWeightedDistribution", + name = "Sleep Weighted Distribution", + description = "Shifts the random distribution towards the lower end at the target, otherwise it will be an even distribution", + position = 5, + section = "delayConfig" + ) + default boolean sleepWeightedDistribution() + { + return false; + } + + @ConfigSection( + keyName = "delayTickConfig", + name = "Game Tick Configuration", + description = "Configure how the bot handles game tick delays, 1 game tick equates to roughly 600ms", + position = 10 + ) + default boolean delayTickConfig() + { + return false; + } + + @Range( + min = 0, + max = 10 + ) + @ConfigItem( + keyName = "tickDelayMin", + name = "Game Tick Min", + description = "", + position = 11, + section = "delayTickConfig" + ) + default int tickDelayMin() + { + return 1; + } + + @Range( + min = 0, + max = 10 + ) + @ConfigItem( + keyName = "tickDelayMax", + name = "Game Tick Max", + description = "", + position = 12, + section = "delayTickConfig" + ) + default int tickDelayMax() + { + return 3; + } + + @Range( + min = 0, + max = 10 + ) + @ConfigItem( + keyName = "tickDelayTarget", + name = "Game Tick Target", + description = "", + position = 13, + section = "delayTickConfig" + ) + default int tickDelayTarget() + { + return 2; + } + + @Range( + min = 0, + max = 10 + ) + @ConfigItem( + keyName = "tickDelayDeviation", + name = "Game Tick Deviation", + description = "", + position = 14, + section = "delayTickConfig" + ) + default int tickDelayDeviation() + { + return 1; + } + + @ConfigItem( + keyName = "tickDelayWeightedDistribution", + name = "Game Tick Weighted Distribution", + description = "Shifts the random distribution towards the lower end at the target, otherwise it will be an even distribution", + position = 15, + section = "delayTickConfig" + ) + default boolean tickDelayWeightedDistribution() + { + return false; + } + + @ConfigTitleSection( + keyName = "instructionsTitle", + name = "Instructions", + description = "", + position = 16 + ) + default Title instructionsTitle() + { + return new Title(); + } + + @ConfigItem( + keyName = "instructions", + name = "", + description = "Instructions. Don't enter anything into this field", + position = 17, + titleSection = "instructionsTitle" + ) + default String instructions() + { + return "Have herbs in bank, setup IDs in config and press Start. Sleep Delays determine length of time between cleaning."; + } + + @ConfigItem( + keyName = "herbID", + name = "Herb ID", + description = "Item ID of the Herb you want to clean", + position = 20 + ) + default int herbID() + { + return 199; + } + + @ConfigItem( + keyName = "bankID", + name = "Bank Booth ID", + description = "Game Object ID of the Bank Booth you want to use", + position = 25 + ) + default int bankID() + { + return 10583; + } + + + @ConfigItem( + keyName = "enableUI", + name = "Enable UI", + description = "Enable to turn on in game UI", + position = 95 + ) + default boolean enableUI() + { + return true; + } + + @ConfigItem( + keyName = "startButton", + name = "Start/Stop", + description = "Test button that changes variable value", + position = 100 + ) + default Button startButton() + { + return new Button(); + } +} diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerOverlay.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerOverlay.java new file mode 100644 index 00000000..24b31879 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerOverlay.java @@ -0,0 +1,93 @@ +package net.runelite.client.plugins.iherbcleaner; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.time.Duration; +import java.time.Instant; +import javax.inject.Inject; +import javax.inject.Singleton; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import static net.runelite.api.MenuOpcode.RUNELITE_OVERLAY_CONFIG; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPanel; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; +import static org.apache.commons.lang3.time.DurationFormatUtils.formatDuration; + +@Slf4j +@Singleton +class iHerbCleanerOverlay extends OverlayPanel +{ + private final Client client; + private final iHerbCleanerPlugin plugin; + private final iHerbCleanerConfig config; + + String timeFormat; + private String infoStatus = "Starting..."; + + @Inject + private iHerbCleanerOverlay(final Client client, final iHerbCleanerPlugin plugin, final iHerbCleanerConfig config) + { + super(plugin); + setPosition(OverlayPosition.BOTTOM_LEFT); + this.client = client; + this.plugin = plugin; + this.config = config; + getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Herb Cleaner overlay")); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (plugin.botTimer == null || !config.enableUI()) + { + return null; + } + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + Duration duration = Duration.between(plugin.botTimer, Instant.now()); + timeFormat = (duration.toHours() < 1) ? "mm:ss" : "HH:mm:ss"; + tableComponent.addRow("Time running:", formatDuration(duration.toMillis(),timeFormat)); + + tableComponent.addRow("Status:", plugin.status); + + TableComponent tableStatsComponent = new TableComponent(); + tableStatsComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + TableComponent tableDelayComponent = new TableComponent(); + tableDelayComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + tableDelayComponent.addRow("Sleep delay:", iHerbCleanerPlugin.sleepLength + "ms"); + tableDelayComponent.addRow("Tick delay:", String.valueOf(plugin.timeout)); + + if (!tableComponent.isEmpty()) + { + panelComponent.setBackgroundColor(ColorUtil.fromHex("#121212")); //Material Dark default + panelComponent.setPreferredSize(new Dimension(270,200)); + panelComponent.setBorder(new Rectangle(5,5,5,5)); + panelComponent.getChildren().add(TitleComponent.builder() + .text("Illumine Herb Cleaner") + .color(ColorUtil.fromHex("#40C4FF")) + .build()); + panelComponent.getChildren().add(tableComponent); + panelComponent.getChildren().add(TitleComponent.builder() + .text("Stats") + .color(ColorUtil.fromHex("#FFA000")) + .build()); + panelComponent.getChildren().add(tableStatsComponent); + panelComponent.getChildren().add(TitleComponent.builder() + .text("Delays") + .color(ColorUtil.fromHex("#F8BBD0")) + .build()); + panelComponent.getChildren().add(tableDelayComponent); + } + return super.render(graphics); + } +} diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerPlugin.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerPlugin.java new file mode 100644 index 00000000..087e1585 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/iHerbCleanerPlugin.java @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * Copyright (c) 2018, oplosthee + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.iherbcleaner; + +import com.google.inject.Injector; +import com.google.inject.Provides; +import com.owain.chinbreakhandler.ChinBreakHandler; +import java.time.Duration; +import java.time.Instant; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.MenuEntry; +import net.runelite.api.Player; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.events.ConfigButtonClicked; +import net.runelite.api.events.GameTick; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDependency; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import net.runelite.client.plugins.iherbcleaner.tasks.BankItemsTask; +import net.runelite.client.plugins.iherbcleaner.tasks.CleanHerbTask; +import net.runelite.client.plugins.iherbcleaner.tasks.MovingTask; +import net.runelite.client.plugins.iherbcleaner.tasks.OpenBankTask; +import net.runelite.client.plugins.iherbcleaner.tasks.TimeoutTask; +import net.runelite.client.plugins.iutils.iUtils; +import net.runelite.client.ui.overlay.OverlayManager; +import org.pf4j.Extension; + + +@Extension +@PluginDependency(iUtils.class) +@PluginDescriptor( + name = "iHerbCleaner", + enabledByDefault = false, + description = "Illumine - Herb Cleaner plugin", + tags = {"illumine", "task", "herblore", "clean", "bot"}, + type = PluginType.MISCELLANEOUS +) +@Slf4j +public class iHerbCleanerPlugin extends Plugin +{ + @Inject + private Injector injector; + + @Inject + private Client client; + + @Inject + private iHerbCleanerConfig config; + + @Inject + private OverlayManager overlayManager; + + @Inject + private iHerbCleanerOverlay overlay; + + @Inject + private iUtils utils; + + @Inject + public ChinBreakHandler chinBreakHandler; + + @Inject + private ConfigManager configManager; + + private TaskSet tasks = new TaskSet(); + public static LocalPoint beforeLoc = new LocalPoint(0, 0); + + MenuEntry targetMenu; + Instant botTimer; + Player player; + + public static boolean startBot; + public static long sleepLength; + public static int tickLength; + public static int timeout; + public static String status = "starting..."; + + @Provides + iHerbCleanerConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(iHerbCleanerConfig.class); + } + + @Override + protected void startUp() + { + chinBreakHandler.registerPlugin(this); + } + + @Override + protected void shutDown() + { + resetVals(); + chinBreakHandler.unregisterPlugin(this); + } + + + private void loadTasks() + { + tasks.clear(); + tasks.addAll( + injector.getInstance(TimeoutTask.class), + injector.getInstance(MovingTask.class), + injector.getInstance(CleanHerbTask.class), + injector.getInstance(BankItemsTask.class), + injector.getInstance(OpenBankTask.class) + ); + } + + public void resetVals() + { + log.debug("stopping iHerb Cleaner plugin"); + overlayManager.remove(overlay); + chinBreakHandler.stopPlugin(this); + startBot = false; + botTimer = null; + tasks.clear(); + } + + @Subscribe + private void onConfigButtonPressed(ConfigButtonClicked configButtonClicked) + { + if (!configButtonClicked.getGroup().equalsIgnoreCase("iHerbCleaner")) + { + return; + } + log.debug("button {} pressed!", configButtonClicked.getKey()); + if (configButtonClicked.getKey().equals("startButton")) + { + if (!startBot) + { + Player player = client.getLocalPlayer(); + if (client != null && player != null && client.getGameState() == GameState.LOGGED_IN) + { + log.info("starting Herb Cleaner plugin"); + loadTasks(); + startBot = true; + chinBreakHandler.startPlugin(this); + timeout = 0; + targetMenu = null; + botTimer = Instant.now(); + overlayManager.add(overlay); + beforeLoc = client.getLocalPlayer().getLocalLocation(); + } + else + { + log.info("Start logged in"); + } + } + else + { + resetVals(); + } + } + } + + public void updateStats() + { + //templatePH = (int) getPerHour(totalBraceletCount); + //coinsPH = (int) getPerHour(totalCoins - ((totalCoins / BRACELET_HA_VAL) * (unchargedBraceletCost + revEtherCost + natureRuneCost))); + } + + public long getPerHour(int quantity) + { + Duration timeSinceStart = Duration.between(botTimer, Instant.now()); + if (!timeSinceStart.isZero()) + { + return (int) ((double) quantity * (double) Duration.ofHours(1).toMillis() / (double) timeSinceStart.toMillis()); + } + return 0; + } + + @Subscribe + private void onGameTick(GameTick event) + { + if (!startBot || chinBreakHandler.isBreakActive(this)) + { + return; + } + player = client.getLocalPlayer(); + if (client != null && player != null && client.getGameState() == GameState.LOGGED_IN) + { + if (chinBreakHandler.shouldBreak(this)) + { + status = "Taking a break"; + chinBreakHandler.startBreak(this); + timeout = 5; + } + if (timeout > 0) + { + timeout--; + return; + } + Task task = tasks.getValidTask(); + + if (task != null) + { + status = task.getTaskDescription(); + task.onGameTick(event); + } + else + { + status = "Task not found"; + log.debug(status); + } + beforeLoc = player.getLocalLocation(); + } + } +} \ No newline at end of file diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/BankItemsTask.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/BankItemsTask.java new file mode 100644 index 00000000..a9bcb8f0 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/BankItemsTask.java @@ -0,0 +1,69 @@ +package net.runelite.client.plugins.iherbcleaner.tasks; + +import java.awt.Rectangle; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.GameObject; +import net.runelite.api.MenuEntry; +import net.runelite.api.MenuOpcode; +import net.runelite.api.events.GameTick; +import net.runelite.client.plugins.iherbcleaner.Task; +import net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.startBot; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.status; +import net.runelite.client.plugins.iutils.ActionQueue; +import net.runelite.client.plugins.iutils.BankUtils; +import net.runelite.client.plugins.iutils.InventoryUtils; + +@Slf4j +public class BankItemsTask extends Task +{ + + @Inject + ActionQueue action; + + @Inject + InventoryUtils inventory; + + @Inject + BankUtils bank; + + @Override + public boolean validate() + { + return action.delayedActions.isEmpty() && !inventory.containsItem(config.herbID()) && + bank.isOpen(); + } + + @Override + public String getTaskDescription() + { + return iHerbCleanerPlugin.status; + } + + @Override + public void onGameTick(GameTick event) + { + int sleep = 0; + if (!inventory.isEmpty()) + { + status = "Depositing items"; + bank.depositAll(); + } + else + { + status = "Withdrawing items"; + if (bank.contains(config.herbID(), 1)) + { + bank.withdrawAllItem(config.herbID()); + } + else + { + status = "Out of herbs to clean, stopping"; + utils.sendGameMessage(status); + startBot = false; + } + } + log.info(status); + } +} \ No newline at end of file diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/CleanHerbTask.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/CleanHerbTask.java new file mode 100644 index 00000000..07b4e91d --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/CleanHerbTask.java @@ -0,0 +1,60 @@ +package net.runelite.client.plugins.iherbcleaner.tasks; + +import java.awt.Rectangle; +import java.util.List; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.MenuEntry; +import net.runelite.api.MenuOpcode; +import net.runelite.api.Player; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.plugins.iherbcleaner.Task; +import net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.timeout; +import net.runelite.client.plugins.iutils.ActionQueue; +import net.runelite.client.plugins.iutils.InventoryUtils; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.status; + +@Slf4j +public class CleanHerbTask extends Task +{ + + @Inject + ActionQueue action; + + @Inject + InventoryUtils inventory; + + @Override + public boolean validate() + { + return action.delayedActions.isEmpty() && inventory.containsItem(config.herbID()); + } + + @Override + public String getTaskDescription() + { + return iHerbCleanerPlugin.status; + } + + @Override + public void onGameTick(GameTick event) + { + status = "Starting herb cleaning"; + List herbs = inventory.getItems(List.of(config.herbID())); + int sleep = 0; + for (WidgetItem herb : herbs) + { + log.info("Adding herb: {}, delay time: {}", herb.getIndex(), sleep); + entry = new MenuEntry("", "", herb.getId(), MenuOpcode.ITEM_FIRST_OPTION.getId(), + herb.getIndex(), WidgetInfo.INVENTORY.getId(), true); + sleep += (int) sleepDelay(); + herb.getCanvasBounds().getBounds(); + Rectangle rectangle = herb.getCanvasBounds().getBounds(); + utils.doActionMsTime(entry, rectangle, sleep); + } + log.info(status); + } +} \ No newline at end of file diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/MovingTask.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/MovingTask.java new file mode 100644 index 00000000..bc09b3a6 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/MovingTask.java @@ -0,0 +1,37 @@ +package net.runelite.client.plugins.iherbcleaner.tasks; + +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Player; +import net.runelite.api.events.GameTick; +import net.runelite.client.plugins.iherbcleaner.Task; +import net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.beforeLoc; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.timeout; + +@Slf4j +public class MovingTask extends Task +{ + + @Override + public boolean validate() + { + return playerUtils.isMoving(beforeLoc); + } + + @Override + public String getTaskDescription() + { + return iHerbCleanerPlugin.status; + } + + @Override + public void onGameTick(GameTick event) + { + Player player = client.getLocalPlayer(); + if (player != null) + { + playerUtils.handleRun(20, 30); + timeout = tickDelay(); + } + } +} \ No newline at end of file diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/OpenBankTask.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/OpenBankTask.java new file mode 100644 index 00000000..c0451ba1 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/OpenBankTask.java @@ -0,0 +1,65 @@ +package net.runelite.client.plugins.iherbcleaner.tasks; + +import java.awt.Rectangle; +import java.util.List; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.GameObject; +import net.runelite.api.MenuEntry; +import net.runelite.api.MenuOpcode; +import net.runelite.api.events.GameTick; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.plugins.iherbcleaner.Task; +import net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.status; +import net.runelite.client.plugins.iutils.ActionQueue; +import net.runelite.client.plugins.iutils.BankUtils; +import net.runelite.client.plugins.iutils.InventoryUtils; + +@Slf4j +public class OpenBankTask extends Task +{ + + @Inject + ActionQueue action; + + @Inject + InventoryUtils inventory; + + @Inject + BankUtils bank; + + @Override + public boolean validate() + { + return action.delayedActions.isEmpty() && !inventory.containsItem(config.herbID()) && + !bank.isOpen(); + } + + @Override + public String getTaskDescription() + { + return iHerbCleanerPlugin.status; + } + + @Override + public void onGameTick(GameTick event) + { + GameObject bank = object.findNearestGameObject(config.bankID()); + if (bank != null) + { + status = "Opening bank"; + entry = new MenuEntry("", "", bank.getId(), MenuOpcode.GAME_OBJECT_SECOND_OPTION.getId(), + bank.getSceneMinLocation().getX(), bank.getSceneMinLocation().getY(), false); + Rectangle rectangle = (bank.getConvexHull() != null) ? bank.getConvexHull().getBounds() : + new Rectangle(client.getCenterX() - 50, client.getCenterY() - 50, 100, 100);; + utils.doActionMsTime(entry, rectangle, (int) sleepDelay()); + } + else + { + status = "Bank not found"; + } + log.info(status); + } +} \ No newline at end of file diff --git a/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/TimeoutTask.java b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/TimeoutTask.java new file mode 100644 index 00000000..71890764 --- /dev/null +++ b/iherbcleaner/src/main/java/net/runelite/client/plugins/iherbcleaner/tasks/TimeoutTask.java @@ -0,0 +1,23 @@ +package net.runelite.client.plugins.iherbcleaner.tasks; + +import net.runelite.api.events.GameTick; +import net.runelite.client.plugins.iherbcleaner.Task; +import static net.runelite.client.plugins.iherbcleaner.iHerbCleanerPlugin.timeout; + +public class TimeoutTask extends Task +{ + @Override + public boolean validate() { return timeout > 0; } + + @Override + public String getTaskDescription() + { + return "Timeout: " + timeout; + } + + @Override + public void onGameTick(GameTick event) + { + timeout--; + } +} \ No newline at end of file diff --git a/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/Task.java b/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/Task.java index e89ca242..4dfe40ce 100644 --- a/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/Task.java +++ b/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/Task.java @@ -5,8 +5,6 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.MenuEntry; import net.runelite.api.events.GameTick; -import static net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin.sleepLength; -import static net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin.tickLength; import net.runelite.client.plugins.iutils.CalculationUtils; import net.runelite.client.plugins.iutils.MenuUtils; import net.runelite.client.plugins.iutils.MouseUtils; @@ -51,14 +49,14 @@ public abstract class Task public long sleepDelay() { - sleepLength = calc.randomDelay(config.sleepWeightedDistribution(), config.sleepMin(), config.sleepMax(), config.sleepDeviation(), config.sleepTarget()); - return sleepLength; + iTaskTemplatePlugin.sleepLength = calc.randomDelay(config.sleepWeightedDistribution(), config.sleepMin(), config.sleepMax(), config.sleepDeviation(), config.sleepTarget()); + return iTaskTemplatePlugin.sleepLength; } public int tickDelay() { - tickLength = (int) calc.randomDelay(config.tickDelayWeightedDistribution(), config.tickDelayMin(), config.tickDelayMax(), config.tickDelayDeviation(), config.tickDelayTarget()); - return tickLength; + iTaskTemplatePlugin.tickLength = (int) calc.randomDelay(config.tickDelayWeightedDistribution(), config.tickDelayMin(), config.tickDelayMax(), config.tickDelayDeviation(), config.tickDelayTarget()); + return iTaskTemplatePlugin.tickLength; } public String getTaskDescription() diff --git a/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/MovingTask.java b/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/MovingTask.java index 974cfc5f..acf642b6 100644 --- a/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/MovingTask.java +++ b/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/MovingTask.java @@ -5,8 +5,6 @@ import net.runelite.api.Player; import net.runelite.api.events.GameTick; import net.runelite.client.plugins.itasktemplate.Task; import net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin; -import static net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin.beforeLoc; -import static net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin.timeout; @Slf4j public class MovingTask extends Task @@ -15,7 +13,7 @@ public class MovingTask extends Task @Override public boolean validate() { - return playerUtils.isMoving(beforeLoc); + return playerUtils.isMoving(iTaskTemplatePlugin.beforeLoc); } @Override @@ -31,7 +29,7 @@ public class MovingTask extends Task if (player != null) { playerUtils.handleRun(20, 30); - timeout = tickDelay(); + iTaskTemplatePlugin.timeout = tickDelay(); } } } \ No newline at end of file diff --git a/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/TimeoutTask.java b/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/TimeoutTask.java index 74484bb8..b8bf61df 100644 --- a/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/TimeoutTask.java +++ b/itasktemplate/src/main/java/net/runelite/client/plugins/itasktemplate/tasks/TimeoutTask.java @@ -2,22 +2,22 @@ package net.runelite.client.plugins.itasktemplate.tasks; import net.runelite.api.events.GameTick; import net.runelite.client.plugins.itasktemplate.Task; -import static net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin.timeout; +import net.runelite.client.plugins.itasktemplate.iTaskTemplatePlugin; public class TimeoutTask extends Task { @Override - public boolean validate() { return timeout > 0; } + public boolean validate() { return iTaskTemplatePlugin.timeout > 0; } @Override public String getTaskDescription() { - return "Timeout: " + timeout; + return "Timeout: " + iTaskTemplatePlugin.timeout; } @Override public void onGameTick(GameTick event) { - timeout--; + iTaskTemplatePlugin.timeout--; } } \ No newline at end of file diff --git a/plugins.json b/plugins.json index f5e22a92..4535eb31 100644 --- a/plugins.json +++ b/plugins.json @@ -1 +1 @@ -[{"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"BotUtils","description":"Illumine - Utils required for plugins to function with added automation","id":"botutils-plugin","releases":[{"date":"2020-11-13","sha512sum":"E6E86ECC9B7E7F45A97E7BF97A57F733247D5EDF280E14C83B685EEB517F64C421E069210E76E3672547B18F80EE148D973240627EB41D8FBA11C2A8EB359355","version":"4.9.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/botutils-4.9.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iBlackjack","description":"Illumine - Blackjack plugin","id":"iblackjack-plugin","releases":[{"date":"2020-11-13","sha512sum":"4720D7B7B28CAE15386B1B1640C4C2EA46F54FE22128698CC23DDE69CBABD954A37A09451D9B9E8E740FF62C65F89C1EE3E834156CA500D3F4CF7C227E0CE83D","version":"1.2.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iblackjack-1.2.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iCombination Runecrafter Plugin","description":"Illumine - Combination Runecrafting plugin","id":"icombinationrunecrafterplugin-plugin","releases":[{"date":"2020-11-13","sha512sum":"5CF8190D3AB08D63ED8E5BA87D183A580270C31353F07BC80FF4576F3F742F66CFC2E97066370ADA2D7B5B61C67F00CB7C123C0B362E6581F7B4F831EDA147DE","version":"2.0.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/icombinationrunecrafter-2.0.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iMagic Caster","description":"Illumine automated magic caster","id":"imagiccaster-plugin","releases":[{"date":"2020-11-13","sha512sum":"1B65C27E79CAC1BFFA33782477DC1FA5265BF482254FDA8F85DD82423C7F9429ABB3B1BC16380F778D7D67BC874F13D148EDA17EF9EB1E0407D5EB37E5E31E7F","version":"3.2.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/imagiccaster-3.2.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iMenu Debugger Plugin","description":"Illumine - Menu Debugger plugin","id":"imenudebuggerplugin-plugin","releases":[{"date":"2020-11-13","sha512sum":"0491580D6FD8D5DA35F2F6F8723D84365D46F5446F533EE3B0053AEF9318F4E842F78886E6567F0F1E0CB0034C9D7D3CD438943615DBFA1E5495A6D58E04789E","version":"1.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/imenudebugger-1.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iPowerfighter Plugin","description":"Illumine - Powerfighter plugin","id":"ipowerfighterplugin-plugin","releases":[{"date":"2020-11-13","sha512sum":"007012DC00FA99B176F16BD744A138C2698095A382962BB7C35B13516E3F809323C85A45A3B87EDD26C482A415ADC39D268F83F912161408BA1EE4B2CD5FCB2A","version":"3.4.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/ipowerfighter-3.4.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iPower Skiller","description":"Illumine auto power skiller plugin","id":"ipowerskiller-plugin","releases":[{"date":"2020-11-13","sha512sum":"65B6112296D33786A454651A97768F7F157595D302C71E5A290866EC72CE5B8C181EDF90F59348F430C11EDE3825A0A883C91D2A1BAE4CBE247F11C49DA430B0","version":"5.0.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/ipowerskiller-5.0.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iQuick Eater","description":"Illumine - auto eat food, consume potions and equip items","id":"iquickeater-plugin","releases":[{"date":"2020-11-13","sha512sum":"373B237576D56EAF30CA9430628A20AE71A86C6A744445D35FE167FF518D9865CE6CD4B9A23555CDAEE00A5B7427E1E78A1273874306E54A0053E2AB593E5841","version":"4.3.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iquickeater-4.3.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iRandom Handler","description":"illumine - Dismiss random events and handle genie","id":"irandomhandler-plugin","releases":[{"date":"2020-11-13","sha512sum":"12B35C7A9DF568EE8B8C3437264B90770EAEFC351BDE29DBC16653E71280E30663863D7027216F0118563267AA24DF4D7ED2FE54375491B1DED0A70F2FC557E9","version":"2.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/irandomhandler-2.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iRooftop Agility","description":"Illumine automated rooftop agility plugin","id":"irooftopagility-plugin","releases":[{"date":"2020-11-13","sha512sum":"0377CC9C8D2472971C538728A49B2529C751B82C2A8A73E2C3BA086A1EA7FB876E1EC63CC621B55BF8800678C3BEDD7FD42120A4EDB7D711BA21F32D3DD1CB2D","version":"5.0.4","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/irooftopagility-5.0.4.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iTaskTemplate","description":"Illumine - Task Template plugin","id":"itasktemplate-plugin","releases":[{"date":"2020-11-13","sha512sum":"29C88613DAC55A2DB28E9FF4856BDCAD41074053285ACE55C9BB5F75AF45773EC90EB27B4879A52AA4F82E2D4CB2D116E37A9816E31AE12BE35620DB5B959CE6","version":"1.0.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/itasktemplate-1.0.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iUtils","description":"Illumine - Utils required for plugins to function with added automation","id":"iutils-plugin","releases":[{"date":"2020-11-13","sha512sum":"D380B70C762A3F11983A3898C3950026017C711C5687D4596D46486C00F642868573817EE86097002530C2E5D2C8C2428114FB755F81CBFD5073C3229C39AD26","version":"2.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iutils-2.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iWorld Walker Plugin","description":"Illumine - World Walker plugin","id":"iworldwalkerplugin-plugin","releases":[{"date":"2020-11-13","sha512sum":"3AA5155AD5C2F54340D3ECE2ADA43C4D8C9585E1DDBEF31A8682A4469E28EF4E69F8F78D6AEA4FF8FFC24D04212BC532232C9EEA8636BDCEEA004B1AC3E31A2E","version":"2.3.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iworldwalker-2.3.0.jar?raw=true","requires":"0.0.1"}]}] +[{"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"BotUtils","description":"Illumine - Utils required for plugins to function with added automation","id":"botutils-plugin","releases":[{"date":"2020-11-14","sha512sum":"E6E86ECC9B7E7F45A97E7BF97A57F733247D5EDF280E14C83B685EEB517F64C421E069210E76E3672547B18F80EE148D973240627EB41D8FBA11C2A8EB359355","version":"4.9.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/botutils-4.9.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iBlackjack","description":"Illumine - Blackjack plugin","id":"iblackjack-plugin","releases":[{"date":"2020-11-14","sha512sum":"4720D7B7B28CAE15386B1B1640C4C2EA46F54FE22128698CC23DDE69CBABD954A37A09451D9B9E8E740FF62C65F89C1EE3E834156CA500D3F4CF7C227E0CE83D","version":"1.2.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iblackjack-1.2.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iCombination Runecrafter Plugin","description":"Illumine - Combination Runecrafting plugin","id":"icombinationrunecrafterplugin-plugin","releases":[{"date":"2020-11-14","sha512sum":"5CF8190D3AB08D63ED8E5BA87D183A580270C31353F07BC80FF4576F3F742F66CFC2E97066370ADA2D7B5B61C67F00CB7C123C0B362E6581F7B4F831EDA147DE","version":"2.0.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/icombinationrunecrafter-2.0.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iHerbCleaner","description":"Illumine - Herb Cleaner","id":"iherbcleaner-plugin","releases":[{"date":"2020-11-14","sha512sum":"D35F9971933A6F54AEB6F968C384655452037DA52FE93170AD317C620EEC94F76EBA33AF02A1DA0AC5BBE71B5B73841255C783CBFDBECF5CB7B89FDE4C0AC625","version":"1.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iherbcleaner-1.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iMagic Caster","description":"Illumine automated magic caster","id":"imagiccaster-plugin","releases":[{"date":"2020-11-14","sha512sum":"1B65C27E79CAC1BFFA33782477DC1FA5265BF482254FDA8F85DD82423C7F9429ABB3B1BC16380F778D7D67BC874F13D148EDA17EF9EB1E0407D5EB37E5E31E7F","version":"3.2.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/imagiccaster-3.2.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iMenu Debugger Plugin","description":"Illumine - Menu Debugger plugin","id":"imenudebuggerplugin-plugin","releases":[{"date":"2020-11-14","sha512sum":"0491580D6FD8D5DA35F2F6F8723D84365D46F5446F533EE3B0053AEF9318F4E842F78886E6567F0F1E0CB0034C9D7D3CD438943615DBFA1E5495A6D58E04789E","version":"1.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/imenudebugger-1.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iPowerfighter Plugin","description":"Illumine - Powerfighter plugin","id":"ipowerfighterplugin-plugin","releases":[{"date":"2020-11-14","sha512sum":"007012DC00FA99B176F16BD744A138C2698095A382962BB7C35B13516E3F809323C85A45A3B87EDD26C482A415ADC39D268F83F912161408BA1EE4B2CD5FCB2A","version":"3.4.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/ipowerfighter-3.4.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iPower Skiller","description":"Illumine auto power skiller plugin","id":"ipowerskiller-plugin","releases":[{"date":"2020-11-14","sha512sum":"65B6112296D33786A454651A97768F7F157595D302C71E5A290866EC72CE5B8C181EDF90F59348F430C11EDE3825A0A883C91D2A1BAE4CBE247F11C49DA430B0","version":"5.0.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/ipowerskiller-5.0.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iQuick Eater","description":"Illumine - auto eat food, consume potions and equip items","id":"iquickeater-plugin","releases":[{"date":"2020-11-14","sha512sum":"373B237576D56EAF30CA9430628A20AE71A86C6A744445D35FE167FF518D9865CE6CD4B9A23555CDAEE00A5B7427E1E78A1273874306E54A0053E2AB593E5841","version":"4.3.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iquickeater-4.3.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iRandom Handler","description":"illumine - Dismiss random events and handle genie","id":"irandomhandler-plugin","releases":[{"date":"2020-11-14","sha512sum":"12B35C7A9DF568EE8B8C3437264B90770EAEFC351BDE29DBC16653E71280E30663863D7027216F0118563267AA24DF4D7ED2FE54375491B1DED0A70F2FC557E9","version":"2.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/irandomhandler-2.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iRooftop Agility","description":"Illumine automated rooftop agility plugin","id":"irooftopagility-plugin","releases":[{"date":"2020-11-14","sha512sum":"0377CC9C8D2472971C538728A49B2529C751B82C2A8A73E2C3BA086A1EA7FB876E1EC63CC621B55BF8800678C3BEDD7FD42120A4EDB7D711BA21F32D3DD1CB2D","version":"5.0.4","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/irooftopagility-5.0.4.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iTaskTemplate","description":"Illumine - Task Template plugin","id":"itasktemplate-plugin","releases":[{"date":"2020-11-14","sha512sum":"24DB8CBE0552AC1FFA50A667FBB75D518AA696D97D9D745F164C4614A0FFAEEFE49C806BCEBC5F21B3FA9171703EBB683B9EF474112A7C0FAAD70169A3DA9FA2","version":"1.0.1","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/itasktemplate-1.0.1.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iUtils","description":"Illumine - Utils required for plugins to function with added automation","id":"iutils-plugin","releases":[{"date":"2020-11-14","sha512sum":"D380B70C762A3F11983A3898C3950026017C711C5687D4596D46486C00F642868573817EE86097002530C2E5D2C8C2428114FB755F81CBFD5073C3229C39AD26","version":"2.0.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iutils-2.0.0.jar?raw=true","requires":"0.0.1"}]}, {"projectUrl":"https://discord.gg/9fGzEDR","provider":"illumine","name":"iWorld Walker Plugin","description":"Illumine - World Walker plugin","id":"iworldwalkerplugin-plugin","releases":[{"date":"2020-11-14","sha512sum":"3AA5155AD5C2F54340D3ECE2ADA43C4D8C9585E1DDBEF31A8682A4469E28EF4E69F8F78D6AEA4FF8FFC24D04212BC532232C9EEA8636BDCEEA004B1AC3E31A2E","version":"2.3.0","url":"https://github.com/illumineawake/illu-plugins/blob/master/release/iworldwalker-2.3.0.jar?raw=true","requires":"0.0.1"}]}] diff --git a/release/iherbcleaner-1.0.0.jar b/release/iherbcleaner-1.0.0.jar new file mode 100644 index 00000000..3f3bf9a8 Binary files /dev/null and b/release/iherbcleaner-1.0.0.jar differ diff --git a/release/itasktemplate-1.0.1.jar b/release/itasktemplate-1.0.1.jar index c3028188..ef8f0ad6 100644 Binary files a/release/itasktemplate-1.0.1.jar and b/release/itasktemplate-1.0.1.jar differ diff --git a/settings.gradle.kts b/settings.gradle.kts index 6cfd2975..9714bf83 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -29,6 +29,7 @@ include(":botutils") include(":iutils") include("iblackjack") include(":icombinationrunecrafter") +include("iherbcleaner") include(":imagiccaster") include(":imenudebugger") include(":ipowerfighter")