diff --git a/autoalcher/autoalcher.gradle.kts b/autoalcher/autoalcher.gradle.kts new file mode 100644 index 0000000..aca6edf --- /dev/null +++ b/autoalcher/autoalcher.gradle.kts @@ -0,0 +1,52 @@ +/* + * 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"] = "Chaos Auto Alcher" // This is the name that is used in the external plugin manager panel +project.extra["PluginDescription"] = "Gold! Always believe in your soul." // This is the description that is used in the external plugin manager panel + +dependencies { + compileOnly(project(":util")) +} + +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-Description" to project.extra["PluginDescription"], + "Plugin-Dependencies" to + arrayOf( + nameToId("Chaos Util"), + nameToId("iUtils") + ).joinToString(), + "Plugin-License" to project.extra["PluginLicense"] + )) + } + } +} \ No newline at end of file diff --git a/autoalcher/src/main/java/io/reisub/openosrs/autoalcher/Autoalcher.java b/autoalcher/src/main/java/io/reisub/openosrs/autoalcher/Autoalcher.java new file mode 100644 index 0000000..2947fac --- /dev/null +++ b/autoalcher/src/main/java/io/reisub/openosrs/autoalcher/Autoalcher.java @@ -0,0 +1,178 @@ +package io.reisub.openosrs.autoalcher; + +import com.google.inject.Provides; +import io.reisub.openosrs.util.Calculations; +import io.reisub.openosrs.util.Util; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ItemID; +import net.runelite.api.Varbits; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; +import net.runelite.client.game.RunepouchRune; +import net.runelite.client.input.KeyListener; +import net.runelite.client.input.KeyManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDependency; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.iutils.api.Spells; +import net.runelite.client.plugins.iutils.game.Game; +import net.runelite.client.plugins.iutils.game.InventoryItem; +import net.runelite.client.plugins.iutils.game.iWidget; +import net.runelite.client.plugins.iutils.iUtils; +import org.pf4j.Extension; + +import javax.inject.Inject; +import java.awt.event.KeyEvent; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Extension +@PluginDependency(Util.class) +@PluginDependency(iUtils.class) +@PluginDescriptor( + name = "Chaos Auto Alcher", + description = "Gold! Always believe in your soul.", + enabledByDefault = false +) +@Slf4j +public class Autoalcher extends Plugin implements KeyListener { + @Inject + private Game game; + + @Inject + private Config config; + + @Inject + private Calculations calc; + + @Inject + private KeyManager keyManager; + + @Provides + Config provideConfig(ConfigManager configManager) { + return configManager.getConfig(Config.class); + } + + private static final Varbits[] AMOUNT_VARBITS = { + Varbits.RUNE_POUCH_AMOUNT1, Varbits.RUNE_POUCH_AMOUNT2, Varbits.RUNE_POUCH_AMOUNT3 + }; + private static final Varbits[] RUNE_VARBITS = { + Varbits.RUNE_POUCH_RUNE1, Varbits.RUNE_POUCH_RUNE2, Varbits.RUNE_POUCH_RUNE3 + }; + + private ScheduledExecutorService executor; + private boolean active; + private long last; + private String[] names; + + @Override + protected void startUp() { + log.info("Starting Chaos Auto Alcher"); + + executor = Executors.newSingleThreadScheduledExecutor(); + keyManager.registerKeyListener(this); + } + + @Override + protected void shutDown() { + log.info("Stopping Chaos Auto Alcher"); + + executor.shutdownNow(); + keyManager.unregisterKeyListener(this); + } + + @Subscribe + private void onGameTick(GameTick event) { + if (!active || last + 5 > game.ticks()) return; + + if (names == null) parseItems(); + + if (names == null || names.length == 0) return; + + if (game.inventory().withNamePart(names).exists() + && hasRunes()) { + executor.schedule(this::alch, calc.random(100, 200), TimeUnit.MILLISECONDS); + } + } + + @Subscribe + private void onConfigChanged(ConfigChanged event) { + if (!event.getGroup().equals("chaosautoalcher")) return; + + if (event.getKey().equals("alchItems")) { + parseItems(); + } + } + + private void alch() { + InventoryItem item = game.inventory().withNamePart(names).first(); + iWidget spellWidget = game.widget(Spells.HIGH_LEVEL_ALCHEMY.getInfo()); + if (item == null || spellWidget == null) return; + + spellWidget.useOn(item); + last = game.ticks(); + + game.tick(3); + game.openInterface(3); + } + + private void parseItems() { + names = config.alchItems().split(";"); + + for (int i = 0; i < names.length; i++) { + names[i] = names[i].trim(); + } + } + + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + if (config.autoalchHotkey().matches(e)) { + active = !active; + + if (active) { + game.utils.sendGameMessage("Enabled Auto Alcher"); + } else { + game.utils.sendGameMessage("Disabled Auto Alcher"); + } + } + } + + @Override + public void keyReleased(KeyEvent e) { + + } + + private boolean hasRunes() { + int fireRunes = (int) game.inventory().withId(ItemID.FIRE_RUNE).count(); + int natureRunes = (int) game.inventory().withId(ItemID.NATURE_RUNE).count(); + + if (game.inventory().withId(ItemID.RUNE_POUCH).exists()) { + for (int i = 0; i < AMOUNT_VARBITS.length; i++) { + int amount = game.client().getVar(AMOUNT_VARBITS[i]); + if (amount <= 0) continue; + + RunepouchRune rune = RunepouchRune.getRune(game.client().getVar(RUNE_VARBITS[i])); + + switch (rune) { + case NATURE: + natureRunes += amount; + break; + case FIRE: + fireRunes += amount; + break; + } + } + } + + return fireRunes >= 5 && natureRunes >= 1; + } +} \ No newline at end of file diff --git a/autoalcher/src/main/java/io/reisub/openosrs/autoalcher/Config.java b/autoalcher/src/main/java/io/reisub/openosrs/autoalcher/Config.java new file mode 100644 index 0000000..d515b98 --- /dev/null +++ b/autoalcher/src/main/java/io/reisub/openosrs/autoalcher/Config.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018, Andrew EP | ElPinche256 + * 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 io.reisub.openosrs.autoalcher; + +import net.runelite.client.config.Button; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; +import net.runelite.client.config.Keybind; + +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; + +@ConfigGroup("chaosautoalcher") + +public interface Config extends net.runelite.client.config.Config { + @ConfigItem( + keyName = "alchItems", + name = "Items", + description = "List of items to alch, separated by a semicolon. You can use a part of the name.", + position = 0 + ) + default String alchItems() { return "Rune arrow"; } + + @ConfigItem( + keyName = "autoalchHotkey", + name = "Hotkey", + description = "Press this key to toggle auto alching.", + position = 2 + ) + default Keybind autoalchHotkey() { + return new Keybind(KeyEvent.VK_F9, InputEvent.CTRL_DOWN_MASK); + } + + @ConfigItem( + keyName = "startButton", + name = "Start/Stop", + description = "Start the script", + position = 100 + ) + default Button startButton() { + return new Button(); + } +} \ No newline at end of file diff --git a/release/autoalcher-1.0.0.jar b/release/autoalcher-1.0.0.jar new file mode 100644 index 0000000..5481dd8 Binary files /dev/null and b/release/autoalcher-1.0.0.jar differ